Nomad mode on all random map scripts (except Survival of the Fittest), fixes #3591.
[0ad.git] / binaries / data / mods / public / maps / random / northern_lights.js
blob5c263e007b445d2ab80048aa5089baf1d28efd30
1 Engine.LoadLibrary("rmgen");
3 const tSnowA = ["polar_snow_b"];
4 const tSnowB = "polar_ice_snow";
5 const tSnowC = "polar_ice";
6 const tSnowD = "polar_snow_a";
7 const tForestFloor = "polar_tundra_snow";
8 const tCliff = "polar_snow_rocks";
9 const tSnowE = ["polar_snow_glacial"];
10 const tRoad = "new_alpine_citytile";
11 const tRoadWild = "new_alpine_citytile";
12 const tShoreBlend = "alpine_shore_rocks_icy";
13 const tShore = "alpine_shore_rocks";
14 const tWater = "alpine_shore_rocks";
16 const oPine = "gaia/flora_tree_pine_w";
17 const oStoneLarge = "gaia/geology_stonemine_alpine_quarry";
18 const oStoneSmall = "gaia/geology_stone_alpine_a";
19 const oMetalLarge = "gaia/geology_metal_alpine_slabs";
20 const oFish = "gaia/fauna_fish";
21 const oWalrus = "gaia/fauna_walrus";
22 const oArcticWolf = "gaia/fauna_arctic_wolf";
24 const aIceberg = "actor|props/special/eyecandy/iceberg.xml";
26 const pForestD = [tForestFloor + TERRAIN_SEPARATOR + oPine, tForestFloor, tForestFloor];
27 const pForestS = [tForestFloor + TERRAIN_SEPARATOR + oPine, tForestFloor, tForestFloor, tForestFloor];
29 InitMap();
31 const numPlayers = getNumPlayers();
32 const mapSize = getMapSize();
34 var clPlayer = createTileClass();
35 var clHill = createTileClass();
36 var clForest = createTileClass();
37 var clWater = createTileClass();
38 var clIsland = createTileClass();
39 var clDirt = createTileClass();
40 var clRock = createTileClass();
41 var clMetal = createTileClass();
42 var clFood = createTileClass();
43 var clBaseResource = createTileClass();
45 placePlayerBases({
46         "PlayerPlacement": playerPlacementLine(true, 0.45, 0.2),
47         "PlayerTileClass": clPlayer,
48         "BaseResourceClass": clBaseResource,
49         "CityPatch": {
50                 "outerTerrain": tRoadWild,
51                 "innerTerrain": tRoad
52         },
53         // No chicken, no berries
54         "Mines": {
55                 "types": [
56                         { "template": oMetalLarge },
57                         { "template": oStoneLarge }
58                 ]
59         },
60         "Trees": {
61                 "template": oPine,
62                 "count": scaleByMapSize(12, 30),
63         }
64         // No decoratives
65 });
66 Engine.SetProgress(15);
68 paintRiver({
69         "parallel": true,
70         "startX": 0,
71         "startZ": 1,
72         "endX": 1,
73         "endZ": 1,
74         "width": 0.62,
75         "fadeDist": tilesToFraction(8),
76         "deviation": 0,
77         "waterHeight": -5,
78         "landHeight": 3,
79         "meanderShort": 0,
80         "meanderLong": 0,
81         "waterFunc": (ix, iz, height, riverFraction) => {
82                 addToClass(ix, iz, clWater);
83         },
84         "landFunc": (ix, iz, shoreDist1, shoreDist2) => {
85                 if (getHeight(ix, iz) < 0.5)
86                         addToClass(ix, iz, clWater);
87         }
88 });
90 log("Creating shores...");
91 for (var i = 0; i < scaleByMapSize(20,120); i++)
92         createArea(
93                 new ChainPlacer(
94                         1,
95                         Math.floor(scaleByMapSize(4, 6)),
96                         Math.floor(scaleByMapSize(16, 30)),
97                         1,
98                         randIntExclusive(0.1 * mapSize, 0.9 * mapSize),
99                         randIntExclusive(0.67 * mapSize, 0.74 * mapSize)),
100                 [
101                         new LayeredPainter([tSnowA, tSnowA], [2]),
102                         new SmoothElevationPainter(ELEVATION_SET, 3, 3), unPaintClass(clWater)
103                 ],
104                 null);
106 log("Creating islands...");
107 createAreas(
108         new ChainPlacer(1, Math.floor(scaleByMapSize(4, 6)), Math.floor(scaleByMapSize(16, 40)), 0.1),
109         [
110                 new LayeredPainter([tSnowA, tSnowA], [3]),
111                 new SmoothElevationPainter(ELEVATION_SET, 3, 3),
112                 paintClass(clIsland),
113                 unPaintClass(clWater)
114         ],
115         stayClasses(clWater, 7),
116         scaleByMapSize(10, 80)
119 paintTerrainBasedOnHeight(-6, 1, 1, tWater);
121 log("Creating lakes...");
122 createAreas(
123         new ChainPlacer(1, Math.floor(scaleByMapSize(5, 7)), Math.floor(scaleByMapSize(20, 50)), 0.1),
124         [
125                 new LayeredPainter([tShoreBlend, tShore, tWater], [1, 1]),
126                 new SmoothElevationPainter(ELEVATION_SET, -4, 3),
127                 paintClass(clWater)
128         ],
129         avoidClasses(clPlayer, 20, clWater, 20),
130         Math.round(scaleByMapSize(1, 4) * numPlayers));
132 paintTerrainBasedOnHeight(1, 2.8, 1, tShoreBlend);
133 paintTileClassBasedOnHeight(-6, 0.5, 1, clWater);
135 Engine.SetProgress(45);
137 log("Creating hills...");
138 createAreas(
139         new ChainPlacer(1, Math.floor(scaleByMapSize(4, 6)), Math.floor(scaleByMapSize(16, 40)), 0.1),
140         [
141                 new LayeredPainter([tCliff, tSnowA], [3]),
142                 new SmoothElevationPainter(ELEVATION_SET, 25, 3),
143                 paintClass(clHill)
144         ],
145         avoidClasses(clPlayer, 20, clHill, 15, clWater, 2, clBaseResource, 2),
146         scaleByMapSize(1, 4) * numPlayers
149 log("Creating forests...");
150 var [forestTrees, stragglerTrees] = getTreeCounts(100, 625, 0.7);
151 var types = [
152         [[tSnowA, tSnowA, tSnowA, tSnowA, pForestD], [tSnowA, tSnowA, tSnowA, pForestD]],
153         [[tSnowA, tSnowA, tSnowA, tSnowA, pForestS], [tSnowA, tSnowA, tSnowA, pForestS]]
156 var size = forestTrees / (scaleByMapSize(3,6) * numPlayers);
158 var num = Math.floor(size / types.length);
159 for (let type of types)
160         createAreas(
161                 new ChainPlacer(1, Math.floor(scaleByMapSize(3, 5)), forestTrees / (num * Math.floor(scaleByMapSize(2, 4))), 1),
162                 [
163                         new LayeredPainter(type, [2]),
164                         paintClass(clForest)
165                 ],
166                 avoidClasses(clPlayer, 20, clForest, 20, clHill, 0, clWater, 8),
167                 num);
169 log("Creating iceberg...");
170 createObjectGroupsDeprecated(
171         new SimpleGroup([new SimpleObject(aIceberg, 0, 2, 0, 4)], true, clRock),
172         0,
173         [avoidClasses(clRock, 6), stayClasses(clWater, 4)],
174         scaleByMapSize(4, 16),
175         100);
176 Engine.SetProgress(70);
178 log("Creating dirt patches...");
179 for (let size of [scaleByMapSize(3, 6), scaleByMapSize(5, 10), scaleByMapSize(8, 21)])
180         createAreas(
181                 new ChainPlacer(1, Math.floor(scaleByMapSize(3, 5)), size, 0.5),
182                 [
183                         new LayeredPainter([tSnowD, tSnowB, tSnowC], [2, 1]),
184                         paintClass(clDirt)
185                 ],
186                 avoidClasses(
187                         clWater, 8,
188                         clForest, 0,
189                         clHill, 0,
190                         clPlayer, 20,
191                         clDirt, 16),
192                 scaleByMapSize(20, 80));
194 for (let size of [scaleByMapSize(2, 4), scaleByMapSize(3, 7), scaleByMapSize(5, 15)])
195         createAreas(
196                 new ChainPlacer(1, Math.floor(scaleByMapSize(3, 5)), size, 0.5),
197                 [
198                         new LayeredPainter([tSnowE, tSnowE], [1]),
199                         paintClass(clDirt)
200                 ],
201                 avoidClasses(
202                         clWater, 8,
203                         clForest, 0,
204                         clHill, 0,
205                         clPlayer, 20,
206                         clDirt, 16),
207                 scaleByMapSize(20, 80));
209 log("Creating stone mines...");
210 var group = new SimpleGroup([new SimpleObject(oStoneSmall, 0, 2, 0, 4), new SimpleObject(oStoneLarge, 1, 1, 0, 4)], true, clRock);
211 createObjectGroupsDeprecated(group, 0,
212         avoidClasses(clWater, 3, clForest, 1, clPlayer, 20, clRock, 10, clHill, 1),
213         scaleByMapSize(8,32), 100
216 log("Creating small stone quarries...");
217 group = new SimpleGroup([new SimpleObject(oStoneSmall, 2,5, 1,3)], true, clRock);
218 createObjectGroupsDeprecated(group, 0,
219         avoidClasses(clWater, 3, clForest, 1, clPlayer, 20, clRock, 10, clHill, 1),
220         scaleByMapSize(8,32), 100
223 log("Creating metal mines...");
224 group = new SimpleGroup([new SimpleObject(oMetalLarge, 1,1, 0,4)], true, clMetal);
225 createObjectGroupsDeprecated(group, 0,
226         avoidClasses(clWater, 3, clForest, 1, clPlayer, 20, clMetal, 10, clRock, 5, clHill, 1),
227         scaleByMapSize(8,32), 100
229 Engine.SetProgress(95);
231 createStragglerTrees(
232         [oPine],
233         avoidClasses(clWater, 5, clForest, 1, clHill, 1, clPlayer, 12, clMetal, 6, clRock, 6),
234         clForest,
235         stragglerTrees);
237 log("Creating deer...");
238 group = new SimpleGroup(
239         [new SimpleObject(oWalrus, 5,7, 0,4)],
240         true, clFood
242 createObjectGroupsDeprecated(group, 0,
243         avoidClasses(clWater, 3, clForest, 0, clPlayer, 20, clHill, 1, clFood, 20),
244         3 * numPlayers, 50
247 Engine.SetProgress(75);
249 log("Creating sheep...");
250 group = new SimpleGroup(
251         [new SimpleObject(oArcticWolf, 2,3, 0,2)],
252         true, clFood
254 createObjectGroupsDeprecated(group, 0,
255         avoidClasses(clWater, 3, clForest, 0, clPlayer, 20, clHill, 1, clFood, 20),
256         3 * numPlayers, 50
259 log("Creating fish...");
260 group = new SimpleGroup(
261         [new SimpleObject(oFish, 2,3, 0,2)],
262         true, clFood
264 createObjectGroupsDeprecated(group, 0,
265         [avoidClasses(clFood, 20), stayClasses(clWater, 6)],
266         25 * numPlayers, 60
269 placePlayersNomad(clPlayer, avoidClasses(clWater, 4, clForest, 1, clMetal, 4, clRock, 4, clHill, 4, clFood, 2, clIsland, 4));
271 setSunColor(0.6, 0.6, 0.6);
272 setSunElevation(Math.PI/ 6);
274 setWaterColor(0.02, 0.17, 0.52);
275 setWaterTint(0.494, 0.682, 0.808);
276 setWaterMurkiness(0.82);
277 setWaterWaviness(0.5);
278 setWaterType("ocean");
280 setFogFactor(0.95);
281 setFogThickness(0.09);
282 setPPSaturation(0.28);
283 setPPEffect("hdr");
285 setSkySet("fog");
286 ExportMap();