Unify Caledonian Meadows and Wild Lake player location duplication from rP19704 ...
[0ad.git] / binaries / data / mods / public / maps / random / lake.js
blob015eb422142eb545ed3332a6bcbf31295e7ae143
1 RMS.LoadLibrary("rmgen");
2 RMS.LoadLibrary("rmbiome");
4 setSelectedBiome();
6 const tMainTerrain = g_Terrains.mainTerrain;
7 const tForestFloor1 = g_Terrains.forestFloor1;
8 const tForestFloor2 = g_Terrains.forestFloor2;
9 const tCliff = g_Terrains.cliff;
10 const tTier1Terrain = g_Terrains.tier1Terrain;
11 const tTier2Terrain = g_Terrains.tier2Terrain;
12 const tTier3Terrain = g_Terrains.tier3Terrain;
13 const tHill = g_Terrains.hill;
14 const tRoad = g_Terrains.road;
15 const tRoadWild = g_Terrains.roadWild;
16 const tTier4Terrain = g_Terrains.tier4Terrain;
17 const tShore = g_Terrains.shore;
18 const tWater = g_Terrains.water;
20 const oTree1 = g_Gaia.tree1;
21 const oTree2 = g_Gaia.tree2;
22 const oTree3 = g_Gaia.tree3;
23 const oTree4 = g_Gaia.tree4;
24 const oTree5 = g_Gaia.tree5;
25 const oFruitBush = g_Gaia.fruitBush;
26 const oMainHuntableAnimal = g_Gaia.mainHuntableAnimal;
27 const oFish = g_Gaia.fish;
28 const oSecondaryHuntableAnimal = g_Gaia.secondaryHuntableAnimal;
29 const oStoneLarge = g_Gaia.stoneLarge;
30 const oStoneSmall = g_Gaia.stoneSmall;
31 const oMetalLarge = g_Gaia.metalLarge;
33 const aGrass = g_Decoratives.grass;
34 const aGrassShort = g_Decoratives.grassShort;
35 const aRockLarge = g_Decoratives.rockLarge;
36 const aRockMedium = g_Decoratives.rockMedium;
37 const aBushMedium = g_Decoratives.bushMedium;
38 const aBushSmall = g_Decoratives.bushSmall;
40 const pForest1 = [tForestFloor2 + TERRAIN_SEPARATOR + oTree1, tForestFloor2 + TERRAIN_SEPARATOR + oTree2, tForestFloor2];
41 const pForest2 = [tForestFloor1 + TERRAIN_SEPARATOR + oTree4, tForestFloor1 + TERRAIN_SEPARATOR + oTree5, tForestFloor1];
43 InitMap();
45 const numPlayers = getNumPlayers();
46 const mapSize = getMapSize();
48 var clPlayer = createTileClass();
49 var clHill = createTileClass();
50 var clForest = createTileClass();
51 var clWater = createTileClass();
52 var clDirt = createTileClass();
53 var clRock = createTileClass();
54 var clMetal = createTileClass();
55 var clFood = createTileClass();
56 var clBaseResource = createTileClass();
58 initTerrain(tMainTerrain);
60 var [playerIDs, playerX, playerZ] = radialPlayerPlacement();
62 for (var i = 0; i < numPlayers; i++)
64         var id = playerIDs[i];
65         log("Creating base for player " + id + "...");
67         var radius = scaleByMapSize(15,25);
68         var cliffRadius = 2;
69         var elevation = 20;
71         // get the x and z in tiles
72         var fx = fractionToTiles(playerX[i]);
73         var fz = fractionToTiles(playerZ[i]);
74         var ix = round(fx);
75         var iz = round(fz);
76         addCivicCenterAreaToClass(ix, iz, clPlayer);
78         placeCivDefaultEntities(fx, fz, id);
80         placeDefaultChicken(fx, fz, clBaseResource);
82         // create berry bushes
83         var bbAngle = randFloat(0, TWO_PI);
84         var bbDist = 12;
85         var bbX = round(fx + bbDist * cos(bbAngle));
86         var bbZ = round(fz + bbDist * sin(bbAngle));
87         var group = new SimpleGroup(
88                 [new SimpleObject(oFruitBush, 5,5, 0,3)],
89                 true, clBaseResource, bbX, bbZ
90         );
91         createObjectGroup(group, 0);
93         // create metal mine
94         var mAngle = bbAngle;
95         while(abs(mAngle - bbAngle) < PI/3)
96                 mAngle = randFloat(0, TWO_PI);
98         var mDist = 12;
99         var mX = round(fx + mDist * cos(mAngle));
100         var mZ = round(fz + mDist * sin(mAngle));
101         group = new SimpleGroup(
102                 [new SimpleObject(oMetalLarge, 1,1, 0,0)],
103                 true, clBaseResource, mX, mZ
104         );
105         createObjectGroup(group, 0);
107         // create stone mines
108         mAngle += randFloat(PI/8, PI/4);
109         mX = round(fx + mDist * cos(mAngle));
110         mZ = round(fz + mDist * sin(mAngle));
111         group = new SimpleGroup(
112                 [new SimpleObject(oStoneLarge, 1,1, 0,2)],
113                 true, clBaseResource, mX, mZ
114         );
115         createObjectGroup(group, 0);
117         // create starting trees
118         var num = 5;
119         var tAngle = randFloat(0, TWO_PI);
120         var tDist = randFloat(12, 13);
121         var tX = round(fx + tDist * cos(tAngle));
122         var tZ = round(fz + tDist * sin(tAngle));
123         group = new SimpleGroup(
124                 [new SimpleObject(oTree1, num, num, 0,3)],
125                 false, clBaseResource, tX, tZ
126         );
127         createObjectGroup(group, 0, avoidClasses(clBaseResource,2));
129         placeDefaultDecoratives(fx, fz, aGrassShort, clBaseResource, radius);
132 RMS.SetProgress(20);
134 log("Creating the lake...")
135 createArea(
136         new ChainPlacer(
137                 2,
138                 Math.floor(scaleByMapSize(5, 16)),
139                 Math.floor(scaleByMapSize(35, 200)),
140                 1,
141                 Math.round(fractionToTiles(0.5)),
142                 Math.round(fractionToTiles(0.5)),
143                 0,
144                 [Math.floor(mapSize * 0.17 * Math.pow(scaleByMapSize(1, 6), 1/8))]),
145         [
146                 new SmoothElevationPainter(ELEVATION_SET, -3, 4),
147                 paintClass(clWater)
148         ],
149         avoidClasses(clPlayer, 20));
151 log("Creating more shore jaggedness...");
152 createAreas(
153         new ChainPlacer(2, Math.floor(scaleByMapSize(4, 6)), 3, 1),
154         [
155                 new LayeredPainter([tCliff, tHill], [2]),
156                 unPaintClass(clWater)
157         ],
158         borderClasses(clWater, 4, 7),
159         scaleByMapSize(12, 130) * 2,
160         150);
162 paintTerrainBasedOnHeight(2.4, 3.4, 3, tMainTerrain);
163 paintTerrainBasedOnHeight(1, 2.4, 0, tShore);
164 paintTerrainBasedOnHeight(-8, 1, 2, tWater);
165 paintTileClassBasedOnHeight(-6, 0, 1, clWater);
167 for (var i = 0; i < numPlayers; ++i)
169         var fx = fractionToTiles(playerX[i]);
170         var fz = fractionToTiles(playerZ[i]);
171         var ix = round(fx);
172         var iz = round(fz);
174         // create the city patch
175         var cityRadius = radius/3;
176         var placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz);
177         var painter = new LayeredPainter([tRoadWild, tRoad], [1]);
178         createArea(placer, painter, null);
181 createBumps(avoidClasses(clWater, 2, clPlayer, 20));
183 if (randBool())
184         createHills([tMainTerrain, tCliff, tHill], avoidClasses(clPlayer, 20, clHill, 15, clWater, 2), clHill, scaleByMapSize(1, 4) * numPlayers);
185 else
186         createMountains(tCliff, avoidClasses(clPlayer, 20, clHill, 15, clWater, 2), clHill, scaleByMapSize(1, 4) * numPlayers);
188 var [forestTrees, stragglerTrees] = getTreeCounts(...rBiomeTreeCount(1));
189 createForests(
190  [tMainTerrain, tForestFloor1, tForestFloor2, pForest1, pForest2],
191  avoidClasses(clPlayer, 20, clForest, 17, clHill, 0, clWater, 2),
192  clForest,
193  forestTrees);
195 RMS.SetProgress(50);
197 log("Creating dirt patches...");
198 createLayeredPatches(
199  [scaleByMapSize(3, 6), scaleByMapSize(5, 10), scaleByMapSize(8, 21)],
200  [[tMainTerrain,tTier1Terrain],[tTier1Terrain,tTier2Terrain], [tTier2Terrain,tTier3Terrain]],
201  [1,1],
202  avoidClasses(clWater, 3, clForest, 0, clHill, 0, clDirt, 5, clPlayer, 12),
203  scaleByMapSize(15, 45),
204  clDirt);
206 log("Creating grass patches...");
207 createPatches(
208  [scaleByMapSize(2, 4), scaleByMapSize(3, 7), scaleByMapSize(5, 15)],
209  tTier4Terrain,
210  avoidClasses(clWater, 3, clForest, 0, clHill, 0, clDirt, 5, clPlayer, 12),
211  scaleByMapSize(15, 45),
212  clDirt);
213 RMS.SetProgress(55);
215 log("Creating stone mines...");
216 createMines(
218   [new SimpleObject(oStoneSmall, 0,2, 0,4), new SimpleObject(oStoneLarge, 1,1, 0,4)],
219   [new SimpleObject(oStoneSmall, 2,5, 1,3)]
220  ],
221  avoidClasses(clWater, 3, clForest, 1, clPlayer, 20, clRock, 10, clHill, 1),
222  clRock);
224 log("Creating metal mines...");
225 createMines(
227   [new SimpleObject(oMetalLarge, 1,1, 0,4)]
228  ],
229  avoidClasses(clWater, 3, clForest, 1, clPlayer, 20, clMetal, 10, clRock, 5, clHill, 1),
230  clMetal
233 RMS.SetProgress(65);
235 var planetm = 1;
237 if (currentBiome() == "tropic")
238         planetm = 8;
240 createDecoration
242  [[new SimpleObject(aRockMedium, 1,3, 0,1)],
243   [new SimpleObject(aRockLarge, 1,2, 0,1), new SimpleObject(aRockMedium, 1,3, 0,2)],
244   [new SimpleObject(aGrassShort, 1,2, 0,1, -PI/8,PI/8)],
245   [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)],
246   [new SimpleObject(aBushMedium, 1,2, 0,2), new SimpleObject(aBushSmall, 2,4, 0,2)]
247  ],
249   scaleByMapSize(16, 262),
250   scaleByMapSize(8, 131),
251   planetm * scaleByMapSize(13, 200),
252   planetm * scaleByMapSize(13, 200),
253   planetm * scaleByMapSize(13, 200)
254  ],
255  avoidClasses(clWater, 0, clForest, 0, clPlayer, 0, clHill, 0)
258 RMS.SetProgress(70);
260 createFood
263   [new SimpleObject(oMainHuntableAnimal, 5,7, 0,4)],
264   [new SimpleObject(oSecondaryHuntableAnimal, 2,3, 0,2)]
265  ],
267   3 * numPlayers,
268   3 * numPlayers
269  ],
270  avoidClasses(clWater, 3, clForest, 0, clPlayer, 20, clHill, 1, clFood, 20)
273 createFood
276   [new SimpleObject(oFruitBush, 5,7, 0,4)]
277  ],
279   3 * numPlayers
280  ],
281  avoidClasses(clWater, 3, clForest, 0, clPlayer, 20, clHill, 1, clFood, 10)
284 createFood
287   [new SimpleObject(oFish, 2,3, 0,2)]
288  ],
290   25 * numPlayers
291  ],
292  [avoidClasses(clFood, 20), stayClasses(clWater, 6)]
295 RMS.SetProgress(85);
297 createStragglerTrees(
298         [oTree1, oTree2, oTree4, oTree3],
299         avoidClasses(clWater, 5, clForest, 7, clHill, 1, clPlayer, 12, clMetal, 6, clRock, 6),
300         clForest,
301         stragglerTrees);
303 setWaterWaviness(4.0);
304 setWaterType("lake");
306 ExportMap();