Invincible women on survival of the fittest to prevent women fights and cheap tower...
[0ad.git] / binaries / data / mods / public / maps / random / lake.js
bloba58244b6a50c20e47ae809f43b701e6af59a25b1
1 RMS.LoadLibrary("rmgen");
3 //random terrain textures
4 var random_terrain = randomizeBiome();
6 const tMainTerrain = rBiomeT1();
7 const tForestFloor1 = rBiomeT2();
8 const tForestFloor2 = rBiomeT3();
9 const tCliff = rBiomeT4();
10 const tTier1Terrain = rBiomeT5();
11 const tTier2Terrain = rBiomeT6();
12 const tTier3Terrain = rBiomeT7();
13 const tHill = rBiomeT8();
14 const tDirt = rBiomeT9();
15 const tRoad = rBiomeT10();
16 const tRoadWild = rBiomeT11();
17 const tTier4Terrain = rBiomeT12();
18 const tShoreBlend = rBiomeT13();
19 const tShore = rBiomeT14();
20 const tWater = rBiomeT15();
22 // gaia entities
23 const oTree1 = rBiomeE1();
24 const oTree2 = rBiomeE2();
25 const oTree3 = rBiomeE3();
26 const oTree4 = rBiomeE4();
27 const oTree5 = rBiomeE5();
28 const oFruitBush = rBiomeE6();
29 const oMainHuntableAnimal = rBiomeE8();
30 const oFish = rBiomeE9();
31 const oSecondaryHuntableAnimal = rBiomeE10();
32 const oStoneLarge = rBiomeE11();
33 const oStoneSmall = rBiomeE12();
34 const oMetalLarge = rBiomeE13();
36 // decorative props
37 const aGrass = rBiomeA1();
38 const aGrassShort = rBiomeA2();
39 const aReeds = rBiomeA3();
40 const aLillies = rBiomeA4();
41 const aRockLarge = rBiomeA5();
42 const aRockMedium = rBiomeA6();
43 const aBushMedium = rBiomeA7();
44 const aBushSmall = rBiomeA8();
46 const pForest1 = [tForestFloor2 + TERRAIN_SEPARATOR + oTree1, tForestFloor2 + TERRAIN_SEPARATOR + oTree2, tForestFloor2];
47 const pForest2 = [tForestFloor1 + TERRAIN_SEPARATOR + oTree4, tForestFloor1 + TERRAIN_SEPARATOR + oTree5, tForestFloor1];
49 log("Initializing map...");
51 InitMap();
53 const numPlayers = getNumPlayers();
54 const mapSize = getMapSize();
55 const mapArea = mapSize*mapSize;
57 // create tile classes
59 var clPlayer = createTileClass();
60 var clHill = createTileClass();
61 var clForest = createTileClass();
62 var clWater = createTileClass();
63 var clDirt = createTileClass();
64 var clRock = createTileClass();
65 var clMetal = createTileClass();
66 var clFood = createTileClass();
67 var clBaseResource = createTileClass();
68 var clSettlement = createTileClass();
70 for (var ix = 0; ix < mapSize; ix++)
72         for (var iz = 0; iz < mapSize; iz++)
73         {
74                 var x = ix / (mapSize + 1.0);
75                 var z = iz / (mapSize + 1.0);
76                         placeTerrain(ix, iz, tMainTerrain);
77         }
80 // randomize player order
81 var playerIDs = [];
82 for (var i = 0; i < numPlayers; i++)
84         playerIDs.push(i+1);
86 playerIDs = sortPlayers(playerIDs);
88 // place players
90 var playerX = new Array(numPlayers);
91 var playerZ = new Array(numPlayers);
92 var playerAngle = new Array(numPlayers);
94 var startAngle = randFloat(0, TWO_PI);
95 for (var i = 0; i < numPlayers; i++)
97         playerAngle[i] = startAngle + i*TWO_PI/numPlayers;
98         playerX[i] = 0.5 + 0.35*cos(playerAngle[i]);
99         playerZ[i] = 0.5 + 0.35*sin(playerAngle[i]);
102 for (var i = 0; i < numPlayers; i++)
104         var id = playerIDs[i];
105         log("Creating base for player " + id + "...");
107         // some constants
108         var radius = scaleByMapSize(15,25);
109         var cliffRadius = 2;
110         var elevation = 20;
112         // get the x and z in tiles
113         var fx = fractionToTiles(playerX[i]);
114         var fz = fractionToTiles(playerZ[i]);
115         var ix = round(fx);
116         var iz = round(fz);
117         addToClass(ix, iz, clPlayer);
118         addToClass(ix+5, iz, clPlayer);
119         addToClass(ix, iz+5, clPlayer);
120         addToClass(ix-5, iz, clPlayer);
121         addToClass(ix, iz-5, clPlayer);
123         // create starting units
124         placeCivDefaultEntities(fx, fz, id);
126         placeDefaultChicken(fx, fz, clBaseResource);
128         // create berry bushes
129         var bbAngle = randFloat(0, TWO_PI);
130         var bbDist = 12;
131         var bbX = round(fx + bbDist * cos(bbAngle));
132         var bbZ = round(fz + bbDist * sin(bbAngle));
133         var group = new SimpleGroup(
134                 [new SimpleObject(oFruitBush, 5,5, 0,3)],
135                 true, clBaseResource, bbX, bbZ
136         );
137         createObjectGroup(group, 0);
139         // create metal mine
140         var mAngle = bbAngle;
141         while(abs(mAngle - bbAngle) < PI/3)
142         {
143                 mAngle = randFloat(0, TWO_PI);
144         }
145         var mDist = 12;
146         var mX = round(fx + mDist * cos(mAngle));
147         var mZ = round(fz + mDist * sin(mAngle));
148         group = new SimpleGroup(
149                 [new SimpleObject(oMetalLarge, 1,1, 0,0)],
150                 true, clBaseResource, mX, mZ
151         );
152         createObjectGroup(group, 0);
154         // create stone mines
155         mAngle += randFloat(PI/8, PI/4);
156         mX = round(fx + mDist * cos(mAngle));
157         mZ = round(fz + mDist * sin(mAngle));
158         group = new SimpleGroup(
159                 [new SimpleObject(oStoneLarge, 1,1, 0,2)],
160                 true, clBaseResource, mX, mZ
161         );
162         createObjectGroup(group, 0);
163         var hillSize = PI * radius * radius;
164         // create starting trees
165         var num = 5;
166         var tAngle = randFloat(0, TWO_PI);
167         var tDist = randFloat(12, 13);
168         var tX = round(fx + tDist * cos(tAngle));
169         var tZ = round(fz + tDist * sin(tAngle));
170         group = new SimpleGroup(
171                 [new SimpleObject(oTree1, num, num, 0,3)],
172                 false, clBaseResource, tX, tZ
173         );
174         createObjectGroup(group, 0, avoidClasses(clBaseResource,2));
176         // create grass tufts
177         var num = hillSize / 250;
178         for (var j = 0; j < num; j++)
179         {
180                 var gAngle = randFloat(0, TWO_PI);
181                 var gDist = radius - (5 + randInt(7));
182                 var gX = round(fx + gDist * cos(gAngle));
183                 var gZ = round(fz + gDist * sin(gAngle));
184                 group = new SimpleGroup(
185                         [new SimpleObject(aGrassShort, 2,5, 0,1, -PI/8,PI/8)],
186                         false, clBaseResource, gX, gZ
187                 );
188                 createObjectGroup(group, 0);
189         }
192 RMS.SetProgress(20);
194 //create the lake
195 var fx = fractionToTiles(0.5);
196 var fz = fractionToTiles(0.5);
197 ix = round(fx);
198 iz = round(fz);
200 const lSize = sqrt(sqrt(sqrt(scaleByMapSize(1, 6))));
202 var placer = new ChainPlacer(2, floor(scaleByMapSize(5, 16)), floor(scaleByMapSize(35, 200)), 1, ix, iz, 0, [floor(mapSize * 0.17 * lSize)]);
203 var terrainPainter = new LayeredPainter(
204         [tShore, tWater, tWater, tWater],               // terrains
205         [1, 4, 2]               // widths
207 var elevationPainter = new SmoothElevationPainter(
208         ELEVATION_SET,                  // type
209         -3,                             // elevation
210         4                               // blend radius
212 createArea(placer, [terrainPainter, elevationPainter, paintClass(clWater)], avoidClasses(clPlayer, 20));
215 // create more shore jaggedness
216 log("Creating more shore jaggedness...");
218 placer = new ChainPlacer(2, floor(scaleByMapSize(4, 6)), 3, 1);
219 terrainPainter = new LayeredPainter(
220         [tCliff, tHill],                // terrains
221         [2]                                                             // widths
223 elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 3, 4);
224 createAreas(
225         placer,
226         [terrainPainter, elevationPainter, unPaintClass(clWater)],
227         borderClasses(clWater, 4, 7),
228         scaleByMapSize(12, 130) * 2, 150
232 paintTerrainBasedOnHeight(2.4, 3.4, 3, tMainTerrain);
233 paintTerrainBasedOnHeight(1, 2.4, 0, tShore);
234 paintTerrainBasedOnHeight(-8, 1, 2, tWater);
235 paintTileClassBasedOnHeight(-6, 0, 1, clWater);
237 for (var i = 0; i < numPlayers; ++i)
239         var fx = fractionToTiles(playerX[i]);
240         var fz = fractionToTiles(playerZ[i]);
241         var ix = round(fx);
242         var iz = round(fz);
244         // create the city patch
245         var cityRadius = radius/3;
246         var placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz);
247         var painter = new LayeredPainter([tRoadWild, tRoad], [1]);
248         createArea(placer, painter, null);
251 // create bumps
252 createBumps(avoidClasses(clWater, 2, clPlayer, 20));
254 // create hills
255 if (randInt(1,2) == 1)
256         createHills([tMainTerrain, tCliff, tHill], avoidClasses(clPlayer, 20, clHill, 15, clWater, 2), clHill, scaleByMapSize(1, 4) * numPlayers);
257 else
258         createMountains(tCliff, avoidClasses(clPlayer, 20, clHill, 15, clWater, 2), clHill, scaleByMapSize(1, 4) * numPlayers);
260 // create forests
261 createForests(
262  [tMainTerrain, tForestFloor1, tForestFloor2, pForest1, pForest2],
263  avoidClasses(clPlayer, 20, clForest, 17, clHill, 0, clWater, 2),
264  clForest,
265  1.0,
266  random_terrain
269 RMS.SetProgress(50);
271 // create dirt patches
272 log("Creating dirt patches...");
273 createLayeredPatches(
274  [scaleByMapSize(3, 6), scaleByMapSize(5, 10), scaleByMapSize(8, 21)],
275  [[tMainTerrain,tTier1Terrain],[tTier1Terrain,tTier2Terrain], [tTier2Terrain,tTier3Terrain]],
276  [1,1],
277  avoidClasses(clWater, 3, clForest, 0, clHill, 0, clDirt, 5, clPlayer, 12)
280 // create grass patches
281 log("Creating grass patches...");
282 createPatches(
283  [scaleByMapSize(2, 4), scaleByMapSize(3, 7), scaleByMapSize(5, 15)],
284  tTier4Terrain,
285  avoidClasses(clWater, 3, clForest, 0, clHill, 0, clDirt, 5, clPlayer, 12)
288 RMS.SetProgress(55);
290 log("Creating stone mines...");
291 // create stone quarries
292 createMines(
294   [new SimpleObject(oStoneSmall, 0,2, 0,4), new SimpleObject(oStoneLarge, 1,1, 0,4)],
295   [new SimpleObject(oStoneSmall, 2,5, 1,3)]
296  ],
297  avoidClasses(clWater, 3, clForest, 1, clPlayer, 20, clRock, 10, clHill, 1)
300 log("Creating metal mines...");
301 // create large metal quarries
302 createMines(
304   [new SimpleObject(oMetalLarge, 1,1, 0,4)]
305  ],
306  avoidClasses(clWater, 3, clForest, 1, clPlayer, 20, clMetal, 10, clRock, 5, clHill, 1),
307  clMetal
310 RMS.SetProgress(65);
312 // create decoration
313 var planetm = 1;
315 if (random_terrain == g_BiomeTropic)
316         planetm = 8;
318 createDecoration
320  [[new SimpleObject(aRockMedium, 1,3, 0,1)],
321   [new SimpleObject(aRockLarge, 1,2, 0,1), new SimpleObject(aRockMedium, 1,3, 0,2)],
322   [new SimpleObject(aGrassShort, 1,2, 0,1, -PI/8,PI/8)],
323   [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)],
324   [new SimpleObject(aBushMedium, 1,2, 0,2), new SimpleObject(aBushSmall, 2,4, 0,2)]
325  ],
327   scaleByMapSize(16, 262),
328   scaleByMapSize(8, 131),
329   planetm * scaleByMapSize(13, 200),
330   planetm * scaleByMapSize(13, 200),
331   planetm * scaleByMapSize(13, 200)
332  ],
333  avoidClasses(clWater, 0, clForest, 0, clPlayer, 0, clHill, 0)
336 RMS.SetProgress(70);
338 // create animals
339 createFood
342   [new SimpleObject(oMainHuntableAnimal, 5,7, 0,4)],
343   [new SimpleObject(oSecondaryHuntableAnimal, 2,3, 0,2)]
344  ],
346   3 * numPlayers,
347   3 * numPlayers
348  ],
349  avoidClasses(clWater, 3, clForest, 0, clPlayer, 20, clHill, 1, clFood, 20)
352 // create fruits
353 createFood
356   [new SimpleObject(oFruitBush, 5,7, 0,4)]
357  ],
359   3 * numPlayers
360  ],
361  avoidClasses(clWater, 3, clForest, 0, clPlayer, 20, clHill, 1, clFood, 10)
364 // create fish
365 createFood
368   [new SimpleObject(oFish, 2,3, 0,2)]
369  ],
371   25 * numPlayers
372  ],
373  [avoidClasses(clFood, 20), stayClasses(clWater, 6)]
376 RMS.SetProgress(85);
378 // create straggler trees
379 var types = [oTree1, oTree2, oTree4, oTree3];   // some variation
380 createStragglerTrees(types, avoidClasses(clWater, 5, clForest, 7, clHill, 1, clPlayer, 12, clMetal, 1, clRock, 1));
381 setWaterWaviness(4.0);
382 setWaterType("lake");
384 // Export map data
385 ExportMap();