1 Engine.LoadLibrary("rmgen");
3 const tMainDirt = ["desert_dirt_rocks_1", "desert_dirt_cracks"];
4 const tForestFloor1 = "forestfloor_dirty";
5 const tForestFloor2 = "desert_forestfloor_palms";
6 const tGrassSands = "desert_grass_a_sand";
7 const tGrass = "desert_grass_a";
8 const tSecondaryDirt = "medit_dirt_dry";
9 const tCliff = ["desert_cliff_persia_1", "desert_cliff_persia_2"];
10 const tHill = ["desert_dirt_rocks_1", "desert_dirt_rocks_2", "desert_dirt_rocks_3"];
11 const tDirt = ["desert_dirt_rough", "desert_dirt_rough_2"];
12 const tRoad = "desert_shore_stones";;
13 const tRoadWild = "desert_grass_a_stones";;
15 const oTamarix = "gaia/flora_tree_tamarix";
16 const oPalm = "gaia/flora_tree_date_palm";
17 const oPine = "gaia/flora_tree_aleppo_pine";
18 const oBush = "gaia/flora_bush_grapes";
19 const oCamel = "gaia/fauna_camel";
20 const oGazelle = "gaia/fauna_gazelle";
21 const oLion = "gaia/fauna_lion";
22 const oStoneLarge = "gaia/geology_stonemine_desert_quarry";
23 const oStoneSmall = "gaia/geology_stone_desert_small";
24 const oMetalLarge = "gaia/geology_metal_desert_slabs";
26 const aRock = "actor|geology/stone_desert_med.xml";
27 const aBushA = "actor|props/flora/bush_desert_dry_a.xml";
28 const aBushB = "actor|props/flora/bush_desert_dry_a.xml";
29 const aBushes = [aBushA, aBushB];
31 const pForestP = [tForestFloor2 + TERRAIN_SEPARATOR + oPalm, tForestFloor2];
32 const pForestT = [tForestFloor1 + TERRAIN_SEPARATOR + oTamarix,tForestFloor2];
36 const numPlayers = getNumPlayers();
38 var clPlayer = createTileClass();
39 var clHill = createTileClass();
40 var clForest = createTileClass();
41 var clRock = createTileClass();
42 var clMetal = createTileClass();
43 var clFood = createTileClass();
44 var clBaseResource = createTileClass();
45 var clGrass = createTileClass();
47 var [playerIDs, playerX, playerZ] = playerPlacementCircle(0.35);
49 for (let i = 0; i < numPlayers; ++i)
51 let ix = Math.round(fractionToTiles(playerX[i]));
52 let iz = Math.round(fractionToTiles(playerZ[i]));
54 log("Marking player territory larger than the city patch...");
57 new ClumpPlacer(diskArea(defaultPlayerBaseRadius()), 0.9, 0.5, 10, ix, iz),
58 paintClass(clPlayer));
60 log("Creating big grass patches surrounding the city patches...");
64 Math.floor(scaleByMapSize(5, 12)),
65 Math.floor(scaleByMapSize(25, 60)) / (isNomad() ? 2 : 1),
70 [Math.floor(scaleByMapSize(16, 30))]),
72 new LayeredPainter([tGrassSands, tGrass], [3]),
76 Engine.SetProgress(10);
79 "PlayerPlacement": [playerIDs, playerX, playerZ],
80 // PlayerTileClass marked above
81 "BaseResourceClass": clBaseResource,
83 "outerTerrain": tRoadWild,
84 "innerTerrain": tRoad,
95 { "template": oMetalLarge },
96 { "template": oStoneLarge }
98 "groupElements": [new RandomObject(aBushes, 2, 4, 2, 3)]
101 "template": pickRandom([oPalm, oTamarix]),
106 Engine.SetProgress(20);
108 log("Creating bumps...");
110 new ClumpPlacer(scaleByMapSize(20, 50), 0.3, 0.06, 1),
111 new SmoothElevationPainter(ELEVATION_MODIFY, 2, 2),
112 avoidClasses(clPlayer, 13),
113 scaleByMapSize(300, 800));
115 log("Creating hills...");
117 new ChainPlacer(1, Math.floor(scaleByMapSize(4, 6)), Math.floor(scaleByMapSize(16, 40)), 0.5),
119 new LayeredPainter([tCliff, tHill], [2]),
120 new SmoothElevationPainter(ELEVATION_SET, 22, 2),
123 avoidClasses(clPlayer, 3, clGrass, 1, clHill, 10),
124 scaleByMapSize(1, 3) * numPlayers * 3);
126 Engine.SetProgress(25);
128 log("Creating forests...");
129 var [forestTrees, stragglerTrees] = getTreeCounts(400, 2000, 0.7);
131 [[tMainDirt, tForestFloor2, pForestP], [tForestFloor2, pForestP]],
132 [[tMainDirt, tForestFloor1, pForestT], [tForestFloor1, pForestT]]
134 var size = forestTrees / (scaleByMapSize(3,6) * numPlayers);
135 var num = Math.floor(size / types.length);
136 for (let type of types)
140 Math.floor(scaleByMapSize(3, 5)),
141 forestTrees / (num * Math.floor(scaleByMapSize(2, 4))),
144 new LayeredPainter(type, [2]),
147 avoidClasses(clPlayer, 1, clGrass, 1, clForest, 10, clHill, 1),
150 Engine.SetProgress(40);
152 log("Creating dirt patches...");
153 for (let size of [scaleByMapSize(3, 6), scaleByMapSize(5, 10), scaleByMapSize(8, 21)])
155 new ChainPlacer(1, Math.floor(scaleByMapSize(3, 5)), size, 0.5),
156 new LayeredPainter([tSecondaryDirt, tDirt], [1]),
157 avoidClasses(clHill, 0, clForest, 0, clPlayer, 8, clGrass, 1),
158 scaleByMapSize(50, 90));
159 Engine.SetProgress(60);
161 log("Creating big patches...");
162 for (let size of [scaleByMapSize(6, 30), scaleByMapSize(10, 50), scaleByMapSize(16, 70)])
164 new ChainPlacer(1, Math.floor(scaleByMapSize(3, 5)), size, 0.5),
165 new LayeredPainter([tSecondaryDirt, tDirt], [1]),
166 avoidClasses(clHill, 0, clForest, 0, clPlayer, 8, clGrass, 1),
167 scaleByMapSize(30, 90));
168 Engine.SetProgress(70);
170 log("Creating stone mines...");
171 var 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);
172 createObjectGroupsDeprecated(group, 0,
173 [avoidClasses(clForest, 1, clPlayer, 10, clRock, 10, clHill, 1, clGrass, 1)],
174 scaleByMapSize(2,8), 100
177 log("Creating small stone quarries...");
178 group = new SimpleGroup([new SimpleObject(oStoneSmall, 2,5, 1,3), new RandomObject(aBushes, 2,4, 0,2)], true, clRock);
179 createObjectGroupsDeprecated(group, 0,
180 [avoidClasses(clForest, 1, clPlayer, 10, clRock, 10, clHill, 1, clGrass, 1)],
181 scaleByMapSize(2,8), 100
184 log("Creating metal mines...");
185 group = new SimpleGroup([new SimpleObject(oMetalLarge, 1,1, 0,4), new RandomObject(aBushes, 2,4, 0,2)], true, clMetal);
186 createObjectGroupsDeprecated(group, 0,
187 [avoidClasses(clForest, 1, clPlayer, 10, clMetal, 10, clRock, 5, clHill, 1, clGrass, 1)],
188 scaleByMapSize(2,8), 100
191 log("Creating small decorative rocks...");
192 group = new SimpleGroup(
193 [new SimpleObject(aRock, 1,3, 0,1)],
196 createObjectGroupsDeprecated(
198 avoidClasses(clForest, 0, clPlayer, 0, clHill, 0),
199 scaleByMapSize(16, 262), 50
202 log("Creating bushes...");
203 group = new SimpleGroup(
204 [new SimpleObject(aBushB, 1,2, 0,1), new SimpleObject(aBushA, 1,3, 0,2)],
207 createObjectGroupsDeprecated(
209 avoidClasses(clForest, 0, clPlayer, 0, clHill, 0),
210 scaleByMapSize(50, 500), 50
212 Engine.SetProgress(80);
214 log("Creating gazelle...");
215 group = new SimpleGroup(
216 [new SimpleObject(oGazelle, 5,7, 0,4)],
219 createObjectGroupsDeprecated(group, 0,
220 avoidClasses(clForest, 0, clPlayer, 1, clHill, 1, clFood, 20, clGrass, 2),
224 log("Creating lions...");
225 group = new SimpleGroup(
226 [new SimpleObject(oLion, 2,3, 0,2)],
229 createObjectGroupsDeprecated(group, 0,
230 avoidClasses(clForest, 0, clPlayer, 1, clHill, 1, clFood, 20, clGrass, 2),
234 log("Creating camels...");
235 group = new SimpleGroup(
236 [new SimpleObject(oCamel, 2,3, 0,2)],
239 createObjectGroupsDeprecated(group, 0,
240 avoidClasses(clForest, 0, clPlayer, 1, clHill, 1, clFood, 20, clGrass, 2),
243 Engine.SetProgress(85);
245 createStragglerTrees(
246 [oPalm, oTamarix, oPine],
247 avoidClasses(clForest, 1, clHill, 1, clPlayer, 1, clMetal, 6, clRock, 6),
251 createStragglerTrees(
252 [oPalm, oTamarix, oPine],
253 [avoidClasses(clForest, 1, clHill, 1, clPlayer, 1, clMetal, 6, clRock, 6), stayClasses(clGrass, 3)],
255 stragglerTrees * (isNomad() ? 3 : 1));
257 placePlayersNomad(clPlayer, avoidClasses(clForest, 1, clMetal, 4, clRock, 4, clHill, 4, clFood, 2));
260 setSunElevation(Math.PI / 8);
261 setSunRotation(randomAngle());
262 setSunColor(0.746, 0.718, 0.539);
263 setWaterColor(0.292, 0.347, 0.691);
264 setWaterTint(0.550, 0.543, 0.437);
265 setWaterMurkiness(0.83);
267 setFogColor(0.8, 0.76, 0.61);
268 setFogThickness(0.2);
273 setPPSaturation(0.42);