Invincible women on survival of the fittest to prevent women fights and cheap tower...
[0ad.git] / binaries / data / mods / public / maps / random / gear.js
blob53742bcf9a61efa95fe53580ce1a46e0d537b07c
1 RMS.LoadLibrary("rmgen");
3 TILE_CENTERED_HEIGHT_MAP = true;
5 //random terrain textures
6 var random_terrain = randomizeBiome();
8 const tMainTerrain = rBiomeT1();
9 const tForestFloor1 = rBiomeT2();
10 const tForestFloor2 = rBiomeT3();
11 const tCliff = rBiomeT4();
12 const tTier1Terrain = rBiomeT5();
13 const tTier2Terrain = rBiomeT6();
14 const tTier3Terrain = rBiomeT7();
15 const tHill = rBiomeT1();
16 const tDirt = rBiomeT9();
17 const tRoad = rBiomeT10();
18 const tRoadWild = rBiomeT11();
19 const tTier4Terrain = rBiomeT12();
20 const tShoreBlend = rBiomeT13();
21 const tShore = rBiomeT14();
22 const tWater = rBiomeT15();
24 // gaia entities
25 const oTree1 = rBiomeE1();
26 const oTree2 = rBiomeE2();
27 const oTree3 = rBiomeE3();
28 const oTree4 = rBiomeE4();
29 const oTree5 = rBiomeE5();
30 const oFruitBush = rBiomeE6();
31 const oMainHuntableAnimal = rBiomeE8();
32 const oFish = rBiomeE9();
33 const oSecondaryHuntableAnimal = rBiomeE10();
34 const oStoneLarge = rBiomeE11();
35 const oStoneSmall = rBiomeE12();
36 const oMetalLarge = rBiomeE13();
38 // decorative props
39 const aGrass = rBiomeA1();
40 const aGrassShort = rBiomeA2();
41 const aReeds = rBiomeA3();
42 const aLillies = rBiomeA4();
43 const aRockLarge = rBiomeA5();
44 const aRockMedium = rBiomeA6();
45 const aBushMedium = rBiomeA7();
46 const aBushSmall = rBiomeA8();
48 const pForest1 = [tForestFloor2 + TERRAIN_SEPARATOR + oTree1, tForestFloor2 + TERRAIN_SEPARATOR + oTree2, tForestFloor2];
49 const pForest2 = [tForestFloor1 + TERRAIN_SEPARATOR + oTree4, tForestFloor1 + TERRAIN_SEPARATOR + oTree5, tForestFloor1];
51 log("Initializing map...");
53 InitMap();
55 const numPlayers = getNumPlayers();
56 const mapSize = getMapSize();
57 const mapArea = mapSize*mapSize;
59 log(mapSize);
61 // create tile classes
63 var clPlayer = createTileClass();
64 var clHill = createTileClass();
65 var clForest = createTileClass();
66 var clWater = createTileClass();
67 var clDirt = createTileClass();
68 var clRock = createTileClass();
69 var clMetal = createTileClass();
70 var clFood = createTileClass();
71 var clBaseResource = createTileClass();
72 var clSettlement = createTileClass();
73 var clLand = createTileClass();
75 for (var ix = 0; ix < mapSize; ix++)
76         for (var iz = 0; iz < mapSize; iz++)
77                 placeTerrain(ix, iz, tMainTerrain);
79 var fx = fractionToTiles(0.5);
80 var fz = fractionToTiles(0.5);
81 var ix = round(fx);
82 var iz = round(fz);
84 var lSize = sqrt(sqrt(sqrt(scaleByMapSize(1, 8))));
86 var placer = new ClumpPlacer(mapArea * 0.23, 1, 1, 10, ix, iz);
87 var terrainPainter = new LayeredPainter(
88         [tShore, tWater, tWater, tWater],               // terrains
89         [1, 4, 2]               // widths
91 var elevationPainter = new SmoothElevationPainter(
92         ELEVATION_SET,                  // type
93         -3,                             // elevation
94         4                               // blend radius
96 createArea(placer, [terrainPainter, elevationPainter, paintClass(clWater)], null);
98 // randomize player order
99 var playerIDs = [];
100 for (var i = 0; i < numPlayers; i++)
101         playerIDs.push(i+1);
103 playerIDs = sortPlayers(playerIDs);
105 // place players
106 var playerX = new Array(numPlayers);
107 var playerZ = new Array(numPlayers);
108 var playerAngle = new Array(numPlayers);
110 var startAngle = randFloat(0, TWO_PI);
111 for (var i = 0; i < numPlayers; i++)
113         playerAngle[i] = startAngle + i*TWO_PI/numPlayers;
114         playerX[i] = 0.5 + 0.35*cos(playerAngle[i]);
115         playerZ[i] = 0.5 + 0.35*sin(playerAngle[i]);
118 for (var i = 0; i < numPlayers; i++)
120         var id = playerIDs[i];
121         log("Creating base for player " + id + "...");
123         // some constants
124         var radius = scaleByMapSize(15,25);
125         var cliffRadius = 2;
126         var elevation = 20;
128         // get the x and z in tiles
129         fx = fractionToTiles(playerX[i]);
130         fz = fractionToTiles(playerZ[i]);
131         ix = round(fx);
132         iz = round(fz);
133         addToClass(ix, iz, clPlayer);
134         addToClass(ix+5, iz, clPlayer);
135         addToClass(ix, iz+5, clPlayer);
136         addToClass(ix-5, iz, clPlayer);
137         addToClass(ix, iz-5, clPlayer);
139         // create the city patch
140         var cityRadius = radius/3;
141         placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz);
142         var painter = new LayeredPainter([tRoadWild, tRoad], [1]);
143         createArea(placer, painter, null);
145         placeCivDefaultEntities(fx, fz, id, { 'iberWall': 'towers' });
147         placeDefaultChicken(fx, fz, clBaseResource);
149         // create berry bushes
150         var bbAngle = randFloat(0, TWO_PI);
151         var bbDist = 12;
152         var bbX = round(fx + bbDist * cos(bbAngle));
153         var bbZ = round(fz + bbDist * sin(bbAngle));
154         var group = new SimpleGroup(
155                 [new SimpleObject(oFruitBush, 5,5, 0,3)],
156                 true, clBaseResource, bbX, bbZ
157         );
158         createObjectGroup(group, 0);
160         // create metal mine
161         var mAngle = bbAngle;
162         while(abs(mAngle - bbAngle) < PI/3)
163                 mAngle = randFloat(0, TWO_PI);
165         var mDist = 12;
166         var mX = round(fx + mDist * cos(mAngle));
167         var mZ = round(fz + mDist * sin(mAngle));
168         group = new SimpleGroup(
169                 [new SimpleObject(oMetalLarge, 1,1, 0,0)],
170                 true, clBaseResource, mX, mZ
171         );
172         createObjectGroup(group, 0);
174         // create stone mines
175         mAngle += randFloat(PI/8, PI/4);
176         mX = round(fx + mDist * cos(mAngle));
177         mZ = round(fz + mDist * sin(mAngle));
178         group = new SimpleGroup(
179                 [new SimpleObject(oStoneLarge, 1,1, 0,2)],
180                 true, clBaseResource, mX, mZ
181         );
182         createObjectGroup(group, 0);
183         var hillSize = PI * radius * radius;
184         // create starting trees
185         var num = 2;
186         var tAngle = randFloat(0, TWO_PI);
187         var tDist = randFloat(12, 13);
188         var tX = round(fx + tDist * cos(tAngle));
189         var tZ = round(fz + tDist * sin(tAngle));
190         group = new SimpleGroup(
191                 [new SimpleObject(oTree1, num, num, 0,3)],
192                 false, clBaseResource, tX, tZ
193         );
194         createObjectGroup(group, 0, avoidClasses(clBaseResource,2));
196         // create grass tufts
197         var num = hillSize / 250;
198         for (var j = 0; j < num; j++)
199         {
200                 var gAngle = randFloat(0, TWO_PI);
201                 var gDist = radius - (5 + randInt(7));
202                 var gX = round(fx + gDist * cos(gAngle));
203                 var gZ = round(fz + gDist * sin(gAngle));
204                 group = new SimpleGroup(
205                         [new SimpleObject(aGrassShort, 2,5, 0,1, -PI/8,PI/8)],
206                         false, clBaseResource, gX, gZ
207                 );
208                 createObjectGroup(group, 0);
209         }
212 RMS.SetProgress(20);
214 var split = 1;
215 if (mapSize == 128 && numPlayers <= 2)
216         split = 2;
217 else if (mapSize == 192 && numPlayers <= 3)
218         split = 2;
219 else if (mapSize == 256)
221         if (numPlayers <= 3)
222                 split = 3;
223         else if (numPlayers == 4)
224                 split = 2;
226 else if (mapSize == 320)
228         if (numPlayers <= 3)
229                 split = 3;
230         else if (numPlayers == 4)
231                 split = 2;
233 else if (mapSize == 384)
235         if (numPlayers <= 3)
236                 split = 4;
237         else if (numPlayers == 4)
238                 split = 3;
239         else if (numPlayers == 5)
240                 split = 2;
242 else if (mapSize == 448)
244         if (numPlayers <= 2)
245                 split = 5;
246         else if (numPlayers <= 4)
247                 split = 4;
248         else if (numPlayers == 5)
249                 split = 3;
250         else if (numPlayers == 6)
251                 split = 2;
254 log ("Creating rivers...");
255 for (var m = 0; m < numPlayers*split; m++)
257         var tang = startAngle + (m+0.5)*TWO_PI/(numPlayers*split);
258         var placer = new PathPlacer(fractionToTiles(0.5 + 0.15*cos(tang)), fractionToTiles(0.5 + 0.15*sin(tang)), fractionToTiles(0.5 + 0.49*cos(tang)), fractionToTiles(0.5 + 0.49*sin(tang)), scaleByMapSize(14,40), 0.0, 3*(scaleByMapSize(1,3)), 0.2, 0.05);
259         var terrainPainter = new LayeredPainter(
260                 [tShore, tWater, tWater],               // terrains
261                 [1, 3]                                                          // widths
262         );
263         var elevationPainter = new SmoothElevationPainter(
264                 ELEVATION_SET,                  // type
265                 -4,                             // elevation
266                 4                               // blend radius
267         );
268         createArea(placer, [terrainPainter, elevationPainter, paintClass(clWater)], avoidClasses(clPlayer, 5));
269         placer = new ClumpPlacer(floor(PI*scaleByMapSize(14,40)*scaleByMapSize(14,40)/4), 1, 0, 10, fractionToTiles(0.5 + 0.49*cos(tang)), fractionToTiles(0.5 + 0.49*sin(tang)));
270         var painter = new LayeredPainter([tWater, tWater], [1]);
271         var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, -4, 4);
272         createArea(placer, [painter, elevationPainter, paintClass(clWater)], avoidClasses(clPlayer, 5));
274         var tang = startAngle + (m)*TWO_PI/(numPlayers*split);
275         var placer = new PathPlacer(fractionToTiles(0.5 + 0.05*cos(tang)), fractionToTiles(0.5 + 0.05*sin(tang)), fractionToTiles(0.5 + 0.49*cos(tang)), fractionToTiles(0.5 + 0.49*sin(tang)), scaleByMapSize(10,40), 0.0, 3*(scaleByMapSize(1,3)), 0.2, 0.05);
276         var terrainPainter = new LayeredPainter(
277                 [tWater, tShore, tMainTerrain],         // terrains
278                 [1, 3]                                                          // widths
279         );
280         var elevationPainter = new SmoothElevationPainter(
281                 ELEVATION_SET,                  // type
282                 3,                              // elevation
283                 4                               // blend radius
284         );
285         createArea(placer, [terrainPainter, elevationPainter], null);
289 var fx = fractionToTiles(0.5);
290 var fz = fractionToTiles(0.5);
291 ix = round(fx);
292 iz = round(fz);
294 var placer = new ClumpPlacer(mapArea * 0.15, 1, 1, 10, ix, iz);
295 var terrainPainter = new LayeredPainter(
296         [tShore, tWater, tWater, tWater],               // terrains
297         [1, 4, 2]               // widths
299 var elevationPainter = new SmoothElevationPainter(
300         ELEVATION_SET,                  // type
301         4,                              // elevation
302         4                               // blend radius
304 createArea(placer, [terrainPainter, elevationPainter], null);
306 var fx = fractionToTiles(0.5);
307 var fz = fractionToTiles(0.5);
308 ix = round(fx);
309 iz = round(fz);
311 var lSize = sqrt(sqrt(sqrt(scaleByMapSize(1, 8))));
313 var placer = new ClumpPlacer(mapArea * 0.09, 1, 1, 10, ix, iz);
314 var terrainPainter = new LayeredPainter(
315         [tShore, tWater, tWater],               // terrains
316         [1, 3]                                                          // widths
318 var elevationPainter = new SmoothElevationPainter(
319         ELEVATION_SET,                  // type
320         -2,                             // elevation
321         3                               // blend radius
323 createArea(placer, [terrainPainter, elevationPainter], null);
325 var placer = new ClumpPlacer((mapSize - 50) * (mapSize - 50) * 0.09, 1, 1, 10, ix, iz);
326 var terrainPainter = new LayeredPainter(
327         [tShore, tWater, tWater, tWater],               // terrains
328         [1, 4, 2]               // widths
330 var elevationPainter = new SmoothElevationPainter(
331         ELEVATION_SET,                  // type
332         4,                              // elevation
333         3                               // blend radius
335 createArea(placer, [terrainPainter, elevationPainter, unPaintClass(clWater)], null);
337 var placer = new ClumpPlacer(scaleByMapSize(6, 18)*scaleByMapSize(6, 18)*22, 1, 1, 10, ix, iz);
338 var terrainPainter = new LayeredPainter(
339         [tMainTerrain, tMainTerrain],           // terrains
340         [1]             // widths
342 var elevationPainter = new SmoothElevationPainter(
343         ELEVATION_SET,                  // type
344         20,                             // elevation
345         8                               // blend radius
347 createArea(placer, [terrainPainter, elevationPainter], null);
349 paintTerrainBasedOnHeight(-6, 1, 1, tWater);
350 paintTerrainBasedOnHeight(1, 2, 1, tShore);
351 paintTerrainBasedOnHeight(2, 5, 1, tMainTerrain);
353 paintTileClassBasedOnHeight(-6, 0.5, 1, clWater);
354 unPaintTileClassBasedOnHeight(0.5, 10, 1, clWater);
356 for (var i = 0; i < numPlayers; i++)
358         fx = fractionToTiles(playerX[i]);
359         fz = fractionToTiles(playerZ[i]);
360         ix = round(fx);
361         iz = round(fz);
363         // create the city patch
364         var cityRadius = radius/3;
365         var placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz);
366         var painter = new LayeredPainter([tRoadWild, tRoad], [1]);
367         createArea(placer, painter, null);
370 if (randInt(1,2) == 1)
371         createHills([tMainTerrain, tCliff, tHill], avoidClasses(clPlayer, 20, clHill, 15, clWater, 2), clHill, scaleByMapSize(1, 4) * numPlayers);
372 else
373         createMountains(tCliff, avoidClasses(clPlayer, 20, clHill, 15, clWater, 2), clHill, scaleByMapSize(1, 4) * numPlayers);
375 createForests(
376  [tMainTerrain, tForestFloor1, tForestFloor2, pForest1, pForest2],
377  avoidClasses(clPlayer, 20, clForest, 17, clHill, 0, clWater, 2),
378  clForest,
379  1.0,
380  random_terrain
383 RMS.SetProgress(50);
385 log("Creating dirt patches...");
386 createLayeredPatches(
387  [scaleByMapSize(3, 6), scaleByMapSize(5, 10), scaleByMapSize(8, 21)],
388  [[tMainTerrain,tTier1Terrain],[tTier1Terrain,tTier2Terrain], [tTier2Terrain,tTier3Terrain]],
389  [1,1],
390  avoidClasses(clWater, 3, clForest, 0, clHill, 0, clDirt, 5, clPlayer, 12)
393 log("Creating grass patches...");
394 createPatches(
395  [scaleByMapSize(2, 4), scaleByMapSize(3, 7), scaleByMapSize(5, 15)],
396  tTier4Terrain,
397  avoidClasses(clWater, 3, clForest, 0, clHill, 0, clDirt, 5, clPlayer, 12)
400 RMS.SetProgress(55);
402 log("Creating stone mines...");
403 createMines(
405   [new SimpleObject(oStoneSmall, 0,2, 0,4), new SimpleObject(oStoneLarge, 1,1, 0,4)],
406   [new SimpleObject(oStoneSmall, 2,5, 1,3)]
407  ],
408  avoidClasses(clWater, 3, clForest, 1, clPlayer, 20, clRock, 10, clHill, 1)
411 log("Creating metal mines...");
412 createMines(
414   [new SimpleObject(oMetalLarge, 1,1, 0,4)]
415  ],
416  avoidClasses(clWater, 3, clForest, 1, clPlayer, 20, clMetal, 10, clRock, 5, clHill, 1),
417  clMetal
420 RMS.SetProgress(65);
422 // create decoration
423 var planetm = 1;
425 if (random_terrain == g_BiomeTropic)
426         planetm = 8;
428 createDecoration
430  [[new SimpleObject(aRockMedium, 1,3, 0,1)],
431   [new SimpleObject(aRockLarge, 1,2, 0,1), new SimpleObject(aRockMedium, 1,3, 0,2)],
432   [new SimpleObject(aGrassShort, 1,2, 0,1, -PI/8,PI/8)],
433   [new SimpleObject(aGrass, 2,4, 0,1.8, -PI/8,PI/8), new SimpleObject(aGrassShort, 3,6, 1.2,2.5, -PI/8,PI/8)],
434   [new SimpleObject(aBushMedium, 1,2, 0,2), new SimpleObject(aBushSmall, 2,4, 0,2)]
435  ],
437   scaleByMapSize(16, 262),
438   scaleByMapSize(8, 131),
439   planetm * scaleByMapSize(13, 200),
440   planetm * scaleByMapSize(13, 200),
441   planetm * scaleByMapSize(13, 200)
442  ],
443  avoidClasses(clWater, 0, clForest, 0, clPlayer, 0, clHill, 0)
446 RMS.SetProgress(70);
448 // create animals
449 createFood
452   [new SimpleObject(oMainHuntableAnimal, 5,7, 0,4)],
453   [new SimpleObject(oSecondaryHuntableAnimal, 2,3, 0,2)]
454  ],
456   3 * numPlayers,
457   3 * numPlayers
458  ],
459  avoidClasses(clWater, 3, clForest, 0, clPlayer, 20, clHill, 1, clFood, 20)
462 // create fruits
463 createFood
466   [new SimpleObject(oFruitBush, 5,7, 0,4)]
467  ],
469   3 * numPlayers
470  ],
471  avoidClasses(clWater, 3, clForest, 0, clPlayer, 20, clHill, 1, clFood, 10)
474 // create straggler trees
475 var types = [oTree1, oTree2, oTree4, oTree3];   // some variation
476 createStragglerTrees(types, avoidClasses(clWater, 5, clForest, 7, clHill, 1, clPlayer, 12, clMetal, 1, clRock, 1));
479 // Export map data
480 ExportMap();