Nomad mode on all random map scripts (except Survival of the Fittest), fixes #3591.
[0ad.git] / binaries / data / mods / public / maps / random / fortress.js
blobc98d9dd84a2c4c71b5a2fc6ddc486aaa59c7f614
1 Engine.LoadLibrary("rmgen");
3 const tGrass = ["temp_grass_aut", "temp_grass_aut", "temp_grass_d_aut"];
4 const tForestFloor = "temp_grass_aut";
5 const tGrassA = "temp_grass_plants_aut";
6 const tGrassB = "temp_grass_b_aut";
7 const tGrassC = "temp_grass_c_aut";
8 const tHill = ["temp_highlands_aut", "temp_grass_long_b_aut"];
9 const tCliff = ["temp_cliff_a", "temp_cliff_b"];
10 const tRoad = "temp_road_aut";
11 const tGrassPatch = "temp_grass_plants_aut";
12 const tShore = "temp_plants_bog_aut";
13 const tWater = "temp_mud_a";
15 const oBeech = "gaia/flora_tree_euro_beech_aut";
16 const oOak = "gaia/flora_tree_oak_aut";
17 const oPine = "gaia/flora_tree_pine";
18 const oDeer = "gaia/fauna_deer";
19 const oFish = "gaia/fauna_fish";
20 const oSheep = "gaia/fauna_rabbit";
21 const oBerryBush = "gaia/flora_bush_berry";
22 const oStoneLarge = "gaia/geology_stonemine_temperate_quarry";
23 const oStoneSmall = "gaia/geology_stone_temperate";
24 const oMetalLarge = "gaia/geology_metal_temperate_slabs";
25 const oFoodTreasure = "gaia/special_treasure_food_bin";
26 const oWoodTreasure = "gaia/special_treasure_wood";
27 const oStoneTreasure = "gaia/special_treasure_stone";
28 const oMetalTreasure = "gaia/special_treasure_metal";
30 const aGrass = "actor|props/flora/grass_soft_dry_small_tall.xml";
31 const aGrassShort = "actor|props/flora/grass_soft_dry_large.xml";
32 const aRockLarge = "actor|geology/stone_granite_med.xml";
33 const aRockMedium = "actor|geology/stone_granite_med.xml";
34 const aReeds = "actor|props/flora/reeds_pond_dry.xml";
35 const aLillies = "actor|props/flora/water_lillies.xml";
36 const aBushMedium = "actor|props/flora/bush_medit_me_dry.xml";
37 const aBushSmall = "actor|props/flora/bush_medit_sm_dry.xml";
39 const pForestD = [tForestFloor + TERRAIN_SEPARATOR + oBeech, tForestFloor];
40 const pForestO = [tForestFloor + TERRAIN_SEPARATOR + oOak, tForestFloor];
41 const pForestP = [tForestFloor + TERRAIN_SEPARATOR + oPine, tForestFloor];
43 InitMap();
45 const numPlayers = getNumPlayers();
46 const mapSize = getMapSize();
48 var clPlayer = createTileClass();
49 var clHill = createTileClass();
50 var clForest = createTileClass();
51 var clWater = createTileClass();
52 var clDirt = createTileClass();
53 var clRock = createTileClass();
54 var clMetal = createTileClass();
55 var clFood = createTileClass();
56 var clBaseResource = createTileClass();
58 var [playerIDs, playerX, playerZ] = playerPlacementCircle(0.35);
60 for (var i=0; i < numPlayers; i++)
62         if (isNomad())
63                 break;
65         log("Creating base for player " + playerIDs[i] + "...");
66         playerX[i] *= mapSize;
67         playerZ[i] *= mapSize;
69         for (let dist of [6, 8])
70         {
71                 let ents = getStartingEntities(playerIDs[i]);
73                 if (dist == 8)
74                         ents = ents.filter(ent => ent.Template.indexOf("female") != -1 || ent.Template.indexOf("infantry") != -1);
76                 placeStartingEntities(playerX[i], playerZ[i], playerIDs[i], ents, dist);
77         }
79         // Create treasure
80         var bbAngle = BUILDING_ORIENTATION;
81         var bbDist = 10;
82         var bbX = Math.round(playerX[i] + bbDist * Math.cos(bbAngle));
83         var bbZ = Math.round(playerZ[i] + bbDist * Math.sin(bbAngle));
84         var group = new SimpleGroup(
85                 [new SimpleObject(oFoodTreasure, 5,5, 0,2)],
86                 true, clBaseResource, bbX, bbZ
87         );
88         createObjectGroup(group, 0);
90         bbAngle += Math.PI / 2;
91         var bbX = Math.round(playerX[i] + bbDist * Math.cos(bbAngle));
92         var bbZ = Math.round(playerZ[i] + bbDist * Math.sin(bbAngle));
93         group = new SimpleGroup(
94                 [new SimpleObject(oWoodTreasure, 5,5, 0,2)],
95                 true, clBaseResource, bbX, bbZ
96         );
97         createObjectGroup(group, 0);
99         bbAngle += Math.PI / 2;
100         var bbX = Math.round(playerX[i] + bbDist * Math.cos(bbAngle));
101         var bbZ = Math.round(playerZ[i] + bbDist * Math.sin(bbAngle));
102         group = new SimpleGroup(
103                 [new SimpleObject(oMetalTreasure, 3,3, 0,2)],
104                 true, clBaseResource, bbX, bbZ
105         );
106         createObjectGroup(group, 0);
108         bbAngle += Math.PI / 2;
109         var bbX = Math.round(playerX[i] + bbDist * Math.cos(bbAngle));
110         var bbZ = Math.round(playerZ[i] + bbDist * Math.sin(bbAngle));
111         group = new SimpleGroup(
112                 [new SimpleObject(oStoneTreasure, 2,2, 0,2)],
113                 true, clBaseResource, bbX, bbZ
114         );
115         createObjectGroup(group, 0);
117         // Base texture
118         var civ = getCivCode(playerIDs[i]);
119         var tilesSize = civ == "cart" ? 27 : 22;
121         const minBoundX = (playerX[i] > tilesSize ? playerX[i] - tilesSize : 0);
122         const minBoundY = (playerZ[i] > tilesSize ? playerZ[i] - tilesSize : 0);
123         const maxBoundX = (playerX[i] < mapSize - tilesSize ? playerX[i] + tilesSize : mapSize);
124         const maxBoundY = (playerZ[i] < mapSize - tilesSize ? playerZ[i] + tilesSize : mapSize);
126         for (var tx = minBoundX; tx < maxBoundX; ++tx)
127                 for (var ty = minBoundY; ty < maxBoundY; ++ty)
128                 {
129                         var unboundSumOfXY = tx + ty - minBoundX - minBoundY;
130                         if ((unboundSumOfXY > tilesSize) && (unboundSumOfXY < 3 * tilesSize) && (tx - ty + minBoundY - minBoundX < tilesSize) && (ty - tx - minBoundY + minBoundX < tilesSize))
131                         {
132                                 placeTerrain(Math.floor(tx), Math.floor(ty), tRoad);
133                                 addToClass(Math.floor(tx), Math.floor(ty), clPlayer);
134                         }
135                 }
137         // Place custom fortress
138         if (civ == "brit" || civ == "gaul" || civ == "iber")
139         {
140                 var wall = ["gate", "tower", "long",
141                         "cornerIn", "long", "barracks", "tower", "long", "tower", "house", "long",
142                         "cornerIn", "long", "house", "tower", "gate", "tower", "house", "long",
143                         "cornerIn", "long", "house", "tower", "long", "tower", "house", "long",
144                         "cornerIn", "long", "house", "tower"];
145         }
146         else
147         {
148                 var wall = ["gate", "tower", "long",
149                         "cornerIn", "long", "barracks", "tower", "long", "tower", "long",
150                         "cornerIn", "long", "house", "tower", "gate", "tower", "long",
151                         "cornerIn", "long", "house", "tower", "long", "tower", "long",
152                         "cornerIn", "long", "house", "tower"];
153         }
154         placeCustomFortress(playerX[i], playerZ[i], new Fortress("Spahbod", wall), civ, playerIDs[i], -Math.PI/4);
157 log("Creating lakes...");
158 var numLakes = Math.round(scaleByMapSize(1,4) * numPlayers);
159 var waterAreas = createAreas(
160         new ClumpPlacer(scaleByMapSize(100,250), 0.8, 0.1, 10),
161         [
162                 new LayeredPainter([tShore, tWater, tWater], [1, 1]),
163                 new SmoothElevationPainter(ELEVATION_SET, -4, 3),
164                 paintClass(clWater)
165         ],
166         avoidClasses(clPlayer, 7, clWater, 20),
167         numLakes);
169 Engine.SetProgress(15);
171 log("Creating reeds...");
172 createObjectGroupsByAreasDeprecated(
173         new SimpleGroup([new SimpleObject(aReeds, 5,10, 0,4), new SimpleObject(aLillies, 0,1, 0,4)], true),
174         0,
175         [borderClasses(clWater, 3, 0), stayClasses(clWater, 1)],
176         numLakes, 100,
177         waterAreas);
179 Engine.SetProgress(25);
181 log("Creating fish...");
182 createObjectGroupsByAreasDeprecated(
183         new SimpleGroup(
184                 [new SimpleObject(oFish, 1,1, 0,1)],
185                 true, clFood
186         ),
187         0,
188         [stayClasses(clWater, 4),  avoidClasses(clFood, 8)],
189         numLakes / 4,
190         50,
191         waterAreas);
192 Engine.SetProgress(30);
194 createBumps(avoidClasses(clWater, 2, clPlayer, 5));
195 Engine.SetProgress(35);
197 log("Creating hills...");
198 createHills([tCliff, tCliff, tHill], avoidClasses(clPlayer, 5, clWater, 5, clHill, 15), clHill, scaleByMapSize(1, 4) * numPlayers);
199 Engine.SetProgress(40);
201 log("Creating forests...");
202 var [forestTrees, stragglerTrees] = getTreeCounts(500, 2500, 0.7);
203 var types = [
204         [[tForestFloor, tGrass, pForestD], [tForestFloor, pForestD]],
205         [[tForestFloor, tGrass, pForestO], [tForestFloor, pForestO]],
206         [[tForestFloor, tGrass, pForestP], [tForestFloor, pForestP]]
208 var size = forestTrees / (scaleByMapSize(3,6) * numPlayers);
209 var num = Math.floor(size / types.length);
210 for (let type of types)
211         createAreas(
212                 new ChainPlacer(1, Math.floor(scaleByMapSize(3, 5)), forestTrees / num, 0.5),
213                 [
214                         new LayeredPainter(type, [2]),
215                         paintClass(clForest)
216                 ],
217                 avoidClasses(clPlayer, 5, clWater, 3, clForest, 15, clHill, 1),
218                 num);
219 Engine.SetProgress(50);
221 log("Creating dirt patches...");
222 createLayeredPatches(
223  [scaleByMapSize(3, 6), scaleByMapSize(5, 10), scaleByMapSize(8, 21)],
224  [[tGrass,tGrassA],[tGrassA,tGrassB], [tGrassB,tGrassC]],
225  [1,1],
226  avoidClasses(clWater, 1, clForest, 0, clHill, 0, clDirt, 5, clPlayer, 1),
227  scaleByMapSize(15, 45),
228  clDirt);
229 Engine.SetProgress(55);
231 log("Creating grass patches...");
232 createPatches(
233  [scaleByMapSize(2, 4), scaleByMapSize(3, 7), scaleByMapSize(5, 15)],
234  tGrassPatch,
235  avoidClasses(clWater, 1, clForest, 0, clHill, 0, clDirt, 5, clPlayer, 1),
236  scaleByMapSize(15, 45),
237  clDirt);
238 Engine.SetProgress(60);
240 log("Creating stone mines...");
241 createMines(
243   [new SimpleObject(oStoneSmall, 0,2, 0,4), new SimpleObject(oStoneLarge, 1,1, 0,4)],
244   [new SimpleObject(oStoneSmall, 2,5, 1,3)]
245  ],
246  avoidClasses(clWater, 0, clForest, 1, clPlayer, 5, clRock, 10, clHill, 1),
247  clRock);
248 Engine.SetProgress(65);
250 log("Creating metal mines...");
251 createMines(
253   [new SimpleObject(oMetalLarge, 1,1, 0,4)]
254  ],
255  avoidClasses(clWater, 0, clForest, 1, clPlayer, 5, clMetal, 10, clRock, 5, clHill, 1),
256  clMetal
258 Engine.SetProgress(70);
260 createDecoration(
261         [
262                 [new SimpleObject(aRockMedium, 1, 3, 0, 1)],
263                 [new SimpleObject(aRockLarge, 1, 2, 0, 1), new SimpleObject(aRockMedium, 1, 3, 0, 2)],
264                 [new SimpleObject(aGrassShort, 1, 2, 0, 1)],
265                 [new SimpleObject(aGrass, 2, 4, 0, 1.8), new SimpleObject(aGrassShort, 3, 6, 1.2, 2.5)],
266                 [new SimpleObject(aBushMedium, 1, 2, 0, 2), new SimpleObject(aBushSmall, 2, 4, 0, 2)]
267         ],
268         [
269                 scaleByMapSize(16, 262),
270                 scaleByMapSize(8, 131),
271                 scaleByMapSize(13, 200),
272                 scaleByMapSize(13, 200),
273                 scaleByMapSize(13, 200)
274         ],
275         avoidClasses(clWater, 0, clForest, 0, clPlayer, 1, clHill, 0));
276 Engine.SetProgress(80);
278 createFood(
279         [
280                 [new SimpleObject(oSheep, 2, 3, 0, 2)],
281                 [new SimpleObject(oDeer, 5, 7, 0, 4)]
282         ],
283         [
284                 3 * numPlayers,
285                 3 * numPlayers
286         ],
287         avoidClasses(clWater, 0, clForest, 0, clPlayer, 6, clHill, 1, clFood, 20),
288         clFood);
289 Engine.SetProgress(85);
291 createFood(
292         [
293                 [new SimpleObject(oBerryBush, 5, 7, 0, 4)]
294         ],
295         [
296                 randIntInclusive(1, 4) * numPlayers + 2
297         ],
298         avoidClasses(clWater, 2, clForest, 0, clPlayer, 6, clHill, 1, clFood, 10),
299         clFood);
301 Engine.SetProgress(90);
303 createStragglerTrees(
304         [oOak, oBeech, oPine],
305         avoidClasses(clWater, 1, clForest, 1, clHill, 1, clPlayer, 1, clMetal, 6, clRock, 6),
306         clForest,
307         stragglerTrees);
308 Engine.SetProgress(95);
310 placePlayersNomad(clPlayer, avoidClasses(clWater, 2, clHill, 2, clForest, 1, clMetal, 4, clRock, 4, clHill, 4, clFood, 2));
312 setSkySet("sunny");
313 setWaterColor(0.157, 0.149, 0.443);
314 setWaterTint(0.443,0.42,0.824);
315 setWaterWaviness(2.0);
316 setWaterType("lake");
317 setWaterMurkiness(0.83);
319 setFogFactor(0.35);
320 setFogThickness(0.22);
321 setFogColor(0.82,0.82, 0.73);
322 setPPSaturation(0.56);
323 setPPContrast(0.56);
324 setPPBloom(0.38);
325 setPPEffect("hdr");
327 ExportMap();