Fix rmgen2 bug in rP17903 revealed by the 1* removal in rP20281.
[0ad.git] / binaries / data / mods / public / maps / random / hyrcanian_shores.js
blob8e5bb5921b302aa31d0ca136f08bb3b1b6800aa4
1 RMS.LoadLibrary("rmgen");
3 const tGrass = ["temp_grass_clovers"];
4 const tGrassPForest = "temp_plants_bog";
5 const tGrassDForest = "alpine_dirt_grass_50";
6 const tCliff = ["temp_cliff_a", "temp_cliff_b"];
7 const tGrassA = "temp_grass_d";
8 const tGrassB = "temp_grass_c";
9 const tGrassC = "temp_grass_clovers_2";
10 const tHill = ["temp_highlands", "temp_grass_long_b"];
11 const tDirt = ["temp_dirt_gravel", "temp_dirt_gravel_b"];
12 const tRoad = "temp_road";
13 const tRoadWild = "temp_road_overgrown";
14 const tGrassPatch = "temp_grass_plants";
15 const tShoreBlend = "temp_mud_plants";
16 const tShore = "medit_sand_wet";
17 const tWater = "medit_sand_wet";
19 const oPoplar = "gaia/flora_tree_poplar";
20 const oPalm = "gaia/flora_tree_cretan_date_palm_short";
21 const oApple = "gaia/flora_tree_apple";
22 const oOak = "gaia/flora_tree_oak";
23 const oBerryBush = "gaia/flora_bush_berry";
24 const oDeer = "gaia/fauna_deer";
25 const oFish = "gaia/fauna_fish";
26 const oGoat = "gaia/fauna_goat";
27 const oBoar = "gaia/fauna_boar";
28 const oStoneLarge = "gaia/geology_stonemine_temperate_quarry";
29 const oStoneSmall = "gaia/geology_stone_temperate";
30 const oMetalLarge = "gaia/geology_metal_temperate_slabs";
32 const aGrass = "actor|props/flora/grass_soft_large_tall.xml";
33 const aGrassShort = "actor|props/flora/grass_soft_large.xml";
34 const aRockLarge = "actor|geology/stone_granite_large.xml";
35 const aRockMedium = "actor|geology/stone_granite_med.xml";
36 const aBushMedium = "actor|props/flora/bush_medit_me_lush.xml";
37 const aBushSmall = "actor|props/flora/bush_medit_sm_lush.xml";
39 // terrain + entity (for painting)
40 const pForestD = [tGrassDForest + TERRAIN_SEPARATOR + oPoplar, tGrassDForest];
41 const pForestP = [tGrassPForest + TERRAIN_SEPARATOR + oOak, tGrassPForest];
43 InitMap();
45 const numPlayers = getNumPlayers();
46 const mapSize = getMapSize();
47 const mapArea = mapSize*mapSize;
49 var clPlayer = createTileClass();
50 var clHill = createTileClass();
51 var clForest = createTileClass();
52 var clWater = createTileClass();
53 var clDirt = createTileClass();
54 var clRock = createTileClass();
55 var clMetal = createTileClass();
56 var clFood = createTileClass();
57 var clBaseResource = createTileClass();
58 var clSettlement = createTileClass();
59 var clSea = createTileClass();
60 var clHighlands = createTileClass();
61 var clFlatlands = createTileClass();
63 var playerIDs = sortAllPlayers();
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((i + 1) / (numPlayers + 1));
76         var fz = fractionToTiles(0.4 + 0.2 * (i % 2));
77         var ix = round(fx);
78         var iz = round(fz);
80         addCivicCenterAreaToClass(ix, iz, clPlayer);
82         // create the city patch
83         var cityRadius = radius/3;
84         var placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz);
85         var painter = new LayeredPainter([tRoadWild, tRoad], [1]);
86         createArea(placer, painter, null);
88         placeCivDefaultEntities(fx, fz, id);
90         placeDefaultChicken(fx, fz, clBaseResource);
92         // create berry bushes
93         var bbAngle = randFloat(0, TWO_PI);
94         var bbDist = 12;
95         var bbX = round(fx + bbDist * cos(bbAngle));
96         var bbZ = round(fz + bbDist * sin(bbAngle));
97         var group = new SimpleGroup(
98                 [new SimpleObject(oBerryBush, 5,5, 0,3)],
99                 true, clBaseResource, bbX, bbZ
100         );
101         createObjectGroup(group, 0);
103         // create metal mine
104         var mAngle = bbAngle;
105         while(abs(mAngle - bbAngle) < PI/3)
106                 mAngle = randFloat(0, TWO_PI);
108         var mDist = 12;
109         var mX = round(fx + mDist * cos(mAngle));
110         var mZ = round(fz + mDist * sin(mAngle));
111         group = new SimpleGroup(
112                 [new SimpleObject(oMetalLarge, 1,1, 0,0)],
113                 true, clBaseResource, mX, mZ
114         );
115         createObjectGroup(group, 0);
117         // create stone mines
118         mAngle += randFloat(PI/8, PI/4);
119         mX = round(fx + mDist * cos(mAngle));
120         mZ = round(fz + mDist * sin(mAngle));
121         group = new SimpleGroup(
122                 [new SimpleObject(oStoneLarge, 1,1, 0,2)],
123                 true, clBaseResource, mX, mZ
124         );
125         createObjectGroup(group, 0);
127         // create starting trees
128         var num = 2;
129         var tAngle = randFloat(-PI/3, 4*PI/3);
130         var tDist = randFloat(11, 13);
131         var tX = round(fx + tDist * cos(tAngle));
132         var tZ = round(fz + tDist * sin(tAngle));
133         group = new SimpleGroup(
134                 [new SimpleObject(oOak, num, num, 0,5)],
135                 false, clBaseResource, tX, tZ
136         );
137         createObjectGroup(group, 0, avoidClasses(clBaseResource,2));
139         placeDefaultDecoratives(fx, fz, aGrassShort, clBaseResource, radius);
141 RMS.SetProgress(10);
143 paintRiver({
144         "horizontal": true,
145         "parallel": true,
146         "position": 1,
147         "width": 0.5,
148         "fadeDist": 0.05,
149         "deviation": 0,
150         "waterHeight": -3,
151         "landHeight": 1,
152         "meanderShort": 20,
153         "meanderLong": 0,
154         "waterFunc": (ix, iz, height) => {
156                 if (height < 0)
157                         addToClass(ix, iz, clWater);
159                 if (height < -1.5)
160                         placeTerrain(ix, iz, tWater);
161                 else
162                         placeTerrain(ix, iz, tShore);
163         },
164         "landFunc": (ix, iz, shoreDist1, shoreDist2) => {
165                 addToClass(ix, iz, clHighlands);
166         }
169 RMS.SetProgress(20);
171 log("Creating fish...");
173 num = scaleByMapSize(10, 20);
174 for (var i=0; i < num; i++){
175 group = new SimpleGroup(
176         [new SimpleObject(oFish, 2,3, 0,2)],
177         true, clFood
179 createObjectGroupsDeprecated(group, 0,
180         [stayClasses(clWater, 2), avoidClasses(clFood, 3)],
181         numPlayers, 50
185 RMS.SetProgress(25);
187 log("Creating bumps...");
188 placer = new ClumpPlacer(scaleByMapSize(20, 50), 0.3, 0.06, 1);
189 painter = new SmoothElevationPainter(ELEVATION_MODIFY, 4, 3);
190 createAreas(
191         placer,
192         painter,
193         stayClasses(clHighlands, 1),
194         scaleByMapSize(300, 600)
197 RMS.SetProgress(30);
199 log("Creating hills...");
200 placer = new ClumpPlacer(scaleByMapSize(20, 150), 0.2, 0.1, 1);
201 var terrainPainter = new LayeredPainter(
202         [tCliff, tHill],                // terrains
203         [2]                                                             // widths
205 var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 15, 2);
206 createAreas(
207         placer,
208         [terrainPainter, elevationPainter, paintClass(clHill)],
209         avoidClasses(clSea, 5, clPlayer, 20, clWater, 5, clHill, 15, clHighlands, 5),
210         scaleByMapSize(1, 4) * numPlayers
213 RMS.SetProgress(35);
215 // calculate desired number of trees for map (based on size)
216 const MIN_TREES = 500;
217 const MAX_TREES = 2500;
218 const P_FOREST = 0.7;
220 var totalTrees = scaleByMapSize(MIN_TREES, MAX_TREES);
221 var numForest = totalTrees * P_FOREST;
222 var numStragglers = totalTrees * (1.0 - P_FOREST);
224 log("Creating mainland forests...");
225 var types = [
226         [[tGrassDForest, tGrass, pForestD], [tGrassDForest, pForestD]]
227 ];      // some variation
228 var size = numForest*1.3 / (scaleByMapSize(2,8) * numPlayers);
229 var num = floor(0.7*size / types.length);
230 for (var i = 0; i < types.length; ++i)
232         placer = new ClumpPlacer(numForest / num, 0.1, 0.1, 1);
233         painter = new LayeredPainter(
234                 types[i],               // terrains
235                 [2]                                                                                     // widths
236                 );
237         createAreas(
238                 placer,
239                 [painter, paintClass(clForest)],
240                 avoidClasses(clPlayer, 20, clWater, 3, clForest, 10, clHill, 0, clSea, 6, clBaseResource, 3),
241                 num
242         );
244 RMS.SetProgress(45);
246 log("Creating highland forests...");
247 var types = [
248         [[tGrassDForest, tGrass, pForestP], [tGrassDForest, pForestP]]
249 ];      // some variation
250 var size = numForest / (scaleByMapSize(2,8) * numPlayers);
251 var num = floor(size / types.length);
252 for (var i = 0; i < types.length; ++i)
254         placer = new ClumpPlacer(numForest / num, 0.1, 0.1, 1);
255         painter = new LayeredPainter(
256                 types[i],               // terrains
257                 [2]                                                                                     // widths
258                 );
259         createAreas(
260                 placer,
261                 [painter, paintClass(clForest)],
262                 avoidClasses(clPlayer, 20, clWater, 3, clForest, 2, clHill, 0, clSea, 6, clFlatlands, 3),
263                 num
264         );
266 RMS.SetProgress(70);
268 log("Creating dirt patches...");
269 var sizes = [scaleByMapSize(3, 48), scaleByMapSize(5, 84), scaleByMapSize(8, 128)];
270 for (var i = 0; i < sizes.length; i++)
272         placer = new ClumpPlacer(sizes[i], 0.3, 0.06, 0.5);
273         painter = new LayeredPainter(
274                 [[tGrass,tGrassA],[tGrassA,tGrassB], [tGrassB,tGrassC]],                // terrains
275                 [1,1]                                                                                                                   // widths
276         );
277         createAreas(
278                 placer,
279                 [painter, paintClass(clDirt)],
280                 avoidClasses(clWater, 1, clForest, 0, clHill, 0, clDirt, 5, clPlayer, 4, clSea, 0),
281                 scaleByMapSize(15, 45)
282         );
284 RMS.SetProgress(75);
286 log("Creating grass patches...");
287 var sizes = [scaleByMapSize(2, 32), scaleByMapSize(3, 48), scaleByMapSize(5, 80)];
288 for (var i = 0; i < sizes.length; i++)
290         placer = new ClumpPlacer(sizes[i], 0.3, 0.06, 0.5);
291         painter = new LayeredPainter([tGrassC, tGrassPatch], [2]);
292         createAreas(
293                 placer,
294                 painter,
295                 avoidClasses(clWater, 1, clForest, 0, clHill, 0, clDirt, 5, clPlayer, 4, clSea, 0),
296                 scaleByMapSize(15, 45)
297         );
300 RMS.SetProgress(80);
302 log("Creating stone mines...");
303 group = new SimpleGroup([new SimpleObject(oStoneSmall, 0,2, 0,4), new SimpleObject(oStoneLarge, 1,1, 0,4)], true, clRock);
304 createObjectGroupsDeprecated(group, 0,
305         [avoidClasses(clWater, 0, clForest, 1, clPlayer, 20, clRock, 10, clSea, 2, clHill, 2)],
306         scaleByMapSize(4,16), 100
309 log("Creating small stone quarries...");
310 group = new SimpleGroup([new SimpleObject(oStoneSmall, 2,5, 1,3)], true, clRock);
311 createObjectGroupsDeprecated(group, 0,
312         [avoidClasses(clWater, 0, clForest, 1, clPlayer, 20, clRock, 10, clSea, 2, clHill, 2)],
313         scaleByMapSize(4,16), 100
316 log("Creating metal mines...");
317 group = new SimpleGroup([new SimpleObject(oMetalLarge, 1,1, 0,4)], true, clMetal);
318 createObjectGroupsDeprecated(group, 0,
319         [avoidClasses(clWater, 0, clForest, 1, clPlayer, 20, clMetal, 10, clRock, 5, clSea, 0, clHill, 2)],
320         scaleByMapSize(4,16), 100
323 RMS.SetProgress(85);
325 log("Creating small decorative rocks...");
326 group = new SimpleGroup(
327         [new SimpleObject(aRockMedium, 1,3, 0,1)],
328         true
330 createObjectGroupsDeprecated(
331         group, 0,
332         avoidClasses(clWater, 0, clForest, 0, clPlayer, 0, clHill, 0, clSea, 0),
333         scaleByMapSize(16, 262), 50
335 RMS.SetProgress(90);
337 log("Creating large decorative rocks...");
338 group = new SimpleGroup(
339         [new SimpleObject(aRockLarge, 1,2, 0,1), new SimpleObject(aRockMedium, 1,3, 0,2)],
340         true
342 createObjectGroupsDeprecated(
343         group, 0,
344         avoidClasses(clWater, 0, clForest, 0, clPlayer, 0, clHill, 0, clSea, 0),
345         scaleByMapSize(8, 131), 50
348 log("Creating deer...");
349 group = new SimpleGroup(
350         [new SimpleObject(oDeer, 5,7, 0,4)],
351         true, clFood
353 createObjectGroupsDeprecated(group, 0,
354         avoidClasses(clWater, 0, clForest, 0, clPlayer, 20, clHill, 0, clFood, 5, clSea, 0, clFlatlands, 0),
355         6 * numPlayers, 50
358 log("Creating sheep...");
359 group = new SimpleGroup(
360         [new SimpleObject(oGoat, 2,3, 0,2)],
361         true, clFood
363 createObjectGroupsDeprecated(group, 0,
364         avoidClasses(clWater, 0, clForest, 0, clPlayer, 20, clHill, 0, clFood, 20, clSea, 0),
365         3 * numPlayers, 50
368 log("Creating berry bush...");
369 group = new SimpleGroup(
370         [new SimpleObject(oBerryBush, 5,7, 0,4)],
371         true, clFood
373 createObjectGroupsDeprecated(group, 0,
374         avoidClasses(clWater, 6, clForest, 0, clPlayer, 20, clHill, 1, clFood, 10),
375         randIntInclusive(1, 4) * numPlayers + 2, 50
378 log("Creating boar...");
379 group = new SimpleGroup(
380         [new SimpleObject(oBoar, 2,3, 0,2)],
381         true, clFood
383 createObjectGroupsDeprecated(group, 0,
384         avoidClasses(clWater, 0, clForest, 0, clPlayer, 20, clHill, 0, clFood, 20, clSea, 0, clFlatlands, 0),
385         2 * numPlayers, 50
388 log("Creating straggler trees...");
389 var types = [oPoplar, oPalm, oApple];   // some variation
390 var num = floor(numStragglers / types.length);
391 for (var i = 0; i < types.length; ++i)
393         group = new SimpleGroup(
394                 [new SimpleObject(types[i], 1,1, 0,3)],
395                 true, clForest
396         );
397         createObjectGroupsDeprecated(group, 0,
398                 avoidClasses(clWater, 1, clForest, 1, clHill, 1, clPlayer, 10, clMetal, 6, clRock, 6, clSea, 1, clHighlands, 25),
399                 num
400         );
403 log("Creating small grass tufts...");
404 group = new SimpleGroup(
405         [new SimpleObject(aGrassShort, 1,2, 0,1, -PI/8,PI/8)]
407 createObjectGroupsDeprecated(group, 0,
408         avoidClasses(clWater, 2, clHill, 2, clPlayer, 2, clDirt, 0, clSea, 1),
409         scaleByMapSize(13, 200)
412 log("Creating large grass tufts...");
413 group = new SimpleGroup(
414         [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)]
416 createObjectGroupsDeprecated(group, 0,
417         avoidClasses(clWater, 3, clHill, 2, clPlayer, 2, clDirt, 1, clForest, 0, clSea, 1),
418         scaleByMapSize(13, 200)
420 RMS.SetProgress(95);
422 log("Creating bushes...");
423 group = new SimpleGroup(
424         [new SimpleObject(aBushMedium, 1,2, 0,2), new SimpleObject(aBushSmall, 2,4, 0,2)]
426 createObjectGroupsDeprecated(group, 0,
427         avoidClasses(clWater, 1, clHill, 1, clPlayer, 1, clDirt, 1, clSea, 1),
428         scaleByMapSize(13, 200), 50
431 setSkySet("cirrus");
432 setWaterColor(0.114, 0.192, 0.463);
433 setWaterTint(0.255, 0.361, 0.651);
434 setWaterWaviness(2.0);
435 setWaterType("ocean");
436 setWaterMurkiness(0.83);
438 ExportMap();