1 RMS.LoadLibrary("rmgen");
3 var tCity = "desert_city_tile";
4 var tCityPlaza = "desert_city_tile_plaza";
5 var tFineSand = "desert_sand_smooth";
6 var tForestFloor = "desert_forestfloor_palms";
7 var tGrass = "desert_dirt_rough_2";
8 var tGrassSand50 = "desert_sand_dunes_50";
9 var tGrassSand25 = "desert_dirt_rough";
10 var tDirt = "desert_dirt_rough";
11 var tDirtCracks = "desert_dirt_cracks";
12 var tShore = "desert_sand_wet";
13 var tLush = "desert_grass_a";
14 var tSLush = "desert_grass_a_sand";
15 var tSDry = "desert_plants_b";
17 var oBerryBush = "gaia/flora_bush_berry";
18 var oCamel = "gaia/fauna_camel";
19 var oGazelle = "gaia/fauna_gazelle";
20 var oGoat = "gaia/fauna_goat";
21 var oStoneLarge = "gaia/geology_stonemine_desert_badlands_quarry";
22 var oStoneSmall = "gaia/geology_stone_desert_small";
23 var oMetalLarge = "gaia/geology_metal_desert_slabs";
24 var oDatePalm = "gaia/flora_tree_date_palm";
25 var oSDatePalm = "gaia/flora_tree_cretan_date_palm_short";
26 var eObelisk = "other/obelisk";
27 var ePyramid = "other/pyramid_minor";
28 var oWood = "gaia/special_treasure_wood";
29 var oFood = "gaia/special_treasure_food_bin";
31 var aBush1 = "actor|props/flora/bush_desert_a.xml";
32 var aBush2 = "actor|props/flora/bush_desert_dry_a.xml";
33 var aBush3 = "actor|props/flora/bush_medit_sm_dry.xml";
34 var aBush4 = "actor|props/flora/plant_desert_a.xml";
35 var aDecorativeRock = "actor|geology/stone_desert_med.xml";
36 var aReeds = "actor|props/flora/reeds_pond_lush_a.xml";
37 var aLillies = "actor|props/flora/water_lillies.xml";
39 var pForest = [tForestFloor + TERRAIN_SEPARATOR + oDatePalm, tForestFloor + TERRAIN_SEPARATOR + oSDatePalm, tForestFloor];
43 var mapSize = getMapSize();
44 var aPlants = mapSize < 256 ?
45 "actor|props/flora/grass_tropical.xml" :
46 "actor|props/flora/grass_tropic_field_tall.xml";
48 var numPlayers = getNumPlayers();
50 var clPlayer = createTileClass();
51 var clForest = createTileClass();
52 var clWater = createTileClass();
53 var clDirt = createTileClass();
54 var clRock = createTileClass();
55 var clMetal = createTileClass();
56 var clFood = createTileClass();
57 var clBaseResource = createTileClass();
58 var clGrass = createTileClass();
59 var clDesert = createTileClass();
60 var clPond = createTileClass();
61 var clShore = createTileClass();
62 var clTreasure = createTileClass();
64 var [playerIDs, playerX, playerZ] = playerPlacementRiver(0, 0.4);
66 for (var i = 0; i < numPlayers; i++)
68 var id = playerIDs[i];
69 log("Creating base for player " + id + "...");
71 var radius = scaleByMapSize(15,25);
75 // get the x and z in tiles
76 var fx = fractionToTiles(playerX[i]);
77 var fz = fractionToTiles(playerZ[i]);
80 addToClass(ix, iz, clPlayer);
82 // create the city patch
83 var cityRadius = radius/3;
84 var placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz);
85 var painter = new LayeredPainter([tCityPlaza, tCity], [1]);
86 createArea(placer, painter, null);
88 placeCivDefaultEntities(fx, fz, id);
90 placeDefaultChicken(fx, fz, clBaseResource);
92 // create berry bushes
93 var bbAngle = randFloat(0, TWO_PI);
95 var bbX = round(fx + bbDist * cos(bbAngle));
96 var bbZ = round(fz + bbDist * sin(bbAngle));
97 var group = new SimpleGroup(
98 [new SimpleObject(oBerryBush, 5,5, 0,3)],
99 true, clBaseResource, bbX, bbZ
101 createObjectGroup(group, 0);
104 var mAngle = bbAngle;
105 while(abs(mAngle - bbAngle) < PI/3)
106 mAngle = randFloat(0, TWO_PI);
107 var mDist = radius - 4;
108 var mX = round(fx + mDist * cos(mAngle));
109 var mZ = round(fz + mDist * sin(mAngle));
110 group = new SimpleGroup(
111 [new SimpleObject(oMetalLarge, 1,1, 0,0)],
112 true, clBaseResource, mX, mZ
114 createObjectGroup(group, 0);
116 // create stone mines
117 mAngle += randFloat(PI/8, PI/4);
118 mX = round(fx + mDist * cos(mAngle));
119 mZ = round(fz + mDist * sin(mAngle));
120 group = new SimpleGroup(
121 [new SimpleObject(oStoneLarge, 1,1, 0,2)],
122 true, clBaseResource, mX, mZ
124 createObjectGroup(group, 0);
126 // create starting trees
128 var tAngle = randFloat(-PI/3, 4*PI/3);
129 var tDist = randFloat(11, 13);
130 var tX = round(fx + tDist * cos(tAngle));
131 var tZ = round(fz + tDist * sin(tAngle));
132 group = new SimpleGroup(
133 [new SimpleObject(oDatePalm, num, num, 0,5)],
134 false, clBaseResource, tX, tZ
136 createObjectGroup(group, 0, avoidClasses(clBaseResource,2));
138 placeDefaultDecoratives(fx, fz, aBush1, clBaseResource, radius);
143 const riverTextures = [
161 const plantFrequency = 2;
177 "waterFunc": (ix, iz, height, riverFraction) => {
179 addToClass(ix, iz, clWater);
180 placeTerrain(ix, iz, tShore);
182 // Place river bushes
183 if (height <= -0.2 || height >= 0.1)
186 if (plantID % plantFrequency == 0)
189 placeObject(ix, iz, aPlants, 0, randFloat(0, TWO_PI));
193 "landFunc": (ix, iz, shoreDist1, shoreDist2) => {
195 let x = ix / (mapSize + 1.0);
196 if (x < 0.25 || x > 0.75)
197 addToClass(ix, iz, clDesert);
199 for (let riv of riverTextures)
200 if (-shoreDist1 > -riv.right && -shoreDist1 < -riv.left ||
201 -shoreDist2 > riv.left && -shoreDist2 < riv.right)
203 placeTerrain(ix, iz, riv.tileClass);
204 addToClass(ix, iz, clShore);
211 log("Creating bumps...");
213 new ClumpPlacer(scaleByMapSize(20, 50), 0.3, 0.06, 1),
214 new SmoothElevationPainter(ELEVATION_MODIFY, 2, 2),
215 avoidClasses(clWater, 2, clPlayer, 6),
216 scaleByMapSize(100, 200));
218 log("Creating ponds...");
219 var numLakes = Math.round(scaleByMapSize(1, 4) * numPlayers / 2);
220 var waterAreas = createAreas(
221 new ClumpPlacer(scaleByMapSize(2, 5) * 50, 0.8, 0.1, 10),
223 new LayeredPainter([tShore, tShore, tShore], [1, 1]),
224 new SmoothElevationPainter(ELEVATION_SET, -7, 4),
227 avoidClasses(clPlayer, 25, clWater, 20, clPond, 10),
231 log("Creating reeds...");
232 createObjectGroupsByAreasDeprecated(
233 new SimpleGroup([new SimpleObject(aReeds, 1, 3, 0, 1)], true),
235 stayClasses(clPond, 1),
240 log("Creating lillies...");
241 createObjectGroupsByAreasDeprecated(
242 new SimpleGroup([new SimpleObject(aLillies, 1, 3, 0, 1)], true),
244 stayClasses(clPond, 1),
251 log("Creating forests...");
252 var [forestTrees, stragglerTrees] = getTreeCounts(700, 3500, 0.5);
253 var num = scaleByMapSize(10,30);
255 new ClumpPlacer(forestTrees / num, 0.15, 0.1, 0.5),
257 new TerrainPainter([pForest, tForestFloor]),
260 avoidClasses(clPlayer, 19, clForest, 4, clWater, 1, clDesert, 5, clPond, 2, clBaseResource, 3),
266 log("Creating grass patches...");
267 for (let size of [scaleByMapSize(3, 48), scaleByMapSize(5, 84), scaleByMapSize(8, 128)])
269 new ClumpPlacer(size, 0.3, 0.06, 0.5),
272 [[tGrass, tGrassSand50], [tGrassSand50, tGrassSand25], [tGrassSand25, tGrass]],
276 avoidClasses(clForest, 0, clGrass, 5, clPlayer, 10, clWater, 1, clDirt, 5, clShore, 1, clPond, 1),
277 scaleByMapSize(15, 45));
280 log("Creating dirt patches...");
281 for (let size of [scaleByMapSize(3, 48), scaleByMapSize(5, 84), scaleByMapSize(8, 128)])
283 new ClumpPlacer(size, 0.3, 0.06, 0.5),
286 [[tDirt, tDirtCracks], [tDirt, tFineSand], [tDirtCracks, tFineSand]],
290 avoidClasses(clForest, 0, clDirt, 5, clPlayer, 10, clWater, 1, clGrass, 5, clShore, 1, clPond, 1),
291 scaleByMapSize(15, 45));
295 log("Creating stone mines...");
296 var group = new SimpleGroup([new SimpleObject(oStoneSmall, 0, 2, 0, 4), new SimpleObject(oStoneLarge, 1, 1, 0, 4)], true, clRock);
297 createObjectGroupsDeprecated(group, 0,
298 avoidClasses(clForest, 1, clPlayer, 20, clRock, 10, clWater, 1, clPond, 1),
299 scaleByMapSize(4,16), 100
302 log("Creating small stone quarries...");
303 group = new SimpleGroup([new SimpleObject(oStoneSmall, 2,5, 1,3)], true, clRock);
304 createObjectGroupsDeprecated(group, 0,
305 avoidClasses(clForest, 1, clPlayer, 20, clRock, 10, clWater, 1, clPond, 1),
306 scaleByMapSize(4,16), 100
309 log("Creating metal mines...");
310 group = new SimpleGroup([new SimpleObject(oMetalLarge, 1,1, 0,4)], true, clMetal);
311 createObjectGroupsDeprecated(group, 0,
312 avoidClasses(clForest, 1, clPlayer, 20, clMetal, 10, clRock, 5, clWater, 1, clPond, 1),
313 scaleByMapSize(4,16), 100
316 log("Creating stone mines...");
317 group = new SimpleGroup([new SimpleObject(oStoneSmall, 0,2, 0,4), new SimpleObject(oStoneLarge, 1,1, 0,4)], true, clRock);
318 createObjectGroupsDeprecated(group, 0,
319 [avoidClasses(clForest, 1, clPlayer, 20, clRock, 10, clWater, 1, clPond, 1), stayClasses(clDesert, 3)],
320 scaleByMapSize(6,20), 100
323 log("Creating small stone quarries...");
324 group = new SimpleGroup([new SimpleObject(oStoneSmall, 2,5, 1,3)], true, clRock);
325 createObjectGroupsDeprecated(group, 0,
326 [avoidClasses(clForest, 1, clPlayer, 20, clRock, 10, clWater, 1, clPond, 1), stayClasses(clDesert, 3)],
327 scaleByMapSize(6,20), 100
330 log("Creating metal mines...");
331 group = new SimpleGroup([new SimpleObject(oMetalLarge, 1,1, 0,4)], true, clMetal);
332 createObjectGroupsDeprecated(group, 0,
333 [avoidClasses(clForest, 1, clPlayer, 20, clMetal, 10, clRock, 5, clWater, 1, clPond, 1), stayClasses(clDesert, 3)],
334 scaleByMapSize(6,20), 100
339 log("Creating small decorative rocks...");
340 group = new SimpleGroup(
341 [new SimpleObject(aDecorativeRock, 1,3, 0,1)],
344 createObjectGroupsDeprecated(
346 avoidClasses(clWater, 1, clForest, 0, clPlayer, 0, clPond, 1),
347 scaleByMapSize(16, 262), 50
350 log("Creating shrubs...");
351 group = new SimpleGroup(
352 [new SimpleObject(aBush2, 1,2, 0,1), new SimpleObject(aBush1, 1,3, 0,2), new SimpleObject(aBush4, 1,2, 0,1), new SimpleObject(aBush3, 1,3, 0,2)],
355 createObjectGroupsDeprecated(
357 avoidClasses(clWater, 1, clPlayer, 0, clPond, 1),
358 scaleByMapSize(20, 180), 50
362 log("Creating gazelles...");
363 group = new SimpleGroup([new SimpleObject(oGazelle, 5,7, 0,4)], true, clFood);
364 createObjectGroupsDeprecated(group, 0,
365 avoidClasses(clForest, 0, clPlayer, 20, clWater, 1, clFood, 10, clDesert, 5, clPond, 1),
366 3*scaleByMapSize(5,20), 50
369 log("Creating goats...");
370 group = new SimpleGroup([new SimpleObject(oGoat, 2,4, 0,3)], true, clFood);
371 createObjectGroupsDeprecated(group, 0,
372 avoidClasses(clForest, 0, clPlayer, 20, clWater, 1, clFood, 10, clDesert, 5, clPond, 1),
373 3*scaleByMapSize(5,20), 50
376 log("Creating treasures...");
377 group = new SimpleGroup([new SimpleObject(oFood, 1,1, 0,2)], true, clTreasure);
378 createObjectGroupsDeprecated(group, 0,
379 avoidClasses(clForest, 0, clPlayer, 20, clWater, 1, clFood, 2, clDesert, 5, clTreasure, 6, clPond, 1),
380 3*scaleByMapSize(5,20), 50
383 group = new SimpleGroup([new SimpleObject(oWood, 1,1, 0,2)], true, clTreasure);
384 createObjectGroupsDeprecated(group, 0,
385 avoidClasses(clForest, 0, clPlayer, 20, clWater, 1, clFood, 2, clDesert, 5, clTreasure, 6, clPond, 1),
386 3*scaleByMapSize(5,20), 50
389 log("Creating camels...");
390 group = new SimpleGroup([new SimpleObject(oCamel, 2,4, 0,2)], true, clFood);
391 createObjectGroupsDeprecated(group, 0,
392 avoidClasses(clForest, 0, clPlayer, 20, clWater, 1, clFood, 10, clDesert, 5, clTreasure, 2, clPond, 1),
393 3*scaleByMapSize(5,20), 50
398 createStragglerTrees(
399 [oDatePalm, oSDatePalm],
400 avoidClasses(clForest, 0, clWater, 1, clPlayer, 20, clMetal, 6, clDesert, 1, clTreasure, 2, clPond, 1),
404 createStragglerTrees(
405 [oDatePalm, oSDatePalm],
406 avoidClasses(clForest, 0, clWater, 1, clPlayer, 20, clMetal, 6, clTreasure, 2),
408 stragglerTrees / 10);
410 createStragglerTrees(
411 [oDatePalm, oSDatePalm],
412 borderClasses(clPond, 1, 4),
416 log("Creating obelisks");
417 group = new SimpleGroup(
418 [new SimpleObject(eObelisk, 1,1, 0,1)],
421 createObjectGroupsDeprecated(
423 [avoidClasses(clWater, 4, clForest, 3, clPlayer, 20, clMetal, 6, clRock, 2, clPond, 4, clTreasure, 2), stayClasses(clDesert, 3)],
424 scaleByMapSize(5, 30), 50
427 log("Creating pyramids");
428 group = new SimpleGroup(
429 [new SimpleObject(ePyramid, 1,1, 0,1)],
432 createObjectGroupsDeprecated(
434 [avoidClasses(clWater, 7, clForest, 6, clPlayer, 20, clMetal, 5, clRock, 5, clPond, 7, clTreasure, 2), stayClasses(clDesert, 3)],
435 scaleByMapSize(2, 6), 50
439 setSunColor(0.711, 0.746, 0.574);
440 setWaterColor(0.541,0.506,0.416);
441 setWaterTint(0.694,0.592,0.522);
442 setWaterMurkiness(1);
443 setWaterWaviness(3.0);
444 setWaterType("lake");