1 RMS.LoadLibrary("rmgen");
3 TILE_CENTERED_HEIGHT_MAP = true;
5 //random terrain textures
6 var random_terrain = randomizeBiome();
8 const tMainTerrain = rBiomeT1();
9 const tForestFloor1 = rBiomeT2();
10 const tForestFloor2 = rBiomeT3();
11 const tCliff = rBiomeT4();
12 const tTier1Terrain = rBiomeT5();
13 const tTier2Terrain = rBiomeT6();
14 const tTier3Terrain = rBiomeT7();
15 const tHill = rBiomeT1();
16 const tDirt = rBiomeT9();
17 const tRoad = rBiomeT10();
18 const tRoadWild = rBiomeT11();
19 const tTier4Terrain = rBiomeT12();
20 const tShoreBlend = rBiomeT13();
21 const tShore = rBiomeT14();
22 const tWater = rBiomeT15();
25 const oTree1 = rBiomeE1();
26 const oTree2 = rBiomeE2();
27 const oTree3 = rBiomeE3();
28 const oTree4 = rBiomeE4();
29 const oTree5 = rBiomeE5();
30 const oFruitBush = rBiomeE6();
31 const oMainHuntableAnimal = rBiomeE8();
32 const oFish = rBiomeE9();
33 const oSecondaryHuntableAnimal = rBiomeE10();
34 const oStoneLarge = rBiomeE11();
35 const oStoneSmall = rBiomeE12();
36 const oMetalLarge = rBiomeE13();
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...");
55 const numPlayers = getNumPlayers();
56 const mapSize = getMapSize();
57 const mapArea = mapSize*mapSize;
61 // create tile classes
63 var clPlayer = createTileClass();
64 var clHill = createTileClass();
65 var clForest = createTileClass();
66 var clWater = createTileClass();
67 var clDirt = createTileClass();
68 var clRock = createTileClass();
69 var clMetal = createTileClass();
70 var clFood = createTileClass();
71 var clBaseResource = createTileClass();
72 var clSettlement = createTileClass();
73 var clLand = createTileClass();
75 for (var ix = 0; ix < mapSize; ix++)
76 for (var iz = 0; iz < mapSize; iz++)
77 placeTerrain(ix, iz, tMainTerrain);
79 var fx = fractionToTiles(0.5);
80 var fz = fractionToTiles(0.5);
84 var lSize = sqrt(sqrt(sqrt(scaleByMapSize(1, 8))));
86 var placer = new ClumpPlacer(mapArea * 0.23, 1, 1, 10, ix, iz);
87 var terrainPainter = new LayeredPainter(
88 [tShore, tWater, tWater, tWater], // terrains
91 var elevationPainter = new SmoothElevationPainter(
92 ELEVATION_SET, // type
96 createArea(placer, [terrainPainter, elevationPainter, paintClass(clWater)], null);
98 // randomize player order
100 for (var i = 0; i < numPlayers; i++)
103 playerIDs = sortPlayers(playerIDs);
106 var playerX = new Array(numPlayers);
107 var playerZ = new Array(numPlayers);
108 var playerAngle = new Array(numPlayers);
110 var startAngle = randFloat(0, TWO_PI);
111 for (var i = 0; i < numPlayers; i++)
113 playerAngle[i] = startAngle + i*TWO_PI/numPlayers;
114 playerX[i] = 0.5 + 0.35*cos(playerAngle[i]);
115 playerZ[i] = 0.5 + 0.35*sin(playerAngle[i]);
118 for (var i = 0; i < numPlayers; i++)
120 var id = playerIDs[i];
121 log("Creating base for player " + id + "...");
124 var radius = scaleByMapSize(15,25);
128 // get the x and z in tiles
129 fx = fractionToTiles(playerX[i]);
130 fz = fractionToTiles(playerZ[i]);
133 addToClass(ix, iz, clPlayer);
134 addToClass(ix+5, iz, clPlayer);
135 addToClass(ix, iz+5, clPlayer);
136 addToClass(ix-5, iz, clPlayer);
137 addToClass(ix, iz-5, clPlayer);
139 // create the city patch
140 var cityRadius = radius/3;
141 placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz);
142 var painter = new LayeredPainter([tRoadWild, tRoad], [1]);
143 createArea(placer, painter, null);
145 placeCivDefaultEntities(fx, fz, id, { 'iberWall': 'towers' });
147 placeDefaultChicken(fx, fz, clBaseResource);
149 // create berry bushes
150 var bbAngle = randFloat(0, TWO_PI);
152 var bbX = round(fx + bbDist * cos(bbAngle));
153 var bbZ = round(fz + bbDist * sin(bbAngle));
154 var group = new SimpleGroup(
155 [new SimpleObject(oFruitBush, 5,5, 0,3)],
156 true, clBaseResource, bbX, bbZ
158 createObjectGroup(group, 0);
161 var mAngle = bbAngle;
162 while(abs(mAngle - bbAngle) < PI/3)
163 mAngle = randFloat(0, TWO_PI);
166 var mX = round(fx + mDist * cos(mAngle));
167 var mZ = round(fz + mDist * sin(mAngle));
168 group = new SimpleGroup(
169 [new SimpleObject(oMetalLarge, 1,1, 0,0)],
170 true, clBaseResource, mX, mZ
172 createObjectGroup(group, 0);
174 // create stone mines
175 mAngle += randFloat(PI/8, PI/4);
176 mX = round(fx + mDist * cos(mAngle));
177 mZ = round(fz + mDist * sin(mAngle));
178 group = new SimpleGroup(
179 [new SimpleObject(oStoneLarge, 1,1, 0,2)],
180 true, clBaseResource, mX, mZ
182 createObjectGroup(group, 0);
183 var hillSize = PI * radius * radius;
184 // create starting trees
186 var tAngle = randFloat(0, TWO_PI);
187 var tDist = randFloat(12, 13);
188 var tX = round(fx + tDist * cos(tAngle));
189 var tZ = round(fz + tDist * sin(tAngle));
190 group = new SimpleGroup(
191 [new SimpleObject(oTree1, num, num, 0,3)],
192 false, clBaseResource, tX, tZ
194 createObjectGroup(group, 0, avoidClasses(clBaseResource,2));
196 // create grass tufts
197 var num = hillSize / 250;
198 for (var j = 0; j < num; j++)
200 var gAngle = randFloat(0, TWO_PI);
201 var gDist = radius - (5 + randInt(7));
202 var gX = round(fx + gDist * cos(gAngle));
203 var gZ = round(fz + gDist * sin(gAngle));
204 group = new SimpleGroup(
205 [new SimpleObject(aGrassShort, 2,5, 0,1, -PI/8,PI/8)],
206 false, clBaseResource, gX, gZ
208 createObjectGroup(group, 0);
215 if (mapSize == 128 && numPlayers <= 2)
217 else if (mapSize == 192 && numPlayers <= 3)
219 else if (mapSize == 256)
223 else if (numPlayers == 4)
226 else if (mapSize == 320)
230 else if (numPlayers == 4)
233 else if (mapSize == 384)
237 else if (numPlayers == 4)
239 else if (numPlayers == 5)
242 else if (mapSize == 448)
246 else if (numPlayers <= 4)
248 else if (numPlayers == 5)
250 else if (numPlayers == 6)
254 log ("Creating rivers...");
255 for (var m = 0; m < numPlayers*split; m++)
257 var tang = startAngle + (m+0.5)*TWO_PI/(numPlayers*split);
258 var placer = new PathPlacer(fractionToTiles(0.5 + 0.15*cos(tang)), fractionToTiles(0.5 + 0.15*sin(tang)), fractionToTiles(0.5 + 0.49*cos(tang)), fractionToTiles(0.5 + 0.49*sin(tang)), scaleByMapSize(14,40), 0.0, 3*(scaleByMapSize(1,3)), 0.2, 0.05);
259 var terrainPainter = new LayeredPainter(
260 [tShore, tWater, tWater], // terrains
263 var elevationPainter = new SmoothElevationPainter(
264 ELEVATION_SET, // type
268 createArea(placer, [terrainPainter, elevationPainter, paintClass(clWater)], avoidClasses(clPlayer, 5));
269 placer = new ClumpPlacer(floor(PI*scaleByMapSize(14,40)*scaleByMapSize(14,40)/4), 1, 0, 10, fractionToTiles(0.5 + 0.49*cos(tang)), fractionToTiles(0.5 + 0.49*sin(tang)));
270 var painter = new LayeredPainter([tWater, tWater], [1]);
271 var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, -4, 4);
272 createArea(placer, [painter, elevationPainter, paintClass(clWater)], avoidClasses(clPlayer, 5));
274 var tang = startAngle + (m)*TWO_PI/(numPlayers*split);
275 var placer = new PathPlacer(fractionToTiles(0.5 + 0.05*cos(tang)), fractionToTiles(0.5 + 0.05*sin(tang)), fractionToTiles(0.5 + 0.49*cos(tang)), fractionToTiles(0.5 + 0.49*sin(tang)), scaleByMapSize(10,40), 0.0, 3*(scaleByMapSize(1,3)), 0.2, 0.05);
276 var terrainPainter = new LayeredPainter(
277 [tWater, tShore, tMainTerrain], // terrains
280 var elevationPainter = new SmoothElevationPainter(
281 ELEVATION_SET, // type
285 createArea(placer, [terrainPainter, elevationPainter], null);
289 var fx = fractionToTiles(0.5);
290 var fz = fractionToTiles(0.5);
294 var placer = new ClumpPlacer(mapArea * 0.15, 1, 1, 10, ix, iz);
295 var terrainPainter = new LayeredPainter(
296 [tShore, tWater, tWater, tWater], // terrains
299 var elevationPainter = new SmoothElevationPainter(
300 ELEVATION_SET, // type
304 createArea(placer, [terrainPainter, elevationPainter], null);
306 var fx = fractionToTiles(0.5);
307 var fz = fractionToTiles(0.5);
311 var lSize = sqrt(sqrt(sqrt(scaleByMapSize(1, 8))));
313 var placer = new ClumpPlacer(mapArea * 0.09, 1, 1, 10, ix, iz);
314 var terrainPainter = new LayeredPainter(
315 [tShore, tWater, tWater], // terrains
318 var elevationPainter = new SmoothElevationPainter(
319 ELEVATION_SET, // type
323 createArea(placer, [terrainPainter, elevationPainter], null);
325 var placer = new ClumpPlacer((mapSize - 50) * (mapSize - 50) * 0.09, 1, 1, 10, ix, iz);
326 var terrainPainter = new LayeredPainter(
327 [tShore, tWater, tWater, tWater], // terrains
330 var elevationPainter = new SmoothElevationPainter(
331 ELEVATION_SET, // type
335 createArea(placer, [terrainPainter, elevationPainter, unPaintClass(clWater)], null);
337 var placer = new ClumpPlacer(scaleByMapSize(6, 18)*scaleByMapSize(6, 18)*22, 1, 1, 10, ix, iz);
338 var terrainPainter = new LayeredPainter(
339 [tMainTerrain, tMainTerrain], // terrains
342 var elevationPainter = new SmoothElevationPainter(
343 ELEVATION_SET, // type
347 createArea(placer, [terrainPainter, elevationPainter], null);
349 paintTerrainBasedOnHeight(-6, 1, 1, tWater);
350 paintTerrainBasedOnHeight(1, 2, 1, tShore);
351 paintTerrainBasedOnHeight(2, 5, 1, tMainTerrain);
353 paintTileClassBasedOnHeight(-6, 0.5, 1, clWater);
354 unPaintTileClassBasedOnHeight(0.5, 10, 1, clWater);
356 for (var i = 0; i < numPlayers; i++)
358 fx = fractionToTiles(playerX[i]);
359 fz = fractionToTiles(playerZ[i]);
363 // create the city patch
364 var cityRadius = radius/3;
365 var placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz);
366 var painter = new LayeredPainter([tRoadWild, tRoad], [1]);
367 createArea(placer, painter, null);
370 if (randInt(1,2) == 1)
371 createHills([tMainTerrain, tCliff, tHill], avoidClasses(clPlayer, 20, clHill, 15, clWater, 2), clHill, scaleByMapSize(1, 4) * numPlayers);
373 createMountains(tCliff, avoidClasses(clPlayer, 20, clHill, 15, clWater, 2), clHill, scaleByMapSize(1, 4) * numPlayers);
376 [tMainTerrain, tForestFloor1, tForestFloor2, pForest1, pForest2],
377 avoidClasses(clPlayer, 20, clForest, 17, clHill, 0, clWater, 2),
385 log("Creating dirt patches...");
386 createLayeredPatches(
387 [scaleByMapSize(3, 6), scaleByMapSize(5, 10), scaleByMapSize(8, 21)],
388 [[tMainTerrain,tTier1Terrain],[tTier1Terrain,tTier2Terrain], [tTier2Terrain,tTier3Terrain]],
390 avoidClasses(clWater, 3, clForest, 0, clHill, 0, clDirt, 5, clPlayer, 12)
393 log("Creating grass patches...");
395 [scaleByMapSize(2, 4), scaleByMapSize(3, 7), scaleByMapSize(5, 15)],
397 avoidClasses(clWater, 3, clForest, 0, clHill, 0, clDirt, 5, clPlayer, 12)
402 log("Creating stone mines...");
405 [new SimpleObject(oStoneSmall, 0,2, 0,4), new SimpleObject(oStoneLarge, 1,1, 0,4)],
406 [new SimpleObject(oStoneSmall, 2,5, 1,3)]
408 avoidClasses(clWater, 3, clForest, 1, clPlayer, 20, clRock, 10, clHill, 1)
411 log("Creating metal mines...");
414 [new SimpleObject(oMetalLarge, 1,1, 0,4)]
416 avoidClasses(clWater, 3, clForest, 1, clPlayer, 20, clMetal, 10, clRock, 5, clHill, 1),
425 if (random_terrain == g_BiomeTropic)
430 [[new SimpleObject(aRockMedium, 1,3, 0,1)],
431 [new SimpleObject(aRockLarge, 1,2, 0,1), new SimpleObject(aRockMedium, 1,3, 0,2)],
432 [new SimpleObject(aGrassShort, 1,2, 0,1, -PI/8,PI/8)],
433 [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)],
434 [new SimpleObject(aBushMedium, 1,2, 0,2), new SimpleObject(aBushSmall, 2,4, 0,2)]
437 scaleByMapSize(16, 262),
438 scaleByMapSize(8, 131),
439 planetm * scaleByMapSize(13, 200),
440 planetm * scaleByMapSize(13, 200),
441 planetm * scaleByMapSize(13, 200)
443 avoidClasses(clWater, 0, clForest, 0, clPlayer, 0, clHill, 0)
452 [new SimpleObject(oMainHuntableAnimal, 5,7, 0,4)],
453 [new SimpleObject(oSecondaryHuntableAnimal, 2,3, 0,2)]
459 avoidClasses(clWater, 3, clForest, 0, clPlayer, 20, clHill, 1, clFood, 20)
466 [new SimpleObject(oFruitBush, 5,7, 0,4)]
471 avoidClasses(clWater, 3, clForest, 0, clPlayer, 20, clHill, 1, clFood, 10)
474 // create straggler trees
475 var types = [oTree1, oTree2, oTree4, oTree3]; // some variation
476 createStragglerTrees(types, avoidClasses(clWater, 5, clForest, 7, clHill, 1, clPlayer, 12, clMetal, 1, clRock, 1));