Fix rmgen2 bug in rP17903 revealed by the 1* removal in rP20281.
[0ad.git] / binaries / data / mods / public / maps / random / anatolian_plateau.js
blob796563559da046544aa580aa2b0e2b70c3f68441
1 RMS.LoadLibrary("rmgen");
3 const tGrass = ["steppe_grass_a", "steppe_grass_b", "steppe_grass_c", "steppe_grass_d"];
4 const tForestFloor = "steppe_grass_c";
5 const tGrassA = "steppe_grass_b";
6 const tGrassB = "steppe_grass_c";
7 const tGrassC = ["steppe_grass_b", "steppe_grass_c", "steppe_grass_d"];
8 const tGrassD = "steppe_grass_a";
9 const tDirt = ["steppe_dirt_a", "steppe_dirt_b"];
10 const tRoad = "road_stones";
11 const tRoadWild = "road_stones";
12 const tShoreBlend = "desert_shore_stones";
13 const tShore = "dirta";
14 const tWater = "desert_sand_wet";
16 const oPoplar = "gaia/flora_tree_poplar_lombardy";
17 const oBush = "gaia/flora_bush_temperate";
18 const oBerryBush = "gaia/flora_bush_berry";
19 const oRabbit = "gaia/fauna_rabbit";
20 const oSheep = "gaia/fauna_sheep";
21 const oStoneLarge = "gaia/geology_stonemine_medit_quarry";
22 const oStoneSmall = "gaia/geology_stone_mediterranean";
23 const oMetalLarge = "gaia/geology_metal_mediterranean_slabs";
25 const aGrass = "actor|props/flora/grass_soft_small_tall.xml";
26 const aGrassShort = "actor|props/flora/grass_soft_large.xml";
27 const aRockLarge = "actor|geology/stone_granite_med.xml";
28 const aRockMedium = "actor|geology/stone_granite_med.xml";
29 const aBushMedium = "actor|props/flora/bush_medit_me.xml";
30 const aBushSmall = "actor|props/flora/bush_medit_sm.xml";
32 const pForest = [tForestFloor + TERRAIN_SEPARATOR + oPoplar, tForestFloor];
34 InitMap();
36 var numPlayers = getNumPlayers();
37 var mapSize = getMapSize();
38 var mapArea = mapSize*mapSize;
40 var clPlayer = createTileClass();
41 var clHill = createTileClass();
42 var clForest = createTileClass();
43 var clDirt = createTileClass();
44 var clRock = createTileClass();
45 var clMetal = createTileClass();
46 var clFood = createTileClass();
47 var clBaseResource = createTileClass();
48 var clSettlement = createTileClass();
50 var [playerIDs, playerX, playerZ] = radialPlayerPlacement();
52 for (var i = 0; i < numPlayers; i++)
54         var id = playerIDs[i];
55         log("Creating base for player " + id + "...");
57         var radius = scaleByMapSize(15,25);
58         var cliffRadius = 2;
59         var elevation = 20;
61         // get the x and z in tiles
62         var fx = fractionToTiles(playerX[i]);
63         var fz = fractionToTiles(playerZ[i]);
64         var ix = round(fx);
65         var iz = round(fz);
66         addCivicCenterAreaToClass(ix, iz, clPlayer);
68         // create the city patch
69         var cityRadius = radius/3;
70         var placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz);
71         var painter = new LayeredPainter([tRoadWild, tRoad], [1]);
72         createArea(placer, painter, null);
74         placeCivDefaultEntities(fx, fz, id);
76         placeDefaultChicken(fx, fz, clBaseResource);
78         // create berry bushes
79         var bbAngle = randFloat(0, TWO_PI);
80         var bbDist = 12;
81         var bbX = round(fx + bbDist * cos(bbAngle));
82         var bbZ = round(fz + bbDist * sin(bbAngle));
83         var group = new SimpleGroup(
84                 [new SimpleObject(oBerryBush, 5,5, 0,3)],
85                 true, clBaseResource, bbX, bbZ
86         );
87         createObjectGroup(group, 0);
89         // create metal mine
90         var mAngle = bbAngle;
91         while(abs(mAngle - bbAngle) < PI/3)
92         {
93                 mAngle = randFloat(0, TWO_PI);
94         }
95         var mDist = 12;
96         var mX = round(fx + mDist * cos(mAngle));
97         var mZ = round(fz + mDist * sin(mAngle));
98         group = new SimpleGroup(
99                 [new SimpleObject(oMetalLarge, 1,1, 0,0)],
100                 true, clBaseResource, mX, mZ
101         );
102         createObjectGroup(group, 0);
104         // create stone mines
105         mAngle += randFloat(PI/8, PI/4);
106         mX = round(fx + mDist * cos(mAngle));
107         mZ = round(fz + mDist * sin(mAngle));
108         group = new SimpleGroup(
109                 [new SimpleObject(oStoneLarge, 1,1, 0,2)],
110                 true, clBaseResource, mX, mZ
111         );
112         createObjectGroup(group, 0);
113         var hillSize = PI * radius * radius;
114         // create starting trees
115         var num = floor(hillSize / 100);
116         var tAngle = randFloat(-PI/3, 4*PI/3);
117         var tDist = randFloat(11, 13);
118         var tX = round(fx + tDist * cos(tAngle));
119         var tZ = round(fz + tDist * sin(tAngle));
120         group = new SimpleGroup(
121                 [new SimpleObject(oPoplar, num, num, 0,5)],
122                 false, clBaseResource, tX, tZ
123         );
124         createObjectGroup(group, 0, avoidClasses(clBaseResource,2));
126         placeDefaultDecoratives(fx, fz, aGrassShort, clBaseResource, radius);
129 RMS.SetProgress(20);
131 log("Creating bumps...");
132 placer = new ChainPlacer(1, floor(scaleByMapSize(4, 6)), floor(scaleByMapSize(2, 5)), 0.5);
133 painter = new SmoothElevationPainter(ELEVATION_MODIFY, 2, 2);
134 createAreas(
135         placer,
136         painter,
137         avoidClasses(clPlayer, 13),
138         scaleByMapSize(300, 800)
141 // calculate desired number of trees for map (based on size)
143 var MIN_TREES = 220;
144 var MAX_TREES = 1000;
145 var P_FOREST = 0.65;
147 var totalTrees = scaleByMapSize(MIN_TREES, MAX_TREES);
148 var numForest = totalTrees * P_FOREST;
149 var numStragglers = totalTrees * (1.0 - P_FOREST);
151 log("Creating forests...");
152 var types = [[[tForestFloor, tGrass, pForest], [tForestFloor, pForest]]];       // some variation
154 var size = numForest / (scaleByMapSize(2,8) * numPlayers);
156 var num = 4 * floor(size / types.length);
157 for (var i = 0; i < types.length; ++i)
159         placer = new ChainPlacer(1, floor(scaleByMapSize(2, 3)), 4, 1);
160         painter = new LayeredPainter(
161                 types[i],               // terrains
162                 [2]                                                                                     // widths
163                 );
164         createAreas(
165                 placer,
166                 [painter, paintClass(clForest)],
167                 avoidClasses(clPlayer, 13, clForest, 20, clHill, 1),
168                 num
169         );
172 RMS.SetProgress(50);
174 log("Creating grass patches...");
175 createLayeredPatches(
176  [scaleByMapSize(5, 48), scaleByMapSize(6, 84), scaleByMapSize(8, 128)],
177  [[tGrass,tGrassA,tGrassC],[tGrass,tGrassA,tGrassC], [tGrass,tGrassA,tGrassC]],
178  [1,1],
179  avoidClasses(clForest, 0, clHill, 0, clDirt, 2, clPlayer, 10),
180  scaleByMapSize(50, 70),
181  clDirt
184 log("Creating dirt patches...");
185 createLayeredPatches(
186  [scaleByMapSize(5, 32), scaleByMapSize(6, 48), scaleByMapSize(7, 80)],
187  [tGrassD ,tDirt],
188  [1],
189  avoidClasses(clForest, 0, clHill, 0, clDirt, 2, clPlayer, 10),
190  scaleByMapSize(50, 90),
191  clDirt
194 RMS.SetProgress(55);
196 log("Creating big patches...");
197 createLayeredPatches(
198  [scaleByMapSize(10, 60), scaleByMapSize(15, 90), scaleByMapSize(20, 120)],
199  [tGrassB ,tGrassA],
200  [1],
201  avoidClasses(clHill, 0, clPlayer, 8),
202  scaleByMapSize(30, 90),
203  clDirt
206 RMS.SetProgress(55);
208 log("Creating stone mines...");
209 group = new SimpleGroup([new SimpleObject(oStoneSmall, 0,2, 0,4), new SimpleObject(oStoneLarge, 1,1, 0,4)], true, clRock);
210 createObjectGroupsDeprecated(group, 0,
211         avoidClasses(clForest, 1, clPlayer, 20, clRock, 10, clHill, 1),
212         scaleByMapSize(1,4), 100
215 log("Creating small stone quarries...");
216 group = new SimpleGroup([new SimpleObject(oStoneSmall, 2,5, 1,3)], true, clRock);
217 createObjectGroupsDeprecated(group, 0,
218         avoidClasses(clForest, 1, clPlayer, 20, clRock, 10, clHill, 1),
219         scaleByMapSize(1,4), 100
222 log("Creating metal mines...");
223 group = new SimpleGroup([new SimpleObject(oMetalLarge, 1,1, 0,4)], true, clMetal);
224 createObjectGroupsDeprecated(group, 0,
225         avoidClasses(clForest, 1, clPlayer, 20, clMetal, 10, clRock, 5, clHill, 1),
226         scaleByMapSize(2,8), 100
229 RMS.SetProgress(65);
231 log("Creating small decorative rocks...");
232 group = new SimpleGroup(
233         [new SimpleObject(aRockMedium, 1,3, 0,1)],
234         true
236 createObjectGroupsDeprecated(
237         group, 0,
238         avoidClasses(clForest, 0, clPlayer, 10, clHill, 0),
239         scaleByMapSize(16, 262), 50
242 log("Creating large decorative rocks...");
243 group = new SimpleGroup(
244         [new SimpleObject(aRockLarge, 1,2, 0,1), new SimpleObject(aRockMedium, 1,3, 0,2)],
245         true
247 createObjectGroupsDeprecated(
248         group, 0,
249         avoidClasses(clForest, 0, clPlayer, 10, clHill, 0),
250         scaleByMapSize(8, 131), 50
253 RMS.SetProgress(70);
255 log("Creating rabbits...");
256 group = new SimpleGroup(
257         [new SimpleObject(oRabbit, 5,7, 0,4)],
258         true, clFood
260 createObjectGroupsDeprecated(group, 0,
261         avoidClasses(clForest, 0, clPlayer, 10, clHill, 1, clFood, 20),
262         6 * numPlayers, 50
265 log("Creating berry bush...");
266 group = new SimpleGroup(
267         [new SimpleObject(oBerryBush, 5,7, 0,4)],
268         true, clFood
270 createObjectGroupsDeprecated(group, 0,
271         avoidClasses(clForest, 0, clPlayer, 20, clHill, 1, clFood, 20),
272         randIntInclusive(1, 4) * numPlayers + 2, 50
275 RMS.SetProgress(75);
277 log("Creating sheep...");
278 group = new SimpleGroup(
279         [new SimpleObject(oSheep, 2,3, 0,2)],
280         true, clFood
282 createObjectGroupsDeprecated(group, 0,
283         avoidClasses(clForest, 0, clPlayer, 10, clHill, 1, clFood, 20),
284         3 * numPlayers, 50
287 RMS.SetProgress(85);
289 log("Creating straggler trees...");
290 var types = [oBush, oPoplar];   // some variation
291 var num = floor(numStragglers / types.length);
292 for (var i = 0; i < types.length; ++i)
294         group = new SimpleGroup(
295                 [new SimpleObject(types[i], 1,1, 0,3)],
296                 true, clForest
297         );
298         createObjectGroupsDeprecated(group, 0,
299                 avoidClasses(clForest, 1, clHill, 1, clPlayer, 13, clMetal, 6, clRock, 6),
300                 num
301         );
304 log("Creating large grass tufts...");
305 group = new SimpleGroup(
306         [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)]
308 createObjectGroupsDeprecated(group, 0,
309         avoidClasses(clHill, 2, clPlayer, 2, clDirt, 1, clForest, 0),
310         scaleByMapSize(13, 200)
313 RMS.SetProgress(95);
315 log("Creating bushes...");
316 group = new SimpleGroup(
317         [new SimpleObject(aBushMedium, 1,2, 0,2), new SimpleObject(aBushSmall, 2,4, 0,2)]
319 createObjectGroupsDeprecated(group, 0,
320         avoidClasses(clHill, 1, clPlayer, 1, clDirt, 1),
321         scaleByMapSize(13, 200), 50
324 setFogThickness(0.1);
325 setFogFactor(0.2);
327 setPPEffect("hdr");
328 setPPSaturation(0.45);
329 setPPContrast(0.62);
330 setPPBloom(0.2);
332 ExportMap();