Remove rmgen euclidian distance helper function, refs rP20328 / D969.
[0ad.git] / binaries / data / mods / public / maps / random / gear.js
bloba315756d5eaf9fc74d0609dc26af3b2a2a6484d8
1 RMS.LoadLibrary("rmgen");
2 RMS.LoadLibrary("rmbiome");
4 TILE_CENTERED_HEIGHT_MAP = true;
6 setSelectedBiome();
8 const tMainTerrain = g_Terrains.mainTerrain;
9 const tForestFloor1 = g_Terrains.forestFloor1;
10 const tForestFloor2 = g_Terrains.forestFloor2;
11 const tCliff = g_Terrains.cliff;
12 const tTier1Terrain = g_Terrains.tier1Terrain;
13 const tTier2Terrain = g_Terrains.tier2Terrain;
14 const tTier3Terrain = g_Terrains.tier3Terrain;
15 const tHill = g_Terrains.mainTerrain;
16 const tRoad = g_Terrains.road;
17 const tRoadWild = g_Terrains.roadWild;
18 const tTier4Terrain = g_Terrains.tier4Terrain;
19 const tShore = g_Terrains.shore;
20 const tWater = g_Terrains.water;
22 const oTree1 = g_Gaia.tree1;
23 const oTree2 = g_Gaia.tree2;
24 const oTree3 = g_Gaia.tree3;
25 const oTree4 = g_Gaia.tree4;
26 const oTree5 = g_Gaia.tree5;
27 const oFruitBush = g_Gaia.fruitBush;
28 const oMainHuntableAnimal = g_Gaia.mainHuntableAnimal;
29 const oFish = g_Gaia.fish;
30 const oSecondaryHuntableAnimal = g_Gaia.secondaryHuntableAnimal;
31 const oStoneLarge = g_Gaia.stoneLarge;
32 const oStoneSmall = g_Gaia.stoneSmall;
33 const oMetalLarge = g_Gaia.metalLarge;
35 const aGrass = g_Decoratives.grass;
36 const aGrassShort = g_Decoratives.grassShort;
37 const aRockLarge = g_Decoratives.rockLarge;
38 const aRockMedium = g_Decoratives.rockMedium;
39 const aBushMedium = g_Decoratives.bushMedium;
40 const aBushSmall = g_Decoratives.bushSmall;
42 const pForest1 = [tForestFloor2 + TERRAIN_SEPARATOR + oTree1, tForestFloor2 + TERRAIN_SEPARATOR + oTree2, tForestFloor2];
43 const pForest2 = [tForestFloor1 + TERRAIN_SEPARATOR + oTree4, tForestFloor1 + TERRAIN_SEPARATOR + oTree5, tForestFloor1];
45 InitMap();
47 const numPlayers = getNumPlayers();
48 const mapSize = getMapSize();
49 const mapArea = mapSize*mapSize;
51 var clPlayer = createTileClass();
52 var clHill = createTileClass();
53 var clForest = createTileClass();
54 var clWater = createTileClass();
55 var clDirt = createTileClass();
56 var clRock = createTileClass();
57 var clMetal = createTileClass();
58 var clFood = createTileClass();
59 var clBaseResource = createTileClass();
61 initTerrain(tMainTerrain);
63 var [playerIDs, playerX, playerZ, playerAngle, startAngle] = radialPlayerPlacement();
65 for (var i = 0; i < numPlayers; i++)
67         var id = playerIDs[i];
68         log("Creating base for player " + id + "...");
70         var radius = scaleByMapSize(15,25);
71         var cliffRadius = 2;
72         var elevation = 20;
74         // get the x and z in tiles
75         var fx = fractionToTiles(playerX[i]);
76         var fz = fractionToTiles(playerZ[i]);
77         var ix = round(fx);
78         var iz = round(fz);
79         addCivicCenterAreaToClass(ix, iz, clPlayer);
81         // create the city patch
82         var cityRadius = radius/3;
83         placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz);
84         var painter = new LayeredPainter([tRoadWild, tRoad], [1]);
85         createArea(placer, painter, null);
87         placeCivDefaultEntities(fx, fz, id, { 'iberWall': 'towers' });
89         placeDefaultChicken(fx, fz, clBaseResource);
91         // create berry bushes
92         var bbAngle = randFloat(0, TWO_PI);
93         var bbDist = 12;
94         var bbX = round(fx + bbDist * cos(bbAngle));
95         var bbZ = round(fz + bbDist * sin(bbAngle));
96         var group = new SimpleGroup(
97                 [new SimpleObject(oFruitBush, 5,5, 0,3)],
98                 true, clBaseResource, bbX, bbZ
99         );
100         createObjectGroup(group, 0);
102         // create metal mine
103         var mAngle = bbAngle;
104         while(abs(mAngle - bbAngle) < PI/3)
105                 mAngle = randFloat(0, TWO_PI);
107         var mDist = 12;
108         var mX = round(fx + mDist * cos(mAngle));
109         var mZ = round(fz + mDist * sin(mAngle));
110         group = new SimpleGroup(
111                 [new SimpleObject(oMetalLarge, 1,1, 0,0)],
112                 true, clBaseResource, mX, mZ
113         );
114         createObjectGroup(group, 0);
116         // create stone mines
117         mAngle += randFloat(PI/8, PI/4);
118         mX = round(fx + mDist * cos(mAngle));
119         mZ = round(fz + mDist * sin(mAngle));
120         group = new SimpleGroup(
121                 [new SimpleObject(oStoneLarge, 1,1, 0,2)],
122                 true, clBaseResource, mX, mZ
123         );
124         createObjectGroup(group, 0);
126         // create starting trees
127         var num = 2;
128         var tAngle = randFloat(0, TWO_PI);
129         var tDist = randFloat(12, 13);
130         var tX = round(fx + tDist * cos(tAngle));
131         var tZ = round(fz + tDist * sin(tAngle));
132         group = new SimpleGroup(
133                 [new SimpleObject(oTree1, num, num, 0,3)],
134                 false, clBaseResource, tX, tZ
135         );
136         createObjectGroup(group, 0, avoidClasses(clBaseResource,2));
138         placeDefaultDecoratives(fx, fz, aGrassShort, clBaseResource, radius);
141 RMS.SetProgress(20);
143 var split = 1;
144 if (mapSize == 128 && numPlayers <= 2)
145         split = 2;
146 else if (mapSize == 192 && numPlayers <= 3)
147         split = 2;
148 else if (mapSize == 256)
150         if (numPlayers <= 3)
151                 split = 3;
152         else if (numPlayers == 4)
153                 split = 2;
155 else if (mapSize == 320)
157         if (numPlayers <= 3)
158                 split = 3;
159         else if (numPlayers == 4)
160                 split = 2;
162 else if (mapSize == 384)
164         if (numPlayers <= 3)
165                 split = 4;
166         else if (numPlayers == 4)
167                 split = 3;
168         else if (numPlayers == 5)
169                 split = 2;
171 else if (mapSize == 448)
173         if (numPlayers <= 2)
174                 split = 5;
175         else if (numPlayers <= 4)
176                 split = 4;
177         else if (numPlayers == 5)
178                 split = 3;
179         else if (numPlayers == 6)
180                 split = 2;
183 log ("Creating big circular lake...");
184 var center = Math.round(fractionToTiles(0.5));
185 createArea(
186         new ClumpPlacer(mapArea * 0.23, 1, 1, 10, center, center),
187         new SmoothElevationPainter(ELEVATION_SET, -3, 4),
188         null);
190 for (let m = 0; m < numPlayers * split; ++m)
192         log("Creating rivers between players...");
193         let angle = startAngle + (m + 0.5) * 2 * Math.PI / (numPlayers * split);
194         createArea(
195                 new PathPlacer(
196                         fractionToTiles(0.5 + 0.15 * Math.cos(angle)),
197                         fractionToTiles(0.5 + 0.15 * Math.sin(angle)),
198                         fractionToTiles(0.5 + 0.6 * Math.cos(angle)),
199                         fractionToTiles(0.5 + 0.6 * Math.sin(angle)),
200                         scaleByMapSize(14, 40),
201                         0,
202                         3 * scaleByMapSize(1, 3),
203                         0.2,
204                         0.05),
205                 new SmoothElevationPainter(ELEVATION_SET, -4, 4),
206             avoidClasses(clPlayer, 5));
208         log("Create path from the island to the center...");
209         angle = startAngle + m * 2 * Math.PI / (numPlayers * split);
210         createArea(
211                 new PathPlacer(
212                         fractionToTiles(0.5 + 0.05 * Math.cos(angle)),
213                         fractionToTiles(0.5 + 0.05 * Math.sin(angle)),
214                         fractionToTiles(0.5 + 0.49 * Math.cos(angle)),
215                         fractionToTiles(0.5 + 0.49 * Math.sin(angle)),
216                         scaleByMapSize(10, 40),
217                         0,
218                         3 * scaleByMapSize(1, 3),
219                         0.2,
220                         0.05),
221                 new SmoothElevationPainter(ELEVATION_SET, 3, 4),
222                 null);
225 log("Creating ring of land connecting players...");
226 createArea(
227         new ClumpPlacer(mapArea * 0.15, 1, 1, 10, center, center),
228         new SmoothElevationPainter(ELEVATION_SET, 4, 4),
229         null);
231 log("Creating ring of water separating the central hill from the ring...");
232 createArea(
233         new ClumpPlacer(mapArea * 0.09, 1, 1, 10, center, center),
234         new SmoothElevationPainter(ELEVATION_SET, -2, 3),
235         null);
237 log("Creating central island...");
238 createArea(
239         new ClumpPlacer(Math.square(mapSize - 50) * 0.09, 1, 1, 10, center, center),
240         new SmoothElevationPainter(ELEVATION_SET, 4, 3),
241         null);
243 log("Creating hill on the central island...");
244 createArea(
245         new ClumpPlacer(Math.pow(scaleByMapSize(6, 18), 2) * 22, 1, 1, 10, center, center),
246         new SmoothElevationPainter(ELEVATION_SET, 20, 8),
247         null);
249 paintTerrainBasedOnHeight(-6, 1, 1, tWater);
250 paintTerrainBasedOnHeight(1, 2, 1, tShore);
251 paintTerrainBasedOnHeight(2, 21, 1, tMainTerrain);
253 paintTileClassBasedOnHeight(-6, 0.5, 1, clWater);
255 for (var i = 0; i < numPlayers; i++)
257         fx = fractionToTiles(playerX[i]);
258         fz = fractionToTiles(playerZ[i]);
259         ix = round(fx);
260         iz = round(fz);
262         // create the city patch
263         var cityRadius = radius/3;
264         var placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz);
265         var painter = new LayeredPainter([tRoadWild, tRoad], [1]);
266         createArea(placer, painter, null);
269 if (randBool())
270         createHills([tMainTerrain, tCliff, tHill], avoidClasses(clPlayer, 20, clHill, 15, clWater, 2), clHill, scaleByMapSize(1, 4) * numPlayers);
271 else
272         createMountains(tCliff, avoidClasses(clPlayer, 20, clHill, 15, clWater, 2), clHill, scaleByMapSize(1, 4) * numPlayers);
274 createForests(
275  [tMainTerrain, tForestFloor1, tForestFloor2, pForest1, pForest2],
276  avoidClasses(clPlayer, 20, clForest, 17, clHill, 0, clWater, 2),
277  clForest,
278  1,
279  ...rBiomeTreeCount(1));
281 RMS.SetProgress(50);
283 log("Creating dirt patches...");
284 createLayeredPatches(
285  [scaleByMapSize(3, 6), scaleByMapSize(5, 10), scaleByMapSize(8, 21)],
286  [[tMainTerrain,tTier1Terrain],[tTier1Terrain,tTier2Terrain], [tTier2Terrain,tTier3Terrain]],
287  [1,1],
288  avoidClasses(clWater, 3, clForest, 0, clHill, 0, clDirt, 5, clPlayer, 12)
291 log("Creating grass patches...");
292 createPatches(
293  [scaleByMapSize(2, 4), scaleByMapSize(3, 7), scaleByMapSize(5, 15)],
294  tTier4Terrain,
295  avoidClasses(clWater, 3, clForest, 0, clHill, 0, clDirt, 5, clPlayer, 12)
298 RMS.SetProgress(55);
300 log("Creating stone mines...");
301 createMines(
303   [new SimpleObject(oStoneSmall, 0,2, 0,4), new SimpleObject(oStoneLarge, 1,1, 0,4)],
304   [new SimpleObject(oStoneSmall, 2,5, 1,3)]
305  ],
306  avoidClasses(clWater, 3, clForest, 1, clPlayer, 20, clRock, 10, clHill, 1)
309 log("Creating metal mines...");
310 createMines(
312   [new SimpleObject(oMetalLarge, 1,1, 0,4)]
313  ],
314  avoidClasses(clWater, 3, clForest, 1, clPlayer, 20, clMetal, 10, clRock, 5, clHill, 1),
315  clMetal
318 log("Creating fish...");
319 createObjectGroupsDeprecated(
320         new SimpleGroup([new SimpleObject(oFish, 1,1, 0,3)], true, clFood),
321         0,
322         [stayClasses(clWater, 8), avoidClasses(clFood, 14)],
323         scaleByMapSize(400, 2000),
324         100);
326 RMS.SetProgress(65);
328 var planetm = 1;
330 if (currentBiome() == "tropic")
331         planetm = 8;
333 createDecoration
335  [[new SimpleObject(aRockMedium, 1,3, 0,1)],
336   [new SimpleObject(aRockLarge, 1,2, 0,1), new SimpleObject(aRockMedium, 1,3, 0,2)],
337   [new SimpleObject(aGrassShort, 1,2, 0,1, -PI/8,PI/8)],
338   [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)],
339   [new SimpleObject(aBushMedium, 1,2, 0,2), new SimpleObject(aBushSmall, 2,4, 0,2)]
340  ],
342   scaleByMapSize(16, 262),
343   scaleByMapSize(8, 131),
344   planetm * scaleByMapSize(13, 200),
345   planetm * scaleByMapSize(13, 200),
346   planetm * scaleByMapSize(13, 200)
347  ],
348  avoidClasses(clWater, 0, clForest, 0, clPlayer, 0, clHill, 0)
351 RMS.SetProgress(70);
353 createFood
356   [new SimpleObject(oMainHuntableAnimal, 5,7, 0,4)],
357   [new SimpleObject(oSecondaryHuntableAnimal, 2,3, 0,2)]
358  ],
360   3 * numPlayers,
361   3 * numPlayers
362  ],
363  avoidClasses(clWater, 3, clForest, 0, clPlayer, 20, clHill, 1, clFood, 20)
366 createFood
369   [new SimpleObject(oFruitBush, 5,7, 0,4)]
370  ],
372   3 * numPlayers
373  ],
374  avoidClasses(clWater, 3, clForest, 0, clPlayer, 20, clHill, 1, clFood, 10)
377 createStragglerTrees(
378         [oTree1, oTree2, oTree4, oTree3],
379         avoidClasses(clWater, 5, clForest, 7, clHill, 1, clPlayer, 12, clMetal, 6, clRock, 6));
381 ExportMap();