Invincible women on survival of the fittest to prevent women fights and cheap tower...
[0ad.git] / binaries / data / mods / public / maps / random / northern_lights.js
blob01e991fa0e26b9882a63879ee41f2fc3b5f316d9
1 RMS.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 // gaia entities
17 const oPine = "gaia/flora_tree_pine_w";
18 const oStoneLarge = "gaia/geology_stonemine_alpine_quarry";
19 const oStoneSmall = "gaia/geology_stone_alpine_a";
20 const oMetalLarge = "gaia/geology_metal_alpine_slabs";
21 const oFish = "gaia/fauna_fish";
22 const oWalrus = "gaia/fauna_walrus";
23 const oWolf = "gaia/fauna_wolf_snow";
25 // decorative props
26 const aRockLarge = "actor|geology/stone_granite_med.xml";
27 const aRockMedium = "actor|geology/stone_granite_med.xml";
28 const aIceberg = "actor|props/special/eyecandy/iceberg.xml";
30 const pForestD = [tForestFloor + TERRAIN_SEPARATOR + oPine, tForestFloor, tForestFloor];
31 const pForestS = [tForestFloor + TERRAIN_SEPARATOR + oPine, tForestFloor, tForestFloor, tForestFloor];
33 log("Initializing map...");
35 InitMap();
37 const numPlayers = getNumPlayers();
38 const mapSize = getMapSize();
39 const mapArea = mapSize*mapSize;
41 // create tile classes
43 var clPlayer = createTileClass();
44 var clHill = createTileClass();
45 var clHill2 = createTileClass();
46 var clHill3 = createTileClass();
47 var clHill4 = createTileClass();
48 var clForest = createTileClass();
49 var clWater = createTileClass();
50 var clDirt = createTileClass();
51 var clRock = createTileClass();
52 var clMetal = createTileClass();
53 var clFood = createTileClass();
54 var clBaseResource = createTileClass();
55 var clSettlement = createTileClass();
58 // randomize player order
59 var playerIDs = [];
60 for (var i = 0; i < numPlayers; i++)
62         playerIDs.push(i+1);
64 playerIDs = sortPlayers(playerIDs);
66 // place players
68 var playerX = new Array(numPlayers);
69 var playerZ = new Array(numPlayers);
70 var playerPos = new Array(numPlayers);
72 for (var i = 0; i < numPlayers; i++)
74         playerPos[i] = (i + 1) / (numPlayers + 1);
75         playerX[i] = playerPos[i];
76         playerZ[i] = 0.35 + 0.2*(i%2);
79 for (var i = 0; i < numPlayers; i++)
81         var id = playerIDs[i];
82         log("Creating base for player " + id + "...");
84         // some constants
85         var radius = scaleByMapSize(15,25);
86         var cliffRadius = 2;
87         var elevation = 20;
89         // get the x and z in tiles
90         var fx = fractionToTiles(playerX[i]);
91         var fz = fractionToTiles(playerZ[i]);
92         var ix = round(fx);
93         var iz = round(fz);
94         addToClass(ix, iz, clPlayer);
95         addToClass(ix+5, iz, clPlayer);
96         addToClass(ix, iz+5, clPlayer);
97         addToClass(ix-5, iz, clPlayer);
98         addToClass(ix, iz-5, clPlayer);
100         // create the city patch
101         var cityRadius = radius/3;
102         var placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz);
103         var painter = new LayeredPainter([tRoadWild, tRoad], [1]);
104         createArea(placer, painter, null);
106         // create starting units
107         placeCivDefaultEntities(fx, fz, id);
109         // create metal mine
110         var bbAngle = randFloat(0, TWO_PI);
111         var bbDist = 12;
112         var bbX = round(fx + bbDist * cos(bbAngle));
113         var bbZ = round(fz + bbDist * sin(bbAngle));
114         var mAngle = bbAngle;
115         while(abs(mAngle - bbAngle) < PI/3)
116         {
117                 mAngle = randFloat(0, TWO_PI);
118         }
119         var mDist = 12;
120         var mX = round(fx + mDist * cos(mAngle));
121         var mZ = round(fz + mDist * sin(mAngle));
122         var group = new SimpleGroup(
123                 [new SimpleObject(oMetalLarge, 1,1, 0,0)],
124                 true, clBaseResource, mX, mZ
125         );
126         createObjectGroup(group, 0);
128         // create stone mines
129         mAngle += randFloat(PI/8, PI/4);
130         mX = round(fx + mDist * cos(mAngle));
131         mZ = round(fz + mDist * sin(mAngle));
132         group = new SimpleGroup(
133                 [new SimpleObject(oStoneLarge, 1,1, 0,2)],
134                 true, clBaseResource, mX, mZ
135         );
136         createObjectGroup(group, 0);
137         var hillSize = PI * radius * radius;
138         // create starting trees
139         var num = floor(hillSize / 60);
140         var tAngle = randFloat(-PI/3, 4*PI/3);
141         var tDist = randFloat(12, 13);
142         var tX = round(fx + tDist * cos(tAngle));
143         var tZ = round(fz + tDist * sin(tAngle));
144         group = new SimpleGroup(
145                 [new SimpleObject(oPine, num, num, 0,3)],
146                 false, clBaseResource, tX, tZ
147         );
148         createObjectGroup(group, 0, avoidClasses(clBaseResource,2));
152 RMS.SetProgress(15);
154 // create northern sea
155 var fadedistance = 8;
157 for (var ix = 0; ix < mapSize; ix++)
159         for (var iz = 0; iz < mapSize; iz++)
160         {
162                 if (iz > 0.69 * mapSize)
163                 {
164                         if (iz < 0.69 * mapSize + fadedistance)
165                         {
166                                 setHeight(ix, iz, 3 - 8 * (iz - 0.69 * mapSize) / fadedistance);
167                                 if (ix, iz, 3 - 8 * (iz - 0.69 * mapSize) / fadedistance < 0.5)
168                                         addToClass(ix, iz, clWater);
169                         }
170                         else
171                         {
172                                 setHeight(ix, iz, -5);
173                                 addToClass(ix, iz, clWater);
174                         }
175                 }
176         }
179 // create shore
180 log("Creating shores...");
181 for (var i = 0; i < scaleByMapSize(20,120); i++)
183         placer = new ChainPlacer(1, floor(scaleByMapSize(4, 6)), floor(scaleByMapSize(16, 30)), 1, floor(randFloat(0.1,0.9)*mapSize), floor(randFloat(0.67,0.74)*mapSize));
184         var terrainPainter = new LayeredPainter(
185                 [tSnowA, tSnowA],               // terrains
186                 [2]                                                             // widths
187         );
188         var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 3, 3);
189         createArea(
190                 placer,
191                 [terrainPainter, elevationPainter, unPaintClass(clWater)],
192                 null
193         );
196 // create islands
197 log("Creating islands...");
198 placer = new ChainPlacer(1, floor(scaleByMapSize(4, 6)), floor(scaleByMapSize(16, 40)), 0.1);
199 var terrainPainter = new LayeredPainter(
200         [tSnowA, tSnowA],               // terrains
201         [3]                                                             // widths
203 var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 3, 3);
204 createAreas(
205         placer,
206         [terrainPainter, elevationPainter, unPaintClass(clWater)],
207         stayClasses(clWater, 7),
208         scaleByMapSize(10, 80)
211 paintTerrainBasedOnHeight(-6, 1, 1, tWater);
213 // create lakes
214 log("Creating lakes...");
215 var numLakes = round(scaleByMapSize(1,4) * numPlayers);
216 var placer = new ChainPlacer(1, floor(scaleByMapSize(5, 7)), floor(scaleByMapSize(20, 50)), 0.1);
217 var terrainPainter = new LayeredPainter(
218         [tShoreBlend, tShore, tWater],          // terrains
219         [1,1]                                                   // widths
221 var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, -4, 3);
222 var waterAreas = createAreas(
223         placer,
224         [terrainPainter, elevationPainter, paintClass(clWater)],
225         avoidClasses(clPlayer, 20, clWater, 20),
226         numLakes
229 paintTerrainBasedOnHeight(1, 2.8, 1, tShoreBlend);
230 paintTileClassBasedOnHeight(-6, 0.5, 1, clWater);
232 RMS.SetProgress(45);
234 // create hills
235 log("Creating hills...");
236 placer = new ChainPlacer(1, floor(scaleByMapSize(4, 6)), floor(scaleByMapSize(16, 40)), 0.1);
237 var terrainPainter = new LayeredPainter(
238         [tCliff, tSnowA],               // terrains
239         [3]                                                             // widths
241 var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 25, 3);
242 createAreas(
243         placer,
244         [terrainPainter, elevationPainter, paintClass(clHill)],
245         avoidClasses(clPlayer, 20, clHill, 15, clWater, 2, clBaseResource, 2),
246         scaleByMapSize(1, 4) * numPlayers
250 // calculate desired number of trees for map (based on size)
252 var MIN_TREES = 100;
253 var MAX_TREES = 625;
254 var P_FOREST = 0.7;
256 var totalTrees = scaleByMapSize(MIN_TREES, MAX_TREES);
257 var numForest = totalTrees * P_FOREST;
258 var numStragglers = totalTrees * (1.0 - P_FOREST);
260 // create forests
261 log("Creating forests...");
262 var types = [
263         [[tSnowA, tSnowA, tSnowA, tSnowA, pForestD], [tSnowA, tSnowA, tSnowA, pForestD]],
264         [[tSnowA, tSnowA, tSnowA, tSnowA, pForestS], [tSnowA, tSnowA, tSnowA, pForestS]]
265 ];      // some variation
268 var size = numForest / (scaleByMapSize(3,6) * numPlayers);
270 var num = floor(size / types.length);
271 for (var i = 0; i < types.length; ++i)
273         placer = new ChainPlacer(1, floor(scaleByMapSize(3, 5)), numForest / (num * floor(scaleByMapSize(2,4))), 1);
274         painter = new LayeredPainter(
275                 types[i],               // terrains
276                 [2]                                                                                     // widths
277                 );
278         createAreas(
279                 placer,
280                 [painter, paintClass(clForest)],
281                 avoidClasses(clPlayer, 20, clForest, 20, clHill, 0, clWater, 8),
282                 num
283         );
286 log("Creating iceberg...");
287 // create iceberg
288 group = new SimpleGroup([new SimpleObject(aIceberg, 0,2, 0,4)], true, clRock);
289 createObjectGroups(group, 0,
290         [avoidClasses(clRock, 4), stayClasses(clWater, 4)],
291         scaleByMapSize(4,16), 100
294 RMS.SetProgress(70);
296 // create dirt patches
297 log("Creating dirt patches...");
298 var sizes = [scaleByMapSize(3, 6), scaleByMapSize(5, 10), scaleByMapSize(8, 21)];
299 for (var i = 0; i < sizes.length; i++)
301         placer = new ChainPlacer(1, floor(scaleByMapSize(3, 5)), sizes[i], 0.5);
302         painter = new LayeredPainter(
303                 [tSnowD,tSnowB,tSnowC],                 // terrains
304                 [2,1]                                                                                                                   // widths
305         );
306         createAreas(
307                 placer,
308                 [painter, paintClass(clDirt)],
309                 avoidClasses(clWater, 8, clForest, 0, clHill, 0, clPlayer, 20, clDirt, 16),
310                 scaleByMapSize(20, 80)
311         );
313 var sizes = [scaleByMapSize(2, 4), scaleByMapSize(3, 7), scaleByMapSize(5, 15)];
314 for (var i = 0; i < sizes.length; i++)
316         placer = new ChainPlacer(1, floor(scaleByMapSize(3, 5)), sizes[i], 0.5);
317         painter = new LayeredPainter(
318                 [tSnowE,tSnowE],                // terrains
319                 [1]                                                                                                                     // widths
320         );
321         createAreas(
322                 placer,
323                 [painter, paintClass(clDirt)],
324                 avoidClasses(clWater, 8, clForest, 0, clHill, 0, clPlayer, 20, clDirt, 16),
325                 scaleByMapSize(20, 80)
326         );
329 log("Creating stone mines...");
330 // create large stone quarries
331 group = new SimpleGroup([new SimpleObject(oStoneSmall, 0,2, 0,4), new SimpleObject(oStoneLarge, 1,1, 0,4)], true, clRock);
332 createObjectGroups(group, 0,
333         avoidClasses(clWater, 3, clForest, 1, clPlayer, 20, clRock, 10, clHill, 1),
334         scaleByMapSize(8,32), 100
337 // create small stone quarries
338 group = new SimpleGroup([new SimpleObject(oStoneSmall, 2,5, 1,3)], true, clRock);
339 createObjectGroups(group, 0,
340         avoidClasses(clWater, 3, clForest, 1, clPlayer, 20, clRock, 10, clHill, 1),
341         scaleByMapSize(8,32), 100
344 log("Creating metal mines...");
345 // create large metal quarries
346 group = new SimpleGroup([new SimpleObject(oMetalLarge, 1,1, 0,4)], true, clMetal);
347 createObjectGroups(group, 0,
348         avoidClasses(clWater, 3, clForest, 1, clPlayer, 20, clMetal, 10, clRock, 5, clHill, 1),
349         scaleByMapSize(8,32), 100
353 RMS.SetProgress(95);
355 // create straggler trees
356 log("Creating straggler trees...");
357 var types = [oPine];    // some variation
358 var num = floor(numStragglers / types.length);
359 for (var i = 0; i < types.length; ++i)
361         group = new SimpleGroup(
362                 [new SimpleObject(types[i], 1,1, 0,3)],
363                 true, clForest
364         );
365         createObjectGroups(group, 0,
366                 avoidClasses(clWater, 5, clForest, 1, clHill, 1, clPlayer, 12, clMetal, 1, clRock, 1),
367                 num
368         );
371 // create deer
372 log("Creating deer...");
373 group = new SimpleGroup(
374         [new SimpleObject(oWalrus, 5,7, 0,4)],
375         true, clFood
377 createObjectGroups(group, 0,
378         avoidClasses(clWater, 3, clForest, 0, clPlayer, 20, clHill, 1, clFood, 20),
379         3 * numPlayers, 50
382 RMS.SetProgress(75);
384 // create sheep
385 log("Creating sheep...");
386 group = new SimpleGroup(
387         [new SimpleObject(oWolf, 2,3, 0,2)],
388         true, clFood
390 createObjectGroups(group, 0,
391         avoidClasses(clWater, 3, clForest, 0, clPlayer, 20, clHill, 1, clFood, 20),
392         3 * numPlayers, 50
395 // create fish
396 log("Creating fish...");
397 group = new SimpleGroup(
398         [new SimpleObject(oFish, 2,3, 0,2)],
399         true, clFood
401 createObjectGroups(group, 0,
402         [avoidClasses(clFood, 20), stayClasses(clWater, 6)],
403         25 * numPlayers, 60
406 setSunColor(0.6, 0.6, 0.6);
407 setSunElevation(PI/ 6);
409 setWaterColor(0.02, 0.17, 0.52);
410 setWaterTint(0.494, 0.682, 0.808);
411 setWaterMurkiness(0.82);
412 setWaterWaviness(0.5);
413 setWaterType("ocean");
415 setFogFactor(0.95);
416 setFogThickness(0.09);
417 setPPSaturation(0.28);
418 setPPEffect("hdr");
420 setSkySet("fog");
421 ExportMap();