1 RMS.LoadLibrary("rmgen");
2 RMS.LoadLibrary("rmbiome");
4 TILE_CENTERED_HEIGHT_MAP = true;
8 const tMainTerrain = g_Terrains.mainTerrain;
9 const tForestFloor1 = g_Terrains.forestFloor1;
10 const tForestFloor2 = g_Terrains.forestFloor2;
11 const tCliff = g_Terrains.cliff;
12 const tTier1Terrain = g_Terrains.tier1Terrain;
13 const tTier2Terrain = g_Terrains.tier2Terrain;
14 const tTier3Terrain = g_Terrains.tier3Terrain;
15 const tHill = g_Terrains.mainTerrain;
16 const tRoad = g_Terrains.road;
17 const tRoadWild = g_Terrains.roadWild;
18 const tTier4Terrain = g_Terrains.tier4Terrain;
19 const tShore = g_Terrains.shore;
20 const tWater = g_Terrains.water;
22 const oTree1 = g_Gaia.tree1;
23 const oTree2 = g_Gaia.tree2;
24 const oTree3 = g_Gaia.tree3;
25 const oTree4 = g_Gaia.tree4;
26 const oTree5 = g_Gaia.tree5;
27 const oFruitBush = g_Gaia.fruitBush;
28 const oMainHuntableAnimal = g_Gaia.mainHuntableAnimal;
29 const oFish = g_Gaia.fish;
30 const oSecondaryHuntableAnimal = g_Gaia.secondaryHuntableAnimal;
31 const oStoneLarge = g_Gaia.stoneLarge;
32 const oStoneSmall = g_Gaia.stoneSmall;
33 const oMetalLarge = g_Gaia.metalLarge;
35 const aGrass = g_Decoratives.grass;
36 const aGrassShort = g_Decoratives.grassShort;
37 const aRockLarge = g_Decoratives.rockLarge;
38 const aRockMedium = g_Decoratives.rockMedium;
39 const aBushMedium = g_Decoratives.bushMedium;
40 const aBushSmall = g_Decoratives.bushSmall;
42 const pForest1 = [tForestFloor2 + TERRAIN_SEPARATOR + oTree1, tForestFloor2 + TERRAIN_SEPARATOR + oTree2, tForestFloor2];
43 const pForest2 = [tForestFloor1 + TERRAIN_SEPARATOR + oTree4, tForestFloor1 + TERRAIN_SEPARATOR + oTree5, tForestFloor1];
47 const numPlayers = getNumPlayers();
48 const mapSize = getMapSize();
49 const mapArea = mapSize*mapSize;
51 var clPlayer = createTileClass();
52 var clHill = createTileClass();
53 var clForest = createTileClass();
54 var clWater = createTileClass();
55 var clDirt = createTileClass();
56 var clRock = createTileClass();
57 var clMetal = createTileClass();
58 var clFood = createTileClass();
59 var clBaseResource = createTileClass();
61 initTerrain(tMainTerrain);
63 var [playerIDs, playerX, playerZ, playerAngle, startAngle] = radialPlayerPlacement();
65 for (var i = 0; i < numPlayers; i++)
67 var id = playerIDs[i];
68 log("Creating base for player " + id + "...");
70 var radius = scaleByMapSize(15,25);
74 // get the x and z in tiles
75 var fx = fractionToTiles(playerX[i]);
76 var fz = fractionToTiles(playerZ[i]);
79 addCivicCenterAreaToClass(ix, iz, clPlayer);
81 // create the city patch
82 var cityRadius = radius/3;
83 placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz);
84 var painter = new LayeredPainter([tRoadWild, tRoad], [1]);
85 createArea(placer, painter, null);
87 placeCivDefaultEntities(fx, fz, id, { 'iberWall': 'towers' });
89 placeDefaultChicken(fx, fz, clBaseResource);
91 // create berry bushes
92 var bbAngle = randFloat(0, TWO_PI);
94 var bbX = round(fx + bbDist * cos(bbAngle));
95 var bbZ = round(fz + bbDist * sin(bbAngle));
96 var group = new SimpleGroup(
97 [new SimpleObject(oFruitBush, 5,5, 0,3)],
98 true, clBaseResource, bbX, bbZ
100 createObjectGroup(group, 0);
103 var mAngle = bbAngle;
104 while(abs(mAngle - bbAngle) < PI/3)
105 mAngle = randFloat(0, TWO_PI);
108 var mX = round(fx + mDist * cos(mAngle));
109 var mZ = round(fz + mDist * sin(mAngle));
110 group = new SimpleGroup(
111 [new SimpleObject(oMetalLarge, 1,1, 0,0)],
112 true, clBaseResource, mX, mZ
114 createObjectGroup(group, 0);
116 // create stone mines
117 mAngle += randFloat(PI/8, PI/4);
118 mX = round(fx + mDist * cos(mAngle));
119 mZ = round(fz + mDist * sin(mAngle));
120 group = new SimpleGroup(
121 [new SimpleObject(oStoneLarge, 1,1, 0,2)],
122 true, clBaseResource, mX, mZ
124 createObjectGroup(group, 0);
126 // create starting trees
128 var tAngle = randFloat(0, TWO_PI);
129 var tDist = randFloat(12, 13);
130 var tX = round(fx + tDist * cos(tAngle));
131 var tZ = round(fz + tDist * sin(tAngle));
132 group = new SimpleGroup(
133 [new SimpleObject(oTree1, num, num, 0,3)],
134 false, clBaseResource, tX, tZ
136 createObjectGroup(group, 0, avoidClasses(clBaseResource,2));
138 placeDefaultDecoratives(fx, fz, aGrassShort, clBaseResource, radius);
144 if (mapSize == 128 && numPlayers <= 2)
146 else if (mapSize == 192 && numPlayers <= 3)
148 else if (mapSize == 256)
152 else if (numPlayers == 4)
155 else if (mapSize == 320)
159 else if (numPlayers == 4)
162 else if (mapSize == 384)
166 else if (numPlayers == 4)
168 else if (numPlayers == 5)
171 else if (mapSize == 448)
175 else if (numPlayers <= 4)
177 else if (numPlayers == 5)
179 else if (numPlayers == 6)
183 log ("Creating big circular lake...");
184 var center = Math.round(fractionToTiles(0.5));
186 new ClumpPlacer(mapArea * 0.23, 1, 1, 10, center, center),
187 new SmoothElevationPainter(ELEVATION_SET, -3, 4),
190 for (let m = 0; m < numPlayers * split; ++m)
192 log("Creating rivers between players...");
193 let angle = startAngle + (m + 0.5) * 2 * Math.PI / (numPlayers * split);
196 fractionToTiles(0.5 + 0.15 * Math.cos(angle)),
197 fractionToTiles(0.5 + 0.15 * Math.sin(angle)),
198 fractionToTiles(0.5 + 0.6 * Math.cos(angle)),
199 fractionToTiles(0.5 + 0.6 * Math.sin(angle)),
200 scaleByMapSize(14, 40),
202 3 * scaleByMapSize(1, 3),
205 new SmoothElevationPainter(ELEVATION_SET, -4, 4),
206 avoidClasses(clPlayer, 5));
208 log("Create path from the island to the center...");
209 angle = startAngle + m * 2 * Math.PI / (numPlayers * split);
212 fractionToTiles(0.5 + 0.05 * Math.cos(angle)),
213 fractionToTiles(0.5 + 0.05 * Math.sin(angle)),
214 fractionToTiles(0.5 + 0.49 * Math.cos(angle)),
215 fractionToTiles(0.5 + 0.49 * Math.sin(angle)),
216 scaleByMapSize(10, 40),
218 3 * scaleByMapSize(1, 3),
221 new SmoothElevationPainter(ELEVATION_SET, 3, 4),
225 log("Creating ring of land connecting players...");
227 new ClumpPlacer(mapArea * 0.15, 1, 1, 10, center, center),
228 new SmoothElevationPainter(ELEVATION_SET, 4, 4),
231 log("Creating ring of water separating the central hill from the ring...");
233 new ClumpPlacer(mapArea * 0.09, 1, 1, 10, center, center),
234 new SmoothElevationPainter(ELEVATION_SET, -2, 3),
237 log("Creating central island...");
239 new ClumpPlacer(Math.square(mapSize - 50) * 0.09, 1, 1, 10, center, center),
240 new SmoothElevationPainter(ELEVATION_SET, 4, 3),
243 log("Creating hill on the central island...");
245 new ClumpPlacer(Math.pow(scaleByMapSize(6, 18), 2) * 22, 1, 1, 10, center, center),
246 new SmoothElevationPainter(ELEVATION_SET, 20, 8),
249 paintTerrainBasedOnHeight(-6, 1, 1, tWater);
250 paintTerrainBasedOnHeight(1, 2, 1, tShore);
251 paintTerrainBasedOnHeight(2, 21, 1, tMainTerrain);
253 paintTileClassBasedOnHeight(-6, 0.5, 1, clWater);
255 for (var i = 0; i < numPlayers; i++)
257 fx = fractionToTiles(playerX[i]);
258 fz = fractionToTiles(playerZ[i]);
262 // create the city patch
263 var cityRadius = radius/3;
264 var placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz);
265 var painter = new LayeredPainter([tRoadWild, tRoad], [1]);
266 createArea(placer, painter, null);
270 createHills([tMainTerrain, tCliff, tHill], avoidClasses(clPlayer, 20, clHill, 15, clWater, 2), clHill, scaleByMapSize(1, 4) * numPlayers);
272 createMountains(tCliff, avoidClasses(clPlayer, 20, clHill, 15, clWater, 2), clHill, scaleByMapSize(1, 4) * numPlayers);
275 [tMainTerrain, tForestFloor1, tForestFloor2, pForest1, pForest2],
276 avoidClasses(clPlayer, 20, clForest, 17, clHill, 0, clWater, 2),
279 ...rBiomeTreeCount(1));
283 log("Creating dirt patches...");
284 createLayeredPatches(
285 [scaleByMapSize(3, 6), scaleByMapSize(5, 10), scaleByMapSize(8, 21)],
286 [[tMainTerrain,tTier1Terrain],[tTier1Terrain,tTier2Terrain], [tTier2Terrain,tTier3Terrain]],
288 avoidClasses(clWater, 3, clForest, 0, clHill, 0, clDirt, 5, clPlayer, 12)
291 log("Creating grass patches...");
293 [scaleByMapSize(2, 4), scaleByMapSize(3, 7), scaleByMapSize(5, 15)],
295 avoidClasses(clWater, 3, clForest, 0, clHill, 0, clDirt, 5, clPlayer, 12)
300 log("Creating stone mines...");
303 [new SimpleObject(oStoneSmall, 0,2, 0,4), new SimpleObject(oStoneLarge, 1,1, 0,4)],
304 [new SimpleObject(oStoneSmall, 2,5, 1,3)]
306 avoidClasses(clWater, 3, clForest, 1, clPlayer, 20, clRock, 10, clHill, 1)
309 log("Creating metal mines...");
312 [new SimpleObject(oMetalLarge, 1,1, 0,4)]
314 avoidClasses(clWater, 3, clForest, 1, clPlayer, 20, clMetal, 10, clRock, 5, clHill, 1),
318 log("Creating fish...");
319 createObjectGroupsDeprecated(
320 new SimpleGroup([new SimpleObject(oFish, 1,1, 0,3)], true, clFood),
322 [stayClasses(clWater, 8), avoidClasses(clFood, 14)],
323 scaleByMapSize(400, 2000),
330 if (currentBiome() == "tropic")
335 [[new SimpleObject(aRockMedium, 1,3, 0,1)],
336 [new SimpleObject(aRockLarge, 1,2, 0,1), new SimpleObject(aRockMedium, 1,3, 0,2)],
337 [new SimpleObject(aGrassShort, 1,2, 0,1, -PI/8,PI/8)],
338 [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)],
339 [new SimpleObject(aBushMedium, 1,2, 0,2), new SimpleObject(aBushSmall, 2,4, 0,2)]
342 scaleByMapSize(16, 262),
343 scaleByMapSize(8, 131),
344 planetm * scaleByMapSize(13, 200),
345 planetm * scaleByMapSize(13, 200),
346 planetm * scaleByMapSize(13, 200)
348 avoidClasses(clWater, 0, clForest, 0, clPlayer, 0, clHill, 0)
356 [new SimpleObject(oMainHuntableAnimal, 5,7, 0,4)],
357 [new SimpleObject(oSecondaryHuntableAnimal, 2,3, 0,2)]
363 avoidClasses(clWater, 3, clForest, 0, clPlayer, 20, clHill, 1, clFood, 20)
369 [new SimpleObject(oFruitBush, 5,7, 0,4)]
374 avoidClasses(clWater, 3, clForest, 0, clPlayer, 20, clHill, 1, clFood, 10)
377 createStragglerTrees(
378 [oTree1, oTree2, oTree4, oTree3],
379 avoidClasses(clWater, 5, clForest, 7, clHill, 1, clPlayer, 12, clMetal, 6, clRock, 6));