1 RMS.LoadLibrary("rmgen");
4 const tMainDirt = ["desert_dirt_rocks_1", "desert_dirt_cracks"];
5 const tForestFloor1 = "forestfloor_dirty";
6 const tForestFloor2 = "desert_forestfloor_palms";
7 const tGrassSands = "desert_grass_a_sand";
8 const tGrass = "desert_grass_a";
9 const tSecondaryDirt = "medit_dirt_dry";
10 const tCliff = ["desert_cliff_persia_1", "desert_cliff_persia_2"];
11 const tHill = ["desert_dirt_rocks_1", "desert_dirt_rocks_2", "desert_dirt_rocks_3"];
12 const tDirt = ["desert_dirt_rough", "desert_dirt_rough_2"];
13 const tRoad = "desert_shore_stones";;
14 const tRoadWild = "desert_grass_a_stones";;
17 const oTamarix = "gaia/flora_tree_tamarix";
18 const oPalm = "gaia/flora_tree_date_palm";
19 const oPine = "gaia/flora_tree_aleppo_pine";
20 const oBush = "gaia/flora_bush_grapes";
21 const oCamel = "gaia/fauna_camel";
22 const oGazelle = "gaia/fauna_gazelle";
23 const oLion = "gaia/fauna_lion";
24 const oLioness = "gaia/fauna_lioness";
25 const oStoneLarge = "gaia/geology_stonemine_desert_quarry";
26 const oStoneSmall = "gaia/geology_stone_desert_small";
27 const oMetalLarge = "gaia/geology_metal_desert_slabs";
30 const aFlower1 = "actor|props/flora/decals_flowers_daisies.xml";
31 const aWaterFlower = "actor|props/flora/water_lillies.xml";
32 const aReedsA = "actor|props/flora/reeds_pond_lush_a.xml";
33 const aReedsB = "actor|props/flora/reeds_pond_lush_b.xml";
34 const aRock = "actor|geology/stone_desert_med.xml";
35 const aBushA = "actor|props/flora/bush_desert_dry_a.xml";
36 const aBushB = "actor|props/flora/bush_desert_dry_a.xml";
37 const aBushes = [aBushA, aBushB];
38 const aSand = "actor|particle/blowing_sand.xml";
40 const pForestP = [tForestFloor2 + TERRAIN_SEPARATOR + oPalm, tForestFloor2];
41 const pForestT = [tForestFloor1 + TERRAIN_SEPARATOR + oTamarix,tForestFloor2];
43 log("Initializing map...");
47 const numPlayers = getNumPlayers();
48 const mapSize = getMapSize();
49 const mapArea = mapSize*mapSize;
51 // create tile classes
53 var clPlayer = createTileClass();
54 var clHill = createTileClass();
55 var clForest = createTileClass();
56 var clDirt = createTileClass();
57 var clRock = createTileClass();
58 var clMetal = createTileClass();
59 var clFood = createTileClass();
60 var clBaseResource = createTileClass();
61 var clSettlement = createTileClass();
62 var clGrass = createTileClass();
65 for (var i = 0; i < numPlayers; i++)
69 playerIDs = sortPlayers(playerIDs);
73 var playerX = new Array(numPlayers);
74 var playerZ = new Array(numPlayers);
75 var playerAngle = new Array(numPlayers);
77 var startAngle = randFloat(0, TWO_PI);
78 for (var i = 0; i < numPlayers; i++)
80 playerAngle[i] = startAngle + i*TWO_PI/numPlayers;
81 playerX[i] = 0.5 + 0.35*cos(playerAngle[i]);
82 playerZ[i] = 0.5 + 0.35*sin(playerAngle[i]);
85 for (var i = 0; i < numPlayers; i++)
87 var id = playerIDs[i];
88 log("Creating base for player " + id + "...");
90 // scale radius of player area by map size
91 var radius = scaleByMapSize(15,25);
93 // get the x and z in tiles
94 var fx = fractionToTiles(playerX[i]);
95 var fz = fractionToTiles(playerZ[i]);
99 // calculate size based on the radius
100 var size = PI * radius * radius;
102 // create the player area
103 var placer = new ClumpPlacer(size, 0.9, 0.5, 10, ix, iz);
104 createArea(placer, paintClass(clPlayer), null);
106 // create the grass patches
107 var grassRadius = floor(scaleByMapSize(16 ,30));
108 placer = new ChainPlacer(2, floor(scaleByMapSize(5, 12)), floor(scaleByMapSize(25, 60)), 1, ix, iz, 0, [grassRadius]);
109 var painter = new LayeredPainter([tGrassSands, tGrass], [3]);
110 createArea(placer, [painter, paintClass(clGrass)], null);
112 // create the city patch
114 placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz);
115 var painter = new LayeredPainter([tRoadWild, tRoad], [3]);
116 createArea(placer, painter, null);
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(oBush, 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), new RandomObject(aBushes, 2,4, 0,2)],
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 group = new SimpleGroup(
154 [new SimpleObject(oStoneLarge, 1,1, 0,2), new RandomObject(aBushes, 2,4, 0,2)],
155 true, clBaseResource, mX, mZ
157 createObjectGroup(group, 0);
159 // create starting trees
161 var tAngle = randFloat(-PI/3, 4*PI/3);
162 var tDist = randFloat(11, 13);
163 var tX = round(fx + tDist * cos(tAngle));
164 var tZ = round(fz + tDist * sin(tAngle));
165 group = new SimpleGroup(
166 [new SimpleObject([oPalm, oTamarix][randInt(0,1)], num, num, 0,5)],
167 false, clBaseResource, tX, tZ
169 createObjectGroup(group, 0, avoidClasses(clBaseResource,2));
175 log("Creating bumps...");
176 placer = new ClumpPlacer(scaleByMapSize(20, 50), 0.3, 0.06, 1);
177 painter = new SmoothElevationPainter(ELEVATION_MODIFY, 2, 2);
181 avoidClasses(clPlayer, 13),
182 scaleByMapSize(300, 800)
186 log("Creating hills...");
187 placer = new ChainPlacer(1, floor(scaleByMapSize(4, 6)), floor(scaleByMapSize(16, 40)), 0.5);
188 var terrainPainter = new LayeredPainter(
189 [tCliff, tHill], // terrains
192 var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 22, 2);
195 [terrainPainter, elevationPainter, paintClass(clHill)],
196 avoidClasses(clPlayer, 3, clGrass, 1, clHill, 10),
197 scaleByMapSize(1, 3) * numPlayers * 3
202 // calculate desired number of trees for map (based on size)
203 const MIN_TREES = 400;
204 const MAX_TREES = 2000;
205 const P_FOREST = 0.7;
207 var totalTrees = scaleByMapSize(MIN_TREES, MAX_TREES);
208 var numForest = totalTrees * P_FOREST;
209 var numStragglers = totalTrees * (1.0 - P_FOREST);
212 log("Creating forests...");
214 [[tMainDirt, tForestFloor2, pForestP], [tForestFloor2, pForestP]],
215 [[tMainDirt, tForestFloor1, pForestT], [tForestFloor1, pForestT]]
217 var size = numForest / (scaleByMapSize(3,6) * numPlayers);
218 var num = floor(size / types.length);
219 for (var i = 0; i < types.length; ++i)
221 placer = new ChainPlacer(1, floor(scaleByMapSize(3, 5)), numForest / (num * floor(scaleByMapSize(2,4))), 0.5);
222 painter = new LayeredPainter(
223 types[i], // terrains
228 [painter, paintClass(clForest)],
229 avoidClasses(clPlayer, 1, clGrass, 1, clForest, 10, clHill, 1),
236 // create dirt patches
237 log("Creating dirt patches...");
238 var sizes = [scaleByMapSize(3, 6), scaleByMapSize(5, 10), scaleByMapSize(8, 21)];
239 for (var i = 0; i < sizes.length; i++)
241 placer = new ChainPlacer(1, floor(scaleByMapSize(3, 5)), sizes[i], 0.5);
242 painter = new LayeredPainter(
243 [tSecondaryDirt ,tDirt], // terrains
249 avoidClasses(clHill, 0, clForest, 0, clPlayer, 8, clGrass, 1),
250 scaleByMapSize(50, 90)
255 // create big patches
256 log("Creating big patches...");
257 var sizes = [scaleByMapSize(6, 30), scaleByMapSize(10, 50), scaleByMapSize(16, 70)];
258 for (var i = 0; i < sizes.length; i++)
260 placer = new ChainPlacer(1, floor(scaleByMapSize(3, 5)), sizes[i], 0.5);
261 painter = new LayeredPainter(
262 [tSecondaryDirt ,tDirt], // terrains
268 avoidClasses(clHill, 0, clForest, 0, clPlayer, 8, clGrass, 1),
269 scaleByMapSize(30, 90)
274 log("Creating stone mines...");
275 // create large stone quarries
276 group = new SimpleGroup([new SimpleObject(oStoneSmall, 0,2, 0,4), new SimpleObject(oStoneLarge, 1,1, 0,4), new RandomObject(aBushes, 2,4, 0,2)], true, clRock);
277 createObjectGroups(group, 0,
278 [avoidClasses(clForest, 1, clPlayer, 10, clRock, 10, clHill, 1, clGrass, 1)],
279 scaleByMapSize(2,8), 100
282 // create small stone quarries
283 group = new SimpleGroup([new SimpleObject(oStoneSmall, 2,5, 1,3), new RandomObject(aBushes, 2,4, 0,2)], true, clRock);
284 createObjectGroups(group, 0,
285 [avoidClasses(clForest, 1, clPlayer, 10, clRock, 10, clHill, 1, clGrass, 1)],
286 scaleByMapSize(2,8), 100
289 log("Creating metal mines...");
290 // create large metal quarries
291 group = new SimpleGroup([new SimpleObject(oMetalLarge, 1,1, 0,4), new RandomObject(aBushes, 2,4, 0,2)], true, clMetal);
292 createObjectGroups(group, 0,
293 [avoidClasses(clForest, 1, clPlayer, 10, clMetal, 10, clRock, 5, clHill, 1, clGrass, 1)],
294 scaleByMapSize(2,8), 100
297 // create small decorative rocks
298 log("Creating small decorative rocks...");
299 group = new SimpleGroup(
300 [new SimpleObject(aRock, 1,3, 0,1)],
305 avoidClasses(clForest, 0, clPlayer, 0, clHill, 0),
306 scaleByMapSize(16, 262), 50
311 log("Creating bushes...");
312 group = new SimpleGroup(
313 [new SimpleObject(aBushB, 1,2, 0,1), new SimpleObject(aBushA, 1,3, 0,2)],
318 avoidClasses(clForest, 0, clPlayer, 0, clHill, 0),
319 scaleByMapSize(50, 500), 50
325 log("Creating gazelle...");
326 group = new SimpleGroup(
327 [new SimpleObject(oGazelle, 5,7, 0,4)],
330 createObjectGroups(group, 0,
331 avoidClasses(clForest, 0, clPlayer, 1, clHill, 1, clFood, 20, clGrass, 2),
336 log("Creating lions...");
337 group = new SimpleGroup(
338 [new SimpleObject(oLion, 2,3, 0,2)],
341 createObjectGroups(group, 0,
342 avoidClasses(clForest, 0, clPlayer, 1, clHill, 1, clFood, 20, clGrass, 2),
347 log("Creating camels...");
348 group = new SimpleGroup(
349 [new SimpleObject(oCamel, 2,3, 0,2)],
352 createObjectGroups(group, 0,
353 avoidClasses(clForest, 0, clPlayer, 1, clHill, 1, clFood, 20, clGrass, 2),
361 // create straggler trees
362 log("Creating straggler trees...");
363 var types = [oPalm, oTamarix, oPine]; // some variation
364 var num = floor(numStragglers / types.length);
365 for (var i = 0; i < types.length; ++i)
367 group = new SimpleGroup(
368 [new SimpleObject(types[i], 1,1, 0,3)],
371 createObjectGroups(group, 0,
372 avoidClasses(clForest, 1, clHill, 1, clPlayer, 1, clMetal, 1, clRock, 1),
377 // create inner straggler trees
378 log("Creating straggler trees...");
379 var types = [oPalm, oTamarix, oPine]; // some variation
380 var num = floor(numStragglers / types.length);
381 for (var i = 0; i < types.length; ++i)
383 group = new SimpleGroup(
384 [new SimpleObject(types[i], 1,1, 0,3)],
387 createObjectGroups(group, 0,
388 [avoidClasses(clForest, 1, clHill, 1, clPlayer, 1, clMetal, 1, clRock, 1), stayClasses(clGrass, 3)],
395 setSunElevation(PI / 8);
396 setSunRotation(randFloat(0, TWO_PI));
397 setSunColor(0.746, 0.718, 0.539);
398 setWaterColor(0.292, 0.347, 0.691);
399 setWaterTint(0.550, 0.543, 0.437);
400 setWaterMurkiness(0.83);
402 setFogColor(0.8, 0.76, 0.61);
403 setFogThickness(0.2);
408 setPPSaturation(0.42);