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();
35 const oWood = "gaia/special_treasure_wood";
38 const aGrass = rBiomeA1();
39 const aGrassShort = rBiomeA2();
40 const aReeds = rBiomeA3();
41 const aLillies = rBiomeA4();
42 const aRockLarge = rBiomeA5();
43 const aRockMedium = rBiomeA6();
44 const aBushMedium = rBiomeA7();
45 const aBushSmall = rBiomeA8();
47 const pForest1 = [tForestFloor2 + TERRAIN_SEPARATOR + oTree1, tForestFloor2 + TERRAIN_SEPARATOR + oTree2, tForestFloor2];
48 const pForest2 = [tForestFloor1 + TERRAIN_SEPARATOR + oTree4, tForestFloor1 + TERRAIN_SEPARATOR + oTree5, tForestFloor1];
50 log("Initializing map...");
54 const numPlayers = getNumPlayers();
55 const mapSize = getMapSize();
56 const mapArea = mapSize*mapSize;
58 // create tile classes
59 var clPlayer = createTileClass();
60 var clHill = createTileClass();
61 var clForest = createTileClass();
62 var clDirt = createTileClass();
63 var clRock = createTileClass();
64 var clMetal = createTileClass();
65 var clFood = createTileClass();
66 var clBaseResource = createTileClass();
67 var clSettlement = createTileClass();
68 var clLand = createTileClass();
70 // randomize player order
72 for (var i = 0; i < numPlayers; i++)
75 playerIDs = sortPlayers(playerIDs);
78 var playerX = new Array(numPlayers);
79 var playerZ = new Array(numPlayers);
80 var playerAngle = new Array(numPlayers);
82 var startAngle = PI/2 + PI/14;
83 for (var i = 0; i < numPlayers; i++)
85 playerAngle[i] = startAngle - (i+1)*(PI+ PI/7)/(numPlayers+1);
86 playerX[i] = 0.5 + 0.35*cos(playerAngle[i]);
87 playerZ[i] = 0.5 + 0.35*sin(playerAngle[i]);
90 for (var i = 0; i < numPlayers; i++)
92 var id = playerIDs[i];
93 log("Creating base for player " + id + "...");
96 var radius = scaleByMapSize(15,25);
100 var hillSize = PI * radius * radius;
101 // get the x and z in tiles
102 fx = fractionToTiles(playerX[i]);
103 fz = fractionToTiles(playerZ[i]);
107 var placer = new ClumpPlacer(hillSize, 0.80, 0.1, 10, ix, iz);
108 var terrainPainter = new LayeredPainter(
109 [tWater , tShore, tMainTerrain], // terrains
110 [1, shoreRadius] // widths
112 var elevationPainter = new SmoothElevationPainter(
113 ELEVATION_SET, // type
114 elevation, // elevation
115 shoreRadius // blend radius
117 createArea(placer, [terrainPainter, elevationPainter, paintClass(clPlayer)], null);
119 // create the city patch
120 var cityRadius = radius/3;
121 placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz);
122 var painter = new LayeredPainter([tRoadWild, tRoad], [1]);
123 createArea(placer, painter, null);
125 // create starting units
126 placeCivDefaultEntities(fx, fz, id, { 'iberWall': false });
128 placeDefaultChicken(fx, fz, clBaseResource);
130 // create berry bushes
131 var bbAngle = randFloat(0, TWO_PI);
133 var bbX = round(fx + bbDist * cos(bbAngle));
134 var bbZ = round(fz + bbDist * sin(bbAngle));
135 var group = new SimpleGroup(
136 [new SimpleObject(oFruitBush, 5,5, 0,3)],
137 true, clBaseResource, bbX, bbZ
139 createObjectGroup(group, 0);
142 var bbAngle = randFloat(0, TWO_PI);
144 var bbX = round(fx + bbDist * cos(bbAngle));
145 var bbZ = round(fz + bbDist * sin(bbAngle));
146 group = new SimpleGroup(
147 [new SimpleObject(oWood, 14,14, 0,3)],
148 true, clBaseResource, bbX, bbZ
150 createObjectGroup(group, 0);
153 var mAngle = bbAngle;
154 while(abs(mAngle - bbAngle) < PI/3)
155 mAngle = randFloat(0, TWO_PI);
157 var mDist = radius - 4;
158 var mX = round(fx + mDist * cos(mAngle));
159 var mZ = round(fz + mDist * sin(mAngle));
160 group = new SimpleGroup(
161 [new SimpleObject(oMetalLarge, 1,1, 0,0)],
162 true, clBaseResource, mX, mZ
164 createObjectGroup(group, 0);
166 // create stone mines
167 mAngle += randFloat(PI/8, PI/4);
168 mX = round(fx + mDist * cos(mAngle));
169 mZ = round(fz + mDist * sin(mAngle));
170 group = new SimpleGroup(
171 [new SimpleObject(oStoneLarge, 1,1, 0,2)],
172 true, clBaseResource, mX, mZ
174 createObjectGroup(group, 0);
175 var hillSize = PI * radius * radius;
176 // create starting trees
177 var num = floor(hillSize / 60);
178 var tAngle = randFloat(-PI/3, 4*PI/3);
180 var tX = round(fx + tDist * cos(tAngle));
181 var tZ = round(fz + tDist * sin(tAngle));
182 group = new SimpleGroup(
183 [new SimpleObject(oTree1, num, num, 0,4)],
184 false, clBaseResource, tX, tZ
186 createObjectGroup(group, 0, avoidClasses(clBaseResource,2));
188 // create grass tufts
189 var num = hillSize / 250;
190 for (var j = 0; j < num; j++)
192 var gAngle = randFloat(0, TWO_PI);
193 var gDist = radius - (5 + randInt(7));
194 var gX = round(fx + gDist * cos(gAngle));
195 var gZ = round(fz + gDist * sin(gAngle));
196 group = new SimpleGroup(
197 [new SimpleObject(aGrassShort, 2,5, 0,1, -PI/8,PI/8)],
198 false, clBaseResource, gX, gZ
200 createObjectGroup(group, 0);
204 var dockLocation = getTIPIADBON([ix, iz], [mapSize / 2, mapSize / 2], [-3 , 2.6], 0.5, 3);
205 if (dockLocation !== undefined)
206 placeObject(dockLocation[0], dockLocation[1], "structures/" + getCivCode(id-1) + "_dock", id, playerAngle[i] + PI);
210 //Create the continent body
211 var fx = fractionToTiles(0.12);
212 var fz = fractionToTiles(0.5);
216 var placer = new ClumpPlacer(mapArea * 0.50, 0.80, 0.08, 10, ix, iz);
217 var terrainPainter = new LayeredPainter(
218 [tWater, tShore, tMainTerrain], // terrains
221 var elevationPainter = new SmoothElevationPainter(
222 ELEVATION_SET, // type
226 createArea(placer, [terrainPainter, elevationPainter, paintClass(clLand)], avoidClasses(clPlayer, 8));
229 log("Creating shore jaggedness...");
230 placer = new ClumpPlacer(scaleByMapSize(15, 80), 0.2, 0.1, 1);
231 terrainPainter = new LayeredPainter(
232 [tMainTerrain, tMainTerrain], // terrains
235 elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 3, 4);
238 [terrainPainter, elevationPainter, paintClass(clLand)],
239 [borderClasses(clLand, 6, 3), avoidClasses(clPlayer, 8)],
240 scaleByMapSize(20, 150) * 2, 150
243 paintTerrainBasedOnHeight(1, 3, 0, tShore);
244 paintTerrainBasedOnHeight(-8, 1, 2, tWater);
247 log("Creating bumps...");
248 placer = new ClumpPlacer(scaleByMapSize(20, 50), 0.3, 0.06, 1);
249 painter = new SmoothElevationPainter(ELEVATION_MODIFY, 2, 2);
253 [avoidClasses(clPlayer, 10), stayClasses(clLand, 3)],
254 scaleByMapSize(100, 200)
258 log("Creating hills...");
259 placer = new ClumpPlacer(scaleByMapSize(20, 150), 0.2, 0.1, 1);
260 terrainPainter = new LayeredPainter(
261 [tCliff, tHill], // terrains
264 elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 18, 2);
267 [terrainPainter, elevationPainter, paintClass(clHill)],
268 [avoidClasses(clPlayer, 10, clHill, 15), stayClasses(clLand, 7)],
269 scaleByMapSize(1, 4) * numPlayers
273 // calculate desired number of trees for map (based on size)
274 if (random_terrain == g_BiomeSavanna)
277 var MAX_TREES = 1250;
280 else if (random_terrain == g_BiomeTropic)
282 var MIN_TREES = 1000;
283 var MAX_TREES = 6000;
289 var MAX_TREES = 3000;
293 var totalTrees = scaleByMapSize(MIN_TREES, MAX_TREES);
294 var numForest = totalTrees * P_FOREST;
295 var numStragglers = totalTrees * (1.0 - P_FOREST);
297 log("Creating forests...");
299 [[tForestFloor2, tMainTerrain, pForest1], [tForestFloor2, pForest1]],
300 [[tForestFloor1, tMainTerrain, pForest2], [tForestFloor1, pForest2]]
303 var size = numForest / (scaleByMapSize(2,8) * numPlayers) *
304 (random_terrain == g_BiomeSavanna ? 2 : 1);
306 var num = floor(size / types.length);
307 for (var i = 0; i < types.length; ++i)
309 placer = new ClumpPlacer(numForest / num, 0.1, 0.1, 1);
310 painter = new LayeredPainter(
311 types[i], // terrains
316 [painter, paintClass(clForest)],
317 [avoidClasses(clPlayer, 6, clForest, 10, clHill, 0), stayClasses(clLand, 7)],
323 log("Creating dirt patches...");
324 var sizes = [scaleByMapSize(3, 48), scaleByMapSize(5, 84), scaleByMapSize(8, 128)];
325 for (var i = 0; i < sizes.length; i++)
327 placer = new ClumpPlacer(sizes[i], 0.3, 0.06, 0.5);
328 painter = new LayeredPainter(
329 [[tMainTerrain,tTier1Terrain],[tTier1Terrain,tTier2Terrain], [tTier2Terrain,tTier3Terrain]], // terrains
334 [painter, paintClass(clDirt)],
335 [avoidClasses(clForest, 0, clHill, 0, clDirt, 5, clPlayer, 0), stayClasses(clLand, 7)],
336 scaleByMapSize(15, 45)
341 log("Creating grass patches...");
342 var sizes = [scaleByMapSize(2, 32), scaleByMapSize(3, 48), scaleByMapSize(5, 80)];
343 for (var i = 0; i < sizes.length; i++)
345 placer = new ClumpPlacer(sizes[i], 0.3, 0.06, 0.5);
346 painter = new TerrainPainter(tTier4Terrain);
350 [avoidClasses(clForest, 0, clHill, 0, clDirt, 5, clPlayer, 0), stayClasses(clLand, 7)],
351 scaleByMapSize(15, 45)
356 log("Creating stone mines...");
357 group = new SimpleGroup([new SimpleObject(oStoneSmall, 0,2, 0,4), new SimpleObject(oStoneLarge, 1,1, 0,4)], true, clRock);
358 createObjectGroups(group, 0,
359 [avoidClasses(clForest, 1, clPlayer, 10, clRock, 10, clHill, 1), stayClasses(clLand, 7)],
360 scaleByMapSize(4,16), 100
364 log("Creating small stone quarries...");
365 group = new SimpleGroup([new SimpleObject(oStoneSmall, 2,5, 1,3)], true, clRock);
366 createObjectGroups(group, 0,
367 [avoidClasses(clForest, 1, clPlayer, 10, clRock, 10, clHill, 1), stayClasses(clLand, 7)],
368 scaleByMapSize(4,16), 100
372 log("Creating metal mines...");
373 // create large metal quarries
374 group = new SimpleGroup([new SimpleObject(oMetalLarge, 1,1, 0,4)], true, clMetal);
375 createObjectGroups(group, 0,
376 [avoidClasses(clForest, 1, clPlayer, 10, clMetal, 10, clRock, 5, clHill, 1), stayClasses(clLand, 7)],
377 scaleByMapSize(4,16), 100
381 // create small decorative rocks
382 log("Creating small decorative rocks...");
383 group = new SimpleGroup(
384 [new SimpleObject(aRockMedium, 1,3, 0,1)],
389 [avoidClasses(clForest, 0, clPlayer, 0, clHill, 0), stayClasses(clLand, 6)],
390 scaleByMapSize(16, 262), 50
394 // create large decorative rocks
395 log("Creating large decorative rocks...");
396 group = new SimpleGroup(
397 [new SimpleObject(aRockLarge, 1,2, 0,1), new SimpleObject(aRockMedium, 1,3, 0,2)],
402 [avoidClasses(clForest, 0, clPlayer, 0, clHill, 0), stayClasses(clLand, 6)],
403 scaleByMapSize(8, 131), 50
407 log("Creating deer...");
408 group = new SimpleGroup(
409 [new SimpleObject(oMainHuntableAnimal, 5,7, 0,4)],
412 createObjectGroups(group, 0,
413 [avoidClasses(clForest, 0, clPlayer, 10, clHill, 1, clFood, 20), stayClasses(clLand, 7)],
418 log("Creating sheep...");
419 group = new SimpleGroup(
420 [new SimpleObject(oSecondaryHuntableAnimal, 2,3, 0,2)],
423 createObjectGroups(group, 0,
424 [avoidClasses(clForest, 0, clPlayer, 10, clHill, 1, clFood, 20), stayClasses(clLand, 7)],
429 log("Creating fruit bush...");
430 group = new SimpleGroup(
431 [new SimpleObject(oFruitBush, 5,7, 0,4)],
434 createObjectGroups(group, 0,
435 [avoidClasses(clForest, 0, clPlayer, 8, clHill, 1, clFood, 20), stayClasses(clLand, 7)],
436 randInt(1, 4) * numPlayers + 2, 50
440 log("Creating fish...");
442 new SimpleGroup([new SimpleObject(oFish, 2,3, 0,2)], true, clFood),
444 avoidClasses(clLand, 2, clPlayer, 2, clHill, 0, clFood, 20),
449 log("Creating straggler trees...");
450 var types = [oTree1, oTree2, oTree4, oTree3]; // some variation
451 var num = floor(numStragglers / types.length);
452 for (var i = 0; i < types.length; ++i)
454 group = new SimpleGroup(
455 [new SimpleObject(types[i], 1,1, 0,3)],
458 createObjectGroups(group, 0,
459 [avoidClasses(clForest, 1, clHill, 1, clPlayer, 9, clMetal, 1, clRock, 1), stayClasses(clLand, 9)],
465 var planetm = random_terrain == g_BiomeTropic ? 8 : 1;
467 log("Creating small grass tufts...");
468 group = new SimpleGroup(
469 [new SimpleObject(aGrassShort, 1,2, 0,1, -PI/8,PI/8)]
471 createObjectGroups(group, 0,
472 [avoidClasses(clHill, 2, clPlayer, 2, clDirt, 0), stayClasses(clLand, 6)],
473 planetm * scaleByMapSize(13, 200)
477 log("Creating large grass tufts...");
478 group = new SimpleGroup(
479 [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)]
481 createObjectGroups(group, 0,
482 [avoidClasses(clHill, 2, clPlayer, 2, clDirt, 1, clForest, 0), stayClasses(clLand, 6)],
483 planetm * scaleByMapSize(13, 200)
487 log("Creating bushes...");
488 group = new SimpleGroup(
489 [new SimpleObject(aBushMedium, 1,2, 0,2), new SimpleObject(aBushSmall, 2,4, 0,2)]
491 createObjectGroups(group, 0,
492 [avoidClasses(clHill, 1, clPlayer, 1, clDirt, 1), stayClasses(clLand, 6)],
493 planetm * scaleByMapSize(13, 200), 50
497 random_terrain = randInt(1,3);
498 if (random_terrain == 1)
500 else if (random_terrain == 2)
501 setSkySet("cumulus");
502 else if (random_terrain == 3)
505 setSunRotation(randFloat(0, TWO_PI));
506 setSunElevation(randFloat(PI/ 5, PI / 3));