Invincible women on survival of the fittest to prevent women fights and cheap tower...
[0ad.git] / binaries / data / mods / public / maps / random / phoenician_levant.js
blob1f45fbd6219a33e08b30a24fba85aab8da4280a6
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";
19 // gaia entities
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";
35 // decorative props
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...");
48 InitMap();
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
70 var playerIDs = [];
71 for (var i = 0; i < numPlayers; i++)
73         playerIDs.push(i+1);
75 playerIDs = sortPlayers(playerIDs);
77 // place players
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 + "...");
95         // some constants
96         var radius = scaleByMapSize(15,25);
97         var cliffRadius = 2;
98         var elevation = 20;
100         // get the x and z in tiles
101         var fx = fractionToTiles(playerX[i]);
102         var fz = fractionToTiles(playerZ[i]);
103         var ix = floor(fx);
104         var iz = floor(fz);
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);
124         var bbDist = 12;
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
130         );
131         createObjectGroup(group, 0);
133         // create metal mine
134         var mAngle = bbAngle;
135         while(abs(mAngle - bbAngle) < PI/3)
136         {
137                 mAngle = randFloat(0, TWO_PI);
138         }
139         var mDist = 12;
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
145         );
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
155         );
156         createObjectGroup(group, 0);
157         var hillSize = PI * radius * radius;
158         // create starting trees
159         var num = 2;
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
167         );
168         createObjectGroup(group, 0, avoidClasses(clBaseResource,2));
170         // create grass tufts
171         var num = hillSize / 250;
172         for (var j = 0; j < num; j++)
173         {
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
181                 );
182                 createObjectGroup(group, 0);
183         }
186 RMS.SetProgress(30);
189 log("Creating sea");
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++)
195         {
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);
203                 var fadeDist = 0.05;
205                 if (x < cu + 0.5)
206                 {
207                         var h;
208                         if (x < (cu + 0.5 + fadeDist))
209                         {
210                                 h = 1 + 4.0 * (1 - ((cu + 0.5 + fadeDist) - x)/fadeDist);
211                         }
212                         else
213                         {
214                                 h = -3.0;
215                         }
217                         if (h < -1.5)
218                         {
219                                 placeTerrain(ix, iz, tWater);
220                         }
221                         else
222                         {
223                                 placeTerrain(ix, iz, tShore);
224                         }
226                         setHeight(ix, iz, h);
227                         if (h < 0){
228                                 addToClass(ix, iz, clWater);
229                         }
230                 }
231         }
234 RMS.SetProgress(40);
235 // create bumps
236 log("Creating bumps...");
237 placer = new ClumpPlacer(scaleByMapSize(20, 50), 0.3, 0.06, 1);
238 painter = new SmoothElevationPainter(ELEVATION_MODIFY, 2, 2);
239 createAreas(
240         placer,
241         painter,
242         avoidClasses(clWater, 2, clPlayer, 20),
243         scaleByMapSize(100, 200)
246 // create hills
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
251         [2]                                                             // widths
253 var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 15, 2);
254 createAreas(
255         placer,
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);
270 // create forests
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),
277         num, 50
280 RMS.SetProgress(50);
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
295                 [1,1]                                                                                                                   // widths
296         );
297         createAreas(
298                 placer,
299                 [painter, paintClass(clDirt)],
300                 avoidClasses(clForest, 0, clGrass, 5, clPlayer, 10, clWater, 4, clDirt, 5, clHill, 1),
301                 scaleByMapSize(15, 45)
302         );
305 RMS.SetProgress(55);
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
315                 [1,1]                                                                                                                   // widths
316         );
317         createAreas(
318                 placer,
319                 [painter, paintClass(clDirt)],
320                 avoidClasses(clForest, 0, clDirt, 5, clPlayer, 10, clWater, 4, clGrass, 5, clHill, 1),
321                 scaleByMapSize(15, 45)
322         );
327 RMS.SetProgress(60);
329 // create cyprus
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
334         [12]                                                            // widths
336 var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 6, 8);
337 createAreas(
338         placer,
339         [terrainPainter, elevationPainter, paintClass(clIsland)],
340         [stayClasses (clWater, 5)],
341         1
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
390 RMS.SetProgress(65);
392 // create small decorative rocks
393 log("Creating small decorative rocks...");
394 group = new SimpleGroup(
395         [new SimpleObject(aDecorativeRock, 1,3, 0,1)],
396         true
398 createObjectGroups(
399         group, 0,
400         avoidClasses(clWater, 1, clForest, 0, clPlayer, 0, clHill, 1),
401         scaleByMapSize(16, 262), 50
405 // create shrubs
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)],
409         true
411 createObjectGroups(
412         group, 0,
413         avoidClasses(clWater, 3, clPlayer, 0, clHill, 1),
414         scaleByMapSize(40, 360), 50
417 RMS.SetProgress(70);
419 // create fish
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
427 // create sheeps
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
435 // create goats
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
443 // create deers
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)],
455         true, clFood
457 createObjectGroups(group, 0,
458         avoidClasses(clWater, 3, clForest, 0, clPlayer, 15, clHill, 1, clFood, 7),
459         randInt(1, 4) * numPlayers + 2, 50
462 RMS.SetProgress(90);
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),
473                 num
474         );
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),
485                 num
486         );
489 // Set environment
490 setSkySet("sunny");
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);
504 setFogFactor(0.2);
505 setFogThickness(0.15);
506 setFogColor(0.8, 0.7, 0.6);
508 setPPEffect("hdr");
509 setPPContrast(0.53);
510 setPPSaturation(0.47);
511 setPPBloom(0.52);
513 // Export map data
514 ExportMap();