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";
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";
29 const aBush = "actor|props/flora/bush_medit_sm_dry.xml";
30 const aRock = "actor|geology/stone_savanna_med.xml";
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);
43 for (var i = 0; i < 8; ++i)
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));
54 log("Initializing map...");
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
76 for (var i = 0; i < numPlayers; i++)
80 playerIDs = sortPlayers(playerIDs);
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 + "...");
103 var radius = scaleByMapSize(15,25);
107 // get the x and z in tiles
108 var fx = fractionToTiles(playerX[i]);
109 var fz = fractionToTiles(playerZ[i]);
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);
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
132 createObjectGroup(group, 0);
135 var mAngle = bbAngle;
136 while(abs(mAngle - bbAngle) < PI/3)
138 mAngle = randFloat(0, TWO_PI);
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
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
172 createObjectGroup(group, 0, avoidClasses(clBaseResource,2));
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]);
188 avoidClasses(clPlayer, 10),
189 scaleByMapSize(5, 20)
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)
201 placer = new ChainPlacer(1, floor(scaleByMapSize(3, 5)), sizes[i], 1);
202 painter = new TerrainPainter(patches[j]);
206 avoidClasses(clPlayer, 12),
207 scaleByMapSize(4, 15)
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
219 var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, -5, 7);
222 [terrainPainter, elevationPainter, paintClass(clWater)],
223 avoidClasses(clPlayer, 24),
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))
242 placeStoneMineFormation(mX, mZ);
243 addToClass(mX, mZ, clRock);
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
257 // create small decorative rocks
258 log("Creating small decorative rocks...");
259 group = new SimpleGroup(
260 [new SimpleObject(aRock, 1,3, 0,3)],
265 avoidClasses(clPlayer, 7, clWater, 1),
266 scaleByMapSize(200, 1200), 1
272 log("Creating gazelle...");
273 group = new SimpleGroup(
274 [new SimpleObject(oGazelle, 5,7, 0,4)],
277 createObjectGroups(group, 0,
278 avoidClasses(clWater, 1, clPlayer, 20, clFood, 11),
279 scaleByMapSize(4,12), 50
283 log("Creating zebra...");
284 group = new SimpleGroup(
285 [new SimpleObject(oZebra, 5,7, 0,4)],
288 createObjectGroups(group, 0,
289 avoidClasses(clWater, 1, clPlayer, 20, clFood, 11),
290 scaleByMapSize(4,12), 50
294 log("Creating giraffe...");
295 group = new SimpleGroup(
296 [new SimpleObject(oGiraffe, 2,4, 0,4), new SimpleObject(oGiraffeInfant, 0,2, 0,4)],
299 createObjectGroups(group, 0,
300 avoidClasses(clWater, 1, clPlayer, 20, clFood, 11),
301 scaleByMapSize(4,12), 50
305 log("Creating elephants...");
306 group = new SimpleGroup(
307 [new SimpleObject(oElephant, 2,4, 0,4), new SimpleObject(oElephantInfant, 0,2, 0,4)],
310 createObjectGroups(group, 0,
311 avoidClasses(clWater, 1, clPlayer, 20, clFood, 11),
312 scaleByMapSize(4,12), 50
316 log("Creating lions...");
317 group = new SimpleGroup(
318 [new SimpleObject(oLion, 0,1, 0,4), new SimpleObject(oLioness, 2,3, 0,4)],
321 createObjectGroups(group, 0,
322 avoidClasses(clWater, 1, clPlayer, 20, clFood, 11),
323 scaleByMapSize(4,12), 50
327 log("Creating berry bush...");
328 group = new SimpleGroup(
329 [new SimpleObject(oBerryBush, 5,7, 0,4)],
332 createObjectGroups(group, 0,
333 avoidClasses(clWater, 3, clPlayer, 20, clFood, 12, clRock, 7, clMetal, 2),
334 randInt(1, 4) * numPlayers + 2, 50
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)],
347 createObjectGroups(group, 0,
348 avoidClasses(clForest, 1, clPlayer, 20, clMetal, 1, clRock, 7, clWater, 1),
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);
374 setFogThickness(0.15);
375 setFogColor(0.847059, 0.737255, 0.482353);
378 setPPContrast(0.57031);