1 RMS.LoadLibrary("rmgen");
3 TILE_CENTERED_HEIGHT_MAP = true;
4 //random terrain textures
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 tDirt = rBiomeT9();
16 const tRoad = rBiomeT10();
17 const tRoadWild = rBiomeT11();
18 const tTier4Terrain = 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...");
55 const numPlayers = getNumPlayers();
56 const mapSize = getMapSize();
57 const mapArea = mapSize*mapSize;
59 // create tile classes
61 var clPlayer = createTileClass();
62 var clHill = createTileClass();
63 var clForest = createTileClass();
64 var clWater = createTileClass();
65 var clDirt = createTileClass();
66 var clRock = createTileClass();
67 var clMetal = createTileClass();
68 var clFood = createTileClass();
69 var clBaseResource = createTileClass();
70 var clSettlement = createTileClass();
71 var clLand = createTileClass();
72 var clShallow = createTileClass();
74 for (var ix = 0; ix < mapSize; ix++)
76 for (var iz = 0; iz < mapSize; iz++)
78 var x = ix / (mapSize + 1.0);
79 var z = iz / (mapSize + 1.0);
80 placeTerrain(ix, iz, tWater);
84 var iberianTowers = false;
85 var md = randInt(1,13);
86 var needsAdditionalWood = false;
87 //*****************************************************************************************************************************
88 if (md == 1) //archipelago and island
90 needsAdditionalWood = true;
93 // randomize player order
95 for (var i = 0; i < numPlayers; i++)
99 playerIDs = sortPlayers(playerIDs);
103 var playerX = new Array(numPlayers);
104 var playerZ = new Array(numPlayers);
105 var playerAngle = new Array(numPlayers);
107 var startAngle = randFloat(0, TWO_PI);
108 for (var i = 0; i < numPlayers; i++)
110 playerAngle[i] = startAngle + i*TWO_PI/numPlayers;
111 playerX[i] = 0.5 + 0.35*cos(playerAngle[i]);
112 playerZ[i] = 0.5 + 0.35*sin(playerAngle[i]);
115 var mdd1 = randInt(1,3);
117 for (var i = 0; i < numPlayers; ++i)
119 var radius = scaleByMapSize(17, 29);
123 var hillSize = PI * radius * radius;
124 // get the x and z in tiles
125 var fx = fractionToTiles(playerX[i]);
126 var fz = fractionToTiles(playerZ[i]);
129 // create a player island
130 var placer = new ClumpPlacer(hillSize, 0.80, 0.1, 10, ix, iz);
131 var terrainPainter = new LayeredPainter(
132 [tMainTerrain , tMainTerrain, tMainTerrain], // terrains
133 [1, shoreRadius] // widths
135 var elevationPainter = new SmoothElevationPainter(
136 ELEVATION_SET, // type
137 elevation, // elevation
138 shoreRadius // blend radius
140 createArea(placer, [terrainPainter, elevationPainter, paintClass(clPlayer)], null);
142 if (mdd1 == 1) //archipelago
145 log("Creating islands...");
146 placer = new ClumpPlacer(floor(hillSize*randFloat(0.8,1.2)), 0.80, 0.1, 10);
147 terrainPainter = new LayeredPainter(
148 [tMainTerrain, tMainTerrain], // terrains
151 elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 3, 4);
154 [terrainPainter, elevationPainter, paintClass(clLand)],
156 scaleByMapSize(2, 5)*randInt(8,14)
159 // create shore jaggedness
160 log("Creating shore jaggedness...");
161 placer = new ClumpPlacer(scaleByMapSize(15, 80), 0.2, 0.1, 1);
162 terrainPainter = new LayeredPainter(
163 [tCliff, tHill], // terrains
166 elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 3, 4);
169 [terrainPainter, elevationPainter, paintClass(clLand)],
170 borderClasses(clLand, 6, 3),
171 scaleByMapSize(12, 130) * 2, 150
174 else if (mdd1 == 2) //islands
177 log("Creating islands...");
178 placer = new ClumpPlacer(floor(hillSize*randFloat(0.6,1.4)), 0.80, 0.1, randFloat(0.0, 0.2));
179 terrainPainter = new LayeredPainter(
180 [tMainTerrain, tMainTerrain], // terrains
183 elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 3, 4);
186 [terrainPainter, elevationPainter, paintClass(clLand)],
187 avoidClasses(clLand, 3, clPlayer, 3),
188 scaleByMapSize(6, 10)*randInt(8,14)
191 // create small islands
192 log("Creating small islands...");
193 placer = new ClumpPlacer(floor(hillSize*randFloat(0.3,0.7)), 0.80, 0.1, 0.07);
194 terrainPainter = new LayeredPainter(
195 [tMainTerrain, tMainTerrain], // terrains
198 elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 3, 6);
201 [terrainPainter, elevationPainter, paintClass(clLand)],
202 avoidClasses(clLand, 3, clPlayer, 3),
203 scaleByMapSize(2, 6)*randInt(6,15), 25
206 else if (mdd1 == 3) // tight islands
209 log("Creating islands...");
210 placer = new ClumpPlacer(floor(hillSize*randFloat(0.8,1.2)), 0.80, 0.1, 10);
211 terrainPainter = new LayeredPainter(
212 [tMainTerrain, tMainTerrain], // terrains
215 elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 3, 4);
218 [terrainPainter, elevationPainter, paintClass(clLand)],
219 avoidClasses(clLand, randInt(8, 16), clPlayer, 3),
220 scaleByMapSize(2, 5)*randInt(8,14)
225 //********************************************************************************************************
226 else if (md == 2) //continent
229 // randomize player order
231 for (var i = 0; i < numPlayers; i++)
235 playerIDs = sortPlayers(playerIDs);
239 var playerX = new Array(numPlayers);
240 var playerZ = new Array(numPlayers);
241 var playerAngle = new Array(numPlayers);
243 var startAngle = randFloat(0, TWO_PI);
244 for (var i = 0; i < numPlayers; i++)
246 playerAngle[i] = startAngle + i*TWO_PI/numPlayers;
247 playerX[i] = 0.5 + 0.25*cos(playerAngle[i]);
248 playerZ[i] = 0.5 + 0.25*sin(playerAngle[i]);
250 var fx = fractionToTiles(playerX[i]);
251 var fz = fractionToTiles(playerZ[i]);
254 addToClass(ix, iz, clPlayer);
255 addToClass(ix+5, iz, clPlayer);
256 addToClass(ix, iz+5, clPlayer);
257 addToClass(ix-5, iz, clPlayer);
258 addToClass(ix, iz-5, clPlayer);
261 var fx = fractionToTiles(0.5);
262 var fz = fractionToTiles(0.5);
266 var placer = new ClumpPlacer(mapArea * 0.45, 0.9, 0.09, 10, ix, iz);
267 var terrainPainter = new LayeredPainter(
268 [tWater, tShore, tMainTerrain], // terrains
271 var elevationPainter = new SmoothElevationPainter(
272 ELEVATION_SET, // type
276 createArea(placer, [terrainPainter, elevationPainter, paintClass(clLand)], null);
278 var clPeninsulaSteam = createTileClass();
280 if (randInt(1,3)==1) // peninsula
282 var angle = randFloat(0, TWO_PI);
284 var fx = fractionToTiles(0.5 + 0.25*cos(angle));
285 var fz = fractionToTiles(0.5 + 0.25*sin(angle));
289 var placer = new ClumpPlacer(mapArea * 0.45, 0.9, 0.09, 10, ix, iz);
290 var terrainPainter = new LayeredPainter(
291 [tWater, tShore, tMainTerrain], // terrains
294 var elevationPainter = new SmoothElevationPainter(
295 ELEVATION_SET, // type
299 createArea(placer, [terrainPainter, elevationPainter, paintClass(clLand)], null);
301 var fx = fractionToTiles(0.5 + 0.35*cos(angle));
302 var fz = fractionToTiles(0.5 + 0.35*sin(angle));
306 var placer = new ClumpPlacer(mapArea * 0.3, 0.9, 0.01, 10, ix, iz);
307 createArea(placer, [paintClass(clPeninsulaSteam)], null);
310 // create shore jaggedness
311 log("Creating shore jaggedness...");
312 placer = new ClumpPlacer(scaleByMapSize(20, 150), 0.2, 0.1, 1);
313 terrainPainter = new LayeredPainter(
314 [tCliff, tHill], // terrains
317 elevationPainter = new SmoothElevationPainter(ELEVATION_SET, -5, 4);
320 [terrainPainter, elevationPainter, unPaintClass(clLand)],
321 [avoidClasses(clPlayer, 20, clPeninsulaSteam, 20), borderClasses(clLand, 7, 7)],
322 scaleByMapSize(7, 130) * 2, 150
325 // create outward shore jaggedness
326 log("Creating shore jaggedness...");
327 placer = new ClumpPlacer(scaleByMapSize(20, 150), 0.2, 0.1, 1);
328 terrainPainter = new LayeredPainter(
329 [tCliff, tHill], // terrains
332 elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 3, 4);
335 [terrainPainter, elevationPainter, paintClass(clLand)],
336 [avoidClasses(clPlayer, 20), borderClasses(clLand, 7, 7)],
337 scaleByMapSize(7, 130) * 2, 150
340 //********************************************************************************************************
341 else if (md == 3) //central sea
343 // randomize player order
345 for (var i = 0; i < numPlayers; i++)
349 playerIDs = primeSortPlayers(sortPlayers(playerIDs));
353 var playerX = new Array(numPlayers);
354 var playerZ = new Array(numPlayers);
355 var playerAngle = new Array(numPlayers);
356 var playerPos = new Array(numPlayers);
359 var mdd1 = randInt(1,2);
360 if (mdd1 == 1) //vertical
362 for (var i = 0; i < numPlayers; i++)
365 if (!(numPlayers%2)){
366 playerPos[i] = ((iop + abs(iop%2))/2 + 1) / ((numPlayers / 2) + 1);
372 playerPos[i] = ((iop + abs(iop%2))/2 + 1) / (((numPlayers + 1) / 2) + 1);
376 playerPos[i] = ((iop)/2 + 1) / ((((numPlayers - 1)) / 2) + 1);
379 playerZ[i] = playerPos[i];
380 playerX[i] = 0.2 + 0.6*(i%2);
385 for (var i = 0; i < numPlayers; i++)
388 if (!(numPlayers%2)){
389 playerPos[i] = ((iop + abs(iop%2))/2 + 1) / ((numPlayers / 2) + 1);
395 playerPos[i] = ((iop + abs(iop%2))/2 + 1) / (((numPlayers + 1) / 2) + 1);
399 playerPos[i] = ((iop)/2 + 1) / ((((numPlayers - 1)) / 2) + 1);
402 playerZ[i] = 0.2 + 0.6*(i%2);
403 playerX[i] = playerPos[i];
408 var WATER_WIDTH = randFloat(0.22,0.3)+scaleByMapSize(1,4)/20;
410 var theta = randFloat(0, 1);
411 var theta2 = randFloat(0, 1);
412 var seed = randFloat(2,3);
413 var seed2 = randFloat(2,3);
414 for (var ix = 0; ix < mapSize; ix++)
416 for (var iz = 0; iz < mapSize; iz++)
418 var x = ix / (mapSize + 1.0);
419 var z = iz / (mapSize + 1.0);
421 // add the rough shape of the water
422 var km = 20/scaleByMapSize(35, 160);
426 if (mdd1 == 1) //vertical
428 var cu = km*rndRiver(theta+z*0.5*(mapSize/64),seed);
429 var cu2 = km*rndRiver(theta2+z*0.5*(mapSize/64),seed2);
431 if ((x > cu + 0.5 - WATER_WIDTH/2) && (x < cu2 + 0.5 + WATER_WIDTH/2))
434 if (x < (cu + 0.5 + fadeDist - WATER_WIDTH/2))
436 h = 3 - 6 * (1 - ((cu + 0.5 + fadeDist - WATER_WIDTH/2) - x)/fadeDist);
438 else if (x > (cu2 + 0.5 - fadeDist + WATER_WIDTH/2))
440 h = 3 - 6 * (1 - (x - (cu2 + 0.5 - fadeDist + WATER_WIDTH/2))/fadeDist);
449 placeTerrain(ix, iz, tWater);
453 placeTerrain(ix, iz, tShore);
456 setHeight(ix, iz, h);
458 addToClass(ix, iz, clWater);
463 setHeight(ix, iz, 3.1);
464 addToClass(ix, iz, clLand);
469 var cu = km*rndRiver(theta+x*0.5*(mapSize/64),seed);
470 var cu2 = km*rndRiver(theta2+x*0.5*(mapSize/64),seed2);
472 if ((z > cu + 0.5 - WATER_WIDTH/2) && (z < cu2 + 0.5 + WATER_WIDTH/2))
475 if (z < (cu + 0.5 + fadeDist - WATER_WIDTH/2))
477 h = 3 - 6 * (1 - ((cu + 0.5 + fadeDist - WATER_WIDTH/2) - z)/fadeDist);
479 else if (z > (cu2 + 0.5 - fadeDist + WATER_WIDTH/2))
481 h = 3 - 6 * (1 - (z - (cu2 + 0.5 - fadeDist + WATER_WIDTH/2))/fadeDist);
490 placeTerrain(ix, iz, tWater);
494 placeTerrain(ix, iz, tShore);
497 setHeight(ix, iz, h);
499 addToClass(ix, iz, clWater);
504 setHeight(ix, iz, 3.1);
505 addToClass(ix, iz, clLand);
514 if (mdd1 == 1) //vertical
516 var placer = new PathPlacer(1, fractionToTiles(0.5), fractionToTiles(0.99), fractionToTiles(0.5), scaleByMapSize(randInt(16,24),randInt(100,140)), 0.5, 3*(scaleByMapSize(1,4)), 0.1, 0.01);
520 var placer = new PathPlacer(fractionToTiles(0.5), 1, fractionToTiles(0.5), fractionToTiles(0.99), scaleByMapSize(randInt(16,24),randInt(100,140)), 0.5, 3*(scaleByMapSize(1,4)), 0.1, 0.01);
522 var terrainPainter = new LayeredPainter(
523 [tMainTerrain, tMainTerrain, tMainTerrain], // terrains
526 var elevationPainter = new SmoothElevationPainter(
527 ELEVATION_SET, // type
531 createArea(placer, [terrainPainter, elevationPainter, unPaintClass(clWater)], null);
533 var mdd2 = randInt(1,7);
537 log("Creating islands...");
538 placer = new ClumpPlacer(randInt(scaleByMapSize(8,15),scaleByMapSize(15,23))*randInt(scaleByMapSize(8,15),scaleByMapSize(15,23)), 0.80, 0.1, randFloat(0.0, 0.2));
539 terrainPainter = new LayeredPainter(
540 [tMainTerrain, tMainTerrain], // terrains
543 elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 3.1, 4);
546 [terrainPainter, elevationPainter, paintClass(clLand)],
547 avoidClasses(clLand, 3, clPlayer, 3),
548 scaleByMapSize(2, 5)*randInt(8,14)
554 log("Creating extentions...");
555 placer = new ClumpPlacer(randInt(scaleByMapSize(13,24),scaleByMapSize(24,45))*randInt(scaleByMapSize(13,24),scaleByMapSize(24,45)), 0.80, 0.1, 10);
556 terrainPainter = new LayeredPainter(
557 [tMainTerrain, tMainTerrain], // terrains
560 elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 3.1, 4);
563 [terrainPainter, elevationPainter, paintClass(clLand)],
565 scaleByMapSize(2, 5)*randInt(8,14)
569 //********************************************************************************************************
570 else if (md == 4) //central river
573 for (var ix = 0; ix < mapSize; ix++)
575 for (var iz = 0; iz < mapSize; iz++)
577 var x = ix / (mapSize + 1.0);
578 var z = iz / (mapSize + 1.0);
579 setHeight(ix, iz, 3);
583 // randomize player order
585 for (var i = 0; i < numPlayers; i++)
589 playerIDs = primeSortPlayers(sortPlayers(playerIDs));
593 var playerX = new Array(numPlayers);
594 var playerZ = new Array(numPlayers);
595 var playerAngle = new Array(numPlayers);
596 var playerPos = new Array(numPlayers);
598 var mdd1 = randInt(1,2);
599 if (mdd1 == 1) //horizontal
601 for (var i = 0; i < numPlayers; i++)
604 if (!(numPlayers%2)){
605 playerPos[i] = ((iop + abs(iop%2))/2 + 1) / ((numPlayers / 2) + 1);
611 playerPos[i] = ((iop + abs(iop%2))/2 + 1) / (((numPlayers + 1) / 2) + 1);
615 playerPos[i] = ((iop)/2 + 1) / ((((numPlayers - 1)) / 2) + 1);
619 playerZ[i] = 0.25 + 0.5*(i%2);
620 playerX[i] = playerPos[i];
625 for (var i = 0; i < numPlayers; i++)
628 if (!(numPlayers%2)){
629 playerPos[i] = ((iop + abs(iop%2))/2 + 1) / ((numPlayers / 2) + 1);
635 playerPos[i] = ((iop + abs(iop%2))/2 + 1) / (((numPlayers + 1) / 2) + 1);
639 playerPos[i] = ((iop)/2 + 1) / ((((numPlayers - 1)) / 2) + 1);
643 playerZ[i] = playerPos[i];
644 playerX[i] = 0.25 + 0.5*(i%2);
648 // create the main river
649 log("Creating the main river");
652 var placer = new PathPlacer(fractionToTiles(0.5), 1, fractionToTiles(0.5) , fractionToTiles(0.99), scaleByMapSize(14,24), 0.5, 3*(scaleByMapSize(1,4)), 0.1, 0.01);
654 var placer = new PathPlacer(1, fractionToTiles(0.5), fractionToTiles(0.99), fractionToTiles(0.5), scaleByMapSize(14,24), 0.5, 3*(scaleByMapSize(1,4)), 0.1, 0.01);
656 var terrainPainter = new LayeredPainter(
657 [tShore, tWater, tWater], // terrains
660 var elevationPainter = new SmoothElevationPainter(
661 ELEVATION_SET, // type
665 createArea(placer, [terrainPainter, elevationPainter], avoidClasses(clPlayer, 4));
668 placer = new ClumpPlacer(floor(PI*scaleByMapSize(10,20)*scaleByMapSize(10,20)/4), 0.95, 0.6, 10, 1, fractionToTiles(0.5));
670 placer = new ClumpPlacer(floor(PI*scaleByMapSize(10,20)*scaleByMapSize(10,20)/4), 0.95, 0.6, 10, fractionToTiles(0.5), 1);
672 var painter = new LayeredPainter([tWater, tWater], [1]);
673 var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, -4, 2);
674 createArea(placer, [painter, elevationPainter], avoidClasses(clPlayer, 8));
677 placer = new ClumpPlacer(floor(PI*scaleByMapSize(10,20)*scaleByMapSize(10,20)/4), 0.95, 0.6, 10, fractionToTiles(0.99), fractionToTiles(0.5));
679 placer = new ClumpPlacer(floor(PI*scaleByMapSize(10,20)*scaleByMapSize(10,20)/4), 0.95, 0.6, 10, fractionToTiles(0.5), fractionToTiles(0.99));
681 var painter = new LayeredPainter([tWater, tWater], [1]);
682 var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, -4, 2);
683 createArea(placer, [painter, elevationPainter], avoidClasses(clPlayer, 8));
685 var mdd2 = randInt(1,2);
688 // create the shallows of the main river
689 log("Creating the shallows of the main river");
691 for (var i = 0; i <= randInt(1, scaleByMapSize(4,8)); i++)
693 var cLocation = randFloat(0.15,0.85);
695 passageMaker(floor(fractionToTiles(cLocation)), floor(fractionToTiles(0.35)), floor(fractionToTiles(cLocation)), floor(fractionToTiles(0.65)), scaleByMapSize(4,8), -2, -2, 2, clShallow, undefined, -4);
697 passageMaker(floor(fractionToTiles(0.35)), floor(fractionToTiles(cLocation)), floor(fractionToTiles(0.65)), floor(fractionToTiles(cLocation)), scaleByMapSize(4,8), -2, -2, 2, clShallow, undefined, -4);
701 if (randInt(1,2) == 1)
703 for (var i = 0; i < numPlayers; i++)
705 var fx = fractionToTiles(playerX[i]);
706 var fz = fractionToTiles(playerZ[i]);
709 // create the city patch
710 var cityRadius = scaleByMapSize(17,29)/3;
711 placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz);
712 createArea(placer, paintClass(clPlayer), null);
715 // create tributaries
716 log("Creating tributaries");
718 for (var i = 0; i <= randInt(8, (scaleByMapSize(12,20))); i++)
720 var cLocation = randFloat(0.05,0.95);
721 var tang = randFloat(PI*0.2, PI*0.8)*((randInt(2)-0.5)*2);
724 var cDistance = 0.05;
728 var cDistance = -0.05;
731 var point = getTIPIADBON([fractionToTiles(cLocation), fractionToTiles(0.5 + cDistance)], [fractionToTiles(cLocation), fractionToTiles(0.5 - cDistance)], [-6, -1.5], 0.5, 5, 0.01);
733 var point = getTIPIADBON([fractionToTiles(0.5 + cDistance), fractionToTiles(cLocation)], [fractionToTiles(0.5 - cDistance), fractionToTiles(cLocation)], [-6, -1.5], 0.5, 5, 0.01);
735 if (point !== undefined)
738 var placer = new PathPlacer(floor(point[0]), floor(point[1]), floor(fractionToTiles(0.5 + 0.49*cos(tang))), floor(fractionToTiles(0.5 + 0.49*sin(tang))), scaleByMapSize(10,20), 0.4, 3*(scaleByMapSize(1,4)), 0.1, 0.05);
740 var placer = new PathPlacer(floor(point[0]), floor(point[1]), floor(fractionToTiles(0.5 + 0.49*sin(tang))), floor(fractionToTiles(0.5 + 0.49*cos(tang))), scaleByMapSize(10,20), 0.4, 3*(scaleByMapSize(1,4)), 0.1, 0.05);
743 var terrainPainter = new LayeredPainter(
744 [tShore, tWater, tWater], // terrains
747 var elevationPainter = new SmoothElevationPainter(
748 ELEVATION_SET, // type
752 var success = createArea(placer, [terrainPainter, elevationPainter, paintClass(clWater)], avoidClasses(clPlayer, 3, clWater, 3, clShallow, 2));
753 if (success !== undefined)
756 placer = new ClumpPlacer(floor(PI*scaleByMapSize(10,20)*scaleByMapSize(10,20)/4), 0.95, 0.6, 10, fractionToTiles(0.5 + 0.49*cos(tang)), fractionToTiles(0.5 + 0.49*sin(tang)));
758 placer = new ClumpPlacer(floor(PI*scaleByMapSize(10,20)*scaleByMapSize(10,20)/4), 0.95, 0.6, 10, fractionToTiles(0.5 + 0.49*sin(tang)), fractionToTiles(0.5 + 0.49*cos(tang)));
760 var painter = new LayeredPainter([tWater, tWater], [1]);
761 var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, -4, 2);
762 createArea(placer, [painter, elevationPainter], avoidClasses(clPlayer, 3));
770 passageMaker(floor(fractionToTiles(0.2)), floor(fractionToTiles(0.25)), floor(fractionToTiles(0.8)), floor(fractionToTiles(0.25)), scaleByMapSize(4,8), -2, -2, 2, clShallow, undefined, -4);
771 passageMaker(floor(fractionToTiles(0.2)), floor(fractionToTiles(0.75)), floor(fractionToTiles(0.8)), floor(fractionToTiles(0.75)), scaleByMapSize(4,8), -2, -2, 2, clShallow, undefined, -4);
773 passageMaker(floor(fractionToTiles(0.25)), floor(fractionToTiles(0.2)), floor(fractionToTiles(0.25)), floor(fractionToTiles(0.8)), scaleByMapSize(4,8), -2, -2, 2, clShallow, undefined, -4);
774 passageMaker(floor(fractionToTiles(0.75)), floor(fractionToTiles(0.2)), floor(fractionToTiles(0.75)), floor(fractionToTiles(0.8)), scaleByMapSize(4,8), -2, -2, 2, clShallow, undefined, -4);
778 //********************************************************************************************************
779 else if (md == 5) //rivers and lake
782 // randomize player order
784 for (var i = 0; i < numPlayers; i++)
788 playerIDs = sortPlayers(playerIDs);
792 var playerX = new Array(numPlayers);
793 var playerZ = new Array(numPlayers);
794 var playerAngle = new Array(numPlayers);
796 var startAngle = randFloat(0, TWO_PI);
797 for (var i = 0; i < numPlayers; i++)
799 playerAngle[i] = startAngle + i*TWO_PI/numPlayers;
800 playerX[i] = 0.5 + 0.35*cos(playerAngle[i]);
801 playerZ[i] = 0.5 + 0.35*sin(playerAngle[i]);
803 var fx = fractionToTiles(playerX[i]);
804 var fz = fractionToTiles(playerZ[i]);
807 addToClass(ix, iz, clPlayer);
808 addToClass(ix+5, iz, clPlayer);
809 addToClass(ix, iz+5, clPlayer);
810 addToClass(ix-5, iz, clPlayer);
811 addToClass(ix, iz-5, clPlayer);
816 for (var ix = 0; ix < mapSize; ix++)
818 for (var iz = 0; iz < mapSize; iz++)
820 var x = ix / (mapSize + 1.0);
821 var z = iz / (mapSize + 1.0);
822 setHeight(ix, iz, 3);
825 var mdd1 = randInt(1,2);
826 if (mdd1 == 1) //lake
828 var fx = fractionToTiles(0.5);
829 var fz = fractionToTiles(0.5);
833 var lSize = sqrt(sqrt(sqrt(scaleByMapSize(1, 6))));
835 var placer = new ClumpPlacer(mapArea * 0.09 * lSize, 0.7, 0.1, 10, ix, iz);
836 var terrainPainter = new LayeredPainter(
837 [tShore, tWater, tWater, tWater], // terrains
840 var elevationPainter = new SmoothElevationPainter(
841 ELEVATION_SET, // type
845 createArea(placer, [terrainPainter, elevationPainter, paintClass(clWater)], null);
847 // create shore jaggedness
848 log("Creating shore jaggedness...");
849 placer = new ClumpPlacer(scaleByMapSize(20, 150), 0.2, 0.1, 1);
850 terrainPainter = new LayeredPainter(
851 [tCliff, tHill], // terrains
854 elevationPainter = new SmoothElevationPainter(ELEVATION_SET, -5, 4);
857 [terrainPainter, elevationPainter, paintClass(clWater)],
858 [avoidClasses(clPlayer, 20), borderClasses(clWater, 6, 4)],
859 scaleByMapSize(7, 130) * 2, 150
862 placer = new ClumpPlacer(scaleByMapSize(15, 80), 0.2, 0.1, 1);
863 terrainPainter = new LayeredPainter(
864 [tCliff, tHill], // terrains
867 elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 3, 4);
870 [terrainPainter, elevationPainter, unPaintClass(clWater)],
871 borderClasses(clWater, 4, 7),
872 scaleByMapSize(12, 130) * 2, 150
876 if (randInt(1,2) == 1) //rivers
879 log ("Creating rivers...");
880 for (var m = 0; m < numPlayers; m++)
882 var tang = startAngle + (m+0.5)*TWO_PI/(numPlayers);
883 var placer = new PathPlacer(fractionToTiles(0.5), fractionToTiles(0.5), fractionToTiles(0.5 + 0.49*cos(tang)), fractionToTiles(0.5 + 0.49*sin(tang)), scaleByMapSize(14,24), 0.4, 3*(scaleByMapSize(1,3)), 0.2, 0.05);
884 var terrainPainter = new LayeredPainter(
885 [tShore, tWater, tWater], // terrains
888 var elevationPainter = new SmoothElevationPainter(
889 ELEVATION_SET, // type
893 createArea(placer, [terrainPainter, elevationPainter, paintClass(clWater)], avoidClasses(clPlayer, 5));
894 placer = new ClumpPlacer(floor(PI*scaleByMapSize(10,50)*scaleByMapSize(10,50)/5), 0.95, 0.6, 10, fractionToTiles(0.5 + 0.49*cos(tang)), fractionToTiles(0.5 + 0.49*sin(tang)));
895 var painter = new LayeredPainter([tWater, tWater], [1]);
896 var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, -4, 0);
897 createArea(placer, [painter, elevationPainter, paintClass(clWater)], avoidClasses(clPlayer, 5));
901 var fx = fractionToTiles(0.5);
902 var fz = fractionToTiles(0.5);
906 var placer = new ClumpPlacer(mapArea * 0.005, 0.7, 0.1, 10, ix, iz);
907 var terrainPainter = new LayeredPainter(
908 [tShore, tWater, tWater, tWater], // terrains
911 var elevationPainter = new SmoothElevationPainter(
912 ELEVATION_SET, // type
916 createArea(placer, [terrainPainter, elevationPainter, paintClass(clWater)], null);
919 if ((randInt(1,3) == 1)&&(mdd1 == 1))//island
921 var placer = new ClumpPlacer(mapArea * 0.006 * lSize, 0.7, 0.1, 10, ix, iz);
922 var terrainPainter = new LayeredPainter(
923 [tShore, tWater, tWater, tWater], // terrains
926 var elevationPainter = new SmoothElevationPainter(
927 ELEVATION_SET, // type
931 createArea(placer, [terrainPainter, elevationPainter, paintClass(clWater)], null);
934 //********************************************************************************************************
935 else if (md == 6) //edge seas
938 for (var ix = 0; ix < mapSize; ix++)
940 for (var iz = 0; iz < mapSize; iz++)
942 var x = ix / (mapSize + 1.0);
943 var z = iz / (mapSize + 1.0);
944 setHeight(ix, iz, 3);
948 var mdd1 = randInt(1,2);
950 // randomize player order
952 for (var i = 0; i < numPlayers; i++)
956 playerIDs = sortPlayers(playerIDs);
960 var playerX = new Array(numPlayers);
961 var playerZ = new Array(numPlayers);
962 var playerPos = new Array(numPlayers);
964 for (var i = 0; i < numPlayers; i++)
966 playerPos[i] = (i + 1) / (numPlayers + 1);
967 if (mdd1 == 1) //horizontal
969 playerX[i] = playerPos[i];
970 playerZ[i] = 0.4 + 0.2*(i%2);
974 playerX[i] = 0.4 + 0.2*(i%2);
975 playerZ[i] = playerPos[i];
978 var fx = fractionToTiles(playerX[i]);
979 var fz = fractionToTiles(playerZ[i]);
982 addToClass(ix, iz, clPlayer);
983 addToClass(ix+5, iz, clPlayer);
984 addToClass(ix, iz+5, clPlayer);
985 addToClass(ix-5, iz, clPlayer);
986 addToClass(ix, iz-5, clPlayer);
989 var mdd2 = randInt(1,3);
990 var fadedistance = 7;
994 if ((mdd2 == 1)||(mdd2 == 3))
996 var distance = randFloat(0., 0.1);
997 for (var ix = 0; ix < mapSize; ix++)
999 for (var iz = 0; iz < mapSize; iz++)
1001 if (iz > (0.69+distance) * mapSize)
1003 if (iz < (0.69+distance) * mapSize + fadedistance)
1005 setHeight(ix, iz, 3 - 7 * (iz - (0.69+distance) * mapSize) / fadedistance);
1006 if (3 - 7 * (iz - (0.69+distance) * mapSize) / fadedistance < 0.5)
1007 addToClass(ix, iz, clWater);
1011 setHeight(ix, iz, -4);
1012 addToClass(ix, iz, clWater);
1019 for (var i = 0; i < scaleByMapSize(20,120); i++)
1021 placer = new ClumpPlacer(scaleByMapSize(50, 70), 0.2, 0.1, 10, randFloat(0.1,0.9)*mapSize, randFloat(0.67+distance,0.74+distance)*mapSize);
1022 var terrainPainter = new LayeredPainter(
1023 [tMainTerrain, tMainTerrain], // terrains
1026 var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 3, 3);
1029 [terrainPainter, elevationPainter, unPaintClass(clWater)],
1034 if ((mdd2 == 2)||(mdd2 == 3))
1036 var distance = randFloat(0., 0.1);
1037 for (var ix = 0; ix < mapSize; ix++)
1039 for (var iz = 0; iz < mapSize; iz++)
1041 if (iz < (0.31-distance) * mapSize)
1043 if (iz > (0.31-distance) * mapSize - fadedistance)
1045 setHeight(ix, iz, 3 - 7 * ((0.31-distance) * mapSize - iz) / fadedistance);
1046 if (3 - 7 * ((0.31-distance) * mapSize - iz) / fadedistance < 0.5)
1047 addToClass(ix, iz, clWater);
1051 setHeight(ix, iz, -4);
1052 addToClass(ix, iz, clWater);
1058 for (var i = 0; i < scaleByMapSize(20,120); i++)
1060 placer = new ClumpPlacer(scaleByMapSize(50, 70), 0.2, 0.1, 10, randFloat(0.1,0.9)*mapSize, randFloat(0.26-distance,0.34-distance)*mapSize);
1061 var terrainPainter = new LayeredPainter(
1062 [tMainTerrain, tMainTerrain], // terrains
1065 var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 3, 3);
1068 [terrainPainter, elevationPainter, unPaintClass(clWater)],
1076 if ((mdd2 == 1)||(mdd2 == 3))
1078 var distance = randFloat(0., 0.1);
1079 for (var ix = 0; ix < mapSize; ix++)
1081 for (var iz = 0; iz < mapSize; iz++)
1083 if (ix > (0.69+distance) * mapSize)
1085 if (ix < (0.69+distance) * mapSize + fadedistance)
1087 setHeight(ix, iz, 3 - 7 * (ix - (0.69+distance) * mapSize) / fadedistance);
1088 if (3 - 7 * (ix - (0.69+distance) * mapSize) / fadedistance < 0.5)
1089 addToClass(ix, iz, clWater);
1093 setHeight(ix, iz, -4);
1094 addToClass(ix, iz, clWater);
1100 if ((mdd2 == 2)||(mdd2 == 3))
1102 var distance = randFloat(0., 0.1);
1103 for (var ix = 0; ix < mapSize; ix++)
1105 for (var iz = 0; iz < mapSize; iz++)
1107 if (ix < (0.31-distance) * mapSize)
1109 if (ix > (0.31-distance) * mapSize - fadedistance)
1111 setHeight(ix, iz, 3 - 7 * ((0.31-distance) * mapSize - ix) / fadedistance);
1112 if (3 - 7 * ((0.31-distance) * mapSize - ix) / fadedistance < 0.5)
1113 addToClass(ix, iz, clWater);
1117 setHeight(ix, iz, -4);
1118 addToClass(ix, iz, clWater);
1126 // create shore jaggedness
1127 log("Creating shore jaggedness...");
1128 placer = new ClumpPlacer(scaleByMapSize(20, 150), 0.2, 0.1, 1);
1129 terrainPainter = new LayeredPainter(
1130 [tCliff, tHill], // terrains
1133 elevationPainter = new SmoothElevationPainter(ELEVATION_SET, -5, 4);
1136 [terrainPainter, elevationPainter, paintClass(clWater)],
1137 [avoidClasses(clPlayer, 20), borderClasses(clWater, 6, 4)],
1138 scaleByMapSize(7, 130) * 2, 150
1141 placer = new ClumpPlacer(scaleByMapSize(15, 80), 0.2, 0.1, 1);
1142 terrainPainter = new LayeredPainter(
1143 [tCliff, tHill], // terrains
1146 elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 3, 4);
1149 [terrainPainter, elevationPainter, unPaintClass(clWater)],
1150 borderClasses(clWater, 4, 7),
1151 scaleByMapSize(12, 130) * 2, 150
1154 var mdd3 = randInt(1,3);
1158 log("Creating islands...");
1159 placer = new ClumpPlacer(randInt(scaleByMapSize(8,15),scaleByMapSize(15,23))*randInt(scaleByMapSize(8,15),scaleByMapSize(15,23)), 0.80, 0.1, randFloat(0.0, 0.2));
1160 terrainPainter = new LayeredPainter(
1161 [tMainTerrain, tMainTerrain], // terrains
1164 elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 3.1, 4);
1167 [terrainPainter, elevationPainter, paintClass(clLand)],
1168 avoidClasses(clLand, 3, clPlayer, 3),
1169 scaleByMapSize(2, 5)*randInt(8,14)
1174 // create extentions
1175 log("Creating extentions...");
1176 placer = new ClumpPlacer(randInt(scaleByMapSize(13,24),scaleByMapSize(24,45))*randInt(scaleByMapSize(13,24),scaleByMapSize(24,45)), 0.80, 0.1, 10);
1177 terrainPainter = new LayeredPainter(
1178 [tMainTerrain, tMainTerrain], // terrains
1181 elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 3.1, 4);
1184 [terrainPainter, elevationPainter, paintClass(clLand)],
1186 scaleByMapSize(2, 5)*randInt(8,14)
1190 //********************************************************************************************************
1191 else if (md == 7) //gulf
1194 for (var ix = 0; ix < mapSize; ix++)
1196 for (var iz = 0; iz < mapSize; iz++)
1198 var x = ix / (mapSize + 1.0);
1199 var z = iz / (mapSize + 1.0);
1200 setHeight(ix, iz, 3);
1204 var mdd1 = randFloat(0,4);
1206 // randomize player order
1208 for (var i = 0; i < numPlayers; i++)
1210 playerIDs.push(i+1);
1212 playerIDs = sortPlayers(playerIDs);
1216 var playerX = new Array(numPlayers);
1217 var playerZ = new Array(numPlayers);
1218 var playerAngle = new Array(numPlayers);
1220 var startAngle = -PI/6 + (mdd1-1)*PI/2;
1221 for (var i = 0; i < numPlayers; i++)
1223 playerAngle[i] = startAngle + i*TWO_PI/(numPlayers-1)*2/3;
1224 playerX[i] = 0.5 + 0.35*cos(playerAngle[i]);
1225 playerZ[i] = 0.5 + 0.35*sin(playerAngle[i]);
1228 for (var i = 0; i < numPlayers; i++)
1230 var fx = fractionToTiles(playerX[i]);
1231 var fz = fractionToTiles(playerZ[i]);
1234 // create the city patch
1235 var cityRadius = scaleByMapSize(17,29)/3;
1236 placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz);
1237 createArea(placer, paintClass(clPlayer), null);
1240 fx = fractionToTiles(0.5);
1241 fz = fractionToTiles(0.5);
1247 var placer = new ClumpPlacer(mapArea * 0.08 * lSize, 0.7, 0.05, 10, ix, iz);
1248 var terrainPainter = new LayeredPainter(
1249 [tMainTerrain, tMainTerrain, tMainTerrain, tMainTerrain], // terrains
1253 var elevationPainter = new SmoothElevationPainter(
1254 ELEVATION_SET, // type
1258 createArea(placer, [terrainPainter, elevationPainter, paintClass(clWater)], avoidClasses(clPlayer,floor(scaleByMapSize(15,25))));
1260 fx = fractionToTiles(0.5 - 0.2*cos(mdd1*PI/2));
1261 fz = fractionToTiles(0.5 - 0.2*sin(mdd1*PI/2));
1265 var lSize = sqrt(sqrt(sqrt(scaleByMapSize(1, 6))));
1267 var placer = new ClumpPlacer(mapArea * 0.13 * lSize, 0.7, 0.05, 10, ix, iz);
1268 var terrainPainter = new LayeredPainter(
1269 [tMainTerrain, tMainTerrain, tMainTerrain, tMainTerrain], // terrains
1272 var elevationPainter = new SmoothElevationPainter(
1273 ELEVATION_SET, // type
1277 createArea(placer, [terrainPainter, elevationPainter, paintClass(clWater)], avoidClasses(clPlayer,floor(scaleByMapSize(15,25))));
1279 fx = fractionToTiles(0.5 - 0.49*cos(mdd1*PI/2));
1280 fz = fractionToTiles(0.5 - 0.49*sin(mdd1*PI/2));
1284 var lSize = sqrt(sqrt(sqrt(scaleByMapSize(1, 6))));
1286 var placer = new ClumpPlacer(mapArea * 0.15 * lSize, 0.7, 0.05, 10, ix, iz);
1287 var terrainPainter = new LayeredPainter(
1288 [tMainTerrain, tMainTerrain, tMainTerrain, tMainTerrain], // terrains
1291 var elevationPainter = new SmoothElevationPainter(
1292 ELEVATION_SET, // type
1296 createArea(placer, [terrainPainter, elevationPainter, paintClass(clWater)], avoidClasses(clPlayer,floor(scaleByMapSize(15,25))));
1298 //********************************************************************************************************
1299 else if (md == 8) //lakes
1302 // randomize player order
1304 for (var i = 0; i < numPlayers; i++)
1306 playerIDs.push(i+1);
1308 playerIDs = sortPlayers(playerIDs);
1312 var playerX = new Array(numPlayers);
1313 var playerZ = new Array(numPlayers);
1314 var playerAngle = new Array(numPlayers);
1316 var startAngle = randFloat(0, TWO_PI);
1317 for (var i = 0; i < numPlayers; i++)
1319 playerAngle[i] = startAngle + i*TWO_PI/numPlayers;
1320 playerX[i] = 0.5 + 0.35*cos(playerAngle[i]);
1321 playerZ[i] = 0.5 + 0.35*sin(playerAngle[i]);
1324 for (var ix = 0; ix < mapSize; ix++)
1326 for (var iz = 0; iz < mapSize; iz++)
1328 var x = ix / (mapSize + 1.0);
1329 var z = iz / (mapSize + 1.0);
1330 setHeight(ix, iz, 3);
1334 for (var i = 0; i < numPlayers; i++)
1336 var fx = fractionToTiles(playerX[i]);
1337 var fz = fractionToTiles(playerZ[i]);
1340 // create the city patch
1341 var cityRadius = scaleByMapSize(17,29)/3;
1342 placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz);
1343 createArea(placer, paintClass(clPlayer), null);
1347 log("Creating lakes...");
1348 placer = new ClumpPlacer(scaleByMapSize(160, 700), 0.2, 0.1, 1);
1349 terrainPainter = new LayeredPainter(
1350 [tShore, tWater, tWater], // terrains
1353 elevationPainter = new SmoothElevationPainter(ELEVATION_SET, -5, 5);
1354 if (randInt(1,2) == 1)
1358 [terrainPainter, elevationPainter, paintClass(clWater)],
1359 avoidClasses(clPlayer, 12, clWater, 8),
1360 scaleByMapSize(5, 16)
1367 [terrainPainter, elevationPainter, paintClass(clWater)],
1368 avoidClasses(clPlayer, 12),
1369 scaleByMapSize(5, 16)
1373 //********************************************************************************************************
1374 else if (md == 9) //passes
1377 // randomize player order
1379 for (var i = 0; i < numPlayers; i++)
1381 playerIDs.push(i+1);
1383 playerIDs = sortPlayers(playerIDs);
1387 var playerX = new Array(numPlayers);
1388 var playerZ = new Array(numPlayers);
1389 var playerAngle = new Array(numPlayers);
1391 var startAngle = randFloat(0, TWO_PI);
1392 for (var i = 0; i < numPlayers; i++)
1394 playerAngle[i] = startAngle + i*TWO_PI/numPlayers;
1395 playerX[i] = 0.5 + 0.35*cos(playerAngle[i]);
1396 playerZ[i] = 0.5 + 0.35*sin(playerAngle[i]);
1399 for (var ix = 0; ix < mapSize; ix++)
1401 for (var iz = 0; iz < mapSize; iz++)
1403 var x = ix / (mapSize + 1.0);
1404 var z = iz / (mapSize + 1.0);
1405 setHeight(ix, iz, 3);
1410 log ("Creating ranges...");
1411 for (var m = 0; m < numPlayers; m++)
1413 var tang = startAngle + (m+0.5)*TWO_PI/(numPlayers);
1414 var placer = new PathPlacer(fractionToTiles(0.5), fractionToTiles(0.5), fractionToTiles(0.5 + 0.49*cos(tang)), fractionToTiles(0.5 + 0.49*sin(tang)), scaleByMapSize(14,24), 0.4, 3*(scaleByMapSize(1,3)), 0.2, 0.05);
1415 var terrainPainter = new LayeredPainter(
1416 [tShore, tWater, tWater], // terrains
1419 var elevationPainter = new SmoothElevationPainter(
1420 ELEVATION_SET, // type
1424 createArea(placer, [terrainPainter, elevationPainter, paintClass(clWater)], avoidClasses(clPlayer, 5));
1425 placer = new ClumpPlacer(floor(PI*scaleByMapSize(10,50)*scaleByMapSize(10,50)/5), 0.95, 0.6, 10, fractionToTiles(0.5 + 0.49*cos(tang)), fractionToTiles(0.5 + 0.49*sin(tang)));
1426 var painter = new LayeredPainter([tWater, tWater], [1]);
1427 var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 24, 0);
1428 createArea(placer, [painter, elevationPainter], avoidClasses(clPlayer, 5));
1430 var placer = new PathPlacer(fractionToTiles(0.5 + 0.3*cos(tang) - 0.1 * cos(tang+PI/2)), fractionToTiles(0.5 + 0.3*sin(tang) - 0.1 * sin(tang+PI/2)), fractionToTiles(0.5 + 0.3*cos(tang) + 0.1 * cos(tang+PI/2)), fractionToTiles(0.5 + 0.3*sin(tang) + 0.1 * sin(tang+PI/2)), scaleByMapSize(14,24), 0.4, 3*(scaleByMapSize(1,3)), 0.2, 0.05);
1431 var painter = new LayeredPainter([tCliff, tCliff], [1]);
1432 var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 3, 2);
1433 createArea(placer, [painter, elevationPainter], null);
1435 var mdd1 = randInt (1,3);
1438 var fx = fractionToTiles(0.5);
1439 var fz = fractionToTiles(0.5);
1443 var placer = new ClumpPlacer(mapArea * 0.005, 0.7, 0.1, 10, ix, iz);
1444 var terrainPainter = new LayeredPainter(
1445 [tShore, tWater, tWater, tWater], // terrains
1448 var elevationPainter = new SmoothElevationPainter(
1449 ELEVATION_SET, // type
1453 createArea(placer, [terrainPainter, elevationPainter, paintClass(clWater)], null);
1457 var fx = fractionToTiles(0.5);
1458 var fz = fractionToTiles(0.5);
1462 var lSize = sqrt(sqrt(sqrt(scaleByMapSize(1, 6))));
1464 var placer = new ClumpPlacer(mapArea * 0.03 * lSize, 0.7, 0.1, 10, ix, iz);
1465 var terrainPainter = new LayeredPainter(
1466 [tShore, tWater, tWater, tWater], // terrains
1469 var elevationPainter = new SmoothElevationPainter(
1470 ELEVATION_SET, // type
1474 createArea(placer, [terrainPainter, elevationPainter, paintClass(clWater)], null);
1477 //********************************************************************************************************
1478 else if (md == 10) //lowlands
1480 // randomize player order
1482 for (var i = 0; i < numPlayers; i++)
1484 playerIDs.push(i+1);
1486 playerIDs = sortPlayers(playerIDs);
1490 var playerX = new Array(numPlayers);
1491 var playerZ = new Array(numPlayers);
1492 var playerAngle = new Array(numPlayers);
1494 var startAngle = randFloat(0, TWO_PI);
1495 for (var i = 0; i < numPlayers; i++)
1497 playerAngle[i] = startAngle + i*TWO_PI/numPlayers;
1498 playerX[i] = 0.5 + 0.35*cos(playerAngle[i]);
1499 playerZ[i] = 0.5 + 0.35*sin(playerAngle[i]);
1502 for (var ix = 0; ix < mapSize; ix++)
1504 for (var iz = 0; iz < mapSize; iz++)
1506 var x = ix / (mapSize + 1.0);
1507 var z = iz / (mapSize + 1.0);
1508 setHeight(ix, iz, 30);
1513 var radius = scaleByMapSize(18,32);
1514 var cliffRadius = 2;
1516 var hillSize = PI * radius * radius;
1519 if ((mapSize / 64 == 2)&&(numPlayers <= 2))
1523 else if ((mapSize / 64 == 3)&&(numPlayers <= 3))
1527 else if ((mapSize / 64 == 4)&&(numPlayers <= 4))
1531 else if ((mapSize / 64 == 5)&&(numPlayers <= 4))
1535 else if ((mapSize / 64 == 6)&&(numPlayers <= 5))
1539 else if ((mapSize / 64 == 7)&&(numPlayers <= 6))
1544 for (var i = 0; i < numPlayers*split; i++)
1546 var tang = startAngle + (i)*TWO_PI/(numPlayers*split);
1547 var fx = fractionToTiles(0.5 + 0.35*cos(tang));
1548 var fz = fractionToTiles(0.5 + 0.35*sin(tang));
1552 var placer = new ClumpPlacer(hillSize, 0.65, 0.1, 10, ix, iz);
1553 var terrainPainter = new LayeredPainter(
1554 [tMainTerrain, tMainTerrain], // terrains
1555 [cliffRadius] // widths
1557 var elevationPainter = new SmoothElevationPainter(
1558 ELEVATION_SET, // type
1560 cliffRadius // blend radius
1562 createArea(placer, [terrainPainter, elevationPainter, paintClass(clLand)], null);
1565 var fx = fractionToTiles(0.5);
1566 var fz = fractionToTiles(0.5);
1570 var lSize = sqrt(sqrt(sqrt(scaleByMapSize(1, 6))));
1572 var placer = new ClumpPlacer(mapArea * 0.091 * lSize, 0.7, 0.1, 10, ix, iz);
1573 var terrainPainter = new LayeredPainter(
1574 [tMainTerrain, tMainTerrain, tMainTerrain, tMainTerrain], // terrains
1577 var elevationPainter = new SmoothElevationPainter(
1578 ELEVATION_SET, // type
1582 createArea(placer, [terrainPainter, elevationPainter, paintClass(clWater)], null);
1584 for (var m = 0; m < numPlayers*split; m++)
1586 var tang = startAngle + m*TWO_PI/(numPlayers*split);
1587 var placer = new PathPlacer(fractionToTiles(0.5), fractionToTiles(0.5), fractionToTiles(0.5 + 0.35*cos(tang)), fractionToTiles(0.5 + 0.35*sin(tang)), scaleByMapSize(14,24), 0.4, 3*(scaleByMapSize(1,3)), 0.2, 0.05);
1588 var terrainPainter = new LayeredPainter(
1589 [tMainTerrain, tMainTerrain, tMainTerrain], // terrains
1592 var elevationPainter = new SmoothElevationPainter(
1593 ELEVATION_SET, // type
1597 createArea(placer, [terrainPainter, elevationPainter, paintClass(clWater)], null);
1600 //********************************************************************************************************
1604 // randomize player order
1606 for (var i = 0; i < numPlayers; i++)
1608 playerIDs.push(i+1);
1610 playerIDs = sortPlayers(playerIDs);
1614 var playerX = new Array(numPlayers);
1615 var playerZ = new Array(numPlayers);
1616 var playerAngle = new Array(numPlayers);
1618 var startAngle = randFloat(0, TWO_PI);
1619 for (var i = 0; i < numPlayers; i++)
1621 playerAngle[i] = startAngle + i*TWO_PI/numPlayers;
1622 playerX[i] = 0.5 + 0.35*cos(playerAngle[i]);
1623 playerZ[i] = 0.5 + 0.35*sin(playerAngle[i]);
1626 for (var ix = 0; ix < mapSize; ix++)
1628 for (var iz = 0; iz < mapSize; iz++)
1630 var x = ix / (mapSize + 1.0);
1631 var z = iz / (mapSize + 1.0);
1632 setHeight(ix, iz, 3);
1638 paintTerrainBasedOnHeight(3.12, 40, 1, tCliff);
1639 paintTerrainBasedOnHeight(3, 3.12, 1, tMainTerrain);
1640 paintTerrainBasedOnHeight(1, 3, 1, tShore);
1641 paintTerrainBasedOnHeight(-8, 1, 2, tWater);
1642 unPaintTileClassBasedOnHeight(0, 3.12, 1, clWater);
1643 unPaintTileClassBasedOnHeight(-6, 0, 1, clLand);
1644 paintTileClassBasedOnHeight(-6, 0, 1, clWater);
1645 paintTileClassBasedOnHeight(0, 3.12, 1, clLand);
1646 paintTileClassBasedOnHeight(3.12, 40, 1, clHill);
1648 for (var i = 0; i < numPlayers; i++)
1650 var id = playerIDs[i];
1651 log("Creating base for player " + id + "...");
1654 var radius = scaleByMapSize(17,29);
1655 var shoreRadius = 4;
1658 var hillSize = PI * radius * radius;
1659 // get the x and z in tiles
1660 var fx = fractionToTiles(playerX[i]);
1661 var fz = fractionToTiles(playerZ[i]);
1665 // create starting units
1667 placeCivDefaultEntities(fx, fz, id, { 'iberWall': 'towers' });
1669 placeCivDefaultEntities(fx, fz, id);
1671 placeDefaultChicken(fx, fz, clBaseResource);
1673 // create berry bushes
1674 var bbAngle = randFloat(0, TWO_PI);
1676 var bbX = round(fx + bbDist * cos(bbAngle));
1677 var bbZ = round(fz + bbDist * sin(bbAngle));
1678 var group = new SimpleGroup(
1679 [new SimpleObject(oFruitBush, 5,5, 0,3)],
1680 true, clBaseResource, bbX, bbZ
1682 createObjectGroup(group, 0);
1683 if (needsAdditionalWood)
1686 var bbAngle = randFloat(0, TWO_PI);
1688 var bbX = round(fx + bbDist * cos(bbAngle));
1689 var bbZ = round(fz + bbDist * sin(bbAngle));
1690 group = new SimpleGroup(
1691 [new SimpleObject(oWood, 14,14, 0,3)],
1692 true, clBaseResource, bbX, bbZ
1694 createObjectGroup(group, 0);
1697 // create metal mine
1698 var mAngle = bbAngle;
1699 while(abs(mAngle - bbAngle) < PI/3)
1701 mAngle = randFloat(0, TWO_PI);
1704 var mX = round(fx + mDist * cos(mAngle));
1705 var mZ = round(fz + mDist * sin(mAngle));
1706 group = new SimpleGroup(
1707 [new SimpleObject(oMetalLarge, 1,1, 0,0)],
1708 true, clBaseResource, mX, mZ
1710 createObjectGroup(group, 0);
1712 // create stone mines
1713 mAngle += randFloat(PI/8, PI/4);
1714 mX = round(fx + mDist * cos(mAngle));
1715 mZ = round(fz + mDist * sin(mAngle));
1716 group = new SimpleGroup(
1717 [new SimpleObject(oStoneLarge, 1,1, 0,2)],
1718 true, clBaseResource, mX, mZ
1720 createObjectGroup(group, 0);
1721 var hillSize = PI * radius * radius;
1722 // create starting trees
1723 var num = floor(hillSize / 100);
1724 var tAngle = randFloat(-PI/3, 4*PI/3);
1725 var tDist = randFloat(11, 13);
1726 var tX = round(fx + tDist * cos(tAngle));
1727 var tZ = round(fz + tDist * sin(tAngle));
1728 group = new SimpleGroup(
1729 [new SimpleObject(oTree1, num, num, 0,5)],
1730 false, clBaseResource, tX, tZ
1732 createObjectGroup(group, 0, avoidClasses(clBaseResource,2));
1734 // create grass tufts
1735 var num = hillSize / 250;
1736 for (var j = 0; j < num; j++)
1738 var gAngle = randFloat(0, TWO_PI);
1739 var gDist = radius - (5 + randInt(7));
1740 var gX = round(fx + gDist * cos(gAngle));
1741 var gZ = round(fz + gDist * sin(gAngle));
1742 group = new SimpleGroup(
1743 [new SimpleObject(aGrassShort, 2,5, 0,1, -PI/8,PI/8)],
1744 false, clBaseResource, gX, gZ
1746 createObjectGroup(group, 0);
1750 for (var i = 0; i < numPlayers; i++)
1752 var fx = fractionToTiles(playerX[i]);
1753 var fz = fractionToTiles(playerZ[i]);
1756 // create the city patch
1757 var cityRadius = radius/3;
1758 placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz);
1759 var painter = new LayeredPainter([tRoadWild, tRoad], [1]);
1760 createArea(placer, [painter, paintClass(clPlayer)], null);
1764 log("Creating bumps...");
1765 placer = new ClumpPlacer(scaleByMapSize(20, 50), 0.3, 0.06, 1);
1766 painter = new SmoothElevationPainter(ELEVATION_MODIFY, 2, 2);
1770 [avoidClasses(clWater, 2, clPlayer, 10), stayClasses(clLand, 3)],
1771 randInt(0,scaleByMapSize(200, 400))
1775 log("Creating hills...");
1776 placer = new ClumpPlacer(scaleByMapSize(20, 150), 0.2, 0.1, 1);
1777 terrainPainter = new LayeredPainter(
1778 [tCliff, tHill], // terrains
1781 elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 18, 2);
1784 [terrainPainter, elevationPainter, paintClass(clHill)],
1785 [avoidClasses(clPlayer, 20, clHill, randInt(6, 18)), stayClasses(clLand, 0)],
1786 randInt(0, scaleByMapSize(4, 8))*randInt(1, scaleByMapSize(4, 9))
1789 var multiplier = sqrt(randFloat(0.5,1.2)*randFloat(0.5,1.2));
1790 // calculate desired number of trees for map (based on size)
1791 if (random_terrain == g_BiomeSavanna)
1793 var MIN_TREES = floor(200*multiplier);
1794 var MAX_TREES = floor(1250*multiplier);
1795 var P_FOREST = randFloat(0.02, 0.05);
1797 else if (random_terrain == g_BiomeTropic)
1799 var MIN_TREES = floor(1000*multiplier);
1800 var MAX_TREES = floor(6000*multiplier);
1801 var P_FOREST = randFloat(0.5, 0.7);
1805 var MIN_TREES = floor(500*multiplier);
1806 var MAX_TREES = floor(3000*multiplier);
1807 var P_FOREST = randFloat(0.5,0.8);
1809 var totalTrees = scaleByMapSize(MIN_TREES, MAX_TREES);
1810 var numForest = totalTrees * P_FOREST;
1811 var numStragglers = totalTrees * (1.0 - P_FOREST);
1814 log("Creating forests...");
1816 [[tForestFloor2, tMainTerrain, pForest1], [tForestFloor2, pForest1]],
1817 [[tForestFloor1, tMainTerrain, pForest2], [tForestFloor1, pForest2]]
1818 ]; // some variation
1820 if (random_terrain == g_BiomeSavanna)
1821 var size = numForest / (0.5 * scaleByMapSize(2,8) * numPlayers);
1823 var size = numForest / (scaleByMapSize(2,8) * numPlayers);
1825 var num = floor(size / types.length);
1826 for (var i = 0; i < types.length; ++i)
1828 placer = new ClumpPlacer(numForest / num, 0.1, 0.1, 1);
1829 painter = new LayeredPainter(
1830 types[i], // terrains
1835 [painter, paintClass(clForest)],
1836 [avoidClasses(clPlayer, 20, clForest, randInt(5, 15), clHill, 0), stayClasses(clLand, 4)],
1841 RMS.SetProgress(50);
1842 // create dirt patches
1843 log("Creating dirt patches...");
1844 var sizes = [scaleByMapSize(3, 48), scaleByMapSize(5, 84), scaleByMapSize(8, 128)];
1846 if (random_terrain == g_BiomeSavanna)
1848 for (var i = 0; i < sizes.length; i++)
1850 placer = new ClumpPlacer(sizes[i], 0.3, 0.06, 0.5);
1851 painter = new LayeredPainter(
1852 [[tMainTerrain,tTier1Terrain],[tTier1Terrain,tTier2Terrain], [tTier2Terrain,tTier3Terrain]], // terrains
1857 [painter, paintClass(clDirt)],
1858 [avoidClasses(clForest, 0, clHill, 0, clDirt, 5, clPlayer, 7), stayClasses(clLand, 4)],
1859 numb*scaleByMapSize(15, 45)
1863 // create grass patches
1864 log("Creating grass patches...");
1865 var sizes = [scaleByMapSize(2, 32), scaleByMapSize(3, 48), scaleByMapSize(5, 80)];
1866 for (var i = 0; i < sizes.length; i++)
1868 placer = new ClumpPlacer(sizes[i], 0.3, 0.06, 0.5);
1869 painter = new TerrainPainter(tTier4Terrain);
1873 [avoidClasses(clForest, 0, clHill, 0, clDirt, 5, clPlayer, 7), stayClasses(clLand, 4)],
1874 numb*scaleByMapSize(15, 45)
1877 RMS.SetProgress(55);
1880 log("Creating stone mines...");
1881 // create large stone quarries
1882 group = new SimpleGroup([new SimpleObject(oStoneSmall, 0,2, 0,4), new SimpleObject(oStoneLarge, 1,1, 0,4)], true, clRock);
1883 createObjectGroups(group, 0,
1884 [avoidClasses(clForest, 1, clPlayer, 20, clRock, 10, clHill, 1), stayClasses(clLand, 4)],
1885 randInt(scaleByMapSize(2,9),scaleByMapSize(9,40)), 100
1888 // create small stone quarries
1889 group = new SimpleGroup([new SimpleObject(oStoneSmall, 2,5, 1,3)], true, clRock);
1890 createObjectGroups(group, 0,
1891 [avoidClasses(clForest, 1, clPlayer, 20, clRock, 10, clHill, 1), stayClasses(clLand, 4)],
1892 randInt(scaleByMapSize(2,9),scaleByMapSize(9,40)), 100
1895 log("Creating metal mines...");
1896 // create large metal quarries
1897 group = new SimpleGroup([new SimpleObject(oMetalLarge, 1,1, 0,4)], true, clMetal);
1898 createObjectGroups(group, 0,
1899 [avoidClasses(clForest, 1, clPlayer, 20, clMetal, 10, clRock, 5, clHill, 1), stayClasses(clLand, 4)],
1900 randInt(scaleByMapSize(2,9),scaleByMapSize(9,40)), 100
1903 RMS.SetProgress(65);
1905 // create small decorative rocks
1906 log("Creating small decorative rocks...");
1907 group = new SimpleGroup(
1908 [new SimpleObject(aRockMedium, 1,3, 0,1)],
1913 [avoidClasses(clWater, 0, clForest, 0, clPlayer, 0, clHill, 0), stayClasses(clLand, 4)],
1914 scaleByMapSize(16, 262), 50
1918 // create large decorative rocks
1919 log("Creating large decorative rocks...");
1920 group = new SimpleGroup(
1921 [new SimpleObject(aRockLarge, 1,2, 0,1), new SimpleObject(aRockMedium, 1,3, 0,2)],
1926 [avoidClasses(clWater, 0, clForest, 0, clPlayer, 0, clHill, 0), stayClasses(clLand, 4)],
1927 scaleByMapSize(8, 131), 50
1930 RMS.SetProgress(70);
1933 log("Creating deer...");
1934 group = new SimpleGroup(
1935 [new SimpleObject(oMainHuntableAnimal, 5,7, 0,4)],
1938 createObjectGroups(group, 0,
1939 [avoidClasses(clWater, 0, clForest, 0, clPlayer, 20, clHill, 1, clFood, 20), stayClasses(clLand, 4)],
1940 randInt(numPlayers+3, 5*numPlayers+4), 50
1943 // create berry bush
1944 log("Creating berry bush...");
1945 group = new SimpleGroup(
1946 [new SimpleObject(oFruitBush, 5,7, 0,4)],
1949 createObjectGroups(group, 0,
1950 [avoidClasses(clWater, 0, clForest, 0, clPlayer, 20, clHill, 1, clFood, 20), stayClasses(clLand, 4)],
1951 randInt(1, 4) * numPlayers + 2, 50
1954 RMS.SetProgress(75);
1957 log("Creating sheep...");
1958 group = new SimpleGroup(
1959 [new SimpleObject(oSecondaryHuntableAnimal, 2,3, 0,2)],
1962 createObjectGroups(group, 0,
1963 [avoidClasses(clWater, 0, clForest, 0, clPlayer, 20, clHill, 1, clFood, 20), stayClasses(clLand, 4)],
1964 randInt(numPlayers+3, 5*numPlayers+4), 50
1968 log("Creating fish...");
1969 group = new SimpleGroup(
1970 [new SimpleObject(oFish, 2,3, 0,2)],
1973 createObjectGroups(group, 0,
1974 avoidClasses(clLand, 5, clForest, 0, clPlayer, 0, clHill, 0, clFood, 20),
1975 randInt(15, 40) * numPlayers, 60
1978 RMS.SetProgress(85);
1981 // create straggler trees
1982 log("Creating straggler trees...");
1983 var types = [oTree1, oTree2, oTree4, oTree3]; // some variation
1984 var num = floor(numStragglers / types.length);
1985 for (var i = 0; i < types.length; ++i)
1987 group = new SimpleGroup(
1988 [new SimpleObject(types[i], 1,1, 0,3)],
1991 createObjectGroups(group, 0,
1992 [avoidClasses(clWater, 1, clForest, 1, clHill, 1, clPlayer, 0, clMetal, 1, clRock, 1), stayClasses(clLand, 4)],
1998 if (random_terrain == g_BiomeTropic)
2001 //create small grass tufts
2002 log("Creating small grass tufts...");
2003 group = new SimpleGroup(
2004 [new SimpleObject(aGrassShort, 1,2, 0,1, -PI/8,PI/8)]
2006 createObjectGroups(group, 0,
2007 [avoidClasses(clWater, 2, clHill, 2, clPlayer, 2, clDirt, 0), stayClasses(clLand, 4)],
2008 planetm * scaleByMapSize(13, 200)
2011 RMS.SetProgress(90);
2013 // create large grass tufts
2014 log("Creating large grass tufts...");
2015 group = new SimpleGroup(
2016 [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)]
2018 createObjectGroups(group, 0,
2019 [avoidClasses(clWater, 3, clHill, 2, clPlayer, 2, clDirt, 1, clForest, 0), stayClasses(clLand, 4)],
2020 planetm * scaleByMapSize(13, 200)
2023 RMS.SetProgress(95);
2025 // create shallow flora
2026 log("Creating shallow flora...");
2027 group = new SimpleGroup(
2028 [new SimpleObject(aLillies, 1,2, 0,2), new SimpleObject(aReeds, 2,4, 0,2)]
2030 createObjectGroups(group, 0,
2031 stayClasses(clShallow, 1),
2032 60 * scaleByMapSize(13, 200), 80
2036 log("Creating bushes...");
2037 group = new SimpleGroup(
2038 [new SimpleObject(aBushMedium, 1,2, 0,2), new SimpleObject(aBushSmall, 2,4, 0,2)]
2040 createObjectGroups(group, 0,
2041 [avoidClasses(clWater, 1, clHill, 1, clPlayer, 1, clDirt, 1), stayClasses(clLand, 3)],
2042 planetm * scaleByMapSize(13, 200), 50
2045 random_terrain = randInt(1,6);
2046 if (random_terrain == 1)
2047 setSkySet("cirrus");
2048 else if (random_terrain == 2)
2049 setSkySet("cumulus");
2050 else if (random_terrain == 3)
2052 else if (random_terrain == 4)
2053 setSkySet("sunny 1");
2054 else if (random_terrain == 5)
2055 setSkySet("mountainous");
2056 else if (random_terrain == 6)
2057 setSkySet("stratus");
2059 setSunRotation(randFloat(0, TWO_PI));
2060 setSunElevation(randFloat(PI/ 5, PI / 3));