Fix the two incorrect replacements in rP21434, refs #4950.
[0ad.git] / binaries / data / mods / public / maps / random / fortress.js
blob90207d16a3104fbf389e97af92a00b4cb4c2df0d
1 Engine.LoadLibrary("rmgen");
2 Engine.LoadLibrary("rmgen-common");
4 const tGrass = ["temp_grass_aut", "temp_grass_aut", "temp_grass_d_aut"];
5 const tForestFloor = "temp_grass_aut";
6 const tGrassA = "temp_grass_plants_aut";
7 const tGrassB = "temp_grass_b_aut";
8 const tGrassC = "temp_grass_c_aut";
9 const tHill = ["temp_highlands_aut", "temp_grass_long_b_aut"];
10 const tCliff = ["temp_cliff_a", "temp_cliff_b"];
11 const tRoad = "temp_road_aut";
12 const tGrassPatch = "temp_grass_plants_aut";
13 const tShore = "temp_plants_bog_aut";
14 const tWater = "temp_mud_a";
16 const oBeech = "gaia/flora_tree_euro_beech_aut";
17 const oOak = "gaia/flora_tree_oak_aut";
18 const oPine = "gaia/flora_tree_pine";
19 const oDeer = "gaia/fauna_deer";
20 const oFish = "gaia/fauna_fish";
21 const oSheep = "gaia/fauna_rabbit";
22 const oBerryBush = "gaia/flora_bush_berry";
23 const oStoneLarge = "gaia/geology_stonemine_temperate_quarry";
24 const oStoneSmall = "gaia/geology_stone_temperate";
25 const oMetalLarge = "gaia/geology_metal_temperate_slabs";
26 const oFoodTreasure = "gaia/treasure/food_bin";
27 const oWoodTreasure = "gaia/treasure/wood";
28 const oStoneTreasure = "gaia/treasure/stone";
29 const oMetalTreasure = "gaia/treasure/metal";
31 const aGrass = "actor|props/flora/grass_soft_dry_small_tall.xml";
32 const aGrassShort = "actor|props/flora/grass_soft_dry_large.xml";
33 const aRockLarge = "actor|geology/stone_granite_med.xml";
34 const aRockMedium = "actor|geology/stone_granite_med.xml";
35 const aReeds = "actor|props/flora/reeds_pond_dry.xml";
36 const aLillies = "actor|props/flora/water_lillies.xml";
37 const aBushMedium = "actor|props/flora/bush_medit_me_dry.xml";
38 const aBushSmall = "actor|props/flora/bush_medit_sm_dry.xml";
40 const pForestD = [tForestFloor + TERRAIN_SEPARATOR + oBeech, tForestFloor];
41 const pForestO = [tForestFloor + TERRAIN_SEPARATOR + oOak, tForestFloor];
42 const pForestP = [tForestFloor + TERRAIN_SEPARATOR + oPine, tForestFloor];
44 var heightSeaGround = -4;
45 var heightLand = 3;
47 var g_Map = new RandomMap(heightLand, tGrass);
49 const numPlayers = getNumPlayers();
51 var clPlayer = g_Map.createTileClass();
52 var clHill = g_Map.createTileClass();
53 var clForest = g_Map.createTileClass();
54 var clWater = g_Map.createTileClass();
55 var clDirt = g_Map.createTileClass();
56 var clRock = g_Map.createTileClass();
57 var clMetal = g_Map.createTileClass();
58 var clFood = g_Map.createTileClass();
59 var clBaseResource = g_Map.createTileClass();
61 var treasures = [
62         { "template": oFoodTreasure, "distance": 5 },
63         { "template": oWoodTreasure, "distance": 5 },
64         { "template": oMetalTreasure, "distance": 3 },
65         { "template": oStoneTreasure, "distance": 2 }
68 var [playerIDs, playerPosition] = playerPlacementCircle(fractionToTiles(0.35));
70 g_Map.log("Creating playerbases");
71 var playerAngle = BUILDING_ORIENTATION;
72 for (let i = 0; i < numPlayers; ++i)
74         if (isNomad())
75                 break;
77         // CC and units
78         for (let dist of [6, 8])
79         {
80                 let ents = getStartingEntities(playerIDs[i]);
82                 if (dist == 8)
83                         ents = ents.filter(ent => ent.Template.indexOf("female") != -1 || ent.Template.indexOf("infantry") != -1);
85                 placeStartingEntities(playerPosition[i], playerIDs[i], ents, dist);
86         }
88         // Treasure
89         for (let j = 0; j < treasures.length; ++j)
90                 createObjectGroup(
91                         new SimpleGroup(
92                                 [new SimpleObject(treasures[j].template, treasures[j].distance, treasures[j].distance, 0, 2)],
93                                 false,
94                                 clBaseResource,
95                                 Vector2D.add(playerPosition[i], new Vector2D(10, 0).rotate(-j * Math.PI / 2 - playerAngle))),
96                         0);
98         // Ground texture
99         var civ = getCivCode(playerIDs[i]);
100         var tilesSize = civ == "cart" ? 23 : 21;
101         createArea(
102                 new ConvexPolygonPlacer(
103                         new Array(4).fill(0).map((zero, j) => new Vector2D(tilesSize, 0).rotate(j * Math.PI / 2 - playerAngle - Math.PI/4).add(playerPosition[i])),
104                         Infinity),
105                 [
106                         new TerrainPainter(tRoad),
107                         new TileClassPainter(clPlayer)
108                 ]);
110         // Fortress
111         // To take into account houses that offer a lower population bonus
112         if (Engine.GetTemplate("structures/" + civ + "_house").Cost.PopulationBonus <= 5)
113         {
114                 var wall = ["gate", "tower", "long",
115                         "cornerIn", "long", "barracks", "tower", "long", "tower", "house", "long",
116                         "cornerIn", "long", "house", "tower", "gate", "tower", "house", "long",
117                         "cornerIn", "long", "house", "tower", "long", "tower", "house", "long",
118                         "cornerIn", "long", "house", "tower"];
119         }
120         else
121         {
122                 var wall = ["gate", "tower", "long",
123                         "cornerIn", "long", "barracks", "tower", "long", "tower", "long",
124                         "cornerIn", "long", "house", "tower", "gate", "tower", "long",
125                         "cornerIn", "long", "house", "tower", "long", "tower", "long",
126                         "cornerIn", "long", "house", "tower"];
127         }
128         placeCustomFortress(playerPosition[i], new Fortress("Spahbod", wall), civ, playerIDs[i], playerAngle);
131 g_Map.log("Creating lakes");
132 var numLakes = Math.round(scaleByMapSize(1,4) * numPlayers);
133 var waterAreas = createAreas(
134         new ClumpPlacer(scaleByMapSize(100,250), 0.8, 0.1, Infinity),
135         [
136                 new LayeredPainter([tShore, tWater], [1]),
137                 new SmoothElevationPainter(ELEVATION_SET, heightSeaGround, 3),
138                 new TileClassPainter(clWater)
139         ],
140         avoidClasses(clPlayer, 7, clWater, 20),
141         numLakes);
143 Engine.SetProgress(15);
145 g_Map.log("Creating reeds");
146 createObjectGroupsByAreasDeprecated(
147         new SimpleGroup([new SimpleObject(aReeds, 5,10, 0,4), new SimpleObject(aLillies, 0,1, 0,4)], true),
148         0,
149         [borderClasses(clWater, 3, 0), stayClasses(clWater, 1)],
150         numLakes, 100,
151         waterAreas);
153 Engine.SetProgress(25);
155 g_Map.log("Creating fish");
156 createObjectGroupsByAreasDeprecated(
157         new SimpleGroup(
158                 [new SimpleObject(oFish, 1,1, 0,1)],
159                 true, clFood
160         ),
161         0,
162         [stayClasses(clWater, 4),  avoidClasses(clFood, 8)],
163         numLakes / 4,
164         50,
165         waterAreas);
166 Engine.SetProgress(30);
168 createBumps(avoidClasses(clWater, 2, clPlayer, 5));
169 Engine.SetProgress(35);
171 createHills([tCliff, tCliff, tHill], avoidClasses(clPlayer, 5, clWater, 5, clHill, 15), clHill, scaleByMapSize(1, 4) * numPlayers);
172 Engine.SetProgress(40);
174 g_Map.log("Creating forests");
175 var [forestTrees, stragglerTrees] = getTreeCounts(500, 2500, 0.7);
176 var types = [
177         [[tForestFloor, tGrass, pForestD], [tForestFloor, pForestD]],
178         [[tForestFloor, tGrass, pForestO], [tForestFloor, pForestO]],
179         [[tForestFloor, tGrass, pForestP], [tForestFloor, pForestP]]
181 var size = forestTrees / (scaleByMapSize(3,6) * numPlayers);
182 var num = Math.floor(size / types.length);
183 for (let type of types)
184         createAreas(
185                 new ChainPlacer(1, Math.floor(scaleByMapSize(3, 5)), forestTrees / num, 0.5),
186                 [
187                         new LayeredPainter(type, [2]),
188                         new TileClassPainter(clForest)
189                 ],
190                 avoidClasses(clPlayer, 5, clWater, 3, clForest, 15, clHill, 1),
191                 num);
192 Engine.SetProgress(50);
194 g_Map.log("Creating dirt patches");
195 createLayeredPatches(
196  [scaleByMapSize(3, 6), scaleByMapSize(5, 10), scaleByMapSize(8, 21)],
197  [[tGrass,tGrassA],[tGrassA,tGrassB], [tGrassB,tGrassC]],
198  [1,1],
199  avoidClasses(clWater, 1, clForest, 0, clHill, 0, clDirt, 5, clPlayer, 1),
200  scaleByMapSize(15, 45),
201  clDirt);
202 Engine.SetProgress(55);
204 g_Map.log("Creating grass patches");
205 createPatches(
206  [scaleByMapSize(2, 4), scaleByMapSize(3, 7), scaleByMapSize(5, 15)],
207  tGrassPatch,
208  avoidClasses(clWater, 1, clForest, 0, clHill, 0, clDirt, 5, clPlayer, 1),
209  scaleByMapSize(15, 45),
210  clDirt);
211 Engine.SetProgress(60);
213 g_Map.log("Creating stone mines");
214 createMines(
216   [new SimpleObject(oStoneSmall, 0, 2, 0, 4, 0, 2 * Math.PI, 1), new SimpleObject(oStoneLarge, 1, 1, 0, 4, 0, 2 * Math.PI, 4)],
217   [new SimpleObject(oStoneSmall, 2,5, 1,3)]
218  ],
219  avoidClasses(clWater, 0, clForest, 1, clPlayer, 5, clRock, 10, clHill, 1),
220  clRock);
221 Engine.SetProgress(65);
223 g_Map.log("Creating metal mines");
224 createMines(
226   [new SimpleObject(oMetalLarge, 1,1, 0,4)]
227  ],
228  avoidClasses(clWater, 0, clForest, 1, clPlayer, 5, clMetal, 10, clRock, 5, clHill, 1),
229  clMetal
231 Engine.SetProgress(70);
233 createDecoration(
234         [
235                 [new SimpleObject(aRockMedium, 1, 3, 0, 1)],
236                 [new SimpleObject(aRockLarge, 1, 2, 0, 1), new SimpleObject(aRockMedium, 1, 3, 0, 2)],
237                 [new SimpleObject(aGrassShort, 1, 2, 0, 1)],
238                 [new SimpleObject(aGrass, 2, 4, 0, 1.8), new SimpleObject(aGrassShort, 3, 6, 1.2, 2.5)],
239                 [new SimpleObject(aBushMedium, 1, 2, 0, 2), new SimpleObject(aBushSmall, 2, 4, 0, 2)]
240         ],
241         [
242                 scaleByMapSize(16, 262),
243                 scaleByMapSize(8, 131),
244                 scaleByMapSize(13, 200),
245                 scaleByMapSize(13, 200),
246                 scaleByMapSize(13, 200)
247         ],
248         avoidClasses(clWater, 0, clForest, 0, clPlayer, 1, clHill, 0));
249 Engine.SetProgress(80);
251 createFood(
252         [
253                 [new SimpleObject(oSheep, 2, 3, 0, 2)],
254                 [new SimpleObject(oDeer, 5, 7, 0, 4)]
255         ],
256         [
257                 3 * numPlayers,
258                 3 * numPlayers
259         ],
260         avoidClasses(clWater, 0, clForest, 0, clPlayer, 6, clHill, 1, clFood, 20),
261         clFood);
262 Engine.SetProgress(85);
264 createFood(
265         [
266                 [new SimpleObject(oBerryBush, 5, 7, 0, 4)]
267         ],
268         [
269                 randIntInclusive(1, 4) * numPlayers + 2
270         ],
271         avoidClasses(clWater, 2, clForest, 0, clPlayer, 6, clHill, 1, clFood, 10),
272         clFood);
274 Engine.SetProgress(90);
276 createStragglerTrees(
277         [oOak, oBeech, oPine],
278         avoidClasses(clWater, 1, clForest, 1, clHill, 1, clPlayer, 1, clMetal, 6, clRock, 6),
279         clForest,
280         stragglerTrees);
281 Engine.SetProgress(95);
283 placePlayersNomad(clPlayer, avoidClasses(clWater, 2, clHill, 2, clForest, 1, clMetal, 4, clRock, 4, clHill, 4, clFood, 2));
285 setSkySet("sunny");
286 setWaterColor(0.157, 0.149, 0.443);
287 setWaterTint(0.443,0.42,0.824);
288 setWaterWaviness(2.0);
289 setWaterType("lake");
290 setWaterMurkiness(0.83);
292 setFogFactor(0.35);
293 setFogThickness(0.22);
294 setFogColor(0.82,0.82, 0.73);
295 setPPSaturation(0.56);
296 setPPContrast(0.56);
297 setPPBloom(0.38);
298 setPPEffect("hdr");
300 g_Map.ExportMap();