Invincible women on survival of the fittest to prevent women fights and cheap tower...
[0ad.git] / binaries / data / mods / public / maps / random / cantabrian_highlands.js
blob335f0e0d621ff838a29606bdb3947a21b2c33603
1 RMS.LoadLibrary("rmgen");
3 // terrain textures
4 const tGrass = ["temp_grass", "temp_grass", "temp_grass_d"];
5 const tGrassPForest = "temp_plants_bog";
6 const tGrassDForest = "temp_plants_bog";
7 const tGrassA = "temp_grass_plants";
8 const tGrassB = "temp_plants_bog";
9 const tGrassC = "temp_mud_a";
10 const tDirt = ["temp_plants_bog", "temp_mud_a"];
11 const tHill = ["temp_highlands", "temp_grass_long_b"];
12 const tCliff = ["temp_cliff_a", "temp_cliff_b"];
13 const tRoad = "temp_road";
14 const tRoadWild = "temp_road_overgrown";
15 const tGrassPatchBlend = "temp_grass_long_b";
16 const tGrassPatch = ["temp_grass_d", "temp_grass_clovers"];
17 const tShoreBlend = "temp_grass_plants";
18 const tShore = "temp_plants_bog";
19 const tWater = "temp_mud_a";
21 // gaia entities
22 const oOak = "gaia/flora_tree_oak";
23 const oOakLarge = "gaia/flora_tree_oak_large";
24 const oApple = "gaia/flora_tree_apple";
25 const oPine = "gaia/flora_tree_pine";
26 const oAleppoPine = "gaia/flora_tree_aleppo_pine";
27 const oBerryBush = "gaia/flora_bush_berry";
28 const oDeer = "gaia/fauna_deer";
29 const oFish = "gaia/fauna_fish";
30 const oSheep = "gaia/fauna_sheep";
31 const oStoneLarge = "gaia/geology_stonemine_temperate_quarry";
32 const oStoneSmall = "gaia/geology_stone_temperate";
33 const oMetalLarge = "gaia/geology_metal_temperate_slabs";
35 // decorative props
36 const aGrass = "actor|props/flora/grass_soft_large_tall.xml";
37 const aGrassShort = "actor|props/flora/grass_soft_large.xml";
38 const aReeds = "actor|props/flora/reeds_pond_lush_a.xml";
39 const aLillies = "actor|props/flora/pond_lillies_large.xml";
40 const aRockLarge = "actor|geology/stone_granite_large.xml";
41 const aRockMedium = "actor|geology/stone_granite_med.xml";
42 const aBushMedium = "actor|props/flora/bush_medit_me.xml";
43 const aBushSmall = "actor|props/flora/bush_medit_sm.xml";
45 // terrain + entity (for painting)
46 const pForestD = [tGrassDForest + TERRAIN_SEPARATOR + oOak, tGrassDForest + TERRAIN_SEPARATOR + oOakLarge, tGrassDForest];
47 const pForestP = [tGrassPForest + TERRAIN_SEPARATOR + oPine, tGrassPForest + TERRAIN_SEPARATOR + oAleppoPine, tGrassPForest];
49 log("Initializing map...");
50 InitMap();
52 var numPlayers = getNumPlayers();
53 var mapSize = getMapSize();
54 var mapArea = mapSize*mapSize;
56 var clPlayer = createTileClass();
57 var clHill = createTileClass();
58 var clForest = createTileClass();
59 var clWater = createTileClass();
60 var clDirt = createTileClass();
61 var clRock = createTileClass();
62 var clMetal = createTileClass();
63 var clFood = createTileClass();
64 var clBaseResource = createTileClass();
65 var clSettlement = createTileClass();
67 // randomize player order
68 var playerIDs = [];
69 for (var i = 0; i < numPlayers; i++)
70         playerIDs.push(i+1);
71 playerIDs = sortPlayers(playerIDs);
73 // place players
74 var playerX = new Array(numPlayers);
75 var playerZ = new Array(numPlayers);
76 var playerAngle = new Array(numPlayers);
78 var startAngle = randFloat(0, TWO_PI);
79 for (var i = 0; i < numPlayers; i++)
81         playerAngle[i] = startAngle + i*TWO_PI/numPlayers;
82         playerX[i] = 0.5 + 0.35*cos(playerAngle[i]);
83         playerZ[i] = 0.5 + 0.35*sin(playerAngle[i]);
86 for (var i = 0; i < numPlayers; i++)
88         var id = playerIDs[i];
89         log("Creating base for player " + id + "...");
91         // some constants
92         var radius = scaleByMapSize(15,25);
93         var cliffRadius = 2;
94         var elevation = 20;
96         // get the x and z in tiles
97         var fx = fractionToTiles(playerX[i]);
98         var fz = fractionToTiles(playerZ[i]);
99         var ix = round(fx);
100         var iz = round(fz);
102         // calculate size based on the radius
103         var hillSize = PI * radius * radius;
105         // create the hill
106         var placer = new ClumpPlacer(hillSize, 0.95, 0.6, 10, ix, iz);
107         var terrainPainter = new LayeredPainter(
108                 [tCliff, tHill],                // terrains
109                 [cliffRadius]           // widths
110         );
111         var elevationPainter = new SmoothElevationPainter(
112                 ELEVATION_SET,                  // type
113                 elevation,                              // elevation
114                 cliffRadius                             // blend radius
115         );
116         createArea(placer, [terrainPainter, elevationPainter, paintClass(clPlayer)], null);
118         // create the ramp
119         var rampAngle = playerAngle[i] + PI + randFloat(-PI/8, PI/8);
120         var rampDist = radius;
121         var rampLength = 15;
122         var rampWidth = 12;
123         var rampX1 = round(fx + (rampDist + rampLength) * cos(rampAngle));
124         var rampZ1 = round(fz + (rampDist + rampLength) * sin(rampAngle));
125         var rampX2 = round(fx + (rampDist - 3) * cos(rampAngle));
126         var rampZ2 = round(fz + (rampDist - 3) * sin(rampAngle));
128         createRamp (rampX1, rampZ1, rampX2, rampZ2, 3, 20, rampWidth, 2, tHill, tCliff, clPlayer);
130         // create the city patch
131         var cityRadius = radius/3;
132         placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz);
133         var painter = new LayeredPainter([tRoadWild, tRoad], [1]);
134         createArea(placer, painter, null);
136         // create starting units
137         placeCivDefaultEntities(fx, fz, id, { 'iberWall': false });
139         placeDefaultChicken(fx, fz, clBaseResource);
141         // create berry bushes
142         var bbAngle = randFloat(0, TWO_PI);
143         var bbDist = 12;
144         var bbX = round(fx + bbDist * cos(bbAngle));
145         var bbZ = round(fz + bbDist * sin(bbAngle));
146         var group = new SimpleGroup(
147                 [new SimpleObject(oBerryBush, 5,5, 0,3)],
148                 true, clBaseResource, bbX, bbZ
149         );
150         createObjectGroup(group, 0);
152         // create metal mine
153         var mAngle = bbAngle;
154         while(abs(mAngle - bbAngle) < PI/3)
155                 mAngle = randFloat(0, TWO_PI);
157         var mDist = 12;
158         var mX = round(fx + mDist * cos(mAngle));
159         var mZ = round(fz + mDist * sin(mAngle));
160         group = new SimpleGroup(
161                 [new SimpleObject(oMetalLarge, 1,1, 0,0)],
162                 true, clBaseResource, mX, mZ
163         );
164         createObjectGroup(group, 0);
166         // create stone mines
167         mAngle += randFloat(PI/8, PI/4);
168         mX = round(fx + mDist * cos(mAngle));
169         mZ = round(fz + mDist * sin(mAngle));
170         group = new SimpleGroup(
171                 [new SimpleObject(oStoneLarge, 1,1, 0,2)],
172                 true, clBaseResource, mX, mZ
173         );
174         createObjectGroup(group, 0);
176         // create starting trees
177         var num = 2;
178         var tAngle = randFloat(-PI/3, 4*PI/3);
179         var tDist = randFloat(11, 13);
180         var tX = round(fx + tDist * cos(tAngle));
181         var tZ = round(fz + tDist * sin(tAngle));
182         group = new SimpleGroup(
183                 [new SimpleObject(oOak, num, num, 0,5)],
184                 false, clBaseResource, tX, tZ
185         );
186         createObjectGroup(group, 0, avoidClasses(clBaseResource,2));
188         // create grass tufts
189         var num = hillSize / 250;
190         for (var j = 0; j < num; j++)
191         {
192                 var gAngle = randFloat(0, TWO_PI);
193                 var gDist = radius - (5 + randInt(7));
194                 var gX = round(fx + gDist * cos(gAngle));
195                 var gZ = round(fz + gDist * sin(gAngle));
196                 group = new SimpleGroup(
197                         [new SimpleObject(aGrassShort, 2,5, 0,1, -PI/8,PI/8)],
198                         false, clBaseResource, gX, gZ
199                 );
200                 createObjectGroup(group, 0);
201         }
203 RMS.SetProgress(10);
205 log("Creating lakes...");
206 var numLakes = round(scaleByMapSize(1,4) * numPlayers);
207 placer = new ClumpPlacer(scaleByMapSize(100,250), 0.8, 0.1, 10);
208 terrainPainter = new LayeredPainter(
209         [tShoreBlend, tShore, tWater],          // terrains
210         [1,1]                                                   // widths
212 elevationPainter = new SmoothElevationPainter(ELEVATION_SET, -7, 6);
213 var waterAreas = createAreas(
214         placer,
215         [terrainPainter, elevationPainter, paintClass(clWater)],
216         avoidClasses(clPlayer, 2, clWater, 20),
217         numLakes
219 RMS.SetProgress(15);
221 log("Creating reeds...");
222 group = new SimpleGroup(
223         [new SimpleObject(aReeds, 5,10, 0,4), new SimpleObject(aLillies, 0,1, 0,4)], true
225 createObjectGroupsByAreas(group, 0,
226         [borderClasses(clWater, 3, 0), stayClasses(clWater, 1)],
227         numLakes, 100,
228         waterAreas
230 RMS.SetProgress(20);
232 log("Creating fish...");
233 createObjectGroupsByAreas(
234         new SimpleGroup(
235                 [new SimpleObject(oFish, 1,1, 0,1)],
236                 true, clFood
237         ),
238         0,
239         [stayClasses(clWater, 4),  avoidClasses(clFood, 8)],
240         numLakes / 4,
241         50,
242         waterAreas
244 RMS.SetProgress(25);
246 createBumps(avoidClasses(clWater, 2, clPlayer, 0));
247 RMS.SetProgress(30);
249 log("Creating hills...");
250 createHills([tCliff, tCliff, tHill], avoidClasses(clPlayer, 2, clWater, 5, clHill, 15), clHill, scaleByMapSize(1, 4) * numPlayers);
251 RMS.SetProgress(35);
253 createForests(
254  [tGrass, tGrassDForest, tGrassPForest, pForestP, pForestD],
255  avoidClasses(clPlayer, 1, clWater, 3, clForest, 17, clHill, 1),
256  clForest
258 RMS.SetProgress(40);
260 log("Creating dirt patches...");
261 createLayeredPatches(
262  [scaleByMapSize(3, 6), scaleByMapSize(5, 10), scaleByMapSize(8, 21)],
263  [[tGrass,tGrassA],[tGrassA,tGrassB], [tGrassB,tGrassC]],
264  [1,1],
265  avoidClasses(clWater, 1, clForest, 0, clHill, 0, clDirt, 5, clPlayer, 0)
267 RMS.SetProgress(45);
269 log("Creating grass patches...");
270 createLayeredPatches(
271  [scaleByMapSize(2, 4), scaleByMapSize(3, 7), scaleByMapSize(5, 15)],
272  [tGrassPatchBlend, tGrassPatch],
273  [1],
274  avoidClasses(clWater, 1, clForest, 0, clHill, 0, clDirt, 5, clPlayer, 0)
276 RMS.SetProgress(50);
278 log("Creating stone mines...");
279 createMines(
281   [new SimpleObject(oStoneSmall, 0,2, 0,4), new SimpleObject(oStoneLarge, 1,1, 0,4)],
282   [new SimpleObject(oStoneSmall, 2,5, 1,3)]
283  ],
284  avoidClasses(clWater, 0, clForest, 1, clPlayer, 5, clRock, 10, clHill, 1)
286 RMS.SetProgress(55);
288 log("Creating metal mines...");
289 createMines(
291   [new SimpleObject(oMetalLarge, 1,1, 0,4)]
292  ],
293  avoidClasses(clWater, 0, clForest, 1, clPlayer, 5, clMetal, 10, clRock, 5, clHill, 1),
294  clMetal
296 RMS.SetProgress(60);
298 createDecoration
300  [[new SimpleObject(aRockMedium, 1,3, 0,1)],
301   [new SimpleObject(aRockLarge, 1,2, 0,1), new SimpleObject(aRockMedium, 1,3, 0,2)],
302   [new SimpleObject(aGrassShort, 1,2, 0,1, -PI/8,PI/8)],
303   [new SimpleObject(aGrass, 2,4, 0,1.8, -PI/8,PI/8), new SimpleObject(aGrassShort, 3,6, 1.2,2.5, -PI/8,PI/8)],
304   [new SimpleObject(aBushMedium, 1,2, 0,2), new SimpleObject(aBushSmall, 2,4, 0,2)]
305  ],
307   scaleByMapSize(16, 262),
308   scaleByMapSize(8, 131),
309   scaleByMapSize(13, 200),
310   scaleByMapSize(13, 200),
311   scaleByMapSize(13, 200)
312  ],
313  avoidClasses(clWater, 0, clForest, 0, clPlayer, 0, clHill, 0)
315 RMS.SetProgress(70);
317 createFood
320   [new SimpleObject(oSheep, 2,3, 0,2)],
321   [new SimpleObject(oDeer, 5,7, 0,4)]
322  ],
324   3 * numPlayers,
325   3 * numPlayers
326  ],
327  avoidClasses(clWater, 0, clForest, 0, clPlayer, 1, clHill, 1, clFood, 20)
329 RMS.SetProgress(80);
331 createFood
334   [new SimpleObject(oBerryBush, 5,7, 0,4)]
335  ],
337   randInt(1, 4) * numPlayers + 2
338  ],
339  avoidClasses(clWater, 3, clForest, 0, clPlayer, 20, clHill, 1, clFood, 10)
341 RMS.SetProgress(85);
343 log("Creating metal mines...");
344 var types = [oOak, oOakLarge, oPine, oApple];   // some variation
345 createStragglerTrees(types, avoidClasses(clWater, 1, clForest, 1, clHill, 1, clPlayer, 1, clMetal, 1, clRock, 1));
346 RMS.SetProgress(90);
348 setSkySet("cirrus");
349 setWaterColor(0.447, 0.412, 0.322);                     // muddy brown
350 setWaterTint(0.447, 0.412, 0.322);                              // muddy brown
351 setWaterMurkiness(1.0);
352 setWaterWaviness(3.0);
353 setWaterType("lake");
355 setFogThickness(0.25);
356 setFogFactor(0.4);
358 setPPEffect("hdr");
359 setPPSaturation(0.62);
360 setPPContrast(0.62);
361 setPPBloom(0.3);
363 ExportMap();