1 RMS.LoadLibrary("rmgen");
3 //random terrain textures
4 var random_terrain = randomizeBiome();
6 const tMainTerrain = rBiomeT1();
7 const tForestFloor1 = rBiomeT2();
8 const tForestFloor2 = rBiomeT3();
9 const tCliff = rBiomeT4();
10 const tTier1Terrain = rBiomeT5();
11 const tTier2Terrain = rBiomeT6();
12 const tTier3Terrain = rBiomeT7();
13 const tHill = rBiomeT8();
14 const tDirt = rBiomeT9();
15 const tRoad = rBiomeT10();
16 const tRoadWild = rBiomeT11();
17 const tTier4Terrain = rBiomeT12();
18 const tShoreBlend = rBiomeT13();
19 const tShore = rBiomeT14();
20 const tWater = rBiomeT15();
23 const oTree1 = rBiomeE1();
24 const oTree2 = rBiomeE2();
25 const oTree3 = rBiomeE3();
26 const oTree4 = rBiomeE4();
27 const oTree5 = rBiomeE5();
28 const oFruitBush = rBiomeE6();
29 const oMainHuntableAnimal = rBiomeE8();
30 const oFish = rBiomeE9();
31 const oSecondaryHuntableAnimal = rBiomeE10();
32 const oStoneLarge = rBiomeE11();
33 const oStoneSmall = rBiomeE12();
34 const oMetalLarge = rBiomeE13();
37 const aGrass = rBiomeA1();
38 const aGrassShort = rBiomeA2();
39 const aReeds = rBiomeA3();
40 const aLillies = rBiomeA4();
41 const aRockLarge = rBiomeA5();
42 const aRockMedium = rBiomeA6();
43 const aBushMedium = rBiomeA7();
44 const aBushSmall = rBiomeA8();
46 const pForest1 = [tForestFloor2 + TERRAIN_SEPARATOR + oTree1, tForestFloor2 + TERRAIN_SEPARATOR + oTree2, tForestFloor2];
47 const pForest2 = [tForestFloor1 + TERRAIN_SEPARATOR + oTree4, tForestFloor1 + TERRAIN_SEPARATOR + oTree5, tForestFloor1];
49 log("Initializing map...");
53 const numPlayers = getNumPlayers();
54 const mapSize = getMapSize();
55 const mapArea = mapSize*mapSize;
57 // create tile classes
59 var clPlayer = createTileClass();
60 var clHill = createTileClass();
61 var clForest = createTileClass();
62 var clWater = createTileClass();
63 var clDirt = createTileClass();
64 var clRock = createTileClass();
65 var clMetal = createTileClass();
66 var clFood = createTileClass();
67 var clBaseResource = createTileClass();
68 var clSettlement = createTileClass();
70 for (var ix = 0; ix < mapSize; ix++)
72 for (var iz = 0; iz < mapSize; iz++)
74 var x = ix / (mapSize + 1.0);
75 var z = iz / (mapSize + 1.0);
76 placeTerrain(ix, iz, tMainTerrain);
80 // randomize player order
82 for (var i = 0; i < numPlayers; i++)
86 playerIDs = sortPlayers(playerIDs);
90 var playerX = new Array(numPlayers);
91 var playerZ = new Array(numPlayers);
92 var playerAngle = new Array(numPlayers);
94 var startAngle = randFloat(0, TWO_PI);
95 for (var i = 0; i < numPlayers; i++)
97 playerAngle[i] = startAngle + i*TWO_PI/numPlayers;
98 playerX[i] = 0.5 + 0.35*cos(playerAngle[i]);
99 playerZ[i] = 0.5 + 0.35*sin(playerAngle[i]);
102 for (var i = 0; i < numPlayers; i++)
104 var id = playerIDs[i];
105 log("Creating base for player " + id + "...");
108 var radius = scaleByMapSize(15,25);
112 // get the x and z in tiles
113 var fx = fractionToTiles(playerX[i]);
114 var fz = fractionToTiles(playerZ[i]);
117 addToClass(ix, iz, clPlayer);
118 addToClass(ix+5, iz, clPlayer);
119 addToClass(ix, iz+5, clPlayer);
120 addToClass(ix-5, iz, clPlayer);
121 addToClass(ix, iz-5, clPlayer);
123 // create starting units
124 placeCivDefaultEntities(fx, fz, id);
126 placeDefaultChicken(fx, fz, clBaseResource);
128 // create berry bushes
129 var bbAngle = randFloat(0, TWO_PI);
131 var bbX = round(fx + bbDist * cos(bbAngle));
132 var bbZ = round(fz + bbDist * sin(bbAngle));
133 var group = new SimpleGroup(
134 [new SimpleObject(oFruitBush, 5,5, 0,3)],
135 true, clBaseResource, bbX, bbZ
137 createObjectGroup(group, 0);
140 var mAngle = bbAngle;
141 while(abs(mAngle - bbAngle) < PI/3)
143 mAngle = randFloat(0, TWO_PI);
146 var mX = round(fx + mDist * cos(mAngle));
147 var mZ = round(fz + mDist * sin(mAngle));
148 group = new SimpleGroup(
149 [new SimpleObject(oMetalLarge, 1,1, 0,0)],
150 true, clBaseResource, mX, mZ
152 createObjectGroup(group, 0);
154 // create stone mines
155 mAngle += randFloat(PI/8, PI/4);
156 mX = round(fx + mDist * cos(mAngle));
157 mZ = round(fz + mDist * sin(mAngle));
158 group = new SimpleGroup(
159 [new SimpleObject(oStoneLarge, 1,1, 0,2)],
160 true, clBaseResource, mX, mZ
162 createObjectGroup(group, 0);
163 var hillSize = PI * radius * radius;
164 // create starting trees
166 var tAngle = randFloat(0, TWO_PI);
167 var tDist = randFloat(12, 13);
168 var tX = round(fx + tDist * cos(tAngle));
169 var tZ = round(fz + tDist * sin(tAngle));
170 group = new SimpleGroup(
171 [new SimpleObject(oTree1, num, num, 0,3)],
172 false, clBaseResource, tX, tZ
174 createObjectGroup(group, 0, avoidClasses(clBaseResource,2));
176 // create grass tufts
177 var num = hillSize / 250;
178 for (var j = 0; j < num; j++)
180 var gAngle = randFloat(0, TWO_PI);
181 var gDist = radius - (5 + randInt(7));
182 var gX = round(fx + gDist * cos(gAngle));
183 var gZ = round(fz + gDist * sin(gAngle));
184 group = new SimpleGroup(
185 [new SimpleObject(aGrassShort, 2,5, 0,1, -PI/8,PI/8)],
186 false, clBaseResource, gX, gZ
188 createObjectGroup(group, 0);
195 var fx = fractionToTiles(0.5);
196 var fz = fractionToTiles(0.5);
200 const lSize = sqrt(sqrt(sqrt(scaleByMapSize(1, 6))));
202 var placer = new ChainPlacer(2, floor(scaleByMapSize(5, 16)), floor(scaleByMapSize(35, 200)), 1, ix, iz, 0, [floor(mapSize * 0.17 * lSize)]);
203 var terrainPainter = new LayeredPainter(
204 [tShore, tWater, tWater, tWater], // terrains
207 var elevationPainter = new SmoothElevationPainter(
208 ELEVATION_SET, // type
212 createArea(placer, [terrainPainter, elevationPainter, paintClass(clWater)], avoidClasses(clPlayer, 20));
215 // create more shore jaggedness
216 log("Creating more shore jaggedness...");
218 placer = new ChainPlacer(2, floor(scaleByMapSize(4, 6)), 3, 1);
219 terrainPainter = new LayeredPainter(
220 [tCliff, tHill], // terrains
223 elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 3, 4);
226 [terrainPainter, elevationPainter, unPaintClass(clWater)],
227 borderClasses(clWater, 4, 7),
228 scaleByMapSize(12, 130) * 2, 150
232 paintTerrainBasedOnHeight(2.4, 3.4, 3, tMainTerrain);
233 paintTerrainBasedOnHeight(1, 2.4, 0, tShore);
234 paintTerrainBasedOnHeight(-8, 1, 2, tWater);
235 paintTileClassBasedOnHeight(-6, 0, 1, clWater);
237 for (var i = 0; i < numPlayers; ++i)
239 var fx = fractionToTiles(playerX[i]);
240 var fz = fractionToTiles(playerZ[i]);
244 // create the city patch
245 var cityRadius = radius/3;
246 var placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz);
247 var painter = new LayeredPainter([tRoadWild, tRoad], [1]);
248 createArea(placer, painter, null);
252 createBumps(avoidClasses(clWater, 2, clPlayer, 20));
255 if (randInt(1,2) == 1)
256 createHills([tMainTerrain, tCliff, tHill], avoidClasses(clPlayer, 20, clHill, 15, clWater, 2), clHill, scaleByMapSize(1, 4) * numPlayers);
258 createMountains(tCliff, avoidClasses(clPlayer, 20, clHill, 15, clWater, 2), clHill, scaleByMapSize(1, 4) * numPlayers);
262 [tMainTerrain, tForestFloor1, tForestFloor2, pForest1, pForest2],
263 avoidClasses(clPlayer, 20, clForest, 17, clHill, 0, clWater, 2),
271 // create dirt patches
272 log("Creating dirt patches...");
273 createLayeredPatches(
274 [scaleByMapSize(3, 6), scaleByMapSize(5, 10), scaleByMapSize(8, 21)],
275 [[tMainTerrain,tTier1Terrain],[tTier1Terrain,tTier2Terrain], [tTier2Terrain,tTier3Terrain]],
277 avoidClasses(clWater, 3, clForest, 0, clHill, 0, clDirt, 5, clPlayer, 12)
280 // create grass patches
281 log("Creating grass patches...");
283 [scaleByMapSize(2, 4), scaleByMapSize(3, 7), scaleByMapSize(5, 15)],
285 avoidClasses(clWater, 3, clForest, 0, clHill, 0, clDirt, 5, clPlayer, 12)
290 log("Creating stone mines...");
291 // create stone quarries
294 [new SimpleObject(oStoneSmall, 0,2, 0,4), new SimpleObject(oStoneLarge, 1,1, 0,4)],
295 [new SimpleObject(oStoneSmall, 2,5, 1,3)]
297 avoidClasses(clWater, 3, clForest, 1, clPlayer, 20, clRock, 10, clHill, 1)
300 log("Creating metal mines...");
301 // create large metal quarries
304 [new SimpleObject(oMetalLarge, 1,1, 0,4)]
306 avoidClasses(clWater, 3, clForest, 1, clPlayer, 20, clMetal, 10, clRock, 5, clHill, 1),
315 if (random_terrain == g_BiomeTropic)
320 [[new SimpleObject(aRockMedium, 1,3, 0,1)],
321 [new SimpleObject(aRockLarge, 1,2, 0,1), new SimpleObject(aRockMedium, 1,3, 0,2)],
322 [new SimpleObject(aGrassShort, 1,2, 0,1, -PI/8,PI/8)],
323 [new SimpleObject(aGrass, 2,4, 0,1.8, -PI/8,PI/8), new SimpleObject(aGrassShort, 3,6, 1.2,2.5, -PI/8,PI/8)],
324 [new SimpleObject(aBushMedium, 1,2, 0,2), new SimpleObject(aBushSmall, 2,4, 0,2)]
327 scaleByMapSize(16, 262),
328 scaleByMapSize(8, 131),
329 planetm * scaleByMapSize(13, 200),
330 planetm * scaleByMapSize(13, 200),
331 planetm * scaleByMapSize(13, 200)
333 avoidClasses(clWater, 0, clForest, 0, clPlayer, 0, clHill, 0)
342 [new SimpleObject(oMainHuntableAnimal, 5,7, 0,4)],
343 [new SimpleObject(oSecondaryHuntableAnimal, 2,3, 0,2)]
349 avoidClasses(clWater, 3, clForest, 0, clPlayer, 20, clHill, 1, clFood, 20)
356 [new SimpleObject(oFruitBush, 5,7, 0,4)]
361 avoidClasses(clWater, 3, clForest, 0, clPlayer, 20, clHill, 1, clFood, 10)
368 [new SimpleObject(oFish, 2,3, 0,2)]
373 [avoidClasses(clFood, 20), stayClasses(clWater, 6)]
378 // create straggler trees
379 var types = [oTree1, oTree2, oTree4, oTree3]; // some variation
380 createStragglerTrees(types, avoidClasses(clWater, 5, clForest, 7, clHill, 1, clPlayer, 12, clMetal, 1, clRock, 1));
381 setWaterWaviness(4.0);
382 setWaterType("lake");