Nomad mode on all random map scripts (except Survival of the Fittest), fixes #3591.
[0ad.git] / binaries / data / mods / public / maps / random / cycladic_archipelago.js
blob8eeeca8f41f92c4f372006ceae94d0db2444d98d
1 Engine.LoadLibrary("rmgen");
3 const tOceanRockDeep = "medit_sea_coral_deep";
4 const tOceanCoral = "medit_sea_coral_plants";
5 const tBeachWet = "medit_sand_wet";
6 const tBeachDry = "medit_sand";
7 const tBeach = ["medit_rocks_grass","medit_sand", "medit_rocks_grass_shrubs"];
8 const tBeachBlend = ["medit_rocks_grass", "medit_rocks_grass_shrubs"];
9 const tCity = "medit_city_tile";
10 const tGrassDry = ["medit_grass_field_dry", "medit_grass_field_b"];
11 const tGrass = ["medit_rocks_grass", "medit_rocks_grass","medit_dirt","medit_rocks_grass_shrubs"];
12 const tGrassShrubs = "medit_shrubs";
13 const tCliffShrubs = ["medit_cliff_aegean_shrubs", "medit_cliff_italia_grass","medit_cliff_italia"];
14 const tCliff = ["medit_cliff_italia", "medit_cliff_italia", "medit_cliff_italia_grass"];
15 const tForestFloor = "medit_forestfloor_a";
17 const oBeech = "gaia/flora_tree_euro_beech";
18 const oBerryBush = "gaia/flora_bush_berry";
19 const oCarob = "gaia/flora_tree_carob";
20 const oCypress1 = "gaia/flora_tree_cypress";
21 const oCypress2 = "gaia/flora_tree_cypress";
22 const oLombardyPoplar = "gaia/flora_tree_poplar_lombardy";
23 const oPalm = "gaia/flora_tree_medit_fan_palm";
24 const oPine = "gaia/flora_tree_aleppo_pine";
25 const oDateT = "gaia/flora_tree_cretan_date_palm_tall";
26 const oDateS = "gaia/flora_tree_cretan_date_palm_short";
27 const oDeer = "gaia/fauna_deer";
28 const oFish = "gaia/fauna_fish";
29 const oWhale = "gaia/fauna_whale_humpback";
30 const oStoneLarge = "gaia/geology_stonemine_medit_quarry";
31 const oStoneSmall = "gaia/geology_stone_mediterranean";
32 const oMetalLarge = "gaia/geology_metal_mediterranean_slabs";
33 const oShipwreck = "other/special_treasure_shipwreck";
34 const oShipDebris = "other/special_treasure_shipwreck_debris";
36 const aRockLarge = "actor|geology/stone_granite_large.xml";
37 const aRockMed = "actor|geology/stone_granite_med.xml";
38 const aRockSmall = "actor|geology/stone_granite_small.xml";
40 const pPalmForest = [tForestFloor+TERRAIN_SEPARATOR+oPalm, tGrass];
41 const pPineForest = [tForestFloor+TERRAIN_SEPARATOR+oPine, tGrass];
42 const pPoplarForest = [tForestFloor+TERRAIN_SEPARATOR+oLombardyPoplar, tGrass];
43 const pMainForest = [tForestFloor+TERRAIN_SEPARATOR+oCarob, tForestFloor+TERRAIN_SEPARATOR+oBeech, tGrass, tGrass];
45 InitMap();
47 const numPlayers = getNumPlayers();
48 const mapSize = getMapSize();
50 var clCoral = createTileClass();
51 var clPlayer = createTileClass();
52 var clIsland = createTileClass();
53 var clCity = createTileClass();
54 var clDirt = createTileClass();
55 var clHill = createTileClass();
56 var clForest = createTileClass();
57 var clWater = createTileClass();
58 var clRock = createTileClass();
59 var clMetal = createTileClass();
60 var clFood = createTileClass();
61 var clBaseResource = createTileClass();
63 //array holding starting islands based on number of players
64 var startingPlaces=[[0],[0,3],[0,2,4],[0,1,3,4],[0,1,2,3,4],[0,1,2,3,4,5]];
66 var startAngle = randFloat(0, 2 * Math.PI);
67 var numIslands = Math.max(6, numPlayers);
68 var islandX = [];
69 var islandZ = [];
71 var areas = [];
73 var nPlayer = 0;
74 var playerX = [];
75 var playerZ = [];
77 function createCycladicArchipelagoIsland(ix, iz, tileClass, radius, coralRadius)
79         log("Creating deep ocean rocks...");
80         createArea(
81                 new ClumpPlacer(diskArea(radius + coralRadius), 0.7, 0.1, 10, ix, iz),
82                 [
83                         new LayeredPainter([tOceanRockDeep, tOceanCoral], [5]),
84                         paintClass(clCoral)
85                 ],
86                 avoidClasses(clCoral, 0, clPlayer, 0));
88         log("Creating island...");
89         areas.push(
90                 createArea(
91                         new ClumpPlacer(diskArea(radius), 0.7, 0.1, 10, ix, iz),
92                         [
93                                 new LayeredPainter([tOceanCoral, tBeachWet, tBeachDry, tBeach, tBeachBlend, tGrass], [1, 3, 1, 1, 2]),
94                                 new SmoothElevationPainter(ELEVATION_SET, 3, 5),
95                                 paintClass(tileClass)
96                         ],
97                         avoidClasses(clPlayer, 0)));
100 log("Creating player islands...");
101 for (let i = 0; i < numIslands; ++i)
103         let angle = startAngle + i * 2 * Math.PI / numIslands;
104         islandX[i] = 0.5 + 0.39 * Math.cos(angle);
105         islandZ[i] = 0.5 + 0.39 * Math.sin(angle);
107         // Determine which player resides on this island
108         let isPlayerIsland = numPlayers >= 6 || i == startingPlaces[numPlayers - 1][nPlayer];
109         if (isPlayerIsland)
110         {
111                 [playerX[nPlayer], playerZ[nPlayer]] = [islandX[i], islandZ[i]];
112                 ++nPlayer;
113         }
115         createCycladicArchipelagoIsland(
116                 Math.round(fractionToTiles(islandX[i])),
117                 Math.round(fractionToTiles(islandZ[i])),
118                 isPlayerIsland ? clPlayer : clIsland,
119                 scaleByMapSize(15, 40),
120                 scaleByMapSize(1, 5));
123 log("Creating central islands...");
124 var nCenter = Math.floor(scaleByMapSize(1, 4));
125 for (let i = 0; i < nCenter; ++i)
127         let radius = randFloat(0.1, 0.16);
128         let angle = startAngle + Math.PI * (i * 2 / nCenter + randFloat(-1, 1) / 8);
130         createCycladicArchipelagoIsland(
131                 Math.round(fractionToTiles(0.5 + radius * Math.cos(angle))),
132                 Math.round(fractionToTiles(0.5 + radius * Math.sin(angle))),
133                 clIsland,
134                 scaleByMapSize(15, 30),
135                 2);
138 placePlayerBases({
139         "PlayerPlacement": [sortAllPlayers(), playerX, playerZ],
140         // PlayerTileClass is clCity here and painted below
141         "BaseResourceClass": clBaseResource,
142         "Walls": "towers",
143         "CityPatch": {
144                 "radius": 6,
145                 "outerTerrain": tGrass,
146                 "innerTerrain": tCity,
147                 "painters": [
148                         paintClass(clCity)
149                 ]
150         },
151         "Chicken": {
152         },
153         "Berries": {
154                 "template": oBerryBush
155         },
156         "Mines": {
157                 "types": [
158                         { "template": oMetalLarge },
159                         { "template": oStoneLarge }
160                 ]
161         },
162         "Trees": {
163                 "template": oPalm,
164                 "count": 2
165         }
166         // No decoratives
168 Engine.SetProgress(20);
170 log("Creating bumps...");
171 createAreasInAreas(
172         new ClumpPlacer(scaleByMapSize(20, 60), 0.3, 0.06, 1),
173         new SmoothElevationPainter(ELEVATION_MODIFY, 2, 3),
174         avoidClasses(clCity, 0),
175         scaleByMapSize(25, 75),15,
176         areas);
178 Engine.SetProgress(34);
180 log("Creating hills...");
181 createAreasInAreas(
182         new ClumpPlacer(scaleByMapSize(20, 150), 0.2, 0.1, 1),
183         [
184                 new LayeredPainter([tCliff, tCliffShrubs], [2]),
185                 new SmoothElevationPainter(ELEVATION_SET, 12, 2),
186                 paintClass(clHill)
187         ],
188         avoidClasses(clCity, 15, clHill, 15),
189         scaleByMapSize(5, 30), 15,
190         areas);
192 Engine.SetProgress(38);
194 paintTileClassBasedOnHeight(-Infinity, 0, Elevation_ExcludeMin_ExcludeMax, clWater);
196 log("Creating forests...");
197 var forestTypes = [
198         [[tForestFloor, tGrass, pPalmForest], [tForestFloor, pPalmForest]],
199         [[tForestFloor, tGrass, pPineForest], [tForestFloor, pPineForest]],
200         [[tForestFloor, tGrass, pPoplarForest], [tForestFloor, pPoplarForest]],
201         [[tForestFloor, tGrass, pMainForest], [tForestFloor, pMainForest]]
204 for (let type of forestTypes)
205         createAreasInAreas(
206                 new ClumpPlacer(randIntInclusive(6, 17), 0.1, 0.1, 1),
207                 [
208                         new LayeredPainter(type, [2]),
209                         paintClass(clForest)
210                 ],
211                 avoidClasses(clCity, 1, clWater, 3, clForest, 3, clHill, 1, clBaseResource, 4),
212                 scaleByMapSize(10, 64),
213                 20,
214                 areas);
215 Engine.SetProgress(42);
217 log("Creating stone mines...");
218 var group = new SimpleGroup([new SimpleObject(oStoneSmall, 0,2, 0,4), new SimpleObject(oStoneLarge, 1,1, 0,4)], true, clRock);
219 createObjectGroupsByAreasDeprecated(group, 0,
220         [avoidClasses(clWater, 1, clForest, 1, clHill, 1, clPlayer, 5, clRock, 6)],
221         scaleByMapSize(4,16), 200, areas
223 Engine.SetProgress(46);
225 log("Creating small stone mines...");
226 var group = new SimpleGroup([new SimpleObject(oStoneSmall, 2,5, 1,3)], true, clRock);
227 createObjectGroupsByAreasDeprecated(group, 0,
228         [avoidClasses(clWater, 1, clForest, 1, clHill, 1, clPlayer, 5, clRock, 2)],
229         scaleByMapSize(4,16), 200, areas
231 Engine.SetProgress(50);
233 log("Creating metal mines...");
234 group = new SimpleGroup([new SimpleObject(oMetalLarge, 1,1, 0,4)], true, clMetal);
235 createObjectGroupsByAreasDeprecated(group, 0,
236         [avoidClasses(clWater, 1, clForest, 1, clHill, 1, clPlayer, 5, clMetal, 6, clRock, 6)],
237         scaleByMapSize(4,16), 200, areas
239 Engine.SetProgress(54);
241 log("Creating shrub patches...");
242 for (let size of [scaleByMapSize(2, 32), scaleByMapSize(3, 48), scaleByMapSize(5, 80)])
243         createAreasInAreas(
244                 new ClumpPlacer(size, 0.3, 0.06, 0.5),
245                 [
246                         new LayeredPainter([tBeachBlend, tGrassShrubs], [1]),
247                         paintClass(clDirt)
248                 ],
249                 avoidClasses(clWater, 3, clHill, 0, clDirt, 6, clCity, 0, clBaseResource, 4),
250                 scaleByMapSize(4, 16),
251                 20,
252                 areas);
253 Engine.SetProgress(58);
255 log("Creating grass patches...");
256 for (let size of [scaleByMapSize(2, 32), scaleByMapSize(3, 48), scaleByMapSize(5, 80)])
257         createAreasInAreas(
258                 new ClumpPlacer(size, 0.3, 0.06, 0.5),
259                 [
260                         new LayeredPainter([tGrassDry], []),
261                         paintClass(clDirt)
262                 ],
263                 avoidClasses(clWater, 3, clHill, 0, clDirt, 6, clCity, 0, clBaseResource, 4),
264                 scaleByMapSize(4, 16),
265                 20,
266                 areas);
267 Engine.SetProgress(62);
269 log("Creating straggler trees...");
270 for (let tree of [oCarob, oBeech, oLombardyPoplar, oLombardyPoplar, oPine])
271         createObjectGroupsByAreasDeprecated(
272                 new SimpleGroup([new SimpleObject(tree, 1,1, 0,1)], true, clForest),
273                 0,
274                 avoidClasses(clWater, 2, clForest, 2, clCity, 3, clBaseResource, 4, clRock, 6, clMetal, 6, clPlayer, 1, clHill, 1),
275                 scaleByMapSize(2, 38), 50, areas
276         );
277 Engine.SetProgress(66);
279 log("Create straggler cypresses...");
280 group = new SimpleGroup(
281         [new SimpleObject(oCypress2, 1,3, 0,3), new SimpleObject(oCypress1, 0,2, 0,2)],
282         true
284 createObjectGroupsByAreasDeprecated(group, 0,
285         avoidClasses(clWater, 2, clForest, 2, clCity, 3, clBaseResource, 4, clRock, 6, clMetal, 6, clPlayer, 1, clHill, 1),
286         scaleByMapSize(5, 75), 50, areas
288 Engine.SetProgress(70);
290 log("Create straggler date palms...");
291 group = new SimpleGroup(
292         [new SimpleObject(oDateS, 1,3, 0,3), new SimpleObject(oDateT, 0,2, 0,2)],
293         true
295 createObjectGroupsByAreasDeprecated(group, 0,
296         avoidClasses(clWater, 2, clForest, 1, clCity, 0, clBaseResource, 4, clRock, 6, clMetal, 6, clPlayer, 1, clHill, 1),
297         scaleByMapSize(5, 75), 50, areas
299 Engine.SetProgress(74);
301 log("Creating rocks...");
302 group = new SimpleGroup(
303         [new SimpleObject(aRockSmall, 0,3, 0,2), new SimpleObject(aRockMed, 0,2, 0,2),
304         new SimpleObject(aRockLarge, 0,1, 0,2)]
306 createObjectGroupsDeprecated(group, 0,
307         avoidClasses(clWater, 0, clCity, 0),
308         scaleByMapSize(30, 180), 50
310 Engine.SetProgress(78);
312 log("Creating deer...");
313 group = new SimpleGroup(
314         [new SimpleObject(oDeer, 5,7, 0,4)],
315         true, clFood
317 createObjectGroupsDeprecated(group, 0,
318         avoidClasses(clWater, 5, clForest, 1, clHill, 1, clCity, 10, clMetal, 6, clRock, 2, clFood, 8),
319         3 * numPlayers, 50
321 Engine.SetProgress(82);
323 log("Creating berry bushes...");
324 group = new SimpleGroup([new SimpleObject(oBerryBush, 5,7, 0,3)], true, clFood);
325 createObjectGroupsDeprecated(group, 0,
326         avoidClasses(clWater, 2, clForest, 1, clHill, 1, clCity, 10, clMetal, 6, clRock, 2, clFood, 8),
327         1.5 * numPlayers, 100
329 Engine.SetProgress(86);
331 log("Creating Fish...");
332 group = new SimpleGroup([new SimpleObject(oFish, 1,1, 0,3)], true, clFood);
333 createObjectGroupsDeprecated(group, 0,
334         [stayClasses(clWater,1),avoidClasses(clFood, 8)],
335         scaleByMapSize(40,200), 100
337 Engine.SetProgress(90);
339 log("Creating Whales...");
340 group = new SimpleGroup([new SimpleObject(oWhale, 1,1, 0,3)], true, clFood);
341 createObjectGroupsDeprecated(group, 0,
342         [stayClasses(clWater,1),avoidClasses(clFood, 8, clPlayer,4,clIsland,4)],
343         scaleByMapSize(10,40), 100
345 Engine.SetProgress(94);
347 log("Creating shipwrecks...");
348 group = new SimpleGroup([new SimpleObject(oShipwreck, 1,1, 0,3)], true, clFood);
349 createObjectGroupsDeprecated(group, 0,
350         [stayClasses(clWater,1),avoidClasses(clFood, 8)],
351         scaleByMapSize(6,16), 100
353 Engine.SetProgress(98);
355 log("Creating shipwreck debris...");
356 group = new SimpleGroup([new SimpleObject(oShipDebris, 1,2, 0,4)], true, clFood);
357 createObjectGroupsDeprecated(group, 0,
358         [stayClasses(clWater,1),avoidClasses(clFood, 8)],
359         scaleByMapSize(10,20), 100
361 Engine.SetProgress(99);
363 placePlayersNomad(clPlayer, avoidClasses(clWater, 4, clForest, 1, clBaseResource, 4, clHill, 4));
365 setSkySet("sunny");
366 setWaterColor(0.2,0.294,0.49);
367 setWaterTint(0.208, 0.659, 0.925);
368 setWaterMurkiness(0.72);
369 setWaterWaviness(3.0);
370 setWaterType("ocean");
372 ExportMap();