Invincible women on survival of the fittest to prevent women fights and cheap tower...
[0ad.git] / binaries / data / mods / public / maps / random / sahel.js
blobc06b944c096932a4a9b67692997cbf3562ae4f08
1 RMS.LoadLibrary("rmgen");
3 const tGrass1 = "savanna_grass_a";
4 const tGrass2 = "savanna_grass_b";
5 const tGrass3 = "savanna_shrubs_a";
6 const tDirt1 = "savanna_dirt_rocks_a";
7 const tDirt2 = "savanna_dirt_rocks_b";
8 const tDirt3 = "savanna_dirt_rocks_c";
9 const tDirt4 = "savanna_dirt_b";
10 const tCityTiles = "savanna_tile_a";
11 const tShore = "savanna_riparian_bank";
12 const tWater = "savanna_riparian_wet";
14 // gaia entities
15 const oBaobab = "gaia/flora_tree_baobab";
16 const oBerryBush = "gaia/flora_bush_berry";
17 const oGazelle = "gaia/fauna_gazelle";
18 const oGiraffe = "gaia/fauna_giraffe";
19 const oGiraffeInfant = "gaia/fauna_giraffe_infant";
20 const oElephant = "gaia/fauna_elephant_african_bush";
21 const oElephantInfant = "gaia/fauna_elephant_african_infant";
22 const oLion = "gaia/fauna_lion";
23 const oLioness = "gaia/fauna_lioness";
24 const oZebra = "gaia/fauna_zebra";
25 const oStoneSmall = "gaia/geology_stone_savanna_small";
26 const oMetalLarge = "gaia/geology_metal_savanna_slabs";
28 // decorative props
29 const aBush = "actor|props/flora/bush_medit_sm_dry.xml";
30 const aRock = "actor|geology/stone_savanna_med.xml";
32 const PI12 = PI / 6;
34 function placeStoneMineFormation(x, z)
36         var placer = new ChainPlacer(1, 2, 2, 1, x, z, undefined, [5]);
37         var painter = new TerrainPainter(tDirt4);
38         createArea(placer, painter, null);
40         var bbAngle = randFloat(0, TWO_PI);
41         const bbDist = 2.5;
43         for (var i = 0; i < 8; ++i)
44         {
45                 var bbX = round(x + (bbDist + randFloat(0,1)) * cos(bbAngle));
46                 var bbZ = round(z + (bbDist + randFloat(0,1)) * sin(bbAngle));
48                 placeObject(bbX, bbZ, oStoneSmall, 0, randFloat(0, TWO_PI));
50                 bbAngle += PI12;
51         }
54 log("Initializing map...");
56 InitMap();
58 var numPlayers = getNumPlayers();
59 var mapSize = getMapSize();
60 var mapArea = mapSize*mapSize;
62 // create tile classes
63 var clPlayer = createTileClass();
64 var clHill = createTileClass();
65 var clForest = createTileClass();
66 var clWater = createTileClass();
67 var clDirt = createTileClass();
68 var clRock = createTileClass();
69 var clMetal = createTileClass();
70 var clFood = createTileClass();
71 var clBaseResource = createTileClass();
72 var clSettlement = createTileClass();
74 // randomize player order
75 var playerIDs = [];
76 for (var i = 0; i < numPlayers; i++)
78         playerIDs.push(i+1);
80 playerIDs = sortPlayers(playerIDs);
82 // place players
84 var playerX = new Array(numPlayers);
85 var playerZ = new Array(numPlayers);
86 var playerAngle = new Array(numPlayers);
88 var startAngle = randFloat(0, TWO_PI);
90 for (var i = 0; i < numPlayers; i++)
92         playerAngle[i] = startAngle + i*TWO_PI/numPlayers;
93         playerX[i] = 0.5 + 0.35*cos(playerAngle[i]);
94         playerZ[i] = 0.5 + 0.35*sin(playerAngle[i]);
97 for (var i = 0; i < numPlayers; i++)
99         var id = playerIDs[i];
100         log("Creating base for player " + id + "...");
102         // some constants
103         var radius = scaleByMapSize(15,25);
104         var cliffRadius = 2;
105         var elevation = 20;
107         // get the x and z in tiles
108         var fx = fractionToTiles(playerX[i]);
109         var fz = fractionToTiles(playerZ[i]);
110         var ix = round(fx);
111         var iz = round(fz);
112         addToClass(ix, iz, clPlayer);
113         addToClass(ix+5, iz, clPlayer);
114         addToClass(ix, iz+5, clPlayer);
115         addToClass(ix-5, iz, clPlayer);
116         addToClass(ix, iz-5, clPlayer);
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(oBerryBush, 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 = 13;
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)],
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         placeStoneMineFormation(mX, mZ);
154         addToClass(mX, mZ, clPlayer);
155         // create the city patch
156         var cityRadius = radius/3;
157         var placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz);
158         var painter = new TerrainPainter(tCityTiles);
159         createArea(placer, painter, null);
161         var hillSize = PI * radius * radius;
162         // create starting trees
163         var num = floor(hillSize / 300);
164         var tAngle = randFloat(-PI/3, 4*PI/3);
165         var tDist = randFloat(11, 13);
166         var tX = round(fx + tDist * cos(tAngle));
167         var tZ = round(fz + tDist * sin(tAngle));
168         group = new SimpleGroup(
169                 [new SimpleObject(oBaobab, num, num, 2,7)],
170                 false, clBaseResource, tX, tZ
171         );
172         createObjectGroup(group, 0, avoidClasses(clBaseResource,2));
176 RMS.SetProgress(20);
178 // create big patches
179 log("Creating big patches...");
180 var patches = [tGrass2, tGrass3];
181 for (var i = 0; i < patches.length; i++)
183         placer = new ChainPlacer(floor(scaleByMapSize(3, 6)), floor(scaleByMapSize(10, 20)), floor(scaleByMapSize(15, 60)), 1);
184         painter = new TerrainPainter(patches[i]);
185         createAreas(
186                 placer,
187                 painter,
188                 avoidClasses(clPlayer, 10),
189                 scaleByMapSize(5, 20)
190         );
193 // create small patches
194 log("Creating small patches...");
195 var patches = [tDirt1, tDirt2, tDirt3];
196 var sizes = [scaleByMapSize(3, 6), scaleByMapSize(5, 10), scaleByMapSize(8, 21)];
197 for (var i = 0; i < sizes.length; i++)
199         for (var j = 0; j < patches.length; ++j)
200         {
201                 placer = new ChainPlacer(1, floor(scaleByMapSize(3, 5)), sizes[i], 1);
202                 painter = new TerrainPainter(patches[j]);
203                 createAreas(
204                         placer,
205                         painter,
206                         avoidClasses(clPlayer, 12),
207                         scaleByMapSize(4, 15)
208                 );
209         }
212 // create water holes
213 log("Creating water holes...");
214 placer = new ChainPlacer(1, floor(scaleByMapSize(3, 5)), floor(scaleByMapSize(20, 60)), 1);
215 var terrainPainter = new LayeredPainter(
216         [tShore, tWater],               // terrains
217         [1]                                                     // widths
219 var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, -5, 7);
220 createAreas(
221         placer,
222         [terrainPainter, elevationPainter, paintClass(clWater)],
223         avoidClasses(clPlayer, 24),
224         scaleByMapSize(1, 3)
228 RMS.SetProgress(55);
230 var playerConstraint = new AvoidTileClassConstraint(clPlayer, 30);
231 var minesConstraint = new AvoidTileClassConstraint(clRock, 25);
232 var waterConstraint = new AvoidTileClassConstraint(clWater, 10);
234 log("Creating stone mines...");
235 // create stone mines
236 for (var i = 0; i < scaleByMapSize(12,30); ++i)
238         var mX = randInt(mapSize);
239         var mZ = randInt(mapSize);
240         if (playerConstraint.allows(mX, mZ) && minesConstraint.allows(mX, mZ) && waterConstraint.allows(mX, mZ))
241         {
242                 placeStoneMineFormation(mX, mZ);
243                 addToClass(mX, mZ, clRock);
244         }
247 log("Creating metal mines...");
248 // create large metal quarries
249 group = new SimpleGroup([new SimpleObject(oMetalLarge, 1,1, 0,4)], true, clMetal);
250 createObjectGroups(group, 0,
251         avoidClasses(clPlayer, 20, clMetal, 10, clRock, 8, clWater, 4),
252         scaleByMapSize(2,8), 100
255 RMS.SetProgress(65);
257 // create small decorative rocks
258 log("Creating small decorative rocks...");
259 group = new SimpleGroup(
260         [new SimpleObject(aRock, 1,3, 0,3)],
261         true
263 createObjectGroups(
264         group, 0,
265         avoidClasses(clPlayer, 7, clWater, 1),
266         scaleByMapSize(200, 1200), 1
269 RMS.SetProgress(70);
271 // create gazelle
272 log("Creating gazelle...");
273 group = new SimpleGroup(
274         [new SimpleObject(oGazelle, 5,7, 0,4)],
275         true, clFood
277 createObjectGroups(group, 0,
278         avoidClasses(clWater, 1, clPlayer, 20, clFood, 11),
279         scaleByMapSize(4,12), 50
282 // create zebra
283 log("Creating zebra...");
284 group = new SimpleGroup(
285         [new SimpleObject(oZebra, 5,7, 0,4)],
286         true, clFood
288 createObjectGroups(group, 0,
289         avoidClasses(clWater, 1, clPlayer, 20, clFood, 11),
290         scaleByMapSize(4,12), 50
293 // create giraffe
294 log("Creating giraffe...");
295 group = new SimpleGroup(
296         [new SimpleObject(oGiraffe, 2,4, 0,4), new SimpleObject(oGiraffeInfant, 0,2, 0,4)],
297         true, clFood
299 createObjectGroups(group, 0,
300         avoidClasses(clWater, 1, clPlayer, 20, clFood, 11),
301         scaleByMapSize(4,12), 50
304 // create elephants
305 log("Creating elephants...");
306 group = new SimpleGroup(
307         [new SimpleObject(oElephant, 2,4, 0,4), new SimpleObject(oElephantInfant, 0,2, 0,4)],
308         true, clFood
310 createObjectGroups(group, 0,
311         avoidClasses(clWater, 1, clPlayer, 20, clFood, 11),
312         scaleByMapSize(4,12), 50
315 // create lions
316 log("Creating lions...");
317 group = new SimpleGroup(
318         [new SimpleObject(oLion, 0,1, 0,4), new SimpleObject(oLioness, 2,3, 0,4)],
319         true, clFood
321 createObjectGroups(group, 0,
322         avoidClasses(clWater, 1, clPlayer, 20, clFood, 11),
323         scaleByMapSize(4,12), 50
326 // create berry bush
327 log("Creating berry bush...");
328 group = new SimpleGroup(
329         [new SimpleObject(oBerryBush, 5,7, 0,4)],
330         true, clFood
332 createObjectGroups(group, 0,
333         avoidClasses(clWater, 3, clPlayer, 20, clFood, 12, clRock, 7, clMetal, 2),
334         randInt(1, 4) * numPlayers + 2, 50
337 RMS.SetProgress(85);
340 // create straggler trees
341 log("Creating straggler trees...");
342 var num = scaleByMapSize(70, 500);
343 group = new SimpleGroup(
344         [new SimpleObject(oBaobab, 1,1, 0,3)],
345         true, clForest
347 createObjectGroups(group, 0,
348         avoidClasses(clForest, 1, clPlayer, 20, clMetal, 1, clRock, 7, clWater, 1),
349         num
353 // create large grass tufts
354 log("Creating large grass tufts...");
355 group = new SimpleGroup(
356         [new SimpleObject(aBush, 2,4, 0,1.8, -PI/8,PI/8)]
358 createObjectGroups(group, 0,
359         avoidClasses(clWater, 3, clPlayer, 2, clForest, 0),
360         scaleByMapSize(100, 1200)
363 setSunColor(0.87451, 0.847059, 0.647059);
364 setWaterColor(0.741176, 0.592157, 0.27451);
365 setWaterTint(0.741176, 0.592157, 0.27451);
366 setWaterWaviness(2.0);
367 setWaterType("clap");
368 setWaterMurkiness(0.835938);
370 setUnitsAmbientColor(0.57, 0.58, 0.55);
371 setTerrainAmbientColor(0.447059, 0.509804, 0.54902);
373 setFogFactor(0.25);
374 setFogThickness(0.15);
375 setFogColor(0.847059, 0.737255, 0.482353);
377 setPPEffect("hdr");
378 setPPContrast(0.57031);
379 setPPBloom(0.34);
381 ExportMap();