Nomad mode on all random map scripts (except Survival of the Fittest), fixes #3591.
[0ad.git] / binaries / data / mods / public / maps / random / lions_den.js
blob578bf6fa06a74f19f8decf19523b85c967625e78
1 Engine.LoadLibrary("rmgen");
2 Engine.LoadLibrary("rmgen2");
3 Engine.LoadLibrary("rmbiome");
5 InitMap();
7 setSelectedBiome();
8 initTileClasses(["step"]);
10 const topTerrain = g_Terrains.tier2Terrain;
12 const valleyHeight = 0;
13 const pathHeight = 10;
14 const denHeight = 15;
15 const hillHeight = getMapBaseHeight();
17 const mapArea = getMapArea();
18 const numPlayers = getNumPlayers();
19 const startAngle = randFloat(0, 2 * Math.PI);
21 resetTerrain(topTerrain, g_TileClasses.land, hillHeight);
22 Engine.SetProgress(10);
24 addBases("radial", 0.4, randFloat(0.05, 0.1), startAngle);
25 Engine.SetProgress(20);
27 createSunkenTerrain();
28 Engine.SetProgress(30);
30 addElements([
31         {
32                 "func": addLayeredPatches,
33                 "avoid": [
34                         g_TileClasses.baseResource, 5,
35                         g_TileClasses.dirt, 5,
36                         g_TileClasses.forest, 2,
37                         g_TileClasses.mountain, 2,
38                         g_TileClasses.player, 12,
39                         g_TileClasses.step, 5
40                 ],
41                 "stay": [g_TileClasses.valley, 7],
42                 "sizes": ["normal"],
43                 "mixes": ["normal"],
44                 "amounts": ["normal"]
45         },
46         {
47                 "func": addLayeredPatches,
48                 "avoid": [
49                         g_TileClasses.baseResource, 5,
50                         g_TileClasses.dirt, 5,
51                         g_TileClasses.forest, 2,
52                         g_TileClasses.mountain, 2,
53                         g_TileClasses.player, 12
54                 ],
55                 "stay": [g_TileClasses.settlement, 7],
56                 "sizes": ["normal"],
57                 "mixes": ["normal"],
58                 "amounts": ["normal"]
59         },
60         {
61                 "func": addLayeredPatches,
62                 "avoid": [
63                         g_TileClasses.baseResource, 5,
64                         g_TileClasses.dirt, 5,
65                         g_TileClasses.forest, 2
66                 ],
67                 "stay": [g_TileClasses.player, 1],
68                 "sizes": ["normal"],
69                 "mixes": ["normal"],
70                 "amounts": ["normal"]
71         },
72         {
73                 "func": addDecoration,
74                 "avoid": [
75                         g_TileClasses.baseResource, 5,
76                         g_TileClasses.forest, 2
77                 ],
78                 "stay": [g_TileClasses.player, 1],
79                 "sizes": ["normal"],
80                 "mixes": ["normal"],
81                 "amounts": ["normal"]
82         },
83         {
84                 "func": addDecoration,
85                 "avoid": [
86                         g_TileClasses.baseResource, 5,
87                         g_TileClasses.forest, 2,
88                         g_TileClasses.mountain, 2,
89                         g_TileClasses.player, 12,
90                         g_TileClasses.step, 2
91                  ],
92                 "stay": [g_TileClasses.valley, 7],
93                 "sizes": ["normal"],
94                 "mixes": ["normal"],
95                 "amounts": ["normal"]
96         },
97         {
98                 "func": addDecoration,
99                 "avoid": [
100                         g_TileClasses.baseResource, 5,
101                         g_TileClasses.forest, 2,
102                         g_TileClasses.mountain, 2,
103                         g_TileClasses.player, 12
104                 ],
105                 "stay": [g_TileClasses.settlement, 7],
106                 "sizes": ["normal"],
107                 "mixes": ["normal"],
108                 "amounts": ["normal"]
109         },
110         {
111                 "func": addDecoration,
112                 "avoid": [
113                         g_TileClasses.baseResource, 5,
114                         g_TileClasses.forest, 2,
115                         g_TileClasses.mountain, 2,
116                         g_TileClasses.player, 12
117                 ],
118                 "stay": [g_TileClasses.step, 7],
119                 "sizes": ["normal"],
120                 "mixes": ["normal"],
121                 "amounts": ["scarce"]
122         }
124 Engine.SetProgress(40);
126 addElements(shuffleArray([
127         {
128                 "func": addMetal,
129                 "avoid": [
130                         g_TileClasses.baseResource, 5,
131                         g_TileClasses.berries, 5,
132                         g_TileClasses.forest, 3,
133                         g_TileClasses.player, 30,
134                         g_TileClasses.rock, 10,
135                         g_TileClasses.metal, 20
136                 ],
137                 "stay": [g_TileClasses.settlement, 7],
138                 "sizes": ["normal"],
139                 "mixes": ["same"],
140                 "amounts": ["tons"]
141         },
142         {
143                 "func": addMetal,
144                 "avoid": [
145                         g_TileClasses.baseResource, 5,
146                         g_TileClasses.berries, 5,
147                         g_TileClasses.forest, 3,
148                         g_TileClasses.player, 10,
149                         g_TileClasses.rock, 10,
150                         g_TileClasses.metal, 20,
151                         g_TileClasses.mountain, 5,
152                         g_TileClasses.step, 5
153                 ],
154                 "stay": [g_TileClasses.valley, 7],
155                 "sizes": ["normal"],
156                 "mixes": ["same"],
157                 "amounts": g_AllAmounts
158         },
159         {
160                 "func": addStone,
161                 "avoid": [
162                         g_TileClasses.baseResource, 5,
163                         g_TileClasses.berries, 5,
164                         g_TileClasses.forest, 3,
165                         g_TileClasses.player, 30,
166                         g_TileClasses.rock, 20,
167                         g_TileClasses.metal, 10
168                 ],
169                 "stay": [g_TileClasses.settlement, 7],
170                 "sizes": ["normal"],
171                 "mixes": ["same"],
172                 "amounts": ["tons"]
173         },
174         {
175                 "func": addStone,
176                 "avoid": [
177                         g_TileClasses.baseResource, 5,
178                         g_TileClasses.berries, 5,
179                         g_TileClasses.forest, 3,
180                         g_TileClasses.player, 10,
181                         g_TileClasses.rock, 20,
182                         g_TileClasses.metal, 10,
183                         g_TileClasses.mountain, 5,
184                         g_TileClasses.step, 5
185                 ],
186                 "stay": [g_TileClasses.valley, 7],
187                 "sizes": ["normal"],
188                 "mixes": ["same"],
189                 "amounts": g_AllAmounts
190         },
191         {
192                 "func": addForests,
193                 "avoid": [
194                         g_TileClasses.baseResource, 5,
195                         g_TileClasses.berries, 5,
196                         g_TileClasses.forest, 18,
197                         g_TileClasses.metal, 3,
198                         g_TileClasses.player, 20,
199                         g_TileClasses.rock, 3
200                 ],
201                 "stay": [g_TileClasses.settlement, 7],
202                 "sizes": ["normal", "big"],
203                 "mixes": ["same"],
204                 "amounts": ["tons"]
205         },
206         {
207                 "func": addForests,
208                 "avoid": [
209                         g_TileClasses.baseResource, 5,
210                         g_TileClasses.berries, 3,
211                         g_TileClasses.forest, 18,
212                         g_TileClasses.metal, 3,
213                         g_TileClasses.mountain, 5,
214                         g_TileClasses.player, 5,
215                         g_TileClasses.rock, 3,
216                         g_TileClasses.step, 1
217                 ],
218                 "stay": [g_TileClasses.valley, 7],
219                 "sizes": ["normal", "big"],
220                 "mixes": ["same"],
221                 "amounts": ["tons"]
222         }
223 ]));
224 Engine.SetProgress(60);
226 addElements(shuffleArray([
227         {
228                 "func": addBerries,
229                 "avoid": [
230                         g_TileClasses.baseResource, 5,
231                         g_TileClasses.berries, 30,
232                         g_TileClasses.forest, 5,
233                         g_TileClasses.metal, 10,
234                         g_TileClasses.player, 20,
235                         g_TileClasses.rock, 10
236                 ],
237                 "stay": [g_TileClasses.settlement, 7],
238                 "sizes": g_AllSizes,
239                 "mixes": g_AllMixes,
240                 "amounts": ["tons"]
241         },
242         {
243                 "func": addBerries,
244                 "avoid": [
245                         g_TileClasses.baseResource, 5,
246                         g_TileClasses.berries, 30,
247                         g_TileClasses.forest, 5,
248                         g_TileClasses.metal, 10,
249                         g_TileClasses.mountain, 5,
250                         g_TileClasses.player, 10,
251                         g_TileClasses.rock, 10,
252                         g_TileClasses.step, 5
253                 ],
254                 "stay": [g_TileClasses.valley, 7],
255                 "sizes": g_AllSizes,
256                 "mixes": g_AllMixes,
257                 "amounts": g_AllAmounts
258         },
259         {
260                 "func": addAnimals,
261                 "avoid": [
262                         g_TileClasses.animals, 20,
263                         g_TileClasses.baseResource, 5,
264                         g_TileClasses.forest, 0,
265                         g_TileClasses.metal, 1,
266                         g_TileClasses.player, 20,
267                         g_TileClasses.rock, 1
268                 ],
269                 "stay": [g_TileClasses.settlement, 7],
270                 "sizes": g_AllSizes,
271                 "mixes": g_AllMixes,
272                 "amounts": ["tons"]
273         },
274         {
275                 "func": addAnimals,
276                 "avoid": [
277                         g_TileClasses.animals, 20,
278                         g_TileClasses.baseResource, 5,
279                         g_TileClasses.forest, 0,
280                         g_TileClasses.metal, 1,
281                         g_TileClasses.mountain, 5,
282                         g_TileClasses.player, 10,
283                         g_TileClasses.rock, 1,
284                         g_TileClasses.step, 5
285                 ],
286                 "stay": [g_TileClasses.valley, 7],
287                 "sizes": g_AllSizes,
288                 "mixes": g_AllMixes,
289                 "amounts": g_AllAmounts
290         },
291         {
292                 "func": addStragglerTrees,
293                 "avoid": [
294                         g_TileClasses.baseResource, 5,
295                         g_TileClasses.berries, 5,
296                         g_TileClasses.forest, 7,
297                         g_TileClasses.metal, 3,
298                         g_TileClasses.player, 12,
299                         g_TileClasses.rock, 3
300                 ],
301                 "stay": [g_TileClasses.settlement, 7],
302                 "sizes": g_AllSizes,
303                 "mixes": g_AllMixes,
304                 "amounts": ["tons"]
305         },
306         {
307                 "func": addStragglerTrees,
308                 "avoid": [
309                         g_TileClasses.baseResource, 5,
310                         g_TileClasses.berries, 5,
311                         g_TileClasses.forest, 7,
312                         g_TileClasses.metal, 3,
313                         g_TileClasses.mountain, 5,
314                         g_TileClasses.player, 10,
315                         g_TileClasses.rock, 3,
316                         g_TileClasses.step, 5
317                 ],
318                 "stay": [g_TileClasses.valley, 7],
319                 "sizes": g_AllSizes,
320                 "mixes": g_AllMixes,
321                 "amounts": ["normal", "many", "tons"]
322         },
323         {
324                 "func": addStragglerTrees,
325                 "avoid": [
326                         g_TileClasses.player, 10,
327                         g_TileClasses.baseResource, 5,
328                         g_TileClasses.berries, 5,
329                         g_TileClasses.forest, 3,
330                         g_TileClasses.metal, 5,
331                         g_TileClasses.rock, 5
332                 ],
333                 "stay": [g_TileClasses.player, 1],
334                 "sizes": ["huge"],
335                 "mixes": ["same"],
336                 "amounts": ["tons"]
337         }
338 ]));
339 Engine.SetProgress(75);
341 addElements([
342         {
343                 "func": addDecoration,
344                 "avoid": [
345                         g_TileClasses.baseResource, 5,
346                         g_TileClasses.valley, 4,
347                         g_TileClasses.player, 4,
348                         g_TileClasses.settlement, 4,
349                         g_TileClasses.step, 4
350                 ],
351                 "stay": [g_TileClasses.land, 2],
352                 "sizes": ["normal"],
353                 "mixes": ["normal"],
354                 "amounts": ["tons"]
355         }
357 Engine.SetProgress(80);
359 addElements([
360         {
361                 "func": addProps,
362                 "avoid": [
363                         g_TileClasses.baseResource, 5,
364                         g_TileClasses.valley, 4,
365                         g_TileClasses.player, 4,
366                         g_TileClasses.settlement, 4,
367                         g_TileClasses.step, 4
368                 ],
369                 "stay": [g_TileClasses.land, 2],
370                 "sizes": ["normal"],
371                 "mixes": ["normal"],
372                 "amounts": ["scarce"]
373         }
375 Engine.SetProgress(85);
377 addElements([
378         {
379                 "func": addDecoration,
380                 "avoid": [
381                         g_TileClasses.baseResource, 5,
382                         g_TileClasses.player, 4,
383                         g_TileClasses.settlement, 4,
384                         g_TileClasses.step, 4
385                 ],
386                 "stay": [g_TileClasses.mountain, 2],
387                 "sizes": ["normal"],
388                 "mixes": ["normal"],
389                 "amounts": ["tons"]
390         }
392 Engine.SetProgress(90);
394 addElements([
395         {
396                 "func": addProps,
397                 "avoid": [
398                         g_TileClasses.baseResource, 5,
399                         g_TileClasses.player, 4,
400                         g_TileClasses.settlement, 4,
401                         g_TileClasses.step, 4
402                 ],
403                 "stay": [g_TileClasses.mountain, 2],
404                 "sizes": ["normal"],
405                 "mixes": ["normal"],
406                 "amounts": ["scarce"]
407         }
409 Engine.SetProgress(95);
411 placePlayersNomad(
412         g_TileClasses.player,
413         [
414                 new HeightConstraint(valleyHeight, pathHeight),
415                 avoidClasses(
416                         g_TileClasses.forest, 1,
417                         g_TileClasses.metal, 4,
418                         g_TileClasses.rock, 4,
419                         g_TileClasses.animals, 2)
420         ]);
422 ExportMap();
424 function createSunkenTerrain()
426         var base = g_Terrains.mainTerrain;
427         var middle = g_Terrains.dirt;
428         var lower = g_Terrains.tier2Terrain;
429         var road = g_Terrains.road;
431         if (currentBiome() == "snowy")
432         {
433                 middle = g_Terrains.tier2Terrain;
434                 lower = g_Terrains.tier1Terrain;
435         }
437         if (currentBiome() == "alpine")
438         {
439                 middle = g_Terrains.shore;
440                 lower = g_Terrains.tier4Terrain;
441         }
443         if (currentBiome() == "mediterranean")
444         {
445                 middle = g_Terrains.tier1Terrain;
446                 lower = g_Terrains.forestFloor1;
447         }
449         if (currentBiome() == "savanna")
450         {
451                 middle = g_Terrains.tier2Terrain;
452                 lower = g_Terrains.tier4Terrain;
453         }
455         if (currentBiome() == "tropic" || currentBiome() == "autumn")
456                 road = g_Terrains.roadWild;
458         if (currentBiome() == "autumn")
459                 middle = g_Terrains.shore;
461         var expSize = mapArea * 0.015 / (numPlayers / 4);
462         var expDist = 0.1 + numPlayers / 200;
463         var expAngle = 0.75;
465         if (numPlayers == 2)
466         {
467                 expSize = mapArea * 0.015 / 0.8;
468                 expAngle = 0.72;
469         }
471         var nRoad = 0.44;
472         var nExp = 0.425;
474         if (numPlayers < 4)
475         {
476                 nRoad = 0.42;
477                 nExp = 0.4;
478         }
480         log("Creating central valley...");
481         let center = Math.floor(fractionToTiles(0.5));
482         createArea(
483                 new ClumpPlacer(mapArea * 0.26, 1, 1, 1, center, center),
484                 [
485                         new LayeredPainter([g_Terrains.cliff, lower], [3]),
486                         new SmoothElevationPainter(ELEVATION_SET, valleyHeight, 3),
487                         paintClass(g_TileClasses.valley)
488                 ]);
490         log("Creating central hill...");
491         createArea(
492                 new ClumpPlacer(mapArea * 0.14, 1, 1, 1, center, center),
493                 [
494                         new LayeredPainter([g_Terrains.cliff, topTerrain], [3]),
495                         new SmoothElevationPainter(ELEVATION_SET, hillHeight, 3),
496                         paintClass(g_TileClasses.mountain)
497                 ]);
499         let getCoords = (distance, playerID, playerIDOffset) => {
500                 let angle = startAngle + (playerID + playerIDOffset) * 2 * Math.PI / numPlayers;
501                 return [
502                         Math.round(fractionToTiles(0.5 + distance * Math.cos(angle))),
503                         Math.round(fractionToTiles(0.5 + distance * Math.sin(angle)))
504                 ];
505         };
507         for (let i = 0; i < numPlayers; ++i)
508         {
509                 let playerCoords = getCoords(0.4, i, 0);
511                 log("Creating path from player to expansion...");
512                 let expansionCoords = getCoords(expDist, i, expAngle);
513                 createArea(
514                         new PathPlacer(...playerCoords, ...expansionCoords, 12, 0.7, 0.5, 0.1, -1),
515                         [
516                                 new LayeredPainter([g_Terrains.cliff, middle, road], [3, 4]),
517                                 new SmoothElevationPainter(ELEVATION_SET, pathHeight, 3),
518                                 paintClass(g_TileClasses.step)
519                         ]);
521                 log("Creating path from player to the neighbor...");
522                 for (let neighborOffset of [-0.5, 0.5])
523                         createArea(
524                                 new PathPlacer(...getCoords(0.47, i, 0), ...getCoords(nRoad, i, neighborOffset), 19, 0.4, 0.5, 0.1, -0.6),
525                                 [
526                                         new LayeredPainter([g_Terrains.cliff, middle, road], [3, 6]),
527                                         new SmoothElevationPainter(ELEVATION_SET, pathHeight, 3),
528                                         paintClass(g_TileClasses.step)
529                                 ]);
531                 log("Creating the den of the player...");
532                 createArea(
533                         new ClumpPlacer(mapArea * 0.03 / (isNomad() ? 2 : 1), 0.9, 0.3, 1, ...playerCoords),
534                         [
535                                 new LayeredPainter([g_Terrains.cliff, base], [3]),
536                                 new SmoothElevationPainter(ELEVATION_SET, denHeight, 3),
537                                 paintClass(g_TileClasses.valley)
538                         ]);
540                 log("Creating the expansion of the player...");
541                 createArea(
542                         new ClumpPlacer(expSize, 0.9, 0.3, 1, ...expansionCoords),
543                         [
544                                 new LayeredPainter([g_Terrains.cliff, base], [3]),
545                                 new SmoothElevationPainter(ELEVATION_SET, denHeight, 3),
546                                 paintClass(g_TileClasses.settlement)
547                         ],
548                         [avoidClasses(g_TileClasses.settlement, 2)]);
549         }
551         log("Creating the expansions between players after the paths were created...");
552         for (let i = 0; i < numPlayers; ++i)
553                 createArea(
554                         new ClumpPlacer(expSize, 0.9, 0.3, 1, ...getCoords(nExp, i, 0.5)),
555                         [
556                                 new LayeredPainter([g_Terrains.cliff, lower], [3]),
557                                 new SmoothElevationPainter(ELEVATION_SET, valleyHeight, 3),
558                                 paintClass(g_TileClasses.settlement)
559                         ]);