From efd9b3e212fcf5477d1da3e8fb26c7c731bc5c08 Mon Sep 17 00:00:00 2001 From: elexis Date: Tue, 7 Nov 2017 17:11:51 +0000 Subject: [PATCH] Obliterate Unknown (0d0bc32736), Unknown Land (25682da568) and Unknown Nomad (7f8adcf8cb) triplication of doom, fixes #4317. Refactor by moving from procedural programming to functional programming. Fix the horrendous shoreline performance bug on "Continent" of Unknown as in 49721cff33 by dropping the historic differences between the maps. Remove misleading player coordinate computation when generating the terrain on Unknown Nomad, because the players are spawned elsewhere then. Remove names like md, mdd1 and mdd2 with different connotations in every landscape type. Remove six more paintRiver copies in the "Edge Seas" variant as in 7d0cc59136. Remove createShoreJaggedness and createExtensionsOrIslands duplication within this triplication. Remove heightmap initialization octuplication by adding initHeight. Remove horizontal/vertical duplication by using logical operators. Remove Painters redundant with the paintTerrainBasedOnHeight calls, pointless comments and cleanup createArea calls as in 376d8b3d1e. Remove some forest helper duplication as in ac8f4f49fc. Remove references to Math proxies and use the prototype functions directly. Remove whitespace issues. Describe remaining calls with human-readable log messages. Always spawn enough treasures for a CC (instead of sometimes only giving enough for a dock), refs 5dd3cbb254. Generate "Mainland" variant with the same probability as the other landscape types. Generate "Central Sea" variant on Unknown Land too by forcing an Isthmus then. Don't split players on Unknown Nomad on the "Rivers And Lake" variation, because the resource imbalance is too drastic. Consistently call markPlayerArea before terrain generation on non-Nomad maps. Differential Revision: https://code.wildfiregames.com/D252 This was SVN commit r20420. --- .../mods/public/maps/random/rmgen/library.js | 5 + .../data/mods/public/maps/random/rmgen/map.js | 10 + .../maps/random/the_unknown/unknown_common.js | 1153 ++++++++++++ .../data/mods/public/maps/random/unknown.js | 1593 +---------------- .../mods/public/maps/random/unknown_land.js | 1381 +------------- .../mods/public/maps/random/unknown_nomad.js | 1314 +------------- 6 files changed, 1191 insertions(+), 4265 deletions(-) create mode 100644 binaries/data/mods/public/maps/random/the_unknown/unknown_common.js diff --git a/binaries/data/mods/public/maps/random/rmgen/library.js b/binaries/data/mods/public/maps/random/rmgen/library.js index a44f0254fa..86cbb971ac 100644 --- a/binaries/data/mods/public/maps/random/rmgen/library.js +++ b/binaries/data/mods/public/maps/random/rmgen/library.js @@ -410,6 +410,11 @@ function setHeight(x, z, height) g_Map.setHeight(x, z, height); } +function initHeight(height) +{ + g_Map.initHeight(height); +} + /** * Utility functions for classes */ diff --git a/binaries/data/mods/public/maps/random/rmgen/map.js b/binaries/data/mods/public/maps/random/rmgen/map.js index cca20222a9..0a046ab3df 100644 --- a/binaries/data/mods/public/maps/random/rmgen/map.js +++ b/binaries/data/mods/public/maps/random/rmgen/map.js @@ -58,6 +58,16 @@ function Map(size, baseHeight) this.entityCount = 150; } +/** + * Sets the elevation of the entire heightmap grid to the given value. + */ +Map.prototype.initHeight = function(height) +{ + for (let i = 0; i < this.size; ++i) + for (let j = 0; j < this.size; ++j) + this.height[i][j] = height; +}; + /** * Returns the ID of a texture name. * Creates a new ID if there isn't one assigned yet. diff --git a/binaries/data/mods/public/maps/random/the_unknown/unknown_common.js b/binaries/data/mods/public/maps/random/the_unknown/unknown_common.js new file mode 100644 index 0000000000..ea330c5710 --- /dev/null +++ b/binaries/data/mods/public/maps/random/the_unknown/unknown_common.js @@ -0,0 +1,1153 @@ +/** + * @file This library is used to generate different map variations on the map Unknown, Unknown Land and Unknown Nomad. + */ + +/** + * True if city centers should be placed or false for nomad. + */ +var g_PlayerBases; + +/** + * True if all players should be connected via land and false if river or islands can split some if not all the players. + */ +var g_AllowNaval; + +TILE_CENTERED_HEIGHT_MAP = true; + +setSelectedBiome(); + +const tMainTerrain = g_Terrains.mainTerrain; +const tForestFloor1 = g_Terrains.forestFloor1; +const tForestFloor2 = g_Terrains.forestFloor2; +const tCliff = g_Terrains.cliff; +const tTier1Terrain = g_Terrains.tier1Terrain; +const tTier2Terrain = g_Terrains.tier2Terrain; +const tTier3Terrain = g_Terrains.tier3Terrain; +const tHill = g_Terrains.hill; +const tRoad = g_Terrains.road; +const tRoadWild = g_Terrains.roadWild; +const tTier4Terrain = g_Terrains.tier4Terrain; +const tShore = g_Terrains.shore; +const tWater = g_Terrains.water; + +const oTree1 = g_Gaia.tree1; +const oTree2 = g_Gaia.tree2; +const oTree4 = g_Gaia.tree4; +const oTree5 = g_Gaia.tree5; +const oFruitBush = g_Gaia.fruitBush; +const oMainHuntableAnimal = g_Gaia.mainHuntableAnimal; +const oSecondaryHuntableAnimal = g_Gaia.secondaryHuntableAnimal; +const oFish = g_Gaia.fish; +const oStoneLarge = g_Gaia.stoneLarge; +const oStoneSmall = g_Gaia.stoneSmall; +const oMetalLarge = g_Gaia.metalLarge; +const oWoodTreasure = "gaia/special_treasure_wood"; + +const aGrass = g_Decoratives.grass; +const aGrassShort = g_Decoratives.grassShort; +const aReeds = g_Decoratives.reeds; +const aLillies = g_Decoratives.lillies; +const aRockLarge = g_Decoratives.rockLarge; +const aRockMedium = g_Decoratives.rockMedium; +const aBushMedium = g_Decoratives.bushMedium; +const aBushSmall = g_Decoratives.bushSmall; + +const pForest1 = [tForestFloor2 + TERRAIN_SEPARATOR + oTree1, tForestFloor2 + TERRAIN_SEPARATOR + oTree2, tForestFloor2]; +const pForest2 = [tForestFloor1 + TERRAIN_SEPARATOR + oTree4, tForestFloor1 + TERRAIN_SEPARATOR + oTree5, tForestFloor1]; + +InitMap(); + +const numPlayers = getNumPlayers(); +const mapSize = getMapSize(); +const mapArea = getMapArea(); +const lSize = Math.pow(scaleByMapSize(1, 6), 1/8); + +var clPlayer = createTileClass(); +var clPlayerTerritory = createTileClass(); +var clHill = createTileClass(); +var clForest = createTileClass(); +var clWater = createTileClass(); +var clDirt = createTileClass(); +var clRock = createTileClass(); +var clMetal = createTileClass(); +var clFood = createTileClass(); +var clPeninsulaSteam = createTileClass(); +var clBaseResource = createTileClass(); +var clLand = createTileClass(); +var clShallow = createTileClass(); + +var landHeight = 3; +var cliffHeight = 3.12; +var landElevationPainter = new SmoothElevationPainter(ELEVATION_SET, landHeight, 4); + +var unknownMapFunctions = { + "land": [ + "Continent", + "CentralSea", + "CentralRiver", + "EdgeSeas", + "Gulf", + "Lakes", + "Passes", + "Lowlands", + "Mainland" + ], + "naval": [ + "Archipelago", + "RiversAndLake" + ] +}; + +/** + * The player IDs and locations shall only be determined by the landscape functions if it's not a nomad game, + * because nomad maps randomize the locations after the terrain generation. + * The locations should only determined by the landscape functions to avoid placing bodies of water and resources into civic centers and the starting resources. + */ +var playerIDs = sortAllPlayers(); +var playerX = []; +var playerZ = []; + +var g_StartingTreasures = false; +var g_IberianWalls = "walls"; + +function createUnknownMap() +{ + let funcs = unknownMapFunctions.land; + + if (g_AllowNaval) + funcs = funcs.concat(unknownMapFunctions.naval); + + global["unknown" + pickRandom(funcs)](); + + paintUnknownMapBasedOnHeight(); + + if (g_PlayerBases) + createUnknownPlayerBases(); +} + +/** + * Chain of islands or many disconnected islands. + */ +function unknownArchipelago() +{ + g_IberianWalls = "towers"; + g_StartingTreasures = true; + + let [pIDs, islandX, islandZ] = radialPlayerPlacement(); + if (g_PlayerBases) + { + [playerIDs, playerX, playerZ] = [pIDs, islandX, islandZ]; + markPlayerArea("large"); + } + + log("Creating islands..."); + let islandSize = diskArea(scaleByMapSize(17, 29)); + for (let i = 0; i < numPlayers; ++i) + createArea( + new ClumpPlacer(islandSize, 0.8, 0.1, 10, fractionToTiles(islandX[i]), fractionToTiles(islandZ[i])), + landElevationPainter, + null); + + let type = randIntInclusive(1, 3); + if (type == 1) + { + log("Creating archipelago..."); + createAreas( + new ClumpPlacer(Math.floor(islandSize * randFloat(0.8, 1.2)), 0.8, 0.1, 10), + [ + landElevationPainter, + paintClass(clLand) + ], + null, + scaleByMapSize(2, 5) * randIntInclusive(8, 14)); + + log("Creating shore jaggedness with small puddles..."); + createAreas( + new ClumpPlacer(scaleByMapSize(15, 80), 0.2, 0.1, 1), + [ + new SmoothElevationPainter(ELEVATION_SET, landHeight, 4), + paintClass(clLand) + ], + borderClasses(clLand, 6, 3), + scaleByMapSize(12, 130) * 2, + 150); + } + else if (type == 2) + { + log("Creating islands..."); + createAreas( + new ClumpPlacer(Math.floor(islandSize * randFloat(0.6, 1.4)), 0.8, 0.1, randFloat(0.0, 0.2)), + [ + landElevationPainter, + paintClass(clLand) + ], + avoidClasses(clLand, 3, clPlayerTerritory, 3), + scaleByMapSize(6, 10) * randIntInclusive(8, 14)); + + log("Creating small islands..."); + createAreas( + new ClumpPlacer(Math.floor(islandSize * randFloat(0.3, 0.7)), 0.8, 0.1, 0.07), + [ + new SmoothElevationPainter(ELEVATION_SET, landHeight, 6), + paintClass(clLand) + ], + avoidClasses(clLand, 3, clPlayerTerritory, 3), + scaleByMapSize(2, 6) * randIntInclusive(6, 15), + 25); + } + else if (type == 3) + { + log("Creating tight islands..."); + createAreas( + new ClumpPlacer(Math.floor(islandSize * randFloat(0.8, 1.2)), 0.8, 0.1, 10), + [ + landElevationPainter, + paintClass(clLand) + ], + avoidClasses(clLand, randIntInclusive(8, 16), clPlayerTerritory, 3), + scaleByMapSize(2, 5) * randIntInclusive(8, 14)); + } +} + +/** + * Disk shaped mainland with water on the edge. + */ +function unknownContinent() +{ + let waterHeight = -5; + + if (g_PlayerBases) + { + log("Ensuring player area..."); + [playerIDs, playerX, playerZ] = radialPlayerPlacement(0.25); + markPlayerArea("small"); + + for (let i = 0; i < numPlayers; ++i) + createArea( + new ChainPlacer( + 2, + Math.floor(scaleByMapSize(5, 9)), + Math.floor(scaleByMapSize(5, 20)), + 1, + Math.round(fractionToTiles(playerX[i])), + Math.round(fractionToTiles(playerZ[i])), + 0, + [Math.floor(scaleByMapSize(23, 50))]), + [ + landElevationPainter, + paintClass(clLand) + ], + null); + } + + log("Creating continent..."); + createArea( + new ClumpPlacer(mapArea * 0.45, 0.9, 0.09, 10, Math.round(fractionToTiles(0.5)), Math.round(fractionToTiles(0.5))), + [ + landElevationPainter, + paintClass(clLand) + ], + null); + + if (randBool(1/3)) + { + log("Creating peninsula (i.e. half the map not being surrounded by water)..."); + let angle = randFloat(0, 2 * Math.PI); + createArea( + new ClumpPlacer( + mapArea * 0.45, + 0.9, + 0.09, + 10, + Math.round(fractionToTiles(0.5 + 0.25 * Math.cos(angle))), + Math.round(fractionToTiles(0.5 + 0.25 * Math.sin(angle)))), + [ + landElevationPainter, + paintClass(clLand) + ], + null); + + log("Remembering to not paint shorelines into the peninsula..."); + createArea( + new ClumpPlacer( + mapArea * 0.3, + 0.9, + 0.01, + 10, + Math.round(fractionToTiles(0.5 + 0.35 * Math.cos(angle))), + Math.round(fractionToTiles(0.5 + 0.35 * Math.sin(angle)))), + paintClass(clPeninsulaSteam), + null); + } + + createShoreJaggedness(waterHeight, clLand, 7); +} + +/** + * Creates a huge central river, possibly connecting the riversides with a narrow piece of land. + */ +function unknownCentralSea() +{ + let waterHeight = -3; + + let horizontal = randBool(); + + paintRiver({ + "horizontal": horizontal, + "parallel": false, + "position": 0.5, + "width": randFloat(0.22, 0.3) + scaleByMapSize(0.05, 0.2), + "fadeDist": 0.025, + "deviation": 0, + "waterHeight": waterHeight, + "landHeight": landHeight, + "meanderShort": 20, + "meanderLong": 0, + "waterFunc": (ix, iz, height) => { + if (height < 0) + addToClass(ix, iz, clWater); + }, + "landFunc": (ix, iz, shoreDist1, shoreDist2) => { + setHeight(ix, iz, 3.1); + addToClass(ix, iz, clLand); + } + }); + + if (g_PlayerBases) + { + playerIDs = primeSortAllPlayers(); + let playerPos = placePlayersRiver(); + + for (let i = 0; i < numPlayers; ++i) + { + playerX[i] = playerPos[i]; + playerZ[i] = 0.2 + 0.6 * (i % 2); + } + + if (!horizontal) + [playerX, playerZ] = [playerZ, playerX]; + markPlayerArea("small"); + } + + if (!g_AllowNaval || randBool()) + { + log("Creating isthmus (i.e. connecting the two riversides with a big land passage)..."); + let [coord1, coord2] = centralRiverCoordinates(!horizontal); + createArea( + new PathPlacer( + ...coord1, + ...coord2, + scaleByMapSize(randIntInclusive(16, 24), + randIntInclusive(100, 140)), + 0.5, + 3 * scaleByMapSize(1, 4), + 0.1, + 0.01), + [ + landElevationPainter, + paintClass(clLand), + unPaintClass(clWater) + ], + null); + } + + createExtensionsOrIslands(); + // Don't createShoreJaggedness since it doesn't fit artistically here +} + +/** + * Creates a very small central river. + */ +function unknownCentralRiver() +{ + let waterHeight = -4; + + initHeight(landHeight); + + let horizontal = randBool(); + + if (g_PlayerBases) + { + playerIDs = primeSortAllPlayers(); + let playerPos = placePlayersRiver(); + + for (let i = 0; i < numPlayers; ++i) + { + playerX[i] = playerPos[i]; + playerZ[i] = 0.25 + 0.5*(i%2); + } + + if (!horizontal) + [playerX, playerZ] = [playerZ, playerX]; + + markPlayerArea("large"); + } + + log("Creating the main river..."); + let [coord1, coord2] = centralRiverCoordinates(horizontal); + createArea( + new PathPlacer(...coord1, ...coord2, scaleByMapSize(14, 24), 0.5, scaleByMapSize(3, 12), 0.1, 0.01), + new SmoothElevationPainter(ELEVATION_SET, waterHeight, 4), + avoidClasses(clPlayerTerritory, 4)); + + log("Creating small water spots at the map border to ensure separation of players..."); + for (let coord of [coord1, coord2]) + createArea( + new ClumpPlacer(Math.floor(diskArea(scaleByMapSize(5, 10))), 0.95, 0.6, 10, ...coord), + new SmoothElevationPainter(ELEVATION_SET, waterHeight, 2), + avoidClasses(clPlayerTerritory, 8)); + + if (!g_AllowNaval || randBool()) + { + log("Creating the shallows of the main river..."); + for (let i = 0; i <= randIntInclusive(1, scaleByMapSize(4, 8)); ++i) + { + let cLocation = randFloat(0.15, 0.85); + let x1 = [fractionToTiles(cLocation), fractionToTiles(0.35)]; + let x2 = [fractionToTiles(cLocation), fractionToTiles(0.65)]; + if (!horizontal) + { + x1.reverse(); + x2.reverse(); + } + createShallowsPassage(...x1, ...x2, scaleByMapSize(4, 8), -2, -2, 2, clShallow, undefined, waterHeight); + } + } + + if (randBool(2/3)) + createTributaryRivers( + horizontal, + randIntInclusive(8, scaleByMapSize(12, 16)), + scaleByMapSize(10, 20), + -4, + [-6, -1.5], + Math.PI / 5, + clWater, + clShallow, + avoidClasses(clPlayerTerritory, 3)); +} + +/** + * Creates a circular lake in the middle and possibly a river between each player ("pizza slices"). + */ +function unknownRiversAndLake() +{ + let waterHeight = -4; + initHeight(landHeight); + + let startAngle; + if (g_PlayerBases) + { + let playerAngle; + [playerIDs, playerX, playerZ, playerAngle, startAngle] = radialPlayerPlacement(); + markPlayerArea("small"); + } + + let mid = Math.round(fractionToTiles(0.5)); + let lake = randBool(3/4); + if (lake) + { + log("Creating lake..."); + createArea( + new ClumpPlacer(mapArea * 0.09 * lSize, 0.7, 0.1, 10, mid, mid), + [ + new SmoothElevationPainter(ELEVATION_SET, waterHeight, 4), + paintClass(clWater) + ], + null); + + createShoreJaggedness(waterHeight, clWater, 3); + } + + // Don't do this on nomad because the imbalances on the different islands are too drastic + if (g_PlayerBases && (!lake || randBool(1/3))) + { + log("Creating small rivers separating players..."); + let [riverX, riverZ, riverAngle] = distributePointsOnCircle(numPlayers, startAngle + Math.PI / numPlayers, 0.5, 0.5, 0.5); + + for (let i = 0; i < numPlayers; ++i) + { + createArea( + new PathPlacer(mid, mid, fractionToTiles(riverX[i]), fractionToTiles(riverZ[i]), scaleByMapSize(14, 24), 0.4, 3 * scaleByMapSize(1, 3), 0.2, 0.05), + [ + new SmoothElevationPainter(ELEVATION_SET, waterHeight, 4), + paintClass(clWater) + ], + avoidClasses(clPlayer, 5)); + + createArea( + new ClumpPlacer(Math.floor(diskArea(scaleByMapSize(10, 50)) / 5), 0.95, 0.6, 10, fractionToTiles(riverX[i]), fractionToTiles(riverZ[i])), + [ + new SmoothElevationPainter(ELEVATION_SET, waterHeight, 0), + paintClass(clWater) + ], + avoidClasses(clPlayer, 5)); + } + + log("Creating lake..."); + createArea( + new ClumpPlacer(mapArea * 0.005, 0.7, 0.1, 10, mid, mid), + [ + new SmoothElevationPainter(ELEVATION_SET, waterHeight, 4), + paintClass(clWater) + ], + null); + } + + if (lake && randBool()) + { + log("Creating small central island..."); + createArea( + new ClumpPlacer(mapArea * 0.006 * lSize, 0.7, 0.1, 10, mid, mid), + [ + landElevationPainter, + paintClass(clWater) + ], + null); + } +} + +/** + * Align players on a land strip with seas bordering on one or both sides that can hold islands. + */ +function unknownEdgeSeas() +{ + let waterHeight = -4; + initHeight(landHeight); + + let horizontal = randBool(); + if (g_PlayerBases) + { + for (let i = 0; i < numPlayers; i++) + { + let playerPos1 = (i + 1) / (numPlayers + 1); + let playerPos2 = 0.4 + 0.2 * (i % 2); + + playerX[i] = horizontal ? playerPos1 : playerPos2; + playerZ[i] = horizontal ? playerPos2 : playerPos1; + } + // Don't place the shoreline inside the CC, but possibly into the players territory + markPlayerArea("small"); + } + + for (let location of pickRandom([["first"], ["second"], ["first", "second"]])) + paintRiver({ + "horizontal": horizontal, + "parallel": false, + "position": (location == "first" ? 0 : 1) + (location == "first" ? -1 : 1) * randFloat(0, scaleByMapSize(0, 0.1)), + "width": 0.62, + "fadeDist": 0.015, + "deviation": 0, + "waterHeight": waterHeight, + "landHeight": landHeight, + "meanderShort": 20, + "meanderLong": 0 + }); + + createExtensionsOrIslands(); + paintTileClassBasedOnHeight(0, cliffHeight, 1, clLand); + createShoreJaggedness(waterHeight, clLand, 7, false); +} + +/** + * Land shaped like a concrescent moon around a central lake. + */ +function unknownGulf() +{ + let waterHeight = -3; + initHeight(landHeight); + + let startAngle = randFloat(0, 2) * Math.PI; + if (g_PlayerBases) + { + log("Determining player locations..."); + for (let i = 0; i < numPlayers; ++i) + { + let playerAngle = startAngle + 2/3 * Math.PI * (-1 + (numPlayers == 1 ? 1 : 2 * i / (numPlayers - 1))); + playerX[i] = 0.5 + 0.35 * Math.cos(playerAngle); + playerZ[i] = 0.5 + 0.35 * Math.sin(playerAngle); + } + markPlayerArea("large"); + } + + let placers = [ + new ClumpPlacer(mapArea * 0.08, 0.7, 0.05, 10, Math.round(fractionToTiles(0.5)), Math.round(fractionToTiles(0.5))), + new ClumpPlacer(mapArea * 0.13 * lSize, 0.7, 0.05, 10, Math.round(fractionToTiles(0.5 - 0.2 * Math.cos(startAngle))), Math.round(fractionToTiles(0.5 - 0.2 * Math.sin(startAngle)))), + new ClumpPlacer(mapArea * 0.15 * lSize, 0.7, 0.05, 10, Math.round(fractionToTiles(0.5 - 0.49 * Math.cos(startAngle))), Math.round(fractionToTiles(0.5 - 0.49 * Math.sin(startAngle)))), + ]; + + for (let placer of placers) + createArea( + placer, + [ + new SmoothElevationPainter(ELEVATION_SET, waterHeight, 4), + paintClass(clWater) + ], + avoidClasses(clPlayerTerritory, scaleByMapSize(15, 25))); +} + +/** + * Mainland style with some small random lakes. + */ +function unknownLakes() +{ + let waterHeight = -5; + + initHeight(landHeight); + + if (g_PlayerBases) + { + [playerIDs, playerX, playerZ] = radialPlayerPlacement(); + markPlayerArea("large"); + } + + log("Creating lakes..."); + createAreas( + new ClumpPlacer(scaleByMapSize(160, 700), 0.2, 0.1, 1), + [ + new SmoothElevationPainter(ELEVATION_SET, waterHeight, 5), + paintClass(clWater) + ], + [avoidClasses(clPlayerTerritory, 12), randBool() ? avoidClasses(clWater, 8) : new NullConstraint()], + scaleByMapSize(5, 16)); +} + +/** + * A large hill leaving players only a small passage to each of the the two neighboring players. + */ +function unknownPasses() +{ + let mountainHeight = 24; + let waterHeight = -4; + initHeight(landHeight); + + let playerAngle; + let startAngle; + if (g_PlayerBases) + { + [playerIDs, playerX, playerZ, playerAngle, startAngle] = radialPlayerPlacement(); + markPlayerArea("small"); + } + else + startAngle = Math.random(0, 2 * Math.PI); + + let mid = Math.round(fractionToTiles(0.5)); + let [mountainX, mountainZ] = distributePointsOnCircle(numPlayers, startAngle + Math.PI / numPlayers, fractionToTiles(0.5), mid, mid); + let [passesX, passesZ] = distributePointsOnCircle(numPlayers * 2, startAngle, fractionToTiles(0.35), mid, mid); + + for (let i = 0; i < numPlayers; ++i) + { + log("Creating a mountain range between neighboring players..."); + createArea( + new PathPlacer(mid, mid, mountainX[i], mountainZ[i], scaleByMapSize(14, 24), 0.4, 3 * scaleByMapSize(1, 3), 0.2, 0.05), + [ + new SmoothElevationPainter(ELEVATION_SET, mountainHeight, 3), + paintClass(clWater) + ], + avoidClasses(clPlayer, 5)); + + log("Creating small mountain at the map border between the players to ensure separation of players..."); + createArea( + new ClumpPlacer(Math.floor(diskArea(scaleByMapSize(10, 50)) / 5), 0.95, 0.6, 10, mountainX[i], mountainZ[i]), + new SmoothElevationPainter(ELEVATION_SET, mountainHeight, 0), + avoidClasses(clPlayer, 5)); + + log("Create passages between neighboring players..."); + createArea( + new PathPlacer( + passesX[2 * i], + passesZ[2 * i], + passesX[2 * ((i + 1) % numPlayers)], + passesZ[2 * ((i + 1) % numPlayers)], + scaleByMapSize(14, 24), + 0.4, + 3 * scaleByMapSize(1, 3), + 0.2, + 0.05), + new SmoothElevationPainter(ELEVATION_SET, landHeight, 2), + null); + } + + if (randBool(2/5)) + { + log("Creating small mountain at the center to ensure the mountain ranges to be connected..."); + createArea( + new ClumpPlacer(mapArea * 0.03 * lSize, 0.7, 0.1, 10, mid, mid), + [ + new SmoothElevationPainter(ELEVATION_SET, waterHeight, 3), + paintClass(clWater) + ], + null); + } + else + { + log("Fill area between the paths..."); + createArea( + new ClumpPlacer(mapArea * 0.005, 0.7, 0.1, 10, mid, mid), + [ + new SmoothElevationPainter(ELEVATION_SET, mountainHeight, 4), + paintClass(clWater) + ], + null); + } +} + +/** + * Land enclosed by a hill that leaves small areas for civic centers and large central place. + */ +function unknownLowlands() +{ + let mountainHeight = 30; + + log("Creating mountain that is going to separate players..."); + initHeight(mountainHeight); + + let playerAngle; + let startAngle; + if (g_PlayerBases) + { + [playerIDs, playerX, playerZ, playerAngle, startAngle] = radialPlayerPlacement(); + markPlayerArea("small"); + } + else + startAngle = Math.random(0, 2 * Math.PI); + + log("Creating valleys enclosed by the mountain..."); + let valleys = numPlayers; + if (mapSize <= 128 && numPlayers <= 2 || + mapSize <= 192 && numPlayers <= 3 || + mapSize <= 320 && numPlayers <= 4 || + mapSize <= 384 && numPlayers <= 5 || + mapSize <= 448 && numPlayers <= 6) + valleys *= 2; + + let mid = Math.round(fractionToTiles(0.5)); + let [valleyX, valleyZ] = distributePointsOnCircle(valleys, startAngle, fractionToTiles(0.35), mid, mid); + for (let i = 0; i < valleys; ++i) + createArea( + new ClumpPlacer(diskArea(scaleByMapSize(18, 32)), 0.65, 0.1, 10, valleyX[i], valleyZ[i]), + [ + new SmoothElevationPainter(ELEVATION_SET, landHeight, 2), + paintClass(clLand) + ], + null); + + log("Creating the big central area..."); + createArea( + new ClumpPlacer(mapArea * 0.091 * lSize, 0.7, 0.1, 10, mid, mid), + [ + landElevationPainter, + paintClass(clWater) + ], + null); + + log("Creating passes from player areas to the center..."); + for (let i = 0; i < valleys; ++i) + createArea( + new PathPlacer(mid, mid, valleyX[i], valleyZ[i], scaleByMapSize(14, 24), 0.4, 3 * scaleByMapSize(1, 3), 0.2, 0.05), + [ + landElevationPainter, + paintClass(clWater) + ], + null); +} + +/** + * No water, no hills. + */ +function unknownMainland() +{ + initHeight(3); + + if (g_PlayerBases) + { + [playerIDs, playerX, playerZ] = radialPlayerPlacement(); + markPlayerArea("small"); + } +} + +function centralRiverCoordinates(horizontal) +{ + let coord1 = [0, fractionToTiles(0.5)]; + let coord2 = [fractionToTiles(1), fractionToTiles(0.5)]; + + if (!horizontal) + { + coord1.reverse(); + coord2.reverse(); + } + + return [coord1, coord2]; +} + +function createShoreJaggedness(waterHeight, borderClass, shoreDist, inwards = true) +{ + log("Creating shore jaggedness..."); + for (let i = 0; i < 2; ++i) + if (i || inwards) + createAreas( + new ChainPlacer(2, Math.floor(scaleByMapSize(4, 6)), 15, 1), + [ + new SmoothElevationPainter(ELEVATION_SET, i ? landHeight : waterHeight, 4), + i ? paintClass(clLand) : unPaintClass(clLand) + ], + [ + avoidClasses(clPlayer, 20, clPeninsulaSteam, 20), + borderClasses(borderClass, shoreDist, shoreDist) + ], + scaleByMapSize(7, 130) * 2, + 150); +} + +function createExtensionsOrIslands() +{ + let rnd = randIntInclusive(1, 3); + + if (rnd == 1) + { + log("Creating islands..."); + createAreas( + new ClumpPlacer(Math.square(randIntInclusive(scaleByMapSize(8, 15), scaleByMapSize(15, 23))), 0.8, 0.1, randFloat(0, 0.2)), + [ + landElevationPainter, + paintClass(clLand) + ], + avoidClasses(clLand, 3, clPlayer, 3), + scaleByMapSize(2, 5) * randIntInclusive(8, 14)); + } + else if (rnd == 2) + { + log("Creating extentions..."); + createAreas( + new ChainPlacer(Math.floor(scaleByMapSize(4, 7)), Math.floor(scaleByMapSize(7, 10)), Math.floor(scaleByMapSize(16, 40)), 0.07), + [ + landElevationPainter, + paintClass(clLand) + ], + null, + scaleByMapSize(2, 5) * randIntInclusive(8, 14)); + } +} + +/** + * Prevent impassable terrain and resource collisions at the the civic center and starting resources. + */ +function markPlayerArea(size) +{ + for (let i = 0; i < numPlayers; ++i) + { + addCivicCenterAreaToClass( + Math.round(fractionToTiles(playerX[i])), + Math.round(fractionToTiles(playerZ[i])), + clPlayer); + + if (size == "large") + createArea( + new ClumpPlacer(diskArea(scaleByMapSize(17, 29) / 3), 0.6, 0.3, 10, fractionToTiles(playerX[i]), fractionToTiles(playerZ[i])), + paintClass(clPlayerTerritory), + null); + } +} + +function paintUnknownMapBasedOnHeight() +{ + paintTerrainBasedOnHeight(cliffHeight, 40, 1, tCliff); + paintTerrainBasedOnHeight(3, cliffHeight, 1, tMainTerrain); + paintTerrainBasedOnHeight(1, 3, 1, tShore); + paintTerrainBasedOnHeight(-8, 1, 2, tWater); + + unPaintTileClassBasedOnHeight(0, cliffHeight, 1, clWater); + unPaintTileClassBasedOnHeight(-6, 0, 1, clLand); + + paintTileClassBasedOnHeight(-6, 0, 1, clWater); + paintTileClassBasedOnHeight(0, cliffHeight, 1, clLand); + paintTileClassBasedOnHeight(cliffHeight, 40, 1, clHill); +} + +/** + * Place resources and decoratives after the player territory was marked. + */ +function createUnknownObjects() +{ + log("Creating bumps..."); + createAreas( + new ClumpPlacer(scaleByMapSize(20, 50), 0.3, 0.06, 1), + new SmoothElevationPainter(ELEVATION_MODIFY, 2, 2), + [avoidClasses(clWater, 2, clPlayer, 10), stayClasses(clLand, 3)], + randIntInclusive(0, scaleByMapSize(1, 2) * 200)); + + log("Creating hills..."); + createAreas( + new ClumpPlacer(scaleByMapSize(20, 150), 0.2, 0.1, 1), + [ + new LayeredPainter([tCliff, tHill], [2]), + new SmoothElevationPainter(ELEVATION_SET, 18, 2), + paintClass(clHill) + ], + [avoidClasses(clPlayer, 15, clHill, randIntInclusive(6, 18)), stayClasses(clLand, 0)], + randIntInclusive(0, scaleByMapSize(4, 8))*randIntInclusive(1, scaleByMapSize(4, 9)) + ); + RMS.SetProgress(50); + + log("Creating forests..."); + let [numForest, numStragglers] = getTreeCounts(...rBiomeTreeCount(1)); + + let types = [ + [[tForestFloor2, tMainTerrain, pForest1], [tForestFloor2, pForest1]], + [[tForestFloor1, tMainTerrain, pForest2], [tForestFloor1, pForest2]] + ]; + + let size = numForest / (scaleByMapSize(2, 8) * numPlayers); + let num = Math.floor(size / types.length); + for (let type of types) + createAreas( + new ClumpPlacer(numForest / num, 0.1, 0.1, 1), + [ + new LayeredPainter(type, [2]), + paintClass(clForest) + ], + [avoidClasses(clPlayer, 20, clForest, randIntInclusive(5, 15), clHill, 0), stayClasses(clLand, 4)], + num); + RMS.SetProgress(50); + + log("Creating dirt patches..."); + let patchCount = (currentBiome() == "savanna" ? 3 : 1) * scaleByMapSize(15, 45); + for (let size of [scaleByMapSize(3, 48), scaleByMapSize(5, 84), scaleByMapSize(8, 128)]) + createAreas( + new ClumpPlacer(size, 0.3, 0.06, 0.5), + [ + new LayeredPainter([[tMainTerrain, tTier1Terrain], [tTier1Terrain, tTier2Terrain], [tTier2Terrain, tTier3Terrain]], [1, 1]), + paintClass(clDirt) + ], + [avoidClasses(clForest, 0, clHill, 0, clDirt, 5, clPlayer, 7), stayClasses(clLand, 4)], + patchCount); + + log("Creating grass patches..."); + for (let size of [scaleByMapSize(2, 32), scaleByMapSize(3, 48), scaleByMapSize(5, 80)]) + createAreas( + new ClumpPlacer(size, 0.3, 0.06, 0.5), + new TerrainPainter(tTier4Terrain), + [avoidClasses(clForest, 0, clHill, 0, clDirt, 5, clPlayer, 7), stayClasses(clLand, 4)], + patchCount); + + RMS.SetProgress(55); + + log("Creating stone mines..."); + createObjectGroupsDeprecated( + new SimpleGroup([new SimpleObject(oStoneSmall, 0, 2, 0, 4), new SimpleObject(oStoneLarge, 1, 1, 0, 4)], true, clRock), + 0, + [avoidClasses(clForest, 1, clPlayer, 10, clRock, 10, clHill, 1), stayClasses(clLand, 3)], + randIntInclusive(scaleByMapSize(2, 9), scaleByMapSize(9, 40)), + 100); + + log("Creating small stone quarries..."); + createObjectGroupsDeprecated( + new SimpleGroup([new SimpleObject(oStoneSmall, 2, 5, 1, 3)], true, clRock), + 0, + [avoidClasses(clForest, 1, clPlayer, 10, clRock, 10, clHill, 1), stayClasses(clLand, 3)], + randIntInclusive(scaleByMapSize(2, 9),scaleByMapSize(9, 40)), + 100); + + log("Creating metal mines..."); + createObjectGroupsDeprecated( + new SimpleGroup([new SimpleObject(oMetalLarge, 1, 1, 0, 4)], true, clMetal), + 0, + [avoidClasses(clForest, 1, clPlayer, 10, clMetal, 10, clRock, 5, clHill, 1), stayClasses(clLand, 3)], + randIntInclusive(scaleByMapSize(2, 9), scaleByMapSize(9, 40)), + 100); + RMS.SetProgress(65); + + log("Creating small decorative rocks..."); + createObjectGroupsDeprecated( + new SimpleGroup([new SimpleObject(aRockMedium, 1, 3, 0, 1)], true), + 0, + [avoidClasses(clWater, 0, clForest, 0, clPlayer, 0, clHill, 0), stayClasses(clLand, 3)], + scaleByMapSize(16, 262), + 50); + + log("Creating large decorative rocks..."); + createObjectGroupsDeprecated( + new SimpleGroup([new SimpleObject(aRockLarge, 1, 2, 0, 1), new SimpleObject(aRockMedium, 1, 3, 0, 2)], true), + 0, + [avoidClasses(clWater, 0, clForest, 0, clPlayer, 0, clHill, 0), stayClasses(clLand, 3)], + scaleByMapSize(8, 131), + 50); + RMS.SetProgress(70); + + log("Creating deer..."); + createObjectGroupsDeprecated( + new SimpleGroup([new SimpleObject(oMainHuntableAnimal, 5, 7, 0, 4)], true, clFood), + 0, + [avoidClasses(clWater, 0, clForest, 0, clPlayer, 8, clHill, 1, clFood, 20), stayClasses(clLand, 2)], + randIntInclusive(numPlayers + 3, 5 * numPlayers + 4), + 50); + + log("Creating berry bush..."); + createObjectGroupsDeprecated( + new SimpleGroup([new SimpleObject(oFruitBush, 5, 7, 0, 4)], true, clFood), + 0, + [avoidClasses(clWater, 0, clForest, 0, clPlayer, 8, clHill, 1, clFood, 20), stayClasses(clLand, 2)], + randIntInclusive(1, 4) * numPlayers + 2, + 50); + RMS.SetProgress(75); + + log("Creating sheep..."); + createObjectGroupsDeprecated( + new SimpleGroup([new SimpleObject(oSecondaryHuntableAnimal, 2, 3, 0, 2)], true, clFood), + 0, + [avoidClasses(clWater, 0, clForest, 0, clPlayer, 8, clHill, 1, clFood, 20), stayClasses(clLand, 2)], + randIntInclusive(numPlayers + 3, 5 * numPlayers + 4), + 50); + + log("Creating fish..."); + createObjectGroupsDeprecated( + new SimpleGroup([new SimpleObject(oFish, 2, 3, 0, 2)], true, clFood), + 0, + avoidClasses(clLand, 4, clForest, 0, clPlayer, 0, clHill, 0, clFood, 20), + randIntInclusive(15, 40) * numPlayers, + 60); + RMS.SetProgress(85); + + log("Creating straggler trees..."); + types = [g_Gaia.tree1, g_Gaia.tree2, g_Gaia.tree3, g_Gaia.tree4]; + + num = Math.floor(numStragglers / types.length); + for (let type of types) + createObjectGroupsDeprecated( + new SimpleGroup([new SimpleObject(type, 1, 1, 0, 3)], true, clForest), + 0, + [avoidClasses(clWater, 1, clForest, 1, clHill, 1, clPlayer, 0, clMetal, 6, clRock, 6, clBaseResource, 6), stayClasses(clLand, 4)], + num); + + let planetm = currentBiome() == "tropic" ? 8 : 1; + + log("Creating small grass tufts..."); + createObjectGroupsDeprecated( + new SimpleGroup([new SimpleObject(aGrassShort, 1, 2, 0, 1, -Math.PI / 8, Math.PI / 8)]), + 0, + [avoidClasses(clWater, 2, clHill, 2, clPlayer, 2, clDirt, 0), stayClasses(clLand, 3)], + planetm * scaleByMapSize(13, 200)); + RMS.SetProgress(90); + + log("Creating large grass tufts..."); + createObjectGroupsDeprecated( + new SimpleGroup([new SimpleObject(aGrass, 2, 4, 0, 1.8, -Math.PI / 8, Math.PI / 8), new SimpleObject(aGrassShort, 3, 6, 1.2, 2.5, -Math.PI / 8, Math.PI / 8)]), + 0, + [avoidClasses(clWater, 3, clHill, 2, clPlayer, 2, clDirt, 1, clForest, 0), stayClasses(clLand, 3)], + planetm * scaleByMapSize(13, 200)); + RMS.SetProgress(95); + + log("Creating shallow flora..."); + createObjectGroupsDeprecated( + new SimpleGroup([new SimpleObject(aLillies, 1, 2, 0, 2), new SimpleObject(aReeds, 2, 4, 0, 2)]), + 0, + stayClasses(clShallow, 1), + 60 * scaleByMapSize(13, 200), + 80); + + log("Creating bushes..."); + createObjectGroupsDeprecated( + new SimpleGroup([new SimpleObject(aBushMedium, 1, 2, 0, 2), new SimpleObject(aBushSmall, 2, 4, 0, 2)]), + 0, + [avoidClasses(clWater, 1, clHill, 1, clPlayer, 1, clDirt, 1), stayClasses(clLand, 3)], + planetm * scaleByMapSize(13, 200), + 50); + + setSkySet(pickRandom(["cirrus", "cumulus", "sunny", "sunny 1", "mountainous", "stratus"])); + setSunRotation(randFloat(0, 2 * Math.PI)); + setSunElevation(Math.PI * randFloat(1/5, 1/3)); +} + +function createUnknownPlayerBases() +{ + for (var i = 0; i < numPlayers; ++i) + { + var id = playerIDs[i]; + log("Creating base for player " + id + "..."); + + var radius = scaleByMapSize(17,29); + var shoreRadius = 4; + var elevation = 3; + + var hillSize = PI * radius * radius; + // get the x and z in tiles + var fx = fractionToTiles(playerX[i]); + var fz = fractionToTiles(playerZ[i]); + var ix = round(fx); + var iz = round(fz); + + placeCivDefaultEntities(fx, fz, id, { "iberWall": g_IberianWalls }); + + placeDefaultChicken(fx, fz, clBaseResource); + + // create berry bushes + var bbAngle = randFloat(0, TWO_PI); + var bbDist = 12; + var bbX = round(fx + bbDist * cos(bbAngle)); + var bbZ = round(fz + bbDist * sin(bbAngle)); + var group = new SimpleGroup( + [new SimpleObject(oFruitBush, 5,5, 0,3)], + true, clBaseResource, bbX, bbZ + ); + createObjectGroup(group, 0); + + if (g_StartingTreasures) + { + // create woods + var bbAngle = randFloat(0, TWO_PI); + var bbDist = 13; + var bbX = round(fx + bbDist * cos(bbAngle)); + var bbZ = round(fz + bbDist * sin(bbAngle)); + group = new SimpleGroup( + [new SimpleObject(oWoodTreasure, 14, 14, 0, 3)], + true, clBaseResource, bbX, bbZ + ); + createObjectGroup(group, 0); + } + + // create metal mine + var mAngle = bbAngle; + while (abs(mAngle - bbAngle) < PI/3) + { + mAngle = randFloat(0, TWO_PI); + } + var mDist = 12; + var mX = round(fx + mDist * cos(mAngle)); + var mZ = round(fz + mDist * sin(mAngle)); + group = new SimpleGroup( + [new SimpleObject(oMetalLarge, 1,1, 0,0)], + true, clBaseResource, mX, mZ + ); + createObjectGroup(group, 0); + + // create stone mines + mAngle += randFloat(PI/8, PI/4); + mX = round(fx + mDist * cos(mAngle)); + mZ = round(fz + mDist * sin(mAngle)); + group = new SimpleGroup( + [new SimpleObject(oStoneLarge, 1,1, 0,2)], + true, clBaseResource, mX, mZ + ); + createObjectGroup(group, 0); + var hillSize = PI * radius * radius; + // create starting trees + var num = floor(hillSize / 100); + var tAngle = randFloat(-PI/3, 4*PI/3); + var tDist = randFloat(11, 13); + var tX = round(fx + tDist * cos(tAngle)); + var tZ = round(fz + tDist * sin(tAngle)); + group = new SimpleGroup( + [new SimpleObject(oTree1, num, num, 0,5)], + false, clBaseResource, tX, tZ + ); + createObjectGroup(group, 0, avoidClasses(clBaseResource,2)); + + placeDefaultDecoratives(fx, fz, aGrassShort, clBaseResource, radius); + + // create the city patch + var cityRadius = radius/3; + var placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz); + var painter = new LayeredPainter([tRoadWild, tRoad], [1]); + createArea(placer, [painter], null); + } +} diff --git a/binaries/data/mods/public/maps/random/unknown.js b/binaries/data/mods/public/maps/random/unknown.js index 173b08efbe..355950608d 100644 --- a/binaries/data/mods/public/maps/random/unknown.js +++ b/binaries/data/mods/public/maps/random/unknown.js @@ -1,1594 +1,11 @@ RMS.LoadLibrary("rmgen"); RMS.LoadLibrary("rmbiome"); +RMS.LoadLibrary("the_unknown"); -TILE_CENTERED_HEIGHT_MAP = true; +g_PlayerBases = true; +g_AllowNaval = true; -setSelectedBiome(); - -const tMainTerrain = g_Terrains.mainTerrain; -const tForestFloor1 = g_Terrains.forestFloor1; -const tForestFloor2 = g_Terrains.forestFloor2; -const tCliff = g_Terrains.cliff; -const tTier1Terrain = g_Terrains.tier1Terrain; -const tTier2Terrain = g_Terrains.tier2Terrain; -const tTier3Terrain = g_Terrains.tier3Terrain; -const tHill = g_Terrains.hill; -const tDirt = g_Terrains.dirt; -const tRoad = g_Terrains.road; -const tRoadWild = g_Terrains.roadWild; -const tTier4Terrain = g_Terrains.tier4Terrain; -const tShoreBlend = g_Terrains.shoreBlend; -const tShore = g_Terrains.shore; -const tWater = g_Terrains.water; - -const oTree1 = g_Gaia.tree1; -const oTree2 = g_Gaia.tree2; -const oTree3 = g_Gaia.tree3; -const oTree4 = g_Gaia.tree4; -const oTree5 = g_Gaia.tree5; -const oFruitBush = g_Gaia.fruitBush; -const oMainHuntableAnimal = g_Gaia.mainHuntableAnimal; -const oFish = g_Gaia.fish; -const oSecondaryHuntableAnimal = g_Gaia.secondaryHuntableAnimal; -const oStoneLarge = g_Gaia.stoneLarge; -const oStoneSmall = g_Gaia.stoneSmall; -const oMetalLarge = g_Gaia.metalLarge; -const oWood = "gaia/special_treasure_wood"; - -const aGrass = g_Decoratives.grass; -const aGrassShort = g_Decoratives.grassShort; -const aReeds = g_Decoratives.reeds; -const aLillies = g_Decoratives.lillies; -const aRockLarge = g_Decoratives.rockLarge; -const aRockMedium = g_Decoratives.rockMedium; -const aBushMedium = g_Decoratives.bushMedium; -const aBushSmall = g_Decoratives.bushSmall; - -const pForest1 = [tForestFloor2 + TERRAIN_SEPARATOR + oTree1, tForestFloor2 + TERRAIN_SEPARATOR + oTree2, tForestFloor2]; -const pForest2 = [tForestFloor1 + TERRAIN_SEPARATOR + oTree4, tForestFloor1 + TERRAIN_SEPARATOR + oTree5, tForestFloor1]; - -InitMap(); - -const numPlayers = getNumPlayers(); -const mapSize = getMapSize(); -const mapArea = mapSize*mapSize; - -var clPlayer = createTileClass(); -var clHill = createTileClass(); -var clForest = createTileClass(); -var clWater = createTileClass(); -var clDirt = createTileClass(); -var clRock = createTileClass(); -var clMetal = createTileClass(); -var clFood = createTileClass(); -var clBaseResource = createTileClass(); -var clSettlement = createTileClass(); -var clLand = createTileClass(); -var clShallow = createTileClass(); - -initTerrain(tWater); - -var iberianTowers = false; -var md = randIntInclusive(1,13); -var needsAdditionalWood = false; -//***************************************************************************************************************************** -if (md == 1) //archipelago and island -{ - needsAdditionalWood = true; - iberianTowers = true; - - var [playerIDs, playerX, playerZ] = radialPlayerPlacement(); - - var mdd1 = randIntInclusive(1,3); - - for (var i = 0; i < numPlayers; ++i) - { - var radius = scaleByMapSize(17, 29); - var shoreRadius = 4; - var elevation = 3; - - var hillSize = PI * radius * radius; - // get the x and z in tiles - var fx = fractionToTiles(playerX[i]); - var fz = fractionToTiles(playerZ[i]); - var ix = round(fx); - var iz = round(fz); - // create a player island - var placer = new ClumpPlacer(hillSize, 0.80, 0.1, 10, ix, iz); - var terrainPainter = new LayeredPainter( - [tMainTerrain , tMainTerrain, tMainTerrain], // terrains - [1, shoreRadius] // widths - ); - var elevationPainter = new SmoothElevationPainter( - ELEVATION_SET, // type - elevation, // elevation - shoreRadius // blend radius - ); - createArea(placer, [terrainPainter, elevationPainter, paintClass(clPlayer)], null); - } - if (mdd1 == 1) //archipelago - { - log("Creating islands..."); - placer = new ClumpPlacer(floor(hillSize*randFloat(0.8,1.2)), 0.80, 0.1, 10); - terrainPainter = new LayeredPainter( - [tMainTerrain, tMainTerrain], // terrains - [2] // widths - ); - elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 3, 4); - createAreas( - placer, - [terrainPainter, elevationPainter, paintClass(clLand)], - null, - scaleByMapSize(2, 5)*randIntInclusive(8,14) - ); - - log("Creating shore jaggedness..."); - placer = new ClumpPlacer(scaleByMapSize(15, 80), 0.2, 0.1, 1); - terrainPainter = new LayeredPainter( - [tCliff, tHill], // terrains - [2] // widths - ); - elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 3, 4); - createAreas( - placer, - [terrainPainter, elevationPainter, paintClass(clLand)], - borderClasses(clLand, 6, 3), - scaleByMapSize(12, 130) * 2, 150 - ); - } - else if (mdd1 == 2) //islands - { - log("Creating islands..."); - placer = new ClumpPlacer(floor(hillSize*randFloat(0.6,1.4)), 0.80, 0.1, randFloat(0.0, 0.2)); - terrainPainter = new LayeredPainter( - [tMainTerrain, tMainTerrain], // terrains - [2] // widths - ); - elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 3, 4); - createAreas( - placer, - [terrainPainter, elevationPainter, paintClass(clLand)], - avoidClasses(clLand, 3, clPlayer, 3), - scaleByMapSize(6, 10)*randIntInclusive(8,14) - ); - - log("Creating small islands..."); - placer = new ClumpPlacer(floor(hillSize*randFloat(0.3,0.7)), 0.80, 0.1, 0.07); - terrainPainter = new LayeredPainter( - [tMainTerrain, tMainTerrain], // terrains - [2] // widths - ); - elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 3, 6); - createAreas( - placer, - [terrainPainter, elevationPainter, paintClass(clLand)], - avoidClasses(clLand, 3, clPlayer, 3), - scaleByMapSize(2, 6)*randIntInclusive(6,15), 25 - ); - } - else if (mdd1 == 3) // tight islands - { - log("Creating islands..."); - placer = new ClumpPlacer(floor(hillSize*randFloat(0.8,1.2)), 0.80, 0.1, 10); - terrainPainter = new LayeredPainter( - [tMainTerrain, tMainTerrain], // terrains - [2] // widths - ); - elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 3, 4); - createAreas( - placer, - [terrainPainter, elevationPainter, paintClass(clLand)], - avoidClasses(clLand, randIntInclusive(8, 16), clPlayer, 3), - scaleByMapSize(2, 5)*randIntInclusive(8,14) - ); - } - -} -//******************************************************************************************************** -else if (md == 2) //continent -{ - var [playerIDs, playerX, playerZ] = radialPlayerPlacement(0.25); - - for (var i = 0; i < numPlayers; i++) - { - var fx = fractionToTiles(playerX[i]); - var fz = fractionToTiles(playerZ[i]); - var ix = round(fx); - var iz = round(fz); - - addCivicCenterAreaToClass(ix, iz, clPlayer); - } - - var fx = fractionToTiles(0.5); - var fz = fractionToTiles(0.5); - ix = round(fx); - iz = round(fz); - - var placer = new ClumpPlacer(mapArea * 0.45, 0.9, 0.09, 10, ix, iz); - var terrainPainter = new LayeredPainter( - [tWater, tShore, tMainTerrain], // terrains - [4, 2] // widths - ); - var elevationPainter = new SmoothElevationPainter( - ELEVATION_SET, // type - 3, // elevation - 4 // blend radius - ); - createArea(placer, [terrainPainter, elevationPainter, paintClass(clLand)], null); - - var clPeninsulaSteam = createTileClass(); - - if (randBool(1/3)) // peninsula - { - var angle = randFloat(0, TWO_PI); - - var fx = fractionToTiles(0.5 + 0.25*cos(angle)); - var fz = fractionToTiles(0.5 + 0.25*sin(angle)); - ix = round(fx); - iz = round(fz); - - var placer = new ClumpPlacer(mapArea * 0.45, 0.9, 0.09, 10, ix, iz); - var terrainPainter = new LayeredPainter( - [tWater, tShore, tMainTerrain], // terrains - [4, 2] // widths - ); - var elevationPainter = new SmoothElevationPainter( - ELEVATION_SET, // type - 3, // elevation - 4 // blend radius - ); - createArea(placer, [terrainPainter, elevationPainter, paintClass(clLand)], null); - - var fx = fractionToTiles(0.5 + 0.35*cos(angle)); - var fz = fractionToTiles(0.5 + 0.35*sin(angle)); - ix = round(fx); - iz = round(fz); - - var placer = new ClumpPlacer(mapArea * 0.3, 0.9, 0.01, 10, ix, iz); - createArea(placer, [paintClass(clPeninsulaSteam)], null); - } - - log("Creating shore jaggedness..."); - placer = new ClumpPlacer(scaleByMapSize(20, 150), 0.2, 0.1, 1); - terrainPainter = new LayeredPainter( - [tCliff, tHill], // terrains - [2] // widths - ); - elevationPainter = new SmoothElevationPainter(ELEVATION_SET, -5, 4); - createAreas( - placer, - [terrainPainter, elevationPainter, unPaintClass(clLand)], - [avoidClasses(clPlayer, 20, clPeninsulaSteam, 20), borderClasses(clLand, 7, 7)], - scaleByMapSize(7, 130) * 2, 150 - ); - - log("Creating shore jaggedness..."); - placer = new ClumpPlacer(scaleByMapSize(20, 150), 0.2, 0.1, 1); - terrainPainter = new LayeredPainter( - [tCliff, tHill], // terrains - [2] // widths - ); - elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 3, 4); - createAreas( - placer, - [terrainPainter, elevationPainter, paintClass(clLand)], - [avoidClasses(clPlayer, 20), borderClasses(clLand, 7, 7)], - scaleByMapSize(7, 130) * 2, 150 - ); -} -//******************************************************************************************************** -else if (md == 3) //central sea -{ - var playerIDs = primeSortAllPlayers(); - var playerPos = placePlayersRiver(); - - var playerX = []; - var playerZ = []; - var playerAngle = []; - - var mdd1 = randIntInclusive(1,2); - if (mdd1 == 1) //vertical - for (var i = 0; i < numPlayers; i++) - { - playerZ[i] = playerPos[i]; - playerX[i] = 0.2 + 0.6*(i%2); - } - else //horizontal - for (var i = 0; i < numPlayers; i++) - { - playerZ[i] = 0.2 + 0.6*(i%2); - playerX[i] = playerPos[i]; - } - - paintRiver({ - "horizontal": mdd1 != 1, - "parallel": false, - "position": 0.5, - "width": randFloat(0.22, 0.3) + scaleByMapSize(1, 4) / 20, - "fadeDist": 0.025, - "deviation": 0, - "waterHeight": -3, - "landHeight": 3, - "meanderShort": 20, - "meanderLong": 0, - "waterFunc": (ix, iz, height) => { - placeTerrain(ix, iz, height < -1.5 ? tWater : tShore); - if (height < 0) - addToClass(ix, iz, clWater); - }, - "landFunc": (ix, iz, shoreDist1, shoreDist2) => { - setHeight(ix, iz, 3.1); - addToClass(ix, iz, clLand); - } - }); - - if (randBool(1/3)) - { - // linked - if (mdd1 == 1) //vertical - { - var placer = new PathPlacer(1, fractionToTiles(0.5), fractionToTiles(0.99), fractionToTiles(0.5), scaleByMapSize(randIntInclusive(16,24),randIntInclusive(100,140)), 0.5, 3*(scaleByMapSize(1,4)), 0.1, 0.01); - } - else - { - var placer = new PathPlacer(fractionToTiles(0.5), 1, fractionToTiles(0.5), fractionToTiles(0.99), scaleByMapSize(randIntInclusive(16,24),randIntInclusive(100,140)), 0.5, 3*(scaleByMapSize(1,4)), 0.1, 0.01); - } - var terrainPainter = new LayeredPainter( - [tMainTerrain, tMainTerrain, tMainTerrain], // terrains - [1, 3] // widths - ); - var elevationPainter = new SmoothElevationPainter( - ELEVATION_SET, // type - 3.1, // elevation - 4 // blend radius - ); - createArea(placer, [terrainPainter, elevationPainter, unPaintClass(clWater)], null); - } - var mdd2 = randIntInclusive(1,7); - if (mdd2 == 1) - { - log("Creating islands..."); - placer = new ClumpPlacer(randIntInclusive(scaleByMapSize(8,15),scaleByMapSize(15,23))*randIntInclusive(scaleByMapSize(8,15),scaleByMapSize(15,23)), 0.80, 0.1, randFloat(0.0, 0.2)); - terrainPainter = new LayeredPainter( - [tMainTerrain, tMainTerrain], // terrains - [2] // widths - ); - elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 3.1, 4); - createAreas( - placer, - [terrainPainter, elevationPainter, paintClass(clLand)], - avoidClasses(clLand, 3, clPlayer, 3), - scaleByMapSize(2, 5)*randIntInclusive(8,14) - ); - } - else if (mdd2 == 2) - { - log("Creating extentions..."); - placer = new ClumpPlacer(randIntInclusive(scaleByMapSize(13,24),scaleByMapSize(24,45))*randIntInclusive(scaleByMapSize(13,24),scaleByMapSize(24,45)), 0.80, 0.1, 10); - terrainPainter = new LayeredPainter( - [tMainTerrain, tMainTerrain], // terrains - [2] // widths - ); - elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 3.1, 4); - createAreas( - placer, - [terrainPainter, elevationPainter, paintClass(clLand)], - null, - scaleByMapSize(2, 5)*randIntInclusive(8,14) - ); - } -} -//******************************************************************************************************** -else if (md == 4) //central river -{ - - for (var ix = 0; ix < mapSize; ix++) - { - for (var iz = 0; iz < mapSize; iz++) - { - var x = ix / (mapSize + 1.0); - var z = iz / (mapSize + 1.0); - setHeight(ix, iz, 3); - } - } - - var playerIDs = primeSortAllPlayers(); - var playerPos = placePlayersRiver(); - - var playerX = []; - var playerZ = []; - var playerAngle = []; - - var mdd1 = randIntInclusive(1,2); - if (mdd1 == 1) //horizontal - for (var i = 0; i < numPlayers; i++) - { - playerZ[i] = 0.25 + 0.5*(i%2); - playerX[i] = playerPos[i]; - } - else //vertical - for (var i = 0; i < numPlayers; i++) - { - playerZ[i] = playerPos[i]; - playerX[i] = 0.25 + 0.5*(i%2); - } - - log("Creating the main river"); - - if (mdd1 == 2) - 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); - else - 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); - - var terrainPainter = new LayeredPainter( - [tShore, tWater, tWater], // terrains - [1, 3] // widths - ); - var elevationPainter = new SmoothElevationPainter( - ELEVATION_SET, // type - -4, // elevation - 4 // blend radius - ); - createArea(placer, [terrainPainter, elevationPainter], avoidClasses(clPlayer, 4)); - - if (mdd1 == 1) - placer = new ClumpPlacer(floor(PI*scaleByMapSize(10,20)*scaleByMapSize(10,20)/4), 0.95, 0.6, 10, 1, fractionToTiles(0.5)); - else - placer = new ClumpPlacer(floor(PI*scaleByMapSize(10,20)*scaleByMapSize(10,20)/4), 0.95, 0.6, 10, fractionToTiles(0.5), 1); - - var painter = new LayeredPainter([tWater, tWater], [1]); - var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, -4, 2); - createArea(placer, [painter, elevationPainter], avoidClasses(clPlayer, 8)); - - if (mdd1 == 1) - placer = new ClumpPlacer(floor(PI*scaleByMapSize(10,20)*scaleByMapSize(10,20)/4), 0.95, 0.6, 10, fractionToTiles(0.99), fractionToTiles(0.5)); - else - placer = new ClumpPlacer(floor(PI*scaleByMapSize(10,20)*scaleByMapSize(10,20)/4), 0.95, 0.6, 10, fractionToTiles(0.5), fractionToTiles(0.99)); - - var painter = new LayeredPainter([tWater, tWater], [1]); - var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, -4, 2); - createArea(placer, [painter, elevationPainter], avoidClasses(clPlayer, 8)); - - var mdd2 = randIntInclusive(1,2); - if (mdd2 == 1) - { - log("Creating the shallows of the main river"); - - for (var i = 0; i <= randIntInclusive(1, scaleByMapSize(4,8)); i++) - { - var cLocation = randFloat(0.15,0.85); - if (mdd1 == 1) - createShallowsPassage(floor(fractionToTiles(cLocation)), floor(fractionToTiles(0.35)), floor(fractionToTiles(cLocation)), floor(fractionToTiles(0.65)), scaleByMapSize(4,8), -2, -2, 2, clShallow, undefined, -4); - else - createShallowsPassage(floor(fractionToTiles(0.35)), floor(fractionToTiles(cLocation)), floor(fractionToTiles(0.65)), floor(fractionToTiles(cLocation)), scaleByMapSize(4,8), -2, -2, 2, clShallow, undefined, -4); - } - } - - if (randBool()) - { - for (var i = 0; i < numPlayers; i++) - { - var fx = fractionToTiles(playerX[i]); - var fz = fractionToTiles(playerZ[i]); - var ix = round(fx); - var iz = round(fz); - // create the city patch - var cityRadius = scaleByMapSize(17,29)/3; - placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz); - createArea(placer, paintClass(clPlayer), null); - } - - createTributaryRivers( - mdd1 == 1, - randIntInclusive(8, scaleByMapSize(12, 16)), - scaleByMapSize(10, 20), - -4, - [-6, -1.5], - 0.2 * Math.PI, - clWater, - clShallow, - avoidClasses(clPlayer, 3)); - } -} -//******************************************************************************************************** -else if (md == 5) //rivers and lake -{ - var [playerIDs, playerX, playerZ, playerAngle, startAngle] = radialPlayerPlacement(); - - for (var i = 0; i < numPlayers; i++) - { - var fx = fractionToTiles(playerX[i]); - var fz = fractionToTiles(playerZ[i]); - var ix = round(fx); - var iz = round(fz); - addCivicCenterAreaToClass(ix, iz, clPlayer); - } - - for (var ix = 0; ix < mapSize; ix++) - { - for (var iz = 0; iz < mapSize; iz++) - { - var x = ix / (mapSize + 1.0); - var z = iz / (mapSize + 1.0); - setHeight(ix, iz, 3); - } - } - var mdd1 = randIntInclusive(1,2); - if (mdd1 == 1) //lake - { - var fx = fractionToTiles(0.5); - var fz = fractionToTiles(0.5); - ix = round(fx); - iz = round(fz); - - var lSize = sqrt(sqrt(sqrt(scaleByMapSize(1, 6)))); - - var placer = new ClumpPlacer(mapArea * 0.09 * lSize, 0.7, 0.1, 10, ix, iz); - var terrainPainter = new LayeredPainter( - [tShore, tWater, tWater, tWater], // terrains - [1, 4, 2] // widths - ); - var elevationPainter = new SmoothElevationPainter( - ELEVATION_SET, // type - -4, // elevation - 4 // blend radius - ); - createArea(placer, [terrainPainter, elevationPainter, paintClass(clWater)], null); - - log("Creating shore jaggedness..."); - placer = new ClumpPlacer(scaleByMapSize(20, 150), 0.2, 0.1, 1); - terrainPainter = new LayeredPainter( - [tCliff, tHill], // terrains - [2] // widths - ); - elevationPainter = new SmoothElevationPainter(ELEVATION_SET, -5, 4); - createAreas( - placer, - [terrainPainter, elevationPainter, paintClass(clWater)], - [avoidClasses(clPlayer, 20), borderClasses(clWater, 6, 4)], - scaleByMapSize(7, 130) * 2, 150 - ); - - placer = new ClumpPlacer(scaleByMapSize(15, 80), 0.2, 0.1, 1); - terrainPainter = new LayeredPainter( - [tCliff, tHill], // terrains - [2] // widths - ); - elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 3, 4); - createAreas( - placer, - [terrainPainter, elevationPainter, unPaintClass(clWater)], - borderClasses(clWater, 4, 7), - scaleByMapSize(12, 130) * 2, 150 - ); - } - - if (randBool()) // rivers - { - log ("Creating rivers..."); - for (var m = 0; m < numPlayers; m++) - { - var tang = startAngle + (m+0.5)*TWO_PI/(numPlayers); - 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); - var terrainPainter = new LayeredPainter( - [tShore, tWater, tWater], // terrains - [1, 3] // widths - ); - var elevationPainter = new SmoothElevationPainter( - ELEVATION_SET, // type - -4, // elevation - 4 // blend radius - ); - createArea(placer, [terrainPainter, elevationPainter, paintClass(clWater)], avoidClasses(clPlayer, 5)); - 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))); - var painter = new LayeredPainter([tWater, tWater], [1]); - var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, -4, 0); - createArea(placer, [painter, elevationPainter, paintClass(clWater)], avoidClasses(clPlayer, 5)); - - } - - var fx = fractionToTiles(0.5); - var fz = fractionToTiles(0.5); - ix = round(fx); - iz = round(fz); - - var placer = new ClumpPlacer(mapArea * 0.005, 0.7, 0.1, 10, ix, iz); - var terrainPainter = new LayeredPainter( - [tShore, tWater, tWater, tWater], // terrains - [1, 4, 2] // widths - ); - var elevationPainter = new SmoothElevationPainter( - ELEVATION_SET, // type - -4, // elevation - 4 // blend radius - ); - createArea(placer, [terrainPainter, elevationPainter, paintClass(clWater)], null); - } - - if (randBool(1/3) &&(mdd1 == 1))//island - { - var placer = new ClumpPlacer(mapArea * 0.006 * lSize, 0.7, 0.1, 10, ix, iz); - var terrainPainter = new LayeredPainter( - [tShore, tWater, tWater, tWater], // terrains - [1, 4, 2] // widths - ); - var elevationPainter = new SmoothElevationPainter( - ELEVATION_SET, // type - 3, // elevation - 4 // blend radius - ); - createArea(placer, [terrainPainter, elevationPainter, paintClass(clWater)], null); - } -} -//******************************************************************************************************** -else if (md == 6) //edge seas -{ - - for (var ix = 0; ix < mapSize; ix++) - { - for (var iz = 0; iz < mapSize; iz++) - { - var x = ix / (mapSize + 1.0); - var z = iz / (mapSize + 1.0); - setHeight(ix, iz, 3); - } - } - - var mdd1 = randIntInclusive(1,2); - - var playerIDs = sortAllPlayers(); - - var playerX = []; - var playerZ = []; - var playerPos = []; - - for (var i = 0; i < numPlayers; i++) - { - playerPos[i] = (i + 1) / (numPlayers + 1); - if (mdd1 == 1) //horizontal - { - playerX[i] = playerPos[i]; - playerZ[i] = 0.4 + 0.2*(i%2); - } - else //vertical - { - playerX[i] = 0.4 + 0.2*(i%2); - playerZ[i] = playerPos[i]; - } - - var fx = fractionToTiles(playerX[i]); - var fz = fractionToTiles(playerZ[i]); - var ix = round(fx); - var iz = round(fz); - - addCivicCenterAreaToClass(ix, iz, clPlayer); - } - - var mdd2 = randIntInclusive(1,3); - var fadedistance = 7; - - if (mdd1 == 1) - { - if ((mdd2 == 1)||(mdd2 == 3)) - { - var distance = randFloat(0., 0.1); - for (var ix = 0; ix < mapSize; ix++) - { - for (var iz = 0; iz < mapSize; iz++) - { - if (iz > (0.69+distance) * mapSize) - { - if (iz < (0.69+distance) * mapSize + fadedistance) - { - setHeight(ix, iz, 3 - 7 * (iz - (0.69+distance) * mapSize) / fadedistance); - if (3 - 7 * (iz - (0.69+distance) * mapSize) / fadedistance < 0.5) - addToClass(ix, iz, clWater); - } - else - { - setHeight(ix, iz, -4); - addToClass(ix, iz, clWater); - } - } - } - - } - - for (var i = 0; i < scaleByMapSize(20,120); i++) - { - 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); - var terrainPainter = new LayeredPainter( - [tMainTerrain, tMainTerrain], // terrains - [2] // widths - ); - var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 3, 3); - createArea( - placer, - [terrainPainter, elevationPainter, unPaintClass(clWater)], - null - ); - } - } - if ((mdd2 == 2)||(mdd2 == 3)) - { - var distance = randFloat(0., 0.1); - for (var ix = 0; ix < mapSize; ix++) - { - for (var iz = 0; iz < mapSize; iz++) - { - if (iz < (0.31-distance) * mapSize) - { - if (iz > (0.31-distance) * mapSize - fadedistance) - { - setHeight(ix, iz, 3 - 7 * ((0.31-distance) * mapSize - iz) / fadedistance); - if (3 - 7 * ((0.31-distance) * mapSize - iz) / fadedistance < 0.5) - addToClass(ix, iz, clWater); - } - else - { - setHeight(ix, iz, -4); - addToClass(ix, iz, clWater); - } - } - } - } - - for (var i = 0; i < scaleByMapSize(20,120); i++) - { - 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); - var terrainPainter = new LayeredPainter( - [tMainTerrain, tMainTerrain], // terrains - [2] // widths - ); - var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 3, 3); - createArea( - placer, - [terrainPainter, elevationPainter, unPaintClass(clWater)], - null - ); - } - } - } - else //vertical - { - if ((mdd2 == 1)||(mdd2 == 3)) - { - var distance = randFloat(0., 0.1); - for (var ix = 0; ix < mapSize; ix++) - { - for (var iz = 0; iz < mapSize; iz++) - { - if (ix > (0.69+distance) * mapSize) - { - if (ix < (0.69+distance) * mapSize + fadedistance) - { - setHeight(ix, iz, 3 - 7 * (ix - (0.69+distance) * mapSize) / fadedistance); - if (3 - 7 * (ix - (0.69+distance) * mapSize) / fadedistance < 0.5) - addToClass(ix, iz, clWater); - } - else - { - setHeight(ix, iz, -4); - addToClass(ix, iz, clWater); - } - } - } - } - } - if ((mdd2 == 2)||(mdd2 == 3)) - { - var distance = randFloat(0., 0.1); - for (var ix = 0; ix < mapSize; ix++) - { - for (var iz = 0; iz < mapSize; iz++) - { - if (ix < (0.31-distance) * mapSize) - { - if (ix > (0.31-distance) * mapSize - fadedistance) - { - setHeight(ix, iz, 3 - 7 * ((0.31-distance) * mapSize - ix) / fadedistance); - if (3 - 7 * ((0.31-distance) * mapSize - ix) / fadedistance < 0.5) - addToClass(ix, iz, clWater); - } - else - { - setHeight(ix, iz, -4); - addToClass(ix, iz, clWater); - } - } - } - } - } - } - - log("Creating shore jaggedness..."); - placer = new ClumpPlacer(scaleByMapSize(20, 150), 0.2, 0.1, 1); - terrainPainter = new LayeredPainter( - [tCliff, tHill], // terrains - [2] // widths - ); - elevationPainter = new SmoothElevationPainter(ELEVATION_SET, -5, 4); - createAreas( - placer, - [terrainPainter, elevationPainter, paintClass(clWater)], - [avoidClasses(clPlayer, 20), borderClasses(clWater, 6, 4)], - scaleByMapSize(7, 130) * 2, 150 - ); - - placer = new ClumpPlacer(scaleByMapSize(15, 80), 0.2, 0.1, 1); - terrainPainter = new LayeredPainter( - [tCliff, tHill], // terrains - [2] // widths - ); - elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 3, 4); - createAreas( - placer, - [terrainPainter, elevationPainter, unPaintClass(clWater)], - borderClasses(clWater, 4, 7), - scaleByMapSize(12, 130) * 2, 150 - ); - - var mdd3 = randIntInclusive(1,3); - if (mdd3 == 1) - { - log("Creating islands..."); - placer = new ClumpPlacer(randIntInclusive(scaleByMapSize(8,15),scaleByMapSize(15,23))*randIntInclusive(scaleByMapSize(8,15),scaleByMapSize(15,23)), 0.80, 0.1, randFloat(0.0, 0.2)); - terrainPainter = new LayeredPainter( - [tMainTerrain, tMainTerrain], // terrains - [2] // widths - ); - elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 3.1, 4); - createAreas( - placer, - [terrainPainter, elevationPainter, paintClass(clLand)], - avoidClasses(clLand, 3, clPlayer, 3), - scaleByMapSize(2, 5)*randIntInclusive(8,14) - ); - } - else if (mdd3 == 2) - { - log("Creating extentions..."); - placer = new ClumpPlacer(randIntInclusive(scaleByMapSize(13,24),scaleByMapSize(24,45))*randIntInclusive(scaleByMapSize(13,24),scaleByMapSize(24,45)), 0.80, 0.1, 10); - terrainPainter = new LayeredPainter( - [tMainTerrain, tMainTerrain], // terrains - [2] // widths - ); - elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 3.1, 4); - createAreas( - placer, - [terrainPainter, elevationPainter, paintClass(clLand)], - null, - scaleByMapSize(2, 5)*randIntInclusive(8,14) - ); - } -} -//******************************************************************************************************** -else if (md == 7) //gulf -{ - - for (var ix = 0; ix < mapSize; ix++) - { - for (var iz = 0; iz < mapSize; iz++) - { - var x = ix / (mapSize + 1.0); - var z = iz / (mapSize + 1.0); - setHeight(ix, iz, 3); - } - } - - var mdd1 = randFloat(0,4); - - var playerIDs = sortAllPlayers(); - - var playerX = []; - var playerZ = []; - var playerAngle = []; - - var startAngle = -PI/6 + (mdd1-1)*PI/2; - for (var i = 0; i < numPlayers; i++) - { - playerAngle[i] = startAngle + Math.PI * 2/3 * (numPlayers == 1 ? 1 : 2 * i / (numPlayers - 1)); - playerX[i] = 0.5 + 0.35*cos(playerAngle[i]); - playerZ[i] = 0.5 + 0.35*sin(playerAngle[i]); - } - - for (var i = 0; i < numPlayers; i++) - { - var fx = fractionToTiles(playerX[i]); - var fz = fractionToTiles(playerZ[i]); - var ix = round(fx); - var iz = round(fz); - // create the city patch - var cityRadius = scaleByMapSize(17,29)/3; - placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz); - createArea(placer, paintClass(clPlayer), null); - } - - fx = fractionToTiles(0.5); - fz = fractionToTiles(0.5); - ix = round(fx); - iz = round(fz); - - var lSize = 1; - - var placer = new ClumpPlacer(mapArea * 0.08 * lSize, 0.7, 0.05, 10, ix, iz); - var terrainPainter = new LayeredPainter( - [tMainTerrain, tMainTerrain, tMainTerrain, tMainTerrain], // terrains - [1, 4, 2] // widths - ); - - var elevationPainter = new SmoothElevationPainter( - ELEVATION_SET, // type - -3, // elevation - 4 // blend radius - ); - createArea(placer, [terrainPainter, elevationPainter, paintClass(clWater)], avoidClasses(clPlayer,floor(scaleByMapSize(15,25)))); - - fx = fractionToTiles(0.5 - 0.2*cos(mdd1*PI/2)); - fz = fractionToTiles(0.5 - 0.2*sin(mdd1*PI/2)); - ix = round(fx); - iz = round(fz); - - var lSize = sqrt(sqrt(sqrt(scaleByMapSize(1, 6)))); - - var placer = new ClumpPlacer(mapArea * 0.13 * lSize, 0.7, 0.05, 10, ix, iz); - var terrainPainter = new LayeredPainter( - [tMainTerrain, tMainTerrain, tMainTerrain, tMainTerrain], // terrains - [1, 4, 2] // widths - ); - var elevationPainter = new SmoothElevationPainter( - ELEVATION_SET, // type - -3, // elevation - 4 // blend radius - ); - createArea(placer, [terrainPainter, elevationPainter, paintClass(clWater)], avoidClasses(clPlayer,floor(scaleByMapSize(15,25)))); - - fx = fractionToTiles(0.5 - 0.49*cos(mdd1*PI/2)); - fz = fractionToTiles(0.5 - 0.49*sin(mdd1*PI/2)); - ix = round(fx); - iz = round(fz); - - var lSize = sqrt(sqrt(sqrt(scaleByMapSize(1, 6)))); - - var placer = new ClumpPlacer(mapArea * 0.15 * lSize, 0.7, 0.05, 10, ix, iz); - var terrainPainter = new LayeredPainter( - [tMainTerrain, tMainTerrain, tMainTerrain, tMainTerrain], // terrains - [1, 4, 2] // widths - ); - var elevationPainter = new SmoothElevationPainter( - ELEVATION_SET, // type - -3, // elevation - 4 // blend radius - ); - createArea(placer, [terrainPainter, elevationPainter, paintClass(clWater)], avoidClasses(clPlayer,floor(scaleByMapSize(15,25)))); -} -//******************************************************************************************************** -else if (md == 8) //lakes -{ - var [playerIDs, playerX, playerZ, playerAngle] = radialPlayerPlacement(); - - for (var ix = 0; ix < mapSize; ix++) - { - for (var iz = 0; iz < mapSize; iz++) - { - var x = ix / (mapSize + 1.0); - var z = iz / (mapSize + 1.0); - setHeight(ix, iz, 3); - } - } - - for (var i = 0; i < numPlayers; i++) - { - var fx = fractionToTiles(playerX[i]); - var fz = fractionToTiles(playerZ[i]); - var ix = round(fx); - var iz = round(fz); - // create the city patch - var cityRadius = scaleByMapSize(17,29)/3; - placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz); - createArea(placer, paintClass(clPlayer), null); - } - - log("Creating lakes..."); - placer = new ClumpPlacer(scaleByMapSize(160, 700), 0.2, 0.1, 1); - terrainPainter = new LayeredPainter( - [tShore, tWater, tWater], // terrains - [1, 3] // widths - ); - elevationPainter = new SmoothElevationPainter(ELEVATION_SET, -5, 5); - if (randBool()) - { - createAreas( - placer, - [terrainPainter, elevationPainter, paintClass(clWater)], - avoidClasses(clPlayer, 12, clWater, 8), - scaleByMapSize(5, 16) - ); - } - else - { - createAreas( - placer, - [terrainPainter, elevationPainter, paintClass(clWater)], - avoidClasses(clPlayer, 12), - scaleByMapSize(5, 16) - ); - } -} -//******************************************************************************************************** -else if (md == 9) //passes -{ - var [playerIDs, playerX, playerZ, playerAngle, startAngle] = radialPlayerPlacement(); - - for (var ix = 0; ix < mapSize; ix++) - { - for (var iz = 0; iz < mapSize; iz++) - { - var x = ix / (mapSize + 1.0); - var z = iz / (mapSize + 1.0); - setHeight(ix, iz, 3); - } - } - - log ("Creating ranges..."); - for (var m = 0; m < numPlayers; m++) - { - var tang = startAngle + (m+0.5)*TWO_PI/(numPlayers); - 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); - var terrainPainter = new LayeredPainter( - [tShore, tWater, tWater], // terrains - [1, 3] // widths - ); - var elevationPainter = new SmoothElevationPainter( - ELEVATION_SET, // type - 24, // elevation - 3 // blend radius - ); - createArea(placer, [terrainPainter, elevationPainter, paintClass(clWater)], avoidClasses(clPlayer, 5)); - 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))); - var painter = new LayeredPainter([tWater, tWater], [1]); - var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 24, 0); - createArea(placer, [painter, elevationPainter], avoidClasses(clPlayer, 5)); - - 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); - var painter = new LayeredPainter([tCliff, tCliff], [1]); - var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 3, 2); - createArea(placer, [painter, elevationPainter], null); - } - var mdd1 = randIntInclusive(1,3); - if (mdd1 <= 2) - { - var fx = fractionToTiles(0.5); - var fz = fractionToTiles(0.5); - ix = round(fx); - iz = round(fz); - - var placer = new ClumpPlacer(mapArea * 0.005, 0.7, 0.1, 10, ix, iz); - var terrainPainter = new LayeredPainter( - [tShore, tWater, tWater, tWater], // terrains - [1, 4, 2] // widths - ); - var elevationPainter = new SmoothElevationPainter( - ELEVATION_SET, // type - 24, // elevation - 4 // blend radius - ); - createArea(placer, [terrainPainter, elevationPainter, paintClass(clWater)], null); - } - else - { - var fx = fractionToTiles(0.5); - var fz = fractionToTiles(0.5); - ix = round(fx); - iz = round(fz); - - var lSize = sqrt(sqrt(sqrt(scaleByMapSize(1, 6)))); - - var placer = new ClumpPlacer(mapArea * 0.03 * lSize, 0.7, 0.1, 10, ix, iz); - var terrainPainter = new LayeredPainter( - [tShore, tWater, tWater, tWater], // terrains - [1, 4, 2] // widths - ); - var elevationPainter = new SmoothElevationPainter( - ELEVATION_SET, // type - -4, // elevation - 3 // blend radius - ); - createArea(placer, [terrainPainter, elevationPainter, paintClass(clWater)], null); - } -} -//******************************************************************************************************** -else if (md == 10) //lowlands -{ - var [playerIDs, playerX, playerZ, playerAngle, startAngle] = radialPlayerPlacement(); - - for (var ix = 0; ix < mapSize; ix++) - { - for (var iz = 0; iz < mapSize; iz++) - { - var x = ix / (mapSize + 1.0); - var z = iz / (mapSize + 1.0); - setHeight(ix, iz, 30); - } - } - - var radius = scaleByMapSize(18,32); - var cliffRadius = 2; - var elevation = 20; - var hillSize = PI * radius * radius; - - var split = 1; - if ((mapSize / 64 == 2)&&(numPlayers <= 2)) - { - split = 2; - } - else if ((mapSize / 64 == 3)&&(numPlayers <= 3)) - { - split = 2; - } - else if ((mapSize / 64 == 4)&&(numPlayers <= 4)) - { - split = 2; - } - else if ((mapSize / 64 == 5)&&(numPlayers <= 4)) - { - split = 2; - } - else if ((mapSize / 64 == 6)&&(numPlayers <= 5)) - { - split = 2; - } - else if ((mapSize / 64 == 7)&&(numPlayers <= 6)) - { - split = 2; - } - - for (var i = 0; i < numPlayers*split; i++) - { - var tang = startAngle + (i)*TWO_PI/(numPlayers*split); - var fx = fractionToTiles(0.5 + 0.35*cos(tang)); - var fz = fractionToTiles(0.5 + 0.35*sin(tang)); - var ix = round(fx); - var iz = round(fz); - // create the hill - var placer = new ClumpPlacer(hillSize, 0.65, 0.1, 10, ix, iz); - var terrainPainter = new LayeredPainter( - [tMainTerrain, tMainTerrain], // terrains - [cliffRadius] // widths - ); - var elevationPainter = new SmoothElevationPainter( - ELEVATION_SET, // type - 3, // elevation - cliffRadius // blend radius - ); - createArea(placer, [terrainPainter, elevationPainter, paintClass(clLand)], null); - } - - var fx = fractionToTiles(0.5); - var fz = fractionToTiles(0.5); - ix = round(fx); - iz = round(fz); - - var lSize = sqrt(sqrt(sqrt(scaleByMapSize(1, 6)))); - - var placer = new ClumpPlacer(mapArea * 0.091 * lSize, 0.7, 0.1, 10, ix, iz); - var terrainPainter = new LayeredPainter( - [tMainTerrain, tMainTerrain, tMainTerrain, tMainTerrain], // terrains - [1, 4, 2] // widths - ); - var elevationPainter = new SmoothElevationPainter( - ELEVATION_SET, // type - 3, // elevation - 4 // blend radius - ); - createArea(placer, [terrainPainter, elevationPainter, paintClass(clWater)], null); - - for (var m = 0; m < numPlayers*split; m++) - { - var tang = startAngle + m*TWO_PI/(numPlayers*split); - 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); - var terrainPainter = new LayeredPainter( - [tMainTerrain, tMainTerrain, tMainTerrain], // terrains - [1, 3] // widths - ); - var elevationPainter = new SmoothElevationPainter( - ELEVATION_SET, // type - 3, // elevation - 4 // blend radius - ); - createArea(placer, [terrainPainter, elevationPainter, paintClass(clWater)], null); - } -} -//******************************************************************************************************** -else //mainland -{ - var [playerIDs, playerX, playerZ, playerAngle] = radialPlayerPlacement(); - - for (var ix = 0; ix < mapSize; ix++) - { - for (var iz = 0; iz < mapSize; iz++) - { - var x = ix / (mapSize + 1.0); - var z = iz / (mapSize + 1.0); - setHeight(ix, iz, 3); - } - } - -} - -paintTerrainBasedOnHeight(3.12, 40, 1, tCliff); -paintTerrainBasedOnHeight(3, 3.12, 1, tMainTerrain); -paintTerrainBasedOnHeight(1, 3, 1, tShore); -paintTerrainBasedOnHeight(-8, 1, 2, tWater); -unPaintTileClassBasedOnHeight(0, 3.12, 1, clWater); -unPaintTileClassBasedOnHeight(-6, 0, 1, clLand); -paintTileClassBasedOnHeight(-6, 0, 1, clWater); -paintTileClassBasedOnHeight(0, 3.12, 1, clLand); -paintTileClassBasedOnHeight(3.12, 40, 1, clHill); - -for (var i = 0; i < numPlayers; i++) -{ - var id = playerIDs[i]; - log("Creating base for player " + id + "..."); - - var radius = scaleByMapSize(17,29); - var shoreRadius = 4; - var elevation = 3; - - var hillSize = PI * radius * radius; - // get the x and z in tiles - var fx = fractionToTiles(playerX[i]); - var fz = fractionToTiles(playerZ[i]); - var ix = round(fx); - var iz = round(fz); - - if (iberianTowers) - placeCivDefaultEntities(fx, fz, id, { 'iberWall': 'towers' }); - else - placeCivDefaultEntities(fx, fz, id); - - placeDefaultChicken(fx, fz, clBaseResource); - - // create berry bushes - var bbAngle = randFloat(0, TWO_PI); - var bbDist = 12; - var bbX = round(fx + bbDist * cos(bbAngle)); - var bbZ = round(fz + bbDist * sin(bbAngle)); - var group = new SimpleGroup( - [new SimpleObject(oFruitBush, 5,5, 0,3)], - true, clBaseResource, bbX, bbZ - ); - createObjectGroup(group, 0); - if (needsAdditionalWood) - { - // create woods - var bbAngle = randFloat(0, TWO_PI); - var bbDist = 13; - var bbX = round(fx + bbDist * cos(bbAngle)); - var bbZ = round(fz + bbDist * sin(bbAngle)); - group = new SimpleGroup( - [new SimpleObject(oWood, 14,14, 0,3)], - true, clBaseResource, bbX, bbZ - ); - createObjectGroup(group, 0); - } - - // create metal mine - var mAngle = bbAngle; - while(abs(mAngle - bbAngle) < PI/3) - { - mAngle = randFloat(0, TWO_PI); - } - var mDist = 12; - var mX = round(fx + mDist * cos(mAngle)); - var mZ = round(fz + mDist * sin(mAngle)); - group = new SimpleGroup( - [new SimpleObject(oMetalLarge, 1,1, 0,0)], - true, clBaseResource, mX, mZ - ); - createObjectGroup(group, 0); - - // create stone mines - mAngle += randFloat(PI/8, PI/4); - mX = round(fx + mDist * cos(mAngle)); - mZ = round(fz + mDist * sin(mAngle)); - group = new SimpleGroup( - [new SimpleObject(oStoneLarge, 1,1, 0,2)], - true, clBaseResource, mX, mZ - ); - createObjectGroup(group, 0); - var hillSize = PI * radius * radius; - // create starting trees - var num = floor(hillSize / 100); - var tAngle = randFloat(-PI/3, 4*PI/3); - var tDist = randFloat(11, 13); - var tX = round(fx + tDist * cos(tAngle)); - var tZ = round(fz + tDist * sin(tAngle)); - group = new SimpleGroup( - [new SimpleObject(oTree1, num, num, 0,5)], - false, clBaseResource, tX, tZ - ); - createObjectGroup(group, 0, avoidClasses(clBaseResource,2)); - - placeDefaultDecoratives(fx, fz, aGrassShort, clBaseResource, radius); -} - -for (var i = 0; i < numPlayers; i++) -{ - var fx = fractionToTiles(playerX[i]); - var fz = fractionToTiles(playerZ[i]); - var ix = round(fx); - var iz = round(fz); - // create the city patch - var cityRadius = radius/3; - placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz); - var painter = new LayeredPainter([tRoadWild, tRoad], [1]); - createArea(placer, [painter, paintClass(clPlayer)], null); -} - -log("Creating bumps..."); -placer = new ClumpPlacer(scaleByMapSize(20, 50), 0.3, 0.06, 1); -painter = new SmoothElevationPainter(ELEVATION_MODIFY, 2, 2); -createAreas( - placer, - painter, - [avoidClasses(clWater, 2, clPlayer, 10), stayClasses(clLand, 3)], - randIntInclusive(0,scaleByMapSize(200, 400)) -); - -log("Creating hills..."); -placer = new ClumpPlacer(scaleByMapSize(20, 150), 0.2, 0.1, 1); -terrainPainter = new LayeredPainter( - [tCliff, tHill], // terrains - [2] // widths -); -elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 18, 2); -createAreas( - placer, - [terrainPainter, elevationPainter, paintClass(clHill)], - [avoidClasses(clPlayer, 20, clHill, randIntInclusive(6, 18)), stayClasses(clLand, 0)], - randIntInclusive(0, scaleByMapSize(4, 8))*randIntInclusive(1, scaleByMapSize(4, 9)) -); - -var multiplier = sqrt(randFloat(0.5,1.2)*randFloat(0.5,1.2)); -// calculate desired number of trees for map (based on size) -if (currentBiome() == "savanna") -{ - var MIN_TREES = floor(200*multiplier); - var MAX_TREES = floor(1250*multiplier); - var P_FOREST = randFloat(0.02, 0.05); -} -else if (currentBiome() == "tropic") -{ - var MIN_TREES = floor(1000*multiplier); - var MAX_TREES = floor(6000*multiplier); - var P_FOREST = randFloat(0.5, 0.7); -} -else -{ - var MIN_TREES = floor(500*multiplier); - var MAX_TREES = floor(3000*multiplier); - var P_FOREST = randFloat(0.5,0.8); -} - -var totalTrees = scaleByMapSize(MIN_TREES, MAX_TREES); -var numForest = totalTrees * P_FOREST; -var numStragglers = totalTrees * (1.0 - P_FOREST); - -log("Creating forests..."); -var types = [ - [[tForestFloor2, tMainTerrain, pForest1], [tForestFloor2, pForest1]], - [[tForestFloor1, tMainTerrain, pForest2], [tForestFloor1, pForest2]] -]; // some variation - -if (currentBiome() == "savanna") - var size = numForest / (0.5 * scaleByMapSize(2,8) * numPlayers); -else - var size = numForest / (scaleByMapSize(2,8) * numPlayers); - -var num = floor(size / types.length); -for (var i = 0; i < types.length; ++i) -{ - placer = new ClumpPlacer(numForest / num, 0.1, 0.1, 1); - painter = new LayeredPainter( - types[i], // terrains - [2] // widths - ); - createAreas( - placer, - [painter, paintClass(clForest)], - [avoidClasses(clPlayer, 20, clForest, randIntInclusive(5, 15), clHill, 0), stayClasses(clLand, 4)], - num - ); -} - -RMS.SetProgress(50); - -log("Creating dirt patches..."); -var sizes = [scaleByMapSize(3, 48), scaleByMapSize(5, 84), scaleByMapSize(8, 128)]; -var numb = 1; -if (currentBiome() == "savanna") - numb = 3; -for (var i = 0; i < sizes.length; i++) -{ - placer = new ClumpPlacer(sizes[i], 0.3, 0.06, 0.5); - painter = new LayeredPainter( - [[tMainTerrain,tTier1Terrain],[tTier1Terrain,tTier2Terrain], [tTier2Terrain,tTier3Terrain]], // terrains - [1,1] // widths - ); - createAreas( - placer, - [painter, paintClass(clDirt)], - [avoidClasses(clForest, 0, clHill, 0, clDirt, 5, clPlayer, 7), stayClasses(clLand, 4)], - numb*scaleByMapSize(15, 45) - ); -} - -log("Creating grass patches..."); -var sizes = [scaleByMapSize(2, 32), scaleByMapSize(3, 48), scaleByMapSize(5, 80)]; -for (var i = 0; i < sizes.length; i++) -{ - placer = new ClumpPlacer(sizes[i], 0.3, 0.06, 0.5); - painter = new TerrainPainter(tTier4Terrain); - createAreas( - placer, - painter, - [avoidClasses(clForest, 0, clHill, 0, clDirt, 5, clPlayer, 7), stayClasses(clLand, 4)], - numb*scaleByMapSize(15, 45) - ); -} -RMS.SetProgress(55); - -log("Creating stone mines..."); -group = new SimpleGroup([new SimpleObject(oStoneSmall, 0,2, 0,4), new SimpleObject(oStoneLarge, 1,1, 0,4)], true, clRock); -createObjectGroupsDeprecated(group, 0, - [avoidClasses(clForest, 1, clPlayer, 20, clRock, 10, clHill, 1), stayClasses(clLand, 4)], - randIntInclusive(scaleByMapSize(2,9),scaleByMapSize(9,40)), 100 -); - -log("Creating small stone quarries..."); -group = new SimpleGroup([new SimpleObject(oStoneSmall, 2,5, 1,3)], true, clRock); -createObjectGroupsDeprecated(group, 0, - [avoidClasses(clForest, 1, clPlayer, 20, clRock, 10, clHill, 1), stayClasses(clLand, 4)], - randIntInclusive(scaleByMapSize(2,9),scaleByMapSize(9,40)), 100 -); - -log("Creating metal mines..."); -group = new SimpleGroup([new SimpleObject(oMetalLarge, 1,1, 0,4)], true, clMetal); -createObjectGroupsDeprecated(group, 0, - [avoidClasses(clForest, 1, clPlayer, 20, clMetal, 10, clRock, 5, clHill, 1), stayClasses(clLand, 4)], - randIntInclusive(scaleByMapSize(2,9),scaleByMapSize(9,40)), 100 -); - -RMS.SetProgress(65); - -log("Creating small decorative rocks..."); -group = new SimpleGroup( - [new SimpleObject(aRockMedium, 1,3, 0,1)], - true -); -createObjectGroupsDeprecated( - group, 0, - [avoidClasses(clWater, 0, clForest, 0, clPlayer, 0, clHill, 0), stayClasses(clLand, 4)], - scaleByMapSize(16, 262), 50 -); - -log("Creating large decorative rocks..."); -group = new SimpleGroup( - [new SimpleObject(aRockLarge, 1,2, 0,1), new SimpleObject(aRockMedium, 1,3, 0,2)], - true -); -createObjectGroupsDeprecated( - group, 0, - [avoidClasses(clWater, 0, clForest, 0, clPlayer, 0, clHill, 0), stayClasses(clLand, 4)], - scaleByMapSize(8, 131), 50 -); -RMS.SetProgress(70); - -log("Creating deer..."); -group = new SimpleGroup( - [new SimpleObject(oMainHuntableAnimal, 5,7, 0,4)], - true, clFood -); -createObjectGroupsDeprecated(group, 0, - [avoidClasses(clWater, 0, clForest, 0, clPlayer, 20, clHill, 1, clFood, 20), stayClasses(clLand, 4)], - randIntInclusive(numPlayers+3, 5*numPlayers+4), 50 -); - -log("Creating berry bush..."); -group = new SimpleGroup( - [new SimpleObject(oFruitBush, 5,7, 0,4)], - true, clFood -); -createObjectGroupsDeprecated(group, 0, - [avoidClasses(clWater, 0, clForest, 0, clPlayer, 20, clHill, 1, clFood, 20), stayClasses(clLand, 4)], - randIntInclusive(1, 4) * numPlayers + 2, 50 -); - -RMS.SetProgress(75); - -log("Creating sheep..."); -group = new SimpleGroup( - [new SimpleObject(oSecondaryHuntableAnimal, 2,3, 0,2)], - true, clFood -); -createObjectGroupsDeprecated(group, 0, - [avoidClasses(clWater, 0, clForest, 0, clPlayer, 20, clHill, 1, clFood, 20), stayClasses(clLand, 4)], - randIntInclusive(numPlayers+3, 5*numPlayers+4), 50 -); - -log("Creating fish..."); -group = new SimpleGroup( - [new SimpleObject(oFish, 2,3, 0,2)], - true, clFood -); -createObjectGroupsDeprecated(group, 0, - avoidClasses(clLand, 5, clForest, 0, clPlayer, 0, clHill, 0, clFood, 20), - randIntInclusive(15, 40) * numPlayers, 60 -); - -RMS.SetProgress(85); - -log("Creating straggler trees..."); -var types = [oTree1, oTree2, oTree4, oTree3]; // some variation -var num = floor(numStragglers / types.length); -for (var i = 0; i < types.length; ++i) -{ - group = new SimpleGroup( - [new SimpleObject(types[i], 1,1, 0,3)], - true, clForest - ); - createObjectGroupsDeprecated(group, 0, - [avoidClasses(clWater, 1, clForest, 1, clHill, 1, clPlayer, 0, clMetal, 6, clRock, 6), stayClasses(clLand, 4)], - num - ); -} - -var planetm = 1; -if (currentBiome() == "tropic") - planetm = 8; - -log("Creating small grass tufts..."); -group = new SimpleGroup( - [new SimpleObject(aGrassShort, 1,2, 0,1, -PI/8,PI/8)] -); -createObjectGroupsDeprecated(group, 0, - [avoidClasses(clWater, 2, clHill, 2, clPlayer, 2, clDirt, 0), stayClasses(clLand, 4)], - planetm * scaleByMapSize(13, 200) -); - -RMS.SetProgress(90); - -log("Creating large grass tufts..."); -group = new SimpleGroup( - [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)] -); -createObjectGroupsDeprecated(group, 0, - [avoidClasses(clWater, 3, clHill, 2, clPlayer, 2, clDirt, 1, clForest, 0), stayClasses(clLand, 4)], - planetm * scaleByMapSize(13, 200) -); -RMS.SetProgress(95); - -log("Creating shallow flora..."); -group = new SimpleGroup( - [new SimpleObject(aLillies, 1,2, 0,2), new SimpleObject(aReeds, 2,4, 0,2)] -); -createObjectGroupsDeprecated(group, 0, - stayClasses(clShallow, 1), - 60 * scaleByMapSize(13, 200), 80 -); - -log("Creating bushes..."); -group = new SimpleGroup( - [new SimpleObject(aBushMedium, 1,2, 0,2), new SimpleObject(aBushSmall, 2,4, 0,2)] -); -createObjectGroupsDeprecated(group, 0, - [avoidClasses(clWater, 1, clHill, 1, clPlayer, 1, clDirt, 1), stayClasses(clLand, 3)], - planetm * scaleByMapSize(13, 200), 50 -); - -setSkySet(pickRandom(["cirrus", "cumulus", "sunny", "sunny 1", "mountainous", "stratus"])); -setSunRotation(randFloat(0, TWO_PI)); -setSunElevation(randFloat(PI/ 5, PI / 3)); +createUnknownMap(); +createUnknownObjects(); ExportMap(); diff --git a/binaries/data/mods/public/maps/random/unknown_land.js b/binaries/data/mods/public/maps/random/unknown_land.js index 515d801e3a..5bf2462f4c 100644 --- a/binaries/data/mods/public/maps/random/unknown_land.js +++ b/binaries/data/mods/public/maps/random/unknown_land.js @@ -1,1382 +1,11 @@ RMS.LoadLibrary("rmgen"); RMS.LoadLibrary("rmbiome"); +RMS.LoadLibrary("the_unknown"); -TILE_CENTERED_HEIGHT_MAP = true; +g_PlayerBases = true; +g_AllowNaval = false; -setSelectedBiome(); - -const tMainTerrain = g_Terrains.mainTerrain; -const tForestFloor1 = g_Terrains.forestFloor1; -const tForestFloor2 = g_Terrains.forestFloor2; -const tCliff = g_Terrains.cliff; -const tTier1Terrain = g_Terrains.tier1Terrain; -const tTier2Terrain = g_Terrains.tier2Terrain; -const tTier3Terrain = g_Terrains.tier3Terrain; -const tHill = g_Terrains.hill; -const tDirt = g_Terrains.dirt; -const tRoad = g_Terrains.road; -const tRoadWild = g_Terrains.roadWild; -const tTier4Terrain = g_Terrains.tier4Terrain; -const tShoreBlend = g_Terrains.shoreBlend; -const tShore = g_Terrains.shore; -const tWater = g_Terrains.water; - -const oTree1 = g_Gaia.tree1; -const oTree2 = g_Gaia.tree2; -const oTree3 = g_Gaia.tree3; -const oTree4 = g_Gaia.tree4; -const oTree5 = g_Gaia.tree5; -const oFruitBush = g_Gaia.fruitBush; -const oMainHuntableAnimal = g_Gaia.mainHuntableAnimal; -const oFish = g_Gaia.fish; -const oSecondaryHuntableAnimal = g_Gaia.secondaryHuntableAnimal; -const oStoneLarge = g_Gaia.stoneLarge; -const oStoneSmall = g_Gaia.stoneSmall; -const oMetalLarge = g_Gaia.metalLarge; -const oWood = "gaia/special_treasure_wood"; - -const aGrass = g_Decoratives.grass; -const aGrassShort = g_Decoratives.grassShort; -const aReeds = g_Decoratives.reeds; -const aLillies = g_Decoratives.lillies; -const aRockLarge = g_Decoratives.rockLarge; -const aRockMedium = g_Decoratives.rockMedium; -const aBushMedium = g_Decoratives.bushMedium; -const aBushSmall = g_Decoratives.bushSmall; - -const pForest1 = [tForestFloor2 + TERRAIN_SEPARATOR + oTree1, tForestFloor2 + TERRAIN_SEPARATOR + oTree2, tForestFloor2]; -const pForest2 = [tForestFloor1 + TERRAIN_SEPARATOR + oTree4, tForestFloor1 + TERRAIN_SEPARATOR + oTree5, tForestFloor1]; - -InitMap(); - -const numPlayers = getNumPlayers(); -const mapSize = getMapSize(); -const mapArea = mapSize*mapSize; - -var clPlayer = createTileClass(); -var clHill = createTileClass(); -var clForest = createTileClass(); -var clWater = createTileClass(); -var clDirt = createTileClass(); -var clRock = createTileClass(); -var clMetal = createTileClass(); -var clFood = createTileClass(); -var clBaseResource = createTileClass(); -var clSettlement = createTileClass(); -var clLand = createTileClass(); -var clShallow = createTileClass(); - -initTerrain(tWater); - -var md = randIntInclusive(2,13); -var needsAdditionalWood = false; -//***************************************************************************************************************************** -if (md == 2) //continent -{ - var [playerIDs, playerX, playerZ, playerAngle] = radialPlayerPlacement(0.25); - - for (var i = 0; i < numPlayers; i++) - { - var fx = fractionToTiles(playerX[i]); - var fz = fractionToTiles(playerZ[i]); - var ix = round(fx); - var iz = round(fz); - - addCivicCenterAreaToClass(ix, iz, clPlayer); - - var placer = new ChainPlacer(2, floor(scaleByMapSize(5, 9)), floor(scaleByMapSize(5, 20)), 1, ix, iz, 0, [floor(scaleByMapSize(23, 50))]); - var elevationPainter = new SmoothElevationPainter( - ELEVATION_SET, // type - 3, // elevation - 4 // blend radius - ); - createArea(placer, [elevationPainter, paintClass(clLand)], null); - } - - var fx = fractionToTiles(0.5); - var fz = fractionToTiles(0.5); - ix = round(fx); - iz = round(fz); - - var placer = new ChainPlacer(2, floor(scaleByMapSize(5, 12)), floor(scaleByMapSize(60, 700)), 1, ix, iz, 0, [floor(mapSize * 0.33)]); - var terrainPainter = new LayeredPainter( - [tWater, tShore, tMainTerrain], // terrains - [4, 2] // widths - ); - var elevationPainter = new SmoothElevationPainter( - ELEVATION_SET, // type - 3, // elevation - 4 // blend radius - ); - createArea(placer, [terrainPainter, elevationPainter, paintClass(clLand)], null); - - var clPeninsulaSteam = createTileClass(); - - if (randBool(1/3)) // peninsula - { - var angle = randFloat(0, TWO_PI); - - var fx = fractionToTiles(0.5 + 0.25*cos(angle)); - var fz = fractionToTiles(0.5 + 0.25*sin(angle)); - ix = round(fx); - iz = round(fz); - - var placer = new ChainPlacer(2, floor(scaleByMapSize(5, 12)), floor(scaleByMapSize(60, 700)), 1, ix, iz, 0, [floor(mapSize * 0.33)]); - var terrainPainter = new LayeredPainter( - [tWater, tShore, tMainTerrain], // terrains - [4, 2] // widths - ); - var elevationPainter = new SmoothElevationPainter( - ELEVATION_SET, // type - 3, // elevation - 4 // blend radius - ); - createArea(placer, [terrainPainter, elevationPainter, paintClass(clLand)], null); - - var fx = fractionToTiles(0.5 + 0.35*cos(angle)); - var fz = fractionToTiles(0.5 + 0.35*sin(angle)); - ix = round(fx); - iz = round(fz); - - var placer = new ClumpPlacer(mapArea * 0.3, 0.9, 0.01, 10, ix, iz); - createArea(placer, [paintClass(clPeninsulaSteam)], null); - } -} -//******************************************************************************************************** -else if (md == 3) //central sea -{ - var playerIDs = primeSortAllPlayers(); - var playerPos = placePlayersRiver(); - var playerX = []; - var playerZ = []; - var playerAngle = []; - - var mdd1 = randIntInclusive(1,2); - if (mdd1 == 1) //vertical - for (var i = 0; i < numPlayers; i++) - { - playerZ[i] = playerPos[i]; - playerX[i] = 0.2 + 0.6*(i%2); - } - else //horizontal - for (var i = 0; i < numPlayers; i++) - { - playerZ[i] = 0.2 + 0.6*(i%2); - playerX[i] = playerPos[i]; - } - - paintRiver({ - "horizontal": mdd1 != 1, - "parallel": false, - "position": 0.5, - "width": randFloat(0.22, 0.3) + scaleByMapSize(1, 4) / 20, - "fadeDist": 0.025, - "deviation": 0, - "waterHeight": -3, - "landHeight": 3, - "meanderShort": 20, - "meanderLong": 0, - "waterFunc": (ix, iz, height) => { - placeTerrain(ix, iz, height < -1.5 ? tWater : tShore); - if (height < 0) - addToClass(ix, iz, clWater); - }, - "landFunc": (ix, iz, shoreDist1, shoreDist2) => { - setHeight(ix, iz, 3.1); - addToClass(ix, iz, clLand); - } - }); - - // linked - if (mdd1 == 1) //vertical - { - var placer = new PathPlacer(1, fractionToTiles(0.5), fractionToTiles(0.99), fractionToTiles(0.5), scaleByMapSize(randIntInclusive(16,24),randIntInclusive(100,140)), 0.5, 3*(scaleByMapSize(1,4)), 0.1, 0.01); - } - else - { - var placer = new PathPlacer(fractionToTiles(0.5), 1, fractionToTiles(0.5), fractionToTiles(0.99), scaleByMapSize(randIntInclusive(16,24),randIntInclusive(100,140)), 0.5, 3*(scaleByMapSize(1,4)), 0.1, 0.01); - } - var terrainPainter = new LayeredPainter( - [tMainTerrain, tMainTerrain, tMainTerrain], // terrains - [1, 3] // widths - ); - var elevationPainter = new SmoothElevationPainter( - ELEVATION_SET, // type - 3.1, // elevation - 4 // blend radius - ); - createArea(placer, [terrainPainter, elevationPainter, unPaintClass(clWater)], null); - - var mdd2 = randIntInclusive(1,7); - if (mdd2 == 1) - { - log("Creating islands..."); - placer = new ChainPlacer(floor(scaleByMapSize(4, 7)), floor(scaleByMapSize(7, 10)), floor(scaleByMapSize(16, 40)), 0.07); - terrainPainter = new LayeredPainter( - [tMainTerrain, tMainTerrain], // terrains - [2] // widths - ); - elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 3.1, 4); - createAreas( - placer, - [terrainPainter, elevationPainter, paintClass(clLand)], - avoidClasses(clLand, 3, clPlayer, 3), - scaleByMapSize(2, 5)*randIntInclusive(8,14) - ); - } - else if (mdd2 == 2) - { - log("Creating extentions..."); - placer = new ClumpPlacer(randIntInclusive(scaleByMapSize(13,24),scaleByMapSize(24,45))*randIntInclusive(scaleByMapSize(13,24),scaleByMapSize(24,45)), 0.80, 0.1, 10); - terrainPainter = new LayeredPainter( - [tMainTerrain, tMainTerrain], // terrains - [2] // widths - ); - elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 3.1, 4); - createAreas( - placer, - [terrainPainter, elevationPainter, paintClass(clLand)], - null, - scaleByMapSize(2, 5)*randIntInclusive(8,14) - ); - } -} -//******************************************************************************************************** -else if (md == 4) //central river -{ - - for (var ix = 0; ix < mapSize; ix++) - { - for (var iz = 0; iz < mapSize; iz++) - { - var x = ix / (mapSize + 1.0); - var z = iz / (mapSize + 1.0); - setHeight(ix, iz, 3); - } - } - - var playerIDs = primeSortAllPlayers(); - var playerPos = placePlayersRiver(); - - var playerX = []; - var playerZ = []; - var playerAngle = []; - - var mdd1 = randIntInclusive(1,2); - if (mdd1 == 1) //horizontal - for (var i = 0; i < numPlayers; i++) - { - playerZ[i] = 0.25 + 0.5*(i%2); - playerX[i] = playerPos[i]; - } - else //vertical - for (var i = 0; i < numPlayers; i++) - { - playerZ[i] = playerPos[i]; - playerX[i] = 0.25 + 0.5*(i%2); - } - - log("Creating the main river"); - - if (mdd1 == 2) - 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); - else - 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); - - var terrainPainter = new LayeredPainter( - [tShore, tWater, tWater], // terrains - [1, 3] // widths - ); - var elevationPainter = new SmoothElevationPainter( - ELEVATION_SET, // type - -4, // elevation - 4 // blend radius - ); - createArea(placer, [terrainPainter, elevationPainter], avoidClasses(clPlayer, 4)); - - if (mdd1 == 1) - placer = new ClumpPlacer(floor(PI*scaleByMapSize(10,20)*scaleByMapSize(10,20)/4), 0.95, 0.6, 10, 1, fractionToTiles(0.5)); - else - placer = new ClumpPlacer(floor(PI*scaleByMapSize(10,20)*scaleByMapSize(10,20)/4), 0.95, 0.6, 10, fractionToTiles(0.5), 1); - - var painter = new LayeredPainter([tWater, tWater], [1]); - var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, -4, 2); - createArea(placer, [painter, elevationPainter], avoidClasses(clPlayer, 8)); - - if (mdd1 == 1) - placer = new ClumpPlacer(floor(PI*scaleByMapSize(10,20)*scaleByMapSize(10,20)/4), 0.95, 0.6, 10, fractionToTiles(0.99), fractionToTiles(0.5)); - else - placer = new ClumpPlacer(floor(PI*scaleByMapSize(10,20)*scaleByMapSize(10,20)/4), 0.95, 0.6, 10, fractionToTiles(0.5), fractionToTiles(0.99)); - - var painter = new LayeredPainter([tWater, tWater], [1]); - var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, -4, 2); - createArea(placer, [painter, elevationPainter], avoidClasses(clPlayer, 8)); - - log("Creating the shallows of the main river"); - - for (var i = 0; i <= randIntInclusive(1, scaleByMapSize(4,8)); i++) - { - var cLocation = randFloat(0.15,0.85); - if (mdd1 == 1) - createShallowsPassage(floor(fractionToTiles(cLocation)), floor(fractionToTiles(0.35)), floor(fractionToTiles(cLocation)), floor(fractionToTiles(0.65)), scaleByMapSize(4,8), -2, -2, 2, clShallow, undefined, -4); - else - createShallowsPassage(floor(fractionToTiles(0.35)), floor(fractionToTiles(cLocation)), floor(fractionToTiles(0.65)), floor(fractionToTiles(cLocation)), scaleByMapSize(4,8), -2, -2, 2, clShallow, undefined, -4); - } - - if (randBool()) - { - for (var i = 0; i < numPlayers; i++) - { - var fx = fractionToTiles(playerX[i]); - var fz = fractionToTiles(playerZ[i]); - var ix = round(fx); - var iz = round(fz); - // create the city patch - var cityRadius = scaleByMapSize(17,29)/3; - placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz); - createArea(placer, paintClass(clPlayer), null); - } - - createTributaryRivers( - mdd1 == 1, - randIntInclusive(8, scaleByMapSize(12, 16)), - scaleByMapSize(10, 20), - -4, - [-6, -1.5], - 0.2 * Math.PI, - clWater, - clShallow, - avoidClasses(clPlayer, 3)); - } -} -//******************************************************************************************************** -else if (md == 5) //rivers and lake -{ - var [playerIDs, playerX, playerZ] = radialPlayerPlacement(); - - for (var i = 0; i < numPlayers; i++) - { - var fx = fractionToTiles(playerX[i]); - var fz = fractionToTiles(playerZ[i]); - var ix = round(fx); - var iz = round(fz); - - addCivicCenterAreaToClass(ix, iz, clPlayer); - } - - for (var ix = 0; ix < mapSize; ix++) - { - for (var iz = 0; iz < mapSize; iz++) - { - var x = ix / (mapSize + 1.0); - var z = iz / (mapSize + 1.0); - setHeight(ix, iz, 3); - } - } - var mdd1 = randIntInclusive(1,2); - if (mdd1 == 1) //lake - { - var fx = fractionToTiles(0.5); - var fz = fractionToTiles(0.5); - ix = round(fx); - iz = round(fz); - - var lSize = sqrt(sqrt(sqrt(scaleByMapSize(1, 6)))); - - var placer = new ChainPlacer(2, floor(scaleByMapSize(5, 16)), floor(scaleByMapSize(35, 200)), 1, ix, iz, 0, [floor(mapSize * 0.17 * lSize)]); - var terrainPainter = new LayeredPainter( - [tShore, tWater, tWater, tWater], // terrains - [1, 4, 2] // widths - ); - var elevationPainter = new SmoothElevationPainter( - ELEVATION_SET, // type - -4, // elevation - 4 // blend radius - ); - createArea(placer, [terrainPainter, elevationPainter, paintClass(clWater)], null); - - log("Creating shore jaggedness..."); - placer = new ChainPlacer(2, floor(scaleByMapSize(4, 6)), 3, 1); - terrainPainter = new LayeredPainter( - [tCliff, tHill], // terrains - [2] // widths - ); - elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 3, 4); - createAreas( - placer, - [terrainPainter, elevationPainter, unPaintClass(clWater)], - borderClasses(clWater, 4, 7), - scaleByMapSize(12, 130) * 2, 150 - ); - } - - if (randBool(1/3) &&(mdd1 == 1))//island - { - var placer = new ClumpPlacer(mapArea * 0.006 * lSize, 0.7, 0.1, 10, ix, iz); - var terrainPainter = new LayeredPainter( - [tShore, tWater, tWater, tWater], // terrains - [1, 4, 2] // widths - ); - var elevationPainter = new SmoothElevationPainter( - ELEVATION_SET, // type - 3, // elevation - 4 // blend radius - ); - createArea(placer, [terrainPainter, elevationPainter, paintClass(clWater)], null); - } -} -//******************************************************************************************************** -else if (md == 6) //edge seas -{ - - for (var ix = 0; ix < mapSize; ix++) - { - for (var iz = 0; iz < mapSize; iz++) - { - var x = ix / (mapSize + 1.0); - var z = iz / (mapSize + 1.0); - setHeight(ix, iz, 3); - } - } - - var mdd1 = randIntInclusive(1,2); - - var playerIDs = sortAllPlayers(); - - // place players - var playerX = []; - var playerZ = []; - var playerPos = []; - - for (var i = 0; i < numPlayers; i++) - { - playerPos[i] = (i + 1) / (numPlayers + 1); - if (mdd1 == 1) //horizontal - { - playerX[i] = playerPos[i]; - playerZ[i] = 0.4 + 0.2*(i%2); - } - else //vertical - { - playerX[i] = 0.4 + 0.2*(i%2); - playerZ[i] = playerPos[i]; - } - - var fx = fractionToTiles(playerX[i]); - var fz = fractionToTiles(playerZ[i]); - var ix = round(fx); - var iz = round(fz); - - addCivicCenterAreaToClass(ix, iz, clPlayer); - } - - var mdd2 = randIntInclusive(1,3); - var fadedistance = 7; - - if (mdd1 == 1) - { - if ((mdd2 == 1)||(mdd2 == 3)) - { - var distance = randFloat(0., 0.1); - for (var ix = 0; ix < mapSize; ix++) - { - for (var iz = 0; iz < mapSize; iz++) - { - if (iz > (0.69+distance) * mapSize) - { - if (iz < (0.69+distance) * mapSize + fadedistance) - { - setHeight(ix, iz, 3 - 7 * (iz - (0.69+distance) * mapSize) / fadedistance); - if (3 - 7 * (iz - (0.69+distance) * mapSize) / fadedistance < 0.5) - addToClass(ix, iz, clWater); - } - else - { - setHeight(ix, iz, -4); - addToClass(ix, iz, clWater); - } - } - } - - } - } - if ((mdd2 == 2)||(mdd2 == 3)) - { - var distance = randFloat(0., 0.1); - for (var ix = 0; ix < mapSize; ix++) - { - for (var iz = 0; iz < mapSize; iz++) - { - if (iz < (0.31-distance) * mapSize) - { - if (iz > (0.31-distance) * mapSize - fadedistance) - { - setHeight(ix, iz, 3 - 7 * ((0.31-distance) * mapSize - iz) / fadedistance); - if (3 - 7 * ((0.31-distance) * mapSize - iz) / fadedistance < 0.5) - addToClass(ix, iz, clWater); - } - else - { - setHeight(ix, iz, -4); - addToClass(ix, iz, clWater); - } - } - } - } - } - } - else //vertical - { - if ((mdd2 == 1)||(mdd2 == 3)) - { - var distance = randFloat(0., 0.1); - for (var ix = 0; ix < mapSize; ix++) - { - for (var iz = 0; iz < mapSize; iz++) - { - if (ix > (0.69+distance) * mapSize) - { - if (ix < (0.69+distance) * mapSize + fadedistance) - { - setHeight(ix, iz, 3 - 7 * (ix - (0.69+distance) * mapSize) / fadedistance); - if (3 - 7 * (ix - (0.69+distance) * mapSize) / fadedistance < 0.5) - addToClass(ix, iz, clWater); - } - else - { - setHeight(ix, iz, -4); - addToClass(ix, iz, clWater); - } - } - } - } - } - if ((mdd2 == 2)||(mdd2 == 3)) - { - var distance = randFloat(0., 0.1); - for (var ix = 0; ix < mapSize; ix++) - { - for (var iz = 0; iz < mapSize; iz++) - { - if (ix < (0.31-distance) * mapSize) - { - if (ix > (0.31-distance) * mapSize - fadedistance) - { - setHeight(ix, iz, 3 - 7 * ((0.31-distance) * mapSize - ix) / fadedistance); - if (3 - 7 * ((0.31-distance) * mapSize - ix) / fadedistance < 0.5) - addToClass(ix, iz, clWater); - } - else - { - setHeight(ix, iz, -4); - addToClass(ix, iz, clWater); - } - } - } - } - } - } - - log("Creating shore jaggedness..."); - placer = new ChainPlacer(2, floor(scaleByMapSize(4, 6)), 3, 1); - terrainPainter = new LayeredPainter( - [tCliff, tHill], // terrains - [2] // widths - ); - elevationPainter = new SmoothElevationPainter(ELEVATION_SET, -5, 4); - createAreas( - placer, - [terrainPainter, elevationPainter, paintClass(clWater)], - [avoidClasses(clPlayer, 20), borderClasses(clWater, 6, 4)], - scaleByMapSize(7, 130) * 2, 150 - ); - - placer = new ChainPlacer(2, floor(scaleByMapSize(4, 6)), 3, 1); - terrainPainter = new LayeredPainter( - [tCliff, tHill], // terrains - [2] // widths - ); - elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 3, 4); - createAreas( - placer, - [terrainPainter, elevationPainter, unPaintClass(clWater)], - borderClasses(clWater, 4, 7), - scaleByMapSize(12, 130) * 2, 150 - ); - - var mdd3 = randIntInclusive(1,5); - if (mdd3 == 1) - { - log("Creating islands..."); - placer = new ChainPlacer(floor(scaleByMapSize(4, 7)), floor(scaleByMapSize(7, 10)), floor(scaleByMapSize(16, 40)), 0.07); - terrainPainter = new LayeredPainter( - [tMainTerrain, tMainTerrain], // terrains - [2] // widths - ); - elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 3.1, 4); - createAreas( - placer, - [terrainPainter, elevationPainter, paintClass(clLand)], - avoidClasses(clLand, 3, clPlayer, 3), - scaleByMapSize(2, 5)*randIntInclusive(8,14) - ); - } - else if (mdd3 == 2) - { - log("Creating extentions..."); - placer = new ChainPlacer(floor(scaleByMapSize(4, 7)), floor(scaleByMapSize(7, 10)), floor(scaleByMapSize(16, 40)), 0.07); - terrainPainter = new LayeredPainter( - [tMainTerrain, tMainTerrain], // terrains - [2] // widths - ); - elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 3.1, 4); - createAreas( - placer, - [terrainPainter, elevationPainter, paintClass(clLand)], - null, - scaleByMapSize(2, 5)*randIntInclusive(8,14) - ); - } -} -//******************************************************************************************************** -else if (md == 7) //gulf -{ - for (var ix = 0; ix < mapSize; ix++) - { - for (var iz = 0; iz < mapSize; iz++) - { - var x = ix / (mapSize + 1.0); - var z = iz / (mapSize + 1.0); - setHeight(ix, iz, 3); - } - } - - var mdd1 = randFloat(0,4); - - var playerIDs = sortAllPlayers(); - - // place players - var playerX = []; - var playerZ = []; - var playerAngle = []; - - var startAngle = -PI/6 + (mdd1-1)*PI/2; - for (var i = 0; i < numPlayers; i++) - { - playerAngle[i] = startAngle + Math.PI * 2/3 * (numPlayers == 1 ? 1 : 2 * i / (numPlayers - 1)); - playerX[i] = 0.5 + 0.35*cos(playerAngle[i]); - playerZ[i] = 0.5 + 0.35*sin(playerAngle[i]); - } - - for (var i = 0; i < numPlayers; i++) - { - var fx = fractionToTiles(playerX[i]); - var fz = fractionToTiles(playerZ[i]); - var ix = round(fx); - var iz = round(fz); - // create the city patch - var cityRadius = scaleByMapSize(17,29)/3; - placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz); - createArea(placer, paintClass(clPlayer), null); - } - - fx = fractionToTiles(0.5); - fz = fractionToTiles(0.5); - ix = round(fx); - iz = round(fz); - - var lSize = 1; - - var placer = new ChainPlacer(2, floor(scaleByMapSize(5, 16)), floor(scaleByMapSize(35, 200)), 1, ix, iz, 0, [floor(mapSize * 0.17 * lSize)]); - var terrainPainter = new LayeredPainter( - [tMainTerrain, tMainTerrain, tMainTerrain, tMainTerrain], // terrains - [1, 4, 2] // widths - ); - - var elevationPainter = new SmoothElevationPainter( - ELEVATION_SET, // type - -3, // elevation - 4 // blend radius - ); - createArea(placer, [terrainPainter, elevationPainter, paintClass(clWater)], avoidClasses(clPlayer,floor(scaleByMapSize(15,25)))); - - fx = fractionToTiles(0.5 - 0.2*cos(mdd1*PI/2)); - fz = fractionToTiles(0.5 - 0.2*sin(mdd1*PI/2)); - ix = round(fx); - iz = round(fz); - - var lSize = sqrt(sqrt(sqrt(scaleByMapSize(1, 6)))); - - var placer = new ChainPlacer(2, floor(scaleByMapSize(5, 16)), floor(scaleByMapSize(35, 120)), 1, ix, iz, 0, [floor(mapSize * 0.18 * lSize)]); - var terrainPainter = new LayeredPainter( - [tMainTerrain, tMainTerrain, tMainTerrain, tMainTerrain], // terrains - [1, 4, 2] // widths - ); - var elevationPainter = new SmoothElevationPainter( - ELEVATION_SET, // type - -3, // elevation - 4 // blend radius - ); - createArea(placer, [terrainPainter, elevationPainter, paintClass(clWater)], avoidClasses(clPlayer,floor(scaleByMapSize(15,25)))); - - fx = fractionToTiles(0.5 - 0.49*cos(mdd1*PI/2)); - fz = fractionToTiles(0.5 - 0.49*sin(mdd1*PI/2)); - ix = round(fx); - iz = round(fz); - - var lSize = sqrt(sqrt(sqrt(scaleByMapSize(1, 6)))); - - var placer = new ChainPlacer(2, floor(scaleByMapSize(5, 16)), floor(scaleByMapSize(35, 100)), 1, ix, iz, 0, [floor(mapSize * 0.19 * lSize)]); - var terrainPainter = new LayeredPainter( - [tMainTerrain, tMainTerrain, tMainTerrain, tMainTerrain], // terrains - [1, 4, 2] // widths - ); - var elevationPainter = new SmoothElevationPainter( - ELEVATION_SET, // type - -3, // elevation - 4 // blend radius - ); - createArea(placer, [terrainPainter, elevationPainter, paintClass(clWater)], avoidClasses(clPlayer,floor(scaleByMapSize(15,25)))); -} -//******************************************************************************************************** -else if (md == 8) //lakes -{ - var [playerIDs, playerX, playerZ, playerAngle] = radialPlayerPlacement(); - - for (var ix = 0; ix < mapSize; ix++) - { - for (var iz = 0; iz < mapSize; iz++) - { - var x = ix / (mapSize + 1.0); - var z = iz / (mapSize + 1.0); - setHeight(ix, iz, 3); - } - } - - for (var i = 0; i < numPlayers; i++) - { - var fx = fractionToTiles(playerX[i]); - var fz = fractionToTiles(playerZ[i]); - var ix = round(fx); - var iz = round(fz); - // create the city patch - var cityRadius = scaleByMapSize(17,29)/3; - placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz); - createArea(placer, paintClass(clPlayer), null); - } - - var lakeAreas = []; - var playerConstraint = new AvoidTileClassConstraint(clPlayer, 20); - var waterConstraint = new AvoidTileClassConstraint(clWater, 8); - - for (var x = 0; x < mapSize; ++x) - for (var z = 0; z < mapSize; ++z) - if (playerConstraint.allows(x, z) && waterConstraint.allows(x, z)) - lakeAreas.push([x, z]); - - var chosenPoint; - var lakeAreaLen; - - log("Creating lakes..."); - var numLakes = scaleByMapSize(5, 16); - for (var i = 0; i < numLakes; ++i) - { - lakeAreaLen = lakeAreas.length; - if (!lakeAreaLen) - break; - - chosenPoint = pickRandom(lakeAreas); - - placer = new ChainPlacer(1, floor(scaleByMapSize(4, 8)), floor(scaleByMapSize(40, 180)), 0.7, chosenPoint[0], chosenPoint[1]); - terrainPainter = new LayeredPainter( - [tShore, tWater, tWater], // terrains - [1, 3] // widths - ); - elevationPainter = new SmoothElevationPainter(ELEVATION_SET, -5, 5); - var newLake = createAreas( - placer, - [terrainPainter, elevationPainter, paintClass(clWater)], - avoidClasses(clPlayer, 20, clWater, 8), - 1, 1 - ); - - if (newLake && newLake.length) - { - var n = 0; - for (var j = 0; j < lakeAreaLen; ++j) - { - var x = lakeAreas[j][0], z = lakeAreas[j][1]; - if (playerConstraint.allows(x, z) && waterConstraint.allows(x, z)) - lakeAreas[n++] = lakeAreas[j]; - } - lakeAreas.length = n; - } - } -} -//******************************************************************************************************** -else if (md == 9) //passes -{ - var [playerIDs, playerX, playerZ, playerAngle, startAngle] = radialPlayerPlacement(); - - for (var ix = 0; ix < mapSize; ix++) - { - for (var iz = 0; iz < mapSize; iz++) - { - var x = ix / (mapSize + 1.0); - var z = iz / (mapSize + 1.0); - setHeight(ix, iz, 3); - } - } - - log ("Creating ranges..."); - for (var m = 0; m < numPlayers; m++) - { - var tang = startAngle + (m+0.5)*TWO_PI/(numPlayers); - 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); - var terrainPainter = new LayeredPainter( - [tShore, tWater, tWater], // terrains - [1, 3] // widths - ); - var elevationPainter = new SmoothElevationPainter( - ELEVATION_SET, // type - 24, // elevation - 3 // blend radius - ); - createArea(placer, [terrainPainter, elevationPainter, paintClass(clWater)], avoidClasses(clPlayer, 5)); - 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))); - var painter = new LayeredPainter([tWater, tWater], [1]); - var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 24, 0); - createArea(placer, [painter, elevationPainter], avoidClasses(clPlayer, 5)); - - 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); - var painter = new LayeredPainter([tCliff, tCliff], [1]); - var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 3, 2); - createArea(placer, [painter, elevationPainter], null); - } - var mdd1 = randIntInclusive (1,3); - if (mdd1 <= 2) - { - var fx = fractionToTiles(0.5); - var fz = fractionToTiles(0.5); - ix = round(fx); - iz = round(fz); - - var placer = new ClumpPlacer(mapArea * 0.005, 0.7, 0.1, 10, ix, iz); - var terrainPainter = new LayeredPainter( - [tShore, tWater, tWater, tWater], // terrains - [1, 4, 2] // widths - ); - var elevationPainter = new SmoothElevationPainter( - ELEVATION_SET, // type - 24, // elevation - 4 // blend radius - ); - createArea(placer, [terrainPainter, elevationPainter, paintClass(clWater)], null); - } - else - { - var fx = fractionToTiles(0.5); - var fz = fractionToTiles(0.5); - ix = round(fx); - iz = round(fz); - - var lSize = sqrt(sqrt(sqrt(scaleByMapSize(1, 6)))); - - var placer = new ClumpPlacer(mapArea * 0.03 * lSize, 0.7, 0.1, 10, ix, iz); - var terrainPainter = new LayeredPainter( - [tShore, tWater, tWater, tWater], // terrains - [1, 4, 2] // widths - ); - var elevationPainter = new SmoothElevationPainter( - ELEVATION_SET, // type - -4, // elevation - 3 // blend radius - ); - createArea(placer, [terrainPainter, elevationPainter, paintClass(clWater)], null); - } -} -//******************************************************************************************************** -else if (md == 10) //lowlands -{ - var [playerIDs, playerX, playerZ, playerAngle, startAngle] = radialPlayerPlacement(); - - for (var ix = 0; ix < mapSize; ix++) - { - for (var iz = 0; iz < mapSize; iz++) - { - var x = ix / (mapSize + 1.0); - var z = iz / (mapSize + 1.0); - setHeight(ix, iz, 30); - } - } - - var radius = scaleByMapSize(18,32); - var cliffRadius = 2; - var elevation = 20; - var hillSize = PI * radius * radius; - - var split = 1; - if ((mapSize / 64 == 2)&&(numPlayers <= 2)) - { - split = 2; - } - else if ((mapSize / 64 == 3)&&(numPlayers <= 3)) - { - split = 2; - } - else if ((mapSize / 64 == 4)&&(numPlayers <= 4)) - { - split = 2; - } - else if ((mapSize / 64 == 5)&&(numPlayers <= 4)) - { - split = 2; - } - else if ((mapSize / 64 == 6)&&(numPlayers <= 5)) - { - split = 2; - } - else if ((mapSize / 64 == 7)&&(numPlayers <= 6)) - { - split = 2; - } - - for (var i = 0; i < numPlayers*split; i++) - { - var tang = startAngle + (i)*TWO_PI/(numPlayers*split); - var fx = fractionToTiles(0.5 + 0.35*cos(tang)); - var fz = fractionToTiles(0.5 + 0.35*sin(tang)); - var ix = round(fx); - var iz = round(fz); - // create the hill - var placer = new ClumpPlacer(hillSize, 0.65, 0.1, 10, ix, iz); - var terrainPainter = new LayeredPainter( - [tMainTerrain, tMainTerrain], // terrains - [cliffRadius] // widths - ); - var elevationPainter = new SmoothElevationPainter( - ELEVATION_SET, // type - 3, // elevation - cliffRadius // blend radius - ); - createArea(placer, [terrainPainter, elevationPainter, paintClass(clLand)], null); - } - - var fx = fractionToTiles(0.5); - var fz = fractionToTiles(0.5); - ix = round(fx); - iz = round(fz); - - var lSize = sqrt(sqrt(sqrt(scaleByMapSize(1, 6)))); - - var placer = new ClumpPlacer(mapArea * 0.091 * lSize, 0.7, 0.1, 10, ix, iz); - var terrainPainter = new LayeredPainter( - [tMainTerrain, tMainTerrain, tMainTerrain, tMainTerrain], // terrains - [1, 4, 2] // widths - ); - var elevationPainter = new SmoothElevationPainter( - ELEVATION_SET, // type - 3, // elevation - 4 // blend radius - ); - createArea(placer, [terrainPainter, elevationPainter, paintClass(clWater)], null); - - for (var m = 0; m < numPlayers*split; m++) - { - var tang = startAngle + m*TWO_PI/(numPlayers*split); - 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); - var terrainPainter = new LayeredPainter( - [tMainTerrain, tMainTerrain, tMainTerrain], // terrains - [1, 3] // widths - ); - var elevationPainter = new SmoothElevationPainter( - ELEVATION_SET, // type - 3, // elevation - 4 // blend radius - ); - createArea(placer, [terrainPainter, elevationPainter, paintClass(clWater)], null); - } -} -//******************************************************************************************************** -else //mainland -{ - var [playerIDs, playerX, playerZ, playerAngle] = radialPlayerPlacement(); - - for (var ix = 0; ix < mapSize; ix++) - { - for (var iz = 0; iz < mapSize; iz++) - { - var x = ix / (mapSize + 1.0); - var z = iz / (mapSize + 1.0); - setHeight(ix, iz, 3); - } - } - -} - -paintTerrainBasedOnHeight(3.12, 40, 1, tCliff); -paintTerrainBasedOnHeight(3, 3.12, 1, tMainTerrain); -paintTerrainBasedOnHeight(1, 3, 1, tShore); -paintTerrainBasedOnHeight(-8, 1, 2, tWater); -unPaintTileClassBasedOnHeight(0, 3.12, 1, clWater); -unPaintTileClassBasedOnHeight(-6, 0, 1, clLand); -paintTileClassBasedOnHeight(-6, 0, 1, clWater); -paintTileClassBasedOnHeight(0, 3.12, 1, clLand); -paintTileClassBasedOnHeight(3.12, 40, 1, clHill); - -for (var i = 0; i < numPlayers; i++) -{ - var id = playerIDs[i]; - log("Creating base for player " + id + "..."); - - var radius = scaleByMapSize(17,29); - var shoreRadius = 4; - var elevation = 3; - - var hillSize = PI * radius * radius; - // get the x and z in tiles - var fx = fractionToTiles(playerX[i]); - var fz = fractionToTiles(playerZ[i]); - var ix = round(fx); - var iz = round(fz); - - placeCivDefaultEntities(fx, fz, id); - placeDefaultChicken(fx, fz, clBaseResource); - - // create berry bushes - var bbAngle = randFloat(0, TWO_PI); - var bbDist = 12; - var bbX = round(fx + bbDist * cos(bbAngle)); - var bbZ = round(fz + bbDist * sin(bbAngle)); - var group = new SimpleGroup( - [new SimpleObject(oFruitBush, 5,5, 0,3)], - true, clBaseResource, bbX, bbZ - ); - createObjectGroup(group, 0); - if (needsAdditionalWood) - { - // create woods - var bbAngle = randFloat(0, TWO_PI); - var bbDist = 13; - var bbX = round(fx + bbDist * cos(bbAngle)); - var bbZ = round(fz + bbDist * sin(bbAngle)); - group = new SimpleGroup( - [new SimpleObject(oWood, 14,14, 0,3)], - true, clBaseResource, bbX, bbZ - ); - createObjectGroup(group, 0); - } - - // create metal mine - var mAngle = bbAngle; - while(abs(mAngle - bbAngle) < PI/3) - { - mAngle = randFloat(0, TWO_PI); - } - var mDist = 12; - var mX = round(fx + mDist * cos(mAngle)); - var mZ = round(fz + mDist * sin(mAngle)); - group = new SimpleGroup( - [new SimpleObject(oMetalLarge, 1,1, 0,0)], - true, clBaseResource, mX, mZ - ); - createObjectGroup(group, 0); - - // create stone mines - mAngle += randFloat(PI/8, PI/4); - mX = round(fx + mDist * cos(mAngle)); - mZ = round(fz + mDist * sin(mAngle)); - group = new SimpleGroup( - [new SimpleObject(oStoneLarge, 1,1, 0,2)], - true, clBaseResource, mX, mZ - ); - createObjectGroup(group, 0); - var hillSize = PI * radius * radius; - // create starting trees - var num = floor(hillSize / 100); - var tAngle = randFloat(-PI/3, 4*PI/3); - var tDist = randFloat(11, 13); - var tX = round(fx + tDist * cos(tAngle)); - var tZ = round(fz + tDist * sin(tAngle)); - group = new SimpleGroup( - [new SimpleObject(oTree1, num, num, 0,5)], - false, clBaseResource, tX, tZ - ); - createObjectGroup(group, 0, avoidClasses(clBaseResource,2)); - - placeDefaultDecoratives(fx, fz, aGrassShort, clBaseResource, radius); -} - -for (var i = 0; i < numPlayers; i++) -{ - var fx = fractionToTiles(playerX[i]); - var fz = fractionToTiles(playerZ[i]); - var ix = round(fx); - var iz = round(fz); - // create the city patch - var cityRadius = radius/3; - placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz); - var painter = new LayeredPainter([tRoadWild, tRoad], [1]); - createArea(placer, [painter, paintClass(clPlayer)], null); -} - -log("Creating bumps..."); -placer = new ClumpPlacer(scaleByMapSize(20, 50), 0.3, 0.06, 1); -painter = new SmoothElevationPainter(ELEVATION_MODIFY, 2, 2); -createAreas( - placer, - painter, - [avoidClasses(clWater, 2, clPlayer, 10), stayClasses(clLand, 3)], - randIntInclusive(0,scaleByMapSize(200, 400)) -); - -log("Creating hills..."); -placer = new ChainPlacer(1, floor(scaleByMapSize(4, 6)), floor(scaleByMapSize(16, 40)), 0.5); -terrainPainter = new LayeredPainter( - [tCliff, tHill], // terrains - [2] // widths -); -elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 18, 2); -createAreas( - placer, - [terrainPainter, elevationPainter, paintClass(clHill)], - [avoidClasses(clPlayer, 20, clHill, randIntInclusive(6, 18)), stayClasses(clLand, 0)], - randIntInclusive(0, scaleByMapSize(4, 8))*randIntInclusive(1, scaleByMapSize(4, 9)) -); - -var multiplier = sqrt(randFloat(0.5,1.2)*randFloat(0.5,1.2)); -// calculate desired number of trees for map (based on size) -if (currentBiome() == "savanna") -{ - var MIN_TREES = floor(200*multiplier); - var MAX_TREES = floor(1250*multiplier); - var P_FOREST = 0; -} -else if (currentBiome() == "tropic") -{ - var MIN_TREES = floor(1000*multiplier); - var MAX_TREES = floor(6000*multiplier); - var P_FOREST = randFloat(0.5, 0.7); -} -else -{ - var MIN_TREES = floor(500*multiplier); - var MAX_TREES = floor(3000*multiplier); - var P_FOREST = randFloat(0.5,0.8); -} -var totalTrees = scaleByMapSize(MIN_TREES, MAX_TREES); -var numForest = totalTrees * P_FOREST; -var numStragglers = totalTrees * (1.0 - P_FOREST); - -log("Creating forests..."); -var types = [ - [[tForestFloor2, tMainTerrain, pForest1], [tForestFloor2, pForest1]], - [[tForestFloor1, tMainTerrain, pForest2], [tForestFloor1, pForest2]] -]; // some variation - -if (currentBiome() != "savanna") -{ - var size = numForest / (scaleByMapSize(3,6) * numPlayers); - var num = floor(size / types.length); - for (var i = 0; i < types.length; ++i) - { - placer = new ChainPlacer(1, floor(scaleByMapSize(3, 5)), numForest / num, 0.5); - painter = new LayeredPainter( - types[i], // terrains - [2] // widths - ); - createAreas( - placer, - [painter, paintClass(clForest)], - [avoidClasses(clPlayer, 20, clForest, randIntInclusive(5, 15), clHill, 0), stayClasses(clLand, 4)], - num - ); - } -} - -RMS.SetProgress(50); -log("Creating dirt patches..."); -var sizes = [scaleByMapSize(3, 6), scaleByMapSize(5, 10), scaleByMapSize(8, 21)]; -var numb = 1; -if (currentBiome() == "savanna") - numb = 3; -for (var i = 0; i < sizes.length; i++) -{ - placer = new ChainPlacer(1, floor(scaleByMapSize(3, 5)), sizes[i], 0.5); - painter = new LayeredPainter( - [[tMainTerrain,tTier1Terrain],[tTier1Terrain,tTier2Terrain], [tTier2Terrain,tTier3Terrain]], // terrains - [1,1] // widths - ); - createAreas( - placer, - [painter, paintClass(clDirt)], - [avoidClasses(clForest, 0, clHill, 0, clDirt, 5, clPlayer, 7), stayClasses(clLand, 4)], - numb*scaleByMapSize(15, 45) - ); -} - -log("Creating grass patches..."); -var sizes = [scaleByMapSize(2, 4), scaleByMapSize(3, 7), scaleByMapSize(5, 15)]; -for (var i = 0; i < sizes.length; i++) -{ - placer = new ChainPlacer(1, floor(scaleByMapSize(3, 5)), sizes[i], 0.5); - painter = new TerrainPainter(tTier4Terrain); - createAreas( - placer, - painter, - [avoidClasses(clForest, 0, clHill, 0, clDirt, 5, clPlayer, 7), stayClasses(clLand, 4)], - numb*scaleByMapSize(15, 45) - ); -} -RMS.SetProgress(55); - -log("Creating stone mines..."); -group = new SimpleGroup([new SimpleObject(oStoneSmall, 0,2, 0,4), new SimpleObject(oStoneLarge, 1,1, 0,4)], true, clRock); -createObjectGroupsDeprecated(group, 0, - [avoidClasses(clForest, 1, clPlayer, 20, clRock, 10, clHill, 1), stayClasses(clLand, 4)], - randIntInclusive(scaleByMapSize(2,9),scaleByMapSize(9,40)), 100 -); - -log("Creating small stone quarries..."); -group = new SimpleGroup([new SimpleObject(oStoneSmall, 2,5, 1,3)], true, clRock); -createObjectGroupsDeprecated(group, 0, - [avoidClasses(clForest, 1, clPlayer, 20, clRock, 10, clHill, 1), stayClasses(clLand, 4)], - randIntInclusive(scaleByMapSize(2,9),scaleByMapSize(9,40)), 100 -); - -log("Creating metal mines..."); -group = new SimpleGroup([new SimpleObject(oMetalLarge, 1,1, 0,4)], true, clMetal); -createObjectGroupsDeprecated(group, 0, - [avoidClasses(clForest, 1, clPlayer, 20, clMetal, 10, clRock, 5, clHill, 1), stayClasses(clLand, 4)], - randIntInclusive(scaleByMapSize(2,9),scaleByMapSize(9,40)), 100 -); - -RMS.SetProgress(65); - -log("Creating small decorative rocks..."); -group = new SimpleGroup( - [new SimpleObject(aRockMedium, 1,3, 0,1)], - true -); -createObjectGroupsDeprecated( - group, 0, - [avoidClasses(clWater, 0, clForest, 0, clPlayer, 0, clHill, 0), stayClasses(clLand, 4)], - scaleByMapSize(16, 262), 50 -); - -log("Creating large decorative rocks..."); -group = new SimpleGroup( - [new SimpleObject(aRockLarge, 1,2, 0,1), new SimpleObject(aRockMedium, 1,3, 0,2)], - true -); -createObjectGroupsDeprecated( - group, 0, - [avoidClasses(clWater, 0, clForest, 0, clPlayer, 0, clHill, 0), stayClasses(clLand, 4)], - scaleByMapSize(8, 131), 50 -); -RMS.SetProgress(70); - -log("Creating deer..."); -group = new SimpleGroup( - [new SimpleObject(oMainHuntableAnimal, 5,7, 0,4)], - true, clFood -); -createObjectGroupsDeprecated(group, 0, - [avoidClasses(clWater, 0, clForest, 0, clPlayer, 20, clHill, 1, clFood, 20), stayClasses(clLand, 4)], - randIntInclusive(numPlayers+3, 5*numPlayers+4), 50 -); - -log("Creating berry bush..."); -group = new SimpleGroup( - [new SimpleObject(oFruitBush, 5,7, 0,4)], - true, clFood -); -createObjectGroupsDeprecated(group, 0, - [avoidClasses(clWater, 0, clForest, 0, clPlayer, 20, clHill, 1, clFood, 20), stayClasses(clLand, 4)], - randIntInclusive(1, 4) * numPlayers + 2, 50 -); -RMS.SetProgress(75); - -log("Creating sheep..."); -group = new SimpleGroup( - [new SimpleObject(oSecondaryHuntableAnimal, 2,3, 0,2)], - true, clFood -); -createObjectGroupsDeprecated(group, 0, - [avoidClasses(clWater, 0, clForest, 0, clPlayer, 20, clHill, 1, clFood, 20), stayClasses(clLand, 4)], - randIntInclusive(numPlayers+3, 5*numPlayers+4), 50 -); - -log("Creating fish..."); -group = new SimpleGroup( - [new SimpleObject(oFish, 2,3, 0,2)], - true, clFood -); -createObjectGroupsDeprecated(group, 0, - avoidClasses(clLand, 5, clForest, 0, clPlayer, 0, clHill, 0, clFood, 20), - randIntInclusive(15, 40) * numPlayers, 60 -); -RMS.SetProgress(85); - -log("Creating straggler trees..."); -var types = [oTree1, oTree2, oTree4, oTree3]; // some variation -var num = floor(numStragglers / types.length); -for (var i = 0; i < types.length; ++i) -{ - group = new SimpleGroup( - [new SimpleObject(types[i], 1,1, 0,3)], - true, clForest - ); - createObjectGroupsDeprecated(group, 0, - [avoidClasses(clWater, 1, clForest, 7, clHill, 1, clPlayer, 0, clMetal, 6, clRock, 6), stayClasses(clLand, 4)], - num - ); -} - -var planetm = 1; -if (currentBiome() == "tropic") - planetm = 8; - -log("Creating small grass tufts..."); -group = new SimpleGroup( - [new SimpleObject(aGrassShort, 1,2, 0,1, -PI/8,PI/8)] -); -createObjectGroupsDeprecated(group, 0, - [avoidClasses(clWater, 2, clHill, 2, clPlayer, 2, clDirt, 0), stayClasses(clLand, 4)], - planetm * scaleByMapSize(13, 200) -); -RMS.SetProgress(90); - -log("Creating large grass tufts..."); -group = new SimpleGroup( - [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)] -); -createObjectGroupsDeprecated(group, 0, - [avoidClasses(clWater, 3, clHill, 2, clPlayer, 2, clDirt, 1, clForest, 0), stayClasses(clLand, 4)], - planetm * scaleByMapSize(13, 200) -); -RMS.SetProgress(95); - -log("Creating shallow flora..."); -group = new SimpleGroup( - [new SimpleObject(aLillies, 1,2, 0,2), new SimpleObject(aReeds, 2,4, 0,2)] -); -createObjectGroupsDeprecated(group, 0, - stayClasses(clShallow, 1), - 60 * scaleByMapSize(13, 200), 80 -); - -log("Creating bushes..."); -group = new SimpleGroup( - [new SimpleObject(aBushMedium, 1,2, 0,2), new SimpleObject(aBushSmall, 2,4, 0,2)] -); -createObjectGroupsDeprecated(group, 0, - [avoidClasses(clWater, 1, clHill, 1, clPlayer, 1, clDirt, 1), stayClasses(clLand, 3)], - planetm * scaleByMapSize(13, 200), 50 -); - -setSkySet(pickRandom(["cirrus", "cumulus", "sunny", "sunny 1", "mountainous", "stratus"])); -setSunRotation(randFloat(0, TWO_PI)); -setSunElevation(randFloat(PI/ 5, PI / 3)); +createUnknownMap(); +createUnknownObjects(); ExportMap(); diff --git a/binaries/data/mods/public/maps/random/unknown_nomad.js b/binaries/data/mods/public/maps/random/unknown_nomad.js index cb5b359a4b..052c6576eb 100644 --- a/binaries/data/mods/public/maps/random/unknown_nomad.js +++ b/binaries/data/mods/public/maps/random/unknown_nomad.js @@ -1,1025 +1,14 @@ RMS.LoadLibrary("rmgen"); RMS.LoadLibrary("rmbiome"); +RMS.LoadLibrary("the_unknown"); -TILE_CENTERED_HEIGHT_MAP = true; +g_PlayerBases = false; +g_AllowNaval = true; -setSelectedBiome(); +createUnknownMap(); -var tGrass = g_Terrains.mainTerrain; -var tGrassPForest = g_Terrains.forestFloor1; -var tGrassDForest = g_Terrains.forestFloor2; -var tCliff = g_Terrains.cliff; -var tGrassA = g_Terrains.tier1Terrain; -var tGrassB = g_Terrains.tier2Terrain; -var tGrassC = g_Terrains.tier3Terrain; -var tHill = g_Terrains.hill; -var tDirt = g_Terrains.dirt; -var tRoad = g_Terrains.road; -var tRoadWild = g_Terrains.roadWild; -var tGrassPatch = g_Terrains.tier4Terrain; -var tShoreBlend = g_Terrains.shoreBlend; -var tShore = g_Terrains.shore; -var tWater = g_Terrains.water; - -var oOak = g_Gaia.tree1; -var oOakLarge = g_Gaia.tree2; -var oApple = g_Gaia.tree3; -var oPine = g_Gaia.tree4; -var oAleppoPine = g_Gaia.tree5; -var oBerryBush = g_Gaia.fruitBush; -var oDeer = g_Gaia.mainHuntableAnimal; -var oFish = g_Gaia.fish; -var oSheep = g_Gaia.secondaryHuntableAnimal; -var oStoneLarge = g_Gaia.stoneLarge; -var oStoneSmall = g_Gaia.stoneSmall; -var oMetalLarge = g_Gaia.metalLarge; -var oWood = "gaia/special_treasure_wood"; - -var aGrass = g_Decoratives.grass; -var aGrassShort = g_Decoratives.grassShort; -var aReeds = g_Decoratives.reeds; -var aLillies = g_Decoratives.lillies; -var aRockLarge = g_Decoratives.rockLarge; -var aRockMedium = g_Decoratives.rockMedium; -var aBushMedium = g_Decoratives.bushMedium; -var aBushSmall = g_Decoratives.bushSmall; - -var pForestD = [tGrassDForest + TERRAIN_SEPARATOR + oOak, tGrassDForest + TERRAIN_SEPARATOR + oOakLarge, tGrassDForest]; -var pForestP = [tGrassPForest + TERRAIN_SEPARATOR + oPine, tGrassPForest + TERRAIN_SEPARATOR + oAleppoPine, tGrassPForest]; - -InitMap(); - -var numPlayers = getNumPlayers(); -var mapSize = getMapSize(); -var mapArea = mapSize*mapSize; - -var clPlayer = createTileClass(); -var clHill = createTileClass(); -var clForest = createTileClass(); -var clWater = createTileClass(); -var clDirt = createTileClass(); -var clRock = createTileClass(); -var clMetal = createTileClass(); -var clFood = createTileClass(); -var clBaseResource = createTileClass(); -var clSettlement = createTileClass(); -var clLand = createTileClass(); -var clShallow = createTileClass(); - -initTerrain(tWater); - -var startAngle = randFloat(0, TWO_PI); -var md = randIntInclusive(1,13); -var needsAdditionalWood = false; -//***************************************************************************************************************************** -if (md == 1) //archipelago and island -{ - needsAdditionalWood = true; - - var playerIDs = sortAllPlayers(); - - var radius = scaleByMapSize(17, 29); - var hillSize = PI * radius * radius; - - var mdd1 = randIntInclusive(1,3); - - if (mdd1 == 1) //archipelago - { - log("Creating islands..."); - placer = new ClumpPlacer(floor(hillSize*randFloat(0.8,1.2)), 0.80, 0.1, 10); - terrainPainter = new LayeredPainter( - [tGrass, tGrass], // terrains - [2] // widths - ); - elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 3, 4); - createAreas( - placer, - [terrainPainter, elevationPainter, paintClass(clLand)], - null, - scaleByMapSize(2, 5)*randIntInclusive(8,14) - ); - } - else if (mdd1 == 2) //islands - { - log("Creating islands..."); - placer = new ClumpPlacer(floor(hillSize*randFloat(0.6,1.4)), 0.80, 0.1, randFloat(0.0, 0.2)); - terrainPainter = new LayeredPainter( - [tGrass, tGrass], // terrains - [2] // widths - ); - elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 3, 4); - createAreas( - placer, - [terrainPainter, elevationPainter, paintClass(clLand)], - avoidClasses(clLand, 3, clPlayer, 3), - scaleByMapSize(6, 10)*randIntInclusive(8,14) - ); - } - else if (mdd1 == 3) // tight islands - { - log("Creating islands..."); - placer = new ClumpPlacer(floor(hillSize*randFloat(0.8,1.2)), 0.80, 0.1, 10); - terrainPainter = new LayeredPainter( - [tGrass, tGrass], // terrains - [2] // widths - ); - elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 3, 4); - createAreas( - placer, - [terrainPainter, elevationPainter, paintClass(clLand)], - avoidClasses(clLand, randIntInclusive(8, 16), clPlayer, 3), - scaleByMapSize(2, 5)*randIntInclusive(8,14) - ); - } - -} -//******************************************************************************************************** -else if (md == 2) //continent -{ - var playerIDs = sortAllPlayers(); - - var fx = fractionToTiles(0.5); - var fz = fractionToTiles(0.5); - ix = round(fx); - iz = round(fz); - - var placer = new ClumpPlacer(mapArea * 0.45, 0.9, 0.09, 10, ix, iz); - var terrainPainter = new LayeredPainter( - [tWater, tShore, tGrass], // terrains - [4, 2] // widths - ); - var elevationPainter = new SmoothElevationPainter( - ELEVATION_SET, // type - 3, // elevation - 4 // blend radius - ); - createArea(placer, [terrainPainter, elevationPainter, paintClass(clLand)], null); - - if (randBool(1/4)) // peninsula - { - var angle = randFloat(0, TWO_PI); - - var fx = fractionToTiles(0.5 + 0.25*cos(angle)); - var fz = fractionToTiles(0.5 + 0.25*sin(angle)); - ix = round(fx); - iz = round(fz); - - var placer = new ClumpPlacer(mapArea * 0.45, 0.9, 0.09, 10, ix, iz); - var terrainPainter = new LayeredPainter( - [tWater, tShore, tGrass], // terrains - [4, 2] // widths - ); - var elevationPainter = new SmoothElevationPainter( - ELEVATION_SET, // type - 3, // elevation - 4 // blend radius - ); - createArea(placer, [terrainPainter, elevationPainter, paintClass(clLand)], null); - } - - var mdd1 = randIntInclusive(1,3); - if (mdd1 == 1) - { - log("Creating islands..."); - placer = new ClumpPlacer(randIntInclusive(scaleByMapSize(8,15),scaleByMapSize(15,23))*randIntInclusive(scaleByMapSize(8,15),scaleByMapSize(15,23)), 0.80, 0.1, randFloat(0.0, 0.2)); - terrainPainter = new LayeredPainter( - [tGrass, tGrass], // terrains - [2] // widths - ); - elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 3, 4); - createAreas( - placer, - [terrainPainter, elevationPainter, paintClass(clLand)], - avoidClasses(clLand, 3, clPlayer, 3), - scaleByMapSize(2, 5)*randIntInclusive(8,14) - ); - } - else if (mdd1 == 2) - { - log("Creating extentions..."); - placer = new ClumpPlacer(randIntInclusive(scaleByMapSize(13,24),scaleByMapSize(24,45))*randIntInclusive(scaleByMapSize(13,24),scaleByMapSize(24,45)), 0.80, 0.1, 10); - terrainPainter = new LayeredPainter( - [tGrass, tGrass], // terrains - [2] // widths - ); - elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 3, 4); - createAreas( - placer, - [terrainPainter, elevationPainter, paintClass(clLand)], - null, - scaleByMapSize(2, 5)*randIntInclusive(8,14) - ); - } -} -//******************************************************************************************************** -else if (md == 3) //central sea -{ - var playerIDs = primeSortAllPlayers(); - - paintRiver({ - "horizontal": mdd1 != 1, - "parallel": false, - "position": 0.5, - "width": randFloat(0.22, 0.3) + scaleByMapSize(1, 4) / 20, - "fadeDist": 0.025, - "deviation": 0, - "waterHeight": -3, - "landHeight": 3, - "meanderShort": 20, - "meanderLong": 0, - "waterFunc": (ix, iz, height) => { - placeTerrain(ix, iz, height < -1.5 ? tWater : tShore); - if (height < 0) - addToClass(ix, iz, clWater); - }, - "landFunc": (ix, iz, shoreDist1, shoreDist2) => { - setHeight(ix, iz, 3.1); - addToClass(ix, iz, clLand); - } - }); - - if (randBool(1/3)) - { - if (mdd1 == 1) //vertical - { - var placer = new PathPlacer(1, fractionToTiles(0.5), fractionToTiles(0.99), fractionToTiles(0.5), scaleByMapSize(randIntInclusive(16,24),randIntInclusive(100,140)), 0.5, 3*(scaleByMapSize(1,4)), 0.1, 0.01); - } - else - { - var placer = new PathPlacer(fractionToTiles(0.5), 1, fractionToTiles(0.5), fractionToTiles(0.99), scaleByMapSize(randIntInclusive(16,24),randIntInclusive(100,140)), 0.5, 3*(scaleByMapSize(1,4)), 0.1, 0.01); - } - var terrainPainter = new LayeredPainter( - [tGrass, tGrass, tGrass], // terrains - [1, 3] // widths - ); - var elevationPainter = new SmoothElevationPainter( - ELEVATION_SET, // type - 3.1, // elevation - 4 // blend radius - ); - createArea(placer, [terrainPainter, elevationPainter, unPaintClass(clWater)], null); - } - var mdd2 = randIntInclusive(1,3); - if (mdd2 == 1) - { - log("Creating islands..."); - placer = new ClumpPlacer(randIntInclusive(scaleByMapSize(8,15),scaleByMapSize(15,23))*randIntInclusive(scaleByMapSize(8,15),scaleByMapSize(15,23)), 0.80, 0.1, randFloat(0.0, 0.2)); - terrainPainter = new LayeredPainter( - [tGrass, tGrass], // terrains - [2] // widths - ); - elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 3.1, 4); - createAreas( - placer, - [terrainPainter, elevationPainter, paintClass(clLand)], - avoidClasses(clLand, 3, clPlayer, 3), - scaleByMapSize(2, 5)*randIntInclusive(8,14) - ); - } - else if (mdd2 == 2) - { - log("Creating extentions..."); - placer = new ClumpPlacer(randIntInclusive(scaleByMapSize(13,24),scaleByMapSize(24,45))*randIntInclusive(scaleByMapSize(13,24),scaleByMapSize(24,45)), 0.80, 0.1, 10); - terrainPainter = new LayeredPainter( - [tGrass, tGrass], // terrains - [2] // widths - ); - elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 3.1, 4); - createAreas( - placer, - [terrainPainter, elevationPainter, paintClass(clLand)], - null, - scaleByMapSize(2, 5)*randIntInclusive(8,14) - ); - } -} -//******************************************************************************************************** -else if (md == 4) //central river -{ - - for (var ix = 0; ix < mapSize; ix++) - { - for (var iz = 0; iz < mapSize; iz++) - { - var x = ix / (mapSize + 1.0); - var z = iz / (mapSize + 1.0); - setHeight(ix, iz, 3); - } - } - - var playerIDs = primeSortAllPlayers(); - - log("Creating the main river"); - - if (mdd1 == 2) - 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); - else - 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); - - var terrainPainter = new LayeredPainter( - [tShore, tWater, tWater], // terrains - [1, 3] // widths - ); - var elevationPainter = new SmoothElevationPainter( - ELEVATION_SET, // type - -4, // elevation - 4 // blend radius - ); - createArea(placer, [terrainPainter, elevationPainter], avoidClasses(clPlayer, 4)); - - if (mdd1 == 1) - placer = new ClumpPlacer(floor(PI*scaleByMapSize(10,20)*scaleByMapSize(10,20)/4), 0.95, 0.6, 10, 1, fractionToTiles(0.5)); - else - placer = new ClumpPlacer(floor(PI*scaleByMapSize(10,20)*scaleByMapSize(10,20)/4), 0.95, 0.6, 10, fractionToTiles(0.5), 1); - - var painter = new LayeredPainter([tWater, tWater], [1]); - var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, -4, 2); - createArea(placer, [painter, elevationPainter], avoidClasses(clPlayer, 8)); - - if (mdd1 == 1) - placer = new ClumpPlacer(floor(PI*scaleByMapSize(10,20)*scaleByMapSize(10,20)/4), 0.95, 0.6, 10, fractionToTiles(0.99), fractionToTiles(0.5)); - else - placer = new ClumpPlacer(floor(PI*scaleByMapSize(10,20)*scaleByMapSize(10,20)/4), 0.95, 0.6, 10, fractionToTiles(0.5), fractionToTiles(0.99)); - - var painter = new LayeredPainter([tWater, tWater], [1]); - var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, -4, 2); - createArea(placer, [painter, elevationPainter], avoidClasses(clPlayer, 8)); - - var mdd2 = randIntInclusive(1,2); - if (mdd2 == 1) - { - log("Creating the shallows of the main river"); - - for (var i = 0; i <= randIntInclusive(1, scaleByMapSize(4,8)); i++) - { - var cLocation = randFloat(0.15,0.85); - if (mdd1 == 1) - createShallowsPassage(fractionToTiles(cLocation), fractionToTiles(0.35), fractionToTiles(cLocation), fractionToTiles(0.65), scaleByMapSize(4,8), -2, -2, 2, clShallow, undefined, -4); - else - createShallowsPassage(fractionToTiles(0.35), fractionToTiles(cLocation), fractionToTiles(0.65), fractionToTiles(cLocation), scaleByMapSize(4,8), -2, -2, 2, clShallow, undefined, -4); - } - } - - if (randBool()) - createTributaryRivers( - mdd1 == 1, - randIntInclusive(8, scaleByMapSize(12, 16)), - scaleByMapSize(10, 20), - -4, - [-6, -1.5], - 0.2 * Math.PI, - clWater, - clShallow, - avoidClasses(clPlayer, 3)); -} -//******************************************************************************************************** -else if (md == 5) //rivers and lake -{ - var playerIDs = sortAllPlayers(); - - for (var ix = 0; ix < mapSize; ix++) - { - for (var iz = 0; iz < mapSize; iz++) - { - var x = ix / (mapSize + 1.0); - var z = iz / (mapSize + 1.0); - setHeight(ix, iz, 3); - } - } - - var mdd1 = randIntInclusive(1,3); - - if (mdd1 < 3) //lake - { - var fx = fractionToTiles(0.5); - var fz = fractionToTiles(0.5); - ix = round(fx); - iz = round(fz); - - var lSize = sqrt(sqrt(sqrt(scaleByMapSize(1, 6)))); - - var placer = new ClumpPlacer(mapArea * 0.09 * lSize, 0.7, 0.1, 10, ix, iz); - var terrainPainter = new LayeredPainter( - [tShore, tWater, tWater, tWater], // terrains - [1, 4, 2] // widths - ); - var elevationPainter = new SmoothElevationPainter( - ELEVATION_SET, // type - -4, // elevation - 4 // blend radius - ); - createArea(placer, [terrainPainter, elevationPainter, paintClass(clWater)], null); - } - - if (mdd1 > 1) //rivers - { - log ("Creating rivers..."); - for (var m = 0; m < numPlayers; m++) - { - var tang = startAngle + (m+0.5)*TWO_PI/(numPlayers); - 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); - var terrainPainter = new LayeredPainter( - [tShore, tWater, tWater], // terrains - [1, 3] // widths - ); - var elevationPainter = new SmoothElevationPainter( - ELEVATION_SET, // type - -4, // elevation - 4 // blend radius - ); - createArea(placer, [terrainPainter, elevationPainter, paintClass(clWater)], avoidClasses(clPlayer, 5)); - 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))); - var painter = new LayeredPainter([tWater, tWater], [1]); - var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, -4, 0); - createArea(placer, [painter, elevationPainter, paintClass(clWater)], avoidClasses(clPlayer, 5)); - - } - - var fx = fractionToTiles(0.5); - var fz = fractionToTiles(0.5); - ix = round(fx); - iz = round(fz); - - var placer = new ClumpPlacer(mapArea * 0.005, 0.7, 0.1, 10, ix, iz); - var terrainPainter = new LayeredPainter( - [tShore, tWater, tWater, tWater], // terrains - [1, 4, 2] // widths - ); - var elevationPainter = new SmoothElevationPainter( - ELEVATION_SET, // type - -4, // elevation - 4 // blend radius - ); - createArea(placer, [terrainPainter, elevationPainter, paintClass(clWater)], null); - } - - if (randBool(1/3) && mdd1 < 3)//island - { - var placer = new ClumpPlacer(mapArea * 0.006 * lSize, 0.7, 0.1, 10, ix, iz); - var terrainPainter = new LayeredPainter( - [tShore, tWater, tWater, tWater], // terrains - [1, 4, 2] // widths - ); - var elevationPainter = new SmoothElevationPainter( - ELEVATION_SET, // type - 3, // elevation - 4 // blend radius - ); - createArea(placer, [terrainPainter, elevationPainter, paintClass(clWater)], null); - } -} -//******************************************************************************************************** -else if (md == 6) //edge seas -{ - - for (var ix = 0; ix < mapSize; ix++) - { - for (var iz = 0; iz < mapSize; iz++) - { - var x = ix / (mapSize + 1.0); - var z = iz / (mapSize + 1.0); - setHeight(ix, iz, 3); - } - } - - var mdd1 = randIntInclusive(1,2); - - var playerIDs = sortAllPlayers(); - - var mdd2 = randIntInclusive(1,3); - var fadedistance = 7; - - if (mdd1 == 1) - { - if ((mdd2 == 1)||(mdd2 == 3)) - { - var distance = randFloat(0., 0.1); - for (var ix = 0; ix < mapSize; ix++) - { - for (var iz = 0; iz < mapSize; iz++) - { - if (iz > (0.69+distance) * mapSize) - { - if (iz < (0.69+distance) * mapSize + fadedistance) - { - setHeight(ix, iz, 3 - 7 * (iz - (0.69+distance) * mapSize) / fadedistance); - if (3 - 7 * (iz - (0.69+distance) * mapSize) / fadedistance < 0.5) - addToClass(ix, iz, clWater); - } - else - { - setHeight(ix, iz, -4); - addToClass(ix, iz, clWater); - } - } - } - - } - - for (var i = 0; i < scaleByMapSize(20,120); i++) - { - 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); - var terrainPainter = new LayeredPainter( - [tGrass, tGrass], // terrains - [2] // widths - ); - var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 3, 3); - createArea( - placer, - [terrainPainter, elevationPainter, unPaintClass(clWater)], - null - ); - } - } - if ((mdd2 == 2)||(mdd2 == 3)) - { - var distance = randFloat(0., 0.1); - for (var ix = 0; ix < mapSize; ix++) - { - for (var iz = 0; iz < mapSize; iz++) - { - if (iz < (0.31-distance) * mapSize) - { - if (iz > (0.31-distance) * mapSize - fadedistance) - { - setHeight(ix, iz, 3 - 7 * ((0.31-distance) * mapSize - iz) / fadedistance); - if (3 - 7 * ((0.31-distance) * mapSize - iz) / fadedistance < 0.5) - addToClass(ix, iz, clWater); - } - else - { - setHeight(ix, iz, -4); - addToClass(ix, iz, clWater); - } - } - } - } - - for (var i = 0; i < scaleByMapSize(20,120); i++) - { - 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); - var terrainPainter = new LayeredPainter( - [tGrass, tGrass], // terrains - [2] // widths - ); - var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 3, 3); - createArea( - placer, - [terrainPainter, elevationPainter, unPaintClass(clWater)], - null - ); - } - } - } - else //vertical - { - if ((mdd2 == 1)||(mdd2 == 3)) - { - var distance = randFloat(0., 0.1); - for (var ix = 0; ix < mapSize; ix++) - { - for (var iz = 0; iz < mapSize; iz++) - { - if (ix > (0.69+distance) * mapSize) - { - if (ix < (0.69+distance) * mapSize + fadedistance) - { - setHeight(ix, iz, 3 - 7 * (ix - (0.69+distance) * mapSize) / fadedistance); - if (3 - 7 * (ix - (0.69+distance) * mapSize) / fadedistance < 0.5) - addToClass(ix, iz, clWater); - } - else - { - setHeight(ix, iz, -4); - addToClass(ix, iz, clWater); - } - } - } - } - - for (var i = 0; i < scaleByMapSize(20,120); i++) - { - placer = new ClumpPlacer(scaleByMapSize(50, 70), 0.2, 0.1, 10, randFloat(0.67+distance,0.74+distance)*mapSize, randFloat(0.1,0.9)*mapSize); - var terrainPainter = new LayeredPainter( - [tGrass, tGrass], // terrains - [2] // widths - ); - var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 3, 3); - createArea( - placer, - [terrainPainter, elevationPainter, unPaintClass(clWater)], - null - ); - } - } - if ((mdd2 == 2)||(mdd2 == 3)) - { - var distance = randFloat(0., 0.1); - for (var ix = 0; ix < mapSize; ix++) - { - for (var iz = 0; iz < mapSize; iz++) - { - if (ix < (0.31-distance) * mapSize) - { - if (ix > (0.31-distance) * mapSize - fadedistance) - { - setHeight(ix, iz, 3 - 7 * ((0.31-distance) * mapSize - ix) / fadedistance); - if (3 - 7 * ((0.31-distance) * mapSize - ix) / fadedistance < 0.5) - addToClass(ix, iz, clWater); - } - else - { - setHeight(ix, iz, -4); - addToClass(ix, iz, clWater); - } - } - } - } - - for (var i = 0; i < scaleByMapSize(20,120); i++) - { - placer = new ClumpPlacer(scaleByMapSize(50, 70), 0.2, 0.1, 10, randFloat(0.26-distance,0.34-distance)*mapSize, randFloat(0.1,0.9)*mapSize); - var terrainPainter = new LayeredPainter( - [tGrass, tGrass], // terrains - [2] // widths - ); - var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 3, 3); - createArea( - placer, - [terrainPainter, elevationPainter, unPaintClass(clWater)], - null - ); - } - } - } - - var mdd3 = randIntInclusive(1,3); - if (mdd3 == 1) - { - log("Creating islands..."); - placer = new ClumpPlacer(randIntInclusive(scaleByMapSize(8,15),scaleByMapSize(15,23))*randIntInclusive(scaleByMapSize(8,15),scaleByMapSize(15,23)), 0.80, 0.1, randFloat(0.0, 0.2)); - terrainPainter = new LayeredPainter( - [tGrass, tGrass], // terrains - [2] // widths - ); - elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 3.1, 4); - createAreas( - placer, - [terrainPainter, elevationPainter, paintClass(clLand)], - avoidClasses(clLand, 3, clPlayer, 3), - scaleByMapSize(2, 5)*randIntInclusive(8,14) - ); - } - else if (mdd3 == 2) - { - log("Creating extentions..."); - placer = new ClumpPlacer(randIntInclusive(scaleByMapSize(13,24),scaleByMapSize(24,45))*randIntInclusive(scaleByMapSize(13,24),scaleByMapSize(24,45)), 0.80, 0.1, 10); - terrainPainter = new LayeredPainter( - [tGrass, tGrass], // terrains - [2] // widths - ); - elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 3.1, 4); - createAreas( - placer, - [terrainPainter, elevationPainter, paintClass(clLand)], - null, - scaleByMapSize(2, 5)*randIntInclusive(8,14) - ); - } -} -//******************************************************************************************************** -else if (md == 7) //gulf -{ - - for (var ix = 0; ix < mapSize; ix++) - { - for (var iz = 0; iz < mapSize; iz++) - { - var x = ix / (mapSize + 1.0); - var z = iz / (mapSize + 1.0); - setHeight(ix, iz, 3); - } - } - - var mdd1 = randIntInclusive(1,4); - - var playerIDs = sortAllPlayers(); - - var fx = fractionToTiles(0.5); - var fz = fractionToTiles(0.5); - ix = round(fx); - iz = round(fz); - - var lSize = 1; - - var placer = new ClumpPlacer(mapArea * 0.08 * lSize, 0.7, 0.05, 10, ix, iz); - var terrainPainter = new LayeredPainter( - [tGrass, tGrass, tGrass, tGrass], // terrains - [1, 4, 2] // widths - ); - - var elevationPainter = new SmoothElevationPainter( - ELEVATION_SET, // type - -3, // elevation - 4 // blend radius - ); - createArea(placer, [terrainPainter, elevationPainter, paintClass(clWater)], avoidClasses(clPlayer,scaleByMapSize(15,25))); - - var fx = fractionToTiles(0.5 - 0.2*cos(mdd1*PI/2)); - var fz = fractionToTiles(0.5 - 0.2*sin(mdd1*PI/2)); - ix = round(fx); - iz = round(fz); - - var lSize = sqrt(sqrt(sqrt(scaleByMapSize(1, 6)))); - - var placer = new ClumpPlacer(mapArea * 0.13 * lSize, 0.7, 0.05, 10, ix, iz); - var terrainPainter = new LayeredPainter( - [tGrass, tGrass, tGrass, tGrass], // terrains - [1, 4, 2] // widths - ); - var elevationPainter = new SmoothElevationPainter( - ELEVATION_SET, // type - -3, // elevation - 4 // blend radius - ); - createArea(placer, [terrainPainter, elevationPainter, paintClass(clWater)], avoidClasses(clPlayer,scaleByMapSize(15,25))); - - var fx = fractionToTiles(0.5 - 0.49*cos(mdd1*PI/2)); - var fz = fractionToTiles(0.5 - 0.49*sin(mdd1*PI/2)); - ix = round(fx); - iz = round(fz); - - var lSize = sqrt(sqrt(sqrt(scaleByMapSize(1, 6)))); - - var placer = new ClumpPlacer(mapArea * 0.15 * lSize, 0.7, 0.05, 10, ix, iz); - var terrainPainter = new LayeredPainter( - [tGrass, tGrass, tGrass, tGrass], // terrains - [1, 4, 2] // widths - ); - var elevationPainter = new SmoothElevationPainter( - ELEVATION_SET, // type - -3, // elevation - 4 // blend radius - ); - createArea(placer, [terrainPainter, elevationPainter, paintClass(clWater)], avoidClasses(clPlayer,scaleByMapSize(15,25))); -} -//******************************************************************************************************** -else if (md == 8) //lakes -{ - var playerIDs = sortAllPlayers(); - - for (var ix = 0; ix < mapSize; ix++) - { - for (var iz = 0; iz < mapSize; iz++) - { - var x = ix / (mapSize + 1.0); - var z = iz / (mapSize + 1.0); - setHeight(ix, iz, 3); - } - } - - log("Creating lakes..."); - placer = new ClumpPlacer(scaleByMapSize(160, 700), 0.2, 0.1, 1); - terrainPainter = new LayeredPainter( - [tShore, tWater, tWater], // terrains - [1, 3] // widths - ); - elevationPainter = new SmoothElevationPainter(ELEVATION_SET, -5, 5); - if (randBool()) - { - createAreas( - placer, - [terrainPainter, elevationPainter, paintClass(clWater)], - avoidClasses(clPlayer, 12, clWater, 8), - scaleByMapSize(5, 16) - ); - } - else - { - createAreas( - placer, - [terrainPainter, elevationPainter, paintClass(clWater)], - avoidClasses(clPlayer, 12), - scaleByMapSize(5, 16) - ); - } -} -//******************************************************************************************************** -else if (md == 9) //passes -{ - var playerIDs = sortAllPlayers(); - - for (var ix = 0; ix < mapSize; ix++) - { - for (var iz = 0; iz < mapSize; iz++) - { - var x = ix / (mapSize + 1.0); - var z = iz / (mapSize + 1.0); - setHeight(ix, iz, 3); - } - } - - //create ranges - log ("Creating ranges..."); - for (var m = 0; m < numPlayers; m++) - { - var tang = startAngle + (m+0.5)*TWO_PI/(numPlayers); - 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); - var terrainPainter = new LayeredPainter( - [tShore, tWater, tWater], // terrains - [1, 3] // widths - ); - var elevationPainter = new SmoothElevationPainter( - ELEVATION_SET, // type - 24, // elevation - 3 // blend radius - ); - createArea(placer, [terrainPainter, elevationPainter, paintClass(clWater)], avoidClasses(clPlayer, 5)); - 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))); - var painter = new LayeredPainter([tWater, tWater], [1]); - var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 24, 0); - createArea(placer, [painter, elevationPainter], avoidClasses(clPlayer, 5)); - - 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); - var painter = new LayeredPainter([tCliff, tCliff], [1]); - var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 3, 2); - createArea(placer, [painter, elevationPainter], null); - } - var mdd1 = randIntInclusive(1,3); - if (mdd1 <= 2) - { - var fx = fractionToTiles(0.5); - var fz = fractionToTiles(0.5); - ix = round(fx); - iz = round(fz); - - var placer = new ClumpPlacer(mapArea * 0.005, 0.7, 0.1, 10, ix, iz); - var terrainPainter = new LayeredPainter( - [tShore, tWater, tWater, tWater], // terrains - [1, 4, 2] // widths - ); - var elevationPainter = new SmoothElevationPainter( - ELEVATION_SET, // type - 24, // elevation - 4 // blend radius - ); - createArea(placer, [terrainPainter, elevationPainter, paintClass(clWater)], null); - } - else - { - var fx = fractionToTiles(0.5); - var fz = fractionToTiles(0.5); - ix = round(fx); - iz = round(fz); - - var lSize = sqrt(sqrt(sqrt(scaleByMapSize(1, 6)))); - - var placer = new ClumpPlacer(mapArea * 0.03 * lSize, 0.7, 0.1, 10, ix, iz); - var terrainPainter = new LayeredPainter( - [tShore, tWater, tWater, tWater], // terrains - [1, 4, 2] // widths - ); - var elevationPainter = new SmoothElevationPainter( - ELEVATION_SET, // type - -4, // elevation - 3 // blend radius - ); - createArea(placer, [terrainPainter, elevationPainter, paintClass(clWater)], null); - } -} -//******************************************************************************************************** -else if (md == 10) //lowlands -{ - var playerIDs = sortAllPlayers(); - - for (var ix = 0; ix < mapSize; ix++) - { - for (var iz = 0; iz < mapSize; iz++) - { - var x = ix / (mapSize + 1.0); - var z = iz / (mapSize + 1.0); - setHeight(ix, iz, 30); - } - } - - var radius = scaleByMapSize(18,32); - var cliffRadius = 2; - var elevation = 20; - var hillSize = PI * radius * radius; - - var split = 1; - if ((mapSize / 64 == 2)&&(numPlayers <= 2)) - { - split = 2; - } - else if ((mapSize / 64 == 3)&&(numPlayers <= 3)) - { - split = 2; - } - else if ((mapSize / 64 == 4)&&(numPlayers <= 4)) - { - split = 2; - } - else if ((mapSize / 64 == 5)&&(numPlayers <= 4)) - { - split = 2; - } - else if ((mapSize / 64 == 6)&&(numPlayers <= 5)) - { - split = 2; - } - else if ((mapSize / 64 == 7)&&(numPlayers <= 6)) - { - split = 2; - } - - for (var i = 0; i < numPlayers*split; i++) - { - var tang = startAngle + (i)*TWO_PI/(numPlayers*split); - var fx = fractionToTiles(0.5 + 0.35*cos(tang)); - var fz = fractionToTiles(0.5 + 0.35*sin(tang)); - var ix = round(fx); - var iz = round(fz); - // create the hill - var placer = new ClumpPlacer(hillSize, 0.65, 0.1, 10, ix, iz); - var terrainPainter = new LayeredPainter( - [tGrass, tGrass], // terrains - [cliffRadius] // widths - ); - var elevationPainter = new SmoothElevationPainter( - ELEVATION_SET, // type - 3, // elevation - cliffRadius // blend radius - ); - createArea(placer, [terrainPainter, elevationPainter, paintClass(clLand)], null); - } - - var fx = fractionToTiles(0.5); - var fz = fractionToTiles(0.5); - ix = round(fx); - iz = round(fz); - - var lSize = sqrt(sqrt(sqrt(scaleByMapSize(1, 6)))); - - var placer = new ClumpPlacer(mapArea * 0.091 * lSize, 0.7, 0.1, 10, ix, iz); - var terrainPainter = new LayeredPainter( - [tGrass, tGrass, tGrass, tGrass], // terrains - [1, 4, 2] // widths - ); - var elevationPainter = new SmoothElevationPainter( - ELEVATION_SET, // type - 3, // elevation - 4 // blend radius - ); - createArea(placer, [terrainPainter, elevationPainter, paintClass(clWater)], null); - - for (var m = 0; m < numPlayers*split; m++) - { - var tang = startAngle + m*TWO_PI/(numPlayers*split); - 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); - var terrainPainter = new LayeredPainter( - [tGrass, tGrass, tGrass], // terrains - [1, 3] // widths - ); - var elevationPainter = new SmoothElevationPainter( - ELEVATION_SET, // type - 3, // elevation - 4 // blend radius - ); - createArea(placer, [terrainPainter, elevationPainter, paintClass(clWater)], null); - } -} -//******************************************************************************************************** -else //mainland -{ - var playerIDs = sortAllPlayers(); - - for (var ix = 0; ix < mapSize; ix++) - { - for (var iz = 0; iz < mapSize; iz++) - { - var x = ix / (mapSize + 1.0); - var z = iz / (mapSize + 1.0); - setHeight(ix, iz, 3); - } - } - -} - -paintTerrainBasedOnHeight(3.12, 40, 1, tCliff); -paintTerrainBasedOnHeight(3, 3.12, 1, tGrass); -paintTerrainBasedOnHeight(1, 3, 1, tShore); -paintTerrainBasedOnHeight(-8, 1, 2, tWater); -unPaintTileClassBasedOnHeight(0, 3.12, 1, clWater); -unPaintTileClassBasedOnHeight(-6, 0, 1, clLand); -paintTileClassBasedOnHeight(-6, 0, 1, clWater); -paintTileClassBasedOnHeight(0, 3.12, 1, clLand); -paintTileClassBasedOnHeight(3.12, 40, 1, clHill); - -var playerX = []; -var playerZ = []; -var distmin = scaleByMapSize(60,240); -distmin *= distmin; +var distmin = Math.square(scaleByMapSize(60, 240)); +playerIDs = sortAllPlayers(); for (var i = 0; i < numPlayers; i++) { @@ -1082,6 +71,10 @@ for (var i = 0; i < numPlayers; ++i) // get the x and z in tiles var ix = playerX[i]; var iz = playerZ[i]; + + playerX[i] = tilesToFraction(playerX[i]); + playerZ[i] = tilesToFraction(playerZ[i]); + var civEntities = getStartingEntities(id-1); var angle = randFloat(0, TWO_PI); for (var j = 0; j < civEntities.length; ++j) @@ -1099,7 +92,6 @@ for (var i = 0; i < numPlayers; ++i) angle += TWO_PI / 3; } - if (md > 9) // maps without water, so we must have enough resources to build a cc { if (g_MapSettings.StartingResources < 500) { @@ -1124,291 +116,11 @@ for (var i = 0; i < numPlayers; ++i) } } } - else // we must have enough resources to build a dock - { - if (g_MapSettings.StartingResources < 200) - { - var angle = randFloat(0, TWO_PI); - var rad = randFloat(3, 5); - var jx = ix + rad * cos(angle); - var jz = iz + rad * sin(angle); - placeObject(jx, jz, "gaia/special_treasure_wood", 0, randFloat(0, TWO_PI)); - } - } } -for (var i = 0; i < numPlayers; i++) -{ - var radius = scaleByMapSize(18,32); - var ix = playerX[i]; - var iz = playerZ[i]; - var cityRadius = radius/3; - placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz); - createArea(placer, paintClass(clPlayer), null); -} +// Don't place resources into the starting units +markPlayerArea("small"); -log("Creating bumps..."); -placer = new ClumpPlacer(scaleByMapSize(20, 50), 0.3, 0.06, 1); -var painter = new SmoothElevationPainter(ELEVATION_MODIFY, 2, 2); -createAreas( - placer, - painter, - [avoidClasses(clWater, 2, clPlayer, 10), stayClasses(clLand, 3)], - randIntInclusive(0,scaleByMapSize(200, 400)) -); - -log("Creating hills..."); -placer = new ClumpPlacer(scaleByMapSize(20, 150), 0.2, 0.1, 1); -terrainPainter = new LayeredPainter( - [tCliff, tHill], // terrains - [2] // widths -); -elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 18, 2); -createAreas( - placer, - [terrainPainter, elevationPainter, paintClass(clHill)], - [avoidClasses(clPlayer, 15, clHill, randIntInclusive(6, 18)), stayClasses(clLand, 0)], - randIntInclusive(0, scaleByMapSize(4, 8))*randIntInclusive(1, scaleByMapSize(4, 9)) -); - -var multiplier = sqrt(randFloat(0.5,1.2)*randFloat(0.5,1.2)); -// calculate desired number of trees for map (based on size) -if (currentBiome() == "savanna") -{ -var MIN_TREES = floor(200*multiplier); -var MAX_TREES = floor(1250*multiplier); -var P_FOREST = randFloat(0.02, 0.05); -} -else if (currentBiome() == "tropic") -{ -var MIN_TREES = floor(1000*multiplier); -var MAX_TREES = floor(6000*multiplier); -var P_FOREST = randFloat(0.5, 0.7); -} -else -{ -var MIN_TREES = floor(500*multiplier); -var MAX_TREES = floor(3000*multiplier); -var P_FOREST = randFloat(0.5,0.8); -} -var totalTrees = scaleByMapSize(MIN_TREES, MAX_TREES); -var numForest = totalTrees * P_FOREST; -var numStragglers = totalTrees * (1.0 - P_FOREST); - -log("Creating forests..."); -var types = [ - [[tGrassDForest, tGrass, pForestD], [tGrassDForest, pForestD]], - [[tGrassPForest, tGrass, pForestP], [tGrassPForest, pForestP]] -]; // some variation - -if (currentBiome() == "savanna") -{ -var size = numForest / (0.5 * scaleByMapSize(2,8) * numPlayers); -} -else -{ -var size = numForest / (scaleByMapSize(2,8) * numPlayers); -} -var num = floor(size / types.length); -for (var i = 0; i < types.length; ++i) -{ - placer = new ClumpPlacer(numForest / num, 0.1, 0.1, 1); - painter = new LayeredPainter( - types[i], // terrains - [2] // widths - ); - createAreas( - placer, - [painter, paintClass(clForest)], - [avoidClasses(clPlayer, 17, clForest, randIntInclusive(5, 15), clHill, 0), stayClasses(clLand, 4)], - num - ); -} - -RMS.SetProgress(50); -log("Creating dirt patches..."); -var sizes = [scaleByMapSize(3, 48), scaleByMapSize(5, 84), scaleByMapSize(8, 128)]; -var numb = 1; -if (currentBiome() == "savanna") - numb = 3; -for (var i = 0; i < sizes.length; i++) -{ - placer = new ClumpPlacer(sizes[i], 0.3, 0.06, 0.5); - painter = new LayeredPainter( - [[tGrass,tGrassA],[tGrassA,tGrassB], [tGrassB,tGrassC]], // terrains - [1,1] // widths - ); - createAreas( - placer, - [painter, paintClass(clDirt)], - [avoidClasses(clForest, 0, clHill, 0, clDirt, 5, clPlayer, 0), stayClasses(clLand, 4)], - numb*scaleByMapSize(15, 45) - ); -} - -log("Creating grass patches..."); -var sizes = [scaleByMapSize(2, 32), scaleByMapSize(3, 48), scaleByMapSize(5, 80)]; -for (var i = 0; i < sizes.length; i++) -{ - placer = new ClumpPlacer(sizes[i], 0.3, 0.06, 0.5); - painter = new TerrainPainter(tGrassPatch); - createAreas( - placer, - painter, - [avoidClasses(clForest, 0, clHill, 0, clDirt, 5, clPlayer, 0), stayClasses(clLand, 4)], - numb*scaleByMapSize(15, 45) - ); -} -RMS.SetProgress(55); - -log("Creating stone mines..."); -var group = new SimpleGroup([new SimpleObject(oStoneSmall, 0,2, 0,4), new SimpleObject(oStoneLarge, 1,1, 0,4)], true, clRock); -createObjectGroupsDeprecated(group, 0, - [avoidClasses(clForest, 1, clPlayer, 10, clRock, 10, clHill, 1), stayClasses(clLand, 3)], - randIntInclusive(scaleByMapSize(2,9),scaleByMapSize(9,40)), 100 -); - -log("Creating small stone quarries..."); -group = new SimpleGroup([new SimpleObject(oStoneSmall, 2,5, 1,3)], true, clRock); -createObjectGroupsDeprecated(group, 0, - [avoidClasses(clForest, 1, clPlayer, 10, clRock, 10, clHill, 1), stayClasses(clLand, 3)], - randIntInclusive(scaleByMapSize(2,9),scaleByMapSize(9,40)), 100 -); - -log("Creating metal mines..."); -group = new SimpleGroup([new SimpleObject(oMetalLarge, 1,1, 0,4)], true, clMetal); -createObjectGroupsDeprecated(group, 0, - [avoidClasses(clForest, 1, clPlayer, 10, clMetal, 10, clRock, 5, clHill, 1), stayClasses(clLand, 3)], - randIntInclusive(scaleByMapSize(2,9),scaleByMapSize(9,40)), 100 -); -RMS.SetProgress(65); - -log("Creating small decorative rocks..."); -group = new SimpleGroup( - [new SimpleObject(aRockMedium, 1,3, 0,1)], - true -); -createObjectGroupsDeprecated( - group, 0, - [avoidClasses(clWater, 0, clForest, 0, clPlayer, 0, clHill, 0), stayClasses(clLand, 3)], - scaleByMapSize(16, 262), 50 -); - -log("Creating large decorative rocks..."); -group = new SimpleGroup( - [new SimpleObject(aRockLarge, 1,2, 0,1), new SimpleObject(aRockMedium, 1,3, 0,2)], - true -); -createObjectGroupsDeprecated( - group, 0, - [avoidClasses(clWater, 0, clForest, 0, clPlayer, 0, clHill, 0), stayClasses(clLand, 3)], - scaleByMapSize(8, 131), 50 -); - -RMS.SetProgress(70); - -log("Creating deer..."); -group = new SimpleGroup( - [new SimpleObject(oDeer, 5,7, 0,4)], - true, clFood -); -createObjectGroupsDeprecated(group, 0, - [avoidClasses(clWater, 0, clForest, 0, clPlayer, 8, clHill, 1, clFood, 20), stayClasses(clLand, 2)], - randIntInclusive(numPlayers+3, 5*numPlayers+4), 50 -); - -log("Creating berry bush..."); -group = new SimpleGroup( - [new SimpleObject(oBerryBush, 5,7, 0,4)], - true, clFood -); -createObjectGroupsDeprecated(group, 0, - [avoidClasses(clWater, 0, clForest, 0, clPlayer, 8, clHill, 1, clFood, 20), stayClasses(clLand, 2)], - randIntInclusive(1, 4) * numPlayers + 2, 50 -); - -RMS.SetProgress(75); - -log("Creating sheep..."); -group = new SimpleGroup( - [new SimpleObject(oSheep, 2,3, 0,2)], - true, clFood -); -createObjectGroupsDeprecated(group, 0, - [avoidClasses(clWater, 0, clForest, 0, clPlayer, 8, clHill, 1, clFood, 20), stayClasses(clLand, 2)], - randIntInclusive(numPlayers+3, 5*numPlayers+4), 50 -); - -log("Creating fish..."); -group = new SimpleGroup( - [new SimpleObject(oFish, 2,3, 0,2)], - true, clFood -); -createObjectGroupsDeprecated(group, 0, - avoidClasses(clLand, 4, clForest, 0, clPlayer, 0, clHill, 0, clFood, 20), - randIntInclusive(15, 40) * numPlayers, 60 -); -RMS.SetProgress(85); - -log("Creating straggler trees..."); -var types = [oOak, oOakLarge, oPine, oApple]; // some variation -var num = floor(numStragglers / types.length); -for (var i = 0; i < types.length; ++i) -{ - group = new SimpleGroup( - [new SimpleObject(types[i], 1,1, 0,3)], - true, clForest - ); - createObjectGroupsDeprecated(group, 0, - [avoidClasses(clWater, 1, clForest, 1, clHill, 1, clPlayer, 0, clMetal, 6, clRock, 6), stayClasses(clLand, 4)], - num - ); -} - -var planetm = currentBiome() == "tropic" ? 8 : 1; - -log("Creating small grass tufts..."); -group = new SimpleGroup( - [new SimpleObject(aGrassShort, 1,2, 0,1, -PI/8,PI/8)] -); -createObjectGroupsDeprecated(group, 0, - [avoidClasses(clWater, 2, clHill, 2, clPlayer, 2, clDirt, 0), stayClasses(clLand, 3)], - planetm * scaleByMapSize(13, 200) -); - -RMS.SetProgress(90); - -log("Creating large grass tufts..."); -group = new SimpleGroup( - [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)] -); -createObjectGroupsDeprecated(group, 0, - [avoidClasses(clWater, 3, clHill, 2, clPlayer, 2, clDirt, 1, clForest, 0), stayClasses(clLand, 3)], - planetm * scaleByMapSize(13, 200) -); - -RMS.SetProgress(95); - -log("Creating shallow flora..."); -group = new SimpleGroup( - [new SimpleObject(aLillies, 1,2, 0,2), new SimpleObject(aReeds, 2,4, 0,2)] -); -createObjectGroupsDeprecated(group, 0, - stayClasses(clShallow, 1), - 60 * scaleByMapSize(13, 200), 80 -); - -log("Creating bushes..."); -group = new SimpleGroup( - [new SimpleObject(aBushMedium, 1,2, 0,2), new SimpleObject(aBushSmall, 2,4, 0,2)] -); -createObjectGroupsDeprecated(group, 0, - [avoidClasses(clWater, 1, clHill, 1, clPlayer, 1, clDirt, 1), stayClasses(clLand, 3)], - planetm * scaleByMapSize(13, 200), 50 -); - -setSkySet(pickRandom(["cirrus", "cumulus", "sunny", "sunny 1", "mountainous", "stratus"])); -setSunRotation(randFloat(0, TWO_PI)); -setSunElevation(randFloat(PI/ 5, PI / 3)); +createUnknownObjects(); ExportMap();