1 Engine.LoadLibrary("rmgen");
2 Engine.LoadLibrary("rmgen-common");
3 Engine.LoadLibrary("rmbiome");
5 if (g_MapSettings.Biome)
8 // TODO: Replace ugly default for atlas by a dropdown
9 setBiome("persian_highlands/summer");
11 const tDirtMain = g_Terrains.mainTerrain;
12 const tCity = g_Terrains.road;
13 const tCliff = g_Terrains.cliff;
14 const tLakebed1 = g_Terrains.lakebed1;
15 const tLakebed2 = g_Terrains.lakebed2;
16 const tForestFloor = g_Terrains.forestFloor1;
17 const tRocky = g_Terrains.tier1Terrain;
18 const tRocks = g_Terrains.tier2Terrain;
19 const tGrass = g_Terrains.tier3Terrain;
21 const oOak = g_Gaia.tree1;
22 const oGrapesBush = g_Gaia.fruitBush;
23 const oCamel = g_Gaia.mainHuntableAnimal;
24 const oSheep = g_Gaia.secondaryHuntableAnimal;
25 const oGoat = g_Gaia.thirdHuntableAnimal;
26 const oStoneLarge = g_Gaia.stoneLarge;
27 const oStoneSmall = g_Gaia.stoneSmall;
28 const oMetalLarge = g_Gaia.metalLarge;
30 const aDecorativeRock = g_Decoratives.rockMedium;
31 const aBush1 = g_Decoratives.bush1;
32 const aBush2 = g_Decoratives.bush2;
33 const aBush3 = g_Decoratives.bush3;
34 const aBush4 = g_Decoratives.bush4;
35 const aBushes = [aBush1, aBush2, aBush3, aBush4];
37 const pForestO = [tForestFloor + TERRAIN_SEPARATOR + oOak, tForestFloor + TERRAIN_SEPARATOR + oOak, tForestFloor, tDirtMain, tDirtMain];
39 const heightLand = 10;
40 const heightOffsetValley = -10;
42 var g_Map = new RandomMap(heightLand, tDirtMain);
44 const numPlayers = getNumPlayers();
45 const mapSize = g_Map.getSize();
46 const mapCenter = g_Map.getCenter();
48 var clPlayer = g_Map.createTileClass();
49 var clHill = g_Map.createTileClass();
50 var clForest = g_Map.createTileClass();
51 var clPatch = g_Map.createTileClass();
52 var clRock = g_Map.createTileClass();
53 var clMetal = g_Map.createTileClass();
54 var clFood = g_Map.createTileClass();
55 var clBaseResource = g_Map.createTileClass();
56 var clCP = g_Map.createTileClass();
59 "PlayerPlacement": playerPlacementCircle(fractionToTiles(0.35)),
60 "BaseResourceClass": clBaseResource,
62 "outerTerrain": tCity,
63 "innerTerrain": tCity,
65 new TileClassPainter(clPlayer)
71 "template": oGrapesBush,
75 { "template": oMetalLarge },
76 { "template": oStoneLarge }
78 "groupElements": shuffleArray(aBushes).map(t => new SimpleObject(t, 1, 1, 3, 4))
86 Engine.SetProgress(10);
88 g_Map.log("Creating rock patches");
90 new ChainPlacer(1, Math.floor(scaleByMapSize(3, 6)), Math.floor(scaleByMapSize(20, 45)), 0),
92 new TerrainPainter(tRocky),
93 new TileClassPainter(clPatch)
95 avoidClasses(clPatch, 2, clPlayer, 0),
96 scaleByMapSize(5, 20));
97 Engine.SetProgress(15);
99 g_Map.log("Creating secondary rock patches");
101 new ChainPlacer(1, Math.floor(scaleByMapSize(3, 5)), Math.floor(scaleByMapSize(15, 40)), 0),
103 new TerrainPainter([tRocky, tRocks]),
104 new TileClassPainter(clPatch)
106 avoidClasses(clPatch, 2, clPlayer, 4),
107 scaleByMapSize(15, 50));
108 Engine.SetProgress(20);
110 g_Map.log("Creating dirt patches");
114 Math.floor(scaleByMapSize(3, 5)),
115 Math.floor(scaleByMapSize(15, 40)),
118 new TerrainPainter([tGrass]),
119 new TileClassPainter(clPatch)
121 avoidClasses(clPatch, 2, clPlayer, 4),
122 scaleByMapSize(15, 50));
123 Engine.SetProgress(25);
125 g_Map.log("Creating centeral plateau");
129 Math.floor(scaleByMapSize(5, 13)),
130 Math.floor(scaleByMapSize(35, 200)),
134 [Math.floor(scaleByMapSize(18, 68))]),
136 new LayeredPainter([tLakebed2, tLakebed1], [6]),
137 new SmoothElevationPainter(ELEVATION_MODIFY, heightOffsetValley, 8),
138 new TileClassPainter(clCP)
140 avoidClasses(clPlayer, 18));
141 Engine.SetProgress(30);
143 g_Map.log("Creating hills");
144 for (let i = 0; i < scaleByMapSize(20, 80); ++i)
146 Math.floor(scaleByMapSize(40, 60)),
147 Math.floor(scaleByMapSize(3, 4)),
148 Math.floor(scaleByMapSize(6, 12)),
149 Math.floor(scaleByMapSize(4, 10)),
150 avoidClasses(clPlayer, 7, clCP, 5, clHill, Math.floor(scaleByMapSize(18, 25))),
151 randIntExclusive(0, mapSize),
152 randIntExclusive(0, mapSize),
156 Engine.SetProgress(35);
158 g_Map.log("Creating forests");
159 var [forestTrees, stragglerTrees] = getTreeCounts(500, 2500, 0.7);
161 [[tDirtMain, tForestFloor, pForestO], [tForestFloor, pForestO]],
162 [[tDirtMain, tForestFloor, pForestO], [tForestFloor, pForestO]]
164 var size = forestTrees / (scaleByMapSize(3,6) * numPlayers);
165 var num = Math.floor(size / types.length);
166 for (let type of types)
169 Math.floor(scaleByMapSize(1, 2)),
170 Math.floor(scaleByMapSize(2, 5)),
171 Math.floor(size / Math.floor(scaleByMapSize(8, 3))),
174 new LayeredPainter(type, [2]),
175 new TileClassPainter(clForest)
183 Engine.SetProgress(50);
185 g_Map.log("Creating stone mines");
186 createObjectGroupsDeprecated(
189 new SimpleObject(oStoneSmall, 0, 2, 0, 4, 0, 2 * Math.PI, 1),
190 new SimpleObject(oStoneLarge, 1, 1, 0, 4, 0, 2 * Math.PI, 4),
191 new RandomObject(aBushes, 2, 4, 0, 2)
196 [avoidClasses(clForest, 1, clPlayer, 10, clRock, 10, clHill, 1, clCP, 1)],
200 g_Map.log("Creating small stone quarries");
201 createObjectGroupsDeprecated(
202 new SimpleGroup([new SimpleObject(oStoneSmall, 2, 5, 1, 3), new RandomObject(aBushes, 2, 4, 0, 2)], true, clRock),
204 [avoidClasses(clForest, 1, clPlayer, 10, clRock, 10, clHill, 1, clCP, 1)],
205 scaleByMapSize(2, 8),
208 g_Map.log("Creating metal mines");
209 createObjectGroupsDeprecated(
210 new SimpleGroup([new SimpleObject(oMetalLarge, 1, 1, 0, 4), new RandomObject(aBushes, 2, 4, 0, 2)], true, clMetal),
212 [avoidClasses(clForest, 1, clPlayer, 10, clMetal, 10, clRock, 5, clHill, 1, clCP, 1)],
216 g_Map.log("Creating centeral stone mines");
217 createObjectGroupsDeprecated(
220 new SimpleObject(oStoneSmall, 0, 2, 0, 4, 0, 2 * Math.PI, 1),
221 new SimpleObject(oStoneLarge, 1, 1, 0, 4, 0, 2 * Math.PI, 4),
222 new RandomObject(aBushes, 2,4, 0,2)
227 stayClasses(clCP, 6),
228 5*scaleByMapSize(5, 30),
231 g_Map.log("Creating small stone quarries");
232 var group = new SimpleGroup([new SimpleObject(oStoneSmall, 2, 5, 1, 3), new RandomObject(aBushes, 2, 4, 0, 2)], true, clRock);
233 createObjectGroupsDeprecated(group, 0,
234 stayClasses(clCP, 6),
235 5*scaleByMapSize(5,30), 50
238 g_Map.log("Creating centeral metal mines");
239 group = new SimpleGroup([new SimpleObject(oMetalLarge, 1,1, 0,4), new RandomObject(aBushes, 2,4, 0,2)], true, clMetal);
240 createObjectGroupsDeprecated(group, 0,
241 stayClasses(clCP, 6),
242 5*scaleByMapSize(5,30), 50
245 Engine.SetProgress(60);
247 g_Map.log("Creating small decorative rocks");
248 group = new SimpleGroup(
249 [new SimpleObject(aDecorativeRock, 1,3, 0,1)],
252 createObjectGroupsDeprecated(
254 avoidClasses(clForest, 0, clPlayer, 0, clHill, 0),
255 scaleByMapSize(16, 262), 50
258 Engine.SetProgress(65);
260 g_Map.log("Creating bushes");
261 group = new SimpleGroup(
262 [new SimpleObject(aBush2, 1,2, 0,1), new SimpleObject(aBush1, 1,3, 0,2)],
265 createObjectGroupsDeprecated(
267 avoidClasses(clForest, 0, clPlayer, 0, clHill, 0),
268 scaleByMapSize(8, 131), 50
271 Engine.SetProgress(70);
273 g_Map.log("Creating goat");
274 group = new SimpleGroup(
275 [new SimpleObject(oGoat, 5,7, 0,4)],
278 createObjectGroupsDeprecated(group, 0,
279 avoidClasses(clForest, 0, clPlayer, 1, clHill, 1, clFood, 20, clCP, 2),
283 g_Map.log("Creating sheep");
284 group = new SimpleGroup(
285 [new SimpleObject(oSheep, 2,3, 0,2)],
288 createObjectGroupsDeprecated(group, 0,
289 avoidClasses(clForest, 0, clPlayer, 1, clHill, 1, clFood, 20, clCP, 2),
293 g_Map.log("Creating grape bush");
294 group = new SimpleGroup(
295 [new SimpleObject(oGrapesBush, 5,7, 0,4)],
298 createObjectGroupsDeprecated(group, 0,
299 avoidClasses(clForest, 0, clPlayer, 20, clHill, 1, clFood, 10, clCP, 2),
300 randIntInclusive(1, 4) * numPlayers + 2, 50
303 g_Map.log("Creating camels");
304 group = new SimpleGroup(
305 [new SimpleObject(oCamel, 2,3, 0,2)],
308 createObjectGroupsDeprecated(group, 0,
309 stayClasses(clCP, 2),
313 Engine.SetProgress(90);
315 createStragglerTrees(
317 avoidClasses(clForest, 1, clHill, 1, clPlayer, 1, clBaseResource, 6, clMetal, 6, clRock, 6, clCP, 2),
321 placePlayersNomad(clPlayer, avoidClasses(clForest, 1, clMetal, 4, clRock, 4, clHill, 4, clFood, 2));