1 RMS.LoadLibrary("rmgen");
4 const tOceanDepths = "medit_sea_depths";
5 const tOceanRockDeep = "medit_sea_coral_deep";
6 const tOceanRockShallow = "medit_rocks_wet";
7 const tOceanCoral = "medit_sea_coral_plants";
8 const tBeachWet = "medit_sand_wet";
9 const tBeachDry = "medit_sand";
10 const tBeachGrass = "medit_rocks_grass";
11 const tBeach = ["medit_rocks_grass","medit_sand", "medit_rocks_grass_shrubs"];
12 const tBeachBlend = ["medit_rocks_grass", "medit_rocks_grass_shrubs"];
13 const tBeachCliff = "medit_dirt";
14 const tCity = "medit_city_tile";
15 const tGrassDry = ["medit_grass_field_dry", "medit_grass_field_b"];
16 const tGrass = ["medit_rocks_grass", "medit_rocks_grass","medit_dirt","medit_rocks_grass_shrubs"];
17 const tGrassLush = ["grass_temperate_dry_tufts", "medit_grass_flowers"];
18 const tGrassShrubs = "medit_shrubs";
19 const tCliffShrubs = ["medit_cliff_aegean_shrubs", "medit_cliff_italia_grass","medit_cliff_italia"];
20 const tGrassRock = ["medit_rocks_grass"];
21 const tDirt = "medit_dirt";
22 const tDirtGrass = "medit_dirt_b";
23 const tDirtCliff = "medit_cliff_italia";
24 const tGrassCliff = "medit_cliff_italia_grass";
25 const tCliff = ["medit_cliff_italia", "medit_cliff_italia", "medit_cliff_italia_grass"];
26 const tForestFloor = "medit_forestfloor_a";
29 const oBeech = "gaia/flora_tree_euro_beech";
30 const oBerryBush = "gaia/flora_bush_berry";
31 const oCarob = "gaia/flora_tree_carob";
32 const oCypress1 = "gaia/flora_tree_cypress";
33 const oCypress2 = "gaia/flora_tree_cypress";
34 const oLombardyPoplar = "gaia/flora_tree_poplar_lombardy";
35 const oOak = "gaia/flora_tree_oak";
36 const oPalm = "gaia/flora_tree_medit_fan_palm";
37 const oPine = "gaia/flora_tree_aleppo_pine";
38 const oPoplar = "gaia/flora_tree_poplar";
39 const oDateT = "gaia/flora_tree_cretan_date_palm_tall";
40 const oDateS = "gaia/flora_tree_cretan_date_palm_short";
41 const oDeer = "gaia/fauna_deer";
42 const oFish = "gaia/fauna_fish";
43 const oWhale = "gaia/fauna_whale_humpback";
44 const oStoneLarge = "gaia/geology_stonemine_medit_quarry";
45 const oStoneSmall = "gaia/geology_stone_mediterranean";
46 const oMetalLarge = "gaia/geology_metal_mediterranean_slabs";
47 const oShipwreck = "other/special_treasure_shipwreck";
48 const oShipDebris = "other/special_treasure_shipwreck_debris";
51 const aBushLargeDry = "actor|props/flora/bush_medit_la_dry.xml";
52 const aBushLarge = "actor|props/flora/bush_medit_la.xml";
53 const aBushMedDry = "actor|props/flora/bush_medit_me_dry.xml";
54 const aBushMed = "actor|props/flora/bush_medit_me.xml";
55 const aBushSmall = "actor|props/flora/bush_medit_sm.xml";
56 const aBushSmallDry = "actor|props/flora/bush_medit_sm_dry.xml";
57 const aGrass = "actor|props/flora/grass_soft_large_tall.xml";
58 const aGrassDry = "actor|props/flora/grass_soft_dry_large_tall.xml";
59 const aRockLarge = "actor|geology/stone_granite_large.xml";
60 const aRockMed = "actor|geology/stone_granite_med.xml";
61 const aRockSmall = "actor|geology/stone_granite_small.xml";
64 // terrain + entity (for painting)
65 const pPalmForest = [tForestFloor+TERRAIN_SEPARATOR+oPalm, tGrass];
66 const pPineForest = [tForestFloor+TERRAIN_SEPARATOR+oPine, tGrass];
67 const pPoplarForest = [tForestFloor+TERRAIN_SEPARATOR+oLombardyPoplar, tGrass];
68 const pMainForest = [tForestFloor+TERRAIN_SEPARATOR+oCarob, tForestFloor+TERRAIN_SEPARATOR+oBeech, tGrass, tGrass];
70 log("Initializing map...");
73 const numPlayers = getNumPlayers();
74 const mapSize = getMapSize();
76 var clCoral = createTileClass();
77 var clPlayer = createTileClass();
78 var clIsland = createTileClass();
79 var clCity = createTileClass();
80 var clDirt = createTileClass();
81 var clHill = createTileClass();
82 var clForest = createTileClass();
83 var clWater = createTileClass();
84 var clRock = createTileClass();
85 var clMetal = createTileClass();
86 var clFood = createTileClass();
87 var clBaseResource = createTileClass();
89 // randomize player order
91 for (var i = 0; i < numPlayers; i++)
93 playerIDs = sortPlayers(playerIDs);
95 //array holding starting islands based on number of players
96 var startingPlaces=[[0],[0,3],[0,2,4],[0,1,3,4],[0,1,2,3,4],[0,1,2,3,4,5]];
98 var numIslands = Math.max(6, numPlayers);
99 var islandX = new Array(numIslands);
100 var islandZ = new Array(numIslands);
101 var islandAngle = new Array(numIslands);
102 //holds all land areas
105 var startAngle = randFloat() * 2 * PI;
106 for (var i=0; i < numIslands; i++)
108 islandAngle[i] = startAngle + i*2*PI/numIslands;
109 islandX[i] = 0.5 + 0.39*cos(islandAngle[i]);
110 islandZ[i] = 0.5 + 0.39*sin(islandAngle[i]);
113 for (var i = 0; i < numIslands; ++i)
115 var radius = scaleByMapSize(15,40);
116 var coral=scaleByMapSize(1,5);
122 // get the x and z in tiles
123 var fx = fractionToTiles(islandX[i]);
124 var fz = fractionToTiles(islandZ[i]);
128 var islandSize = PI*radius*radius;
129 var islandBottom=PI*(radius+coral)*(radius+coral);
132 var placer = new ClumpPlacer(islandBottom, .7, .1, 10, ix, iz);
133 var terrainPainter = new LayeredPainter([tOceanRockDeep, tOceanCoral], [5]);
134 createArea(placer, [terrainPainter, paintClass(clCoral)],avoidClasses(clCoral,0));
138 //create spoke islands
139 //put down base resources and animals but do not populate
140 for (var i=0; i < numIslands; i++)
142 log("Creating base Island " + (i + 1) + "...");
144 var radius = scaleByMapSize(15,40);
145 var coral=scaleByMapSize(2,5);
151 // get the x and z in tiles
152 var fx = fractionToTiles(islandX[i]);
153 var fz = fractionToTiles(islandZ[i]);
157 var islandSize = PI*radius*radius;
158 var islandBottom=PI*(radius+coral)*(radius+coral);
161 var placer = new ClumpPlacer(islandSize, .7, .1, 10, ix, iz);
162 var terrainPainter = new LayeredPainter(
163 [tOceanCoral,tBeachWet, tBeachDry, tBeach, tBeachBlend, tGrass],
164 [1, wet, dry, 1, gbeach]
166 var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, elevation, 5);
167 var temp = createArea(placer, [terrainPainter, paintClass(clPlayer), elevationPainter],avoidClasses(clPlayer,0));
170 placeDefaultChicken(fx, fz, clBaseResource);
172 // create berry bushes
173 var bbAngle = randFloat(0, TWO_PI);
175 var bbX = round(fx + bbDist * cos(bbAngle));
176 var bbZ = round(fz + bbDist * sin(bbAngle));
177 var group = new SimpleGroup(
178 [new SimpleObject(oBerryBush, 5,5, 0,3)],
179 true, clBaseResource, bbX, bbZ
181 createObjectGroup(group, 0);
184 var mAngle = bbAngle;
185 while(abs(mAngle - bbAngle) < PI/3)
186 mAngle = randFloat(0, TWO_PI);
189 var mX = round(fx + mDist * cos(mAngle));
190 var mZ = round(fz + mDist * sin(mAngle));
191 group = new SimpleGroup(
192 [new SimpleObject(oMetalLarge, 1,1, 0,0)],
193 true, clBaseResource, mX, mZ
195 createObjectGroup(group, 0);
197 // create stone mines
198 mAngle += randFloat(PI/8, PI/4);
199 mX = round(fx + mDist * cos(mAngle));
200 mZ = round(fz + mDist * sin(mAngle));
201 group = new SimpleGroup(
202 [new SimpleObject(oStoneLarge, 1,1, 0,2)],
203 true, clBaseResource, mX, mZ
205 createObjectGroup(group, 0);
206 var hillSize = PI * radius * radius;
207 // create starting trees
209 var tAngle = randFloat(-PI/3, 4*PI/3);
210 var tDist = randFloat(12, 13);
211 var tX = round(fx + tDist * cos(tAngle));
212 var tZ = round(fz + tDist * sin(tAngle));
213 group = new SimpleGroup(
214 [new SimpleObject(oPalm, num, num, 0,3)],
215 false, clBaseResource, tX, tZ
217 createObjectGroup(group, 0, avoidClasses(clBaseResource,2));
221 log("Populating islands ...");
222 //nPlayer is the player we are on i is the island we are on
224 for (let i = 0; i < numIslands; ++i)
225 if (numPlayers >= 6 || i == startingPlaces[numPlayers-1][nPlayer])
227 var id = playerIDs[nPlayer];
229 // Get the x and z in tiles
230 var fx = fractionToTiles(islandX[i]);
231 var fz = fractionToTiles(islandZ[i]);
237 var placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz);
238 var painter = new LayeredPainter([tGrass, tCity], [1]);
239 createArea(placer, [painter,paintClass(clCity)], null);
241 placeCivDefaultEntities(fx, fz, id, { 'iberWall': 'towers' });
247 // get the x and z in tiles
248 var nCenter = floor(scaleByMapSize(1,4));
249 var startAngle = randFloat() * 2 * PI;
250 for (var i = 0; i < nCenter; ++i)
257 let isangle = startAngle + i*2*PI/nCenter + PI/8 * randFloat(-1, -1);
258 let dRadius = randFloat(0.1, 0.16);
259 fx = 0.5 + dRadius * cos(isangle);
260 fz = 0.5 + dRadius * sin(isangle);
263 var ix = round(fractionToTiles(fx));
264 var iz = round(fractionToTiles(fz));
266 var radius = scaleByMapSize(15,30);
273 var islandSize = PI*radius*radius;
274 var islandBottom=PI*(radius+coral)*(radius+coral);
277 var placer = new ClumpPlacer(islandBottom, .7, .1, 10, ix, iz);
278 var terrainPainter = new LayeredPainter(
279 [tOceanRockDeep, tOceanCoral],
282 createArea(placer, [terrainPainter, paintClass(clCoral)],avoidClasses(clCoral,0,clPlayer,0));
285 var placer = new ClumpPlacer(islandSize, .7, .1, 10, ix, iz);
286 var terrainPainter = new LayeredPainter(
287 [tOceanCoral,tBeachWet, tBeachDry, tBeach, tBeachBlend, tGrass],
288 [1, wet, dry, 1, gbeach]
290 var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, elevation, 5);
291 var temp = createArea(placer, [terrainPainter, paintClass(clIsland), elevationPainter],avoidClasses(clPlayer,0));
297 log("Creating bumps...");
298 placer = new ClumpPlacer(scaleByMapSize(20, 60), 0.3, 0.06, 1);
299 painter = new SmoothElevationPainter(ELEVATION_MODIFY, 2, 3);
303 avoidClasses(clCity, 0),
304 scaleByMapSize(25, 75),15,
309 log("Creating hills...");
310 placer = new ClumpPlacer(scaleByMapSize(20, 150), 0.2, 0.1, 1);
311 terrainPainter = new LayeredPainter(
312 [tCliff, tCliffShrubs], // terrains
315 elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 12, 2);
318 [terrainPainter, elevationPainter, paintClass(clHill)],
319 avoidClasses(clCity, 15, clHill, 15),
320 scaleByMapSize(5, 30), 15,
326 for (var ix = 0; ix < mapSize; ix++)
327 for (var iz = 0; iz < mapSize; iz++)
328 if (getHeight(ix,iz) < 0)
329 addToClass(ix,iz,clWater);
331 log("Creating forests...");
333 [[tForestFloor, tGrass, pPalmForest], [tForestFloor, pPalmForest]],
334 [[tForestFloor, tGrass, pPineForest], [tForestFloor, pPineForest]],
335 [[tForestFloor, tGrass, pPoplarForest], [tForestFloor, pPoplarForest]],
336 [[tForestFloor, tGrass, pMainForest], [tForestFloor, pMainForest]]
339 var num = scaleByMapSize(10, 64); //number
340 for (var i = 0; i < types.length; ++i)
342 placer = new ClumpPlacer(6+randInt(12), 0.1, 0.1, 1);
343 painter = new LayeredPainter(
344 types[i], // terrains
349 [painter, paintClass(clForest)],
350 avoidClasses(clCity, 1, clWater, 3, clForest, 3, clHill, 1),
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 createObjectGroupsByAreas(group, 0,
359 [avoidClasses(clWater, 1, clForest, 1, clHill, 1, clPlayer, 5, clRock, 1)],
360 scaleByMapSize(4,16), 200, areas
364 log("Creating small stone mines...");
365 group = new SimpleGroup([new SimpleObject(oStoneSmall, 2,5, 1,3)], true, clRock);
366 createObjectGroupsByAreas(group, 0,
367 [avoidClasses(clWater, 1, clForest, 1, clHill, 1, clPlayer, 5, clRock, 2)],
368 scaleByMapSize(4,16), 200, areas
372 log("Creating metal mines...");
373 group = new SimpleGroup([new SimpleObject(oMetalLarge, 1,1, 0,4)], true, clMetal);
374 createObjectGroupsByAreas(group, 0,
375 [avoidClasses(clWater, 1, clForest, 1, clHill, 1, clPlayer, 5, clMetal, 2, clRock, 1)],
376 scaleByMapSize(4,16), 200, areas
380 log("Creating shrub patches...");
381 var sizes = [scaleByMapSize(2, 32), scaleByMapSize(3, 48), scaleByMapSize(5, 80)];
382 for (var i = 0; i < sizes.length; i++)
384 placer = new ClumpPlacer(sizes[i], 0.3, 0.06, 0.5);
385 painter = new LayeredPainter([tBeachBlend,tGrassShrubs],[1]);
388 [painter, paintClass(clDirt)],
389 avoidClasses(clWater, 3, clHill, 0, clDirt, 6, clCity, 0),
390 scaleByMapSize(4, 16), 20, areas
395 log("Creating grass patches...");
396 var sizes = [scaleByMapSize(2, 32), scaleByMapSize(3, 48), scaleByMapSize(5, 80)];
397 for (var i = 0; i < sizes.length; i++)
399 placer = new ClumpPlacer(sizes[i], 0.3, 0.06, 0.5);
400 painter = new LayeredPainter([tGrassDry],[]);
403 [painter, paintClass(clDirt)],
404 avoidClasses(clWater, 3, clHill, 0, clDirt, 6, clCity, 0),
405 scaleByMapSize(4, 16), 20, areas
410 log("Creating straggler trees...");
411 for (let tree of [oCarob, oBeech, oLombardyPoplar, oLombardyPoplar, oPine])
412 createObjectGroupsByAreas(
413 new SimpleGroup([new SimpleObject(tree, 1,1, 0,1)], true, clForest),
415 avoidClasses(clWater, 2, clForest, 2, clCity, 3, clBaseResource, 1, clRock, 1, clMetal, 1, clPlayer, 1, clHill, 1),
416 scaleByMapSize(2, 38), 50, areas
420 log("Create straggler cypresses...");
421 group = new SimpleGroup(
422 [new SimpleObject(oCypress2, 1,3, 0,3), new SimpleObject(oCypress1, 0,2, 0,2)],
425 createObjectGroupsByAreas(group, 0,
426 avoidClasses(clWater, 2, clForest, 2, clCity, 3, clBaseResource, 1, clRock, 1, clMetal, 1, clPlayer, 1, clHill, 1),
427 scaleByMapSize(5, 75), 50, areas
431 log("Create straggler date palms...");
432 group = new SimpleGroup(
433 [new SimpleObject(oDateS, 1,3, 0,3), new SimpleObject(oDateT, 0,2, 0,2)],
436 createObjectGroupsByAreas(group, 0,
437 avoidClasses(clWater, 2, clForest, 1, clCity, 0, clBaseResource, 1, clRock, 1, clMetal, 1, clPlayer, 1, clHill, 1),
438 scaleByMapSize(5, 75), 50, areas
442 log("Creating rocks...");
443 group = new SimpleGroup(
444 [new SimpleObject(aRockSmall, 0,3, 0,2), new SimpleObject(aRockMed, 0,2, 0,2),
445 new SimpleObject(aRockLarge, 0,1, 0,2)]
447 createObjectGroups(group, 0,
448 avoidClasses(clWater, 0, clCity, 0),
449 scaleByMapSize(30, 180), 50
453 log("Creating deer...");
454 group = new SimpleGroup(
455 [new SimpleObject(oDeer, 5,7, 0,4)],
458 createObjectGroups(group, 0,
459 avoidClasses(clWater, 5, clForest, 1, clHill, 1, clCity, 10, clMetal, 2, clRock, 2, clFood, 8),
464 log("Creating berry bushes...");
465 group = new SimpleGroup([new SimpleObject(oBerryBush, 5,7, 0,3)], true, clFood);
466 createObjectGroups(group, 0,
467 avoidClasses(clWater, 2, clForest, 1, clHill, 1, clCity, 10, clMetal, 2, clRock, 2, clFood, 8),
468 1.5 * numPlayers, 100
472 log("Creating Fish...");
473 group = new SimpleGroup([new SimpleObject(oFish, 1,1, 0,3)], true, clFood);
474 createObjectGroups(group, 0,
475 [stayClasses(clWater,1),avoidClasses(clFood, 8)],
476 scaleByMapSize(40,200), 100
480 log("Creating Whales...");
481 group = new SimpleGroup([new SimpleObject(oWhale, 1,1, 0,3)], true, clFood);
482 createObjectGroups(group, 0,
483 [stayClasses(clWater,1),avoidClasses(clFood, 8, clPlayer,4,clIsland,4)],
484 scaleByMapSize(10,40), 100
488 log("Creating shipwrecks...");
489 group = new SimpleGroup([new SimpleObject(oShipwreck, 1,1, 0,3)], true, clFood);
490 createObjectGroups(group, 0,
491 [stayClasses(clWater,1),avoidClasses(clFood, 8)],
492 scaleByMapSize(6,16), 100
496 log("Creating shipwreck debris...");
497 group = new SimpleGroup([new SimpleObject(oShipDebris, 1,2, 0,4)], true, clFood);
498 createObjectGroups(group, 0,
499 [stayClasses(clWater,1),avoidClasses(clFood, 8)],
500 scaleByMapSize(10,20), 100
505 setWaterColor(0.2,0.294,0.49);
506 setWaterTint(0.208, 0.659, 0.925);
507 setWaterMurkiness(0.72);
508 setWaterWaviness(3.0);
509 setWaterType("ocean");