Nomad mode on all random map scripts (except Survival of the Fittest), fixes #3591.
[0ad.git] / binaries / data / mods / public / maps / random / polar_sea.js
blob01346714998b2bcec339e5c1d5f10e3a672e2520
1 Engine.LoadLibrary("rmgen");
3 var tPrimary = ["polar_snow_a"];
4 var tCliff = ["polar_cliff_a", "polar_cliff_b", "polar_cliff_snow"];
5 var tSecondary = "polar_snow_glacial";
6 var tHalfSnow = ["ice_01", "ice_dirt"];
7 var tSnowLimited = ["polar_snow_b", "polar_ice"];
8 var tDirt = "ice_dirt";
9 var tRoad = "polar_ice_b";
10 var tRoadWild = "polar_ice_cracked";
11 var tShore = "polar_ice_snow";
12 var tWater = "polar_ice_c";
14 var oArcticFox = "gaia/fauna_fox_arctic";
15 var oArcticWolf = "trigger/fauna_arctic_wolf_attack";
16 var oMuskox = "gaia/fauna_muskox";
17 var oWalrus = "gaia/fauna_walrus";
18 var oWhaleFin = "gaia/fauna_whale_fin";
19 var oWhaleHumpback = "gaia/fauna_whale_humpback";
20 var oFish = "gaia/fauna_fish";
21 var oStoneLarge = "gaia/geology_stonemine_medit_quarry";
22 var oStoneSmall = "gaia/geology_stone_alpine_a";
23 var oMetalLarge = "gaia/geology_metal_desert_badlands_slabs";
24 var oWoodTreasure = "gaia/special_treasure_wood";
25 var oMarket = "skirmish/structures/default_market";
27 var aRockLarge = "actor|geology/stone_granite_med.xml";
28 var aRockMedium = "actor|geology/stone_granite_med.xml";
29 var aIceberg = "actor|props/special/eyecandy/iceberg.xml";
31 InitMap();
33 const numPlayers = getNumPlayers();
34 const mapSize = getMapSize();
36 var clPlayer = createTileClass();
37 var clWater = createTileClass();
38 var clDirt = createTileClass();
39 var clRock = createTileClass();
40 var clMetal = createTileClass();
41 var clHill = createTileClass();
42 var clFood = createTileClass();
43 var clBaseResource = createTileClass();
44 var clArcticWolf = createTileClass();
46 var [playerIDs, playerX, playerZ] = playerPlacementCircle(0.35);
48 var treasures = [{
49         "template": oWoodTreasure,
50         "count": isNomad() ? 16 : 14
51 }];
53 log("Creating player markets...");
54 if (!isNomad())
55         for (let i = 0; i < numPlayers; ++i)
56         {
57                 let marketPos = Vector2D.add(new Vector2D(playerX[i], playerZ[i]).mult(mapSize), new Vector2D(12, 0).rotate(randFloat(0, 2 * Math.PI))).round();
58                 placeObject(marketPos.x, marketPos.y, oMarket, playerIDs[i], BUILDING_ORIENTATION);
59                 addCivicCenterAreaToClass(marketPos.x, marketPos.y, clBaseResource);
60         }
62 placePlayerBases({
63         "PlayerPlacement": [playerIDs, playerX, playerZ],
64         "PlayerTileClass": clPlayer,
65         "BaseResourceClass": clBaseResource,
66         "Walls": "towers",
67         "CityPatch": {
68                 "outerTerrain": tRoadWild,
69                 "innerTerrain": tRoad
70         },
71         "Chicken": {
72                 "template": oMuskox
73         },
74         // No berries, no trees, no decoratives
75         "Mines": {
76                 "types": [
77                         { "template": oMetalLarge },
78                         { "template": oStoneLarge }
79                 ]
80         },
81         "Treasures": {
82                 "types": treasures
83         },
84 });
85 Engine.SetProgress(30);
87 log("Creating central lake...");
88 createArea(
89         new ChainPlacer(
90                 2,
91                 Math.floor(scaleByMapSize(5, 16)),
92                 Math.floor(scaleByMapSize(35, 200)),
93                 1,
94                 Math.round(fractionToTiles(0.5)),
95                 Math.round(fractionToTiles(0.5)),
96                 0,
97                 [Math.floor(mapSize * 0.17)]),
98         [
99                 new LayeredPainter([tShore, tWater, tWater, tWater], [1, 4, 2]),
100                 new SmoothElevationPainter(ELEVATION_SET, -4, 4),
101                 paintClass(clWater)
102         ],
103         avoidClasses(clPlayer, 20));
105 paintTerrainBasedOnHeight(3, Math.floor(scaleByMapSize(20, 40)), 0, tCliff);
106 paintTerrainBasedOnHeight(Math.floor(scaleByMapSize(20, 40)), 100, 3, tSnowLimited);
107 Engine.SetProgress(40);
109 log("Creating small lakes...");
110 var lakeAreas = [];
111 var playerConstraint = new AvoidTileClassConstraint(clPlayer, 20);
112 var waterConstraint = new AvoidTileClassConstraint(clWater, 8);
113 for (let x = 0; x < mapSize; ++x)
114         for (let z = 0; z < mapSize; ++z)
115                 if (playerConstraint.allows(x, z) && waterConstraint.allows(x, z))
116                         lakeAreas.push([x, z]);
118 var numLakes = scaleByMapSize(10, 16);
119 for (let i = 0; i < numLakes ; ++i)
121         let chosenPoint = pickRandom(lakeAreas);
122         if (!chosenPoint)
123                 break;
125         createAreas(
126                 new ChainPlacer(
127                         1,
128                         Math.floor(scaleByMapSize(2, 4)),
129                         Math.floor(scaleByMapSize(20, 140)),
130                         0.7,
131                         chosenPoint[0],
132                         chosenPoint[1]),
133                 [
134                         new LayeredPainter([tShore, tWater, tWater], [1, 3]),
135                         new SmoothElevationPainter(ELEVATION_SET, -5, 5),
136                         paintClass(clWater)
137                 ],
138                 avoidClasses(clPlayer, 20),
139                 1,
140                 1);
142 Engine.SetProgress(50);
144 createBumps(avoidClasses(clWater, 2, clPlayer, 20));
145 Engine.SetProgress(60);
147 log("Creating hills...");
148 createHills(
149         [tPrimary, tPrimary, tSecondary],
150         avoidClasses(clPlayer, 20, clHill, 35),
151         clHill, scaleByMapSize(20, 240));
152 Engine.SetProgress(65);
154 log("Creating dirt patches...");
155 createLayeredPatches(
156         [scaleByMapSize(3, 6), scaleByMapSize(5, 10), scaleByMapSize(8, 21)],
157         [[tDirt,tHalfSnow], [tHalfSnow,tSnowLimited]],
158         [2],
159         avoidClasses(clWater, 3, clDirt, 5, clPlayer, 12),
160         scaleByMapSize(15, 45),
161         clDirt);
163 log("Creating glacier patches...");
164 createPatches(
165         [scaleByMapSize(2, 4), scaleByMapSize(3, 7), scaleByMapSize(5, 15)],
166         tSecondary,
167         avoidClasses(clWater, 3, clDirt, 5, clPlayer, 12),
168         scaleByMapSize(15, 45),
169         clDirt);
170 Engine.SetProgress(70);
172 log("Creating stone mines...");
173         createMines(
174         [
175                 [new SimpleObject(oStoneSmall, 0,2, 0,4), new SimpleObject(oStoneLarge, 1,1, 0,4)],
176                 [new SimpleObject(oStoneSmall, 2,5, 1,3)]
177         ],
178         avoidClasses(clWater, 3, clPlayer, 20, clRock, 18, clHill, 2),
179         clRock);
181 log("Creating metal mines...");
182 createMines(
183         [
184                 [new SimpleObject(oMetalLarge, 1,1, 0,4)]
185         ],
186         avoidClasses(clWater, 3, clPlayer, 20, clMetal, 18, clRock, 5, clHill, 2),
187         clMetal);
188 Engine.SetProgress(75);
190 createDecoration(
191         [
192                 [
193                         new SimpleObject(aRockMedium, 1, 3, 0, 1)
194                 ],
195                 [
196                         new SimpleObject(aRockLarge, 1, 2, 0, 1),
197                         new SimpleObject(aRockMedium, 1, 3, 0, 2)
198                 ]
199         ],
200         [
201                 scaleByMapSize(16, 262),
202                 scaleByMapSize(8, 131),
203         ],
204         avoidClasses(clWater, 0, clPlayer, 0));
206 createDecoration(
207         [
208                 [new SimpleObject(aIceberg, 1, 1, 1, 1)]
209         ],
210         [
211                 scaleByMapSize(8, 131)
212         ],
213         [stayClasses(clWater, 4), avoidClasses(clHill, 2)]);
214 Engine.SetProgress(80);
216 createFood(
217         [
218                 [new SimpleObject(oArcticFox, 1, 2, 0, 3)],
219                 [new SimpleObject(isNomad() ? oArcticFox : oArcticWolf, 4, 6, 0, 4)],
220                 [new SimpleObject(oWalrus, 2, 3, 0, 2)],
221                 [new SimpleObject(oMuskox, 2, 3, 0, 2)]
222         ],
223         [
224                 3 * numPlayers,
225                 5 * numPlayers,
226                 5 * numPlayers,
227                 12 * numPlayers
228         ],
229         avoidClasses(clPlayer, 35, clFood, 16, clWater, 2, clMetal, 4, clRock, 4, clHill, 2),
230         clFood);
232 createFood(
233         [
234                 [new SimpleObject(oWhaleFin, 1, 2, 0, 2)],
235                 [new SimpleObject(oWhaleHumpback, 1, 2, 0, 2)]
236         ],
237         [
238                 scaleByMapSize(1, 6) * 3,
239                 scaleByMapSize(1, 6) * 3,
240         ],
241         [avoidClasses(clFood, 20, clHill, 5), stayClasses(clWater, 6)],
242         clFood);
244 createFood(
245         [
246                 [new SimpleObject(oFish, 2, 3, 0, 2)]
247         ],
248         [
249                 100
250         ],
251         [avoidClasses(clFood, 12, clHill, 5), stayClasses(clWater, 6)],
252         clFood);
253 Engine.SetProgress(85);
255 // Create trigger points where wolves spawn
256 createObjectGroupsDeprecated(
257         new SimpleGroup([new SimpleObject("trigger/trigger_point_A", 1, 1, 0, 0)], true, clArcticWolf),
258         0,
259         avoidClasses(clWater, 2, clMetal, 4, clRock, 4, clPlayer, 15, clHill, 2, clArcticWolf, 20),
260         1000,
261         100);
262 Engine.SetProgress(95);
264 if (randBool(1/3))
266         setSkySet("sunset 1");
267         setSunColor(0.8, 0.7, 0.6);
268         setTerrainAmbientColor(0.7, 0.6, 0.7);
269         setUnitsAmbientColor(0.6, 0.5, 0.6);
270         setSunElevation(Math.PI * randFloat(1/24, 1/7));
272 else
274         setSkySet(pickRandom(["cumulus", "rain", "mountainous", "overcast", "rain", "stratus"]));
275         setSunElevation(Math.PI * randFloat(1/9, 1/7));
278 if (isNomad())
280         let constraint = avoidClasses(clWater, 4, clMetal, 4, clRock, 4, clHill, 4, clFood, 2);
281         [playerIDs, playerX, playerZ] = placePlayersNomad(clPlayer, constraint);
283         for (let i = 0; i < numPlayers; ++i)
284                 placePlayerBaseTreasures({
285                         "playerID": playerIDs[i],
286                         "playerX": tilesToFraction(playerX[i]),
287                         "playerZ": tilesToFraction(playerZ[i]),
288                         "BaseResourceClass": clBaseResource,
289                         "baseResourceConstraint": constraint,
290                         "types": treasures
291                 });
294 setSunRotation(randFloat(0, 2 * Math.PI));
296 setWaterColor(0.3, 0.3, 0.4);
297 setWaterTint(0.75, 0.75, 0.75);
298 setWaterMurkiness(0.92);
299 setWaterWaviness(0.5);
300 setWaterType("clap");
302 setFogThickness(0.76);
303 setFogFactor(0.7);
305 setPPEffect("hdr");
306 setPPContrast(0.6);
307 setPPSaturation(0.45);
308 setPPBloom(0.4);
310 ExportMap();