1 Engine.LoadLibrary("rmgen");
3 const tGrass = ["temp_grass_aut", "temp_grass_aut", "temp_grass_d_aut"];
4 const tForestFloor = "temp_grass_aut";
5 const tGrassA = "temp_grass_plants_aut";
6 const tGrassB = "temp_grass_b_aut";
7 const tGrassC = "temp_grass_c_aut";
8 const tHill = ["temp_highlands_aut", "temp_grass_long_b_aut"];
9 const tCliff = ["temp_cliff_a", "temp_cliff_b"];
10 const tRoad = "temp_road_aut";
11 const tGrassPatch = "temp_grass_plants_aut";
12 const tShore = "temp_plants_bog_aut";
13 const tWater = "temp_mud_a";
15 const oBeech = "gaia/flora_tree_euro_beech_aut";
16 const oOak = "gaia/flora_tree_oak_aut";
17 const oPine = "gaia/flora_tree_pine";
18 const oDeer = "gaia/fauna_deer";
19 const oFish = "gaia/fauna_fish";
20 const oSheep = "gaia/fauna_rabbit";
21 const oBerryBush = "gaia/flora_bush_berry";
22 const oStoneLarge = "gaia/geology_stonemine_temperate_quarry";
23 const oStoneSmall = "gaia/geology_stone_temperate";
24 const oMetalLarge = "gaia/geology_metal_temperate_slabs";
25 const oFoodTreasure = "gaia/special_treasure_food_bin";
26 const oWoodTreasure = "gaia/special_treasure_wood";
27 const oStoneTreasure = "gaia/special_treasure_stone";
28 const oMetalTreasure = "gaia/special_treasure_metal";
30 const aGrass = "actor|props/flora/grass_soft_dry_small_tall.xml";
31 const aGrassShort = "actor|props/flora/grass_soft_dry_large.xml";
32 const aRockLarge = "actor|geology/stone_granite_med.xml";
33 const aRockMedium = "actor|geology/stone_granite_med.xml";
34 const aReeds = "actor|props/flora/reeds_pond_dry.xml";
35 const aLillies = "actor|props/flora/water_lillies.xml";
36 const aBushMedium = "actor|props/flora/bush_medit_me_dry.xml";
37 const aBushSmall = "actor|props/flora/bush_medit_sm_dry.xml";
39 const pForestD = [tForestFloor + TERRAIN_SEPARATOR + oBeech, tForestFloor];
40 const pForestO = [tForestFloor + TERRAIN_SEPARATOR + oOak, tForestFloor];
41 const pForestP = [tForestFloor + TERRAIN_SEPARATOR + oPine, tForestFloor];
45 const numPlayers = getNumPlayers();
46 const mapSize = getMapSize();
48 var clPlayer = createTileClass();
49 var clHill = createTileClass();
50 var clForest = createTileClass();
51 var clWater = createTileClass();
52 var clDirt = createTileClass();
53 var clRock = createTileClass();
54 var clMetal = createTileClass();
55 var clFood = createTileClass();
56 var clBaseResource = createTileClass();
58 var [playerIDs, playerX, playerZ] = playerPlacementCircle(0.35);
60 for (var i=0; i < numPlayers; i++)
65 log("Creating base for player " + playerIDs[i] + "...");
66 playerX[i] *= mapSize;
67 playerZ[i] *= mapSize;
69 for (let dist of [6, 8])
71 let ents = getStartingEntities(playerIDs[i]);
74 ents = ents.filter(ent => ent.Template.indexOf("female") != -1 || ent.Template.indexOf("infantry") != -1);
76 placeStartingEntities(playerX[i], playerZ[i], playerIDs[i], ents, dist);
80 var bbAngle = BUILDING_ORIENTATION;
82 var bbX = Math.round(playerX[i] + bbDist * Math.cos(bbAngle));
83 var bbZ = Math.round(playerZ[i] + bbDist * Math.sin(bbAngle));
84 var group = new SimpleGroup(
85 [new SimpleObject(oFoodTreasure, 5,5, 0,2)],
86 true, clBaseResource, bbX, bbZ
88 createObjectGroup(group, 0);
90 bbAngle += Math.PI / 2;
91 var bbX = Math.round(playerX[i] + bbDist * Math.cos(bbAngle));
92 var bbZ = Math.round(playerZ[i] + bbDist * Math.sin(bbAngle));
93 group = new SimpleGroup(
94 [new SimpleObject(oWoodTreasure, 5,5, 0,2)],
95 true, clBaseResource, bbX, bbZ
97 createObjectGroup(group, 0);
99 bbAngle += Math.PI / 2;
100 var bbX = Math.round(playerX[i] + bbDist * Math.cos(bbAngle));
101 var bbZ = Math.round(playerZ[i] + bbDist * Math.sin(bbAngle));
102 group = new SimpleGroup(
103 [new SimpleObject(oMetalTreasure, 3,3, 0,2)],
104 true, clBaseResource, bbX, bbZ
106 createObjectGroup(group, 0);
108 bbAngle += Math.PI / 2;
109 var bbX = Math.round(playerX[i] + bbDist * Math.cos(bbAngle));
110 var bbZ = Math.round(playerZ[i] + bbDist * Math.sin(bbAngle));
111 group = new SimpleGroup(
112 [new SimpleObject(oStoneTreasure, 2,2, 0,2)],
113 true, clBaseResource, bbX, bbZ
115 createObjectGroup(group, 0);
118 var civ = getCivCode(playerIDs[i]);
119 var tilesSize = civ == "cart" ? 27 : 22;
121 const minBoundX = (playerX[i] > tilesSize ? playerX[i] - tilesSize : 0);
122 const minBoundY = (playerZ[i] > tilesSize ? playerZ[i] - tilesSize : 0);
123 const maxBoundX = (playerX[i] < mapSize - tilesSize ? playerX[i] + tilesSize : mapSize);
124 const maxBoundY = (playerZ[i] < mapSize - tilesSize ? playerZ[i] + tilesSize : mapSize);
126 for (var tx = minBoundX; tx < maxBoundX; ++tx)
127 for (var ty = minBoundY; ty < maxBoundY; ++ty)
129 var unboundSumOfXY = tx + ty - minBoundX - minBoundY;
130 if ((unboundSumOfXY > tilesSize) && (unboundSumOfXY < 3 * tilesSize) && (tx - ty + minBoundY - minBoundX < tilesSize) && (ty - tx - minBoundY + minBoundX < tilesSize))
132 placeTerrain(Math.floor(tx), Math.floor(ty), tRoad);
133 addToClass(Math.floor(tx), Math.floor(ty), clPlayer);
137 // Place custom fortress
138 if (civ == "brit" || civ == "gaul" || civ == "iber")
140 var wall = ["gate", "tower", "long",
141 "cornerIn", "long", "barracks", "tower", "long", "tower", "house", "long",
142 "cornerIn", "long", "house", "tower", "gate", "tower", "house", "long",
143 "cornerIn", "long", "house", "tower", "long", "tower", "house", "long",
144 "cornerIn", "long", "house", "tower"];
148 var wall = ["gate", "tower", "long",
149 "cornerIn", "long", "barracks", "tower", "long", "tower", "long",
150 "cornerIn", "long", "house", "tower", "gate", "tower", "long",
151 "cornerIn", "long", "house", "tower", "long", "tower", "long",
152 "cornerIn", "long", "house", "tower"];
154 placeCustomFortress(playerX[i], playerZ[i], new Fortress("Spahbod", wall), civ, playerIDs[i], -Math.PI/4);
157 log("Creating lakes...");
158 var numLakes = Math.round(scaleByMapSize(1,4) * numPlayers);
159 var waterAreas = createAreas(
160 new ClumpPlacer(scaleByMapSize(100,250), 0.8, 0.1, 10),
162 new LayeredPainter([tShore, tWater, tWater], [1, 1]),
163 new SmoothElevationPainter(ELEVATION_SET, -4, 3),
166 avoidClasses(clPlayer, 7, clWater, 20),
169 Engine.SetProgress(15);
171 log("Creating reeds...");
172 createObjectGroupsByAreasDeprecated(
173 new SimpleGroup([new SimpleObject(aReeds, 5,10, 0,4), new SimpleObject(aLillies, 0,1, 0,4)], true),
175 [borderClasses(clWater, 3, 0), stayClasses(clWater, 1)],
179 Engine.SetProgress(25);
181 log("Creating fish...");
182 createObjectGroupsByAreasDeprecated(
184 [new SimpleObject(oFish, 1,1, 0,1)],
188 [stayClasses(clWater, 4), avoidClasses(clFood, 8)],
192 Engine.SetProgress(30);
194 createBumps(avoidClasses(clWater, 2, clPlayer, 5));
195 Engine.SetProgress(35);
197 log("Creating hills...");
198 createHills([tCliff, tCliff, tHill], avoidClasses(clPlayer, 5, clWater, 5, clHill, 15), clHill, scaleByMapSize(1, 4) * numPlayers);
199 Engine.SetProgress(40);
201 log("Creating forests...");
202 var [forestTrees, stragglerTrees] = getTreeCounts(500, 2500, 0.7);
204 [[tForestFloor, tGrass, pForestD], [tForestFloor, pForestD]],
205 [[tForestFloor, tGrass, pForestO], [tForestFloor, pForestO]],
206 [[tForestFloor, tGrass, pForestP], [tForestFloor, pForestP]]
208 var size = forestTrees / (scaleByMapSize(3,6) * numPlayers);
209 var num = Math.floor(size / types.length);
210 for (let type of types)
212 new ChainPlacer(1, Math.floor(scaleByMapSize(3, 5)), forestTrees / num, 0.5),
214 new LayeredPainter(type, [2]),
217 avoidClasses(clPlayer, 5, clWater, 3, clForest, 15, clHill, 1),
219 Engine.SetProgress(50);
221 log("Creating dirt patches...");
222 createLayeredPatches(
223 [scaleByMapSize(3, 6), scaleByMapSize(5, 10), scaleByMapSize(8, 21)],
224 [[tGrass,tGrassA],[tGrassA,tGrassB], [tGrassB,tGrassC]],
226 avoidClasses(clWater, 1, clForest, 0, clHill, 0, clDirt, 5, clPlayer, 1),
227 scaleByMapSize(15, 45),
229 Engine.SetProgress(55);
231 log("Creating grass patches...");
233 [scaleByMapSize(2, 4), scaleByMapSize(3, 7), scaleByMapSize(5, 15)],
235 avoidClasses(clWater, 1, clForest, 0, clHill, 0, clDirt, 5, clPlayer, 1),
236 scaleByMapSize(15, 45),
238 Engine.SetProgress(60);
240 log("Creating stone mines...");
243 [new SimpleObject(oStoneSmall, 0,2, 0,4), new SimpleObject(oStoneLarge, 1,1, 0,4)],
244 [new SimpleObject(oStoneSmall, 2,5, 1,3)]
246 avoidClasses(clWater, 0, clForest, 1, clPlayer, 5, clRock, 10, clHill, 1),
248 Engine.SetProgress(65);
250 log("Creating metal mines...");
253 [new SimpleObject(oMetalLarge, 1,1, 0,4)]
255 avoidClasses(clWater, 0, clForest, 1, clPlayer, 5, clMetal, 10, clRock, 5, clHill, 1),
258 Engine.SetProgress(70);
262 [new SimpleObject(aRockMedium, 1, 3, 0, 1)],
263 [new SimpleObject(aRockLarge, 1, 2, 0, 1), new SimpleObject(aRockMedium, 1, 3, 0, 2)],
264 [new SimpleObject(aGrassShort, 1, 2, 0, 1)],
265 [new SimpleObject(aGrass, 2, 4, 0, 1.8), new SimpleObject(aGrassShort, 3, 6, 1.2, 2.5)],
266 [new SimpleObject(aBushMedium, 1, 2, 0, 2), new SimpleObject(aBushSmall, 2, 4, 0, 2)]
269 scaleByMapSize(16, 262),
270 scaleByMapSize(8, 131),
271 scaleByMapSize(13, 200),
272 scaleByMapSize(13, 200),
273 scaleByMapSize(13, 200)
275 avoidClasses(clWater, 0, clForest, 0, clPlayer, 1, clHill, 0));
276 Engine.SetProgress(80);
280 [new SimpleObject(oSheep, 2, 3, 0, 2)],
281 [new SimpleObject(oDeer, 5, 7, 0, 4)]
287 avoidClasses(clWater, 0, clForest, 0, clPlayer, 6, clHill, 1, clFood, 20),
289 Engine.SetProgress(85);
293 [new SimpleObject(oBerryBush, 5, 7, 0, 4)]
296 randIntInclusive(1, 4) * numPlayers + 2
298 avoidClasses(clWater, 2, clForest, 0, clPlayer, 6, clHill, 1, clFood, 10),
301 Engine.SetProgress(90);
303 createStragglerTrees(
304 [oOak, oBeech, oPine],
305 avoidClasses(clWater, 1, clForest, 1, clHill, 1, clPlayer, 1, clMetal, 6, clRock, 6),
308 Engine.SetProgress(95);
310 placePlayersNomad(clPlayer, avoidClasses(clWater, 2, clHill, 2, clForest, 1, clMetal, 4, clRock, 4, clHill, 4, clFood, 2));
313 setWaterColor(0.157, 0.149, 0.443);
314 setWaterTint(0.443,0.42,0.824);
315 setWaterWaviness(2.0);
316 setWaterType("lake");
317 setWaterMurkiness(0.83);
320 setFogThickness(0.22);
321 setFogColor(0.82,0.82, 0.73);
322 setPPSaturation(0.56);