1 RMS.LoadLibrary("rmgen");
3 const tOceanDepths = "medit_sea_depths";
4 const tOceanRockDeep = "medit_sea_coral_deep";
5 const tOceanRockShallow = "medit_rocks_wet";
6 const tOceanCoral = "medit_sea_coral_plants";
7 const tBeachWet = "medit_sand_wet";
8 const tBeachDry = "medit_sand";
9 const tBeachGrass = "medit_rocks_grass";
10 const tBeach = ["medit_rocks_grass","medit_sand", "medit_rocks_grass_shrubs"];
11 const tBeachBlend = ["medit_rocks_grass", "medit_rocks_grass_shrubs"];
12 const tBeachCliff = "medit_dirt";
13 const tCity = "medit_city_tile";
14 const tGrassDry = ["medit_grass_field_dry", "medit_grass_field_b"];
15 const tGrass = ["medit_rocks_grass", "medit_rocks_grass","medit_dirt","medit_rocks_grass_shrubs"];
16 const tGrassLush = ["grass_temperate_dry_tufts", "medit_grass_flowers"];
17 const tGrassShrubs = "medit_shrubs";
18 const tCliffShrubs = ["medit_cliff_aegean_shrubs", "medit_cliff_italia_grass","medit_cliff_italia"];
19 const tGrassRock = ["medit_rocks_grass"];
20 const tDirt = "medit_dirt";
21 const tDirtGrass = "medit_dirt_b";
22 const tDirtCliff = "medit_cliff_italia";
23 const tGrassCliff = "medit_cliff_italia_grass";
24 const tCliff = ["medit_cliff_italia", "medit_cliff_italia", "medit_cliff_italia_grass"];
25 const tForestFloor = "medit_forestfloor_a";
27 const oBeech = "gaia/flora_tree_euro_beech";
28 const oBerryBush = "gaia/flora_bush_berry";
29 const oCarob = "gaia/flora_tree_carob";
30 const oCypress1 = "gaia/flora_tree_cypress";
31 const oCypress2 = "gaia/flora_tree_cypress";
32 const oLombardyPoplar = "gaia/flora_tree_poplar_lombardy";
33 const oOak = "gaia/flora_tree_oak";
34 const oPalm = "gaia/flora_tree_medit_fan_palm";
35 const oPine = "gaia/flora_tree_aleppo_pine";
36 const oPoplar = "gaia/flora_tree_poplar";
37 const oDateT = "gaia/flora_tree_cretan_date_palm_tall";
38 const oDateS = "gaia/flora_tree_cretan_date_palm_short";
39 const oDeer = "gaia/fauna_deer";
40 const oFish = "gaia/fauna_fish";
41 const oWhale = "gaia/fauna_whale_humpback";
42 const oStoneLarge = "gaia/geology_stonemine_medit_quarry";
43 const oStoneSmall = "gaia/geology_stone_mediterranean";
44 const oMetalLarge = "gaia/geology_metal_mediterranean_slabs";
45 const oShipwreck = "other/special_treasure_shipwreck";
46 const oShipDebris = "other/special_treasure_shipwreck_debris";
48 const aBushLargeDry = "actor|props/flora/bush_medit_la_dry.xml";
49 const aBushLarge = "actor|props/flora/bush_medit_la.xml";
50 const aBushMedDry = "actor|props/flora/bush_medit_me_dry.xml";
51 const aBushMed = "actor|props/flora/bush_medit_me.xml";
52 const aBushSmall = "actor|props/flora/bush_medit_sm.xml";
53 const aBushSmallDry = "actor|props/flora/bush_medit_sm_dry.xml";
54 const aGrass = "actor|props/flora/grass_soft_large_tall.xml";
55 const aGrassDry = "actor|props/flora/grass_soft_dry_large_tall.xml";
56 const aRockLarge = "actor|geology/stone_granite_large.xml";
57 const aRockMed = "actor|geology/stone_granite_med.xml";
58 const aRockSmall = "actor|geology/stone_granite_small.xml";
60 // terrain + entity (for painting)
61 const pPalmForest = [tForestFloor+TERRAIN_SEPARATOR+oPalm, tGrass];
62 const pPineForest = [tForestFloor+TERRAIN_SEPARATOR+oPine, tGrass];
63 const pPoplarForest = [tForestFloor+TERRAIN_SEPARATOR+oLombardyPoplar, tGrass];
64 const pMainForest = [tForestFloor+TERRAIN_SEPARATOR+oCarob, tForestFloor+TERRAIN_SEPARATOR+oBeech, tGrass, tGrass];
68 const numPlayers = getNumPlayers();
69 const mapSize = getMapSize();
71 var clCoral = createTileClass();
72 var clPlayer = createTileClass();
73 var clIsland = createTileClass();
74 var clCity = createTileClass();
75 var clDirt = createTileClass();
76 var clHill = createTileClass();
77 var clForest = createTileClass();
78 var clWater = createTileClass();
79 var clRock = createTileClass();
80 var clMetal = createTileClass();
81 var clFood = createTileClass();
82 var clBaseResource = createTileClass();
84 var playerIDs = sortAllPlayers();
86 //array holding starting islands based on number of players
87 var startingPlaces=[[0],[0,3],[0,2,4],[0,1,3,4],[0,1,2,3,4],[0,1,2,3,4,5]];
89 var numIslands = Math.max(6, numPlayers);
94 //holds all land areas
97 var startAngle = randFloat(0, 2 * PI);
98 for (var i=0; i < numIslands; i++)
100 islandAngle[i] = startAngle + i*2*PI/numIslands;
101 islandX[i] = 0.5 + 0.39*cos(islandAngle[i]);
102 islandZ[i] = 0.5 + 0.39*sin(islandAngle[i]);
105 for (var i = 0; i < numIslands; ++i)
107 var radius = scaleByMapSize(15,40);
108 var coral=scaleByMapSize(1,5);
114 // get the x and z in tiles
115 var fx = fractionToTiles(islandX[i]);
116 var fz = fractionToTiles(islandZ[i]);
120 var islandSize = PI*radius*radius;
121 var islandBottom=PI*(radius+coral)*(radius+coral);
124 var placer = new ClumpPlacer(islandBottom, .7, .1, 10, ix, iz);
125 var terrainPainter = new LayeredPainter([tOceanRockDeep, tOceanCoral], [5]);
126 createArea(placer, [terrainPainter, paintClass(clCoral)],avoidClasses(clCoral,0));
129 //create spoke islands
130 //put down base resources and animals but do not populate
131 for (var i=0; i < numIslands; i++)
133 log("Creating base Island " + (i + 1) + "...");
135 var radius = scaleByMapSize(15,40);
136 var coral=scaleByMapSize(2,5);
142 // get the x and z in tiles
143 var fx = fractionToTiles(islandX[i]);
144 var fz = fractionToTiles(islandZ[i]);
148 var islandSize = PI*radius*radius;
149 var islandBottom=PI*(radius+coral)*(radius+coral);
152 var placer = new ClumpPlacer(islandSize, .7, .1, 10, ix, iz);
153 var terrainPainter = new LayeredPainter(
154 [tOceanCoral,tBeachWet, tBeachDry, tBeach, tBeachBlend, tGrass],
155 [1, wet, dry, 1, gbeach]
157 var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, elevation, 5);
158 var temp = createArea(placer, [terrainPainter, paintClass(clPlayer), elevationPainter],avoidClasses(clPlayer,0));
161 placeDefaultChicken(fx, fz, clBaseResource);
163 // create berry bushes
164 var bbAngle = randFloat(0, TWO_PI);
166 var bbX = round(fx + bbDist * cos(bbAngle));
167 var bbZ = round(fz + bbDist * sin(bbAngle));
168 var group = new SimpleGroup(
169 [new SimpleObject(oBerryBush, 5,5, 0,3)],
170 true, clBaseResource, bbX, bbZ
172 createObjectGroup(group, 0);
175 var mAngle = bbAngle;
176 while(abs(mAngle - bbAngle) < PI/3)
177 mAngle = randFloat(0, TWO_PI);
180 var mX = round(fx + mDist * cos(mAngle));
181 var mZ = round(fz + mDist * sin(mAngle));
182 group = new SimpleGroup(
183 [new SimpleObject(oMetalLarge, 1,1, 0,0)],
184 true, clBaseResource, mX, mZ
186 createObjectGroup(group, 0);
188 // create stone mines
189 mAngle += randFloat(PI/8, PI/4);
190 mX = round(fx + mDist * cos(mAngle));
191 mZ = round(fz + mDist * sin(mAngle));
192 group = new SimpleGroup(
193 [new SimpleObject(oStoneLarge, 1,1, 0,2)],
194 true, clBaseResource, mX, mZ
196 createObjectGroup(group, 0);
198 // create starting trees
200 var tAngle = randFloat(-PI/3, 4*PI/3);
201 var tDist = randFloat(12, 13);
202 var tX = round(fx + tDist * cos(tAngle));
203 var tZ = round(fz + tDist * sin(tAngle));
204 group = new SimpleGroup(
205 [new SimpleObject(oPalm, num, num, 0,3)],
206 false, clBaseResource, tX, tZ
208 createObjectGroup(group, 0, avoidClasses(clBaseResource,2));
212 log("Populating islands ...");
213 //nPlayer is the player we are on i is the island we are on
215 for (let i = 0; i < numIslands; ++i)
216 if (numPlayers >= 6 || i == startingPlaces[numPlayers-1][nPlayer])
218 var id = playerIDs[nPlayer];
220 // Get the x and z in tiles
221 var fx = fractionToTiles(islandX[i]);
222 var fz = fractionToTiles(islandZ[i]);
228 var placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz);
229 var painter = new LayeredPainter([tGrass, tCity], [1]);
230 createArea(placer, [painter,paintClass(clCity)], null);
232 placeCivDefaultEntities(fx, fz, id, { 'iberWall': 'towers' });
238 // get the x and z in tiles
239 var nCenter = floor(scaleByMapSize(1,4));
240 startAngle = randFloat(0, 2 * PI);
241 for (var i = 0; i < nCenter; ++i)
248 let isangle = startAngle + i * 2 * PI / nCenter + randFloat(-PI/8, PI/8);
249 let dRadius = randFloat(0.1, 0.16);
250 fx = 0.5 + dRadius * cos(isangle);
251 fz = 0.5 + dRadius * sin(isangle);
254 var ix = round(fractionToTiles(fx));
255 var iz = round(fractionToTiles(fz));
257 var radius = scaleByMapSize(15,30);
264 var islandSize = PI*radius*radius;
265 var islandBottom=PI*(radius+coral)*(radius+coral);
268 var placer = new ClumpPlacer(islandBottom, .7, .1, 10, ix, iz);
269 var terrainPainter = new LayeredPainter(
270 [tOceanRockDeep, tOceanCoral],
273 createArea(placer, [terrainPainter, paintClass(clCoral)],avoidClasses(clCoral,0,clPlayer,0));
276 var placer = new ClumpPlacer(islandSize, .7, .1, 10, ix, iz);
277 var terrainPainter = new LayeredPainter(
278 [tOceanCoral,tBeachWet, tBeachDry, tBeach, tBeachBlend, tGrass],
279 [1, wet, dry, 1, gbeach]
281 var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, elevation, 5);
282 var temp = createArea(placer, [terrainPainter, paintClass(clIsland), elevationPainter],avoidClasses(clPlayer,0));
288 log("Creating bumps...");
289 placer = new ClumpPlacer(scaleByMapSize(20, 60), 0.3, 0.06, 1);
290 painter = new SmoothElevationPainter(ELEVATION_MODIFY, 2, 3);
294 avoidClasses(clCity, 0),
295 scaleByMapSize(25, 75),15,
300 log("Creating hills...");
301 placer = new ClumpPlacer(scaleByMapSize(20, 150), 0.2, 0.1, 1);
302 terrainPainter = new LayeredPainter(
303 [tCliff, tCliffShrubs], // terrains
306 elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 12, 2);
309 [terrainPainter, elevationPainter, paintClass(clHill)],
310 avoidClasses(clCity, 15, clHill, 15),
311 scaleByMapSize(5, 30), 15,
317 for (var ix = 0; ix < mapSize; ix++)
318 for (var iz = 0; iz < mapSize; iz++)
319 if (getHeight(ix,iz) < 0)
320 addToClass(ix,iz,clWater);
322 log("Creating forests...");
324 [[tForestFloor, tGrass, pPalmForest], [tForestFloor, pPalmForest]],
325 [[tForestFloor, tGrass, pPineForest], [tForestFloor, pPineForest]],
326 [[tForestFloor, tGrass, pPoplarForest], [tForestFloor, pPoplarForest]],
327 [[tForestFloor, tGrass, pMainForest], [tForestFloor, pMainForest]]
330 var num = scaleByMapSize(10, 64); //number
331 for (var i = 0; i < types.length; ++i)
333 placer = new ClumpPlacer(randIntInclusive(6, 17), 0.1, 0.1, 1);
334 painter = new LayeredPainter(
335 types[i], // terrains
340 [painter, paintClass(clForest)],
341 avoidClasses(clCity, 1, clWater, 3, clForest, 3, clHill, 1, clBaseResource, 4),
347 log("Creating stone mines...");
348 group = new SimpleGroup([new SimpleObject(oStoneSmall, 0,2, 0,4), new SimpleObject(oStoneLarge, 1,1, 0,4)], true, clRock);
349 createObjectGroupsByAreasDeprecated(group, 0,
350 [avoidClasses(clWater, 1, clForest, 1, clHill, 1, clPlayer, 5, clRock, 6)],
351 scaleByMapSize(4,16), 200, areas
355 log("Creating small stone mines...");
356 group = new SimpleGroup([new SimpleObject(oStoneSmall, 2,5, 1,3)], true, clRock);
357 createObjectGroupsByAreasDeprecated(group, 0,
358 [avoidClasses(clWater, 1, clForest, 1, clHill, 1, clPlayer, 5, clRock, 2)],
359 scaleByMapSize(4,16), 200, areas
363 log("Creating metal mines...");
364 group = new SimpleGroup([new SimpleObject(oMetalLarge, 1,1, 0,4)], true, clMetal);
365 createObjectGroupsByAreasDeprecated(group, 0,
366 [avoidClasses(clWater, 1, clForest, 1, clHill, 1, clPlayer, 5, clMetal, 6, clRock, 6)],
367 scaleByMapSize(4,16), 200, areas
371 log("Creating shrub patches...");
372 var sizes = [scaleByMapSize(2, 32), scaleByMapSize(3, 48), scaleByMapSize(5, 80)];
373 for (var i = 0; i < sizes.length; i++)
375 placer = new ClumpPlacer(sizes[i], 0.3, 0.06, 0.5);
376 painter = new LayeredPainter([tBeachBlend,tGrassShrubs],[1]);
379 [painter, paintClass(clDirt)],
380 avoidClasses(clWater, 3, clHill, 0, clDirt, 6, clCity, 0, clBaseResource, 4),
381 scaleByMapSize(4, 16), 20, areas
386 log("Creating grass patches...");
387 var sizes = [scaleByMapSize(2, 32), scaleByMapSize(3, 48), scaleByMapSize(5, 80)];
388 for (var i = 0; i < sizes.length; i++)
390 placer = new ClumpPlacer(sizes[i], 0.3, 0.06, 0.5);
391 painter = new LayeredPainter([tGrassDry],[]);
394 [painter, paintClass(clDirt)],
395 avoidClasses(clWater, 3, clHill, 0, clDirt, 6, clCity, 0, clBaseResource, 4),
396 scaleByMapSize(4, 16), 20, areas
401 log("Creating straggler trees...");
402 for (let tree of [oCarob, oBeech, oLombardyPoplar, oLombardyPoplar, oPine])
403 createObjectGroupsByAreasDeprecated(
404 new SimpleGroup([new SimpleObject(tree, 1,1, 0,1)], true, clForest),
406 avoidClasses(clWater, 2, clForest, 2, clCity, 3, clBaseResource, 4, clRock, 6, clMetal, 6, clPlayer, 1, clHill, 1),
407 scaleByMapSize(2, 38), 50, areas
411 log("Create straggler cypresses...");
412 group = new SimpleGroup(
413 [new SimpleObject(oCypress2, 1,3, 0,3), new SimpleObject(oCypress1, 0,2, 0,2)],
416 createObjectGroupsByAreasDeprecated(group, 0,
417 avoidClasses(clWater, 2, clForest, 2, clCity, 3, clBaseResource, 4, clRock, 6, clMetal, 6, clPlayer, 1, clHill, 1),
418 scaleByMapSize(5, 75), 50, areas
422 log("Create straggler date palms...");
423 group = new SimpleGroup(
424 [new SimpleObject(oDateS, 1,3, 0,3), new SimpleObject(oDateT, 0,2, 0,2)],
427 createObjectGroupsByAreasDeprecated(group, 0,
428 avoidClasses(clWater, 2, clForest, 1, clCity, 0, clBaseResource, 4, clRock, 6, clMetal, 6, clPlayer, 1, clHill, 1),
429 scaleByMapSize(5, 75), 50, areas
433 log("Creating rocks...");
434 group = new SimpleGroup(
435 [new SimpleObject(aRockSmall, 0,3, 0,2), new SimpleObject(aRockMed, 0,2, 0,2),
436 new SimpleObject(aRockLarge, 0,1, 0,2)]
438 createObjectGroupsDeprecated(group, 0,
439 avoidClasses(clWater, 0, clCity, 0),
440 scaleByMapSize(30, 180), 50
444 log("Creating deer...");
445 group = new SimpleGroup(
446 [new SimpleObject(oDeer, 5,7, 0,4)],
449 createObjectGroupsDeprecated(group, 0,
450 avoidClasses(clWater, 5, clForest, 1, clHill, 1, clCity, 10, clMetal, 6, clRock, 2, clFood, 8),
455 log("Creating berry bushes...");
456 group = new SimpleGroup([new SimpleObject(oBerryBush, 5,7, 0,3)], true, clFood);
457 createObjectGroupsDeprecated(group, 0,
458 avoidClasses(clWater, 2, clForest, 1, clHill, 1, clCity, 10, clMetal, 6, clRock, 2, clFood, 8),
459 1.5 * numPlayers, 100
463 log("Creating Fish...");
464 group = new SimpleGroup([new SimpleObject(oFish, 1,1, 0,3)], true, clFood);
465 createObjectGroupsDeprecated(group, 0,
466 [stayClasses(clWater,1),avoidClasses(clFood, 8)],
467 scaleByMapSize(40,200), 100
471 log("Creating Whales...");
472 group = new SimpleGroup([new SimpleObject(oWhale, 1,1, 0,3)], true, clFood);
473 createObjectGroupsDeprecated(group, 0,
474 [stayClasses(clWater,1),avoidClasses(clFood, 8, clPlayer,4,clIsland,4)],
475 scaleByMapSize(10,40), 100
479 log("Creating shipwrecks...");
480 group = new SimpleGroup([new SimpleObject(oShipwreck, 1,1, 0,3)], true, clFood);
481 createObjectGroupsDeprecated(group, 0,
482 [stayClasses(clWater,1),avoidClasses(clFood, 8)],
483 scaleByMapSize(6,16), 100
487 log("Creating shipwreck debris...");
488 group = new SimpleGroup([new SimpleObject(oShipDebris, 1,2, 0,4)], true, clFood);
489 createObjectGroupsDeprecated(group, 0,
490 [stayClasses(clWater,1),avoidClasses(clFood, 8)],
491 scaleByMapSize(10,20), 100
496 setWaterColor(0.2,0.294,0.49);
497 setWaterTint(0.208, 0.659, 0.925);
498 setWaterMurkiness(0.72);
499 setWaterWaviness(3.0);
500 setWaterType("ocean");