Invincible women on survival of the fittest to prevent women fights and cheap tower...
[0ad.git] / binaries / data / mods / public / maps / random / archipelago.js
blob46651ed810107bb10416a3fdf5fe5f1010e89e5f
1 RMS.LoadLibrary("rmgen");
3 TILE_CENTERED_HEIGHT_MAP = true;
5 var random_terrain = randomizeBiome();
7 const tMainTerrain = rBiomeT1();
8 const tForestFloor1 = rBiomeT2();
9 const tForestFloor2 = rBiomeT3();
10 const tCliff = rBiomeT4();
11 const tTier1Terrain = rBiomeT5();
12 const tTier2Terrain = rBiomeT6();
13 const tTier3Terrain = rBiomeT7();
14 const tHill = rBiomeT8();
15 const tTier4Terrain = rBiomeT9();
16 const tRoad = rBiomeT10();
17 const tRoadWild = rBiomeT11();
18 const tTier5Terrain = rBiomeT12();
19 const tShoreBlend = rBiomeT13();
20 const tShore = rBiomeT14();
21 const tWater = rBiomeT15();
23 // gaia entities
24 const oTree1 = rBiomeE1();
25 const oTree2 = rBiomeE2();
26 const oTree3 = rBiomeE3();
27 const oTree4 = rBiomeE4();
28 const oTree5 = rBiomeE5();
29 const oFruitBush = rBiomeE6();
30 const oMainHuntableAnimal = rBiomeE8();
31 const oFish = rBiomeE9();
32 const oSecondaryHuntableAnimal = rBiomeE10();
33 const oStoneLarge = rBiomeE11();
34 const oStoneSmall = rBiomeE12();
35 const oMetalLarge = rBiomeE13();
36 const oWood = "gaia/special_treasure_wood";
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...");
52 InitMap();
54 const numPlayers = getNumPlayers();
55 const mapSize = getMapSize();
56 const mapArea = mapSize*mapSize;
58 var clPlayer = createTileClass();
59 var clHill = createTileClass();
60 var clForest = createTileClass();
61 var clDirt = createTileClass();
62 var clRock = createTileClass();
63 var clMetal = createTileClass();
64 var clFood = createTileClass();
65 var clBaseResource = createTileClass();
66 var clSettlement = createTileClass();
67 var clLand = createTileClass();
69 var playerIDs = [];
70 for (var i = 0; i < numPlayers; i++)
71         playerIDs.push(i+1);
73 playerIDs = sortPlayers(playerIDs);
75 // place players
76 var playerX = new Array(numPlayers);
77 var playerZ = new Array(numPlayers);
78 var playerAngle = new Array(numPlayers);
80 var startAngle = randFloat(0, TWO_PI);
81 for (var i = 0; i < numPlayers; i++)
83         playerAngle[i] = startAngle + i*TWO_PI/numPlayers;
84         playerX[i] = 0.5 + 0.35*cos(playerAngle[i]);
85         playerZ[i] = 0.5 + 0.35*sin(playerAngle[i]);
88 for (var i = 0; i < numPlayers; i++)
90         var id = playerIDs[i];
91         log("Creating base for player " + id + "...");
93         // some constants
94         var radius = scaleByMapSize(22,31);
95         var shoreRadius = 4;
96         var elevation = 3;
98         var hillSize = PI * radius * radius;
99         // get the x and z in tiles
100         var fx = fractionToTiles(playerX[i]);
101         var fz = fractionToTiles(playerZ[i]);
102         var ix = round(fx);
103         var iz = round(fz);
105         // create the main island
106         var placer = new ChainPlacer(2, floor(scaleByMapSize(5, 10)), floor(scaleByMapSize(25, 60)), 1, ix, iz, 0, [floor(radius)]);
107         var terrainPainter = new LayeredPainter(
108                 [tMainTerrain , tMainTerrain, tMainTerrain],            // terrains
109                 [1, shoreRadius]                // widths
110         );
111         var elevationPainter = new SmoothElevationPainter(
112                 ELEVATION_SET,                  // type
113                 elevation,                              // elevation
114                 shoreRadius                             // blend radius
115         );
116         createArea(placer, [terrainPainter, elevationPainter, paintClass(clPlayer)], null);
118         placeCivDefaultEntities(fx, fz, id, { 'iberWall': 'towers' });
120         placeDefaultChicken(fx, fz, clBaseResource);
122         // create berry bushes
123         var bbAngle = randFloat(0, TWO_PI);
124         var bbDist = 12;
125         var bbX = round(fx + bbDist * cos(bbAngle));
126         var bbZ = round(fz + bbDist * sin(bbAngle));
127         var group = new SimpleGroup(
128                 [new SimpleObject(oFruitBush, 5,5, 0,3)],
129                 true, clBaseResource, bbX, bbZ
130         );
131         createObjectGroup(group, 0);
133         // create woods
134         var bbAngle = randFloat(0, TWO_PI);
135         var bbDist = 13;
136         var bbX = round(fx + bbDist * cos(bbAngle));
137         var bbZ = round(fz + bbDist * sin(bbAngle));
138         group = new SimpleGroup(
139                 [new SimpleObject(oWood, 14,14, 0,3)],
140                 true, clBaseResource, bbX, bbZ
141         );
142         createObjectGroup(group, 0);
144         // create metal mine
145         var mAngle = bbAngle;
146         while(abs(mAngle - bbAngle) < PI/3)
147                 mAngle = randFloat(0, TWO_PI);
149         var mDist = 12;
150         var mX = round(fx + mDist * cos(mAngle));
151         var mZ = round(fz + mDist * sin(mAngle));
152         group = new SimpleGroup(
153                 [new SimpleObject(oMetalLarge, 1,1, 0,0)],
154                 true, clBaseResource, mX, mZ
155         );
156         createObjectGroup(group, 0);
158         // create stone mines
159         mAngle += randFloat(PI/8, PI/4);
160         mX = round(fx + mDist * cos(mAngle));
161         mZ = round(fz + mDist * sin(mAngle));
162         group = new SimpleGroup(
163                 [new SimpleObject(oStoneLarge, 1,1, 0,2)],
164                 true, clBaseResource, mX, mZ
165         );
166         createObjectGroup(group, 0);
168         // create starting trees
169         var num = floor(hillSize / 100);
170         var tAngle = randFloat(-PI/3, 4*PI/3);
171         var tDist = randFloat(11, 13);
172         var tX = round(fx + tDist * cos(tAngle));
173         var tZ = round(fz + tDist * sin(tAngle));
174         group = new SimpleGroup(
175                 [new SimpleObject(oTree1, num, num, 0,5)],
176                 false, clBaseResource, tX, tZ
177         );
178         createObjectGroup(group, 0, avoidClasses(clBaseResource,2));
180         // create grass tufts
181         var num = hillSize / 250;
182         for (var j = 0; j < num; j++)
183         {
184                 var gAngle = randFloat(0, TWO_PI);
185                 var gDist = radius - (5 + randInt(7));
186                 var gX = round(fx + gDist * cos(gAngle));
187                 var gZ = round(fz + gDist * sin(gAngle));
188                 group = new SimpleGroup(
189                         [new SimpleObject(aGrassShort, 2,5, 0,1, -PI/8,PI/8)],
190                         false, clBaseResource, gX, gZ
191                 );
192                 createObjectGroup(group, 0);
193         }
196 log("Creating islands...");
197 placer = new ChainPlacer(floor(scaleByMapSize(4, 8)), floor(scaleByMapSize(8, 14)), floor(scaleByMapSize(25, 60)), 0.07, undefined, undefined, scaleByMapSize(30,70));
198 terrainPainter = new LayeredPainter(
199         [tMainTerrain, tMainTerrain],           // terrains
200         [2]                                                             // widths
202 elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 3, 4);
203 createAreas(
204         placer,
205         [terrainPainter, elevationPainter, paintClass(clLand)],
206         null,
207         scaleByMapSize(1, 5)*randInt(5,10)
210 paintTerrainBasedOnHeight(2.4, 3.4, 3, tMainTerrain);
211 paintTerrainBasedOnHeight(1, 3, 0, tShore);
212 paintTerrainBasedOnHeight(-8, 1, 2, tWater);
214 //creating the city patches for the players
215 for (var i = 0; i < numPlayers; i++)
217         var fx = fractionToTiles(playerX[i]);
218         var fz = fractionToTiles(playerZ[i]);
219         var ix = round(fx);
220         var iz = round(fz);
221         // create the city patch
222         var cityRadius = radius/3;
223         placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz);
224         var painter = new LayeredPainter([tRoadWild, tRoad], [1]);
225         createArea(placer, painter, null);
228 createBumps([avoidClasses(clPlayer, 10), stayClasses(clLand, 5)]);
230 if (randInt(1,2) == 1)
231         createHills([tMainTerrain, tCliff, tHill], [avoidClasses(clPlayer, 2, clHill, 15), stayClasses(clLand, 0)], clHill, scaleByMapSize(1, 4) * numPlayers);
232 else
233         createMountains(tCliff, [avoidClasses(clPlayer, 2, clHill, 15), stayClasses(clLand, 0)], clHill, scaleByMapSize(1, 4) * numPlayers);
235 createForests(
236  [tMainTerrain, tForestFloor1, tForestFloor2, pForest1, pForest2],
237  [avoidClasses(clPlayer, 20, clForest, 17, clHill, 0), stayClasses(clLand, 4)],
238  clForest,
239  1.0,
240  random_terrain
242 RMS.SetProgress(50);
244 log("Creating dirt patches...");
245 createLayeredPatches(
246  [scaleByMapSize(3, 6), scaleByMapSize(5, 10), scaleByMapSize(8, 21)],
247  [[tMainTerrain,tTier1Terrain],[tTier1Terrain,tTier2Terrain], [tTier2Terrain,tTier3Terrain]],
248  [1,1],
249  [avoidClasses(clForest, 0, clHill, 0, clDirt, 3, clPlayer, 12), stayClasses(clLand, 7)]
252 log("Creating grass patches...");
253 createPatches(
254  [scaleByMapSize(2, 4), scaleByMapSize(3, 7), scaleByMapSize(5, 15)],
255  tTier4Terrain,
256  [avoidClasses(clForest, 0, clHill, 0, clDirt, 3, clPlayer, 12), stayClasses(clLand, 7)]
258 RMS.SetProgress(55);
260 log("Creating stone mines...");
261 createMines(
263   [new SimpleObject(oStoneSmall, 0,2, 0,4), new SimpleObject(oStoneLarge, 1,1, 0,4)],
264   [new SimpleObject(oStoneSmall, 2,5, 1,3)]
265  ],
266  [avoidClasses(clForest, 1, clPlayer, 7, clRock, 10, clHill, 1), stayClasses(clLand, 6)]
269 log("Creating metal mines...");
270 createMines(
272   [new SimpleObject(oMetalLarge, 1,1, 0,4)]
273  ],
274  [avoidClasses(clForest, 1, clPlayer, 7, clMetal, 10, clRock, 5, clHill, 1), stayClasses(clLand, 6)],
275  clMetal
277 RMS.SetProgress(65);
279 log("Creating decoration...");
280 var planetm = random_terrain == g_BiomeTropic ? 8 : 1;
281 createDecoration
283  [[new SimpleObject(aRockMedium, 1,3, 0,1)],
284   [new SimpleObject(aRockLarge, 1,2, 0,1), new SimpleObject(aRockMedium, 1,3, 0,2)],
285   [new SimpleObject(aGrassShort, 1,2, 0,1, -PI/8,PI/8)],
286   [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)],
287   [new SimpleObject(aBushMedium, 1,2, 0,2), new SimpleObject(aBushSmall, 2,4, 0,2)]
288  ],
290   scaleByMapSize(16, 262),
291   scaleByMapSize(8, 131),
292   planetm * scaleByMapSize(13, 200),
293   planetm * scaleByMapSize(13, 200),
294   planetm * scaleByMapSize(13, 200)
295  ],
296  [avoidClasses(clForest, 0, clPlayer, 0, clHill, 0), stayClasses(clLand, 5)]
298 RMS.SetProgress(70);
300 log("Creating animals...");
301 createFood
304   [new SimpleObject(oMainHuntableAnimal, 5,7, 0,4)],
305   [new SimpleObject(oSecondaryHuntableAnimal, 2,3, 0,2)]
306  ],
308   3 * numPlayers,
309   3 * numPlayers
310  ],
311  [avoidClasses(clForest, 0, clPlayer, 1, clHill, 1, clFood, 20), stayClasses(clLand, 3)]
313 RMS.SetProgress(75);
315 log("Creating fruits...");
316 createFood
319   [new SimpleObject(oFruitBush, 5,7, 0,4)]
320  ],
322   3 * numPlayers
323  ],
324  [avoidClasses(clForest, 0, clPlayer, 1, clHill, 1, clFood, 10), stayClasses(clLand, 3)]
326 RMS.SetProgress(80);
328 log("Creating fish...");
329 createFood
332   [new SimpleObject(oFish, 2,3, 0,2)]
333  ],
335   25 * numPlayers
336  ],
337  avoidClasses(clLand, 3, clPlayer, 2, clFood, 20)
340 RMS.SetProgress(85);
342 log("Creating straggler trees...");
343 var types = [oTree1, oTree2, oTree4, oTree3];   // some variation
344 createStragglerTrees(types, [avoidClasses(clForest, 7, clHill, 1, clPlayer, 3, clMetal, 1, clRock, 1), stayClasses(clLand, 7)]);
345 setWaterWaviness(4.0);
346 setWaterType("ocean");
348 ExportMap();