1 RMS.LoadLibrary("rmgen");
2 RMS.LoadLibrary("rmbiome");
6 const tMainTerrain = g_Terrains.mainTerrain;
7 const tForestFloor1 = g_Terrains.forestFloor1;
8 const tForestFloor2 = g_Terrains.forestFloor2;
9 const tCliff = g_Terrains.cliff;
10 const tTier1Terrain = g_Terrains.tier1Terrain;
11 const tTier2Terrain = g_Terrains.tier2Terrain;
12 const tTier3Terrain = g_Terrains.tier3Terrain;
13 const tHill = g_Terrains.hill;
14 const tRoad = g_Terrains.road;
15 const tRoadWild = g_Terrains.roadWild;
16 const tTier4Terrain = g_Terrains.tier4Terrain;
17 const tShore = g_Terrains.shore;
18 const tWater = g_Terrains.water;
20 const oTree1 = g_Gaia.tree1;
21 const oTree2 = g_Gaia.tree2;
22 const oTree3 = g_Gaia.tree3;
23 const oTree4 = g_Gaia.tree4;
24 const oTree5 = g_Gaia.tree5;
25 const oFruitBush = g_Gaia.fruitBush;
26 const oMainHuntableAnimal = g_Gaia.mainHuntableAnimal;
27 const oFish = g_Gaia.fish;
28 const oSecondaryHuntableAnimal = g_Gaia.secondaryHuntableAnimal;
29 const oStoneLarge = g_Gaia.stoneLarge;
30 const oStoneSmall = g_Gaia.stoneSmall;
31 const oMetalLarge = g_Gaia.metalLarge;
33 const aGrass = g_Decoratives.grass;
34 const aGrassShort = g_Decoratives.grassShort;
35 const aRockLarge = g_Decoratives.rockLarge;
36 const aRockMedium = g_Decoratives.rockMedium;
37 const aBushMedium = g_Decoratives.bushMedium;
38 const aBushSmall = g_Decoratives.bushSmall;
40 const pForest1 = [tForestFloor2 + TERRAIN_SEPARATOR + oTree1, tForestFloor2 + TERRAIN_SEPARATOR + oTree2, tForestFloor2];
41 const pForest2 = [tForestFloor1 + TERRAIN_SEPARATOR + oTree4, tForestFloor1 + TERRAIN_SEPARATOR + oTree5, tForestFloor1];
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 initTerrain(tMainTerrain);
60 var [playerIDs, playerX, playerZ] = radialPlayerPlacement();
62 for (var i = 0; i < numPlayers; i++)
64 var id = playerIDs[i];
65 log("Creating base for player " + id + "...");
67 var radius = scaleByMapSize(15,25);
71 // get the x and z in tiles
72 var fx = fractionToTiles(playerX[i]);
73 var fz = fractionToTiles(playerZ[i]);
76 addCivicCenterAreaToClass(ix, iz, clPlayer);
78 placeCivDefaultEntities(fx, fz, id);
80 placeDefaultChicken(fx, fz, clBaseResource);
82 // create berry bushes
83 var bbAngle = randFloat(0, TWO_PI);
85 var bbX = round(fx + bbDist * cos(bbAngle));
86 var bbZ = round(fz + bbDist * sin(bbAngle));
87 var group = new SimpleGroup(
88 [new SimpleObject(oFruitBush, 5,5, 0,3)],
89 true, clBaseResource, bbX, bbZ
91 createObjectGroup(group, 0);
95 while(abs(mAngle - bbAngle) < PI/3)
96 mAngle = randFloat(0, TWO_PI);
99 var mX = round(fx + mDist * cos(mAngle));
100 var mZ = round(fz + mDist * sin(mAngle));
101 group = new SimpleGroup(
102 [new SimpleObject(oMetalLarge, 1,1, 0,0)],
103 true, clBaseResource, mX, mZ
105 createObjectGroup(group, 0);
107 // create stone mines
108 mAngle += randFloat(PI/8, PI/4);
109 mX = round(fx + mDist * cos(mAngle));
110 mZ = round(fz + mDist * sin(mAngle));
111 group = new SimpleGroup(
112 [new SimpleObject(oStoneLarge, 1,1, 0,2)],
113 true, clBaseResource, mX, mZ
115 createObjectGroup(group, 0);
117 // create starting trees
119 var tAngle = randFloat(0, TWO_PI);
120 var tDist = randFloat(12, 13);
121 var tX = round(fx + tDist * cos(tAngle));
122 var tZ = round(fz + tDist * sin(tAngle));
123 group = new SimpleGroup(
124 [new SimpleObject(oTree1, num, num, 0,3)],
125 false, clBaseResource, tX, tZ
127 createObjectGroup(group, 0, avoidClasses(clBaseResource,2));
129 placeDefaultDecoratives(fx, fz, aGrassShort, clBaseResource, radius);
134 log("Creating the lake...")
138 Math.floor(scaleByMapSize(5, 16)),
139 Math.floor(scaleByMapSize(35, 200)),
141 Math.round(fractionToTiles(0.5)),
142 Math.round(fractionToTiles(0.5)),
144 [Math.floor(mapSize * 0.17 * Math.pow(scaleByMapSize(1, 6), 1/8))]),
146 new SmoothElevationPainter(ELEVATION_SET, -3, 4),
149 avoidClasses(clPlayer, 20));
151 log("Creating more shore jaggedness...");
153 new ChainPlacer(2, Math.floor(scaleByMapSize(4, 6)), 3, 1),
155 new LayeredPainter([tCliff, tHill], [2]),
156 unPaintClass(clWater)
158 borderClasses(clWater, 4, 7),
159 scaleByMapSize(12, 130) * 2,
162 paintTerrainBasedOnHeight(2.4, 3.4, 3, tMainTerrain);
163 paintTerrainBasedOnHeight(1, 2.4, 0, tShore);
164 paintTerrainBasedOnHeight(-8, 1, 2, tWater);
165 paintTileClassBasedOnHeight(-6, 0, 1, clWater);
167 for (var i = 0; i < numPlayers; ++i)
169 var fx = fractionToTiles(playerX[i]);
170 var fz = fractionToTiles(playerZ[i]);
174 // create the city patch
175 var cityRadius = radius/3;
176 var placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz);
177 var painter = new LayeredPainter([tRoadWild, tRoad], [1]);
178 createArea(placer, painter, null);
181 createBumps(avoidClasses(clWater, 2, clPlayer, 20));
184 createHills([tMainTerrain, tCliff, tHill], avoidClasses(clPlayer, 20, clHill, 15, clWater, 2), clHill, scaleByMapSize(1, 4) * numPlayers);
186 createMountains(tCliff, avoidClasses(clPlayer, 20, clHill, 15, clWater, 2), clHill, scaleByMapSize(1, 4) * numPlayers);
188 var [forestTrees, stragglerTrees] = getTreeCounts(...rBiomeTreeCount(1));
190 [tMainTerrain, tForestFloor1, tForestFloor2, pForest1, pForest2],
191 avoidClasses(clPlayer, 20, clForest, 17, clHill, 0, clWater, 2),
197 log("Creating dirt patches...");
198 createLayeredPatches(
199 [scaleByMapSize(3, 6), scaleByMapSize(5, 10), scaleByMapSize(8, 21)],
200 [[tMainTerrain,tTier1Terrain],[tTier1Terrain,tTier2Terrain], [tTier2Terrain,tTier3Terrain]],
202 avoidClasses(clWater, 3, clForest, 0, clHill, 0, clDirt, 5, clPlayer, 12),
203 scaleByMapSize(15, 45),
206 log("Creating grass patches...");
208 [scaleByMapSize(2, 4), scaleByMapSize(3, 7), scaleByMapSize(5, 15)],
210 avoidClasses(clWater, 3, clForest, 0, clHill, 0, clDirt, 5, clPlayer, 12),
211 scaleByMapSize(15, 45),
215 log("Creating stone mines...");
218 [new SimpleObject(oStoneSmall, 0,2, 0,4), new SimpleObject(oStoneLarge, 1,1, 0,4)],
219 [new SimpleObject(oStoneSmall, 2,5, 1,3)]
221 avoidClasses(clWater, 3, clForest, 1, clPlayer, 20, clRock, 10, clHill, 1),
224 log("Creating metal mines...");
227 [new SimpleObject(oMetalLarge, 1,1, 0,4)]
229 avoidClasses(clWater, 3, clForest, 1, clPlayer, 20, clMetal, 10, clRock, 5, clHill, 1),
237 if (currentBiome() == "tropic")
242 [[new SimpleObject(aRockMedium, 1,3, 0,1)],
243 [new SimpleObject(aRockLarge, 1,2, 0,1), new SimpleObject(aRockMedium, 1,3, 0,2)],
244 [new SimpleObject(aGrassShort, 1,2, 0,1, -PI/8,PI/8)],
245 [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)],
246 [new SimpleObject(aBushMedium, 1,2, 0,2), new SimpleObject(aBushSmall, 2,4, 0,2)]
249 scaleByMapSize(16, 262),
250 scaleByMapSize(8, 131),
251 planetm * scaleByMapSize(13, 200),
252 planetm * scaleByMapSize(13, 200),
253 planetm * scaleByMapSize(13, 200)
255 avoidClasses(clWater, 0, clForest, 0, clPlayer, 0, clHill, 0)
263 [new SimpleObject(oMainHuntableAnimal, 5,7, 0,4)],
264 [new SimpleObject(oSecondaryHuntableAnimal, 2,3, 0,2)]
270 avoidClasses(clWater, 3, clForest, 0, clPlayer, 20, clHill, 1, clFood, 20)
276 [new SimpleObject(oFruitBush, 5,7, 0,4)]
281 avoidClasses(clWater, 3, clForest, 0, clPlayer, 20, clHill, 1, clFood, 10)
287 [new SimpleObject(oFish, 2,3, 0,2)]
292 [avoidClasses(clFood, 20), stayClasses(clWater, 6)]
297 createStragglerTrees(
298 [oTree1, oTree2, oTree4, oTree3],
299 avoidClasses(clWater, 5, clForest, 7, clHill, 1, clPlayer, 12, clMetal, 6, clRock, 6),
303 setWaterWaviness(4.0);
304 setWaterType("lake");