Move getMapCenter and getMapBounds to the RandomMap object, refs #4964.
[0ad.git] / binaries / data / mods / public / maps / random / kerala.js
blob50d9a999a6f15bed0c33368f9de1dd6c93149a41
1 Engine.LoadLibrary("rmgen");
3 const tGrass = ["tropic_grass_c", "tropic_grass_c", "tropic_grass_c", "tropic_grass_c", "tropic_grass_plants", "tropic_plants", "tropic_plants_b"];
4 const tGrassA = "tropic_plants_c";
5 const tGrassB = "tropic_plants_c";
6 const tGrassC = "tropic_grass_c";
7 const tForestFloor = "tropic_grass_plants";
8 const tCliff = ["tropic_cliff_a", "tropic_cliff_a", "tropic_cliff_a", "tropic_cliff_a_plants"];
9 const tPlants = "tropic_plants";
10 const tRoad = "tropic_citytile_a";
11 const tRoadWild = "tropic_citytile_plants";
12 const tShoreBlend = "tropic_beach_dry_plants";
13 const tShore = "tropic_beach_dry";
14 const tWater = "tropic_beach_wet";
16 const oTree = "gaia/flora_tree_toona";
17 const oPalm = "gaia/flora_tree_palm_tropic";
18 const oStoneLarge = "gaia/geology_stonemine_tropic_quarry";
19 const oStoneSmall = "gaia/geology_stone_tropic_a";
20 const oMetalLarge = "gaia/geology_metal_tropic_slabs";
21 const oFish = "gaia/fauna_fish";
22 const oDeer = "gaia/fauna_deer";
23 const oSheep = "gaia/fauna_tiger";
24 const oBush = "gaia/flora_bush_berry";
26 const aRockLarge = "actor|geology/stone_granite_large.xml";
27 const aRockMedium = "actor|geology/stone_granite_med.xml";
28 const aBush1 = "actor|props/flora/plant_tropic_a.xml";
29 const aBush2 = "actor|props/flora/plant_lg.xml";
30 const aBush3 = "actor|props/flora/plant_tropic_large.xml";
32 const pForestD = [tForestFloor + TERRAIN_SEPARATOR + oTree, tForestFloor];
33 const pForestP = [tForestFloor + TERRAIN_SEPARATOR + oPalm, tForestFloor];
35 const heightSeaGround = -5;
36 const heightLand = 3;
37 const heightHill = 25;
39 var g_Map = new RandomMap(heightLand, tGrass);
41 const numPlayers = getNumPlayers();
42 const mapCenter = g_Map.getCenter();
43 const mapBounds = g_Map.getBounds();
45 var clPlayer = createTileClass();
46 var clHill = createTileClass();
47 var clForest = createTileClass();
48 var clWater = createTileClass();
49 var clDirt = createTileClass();
50 var clRock = createTileClass();
51 var clMetal = createTileClass();
52 var clFood = createTileClass();
53 var clBaseResource = createTileClass();
54 var clMountains = createTileClass();
56 var waterPosition = fractionToTiles(0.31);
57 var playerPosition = fractionToTiles(0.55);
58 var mountainPosition = fractionToTiles(0.69);
60 var startAngle = randomAngle();
62 placePlayerBases({
63         "PlayerPlacement": [
64                 sortAllPlayers(),
65                 playerPlacementLine(0, new Vector2D(mapCenter.x, playerPosition), fractionToTiles(0.2)).map(pos => pos.rotateAround(startAngle, mapCenter))
66         ],
67         "PlayerTileClass": clPlayer,
68         "BaseResourceClass": clBaseResource,
69         "CityPatch": {
70                 "outerTerrain": tRoadWild,
71                 "innerTerrain": tRoad
72         },
73         "Chicken": {
74         },
75         "Berries": {
76                 "template": oBush
77         },
78         "Mines": {
79                 "types": [
80                         { "template": oMetalLarge },
81                         { "template": oStoneLarge }
82                 ]
83         },
84         "Trees": {
85                 "template": oTree,
86                 "count": scaleByMapSize(12, 30),
87                 "minDist": 12,
88                 "maxDist": 14,
89                 "minDistGroup": 1,
90                 "maxDistGroup": 3
91         }
92         // No decoratives
93 });
94 Engine.SetProgress(15);
96 paintRiver({
97         "parallel": true,
98         "start": new Vector2D(mapBounds.left, mapBounds.top).rotateAround(startAngle - Math.PI / 2, mapCenter),
99         "end": new Vector2D(mapBounds.left, mapBounds.bottom).rotateAround(startAngle - Math.PI / 2, mapCenter),
100         "width": 2 * waterPosition,
101         "fadeDist": 8,
102         "deviation": 0,
103         "heightRiverbed": heightSeaGround,
104         "heightLand": heightLand,
105         "meanderShort": 20,
106         "meanderLong": 0,
107         "landFunc": (position, shoreDist1, shoreDist2) => {
108                 if (waterPosition + shoreDist1 > mountainPosition)
109                         addToClass(position.x, position.y, clMountains);
110         },
111         "waterFunc": (position, height, riverFraction) => {
112                 addToClass(position.x, position.y, clWater);
113         }
116 log("Creating shores...");
117 for (let i = 0; i < scaleByMapSize(20, 120); ++i)
119         let position = new Vector2D(fractionToTiles(randFloat(0.28, 0.34)), fractionToTiles(randFloat(0.1, 0.9))).rotateAround(startAngle - Math.PI / 2, mapCenter).round();
120         createArea(
121                 new ChainPlacer(1, Math.floor(scaleByMapSize(4, 6)), Math.floor(scaleByMapSize(16, 30)), 1, position),
122                 [
123                         new LayeredPainter([tGrass, tGrass], [2]),
124                         new SmoothElevationPainter(ELEVATION_SET, heightLand, 3),
125                         unPaintClass(clWater)
126                 ]);
129 paintTerrainBasedOnHeight(-6, 1, 1, tWater);
130 paintTerrainBasedOnHeight(1, 2.8, 1, tShoreBlend);
131 paintTerrainBasedOnHeight(0, 1, 1, tShore);
132 paintTileClassBasedOnHeight(-6, 0.5, 1, clWater);
134 Engine.SetProgress(45);
136 log("Creating hills...");
137 createAreas(
138         new ChainPlacer(1, Math.floor(scaleByMapSize(4, 6)), Math.floor(scaleByMapSize(16, 40)), 0.1),
139         [
140                 new LayeredPainter([tCliff, tGrass], [3]),
141                 new SmoothElevationPainter(ELEVATION_SET, heightHill, 3),
142                 paintClass(clHill)
143         ],
144         [avoidClasses(clPlayer, 20, clHill, 5, clWater, 2, clBaseResource, 2), stayClasses(clMountains, 0)],
145         scaleByMapSize(5, 40) * numPlayers);
147 log("Creating forests...");
148 var [forestTrees, stragglerTrees] = getTreeCounts(1000, 6000, 0.7);
149 var types = [
150         [[tGrass, tGrass, tGrass, tGrass, pForestD], [tGrass, tGrass, tGrass, pForestD]],
151         [[tGrass, tGrass, tGrass, tGrass, pForestP], [tGrass, tGrass, tGrass, pForestP]]
153 var size = forestTrees / (scaleByMapSize(3,6) * numPlayers);
154 var num = Math.floor(size / types.length);
155 for (let type of types)
156         createAreas(
157                 new ChainPlacer(
158                         1,
159                         Math.floor(scaleByMapSize(3, 5)),
160                         forestTrees / (num * Math.floor(scaleByMapSize(2, 4))),
161                         0.5),
162                 [
163                         new LayeredPainter(type, [2]),
164                         paintClass(clForest)
165                 ],
166                 avoidClasses(clPlayer, 20, clForest, 10, clHill, 0, clWater, 8),
167                 num);
169 Engine.SetProgress(70);
171 log("Creating grass patches...");
172 for (let size of [scaleByMapSize(3, 6), scaleByMapSize(5, 10), scaleByMapSize(8, 21)])
173         createAreas(
174                 new ChainPlacer(1, Math.floor(scaleByMapSize(3, 5)), size, 0.5),
175                 [
176                         new LayeredPainter([tGrassC, tGrassA, tGrassB], [2, 1]),
177                         paintClass(clDirt)
178                 ],
179                 avoidClasses(clWater, 8, clForest, 0, clHill, 0, clPlayer, 12, clDirt, 16),
180                 scaleByMapSize(20, 80));
182 for (let size of [scaleByMapSize(2, 4), scaleByMapSize(3, 7), scaleByMapSize(5, 15)])
183         createAreas(
184                 new ChainPlacer(1, Math.floor(scaleByMapSize(3, 5)), size, 0.5),
185                 [
186                         new LayeredPainter([tPlants, tPlants], [1]),
187                         paintClass(clDirt)
188                 ],
189                 avoidClasses(clWater, 8, clForest, 0, clHill, 0, clPlayer, 12, clDirt, 16),
190                 scaleByMapSize(20, 80));
192 log("Creating stone mines...");
193 var group = new SimpleGroup([new SimpleObject(oStoneSmall, 0,2, 0,4), new SimpleObject(oStoneLarge, 1,1, 0,4)], true, clRock);
194 createObjectGroupsDeprecated(group, 0,
195         avoidClasses(clWater, 3, clForest, 1, clPlayer, 20, clRock, 10, clHill, 1),
196         scaleByMapSize(4,16), 100
199 log("Creating small stone quarries...");
200 group = new SimpleGroup([new SimpleObject(oStoneSmall, 2,5, 1,3)], true, clRock);
201 createObjectGroupsDeprecated(group, 0,
202         avoidClasses(clWater, 3, clForest, 1, clPlayer, 20, clRock, 10, clHill, 1),
203         scaleByMapSize(4,16), 100
206 log("Creating metal mines...");
207 group = new SimpleGroup([new SimpleObject(oMetalLarge, 1,1, 0,4)], true, clMetal);
208 createObjectGroupsDeprecated(group, 0,
209         avoidClasses(clWater, 3, clForest, 1, clPlayer, 20, clMetal, 10, clRock, 5, clHill, 1),
210         scaleByMapSize(4,16), 100
213 log("Creating small decorative rocks...");
214 group = new SimpleGroup(
215         [new SimpleObject(aRockMedium, 1,3, 0,1)],
216         true
218 createObjectGroupsDeprecated(
219         group, 0,
220         avoidClasses(clWater, 0, clForest, 0, clPlayer, 0, clHill, 0),
221         3*scaleByMapSize(16, 262), 50
224 log("Creating large decorative rocks...");
225 group = new SimpleGroup(
226         [new SimpleObject(aRockLarge, 1,2, 0,1), new SimpleObject(aRockMedium, 1,3, 0,2)],
227         true
229 createObjectGroupsDeprecated(
230         group, 0,
231         avoidClasses(clWater, 0, clForest, 0, clPlayer, 0, clHill, 0),
232         3*scaleByMapSize(8, 131), 50
235 log("Creating small grass tufts...");
236 group = new SimpleGroup(
237         [new SimpleObject(aBush1, 1,2, 0,1, -Math.PI / 8, Math.PI / 8)]
239 createObjectGroupsDeprecated(group, 0,
240         avoidClasses(clWater, 2, clHill, 2, clPlayer, 2, clDirt, 0),
241         8 * scaleByMapSize(13, 200)
244 Engine.SetProgress(90);
246 log("Creating large grass tufts...");
247 group = new SimpleGroup(
248         [new SimpleObject(aBush2, 2,4, 0,1.8, -Math.PI / 8, Math.PI / 8), new SimpleObject(aBush1, 3,6, 1.2,2.5, -Math.PI / 8, Math.PI / 8)]
250 createObjectGroupsDeprecated(group, 0,
251         avoidClasses(clWater, 3, clHill, 2, clPlayer, 2, clDirt, 1, clForest, 0),
252         8 * scaleByMapSize(13, 200)
255 Engine.SetProgress(95);
257 log("Creating bushes...");
258 group = new SimpleGroup(
259         [new SimpleObject(aBush3, 1,2, 0,2), new SimpleObject(aBush2, 2,4, 0,2)]
261 createObjectGroupsDeprecated(group, 0,
262         avoidClasses(clWater, 1, clHill, 1, clPlayer, 1, clDirt, 1),
263         8 * scaleByMapSize(13, 200), 50
266 Engine.SetProgress(95);
268 createStragglerTrees(
269         [oTree, oPalm],
270         avoidClasses(clWater, 5, clForest, 1, clHill, 1, clPlayer, 12, clMetal, 6, clRock, 6),
271         clForest,
272         stragglerTrees);
274 log("Creating deer...");
275 group = new SimpleGroup(
276         [new SimpleObject(oDeer, 5,7, 0,4)],
277         true, clFood
279 createObjectGroupsDeprecated(group, 0,
280         avoidClasses(clWater, 3, clForest, 0, clPlayer, 10, clHill, 1, clFood, 20),
281         3 * numPlayers, 50
284 Engine.SetProgress(75);
286 log("Creating berry bush...");
287 group = new SimpleGroup(
288         [new SimpleObject(oBush, 5,7, 0,4)],
289         true, clFood
291 createObjectGroupsDeprecated(group, 0,
292         avoidClasses(clWater, 6, clForest, 0, clPlayer, 20, clHill, 1, clFood, 10),
293         randIntInclusive(1, 4) * numPlayers + 2, 50
296 log("Creating sheep...");
297 group = new SimpleGroup(
298         [new SimpleObject(oSheep, 2,3, 0,2)],
299         true, clFood
301 createObjectGroupsDeprecated(group, 0,
302         avoidClasses(clWater, 3, clForest, 0, clPlayer, 22, clHill, 1, clFood, 20),
303         3 * numPlayers, 50
306 log("Creating fish...");
307 group = new SimpleGroup(
308         [new SimpleObject(oFish, 2,3, 0,2)],
309         true, clFood
311 createObjectGroupsDeprecated(group, 0,
312         [avoidClasses(clFood, 20), stayClasses(clWater, 6)],
313         25 * numPlayers, 60
316 placePlayersNomad(clPlayer, avoidClasses(clWater, 4, clHill, 2, clForest, 1, clMetal, 4, clRock, 4, clFood, 2));
318 setSunColor(0.6, 0.6, 0.6);
319 setSunElevation(Math.PI / 3);
321 setWaterColor(0.524,0.734,0.839);
322 setWaterTint(0.369,0.765,0.745);
323 setWaterWaviness(1.0);
324 setWaterType("ocean");
325 setWaterMurkiness(0.35);
327 setFogFactor(0.4);
328 setFogThickness(0.2);
330 setPPEffect("hdr");
331 setPPContrast(0.7);
332 setPPSaturation(0.65);
333 setPPBloom(0.6);
335 setSkySet("cirrus");
336 g_Map.ExportMap();