1 RMS.LoadLibrary("rmgen");
3 TILE_CENTERED_HEIGHT_MAP = true;
5 var random_terrain = randomizeBiome();
7 const tMainTerrain = rBiomeT1();
8 const tForestFloor1 = rBiomeT2();
9 const tForestFloor2 = rBiomeT3();
10 const tCliff = rBiomeT4();
11 const tTier1Terrain = rBiomeT5();
12 const tTier2Terrain = rBiomeT6();
13 const tTier3Terrain = rBiomeT7();
14 const tHill = rBiomeT8();
15 const tTier4Terrain = rBiomeT9();
16 const tRoad = rBiomeT10();
17 const tRoadWild = rBiomeT11();
18 const tTier5Terrain = rBiomeT12();
19 const tShoreBlend = rBiomeT13();
20 const tShore = rBiomeT14();
21 const tWater = rBiomeT15();
24 const oTree1 = rBiomeE1();
25 const oTree2 = rBiomeE2();
26 const oTree3 = rBiomeE3();
27 const oTree4 = rBiomeE4();
28 const oTree5 = rBiomeE5();
29 const oFruitBush = rBiomeE6();
30 const oMainHuntableAnimal = rBiomeE8();
31 const oFish = rBiomeE9();
32 const oSecondaryHuntableAnimal = rBiomeE10();
33 const oStoneLarge = rBiomeE11();
34 const oStoneSmall = rBiomeE12();
35 const oMetalLarge = rBiomeE13();
36 const oWood = "gaia/special_treasure_wood";
39 const aGrass = rBiomeA1();
40 const aGrassShort = rBiomeA2();
41 const aReeds = rBiomeA3();
42 const aLillies = rBiomeA4();
43 const aRockLarge = rBiomeA5();
44 const aRockMedium = rBiomeA6();
45 const aBushMedium = rBiomeA7();
46 const aBushSmall = rBiomeA8();
48 const pForest1 = [tForestFloor2 + TERRAIN_SEPARATOR + oTree1, tForestFloor2 + TERRAIN_SEPARATOR + oTree2, tForestFloor2];
49 const pForest2 = [tForestFloor1 + TERRAIN_SEPARATOR + oTree4, tForestFloor1 + TERRAIN_SEPARATOR + oTree5, tForestFloor1];
51 log("Initializing map...");
54 const numPlayers = getNumPlayers();
55 const mapSize = getMapSize();
56 const mapArea = mapSize*mapSize;
58 var clPlayer = createTileClass();
59 var clHill = createTileClass();
60 var clForest = createTileClass();
61 var clDirt = createTileClass();
62 var clRock = createTileClass();
63 var clMetal = createTileClass();
64 var clFood = createTileClass();
65 var clBaseResource = createTileClass();
66 var clSettlement = createTileClass();
67 var clLand = createTileClass();
70 for (var i = 0; i < numPlayers; i++)
73 playerIDs = sortPlayers(playerIDs);
76 var playerX = new Array(numPlayers);
77 var playerZ = new Array(numPlayers);
78 var playerAngle = new Array(numPlayers);
80 var startAngle = randFloat(0, TWO_PI);
81 for (var i = 0; i < numPlayers; i++)
83 playerAngle[i] = startAngle + i*TWO_PI/numPlayers;
84 playerX[i] = 0.5 + 0.35*cos(playerAngle[i]);
85 playerZ[i] = 0.5 + 0.35*sin(playerAngle[i]);
88 for (var i = 0; i < numPlayers; i++)
90 var id = playerIDs[i];
91 log("Creating base for player " + id + "...");
94 var radius = scaleByMapSize(22,31);
98 var hillSize = PI * radius * radius;
99 // get the x and z in tiles
100 var fx = fractionToTiles(playerX[i]);
101 var fz = fractionToTiles(playerZ[i]);
105 // create the main island
106 var placer = new ChainPlacer(2, floor(scaleByMapSize(5, 10)), floor(scaleByMapSize(25, 60)), 1, ix, iz, 0, [floor(radius)]);
107 var terrainPainter = new LayeredPainter(
108 [tMainTerrain , tMainTerrain, tMainTerrain], // terrains
109 [1, shoreRadius] // widths
111 var elevationPainter = new SmoothElevationPainter(
112 ELEVATION_SET, // type
113 elevation, // elevation
114 shoreRadius // blend radius
116 createArea(placer, [terrainPainter, elevationPainter, paintClass(clPlayer)], null);
118 placeCivDefaultEntities(fx, fz, id, { 'iberWall': 'towers' });
120 placeDefaultChicken(fx, fz, clBaseResource);
122 // create berry bushes
123 var bbAngle = randFloat(0, TWO_PI);
125 var bbX = round(fx + bbDist * cos(bbAngle));
126 var bbZ = round(fz + bbDist * sin(bbAngle));
127 var group = new SimpleGroup(
128 [new SimpleObject(oFruitBush, 5,5, 0,3)],
129 true, clBaseResource, bbX, bbZ
131 createObjectGroup(group, 0);
134 var bbAngle = randFloat(0, TWO_PI);
136 var bbX = round(fx + bbDist * cos(bbAngle));
137 var bbZ = round(fz + bbDist * sin(bbAngle));
138 group = new SimpleGroup(
139 [new SimpleObject(oWood, 14,14, 0,3)],
140 true, clBaseResource, bbX, bbZ
142 createObjectGroup(group, 0);
145 var mAngle = bbAngle;
146 while(abs(mAngle - bbAngle) < PI/3)
147 mAngle = randFloat(0, TWO_PI);
150 var mX = round(fx + mDist * cos(mAngle));
151 var mZ = round(fz + mDist * sin(mAngle));
152 group = new SimpleGroup(
153 [new SimpleObject(oMetalLarge, 1,1, 0,0)],
154 true, clBaseResource, mX, mZ
156 createObjectGroup(group, 0);
158 // create stone mines
159 mAngle += randFloat(PI/8, PI/4);
160 mX = round(fx + mDist * cos(mAngle));
161 mZ = round(fz + mDist * sin(mAngle));
162 group = new SimpleGroup(
163 [new SimpleObject(oStoneLarge, 1,1, 0,2)],
164 true, clBaseResource, mX, mZ
166 createObjectGroup(group, 0);
168 // create starting trees
169 var num = floor(hillSize / 100);
170 var tAngle = randFloat(-PI/3, 4*PI/3);
171 var tDist = randFloat(11, 13);
172 var tX = round(fx + tDist * cos(tAngle));
173 var tZ = round(fz + tDist * sin(tAngle));
174 group = new SimpleGroup(
175 [new SimpleObject(oTree1, num, num, 0,5)],
176 false, clBaseResource, tX, tZ
178 createObjectGroup(group, 0, avoidClasses(clBaseResource,2));
180 // create grass tufts
181 var num = hillSize / 250;
182 for (var j = 0; j < num; j++)
184 var gAngle = randFloat(0, TWO_PI);
185 var gDist = radius - (5 + randInt(7));
186 var gX = round(fx + gDist * cos(gAngle));
187 var gZ = round(fz + gDist * sin(gAngle));
188 group = new SimpleGroup(
189 [new SimpleObject(aGrassShort, 2,5, 0,1, -PI/8,PI/8)],
190 false, clBaseResource, gX, gZ
192 createObjectGroup(group, 0);
196 log("Creating islands...");
197 placer = new ChainPlacer(floor(scaleByMapSize(4, 8)), floor(scaleByMapSize(8, 14)), floor(scaleByMapSize(25, 60)), 0.07, undefined, undefined, scaleByMapSize(30,70));
198 terrainPainter = new LayeredPainter(
199 [tMainTerrain, tMainTerrain], // terrains
202 elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 3, 4);
205 [terrainPainter, elevationPainter, paintClass(clLand)],
207 scaleByMapSize(1, 5)*randInt(5,10)
210 paintTerrainBasedOnHeight(2.4, 3.4, 3, tMainTerrain);
211 paintTerrainBasedOnHeight(1, 3, 0, tShore);
212 paintTerrainBasedOnHeight(-8, 1, 2, tWater);
214 //creating the city patches for the players
215 for (var i = 0; i < numPlayers; i++)
217 var fx = fractionToTiles(playerX[i]);
218 var fz = fractionToTiles(playerZ[i]);
221 // create the city patch
222 var cityRadius = radius/3;
223 placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz);
224 var painter = new LayeredPainter([tRoadWild, tRoad], [1]);
225 createArea(placer, painter, null);
228 createBumps([avoidClasses(clPlayer, 10), stayClasses(clLand, 5)]);
230 if (randInt(1,2) == 1)
231 createHills([tMainTerrain, tCliff, tHill], [avoidClasses(clPlayer, 2, clHill, 15), stayClasses(clLand, 0)], clHill, scaleByMapSize(1, 4) * numPlayers);
233 createMountains(tCliff, [avoidClasses(clPlayer, 2, clHill, 15), stayClasses(clLand, 0)], clHill, scaleByMapSize(1, 4) * numPlayers);
236 [tMainTerrain, tForestFloor1, tForestFloor2, pForest1, pForest2],
237 [avoidClasses(clPlayer, 20, clForest, 17, clHill, 0), stayClasses(clLand, 4)],
244 log("Creating dirt patches...");
245 createLayeredPatches(
246 [scaleByMapSize(3, 6), scaleByMapSize(5, 10), scaleByMapSize(8, 21)],
247 [[tMainTerrain,tTier1Terrain],[tTier1Terrain,tTier2Terrain], [tTier2Terrain,tTier3Terrain]],
249 [avoidClasses(clForest, 0, clHill, 0, clDirt, 3, clPlayer, 12), stayClasses(clLand, 7)]
252 log("Creating grass patches...");
254 [scaleByMapSize(2, 4), scaleByMapSize(3, 7), scaleByMapSize(5, 15)],
256 [avoidClasses(clForest, 0, clHill, 0, clDirt, 3, clPlayer, 12), stayClasses(clLand, 7)]
260 log("Creating stone mines...");
263 [new SimpleObject(oStoneSmall, 0,2, 0,4), new SimpleObject(oStoneLarge, 1,1, 0,4)],
264 [new SimpleObject(oStoneSmall, 2,5, 1,3)]
266 [avoidClasses(clForest, 1, clPlayer, 7, clRock, 10, clHill, 1), stayClasses(clLand, 6)]
269 log("Creating metal mines...");
272 [new SimpleObject(oMetalLarge, 1,1, 0,4)]
274 [avoidClasses(clForest, 1, clPlayer, 7, clMetal, 10, clRock, 5, clHill, 1), stayClasses(clLand, 6)],
279 log("Creating decoration...");
280 var planetm = random_terrain == g_BiomeTropic ? 8 : 1;
283 [[new SimpleObject(aRockMedium, 1,3, 0,1)],
284 [new SimpleObject(aRockLarge, 1,2, 0,1), new SimpleObject(aRockMedium, 1,3, 0,2)],
285 [new SimpleObject(aGrassShort, 1,2, 0,1, -PI/8,PI/8)],
286 [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)],
287 [new SimpleObject(aBushMedium, 1,2, 0,2), new SimpleObject(aBushSmall, 2,4, 0,2)]
290 scaleByMapSize(16, 262),
291 scaleByMapSize(8, 131),
292 planetm * scaleByMapSize(13, 200),
293 planetm * scaleByMapSize(13, 200),
294 planetm * scaleByMapSize(13, 200)
296 [avoidClasses(clForest, 0, clPlayer, 0, clHill, 0), stayClasses(clLand, 5)]
300 log("Creating animals...");
304 [new SimpleObject(oMainHuntableAnimal, 5,7, 0,4)],
305 [new SimpleObject(oSecondaryHuntableAnimal, 2,3, 0,2)]
311 [avoidClasses(clForest, 0, clPlayer, 1, clHill, 1, clFood, 20), stayClasses(clLand, 3)]
315 log("Creating fruits...");
319 [new SimpleObject(oFruitBush, 5,7, 0,4)]
324 [avoidClasses(clForest, 0, clPlayer, 1, clHill, 1, clFood, 10), stayClasses(clLand, 3)]
328 log("Creating fish...");
332 [new SimpleObject(oFish, 2,3, 0,2)]
337 avoidClasses(clLand, 3, clPlayer, 2, clFood, 20)
342 log("Creating straggler trees...");
343 var types = [oTree1, oTree2, oTree4, oTree3]; // some variation
344 createStragglerTrees(types, [avoidClasses(clForest, 7, clHill, 1, clPlayer, 3, clMetal, 1, clRock, 1), stayClasses(clLand, 7)]);
345 setWaterWaviness(4.0);
346 setWaterType("ocean");