Nomad mode on all random map scripts (except Survival of the Fittest), fixes #3591.
[0ad.git] / binaries / data / mods / public / maps / random / the_nile.js
blob93af799b8fa60275554dcfefcaaf71d62d321f29
1 Engine.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 oWoodTreasure = "gaia/special_treasure_wood";
29 var oFoodTreasure = "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 placePlayerBases({
65         "PlayerPlacement": playerPlacementRiver(0, 0.4),
66         "PlayerTileClass": clPlayer,
67         "BaseResourceClass": clBaseResource,
68         "CityPatch": {
69                 "outerTerrain": tCityPlaza,
70                 "innerTerrain": tCity
71         },
72         "Chicken": {
73         },
74         "Berries": {
75                 "template": oBerryBush
76         },
77         "Mines": {
78                 "types": [
79                         { "template": oMetalLarge },
80                         { "template": oStoneLarge }
81                 ]
82         },
83         "Trees": {
84                 "template": oDatePalm,
85                 "count": 2
86         },
87         "Decoratives": {
88                 "template": aBush1
89         }
90 });
91 Engine.SetProgress(30);
93 const riverTextures = [
94         {
95                 "left": fractionToTiles(0),
96                 "right": fractionToTiles(0.04),
97                 "tileClass": tLush
98         },
99         {
100                 "left": fractionToTiles(0.04),
101                 "right": fractionToTiles(0.06),
102                 "tileClass": tSLush
103         },
104         {
105                 "left": fractionToTiles(0.06),
106                 "right": fractionToTiles(0.09),
107                 "tileClass": tSDry
108         }
111 const plantFrequency = 2;
112 var plantID = 0;
114 paintRiver({
115         "parallel": true,
116         "startX": 0.5,
117         "startZ": 0,
118         "endX": 0.5,
119         "endZ": 1,
120         "width": 0.1,
121         "fadeDist": 0.025,
122         "deviation": 0.0025,
123         "waterHeight": -3,
124         "landHeight": 2,
125         "meanderShort": 12,
126         "meanderLong": 50,
127         "waterFunc": (ix, iz, height, riverFraction) => {
129                 addToClass(ix, iz, clWater);
130                 placeTerrain(ix, iz, tShore);
132                 // Place river bushes
133                 if (height <= -0.2 || height >= 0.1)
134                         return;
136                 if (plantID % plantFrequency == 0)
137                 {
138                         plantID = 0;
139                         placeObject(ix, iz, aPlants, 0, randFloat(0, 2 * Math.PI));
140                 }
141                 ++plantID;
142         },
143         "landFunc": (ix, iz, shoreDist1, shoreDist2) => {
145                 if (ix < fractionToTiles(0.25) || ix > fractionToTiles(0.75))
146                         addToClass(ix, iz, clDesert);
148                 for (let riv of riverTextures)
149                         if (riv.left < +shoreDist1 && +shoreDist1 < riv.right ||
150                             riv.left < -shoreDist2 && -shoreDist2 < riv.right)
151                         {
152                                 placeTerrain(ix, iz, riv.tileClass);
153                                 addToClass(ix, iz, clShore);
154                         }
155         }
158 Engine.SetProgress(40);
160 log("Creating bumps...");
161 createAreas(
162         new ClumpPlacer(scaleByMapSize(20, 50), 0.3, 0.06, 1),
163         new SmoothElevationPainter(ELEVATION_MODIFY, 2, 2),
164         avoidClasses(clWater, 2, clPlayer, 6),
165         scaleByMapSize(100, 200));
167 log("Creating ponds...");
168 var numLakes = Math.round(scaleByMapSize(1, 4) * numPlayers / 2);
169 var waterAreas = createAreas(
170         new ClumpPlacer(scaleByMapSize(2, 5) * 50, 0.8, 0.1, 10),
171         [
172                 new LayeredPainter([tShore, tShore, tShore], [1, 1]),
173                 new SmoothElevationPainter(ELEVATION_SET, -7, 4),
174                 paintClass(clPond)
175         ],
176         avoidClasses(clPlayer, 25, clWater, 20, clPond, 10),
177         numLakes
180 log("Creating reeds...");
181 createObjectGroupsByAreasDeprecated(
182         new SimpleGroup([new SimpleObject(aReeds, 1, 3, 0, 1)], true),
183         0,
184         stayClasses(clPond, 1),
185         numLakes,
186         100,
187         waterAreas);
189 log("Creating lillies...");
190 createObjectGroupsByAreasDeprecated(
191         new SimpleGroup([new SimpleObject(aLillies, 1, 3, 0, 1)], true),
192         0,
193         stayClasses(clPond, 1),
194         numLakes,
195         100,
196         waterAreas);
198 waterAreas = [];
200 log("Creating forests...");
201 var [forestTrees, stragglerTrees] = getTreeCounts(700, 3500, 0.5);
202 var num = scaleByMapSize(10,30);
203 createAreas(
204         new ClumpPlacer(forestTrees / num, 0.15, 0.1, 0.5),
205         [
206                 new TerrainPainter([pForest, tForestFloor]),
207                 paintClass(clForest)
208         ],
209         avoidClasses(clPlayer, 19, clForest, 4, clWater, 1, clDesert, 5, clPond, 2, clBaseResource, 3),
210         num,
211         50);
213 Engine.SetProgress(50);
215 log("Creating grass patches...");
216 for (let size of [scaleByMapSize(3, 48), scaleByMapSize(5, 84), scaleByMapSize(8, 128)])
217         createAreas(
218                 new ClumpPlacer(size, 0.3, 0.06, 0.5),
219                 [
220                         new LayeredPainter(
221                                 [[tGrass, tGrassSand50], [tGrassSand50, tGrassSand25], [tGrassSand25, tGrass]],
222                                 [1, 1]),
223                         paintClass(clDirt)
224                 ],
225                 avoidClasses(clForest, 0, clGrass, 5, clPlayer, 10, clWater, 1, clDirt, 5, clShore, 1, clPond, 1),
226                 scaleByMapSize(15, 45));
227 Engine.SetProgress(55);
229 log("Creating dirt patches...");
230 for (let size of [scaleByMapSize(3, 48), scaleByMapSize(5, 84), scaleByMapSize(8, 128)])
231         createAreas(
232                 new ClumpPlacer(size, 0.3, 0.06, 0.5),
233                 [
234                         new LayeredPainter(
235                                 [[tDirt, tDirtCracks], [tDirt, tFineSand], [tDirtCracks, tFineSand]],
236                                 [1, 1]),
237                         paintClass(clDirt)
238                 ],
239                 avoidClasses(clForest, 0, clDirt, 5, clPlayer, 10, clWater, 1, clGrass, 5, clShore, 1, clPond, 1),
240                 scaleByMapSize(15, 45));
242 Engine.SetProgress(60);
244 log("Creating stone mines...");
245 var group = new SimpleGroup([new SimpleObject(oStoneSmall, 0, 2, 0, 4), new SimpleObject(oStoneLarge, 1, 1, 0, 4)], true, clRock);
246 createObjectGroupsDeprecated(group, 0,
247         avoidClasses(clForest, 1, clPlayer, 20, clRock, 10, clWater, 1, clPond, 1),
248         scaleByMapSize(4,16), 100
251 log("Creating small stone quarries...");
252 group = new SimpleGroup([new SimpleObject(oStoneSmall, 2,5, 1,3)], true, clRock);
253 createObjectGroupsDeprecated(group, 0,
254         avoidClasses(clForest, 1, clPlayer, 20, clRock, 10, clWater, 1, clPond, 1),
255         scaleByMapSize(4,16), 100
258 log("Creating metal mines...");
259 group = new SimpleGroup([new SimpleObject(oMetalLarge, 1,1, 0,4)], true, clMetal);
260 createObjectGroupsDeprecated(group, 0,
261         avoidClasses(clForest, 1, clPlayer, 20, clMetal, 10, clRock, 5, clWater, 1, clPond, 1),
262         scaleByMapSize(4,16), 100
265 log("Creating stone mines...");
266 group = new SimpleGroup([new SimpleObject(oStoneSmall, 0,2, 0,4), new SimpleObject(oStoneLarge, 1,1, 0,4)], true, clRock);
267 createObjectGroupsDeprecated(group, 0,
268         [avoidClasses(clForest, 1, clPlayer, 20, clRock, 10, clWater, 1, clPond, 1), stayClasses(clDesert, 3)],
269         scaleByMapSize(6,20), 100
272 log("Creating small stone quarries...");
273 group = new SimpleGroup([new SimpleObject(oStoneSmall, 2,5, 1,3)], true, clRock);
274 createObjectGroupsDeprecated(group, 0,
275         [avoidClasses(clForest, 1, clPlayer, 20, clRock, 10, clWater, 1, clPond, 1), stayClasses(clDesert, 3)],
276         scaleByMapSize(6,20), 100
279 log("Creating metal mines...");
280 group = new SimpleGroup([new SimpleObject(oMetalLarge, 1,1, 0,4)], true, clMetal);
281 createObjectGroupsDeprecated(group, 0,
282         [avoidClasses(clForest, 1, clPlayer, 20, clMetal, 10, clRock, 5, clWater, 1, clPond, 1), stayClasses(clDesert, 3)],
283         scaleByMapSize(6,20), 100
286 Engine.SetProgress(65);
288 log("Creating small decorative rocks...");
289 group = new SimpleGroup(
290         [new SimpleObject(aDecorativeRock, 1,3, 0,1)],
291         true
293 createObjectGroupsDeprecated(
294         group, 0,
295         avoidClasses(clWater, 1, clForest, 0, clPlayer, 0, clPond, 1),
296         scaleByMapSize(16, 262), 50
299 log("Creating shrubs...");
300 group = new SimpleGroup(
301         [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)],
302         true
304 createObjectGroupsDeprecated(
305         group, 0,
306         avoidClasses(clWater, 1, clPlayer, 0, clPond, 1),
307         scaleByMapSize(20, 180), 50
309 Engine.SetProgress(70);
311 log("Creating gazelles...");
312 group = new SimpleGroup([new SimpleObject(oGazelle, 5,7, 0,4)], true, clFood);
313 createObjectGroupsDeprecated(group, 0,
314         avoidClasses(clForest, 0, clPlayer, 20, clWater, 1, clFood, 10, clDesert, 5, clPond, 1),
315         3*scaleByMapSize(5,20), 50
318 log("Creating goats...");
319 group = new SimpleGroup([new SimpleObject(oGoat, 2,4, 0,3)], true, clFood);
320 createObjectGroupsDeprecated(group, 0,
321         avoidClasses(clForest, 0, clPlayer, 20, clWater, 1, clFood, 10, clDesert, 5, clPond, 1),
322         3*scaleByMapSize(5,20), 50
325 log("Creating treasures...");
326 group = new SimpleGroup([new SimpleObject(oFoodTreasure, 1,1, 0,2)], true, clTreasure);
327 createObjectGroupsDeprecated(group, 0,
328         avoidClasses(clForest, 0, clPlayer, 20, clWater, 1, clFood, 2, clDesert, 5, clTreasure, 6, clPond, 1),
329         3*scaleByMapSize(5,20), 50
332 group = new SimpleGroup([new SimpleObject(oWoodTreasure, 1,1, 0,2)], true, clTreasure);
333 createObjectGroupsDeprecated(group, 0,
334         avoidClasses(clForest, 0, clPlayer, 20, clWater, 1, clFood, 2, clDesert, 5, clTreasure, 6, clPond, 1),
335         3*scaleByMapSize(5,20), 50
338 log("Creating camels...");
339 group = new SimpleGroup([new SimpleObject(oCamel, 2,4, 0,2)], true, clFood);
340 createObjectGroupsDeprecated(group, 0,
341         avoidClasses(clForest, 0, clPlayer, 20, clWater, 1, clFood, 10, clDesert, 5, clTreasure, 2, clPond, 1),
342         3*scaleByMapSize(5,20), 50
345 Engine.SetProgress(90);
347 createStragglerTrees(
348         [oDatePalm, oSDatePalm],
349         avoidClasses(clForest, 0, clWater, 1, clPlayer, 20, clMetal, 6, clDesert, 1, clTreasure, 2, clPond, 1),
350         clForest,
351         stragglerTrees / 2);
353 createStragglerTrees(
354         [oDatePalm, oSDatePalm],
355         avoidClasses(clForest, 0, clWater, 1, clPlayer, 20, clMetal, 6, clTreasure, 2),
356         clForest,
357         stragglerTrees / 10);
359 createStragglerTrees(
360         [oDatePalm, oSDatePalm],
361         borderClasses(clPond, 1, 4),
362         clForest,
363         stragglerTrees);
365 log("Creating obelisks");
366 group = new SimpleGroup(
367         [new SimpleObject(eObelisk, 1,1, 0,1)],
368         true
370 createObjectGroupsDeprecated(
371         group, 0,
372         [avoidClasses(clWater, 4, clForest, 3, clPlayer, 20, clMetal, 6, clRock, 2, clPond, 4, clTreasure, 2), stayClasses(clDesert, 3)],
373         scaleByMapSize(5, 30), 50
376 log("Creating pyramids");
377 group = new SimpleGroup(
378         [new SimpleObject(ePyramid, 1,1, 0,1)],
379         true
381 createObjectGroupsDeprecated(
382         group, 0,
383         [avoidClasses(clWater, 7, clForest, 6, clPlayer, 20, clMetal, 5, clRock, 5, clPond, 7, clTreasure, 2), stayClasses(clDesert, 3)],
384         scaleByMapSize(2, 6), 50
387 placePlayersNomad(clPlayer, avoidClasses(clWater, 4, clForest, 1, clMetal, 4, clRock, 4, clFood, 2));
389 setSkySet("sunny");
390 setSunColor(0.711, 0.746, 0.574);
391 setWaterColor(0.541,0.506,0.416);
392 setWaterTint(0.694,0.592,0.522);
393 setWaterMurkiness(1);
394 setWaterWaviness(3.0);
395 setWaterType("lake");
397 ExportMap();