1 Engine.LoadLibrary("rmgen");
3 var tPrimary = ["polar_snow_a"];
4 var tCliff = ["polar_cliff_a", "polar_cliff_b", "polar_cliff_snow"];
5 var tSecondary = "polar_snow_glacial";
6 var tHalfSnow = ["ice_01", "ice_dirt"];
7 var tSnowLimited = ["polar_snow_b", "polar_ice"];
8 var tDirt = "ice_dirt";
9 var tRoad = "polar_ice_b";
10 var tRoadWild = "polar_ice_cracked";
11 var tShore = "polar_ice_snow";
12 var tWater = "polar_ice_c";
14 var oArcticFox = "gaia/fauna_fox_arctic";
15 var oArcticWolf = "trigger/fauna_arctic_wolf_attack";
16 var oMuskox = "gaia/fauna_muskox";
17 var oWalrus = "gaia/fauna_walrus";
18 var oWhaleFin = "gaia/fauna_whale_fin";
19 var oWhaleHumpback = "gaia/fauna_whale_humpback";
20 var oFish = "gaia/fauna_fish";
21 var oStoneLarge = "gaia/geology_stonemine_medit_quarry";
22 var oStoneSmall = "gaia/geology_stone_alpine_a";
23 var oMetalLarge = "gaia/geology_metal_desert_badlands_slabs";
24 var oWoodTreasure = "gaia/special_treasure_wood";
25 var oMarket = "skirmish/structures/default_market";
27 var aRockLarge = "actor|geology/stone_granite_med.xml";
28 var aRockMedium = "actor|geology/stone_granite_med.xml";
29 var aIceberg = "actor|props/special/eyecandy/iceberg.xml";
33 const numPlayers = getNumPlayers();
34 const mapSize = getMapSize();
36 var clPlayer = createTileClass();
37 var clWater = createTileClass();
38 var clDirt = createTileClass();
39 var clRock = createTileClass();
40 var clMetal = createTileClass();
41 var clHill = createTileClass();
42 var clFood = createTileClass();
43 var clBaseResource = createTileClass();
44 var clArcticWolf = createTileClass();
46 var [playerIDs, playerX, playerZ] = playerPlacementCircle(0.35);
49 "template": oWoodTreasure,
50 "count": isNomad() ? 16 : 14
53 log("Creating player markets...");
55 for (let i = 0; i < numPlayers; ++i)
57 let marketPos = Vector2D.add(new Vector2D(playerX[i], playerZ[i]).mult(mapSize), new Vector2D(12, 0).rotate(randFloat(0, 2 * Math.PI))).round();
58 placeObject(marketPos.x, marketPos.y, oMarket, playerIDs[i], BUILDING_ORIENTATION);
59 addCivicCenterAreaToClass(marketPos.x, marketPos.y, clBaseResource);
63 "PlayerPlacement": [playerIDs, playerX, playerZ],
64 "PlayerTileClass": clPlayer,
65 "BaseResourceClass": clBaseResource,
68 "outerTerrain": tRoadWild,
74 // No berries, no trees, no decoratives
77 { "template": oMetalLarge },
78 { "template": oStoneLarge }
85 Engine.SetProgress(30);
87 log("Creating central lake...");
91 Math.floor(scaleByMapSize(5, 16)),
92 Math.floor(scaleByMapSize(35, 200)),
94 Math.round(fractionToTiles(0.5)),
95 Math.round(fractionToTiles(0.5)),
97 [Math.floor(mapSize * 0.17)]),
99 new LayeredPainter([tShore, tWater, tWater, tWater], [1, 4, 2]),
100 new SmoothElevationPainter(ELEVATION_SET, -4, 4),
103 avoidClasses(clPlayer, 20));
105 paintTerrainBasedOnHeight(3, Math.floor(scaleByMapSize(20, 40)), 0, tCliff);
106 paintTerrainBasedOnHeight(Math.floor(scaleByMapSize(20, 40)), 100, 3, tSnowLimited);
107 Engine.SetProgress(40);
109 log("Creating small lakes...");
111 var playerConstraint = new AvoidTileClassConstraint(clPlayer, 20);
112 var waterConstraint = new AvoidTileClassConstraint(clWater, 8);
113 for (let x = 0; x < mapSize; ++x)
114 for (let z = 0; z < mapSize; ++z)
115 if (playerConstraint.allows(x, z) && waterConstraint.allows(x, z))
116 lakeAreas.push([x, z]);
118 var numLakes = scaleByMapSize(10, 16);
119 for (let i = 0; i < numLakes ; ++i)
121 let chosenPoint = pickRandom(lakeAreas);
128 Math.floor(scaleByMapSize(2, 4)),
129 Math.floor(scaleByMapSize(20, 140)),
134 new LayeredPainter([tShore, tWater, tWater], [1, 3]),
135 new SmoothElevationPainter(ELEVATION_SET, -5, 5),
138 avoidClasses(clPlayer, 20),
142 Engine.SetProgress(50);
144 createBumps(avoidClasses(clWater, 2, clPlayer, 20));
145 Engine.SetProgress(60);
147 log("Creating hills...");
149 [tPrimary, tPrimary, tSecondary],
150 avoidClasses(clPlayer, 20, clHill, 35),
151 clHill, scaleByMapSize(20, 240));
152 Engine.SetProgress(65);
154 log("Creating dirt patches...");
155 createLayeredPatches(
156 [scaleByMapSize(3, 6), scaleByMapSize(5, 10), scaleByMapSize(8, 21)],
157 [[tDirt,tHalfSnow], [tHalfSnow,tSnowLimited]],
159 avoidClasses(clWater, 3, clDirt, 5, clPlayer, 12),
160 scaleByMapSize(15, 45),
163 log("Creating glacier patches...");
165 [scaleByMapSize(2, 4), scaleByMapSize(3, 7), scaleByMapSize(5, 15)],
167 avoidClasses(clWater, 3, clDirt, 5, clPlayer, 12),
168 scaleByMapSize(15, 45),
170 Engine.SetProgress(70);
172 log("Creating stone mines...");
175 [new SimpleObject(oStoneSmall, 0,2, 0,4), new SimpleObject(oStoneLarge, 1,1, 0,4)],
176 [new SimpleObject(oStoneSmall, 2,5, 1,3)]
178 avoidClasses(clWater, 3, clPlayer, 20, clRock, 18, clHill, 2),
181 log("Creating metal mines...");
184 [new SimpleObject(oMetalLarge, 1,1, 0,4)]
186 avoidClasses(clWater, 3, clPlayer, 20, clMetal, 18, clRock, 5, clHill, 2),
188 Engine.SetProgress(75);
193 new SimpleObject(aRockMedium, 1, 3, 0, 1)
196 new SimpleObject(aRockLarge, 1, 2, 0, 1),
197 new SimpleObject(aRockMedium, 1, 3, 0, 2)
201 scaleByMapSize(16, 262),
202 scaleByMapSize(8, 131),
204 avoidClasses(clWater, 0, clPlayer, 0));
208 [new SimpleObject(aIceberg, 1, 1, 1, 1)]
211 scaleByMapSize(8, 131)
213 [stayClasses(clWater, 4), avoidClasses(clHill, 2)]);
214 Engine.SetProgress(80);
218 [new SimpleObject(oArcticFox, 1, 2, 0, 3)],
219 [new SimpleObject(isNomad() ? oArcticFox : oArcticWolf, 4, 6, 0, 4)],
220 [new SimpleObject(oWalrus, 2, 3, 0, 2)],
221 [new SimpleObject(oMuskox, 2, 3, 0, 2)]
229 avoidClasses(clPlayer, 35, clFood, 16, clWater, 2, clMetal, 4, clRock, 4, clHill, 2),
234 [new SimpleObject(oWhaleFin, 1, 2, 0, 2)],
235 [new SimpleObject(oWhaleHumpback, 1, 2, 0, 2)]
238 scaleByMapSize(1, 6) * 3,
239 scaleByMapSize(1, 6) * 3,
241 [avoidClasses(clFood, 20, clHill, 5), stayClasses(clWater, 6)],
246 [new SimpleObject(oFish, 2, 3, 0, 2)]
251 [avoidClasses(clFood, 12, clHill, 5), stayClasses(clWater, 6)],
253 Engine.SetProgress(85);
255 // Create trigger points where wolves spawn
256 createObjectGroupsDeprecated(
257 new SimpleGroup([new SimpleObject("trigger/trigger_point_A", 1, 1, 0, 0)], true, clArcticWolf),
259 avoidClasses(clWater, 2, clMetal, 4, clRock, 4, clPlayer, 15, clHill, 2, clArcticWolf, 20),
262 Engine.SetProgress(95);
266 setSkySet("sunset 1");
267 setSunColor(0.8, 0.7, 0.6);
268 setTerrainAmbientColor(0.7, 0.6, 0.7);
269 setUnitsAmbientColor(0.6, 0.5, 0.6);
270 setSunElevation(Math.PI * randFloat(1/24, 1/7));
274 setSkySet(pickRandom(["cumulus", "rain", "mountainous", "overcast", "rain", "stratus"]));
275 setSunElevation(Math.PI * randFloat(1/9, 1/7));
280 let constraint = avoidClasses(clWater, 4, clMetal, 4, clRock, 4, clHill, 4, clFood, 2);
281 [playerIDs, playerX, playerZ] = placePlayersNomad(clPlayer, constraint);
283 for (let i = 0; i < numPlayers; ++i)
284 placePlayerBaseTreasures({
285 "playerID": playerIDs[i],
286 "playerX": tilesToFraction(playerX[i]),
287 "playerZ": tilesToFraction(playerZ[i]),
288 "BaseResourceClass": clBaseResource,
289 "baseResourceConstraint": constraint,
294 setSunRotation(randFloat(0, 2 * Math.PI));
296 setWaterColor(0.3, 0.3, 0.4);
297 setWaterTint(0.75, 0.75, 0.75);
298 setWaterMurkiness(0.92);
299 setWaterWaviness(0.5);
300 setWaterType("clap");
302 setFogThickness(0.76);
307 setPPSaturation(0.45);