Unify Caledonian Meadows and Wild Lake player location duplication from rP19704 ...
[0ad.git] / binaries / data / mods / public / maps / random / sahel.js
blobb89f3b7381df221d47fb44bd442c442f24a0721a
1 RMS.LoadLibrary("rmgen");
3 const tGrass2 = "savanna_grass_b";
4 const tGrass3 = "savanna_shrubs_a";
5 const tDirt1 = "savanna_dirt_rocks_a";
6 const tDirt2 = "savanna_dirt_rocks_b";
7 const tDirt3 = "savanna_dirt_rocks_c";
8 const tDirt4 = "savanna_dirt_b";
9 const tCityTiles = "savanna_tile_a";
10 const tShore = "savanna_riparian_bank";
11 const tWater = "savanna_riparian_wet";
13 const oBaobab = "gaia/flora_tree_baobab";
14 const oBerryBush = "gaia/flora_bush_berry";
15 const oGazelle = "gaia/fauna_gazelle";
16 const oGiraffe = "gaia/fauna_giraffe";
17 const oGiraffeInfant = "gaia/fauna_giraffe_infant";
18 const oElephant = "gaia/fauna_elephant_african_bush";
19 const oElephantInfant = "gaia/fauna_elephant_african_infant";
20 const oLion = "gaia/fauna_lion";
21 const oLioness = "gaia/fauna_lioness";
22 const oZebra = "gaia/fauna_zebra";
23 const oStoneSmall = "gaia/geology_stone_savanna_small";
24 const oMetalLarge = "gaia/geology_metal_savanna_slabs";
26 const aBush = "actor|props/flora/bush_medit_sm_dry.xml";
27 const aRock = "actor|geology/stone_savanna_med.xml";
29 InitMap();
31 var numPlayers = getNumPlayers();
32 var mapSize = getMapSize();
34 var clPlayer = createTileClass();
35 var clForest = createTileClass();
36 var clWater = createTileClass();
37 var clRock = createTileClass();
38 var clMetal = createTileClass();
39 var clFood = createTileClass();
40 var clBaseResource = createTileClass();
42 var [playerIDs, playerX, playerZ] = radialPlayerPlacement();
44 for (var i = 0; i < numPlayers; i++)
46         var id = playerIDs[i];
47         log("Creating base for player " + id + "...");
49         var radius = scaleByMapSize(15,25);
50         var cliffRadius = 2;
51         var elevation = 20;
53         // get the x and z in tiles
54         var fx = fractionToTiles(playerX[i]);
55         var fz = fractionToTiles(playerZ[i]);
56         var ix = round(fx);
57         var iz = round(fz);
58         addCivicCenterAreaToClass(ix, iz, clPlayer);
60         placeCivDefaultEntities(fx, fz, id);
62         placeDefaultChicken(fx, fz, clBaseResource);
64         // create berry bushes
65         var bbAngle = randFloat(0, TWO_PI);
66         var bbDist = 12;
67         var bbX = round(fx + bbDist * cos(bbAngle));
68         var bbZ = round(fz + bbDist * sin(bbAngle));
69         var group = new SimpleGroup(
70                 [new SimpleObject(oBerryBush, 5,5, 0,3)],
71                 true, clBaseResource, bbX, bbZ
72         );
73         createObjectGroup(group, 0);
75         // create metal mine
76         var mAngle = bbAngle;
77         while(abs(mAngle - bbAngle) < PI/3)
78         {
79                 mAngle = randFloat(0, TWO_PI);
80         }
81         var mDist = 13;
82         var mX = round(fx + mDist * cos(mAngle));
83         var mZ = round(fz + mDist * sin(mAngle));
84         group = new SimpleGroup(
85                 [new SimpleObject(oMetalLarge, 1,1, 0,0)],
86                 true, clBaseResource, mX, mZ
87         );
88         createObjectGroup(group, 0);
90         // create stone mines
91         mAngle += randFloat(PI/8, PI/4);
92         mX = round(fx + mDist * cos(mAngle));
93         mZ = round(fz + mDist * sin(mAngle));
94         createStoneMineFormation(mX, mZ, oStoneSmall, tDirt4);
95         addToClass(mX, mZ, clPlayer);
96         // create the city patch
97         var cityRadius = radius/3;
98         var placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz);
99         var painter = new TerrainPainter(tCityTiles);
100         createArea(placer, painter, null);
102         var hillSize = PI * radius * radius;
103         // create starting trees
104         var num = floor(hillSize / 300);
105         var tAngle = randFloat(-PI/3, 4*PI/3);
106         var tDist = randFloat(11, 13);
107         var tX = round(fx + tDist * cos(tAngle));
108         var tZ = round(fz + tDist * sin(tAngle));
109         group = new SimpleGroup(
110                 [new SimpleObject(oBaobab, num, num, 2,7)],
111                 false, clBaseResource, tX, tZ
112         );
113         createObjectGroup(group, 0, avoidClasses(clBaseResource,2));
117 RMS.SetProgress(20);
119 log("Creating big patches...");
120 var patches = [tGrass2, tGrass3];
121 for (var i = 0; i < patches.length; i++)
122         createAreas(
123                 new ChainPlacer(Math.floor(scaleByMapSize(3, 6)), Math.floor(scaleByMapSize(10, 20)), Math.floor(scaleByMapSize(15, 60)), 1),
124                 new TerrainPainter(patches[i]),
125                 avoidClasses(clPlayer, 10),
126                 scaleByMapSize(5, 20));
128 log("Creating small patches...");
129 for (let size of [scaleByMapSize(3, 6), scaleByMapSize(5, 10), scaleByMapSize(8, 21)])
130         for (let patch of [tDirt1, tDirt2, tDirt3])
131                 createAreas(
132                         new ChainPlacer(1, Math.floor(scaleByMapSize(3, 5)), size, 1),
133                         new TerrainPainter(patch),
134                         avoidClasses(clPlayer, 12),
135                         scaleByMapSize(4, 15));
137 log("Creating water holes...");
138 createAreas(
139         new ChainPlacer(1, Math.floor(scaleByMapSize(3, 5)), Math.floor(scaleByMapSize(20, 60)), 1),
140         [
141                 new LayeredPainter([tShore, tWater], [1]),
142                 new SmoothElevationPainter(ELEVATION_SET, -5, 7),
143                 paintClass(clWater)
144         ],
145         avoidClasses(clPlayer, 24),
146         scaleByMapSize(1, 3));
147 RMS.SetProgress(55);
149 var playerConstraint = new AvoidTileClassConstraint(clPlayer, 30);
150 var minesConstraint = new AvoidTileClassConstraint(clRock, 25);
151 var waterConstraint = new AvoidTileClassConstraint(clWater, 10);
153 log("Creating stone mines...");
154 for (var i = 0; i < scaleByMapSize(12,30); ++i)
156         var mX = randIntExclusive(0, mapSize);
157         var mZ = randIntExclusive(0, mapSize);
158         if (playerConstraint.allows(mX, mZ) && minesConstraint.allows(mX, mZ) && waterConstraint.allows(mX, mZ))
159         {
160                 createStoneMineFormation(mX, mZ, oStoneSmall, tDirt4);
161                 addToClass(mX, mZ, clRock);
162         }
165 log("Creating metal mines...");
166 var group = new SimpleGroup([new SimpleObject(oMetalLarge, 1, 1, 0, 4)], true, clMetal);
167 createObjectGroupsDeprecated(group, 0,
168         avoidClasses(clPlayer, 20, clMetal, 10, clRock, 8, clWater, 4),
169         scaleByMapSize(2,8), 100
172 RMS.SetProgress(65);
174 log("Creating small decorative rocks...");
175 group = new SimpleGroup(
176         [new SimpleObject(aRock, 1,3, 0,3)],
177         true
179 createObjectGroupsDeprecated(
180         group, 0,
181         avoidClasses(clPlayer, 7, clWater, 1),
182         scaleByMapSize(200, 1200), 1
185 RMS.SetProgress(70);
187 log("Creating gazelle...");
188 group = new SimpleGroup(
189         [new SimpleObject(oGazelle, 5,7, 0,4)],
190         true, clFood
192 createObjectGroupsDeprecated(group, 0,
193         avoidClasses(clWater, 1, clPlayer, 20, clFood, 11),
194         scaleByMapSize(4,12), 50
197 log("Creating zebra...");
198 group = new SimpleGroup(
199         [new SimpleObject(oZebra, 5,7, 0,4)],
200         true, clFood
202 createObjectGroupsDeprecated(group, 0,
203         avoidClasses(clWater, 1, clPlayer, 20, clFood, 11),
204         scaleByMapSize(4,12), 50
207 log("Creating giraffe...");
208 group = new SimpleGroup(
209         [new SimpleObject(oGiraffe, 2,4, 0,4), new SimpleObject(oGiraffeInfant, 0,2, 0,4)],
210         true, clFood
212 createObjectGroupsDeprecated(group, 0,
213         avoidClasses(clWater, 1, clPlayer, 20, clFood, 11),
214         scaleByMapSize(4,12), 50
217 log("Creating elephants...");
218 group = new SimpleGroup(
219         [new SimpleObject(oElephant, 2,4, 0,4), new SimpleObject(oElephantInfant, 0,2, 0,4)],
220         true, clFood
222 createObjectGroupsDeprecated(group, 0,
223         avoidClasses(clWater, 1, clPlayer, 20, clFood, 11),
224         scaleByMapSize(4,12), 50
227 log("Creating lions...");
228 group = new SimpleGroup(
229         [new SimpleObject(oLion, 0,1, 0,4), new SimpleObject(oLioness, 2,3, 0,4)],
230         true, clFood
232 createObjectGroupsDeprecated(group, 0,
233         avoidClasses(clWater, 1, clPlayer, 20, clFood, 11),
234         scaleByMapSize(4,12), 50
237 log("Creating berry bush...");
238 group = new SimpleGroup(
239         [new SimpleObject(oBerryBush, 5,7, 0,4)],
240         true, clFood
242 createObjectGroupsDeprecated(group, 0,
243         avoidClasses(clWater, 3, clPlayer, 20, clFood, 12, clRock, 7, clMetal, 6),
244         randIntInclusive(1, 4) * numPlayers + 2, 50
247 RMS.SetProgress(85);
249 createStragglerTrees(
250         [oBaobab],
251         avoidClasses(clForest, 1, clPlayer, 20, clMetal, 6, clRock, 7, clWater, 1),
252         clForest,
253         scaleByMapSize(70, 500));
255 log("Creating large grass tufts...");
256 group = new SimpleGroup(
257         [new SimpleObject(aBush, 2,4, 0,1.8, -PI/8,PI/8)]
259 createObjectGroupsDeprecated(group, 0,
260         avoidClasses(clWater, 3, clPlayer, 2, clForest, 0),
261         scaleByMapSize(100, 1200)
264 setSunColor(0.87451, 0.847059, 0.647059);
265 setWaterColor(0.741176, 0.592157, 0.27451);
266 setWaterTint(0.741176, 0.592157, 0.27451);
267 setWaterWaviness(2.0);
268 setWaterType("clap");
269 setWaterMurkiness(0.835938);
271 setUnitsAmbientColor(0.57, 0.58, 0.55);
272 setTerrainAmbientColor(0.447059, 0.509804, 0.54902);
274 setFogFactor(0.25);
275 setFogThickness(0.15);
276 setFogColor(0.847059, 0.737255, 0.482353);
278 setPPEffect("hdr");
279 setPPContrast(0.57031);
280 setPPBloom(0.34);
282 ExportMap();