Merge 'remotes/trunk'
[0ad.git] / binaries / data / mods / public / maps / random / ambush.js
blob9775cbcd1bf8a7804745a5c38759fb9e874af22d
1 Engine.LoadLibrary("rmgen");
2 Engine.LoadLibrary("rmgen-common");
3 Engine.LoadLibrary("rmgen2");
4 Engine.LoadLibrary("rmbiome");
6 function* GenerateMap(mapSettings)
8         setSelectedBiome();
10         const heightLand = 2;
12         globalThis.g_Map = new RandomMap(heightLand, g_Terrains.mainTerrain);
13         const mapCenter = g_Map.getCenter();
14         const mapSize = g_Map.getSize();
16         initTileClasses(["bluffsPassage", "nomadArea"]);
17         createArea(
18                 new MapBoundsPlacer(),
19                 new TileClassPainter(g_TileClasses.land));
21         yield 10;
23         const pattern = mapSettings.TeamPlacement ||
24                 pickRandom(["line", "radial", "randomGroup", "stronghold"]);
25         const [playerIDs, playerPosition] =
26                 createBases(
27                         ...playerPlacementByPattern(
28                                 pattern,
29                                 fractionToTiles(randFloat(0.2, 0.35)),
30                                 fractionToTiles(randFloat(0.08, 0.1)),
31                                 randomAngle(),
32                                 undefined),
33                         g_PlayerbaseTypes[pattern].walls);
35         if (!isNomad())
36                 markPlayerAvoidanceArea(playerPosition, defaultPlayerBaseRadius());
38         yield 20;
40         addElements([
41                 {
42                         "func": addBluffs,
43                         "baseHeight": heightLand,
44                         "avoid": [g_TileClasses.bluffIgnore, 0],
45                         "sizes": ["normal", "big", "huge"],
46                         "mixes": ["same"],
47                         "amounts": ["many"]
48                 },
49                 {
50                         "func": addHills,
51                         "avoid": [
52                                 g_TileClasses.bluff, 5,
53                                 g_TileClasses.hill, 15,
54                                 g_TileClasses.player, 20
55                         ],
56                         "sizes": ["normal", "big"],
57                         "mixes": ["normal"],
58                         "amounts": ["tons"]
59                 }
60         ]);
61         yield 30;
63         if (!isNomad())
64                 createBluffsPassages(playerPosition);
66         addElements([
67                 {
68                         "func": addLayeredPatches,
69                         "avoid": [
70                                 g_TileClasses.bluff, 2,
71                                 g_TileClasses.bluffsPassage, 4,
72                                 g_TileClasses.dirt, 5,
73                                 g_TileClasses.forest, 2,
74                                 g_TileClasses.mountain, 2,
75                                 g_TileClasses.player, 12,
76                                 g_TileClasses.water, 3
77                         ],
78                         "sizes": ["normal"],
79                         "mixes": ["normal"],
80                         "amounts": ["normal"]
81                 },
82                 {
83                         "func": addDecoration,
84                         "avoid": [
85                                 g_TileClasses.bluff, 2,
86                                 g_TileClasses.bluffsPassage, 4,
87                                 g_TileClasses.forest, 2,
88                                 g_TileClasses.mountain, 2,
89                                 g_TileClasses.player, 12,
90                                 g_TileClasses.water, 3
91                         ],
92                         "sizes": ["normal"],
93                         "mixes": ["normal"],
94                         "amounts": ["normal"]
95                 }
96         ]);
97         yield 50;
99         addElements(shuffleArray([
100                 {
101                         "func": addMetal,
102                         "avoid": [
103                                 g_TileClasses.bluffsPassage, 4,
104                                 g_TileClasses.berries, 5,
105                                 g_TileClasses.forest, 3,
106                                 g_TileClasses.mountain, 2,
107                                 g_TileClasses.player, 30,
108                                 g_TileClasses.rock, 10,
109                                 g_TileClasses.metal, 20,
110                                 g_TileClasses.water, 3
111                         ],
112                         "stay": [g_TileClasses.bluff, 5],
113                         "sizes": ["normal"],
114                         "mixes": ["same"],
115                         "amounts": ["tons"]
116                 },
117                 {
118                         "func": addStone,
119                         "avoid": [
120                                 g_TileClasses.bluffsPassage, 4,
121                                 g_TileClasses.berries, 5,
122                                 g_TileClasses.forest, 3,
123                                 g_TileClasses.mountain, 2,
124                                 g_TileClasses.player, 30,
125                                 g_TileClasses.rock, 20,
126                                 g_TileClasses.metal, 10,
127                                 g_TileClasses.water, 3
128                         ],
129                         "stay": [g_TileClasses.bluff, 5],
130                         "sizes": ["normal"],
131                         "mixes": ["same"],
132                         "amounts": ["tons"]
133                 },
134                 // Forests on bluffs
135                 {
136                         "func": addForests,
137                         "avoid": [
138                                 g_TileClasses.bluffsPassage, 4,
139                                 g_TileClasses.forest, 6,
140                                 g_TileClasses.metal, 3,
141                                 g_TileClasses.mountain, 5,
142                                 g_TileClasses.player, 20,
143                                 g_TileClasses.rock, 3,
144                                 g_TileClasses.water, 2
145                         ],
146                         "stay": [g_TileClasses.bluff, 5],
147                         "sizes": ["big"],
148                         "mixes": ["normal"],
149                         "amounts": ["tons"]
150                 },
151                 // Forests on mainland
152                 {
153                         "func": addForests,
154                         "avoid": [
155                                 g_TileClasses.bluffsPassage, 4,
156                                 g_TileClasses.bluff, 10,
157                                 g_TileClasses.forest, 10,
158                                 g_TileClasses.metal, 3,
159                                 g_TileClasses.mountain, 5,
160                                 g_TileClasses.player, 20,
161                                 g_TileClasses.rock, 3,
162                                 g_TileClasses.water, 2
163                         ],
164                         "sizes": ["small"],
165                         "mixes": ["same"],
166                         "amounts": ["normal"]
167                 }
168         ]));
169         yield 70;
171         addElements(shuffleArray([
172                 {
173                         "func": addBerries,
174                         "avoid": [
175                                 g_TileClasses.bluff, 5,
176                                 g_TileClasses.bluffsPassage, 4,
177                                 g_TileClasses.forest, 5,
178                                 g_TileClasses.metal, 10,
179                                 g_TileClasses.mountain, 2,
180                                 g_TileClasses.player, 20,
181                                 g_TileClasses.rock, 10,
182                                 g_TileClasses.water, 3
183                         ],
184                         "sizes": ["normal"],
185                         "mixes": ["same"],
186                         "amounts": ["few"]
187                 },
188                 {
189                         "func": addAnimals,
190                         "avoid": [
191                                 g_TileClasses.bluff, 5,
192                                 g_TileClasses.bluffsPassage, 4,
193                                 g_TileClasses.forest, 2,
194                                 g_TileClasses.metal, 2,
195                                 g_TileClasses.mountain, 1,
196                                 g_TileClasses.player, 12,
197                                 g_TileClasses.rock, 2,
198                                 g_TileClasses.water, 3
199                         ],
200                         "sizes": ["small"],
201                         "mixes": ["similar"],
202                         "amounts": ["few"]
203                 },
204                 {
205                         "func": addStragglerTrees,
206                         "avoid": [
207                                 g_TileClasses.berries, 5,
208                                 g_TileClasses.bluff, 5,
209                                 g_TileClasses.bluffsPassage, 4,
210                                 g_TileClasses.forest, 7,
211                                 g_TileClasses.metal, 2,
212                                 g_TileClasses.mountain, 1,
213                                 g_TileClasses.player, 12,
214                                 g_TileClasses.rock, 2,
215                                 g_TileClasses.water, 5
216                         ],
217                         "sizes": ["tiny"],
218                         "mixes": ["same"],
219                         "amounts": ["many"]
220                 }
221         ]));
222         yield 90;
224         if (isNomad())
225         {
226                 g_Map.log("Preventing units to be spawned at the map border");
227                 createArea(
228                         new DiskPlacer(mapSize / 2 - scaleByMapSize(15, 35), mapCenter),
229                         new TileClassPainter(g_TileClasses.nomadArea));
231                 placePlayersNomad(
232                         g_TileClasses.player,
233                         [
234                                 stayClasses(g_TileClasses.nomadArea, 0),
235                                 avoidClasses(
236                                         g_TileClasses.bluff, 2,
237                                         g_TileClasses.water, 4,
238                                         g_TileClasses.forest, 1,
239                                         g_TileClasses.metal, 4,
240                                         g_TileClasses.rock, 4,
241                                         g_TileClasses.mountain, 4,
242                                         g_TileClasses.animals, 2)
243                         ]);
244         }
246         return g_Map;