Invincible women on survival of the fittest to prevent women fights and cheap tower...
[0ad.git] / binaries / data / mods / public / maps / random / persian_highlands.js
blob92445adf65f2aeff5243992b376c732a8b544b5c
1 RMS.LoadLibrary("rmgen");
3 const tCity = "desert_city_tile_pers_dirt";
4 var random_season = randInt(0,1);
5 if (random_season) //summer
7         var tDirtMain = ["desert_dirt_persia_1", "desert_dirt_persia_2", "grass_field_dry"];
8         var tLakebed1 = ["desert_lakebed_dry_b", "desert_lakebed_dry"];
9         var tLakebed2 = ["desert_lakebed_dry_b", "desert_lakebed_dry", "desert_shore_stones", "desert_shore_stones"];
10         var tPebbles = "desert_pebbles_rough";
11         var tCliff = ["desert_cliff_persia_1", "desert_cliff_persia_crumbling"];
12         var tForestFloor = "medit_grass_field_dry";
13         var tRocky = "desert_dirt_persia_rocky";
14         var tRocks = "desert_dirt_persia_rocks";
15         var tGrass = "grass_field_dry";
16         var tHill = "desert_cliff_persia_base";
18 else //spring
20         var tDirtMain = ["desert_grass_a", "desert_grass_a", "desert_grass_a", "desert_plants_a"];
21         var tLakebed1 = ["desert_lakebed_dry_b", "desert_lakebed_dry"];
22         var tLakebed2 = "desert_grass_a_sand";
23         var tPebbles = "desert_pebbles_rough";
24         var tCliff = ["desert_cliff_persia_1", "desert_cliff_persia_crumbling"];
25         var tForestFloor = "desert_plants_b_persia";
26         var tRocky = "desert_plants_b_persia";
27         var tRocks = "desert_plants_a";
28         var tGrass = "desert_dirt_persia_rocky";
29         var tHill = "desert_cliff_persia_base";
32 // gaia entities
33 const oGrapesBush = "gaia/flora_bush_grapes";
34 const oCamel = "gaia/fauna_camel";
35 const oFish = "gaia/fauna_fish";
36 const oSheep = "gaia/fauna_sheep";
37 const oGoat = "gaia/fauna_goat";
38 const oLion = "gaia/fauna_lioness";
39 const oStoneLarge = "gaia/geology_stonemine_desert_badlands_quarry";
40 const oStoneSmall = "gaia/geology_stone_desert_small";
41 const oMetalLarge = "gaia/geology_metal_desert_slabs";
42 const oTamarix = "gaia/flora_tree_tamarix";
43 const oOak = "gaia/flora_tree_oak";
45 // decorative props
46 const aBush1 = "actor|props/flora/bush_desert_a.xml";
47 const aBush2 = "actor|props/flora/bush_desert_dry_a.xml";
48 const aBush3 = "actor|props/flora/bush_dry_a.xml";
49 const aBush4 = "actor|props/flora/plant_desert_a.xml";
50 const aBushes = [aBush1, aBush2, aBush3, aBush4];
51 const aDecorativeRock = "actor|geology/stone_desert_med.xml";
53 // terrain + entity (for painting)
54 const pForestO = [tForestFloor + TERRAIN_SEPARATOR + oOak, tForestFloor + TERRAIN_SEPARATOR + oOak, tForestFloor, tDirtMain, tDirtMain];
56 log("Initializing map...");
58 InitMap();
60 const numPlayers = getNumPlayers();
61 const mapSize = getMapSize();
62 const mapArea = mapSize*mapSize;
64 // create tile classes
66 var clPlayer = createTileClass();
67 var clHill = createTileClass();
68 var clForest = createTileClass();
69 var clPatch = createTileClass();
70 var clRock = createTileClass();
71 var clMetal = createTileClass();
72 var clFood = createTileClass();
73 var clBaseResource = createTileClass();
74 var clCP = createTileClass();
76 for (var ix = 0; ix < mapSize; ix++)
78         for (var iz = 0; iz < mapSize; iz++)
79         {
80                 var x = ix / (mapSize + 1.0);
81                 var z = iz / (mapSize + 1.0);
82                         placeTerrain(ix, iz, tDirtMain);
83         }
86 var playerIDs = [];
87 for (var i = 0; i < numPlayers; i++)
89         playerIDs.push(i+1);
91 playerIDs = sortPlayers(playerIDs);
93 // place players
95 var playerX = new Array(numPlayers);
96 var playerZ = new Array(numPlayers);
97 var playerAngle = new Array(numPlayers);
99 var startAngle = randFloat(0, TWO_PI);
100 for (var i = 0; i < numPlayers; i++)
102         playerAngle[i] = startAngle + i*TWO_PI/numPlayers;
103         playerX[i] = 0.5 + 0.35*cos(playerAngle[i]);
104         playerZ[i] = 0.5 + 0.35*sin(playerAngle[i]);
107 for (var i = 0; i < numPlayers; i++)
109         var id = playerIDs[i];
110         log("Creating base for player " + id + "...");
112         // scale radius of player area by map size
113         var radius = scaleByMapSize(15,25);
115         // get the x and z in tiles
116         var fx = fractionToTiles(playerX[i]);
117         var fz = fractionToTiles(playerZ[i]);
118         var ix = round(fx);
119         var iz = round(fz);
121         // calculate size based on the radius
122         var size = PI * radius * radius;
124         // create the player area
125         var placer = new ClumpPlacer(size, 0.9, 0.5, 10, ix, iz);
126         createArea(placer, paintClass(clPlayer), null);
128         // create the city patch
129         var cityRadius = 10;
130         placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz);
131         var painter = new LayeredPainter([tCity, tCity], [3]);
132         createArea(placer, painter, null);
134         // create starting units
135         placeCivDefaultEntities(fx, fz, id);
137         placeDefaultChicken(fx, fz, clBaseResource);
139         // create berry bushes
140         var bbAngle = randFloat(0, TWO_PI);
141         var bbDist = 12;
142         var bbX = round(fx + bbDist * cos(bbAngle));
143         var bbZ = round(fz + bbDist * sin(bbAngle));
144         var group = new SimpleGroup(
145                 [new SimpleObject(oGrapesBush, 5,5, 0,3)],
146                 true, clBaseResource, bbX, bbZ
147         );
148         createObjectGroup(group, 0);
150         // create metal mine
151         var mAngle = bbAngle;
152         while(abs(mAngle - bbAngle) < PI/3)
153         {
154                 mAngle = randFloat(0, TWO_PI);
155         }
156         var mDist = 11;
157         var mX = round(fx + mDist * cos(mAngle));
158         var mZ = round(fz + mDist * sin(mAngle));
159         group = new SimpleGroup(
160                 [new SimpleObject(oMetalLarge, 1,1, 0,0), new RandomObject(aBushes, 2,4, 0,2)],
161                 true, clBaseResource, mX, mZ
162         );
163         createObjectGroup(group, 0);
165         // create stone mines
166         mAngle += randFloat(PI/8, PI/4);
167         mX = round(fx + mDist * cos(mAngle));
168         mZ = round(fz + mDist * sin(mAngle));
169         group = new SimpleGroup(
170                 [new SimpleObject(oStoneLarge, 1,1, 0,2), new RandomObject(aBushes, 2,4, 0,2)],
171                 true, clBaseResource, mX, mZ
172         );
173         createObjectGroup(group, 0);
175         // create starting trees
176         var num = 3;
177         var tAngle = randFloat(-PI/3, 4*PI/3);
178         var tDist = randFloat(11, 13);
179         var tX = round(fx + tDist * cos(tAngle));
180         var tZ = round(fz + tDist * sin(tAngle));
181         group = new SimpleGroup(
182                 [new SimpleObject(oOak, num, num, 0,5)],
183                 false, clBaseResource, tX, tZ
184         );
185         createObjectGroup(group, 0, avoidClasses(clBaseResource,2));
188 RMS.SetProgress(10);
190 // create patches
191 log("Creating rock patches...");
192 placer = new ChainPlacer(1, floor(scaleByMapSize(3, 6)), floor(scaleByMapSize(20, 45)), 0);
193 painter = new TerrainPainter(tRocky);
194 createAreas(placer, [painter, paintClass(clPatch)],
195         avoidClasses(clPatch, 2, clPlayer, 0),
196         scaleByMapSize(5, 20)
199 RMS.SetProgress(15);
201 var placer = new ChainPlacer(1, floor(scaleByMapSize(3, 5)), floor(scaleByMapSize(15, 40)), 0);
202 var painter = new TerrainPainter([tRocky, tRocks]);
203 createAreas(placer, [painter, paintClass(clPatch)],
204         avoidClasses(clPatch, 2, clPlayer, 4),
205         scaleByMapSize(15, 50)
208 RMS.SetProgress(20);
210 log("Creating dirt patches...");
211 placer = new ChainPlacer(1, floor(scaleByMapSize(3, 5)), floor(scaleByMapSize(15, 40)), 0);
212 painter = new TerrainPainter([tGrass]);
213 createAreas(placer, [painter, paintClass(clPatch)],
214         avoidClasses(clPatch, 2, clPlayer, 4),
215         scaleByMapSize(15, 50)
218 RMS.SetProgress(25);
220 // create centeral plateau
221 log("Creating centeral plateau...");
222 var halfSize = mapSize / 2;
223 var oRadius = scaleByMapSize(18, 68);
224 placer = new ChainPlacer(2, floor(scaleByMapSize(5, 13)), floor(scaleByMapSize(35, 200)), 1, halfSize, halfSize, 0, [floor(oRadius)]);
225 painter = new LayeredPainter([tLakebed2, tLakebed1], [6]);
226 var elevationPainter = new SmoothElevationPainter(ELEVATION_MODIFY, -10, 8);
227 createArea(placer, [painter, elevationPainter, paintClass(clCP)], avoidClasses(clPlayer, 18));
230 RMS.SetProgress(30);
232 // create hills
233 log("Creating hills...");
234 var numHills = scaleByMapSize(20, 80);
235 for (var i = 0; i < numHills; ++i)
238         createMountain(
239                 floor(scaleByMapSize(40, 60)),
240                 floor(scaleByMapSize(3, 4)),
241                 floor(scaleByMapSize(6, 12)),
242                 floor(scaleByMapSize(4, 10)),
243                 avoidClasses(clPlayer, 7, clCP, 5, clHill, floor(scaleByMapSize(18, 25))),
244                 randInt(mapSize),
245                 randInt(mapSize),
246                 tCliff,
247                 clHill,
248                 14
249         );
252 RMS.SetProgress(35);
254 // calculate desired number of trees for map (based on size)
255 const MIN_TREES = 500;
256 const MAX_TREES = 2500;
257 const P_FOREST = 0.7;
259 var totalTrees = scaleByMapSize(MIN_TREES, MAX_TREES);
260 var numForest = totalTrees * P_FOREST;
261 var numStragglers = totalTrees * (1.0 - P_FOREST);
263 // create forests
264 log("Creating forests...");
265 var types = [
266         [[tDirtMain, tForestFloor, pForestO], [tForestFloor, pForestO]],
267         [[tDirtMain, tForestFloor, pForestO], [tForestFloor, pForestO]]
268 ];      // some variation
269 var size = numForest / (scaleByMapSize(3,6) * numPlayers);
270 var num = floor(size / types.length);
271 for (var i = 0; i < types.length; ++i)
273         placer = new ChainPlacer(floor(scaleByMapSize(1, 2)), floor(scaleByMapSize(2, 5)), floor(size / floor(scaleByMapSize(8, 3))), 1);
274         painter = new LayeredPainter(
275                 types[i],               // terrains
276                 [2]                                                                                     // widths
277                 );
278         createAreas(
279                 placer,
280                 [painter, paintClass(clForest)],
281                 avoidClasses(clPlayer, 6, clForest, 10, clHill, 1, clCP, 1),
282                 num
283         );
286 RMS.SetProgress(50);
289 log("Creating stone mines...");
290 // create large stone quarries
291 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);
292 createObjectGroups(group, 0,
293         [avoidClasses(clForest, 1, clPlayer, 10, clRock, 10, clHill, 1, clCP, 1)],
294         scaleByMapSize(2,8), 100
297 // create small stone quarries
298 group = new SimpleGroup([new SimpleObject(oStoneSmall, 2,5, 1,3), new RandomObject(aBushes, 2,4, 0,2)], true, clRock);
299 createObjectGroups(group, 0,
300         [avoidClasses(clForest, 1, clPlayer, 10, clRock, 10, clHill, 1, clCP, 1)],
301         scaleByMapSize(2,8), 100
304 log("Creating metal mines...");
305 // create large metal quarries
306 group = new SimpleGroup([new SimpleObject(oMetalLarge, 1,1, 0,4), new RandomObject(aBushes, 2,4, 0,2)], true, clMetal);
307 createObjectGroups(group, 0,
308         [avoidClasses(clForest, 1, clPlayer, 10, clMetal, 10, clRock, 5, clHill, 1, clCP, 1)],
309         scaleByMapSize(2,8), 100
313 log("Creating centeral stone mines...");
314 // create large stone quarries
315 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);
316 createObjectGroups(group, 0,
317         stayClasses(clCP, 6),
318         5*scaleByMapSize(5,30), 50
321 // create small stone quarries
322 group = new SimpleGroup([new SimpleObject(oStoneSmall, 2,5, 1,3), new RandomObject(aBushes, 2,4, 0,2)], true, clRock);
323 createObjectGroups(group, 0,
324         stayClasses(clCP, 6),
325         5*scaleByMapSize(5,30), 50
328 log("Creating centeral metal mines...");
329 // create large metal quarries
330 group = new SimpleGroup([new SimpleObject(oMetalLarge, 1,1, 0,4), new RandomObject(aBushes, 2,4, 0,2)], true, clMetal);
331 createObjectGroups(group, 0,
332         stayClasses(clCP, 6),
333         5*scaleByMapSize(5,30), 50
336 RMS.SetProgress(60);
338 // create small decorative rocks
339 log("Creating small decorative rocks...");
340 group = new SimpleGroup(
341         [new SimpleObject(aDecorativeRock, 1,3, 0,1)],
342         true
344 createObjectGroups(
345         group, 0,
346         avoidClasses(clForest, 0, clPlayer, 0, clHill, 0),
347         scaleByMapSize(16, 262), 50
350 RMS.SetProgress(65);
352 //create bushes
353 log("Creating bushes...");
354 group = new SimpleGroup(
355         [new SimpleObject(aBush2, 1,2, 0,1), new SimpleObject(aBush1, 1,3, 0,2)],
356         true
358 createObjectGroups(
359         group, 0,
360         avoidClasses(clForest, 0, clPlayer, 0, clHill, 0),
361         scaleByMapSize(8, 131), 50
364 RMS.SetProgress(70);
366 // create goats
367 log("Creating goat...");
368 group = new SimpleGroup(
369         [new SimpleObject(oGoat, 5,7, 0,4)],
370         true, clFood
372 createObjectGroups(group, 0,
373         avoidClasses(clForest, 0, clPlayer, 1, clHill, 1, clFood, 20, clCP, 2),
374         3 * numPlayers, 50
377 // create sheep
378 log("Creating sheep...");
379 group = new SimpleGroup(
380         [new SimpleObject(oSheep, 2,3, 0,2)],
381         true, clFood
383 createObjectGroups(group, 0,
384         avoidClasses(clForest, 0, clPlayer, 1, clHill, 1, clFood, 20, clCP, 2),
385         3 * numPlayers, 50
388 // create grape bush
389 log("Creating grape bush...");
390 group = new SimpleGroup(
391         [new SimpleObject(oGrapesBush, 5,7, 0,4)],
392         true, clFood
394 createObjectGroups(group, 0,
395         avoidClasses(clForest, 0, clPlayer, 20, clHill, 1, clFood, 10, clCP, 2),
396         randInt(1, 4) * numPlayers + 2, 50
399 // create camels
400 log("Creating camels...");
401 group = new SimpleGroup(
402         [new SimpleObject(oCamel, 2,3, 0,2)],
403         true, clFood
405 createObjectGroups(group, 0,
406         stayClasses(clCP, 2),
407         3 * numPlayers, 50
411 RMS.SetProgress(90);
413 // create straggler trees
414 log("Creating straggler trees...");
415 var types = [oOak];     // some variation
416 var num = floor(numStragglers / types.length);
417 for (var i = 0; i < types.length; ++i)
419         group = new SimpleGroup(
420                 [new SimpleObject(types[i], 1,1, 0,3)],
421                 true, clForest
422         );
423         createObjectGroups(group, 0,
424                 avoidClasses(clForest, 1, clHill, 1, clPlayer, 1, clMetal, 1, clRock, 1, clCP, 2),
425                 num
426         );
429 if (!random_season)
430         setTerrainAmbientColor(0.329412, 0.419608, 0.501961);
432 setSunColor(1.0, 0.796, 0.374);
433 setSunElevation(PI / 6);
434 setSunRotation(-1.86532);
436 setFogFactor(0.2);
437 setFogThickness(0.0);
438 setFogColor(0.852, 0.746, 0.493);
440 setPPEffect("hdr");
441 setPPContrast(0.75);
442 setPPSaturation(0.45);
443 setPPBloom(0.3);
445 ExportMap();