Invincible women on survival of the fittest to prevent women fights and cheap tower...
[0ad.git] / binaries / data / mods / public / maps / random / migration.js
blob3dd010228930cf30abc83f69f48cc9ddca095196
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();
35 const oWood = "gaia/special_treasure_wood";
37 // decorative props
38 const aGrass = rBiomeA1();
39 const aGrassShort = rBiomeA2();
40 const aReeds = rBiomeA3();
41 const aLillies = rBiomeA4();
42 const aRockLarge = rBiomeA5();
43 const aRockMedium = rBiomeA6();
44 const aBushMedium = rBiomeA7();
45 const aBushSmall = rBiomeA8();
47 const pForest1 = [tForestFloor2 + TERRAIN_SEPARATOR + oTree1, tForestFloor2 + TERRAIN_SEPARATOR + oTree2, tForestFloor2];
48 const pForest2 = [tForestFloor1 + TERRAIN_SEPARATOR + oTree4, tForestFloor1 + TERRAIN_SEPARATOR + oTree5, tForestFloor1];
50 log("Initializing map...");
52 InitMap();
54 const numPlayers = getNumPlayers();
55 const mapSize = getMapSize();
56 const mapArea = mapSize*mapSize;
58 // create tile classes
59 var clPlayer = createTileClass();
60 var clHill = createTileClass();
61 var clForest = createTileClass();
62 var clDirt = createTileClass();
63 var clRock = createTileClass();
64 var clMetal = createTileClass();
65 var clFood = createTileClass();
66 var clBaseResource = createTileClass();
67 var clSettlement = createTileClass();
68 var clLand = createTileClass();
70 // randomize player order
71 var playerIDs = [];
72 for (var i = 0; i < numPlayers; i++)
73         playerIDs.push(i+1);
75 playerIDs = sortPlayers(playerIDs);
77 // place players
78 var playerX = new Array(numPlayers);
79 var playerZ = new Array(numPlayers);
80 var playerAngle = new Array(numPlayers);
82 var startAngle = PI/2 + PI/14;
83 for (var i = 0; i < numPlayers; i++)
85         playerAngle[i] = startAngle - (i+1)*(PI+ PI/7)/(numPlayers+1);
86         playerX[i] = 0.5 + 0.35*cos(playerAngle[i]);
87         playerZ[i] = 0.5 + 0.35*sin(playerAngle[i]);
90 for (var i = 0; i < numPlayers; i++)
92         var id = playerIDs[i];
93         log("Creating base for player " + id + "...");
95         // some constants
96         var radius = scaleByMapSize(15,25);
97         var shoreRadius = 4;
98         var elevation = 3;
100         var hillSize = PI * radius * radius;
101         // get the x and z in tiles
102         fx = fractionToTiles(playerX[i]);
103         fz = fractionToTiles(playerZ[i]);
104         ix = round(fx);
105         iz = round(fz);
106         // create the hill
107         var placer = new ClumpPlacer(hillSize, 0.80, 0.1, 10, ix, iz);
108         var terrainPainter = new LayeredPainter(
109                 [tWater , tShore, tMainTerrain],                // terrains
110                 [1, shoreRadius]                // widths
111         );
112         var elevationPainter = new SmoothElevationPainter(
113                 ELEVATION_SET,                  // type
114                 elevation,                              // elevation
115                 shoreRadius                             // blend radius
116         );
117         createArea(placer, [terrainPainter, elevationPainter, paintClass(clPlayer)], null);
119         // create the city patch
120         var cityRadius = radius/3;
121         placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz);
122         var painter = new LayeredPainter([tRoadWild, tRoad], [1]);
123         createArea(placer, painter, null);
125         // create starting units
126         placeCivDefaultEntities(fx, fz, id, { 'iberWall': false });
128         placeDefaultChicken(fx, fz, clBaseResource);
130         // create berry bushes
131         var bbAngle = randFloat(0, TWO_PI);
132         var bbDist = 12;
133         var bbX = round(fx + bbDist * cos(bbAngle));
134         var bbZ = round(fz + bbDist * sin(bbAngle));
135         var group = new SimpleGroup(
136                 [new SimpleObject(oFruitBush, 5,5, 0,3)],
137                 true, clBaseResource, bbX, bbZ
138         );
139         createObjectGroup(group, 0);
141         // create woods
142         var bbAngle = randFloat(0, TWO_PI);
143         var bbDist = 13;
144         var bbX = round(fx + bbDist * cos(bbAngle));
145         var bbZ = round(fz + bbDist * sin(bbAngle));
146         group = new SimpleGroup(
147                 [new SimpleObject(oWood, 14,14, 0,3)],
148                 true, clBaseResource, bbX, bbZ
149         );
150         createObjectGroup(group, 0);
152         // create metal mine
153         var mAngle = bbAngle;
154         while(abs(mAngle - bbAngle) < PI/3)
155                 mAngle = randFloat(0, TWO_PI);
157         var mDist = radius - 4;
158         var mX = round(fx + mDist * cos(mAngle));
159         var mZ = round(fz + mDist * sin(mAngle));
160         group = new SimpleGroup(
161                 [new SimpleObject(oMetalLarge, 1,1, 0,0)],
162                 true, clBaseResource, mX, mZ
163         );
164         createObjectGroup(group, 0);
166         // create stone mines
167         mAngle += randFloat(PI/8, PI/4);
168         mX = round(fx + mDist * cos(mAngle));
169         mZ = round(fz + mDist * sin(mAngle));
170         group = new SimpleGroup(
171                 [new SimpleObject(oStoneLarge, 1,1, 0,2)],
172                 true, clBaseResource, mX, mZ
173         );
174         createObjectGroup(group, 0);
175         var hillSize = PI * radius * radius;
176         // create starting trees
177         var num = floor(hillSize / 60);
178         var tAngle = randFloat(-PI/3, 4*PI/3);
179         var tDist = 11;
180         var tX = round(fx + tDist * cos(tAngle));
181         var tZ = round(fz + tDist * sin(tAngle));
182         group = new SimpleGroup(
183                 [new SimpleObject(oTree1, num, num, 0,4)],
184                 false, clBaseResource, tX, tZ
185         );
186         createObjectGroup(group, 0, avoidClasses(clBaseResource,2));
188         // create grass tufts
189         var num = hillSize / 250;
190         for (var j = 0; j < num; j++)
191         {
192                 var gAngle = randFloat(0, TWO_PI);
193                 var gDist = radius - (5 + randInt(7));
194                 var gX = round(fx + gDist * cos(gAngle));
195                 var gZ = round(fz + gDist * sin(gAngle));
196                 group = new SimpleGroup(
197                         [new SimpleObject(aGrassShort, 2,5, 0,1, -PI/8,PI/8)],
198                         false, clBaseResource, gX, gZ
199                 );
200                 createObjectGroup(group, 0);
201         }
203         //create docks
204         var dockLocation = getTIPIADBON([ix, iz], [mapSize / 2, mapSize / 2], [-3 , 2.6], 0.5, 3);
205         if (dockLocation !== undefined)
206                 placeObject(dockLocation[0], dockLocation[1], "structures/" + getCivCode(id-1) + "_dock", id, playerAngle[i] + PI);
208 RMS.SetProgress(15);
210 //Create the continent body
211 var fx = fractionToTiles(0.12);
212 var fz = fractionToTiles(0.5);
213 var ix = round(fx);
214 var iz = round(fz);
216 var placer = new ClumpPlacer(mapArea * 0.50, 0.80, 0.08, 10, ix, iz);
217 var terrainPainter = new LayeredPainter(
218         [tWater, tShore, tMainTerrain],         // terrains
219         [4, 2]          // widths
221 var elevationPainter = new SmoothElevationPainter(
222         ELEVATION_SET,                  // type
223         3,                              // elevation
224         4                               // blend radius
226 createArea(placer, [terrainPainter, elevationPainter, paintClass(clLand)], avoidClasses(clPlayer, 8));
227 RMS.SetProgress(20);
229 log("Creating shore jaggedness...");
230 placer = new ClumpPlacer(scaleByMapSize(15, 80), 0.2, 0.1, 1);
231 terrainPainter = new LayeredPainter(
232         [tMainTerrain, tMainTerrain],           // terrains
233         [2]                                                             // widths
235 elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 3, 4);
236 createAreas(
237         placer,
238         [terrainPainter, elevationPainter, paintClass(clLand)],
239         [borderClasses(clLand, 6, 3), avoidClasses(clPlayer, 8)],
240         scaleByMapSize(20, 150) * 2, 150
243 paintTerrainBasedOnHeight(1, 3, 0, tShore);
244 paintTerrainBasedOnHeight(-8, 1, 2, tWater);
245 RMS.SetProgress(25);
247 log("Creating bumps...");
248 placer = new ClumpPlacer(scaleByMapSize(20, 50), 0.3, 0.06, 1);
249 painter = new SmoothElevationPainter(ELEVATION_MODIFY, 2, 2);
250 createAreas(
251         placer,
252         painter,
253         [avoidClasses(clPlayer, 10), stayClasses(clLand, 3)],
254         scaleByMapSize(100, 200)
256 RMS.SetProgress(30);
258 log("Creating hills...");
259 placer = new ClumpPlacer(scaleByMapSize(20, 150), 0.2, 0.1, 1);
260 terrainPainter = new LayeredPainter(
261         [tCliff, tHill],                // terrains
262         [2]                                                             // widths
264 elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 18, 2);
265 createAreas(
266         placer,
267         [terrainPainter, elevationPainter, paintClass(clHill)],
268         [avoidClasses(clPlayer, 10, clHill, 15), stayClasses(clLand, 7)],
269         scaleByMapSize(1, 4) * numPlayers
271 RMS.SetProgress(34);
273 // calculate desired number of trees for map (based on size)
274 if (random_terrain == g_BiomeSavanna)
276         var MIN_TREES = 200;
277         var MAX_TREES = 1250;
278         var P_FOREST = 0.02;
280 else if (random_terrain == g_BiomeTropic)
282         var MIN_TREES = 1000;
283         var MAX_TREES = 6000;
284         var P_FOREST = 0.6;
286 else
288         var MIN_TREES = 500;
289         var MAX_TREES = 3000;
290         var P_FOREST = 0.7;
293 var totalTrees = scaleByMapSize(MIN_TREES, MAX_TREES);
294 var numForest = totalTrees * P_FOREST;
295 var numStragglers = totalTrees * (1.0 - P_FOREST);
297 log("Creating forests...");
298 var types = [
299         [[tForestFloor2, tMainTerrain, pForest1], [tForestFloor2, pForest1]],
300         [[tForestFloor1, tMainTerrain, pForest2], [tForestFloor1, pForest2]]
301 ];      // some variation
303 var size = numForest / (scaleByMapSize(2,8) * numPlayers) *
304         (random_terrain == g_BiomeSavanna ? 2 : 1);
306 var num = floor(size / types.length);
307 for (var i = 0; i < types.length; ++i)
309         placer = new ClumpPlacer(numForest / num, 0.1, 0.1, 1);
310         painter = new LayeredPainter(
311                 types[i],               // terrains
312                 [2]                                                                                     // widths
313                 );
314         createAreas(
315                 placer,
316                 [painter, paintClass(clForest)],
317                 [avoidClasses(clPlayer, 6, clForest, 10, clHill, 0), stayClasses(clLand, 7)],
318                 num
319         );
321 RMS.SetProgress(38);
323 log("Creating dirt patches...");
324 var sizes = [scaleByMapSize(3, 48), scaleByMapSize(5, 84), scaleByMapSize(8, 128)];
325 for (var i = 0; i < sizes.length; i++)
327         placer = new ClumpPlacer(sizes[i], 0.3, 0.06, 0.5);
328         painter = new LayeredPainter(
329                 [[tMainTerrain,tTier1Terrain],[tTier1Terrain,tTier2Terrain], [tTier2Terrain,tTier3Terrain]],            // terrains
330                 [1,1]                                                                                                                   // widths
331         );
332         createAreas(
333                 placer,
334                 [painter, paintClass(clDirt)],
335                 [avoidClasses(clForest, 0, clHill, 0, clDirt, 5, clPlayer, 0), stayClasses(clLand, 7)],
336                 scaleByMapSize(15, 45)
337         );
339 RMS.SetProgress(42);
341 log("Creating grass patches...");
342 var sizes = [scaleByMapSize(2, 32), scaleByMapSize(3, 48), scaleByMapSize(5, 80)];
343 for (var i = 0; i < sizes.length; i++)
345         placer = new ClumpPlacer(sizes[i], 0.3, 0.06, 0.5);
346         painter = new TerrainPainter(tTier4Terrain);
347         createAreas(
348                 placer,
349                 painter,
350                 [avoidClasses(clForest, 0, clHill, 0, clDirt, 5, clPlayer, 0), stayClasses(clLand, 7)],
351                 scaleByMapSize(15, 45)
352         );
354 RMS.SetProgress(46);
356 log("Creating stone mines...");
357 group = new SimpleGroup([new SimpleObject(oStoneSmall, 0,2, 0,4), new SimpleObject(oStoneLarge, 1,1, 0,4)], true, clRock);
358 createObjectGroups(group, 0,
359         [avoidClasses(clForest, 1, clPlayer, 10, clRock, 10, clHill, 1), stayClasses(clLand, 7)],
360         scaleByMapSize(4,16), 100
362 RMS.SetProgress(50);
364 log("Creating small stone quarries...");
365 group = new SimpleGroup([new SimpleObject(oStoneSmall, 2,5, 1,3)], true, clRock);
366 createObjectGroups(group, 0,
367         [avoidClasses(clForest, 1, clPlayer, 10, clRock, 10, clHill, 1), stayClasses(clLand, 7)],
368         scaleByMapSize(4,16), 100
370 RMS.SetProgress(54);
372 log("Creating metal mines...");
373 // create large metal quarries
374 group = new SimpleGroup([new SimpleObject(oMetalLarge, 1,1, 0,4)], true, clMetal);
375 createObjectGroups(group, 0,
376         [avoidClasses(clForest, 1, clPlayer, 10, clMetal, 10, clRock, 5, clHill, 1), stayClasses(clLand, 7)],
377         scaleByMapSize(4,16), 100
379 RMS.SetProgress(58);
381 // create small decorative rocks
382 log("Creating small decorative rocks...");
383 group = new SimpleGroup(
384         [new SimpleObject(aRockMedium, 1,3, 0,1)],
385         true
387 createObjectGroups(
388         group, 0,
389         [avoidClasses(clForest, 0, clPlayer, 0, clHill, 0), stayClasses(clLand, 6)],
390         scaleByMapSize(16, 262), 50
392 RMS.SetProgress(62);
394 // create large decorative rocks
395 log("Creating large decorative rocks...");
396 group = new SimpleGroup(
397         [new SimpleObject(aRockLarge, 1,2, 0,1), new SimpleObject(aRockMedium, 1,3, 0,2)],
398         true
400 createObjectGroups(
401         group, 0,
402         [avoidClasses(clForest, 0, clPlayer, 0, clHill, 0), stayClasses(clLand, 6)],
403         scaleByMapSize(8, 131), 50
405 RMS.SetProgress(66);
407 log("Creating deer...");
408 group = new SimpleGroup(
409         [new SimpleObject(oMainHuntableAnimal, 5,7, 0,4)],
410         true, clFood
412 createObjectGroups(group, 0,
413         [avoidClasses(clForest, 0, clPlayer, 10, clHill, 1, clFood, 20), stayClasses(clLand, 7)],
414         3 * numPlayers, 50
416 RMS.SetProgress(70);
418 log("Creating sheep...");
419 group = new SimpleGroup(
420         [new SimpleObject(oSecondaryHuntableAnimal, 2,3, 0,2)],
421         true, clFood
423 createObjectGroups(group, 0,
424         [avoidClasses(clForest, 0, clPlayer, 10, clHill, 1, clFood, 20), stayClasses(clLand, 7)],
425         3 * numPlayers, 50
427 RMS.SetProgress(74);
429 log("Creating fruit bush...");
430 group = new SimpleGroup(
431         [new SimpleObject(oFruitBush, 5,7, 0,4)],
432         true, clFood
434 createObjectGroups(group, 0,
435         [avoidClasses(clForest, 0, clPlayer, 8, clHill, 1, clFood, 20), stayClasses(clLand, 7)],
436         randInt(1, 4) * numPlayers + 2, 50
438 RMS.SetProgress(78);
440 log("Creating fish...");
441 createObjectGroups(
442         new SimpleGroup([new SimpleObject(oFish, 2,3, 0,2)], true, clFood),
443         0,
444         avoidClasses(clLand, 2, clPlayer, 2, clHill, 0, clFood, 20),
445         25 * numPlayers, 60
447 RMS.SetProgress(82);
449 log("Creating straggler trees...");
450 var types = [oTree1, oTree2, oTree4, oTree3];   // some variation
451 var num = floor(numStragglers / types.length);
452 for (var i = 0; i < types.length; ++i)
454         group = new SimpleGroup(
455                 [new SimpleObject(types[i], 1,1, 0,3)],
456                 true, clForest
457         );
458         createObjectGroups(group, 0,
459                 [avoidClasses(clForest, 1, clHill, 1, clPlayer, 9, clMetal, 1, clRock, 1), stayClasses(clLand, 9)],
460                 num
461         );
463 RMS.SetProgress(86);
465 var planetm = random_terrain == g_BiomeTropic ? 8 : 1;
467 log("Creating small grass tufts...");
468 group = new SimpleGroup(
469         [new SimpleObject(aGrassShort, 1,2, 0,1, -PI/8,PI/8)]
471 createObjectGroups(group, 0,
472         [avoidClasses(clHill, 2, clPlayer, 2, clDirt, 0), stayClasses(clLand, 6)],
473         planetm * scaleByMapSize(13, 200)
475 RMS.SetProgress(90);
477 log("Creating large grass tufts...");
478 group = new SimpleGroup(
479         [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)]
481 createObjectGroups(group, 0,
482         [avoidClasses(clHill, 2, clPlayer, 2, clDirt, 1, clForest, 0), stayClasses(clLand, 6)],
483         planetm * scaleByMapSize(13, 200)
485 RMS.SetProgress(94);
487 log("Creating bushes...");
488 group = new SimpleGroup(
489         [new SimpleObject(aBushMedium, 1,2, 0,2), new SimpleObject(aBushSmall, 2,4, 0,2)]
491 createObjectGroups(group, 0,
492         [avoidClasses(clHill, 1, clPlayer, 1, clDirt, 1), stayClasses(clLand, 6)],
493         planetm * scaleByMapSize(13, 200), 50
495 RMS.SetProgress(98);
497 random_terrain = randInt(1,3);
498 if (random_terrain == 1)
499         setSkySet("cirrus");
500 else if (random_terrain == 2)
501         setSkySet("cumulus");
502 else if (random_terrain == 3)
503         setSkySet("sunny");
505 setSunRotation(randFloat(0, TWO_PI));
506 setSunElevation(randFloat(PI/ 5, PI / 3));
507 setWaterWaviness(2);
509 ExportMap();