Add randomAngle helper function to abbreviate calls.
[0ad.git] / binaries / data / mods / public / maps / random / syria.js
blobfd18f5ef6def6b1493fc96caf88062ee17533181
1 Engine.LoadLibrary("rmgen");
3 const tMainDirt = ["desert_dirt_rocks_1", "desert_dirt_cracks"];
4 const tForestFloor1 = "forestfloor_dirty";
5 const tForestFloor2 = "desert_forestfloor_palms";
6 const tGrassSands = "desert_grass_a_sand";
7 const tGrass = "desert_grass_a";
8 const tSecondaryDirt = "medit_dirt_dry";
9 const tCliff = ["desert_cliff_persia_1", "desert_cliff_persia_2"];
10 const tHill = ["desert_dirt_rocks_1", "desert_dirt_rocks_2", "desert_dirt_rocks_3"];
11 const tDirt = ["desert_dirt_rough", "desert_dirt_rough_2"];
12 const tRoad = "desert_shore_stones";;
13 const tRoadWild = "desert_grass_a_stones";;
15 const oTamarix = "gaia/flora_tree_tamarix";
16 const oPalm = "gaia/flora_tree_date_palm";
17 const oPine = "gaia/flora_tree_aleppo_pine";
18 const oBush = "gaia/flora_bush_grapes";
19 const oCamel = "gaia/fauna_camel";
20 const oGazelle = "gaia/fauna_gazelle";
21 const oLion = "gaia/fauna_lion";
22 const oStoneLarge = "gaia/geology_stonemine_desert_quarry";
23 const oStoneSmall = "gaia/geology_stone_desert_small";
24 const oMetalLarge = "gaia/geology_metal_desert_slabs";
26 const aRock = "actor|geology/stone_desert_med.xml";
27 const aBushA = "actor|props/flora/bush_desert_dry_a.xml";
28 const aBushB = "actor|props/flora/bush_desert_dry_a.xml";
29 const aBushes = [aBushA, aBushB];
31 const pForestP = [tForestFloor2 + TERRAIN_SEPARATOR + oPalm, tForestFloor2];
32 const pForestT = [tForestFloor1 + TERRAIN_SEPARATOR + oTamarix,tForestFloor2];
34 InitMap();
36 const numPlayers = getNumPlayers();
38 var clPlayer = createTileClass();
39 var clHill = createTileClass();
40 var clForest = createTileClass();
41 var clRock = createTileClass();
42 var clMetal = createTileClass();
43 var clFood = createTileClass();
44 var clBaseResource = createTileClass();
45 var clGrass = createTileClass();
47 var [playerIDs, playerX, playerZ] = playerPlacementCircle(0.35);
49 for (let i = 0; i < numPlayers; ++i)
51         let ix = Math.round(fractionToTiles(playerX[i]));
52         let iz = Math.round(fractionToTiles(playerZ[i]));
54         log("Marking player territory larger than the city patch...");
55         if (!isNomad())
56                 createArea(
57                         new ClumpPlacer(diskArea(defaultPlayerBaseRadius()), 0.9, 0.5, 10, ix, iz),
58                         paintClass(clPlayer));
60         log("Creating big grass patches surrounding the city patches...");
61         createArea(
62                 new ChainPlacer(
63                         2,
64                         Math.floor(scaleByMapSize(5, 12)),
65                         Math.floor(scaleByMapSize(25, 60)) / (isNomad() ? 2 : 1),
66                         1,
67                         ix,
68                         iz,
69                         0,
70                         [Math.floor(scaleByMapSize(16, 30))]),
71                 [
72                         new LayeredPainter([tGrassSands, tGrass], [3]),
73                         paintClass(clGrass)
74                 ]);
76 Engine.SetProgress(10);
78 placePlayerBases({
79         "PlayerPlacement": [playerIDs, playerX, playerZ],
80         // PlayerTileClass marked above
81         "BaseResourceClass": clBaseResource,
82         "CityPatch": {
83                 "outerTerrain": tRoadWild,
84                 "innerTerrain": tRoad,
85                 "radius": 10,
86                 "width": 3
87         },
88         "Chicken": {
89         },
90         "Berries": {
91                 "template": oBush
92         },
93         "Mines": {
94                 "types": [
95                         { "template": oMetalLarge },
96                         { "template": oStoneLarge }
97                 ],
98                 "groupElements": [new RandomObject(aBushes, 2, 4, 2, 3)]
99         },
100         "Trees": {
101                 "template": pickRandom([oPalm, oTamarix]),
102                 "count": 3
103         }
104         // No decoratives
106 Engine.SetProgress(20);
108 log("Creating bumps...");
109 createAreas(
110         new ClumpPlacer(scaleByMapSize(20, 50), 0.3, 0.06, 1),
111         new SmoothElevationPainter(ELEVATION_MODIFY, 2, 2),
112         avoidClasses(clPlayer, 13),
113         scaleByMapSize(300, 800));
115 log("Creating hills...");
116 createAreas(
117         new ChainPlacer(1, Math.floor(scaleByMapSize(4, 6)), Math.floor(scaleByMapSize(16, 40)), 0.5),
118         [
119                 new LayeredPainter([tCliff, tHill], [2]),
120                 new SmoothElevationPainter(ELEVATION_SET, 22, 2),
121                 paintClass(clHill)
122         ],
123         avoidClasses(clPlayer, 3, clGrass, 1, clHill, 10),
124         scaleByMapSize(1, 3) * numPlayers * 3);
126 Engine.SetProgress(25);
128 log("Creating forests...");
129 var [forestTrees, stragglerTrees] = getTreeCounts(400, 2000, 0.7);
130 var types = [
131         [[tMainDirt, tForestFloor2, pForestP], [tForestFloor2, pForestP]],
132         [[tMainDirt, tForestFloor1, pForestT], [tForestFloor1, pForestT]]
134 var size = forestTrees / (scaleByMapSize(3,6) * numPlayers);
135 var num = Math.floor(size / types.length);
136 for (let type of types)
137         createAreas(
138                 new ChainPlacer(
139                         1,
140                         Math.floor(scaleByMapSize(3, 5)),
141                         forestTrees / (num * Math.floor(scaleByMapSize(2, 4))),
142                         0.5),
143                 [
144                         new LayeredPainter(type, [2]),
145                         paintClass(clForest)
146                 ],
147                 avoidClasses(clPlayer, 1, clGrass, 1, clForest, 10, clHill, 1),
148                 num);
150 Engine.SetProgress(40);
152 log("Creating dirt patches...");
153 for (let size of [scaleByMapSize(3, 6), scaleByMapSize(5, 10), scaleByMapSize(8, 21)])
154         createAreas(
155                 new ChainPlacer(1, Math.floor(scaleByMapSize(3, 5)), size, 0.5),
156                 new LayeredPainter([tSecondaryDirt, tDirt], [1]),
157                 avoidClasses(clHill, 0, clForest, 0, clPlayer, 8, clGrass, 1),
158                 scaleByMapSize(50, 90));
159 Engine.SetProgress(60);
161 log("Creating big patches...");
162 for (let size of [scaleByMapSize(6, 30), scaleByMapSize(10, 50), scaleByMapSize(16, 70)])
163         createAreas(
164                 new ChainPlacer(1, Math.floor(scaleByMapSize(3, 5)), size, 0.5),
165                 new LayeredPainter([tSecondaryDirt, tDirt], [1]),
166                 avoidClasses(clHill, 0, clForest, 0, clPlayer, 8, clGrass, 1),
167                 scaleByMapSize(30, 90));
168 Engine.SetProgress(70);
170 log("Creating stone mines...");
171 var group = new SimpleGroup([new SimpleObject(oStoneSmall, 0, 2, 0, 4), new SimpleObject(oStoneLarge, 1, 1, 0,4), new RandomObject(aBushes, 2, 4, 0, 2)], true, clRock);
172 createObjectGroupsDeprecated(group, 0,
173         [avoidClasses(clForest, 1, clPlayer, 10, clRock, 10, clHill, 1, clGrass, 1)],
174         scaleByMapSize(2,8), 100
177 log("Creating small stone quarries...");
178 group = new SimpleGroup([new SimpleObject(oStoneSmall, 2,5, 1,3), new RandomObject(aBushes, 2,4, 0,2)], true, clRock);
179 createObjectGroupsDeprecated(group, 0,
180         [avoidClasses(clForest, 1, clPlayer, 10, clRock, 10, clHill, 1, clGrass, 1)],
181         scaleByMapSize(2,8), 100
184 log("Creating metal mines...");
185 group = new SimpleGroup([new SimpleObject(oMetalLarge, 1,1, 0,4), new RandomObject(aBushes, 2,4, 0,2)], true, clMetal);
186 createObjectGroupsDeprecated(group, 0,
187         [avoidClasses(clForest, 1, clPlayer, 10, clMetal, 10, clRock, 5, clHill, 1, clGrass, 1)],
188         scaleByMapSize(2,8), 100
191 log("Creating small decorative rocks...");
192 group = new SimpleGroup(
193         [new SimpleObject(aRock, 1,3, 0,1)],
194         true
196 createObjectGroupsDeprecated(
197         group, 0,
198         avoidClasses(clForest, 0, clPlayer, 0, clHill, 0),
199         scaleByMapSize(16, 262), 50
202 log("Creating bushes...");
203 group = new SimpleGroup(
204         [new SimpleObject(aBushB, 1,2, 0,1), new SimpleObject(aBushA, 1,3, 0,2)],
205         true
207 createObjectGroupsDeprecated(
208         group, 0,
209         avoidClasses(clForest, 0, clPlayer, 0, clHill, 0),
210         scaleByMapSize(50, 500), 50
212 Engine.SetProgress(80);
214 log("Creating gazelle...");
215 group = new SimpleGroup(
216         [new SimpleObject(oGazelle, 5,7, 0,4)],
217         true, clFood
219 createObjectGroupsDeprecated(group, 0,
220         avoidClasses(clForest, 0, clPlayer, 1, clHill, 1, clFood, 20, clGrass, 2),
221         3 * numPlayers, 50
224 log("Creating lions...");
225 group = new SimpleGroup(
226         [new SimpleObject(oLion, 2,3, 0,2)],
227         true, clFood
229 createObjectGroupsDeprecated(group, 0,
230         avoidClasses(clForest, 0, clPlayer, 1, clHill, 1, clFood, 20, clGrass, 2),
231         3 * numPlayers, 50
234 log("Creating camels...");
235 group = new SimpleGroup(
236         [new SimpleObject(oCamel, 2,3, 0,2)],
237         true, clFood
239 createObjectGroupsDeprecated(group, 0,
240         avoidClasses(clForest, 0, clPlayer, 1, clHill, 1, clFood, 20, clGrass, 2),
241         3 * numPlayers, 50
243 Engine.SetProgress(85);
245 createStragglerTrees(
246         [oPalm, oTamarix, oPine],
247         avoidClasses(clForest, 1, clHill, 1, clPlayer, 1, clMetal, 6, clRock, 6),
248         clForest,
249         stragglerTrees);
251 createStragglerTrees(
252         [oPalm, oTamarix, oPine],
253         [avoidClasses(clForest, 1, clHill, 1, clPlayer, 1, clMetal, 6, clRock, 6), stayClasses(clGrass, 3)],
254         clForest,
255         stragglerTrees * (isNomad() ? 3 : 1));
257 placePlayersNomad(clPlayer, avoidClasses(clForest, 1, clMetal, 4, clRock, 4, clHill, 4, clFood, 2));
259 setSkySet("sunny");
260 setSunElevation(Math.PI / 8);
261 setSunRotation(randomAngle());
262 setSunColor(0.746, 0.718, 0.539);
263 setWaterColor(0.292, 0.347, 0.691);
264 setWaterTint(0.550, 0.543, 0.437);
265 setWaterMurkiness(0.83);
267 setFogColor(0.8, 0.76, 0.61);
268 setFogThickness(0.2);
269 setFogFactor(0.4);
271 setPPEffect("hdr");
272 setPPContrast(0.65);
273 setPPSaturation(0.42);
274 setPPBloom(0.6);
276 ExportMap();