Unify the other axis of the 8 remaining playerPlacementRiver calls following rP20151...
[0ad.git] / binaries / data / mods / public / maps / random / the_nile.js
blob0aec27bdfb7cf9fb26112dd9fa1dedb41e3c7773
1 RMS.LoadLibrary("rmgen");
3 var tCity = "desert_city_tile";
4 var tCityPlaza = "desert_city_tile_plaza";
5 var tFineSand = "desert_sand_smooth";
6 var tForestFloor = "desert_forestfloor_palms";
7 var tGrass = "desert_dirt_rough_2";
8 var tGrassSand50 = "desert_sand_dunes_50";
9 var tGrassSand25 = "desert_dirt_rough";
10 var tDirt = "desert_dirt_rough";
11 var tDirtCracks = "desert_dirt_cracks";
12 var tShore = "desert_sand_wet";
13 var tLush = "desert_grass_a";
14 var tSLush = "desert_grass_a_sand";
15 var tSDry = "desert_plants_b";
17 var oBerryBush = "gaia/flora_bush_berry";
18 var oCamel = "gaia/fauna_camel";
19 var oGazelle = "gaia/fauna_gazelle";
20 var oGoat = "gaia/fauna_goat";
21 var oStoneLarge = "gaia/geology_stonemine_desert_badlands_quarry";
22 var oStoneSmall = "gaia/geology_stone_desert_small";
23 var oMetalLarge = "gaia/geology_metal_desert_slabs";
24 var oDatePalm = "gaia/flora_tree_date_palm";
25 var oSDatePalm = "gaia/flora_tree_cretan_date_palm_short";
26 var eObelisk = "other/obelisk";
27 var ePyramid = "other/pyramid_minor";
28 var oWood = "gaia/special_treasure_wood";
29 var oFood = "gaia/special_treasure_food_bin";
31 var aBush1 = "actor|props/flora/bush_desert_a.xml";
32 var aBush2 = "actor|props/flora/bush_desert_dry_a.xml";
33 var aBush3 = "actor|props/flora/bush_medit_sm_dry.xml";
34 var aBush4 = "actor|props/flora/plant_desert_a.xml";
35 var aDecorativeRock = "actor|geology/stone_desert_med.xml";
36 var aReeds = "actor|props/flora/reeds_pond_lush_a.xml";
37 var aLillies = "actor|props/flora/water_lillies.xml";
39 var pForest = [tForestFloor + TERRAIN_SEPARATOR + oDatePalm, tForestFloor + TERRAIN_SEPARATOR + oSDatePalm, tForestFloor];
41 InitMap();
43 var mapSize = getMapSize();
44 var aPlants = mapSize < 256 ?
45         "actor|props/flora/grass_tropical.xml" :
46         "actor|props/flora/grass_tropic_field_tall.xml";
48 var numPlayers = getNumPlayers();
50 var clPlayer = createTileClass();
51 var clForest = createTileClass();
52 var clWater = createTileClass();
53 var clDirt = createTileClass();
54 var clRock = createTileClass();
55 var clMetal = createTileClass();
56 var clFood = createTileClass();
57 var clBaseResource = createTileClass();
58 var clGrass = createTileClass();
59 var clDesert = createTileClass();
60 var clPond = createTileClass();
61 var clShore = createTileClass();
62 var clTreasure = createTileClass();
64 var [playerIDs, playerX, playerZ] = playerPlacementRiver(0, 0.4);
66 for (var i = 0; i < numPlayers; i++)
68         var id = playerIDs[i];
69         log("Creating base for player " + id + "...");
71         var radius = scaleByMapSize(15,25);
72         var cliffRadius = 2;
73         var elevation = 20;
75         // get the x and z in tiles
76         var fx = fractionToTiles(playerX[i]);
77         var fz = fractionToTiles(playerZ[i]);
78         var ix = floor(fx);
79         var iz = floor(fz);
80         addToClass(ix, iz, clPlayer);
82         // create the city patch
83         var cityRadius = radius/3;
84         var placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz);
85         var painter = new LayeredPainter([tCityPlaza, tCity], [1]);
86         createArea(placer, painter, null);
88         placeCivDefaultEntities(fx, fz, id);
90         placeDefaultChicken(fx, fz, clBaseResource);
92         // create berry bushes
93         var bbAngle = randFloat(0, TWO_PI);
94         var bbDist = 12;
95         var bbX = round(fx + bbDist * cos(bbAngle));
96         var bbZ = round(fz + bbDist * sin(bbAngle));
97         var group = new SimpleGroup(
98                 [new SimpleObject(oBerryBush, 5,5, 0,3)],
99                 true, clBaseResource, bbX, bbZ
100         );
101         createObjectGroup(group, 0);
103         // create metal mine
104         var mAngle = bbAngle;
105         while(abs(mAngle - bbAngle) < PI/3)
106                 mAngle = randFloat(0, TWO_PI);
107         var mDist = radius - 4;
108         var mX = round(fx + mDist * cos(mAngle));
109         var mZ = round(fz + mDist * sin(mAngle));
110         group = new SimpleGroup(
111                 [new SimpleObject(oMetalLarge, 1,1, 0,0)],
112                 true, clBaseResource, mX, mZ
113         );
114         createObjectGroup(group, 0);
116         // create stone mines
117         mAngle += randFloat(PI/8, PI/4);
118         mX = round(fx + mDist * cos(mAngle));
119         mZ = round(fz + mDist * sin(mAngle));
120         group = new SimpleGroup(
121                 [new SimpleObject(oStoneLarge, 1,1, 0,2)],
122                 true, clBaseResource, mX, mZ
123         );
124         createObjectGroup(group, 0);
126         // create starting trees
127         var num = 2;
128         var tAngle = randFloat(-PI/3, 4*PI/3);
129         var tDist = randFloat(11, 13);
130         var tX = round(fx + tDist * cos(tAngle));
131         var tZ = round(fz + tDist * sin(tAngle));
132         group = new SimpleGroup(
133                 [new SimpleObject(oDatePalm, num, num, 0,5)],
134                 false, clBaseResource, tX, tZ
135         );
136         createObjectGroup(group, 0, avoidClasses(clBaseResource,2));
138         placeDefaultDecoratives(fx, fz, aBush1, clBaseResource, radius);
141 RMS.SetProgress(30);
143 const riverTextures = [
144         {
145                 "left": 0,
146                 "right": 0.04,
147                 "tileClass": tLush
148         },
149         {
150                 "left": 0.04,
151                 "right": 0.06,
152                 "tileClass": tSLush
153         },
154         {
155                 "left": 0.06,
156                 "right": 0.09,
157                 "tileClass": tSDry
158         }
161 const plantFrequency = 2;
162 var plantID = 0;
164 paintRiver({
165         "parallel": true,
166         "startX": 0.5,
167         "startZ": 0,
168         "endX": 0.5,
169         "endZ": 1,
170         "width": 0.1,
171         "fadeDist": 0.025,
172         "deviation": 0.0025,
173         "waterHeight": -3,
174         "landHeight": 2,
175         "meanderShort": 12,
176         "meanderLong": 50,
177         "waterFunc": (ix, iz, height, riverFraction) => {
179                 addToClass(ix, iz, clWater);
180                 placeTerrain(ix, iz, tShore);
182                 // Place river bushes
183                 if (height <= -0.2 || height >= 0.1)
184                         return;
186                 if (plantID % plantFrequency == 0)
187                 {
188                         plantID = 0;
189                         placeObject(ix, iz, aPlants, 0, randFloat(0, TWO_PI));
190                 }
191                 ++plantID;
192         },
193         "landFunc": (ix, iz, shoreDist1, shoreDist2) => {
195                 let x = ix / (mapSize + 1.0);
196                 if (x < 0.25 || x > 0.75)
197                         addToClass(ix, iz, clDesert);
199                 for (let riv of riverTextures)
200                         if (-shoreDist1 > -riv.right && -shoreDist1 < -riv.left ||
201                                 -shoreDist2 > riv.left && -shoreDist2 < riv.right)
202                         {
203                                 placeTerrain(ix, iz, riv.tileClass);
204                                 addToClass(ix, iz, clShore);
205                         }
206         }
209 RMS.SetProgress(40);
211 log("Creating bumps...");
212 createAreas(
213         new ClumpPlacer(scaleByMapSize(20, 50), 0.3, 0.06, 1),
214         new SmoothElevationPainter(ELEVATION_MODIFY, 2, 2),
215         avoidClasses(clWater, 2, clPlayer, 6),
216         scaleByMapSize(100, 200));
218 log("Creating ponds...");
219 var numLakes = Math.round(scaleByMapSize(1, 4) * numPlayers / 2);
220 var waterAreas = createAreas(
221         new ClumpPlacer(scaleByMapSize(2, 5) * 50, 0.8, 0.1, 10),
222         [
223                 new LayeredPainter([tShore, tShore, tShore], [1, 1]),
224                 new SmoothElevationPainter(ELEVATION_SET, -7, 4),
225                 paintClass(clPond)
226         ],
227         avoidClasses(clPlayer, 25, clWater, 20, clPond, 10),
228         numLakes
231 log("Creating reeds...");
232 createObjectGroupsByAreasDeprecated(
233         new SimpleGroup([new SimpleObject(aReeds, 1, 3, 0, 1)], true),
234         0,
235         stayClasses(clPond, 1),
236         numLakes,
237         100,
238         waterAreas);
240 log("Creating lillies...");
241 createObjectGroupsByAreasDeprecated(
242         new SimpleGroup([new SimpleObject(aLillies, 1, 3, 0, 1)], true),
243         0,
244         stayClasses(clPond, 1),
245         numLakes,
246         100,
247         waterAreas);
249 waterAreas = [];
251 log("Creating forests...");
252 var [forestTrees, stragglerTrees] = getTreeCounts(700, 3500, 0.5);
253 var num = scaleByMapSize(10,30);
254 createAreas(
255         new ClumpPlacer(forestTrees / num, 0.15, 0.1, 0.5),
256         [
257                 new TerrainPainter([pForest, tForestFloor]),
258                 paintClass(clForest)
259         ],
260         avoidClasses(clPlayer, 19, clForest, 4, clWater, 1, clDesert, 5, clPond, 2, clBaseResource, 3),
261         num,
262         50);
264 RMS.SetProgress(50);
266 log("Creating grass patches...");
267 for (let size of [scaleByMapSize(3, 48), scaleByMapSize(5, 84), scaleByMapSize(8, 128)])
268         createAreas(
269                 new ClumpPlacer(size, 0.3, 0.06, 0.5),
270                 [
271                         new LayeredPainter(
272                                 [[tGrass, tGrassSand50], [tGrassSand50, tGrassSand25], [tGrassSand25, tGrass]],
273                                 [1, 1]),
274                         paintClass(clDirt)
275                 ],
276                 avoidClasses(clForest, 0, clGrass, 5, clPlayer, 10, clWater, 1, clDirt, 5, clShore, 1, clPond, 1),
277                 scaleByMapSize(15, 45));
278 RMS.SetProgress(55);
280 log("Creating dirt patches...");
281 for (let size of [scaleByMapSize(3, 48), scaleByMapSize(5, 84), scaleByMapSize(8, 128)])
282         createAreas(
283                 new ClumpPlacer(size, 0.3, 0.06, 0.5),
284                 [
285                         new LayeredPainter(
286                                 [[tDirt, tDirtCracks], [tDirt, tFineSand], [tDirtCracks, tFineSand]],
287                                 [1, 1]),
288                         paintClass(clDirt)
289                 ],
290                 avoidClasses(clForest, 0, clDirt, 5, clPlayer, 10, clWater, 1, clGrass, 5, clShore, 1, clPond, 1),
291                 scaleByMapSize(15, 45));
293 RMS.SetProgress(60);
295 log("Creating stone mines...");
296 var group = new SimpleGroup([new SimpleObject(oStoneSmall, 0, 2, 0, 4), new SimpleObject(oStoneLarge, 1, 1, 0, 4)], true, clRock);
297 createObjectGroupsDeprecated(group, 0,
298         avoidClasses(clForest, 1, clPlayer, 20, clRock, 10, clWater, 1, clPond, 1),
299         scaleByMapSize(4,16), 100
302 log("Creating small stone quarries...");
303 group = new SimpleGroup([new SimpleObject(oStoneSmall, 2,5, 1,3)], true, clRock);
304 createObjectGroupsDeprecated(group, 0,
305         avoidClasses(clForest, 1, clPlayer, 20, clRock, 10, clWater, 1, clPond, 1),
306         scaleByMapSize(4,16), 100
309 log("Creating metal mines...");
310 group = new SimpleGroup([new SimpleObject(oMetalLarge, 1,1, 0,4)], true, clMetal);
311 createObjectGroupsDeprecated(group, 0,
312         avoidClasses(clForest, 1, clPlayer, 20, clMetal, 10, clRock, 5, clWater, 1, clPond, 1),
313         scaleByMapSize(4,16), 100
316 log("Creating stone mines...");
317 group = new SimpleGroup([new SimpleObject(oStoneSmall, 0,2, 0,4), new SimpleObject(oStoneLarge, 1,1, 0,4)], true, clRock);
318 createObjectGroupsDeprecated(group, 0,
319         [avoidClasses(clForest, 1, clPlayer, 20, clRock, 10, clWater, 1, clPond, 1), stayClasses(clDesert, 3)],
320         scaleByMapSize(6,20), 100
323 log("Creating small stone quarries...");
324 group = new SimpleGroup([new SimpleObject(oStoneSmall, 2,5, 1,3)], true, clRock);
325 createObjectGroupsDeprecated(group, 0,
326         [avoidClasses(clForest, 1, clPlayer, 20, clRock, 10, clWater, 1, clPond, 1), stayClasses(clDesert, 3)],
327         scaleByMapSize(6,20), 100
330 log("Creating metal mines...");
331 group = new SimpleGroup([new SimpleObject(oMetalLarge, 1,1, 0,4)], true, clMetal);
332 createObjectGroupsDeprecated(group, 0,
333         [avoidClasses(clForest, 1, clPlayer, 20, clMetal, 10, clRock, 5, clWater, 1, clPond, 1), stayClasses(clDesert, 3)],
334         scaleByMapSize(6,20), 100
337 RMS.SetProgress(65);
339 log("Creating small decorative rocks...");
340 group = new SimpleGroup(
341         [new SimpleObject(aDecorativeRock, 1,3, 0,1)],
342         true
344 createObjectGroupsDeprecated(
345         group, 0,
346         avoidClasses(clWater, 1, clForest, 0, clPlayer, 0, clPond, 1),
347         scaleByMapSize(16, 262), 50
350 log("Creating shrubs...");
351 group = new SimpleGroup(
352         [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)],
353         true
355 createObjectGroupsDeprecated(
356         group, 0,
357         avoidClasses(clWater, 1, clPlayer, 0, clPond, 1),
358         scaleByMapSize(20, 180), 50
360 RMS.SetProgress(70);
362 log("Creating gazelles...");
363 group = new SimpleGroup([new SimpleObject(oGazelle, 5,7, 0,4)], true, clFood);
364 createObjectGroupsDeprecated(group, 0,
365         avoidClasses(clForest, 0, clPlayer, 20, clWater, 1, clFood, 10, clDesert, 5, clPond, 1),
366         3*scaleByMapSize(5,20), 50
369 log("Creating goats...");
370 group = new SimpleGroup([new SimpleObject(oGoat, 2,4, 0,3)], true, clFood);
371 createObjectGroupsDeprecated(group, 0,
372         avoidClasses(clForest, 0, clPlayer, 20, clWater, 1, clFood, 10, clDesert, 5, clPond, 1),
373         3*scaleByMapSize(5,20), 50
376 log("Creating treasures...");
377 group = new SimpleGroup([new SimpleObject(oFood, 1,1, 0,2)], true, clTreasure);
378 createObjectGroupsDeprecated(group, 0,
379         avoidClasses(clForest, 0, clPlayer, 20, clWater, 1, clFood, 2, clDesert, 5, clTreasure, 6, clPond, 1),
380         3*scaleByMapSize(5,20), 50
383 group = new SimpleGroup([new SimpleObject(oWood, 1,1, 0,2)], true, clTreasure);
384 createObjectGroupsDeprecated(group, 0,
385         avoidClasses(clForest, 0, clPlayer, 20, clWater, 1, clFood, 2, clDesert, 5, clTreasure, 6, clPond, 1),
386         3*scaleByMapSize(5,20), 50
389 log("Creating camels...");
390 group = new SimpleGroup([new SimpleObject(oCamel, 2,4, 0,2)], true, clFood);
391 createObjectGroupsDeprecated(group, 0,
392         avoidClasses(clForest, 0, clPlayer, 20, clWater, 1, clFood, 10, clDesert, 5, clTreasure, 2, clPond, 1),
393         3*scaleByMapSize(5,20), 50
396 RMS.SetProgress(90);
398 createStragglerTrees(
399         [oDatePalm, oSDatePalm],
400         avoidClasses(clForest, 0, clWater, 1, clPlayer, 20, clMetal, 6, clDesert, 1, clTreasure, 2, clPond, 1),
401         clForest,
402         stragglerTrees / 2);
404 createStragglerTrees(
405         [oDatePalm, oSDatePalm],
406         avoidClasses(clForest, 0, clWater, 1, clPlayer, 20, clMetal, 6, clTreasure, 2),
407         clForest,
408         stragglerTrees / 10);
410 createStragglerTrees(
411         [oDatePalm, oSDatePalm],
412         borderClasses(clPond, 1, 4),
413         clForest,
414         stragglerTrees);
416 log("Creating obelisks");
417 group = new SimpleGroup(
418         [new SimpleObject(eObelisk, 1,1, 0,1)],
419         true
421 createObjectGroupsDeprecated(
422         group, 0,
423         [avoidClasses(clWater, 4, clForest, 3, clPlayer, 20, clMetal, 6, clRock, 2, clPond, 4, clTreasure, 2), stayClasses(clDesert, 3)],
424         scaleByMapSize(5, 30), 50
427 log("Creating pyramids");
428 group = new SimpleGroup(
429         [new SimpleObject(ePyramid, 1,1, 0,1)],
430         true
432 createObjectGroupsDeprecated(
433         group, 0,
434         [avoidClasses(clWater, 7, clForest, 6, clPlayer, 20, clMetal, 5, clRock, 5, clPond, 7, clTreasure, 2), stayClasses(clDesert, 3)],
435         scaleByMapSize(2, 6), 50
438 setSkySet("sunny");
439 setSunColor(0.711, 0.746, 0.574);
440 setWaterColor(0.541,0.506,0.416);
441 setWaterTint(0.694,0.592,0.522);
442 setWaterMurkiness(1);
443 setWaterWaviness(3.0);
444 setWaterType("lake");
446 ExportMap();