1 Engine.LoadLibrary("rmgen");
2 Engine.LoadLibrary("rmgen-common");
4 const tGrass = ["temp_grass_aut", "temp_grass_aut", "temp_grass_d_aut"];
5 const tForestFloor = "temp_grass_aut";
6 const tGrassA = "temp_grass_plants_aut";
7 const tGrassB = "temp_grass_b_aut";
8 const tGrassC = "temp_grass_c_aut";
9 const tHill = ["temp_highlands_aut", "temp_grass_long_b_aut"];
10 const tCliff = ["temp_cliff_a", "temp_cliff_b"];
11 const tRoad = "temp_road_aut";
12 const tGrassPatch = "temp_grass_plants_aut";
13 const tShore = "temp_plants_bog_aut";
14 const tWater = "temp_mud_a";
16 const oBeech = "gaia/flora_tree_euro_beech_aut";
17 const oOak = "gaia/flora_tree_oak_aut";
18 const oPine = "gaia/flora_tree_pine";
19 const oDeer = "gaia/fauna_deer";
20 const oFish = "gaia/fauna_fish";
21 const oSheep = "gaia/fauna_rabbit";
22 const oBerryBush = "gaia/flora_bush_berry";
23 const oStoneLarge = "gaia/geology_stonemine_temperate_quarry";
24 const oStoneSmall = "gaia/geology_stone_temperate";
25 const oMetalLarge = "gaia/geology_metal_temperate_slabs";
26 const oFoodTreasure = "gaia/treasure/food_bin";
27 const oWoodTreasure = "gaia/treasure/wood";
28 const oStoneTreasure = "gaia/treasure/stone";
29 const oMetalTreasure = "gaia/treasure/metal";
31 const aGrass = "actor|props/flora/grass_soft_dry_small_tall.xml";
32 const aGrassShort = "actor|props/flora/grass_soft_dry_large.xml";
33 const aRockLarge = "actor|geology/stone_granite_med.xml";
34 const aRockMedium = "actor|geology/stone_granite_med.xml";
35 const aReeds = "actor|props/flora/reeds_pond_dry.xml";
36 const aLillies = "actor|props/flora/water_lillies.xml";
37 const aBushMedium = "actor|props/flora/bush_medit_me_dry.xml";
38 const aBushSmall = "actor|props/flora/bush_medit_sm_dry.xml";
40 const pForestD = [tForestFloor + TERRAIN_SEPARATOR + oBeech, tForestFloor];
41 const pForestO = [tForestFloor + TERRAIN_SEPARATOR + oOak, tForestFloor];
42 const pForestP = [tForestFloor + TERRAIN_SEPARATOR + oPine, tForestFloor];
44 var heightSeaGround = -4;
47 var g_Map = new RandomMap(heightLand, tGrass);
49 const numPlayers = getNumPlayers();
51 var clPlayer = g_Map.createTileClass();
52 var clHill = g_Map.createTileClass();
53 var clForest = g_Map.createTileClass();
54 var clWater = g_Map.createTileClass();
55 var clDirt = g_Map.createTileClass();
56 var clRock = g_Map.createTileClass();
57 var clMetal = g_Map.createTileClass();
58 var clFood = g_Map.createTileClass();
59 var clBaseResource = g_Map.createTileClass();
62 { "template": oFoodTreasure, "distance": 5 },
63 { "template": oWoodTreasure, "distance": 5 },
64 { "template": oMetalTreasure, "distance": 3 },
65 { "template": oStoneTreasure, "distance": 2 }
68 var [playerIDs, playerPosition] = playerPlacementCircle(fractionToTiles(0.35));
70 g_Map.log("Creating playerbases");
71 var playerAngle = BUILDING_ORIENTATION;
72 for (let i = 0; i < numPlayers; ++i)
78 for (let dist of [6, 8])
80 let ents = getStartingEntities(playerIDs[i]);
83 ents = ents.filter(ent => ent.Template.indexOf("female") != -1 || ent.Template.indexOf("infantry") != -1);
85 placeStartingEntities(playerPosition[i], playerIDs[i], ents, dist);
89 for (let j = 0; j < treasures.length; ++j)
92 [new SimpleObject(treasures[j].template, treasures[j].distance, treasures[j].distance, 0, 2)],
95 Vector2D.add(playerPosition[i], new Vector2D(10, 0).rotate(-j * Math.PI / 2 - playerAngle))),
99 var civ = getCivCode(playerIDs[i]);
100 var tilesSize = civ == "cart" ? 23 : 21;
102 new ConvexPolygonPlacer(
103 new Array(4).fill(0).map((zero, j) => new Vector2D(tilesSize, 0).rotate(j * Math.PI / 2 - playerAngle - Math.PI/4).add(playerPosition[i])),
106 new TerrainPainter(tRoad),
107 new TileClassPainter(clPlayer)
111 // To take into account houses that offer a lower population bonus
112 if (Engine.GetTemplate("structures/" + civ + "_house").Cost.PopulationBonus <= 5)
114 var wall = ["gate", "tower", "long",
115 "cornerIn", "long", "barracks", "tower", "long", "tower", "house", "long",
116 "cornerIn", "long", "house", "tower", "gate", "tower", "house", "long",
117 "cornerIn", "long", "house", "tower", "long", "tower", "house", "long",
118 "cornerIn", "long", "house", "tower"];
122 var wall = ["gate", "tower", "long",
123 "cornerIn", "long", "barracks", "tower", "long", "tower", "long",
124 "cornerIn", "long", "house", "tower", "gate", "tower", "long",
125 "cornerIn", "long", "house", "tower", "long", "tower", "long",
126 "cornerIn", "long", "house", "tower"];
128 placeCustomFortress(playerPosition[i], new Fortress("Spahbod", wall), civ, playerIDs[i], playerAngle);
131 g_Map.log("Creating lakes");
132 var numLakes = Math.round(scaleByMapSize(1,4) * numPlayers);
133 var waterAreas = createAreas(
134 new ClumpPlacer(scaleByMapSize(100,250), 0.8, 0.1, Infinity),
136 new LayeredPainter([tShore, tWater], [1]),
137 new SmoothElevationPainter(ELEVATION_SET, heightSeaGround, 3),
138 new TileClassPainter(clWater)
140 avoidClasses(clPlayer, 7, clWater, 20),
143 Engine.SetProgress(15);
145 g_Map.log("Creating reeds");
146 createObjectGroupsByAreasDeprecated(
147 new SimpleGroup([new SimpleObject(aReeds, 5,10, 0,4), new SimpleObject(aLillies, 0,1, 0,4)], true),
149 [borderClasses(clWater, 3, 0), stayClasses(clWater, 1)],
153 Engine.SetProgress(25);
155 g_Map.log("Creating fish");
156 createObjectGroupsByAreasDeprecated(
158 [new SimpleObject(oFish, 1,1, 0,1)],
162 [stayClasses(clWater, 4), avoidClasses(clFood, 8)],
166 Engine.SetProgress(30);
168 createBumps(avoidClasses(clWater, 2, clPlayer, 5));
169 Engine.SetProgress(35);
171 createHills([tCliff, tCliff, tHill], avoidClasses(clPlayer, 5, clWater, 5, clHill, 15), clHill, scaleByMapSize(1, 4) * numPlayers);
172 Engine.SetProgress(40);
174 g_Map.log("Creating forests");
175 var [forestTrees, stragglerTrees] = getTreeCounts(500, 2500, 0.7);
177 [[tForestFloor, tGrass, pForestD], [tForestFloor, pForestD]],
178 [[tForestFloor, tGrass, pForestO], [tForestFloor, pForestO]],
179 [[tForestFloor, tGrass, pForestP], [tForestFloor, pForestP]]
181 var size = forestTrees / (scaleByMapSize(3,6) * numPlayers);
182 var num = Math.floor(size / types.length);
183 for (let type of types)
185 new ChainPlacer(1, Math.floor(scaleByMapSize(3, 5)), forestTrees / num, 0.5),
187 new LayeredPainter(type, [2]),
188 new TileClassPainter(clForest)
190 avoidClasses(clPlayer, 5, clWater, 3, clForest, 15, clHill, 1),
192 Engine.SetProgress(50);
194 g_Map.log("Creating dirt patches");
195 createLayeredPatches(
196 [scaleByMapSize(3, 6), scaleByMapSize(5, 10), scaleByMapSize(8, 21)],
197 [[tGrass,tGrassA],[tGrassA,tGrassB], [tGrassB,tGrassC]],
199 avoidClasses(clWater, 1, clForest, 0, clHill, 0, clDirt, 5, clPlayer, 1),
200 scaleByMapSize(15, 45),
202 Engine.SetProgress(55);
204 g_Map.log("Creating grass patches");
206 [scaleByMapSize(2, 4), scaleByMapSize(3, 7), scaleByMapSize(5, 15)],
208 avoidClasses(clWater, 1, clForest, 0, clHill, 0, clDirt, 5, clPlayer, 1),
209 scaleByMapSize(15, 45),
211 Engine.SetProgress(60);
213 g_Map.log("Creating stone mines");
216 [new SimpleObject(oStoneSmall, 0, 2, 0, 4, 0, 2 * Math.PI, 1), new SimpleObject(oStoneLarge, 1, 1, 0, 4, 0, 2 * Math.PI, 4)],
217 [new SimpleObject(oStoneSmall, 2,5, 1,3)]
219 avoidClasses(clWater, 0, clForest, 1, clPlayer, 5, clRock, 10, clHill, 1),
221 Engine.SetProgress(65);
223 g_Map.log("Creating metal mines");
226 [new SimpleObject(oMetalLarge, 1,1, 0,4)]
228 avoidClasses(clWater, 0, clForest, 1, clPlayer, 5, clMetal, 10, clRock, 5, clHill, 1),
231 Engine.SetProgress(70);
235 [new SimpleObject(aRockMedium, 1, 3, 0, 1)],
236 [new SimpleObject(aRockLarge, 1, 2, 0, 1), new SimpleObject(aRockMedium, 1, 3, 0, 2)],
237 [new SimpleObject(aGrassShort, 1, 2, 0, 1)],
238 [new SimpleObject(aGrass, 2, 4, 0, 1.8), new SimpleObject(aGrassShort, 3, 6, 1.2, 2.5)],
239 [new SimpleObject(aBushMedium, 1, 2, 0, 2), new SimpleObject(aBushSmall, 2, 4, 0, 2)]
242 scaleByMapSize(16, 262),
243 scaleByMapSize(8, 131),
244 scaleByMapSize(13, 200),
245 scaleByMapSize(13, 200),
246 scaleByMapSize(13, 200)
248 avoidClasses(clWater, 0, clForest, 0, clPlayer, 1, clHill, 0));
249 Engine.SetProgress(80);
253 [new SimpleObject(oSheep, 2, 3, 0, 2)],
254 [new SimpleObject(oDeer, 5, 7, 0, 4)]
260 avoidClasses(clWater, 0, clForest, 0, clPlayer, 6, clHill, 1, clFood, 20),
262 Engine.SetProgress(85);
266 [new SimpleObject(oBerryBush, 5, 7, 0, 4)]
269 randIntInclusive(1, 4) * numPlayers + 2
271 avoidClasses(clWater, 2, clForest, 0, clPlayer, 6, clHill, 1, clFood, 10),
274 Engine.SetProgress(90);
276 createStragglerTrees(
277 [oOak, oBeech, oPine],
278 avoidClasses(clWater, 1, clForest, 1, clHill, 1, clPlayer, 1, clMetal, 6, clRock, 6),
281 Engine.SetProgress(95);
283 placePlayersNomad(clPlayer, avoidClasses(clWater, 2, clHill, 2, clForest, 1, clMetal, 4, clRock, 4, clHill, 4, clFood, 2));
286 setWaterColor(0.157, 0.149, 0.443);
287 setWaterTint(0.443,0.42,0.824);
288 setWaterWaviness(2.0);
289 setWaterType("lake");
290 setWaterMurkiness(0.83);
293 setFogThickness(0.22);
294 setFogColor(0.82,0.82, 0.73);
295 setPPSaturation(0.56);