Index: binaries/data/mods/public/maps/random/coast_range.js =================================================================== --- binaries/data/mods/public/maps/random/coast_range.js +++ binaries/data/mods/public/maps/random/coast_range.js @@ -0,0 +1,325 @@ +Engine.LoadLibrary("rmgen"); +Engine.LoadLibrary("rmgen-common"); +Engine.LoadLibrary("rmbiome"); + +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 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 oMetalSmall = g_Gaia.metalSmall; + +const aGrass = g_Decoratives.grass; +const aGrassShort = g_Decoratives.grassShort; +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]; + +const heightSeaGround = -5; +const heightLand = 3; + +var g_Map = new RandomMap(heightSeaGround, tWater); +const mapBounds = g_Map.getBounds(); + +var numPlayers = getNumPlayers(); +var mapSize = g_Map.getSize(); +var mapCenter = g_Map.getCenter(); + +var clPlayer = g_Map.createTileClass(); +var clHill = g_Map.createTileClass(); +var clForest = g_Map.createTileClass(); +var clDirt = g_Map.createTileClass(); +var clRock = g_Map.createTileClass(); +var clMetal = g_Map.createTileClass(); +var clFood = g_Map.createTileClass(); +var clBaseResource = g_Map.createTileClass(); +var clLand = g_Map.createTileClass(); +var clMountain = g_Map.createTileClass(); +var plateauPosition = fractionToTiles(0.85); + +var startAngle = randomAngle(); + +var pattern = g_MapSettings.TeamPlacement; +var teams = getTeamsArray(); +if ((pattern == "groupedLines") || (pattern == "stronghold")){ + if (teams.length != 2){ + pattern = "groupedCircle"; + g_Map.log("Too many teams for grouped lines or stronghold placement, using Grouped Circle"); + } + startAngle = 1.600; +} +if ((pattern == "alternatingCircle") || (pattern == "groupedCircle")){ + startAngle = 2.600; +} + +var continentPosition = Vector2D.add(mapCenter, new Vector2D(0, fractionToTiles(0.40)).rotate(startAngle)).round(); + +g_Map.log("Creating continent"); +createArea( + new ChainPlacer( + 2, + Math.floor(scaleByMapSize(5, 12)), + Math.floor(scaleByMapSize(60, 700)), + Infinity, + continentPosition, + 0, + [Math.floor(fractionToTiles(0.67))]), + [ + new SmoothElevationPainter(ELEVATION_SET, heightLand, 4), + new TileClassPainter(clLand) + ]); + +paintTerrainBasedOnHeight(3, 4, 3, tMainTerrain); +paintTerrainBasedOnHeight(1, 3, 0, tShore); +paintTerrainBasedOnHeight(-8, 1, 2, tWater); + +const [playerIDs, playerPosition] = + playerPlacementByPattern( + pattern, + fractionToTiles(0.25), + fractionToTiles(0.1), + startAngle, + undefined); + +placePlayerBases({ + "PlayerPlacement": [playerIDs, playerPosition], + "PlayerTileClass": clPlayer, + "BaseResourceClass": clBaseResource, + "CityPatch": { + "outerTerrain": tRoadWild, + "innerTerrain": tRoad + }, + "StartingAnimal": { + }, + "Berries": { + "template": oFruitBush + }, + "Mines": { + "types": [ + { "template": oMetalLarge }, + { "template": oStoneLarge } + ] + }, + "Trees": { + "template": oTree1, + "count": 2 + }, + "Decoratives": { + "template": aGrassShort + } +}); + +Engine.SetProgress(30); + +for (let m = 0; m < randIntInclusive(20, 34); ++m) +{ + let elevRand = randIntInclusive(4, 12); + createArea( + new ChainPlacer( + 7, + 15, + Math.floor(scaleByMapSize(15, 20)), + Infinity, + new Vector2D(fractionToTiles(randFloat(0, 1)), fractionToTiles(randFloat(0, 1))), + 0, + [Math.floor(fractionToTiles(0.01))]), + [ + new LayeredPainter([tHill,tMainTerrain], [Math.floor(elevRand / 3), 40]), + new SmoothElevationPainter(ELEVATION_SET, elevRand, Math.floor(elevRand / 3)), + new TileClassPainter(clHill) + ], + [avoidClasses(clPlayer, 16),stayClasses(clLand, 28)]); +} + +g_Map.log("Creating Plateau"); +let elevPlat = randIntInclusive(18, 24); +createArea( + new ConvexPolygonPlacer( + [ + new Vector2D(mapBounds.left, mapBounds.top - plateauPosition), + new Vector2D(mapBounds.right, mapBounds.top - plateauPosition), + new Vector2D(mapBounds.left, mapBounds.bottom), + new Vector2D(mapBounds.right, mapBounds.bottom) + ].map(pos => pos.rotateAround(startAngle - Math.PI, mapCenter)), + Infinity), + [ + new LayeredPainter([tMainTerrain, tCliff, tHill], [Math.floor(elevPlat / 3), 40]), + new SmoothElevationPainter(ELEVATION_SET, elevPlat, Math.floor(elevPlat / 3)), + new TileClassPainter(clMountain) + ]); + +for (let m = 0; m < randIntInclusive(14, 22); ++m) +{ + let elevRand = randIntInclusive(4, 12); + createArea( + new ChainPlacer( + 4, + 10, + Math.floor(scaleByMapSize(15, 20)), + Infinity, + new Vector2D(fractionToTiles(randFloat(0, 1)), fractionToTiles(randFloat(0, 1))), + 0, + [Math.floor(fractionToTiles(0.01))]), + [ + new LayeredPainter([tHill,tCliff], [Math.floor((elevRand+elevPlat) / 3), 40]), + new SmoothElevationPainter(ELEVATION_SET, (elevRand+elevPlat), Math.floor((elevRand+elevPlat) / 3)), + new TileClassPainter(clHill) + ], + [stayClasses(clMountain, 12)]); +} + +createBumps([avoidClasses(clPlayer, 10), stayClasses(clLand, 5)]); + +var [forestTrees, stragglerTrees] = getTreeCounts(...rBiomeTreeCount(1)); +createDefaultForests( + [tMainTerrain, tForestFloor1, tForestFloor2, pForest1, pForest2], + [avoidClasses(clPlayer, 20, clForest, 17, clMountain, 8, clBaseResource,2), stayClasses(clLand, 4)], + clForest, + forestTrees); + +Engine.SetProgress(50); + +g_Map.log("Creating dirt patches"); +createLayeredPatches( + [scaleByMapSize(3, 6), scaleByMapSize(5, 10), scaleByMapSize(8, 21)], + [[tMainTerrain,tTier1Terrain],[tTier1Terrain,tTier2Terrain], [tTier2Terrain,tTier3Terrain]], + [1,1], + [avoidClasses(clForest, 0, clDirt, 5, clPlayer, 12), stayClasses(clLand, 5)], + scaleByMapSize(15, 45), + clDirt); + +g_Map.log("Creating grass patches"); +createPatches( + [scaleByMapSize(2, 4), scaleByMapSize(3, 7), scaleByMapSize(5, 15)], + tTier4Terrain, + [avoidClasses(clForest, 0, clDirt, 5, clPlayer, 12), stayClasses(clLand, 5)], + scaleByMapSize(15, 45), + clDirt); +Engine.SetProgress(55); + +g_Map.log("Creating plentiful mountain metal mines"); +createBalancedMetalMines( + oMetalLarge, + oMetalLarge, + clMetal, + [stayClasses(clMountain, 12), avoidClasses(clForest, 1, clPlayer, scaleByMapSize(20, 35), clMetal, 10, clRock, 10)], +); + +g_Map.log("Creating plentiful mountain stone mines"); +createBalancedStoneMines( + oStoneLarge, + oStoneLarge, + clRock, + [stayClasses(clMountain, 12), avoidClasses(clForest, 1, clPlayer, scaleByMapSize(20, 35), clMetal, 10, clRock, 10)] +); + +g_Map.log("Creating sparse hills stone mines"); +createBalancedStoneMines( + oStoneSmall, + oStoneSmall, + clRock, + [stayClasses(clLand, 8), avoidClasses(clForest, 1, clPlayer, scaleByMapSize(20, 35), clMountain, 8, clRock, 10)] +); + +Engine.SetProgress(65); + +// create decoration +var planetm = 1; + +if (currentBiome() == "generic/india") + planetm = 8; + +createDecoration( + [ + [new SimpleObject(aRockMedium, 1, 3, 0, 1)], + [new SimpleObject(aRockLarge, 1, 2, 0, 1), new SimpleObject(aRockMedium, 1, 3, 0, 2)], + [new SimpleObject(aGrassShort, 1, 2, 0, 1)], + [new SimpleObject(aGrass, 2, 4, 0, 1.8), new SimpleObject(aGrassShort, 3, 6, 1.2, 2.5)], + [new SimpleObject(aBushMedium, 1, 2, 0, 2), new SimpleObject(aBushSmall, 2, 4, 0, 2)] + ], + [ + scaleByMapAreaAbsolute(16), + scaleByMapAreaAbsolute(8), + planetm * scaleByMapAreaAbsolute(13), + planetm * scaleByMapAreaAbsolute(13), + planetm * scaleByMapAreaAbsolute(13) + ], + [avoidClasses(clForest, 0, clPlayer, 0), stayClasses(clLand, 5)]); + +Engine.SetProgress(70); + +createFood( + [ + [new SimpleObject(oMainHuntableAnimal, 5, 7, 0, 4)], + [new SimpleObject(oSecondaryHuntableAnimal, 2, 3, 0, 2)] + ], + [ + 4 * numPlayers, + 4 * numPlayers + ], + [avoidClasses(clForest, 0, clPlayer, 20, clFood, 20, clMountain, 4), stayClasses(clLand, 5)], + clFood); + +createFood( + [ + [new SimpleObject(oFruitBush, 5, 7, 0, 4)] + ], + [ + 5 * numPlayers + ], + [avoidClasses(clForest, 0, clPlayer, 20, clFood, 10, clMountain, 2), stayClasses(clLand, 5)], + clFood); + +createFood( + [ + [new SimpleObject(oFish, 2, 3, 0, 2)] + ], + [ + 50 * numPlayers + ], + avoidClasses(clLand, 4, clFood, 16), + clFood); + +Engine.SetProgress(85); + +createStragglerTrees( + [oTree1, oTree2, oTree4, oTree3], + [avoidClasses(clForest, 7, clPlayer, 9, clMetal, 6, clRock, 6), stayClasses(clLand, 7)], + clForest, + stragglerTrees); + +placePlayersNomad( + clPlayer, + [stayClasses(clLand, 4), avoidClasses(clForest, 1, clMetal, 4, clRock, 4, clFood, 2, clMountain, 8)]); + +setWaterWaviness(1.0); +setWaterType("ocean"); + +g_Map.ExportMap(); Index: binaries/data/mods/public/maps/random/coast_range.json =================================================================== --- binaries/data/mods/public/maps/random/coast_range.json +++ binaries/data/mods/public/maps/random/coast_range.json @@ -0,0 +1,17 @@ +{ + "settings" : { + "Name" : "Coast Range", + "Script" : "coast_range.js", + "Description" : "All players starts on a continent surrounded by water.", + "Preview" : "coast_range.png", + "Keywords": ["multiplayer"], + "SupportedBiomes": "generic/", + "CircularMap" : true, + "TeamPlacements": [ + "alternatingCircle", + "groupedCircle", + "groupedLines", + "stronghold" + ] + } +}