Unify Caledonian Meadows and Wild Lake player location duplication from rP19704 ...
[0ad.git] / binaries / data / mods / public / maps / random / alpine_lakes.js
blob1a04be595d3d041b24fc76189256625d57b10b72
1 RMS.LoadLibrary("rmgen");
3 // late spring
4 if (randBool())
6         setFogThickness(0.26);
7         setFogFactor(0.4);
9         setPPEffect("hdr");
10         setPPSaturation(0.48);
11         setPPContrast(0.53);
12         setPPBloom(0.12);
14         var tPrimary = ["alpine_dirt_grass_50"];
15         var tForestFloor = "alpine_forrestfloor";
16         var tCliff = ["alpine_cliff_a", "alpine_cliff_b", "alpine_cliff_c"];
17         var tSecondary = "alpine_grass_rocky";
18         var tHalfSnow = ["alpine_grass_snow_50", "alpine_dirt_snow"];
19         var tSnowLimited = ["alpine_snow_rocky"];
20         var tDirt = "alpine_dirt";
21         var tRoad = "new_alpine_citytile";
22         var tRoadWild = "new_alpine_citytile";
23         var tShore = "alpine_shore_rocks_grass_50";
24         var tWater = "alpine_shore_rocks";
26         // gaia entities
27         var oPine = "gaia/flora_tree_pine";
28         var oBerryBush = "gaia/flora_bush_berry";
29         var oDeer = "gaia/fauna_deer";
30         var oFish = "gaia/fauna_fish";
31         var oRabbit = "gaia/fauna_rabbit";
32         var oStoneLarge = "gaia/geology_stonemine_alpine_quarry";
33         var oStoneSmall = "gaia/geology_stone_alpine_a";
34         var oMetalLarge = "gaia/geology_metal_alpine_slabs";
36         // decorative props
37         var aGrass = "actor|props/flora/grass_soft_small_tall.xml";
38         var aGrassShort = "actor|props/flora/grass_soft_large.xml";
39         var aRockLarge = "actor|geology/stone_granite_med.xml";
40         var aRockMedium = "actor|geology/stone_granite_med.xml";
41         var aBushMedium = "actor|props/flora/bush_medit_me.xml";
42         var aBushSmall = "actor|props/flora/bush_medit_sm.xml";
44 else
45 //winter
47         setFogFactor(0.35);
48         setFogThickness(0.19);
49         setPPSaturation(0.37);
50         setPPEffect("hdr");
52         var tPrimary = ["alpine_snow_a", "alpine_snow_b"];
53         var tForestFloor = "alpine_forrestfloor_snow";
54         var tCliff = ["alpine_cliff_snow"];
55         var tSecondary = "alpine_grass_snow_50";
56         var tHalfSnow = ["alpine_grass_snow_50", "alpine_dirt_snow"];
57         var tSnowLimited = ["alpine_snow_a", "alpine_snow_b"];
58         var tDirt = "alpine_dirt";
59         var tRoad = "new_alpine_citytile";
60         var tRoadWild = "new_alpine_citytile";
61         var tShore = "alpine_shore_rocks_icy";
62         var tWater = "alpine_shore_rocks";
64         // gaia entities
65         var oPine = "gaia/flora_tree_pine_w";
66         var oBerryBush = "gaia/flora_bush_berry";
67         var oDeer = "gaia/fauna_deer";
68         var oFish = "gaia/fauna_fish";
69         var oRabbit = "gaia/fauna_rabbit";
70         var oStoneLarge = "gaia/geology_stonemine_alpine_quarry";
71         var oStoneSmall = "gaia/geology_stone_alpine_a";
72         var oMetalLarge = "gaia/geology_metal_alpine_slabs";
74         // decorative props
75         var aGrass = "actor|props/flora/grass_soft_dry_small_tall.xml";
76         var aGrassShort = "actor|props/flora/grass_soft_dry_large.xml";
77         var aRockLarge = "actor|geology/stone_granite_med.xml";
78         var aRockMedium = "actor|geology/stone_granite_med.xml";
79         var aBushMedium = "actor|props/flora/bush_medit_me_dry.xml";
80         var aBushSmall = "actor|props/flora/bush_medit_sm_dry.xml";
83 //other constants
84 const pForest = [tForestFloor + TERRAIN_SEPARATOR + oPine, tForestFloor];
86 InitMap();
88 const numPlayers = getNumPlayers();
89 const mapSize = getMapSize();
91 var clPlayer = createTileClass();
92 var clHill = createTileClass();
93 var clForest = createTileClass();
94 var clWater = createTileClass();
95 var clDirt = createTileClass();
96 var clRock = createTileClass();
97 var clMetal = createTileClass();
98 var clFood = createTileClass();
99 var clBaseResource = createTileClass();
101 initTerrain(tPrimary);
103 var [playerIDs, playerX, playerZ] = radialPlayerPlacement();
105 for (var i = 0; i < numPlayers; i++)
107         var id = playerIDs[i];
108         log("Creating base for player " + id + "...");
110         var radius = scaleByMapSize(15,25);
111         var cliffRadius = 2;
112         var elevation = 20;
114         // get the x and z in tiles
115         var fx = fractionToTiles(playerX[i]);
116         var fz = fractionToTiles(playerZ[i]);
117         var ix = round(fx);
118         var iz = round(fz);
119         addCivicCenterAreaToClass(ix, iz, clPlayer);
121         // create the city patch
122         var cityRadius = radius/3;
123         var placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz);
124         var painter = new LayeredPainter([tRoadWild, tRoad], [1]);
125         createArea(placer, painter, null);
127         placeCivDefaultEntities(fx, fz, id);
129         placeDefaultChicken(fx, fz, clBaseResource);
131         // create berry bushes
132         var bbAngle = randFloat(0, TWO_PI);
133         var bbDist = 12;
134         var bbX = round(fx + bbDist * cos(bbAngle));
135         var bbZ = round(fz + bbDist * sin(bbAngle));
136         var group = new SimpleGroup(
137                 [new SimpleObject(oBerryBush, 5,5, 0,3)],
138                 true, clBaseResource, bbX, bbZ
139         );
140         createObjectGroup(group, 0);
142         // create metal mine
143         var mAngle = bbAngle;
144         while(abs(mAngle - bbAngle) < PI/3)
145                 mAngle = randFloat(0, TWO_PI);
147         var mDist = 12;
148         var mX = round(fx + mDist * cos(mAngle));
149         var mZ = round(fz + mDist * sin(mAngle));
150         group = new SimpleGroup(
151                 [new SimpleObject(oMetalLarge, 1,1, 0,0)],
152                 true, clBaseResource, mX, mZ
153         );
154         createObjectGroup(group, 0);
156         // create stone mines
157         mAngle += randFloat(PI/8, PI/4);
158         mX = round(fx + mDist * cos(mAngle));
159         mZ = round(fz + mDist * sin(mAngle));
160         group = new SimpleGroup(
161                 [new SimpleObject(oStoneLarge, 1,1, 0,2)],
162                 true, clBaseResource, mX, mZ
163         );
164         createObjectGroup(group, 0);
165         var hillSize = PI * radius * radius;
166         // create starting trees
167         var num = floor(hillSize / 100);
168         var tAngle = randFloat(-PI/3, 4*PI/3);
169         var tDist = randFloat(11, 13);
170         var tX = round(fx + tDist * cos(tAngle));
171         var tZ = round(fz + tDist * sin(tAngle));
172         group = new SimpleGroup(
173                 [new SimpleObject(oPine, num, num, 0,5)],
174                 false, clBaseResource, tX, tZ
175         );
176         createObjectGroup(group, 0, avoidClasses(clBaseResource,2));
178         placeDefaultDecoratives(fx, fz, aGrassShort, clBaseResource, radius);
181 RMS.SetProgress(20);
183 log("Creating hills...");
184 createMountains(tCliff, avoidClasses(clPlayer, 20, clHill, 8), clHill, scaleByMapSize(10, 40) * numPlayers, floor(scaleByMapSize(40, 60)), floor(scaleByMapSize(4, 5)), floor(scaleByMapSize(7, 15)), floor(scaleByMapSize(5, 15)));
186 RMS.SetProgress(30);
188 var lakeAreas = [];
189 var playerConstraint = new AvoidTileClassConstraint(clPlayer, 20);
190 var waterConstraint = new AvoidTileClassConstraint(clWater, 8);
192 for (var x = 0; x < mapSize; ++x)
193         for (var z = 0; z < mapSize; ++z)
194                 if (playerConstraint.allows(x, z) && waterConstraint.allows(x, z))
195                         lakeAreas.push([x, z]);
197 var lakeAreaLen;
199 log("Creating lakes...");
201 var numLakes = scaleByMapSize(5, 16);
202 for (var i = 0; i < numLakes; ++i)
204         lakeAreaLen = lakeAreas.length;
205         if (!lakeAreaLen)
206                 break;
208         let chosenPoint = pickRandom(lakeAreas);
210         let newLake = createAreas(
211                 new ChainPlacer(1, Math.floor(scaleByMapSize(4, 8)), Math.floor(scaleByMapSize(40, 180)), 0.7, chosenPoint[0], chosenPoint[1]),
212                 [
213                         new LayeredPainter([tShore, tWater, tWater], [1, 3]),
214                         new SmoothElevationPainter(ELEVATION_SET, -5, 5),
215                         paintClass(clWater)
216                 ],
217                 avoidClasses(clPlayer, 20, clWater, 8),
218                 1, 1
219         );
221         if (newLake && newLake.length)
222         {
223                 var n = 0;
224                 for (var j = 0; j < lakeAreaLen; ++j)
225                 {
226                         var x = lakeAreas[j][0], z = lakeAreas[j][1];
227                         if (playerConstraint.allows(x, z) && waterConstraint.allows(x, z))
228                                 lakeAreas[n++] = lakeAreas[j];
229                 }
230                 lakeAreas.length = n;
231         }
234 paintTerrainBasedOnHeight(3, floor(scaleByMapSize(20, 40)), 0, tCliff);
235 paintTerrainBasedOnHeight(floor(scaleByMapSize(20, 40)), 100, 3, tSnowLimited);
237 createBumps(avoidClasses(clWater, 2, clPlayer, 20));
239 var [forestTrees, stragglerTrees] = getTreeCounts(500, 3000, 0.7);
240 createForests(
241  [tPrimary, tForestFloor, tForestFloor, pForest, pForest],
242  avoidClasses(clPlayer, 20, clForest, 17, clHill, 0, clWater, 2),
243  clForest,
244  forestTrees);
246 RMS.SetProgress(60);
248 log("Creating dirt patches...");
249 createLayeredPatches(
250  [scaleByMapSize(3, 6), scaleByMapSize(5, 10), scaleByMapSize(8, 21)],
251  [[tDirt,tHalfSnow], [tHalfSnow,tSnowLimited]],
252  [2],
253  avoidClasses(clWater, 3, clForest, 0, clHill, 0, clDirt, 5, clPlayer, 12),
254  scaleByMapSize(15, 45),
255  clDirt);
257 log("Creating grass patches...");
258 createPatches(
259  [scaleByMapSize(2, 4), scaleByMapSize(3, 7), scaleByMapSize(5, 15)],
260  tSecondary,
261  avoidClasses(clWater, 3, clForest, 0, clHill, 0, clDirt, 5, clPlayer, 12),
262  scaleByMapSize(15, 45),
263  clDirt);
264 RMS.SetProgress(65);
266 log("Creating stone mines...");
267 createMines(
269   [new SimpleObject(oStoneSmall, 0,2, 0,4), new SimpleObject(oStoneLarge, 1,1, 0,4)],
270   [new SimpleObject(oStoneSmall, 2,5, 1,3)]
271  ],
272  avoidClasses(clWater, 3, clForest, 1, clPlayer, 20, clRock, 10, clHill, 1),
273  clRock);
275 log("Creating metal mines...");
276 createMines(
278   [new SimpleObject(oMetalLarge, 1,1, 0,4)]
279  ],
280  avoidClasses(clWater, 3, clForest, 1, clPlayer, 20, clMetal, 10, clRock, 5, clHill, 1),
281  clMetal
284 RMS.SetProgress(70);
286 createDecoration
288  [[new SimpleObject(aRockMedium, 1,3, 0,1)],
289   [new SimpleObject(aRockLarge, 1,2, 0,1), new SimpleObject(aRockMedium, 1,3, 0,2)],
290   [new SimpleObject(aGrassShort, 1,2, 0,1, -PI/8,PI/8)],
291   [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)],
292   [new SimpleObject(aBushMedium, 1,2, 0,2), new SimpleObject(aBushSmall, 2,4, 0,2)]
293  ],
295   scaleByMapSize(16, 262),
296   scaleByMapSize(8, 131),
297   scaleByMapSize(13, 200),
298   scaleByMapSize(13, 200),
299   scaleByMapSize(13, 200)
300  ],
301  avoidClasses(clWater, 0, clForest, 0, clPlayer, 0, clHill, 0)
304 RMS.SetProgress(75);
306 createFood
309   [new SimpleObject(oDeer, 5,7, 0,4)],
310   [new SimpleObject(oRabbit, 2,3, 0,2)]
311  ],
313   3 * numPlayers,
314   3 * numPlayers
315  ],
316  avoidClasses(clWater, 3, clForest, 0, clPlayer, 20, clHill, 1, clFood, 20)
319 createFood
322   [new SimpleObject(oBerryBush, 5,7, 0,4)]
323  ],
325   randIntInclusive(1, 4) * numPlayers + 2
326  ],
327  avoidClasses(clWater, 3, clForest, 0, clPlayer, 20, clHill, 1, clFood, 10)
330 createFood
333   [new SimpleObject(oFish, 2,3, 0,2)]
334  ],
336   15 * numPlayers
337  ],
338  [avoidClasses(clFood, 20), stayClasses(clWater, 6)]
341 RMS.SetProgress(85);
343 createStragglerTrees(
344         [oPine],
345         avoidClasses(clWater, 5, clForest, 3, clHill, 1, clPlayer, 12, clMetal, 6, clRock, 6),
346         clForest,
347         stragglerTrees);
349 setSkySet(pickRandom(["cirrus", "cumulus", "sunny"]));
350 setSunRotation(randFloat(0, TWO_PI));
351 setSunElevation(randFloat(PI/ 5, PI / 3));
352 setWaterColor(0.0, 0.047, 0.286);                               // dark majestic blue
353 setWaterTint(0.471, 0.776, 0.863);                              // light blue
354 setWaterMurkiness(0.82);
355 setWaterWaviness(3.0);
356 setWaterType("clap");
358 ExportMap();