1 RMS.LoadLibrary("rmgen");
10 setPPSaturation(0.48);
14 var tPrimary = ["alpine_dirt_grass_50"];
15 var tForestFloor = "alpine_forrestfloor";
16 var tCliff = ["alpine_cliff_a", "alpine_cliff_b", "alpine_cliff_c"];
17 var tSecondary = "alpine_grass_rocky";
18 var tHalfSnow = ["alpine_grass_snow_50", "alpine_dirt_snow"];
19 var tSnowLimited = ["alpine_snow_rocky"];
20 var tDirt = "alpine_dirt";
21 var tRoad = "new_alpine_citytile";
22 var tRoadWild = "new_alpine_citytile";
23 var tShore = "alpine_shore_rocks_grass_50";
24 var tWater = "alpine_shore_rocks";
27 var oPine = "gaia/flora_tree_pine";
28 var oBerryBush = "gaia/flora_bush_berry";
29 var oDeer = "gaia/fauna_deer";
30 var oFish = "gaia/fauna_fish";
31 var oRabbit = "gaia/fauna_rabbit";
32 var oStoneLarge = "gaia/geology_stonemine_alpine_quarry";
33 var oStoneSmall = "gaia/geology_stone_alpine_a";
34 var oMetalLarge = "gaia/geology_metal_alpine_slabs";
37 var aGrass = "actor|props/flora/grass_soft_small_tall.xml";
38 var aGrassShort = "actor|props/flora/grass_soft_large.xml";
39 var aRockLarge = "actor|geology/stone_granite_med.xml";
40 var aRockMedium = "actor|geology/stone_granite_med.xml";
41 var aBushMedium = "actor|props/flora/bush_medit_me.xml";
42 var aBushSmall = "actor|props/flora/bush_medit_sm.xml";
48 setFogThickness(0.19);
49 setPPSaturation(0.37);
52 var tPrimary = ["alpine_snow_a", "alpine_snow_b"];
53 var tForestFloor = "alpine_forrestfloor_snow";
54 var tCliff = ["alpine_cliff_snow"];
55 var tSecondary = "alpine_grass_snow_50";
56 var tHalfSnow = ["alpine_grass_snow_50", "alpine_dirt_snow"];
57 var tSnowLimited = ["alpine_snow_a", "alpine_snow_b"];
58 var tDirt = "alpine_dirt";
59 var tRoad = "new_alpine_citytile";
60 var tRoadWild = "new_alpine_citytile";
61 var tShore = "alpine_shore_rocks_icy";
62 var tWater = "alpine_shore_rocks";
65 var oPine = "gaia/flora_tree_pine_w";
66 var oBerryBush = "gaia/flora_bush_berry";
67 var oDeer = "gaia/fauna_deer";
68 var oFish = "gaia/fauna_fish";
69 var oRabbit = "gaia/fauna_rabbit";
70 var oStoneLarge = "gaia/geology_stonemine_alpine_quarry";
71 var oStoneSmall = "gaia/geology_stone_alpine_a";
72 var oMetalLarge = "gaia/geology_metal_alpine_slabs";
75 var aGrass = "actor|props/flora/grass_soft_dry_small_tall.xml";
76 var aGrassShort = "actor|props/flora/grass_soft_dry_large.xml";
77 var aRockLarge = "actor|geology/stone_granite_med.xml";
78 var aRockMedium = "actor|geology/stone_granite_med.xml";
79 var aBushMedium = "actor|props/flora/bush_medit_me_dry.xml";
80 var aBushSmall = "actor|props/flora/bush_medit_sm_dry.xml";
84 const pForest = [tForestFloor + TERRAIN_SEPARATOR + oPine, tForestFloor];
88 const numPlayers = getNumPlayers();
89 const mapSize = getMapSize();
91 var clPlayer = createTileClass();
92 var clHill = createTileClass();
93 var clForest = createTileClass();
94 var clWater = createTileClass();
95 var clDirt = createTileClass();
96 var clRock = createTileClass();
97 var clMetal = createTileClass();
98 var clFood = createTileClass();
99 var clBaseResource = createTileClass();
101 initTerrain(tPrimary);
103 var [playerIDs, playerX, playerZ] = radialPlayerPlacement();
105 for (var i = 0; i < numPlayers; i++)
107 var id = playerIDs[i];
108 log("Creating base for player " + id + "...");
110 var radius = scaleByMapSize(15,25);
114 // get the x and z in tiles
115 var fx = fractionToTiles(playerX[i]);
116 var fz = fractionToTiles(playerZ[i]);
119 addCivicCenterAreaToClass(ix, iz, clPlayer);
121 // create the city patch
122 var cityRadius = radius/3;
123 var placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz);
124 var painter = new LayeredPainter([tRoadWild, tRoad], [1]);
125 createArea(placer, painter, null);
127 placeCivDefaultEntities(fx, fz, id);
129 placeDefaultChicken(fx, fz, clBaseResource);
131 // create berry bushes
132 var bbAngle = randFloat(0, TWO_PI);
134 var bbX = round(fx + bbDist * cos(bbAngle));
135 var bbZ = round(fz + bbDist * sin(bbAngle));
136 var group = new SimpleGroup(
137 [new SimpleObject(oBerryBush, 5,5, 0,3)],
138 true, clBaseResource, bbX, bbZ
140 createObjectGroup(group, 0);
143 var mAngle = bbAngle;
144 while(abs(mAngle - bbAngle) < PI/3)
145 mAngle = randFloat(0, TWO_PI);
148 var mX = round(fx + mDist * cos(mAngle));
149 var mZ = round(fz + mDist * sin(mAngle));
150 group = new SimpleGroup(
151 [new SimpleObject(oMetalLarge, 1,1, 0,0)],
152 true, clBaseResource, mX, mZ
154 createObjectGroup(group, 0);
156 // create stone mines
157 mAngle += randFloat(PI/8, PI/4);
158 mX = round(fx + mDist * cos(mAngle));
159 mZ = round(fz + mDist * sin(mAngle));
160 group = new SimpleGroup(
161 [new SimpleObject(oStoneLarge, 1,1, 0,2)],
162 true, clBaseResource, mX, mZ
164 createObjectGroup(group, 0);
165 var hillSize = PI * radius * radius;
166 // create starting trees
167 var num = floor(hillSize / 100);
168 var tAngle = randFloat(-PI/3, 4*PI/3);
169 var tDist = randFloat(11, 13);
170 var tX = round(fx + tDist * cos(tAngle));
171 var tZ = round(fz + tDist * sin(tAngle));
172 group = new SimpleGroup(
173 [new SimpleObject(oPine, num, num, 0,5)],
174 false, clBaseResource, tX, tZ
176 createObjectGroup(group, 0, avoidClasses(clBaseResource,2));
178 placeDefaultDecoratives(fx, fz, aGrassShort, clBaseResource, radius);
183 log("Creating hills...");
184 createMountains(tCliff, avoidClasses(clPlayer, 20, clHill, 8), clHill, scaleByMapSize(10, 40) * numPlayers, floor(scaleByMapSize(40, 60)), floor(scaleByMapSize(4, 5)), floor(scaleByMapSize(7, 15)), floor(scaleByMapSize(5, 15)));
189 var playerConstraint = new AvoidTileClassConstraint(clPlayer, 20);
190 var waterConstraint = new AvoidTileClassConstraint(clWater, 8);
192 for (var x = 0; x < mapSize; ++x)
193 for (var z = 0; z < mapSize; ++z)
194 if (playerConstraint.allows(x, z) && waterConstraint.allows(x, z))
195 lakeAreas.push([x, z]);
199 log("Creating lakes...");
201 var numLakes = scaleByMapSize(5, 16);
202 for (var i = 0; i < numLakes; ++i)
204 lakeAreaLen = lakeAreas.length;
208 let chosenPoint = pickRandom(lakeAreas);
210 let newLake = createAreas(
211 new ChainPlacer(1, Math.floor(scaleByMapSize(4, 8)), Math.floor(scaleByMapSize(40, 180)), 0.7, chosenPoint[0], chosenPoint[1]),
213 new LayeredPainter([tShore, tWater, tWater], [1, 3]),
214 new SmoothElevationPainter(ELEVATION_SET, -5, 5),
217 avoidClasses(clPlayer, 20, clWater, 8),
221 if (newLake && newLake.length)
224 for (var j = 0; j < lakeAreaLen; ++j)
226 var x = lakeAreas[j][0], z = lakeAreas[j][1];
227 if (playerConstraint.allows(x, z) && waterConstraint.allows(x, z))
228 lakeAreas[n++] = lakeAreas[j];
230 lakeAreas.length = n;
234 paintTerrainBasedOnHeight(3, floor(scaleByMapSize(20, 40)), 0, tCliff);
235 paintTerrainBasedOnHeight(floor(scaleByMapSize(20, 40)), 100, 3, tSnowLimited);
237 createBumps(avoidClasses(clWater, 2, clPlayer, 20));
239 var [forestTrees, stragglerTrees] = getTreeCounts(500, 3000, 0.7);
241 [tPrimary, tForestFloor, tForestFloor, pForest, pForest],
242 avoidClasses(clPlayer, 20, clForest, 17, clHill, 0, clWater, 2),
248 log("Creating dirt patches...");
249 createLayeredPatches(
250 [scaleByMapSize(3, 6), scaleByMapSize(5, 10), scaleByMapSize(8, 21)],
251 [[tDirt,tHalfSnow], [tHalfSnow,tSnowLimited]],
253 avoidClasses(clWater, 3, clForest, 0, clHill, 0, clDirt, 5, clPlayer, 12),
254 scaleByMapSize(15, 45),
257 log("Creating grass patches...");
259 [scaleByMapSize(2, 4), scaleByMapSize(3, 7), scaleByMapSize(5, 15)],
261 avoidClasses(clWater, 3, clForest, 0, clHill, 0, clDirt, 5, clPlayer, 12),
262 scaleByMapSize(15, 45),
266 log("Creating stone mines...");
269 [new SimpleObject(oStoneSmall, 0,2, 0,4), new SimpleObject(oStoneLarge, 1,1, 0,4)],
270 [new SimpleObject(oStoneSmall, 2,5, 1,3)]
272 avoidClasses(clWater, 3, clForest, 1, clPlayer, 20, clRock, 10, clHill, 1),
275 log("Creating metal mines...");
278 [new SimpleObject(oMetalLarge, 1,1, 0,4)]
280 avoidClasses(clWater, 3, clForest, 1, clPlayer, 20, clMetal, 10, clRock, 5, clHill, 1),
288 [[new SimpleObject(aRockMedium, 1,3, 0,1)],
289 [new SimpleObject(aRockLarge, 1,2, 0,1), new SimpleObject(aRockMedium, 1,3, 0,2)],
290 [new SimpleObject(aGrassShort, 1,2, 0,1, -PI/8,PI/8)],
291 [new SimpleObject(aGrass, 2,4, 0,1.8, -PI/8,PI/8), new SimpleObject(aGrassShort, 3,6, 1.2,2.5, -PI/8,PI/8)],
292 [new SimpleObject(aBushMedium, 1,2, 0,2), new SimpleObject(aBushSmall, 2,4, 0,2)]
295 scaleByMapSize(16, 262),
296 scaleByMapSize(8, 131),
297 scaleByMapSize(13, 200),
298 scaleByMapSize(13, 200),
299 scaleByMapSize(13, 200)
301 avoidClasses(clWater, 0, clForest, 0, clPlayer, 0, clHill, 0)
309 [new SimpleObject(oDeer, 5,7, 0,4)],
310 [new SimpleObject(oRabbit, 2,3, 0,2)]
316 avoidClasses(clWater, 3, clForest, 0, clPlayer, 20, clHill, 1, clFood, 20)
322 [new SimpleObject(oBerryBush, 5,7, 0,4)]
325 randIntInclusive(1, 4) * numPlayers + 2
327 avoidClasses(clWater, 3, clForest, 0, clPlayer, 20, clHill, 1, clFood, 10)
333 [new SimpleObject(oFish, 2,3, 0,2)]
338 [avoidClasses(clFood, 20), stayClasses(clWater, 6)]
343 createStragglerTrees(
345 avoidClasses(clWater, 5, clForest, 3, clHill, 1, clPlayer, 12, clMetal, 6, clRock, 6),
349 setSkySet(pickRandom(["cirrus", "cumulus", "sunny"]));
350 setSunRotation(randFloat(0, TWO_PI));
351 setSunElevation(randFloat(PI/ 5, PI / 3));
352 setWaterColor(0.0, 0.047, 0.286); // dark majestic blue
353 setWaterTint(0.471, 0.776, 0.863); // light blue
354 setWaterMurkiness(0.82);
355 setWaterWaviness(3.0);
356 setWaterType("clap");