Fix collisions of random forests and mines with starting resources on Cycladic Archip...
[0ad.git] / binaries / data / mods / public / maps / random / cycladic_archipelago.js
blobdccfa28afb174465dbcce1afd6b52fb4096ce037
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];
66 InitMap();
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);
90 var islandX = [];
91 var islandZ = [];
92 var islandAngle = [];
94 //holds all land areas
95 var 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);
109         var wet = 3;
110         var dry = 1;
111         var gbeach = 2;
112         var elevation = 3;
114         // get the x and z in tiles
115         var fx = fractionToTiles(islandX[i]);
116         var fz = fractionToTiles(islandZ[i]);
117         var ix = round(fx);
118         var iz = round(fz);
120         var islandSize = PI*radius*radius;
121         var islandBottom=PI*(radius+coral)*(radius+coral);
123         //create base
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);
137         var wet = 3;
138         var dry = 1;
139         var gbeach = 2;
140         var elevation = 3;
142         // get the x and z in tiles
143         var fx = fractionToTiles(islandX[i]);
144         var fz = fractionToTiles(islandZ[i]);
145         var ix = round(fx);
146         var iz = round(fz);
148         var islandSize = PI*radius*radius;
149         var islandBottom=PI*(radius+coral)*(radius+coral);
151         // create island
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]
156         );
157         var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, elevation, 5);
158         var temp = createArea(placer, [terrainPainter, paintClass(clPlayer), elevationPainter],avoidClasses(clPlayer,0));
159         areas.push(temp);
161         placeDefaultChicken(fx, fz, clBaseResource);
163         // create berry bushes
164         var bbAngle = randFloat(0, TWO_PI);
165         var bbDist = 10;
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
171         );
172         createObjectGroup(group, 0);
174         // create metal mine
175         var mAngle = bbAngle;
176         while(abs(mAngle - bbAngle) < PI/3)
177                 mAngle = randFloat(0, TWO_PI);
179         var mDist = 12;
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
185         );
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
195         );
196         createObjectGroup(group, 0);
198         // create starting trees
199         var num = 2;
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
207         );
208         createObjectGroup(group, 0, avoidClasses(clBaseResource,2));
210 RMS.SetProgress(15);
212 log("Populating islands ...");
213 //nPlayer is the player we are on i is the island we are on
214 var nPlayer = 0;
215 for (let i = 0; i < numIslands; ++i)
216         if (numPlayers >= 6 || i == startingPlaces[numPlayers-1][nPlayer])
217         {
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]);
223                 var ix = round(fx);
224                 var iz = round(fz);
226                 // Create city patch
227                 var cityRadius = 6;
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' });
234                 ++nPlayer;
235         }
236 RMS.SetProgress(20);
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)
243         var fx = 0.5;
244         var fz = 0.5;
246         if (nCenter != 1)
247         {
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);
252         }
254         var ix = round(fractionToTiles(fx));
255         var iz = round(fractionToTiles(fz));
257         var radius = scaleByMapSize(15,30);
258         var coral= 2;
259         var wet = 3;
260         var dry = 1;
261         var gbeach = 2;
262         var elevation = 3;
264         var islandSize = PI*radius*radius;
265         var islandBottom=PI*(radius+coral)*(radius+coral);
267         // Create base
268         var placer = new ClumpPlacer(islandBottom, .7, .1, 10, ix, iz);
269         var terrainPainter = new LayeredPainter(
270                 [tOceanRockDeep, tOceanCoral],
271                 [5]
272         );
273         createArea(placer, [terrainPainter, paintClass(clCoral)],avoidClasses(clCoral,0,clPlayer,0));
275         // Create island
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]
280         );
281         var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, elevation, 5);
282         var temp = createArea(placer, [terrainPainter, paintClass(clIsland), elevationPainter],avoidClasses(clPlayer,0));
284         areas.push(temp);
286 RMS.SetProgress(30);
288 log("Creating bumps...");
289 placer = new ClumpPlacer(scaleByMapSize(20, 60), 0.3, 0.06, 1);
290 painter = new SmoothElevationPainter(ELEVATION_MODIFY, 2, 3);
291 createAreasInAreas(
292         placer,
293         painter,
294         avoidClasses(clCity, 0),
295         scaleByMapSize(25, 75),15,
296         areas
298 RMS.SetProgress(34);
300 log("Creating hills...");
301 placer = new ClumpPlacer(scaleByMapSize(20, 150), 0.2, 0.1, 1);
302 terrainPainter = new LayeredPainter(
303         [tCliff, tCliffShrubs],         // terrains
304         [2]                                                             // widths
306 elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 12, 2);
307 createAreasInAreas(
308         placer,
309         [terrainPainter, elevationPainter, paintClass(clHill)],
310         avoidClasses(clCity, 15, clHill, 15),
311         scaleByMapSize(5, 30), 15,
312         areas
314 RMS.SetProgress(38);
316 // Find all water
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...");
323 var types = [
324         [[tForestFloor, tGrass, pPalmForest], [tForestFloor, pPalmForest]],
325         [[tForestFloor, tGrass, pPineForest], [tForestFloor, pPineForest]],
326         [[tForestFloor, tGrass, pPoplarForest], [tForestFloor, pPoplarForest]],
327         [[tForestFloor, tGrass, pMainForest], [tForestFloor, pMainForest]]
328 ];      // some variation
329 var size = 5; //size
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
336                 [2]                                                                                     // widths
337                 );
338         createAreasInAreas(
339                 placer,
340                 [painter, paintClass(clForest)],
341                 avoidClasses(clCity, 1, clWater, 3, clForest, 3, clHill, 1, clBaseResource, 4),
342                 num, 20, areas
343         );
345 RMS.SetProgress(42);
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
353 RMS.SetProgress(46);
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
361 RMS.SetProgress(50);
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
369 RMS.SetProgress(54);
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]);
377         createAreasInAreas(
378                 placer,
379                 [painter, paintClass(clDirt)],
380                 avoidClasses(clWater, 3, clHill, 0, clDirt, 6, clCity, 0, clBaseResource, 4),
381                 scaleByMapSize(4, 16), 20, areas
382         );
384 RMS.SetProgress(58);
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],[]);
392         createAreasInAreas(
393                 placer,
394                 [painter, paintClass(clDirt)],
395                 avoidClasses(clWater, 3, clHill, 0, clDirt, 6, clCity, 0, clBaseResource, 4),
396                 scaleByMapSize(4, 16), 20, areas
397         );
399 RMS.SetProgress(62);
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),
405                 0,
406                 avoidClasses(clWater, 2, clForest, 2, clCity, 3, clBaseResource, 4, clRock, 6, clMetal, 6, clPlayer, 1, clHill, 1),
407                 scaleByMapSize(2, 38), 50, areas
408         );
409 RMS.SetProgress(66);
411 log("Create straggler cypresses...");
412 group = new SimpleGroup(
413         [new SimpleObject(oCypress2, 1,3, 0,3), new SimpleObject(oCypress1, 0,2, 0,2)],
414         true
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
420 RMS.SetProgress(70);
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)],
425         true
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
431 RMS.SetProgress(74);
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
442 RMS.SetProgress(78);
444 log("Creating deer...");
445 group = new SimpleGroup(
446         [new SimpleObject(oDeer, 5,7, 0,4)],
447         true, clFood
449 createObjectGroupsDeprecated(group, 0,
450         avoidClasses(clWater, 5, clForest, 1, clHill, 1, clCity, 10, clMetal, 6, clRock, 2, clFood, 8),
451         3 * numPlayers, 50
453 RMS.SetProgress(82);
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
461 RMS.SetProgress(86);
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
469 RMS.SetProgress(90);
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
477 RMS.SetProgress(94);
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
485 RMS.SetProgress(98);
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
493 RMS.SetProgress(99);
495 setSkySet("sunny");
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");
502 ExportMap();