1 Engine.LoadLibrary("rmgen");
2 Engine.LoadLibrary("rmbiome");
6 const tMainTerrain = g_Terrains.mainTerrain;
7 const tForestFloor1 = g_Terrains.forestFloor1;
8 const tForestFloor2 = g_Terrains.forestFloor2;
9 const tCliff = g_Terrains.cliff;
10 const tTier1Terrain = g_Terrains.tier1Terrain;
11 const tTier2Terrain = g_Terrains.tier2Terrain;
12 const tTier3Terrain = g_Terrains.tier3Terrain;
13 const tRoad = g_Terrains.road;
14 const tRoadWild = g_Terrains.roadWild;
15 const tTier4Terrain = g_Terrains.tier4Terrain;
16 const tShore = g_Terrains.shore;
17 const tWater = g_Terrains.water;
19 var tHill = g_Terrains.hill;
20 var tDirt = g_Terrains.dirt;
21 if (currentBiome() == "temperate")
23 tDirt = ["medit_shrubs_a", "grass_field"];
24 tHill = ["grass_field", "peat_temp"];
27 const oTree1 = g_Gaia.tree1;
28 const oTree2 = g_Gaia.tree2;
29 const oTree3 = g_Gaia.tree3;
30 const oTree4 = g_Gaia.tree4;
31 const oTree5 = g_Gaia.tree5;
32 const oFruitBush = g_Gaia.fruitBush;
33 const oMainHuntableAnimal = g_Gaia.mainHuntableAnimal;
34 const oFish = g_Gaia.fish;
35 const oSecondaryHuntableAnimal = g_Gaia.secondaryHuntableAnimal;
36 const oStoneLarge = g_Gaia.stoneLarge;
37 const oMetalLarge = g_Gaia.metalLarge;
39 const aGrass = g_Decoratives.grass;
40 const aGrassShort = g_Decoratives.grassShort;
41 const aRockLarge = g_Decoratives.rockLarge;
42 const aRockMedium = g_Decoratives.rockMedium;
43 const aBushMedium = g_Decoratives.bushMedium;
44 const aBushSmall = g_Decoratives.bushSmall;
46 const pForest1 = [tForestFloor2 + TERRAIN_SEPARATOR + oTree1, tForestFloor2 + TERRAIN_SEPARATOR + oTree2, tForestFloor2];
47 const pForest2 = [tForestFloor1 + TERRAIN_SEPARATOR + oTree4, tForestFloor1 + TERRAIN_SEPARATOR + oTree5, tForestFloor1];
51 const clPlayer = createTileClass();
52 const clHill = createTileClass();
53 const clMountain = createTileClass();
54 const clForest = createTileClass();
55 const clDirt = createTileClass();
56 const clRock = createTileClass();
57 const clMetal = createTileClass();
58 const clFood = createTileClass();
59 const clBaseResource = createTileClass();
61 const numPlayers = getNumPlayers();
62 const mapSize = getMapSize();
63 const centerOfMap = mapSize / 2;
66 const waterHeight = getMapBaseHeight();
67 const shoreRadius = 6;
71 log("Creating the water...");
73 new ClumpPlacer(getMapArea(), 1, 1, 1, Math.round(fractionToTiles(0.5)), Math.round(fractionToTiles(0.5))),
75 new LayeredPainter([tWater, tWater, tShore], [1, 4]),
76 new SmoothElevationPainter(ELEVATION_SET, waterHeight, 2)
78 avoidClasses(clPlayer, 5));
80 log("Creating player islands...")
81 var [playerIDs, playerX, playerZ] = playerPlacementCircle(0.38);
83 for (let i = 0; i < numPlayers; ++i)
86 2 * diskArea(defaultPlayerBaseRadius()),
90 Math.round(fractionToTiles(playerX[i])),
91 Math.round(fractionToTiles(playerZ[i]))),
93 new LayeredPainter([tShore, tMainTerrain], [shoreRadius]),
94 new SmoothElevationPainter(ELEVATION_SET, landHeight, shoreRadius),
100 "PlayerPlacement": [playerIDs, playerX, playerZ],
101 "PlayerTileClass": clPlayer,
102 "BaseResourceClass": clBaseResource,
105 "outerTerrain": tRoadWild,
106 "innerTerrain": tRoad
111 "template": oFruitBush
115 { "template": oMetalLarge },
116 { "template": oStoneLarge }
126 "template": aGrassShort
129 Engine.SetProgress(40);
131 log("Creating central island...");
135 Math.floor(scaleByMapSize(10, 15)),
136 Math.floor(scaleByMapSize(200, 300)),
141 [Math.floor(mapSize * 0.01)]),
143 new LayeredPainter([tShore, tMainTerrain], [shoreRadius, 100]),
144 new SmoothElevationPainter(ELEVATION_SET, landHeight, shoreRadius),
147 avoidClasses(clPlayer, 40));
149 for (let m = 0; m < randIntInclusive(20, 34); ++m)
151 let elevRand = randIntInclusive(6, 20);
156 Math.floor(scaleByMapSize(15, 20)),
158 randIntExclusive(0, mapSize),
159 randIntExclusive(0, mapSize),
161 [Math.floor(mapSize * 0.01)]),
163 new LayeredPainter([tDirt, tHill], [Math.floor(elevRand / 3), 40]),
164 new SmoothElevationPainter(ELEVATION_SET, elevRand, Math.floor(elevRand / 3)),
167 [avoidClasses(clBaseResource, 2, clPlayer, 40), stayClasses(clHill, 6)]);
170 for (let m = 0; m < randIntInclusive(8, 17); ++m)
172 let elevRand = randIntInclusive(15, 29);
177 Math.floor(scaleByMapSize(15, 20)),
179 randIntExclusive(0, mapSize),
180 randIntExclusive(0, mapSize),
182 [Math.floor(mapSize * 0.01)]),
184 new LayeredPainter([tCliff, tForestFloor2], [Math.floor(elevRand / 3), 40]),
185 new SmoothElevationPainter(ELEVATION_MODIFY, elevRand, Math.floor(elevRand / 3)),
186 paintClass(clMountain)
188 [avoidClasses(clBaseResource, 2, clPlayer, 40), stayClasses(clHill, 6)]);
191 log("Creating center bounty...");
194 [new SimpleObject(oMetalLarge, 3, 6, 25, Math.floor(mapSize * 0.25))],
200 [avoidClasses(clBaseResource, 20, clPlayer, 40, clMountain, 4), stayClasses(clHill, 10)]);
204 [new SimpleObject(oStoneLarge, 3, 6, 25, Math.floor(mapSize * 0.25))],
210 [avoidClasses(clBaseResource, 20, clPlayer, 40, clMountain, 4), stayClasses(clHill, 10)]);
212 log("Creating fish...");
213 createObjectGroupsDeprecated(
214 new SimpleGroup([new SimpleObject(oFish, 2, 3, 0, 2)], true, clFood),
216 avoidClasses(clHill, 10, clFood, 20),
220 var [forestTrees, stragglerTrees] = getTreeCounts(...rBiomeTreeCount(0.7));
222 [tMainTerrain, tForestFloor1, tForestFloor2, pForest1, pForest2],
223 [avoidClasses(clPlayer, 25, clForest, 10, clBaseResource, 3, clMetal, 6, clRock, 3, clMountain, 2), stayClasses(clHill, 6)],
227 let types = [oTree1, oTree2, oTree4, oTree3];
228 createStragglerTrees(
230 [avoidClasses(clBaseResource, 2, clMetal, 6, clRock, 3, clMountain, 2, clPlayer, 25), stayClasses(clHill, 6)],
233 Engine.SetProgress(65);
235 log("Creating dirt patches...");
236 var numb = currentBiome() == "savanna" ? 3 : 1;
237 for (let size of [scaleByMapSize(3, 6), scaleByMapSize(5, 10), scaleByMapSize(8, 21)])
239 new ChainPlacer(1, Math.floor(scaleByMapSize(3, 5)), size, 0.5),
241 new LayeredPainter([[tMainTerrain, tTier1Terrain], [tTier1Terrain, tTier2Terrain], [tTier2Terrain, tTier3Terrain]], [1, 1]),
244 avoidClasses(clForest, 0, clMountain, 0, clDirt, 5, clPlayer, 10),
245 numb * scaleByMapSize(15, 45));
247 log("Painting shorelines...");
248 paintTerrainBasedOnHeight(1, landHeight, 0, tMainTerrain);
249 paintTerrainBasedOnHeight(waterHeight, 1, 3, tTier1Terrain);
251 log("Creating grass patches...");
252 for (let size of [scaleByMapSize(2, 4), scaleByMapSize(3, 7), scaleByMapSize(5, 15)])
254 new ChainPlacer(1, Math.floor(scaleByMapSize(3, 5)), size, 0.5),
255 new TerrainPainter(tTier4Terrain),
256 avoidClasses(clForest, 0, clMountain, 0, clDirt, 5, clPlayer, 10),
257 numb * scaleByMapSize(15, 45));
259 log("Creating food...");
262 [new SimpleObject(oMainHuntableAnimal, 5, 7, 0, 4)],
263 [new SimpleObject(oSecondaryHuntableAnimal, 2, 3, 0, 2)]
265 [3 * numPlayers, 3 * numPlayers],
266 [avoidClasses(clForest, 0, clPlayer, 20, clMountain, 1, clFood, 4, clRock, 6, clMetal, 6), stayClasses(clHill, 6)],
269 Engine.SetProgress(75);
273 [new SimpleObject(oFruitBush, 5, 7, 0, 4)]
276 [avoidClasses(clForest, 0, clPlayer, 15, clMountain, 1, clFood, 4, clRock, 6, clMetal, 6), stayClasses(clHill, 6)],
279 Engine.SetProgress(85);
281 log("Creating decoration...");
282 var planetm = currentBiome() == "tropic" ? 8 : 1;
285 [new SimpleObject(aRockMedium, 1, 3, 0, 1)],
286 [new SimpleObject(aRockLarge, 1, 2, 0, 1), new SimpleObject(aRockMedium, 1, 3, 0, 2)],
287 [new SimpleObject(aGrassShort, 2, 15, 0, 1)],
288 [new SimpleObject(aGrass, 2, 10, 0, 1.8), new SimpleObject(aGrassShort, 3, 10, 1.2, 2.5)],
289 [new SimpleObject(aBushMedium, 1, 5, 0, 2), new SimpleObject(aBushSmall, 2, 4, 0, 2)]
292 scaleByMapSize(16, 262),
293 scaleByMapSize(8, 131),
294 planetm * scaleByMapSize(13, 200),
295 planetm * scaleByMapSize(13, 200),
296 planetm * scaleByMapSize(13, 200)
298 avoidClasses(clForest, 2, clPlayer, 20, clMountain, 5, clFood, 1, clBaseResource, 2));
300 log("Creating water forests...");
301 var [forestTrees, stragglerTrees] = getTreeCounts(...rBiomeTreeCount(0.1));
303 [tMainTerrain, tForestFloor1, tForestFloor2, pForest1, pForest2],
304 avoidClasses(clPlayer, 30, clHill, 10, clFood, 5),
308 log("Creating small grass tufts...");
309 createObjectGroupsDeprecated(
310 new SimpleGroup([new SimpleObject(aGrassShort, 1, 2, 0, 1)]),
312 [avoidClasses(clMountain, 2, clPlayer, 2, clDirt, 0), stayClasses(clHill, 8)],
313 planetm * scaleByMapSize(13, 200));
318 stayClasses(clHill, 2),
319 avoidClasses(clMountain, 2, clForest, 1, clMetal, 4, clRock, 4, clFood, 2)]));
321 setSkySet(pickRandom(["cloudless", "cumulus", "overcast"]));
322 setWaterMurkiness(0.4);