Invincible women on survival of the fittest to prevent women fights and cheap tower...
[0ad.git] / binaries / data / mods / public / maps / random / syria.js
blob72172a3e82be9f07f4c2c94da2f57cbb6541be61
1 RMS.LoadLibrary("rmgen");
3 //terrain textures
4 const tMainDirt = ["desert_dirt_rocks_1", "desert_dirt_cracks"];
5 const tForestFloor1 = "forestfloor_dirty";
6 const tForestFloor2 = "desert_forestfloor_palms";
7 const tGrassSands = "desert_grass_a_sand";
8 const tGrass = "desert_grass_a";
9 const tSecondaryDirt = "medit_dirt_dry";
10 const tCliff = ["desert_cliff_persia_1", "desert_cliff_persia_2"];
11 const tHill = ["desert_dirt_rocks_1", "desert_dirt_rocks_2", "desert_dirt_rocks_3"];
12 const tDirt = ["desert_dirt_rough", "desert_dirt_rough_2"];
13 const tRoad = "desert_shore_stones";;
14 const tRoadWild = "desert_grass_a_stones";;
16 // gaia entities
17 const oTamarix = "gaia/flora_tree_tamarix";
18 const oPalm = "gaia/flora_tree_date_palm";
19 const oPine = "gaia/flora_tree_aleppo_pine";
20 const oBush = "gaia/flora_bush_grapes";
21 const oCamel = "gaia/fauna_camel";
22 const oGazelle = "gaia/fauna_gazelle";
23 const oLion = "gaia/fauna_lion";
24 const oLioness = "gaia/fauna_lioness";
25 const oStoneLarge = "gaia/geology_stonemine_desert_quarry";
26 const oStoneSmall = "gaia/geology_stone_desert_small";
27 const oMetalLarge = "gaia/geology_metal_desert_slabs";
29 // decorative props
30 const aFlower1 = "actor|props/flora/decals_flowers_daisies.xml";
31 const aWaterFlower = "actor|props/flora/water_lillies.xml";
32 const aReedsA = "actor|props/flora/reeds_pond_lush_a.xml";
33 const aReedsB = "actor|props/flora/reeds_pond_lush_b.xml";
34 const aRock = "actor|geology/stone_desert_med.xml";
35 const aBushA = "actor|props/flora/bush_desert_dry_a.xml";
36 const aBushB = "actor|props/flora/bush_desert_dry_a.xml";
37 const aBushes = [aBushA, aBushB];
38 const aSand = "actor|particle/blowing_sand.xml";
40 const pForestP = [tForestFloor2 + TERRAIN_SEPARATOR + oPalm, tForestFloor2];
41 const pForestT = [tForestFloor1 + TERRAIN_SEPARATOR + oTamarix,tForestFloor2];
43 log("Initializing map...");
45 InitMap();
47 const numPlayers = getNumPlayers();
48 const mapSize = getMapSize();
49 const mapArea = mapSize*mapSize;
51 // create tile classes
53 var clPlayer = createTileClass();
54 var clHill = createTileClass();
55 var clForest = createTileClass();
56 var clDirt = createTileClass();
57 var clRock = createTileClass();
58 var clMetal = createTileClass();
59 var clFood = createTileClass();
60 var clBaseResource = createTileClass();
61 var clSettlement = createTileClass();
62 var clGrass = createTileClass();
64 var playerIDs = [];
65 for (var i = 0; i < numPlayers; i++)
67         playerIDs.push(i+1);
69 playerIDs = sortPlayers(playerIDs);
71 // place players
73 var playerX = new Array(numPlayers);
74 var playerZ = new Array(numPlayers);
75 var playerAngle = new Array(numPlayers);
77 var startAngle = randFloat(0, TWO_PI);
78 for (var i = 0; i < numPlayers; i++)
80         playerAngle[i] = startAngle + i*TWO_PI/numPlayers;
81         playerX[i] = 0.5 + 0.35*cos(playerAngle[i]);
82         playerZ[i] = 0.5 + 0.35*sin(playerAngle[i]);
85 for (var i = 0; i < numPlayers; i++)
87         var id = playerIDs[i];
88         log("Creating base for player " + id + "...");
90         // scale radius of player area by map size
91         var radius = scaleByMapSize(15,25);
93         // get the x and z in tiles
94         var fx = fractionToTiles(playerX[i]);
95         var fz = fractionToTiles(playerZ[i]);
96         var ix = round(fx);
97         var iz = round(fz);
99         // calculate size based on the radius
100         var size = PI * radius * radius;
102         // create the player area
103         var placer = new ClumpPlacer(size, 0.9, 0.5, 10, ix, iz);
104         createArea(placer, paintClass(clPlayer), null);
106         // create the grass patches
107         var grassRadius = floor(scaleByMapSize(16 ,30));
108         placer = new ChainPlacer(2, floor(scaleByMapSize(5, 12)), floor(scaleByMapSize(25, 60)), 1, ix, iz, 0, [grassRadius]);
109         var painter = new LayeredPainter([tGrassSands, tGrass], [3]);
110         createArea(placer, [painter, paintClass(clGrass)], null);
112         // create the city patch
113         var cityRadius = 10;
114         placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz);
115         var painter = new LayeredPainter([tRoadWild, tRoad], [3]);
116         createArea(placer, painter, null);
118         // create starting units
119         placeCivDefaultEntities(fx, fz, id);
121         placeDefaultChicken(fx, fz, clBaseResource);
123         // create berry bushes
124         var bbAngle = randFloat(0, TWO_PI);
125         var bbDist = 12;
126         var bbX = round(fx + bbDist * cos(bbAngle));
127         var bbZ = round(fz + bbDist * sin(bbAngle));
128         var group = new SimpleGroup(
129                 [new SimpleObject(oBush, 5,5, 0,3)],
130                 true, clBaseResource, bbX, bbZ
131         );
132         createObjectGroup(group, 0);
134         // create metal mine
135         var mAngle = bbAngle;
136         while(abs(mAngle - bbAngle) < PI/3)
137         {
138                 mAngle = randFloat(0, TWO_PI);
139         }
140         var mDist = 11;
141         var mX = round(fx + mDist * cos(mAngle));
142         var mZ = round(fz + mDist * sin(mAngle));
143         group = new SimpleGroup(
144                 [new SimpleObject(oMetalLarge, 1,1, 0,0), new RandomObject(aBushes, 2,4, 0,2)],
145                 true, clBaseResource, mX, mZ
146         );
147         createObjectGroup(group, 0);
149         // create stone mines
150         mAngle += randFloat(PI/8, PI/4);
151         mX = round(fx + mDist * cos(mAngle));
152         mZ = round(fz + mDist * sin(mAngle));
153         group = new SimpleGroup(
154                 [new SimpleObject(oStoneLarge, 1,1, 0,2), new RandomObject(aBushes, 2,4, 0,2)],
155                 true, clBaseResource, mX, mZ
156         );
157         createObjectGroup(group, 0);
159         // create starting trees
160         var num = 3;
161         var tAngle = randFloat(-PI/3, 4*PI/3);
162         var tDist = randFloat(11, 13);
163         var tX = round(fx + tDist * cos(tAngle));
164         var tZ = round(fz + tDist * sin(tAngle));
165         group = new SimpleGroup(
166                 [new SimpleObject([oPalm, oTamarix][randInt(0,1)], num, num, 0,5)],
167                 false, clBaseResource, tX, tZ
168         );
169         createObjectGroup(group, 0, avoidClasses(clBaseResource,2));
172 RMS.SetProgress(10);
174 // create bumps
175 log("Creating bumps...");
176 placer = new ClumpPlacer(scaleByMapSize(20, 50), 0.3, 0.06, 1);
177 painter = new SmoothElevationPainter(ELEVATION_MODIFY, 2, 2);
178 createAreas(
179         placer,
180         painter,
181         avoidClasses(clPlayer, 13),
182         scaleByMapSize(300, 800)
185 // create hills
186 log("Creating hills...");
187 placer = new ChainPlacer(1, floor(scaleByMapSize(4, 6)), floor(scaleByMapSize(16, 40)), 0.5);
188 var terrainPainter = new LayeredPainter(
189         [tCliff, tHill],                // terrains
190         [2]                                                             // widths
192 var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 22, 2);
193 createAreas(
194         placer,
195         [terrainPainter, elevationPainter, paintClass(clHill)],
196         avoidClasses(clPlayer, 3, clGrass, 1, clHill, 10),
197         scaleByMapSize(1, 3) * numPlayers * 3
200 RMS.SetProgress(25);
202 // calculate desired number of trees for map (based on size)
203 const MIN_TREES = 400;
204 const MAX_TREES = 2000;
205 const P_FOREST = 0.7;
207 var totalTrees = scaleByMapSize(MIN_TREES, MAX_TREES);
208 var numForest = totalTrees * P_FOREST;
209 var numStragglers = totalTrees * (1.0 - P_FOREST);
211 // create forests
212 log("Creating forests...");
213 var types = [
214         [[tMainDirt, tForestFloor2, pForestP], [tForestFloor2, pForestP]],
215         [[tMainDirt, tForestFloor1, pForestT], [tForestFloor1, pForestT]]
216 ];      // some variation
217 var size = numForest / (scaleByMapSize(3,6) * numPlayers);
218 var num = floor(size / types.length);
219 for (var i = 0; i < types.length; ++i)
221         placer = new ChainPlacer(1, floor(scaleByMapSize(3, 5)), numForest / (num * floor(scaleByMapSize(2,4))), 0.5);
222         painter = new LayeredPainter(
223                 types[i],               // terrains
224                 [2]                                                                                     // widths
225                 );
226         createAreas(
227                 placer,
228                 [painter, paintClass(clForest)],
229                 avoidClasses(clPlayer, 1, clGrass, 1, clForest, 10, clHill, 1),
230                 num
231         );
234 RMS.SetProgress(40);
236 // create dirt patches
237 log("Creating dirt patches...");
238 var sizes = [scaleByMapSize(3, 6), scaleByMapSize(5, 10), scaleByMapSize(8, 21)];
239 for (var i = 0; i < sizes.length; i++)
241         placer = new ChainPlacer(1, floor(scaleByMapSize(3, 5)), sizes[i], 0.5);
242         painter = new LayeredPainter(
243                 [tSecondaryDirt ,tDirt],                // terrains
244                 [1]                                                                                                                     // widths
245         );
246         createAreas(
247                 placer,
248                 painter,
249                 avoidClasses(clHill, 0, clForest, 0, clPlayer, 8, clGrass, 1),
250                 scaleByMapSize(50, 90)
251         );
253 RMS.SetProgress(60);
255 // create big patches
256 log("Creating big patches...");
257 var sizes = [scaleByMapSize(6, 30), scaleByMapSize(10, 50), scaleByMapSize(16, 70)];
258 for (var i = 0; i < sizes.length; i++)
260         placer = new ChainPlacer(1, floor(scaleByMapSize(3, 5)), sizes[i], 0.5);
261         painter = new LayeredPainter(
262                 [tSecondaryDirt ,tDirt],                // terrains
263                 [1]                                                                                                                     // widths
264         );
265         createAreas(
266                 placer,
267                 painter,
268                 avoidClasses(clHill, 0, clForest, 0, clPlayer, 8, clGrass, 1),
269                 scaleByMapSize(30, 90)
270         );
272 RMS.SetProgress(70);
274 log("Creating stone mines...");
275 // create large stone quarries
276 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);
277 createObjectGroups(group, 0,
278         [avoidClasses(clForest, 1, clPlayer, 10, clRock, 10, clHill, 1, clGrass, 1)],
279         scaleByMapSize(2,8), 100
282 // create small stone quarries
283 group = new SimpleGroup([new SimpleObject(oStoneSmall, 2,5, 1,3), new RandomObject(aBushes, 2,4, 0,2)], true, clRock);
284 createObjectGroups(group, 0,
285         [avoidClasses(clForest, 1, clPlayer, 10, clRock, 10, clHill, 1, clGrass, 1)],
286         scaleByMapSize(2,8), 100
289 log("Creating metal mines...");
290 // create large metal quarries
291 group = new SimpleGroup([new SimpleObject(oMetalLarge, 1,1, 0,4), new RandomObject(aBushes, 2,4, 0,2)], true, clMetal);
292 createObjectGroups(group, 0,
293         [avoidClasses(clForest, 1, clPlayer, 10, clMetal, 10, clRock, 5, clHill, 1, clGrass, 1)],
294         scaleByMapSize(2,8), 100
297 // create small decorative rocks
298 log("Creating small decorative rocks...");
299 group = new SimpleGroup(
300         [new SimpleObject(aRock, 1,3, 0,1)],
301         true
303 createObjectGroups(
304         group, 0,
305         avoidClasses(clForest, 0, clPlayer, 0, clHill, 0),
306         scaleByMapSize(16, 262), 50
310 //create bushes
311 log("Creating bushes...");
312 group = new SimpleGroup(
313         [new SimpleObject(aBushB, 1,2, 0,1), new SimpleObject(aBushA, 1,3, 0,2)],
314         true
316 createObjectGroups(
317         group, 0,
318         avoidClasses(clForest, 0, clPlayer, 0, clHill, 0),
319         scaleByMapSize(50, 500), 50
322 RMS.SetProgress(80);
324 // create gazelle
325 log("Creating gazelle...");
326 group = new SimpleGroup(
327         [new SimpleObject(oGazelle, 5,7, 0,4)],
328         true, clFood
330 createObjectGroups(group, 0,
331         avoidClasses(clForest, 0, clPlayer, 1, clHill, 1, clFood, 20, clGrass, 2),
332         3 * numPlayers, 50
335 // create lions
336 log("Creating lions...");
337 group = new SimpleGroup(
338         [new SimpleObject(oLion, 2,3, 0,2)],
339         true, clFood
341 createObjectGroups(group, 0,
342         avoidClasses(clForest, 0, clPlayer, 1, clHill, 1, clFood, 20, clGrass, 2),
343         3 * numPlayers, 50
346 // create camels
347 log("Creating camels...");
348 group = new SimpleGroup(
349         [new SimpleObject(oCamel, 2,3, 0,2)],
350         true, clFood
352 createObjectGroups(group, 0,
353         avoidClasses(clForest, 0, clPlayer, 1, clHill, 1, clFood, 20, clGrass, 2),
354         3 * numPlayers, 50
359 RMS.SetProgress(85);
361 // create straggler trees
362 log("Creating straggler trees...");
363 var types = [oPalm, oTamarix, oPine];   // some variation
364 var num = floor(numStragglers / types.length);
365 for (var i = 0; i < types.length; ++i)
367         group = new SimpleGroup(
368                 [new SimpleObject(types[i], 1,1, 0,3)],
369                 true, clForest
370         );
371         createObjectGroups(group, 0,
372                 avoidClasses(clForest, 1, clHill, 1, clPlayer, 1, clMetal, 1, clRock, 1),
373                 num
374         );
377 // create inner straggler trees
378 log("Creating straggler trees...");
379 var types = [oPalm, oTamarix, oPine];   // some variation
380 var num = floor(numStragglers / types.length);
381 for (var i = 0; i < types.length; ++i)
383         group = new SimpleGroup(
384                 [new SimpleObject(types[i], 1,1, 0,3)],
385                 true, clForest
386         );
387         createObjectGroups(group, 0,
388                 [avoidClasses(clForest, 1, clHill, 1, clPlayer, 1, clMetal, 1, clRock, 1), stayClasses(clGrass, 3)],
389                 num
390         );
393 // Set environment
394 setSkySet("sunny");
395 setSunElevation(PI / 8);
396 setSunRotation(randFloat(0, TWO_PI));
397 setSunColor(0.746, 0.718, 0.539);
398 setWaterColor(0.292, 0.347, 0.691);
399 setWaterTint(0.550, 0.543, 0.437);
400 setWaterMurkiness(0.83);
402 setFogColor(0.8, 0.76, 0.61);
403 setFogThickness(0.2);
404 setFogFactor(0.4);
406 setPPEffect("hdr");
407 setPPContrast(0.65);
408 setPPSaturation(0.42);
409 setPPBloom(0.6);
411 // Export map data
412 ExportMap();