1 RMS.LoadLibrary("rmgen");
3 //TILE_CENTERED_HEIGHT_MAP = true;
5 const tCity = "medit_city_pavement";
6 const tCityPlaza = "medit_city_pavement";
7 const tHill = ["medit_dirt", "medit_dirt_b", "medit_dirt_c", "medit_rocks_grass", "medit_rocks_grass"];
8 const tMainDirt = "medit_dirt";
9 const tCliff = "medit_cliff_aegean";
10 const tForestFloor = "medit_rocks_shrubs";
11 const tGrass = "medit_rocks_grass";
12 const tRocksShrubs = "medit_rocks_shrubs";
13 const tRocksGrass = "medit_rocks_grass";
14 const tDirt = "medit_dirt_b";
15 const tDirtB = "medit_dirt_c";
16 const tShore = "medit_sand";
17 const tWater = "medit_sand_wet";
20 const oGrapeBush = "gaia/flora_bush_grapes";
21 const oDeer = "gaia/fauna_deer";
22 const oFish = "gaia/fauna_fish";
23 const oSheep = "gaia/fauna_sheep";
24 const oGoat = "gaia/fauna_goat";
25 const oStoneLarge = "gaia/geology_stonemine_medit_quarry";
26 const oStoneSmall = "gaia/geology_stone_mediterranean";
27 const oMetalLarge = "gaia/geology_metal_mediterranean_slabs";
28 const oDatePalm = "gaia/flora_tree_cretan_date_palm_short";
29 const oSDatePalm = "gaia/flora_tree_cretan_date_palm_tall";
30 const oCarob = "gaia/flora_tree_carob";
31 const oFanPalm = "gaia/flora_tree_medit_fan_palm";
32 const oPoplar = "gaia/flora_tree_poplar_lombardy";
33 const oCypress = "gaia/flora_tree_cypress";
36 const aBush1 = "actor|props/flora/bush_medit_sm.xml";
37 const aBush2 = "actor|props/flora/bush_medit_me.xml";
38 const aBush3 = "actor|props/flora/bush_medit_la.xml";
39 const aBush4 = "actor|props/flora/bush_medit_me.xml";
40 const aBushes = [aBush1, aBush2, aBush3, aBush4];
41 const aDecorativeRock = "actor|geology/stone_granite_med.xml";
43 // terrain + entity (for painting)
44 const pForest = [tForestFloor + TERRAIN_SEPARATOR + oDatePalm, tForestFloor + TERRAIN_SEPARATOR + oSDatePalm, tForestFloor + TERRAIN_SEPARATOR + oCarob, tForestFloor, tForestFloor];
46 log("Initializing map...");
50 const numPlayers = getNumPlayers();
51 const mapSize = getMapSize();
52 const mapArea = mapSize*mapSize;
54 // create tile classes
56 var clPlayer = createTileClass();
57 var clForest = createTileClass();
58 var clWater = createTileClass();
59 var clDirt = createTileClass();
60 var clRock = createTileClass();
61 var clMetal = createTileClass();
62 var clFood = createTileClass();
63 var clBaseResource = createTileClass();
64 var clSettlement = createTileClass();
65 var clGrass = createTileClass();
66 var clHill = createTileClass();
67 var clIsland = createTileClass();
69 // randomize player order
71 for (var i = 0; i < numPlayers; i++)
75 playerIDs = sortPlayers(playerIDs);
79 var playerX = new Array(numPlayers);
80 var playerZ = new Array(numPlayers);
81 var playerPos = new Array(numPlayers);
83 for (var i = 0; i < numPlayers; i++)
85 playerPos[i] = (i + 1) / (numPlayers + 1);
86 playerZ[i] = playerPos[i];
87 playerX[i] = 0.66 + 0.2*(i%2);
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 // get the x and z in tiles
101 var fx = fractionToTiles(playerX[i]);
102 var fz = fractionToTiles(playerZ[i]);
105 addToClass(ix, iz, clPlayer);
106 addToClass(ix+5, iz, clPlayer);
107 addToClass(ix, iz+5, clPlayer);
108 addToClass(ix-5, iz, clPlayer);
109 addToClass(ix, iz-5, clPlayer);
111 // create the city patch
112 var cityRadius = radius/3;
113 var placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz);
114 var painter = new LayeredPainter([tCityPlaza, tCity], [1]);
115 createArea(placer, painter, null);
117 // create starting units
118 placeCivDefaultEntities(fx, fz, id);
120 placeDefaultChicken(fx, fz, clBaseResource);
122 // create berry bushes
123 var bbAngle = randFloat(0, TWO_PI);
125 var bbX = round(fx + bbDist * cos(bbAngle));
126 var bbZ = round(fz + bbDist * sin(bbAngle));
127 var group = new SimpleGroup(
128 [new SimpleObject(oGrapeBush, 5,5, 0,3)],
129 true, clBaseResource, bbX, bbZ
131 createObjectGroup(group, 0);
134 var mAngle = bbAngle;
135 while(abs(mAngle - bbAngle) < PI/3)
137 mAngle = randFloat(0, TWO_PI);
140 var mX = round(fx + mDist * cos(mAngle));
141 var mZ = round(fz + mDist * sin(mAngle));
142 group = new SimpleGroup(
143 [new SimpleObject(oMetalLarge, 1,1, 0,0)],
144 true, clBaseResource, mX, mZ
146 createObjectGroup(group, 0);
148 // create stone mines
149 mAngle += randFloat(PI/8, PI/4);
150 mX = round(fx + mDist * cos(mAngle));
151 mZ = round(fz + mDist * sin(mAngle));
152 group = new SimpleGroup(
153 [new SimpleObject(oStoneLarge, 1,1, 0,2)],
154 true, clBaseResource, mX, mZ
156 createObjectGroup(group, 0);
157 var hillSize = PI * radius * radius;
158 // create starting trees
160 var tAngle = randFloat(-PI/3, 4*PI/3);
161 var tDist = randFloat(11, 13);
162 var tX = round(fx + tDist * cos(tAngle));
163 var tZ = round(fz + tDist * sin(tAngle));
164 group = new SimpleGroup(
165 [new SimpleObject(oCarob, num, num, 0,5)],
166 false, clBaseResource, tX, tZ
168 createObjectGroup(group, 0, avoidClasses(clBaseResource,2));
170 // create grass tufts
171 var num = hillSize / 250;
172 for (var j = 0; j < num; j++)
174 var gAngle = randFloat(0, TWO_PI);
175 var gDist = radius - (5 + randInt(7));
176 var gX = round(fx + gDist * cos(gAngle));
177 var gZ = round(fz + gDist * sin(gAngle));
178 group = new SimpleGroup(
179 [new SimpleObject(aBush1, 2,5, 0,1, -PI/8,PI/8)],
180 false, clBaseResource, gX, gZ
182 createObjectGroup(group, 0);
190 var theta = randFloat(0, 1);
191 var seed = randFloat(2,3);
192 for (var ix = 0; ix < mapSize; ix++)
194 for (var iz = 0; iz < mapSize; iz++)
196 var x = ix / (mapSize + 1.0);
197 var z = iz / (mapSize + 1.0);
199 // add the rough shape of the water
200 var km = 20/scaleByMapSize(35, 160);
201 var cu = km*rndRiver(theta+z*0.5*(mapSize/64),seed);
208 if (x < (cu + 0.5 + fadeDist))
210 h = 1 + 4.0 * (1 - ((cu + 0.5 + fadeDist) - x)/fadeDist);
219 placeTerrain(ix, iz, tWater);
223 placeTerrain(ix, iz, tShore);
226 setHeight(ix, iz, h);
228 addToClass(ix, iz, clWater);
236 log("Creating bumps...");
237 placer = new ClumpPlacer(scaleByMapSize(20, 50), 0.3, 0.06, 1);
238 painter = new SmoothElevationPainter(ELEVATION_MODIFY, 2, 2);
242 avoidClasses(clWater, 2, clPlayer, 20),
243 scaleByMapSize(100, 200)
247 log("Creating hills...");
248 placer = new ChainPlacer(1, floor(scaleByMapSize(4, 6)), floor(scaleByMapSize(16, 40)), 0.5);
249 var terrainPainter = new LayeredPainter(
250 [tCliff, tHill], // terrains
253 var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 15, 2);
256 [terrainPainter, elevationPainter, paintClass(clHill)],
257 avoidClasses(clPlayer, 20, clForest, 1, clHill, 15, clWater, 0),
258 scaleByMapSize(1, 4) * numPlayers * 3
261 // calculate desired number of trees for map (based on size)
262 const MIN_TREES = 500;
263 const MAX_TREES = 2500;
264 const P_FOREST = 0.5;
266 var totalTrees = scaleByMapSize(MIN_TREES, MAX_TREES);
267 var numForest = totalTrees * P_FOREST;
268 var numStragglers = totalTrees * (1.0 - P_FOREST);
271 log("Creating forests...");
272 var num = scaleByMapSize(10,42);
273 placer = new ChainPlacer(1, floor(scaleByMapSize(3, 5)), numForest / (num * floor(scaleByMapSize(2,5))), 0.5);
274 painter = new TerrainPainter([tForestFloor, pForest]);
275 createAreas(placer, [painter, paintClass(clForest)],
276 avoidClasses(clPlayer, 20, clForest, 10, clWater, 1, clHill, 1, clBaseResource, 3),
287 // create grass patches
288 log("Creating grass patches...");
289 var sizes = [scaleByMapSize(3, 6), scaleByMapSize(5, 10), scaleByMapSize(8, 21)];
290 for (var i = 0; i < sizes.length; i++)
292 placer = new ChainPlacer(1, floor(scaleByMapSize(3, 5)), sizes[i], 0.5);
293 painter = new LayeredPainter(
294 [[tGrass,tRocksShrubs],[tRocksShrubs,tRocksGrass], [tRocksGrass,tGrass]], // terrains
299 [painter, paintClass(clDirt)],
300 avoidClasses(clForest, 0, clGrass, 5, clPlayer, 10, clWater, 4, clDirt, 5, clHill, 1),
301 scaleByMapSize(15, 45)
307 // create dirt patches
308 log("Creating dirt patches...");
309 var sizes = [scaleByMapSize(3, 6), scaleByMapSize(5, 10), scaleByMapSize(8, 21)];
310 for (var i = 0; i < sizes.length; i++)
312 placer = new ChainPlacer(1, floor(scaleByMapSize(3, 5)), sizes[i], 0.5);
313 painter = new LayeredPainter(
314 [[tDirt,tDirtB],[tDirt,tMainDirt], [tDirtB,tMainDirt]], // terrains
319 [painter, paintClass(clDirt)],
320 avoidClasses(clForest, 0, clDirt, 5, clPlayer, 10, clWater, 4, clGrass, 5, clHill, 1),
321 scaleByMapSize(15, 45)
330 log("Creating cyprus...");
331 placer = new ClumpPlacer(4.5 * scaleByMapSize(60, 540), 0.2, 0.1, 0.01);
332 var terrainPainter = new LayeredPainter(
333 [tShore, tHill], // terrains
336 var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 6, 8);
339 [terrainPainter, elevationPainter, paintClass(clIsland)],
340 [stayClasses (clWater, 5)],
344 log("Creating cyprus stone mines...");
345 // create cyprus large stone quarries
346 group = new SimpleGroup([new SimpleObject(oStoneSmall, 0,2, 0,4), new SimpleObject(oStoneLarge, 1,1, 0,4)], true, clRock);
347 createObjectGroups(group, 0,
348 stayClasses(clIsland, 9),
349 14 * scaleByMapSize(4,16), 100
352 // create cyprus small stone quarries
353 group = new SimpleGroup([new SimpleObject(oStoneSmall, 2,5, 1,3)], true, clRock);
354 createObjectGroups(group, 0,
355 stayClasses(clIsland, 9),
356 14 * scaleByMapSize(4,16), 100
359 log("Creating cyprus metal mines...");
360 // create cyprus large metal quarries
361 group = new SimpleGroup([new SimpleObject(oMetalLarge, 1,1, 0,4)], true, clMetal);
362 createObjectGroups(group, 0,
363 stayClasses(clIsland, 9),
364 14 * scaleByMapSize(4,16), 100
367 log("Creating stone mines...");
368 // create large stone quarries
369 group = new SimpleGroup([new SimpleObject(oStoneSmall, 0,2, 0,4), new SimpleObject(oStoneLarge, 1,1, 0,4)], true, clRock);
370 createObjectGroups(group, 0,
371 avoidClasses(clForest, 1, clPlayer, 20, clRock, 10, clWater, 3, clHill, 1),
372 scaleByMapSize(4,16), 100
375 // create small stone quarries
376 group = new SimpleGroup([new SimpleObject(oStoneSmall, 2,5, 1,3)], true, clRock);
377 createObjectGroups(group, 0,
378 avoidClasses(clForest, 1, clPlayer, 20, clRock, 10, clWater, 3, clHill, 1),
379 scaleByMapSize(4,16), 100
382 log("Creating metal mines...");
383 // create large metal quarries
384 group = new SimpleGroup([new SimpleObject(oMetalLarge, 1,1, 0,4)], true, clMetal);
385 createObjectGroups(group, 0,
386 avoidClasses(clForest, 1, clPlayer, 20, clMetal, 10, clRock, 5, clWater, 3, clHill, 1),
387 scaleByMapSize(4,16), 100
392 // create small decorative rocks
393 log("Creating small decorative rocks...");
394 group = new SimpleGroup(
395 [new SimpleObject(aDecorativeRock, 1,3, 0,1)],
400 avoidClasses(clWater, 1, clForest, 0, clPlayer, 0, clHill, 1),
401 scaleByMapSize(16, 262), 50
406 log("Creating shrubs...");
407 group = new SimpleGroup(
408 [new SimpleObject(aBush2, 1,2, 0,1), new SimpleObject(aBush1, 1,3, 0,2), new SimpleObject(aBush4, 1,2, 0,1), new SimpleObject(aBush3, 1,3, 0,2)],
413 avoidClasses(clWater, 3, clPlayer, 0, clHill, 1),
414 scaleByMapSize(40, 360), 50
420 log("Creating fish...");
421 group = new SimpleGroup([new SimpleObject(oFish, 1,3, 2,6)], true, clFood);
422 createObjectGroups(group, 0,
423 [avoidClasses(clIsland, 2, clFood, 10), stayClasses(clWater, 5)],
424 3*scaleByMapSize(5,20), 50
428 log("Creating sheeps...");
429 group = new SimpleGroup([new SimpleObject(oSheep, 5,7, 0,4)], true, clFood);
430 createObjectGroups(group, 0,
431 avoidClasses(clForest, 0, clPlayer, 7, clWater, 3, clFood, 10, clHill, 1),
432 scaleByMapSize(5,20), 50
436 log("Creating goats...");
437 group = new SimpleGroup([new SimpleObject(oGoat, 2,4, 0,3)], true, clFood);
438 createObjectGroups(group, 0,
439 avoidClasses(clForest, 0, clPlayer, 7, clWater, 3, clFood, 10, clHill, 1),
440 scaleByMapSize(5,20), 50
444 log("Creating deers...");
445 group = new SimpleGroup([new SimpleObject(oDeer, 2,4, 0,2)], true, clFood);
446 createObjectGroups(group, 0,
447 avoidClasses(clForest, 0, clPlayer, 7, clWater, 3, clFood, 10, clHill, 1),
448 scaleByMapSize(5,20), 50
451 // create grape bushes
452 log("Creating grape bushes...");
453 group = new SimpleGroup(
454 [new SimpleObject(oGrapeBush, 5,7, 0,4)],
457 createObjectGroups(group, 0,
458 avoidClasses(clWater, 3, clForest, 0, clPlayer, 15, clHill, 1, clFood, 7),
459 randInt(1, 4) * numPlayers + 2, 50
464 // create straggler trees
465 log("Creating straggler trees...");
466 var types = [oDatePalm, oSDatePalm, oCarob, oFanPalm, oPoplar, oCypress]; // some variation
467 var num = floor(numStragglers / types.length);
468 for (var i = 0; i < types.length; ++i)
470 group = new SimpleGroup([new SimpleObject(types[i], 1,1, 0,0)], true);
471 createObjectGroups(group, 0,
472 avoidClasses(clForest, 0, clWater, 1, clPlayer, 8, clMetal, 1, clHill, 1),
477 log("Creating straggler trees...");
478 var types = [oDatePalm, oSDatePalm, oCarob, oFanPalm, oPoplar, oCypress]; // some variation
479 var num = 3*floor(numStragglers / types.length);
480 for (var i = 0; i < types.length; ++i)
482 group = new SimpleGroup([new SimpleObject(types[i], 1,1, 0,0)], true);
483 createObjectGroups(group, 0,
484 stayClasses(clIsland, 9),
491 setSunColor(0.917, 0.828, 0.734);
492 setWaterColor(0.263,0.314,0.631);
493 setWaterTint(0.133, 0.725,0.855);
494 setWaterWaviness(2.0);
495 setWaterType("ocean");
496 setWaterMurkiness(0.8);
498 setTerrainAmbientColor(0.57, 0.58, 0.55);
499 setUnitsAmbientColor(0.447059, 0.509804, 0.54902);
501 setSunElevation(0.671884);
502 setSunRotation(-0.582913);
505 setFogThickness(0.15);
506 setFogColor(0.8, 0.7, 0.6);
510 setPPSaturation(0.47);