Invincible women on survival of the fittest to prevent women fights and cheap tower...
[0ad.git] / binaries / data / mods / public / maps / random / cycladic_archipelago.js
blob4af516ba2fce48d3a59e2b882f69937bed8cf328
1 RMS.LoadLibrary("rmgen");
3 // terrain textures
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";
28 // gaia entities
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";
50 // decorative props
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...");
71 InitMap();
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
90 var playerIDs = [];
91 for (var i = 0; i < numPlayers; i++)
92         playerIDs.push(i+1);
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
103 var 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);
117         var wet = 3;
118         var dry = 1;
119         var gbeach = 2;
120         var elevation = 3;
122         // get the x and z in tiles
123         var fx = fractionToTiles(islandX[i]);
124         var fz = fractionToTiles(islandZ[i]);
125         var ix = round(fx);
126         var iz = round(fz);
128         var islandSize = PI*radius*radius;
129         var islandBottom=PI*(radius+coral)*(radius+coral);
131         //create base
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);
146         var wet = 3;
147         var dry = 1;
148         var gbeach = 2;
149         var elevation = 3;
151         // get the x and z in tiles
152         var fx = fractionToTiles(islandX[i]);
153         var fz = fractionToTiles(islandZ[i]);
154         var ix = round(fx);
155         var iz = round(fz);
157         var islandSize = PI*radius*radius;
158         var islandBottom=PI*(radius+coral)*(radius+coral);
160         // create island
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]
165         );
166         var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, elevation, 5);
167         var temp = createArea(placer, [terrainPainter, paintClass(clPlayer), elevationPainter],avoidClasses(clPlayer,0));
168         areas.push(temp);
170         placeDefaultChicken(fx, fz, clBaseResource);
172         // create berry bushes
173         var bbAngle = randFloat(0, TWO_PI);
174         var bbDist = 10;
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
180         );
181         createObjectGroup(group, 0);
183         // create metal mine
184         var mAngle = bbAngle;
185         while(abs(mAngle - bbAngle) < PI/3)
186                 mAngle = randFloat(0, TWO_PI);
188         var mDist = 12;
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
194         );
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
204         );
205         createObjectGroup(group, 0);
206         var hillSize = PI * radius * radius;
207         // create starting trees
208         var num = 2;
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
216         );
217         createObjectGroup(group, 0, avoidClasses(clBaseResource,2));
219 RMS.SetProgress(15);
221 log("Populating islands ...");
222 //nPlayer is the player we are on i is the island we are on
223 var nPlayer = 0;
224 for (let i = 0; i < numIslands; ++i)
225         if (numPlayers >= 6 || i == startingPlaces[numPlayers-1][nPlayer])
226         {
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]);
232                 var ix = round(fx);
233                 var iz = round(fz);
235                 // Create city patch
236                 var cityRadius = 6;
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' });
243                 ++nPlayer;
244         }
245 RMS.SetProgress(20);
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)
252         var fx = 0.5;
253         var fz = 0.5;
255         if (nCenter != 1)
256         {
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);
261         }
263         var ix = round(fractionToTiles(fx));
264         var iz = round(fractionToTiles(fz));
266         var radius = scaleByMapSize(15,30);
267         var coral= 2;
268         var wet = 3;
269         var dry = 1;
270         var gbeach = 2;
271         var elevation = 3;
273         var islandSize = PI*radius*radius;
274         var islandBottom=PI*(radius+coral)*(radius+coral);
276         // Create base
277         var placer = new ClumpPlacer(islandBottom, .7, .1, 10, ix, iz);
278         var terrainPainter = new LayeredPainter(
279                 [tOceanRockDeep, tOceanCoral],
280                 [5]
281         );
282         createArea(placer, [terrainPainter, paintClass(clCoral)],avoidClasses(clCoral,0,clPlayer,0));
284         // Create island
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]
289         );
290         var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, elevation, 5);
291         var temp = createArea(placer, [terrainPainter, paintClass(clIsland), elevationPainter],avoidClasses(clPlayer,0));
293         areas.push(temp);
295 RMS.SetProgress(30);
297 log("Creating bumps...");
298 placer = new ClumpPlacer(scaleByMapSize(20, 60), 0.3, 0.06, 1);
299 painter = new SmoothElevationPainter(ELEVATION_MODIFY, 2, 3);
300 createAreasInAreas(
301         placer,
302         painter,
303         avoidClasses(clCity, 0),
304         scaleByMapSize(25, 75),15,
305         areas
307 RMS.SetProgress(34);
309 log("Creating hills...");
310 placer = new ClumpPlacer(scaleByMapSize(20, 150), 0.2, 0.1, 1);
311 terrainPainter = new LayeredPainter(
312         [tCliff, tCliffShrubs],         // terrains
313         [2]                                                             // widths
315 elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 12, 2);
316 createAreasInAreas(
317         placer,
318         [terrainPainter, elevationPainter, paintClass(clHill)],
319         avoidClasses(clCity, 15, clHill, 15),
320         scaleByMapSize(5, 30), 15,
321         areas
323 RMS.SetProgress(38);
325 // Find all water
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...");
332 var types = [
333         [[tForestFloor, tGrass, pPalmForest], [tForestFloor, pPalmForest]],
334         [[tForestFloor, tGrass, pPineForest], [tForestFloor, pPineForest]],
335         [[tForestFloor, tGrass, pPoplarForest], [tForestFloor, pPoplarForest]],
336         [[tForestFloor, tGrass, pMainForest], [tForestFloor, pMainForest]]
337 ];      // some variation
338 var size = 5; //size
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
345                 [2]                                                                                     // widths
346                 );
347         createAreasInAreas(
348                 placer,
349                 [painter, paintClass(clForest)],
350                 avoidClasses(clCity, 1, clWater, 3, clForest, 3, clHill, 1),
351                 num, 20, areas
352         );
354 RMS.SetProgress(42);
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
362 RMS.SetProgress(46);
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
370 RMS.SetProgress(50);
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
378 RMS.SetProgress(54);
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]);
386         createAreasInAreas(
387                 placer,
388                 [painter, paintClass(clDirt)],
389                 avoidClasses(clWater, 3, clHill, 0, clDirt, 6, clCity, 0),
390                 scaleByMapSize(4, 16), 20, areas
391         );
393 RMS.SetProgress(58);
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],[]);
401         createAreasInAreas(
402                 placer,
403                 [painter, paintClass(clDirt)],
404                 avoidClasses(clWater, 3, clHill, 0, clDirt, 6, clCity, 0),
405                 scaleByMapSize(4, 16), 20, areas
406         );
408 RMS.SetProgress(62);
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),
414                 0,
415                 avoidClasses(clWater, 2, clForest, 2, clCity, 3, clBaseResource, 1, clRock, 1, clMetal, 1, clPlayer, 1, clHill, 1),
416                 scaleByMapSize(2, 38), 50, areas
417         );
418 RMS.SetProgress(66);
420 log("Create straggler cypresses...");
421 group = new SimpleGroup(
422         [new SimpleObject(oCypress2, 1,3, 0,3), new SimpleObject(oCypress1, 0,2, 0,2)],
423         true
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
429 RMS.SetProgress(70);
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)],
434         true
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
440 RMS.SetProgress(74);
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
451 RMS.SetProgress(78);
453 log("Creating deer...");
454 group = new SimpleGroup(
455         [new SimpleObject(oDeer, 5,7, 0,4)],
456         true, clFood
458 createObjectGroups(group, 0,
459         avoidClasses(clWater, 5, clForest, 1, clHill, 1, clCity, 10, clMetal, 2, clRock, 2, clFood, 8),
460         3 * numPlayers, 50
462 RMS.SetProgress(82);
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
470 RMS.SetProgress(86);
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
478 RMS.SetProgress(90);
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
486 RMS.SetProgress(94);
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
494 RMS.SetProgress(98);
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
502 RMS.SetProgress(99);
504 setSkySet("sunny");
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");
511 ExportMap();