Fix wrong comma in rP20127 and a mismatched brace in rP20144 (hidden by the wrong...
[0ad.git] / binaries / data / mods / public / maps / random / the_nile.js
blob14cf97883d699c152f77fd54955ca7bc551001e9
1 RMS.LoadLibrary("rmgen");
3 var tCity = "desert_city_tile";
4 var tCityPlaza = "desert_city_tile_plaza";
5 var tSand = ["desert_dirt_rough", "desert_dirt_rough_2", "desert_sand_dunes_50", "desert_sand_smooth"];
6 var tDunes = "desert_sand_dunes_100";
7 var tFineSand = "desert_sand_smooth";
8 var tCliff = ["desert_cliff_badlands", "desert_cliff_badlands_2"];
9 var tForestFloor = "desert_forestfloor_palms";
10 var tGrass = "desert_dirt_rough_2";
11 var tGrassSand50 = "desert_sand_dunes_50";
12 var tGrassSand25 = "desert_dirt_rough";
13 var tDirt = "desert_dirt_rough";
14 var tDirtCracks = "desert_dirt_cracks";
15 var tShore = "desert_sand_wet";
16 var tLush = "desert_grass_a";
17 var tSLush = "desert_grass_a_sand";
18 var tSDry = "desert_plants_b";
20 var oBerryBush = "gaia/flora_bush_berry";
21 var oCamel = "gaia/fauna_camel";
22 var oFish = "gaia/fauna_fish";
23 var oGazelle = "gaia/fauna_gazelle";
24 var oGiraffe = "gaia/fauna_giraffe";
25 var oGoat = "gaia/fauna_goat";
26 var oWildebeest = "gaia/fauna_wildebeest";
27 var oStoneLarge = "gaia/geology_stonemine_desert_badlands_quarry";
28 var oStoneSmall = "gaia/geology_stone_desert_small";
29 var oMetalLarge = "gaia/geology_metal_desert_slabs";
30 var oDatePalm = "gaia/flora_tree_date_palm";
31 var oSDatePalm = "gaia/flora_tree_cretan_date_palm_short";
32 var eObelisk = "other/obelisk";
33 var ePyramid = "other/pyramid_minor";
34 var oWood = "gaia/special_treasure_wood";
35 var oFood = "gaia/special_treasure_food_bin";
37 var aBush1 = "actor|props/flora/bush_desert_a.xml";
38 var aBush2 = "actor|props/flora/bush_desert_dry_a.xml";
39 var aBush3 = "actor|props/flora/bush_medit_sm_dry.xml";
40 var aBush4 = "actor|props/flora/plant_desert_a.xml";
41 var aBushes = [aBush1, aBush2, aBush3, aBush4];
42 var aDecorativeRock = "actor|geology/stone_desert_med.xml";
43 var aReeds = "actor|props/flora/reeds_pond_lush_a.xml";
44 var aLillies = "actor|props/flora/water_lillies.xml";
46 // terrain + entity (for painting)
47 var pForest = [tForestFloor + TERRAIN_SEPARATOR + oDatePalm, tForestFloor + TERRAIN_SEPARATOR + oSDatePalm, tForestFloor];
48 var pForestOasis = [tGrass + TERRAIN_SEPARATOR + oDatePalm, tGrass + TERRAIN_SEPARATOR + oSDatePalm, tGrass];
50 InitMap();
52 var mapSize = getMapSize();
53 var aPlants = mapSize < 256 ?
54         "actor|props/flora/grass_tropical.xml" :
55         "actor|props/flora/grass_tropic_field_tall.xml";
57 var numPlayers = getNumPlayers();
58 var mapArea = mapSize*mapSize;
60 var clPlayer = createTileClass();
61 var clForest = createTileClass();
62 var clWater = createTileClass();
63 var clDirt = createTileClass();
64 var clRock = createTileClass();
65 var clMetal = createTileClass();
66 var clFood = createTileClass();
67 var clBaseResource = createTileClass();
68 var clSettlement = createTileClass();
69 var clGrass = createTileClass();
70 var clDesert = createTileClass();
71 var clPond = createTileClass();
72 var clShore = createTileClass();
73 var clTreasure = createTileClass();
75 var playerIDs = primeSortAllPlayers();
77 // place players
78 var playerX = new Array(numPlayers);
79 var playerZ = new Array(numPlayers);
80 var playerAngle = new Array(numPlayers);
81 var playerPos = new Array(numPlayers);
82 var iop = 0;
83 for (var i = 0; i < numPlayers; i++)
85         iop = i - 1;
86         if (numPlayers % 2 == 0)
87                 playerPos[i] = ((iop + abs(iop%2))/2 + 1) / ((numPlayers / 2) + 1);
88         else
89         {
90                 if (iop%2)
91                         playerPos[i] = ((iop + abs(iop%2))/2 + 1) / (((numPlayers + 1) / 2) + 1);
92                 else
93                         playerPos[i] = ((iop)/2 + 1) / ((((numPlayers - 1)) / 2) + 1);
94         }
95         playerZ[i] = playerPos[i];
96         playerX[i] = 0.30 + 0.4*(i%2);
99 for (var i = 0; i < numPlayers; i++)
101         var id = playerIDs[i];
102         log("Creating base for player " + id + "...");
104         var radius = scaleByMapSize(15,25);
105         var cliffRadius = 2;
106         var elevation = 20;
108         // get the x and z in tiles
109         var fx = fractionToTiles(playerX[i]);
110         var fz = fractionToTiles(playerZ[i]);
111         var ix = floor(fx);
112         var iz = floor(fz);
113         addToClass(ix, iz, clPlayer);
115         // create the city patch
116         var cityRadius = radius/3;
117         var placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz);
118         var painter = new LayeredPainter([tCityPlaza, tCity], [1]);
119         createArea(placer, painter, null);
121         placeCivDefaultEntities(fx, fz, id);
123         placeDefaultChicken(fx, fz, clBaseResource);
125         // create berry bushes
126         var bbAngle = randFloat(0, TWO_PI);
127         var bbDist = 12;
128         var bbX = round(fx + bbDist * cos(bbAngle));
129         var bbZ = round(fz + bbDist * sin(bbAngle));
130         var group = new SimpleGroup(
131                 [new SimpleObject(oBerryBush, 5,5, 0,3)],
132                 true, clBaseResource, bbX, bbZ
133         );
134         createObjectGroup(group, 0);
136         // create metal mine
137         var mAngle = bbAngle;
138         while(abs(mAngle - bbAngle) < PI/3)
139                 mAngle = randFloat(0, TWO_PI);
140         var mDist = radius - 4;
141         var mX = round(fx + mDist * cos(mAngle));
142         var mZ = round(fz + mDist * sin(mAngle));
143         group = new SimpleGroup(
144                 [new SimpleObject(oMetalLarge, 1,1, 0,0)],
145                 true, clBaseResource, mX, mZ
146         );
147         createObjectGroup(group, 0);
149         // create stone mines
150         mAngle += randFloat(PI/8, PI/4);
151         mX = round(fx + mDist * cos(mAngle));
152         mZ = round(fz + mDist * sin(mAngle));
153         group = new SimpleGroup(
154                 [new SimpleObject(oStoneLarge, 1,1, 0,2)],
155                 true, clBaseResource, mX, mZ
156         );
157         createObjectGroup(group, 0);
159         // create starting trees
160         var num = 2;
161         var tAngle = randFloat(-PI/3, 4*PI/3);
162         var tDist = randFloat(11, 13);
163         var tX = round(fx + tDist * cos(tAngle));
164         var tZ = round(fz + tDist * sin(tAngle));
165         group = new SimpleGroup(
166                 [new SimpleObject(oDatePalm, num, num, 0,5)],
167                 false, clBaseResource, tX, tZ
168         );
169         createObjectGroup(group, 0, avoidClasses(clBaseResource,2));
171         placeDefaultDecoratives(fx, fz, aBush1, clBaseResource, radius);
174 RMS.SetProgress(30);
176 const WATER_WIDTH = 0.1;
178 log("Creating river");
179 var theta = randFloat(0, 1);
180 var seed = randFloat(2,3);
181 var theta2 = randFloat(0, 1);
182 var seed2 = randFloat(2,3);
183 var rifp = 0;
184 var rifp2 = 0;
186 for (var ix = 0; ix < mapSize; ix++)
187         for (var iz = 0; iz < mapSize; iz++)
188         {
189                 var x = ix / (mapSize + 1.0);
190                 var z = iz / (mapSize + 1.0);
192                 var h = 0;
193                 var distToWater = 0;
195                 h = 32 * (z - 0.5);
196                 if ((x < 0.25)||(x > 0.75))
197                         addToClass(ix, iz, clDesert);
199                 // add the rough shape of the water
200                 var km = 12/scaleByMapSize(35, 160);
201                 var cu = km*rndRiver(theta+z*0.5*(mapSize/64),seed)+(50/scaleByMapSize(35, 100))*rndRiver(theta2+z*0.5*(mapSize/128),seed2);
202                 var zk = z*randFloat(0.995,1.005);
203                 var xk = x*randFloat(0.995,1.005);
205                 if (-3.0 >= getHeight(ix, iz))
206                         continue;
208                 if ((xk > cu+((1.0-WATER_WIDTH)/2))&&(xk < cu+((1.0+WATER_WIDTH)/2)))
209                 {
210                         if (xk < cu+((1.05-WATER_WIDTH)/2))
211                         {
212                                 h = -3 + 200.0* abs(cu+((1.05-WATER_WIDTH)/2-xk));
213                                 if ((h < 0.1)&&(h>-0.2))
214                                 {
215                                         if (rifp%2 == 0)
216                                         {
217                                                 rifp = 0;
218                                                 placeObject(ix, iz, aPlants, 0, randFloat(0,TWO_PI));
219                                         }
220                                         ++rifp;
221                                 }
222                         }
223                         else if (xk > (cu+(0.95+WATER_WIDTH)/2))
224                         {
225                                 h = -3 + 200.0*(xk-(cu+((0.95+WATER_WIDTH)/2)));
226                                 if ((h < 0.1)&&(h>-0.2))
227                                 {
228                                         if (rifp2%2 == 0)
229                                         {
230                                                 rifp2 = 0;
231                                                 placeObject(ix, iz, aPlants, 0, randFloat(0,TWO_PI));
232                                         }
233                                         ++rifp2;
234                                 }
235                         }
236                         else
237                                 h = -3.0;
239                         setHeight(ix, iz, h);
240                         addToClass(ix, iz, clWater);
241                         placeTerrain(ix, iz, tShore);
242                 }
244                 if (((xk > cu+((1.0-WATER_WIDTH)/2)-0.04)&&(xk < cu+((1.0-WATER_WIDTH)/2)))||((xk > cu+((1.0+WATER_WIDTH)/2))&&(xk < cu+((1.0+WATER_WIDTH)/2) + 0.04)))
245                 {
246                         placeTerrain(ix, iz, tLush);
247                         addToClass(ix, iz, clShore);
248                 }
249                 else if (((xk > cu+((1.0-WATER_WIDTH)/2)-0.06)&&(xk < cu+((1.0-WATER_WIDTH)/2)-0.04))||((xk > cu+((1.0+WATER_WIDTH)/2)+0.04)&&(xk < cu+((1.0+WATER_WIDTH)/2) + 0.06)))
250                 {
251                         placeTerrain(ix, iz, tSLush);
252                         addToClass(ix, iz, clShore);
253                 }
254                 else if (((xk > cu+((1.0-WATER_WIDTH)/2)-0.09)&&(xk < cu+((1.0-WATER_WIDTH)/2)-0.06))||((xk > cu+((1.0+WATER_WIDTH)/2)+0.06)&&(xk < cu+((1.0+WATER_WIDTH)/2) + 0.09)))
255                 {
256                         placeTerrain(ix, iz, tSDry);
257                         addToClass(ix, iz, clShore);
258                 }
259         }
260 RMS.SetProgress(40);
262 log("Creating bumps...");
263 placer = new ClumpPlacer(scaleByMapSize(20, 50), 0.3, 0.06, 1);
264 painter = new SmoothElevationPainter(ELEVATION_MODIFY, 2, 2);
265 createAreas(
266         placer,
267         painter,
268         avoidClasses(clWater, 2, clPlayer, 6),
269         scaleByMapSize(100, 200)
272 log("Creating ponds...");
273 var numLakes = round(scaleByMapSize(1,4) * numPlayers / 2);
274 placer = new ClumpPlacer(scaleByMapSize(100,250), 0.8, 0.1, 10);
275 var terrainPainter = new LayeredPainter(
276         [tShore, tShore, tShore],               // terrains
277         [1,1]                                                   // widths
279 var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, -7, 4);
280 var waterAreas = createAreas(
281         placer,
282         [terrainPainter, elevationPainter, paintClass(clPond)],
283         avoidClasses(clPlayer, 25, clWater, 20, clPond, 10),
284         numLakes
287 log("Creating reeds...");
288 group = new SimpleGroup(
289         [new SimpleObject(aReeds, 1,3, 0,1)],
290         true
292 createObjectGroupsByAreasDeprecated(group, 0,
293         stayClasses(clPond, 1),
294         numLakes, 100,
295         waterAreas
298 log("Creating lillies...");
299 group = new SimpleGroup(
300         [new SimpleObject(aLillies, 1,3, 0,1)],
301         true
303 createObjectGroupsByAreasDeprecated(group, 0,
304         stayClasses(clPond, 1),
305         numLakes, 100,
306         waterAreas
309 waterAreas = [];
311 // calculate desired number of trees for map (based on size)
312 const MIN_TREES = 700;
313 const MAX_TREES = 3500;
314 const P_FOREST = 0.5;
316 var totalTrees = scaleByMapSize(MIN_TREES, MAX_TREES);
317 var numForest = totalTrees * P_FOREST;
318 var numStragglers = totalTrees * (1.0 - P_FOREST);
320 log("Creating forests...");
321 var num = scaleByMapSize(10,30);
322 placer = new ClumpPlacer(numForest / num, 0.15, 0.1, 0.5);
323 painter = new TerrainPainter([pForest, tForestFloor]);
324 createAreas(placer, [painter, paintClass(clForest)],
325         avoidClasses(clPlayer, 19, clForest, 4, clWater, 1, clDesert, 5, clPond, 2, clBaseResource, 3),
326         num, 50
329 RMS.SetProgress(50);
331 log("Creating grass patches...");
332 var sizes = [scaleByMapSize(3, 48), scaleByMapSize(5, 84), scaleByMapSize(8, 128)];
333 for (var i = 0; i < sizes.length; i++)
335         placer = new ClumpPlacer(sizes[i], 0.3, 0.06, 0.5);
336         painter = new LayeredPainter(
337                 [[tGrass,tGrassSand50],[tGrassSand50,tGrassSand25], [tGrassSand25,tGrass]],             // terrains
338                 [1,1]                                                                                                                   // widths
339         );
340         createAreas(
341                 placer,
342                 [painter, paintClass(clDirt)],
343                 avoidClasses(clForest, 0, clGrass, 5, clPlayer, 10, clWater, 1, clDirt, 5, clShore, 1, clPond, 1),
344                 scaleByMapSize(15, 45)
345         );
347 RMS.SetProgress(55);
349 log("Creating dirt patches...");
350 var sizes = [scaleByMapSize(3, 48), scaleByMapSize(5, 84), scaleByMapSize(8, 128)];
351 for (var i = 0; i < sizes.length; i++)
353         placer = new ClumpPlacer(sizes[i], 0.3, 0.06, 0.5);
354         painter = new LayeredPainter(
355                 [[tDirt,tDirtCracks],[tDirt,tFineSand], [tDirtCracks,tFineSand]],               // terrains
356                 [1,1]                                                                                                                   // widths
357         );
358         createAreas(
359                 placer,
360                 [painter, paintClass(clDirt)],
361                 avoidClasses(clForest, 0, clDirt, 5, clPlayer, 10, clWater, 1, clGrass, 5, clShore, 1, clPond, 1),
362                 scaleByMapSize(15, 45)
363         );
366 RMS.SetProgress(60);
368 log("Creating stone mines...");
369 group = new SimpleGroup([new SimpleObject(oStoneSmall, 0,2, 0,4), new SimpleObject(oStoneLarge, 1,1, 0,4)], true, clRock);
370 createObjectGroupsDeprecated(group, 0,
371         avoidClasses(clForest, 1, clPlayer, 20, clRock, 10, clWater, 1, clPond, 1),
372         scaleByMapSize(4,16), 100
375 log("Creating small stone quarries...");
376 group = new SimpleGroup([new SimpleObject(oStoneSmall, 2,5, 1,3)], true, clRock);
377 createObjectGroupsDeprecated(group, 0,
378         avoidClasses(clForest, 1, clPlayer, 20, clRock, 10, clWater, 1, clPond, 1),
379         scaleByMapSize(4,16), 100
382 log("Creating metal mines...");
383 group = new SimpleGroup([new SimpleObject(oMetalLarge, 1,1, 0,4)], true, clMetal);
384 createObjectGroupsDeprecated(group, 0,
385         avoidClasses(clForest, 1, clPlayer, 20, clMetal, 10, clRock, 5, clWater, 1, clPond, 1),
386         scaleByMapSize(4,16), 100
389 log("Creating stone mines...");
390 group = new SimpleGroup([new SimpleObject(oStoneSmall, 0,2, 0,4), new SimpleObject(oStoneLarge, 1,1, 0,4)], true, clRock);
391 createObjectGroupsDeprecated(group, 0,
392         [avoidClasses(clForest, 1, clPlayer, 20, clRock, 10, clWater, 1, clPond, 1), stayClasses(clDesert, 3)],
393         scaleByMapSize(6,20), 100
396 log("Creating small stone quarries...");
397 group = new SimpleGroup([new SimpleObject(oStoneSmall, 2,5, 1,3)], true, clRock);
398 createObjectGroupsDeprecated(group, 0,
399         [avoidClasses(clForest, 1, clPlayer, 20, clRock, 10, clWater, 1, clPond, 1), stayClasses(clDesert, 3)],
400         scaleByMapSize(6,20), 100
403 log("Creating metal mines...");
404 group = new SimpleGroup([new SimpleObject(oMetalLarge, 1,1, 0,4)], true, clMetal);
405 createObjectGroupsDeprecated(group, 0,
406         [avoidClasses(clForest, 1, clPlayer, 20, clMetal, 10, clRock, 5, clWater, 1, clPond, 1), stayClasses(clDesert, 3)],
407         scaleByMapSize(6,20), 100
410 RMS.SetProgress(65);
412 log("Creating small decorative rocks...");
413 group = new SimpleGroup(
414         [new SimpleObject(aDecorativeRock, 1,3, 0,1)],
415         true
417 createObjectGroupsDeprecated(
418         group, 0,
419         avoidClasses(clWater, 1, clForest, 0, clPlayer, 0, clPond, 1),
420         scaleByMapSize(16, 262), 50
423 log("Creating shrubs...");
424 group = new SimpleGroup(
425         [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)],
426         true
428 createObjectGroupsDeprecated(
429         group, 0,
430         avoidClasses(clWater, 1, clPlayer, 0, clPond, 1),
431         scaleByMapSize(20, 180), 50
433 RMS.SetProgress(70);
435 log("Creating gazelles...");
436 group = new SimpleGroup([new SimpleObject(oGazelle, 5,7, 0,4)], true, clFood);
437 createObjectGroupsDeprecated(group, 0,
438         avoidClasses(clForest, 0, clPlayer, 20, clWater, 1, clFood, 10, clDesert, 5, clPond, 1),
439         3*scaleByMapSize(5,20), 50
442 log("Creating goats...");
443 group = new SimpleGroup([new SimpleObject(oGoat, 2,4, 0,3)], true, clFood);
444 createObjectGroupsDeprecated(group, 0,
445         avoidClasses(clForest, 0, clPlayer, 20, clWater, 1, clFood, 10, clDesert, 5, clPond, 1),
446         3*scaleByMapSize(5,20), 50
449 log("Creating treasures...");
450 group = new SimpleGroup([new SimpleObject(oFood, 1,1, 0,2)], true, clTreasure);
451 createObjectGroupsDeprecated(group, 0,
452         avoidClasses(clForest, 0, clPlayer, 20, clWater, 1, clFood, 2, clDesert, 5, clTreasure, 6, clPond, 1),
453         3*scaleByMapSize(5,20), 50
456 group = new SimpleGroup([new SimpleObject(oWood, 1,1, 0,2)], true, clTreasure);
457 createObjectGroupsDeprecated(group, 0,
458         avoidClasses(clForest, 0, clPlayer, 20, clWater, 1, clFood, 2, clDesert, 5, clTreasure, 6, clPond, 1),
459         3*scaleByMapSize(5,20), 50
462 log("Creating camels...");
463 group = new SimpleGroup([new SimpleObject(oCamel, 2,4, 0,2)], true, clFood);
464 createObjectGroupsDeprecated(group, 0,
465         avoidClasses(clForest, 0, clPlayer, 20, clWater, 1, clFood, 10, clDesert, 5, clTreasure, 2, clPond, 1),
466         3*scaleByMapSize(5,20), 50
469 RMS.SetProgress(90);
471 log("Creating straggler trees...");
472 var types = [oDatePalm, oSDatePalm];    // some variation
473 var num = floor(0.5 * numStragglers / types.length);
474 for (var i = 0; i < types.length; ++i)
476         group = new SimpleGroup([new SimpleObject(types[i], 1,1, 0,0)], true);
477         createObjectGroupsDeprecated(group, 0,
478                 avoidClasses(clForest, 0, clWater, 1, clPlayer, 20, clMetal, 6, clDesert, 1, clTreasure, 2, clPond, 1),
479                 num
480         );
483 var types = [oDatePalm, oSDatePalm];    // some variation
484 var num = floor(0.1 * numStragglers / types.length);
485 for (var i = 0; i < types.length; ++i)
487         group = new SimpleGroup([new SimpleObject(types[i], 1,1, 0,0)], true);
488         createObjectGroupsDeprecated(group, 0,
489                 avoidClasses(clForest, 0, clWater, 1, clPlayer, 20, clMetal, 6, clTreasure, 2),
490                 num
491         );
494 log("Creating straggler trees...");
495 var types = [oDatePalm, oSDatePalm];    // some variation
496 var num = floor(numStragglers / types.length);
497 for (var i = 0; i < types.length; ++i)
499         group = new SimpleGroup([new SimpleObject(types[i], 1,1, 0,0)], true);
500         createObjectGroupsDeprecated(group, 0,
501                 borderClasses(clPond, 1, 4),
502                 num
503         );
506 log("Creating obelisks");
507 group = new SimpleGroup(
508         [new SimpleObject(eObelisk, 1,1, 0,1)],
509         true
511 createObjectGroupsDeprecated(
512         group, 0,
513         [avoidClasses(clWater, 4, clForest, 3, clPlayer, 20, clMetal, 6, clRock, 2, clPond, 4, clTreasure, 2), stayClasses(clDesert, 3)],
514         scaleByMapSize(5, 30), 50
517 log("Creating pyramids");
518 group = new SimpleGroup(
519         [new SimpleObject(ePyramid, 1,1, 0,1)],
520         true
522 createObjectGroupsDeprecated(
523         group, 0,
524         [avoidClasses(clWater, 7, clForest, 6, clPlayer, 20, clMetal, 5, clRock, 5, clPond, 7, clTreasure, 2), stayClasses(clDesert, 3)],
525         scaleByMapSize(2, 6), 50
528 setSkySet("sunny");
529 setSunColor(0.711, 0.746, 0.574);
530 setWaterColor(0.541,0.506,0.416);
531 setWaterTint(0.694,0.592,0.522);
532 setWaterMurkiness(1);
533 setWaterWaviness(3.0);
534 setWaterType("lake");
536 ExportMap();