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";
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);
53 // get the x and z in tiles
54 var fx = fractionToTiles(playerX[i]);
55 var fz = fractionToTiles(playerZ[i]);
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);
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
73 createObjectGroup(group, 0);
77 while(abs(mAngle - bbAngle) < PI/3)
79 mAngle = randFloat(0, TWO_PI);
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
88 createObjectGroup(group, 0);
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
113 createObjectGroup(group, 0, avoidClasses(clBaseResource,2));
119 log("Creating big patches...");
120 var patches = [tGrass2, tGrass3];
121 for (var i = 0; i < patches.length; i++)
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])
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...");
139 new ChainPlacer(1, Math.floor(scaleByMapSize(3, 5)), Math.floor(scaleByMapSize(20, 60)), 1),
141 new LayeredPainter([tShore, tWater], [1]),
142 new SmoothElevationPainter(ELEVATION_SET, -5, 7),
145 avoidClasses(clPlayer, 24),
146 scaleByMapSize(1, 3));
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))
160 createStoneMineFormation(mX, mZ, oStoneSmall, tDirt4);
161 addToClass(mX, mZ, clRock);
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
174 log("Creating small decorative rocks...");
175 group = new SimpleGroup(
176 [new SimpleObject(aRock, 1,3, 0,3)],
179 createObjectGroupsDeprecated(
181 avoidClasses(clPlayer, 7, clWater, 1),
182 scaleByMapSize(200, 1200), 1
187 log("Creating gazelle...");
188 group = new SimpleGroup(
189 [new SimpleObject(oGazelle, 5,7, 0,4)],
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)],
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)],
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)],
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)],
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)],
242 createObjectGroupsDeprecated(group, 0,
243 avoidClasses(clWater, 3, clPlayer, 20, clFood, 12, clRock, 7, clMetal, 6),
244 randIntInclusive(1, 4) * numPlayers + 2, 50
249 createStragglerTrees(
251 avoidClasses(clForest, 1, clPlayer, 20, clMetal, 6, clRock, 7, clWater, 1),
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);
275 setFogThickness(0.15);
276 setFogColor(0.847059, 0.737255, 0.482353);
279 setPPContrast(0.57031);