diff --git a/binaries/data/mods/public/maps/random/aegean_sea.js b/binaries/data/mods/public/maps/random/aegean_sea.js index 6f3dd2880e..2a5c05643f 100644 --- a/binaries/data/mods/public/maps/random/aegean_sea.js +++ b/binaries/data/mods/public/maps/random/aegean_sea.js @@ -62,84 +62,33 @@ var clHill = createTileClass(); var clIsland = createTileClass(); var clCorals = createTileClass(); -var [playerIDs, playerX, playerZ] = playerPlacementRiver(0, 0.6); - -for (var i = 0; i < numPlayers; i++) -{ - var id = playerIDs[i]; - log("Creating base for player " + id + "..."); - - var radius = scaleByMapSize(15,25); - var cliffRadius = 2; - var elevation = 20; - - // get the x and z in tiles - var fx = fractionToTiles(playerX[i]); - var fz = fractionToTiles(playerZ[i]); - var ix = Math.floor(fx); - var iz = Math.floor(fz); - addToClass(ix, iz, clPlayer); - - // 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([tCityPlaza, tCity], [1]); - createArea(placer, painter, null); - - placeCivDefaultEntities(fx, fz, id); - - placeDefaultChicken(fx, fz, clBaseResource); - - // create berry bushes - var bbAngle = randFloat(0, 2 * Math.PI); - var bbDist = 12; - var bbX = Math.round(fx + bbDist * cos(bbAngle)); - var bbZ = Math.round(fz + bbDist * sin(bbAngle)); - var group = new SimpleGroup( - [new SimpleObject(oBerryBush, 5,5, 0,3)], - true, clBaseResource, bbX, bbZ - ); - createObjectGroup(group, 0); - - // create metal mine - var mAngle = bbAngle; - while (Math.abs(mAngle - bbAngle) < Math.PI / 3) - { - mAngle = randFloat(0, 2 * Math.PI); +placePlayerBases({ + "PlayerPlacement": playerPlacementRiver(0, 0.6), + "PlayerTileClass": clPlayer, + "BaseResourceClass": clBaseResource, + "CityPatch": { + "outerTerrain": tCityPlaza, + "innerTerrain": tCity + }, + "Chicken": { + }, + "Berries": { + "template": oBerryBush + }, + "Mines": { + "types": [ + { "template": oMetalLarge }, + { "template": oStoneLarge } + ] + }, + "Trees": { + "template": oCarob, + "count": 2 + }, + "Decoratives": { + "template": aBush1 } - var mDist = 12; - var mX = Math.round(fx + mDist * cos(mAngle)); - var mZ = Math.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 = Math.round(fx + mDist * cos(mAngle)); - mZ = Math.round(fz + mDist * sin(mAngle)); - group = new SimpleGroup( - [new SimpleObject(oStoneLarge, 1,1, 0,2)], - true, clBaseResource, mX, mZ - ); - createObjectGroup(group, 0); - - // create starting trees - var num = 2; - var tAngle = randFloat(-PI/3, 4*PI/3); - var tDist = randFloat(11, 13); - var tX = Math.round(fx + tDist * cos(tAngle)); - var tZ = Math.round(fz + tDist * sin(tAngle)); - group = new SimpleGroup( - [new SimpleObject(oCarob, num, num, 0,5)], - false, clBaseResource, tX, tZ - ); - createObjectGroup(group, 0, avoidClasses(clBaseResource,2)); - - placeDefaultDecoratives(fx, fz, aBush1, clBaseResource, radius); -} +}); Engine.SetProgress(30); paintRiver({ @@ -310,7 +259,7 @@ createFood( scaleByMapSize(5, 20), scaleByMapSize(5, 20) ], - avoidClasses(clForest, 0, clPlayer, 8, clWater, 1, clFood, 10, clHill, 1), + avoidClasses(clForest, 0, clPlayer, 8, clBaseResource, 4, clWater, 1, clFood, 10, clHill, 1), clFood); createFood( diff --git a/binaries/data/mods/public/maps/random/african_plains.js b/binaries/data/mods/public/maps/random/african_plains.js index f28eb62dba..48ee81657c 100644 --- a/binaries/data/mods/public/maps/random/african_plains.js +++ b/binaries/data/mods/public/maps/random/african_plains.js @@ -42,7 +42,6 @@ InitMap(); const numPlayers = getNumPlayers(); const mapSize = getMapSize(); -Engine.SetProgress(20); var clPlayer = createTileClass(); var clHill = createTileClass(); @@ -54,74 +53,41 @@ var clMetal = createTileClass(); var clFood = createTileClass(); var clBaseResource = createTileClass(); -var [playerIDs, playerX, playerZ] = radialPlayerPlacement(); - -for (var i = 0; i < numPlayers; ++i) -{ - var id = playerIDs[i]; - log("Creating base for player " + id + "..."); - - var radius = scaleByMapSize(15,25); - - // get the x and z in tiles - var fx = fractionToTiles(playerX[i]); - var fz = fractionToTiles(playerZ[i]); - var ix = Math.round(fx); - var iz = Math.round(fz); - addCivicCenterAreaToClass(ix, iz, clPlayer); - - // 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([tPrimary,tCitytiles], [1]); - createArea(placer, painter, null); - - placeCivDefaultEntities(fx, fz, id); - placeDefaultChicken(fx, fz, clBaseResource); - - // create berry bushes - var bbAngle = randFloat(0, 2 * Math.PI); - var bbDist = 12; - var bbX = Math.round(fx + bbDist * cos(bbAngle)); - var bbZ = Math.round(fz + bbDist * sin(bbAngle)); - var group = new SimpleGroup( - [new SimpleObject(oBerryBush, 5,5, 0,3)], - true, clBaseResource, bbX, bbZ - ); - createObjectGroup(group, 0); - - // create metal mine - var mAngle = bbAngle; - while (Math.abs(mAngle - bbAngle) < Math.PI / 3) - mAngle = randFloat(0, 2 * Math.PI); - - var mDist = 12; - var mX = Math.round(fx + mDist * cos(mAngle)); - var mZ = Math.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 = Math.round(fx + mDist * cos(mAngle)); - mZ = Math.round(fz + mDist * sin(mAngle)); - createStoneMineFormation(mX, mZ, oStoneSmall, tDirt4); - addToClass(mX, mZ, clPlayer); - - // create starting trees - var tAngle = randFloat(-PI/3, 4*PI/3); - var tDist = randFloat(11, 13); - var tX = Math.round(fx + tDist * cos(tAngle)); - var tZ = Math.round(fz + tDist * sin(tAngle)); - group = new SimpleGroup( - [new SimpleObject(oBaobab, 2,7)], - false, clBaseResource, tX, tZ - ); - createObjectGroup(group, 0, avoidClasses(clBaseResource,2)); -} +placePlayerBases({ + "PlayerPlacement": playerPlacementCircle(0.35), + "PlayerTileClass": clPlayer, + "BaseResourceClass": clBaseResource, + "CityPatch": { + "outerTerrain": tPrimary, + "innerTerrain": tCitytiles + }, + "Chicken": { + }, + "Berries": { + "template": oBerryBush + }, + "Mines": { + "types": [ + { + "template": oMetalLarge + }, + { + "type": "stone_formation", + "template": oStoneSmall, + "terrain": tDirt4 + } + ] + }, + "Trees": { + "template": oBaobab, + "count": scaleByMapSize(3, 12), + "minDistGroup": 2, + "maxDistGroup": 6, + "minDist": 15, + "maxDist": 16 + } + // No decoratives +}); Engine.SetProgress(20); createHills([tDirt2, tCliff, tGrassShrubs], avoidClasses(clPlayer, 35, clForest, 20, clHill, 20, clWater, 2), clHill, scaleByMapSize(5, 8)); diff --git a/binaries/data/mods/public/maps/random/alpine_lakes.js b/binaries/data/mods/public/maps/random/alpine_lakes.js index eb5d7bd90c..0eeb33b251 100644 --- a/binaries/data/mods/public/maps/random/alpine_lakes.js +++ b/binaries/data/mods/public/maps/random/alpine_lakes.js @@ -100,84 +100,33 @@ var clBaseResource = createTileClass(); initTerrain(tPrimary); -var [playerIDs, playerX, playerZ] = radialPlayerPlacement(); - -for (var i = 0; i < numPlayers; i++) -{ - var id = playerIDs[i]; - log("Creating base for player " + id + "..."); - - var radius = scaleByMapSize(15,25); - var cliffRadius = 2; - var elevation = 20; - - // get the x and z in tiles - var fx = fractionToTiles(playerX[i]); - var fz = fractionToTiles(playerZ[i]); - var ix = Math.round(fx); - var iz = Math.round(fz); - addCivicCenterAreaToClass(ix, iz, clPlayer); - - // 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); - - placeCivDefaultEntities(fx, fz, id); - - placeDefaultChicken(fx, fz, clBaseResource); - - // create berry bushes - var bbAngle = randFloat(0, 2 * Math.PI); - var bbDist = 12; - var bbX = Math.round(fx + bbDist * cos(bbAngle)); - var bbZ = Math.round(fz + bbDist * sin(bbAngle)); - var group = new SimpleGroup( - [new SimpleObject(oBerryBush, 5,5, 0,3)], - true, clBaseResource, bbX, bbZ - ); - createObjectGroup(group, 0); - - // create metal mine - var mAngle = bbAngle; - while (Math.abs(mAngle - bbAngle) < Math.PI / 3) - mAngle = randFloat(0, 2 * Math.PI); - - var mDist = 12; - var mX = Math.round(fx + mDist * cos(mAngle)); - var mZ = Math.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 = Math.round(fx + mDist * cos(mAngle)); - mZ = Math.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 = Math.floor(hillSize / 100); - var tAngle = randFloat(-PI/3, 4*PI/3); - var tDist = randFloat(11, 13); - var tX = Math.round(fx + tDist * cos(tAngle)); - var tZ = Math.round(fz + tDist * sin(tAngle)); - group = new SimpleGroup( - [new SimpleObject(oPine, num, num, 0,5)], - false, clBaseResource, tX, tZ - ); - createObjectGroup(group, 0, avoidClasses(clBaseResource,2)); - - placeDefaultDecoratives(fx, fz, aGrassShort, clBaseResource, radius); -} - +placePlayerBases({ + "PlayerPlacement": playerPlacementCircle(0.35), + "PlayerTileClass": clPlayer, + "BaseResourceClass": clBaseResource, + "CityPatch": { + "outerTerrain": tRoadWild, + "innerTerrain": tRoad + }, + "Chicken": { + }, + "Berries": { + "template": oBerryBush + }, + "Mines": { + "types": [ + { "template": oMetalLarge }, + { "template": oStoneLarge } + ] + }, + "Trees": { + "template": oPine, + "count": scaleByMapSize(3, 12) + }, + "Decoratives": { + "template": aGrassShort + } +}); Engine.SetProgress(20); log("Creating hills..."); diff --git a/binaries/data/mods/public/maps/random/alpine_valley.js b/binaries/data/mods/public/maps/random/alpine_valley.js index ac579a834e..8fffd96e99 100644 --- a/binaries/data/mods/public/maps/random/alpine_valley.js +++ b/binaries/data/mods/public/maps/random/alpine_valley.js @@ -302,83 +302,34 @@ var mountainHeight = 30; initTerrain(tPrimary); -var [playerIDs, playerX, playerZ, playerAngle, startAngle] = radialPlayerPlacement(); +var [playerIDs, playerX, playerZ, playerAngle, startAngle] = playerPlacementCircle(0.35); -for (var i = 0; i < numPlayers; i++) -{ - var id = playerIDs[i]; - log("Creating base for player " + id + "..."); - - var radius = scaleByMapSize(15,25); - var cliffRadius = 2; - var elevation = 20; - - // get the x and z in tiles - var fx = fractionToTiles(playerX[i]); - var fz = fractionToTiles(playerZ[i]); - var ix = Math.round(fx); - var iz = Math.round(fz); - addCivicCenterAreaToClass(ix, iz, clPlayer); - - // 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); - - placeCivDefaultEntities(fx, fz, id); - - placeDefaultChicken(fx, fz, clBaseResource); - - // create berry bushes - var bbAngle = randFloat(0, 2 * Math.PI); - var bbDist = 12; - var bbX = Math.round(fx + bbDist * cos(bbAngle)); - var bbZ = Math.round(fz + bbDist * sin(bbAngle)); - var group = new SimpleGroup( - [new SimpleObject(oBerryBush, 5,5, 0,3)], - true, clBaseResource, bbX, bbZ - ); - createObjectGroup(group, 0); - - // create metal mine - var mAngle = bbAngle; - while (Math.abs(mAngle - bbAngle) < Math.PI / 3) - mAngle = randFloat(0, 2 * Math.PI); - - var mDist = 12; - var mX = Math.round(fx + mDist * cos(mAngle)); - var mZ = Math.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 = Math.round(fx + mDist * cos(mAngle)); - mZ = Math.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 = Math.floor(hillSize / 100); - var tAngle = randFloat(-PI/3, 4*PI/3); - var tDist = randFloat(11, 13); - var tX = Math.round(fx + tDist * cos(tAngle)); - var tZ = Math.round(fz + tDist * sin(tAngle)); - group = new SimpleGroup( - [new SimpleObject(oPine, num, num, 0,5)], - false, clBaseResource, tX, tZ - ); - createObjectGroup(group, 0, avoidClasses(clBaseResource,2)); - - placeDefaultDecoratives(fx, fz, aGrassShort, clBaseResource, radius); -} +placePlayerBases({ + "PlayerPlacement": [playerIDs, playerX, playerZ], + "PlayerTileClass": clPlayer, + "BaseResourceClass": clBaseResource, + "CityPatch": { + "outerTerrain": tRoadWild, + "innerTerrain": tRoad + }, + "Chicken": { + }, + "Berries": { + "template": oBerryBush + }, + "Mines": { + "types": [ + { "template": oMetalLarge }, + { "template": oStoneLarge } + ] + }, + "Trees": { + "template": oPine + }, + "Decoratives": { + "template": aGrassShort + } +}); Engine.SetProgress(20); new MountainRangeBuilder({ diff --git a/binaries/data/mods/public/maps/random/anatolian_plateau.js b/binaries/data/mods/public/maps/random/anatolian_plateau.js index 530936d4de..8334997eb7 100644 --- a/binaries/data/mods/public/maps/random/anatolian_plateau.js +++ b/binaries/data/mods/public/maps/random/anatolian_plateau.js @@ -41,84 +41,32 @@ var clMetal = createTileClass(); var clFood = createTileClass(); var clBaseResource = createTileClass(); -var [playerIDs, playerX, playerZ] = radialPlayerPlacement(); - -for (var i = 0; i < numPlayers; i++) -{ - var id = playerIDs[i]; - log("Creating base for player " + id + "..."); - - var radius = scaleByMapSize(15,25); - var cliffRadius = 2; - var elevation = 20; - - // get the x and z in tiles - var fx = fractionToTiles(playerX[i]); - var fz = fractionToTiles(playerZ[i]); - var ix = Math.round(fx); - var iz = Math.round(fz); - addCivicCenterAreaToClass(ix, iz, clPlayer); - - // 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); - - placeCivDefaultEntities(fx, fz, id); - - placeDefaultChicken(fx, fz, clBaseResource); - - // create berry bushes - var bbAngle = randFloat(0, 2 * Math.PI); - var bbDist = 12; - var bbX = Math.round(fx + bbDist * cos(bbAngle)); - var bbZ = Math.round(fz + bbDist * sin(bbAngle)); - var group = new SimpleGroup( - [new SimpleObject(oBerryBush, 5,5, 0,3)], - true, clBaseResource, bbX, bbZ - ); - createObjectGroup(group, 0); - - // create metal mine - var mAngle = bbAngle; - while (Math.abs(mAngle - bbAngle) < Math.PI / 3) - { - mAngle = randFloat(0, 2 * Math.PI); +placePlayerBases({ + "PlayerPlacement": playerPlacementCircle(0.35), + "PlayerTileClass": clPlayer, + "BaseResourceClass": clBaseResource, + "CityPatch": { + "outerTerrain": tRoadWild, + "innerTerrain": tRoad + }, + "Chicken": { + }, + "Berries": { + "template": oBerryBush + }, + "Mines": { + "types": [ + { "template": oMetalLarge }, + { "template": oStoneLarge } + ] + }, + "Trees": { + "template": oPoplar + }, + "Decoratives": { + "template": aGrassShort } - var mDist = 12; - var mX = Math.round(fx + mDist * cos(mAngle)); - var mZ = Math.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 = Math.round(fx + mDist * cos(mAngle)); - mZ = Math.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 = Math.floor(hillSize / 100); - var tAngle = randFloat(-PI/3, 4*PI/3); - var tDist = randFloat(11, 13); - var tX = Math.round(fx + tDist * cos(tAngle)); - var tZ = Math.round(fz + tDist * sin(tAngle)); - group = new SimpleGroup( - [new SimpleObject(oPoplar, num, num, 0,5)], - false, clBaseResource, tX, tZ - ); - createObjectGroup(group, 0, avoidClasses(clBaseResource,2)); - - placeDefaultDecoratives(fx, fz, aGrassShort, clBaseResource, radius); -} +}); Engine.SetProgress(20); @@ -268,7 +216,7 @@ 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(clHill, 2, clPlayer, 2, clDirt, 1, clForest, 0), + avoidClasses(clHill, 2, clPlayer, 10, clDirt, 1, clForest, 0), scaleByMapSize(13, 200) ); diff --git a/binaries/data/mods/public/maps/random/archipelago.js b/binaries/data/mods/public/maps/random/archipelago.js index 27cd457ef6..66efc6fb39 100644 --- a/binaries/data/mods/public/maps/random/archipelago.js +++ b/binaries/data/mods/public/maps/random/archipelago.js @@ -62,7 +62,7 @@ var shoreHeight = 1; var islandRadius = scaleByMapSize(22, 31); -var [playerIDs, playerX, playerZ] = radialPlayerPlacement(); +var [playerIDs, playerX, playerZ] = playerPlacementCircle(0.35); log("Creating player islands..."); for (let i = 0; i < numPlayers; ++i) @@ -99,90 +99,46 @@ paintTerrainBasedOnHeight(landHeight - 0.6, landHeight + 0.4, 3, tMainTerrain); paintTerrainBasedOnHeight(shoreHeight, landHeight, 0, tShore); paintTerrainBasedOnHeight(getMapBaseHeight(), shoreHeight, 2, tWater); -for (var i = 0; i < numPlayers; i++) -{ - var id = playerIDs[i]; - log("Creating base for player " + id + "..."); - - var radius = islandRadius; - - var hillSize = PI * radius * radius; - // get the x and z in tiles - var fx = fractionToTiles(playerX[i]); - var fz = fractionToTiles(playerZ[i]); - var ix = Math.round(fx); - var iz = Math.round(fz); - - placeCivDefaultEntities(fx, fz, id, { 'iberWall': 'towers' }); - - placeDefaultChicken(fx, fz, clBaseResource); - - // create berry bushes - var bbAngle = randFloat(0, 2 * Math.PI); - var bbDist = 12; - var bbX = Math.round(fx + bbDist * cos(bbAngle)); - var bbZ = Math.round(fz + bbDist * sin(bbAngle)); - var group = new SimpleGroup( - [new SimpleObject(oFruitBush, 5,5, 0,3)], - true, clBaseResource, bbX, bbZ - ); - createObjectGroup(group, 0); - - // create woods - var bbAngle = randFloat(0, 2 * Math.PI); - var bbDist = 13; - var bbX = Math.round(fx + bbDist * cos(bbAngle)); - var bbZ = Math.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 (Math.abs(mAngle - bbAngle) < Math.PI / 3) - mAngle = randFloat(0, 2 * Math.PI); - - var mDist = 12; - var mX = Math.round(fx + mDist * cos(mAngle)); - var mZ = Math.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 = Math.round(fx + mDist * cos(mAngle)); - mZ = Math.round(fz + mDist * sin(mAngle)); - group = new SimpleGroup( - [new SimpleObject(oStoneLarge, 1,1, 0,2)], - true, clBaseResource, mX, mZ - ); - createObjectGroup(group, 0); - - // create starting trees - var num = Math.floor(hillSize / 100); - var tAngle = randFloat(-PI/3, 4*PI/3); - var tDist = randFloat(11, 13); - var tX = Math.round(fx + tDist * cos(tAngle)); - var tZ = Math.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, paintClass(clPlayer)]); -} +placePlayerBases({ + "PlayerPlacement": [playerIDs, playerX, playerZ], + // PlayerTileClass marked below + "BaseResourceClass": clBaseResource, + "Walls": "towers", + "CityPatch": { + "outerTerrain": tRoadWild, + "innerTerrain": tRoad, + "radius": islandRadius / 3, + "painters": [ + paintClass(clPlayer) + ] + }, + "Chicken": { + }, + "Berries": { + "template": oFruitBush + }, + "Mines": { + "types": [ + { "template": oMetalLarge }, + { "template": oStoneLarge } + ] + }, + "Treasures": { + "types": [ + { + "template": oWoodTreasure, + "count": 14 + } + ] + }, + "Trees": { + "template": oTree1, + "count": scaleByMapSize(15, 30) + }, + "Decoratives": { + "template": aGrassShort, + } +}); createBumps([avoidClasses(clPlayer, 10), stayClasses(clLand, 5)]); diff --git a/binaries/data/mods/public/maps/random/arctic_summer.js b/binaries/data/mods/public/maps/random/arctic_summer.js index 6efb42774a..6c941730a2 100644 --- a/binaries/data/mods/public/maps/random/arctic_summer.js +++ b/binaries/data/mods/public/maps/random/arctic_summer.js @@ -53,98 +53,41 @@ var clMetal = createTileClass(); var clFood = createTileClass(); var clBaseResource = createTileClass(); -var [playerIDs, playerX, playerZ] = radialPlayerPlacement(); - -for (let i = 0; i < numPlayers; i++) -{ - log("Creating base for player " + playerIDs[i]); - let radius = scaleByMapSize(15, 25); - - // Get the x and z in tiles - let fx = fractionToTiles(playerX[i]); - let fz = fractionToTiles(playerZ[i]); - let ix = Math.round(fx); - let iz = Math.round(fz); - - addCivicCenterAreaToClass(ix, iz, clPlayer); - - // Create the city patch - let cityRadius = radius / 3; - createArea( - new ClumpPlacer(PI * cityRadius * cityRadius, 0.6, 0.3, 10, ix, iz), - new LayeredPainter([tPrimary, tSecondary], [1]), - null); - - placeCivDefaultEntities(fx, fz, playerIDs[i]); - - placeDefaultChicken(fx, fz, clBaseResource, undefined, oRabbit); - - // Create berry bushes - let bbAngle = randFloat(0, 2 * PI); - let bbDist = 12; - createObjectGroup( - new SimpleGroup( - [new SimpleObject(oBerryBush, 5, 5, 0, 3)], - true, - clBaseResource, - Math.round(fx + bbDist * Math.cos(bbAngle)), - Math.round(fz + bbDist * Math.sin(bbAngle))), - 0); - - // Create metal mine - let mAngle = bbAngle + randFloat(PI / 3, PI); - let mDist = 12; - createObjectGroup( - new SimpleGroup( - [new SimpleObject(oMetalLarge, 1, 1, 0, 0)], - true, - clBaseResource, - Math.round(fx + mDist * Math.cos(mAngle)), - Math.round(fz + mDist * Math.sin(mAngle))), - 0); - - // Create stone mines - mAngle += randFloat(PI/8, PI/4); - createObjectGroup( - new SimpleGroup( - [new SimpleObject(oStoneLarge, 1, 1, 0, 2)], - true, - clBaseResource, - Math.round(fx + mDist * Math.cos(mAngle)), - Math.round(fz + mDist * Math.sin(mAngle))), - 0); - - // Create wood treasure - mAngle += randFloat(PI/4, PI/6); - createObjectGroup( - new SimpleGroup( - [new SimpleObject(oWoodTreasure, 10, 10, 0, 3)], - true, - clBaseResource, - Math.round(fx + bbDist * Math.cos(mAngle)), - Math.round(fz + bbDist * Math.sin(mAngle)), - avoidClasses(clBaseResource, 4)), - 0); - - // Create starting trees - for (let i = 0; i < 10; ++i) - { - let tAngle = mAngle + randFloat(PI/3, PI/4); - let tDist = randFloat(10, 12); - if (createObjectGroup( - new SimpleGroup( - [new SimpleObject(oBush, 20, 20, 0, 3)], - false, - clBaseResource, - Math.round(fx + tDist * Math.cos(tAngle)), - Math.round(fz + tDist * Math.sin(tAngle))), - 0, - avoidClasses(clBaseResource, 4))) - { - break; - } +placePlayerBases({ + "PlayerPlacement": playerPlacementCircle(0.35), + "PlayerTileClass": clPlayer, + "BaseResourceClass": clBaseResource, + "CityPatch": { + "outerTerrain": tPrimary, + "innerTerrain": tSecondary + }, + "Chicken": { + "template": oRabbit + }, + "Berries": { + "template": oBerryBush + }, + "Mines": { + "types": [ + { "template": oMetalLarge }, + { "template": oStoneLarge } + ] + }, + "Treasures": { + "types": [ + { + "template": oWoodTreasure, + "count": 10 + } + ] + }, + "Trees": { + "template": oBush, + "count": 20, + "maxDistGroup": 3 } -} + // No decoratives +}); Engine.SetProgress(20); log("Creating hills..."); diff --git a/binaries/data/mods/public/maps/random/ardennes_forest.js b/binaries/data/mods/public/maps/random/ardennes_forest.js index d21a1ab4d0..a170ee3058 100644 --- a/binaries/data/mods/public/maps/random/ardennes_forest.js +++ b/binaries/data/mods/public/maps/random/ardennes_forest.js @@ -90,7 +90,7 @@ for (var ix = 0; ix < mapSize; ix++) } } -var [playerIDs, playerX, playerZ] = radialPlayerPlacement(0.3); +var [playerIDs, playerX, playerZ] = playerPlacementCircle(0.3); function distanceToPlayers(x, z) { @@ -119,78 +119,37 @@ function playerNearness(x, z) Engine.SetProgress(10); -for (var i=0; i < numPlayers; i++) -{ - var id = playerIDs[i]; - log("Creating base for player " + id + "..."); - - // get the x and z in tiles - var fx = fractionToTiles(playerX[i]); - var fz = fractionToTiles(playerZ[i]); - var ix = Math.round(fx); - var iz = Math.round(fz); - - placeCivDefaultEntities(fx, fz, id); - - var citySize = 250; - - // Create the city patch - var placer = new ClumpPlacer(citySize * 0.4, 0.6, 0.05, 10, ix, iz); - var painter = new TerrainPainter([tCity]); - createArea(placer, painter, null); - - // Create starter animals - placeDefaultChicken(fx, fz, clBaseResource, undefined, oPig); - - // Create starter berry bushes - var bbAngle = randFloat(0, 2 * Math.PI); - var bbDist = 12; - var bbX = Math.round(fx + bbDist * cos(bbAngle)); - var bbZ = Math.round(fz + bbDist * sin(bbAngle)); - group = new SimpleGroup( - [new SimpleObject(oBerryBush, 3,3, 0,3)], - true, clBaseResource, bbX, bbZ - ); - createObjectGroup(group, 0); - - // Create starter metal mine - var mAngle = bbAngle; - while (Math.abs(mAngle - bbAngle) < Math.PI / 3) - { - mAngle = randFloat(0, 2 * Math.PI); +placePlayerBases({ + "PlayerPlacement": [playerIDs, playerX, playerZ], + "BaseResourceClass": clBaseResource, + // Playerclass marked below + "CityPatch": { + "outerTerrain": tCity, + "innerTerrain": tCity, + "radius": scaleByMapSize(5, 6), + "smoothness": 0.05 + }, + "Chicken": { + "template": oPig + }, + "Berries": { + "template": oBerryBush, + "minCount": 3, + "maxCount": 3 + }, + "Mines": { + "types": [ + { "template": oMetalLarge }, + { "template": oStoneLarge } + ], + "distance": 16 + }, + "Trees": { + "template": oOak, + "count": 2 } - var mDist = bbDist + 4; - var mX = Math.round(fx + mDist * cos(mAngle)); - var mZ = Math.round(fz + mDist * sin(mAngle)); - group = new SimpleGroup( - [new SimpleObject(oMetalLarge, 1,1, 0,0)], - true, clBaseResource, mX, mZ - ); - createObjectGroup(group, 0); - - // Create starter stone mines - mAngle += randFloat(PI/8, PI/4); - mX = Math.round(fx + mDist * cos(mAngle)); - mZ = Math.round(fz + mDist * sin(mAngle)); - group = new SimpleGroup( - [new SimpleObject(oStoneLarge, 1,1, 0,2)], - true, clBaseResource, mX, mZ - ); - createObjectGroup(group, 0); - - // create starting trees - var num = 2; - var tAngle = randFloat(-PI/3, 4*PI/3); - var tDist = randFloat(11, 13); - var tX = Math.round(fx + tDist * cos(tAngle)); - var tZ = Math.round(fz + tDist * sin(tAngle)); - group = new SimpleGroup( - [new SimpleObject(oOak, num, num, 0,5)], - false, clBaseResource, tX, tZ - ); - createObjectGroup(group, 0, avoidClasses(clBaseResource,2)); - -} + // No decoratives +}); log("Marking player territory larger than the city patch..."); for (let i = 0; i < numPlayers; ++i) diff --git a/binaries/data/mods/public/maps/random/atlas_mountains.js b/binaries/data/mods/public/maps/random/atlas_mountains.js index 0c83227e95..95746be4ea 100644 --- a/binaries/data/mods/public/maps/random/atlas_mountains.js +++ b/binaries/data/mods/public/maps/random/atlas_mountains.js @@ -49,84 +49,33 @@ var clBaseResource = createTileClass(); var clTreasure = createTileClass(); var clGrass = createTileClass(); -var [playerIDs, playerX, playerZ] = radialPlayerPlacement(); - -for (var i = 0; i < numPlayers; i++) -{ - var id = playerIDs[i]; - log("Creating base for player " + id + "..."); - - var radius = scaleByMapSize(15,25); - var cliffRadius = 2; - var elevation = 20; - - // get the x and z in tiles - var fx = fractionToTiles(playerX[i]); - var fz = fractionToTiles(playerZ[i]); - var ix = Math.round(fx); - var iz = Math.round(fz); - addCivicCenterAreaToClass(ix, iz, clPlayer); - - // 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); - - placeCivDefaultEntities(fx, fz, id); - - placeDefaultChicken(fx, fz, clBaseResource); - - // create berry bushes - var bbAngle = randFloat(0, 2 * Math.PI); - var bbDist = 12; - var bbX = Math.round(fx + bbDist * cos(bbAngle)); - var bbZ = Math.round(fz + bbDist * sin(bbAngle)); - var group = new SimpleGroup( - [new SimpleObject(oBerryBush, 5,5, 0,3)], - true, clBaseResource, bbX, bbZ - ); - createObjectGroup(group, 0); - - // create metal mine - var mAngle = bbAngle; - while (Math.abs(mAngle - bbAngle) < Math.PI / 3) - { - mAngle = randFloat(0, 2 * Math.PI); +placePlayerBases({ + "PlayerPlacement": playerPlacementCircle(0.35), + "PlayerTileClass": clPlayer, + "BaseResourceClass": clBaseResource, + "CityPatch": { + "outerTerrain": tRoadWild, + "innerTerrain": tRoad + }, + "Chicken": { + }, + "Berries": { + "template": oBerryBush + }, + "Mines": { + "types": [ + { "template": oMetalLarge }, + { "template": oStoneLarge } + ] + }, + "Trees": { + "template": oCarob, + "count": scaleByMapSize(2, 8) + }, + "Decoratives": { + "template": aGrassShort } - var mDist = 12; - var mX = Math.round(fx + mDist * cos(mAngle)); - var mZ = Math.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 = Math.round(fx + mDist * cos(mAngle)); - mZ = Math.round(fz + mDist * sin(mAngle)); - group = new SimpleGroup( - [new SimpleObject(oStoneLarge, 1,1, 0,2)], - true, clBaseResource, mX, mZ - ); - createObjectGroup(group, 0); - // create starting trees - var num = 4; - var tAngle = randFloat(-PI/3, 4*PI/3); - var tDist = randFloat(11, 13); - var tX = Math.round(fx + tDist * cos(tAngle)); - var tZ = Math.round(fz + tDist * sin(tAngle)); - group = new SimpleGroup( - [new SimpleObject(oCarob, num, num, 0,5)], - false, clBaseResource, tX, tZ - ); - createObjectGroup(group, 0, avoidClasses(clBaseResource,2)); - - placeDefaultDecoratives(fx, fz, aGrassShort, clBaseResource, radius); -} - +}); Engine.SetProgress(10); createBumps(avoidClasses(clPlayer, 9)); diff --git a/binaries/data/mods/public/maps/random/belgian_uplands.js b/binaries/data/mods/public/maps/random/belgian_uplands.js index 1e0e335643..3ea48bd8ca 100644 --- a/binaries/data/mods/public/maps/random/belgian_uplands.js +++ b/binaries/data/mods/public/maps/random/belgian_uplands.js @@ -397,7 +397,7 @@ for (var p = 0; p < numPlayers; p++) { var actualX = possibleStartPositions[bestDerivation[p]][0]; var actualY = possibleStartPositions[bestDerivation[p]][1]; - placeCivDefaultEntities(actualX, actualY, p + 1, { "iberWall": false }); + placeCivDefaultStartingEntities(actualX, actualY, p + 1, false); // Place some start resources var uDist = 8; diff --git a/binaries/data/mods/public/maps/random/botswanan_haven.js b/binaries/data/mods/public/maps/random/botswanan_haven.js index 8c960b15a7..1d8b190e66 100644 --- a/binaries/data/mods/public/maps/random/botswanan_haven.js +++ b/binaries/data/mods/public/maps/random/botswanan_haven.js @@ -56,102 +56,32 @@ var clForest = createTileClass(); var clFood = createTileClass(); var clBaseResource = createTileClass(); -var [playerIDs, playerX, playerZ] = radialPlayerPlacement(); - -for (let i = 0; i < numPlayers; ++i) -{ - let id = playerIDs[i]; - log("Creating base for player " + id + "..."); - let radius = scaleByMapSize(15, 25); - - // Get the x and z in tiles - let fx = fractionToTiles(playerX[i]); - let fz = fractionToTiles(playerZ[i]); - let ix = Math.round(fx); - let iz = Math.round(fz); - - addCivicCenterAreaToClass(ix, iz, clPlayer); - - // Create the city patch - let cityRadius = radius / 3; - createArea( - new ClumpPlacer(PI * cityRadius * cityRadius, 0.6, 0.3, 10, ix, iz), - new LayeredPainter([tCityTile, tCityTile], [1]), - null); - - placeCivDefaultEntities(fx, fz, id); - - placeDefaultChicken(fx, fz, clBaseResource); - - // Create berry bushes - let bbAngle = randFloat(0, 2 * PI); - let bbDist = 12; - createObjectGroup( - new SimpleGroup( - [new SimpleObject(oBerryBush, 5, 5, 0, 3)], - true, - clBaseResource, - Math.round(fx + bbDist * Math.cos(bbAngle)), - Math.round(fz + bbDist * Math.sin(bbAngle))), - 0); - - // Create metal mine - let mAngle = bbAngle; - while (Math.abs(mAngle - bbAngle) < Math.PI / 3) - mAngle = randFloat(0, 2 * PI); - - let mDist = radius - 4; - createObjectGroup( - new SimpleGroup( - [new SimpleObject(oMetalLarge, 1, 1, 0, 0)], - true, - clBaseResource, - Math.round(fx + mDist * Math.cos(mAngle)), - Math.round(fz + mDist * Math.sin(mAngle))), - 0); - - // Create stone mine - mAngle += randFloat(PI/8, PI/4); - createObjectGroup( - new SimpleGroup( - [new SimpleObject(oStoneLarge, 1, 1, 0, 2)], - true, - clBaseResource, - Math.round(fx + mDist * Math.cos(mAngle)), - Math.round(fz + mDist * Math.sin(mAngle))), - 0); - - // Create starting trees - let hillSize = PI * radius * radius; - let num = Math.floor(hillSize / 100); - let tAngle = randFloat(-PI/3, 4 * PI/3); - let tDist = 12; - createObjectGroup( - new SimpleGroup( - [new SimpleObject(oBaobab, num, num, 0, 5)], - false, - clBaseResource, - Math.round(fx + tDist * Math.cos(tAngle)), - Math.round(fz + tDist * Math.sin(tAngle))), - 0, - avoidClasses(clBaseResource, 2)); - - // Create grass tufts - num = hillSize / 250; - for (let j = 0; j < num; ++j) - { - let gAngle = randFloat(0, 2 * PI); - let gDist = radius - randIntInclusive(5, 11); - createObjectGroup( - new SimpleGroup( - [new SimpleObject(aGrassShort, 2, 5, 0, 1, -PI/8, PI/8)], - false, - clBaseResource, - Math.round(fx + gDist * Math.cos(gAngle)), - Math.round(fz + gDist * Math.sin(gAngle))), - 0); +placePlayerBases({ + "PlayerPlacement": playerPlacementCircle(0.35), + "PlayerTileClass": clPlayer, + "BaseResourceClass": clBaseResource, + "CityPatch": { + "outerTerrain": tCityTile, + "innerTerrain": tCityTile + }, + "Chicken": { + }, + "Berries": { + "template": oBerryBush + }, + "Mines": { + "types": [ + { "template": oMetalLarge }, + { "template": oStoneLarge } + ] + }, + "Trees": { + "template": oBaobab + }, + "Decoratives": { + "template": aGrassShort } -} +}); Engine.SetProgress(15); log("Creating bumps..."); diff --git a/binaries/data/mods/public/maps/random/caledonian_meadows.js b/binaries/data/mods/public/maps/random/caledonian_meadows.js index 8b5feee78d..a8c6e4a606 100644 --- a/binaries/data/mods/public/maps/random/caledonian_meadows.js +++ b/binaries/data/mods/public/maps/random/caledonian_meadows.js @@ -456,7 +456,7 @@ Engine.SetProgress(80); for (let p = 0; p < playerIDs.length; ++p) { let point = startLocations[p]; - placeCivDefaultEntities(point.x, point.y, playerIDs[p], { "iberWall": true }); + placeCivDefaultStartingEntities(point.x, point.y, playerIDs[p], "walls"); placeStartLocationResources(startLocations[p]); } diff --git a/binaries/data/mods/public/maps/random/cantabrian_highlands.js b/binaries/data/mods/public/maps/random/cantabrian_highlands.js index f1746bf48f..f55865beec 100644 --- a/binaries/data/mods/public/maps/random/cantabrian_highlands.js +++ b/binaries/data/mods/public/maps/random/cantabrian_highlands.js @@ -57,10 +57,10 @@ var clMetal = createTileClass(); var clFood = createTileClass(); var clBaseResource = createTileClass(); -var playerHillRadius = scaleByMapSize(15, 25); +var playerHillRadius = defaultPlayerBaseRadius(); var playerHillElevation = 20; -var [playerIDs, playerX, playerZ, playerAngle] = radialPlayerPlacement(); +var [playerIDs, playerX, playerZ, playerAngle] = playerPlacementCircle(0.35); log("Creating player hills and ramps..."); for (let i = 0; i < numPlayers; ++i) @@ -87,78 +87,34 @@ for (let i = 0; i < numPlayers; ++i) }); } -for (var i = 0; i < numPlayers; i++) -{ - var id = playerIDs[i]; - log("Creating base for player " + id + "..."); - - var radius = playerHillRadius; - - // get the x and z in tiles - var fx = fractionToTiles(playerX[i]); - var fz = fractionToTiles(playerZ[i]); - var ix = Math.round(fx); - var iz = Math.round(fz); - - // 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); - - placeCivDefaultEntities(fx, fz, id, { 'iberWall': false }); - - placeDefaultChicken(fx, fz, clBaseResource); - - // create berry bushes - var bbAngle = randFloat(0, 2 * Math.PI); - var bbDist = 12; - var bbX = Math.round(fx + bbDist * cos(bbAngle)); - var bbZ = Math.round(fz + bbDist * sin(bbAngle)); - var group = new SimpleGroup( - [new SimpleObject(oBerryBush, 5,5, 0,3)], - true, clBaseResource, bbX, bbZ - ); - createObjectGroup(group, 0); - - // create metal mine - var mAngle = bbAngle; - while (Math.abs(mAngle - bbAngle) < Math.PI / 3) - mAngle = randFloat(0, 2 * Math.PI); - - var mDist = 12; - var mX = Math.round(fx + mDist * cos(mAngle)); - var mZ = Math.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 = Math.round(fx + mDist * cos(mAngle)); - mZ = Math.round(fz + mDist * sin(mAngle)); - group = new SimpleGroup( - [new SimpleObject(oStoneLarge, 1,1, 0,2)], - true, clBaseResource, mX, mZ - ); - createObjectGroup(group, 0); - - // create starting trees - var num = 2; - var tAngle = randFloat(-PI/3, 4*PI/3); - var tDist = randFloat(11, 13); - var tX = Math.round(fx + tDist * cos(tAngle)); - var tZ = Math.round(fz + tDist * sin(tAngle)); - group = new SimpleGroup( - [new SimpleObject(oOak, num, num, 0,5)], - false, clBaseResource, tX, tZ - ); - createObjectGroup(group, 0, avoidClasses(clBaseResource,2)); - - placeDefaultDecoratives(fx, fz, aGrassShort, clBaseResource, radius); -} +placePlayerBases({ + "PlayerPlacement": [playerIDs, playerX, playerZ], + "PlayerTileClass": clPlayer, + "BaseResourceClass": clBaseResource, + "Walls": false, + "CityPatch": { + "outerTerrain": tRoadWild, + "innerTerrain": tRoad + }, + "Chicken": { + }, + "Berries": { + "template": oBerryBush + }, + "Mines": { + "types": [ + { "template": oMetalLarge }, + { "template": oStoneLarge } + ] + }, + "Trees": { + "template": oOak, + "count": 2 + }, + "Decoratives": { + "template": aGrassShort + } +}); Engine.SetProgress(10); log("Creating lakes..."); diff --git a/binaries/data/mods/public/maps/random/canyon.js b/binaries/data/mods/public/maps/random/canyon.js index 3fc86d197e..b749d95023 100644 --- a/binaries/data/mods/public/maps/random/canyon.js +++ b/binaries/data/mods/public/maps/random/canyon.js @@ -64,7 +64,7 @@ var playerCanyonRadius = scaleByMapSize(18, 32); initTerrain(tMainTerrain); -var [playerIDs, playerX, playerZ] = radialPlayerPlacement(); +var [playerIDs, playerX, playerZ] = playerPlacementCircle(0.35); log("Reserving space for the players, their initial forests and some less space therein without trees..."); for (let i = 0; i < numPlayers; ++i) @@ -84,72 +84,6 @@ for (let i = 0; i < numPlayers; ++i) ], null); -var radius = playerCanyonRadius; -for (var i = 0; i < numPlayers; i++) -{ - var id = playerIDs[i]; - log("Creating base for player " + id + "..."); - - var fx = fractionToTiles(playerX[i]); - var fz = fractionToTiles(playerZ[i]); - var ix = Math.round(fx); - var iz = Math.round(fz); - - placeCivDefaultEntities(fx, fz, id); - - placeDefaultChicken(fx, fz, clBaseResource); - - // create berry bushes - var bbAngle = randFloat(0, 2 * Math.PI); - var bbDist = 12; - var bbX = Math.round(fx + bbDist * cos(bbAngle)); - var bbZ = Math.round(fz + bbDist * sin(bbAngle)); - var group = new SimpleGroup( - [new SimpleObject(oFruitBush, 5,5, 0,3)], - true, clBaseResource, bbX, bbZ - ); - createObjectGroup(group, 0); - - // create metal mine - var mAngle = bbAngle; - while (Math.abs(mAngle - bbAngle) < Math.PI / 3) - { - mAngle = randFloat(0, 2 * Math.PI); - } - var mDist = 11; - var mX = Math.round(fx + mDist * cos(mAngle)); - var mZ = Math.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 = Math.round(fx + mDist * cos(mAngle)); - mZ = Math.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 = Math.floor(hillSize / 100); - var tAngle = randFloat(-PI/3, 4*PI/3); - var tDist = 12; - var tX = Math.round(fx + tDist * cos(tAngle)); - var tZ = Math.round(fz + tDist * sin(tAngle)); - group = new SimpleGroup( - [new SimpleObject(oTree1, num, num, 0,4)], - false, clBaseResource, tX, tZ - ); - createObjectGroup(group, 0, avoidClasses(clBaseResource,2)); - - placeDefaultDecoratives(fx, fz, aGrassShort, clBaseResource, radius); -} - log("Creating center area..."); var center = Math.round(fractionToTiles(0.5)); var lSize = Math.pow(scaleByMapSize(1, 6), 1/8); @@ -251,12 +185,6 @@ for (let g = 0; g < scaleByMapSize(5, 30); ++g) for (let i = 0; i < numPlayers; ++i) { - // create the city patch - var cityRadius = radius/3; - var placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, fractionToTiles(playerX[i]), fractionToTiles(playerZ[i])); - var painter = new LayeredPainter([tRoad, tRoad], [1]); - createArea(placer, [painter, paintClass(clPlayer)], null); - log("Creating path from player to center and to neighbor..."); let neighbor = i + 1 < numPlayers ? i + 1 : 0; for (let [x, z] of [[playerX[neighbor], playerZ[neighbor]], [0.5, 0.5]]) @@ -280,11 +208,40 @@ for (let i = 0; i < numPlayers; ++i) null); } +log("Painting center place..."); createArea( new ClumpPlacer(150, 0.6, 0.3, 10, center, center), new LayeredPainter([tRoad, tRoad], [1]), null); +placePlayerBases({ + "PlayerPlacement": [playerIDs, playerX, playerZ], + // PlayerTileClass already marked above + "BaseResourceClass": clBaseResource, + "CityPatch": { + "outerTerrain": tRoad, + "innerTerrain": tRoad, + "radius": playerCanyonRadius / 3 + }, + "Chicken": { + }, + "Berries": { + "template": oFruitBush + }, + "Mines": { + "types": [ + { "template": oMetalLarge }, + { "template": oStoneLarge } + ], + "distance": 11 + }, + "Trees": { + "template": oTree1 + }, + "Decoratives": { + "template": aGrassShort + } +}); Engine.SetProgress(20); paintTerrainBasedOnHeight(3.1, 29, 0, tCliff); diff --git a/binaries/data/mods/public/maps/random/continent.js b/binaries/data/mods/public/maps/random/continent.js index a96ed5f278..8e14983cf9 100644 --- a/binaries/data/mods/public/maps/random/continent.js +++ b/binaries/data/mods/public/maps/random/continent.js @@ -72,7 +72,7 @@ createArea( ], null); -var [playerIDs, playerX, playerZ] = radialPlayerPlacement(0.25); +var [playerIDs, playerX, playerZ] = playerPlacementCircle(0.25); log("Ensuring initial player land..."); for (let i = 0; i < numPlayers; ++i) @@ -91,96 +91,40 @@ for (let i = 0; i < numPlayers; ++i) paintClass(clLand) ]); -for (var i = 0; i < numPlayers; i++) -{ - var id = playerIDs[i]; - log("Creating base for player " + id + "..."); - - var radius = scaleByMapSize(15,25); - var cliffRadius = 2; - var elevation = 20; - - // get the x and z in tiles - fx = fractionToTiles(playerX[i]); - fz = fractionToTiles(playerZ[i]); - ix = Math.round(fx); - iz = Math.round(fz); - addCivicCenterAreaToClass(ix, iz, clPlayer); - - placeCivDefaultEntities(fx, fz, id); - - placeDefaultChicken(fx, fz, clBaseResource); - - // create berry bushes - var bbAngle = randFloat(0, 2 * Math.PI); - var bbDist = 12; - var bbX = Math.round(fx + bbDist * cos(bbAngle)); - var bbZ = Math.round(fz + bbDist * sin(bbAngle)); - var group = new SimpleGroup( - [new SimpleObject(oFruitBush, 5,5, 0,3)], - true, clBaseResource, bbX, bbZ - ); - createObjectGroup(group, 0); - - // create metal mine - var mAngle = bbAngle; - while (Math.abs(mAngle - bbAngle) < Math.PI / 3) - { - mAngle = randFloat(0, 2 * Math.PI); - } - var mDist = 12; - var mX = Math.round(fx + mDist * cos(mAngle)); - var mZ = Math.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 = Math.round(fx + mDist * cos(mAngle)); - mZ = Math.round(fz + mDist * sin(mAngle)); - group = new SimpleGroup( - [new SimpleObject(oStoneLarge, 1,1, 0,2)], - true, clBaseResource, mX, mZ - ); - createObjectGroup(group, 0); - - // create starting trees - var num = 2; - var tAngle = randFloat(0, 2 * Math.PI); - var tDist = randFloat(12, 13); - var tX = Math.round(fx + tDist * cos(tAngle)); - var tZ = Math.round(fz + tDist * sin(tAngle)); - group = new SimpleGroup( - [new SimpleObject(oTree1, num, num, 0,3)], - false, clBaseResource, tX, tZ - ); - createObjectGroup(group, 0, avoidClasses(clBaseResource,2)); - - placeDefaultDecoratives(fx, fz, aGrassShort, clBaseResource, radius); -} - Engine.SetProgress(20); paintTerrainBasedOnHeight(3, 4, 3, tMainTerrain); paintTerrainBasedOnHeight(1, 3, 0, tShore); paintTerrainBasedOnHeight(-8, 1, 2, tWater); -for (var i = 0; i < numPlayers; ++i) -{ - var fx = fractionToTiles(playerX[i]); - var fz = fractionToTiles(playerZ[i]); - var ix = Math.round(fx); - var iz = Math.round(fz); - - // 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); -} +placePlayerBases({ + "PlayerPlacement": [playerIDs, playerX, playerZ], + "PlayerTileClass": clPlayer, + "BaseResourceClass": clBaseResource, + "CityPatch": { + "outerTerrain": tRoadWild, + "innerTerrain": tRoad + }, + "Chicken": { + }, + "Berries": { + "template": oFruitBush + }, + "Mines": { + "types": [ + { "template": oMetalLarge }, + { "template": oStoneLarge } + ] + }, + "Trees": { + "template": oTree1, + "count": 2 + }, + "Decoratives": { + "template": aGrassShort + } +}); +Engine.SetProgress(30); createBumps([avoidClasses(clPlayer, 10), stayClasses(clLand, 5)]); diff --git a/binaries/data/mods/public/maps/random/corinthian_isthmus.js b/binaries/data/mods/public/maps/random/corinthian_isthmus.js index 835db4cef9..ef07fe20f2 100644 --- a/binaries/data/mods/public/maps/random/corinthian_isthmus.js +++ b/binaries/data/mods/public/maps/random/corinthian_isthmus.js @@ -102,85 +102,34 @@ paintTerrainBasedOnHeight(2, 5, 1, tGrass); paintTileClassBasedOnHeight(-6, 0.5, 1, clWater); -var [playerIDs, playerX, playerZ] = playerPlacementRiver(riverAngle, 0.6); - -for (var i = 0; i < numPlayers; i++) -{ - var id = playerIDs[i]; - log("Creating base for player " + id + "..."); - - var radius = scaleByMapSize(15,25); - var cliffRadius = 2; - var elevation = 20; - - // get the x and z in tiles - var fx = fractionToTiles(playerX[i]); - var fz = fractionToTiles(playerZ[i]); - var ix = Math.floor(fx); - var iz = Math.floor(fz); - addToClass(ix, iz, clPlayer); - - // 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([tCityPlaza, tCity], [1]); - createArea(placer, painter, null); - - placeCivDefaultEntities(fx, fz, id, { 'iberWall': 'towers' }); - - placeDefaultChicken(fx, fz, clBaseResource); - - // create berry bushes - var bbAngle = randFloat(0, 2 * Math.PI); - var bbDist = 12; - var bbX = Math.round(fx + bbDist * cos(bbAngle)); - var bbZ = Math.round(fz + bbDist * sin(bbAngle)); - var group = new SimpleGroup( - [new SimpleObject(oBerryBush, 5,5, 0,3)], - true, clBaseResource, bbX, bbZ - ); - createObjectGroup(group, 0); - - // create metal mine - var mAngle = bbAngle; - while (Math.abs(mAngle - bbAngle) < Math.PI / 3) - { - mAngle = randFloat(0, 2 * Math.PI); +placePlayerBases({ + "PlayerPlacement": playerPlacementRiver(riverAngle, 0.6), + "PlayerTileClass": clPlayer, + "BaseResourceClass": clBaseResource, + "Walls": "towers", + "CityPatch": { + "outerTerrain": tCityPlaza, + "innerTerrain": tCity + }, + "Chicken": { + }, + "Berries": { + "template": oBerryBush + }, + "Mines": { + "types": [ + { "template": oMetalLarge }, + { "template": oStoneLarge } + ] + }, + "Trees": { + "template": oCarob, + "count": 2 + }, + "Decoratives": { + "template": aBush1 } - var mDist = 12; - var mX = Math.round(fx + mDist * cos(mAngle)); - var mZ = Math.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 = Math.round(fx + mDist * cos(mAngle)); - mZ = Math.round(fz + mDist * sin(mAngle)); - group = new SimpleGroup( - [new SimpleObject(oStoneLarge, 1,1, 0,2)], - true, clBaseResource, mX, mZ - ); - createObjectGroup(group, 0); - - // create starting trees - var num = 2; - var tAngle = randFloat(-PI/3, 4*PI/3); - var tDist = randFloat(11, 13); - var tX = Math.round(fx + tDist * cos(tAngle)); - var tZ = Math.round(fz + tDist * sin(tAngle)); - group = new SimpleGroup( - [new SimpleObject(oCarob, num, num, 0,5)], - false, clBaseResource, tX, tZ - ); - createObjectGroup(group, 0, avoidClasses(clBaseResource,2)); - - placeDefaultDecoratives(fx, fz, aBush1, clBaseResource, radius); -} - +}); Engine.SetProgress(40); createBumps(avoidClasses(clWater, 2, clPlayer, 20)); diff --git a/binaries/data/mods/public/maps/random/corsica.js b/binaries/data/mods/public/maps/random/corsica.js index a23be27c18..bf7bdd7457 100644 --- a/binaries/data/mods/public/maps/random/corsica.js +++ b/binaries/data/mods/public/maps/random/corsica.js @@ -211,68 +211,38 @@ for (let island = 0; island < 2; ++island) { playerAngle[p] = Math.PI * ((i + 0.5) / (2 * playersPerIsland) + island) + swapAngle; let pos = Vector2D.add(islandLocations[island], new Vector2D(radiusPlayer).rotate(-playerAngle[p])); - [playerX[p], playerZ[p]] = [pos.x, pos.y]; + [playerX[p], playerZ[p]] = [tilesToFraction(pos.x), tilesToFraction(pos.y)]; ++p; } } -for (var i = 0; i < numPlayers; i++) -{ - var id = playerIDs[i]; - log("Creating base for player " + id + "..."); - - var radius = 23; - - // get the x and z in tiles - let fx = playerX[i]; - let fz = playerZ[i]; - - // let's create a nice platform - var placer = new ClumpPlacer(PI*radius*radius, 0.95, 0.3, 10, fx,fz); - var PlayerArea = createArea(placer, [paintClass(clPlayer)], null); - - // create the city patch - var cityRadius = radius/4; - placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.8, 0.3, 10, fx, fz); - var painter = new LayeredPainter([tRoadWild,tRoad],[1]); - var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, getHeight(Math.round(fx), Math.round(fz)),10); - createArea(placer, [painter,paintClass(clSettlement),elevationPainter], null); - - placeCivDefaultEntities(fx, fz, id, { 'iberWall': false }); - - placeDefaultChicken(fx, fz, clBaseResource); - - // create berry bushes - var bbAngle = randFloat(0, 2 * PI); - var bbDist = 11; - var bbX = Math.round(fx + bbDist * cos(bbAngle)); - var bbZ = Math.round(fz + bbDist * sin(bbAngle)); - var group = new SimpleGroup( - [new SimpleObject(eBush, 5,5, 1,2)], - true, clBaseResource, bbX, bbZ - ); - createObjectGroup(group, 0); - - // create metal mine - // this makes sure it's created on the same level as the player. - var mAngle = randFloat(playerAngle[i] + PI/2,playerAngle[i] + PI/3); - var mDist = 18; - var mX = Math.round(fx + mDist * cos(mAngle)); - var mZ = Math.round(fz + mDist * sin(mAngle)); - group = new SimpleGroup( - [new SimpleObject(eMetalMine, 1,1, 0,0),new SimpleObject(aBushB, 1,1, 2,2), new SimpleObject(aBushA, 0,2, 1,3), new SimpleObject(ePine, 0,1, 3,3)], true, clBaseResource, mX, mZ ); - createObjectGroup(group, 0); - // create stone mines - mAngle += randFloat(PI/8, PI/5); - mX = Math.round(fx + mDist * cos(mAngle)); - mZ = Math.round(fz + mDist * sin(mAngle)); - group = new SimpleGroup( - [new SimpleObject(eStoneMine, 1,1, 0,2),new SimpleObject(aBushB, 1,1, 2,2), new SimpleObject(aBushA, 0,2, 1,3), new SimpleObject(ePine, 0,1, 3,3)], true, clBaseResource, mX, mZ ); - createObjectGroup(group, 0); - - group = new SimpleGroup([new SimpleObject(ePine, 1,3, 1,4),new SimpleObject(ePalmTall, 0,1, 1,4),new SimpleObject(eFanPalm, 0,1, 0,2)], true, clForest); - createObjectGroupsDeprecated(group, 0, [avoidClasses(clBaseResource,3, clSettlement,0), stayClasses(clPlayer,1)], 150, 1000); -} +placePlayerBases({ + "PlayerPlacement": [sortAllPlayers(), playerX, playerZ], + "PlayerTileClass": clPlayer, + "BaseResourceClass": clBaseResource, + "Walls": false, + "CityPatch": { + "outerTerrain": tRoadWild, + "innerTerrain": tRoad, + "coherence": 0.8, + "radius": 6, + "painters": [ + paintClass(clSettlement) + ] + }, + "Chicken": { + }, + "Berries": { + "template": eBush + }, + "Mines": { + "types": [ + { "template": eMetalMine }, + { "template": eStoneMine } + ] + } + // Sufficient starting trees around, no decoratives +}); Engine.SetProgress(40); log("Creating bumps..."); @@ -426,7 +396,7 @@ createObjectGroupsDeprecated( avoidClasses( clWater, 1, clForest, 0, - clPlayer, 6, + clPlayer, 3, clBaseResource, 4, clPassage, 2, clCliffs, 2) diff --git a/binaries/data/mods/public/maps/random/cycladic_archipelago.js b/binaries/data/mods/public/maps/random/cycladic_archipelago.js index 3e73917a28..2072145ff3 100644 --- a/binaries/data/mods/public/maps/random/cycladic_archipelago.js +++ b/binaries/data/mods/public/maps/random/cycladic_archipelago.js @@ -61,8 +61,6 @@ var clMetal = createTileClass(); var clFood = createTileClass(); var clBaseResource = createTileClass(); -var playerIDs = sortAllPlayers(); - //array holding starting islands based on number of players var startingPlaces=[[0],[0,3],[0,2,4],[0,1,3,4],[0,1,2,3,4],[0,1,2,3,4,5]]; @@ -138,84 +136,36 @@ for (let i = 0; i < nCenter; ++i) 2); } -for (let i = 0; i < numPlayers; ++i) -{ - let fx = fractionToTiles(playerX[i]); - let fz = fractionToTiles(playerZ[i]); - - placeDefaultChicken(fx, fz, clBaseResource); - - // create berry bushes - var bbAngle = randFloat(0, 2 * Math.PI); - var bbDist = 10; - var bbX = Math.round(fx + bbDist * cos(bbAngle)); - var bbZ = Math.round(fz + bbDist * sin(bbAngle)); - var group = new SimpleGroup( - [new SimpleObject(oBerryBush, 5,5, 0,3)], - true, clBaseResource, bbX, bbZ - ); - createObjectGroup(group, 0); - - // create metal mine - var mAngle = bbAngle; - while (Math.abs(mAngle - bbAngle) < Math.PI / 3) - mAngle = randFloat(0, 2 * Math.PI); - - var mDist = 12; - var mX = Math.round(fx + mDist * cos(mAngle)); - var mZ = Math.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 = Math.round(fx + mDist * cos(mAngle)); - mZ = Math.round(fz + mDist * sin(mAngle)); - group = new SimpleGroup( - [new SimpleObject(oStoneLarge, 1,1, 0,2)], - true, clBaseResource, mX, mZ - ); - createObjectGroup(group, 0); - - // create starting trees - var num = 2; - var tAngle = randFloat(-PI/3, 4*PI/3); - var tDist = randFloat(12, 13); - var tX = Math.round(fx + tDist * cos(tAngle)); - var tZ = Math.round(fz + tDist * sin(tAngle)); - group = new SimpleGroup( - [new SimpleObject(oPalm, num, num, 0,3)], - false, clBaseResource, tX, tZ - ); - createObjectGroup(group, 0, avoidClasses(clBaseResource,2)); -} - -log("Populating islands ..."); -var nPlayer = 0; -for (let i = 0; i < numIslands; ++i) - if (numPlayers >= 6 || i == startingPlaces[numPlayers-1][nPlayer]) - { - var id = playerIDs[nPlayer]; - - // Get the x and z in tiles - var fx = fractionToTiles(islandX[i]); - var fz = fractionToTiles(islandZ[i]); - var ix = Math.round(fx); - var iz = Math.round(fz); - - // Create city patch - var cityRadius = 6; - var placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz); - var painter = new LayeredPainter([tGrass, tCity], [1]); - createArea(placer, [painter,paintClass(clCity)], null); - - placeCivDefaultEntities(fx, fz, id, { 'iberWall': 'towers' }); - - ++nPlayer; +placePlayerBases({ + "PlayerPlacement": [sortAllPlayers(), playerX, playerZ], + // PlayerTileClass is clCity here and painted below + "BaseResourceClass": clBaseResource, + "Walls": "towers", + "CityPatch": { + "radius": 6, + "outerTerrain": tGrass, + "innerTerrain": tCity, + "painters": [ + paintClass(clCity) + ] + }, + "Chicken": { + }, + "Berries": { + "template": oBerryBush + }, + "Mines": { + "types": [ + { "template": oMetalLarge }, + { "template": oStoneLarge } + ] + }, + "Trees": { + "template": oPalm, + "count": 2 } + // No decoratives +}); Engine.SetProgress(20); log("Creating bumps..."); @@ -269,7 +219,7 @@ for (let type of forestTypes) Engine.SetProgress(42); log("Creating stone mines..."); -group = new SimpleGroup([new SimpleObject(oStoneSmall, 0,2, 0,4), new SimpleObject(oStoneLarge, 1,1, 0,4)], true, clRock); +var group = new SimpleGroup([new SimpleObject(oStoneSmall, 0,2, 0,4), new SimpleObject(oStoneLarge, 1,1, 0,4)], true, clRock); createObjectGroupsByAreasDeprecated(group, 0, [avoidClasses(clWater, 1, clForest, 1, clHill, 1, clPlayer, 5, clRock, 6)], scaleByMapSize(4,16), 200, areas diff --git a/binaries/data/mods/public/maps/random/danubius.js b/binaries/data/mods/public/maps/random/danubius.js index 9f025723cb..f6ad088df0 100644 --- a/binaries/data/mods/public/maps/random/danubius.js +++ b/binaries/data/mods/public/maps/random/danubius.js @@ -314,87 +314,37 @@ if (gallicCC) } Engine.SetProgress(10); -var [playerIDs, playerX, playerZ] = playerPlacementRiver(0, 0.6); - -for (let i = 0; i < numPlayers; ++i) -{ - let id = playerIDs[i]; - log("Creating base for player " + id + "..."); - - let radius = scaleByMapSize(15, 25); - - let fx = fractionToTiles(playerX[i]); - let fz = fractionToTiles(playerZ[i]); - let ix = Math.floor(fx); - let iz = Math.floor(fz); - addToClass(ix, iz, clPlayer); - - // Create the city patch - let cityRadius = radius / 3; - createArea( - new ClumpPlacer(PI * cityRadius * cityRadius, 0.6, 0.3, 10, ix, iz), - new LayeredPainter([tShore, tRoad], [1]), - null); - - placeCivDefaultEntities(fx, fz, id, { 'iberWall': false }); - - placeDefaultChicken(fx, fz, clBaseResource); - - // Create berry bushes - let angle = randFloat(0, 2 * PI); - let dist = 10; - createObjectGroup( - new SimpleGroup( - [new SimpleObject(oBerryBush, 5, 5, 0, 3)], - true, - clBaseResource, - Math.round(fx + dist * Math.cos(angle)), - Math.round(fz + dist * Math.sin(angle)) - ), - 0); - - // Create metal mine - dist = scaleByMapSize(9, 14); - angle += randFloat(PI/4, PI/3); - createObjectGroup( - new SimpleGroup( - [new SimpleObject(oMetalLarge, 1, 1, 0, 0)], - true, - clBaseResource, - Math.round(fx + dist * Math.cos(angle)), - Math.round(fz + dist * Math.sin(angle)) - ), - 0); - - // Create stone mines - angle += randFloat(PI/3, PI/2); - createObjectGroup( - new SimpleGroup( - [new SimpleObject(oStoneLarge, 1, 1, 0, 2)], - true, - clBaseResource, - Math.round(fx + dist * Math.cos(angle)), - Math.round(fz + dist * Math.sin(angle)) - ), - 0); - - // Create starting trees - let num = 20; - angle += randFloat(-PI/3, PI * 4/3); - dist = randFloat(10, 14); - createObjectGroup( - new SimpleGroup( - [new SimpleObject(oOak, num, num, 0, 5)], - false, - clBaseResource, - Math.round(fx + dist * Math.cos(angle)), - Math.round(fz + dist * Math.sin(angle)) - ), - 0, - avoidClasses(clBaseResource, 4)); - - placeDefaultDecoratives(fx, fz, aBush1, clBaseResource, radius); -} +placePlayerBases({ + "PlayerPlacement": playerPlacementRiver(0, 0.6), + "PlayerTileClass": clPlayer, + "BaseResourceClass": clBaseResource, + "Walls": false, + "CityPatch": { + "outerTerrain": tShore, + "innerTerrain": tRoad + }, + "Chicken": { + }, + "Berries": { + "template": aBush1 + }, + "Mines": { + "types": [ + { "template": oMetalLarge }, + { "template": oStoneLarge } + ], + "distance": scaleByMapSize(9, 14) + }, + "Trees": { + "template": oOak, + "count": 20, + "minDist": 10, + "maxDist": 14 + }, + "Decoratives": { + "template": aBush1 + } +}); Engine.SetProgress(20); paintRiver({ diff --git a/binaries/data/mods/public/maps/random/deep_forest.js b/binaries/data/mods/public/maps/random/deep_forest.js index 42d5100b4a..a4a4907fae 100644 --- a/binaries/data/mods/public/maps/random/deep_forest.js +++ b/binaries/data/mods/public/maps/random/deep_forest.js @@ -11,8 +11,6 @@ var clBaseResource = createTileClass(); var templateStone = "gaia/geology_stone_temperate"; var templateStoneMine = "gaia/geology_stonemine_temperate_quarry"; var templateMetalMine = "gaia/geology_metal_temperate_slabs"; -var startingResourcees = ["gaia/flora_tree_oak_large", "gaia/flora_bush_temperate", templateStoneMine, - "gaia/flora_bush_grapes", "gaia/flora_tree_apple", "gaia/flora_bush_berry", templateMetalMine, "gaia/flora_bush_badlands"]; var terrainWood = ['temp_grass_mossy|gaia/flora_tree_oak', 'temp_forestfloor_pine|gaia/flora_tree_pine', 'temp_mud_plants|gaia/flora_tree_dead', 'temp_plants_bog|gaia/flora_tree_oak_large', "temp_dirt_gravel_plants|gaia/flora_tree_aleppo_pine", 'temp_forestfloor_autumn|gaia/flora_tree_carob']; //'temp_forestfloor_autumn|gaia/flora_tree_fig' @@ -71,38 +69,49 @@ var resourcePerPlayer = [templateStone, templateMetalMine]; var maxTreeDensity = Math.min(256 * (192 + 8 * numPlayers) / mapArea, 1); // Has to be tweeked but works ok var bushChance = 1/3; // 1 means 50% chance in deepest wood, 0.5 means 25% chance in deepest wood -Engine.SetProgress(2); - -// Place bases +var playerIDs = []; for (var i=0; i < numPlayers; i++) { + playerIDs[i] = i+1; playerAngle[i] = (playerAngleStart + i*playerAngleAddAvrg + randFloat(0, playerAngleMaxOff))%(2*PI); - var x = Math.round(mapCenterX + randFloat(minPlayerRadius, maxPlayerRadius)*cos(playerAngle[i])); - var z = Math.round(mapCenterZ + randFloat(minPlayerRadius, maxPlayerRadius)*sin(playerAngle[i])); - playerStartLocX[i] = x; - playerStartLocZ[i] = z; - - placeCivDefaultEntities(x, z, i+1); - - // Place base texture - var placer = new ClumpPlacer(2*baseRadius*baseRadius, 2/3, 1/8, 10, x, z); - var painter = [new LayeredPainter([terrainBaseBorder, terrainBase, terrainBaseCenter], [baseRadius/4, baseRadius/4]), paintClass(clPlayer)]; - createArea(placer, painter); - - // Place starting resources - var distToSL = 10; - var resStartAngle = playerAngle[i] + PI; - var resAddAngle = 2*PI / startingResourcees.length; - for (var rIndex = 0; rIndex < startingResourcees.length; rIndex++) - { - var angleOff = randFloat(-resAddAngle/2, resAddAngle/2); - var placeX = x + distToSL*cos(resStartAngle + rIndex*resAddAngle + angleOff); - var placeZ = z + distToSL*sin(resStartAngle + rIndex*resAddAngle + angleOff); - placeObject(placeX, placeZ, startingResourcees[rIndex], 0, randFloat(0, 2*PI)); - addToClass(Math.round(placeX), Math.round(placeZ), clBaseResource); - } + playerStartLocX[i] = mapCenterX + Math.round(randFloat(minPlayerRadius, maxPlayerRadius) * Math.cos(playerAngle[i])); + playerStartLocZ[i] = mapCenterZ + Math.round(randFloat(minPlayerRadius, maxPlayerRadius) * Math.sin(playerAngle[i])); } +Engine.SetProgress(10); +placePlayerBases({ + "PlayerPlacement": [playerIDs, playerStartLocX.map(tilesToFraction), playerStartLocZ.map(tilesToFraction)], + "BaseResourceClass": clBaseResource, + // player class painted below + "CityPatch": { + "radius": 0.8 * baseRadius, + "smoothness": 1/8, + "painters": [ + new LayeredPainter([terrainBaseBorder, terrainBase, terrainBaseCenter], [baseRadius/4, baseRadius/4]), + paintClass(clPlayer) + ] + }, + // Chicken already placed at the base terrain + "Berries": { + "template": "gaia/flora_bush_grapes", + "minCount": 2, + "maxCount": 2, + "minDist": 10, + "maxDist": 10 + }, + "Mines": { + "types": [ + { "template": templateMetalMine }, + { "template": templateStoneMine } + ], + "minAngle": Math.PI / 2, + "maxAngle": Math.PI + }, + "Trees": { + "template": "gaia/flora_tree_oak_large", + "count": 2 + } +}); Engine.SetProgress(10); // Place paths diff --git a/binaries/data/mods/public/maps/random/english_channel.js b/binaries/data/mods/public/maps/random/english_channel.js index 6fa120bb77..279fa87947 100644 --- a/binaries/data/mods/public/maps/random/english_channel.js +++ b/binaries/data/mods/public/maps/random/english_channel.js @@ -56,83 +56,33 @@ var clShallow = createTileClass(); var landHeight = 3; var waterHeight = -4; -var [playerIDs, playerX, playerZ] = playerPlacementRiver(Math.PI / 2, 0.6); -for (var i = 0; i < numPlayers; i++) -{ - var id = playerIDs[i]; - log("Creating base for player " + id + "..."); - - var radius = scaleByMapSize(15,25); - var cliffRadius = 2; - var elevation = 20; - - // get the x and z in tiles - var fx = fractionToTiles(playerX[i]); - var fz = fractionToTiles(playerZ[i]); - var ix = Math.round(fx); - var iz = Math.round(fz); - // Setting tile class - addCivicCenterAreaToClass(ix, iz, clPlayer); - - // 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, paintClass(clPlayer)], null); - - placeCivDefaultEntities(fx, fz, id); - - placeDefaultChicken(fx, fz, clBaseResource); - - // create berry bushes - var bbAngle = randFloat(0, 2 * Math.PI); - var bbDist = 12; - var bbX = Math.round(fx + bbDist * cos(bbAngle)); - var bbZ = Math.round(fz + bbDist * sin(bbAngle)); - var group = new SimpleGroup( - [new SimpleObject(oBerryBush, 5,5, 0,3)], - true, clBaseResource, bbX, bbZ - ); - createObjectGroup(group, 0); - - // create metal mine - var mAngle = bbAngle; - while (Math.abs(mAngle - bbAngle) < Math.PI / 3) - mAngle = randFloat(0, 2 * Math.PI); - - var mDist = 12; - var mX = Math.round(fx + mDist * cos(mAngle)); - var mZ = Math.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 = Math.round(fx + mDist * cos(mAngle)); - mZ = Math.round(fz + mDist * sin(mAngle)); - group = new SimpleGroup( - [new SimpleObject(oStoneLarge, 1,1, 0,2)], - true, clBaseResource, mX, mZ - ); - createObjectGroup(group, 0); - - // create starting trees - var num = 2; - var tAngle = randFloat(-PI/3, 4*PI/3); - var tDist = randFloat(11, 13); - var tX = Math.round(fx + tDist * cos(tAngle)); - var tZ = Math.round(fz + tDist * sin(tAngle)); - group = new SimpleGroup( - [new SimpleObject(oOak, num, num, 0,5)], - false, clBaseResource, tX, tZ - ); - createObjectGroup(group, 0, avoidClasses(clBaseResource,2)); - - placeDefaultDecoratives(fx, fz, aGrassShort, clBaseResource, radius); -} +placePlayerBases({ + "PlayerPlacement": playerPlacementRiver(Math.PI / 2, 0.6), + "PlayerTileClass": clPlayer, + "BaseResourceClass": clBaseResource, + "CityPatch": { + "outerTerrain": tRoadWild, + "innerTerrain": tRoad + }, + "Chicken": { + }, + "Berries": { + "template": oBerryBush + }, + "Mines": { + "types": [ + { "template": oMetalLarge }, + { "template": oStoneLarge } + ] + }, + "Trees": { + "template": oOak, + "count": 2 + }, + "Decoratives": { + "template": aGrassShort + } +}); Engine.SetProgress(10); paintRiver({ diff --git a/binaries/data/mods/public/maps/random/extinct_volcano.js b/binaries/data/mods/public/maps/random/extinct_volcano.js index 67410a3239..71133a6396 100644 --- a/binaries/data/mods/public/maps/random/extinct_volcano.js +++ b/binaries/data/mods/public/maps/random/extinct_volcano.js @@ -71,9 +71,9 @@ var clTower = createTileClass(); var clRain = createTileClass(); var ccMountainHeight = 25; -var ccMountainSize = scaleByMapSize(15, 25); +var ccMountainSize = defaultPlayerBaseRadius(); -var [playerIDs, playerX, playerZ] = radialPlayerPlacement(); +var [playerIDs, playerX, playerZ] = playerPlacementCircle(0.35); log("Creating CC mountains..."); for (let i = 0; i < numPlayers; ++i) @@ -96,7 +96,7 @@ for (let i = 0; i < numPlayers; ++i) // Flatten the initial CC area createArea( - new ClumpPlacer(diskArea(scaleByMapSize(15, 25)), 0.95, 0.6, 10, ix, iz), + new ClumpPlacer(diskArea(ccMountainSize), 0.95, 0.6, 10, ix, iz), [ new LayeredPainter([tHillVeryDark, tHillMedium1], [ccMountainSize]), new SmoothElevationPainter(ELEVATION_SET, ccMountainHeight, ccMountainSize), @@ -104,81 +104,33 @@ for (let i = 0; i < numPlayers; ++i) ], null); } +Engine.SetProgress(8); -for (let i = 0; i < numPlayers; ++i) -{ - let id = playerIDs[i]; - log("Creating base for player " + id + "..."); - - let fx = fractionToTiles(playerX[i]); - let fz = fractionToTiles(playerZ[i]); - - // Create the city patch - createArea( - new ClumpPlacer(diskArea(ccMountainSize / 3), 0.6, 0.3, 10, Math.round(fx), Math.round(fz)), - new LayeredPainter([tRoadWild, tRoad], [1]), - null); - - placeCivDefaultEntities(fx, fz, id, { 'iberWall': 'towers' }); - - // Create metal mine - let mAngle = randFloat(0, 2 * PI); - let mDist = 12; - createObjectGroup( - new SimpleGroup( - [new SimpleObject(oMetalLarge, 1, 1, 0, 0)], - true, - clBaseResource, - Math.round(fx + mDist * Math.cos(mAngle)), - Math.round(fz + mDist * Math.sin(mAngle))), - 0); - - // Create stone mines - mAngle += randFloat(PI/4, PI/3); - createObjectGroup( - new SimpleGroup( - [new SimpleObject(oStoneLarge, 1, 1, 0, 2)], - true, - clBaseResource, - Math.round(fx + mDist * Math.cos(mAngle)), - Math.round(fz + mDist * Math.sin(mAngle))), - 0); - - placeDefaultChicken(fx, fz, clBaseResource); - - // Create berry bushes - mAngle += randFloat(PI/4, PI/2); - let bbDist = 12; - createObjectGroup( - new SimpleGroup( - [new SimpleObject(oFruitBush, 5, 5, 0, 3)], - true, - clBaseResource, - Math.round(fx + bbDist * Math.cos(mAngle)), - Math.round(fz + bbDist * Math.sin(mAngle))), - 0); - - // Create starting trees - let num = Math.floor(diskArea(ccMountainSize) / 60); - let tries = 20; - for (let x = 0; x < tries; ++x) - { - let tAngle = randFloat(0, 2 * PI); - let tDist = randFloat(10, 12); - if (createObjectGroup( - new SimpleGroup( - [new SimpleObject(oTree2, num, num, 0, 3)], - false, - clBaseResource, - Math.round(fx + tDist * Math.cos(tAngle)), - Math.round(fz + tDist * Math.sin(tAngle))), - 0, - avoidClasses(clBaseResource, 3))) - { - break; - } +placePlayerBases({ + "PlayerPlacement": [playerIDs, playerX, playerZ], + // PlayerTileClass already marked above + "BaseResourceClass": clBaseResource, + "Walls": "towers", + "CityPatch": { + "outerTerrain": tRoadWild, + "innerTerrain": tRoad + }, + "Chicken": { + }, + "Berries": { + "template": oFruitBush + }, + "Mines": { + "types": [ + { "template": oMetalLarge }, + { "template": oStoneLarge } + ] + }, + "Trees": { + "template": oTree2 } -} + // No decoratives +}); Engine.SetProgress(15); createVolcano(0.5, 0.5, clHill, tHillVeryDark, undefined, false, ELEVATION_SET); diff --git a/binaries/data/mods/public/maps/random/flood.js b/binaries/data/mods/public/maps/random/flood.js index 3255737a09..f1377fe45b 100644 --- a/binaries/data/mods/public/maps/random/flood.js +++ b/binaries/data/mods/public/maps/random/flood.js @@ -48,7 +48,6 @@ const pForest2 = [tForestFloor1 + TERRAIN_SEPARATOR + oTree4, tForestFloor1 + TE InitMap(); -const radius = scaleByMapSize(15, 25); const clPlayer = createTileClass(); const clHill = createTileClass(); const clMountain = createTileClass(); @@ -80,25 +79,13 @@ createArea( ], avoidClasses(clPlayer, 5)); -var [playerIDs, playerX, playerZ] = radialPlayerPlacement(0.38); - log("Creating player islands...") +var [playerIDs, playerX, playerZ] = playerPlacementCircle(0.38); + for (let i = 0; i < numPlayers; ++i) -{ - let id = playerIDs[i]; - log("Creating base for player " + id + "..."); - - // Get the x and z in tiles - let fx = fractionToTiles(playerX[i]); - let fz = fractionToTiles(playerZ[i]); - let ix = Math.round(fx); - let iz = Math.round(fz); - - let hillSize = PI * radius * radius * 2; - createArea( new ClumpPlacer( - hillSize, + 2 * diskArea(defaultPlayerBaseRadius()), 0.8, 0.1, 10, @@ -111,73 +98,36 @@ for (let i = 0; i < numPlayers; ++i) ], null); - addCivicCenterAreaToClass(ix, iz, clPlayer); - - placeCivDefaultEntities(fx, fz, id, { "iberWall": false }); - - // Create the city patch - let cityRadius = radius/3; - let placer = new ClumpPlacer(PI * cityRadius * cityRadius, 0.6, 0.3, 10, ix, iz); - let painter = new LayeredPainter([tRoadWild, tRoad], [1]); - createArea(placer, painter, null); - - placeDefaultChicken(fx, fz, clBaseResource); - - // Create berry bushes - let bbAngle = randFloat(0, 2 * Math.PI); - let bbDist = 12; - let bbX = Math.round(fx + bbDist * cos(bbAngle)); - let bbZ = Math.round(fz + bbDist * sin(bbAngle)); - let group = new SimpleGroup( - [new SimpleObject(oFruitBush, 5, 5, 0, 3)], - true, clBaseResource, bbX, bbZ - ); - createObjectGroup(group, 0); - - // Create metal mine - let mAngle = bbAngle; - while (Math.abs(mAngle - bbAngle) < Math.PI / 3) - mAngle = randFloat(0, 2 * Math.PI); - - let mDist = 12; - let mX = Math.round(fx + mDist * cos(mAngle)); - let mZ = Math.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 = Math.round(fx + mDist * cos(mAngle)); - mZ = Math.round(fz + mDist * sin(mAngle)); - group = new SimpleGroup( - [new SimpleObject(oStoneLarge, 1, 1, 0, 2)], - true, clBaseResource, mX, mZ - ); - createObjectGroup(group, 0); - - // Create starting trees, should avoid mines and bushes - let tries = 50; - let tDist = 16; - let num = 50; - for (let x = 0; x < tries; ++x) - { - let tAngle = randFloat(0, 2 * Math.PI); - let tX = Math.round(fx + tDist * cos(tAngle)); - let tZ = Math.round(fz + tDist * sin(tAngle)); - group = new SimpleGroup( - [new SimpleObject(oTree2, num, num, 0, 7)], - true, clBaseResource, tX, tZ - ); - if (createObjectGroup(group, 0, avoidClasses(clBaseResource, 5))) - break; +placePlayerBases({ + "PlayerPlacement": [playerIDs, playerX, playerZ], + "PlayerTileClass": clPlayer, + "BaseResourceClass": clBaseResource, + "Walls": false, + "CityPatch": { + "outerTerrain": tRoadWild, + "innerTerrain": tRoad + }, + "Chicken": { + }, + "Berries": { + "template": oFruitBush + }, + "Mines": { + "types": [ + { "template": oMetalLarge }, + { "template": oStoneLarge } + ] + }, + "Trees": { + "template": oTree2, + "count": 50, + "maxDist": 16, + "maxDistGroup": 7 + }, + "Decoratives": { + "template": aGrassShort } - - placeDefaultDecoratives(fx, fz, aGrassShort, clBaseResource, radius); -} - +}); Engine.SetProgress(40); log("Creating central island..."); diff --git a/binaries/data/mods/public/maps/random/fortress.js b/binaries/data/mods/public/maps/random/fortress.js index 743711f8a2..82bb6658a5 100644 --- a/binaries/data/mods/public/maps/random/fortress.js +++ b/binaries/data/mods/public/maps/random/fortress.js @@ -55,7 +55,7 @@ var clMetal = createTileClass(); var clFood = createTileClass(); var clBaseResource = createTileClass(); -var [playerIDs, playerX, playerZ] = radialPlayerPlacement(); +var [playerIDs, playerX, playerZ] = playerPlacementCircle(0.35); for (var i=0; i < numPlayers; i++) { diff --git a/binaries/data/mods/public/maps/random/gear.js b/binaries/data/mods/public/maps/random/gear.js index 472455010d..52a8503233 100644 --- a/binaries/data/mods/public/maps/random/gear.js +++ b/binaries/data/mods/public/maps/random/gear.js @@ -60,86 +60,9 @@ var clBaseResource = createTileClass(); initTerrain(tMainTerrain); -var [playerIDs, playerX, playerZ, playerAngle, startAngle] = radialPlayerPlacement(); - -for (var i = 0; i < numPlayers; i++) -{ - var id = playerIDs[i]; - log("Creating base for player " + id + "..."); - - var radius = scaleByMapSize(15,25); - var cliffRadius = 2; - var elevation = 20; - - // get the x and z in tiles - var fx = fractionToTiles(playerX[i]); - var fz = fractionToTiles(playerZ[i]); - var ix = Math.round(fx); - var iz = Math.round(fz); - addCivicCenterAreaToClass(ix, iz, clPlayer); - - // 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, null); - - placeCivDefaultEntities(fx, fz, id, { 'iberWall': 'towers' }); - - placeDefaultChicken(fx, fz, clBaseResource); - - // create berry bushes - var bbAngle = randFloat(0, 2 * Math.PI); - var bbDist = 12; - var bbX = Math.round(fx + bbDist * cos(bbAngle)); - var bbZ = Math.round(fz + bbDist * sin(bbAngle)); - var group = new SimpleGroup( - [new SimpleObject(oFruitBush, 5,5, 0,3)], - true, clBaseResource, bbX, bbZ - ); - createObjectGroup(group, 0); - - // create metal mine - var mAngle = bbAngle; - while (Math.abs(mAngle - bbAngle) < Math.PI / 3) - mAngle = randFloat(0, 2 * Math.PI); - - var mDist = 12; - var mX = Math.round(fx + mDist * cos(mAngle)); - var mZ = Math.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 = Math.round(fx + mDist * cos(mAngle)); - mZ = Math.round(fz + mDist * sin(mAngle)); - group = new SimpleGroup( - [new SimpleObject(oStoneLarge, 1,1, 0,2)], - true, clBaseResource, mX, mZ - ); - createObjectGroup(group, 0); - - // create starting trees - var num = 2; - var tAngle = randFloat(0, 2 * Math.PI); - var tDist = randFloat(12, 13); - var tX = Math.round(fx + tDist * cos(tAngle)); - var tZ = Math.round(fz + tDist * sin(tAngle)); - group = new SimpleGroup( - [new SimpleObject(oTree1, num, num, 0,3)], - false, clBaseResource, tX, tZ - ); - createObjectGroup(group, 0, avoidClasses(clBaseResource,2)); - - placeDefaultDecoratives(fx, fz, aGrassShort, clBaseResource, radius); -} - -Engine.SetProgress(20); +var [playerIDs, playerX, playerZ, playerAngle, startAngle] = playerPlacementCircle(0.35); +log("Determining number of rivers between players..."); var split = 1; if (mapSize == 128 && numPlayers <= 2) split = 2; @@ -252,19 +175,34 @@ paintTerrainBasedOnHeight(2, 21, 1, tMainTerrain); paintTileClassBasedOnHeight(-6, 0.5, 1, clWater); -for (var i = 0; i < numPlayers; i++) -{ - fx = fractionToTiles(playerX[i]); - fz = fractionToTiles(playerZ[i]); - ix = Math.round(fx); - iz = Math.round(fz); - - // 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); -} +placePlayerBases({ + "PlayerPlacement": [playerIDs, playerX, playerZ], + "PlayerTileClass": clPlayer, + "BaseResourceClass": clBaseResource, + "Walls": "towers", + "CityPatch": { + "outerTerrain": tRoadWild, + "innerTerrain": tRoad + }, + "Chicken": { + }, + "Berries": { + "template": oFruitBush + }, + "Mines": { + "types": [ + { "template": oMetalLarge }, + { "template": oStoneLarge } + ] + }, + "Trees": { + "template": oTree1, + "count": 2 + }, + "Decoratives": { + "template": aGrassShort + } +}); if (randBool()) createHills([tMainTerrain, tCliff, tHill], avoidClasses(clPlayer, 20, clHill, 15, clWater, 2), clHill, scaleByMapSize(1, 4) * numPlayers); diff --git a/binaries/data/mods/public/maps/random/guadalquivir_river.js b/binaries/data/mods/public/maps/random/guadalquivir_river.js index 62b93c3016..a4fb9cb151 100644 --- a/binaries/data/mods/public/maps/random/guadalquivir_river.js +++ b/binaries/data/mods/public/maps/random/guadalquivir_river.js @@ -76,89 +76,38 @@ createArea( ], null); -var playerIDs = primeSortAllPlayers(); -var [playerX, playerZ] = playerPlacementCustomAngle( - 0.35, - continentCenter.x, - continentCenter.y, - i => Math.PI * (-0.46 / numPlayers * (i + i % 2) - (i % 2) / 2)); - -for (var i = 0; i < numPlayers; i++) -{ - var id = playerIDs[i]; - log("Creating base for player " + id + "..."); - - var radius = scaleByMapSize(15,25); - var cliffRadius = 2; - var elevation = 20; - - // get the x and z in tiles - let fx = fractionToTiles(playerX[i]); - let fz = fractionToTiles(playerZ[i]); - let ix = Math.round(fx); - let iz = Math.round(fz); - addCivicCenterAreaToClass(ix, iz, clPlayer); - - // 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); - - placeCivDefaultEntities(fx, fz, id, { 'iberWall': false }); - - placeDefaultChicken(fx, fz, clBaseResource); - - // create berry bushes - var bbAngle = randFloat(0, 2 * Math.PI); - var bbDist = 8; - var bbX = Math.round(fx + bbDist * cos(bbAngle)); - var bbZ = Math.round(fz + bbDist * sin(bbAngle)); - var group = new SimpleGroup( - [new SimpleObject(oBerryBush, 5,5, 0,3)], - true, clBaseResource, bbX, bbZ - ); - createObjectGroup(group, 0); - - // create metal mine - var mAngle = bbAngle; - while (Math.abs(mAngle - bbAngle) < Math.PI / 3) - { - mAngle = randFloat(0, 2 * Math.PI); +placePlayerBases({ + "PlayerPlacement": [primeSortAllPlayers(), ...playerPlacementCustomAngle( + 0.35, + continentCenter.x, + continentCenter.y, + i => Math.PI * (-0.46 / numPlayers * (i + i % 2) - (i % 2) / 2))], + "PlayerTileClass": clPlayer, + "BaseResourceClass": clBaseResource, + "Walls": false, + "CityPatch": { + "outerTerrain": tRoadWild, + "innerTerrain": tRoad + }, + "Chicken": { + }, + "Berries": { + "template": oBerryBush + }, + "Mines": { + "types": [ + { "template": oMetalLarge }, + { "template": oStoneLarge } + ] + }, + "Trees": { + "template": oPoplar, + "count": 2 + }, + "Decoratives": { + "template": aGrassShort } - var mDist = 10; - var mX = Math.round(fx + mDist * cos(mAngle)); - var mZ = Math.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 = Math.round(fx + mDist * cos(mAngle)); - mZ = Math.round(fz + mDist * sin(mAngle)); - group = new SimpleGroup( - [new SimpleObject(oStoneLarge, 1,1, 0,2)], - true, clBaseResource, mX, mZ - ); - createObjectGroup(group, 0); - - // create starting trees - var num = 2; - var tAngle = randFloat(-PI/3, 4*PI/3); - var tDist = randFloat(11, 13); - var tX = Math.round(fx + tDist * cos(tAngle)); - var tZ = Math.round(fz + tDist * sin(tAngle)); - group = new SimpleGroup( - [new SimpleObject(oPoplar, num, num, 0,5)], - false, clBaseResource, tX, tZ - ); - createObjectGroup(group, 0, avoidClasses(clBaseResource,2)); - - placeDefaultDecoratives(fx, fz, aGrassShort, clBaseResource, radius); -} +}); Engine.SetProgress(20); paintRiver({ diff --git a/binaries/data/mods/public/maps/random/gulf_of_bothnia.js b/binaries/data/mods/public/maps/random/gulf_of_bothnia.js index 86f65d074a..48667ced48 100644 --- a/binaries/data/mods/public/maps/random/gulf_of_bothnia.js +++ b/binaries/data/mods/public/maps/random/gulf_of_bothnia.js @@ -129,90 +129,38 @@ var clBaseResource = createTileClass(); initTerrain(tPrimary); var startAngle = -Math.PI / 6; -var playerIDs = sortAllPlayers(); -var [playerX, playerZ] = playerPlacementCustomAngle( - 0.35, - tilesToFraction(mapCenter.x), - tilesToFraction(mapCenter.y), - i => startAngle + 2/3 * Math.PI * (numPlayers == 1 ? 1 : 2 * i / (numPlayers - 1))); -for (var i = 0; i < numPlayers; i++) -{ - var id = playerIDs[i]; - log("Creating base for player " + id + "..."); - - var radius = scaleByMapSize(15,25); - var cliffRadius = 2; - var elevation = 20; - - // get the x and z in tiles - var fx = fractionToTiles(playerX[i]); - var fz = fractionToTiles(playerZ[i]); - var ix = Math.round(fx); - var iz = Math.round(fz); - addCivicCenterAreaToClass(ix, iz, clPlayer); - - // 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); - - placeCivDefaultEntities(fx, fz, id); - - placeDefaultChicken(fx, fz, clBaseResource); - - // create berry bushes - var bbAngle = randFloat(0, 2 * Math.PI); - var bbDist = 12; - var bbX = Math.round(fx + bbDist * cos(bbAngle)); - var bbZ = Math.round(fz + bbDist * sin(bbAngle)); - var group = new SimpleGroup( - [new SimpleObject(oBerryBush, 5,5, 0,3)], - true, clBaseResource, bbX, bbZ - ); - createObjectGroup(group, 0); - - // create metal mine - var mAngle = bbAngle; - while (Math.abs(mAngle - bbAngle) < Math.PI / 3) - { - mAngle = randFloat(0, 2 * Math.PI); +placePlayerBases({ + "PlayerPlacement": [sortAllPlayers(), ...playerPlacementCustomAngle( + 0.35, + tilesToFraction(mapCenter.x), + tilesToFraction(mapCenter.y), + i => startAngle + 2/3 * Math.PI * (numPlayers == 1 ? 1 : 2 * i / (numPlayers - 1)))], + "PlayerTileClass": clPlayer, + "BaseResourceClass": clBaseResource, + "CityPatch": { + "outerTerrain": tRoadWild, + "innerTerrain": tRoad + }, + "Chicken": { + }, + "Berries": { + "template": oBerryBush + }, + "Mines": { + "types": [ + { "template": oMetalLarge }, + { "template": oStoneLarge } + ] + }, + "Trees": { + "template": oPine, + "count": 2 + }, + "Decoratives": { + "template": aGrassShort } - var mDist = 12; - var mX = Math.round(fx + mDist * cos(mAngle)); - var mZ = Math.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 = Math.round(fx + mDist * cos(mAngle)); - mZ = Math.round(fz + mDist * sin(mAngle)); - group = new SimpleGroup( - [new SimpleObject(oStoneLarge, 1,1, 0,2)], - true, clBaseResource, mX, mZ - ); - createObjectGroup(group, 0); - - // create starting trees - var num = 2; - var tAngle = randFloat(-PI/3, 4*PI/3); - var tDist = randFloat(11, 13); - var tX = Math.round(fx + tDist * cos(tAngle)); - var tZ = Math.round(fz + tDist * sin(tAngle)); - group = new SimpleGroup( - [new SimpleObject(oPine, num, num, 0,5)], - false, clBaseResource, tX, tZ - ); - createObjectGroup(group, 0, avoidClasses(clBaseResource,2)); - - placeDefaultDecoratives(fx, fz, aGrassShort, clBaseResource, radius); -} - +}); Engine.SetProgress(20); log("Creating the gulf..."); diff --git a/binaries/data/mods/public/maps/random/hyrcanian_shores.js b/binaries/data/mods/public/maps/random/hyrcanian_shores.js index bcc0da54ab..e717b45fa0 100644 --- a/binaries/data/mods/public/maps/random/hyrcanian_shores.js +++ b/binaries/data/mods/public/maps/random/hyrcanian_shores.js @@ -54,85 +54,33 @@ var clSea = createTileClass(); var clHighlands = createTileClass(); var clFlatlands = createTileClass(); -var playerIDs = sortAllPlayers(); -var [playerIDs, playerX, playerZ] = playerPlacementLine(true, 0.5, 0.2); - -for (var i = 0; i < numPlayers; i++) -{ - var id = playerIDs[i]; - log("Creating base for player " + id + "..."); - - var radius = scaleByMapSize(15,25); - var cliffRadius = 2; - var elevation = 20; - - // get the x and z in tiles - var fx = fractionToTiles(playerX[i]); - var fz = fractionToTiles(playerZ[i]); - var ix = Math.round(fx); - var iz = Math.round(fz); - - addCivicCenterAreaToClass(ix, iz, clPlayer); - - // 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); - - placeCivDefaultEntities(fx, fz, id); - - placeDefaultChicken(fx, fz, clBaseResource); - - // create berry bushes - var bbAngle = randFloat(0, 2 * Math.PI); - var bbDist = 12; - var bbX = Math.round(fx + bbDist * cos(bbAngle)); - var bbZ = Math.round(fz + bbDist * sin(bbAngle)); - var group = new SimpleGroup( - [new SimpleObject(oBerryBush, 5,5, 0,3)], - true, clBaseResource, bbX, bbZ - ); - createObjectGroup(group, 0); - - // create metal mine - var mAngle = bbAngle; - while (Math.abs(mAngle - bbAngle) < Math.PI / 3) - mAngle = randFloat(0, 2 * Math.PI); - - var mDist = 12; - var mX = Math.round(fx + mDist * cos(mAngle)); - var mZ = Math.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 = Math.round(fx + mDist * cos(mAngle)); - mZ = Math.round(fz + mDist * sin(mAngle)); - group = new SimpleGroup( - [new SimpleObject(oStoneLarge, 1,1, 0,2)], - true, clBaseResource, mX, mZ - ); - createObjectGroup(group, 0); - - // create starting trees - var num = 2; - var tAngle = randFloat(-PI/3, 4*PI/3); - var tDist = randFloat(11, 13); - var tX = Math.round(fx + tDist * cos(tAngle)); - var tZ = Math.round(fz + tDist * sin(tAngle)); - group = new SimpleGroup( - [new SimpleObject(oOak, num, num, 0,5)], - false, clBaseResource, tX, tZ - ); - createObjectGroup(group, 0, avoidClasses(clBaseResource,2)); - - placeDefaultDecoratives(fx, fz, aGrassShort, clBaseResource, radius); -} +placePlayerBases({ + "PlayerPlacement": playerPlacementLine(true, 0.5, 0.2), + "PlayerTileClass": clPlayer, + "BaseResourceClass": clBaseResource, + "CityPatch": { + "outerTerrain": tRoadWild, + "innerTerrain": tRoad + }, + "Chicken": { + }, + "Berries": { + "template": oBerryBush + }, + "Mines": { + "types": [ + { "template": oMetalLarge }, + { "template": oStoneLarge } + ] + }, + "Trees": { + "template": oOak, + "count": 2 + }, + "Decoratives": { + "template": aGrassShort + } +}); Engine.SetProgress(10); paintRiver({ @@ -255,7 +203,7 @@ for (let size of [scaleByMapSize(2, 32), scaleByMapSize(3, 48), scaleByMapSize(5 Engine.SetProgress(80); log("Creating stone mines..."); -group = new SimpleGroup([new SimpleObject(oStoneSmall, 0,2, 0,4), new SimpleObject(oStoneLarge, 1,1, 0,4)], true, clRock); +var group = new SimpleGroup([new SimpleObject(oStoneSmall, 0,2, 0,4), new SimpleObject(oStoneLarge, 1,1, 0,4)], true, clRock); createObjectGroupsDeprecated(group, 0, [avoidClasses(clWater, 0, clForest, 1, clPlayer, 20, clRock, 10, clSea, 2, clHill, 2)], scaleByMapSize(4,16), 100 diff --git a/binaries/data/mods/public/maps/random/india.js b/binaries/data/mods/public/maps/random/india.js index 28877025b3..a2446425e5 100644 --- a/binaries/data/mods/public/maps/random/india.js +++ b/binaries/data/mods/public/maps/random/india.js @@ -35,78 +35,38 @@ var clMetal = createTileClass(); var clFood = createTileClass(); var clBaseResource = createTileClass(); -var [playerIDs, playerX, playerZ] = radialPlayerPlacement(); - -for (let i = 0; i < numPlayers; ++i) -{ - let id = playerIDs[i]; - log("Creating base for player " + id + "..."); - - let fx = fractionToTiles(playerX[i]); - let fz = fractionToTiles(playerZ[i]); - let ix = Math.round(fx); - let iz = Math.round(fz); - - addCivicCenterAreaToClass(ix, iz, clPlayer); - - // Create the city patch - let radius = scaleByMapSize(15, 25); - let cityRadius = radius / 3; - createArea( - new ClumpPlacer(PI * cityRadius * cityRadius, 0.6, 0.3, 10, ix, iz), - new LayeredPainter([tDirt1, tCityTiles], [1]), - null); - - placeCivDefaultEntities(fx, fz, id); - placeDefaultChicken(fx, fz, clBaseResource); - - // Create berry bushes - var bbAngle = randFloat(0, 2 * PI); - var bbDist = 12; - var bbX = Math.round(fx + bbDist * Math.cos(bbAngle)); - var bbZ = Math.round(fz + bbDist * Math.sin(bbAngle)); - createObjectGroup( - new SimpleGroup( - [new SimpleObject(oBerryBush, 5,5, 0,3)], - true, clBaseResource, bbX, bbZ - ), - 0); - - // Create metal mine - var mAngle = bbAngle; - while (Math.abs(mAngle - bbAngle) < PI/3) - mAngle = randFloat(0, 2 * PI); - var mDist = 13; - var mX = Math.round(fx + mDist * Math.cos(mAngle)); - var mZ = Math.round(fz + mDist * Math.sin(mAngle)); - createObjectGroup( - new SimpleGroup( - [new SimpleObject(oMetalLarge, 1, 1, 0, 0)], - true, clBaseResource, mX, mZ - ), - 0); - - // Create stone mines - mAngle += randFloat(PI/8, PI/4); - mX = Math.round(fx + mDist * Math.cos(mAngle)); - mZ = Math.round(fz + mDist * Math.sin(mAngle)); - createStoneMineFormation(mX, mZ, oStoneSmall, tDirt4); - addToClass(mX, mZ, clPlayer); - - // Create starting trees - var num = Math.floor(PI * radius * radius / 300); - var tAngle = randFloat(-PI/3, 4 * PI/3); - var tDist = randFloat(13, 15); - var tX = Math.round(fx + tDist * Math.cos(tAngle)); - var tZ = Math.round(fz + tDist * Math.sin(tAngle)); - createObjectGroup( - new SimpleGroup( - [new SimpleObject(oTree, num, num, 4, 6)], - false, clBaseResource, tX, tZ - ), - 0, - avoidClasses(clBaseResource,2)); -} +placePlayerBases({ + "PlayerPlacement": playerPlacementCircle(0.35), + "PlayerTileClass": clPlayer, + "BaseResourceClass": clBaseResource, + // No city patch + "Chicken": { + }, + "Berries": { + "template": oBerryBush + }, + "Mines": { + "types": [ + { + "template": oMetalLarge + }, + { + "type": "stone_formation", + "template": oStoneSmall, + "terrain": tDirt1 + } + ] + }, + "Trees": { + "template": oTree, + "count": scaleByMapSize(3, 7), + "minDist": 13, + "maxDist": 15, + "minDistGroup": 4, + "maxDistGroup": 6 + } + // No decoratives +}); Engine.SetProgress(20); log("Creating bumps..."); diff --git a/binaries/data/mods/public/maps/random/island_stronghold.js b/binaries/data/mods/public/maps/random/island_stronghold.js index 5e064202d3..b77a381577 100644 --- a/binaries/data/mods/public/maps/random/island_stronghold.js +++ b/binaries/data/mods/public/maps/random/island_stronghold.js @@ -113,7 +113,7 @@ for (let i = 0; i < teams.length; ++i) ], null); - placeCivDefaultEntities(fx, fz, teams[i][p], { "iberWall": false }); + placeCivDefaultStartingEntities(fx, fz, teams[i][p], false); } log("Create initial mines for team " + i); @@ -146,7 +146,13 @@ for (let i = 0; i < teams.length; ++i) { let [playerAngle, fx, fz, ix, iz] = getPlayerTileCoordinates(p, i, fractionX, fractionZ); - placeDefaultChicken(fx, fz, clBaseResource, [stayClasses(clLand, 5)]); + placePlayerBaseChicken({ + "playerID": teams[i][p], + "playerX": tilesToFraction(fx), + "playerZ": tilesToFraction(fz), + "BaseResourceClass": clBaseResource, + "baseResourceConstraint": stayClasses(clLand, 5) + }); // create initial berry bushes let bbAngle = randFloat(PI, PI*1.5); diff --git a/binaries/data/mods/public/maps/random/islands.js b/binaries/data/mods/public/maps/random/islands.js index 2bf8df4a23..5ebc6bff0f 100644 --- a/binaries/data/mods/public/maps/random/islands.js +++ b/binaries/data/mods/public/maps/random/islands.js @@ -62,7 +62,7 @@ var clLand = createTileClass(); var playerIslandRadius = scaleByMapSize(20, 29); -var [playerIDs, playerX, playerZ, playerAngle] = radialPlayerPlacement(); +var [playerIDs, playerX, playerZ, playerAngle] = playerPlacementCircle(0.35); log("Creating player islands and docks..."); for (let i = 0; i < numPlayers; i++) @@ -80,85 +80,6 @@ for (let i = 0; i < numPlayers; i++) placeObject(dockLocation.x, dockLocation.y, oDock, playerIDs[i], playerAngle[i] + Math.PI); } -for (var i = 0; i < numPlayers; i++) -{ - var id = playerIDs[i]; - log("Creating base for player " + id + "..."); - - let radius = playerIslandRadius; - - // get the x and z in tiles - var fx = fractionToTiles(playerX[i]); - var fz = fractionToTiles(playerZ[i]); - var ix = Math.round(fx); - var iz = Math.round(fz); - - placeCivDefaultEntities(fx, fz, id, { 'iberWall': 'towers' }); - - placeDefaultChicken(fx, fz, clBaseResource); - - // create berry bushes - var bbAngle = randFloat(0, 2 * Math.PI); - var bbDist = 12; - var bbX = Math.round(fx + bbDist * cos(bbAngle)); - var bbZ = Math.round(fz + bbDist * sin(bbAngle)); - var group = new SimpleGroup( - [new SimpleObject(oFruitBush, 5,5, 0,3)], - true, clBaseResource, bbX, bbZ - ); - createObjectGroup(group, 0); - - // create woods - var bbAngle = randFloat(0, 2 * Math.PI); - var bbDist = 13; - var bbX = Math.round(fx + bbDist * cos(bbAngle)); - var bbZ = Math.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 (Math.abs(mAngle - bbAngle) < Math.PI / 3) - { - mAngle = randFloat(0, 2 * Math.PI); - } - var mDist = 12; - var mX = Math.round(fx + mDist * cos(mAngle)); - var mZ = Math.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 = Math.round(fx + mDist * cos(mAngle)); - mZ = Math.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 = 5; - var tAngle = randFloat(-PI/3, 4*PI/3); - var tDist = randFloat(12, 13); - var tX = Math.round(fx + tDist * cos(tAngle)); - var tZ = Math.round(fz + tDist * sin(tAngle)); - group = new SimpleGroup( - [new SimpleObject(oTree1, num, num, 0,3)], - false, clBaseResource, tX, tZ - ); - createObjectGroup(group, 0, avoidClasses(clBaseResource,2)); - - placeDefaultDecoratives(fx, fz, aGrassShort, clBaseResource, radius); -} - var landAreas = []; var playerConstraint = new AvoidTileClassConstraint(clPlayer, Math.floor(scaleByMapSize(12,16))); var landConstraint = new AvoidTileClassConstraint(clLand, Math.floor(scaleByMapSize(12,16))); @@ -256,17 +177,43 @@ for (let i = 0; i < 6 * Math.square(scaleByMapSize(1, 3)); ++i) paintTerrainBasedOnHeight(1, 3, 0, tShore); paintTerrainBasedOnHeight(-8, 1, 2, tWater); -for (var i = 0; i < numPlayers; i++) -{ - var fx = fractionToTiles(playerX[i]); - var fz = fractionToTiles(playerZ[i]); - var ix = Math.round(fx); - var iz = Math.round(fz); - // create the city patch - var placer = new ClumpPlacer(diskArea(playerIslandRadius / 3), 0.6, 0.3, 10, ix, iz); - var painter = new LayeredPainter([tRoadWild, tRoad], [1]); - createArea(placer, painter, null); -} +placePlayerBases({ + "PlayerPlacement": [playerIDs, playerX, playerZ], + // PlayerTileClass marked above + "BaseResourceClass": clBaseResource, + "Walls": "towers", + "CityPatch": { + "radius": playerIslandRadius / 3, + "outerTerrain": tRoadWild, + "innerTerrain": tRoad + }, + "Chicken": { + }, + "Berries": { + "template": oFruitBush + }, + "Mines": { + "types": [ + { "template": oMetalLarge }, + { "template": oStoneLarge } + ] + }, + "Treasures": { + "types": [ + { + "template": oWoodTreasure, + "count": 14 + } + ] + }, + "Trees": { + "template": oTree1, + "count": 5 + }, + "Decoratives": { + "template": aGrassShort + } +}); log("Creating bumps..."); createAreas( diff --git a/binaries/data/mods/public/maps/random/kerala.js b/binaries/data/mods/public/maps/random/kerala.js index 75d59a090e..de05f5a767 100644 --- a/binaries/data/mods/public/maps/random/kerala.js +++ b/binaries/data/mods/public/maps/random/kerala.js @@ -48,93 +48,40 @@ var clFood = createTileClass(); var clBaseResource = createTileClass(); var clMountains = createTileClass(); -var [playerIDs, playerX, playerZ] = playerPlacementLine(false, 0.55, 0.2); - -for (var i = 0; i < numPlayers; i++) -{ - var id = playerIDs[i]; - log("Creating base for player " + id + "..."); - - var radius = scaleByMapSize(15,25); - var cliffRadius = 2; - var elevation = 20; - - // get the x and z in tiles - var fx = fractionToTiles(playerX[i]); - var fz = fractionToTiles(playerZ[i]); - var ix = Math.round(fx); - var iz = Math.round(fz); - addCivicCenterAreaToClass(ix, iz, clPlayer); - - // 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); - - placeCivDefaultEntities(fx, fz, id); - - placeDefaultChicken(fx, fz, clBaseResource); - - // create berry bushes - var bbAngle = randFloat(0, 2 * Math.PI); - var bbDist = 12; - var bbX = Math.round(fx + bbDist * cos(bbAngle)); - var bbZ = Math.round(fz + bbDist * sin(bbAngle)); - var group = new SimpleGroup( - [new SimpleObject(oBush, 5,5, 0,3)], - true, clBaseResource, bbX, bbZ - ); - createObjectGroup(group, 0); - - // create metal mine - var bbAngle = randFloat(0, 2 * Math.PI); - var bbDist = 12; - var bbX = Math.round(fx + bbDist * cos(bbAngle)); - var bbZ = Math.round(fz + bbDist * sin(bbAngle)); - var mAngle = bbAngle; - while (Math.abs(mAngle - bbAngle) < Math.PI / 3) - { - mAngle = randFloat(0, 2 * Math.PI); - } - var mDist = 12; - var mX = Math.round(fx + mDist * cos(mAngle)); - var mZ = Math.round(fz + mDist * sin(mAngle)); - var 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 = Math.round(fx + mDist * cos(mAngle)); - mZ = Math.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 = Math.floor(hillSize / 60); - var tAngle = randFloat(-PI/3, 4*PI/3); - var tDist = randFloat(12, 13); - var tX = Math.round(fx + tDist * cos(tAngle)); - var tZ = Math.round(fz + tDist * sin(tAngle)); - group = new SimpleGroup( - [new SimpleObject(oTree, num, num, 0,3)], - false, clBaseResource, tX, tZ - ); - createObjectGroup(group, 0, avoidClasses(clBaseResource,2)); - -} - -Engine.SetProgress(15); - const waterPos = 0.31; const mountainPos = 0.69; +placePlayerBases({ + "PlayerPlacement": playerPlacementLine(false, 0.55, 0.2), + "PlayerTileClass": clPlayer, + "BaseResourceClass": clBaseResource, + "CityPatch": { + "outerTerrain": tRoadWild, + "innerTerrain": tRoad + }, + "Chicken": { + }, + "Berries": { + "template": oBush + }, + "Mines": { + "types": [ + { "template": oMetalLarge }, + { "template": oStoneLarge } + ] + }, + "Trees": { + "template": oTree, + "count": scaleByMapSize(12, 30), + "minDist": 12, + "maxDist": 14, + "minDistGroup": 1, + "maxDistGroup": 3 + } + // No decoratives +}); +Engine.SetProgress(15); + paintRiver({ "parallel": true, "startX": 0, diff --git a/binaries/data/mods/public/maps/random/lake.js b/binaries/data/mods/public/maps/random/lake.js index 5eb81202af..cf5c56bf26 100644 --- a/binaries/data/mods/public/maps/random/lake.js +++ b/binaries/data/mods/public/maps/random/lake.js @@ -57,7 +57,7 @@ var clBaseResource = createTileClass(); initTerrain(tMainTerrain); -var [playerIDs, playerX, playerZ] = radialPlayerPlacement(); +var [playerIDs, playerX, playerZ] = playerPlacementCircle(0.35); log("Preventing water in player territory..."); for (let i = 0; i < numPlayers; ++i) @@ -66,75 +66,6 @@ for (let i = 0; i < numPlayers; ++i) Math.round(fractionToTiles(playerZ[i])), clPlayer); -for (var i = 0; i < numPlayers; i++) -{ - var id = playerIDs[i]; - log("Creating base for player " + id + "..."); - - var radius = scaleByMapSize(15,25); - var cliffRadius = 2; - var elevation = 20; - - // get the x and z in tiles - var fx = fractionToTiles(playerX[i]); - var fz = fractionToTiles(playerZ[i]); - var ix = Math.round(fx); - var iz = Math.round(fz); - - placeCivDefaultEntities(fx, fz, id); - - placeDefaultChicken(fx, fz, clBaseResource); - - // create berry bushes - var bbAngle = randFloat(0, 2 * Math.PI); - var bbDist = 12; - var bbX = Math.round(fx + bbDist * cos(bbAngle)); - var bbZ = Math.round(fz + bbDist * sin(bbAngle)); - var group = new SimpleGroup( - [new SimpleObject(oFruitBush, 5,5, 0,3)], - true, clBaseResource, bbX, bbZ - ); - createObjectGroup(group, 0); - - // create metal mine - var mAngle = bbAngle; - while (Math.abs(mAngle - bbAngle) < Math.PI / 3) - mAngle = randFloat(0, 2 * Math.PI); - - var mDist = 12; - var mX = Math.round(fx + mDist * cos(mAngle)); - var mZ = Math.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 = Math.round(fx + mDist * cos(mAngle)); - mZ = Math.round(fz + mDist * sin(mAngle)); - group = new SimpleGroup( - [new SimpleObject(oStoneLarge, 1,1, 0,2)], - true, clBaseResource, mX, mZ - ); - createObjectGroup(group, 0); - - // create starting trees - var num = 5; - var tAngle = randFloat(0, 2 * Math.PI); - var tDist = randFloat(12, 13); - var tX = Math.round(fx + tDist * cos(tAngle)); - var tZ = Math.round(fz + tDist * sin(tAngle)); - group = new SimpleGroup( - [new SimpleObject(oTree1, num, num, 0,3)], - false, clBaseResource, tX, tZ - ); - createObjectGroup(group, 0, avoidClasses(clBaseResource,2)); - - placeDefaultDecoratives(fx, fz, aGrassShort, clBaseResource, radius); -} - log("Creating the lake...") createArea( new ChainPlacer( @@ -168,19 +99,34 @@ paintTerrainBasedOnHeight(1, 2.4, 0, tShore); paintTerrainBasedOnHeight(-8, 1, 2, tWater); paintTileClassBasedOnHeight(-6, 0, 1, clWater); -for (var i = 0; i < numPlayers; ++i) -{ - var fx = fractionToTiles(playerX[i]); - var fz = fractionToTiles(playerZ[i]); - var ix = Math.round(fx); - var iz = Math.round(fz); - - // 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); -} +placePlayerBases({ + "PlayerPlacement": [playerIDs, playerX, playerZ], + // PlayerTileClass marked above + "BaseResourceClass": clBaseResource, + "CityPatch": { + "outerTerrain": tRoadWild, + "innerTerrain": tRoad + }, + "Chicken": { + }, + "Berries": { + "template": oFruitBush + }, + "Mines": { + "types": [ + { "template": oMetalLarge }, + { "template": oStoneLarge } + ] + }, + "Trees": { + "template": oTree1, + "count": 5 + }, + "Decoratives": { + "template": aGrassShort + } +}); +Engine.SetProgress(20); createBumps(avoidClasses(clWater, 2, clPlayer, 20)); diff --git a/binaries/data/mods/public/maps/random/latium.js b/binaries/data/mods/public/maps/random/latium.js index c28b0142cc..d4ff17e350 100644 --- a/binaries/data/mods/public/maps/random/latium.js +++ b/binaries/data/mods/public/maps/random/latium.js @@ -306,80 +306,40 @@ for (var ix = 0; ix < mapSize; ix++) Engine.SetProgress(30); -for (var i = 0; i < numPlayers; ++i) -{ - var id = playerIDs[i]; - log("Creating base for player " + id + "..."); - - // get fractional locations in tiles - var fx = fractionToTiles(playerX[i]); - var fz = fractionToTiles(playerZ[i]); - var ix = Math.round(fx); - var iz = Math.round(fz); - addToClass(ix, iz, clPlayer); - - // create the city patch, flatten area under TC - var cityRadius = 11; - var placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz); - var painter = new LayeredPainter([tGrass, tCity], [4]); - var elevationPainter = new SmoothElevationPainter( - ELEVATION_SET, // type - 5, // elevation - 2 // blend radius - ); - createArea(placer, [painter, elevationPainter], null); - - placeCivDefaultEntities(fx, fz, id); - - placeDefaultChicken(fx, fz, clBaseResource); - - // create starting berry bushes - var bbAngle = randFloat(0, 2 * Math.PI); - var bbDist = 9; - var bbX = Math.round(fx + bbDist * cos(bbAngle)); - var bbZ = Math.round(fz + bbDist * sin(bbAngle)); - var group = new SimpleGroup( - [new SimpleObject(oBerryBush, 5,5, 0,2)], - true, clBaseResource, bbX, bbZ - ); - createObjectGroup(group, 0); - - // create metal mine - var mAngle = bbAngle; - while (Math.abs(mAngle - bbAngle) < Math.PI / 3) - mAngle = randFloat(0, 2 * Math.PI); - - var mDist = 12; - var mX = Math.round(fx + mDist * cos(mAngle)); - var mZ = Math.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 = Math.round(fx + mDist * cos(mAngle)); - mZ = Math.round(fz + mDist * sin(mAngle)); - group = new SimpleGroup( - [new SimpleObject(oStoneLarge, 1,1, 0,2)], - true, clBaseResource, mX, mZ - ); - createObjectGroup(group, 0); - - // create starting trees - var num = 5; - var tAngle = randFloat(-PI/3, 4*PI/3); - var tDist = randFloat(10, 11); - var tX = Math.round(fx + tDist * cos(tAngle)); - var tZ = Math.round(fz + tDist * sin(tAngle)); - group = new SimpleGroup( - [new SimpleObject(oPalm, num, num, 0,5)], - false, clBaseResource, tX, tZ - ); - createObjectGroup(group, 0, avoidClasses(clBaseResource, 2, clCliff, 0)); -} +placePlayerBases({ + "PlayerPlacement": [playerIDs, playerX, playerZ], + "PlayerTileClass": clPlayer, + "BaseResourceClass": clBaseResource, + "baseResourceConstraint": avoidClasses(clCliff, 4), + "CityPatch": { + "radius": 11, + "outerTerrain": tGrass, + "innerTerrain": tCity, + "width": 4, + "painters": [ + new SmoothElevationPainter(ELEVATION_SET, 5, 2) + ] + }, + "Chicken": { + }, + "Berries": { + "template": oBerryBush, + "distance": 9 + }, + "Mines": { + "types": [ + { "template": oMetalLarge }, + { "template": oStoneLarge } + ] + }, + "Trees": { + "template": oPalm, + "count": 5, + "minDist": 10, + "maxDist": 11 + } + // No decoratives +}); Engine.SetProgress(40); log("Creating bushes..."); diff --git a/binaries/data/mods/public/maps/random/lorraine_plain.js b/binaries/data/mods/public/maps/random/lorraine_plain.js index d17444301a..e172bdd336 100644 --- a/binaries/data/mods/public/maps/random/lorraine_plain.js +++ b/binaries/data/mods/public/maps/random/lorraine_plain.js @@ -55,87 +55,37 @@ var waterHeight = -4; var shallowHeight = -2; var shallowWidth = scaleByMapSize(8, 12); -var [playerIDs, playerX, playerZ] = playerPlacementRiver(Math.PI / 2, 0.5); - -for (var i = 0; i < numPlayers; i++) -{ - var id = playerIDs[i]; - log("Creating base for player " + id + "..."); - - // scale radius of player area by map size - var radius = scaleByMapSize(15,25); - - // get the x and z in tiles - var fx = fractionToTiles(playerX[i]); - var fz = fractionToTiles(playerZ[i]); - var ix = Math.round(fx); - var iz = Math.round(fz); - - // calculate size based on the radius - var size = PI * radius * radius / 4; - - // create the player area - var placer = new ClumpPlacer(size, 0.9, 0.5, 10, ix, iz); - createArea(placer, paintClass(clPlayer), null); - - // create the city patch - var cityRadius = 10; - placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz); - var painter = new LayeredPainter([tRoadWild, tRoad], [3]); - createArea(placer, painter, null); - - placeCivDefaultEntities(fx, fz, id, { 'iberWall': 'towers' }); - - placeDefaultChicken(fx, fz, clBaseResource); - - // create berry bushes - var bbAngle = randFloat(0, 2 * Math.PI); - var bbDist = 12; - var bbX = Math.round(fx + bbDist * cos(bbAngle)); - var bbZ = Math.round(fz + bbDist * sin(bbAngle)); - var group = new SimpleGroup( - [new SimpleObject(oBerryBush, 5,5, 0,3)], - true, clBaseResource, bbX, bbZ - ); - createObjectGroup(group, 0); - - // create metal mine - var mAngle = bbAngle; - while (Math.abs(mAngle - bbAngle) < Math.PI / 3) - { - mAngle = randFloat(0, 2 * Math.PI); +placePlayerBases({ + "PlayerPlacement": playerPlacementRiver(Math.PI / 2, 0.5), + // PlayerTileClass marked below + "BaseResourceClass": clBaseResource, + "Walls": "towers", + "CityPatch": { + "outerTerrain": tRoadWild, + "innerTerrain": tRoad, + "painters": [ + paintClass(clPlayer) + ] + }, + "Chicken": { + }, + "Berries": { + "template": oBerryBush + }, + "Mines": { + "types": [ + { "template": oMetalLarge }, + { "template": oStoneLarge } + ] + }, + "Trees": { + "template": oOak, + "count": 3 + }, + "Decoratives": { + "template": aGrassShort } - var mDist = 11; - var mX = Math.round(fx + mDist * cos(mAngle)); - var mZ = Math.round(fz + mDist * sin(mAngle)); - group = new SimpleGroup( - [new SimpleObject(oMetalLarge, 1,1, 0,0), new SimpleObject(aGrass, 2,4, 0,2)], - true, clBaseResource, mX, mZ - ); - createObjectGroup(group, 0); - - // create stone mines - mAngle += randFloat(PI/8, PI/4); - mX = Math.round(fx + mDist * cos(mAngle)); - mZ = Math.round(fz + mDist * sin(mAngle)); - group = new SimpleGroup( - [new SimpleObject(oStoneLarge, 1,1, 0,2), new SimpleObject(aGrass, 2,4, 0,2)], - true, clBaseResource, mX, mZ - ); - createObjectGroup(group, 0); - - // create starting trees - var num = 3; - var tAngle = randFloat(-PI/3, 4*PI/3); - var tDist = randFloat(11, 13); - var tX = Math.round(fx + tDist * cos(tAngle)); - var tZ = Math.round(fz + tDist * sin(tAngle)); - group = new SimpleGroup( - [new SimpleObject(oOak, num, num, 0,5)], - false, clBaseResource, tX, tZ - ); - createObjectGroup(group, 0, avoidClasses(clBaseResource,2)); -} +}); Engine.SetProgress(20); log("Creating the main river..."); diff --git a/binaries/data/mods/public/maps/random/mainland.js b/binaries/data/mods/public/maps/random/mainland.js index 0fcaf65589..dcb57aacd0 100644 --- a/binaries/data/mods/public/maps/random/mainland.js +++ b/binaries/data/mods/public/maps/random/mainland.js @@ -52,84 +52,33 @@ var clBaseResource = createTileClass(); initTerrain(tMainTerrain); -var [playerIDs, playerX, playerZ] = radialPlayerPlacement(); - -for (var i = 0; i < numPlayers; i++) -{ - var id = playerIDs[i]; - log("Creating base for player " + id + "..."); - - var radius = scaleByMapSize(15,25); - var cliffRadius = 2; - var elevation = 20; - - // get the x and z in tiles - var fx = fractionToTiles(playerX[i]); - var fz = fractionToTiles(playerZ[i]); - var ix = Math.round(fx); - var iz = Math.round(fz); - addCivicCenterAreaToClass(ix, iz, clPlayer); - - placeCivDefaultEntities(fx, fz, id); - - // 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); - - placeDefaultChicken(fx, fz, clBaseResource); - - // create berry bushes - var bbAngle = randFloat(0, 2 * Math.PI); - var bbDist = 12; - var bbX = Math.round(fx + bbDist * cos(bbAngle)); - var bbZ = Math.round(fz + bbDist * sin(bbAngle)); - var group = new SimpleGroup( - [new SimpleObject(oFruitBush, 5,5, 0,3)], - true, clBaseResource, bbX, bbZ - ); - createObjectGroup(group, 0); - - // create metal mine - var mAngle = bbAngle; - while (Math.abs(mAngle - bbAngle) < Math.PI / 3) - { - mAngle = randFloat(0, 2 * Math.PI); +placePlayerBases({ + "PlayerPlacement": playerPlacementCircle(0.35), + "PlayerTileClass": clPlayer, + "BaseResourceClass": clBaseResource, + "CityPatch": { + "outerTerrain": tRoadWild, + "innerTerrain": tRoad + }, + "Chicken": { + }, + "Berries": { + "template": oFruitBush + }, + "Mines": { + "types": [ + { "template": oMetalLarge }, + { "template": oStoneLarge } + ] + }, + "Trees": { + "template": oTree1, + "count": 5 + }, + "Decoratives": { + "template": aGrassShort } - var mDist = 12; - var mX = Math.round(fx + mDist * cos(mAngle)); - var mZ = Math.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 = Math.round(fx + mDist * cos(mAngle)); - mZ = Math.round(fz + mDist * sin(mAngle)); - group = new SimpleGroup( - [new SimpleObject(oStoneLarge, 1,1, 0,2)], - true, clBaseResource, mX, mZ - ); - createObjectGroup(group, 0); - - // create starting trees - var num = 5; - var tAngle = randFloat(0, 2 * Math.PI); - var tDist = randFloat(12, 13); - var tX = Math.round(fx + tDist * cos(tAngle)); - var tZ = Math.round(fz + tDist * sin(tAngle)); - group = new SimpleGroup( - [new SimpleObject(oTree1, num, num, 0,3)], - false, clBaseResource, tX, tZ - ); - createObjectGroup(group, 0, avoidClasses(clBaseResource,2)); - - placeDefaultDecoratives(fx, fz, aGrassShort, clBaseResource, radius); -} +}); Engine.SetProgress(20); createBumps(avoidClasses(clPlayer, 20)); diff --git a/binaries/data/mods/public/maps/random/migration.js b/binaries/data/mods/public/maps/random/migration.js index 7c784bb53d..18458ad076 100644 --- a/binaries/data/mods/public/maps/random/migration.js +++ b/binaries/data/mods/public/maps/random/migration.js @@ -87,104 +87,39 @@ for (let i = 0; i < numPlayers; ++i) } Engine.SetProgress(10); -for (var i = 0; i < numPlayers; i++) -{ - var id = playerIDs[i]; - log("Creating base for player " + id + "..."); - - var radius = scaleByMapSize(15,25); - 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 = Math.round(fx); - var iz = Math.round(fz); - // create the hill - var placer = new ClumpPlacer(hillSize, 0.80, 0.1, 10, ix, iz); - var terrainPainter = new LayeredPainter( - [tWater , tShore, tMainTerrain], // terrains - [1, shoreRadius] // widths - ); - var elevationPainter = new SmoothElevationPainter( - ELEVATION_SET, // type - elevation, // elevation - shoreRadius // blend radius - ); - createArea(placer, [terrainPainter, elevationPainter, paintClass(clPlayer)], null); - - // 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, null); - - placeCivDefaultEntities(fx, fz, id, { 'iberWall': false }); - - placeDefaultChicken(fx, fz, clBaseResource); - - // create berry bushes - var bbAngle = randFloat(0, 2 * Math.PI); - var bbDist = 12; - var bbX = Math.round(fx + bbDist * cos(bbAngle)); - var bbZ = Math.round(fz + bbDist * sin(bbAngle)); - var group = new SimpleGroup( - [new SimpleObject(oFruitBush, 5,5, 0,3)], - true, clBaseResource, bbX, bbZ - ); - createObjectGroup(group, 0); - - // create woods - var bbAngle = randFloat(0, 2 * Math.PI); - var bbDist = 13; - var bbX = Math.round(fx + bbDist * cos(bbAngle)); - var bbZ = Math.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 (Math.abs(mAngle - bbAngle) < Math.PI / 3) - mAngle = randFloat(0, 2 * Math.PI); - - var mDist = radius - 4; - var mX = Math.round(fx + mDist * cos(mAngle)); - var mZ = Math.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 = Math.round(fx + mDist * cos(mAngle)); - mZ = Math.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 = Math.floor(hillSize / 60); - var tAngle = randFloat(-PI/3, 4*PI/3); - var tDist = 11; - var tX = Math.round(fx + tDist * cos(tAngle)); - var tZ = Math.round(fz + tDist * sin(tAngle)); - group = new SimpleGroup( - [new SimpleObject(oTree1, num, num, 0,4)], - false, clBaseResource, tX, tZ - ); - createObjectGroup(group, 0, avoidClasses(clBaseResource,2)); - - placeDefaultDecoratives(fx, fz, aGrassShort, clBaseResource, radius); -} +placePlayerBases({ + "PlayerPlacement": [playerIDs, playerX, playerZ], + "PlayerTileClass": clPlayer, + "BaseResourceClass": clBaseResource, + "Walls": false, + // No city patch + "Chicken": { + }, + "Berries": { + "template": oFruitBush + }, + "Mines": { + "types": [ + { "template": oMetalLarge }, + { "template": oStoneLarge } + ] + }, + "Treasures": { + "types": [ + { + "template": oWoodTreasure, + "count": 14 + } + ] + }, + "Trees": { + "template": oTree1, + "count": scaleByMapSize(12, 30) + }, + "Decoratives": { + "template": aGrassShort + } +}); Engine.SetProgress(15); log("Create the continent body..."); diff --git a/binaries/data/mods/public/maps/random/neareastern_badlands.js b/binaries/data/mods/public/maps/random/neareastern_badlands.js index 55cff6884d..229ae29ac0 100644 --- a/binaries/data/mods/public/maps/random/neareastern_badlands.js +++ b/binaries/data/mods/public/maps/random/neareastern_badlands.js @@ -51,12 +51,12 @@ var clMetal = createTileClass(); var clFood = createTileClass(); var clBaseResource = createTileClass(); -var [playerIDs, playerX, playerZ] = radialPlayerPlacement(); +var [playerIDs, playerX, playerZ] = playerPlacementCircle(0.35); for (let i = 0; i < numPlayers; ++i) createArea( new ClumpPlacer( - diskArea(scaleByMapSize(15, 25)), + diskArea(defaultPlayerBaseRadius()), 0.9, 0.5, 10, @@ -64,78 +64,32 @@ for (let i = 0; i < numPlayers; ++i) Math.round(fractionToTiles(playerZ[i]))), paintClass(clPlayer)); -for (var i = 0; i < numPlayers; i++) -{ - var id = playerIDs[i]; - log("Creating base for player " + id + "..."); - - // scale radius of player area by map size - var radius = scaleByMapSize(15,25); - - // get the x and z in tiles - var fx = fractionToTiles(playerX[i]); - var fz = fractionToTiles(playerZ[i]); - var ix = Math.round(fx); - var iz = Math.round(fz); - - // create the city patch - var cityRadius = 10; - placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz); - var painter = new LayeredPainter([tCity, tCityPlaza], [3]); - createArea(placer, painter, null); - - placeCivDefaultEntities(fx, fz, id); - - placeDefaultChicken(fx, fz, clBaseResource); - - // create berry bushes - var bbAngle = randFloat(0, 2 * Math.PI); - var bbDist = 12; - var bbX = Math.round(fx + bbDist * cos(bbAngle)); - var bbZ = Math.round(fz + bbDist * sin(bbAngle)); - var group = new SimpleGroup( - [new SimpleObject(oBerryBush, 5,5, 0,3)], - true, clBaseResource, bbX, bbZ - ); - createObjectGroup(group, 0); - - // create metal mine - var mAngle = bbAngle; - while (Math.abs(mAngle - bbAngle) < Math.PI / 3) - mAngle = randFloat(0, 2 * Math.PI); - - var mDist = 11; - var mX = Math.round(fx + mDist * cos(mAngle)); - var mZ = Math.round(fz + mDist * sin(mAngle)); - group = new SimpleGroup( - [new SimpleObject(oMetalLarge, 1,1, 0,0), new RandomObject(aBushes, 2,4, 0,2)], - true, clBaseResource, mX, mZ - ); - createObjectGroup(group, 0); - - // create stone mines - mAngle += randFloat(PI/8, PI/4); - mX = Math.round(fx + mDist * cos(mAngle)); - mZ = Math.round(fz + mDist * sin(mAngle)); - group = new SimpleGroup( - [new SimpleObject(oStoneLarge, 1,1, 0,2), new RandomObject(aBushes, 2,4, 0,2)], - true, clBaseResource, mX, mZ - ); - createObjectGroup(group, 0); - - var hillSize = PI * radius * radius; - // create starting trees - var num = Math.floor(hillSize / 100); - var tAngle = randFloat(-PI/3, 4*PI/3); - var tDist = randFloat(12, 14); - var tX = Math.round(fx + tDist * cos(tAngle)); - var tZ = Math.round(fz + tDist * sin(tAngle)); - group = new SimpleGroup( - [new SimpleObject(oDatePalm, num, num, 0,5)], - false, clBaseResource, tX, tZ - ); - createObjectGroup(group, 0, avoidClasses(clBaseResource,2)); -} +placePlayerBases({ + "PlayerPlacement": [playerIDs, playerX, playerZ], + "PlayerTileClass": clPlayer, + "BaseResourceClass": clBaseResource, + "CityPatch": { + "outerTerrain": tCity, + "innerTerrain": tCityPlaza, + "width": 3, + "radius": 10 + }, + "Chicken": { + }, + "Berries": { + "template": oBerryBush + }, + "Mines": { + "types": [ + { "template": oMetalLarge }, + { "template": oStoneLarge } + ] + }, + "Trees": { + "template": oDatePalm + } + // No decoratives +}); Engine.SetProgress(10); log("Creating dune patches..."); diff --git a/binaries/data/mods/public/maps/random/new_rms_test.js b/binaries/data/mods/public/maps/random/new_rms_test.js index b5a130f395..c2d3a5a506 100644 --- a/binaries/data/mods/public/maps/random/new_rms_test.js +++ b/binaries/data/mods/public/maps/random/new_rms_test.js @@ -2,31 +2,8 @@ Engine.LoadLibrary("rmgen"); InitMap(); -var numPlayers = getNumPlayers(); -var mapSize = getMapSize(); - -var clPlayer = createTileClass(); -var clPath = createTileClass(); -var clHill = createTileClass(); -var clForest = createTileClass(); -var clRock = createTileClass(); -var clFood = createTileClass(); -var clBaseResource = createTileClass(); - -var [playerIDs, playerX, playerZ] = radialPlayerPlacement(0.39); - -for (var i=0; i < numPlayers; i++) -{ - var id = playerIDs[i]; - log("Creating base for player " + id + "..."); - - // get the x and z in tiles - var fx = fractionToTiles(playerX[i]); - var fz = fractionToTiles(playerZ[i]); - var ix = Math.round(fx); - var iz = Math.round(fz); - - placeCivDefaultEntities(fx, fz, id); -} +placePlayerBases({ + "PlayerPlacement": playerPlacementCircle(0.39) +}); ExportMap(); diff --git a/binaries/data/mods/public/maps/random/northern_lights.js b/binaries/data/mods/public/maps/random/northern_lights.js index d2438f0ac4..594bfdc394 100644 --- a/binaries/data/mods/public/maps/random/northern_lights.js +++ b/binaries/data/mods/public/maps/random/northern_lights.js @@ -41,75 +41,27 @@ var clMetal = createTileClass(); var clFood = createTileClass(); var clBaseResource = createTileClass(); -var [playerIDs, playerX, playerZ] = playerPlacementLine(true, 0.45, 0.2); - -for (var i = 0; i < numPlayers; i++) -{ - var id = playerIDs[i]; - log("Creating base for player " + id + "..."); - - var radius = scaleByMapSize(15,25); - var cliffRadius = 2; - var elevation = 20; - - // get the x and z in tiles - var fx = fractionToTiles(playerX[i]); - var fz = fractionToTiles(playerZ[i]); - var ix = Math.round(fx); - var iz = Math.round(fz); - addCivicCenterAreaToClass(ix, iz, clPlayer); - - // 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); - - placeCivDefaultEntities(fx, fz, id); - - // create metal mine - var bbAngle = randFloat(0, 2 * Math.PI); - var bbDist = 12; - var bbX = Math.round(fx + bbDist * cos(bbAngle)); - var bbZ = Math.round(fz + bbDist * sin(bbAngle)); - var mAngle = bbAngle; - while (Math.abs(mAngle - bbAngle) < Math.PI / 3) - { - mAngle = randFloat(0, 2 * Math.PI); +placePlayerBases({ + "PlayerPlacement": playerPlacementLine(true, 0.45, 0.2), + "PlayerTileClass": clPlayer, + "BaseResourceClass": clBaseResource, + "CityPatch": { + "outerTerrain": tRoadWild, + "innerTerrain": tRoad + }, + // No chicken, no berries + "Mines": { + "types": [ + { "template": oMetalLarge }, + { "template": oStoneLarge } + ] + }, + "Trees": { + "template": oPine, + "count": scaleByMapSize(12, 30), } - var mDist = 12; - var mX = Math.round(fx + mDist * cos(mAngle)); - var mZ = Math.round(fz + mDist * sin(mAngle)); - var 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 = Math.round(fx + mDist * cos(mAngle)); - mZ = Math.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 = Math.floor(hillSize / 60); - var tAngle = randFloat(-PI/3, 4*PI/3); - var tDist = randFloat(12, 13); - var tX = Math.round(fx + tDist * cos(tAngle)); - var tZ = Math.round(fz + tDist * sin(tAngle)); - group = new SimpleGroup( - [new SimpleObject(oPine, num, num, 0,3)], - false, clBaseResource, tX, tZ - ); - createObjectGroup(group, 0, avoidClasses(clBaseResource,2)); - -} - + // No decoratives +}); Engine.SetProgress(15); paintRiver({ diff --git a/binaries/data/mods/public/maps/random/oasis.js b/binaries/data/mods/public/maps/random/oasis.js index 5c17c4d256..abe8251659 100644 --- a/binaries/data/mods/public/maps/random/oasis.js +++ b/binaries/data/mods/public/maps/random/oasis.js @@ -50,89 +50,10 @@ var clBaseResource = createTileClass(); initTerrain(tSand); -var [playerIDs, playerX, playerZ] = radialPlayerPlacement(); - -var placer = undefined; -var fx = 0; var fz = 0; -var ix =0; var iz = 0; -for (var i = 0; i < numPlayers; i++) -{ - var id = playerIDs[i]; - log("Creating base for player " + id + "..."); - - var radius = scaleByMapSize(15,25); - var elevation = 20; - - // get the x and z in tiles - fx = fractionToTiles(playerX[i]); - fz = fractionToTiles(playerZ[i]); - ix = Math.round(fx); - iz = Math.round(fz); - addCivicCenterAreaToClass(ix, iz, clPlayer); - - // 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, null); - - placeCivDefaultEntities(fx, fz, id); - - placeDefaultChicken(fx, fz, clBaseResource); - - // create berry bushes - var bbAngle = randFloat(0, 2 * Math.PI); - var bbDist = 12; - var bbX = Math.round(fx + bbDist * cos(bbAngle)); - var bbZ = Math.round(fz + bbDist * sin(bbAngle)); - var group = new SimpleGroup( - [new SimpleObject(eBush, 5,5, 0,3)], - true, clBaseResource, bbX, bbZ - ); - createObjectGroup(group, 0); - - // create metal mine - var mAngle = bbAngle; - while (Math.abs(mAngle - bbAngle) < Math.PI / 3) - { - mAngle = randFloat(0, 2 * Math.PI); - } - var mDist = radius*1.3; - var mX = Math.round(fx + mDist * cos(mAngle)); - var mZ = Math.round(fz + mDist * sin(mAngle)); - group = new SimpleGroup( - [new SimpleObject(eMetalMine, 1,1, 0,0),new SimpleObject(aBushB, 1,1, 2,2), new SimpleObject(aBushA, 0,2, 1,3),new SimpleObject(ePalmShort, 2,2, 2,3),new SimpleObject(ePalmTall, 1,1, 2,2)], - true, clBaseResource, mX, mZ - ); - createObjectGroup(group, 0); - mX = Math.round(fx + mDist*1.5 * cos(mAngle + PI/1.578)); - mZ = Math.round(fz + mDist*1.5 * sin(mAngle + PI/1.578)); - group = new SimpleGroup( - [new SimpleObject(eMetalMine, 1,1, 0,0),new SimpleObject(aBushB, 1,1, 2,2), new SimpleObject(aBushA, 0,2, 1,3),new SimpleObject(ePalmShort, 2,2, 2,3),new SimpleObject(ePalmTall, 1,1, 2,2)], - true, clBaseResource, mX, mZ - ); - createObjectGroup(group, 0); - - // create stone mines - mAngle += randFloat(PI/8, PI/4); - mX = Math.round(fx + mDist * cos(mAngle)); - mZ = Math.round(fz + mDist * sin(mAngle)); - group = new SimpleGroup( - [new SimpleObject(eStoneMine, 1,1, 0,2),new SimpleObject(aBushB, 1,1, 2,2), new SimpleObject(aBushA, 0,2, 1,3),new SimpleObject(ePalmShort, 2,2, 2,3),new SimpleObject(ePalmTall, 1,1, 2,2)], - true, clBaseResource, mX, mZ - ); - createObjectGroup(group, 0); - mX = Math.round(fx + mDist * 1.4 * cos(mAngle - PI /2.46)); - mZ = Math.round(fz + mDist * 1.4 * sin(mAngle - PI /2.46)); - group = new SimpleGroup( - [new SimpleObject(eStoneMine, 1,1, 0,2),new SimpleObject(aBushB, 1,1, 2,2), new SimpleObject(aBushA, 0,2, 3,3),new SimpleObject(ePalmShort, 2,2, 3,3),new SimpleObject(ePalmTall, 1,1, 3,3)], - true, clBaseResource, mX, mZ - ); - createObjectGroup(group, 0); -} +var [playerIDs, playerX, playerZ] = playerPlacementCircle(0.35); log("Creating small oasis near the players...") -var forestDist = scaleByMapSize(15, 25) * 1.2; +var forestDist = 1.2 * defaultPlayerBaseRadius(); for (let i = 0; i < numPlayers; ++i) { let fx = fractionToTiles(playerX[i]); @@ -191,6 +112,36 @@ for (let i = 0; i < numPlayers; ++i) } Engine.SetProgress(20); +placePlayerBases({ + "PlayerPlacement": [playerIDs, playerX, playerZ], + "PlayerTileClass": clPlayer, + "BaseResourceClass": clBaseResource, + "CityPatch": { + "outerTerrain": tRoadWild, + "innerTerrain": tRoad, + "painters": [ + paintClass(clPlayer) + ] + }, + "Chicken": { + }, + "Berries": { + "template": eBush + }, + "Mines": { + "types": [ + { "template": eMetalMine }, + { "template": eStoneMine }, + ], + "distance": defaultPlayerBaseRadius(), + "maxAngle": PI / 2, + "groupElements": shuffleArray([aBushA, aBushB, ePalmShort, ePalmTall]).map(t => new SimpleObject(t, 1, 1, 3, 4)) + } + // Starting trees were set above + // No decoratives +}); +Engine.SetProgress(35); + log("Creating bumps..."); createAreas( new ClumpPlacer(scaleByMapSize(20, 50), 0.3, 0.06, 1), diff --git a/binaries/data/mods/public/maps/random/persian_highlands.js b/binaries/data/mods/public/maps/random/persian_highlands.js index b61f08e190..70faa2e321 100644 --- a/binaries/data/mods/public/maps/random/persian_highlands.js +++ b/binaries/data/mods/public/maps/random/persian_highlands.js @@ -63,88 +63,34 @@ var clCP = createTileClass(); initTerrain(tDirtMain); -var [playerIDs, playerX, playerZ] = radialPlayerPlacement(); - -for (var i = 0; i < numPlayers; i++) -{ - var id = playerIDs[i]; - log("Creating base for player " + id + "..."); - - // scale radius of player area by map size - var radius = scaleByMapSize(15,25); - - // get the x and z in tiles - var fx = fractionToTiles(playerX[i]); - var fz = fractionToTiles(playerZ[i]); - var ix = Math.round(fx); - var iz = Math.round(fz); - - // calculate size based on the radius - var size = PI * radius * radius; - - // create the player area - var placer = new ClumpPlacer(size, 0.9, 0.5, 10, ix, iz); - createArea(placer, paintClass(clPlayer), null); - - // create the city patch - var cityRadius = 10; - placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz); - var painter = new LayeredPainter([tCity, tCity], [3]); - createArea(placer, painter, null); - - placeCivDefaultEntities(fx, fz, id); - - placeDefaultChicken(fx, fz, clBaseResource); - - // create berry bushes - var bbAngle = randFloat(0, 2 * Math.PI); - var bbDist = 12; - var bbX = Math.round(fx + bbDist * cos(bbAngle)); - var bbZ = Math.round(fz + bbDist * sin(bbAngle)); - var group = new SimpleGroup( - [new SimpleObject(oGrapesBush, 5,5, 0,3)], - true, clBaseResource, bbX, bbZ - ); - createObjectGroup(group, 0); - - // create metal mine - var mAngle = bbAngle; - while (Math.abs(mAngle - bbAngle) < Math.PI / 3) - { - mAngle = randFloat(0, 2 * Math.PI); +placePlayerBases({ + "PlayerPlacement": playerPlacementCircle(0.35), + "BaseResourceClass": clBaseResource, + "CityPatch": { + "outerTerrain": tCity, + "innerTerrain": tCity, + "painters": [ + paintClass(clPlayer) + ] + }, + "Chicken": { + }, + "Berries": { + "template": oGrapesBush, + }, + "Mines": { + "types": [ + { "template": oMetalLarge }, + { "template": oStoneLarge } + ], + "groupElements": shuffleArray(aBushes).map(t => new SimpleObject(t, 1, 1, 3, 4)) + }, + "Trees": { + "template": oOak, + "count": 3 } - var mDist = 11; - var mX = Math.round(fx + mDist * cos(mAngle)); - var mZ = Math.round(fz + mDist * sin(mAngle)); - group = new SimpleGroup( - [new SimpleObject(oMetalLarge, 1,1, 0,0), new RandomObject(aBushes, 2,4, 0,2)], - true, clBaseResource, mX, mZ - ); - createObjectGroup(group, 0); - - // create stone mines - mAngle += randFloat(PI/8, PI/4); - mX = Math.round(fx + mDist * cos(mAngle)); - mZ = Math.round(fz + mDist * sin(mAngle)); - group = new SimpleGroup( - [new SimpleObject(oStoneLarge, 1,1, 0,2), new RandomObject(aBushes, 2,4, 0,2)], - true, clBaseResource, mX, mZ - ); - createObjectGroup(group, 0); - - // create starting trees - var num = 3; - var tAngle = randFloat(-PI/3, 4*PI/3); - var tDist = randFloat(11, 13); - var tX = Math.round(fx + tDist * cos(tAngle)); - var tZ = Math.round(fz + tDist * sin(tAngle)); - group = new SimpleGroup( - [new SimpleObject(oOak, num, num, 0,5)], - false, clBaseResource, tX, tZ - ); - createObjectGroup(group, 0, avoidClasses(clBaseResource,2)); -} - + // No decoratives +}); Engine.SetProgress(10); log("Creating rock patches..."); diff --git a/binaries/data/mods/public/maps/random/phoenician_levant.js b/binaries/data/mods/public/maps/random/phoenician_levant.js index f813275603..c1f7942964 100644 --- a/binaries/data/mods/public/maps/random/phoenician_levant.js +++ b/binaries/data/mods/public/maps/random/phoenician_levant.js @@ -56,85 +56,33 @@ var clGrass = createTileClass(); var clHill = createTileClass(); var clIsland = createTileClass(); -var [playerIDs, playerX, playerZ] = playerPlacementLine(false, 0.76, 0.2); - -for (var i = 0; i < numPlayers; i++) -{ - var id = playerIDs[i]; - log("Creating base for player " + id + "..."); - - var radius = scaleByMapSize(15,25); - var cliffRadius = 2; - var elevation = 20; - - // get the x and z in tiles - var fx = fractionToTiles(playerX[i]); - var fz = fractionToTiles(playerZ[i]); - var ix = Math.floor(fx); - var iz = Math.floor(fz); - addCivicCenterAreaToClass(ix, iz, clPlayer); - - // 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([tCityPlaza, tCity], [1]); - createArea(placer, painter, null); - - placeCivDefaultEntities(fx, fz, id); - - placeDefaultChicken(fx, fz, clBaseResource); - - // create berry bushes - var bbAngle = randFloat(0, 2 * Math.PI); - var bbDist = 12; - var bbX = Math.round(fx + bbDist * cos(bbAngle)); - var bbZ = Math.round(fz + bbDist * sin(bbAngle)); - var group = new SimpleGroup( - [new SimpleObject(oGrapeBush, 5,5, 0,3)], - true, clBaseResource, bbX, bbZ - ); - createObjectGroup(group, 0); - - // create metal mine - var mAngle = bbAngle; - while (Math.abs(mAngle - bbAngle) < Math.PI / 3) - { - mAngle = randFloat(0, 2 * Math.PI); +placePlayerBases({ + "PlayerPlacement": playerPlacementLine(false, 0.76, 0.2), + "PlayerTileClass": clPlayer, + "BaseResourceClass": clBaseResource, + "CityPatch": { + "outerTerrain": tCityPlaza, + "innerTerrain": tCity + }, + "Chicken": { + }, + "Berries": { + "template": oGrapeBush + }, + "Mines": { + "types": [ + { "template": oMetalLarge }, + { "template": oStoneLarge } + ] + }, + "Trees": { + "template": oCarob, + "count": 2 + }, + "Decoratives": { + "template": aBush1 } - var mDist = 12; - var mX = Math.round(fx + mDist * cos(mAngle)); - var mZ = Math.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 = Math.round(fx + mDist * cos(mAngle)); - mZ = Math.round(fz + mDist * sin(mAngle)); - group = new SimpleGroup( - [new SimpleObject(oStoneLarge, 1,1, 0,2)], - true, clBaseResource, mX, mZ - ); - createObjectGroup(group, 0); - - // create starting trees - var num = 2; - var tAngle = randFloat(-PI/3, 4*PI/3); - var tDist = randFloat(11, 13); - var tX = Math.round(fx + tDist * cos(tAngle)); - var tZ = Math.round(fz + tDist * sin(tAngle)); - group = new SimpleGroup( - [new SimpleObject(oCarob, num, num, 0,5)], - false, clBaseResource, tX, tZ - ); - createObjectGroup(group, 0, avoidClasses(clBaseResource,2)); - - placeDefaultDecoratives(fx, fz, aBush1, clBaseResource, radius); -} - +}); Engine.SetProgress(30); paintRiver({ diff --git a/binaries/data/mods/public/maps/random/polar_sea.js b/binaries/data/mods/public/maps/random/polar_sea.js index 7b07cc7270..c5b167b32e 100644 --- a/binaries/data/mods/public/maps/random/polar_sea.js +++ b/binaries/data/mods/public/maps/random/polar_sea.js @@ -43,71 +43,45 @@ var clFood = createTileClass(); var clBaseResource = createTileClass(); var clArcticWolf = createTileClass(); -var [playerIDs, playerX, playerZ] = radialPlayerPlacement(); +var [playerIDs, playerX, playerZ] = playerPlacementCircle(0.35); +log("Creating player markets..."); +var marketDist = 12; for (let i = 0; i < numPlayers; ++i) { - let id = playerIDs[i]; - log("Creating base for player " + id + "..."); - - let fx = fractionToTiles(playerX[i]); - let fz = fractionToTiles(playerZ[i]); - let ix = Math.round(fx); - let iz = Math.round(fz); - - addCivicCenterAreaToClass(ix, iz, clPlayer); - - // Create the city patch - let cityRadius = scaleByMapSize(15,25)/3; - let placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz); - let painter = new LayeredPainter([tRoadWild, tRoad], [1]); - createArea(placer, painter, null); - - placeCivDefaultEntities(fx, fz, id, { 'iberWall': 'towers' }); - - placeDefaultChicken(fx, fz, clBaseResource, undefined, oMuskox); - - // Create metal mine - let mAngle = randFloat(0, 2 * Math.PI); - let mDist = 12; - let mX = Math.round(fx + mDist * Math.cos(mAngle)); - let mZ = Math.round(fz + mDist * Math.sin(mAngle)); - let 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 = Math.round(fx + mDist * Math.cos(mAngle)); - mZ = Math.round(fz + mDist * Math.sin(mAngle)); - group = new SimpleGroup( - [new SimpleObject(oStoneLarge, 1, 1, 0, 2)], - true, clBaseResource, mX, mZ - ); - createObjectGroup(group, 0); - - // Create wood treasure - mAngle += PI/4; - let bbX = Math.round(fx + mDist * Math.cos(mAngle)); - let bbZ = Math.round(fz + mDist * Math.sin(mAngle)); - createObjectGroup( - new SimpleGroup( - [new SimpleObject(oWoodTreasure, 14,14, 0,3)], - true, clBaseResource, bbX, bbZ, - avoidClasses(clBaseResource, 4) - ), 0); - - // Create market - mAngle += PI/4; - placeObject( - Math.round(fx + mDist * Math.cos(mAngle)), - Math.round(fz + mDist * Math.sin(mAngle)), - oMarket, - id, - BUILDING_ORIENTATION); + let marketPos = Vector2D.add(new Vector2D(playerX[i], playerZ[i]).mult(mapSize), new Vector2D(marketDist, 0).rotate(randFloat(0, 2 * Math.PI))).round(); + placeObject(marketPos.x, marketPos.y, oMarket, playerIDs[i], BUILDING_ORIENTATION); + addCivicCenterAreaToClass(marketPos.x, marketPos.y, clBaseResource); } + +placePlayerBases({ + "PlayerPlacement": [playerIDs, playerX, playerZ], + "PlayerTileClass": clPlayer, + "BaseResourceClass": clBaseResource, + "Walls": "towers", + "CityPatch": { + "outerTerrain": tRoadWild, + "innerTerrain": tRoad + }, + "Chicken": { + "template": oMuskox + }, + // No berries, no trees, no decoratives + "Mines": { + "types": [ + { "template": oMetalLarge }, + { "template": oStoneLarge } + ] + }, + "Treasures": { + "types": [ + { + "template": oWoodTreasure, + "count": 14 + } + ] + }, +}); Engine.SetProgress(30); log("Creating central lake..."); diff --git a/binaries/data/mods/public/maps/random/pyrenean_sierra.js b/binaries/data/mods/public/maps/random/pyrenean_sierra.js index 94f052859d..3acc8e26df 100644 --- a/binaries/data/mods/public/maps/random/pyrenean_sierra.js +++ b/binaries/data/mods/public/maps/random/pyrenean_sierra.js @@ -105,89 +105,36 @@ for (var ix = 0; ix < mapSize; ix++) } } -var playerIDs = primeSortAllPlayers(); -var [playerX, playerZ] = playerPlacementCustomAngle( - 0.35, - tilesToFraction(mapCenter.x), - tilesToFraction(mapCenter.y), - i => oceanAngle + Math.PI * (i % 2 ? 1 : -1) * ((1/2 + 1/3 * (2/numPlayers * (i + 1 - i % 2) - 1)))); - -for (var i = 0; i < numPlayers; i++) -{ - var id = playerIDs[i]; - log("Creating base for player " + id + "..."); - - var radius = scaleByMapSize(15,25); - var cliffRadius = 2; - var elevation = 20; - - // get the x and z in tiles - var fx = fractionToTiles(playerX[i]); - var fz = fractionToTiles(playerZ[i]); - ix = Math.round(fx); - iz = Math.round(fz); - addCivicCenterAreaToClass(ix, iz, clPlayer); - - // 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); - - placeCivDefaultEntities(fx, fz, id); - - placeDefaultChicken(fx, fz, clBaseResource); - - // create berry bushes - var bbAngle = randFloat(0, 2 * Math.PI); - var bbDist = 12; - var bbX = Math.round(fx + bbDist * cos(bbAngle)); - var bbZ = Math.round(fz + bbDist * sin(bbAngle)); - var group = new SimpleGroup( - [new SimpleObject(oBerryBush, 5,5, 0,3)], - true, clBaseResource, bbX, bbZ - ); - createObjectGroup(group, 0); - - // create metal mine - var mAngle = bbAngle; - while (Math.abs(mAngle - bbAngle) < Math.PI / 3) - { - mAngle = randFloat(0, 2 * Math.PI); +placePlayerBases({ + "PlayerPlacement": [primeSortAllPlayers(), ...playerPlacementCustomAngle( + 0.35, + tilesToFraction(mapCenter.x), + tilesToFraction(mapCenter.y), + i => oceanAngle + Math.PI * (i % 2 ? 1 : -1) * ((1/2 + 1/3 * (2/numPlayers * (i + 1 - i % 2) - 1))))], + "PlayerTileClass": clPlayer, + "BaseResourceClass": clBaseResource, + "CityPatch": { + "outerTerrain": tRoadWild, + "innerTerrain": tRoad + }, + "Chicken": { + }, + "Berries": { + "template": oBerryBush + }, + "Mines": { + "types": [ + { "template": oMetalLarge }, + { "template": oStoneLarge } + ] + }, + "Trees": { + "template": oPine + }, + "Decoratives": { + "template": aGrassShort } - var mDist = 12; - var mX = Math.round(fx + mDist * cos(mAngle)); - var mZ = Math.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 = Math.round(fx + mDist * cos(mAngle)); - mZ = Math.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 = Math.floor(hillSize / 100); - var tAngle = randFloat(-PI/3, 4*PI/3); - var tDist = randFloat(11, 13); - var tX = Math.round(fx + tDist * cos(tAngle)); - var tZ = Math.round(fz + tDist * sin(tAngle)); - group = new SimpleGroup( - [new SimpleObject(oPine, num, num, 0,5)], - false, clBaseResource, tX, tZ - ); - createObjectGroup(group, 0, avoidClasses(clBaseResource,2)); - - placeDefaultDecoratives(fx, fz, aGrassShort, clBaseResource, radius); -} +}); Engine.SetProgress(30); log("Creating the pyreneans..."); diff --git a/binaries/data/mods/public/maps/random/rhine_marshlands.js b/binaries/data/mods/public/maps/random/rhine_marshlands.js index 9147e091ae..0b5935c965 100644 --- a/binaries/data/mods/public/maps/random/rhine_marshlands.js +++ b/binaries/data/mods/public/maps/random/rhine_marshlands.js @@ -48,85 +48,32 @@ var clMetal = createTileClass(); var clFood = createTileClass(); var clBaseResource = createTileClass(); -var [playerIDs, playerX, playerZ] = radialPlayerPlacement(); - -for (var i = 0; i < numPlayers; i++) -{ - var id = playerIDs[i]; - log("Creating base for player " + id + "..."); - - var radius = scaleByMapSize(15,25); - var cliffRadius = 2; - var elevation = 20; - - // get the x and z in tiles - var fx = fractionToTiles(playerX[i]); - var fz = fractionToTiles(playerZ[i]); - var ix = Math.round(fx); - var iz = Math.round(fz); - addCivicCenterAreaToClass(ix, iz, clPlayer); - - // 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); - - placeCivDefaultEntities(fx, fz, id); - - placeDefaultChicken(fx, fz, clBaseResource); - - // create berry bushes - var bbAngle = randFloat(0, 2 * Math.PI); - var bbDist = 12; - var bbX = Math.round(fx + bbDist * cos(bbAngle)); - var bbZ = Math.round(fz + bbDist * sin(bbAngle)); - var group = new SimpleGroup( - [new SimpleObject(oBerryBush, 5,5, 0,3)], - true, clBaseResource, bbX, bbZ - ); - createObjectGroup(group, 0); - - // create metal mine - var mAngle = bbAngle; - while (Math.abs(mAngle - bbAngle) < Math.PI / 3) - { - mAngle = randFloat(0, 2 * Math.PI); +placePlayerBases({ + "PlayerPlacement": playerPlacementCircle(0.35), + "PlayerTileClass": clPlayer, + "BaseResourceClass": clBaseResource, + "CityPatch": { + "outerTerrain": tRoadWild, + "innerTerrain": tRoad + }, + "Chicken": { + }, + "Berries": { + "template": oBerryBush + }, + "Mines": { + "types": [ + { "template": oMetalLarge }, + { "template": oStoneLarge } + ] + }, + "Trees": { + "template": oBeech + }, + "Decoratives": { + "template": aGrassShort } - var mDist = radius - 4; - var mX = Math.round(fx + mDist * cos(mAngle)); - var mZ = Math.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 = Math.round(fx + mDist * cos(mAngle)); - mZ = Math.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 = Math.floor(hillSize / 100); - var tAngle = randFloat(-PI/3, 4*PI/3); - var tDist = 12; - var tX = Math.round(fx + tDist * cos(tAngle)); - var tZ = Math.round(fz + tDist * sin(tAngle)); - group = new SimpleGroup( - [new SimpleObject(oBeech, num, num, 0,5)], - false, clBaseResource, tX, tZ - ); - createObjectGroup(group, 0, avoidClasses(clBaseResource,2)); - - placeDefaultDecoratives(fx, fz, aGrassShort, clBaseResource, radius); -} - +}); Engine.SetProgress(15); log("Creating bumps..."); diff --git a/binaries/data/mods/public/maps/random/river_archipelago.js b/binaries/data/mods/public/maps/random/river_archipelago.js index 04a3c0a0aa..999d34ebcc 100644 --- a/binaries/data/mods/public/maps/random/river_archipelago.js +++ b/binaries/data/mods/public/maps/random/river_archipelago.js @@ -111,77 +111,34 @@ for (let i = 0; i < numPlayers; ++i) paintClass(clPlayerTerritory) ]); -for (let i = 0; i < numPlayers; ++i) -{ - log("Creating base for player " + playerIDs[i] + "..."); - let radius = scaleByMapSize(12, 20); - - let fx = fractionToTiles(playerX[i]); - let fz = fractionToTiles(playerZ[i]); - let ix = Math.round(fx); - let iz = Math.round(fz); - - addCivicCenterAreaToClass(ix, iz, clPlayer); - - // Create the city patch - let cityRadius = radius / 3; - createArea( - new ClumpPlacer(PI * cityRadius * cityRadius, 0.6, 0.3, 10, ix, iz), - new LayeredPainter([tRoadWild, tRoad], [1]), - null); - - placeCivDefaultEntities(fx, fz, playerIDs[i], { 'iberWall': 'towers' }); - - placeDefaultChicken(fx, fz, clBaseResource, undefined, oPeacock); - - // Create berry bushes - let angle = randFloat(0, 2 * PI); - let dist = 12; - createObjectGroup( - new SimpleGroup( - [new SimpleObject(oBush, 5, 5, 0, 3)], - true, - clBaseResource, - Math.round(fx + dist * Math.cos(angle)), - Math.round(fz + dist * Math.sin(angle))), - 0); - - // Create metal mine - angle += randFloat(PI/8, PI/4); - createObjectGroup( - new SimpleGroup( - [new SimpleObject(oMetalLarge, 1, 1, 0, 0)], - true, - clBaseResource, - Math.round(fx + dist * Math.cos(angle)), - Math.round(fz + dist * Math.sin(angle))), - 0); - - // Create stone mines - angle += randFloat(PI/8, PI/4); - createObjectGroup( - new SimpleGroup( - [new SimpleObject(oStoneLarge, 1, 1, 0, 2)], - true, - clBaseResource, - Math.round(fx + dist * Math.cos(angle)), - Math.round(fz + dist * Math.sin(angle))), - 0); - - // Create starting trees - let num = 40; - let tAngle = randFloat(-PI/3, 4*PI/3); - let tDist = randFloat(12, 13); - createObjectGroup( - new SimpleGroup( - [new SimpleObject(oTree, num, num, 0, 3)], - false, - clBaseResource, - Math.round(fx + tDist * Math.cos(tAngle)), - Math.round(fz + tDist * Math.sin(tAngle))), - 0, - avoidClasses(clBaseResource, 2)); -} +placePlayerBases({ + "PlayerPlacement": [playerIDs, playerX, playerZ], + "PlayerTileClass": clPlayer, + "BaseResourceClass": clBaseResource, + "Walls": "towers", + "CityPatch": { + "outerTerrain": tRoadWild, + "innerTerrain": tRoad, + "radius": playerRadius / 3 + }, + "Chicken": { + "template": oPeacock + }, + "Berries": { + "template": oBush + }, + "Mines": { + "types": [ + { "template": oMetalLarge }, + { "template": oStoneLarge } + ] + }, + "Trees": { + "template": oTree, + "count": 40 + } + // No decoratives +}); Engine.SetProgress(35); log("Creating gaia..."); diff --git a/binaries/data/mods/public/maps/random/rivers.js b/binaries/data/mods/public/maps/random/rivers.js index b7b36a047b..7400823600 100644 --- a/binaries/data/mods/public/maps/random/rivers.js +++ b/binaries/data/mods/public/maps/random/rivers.js @@ -69,6 +69,36 @@ var shallowHeight = -1; initTerrain(tMainTerrain); +var [playerIDs, playerX, playerZ, playerAngle, startAngle] = playerPlacementCircle(0.35); + +placePlayerBases({ + "PlayerPlacement": [playerIDs, playerX, playerZ], + "PlayerTileClass": clPlayer, + "BaseResourceClass": clBaseResource, + "CityPatch": { + "outerTerrain": tRoadWild, + "innerTerrain": tRoad + }, + "Chicken": { + }, + "Berries": { + "template": oFruitBush + }, + "Mines": { + "types": [ + { "template": oMetalLarge }, + { "template": oStoneLarge } + ] + }, + "Trees": { + "template": oTree1, + "count": 2 + }, + "Decoratives": { + "template": aGrassShort + } +}); + log("Creating central lake..."); createArea( new ClumpPlacer( @@ -85,85 +115,6 @@ createArea( ], null); -var [playerIDs, playerX, playerZ, playerAngle, startAngle] = radialPlayerPlacement(); - -for (var i = 0; i < numPlayers; i++) -{ - var id = playerIDs[i]; - log("Creating base for player " + id + "..."); - - var radius = scaleByMapSize(15,25); - var cliffRadius = 2; - var elevation = 20; - - // get the x and z in tiles - var fx = fractionToTiles(playerX[i]); - var fz = fractionToTiles(playerZ[i]); - var ix = Math.round(fx); - var iz = Math.round(fz); - addCivicCenterAreaToClass(ix, iz, clPlayer); - - // 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); - - placeCivDefaultEntities(fx, fz, id); - - placeDefaultChicken(fx, fz, clBaseResource); - - // create berry bushes - var bbAngle = randFloat(0, 2 * Math.PI); - var bbDist = 12; - var bbX = Math.round(fx + bbDist * cos(bbAngle)); - var bbZ = Math.round(fz + bbDist * sin(bbAngle)); - var group = new SimpleGroup( - [new SimpleObject(oFruitBush, 5,5, 0,3)], - true, clBaseResource, bbX, bbZ - ); - createObjectGroup(group, 0); - - // create metal mine - var mAngle = bbAngle; - while (Math.abs(mAngle - bbAngle) < Math.PI / 3) - mAngle = randFloat(0, 2 * Math.PI); - - var mDist = 12; - var mX = Math.round(fx + mDist * cos(mAngle)); - var mZ = Math.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 = Math.round(fx + mDist * cos(mAngle)); - mZ = Math.round(fz + mDist * sin(mAngle)); - group = new SimpleGroup( - [new SimpleObject(oStoneLarge, 1,1, 0,2)], - true, clBaseResource, mX, mZ - ); - createObjectGroup(group, 0); - - // create starting trees - var num = 2; - var tAngle = randFloat(-PI/3, 4*PI/3); - var tDist = randFloat(11, 13); - var tX = Math.round(fx + tDist * cos(tAngle)); - var tZ = Math.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); -} -Engine.SetProgress(20); - log("Creating rivers between opponents..."); let rivers = distributePointsOnCircle(numPlayers, startAngle + Math.PI / numPlayers, fractionToTiles(0.5), mapCenter)[0]; for (let i = 0; i < numPlayers; ++i) diff --git a/binaries/data/mods/public/maps/random/rmgen/misc.js b/binaries/data/mods/public/maps/random/rmgen/misc.js deleted file mode 100644 index 7a3b3233a2..0000000000 --- a/binaries/data/mods/public/maps/random/rmgen/misc.js +++ /dev/null @@ -1,43 +0,0 @@ -function placeDefaultChicken(playerX, playerZ, tileClass, constraint = undefined, template = "gaia/fauna_chicken") -{ - for (let j = 0; j < 2; ++j) - for (var tries = 0; tries < 10; ++tries) - { - let aAngle = randFloat(0, 2 * Math.PI); - - // Roman and ptolemian civic centers have a big footprint! - let aDist = 9; - - let aX = Math.round(playerX + aDist * cos(aAngle)); - let aZ = Math.round(playerZ + aDist * sin(aAngle)); - - let group = new SimpleGroup( - [new SimpleObject(template, 5,5, 0,2)], - true, tileClass, aX, aZ - ); - - if (createObjectGroup(group, 0, constraint)) - break; - } -} - -/** - * Typically used for placing grass tufts around the civic centers. - */ -function placeDefaultDecoratives(playerX, playerZ, template, tileclass, radius, constraint = undefined) -{ - for (let i = 0; i < PI * radius * radius / 250; ++i) - { - let angle = randFloat(0, 2 * PI); - let dist = radius - randIntInclusive(5, 11); - - createObjectGroup( - new SimpleGroup( - [new SimpleObject(template, 2, 5, 0, 1, -PI/8, PI/8)], - false, - tileclass, - Math.round(playerX + dist * Math.cos(angle)), - Math.round(playerZ + dist * Math.sin(angle)) - ), 0, constraint); - } -} diff --git a/binaries/data/mods/public/maps/random/rmgen/player.js b/binaries/data/mods/public/maps/random/rmgen/player.js index 54b671651d..0dc294be8b 100644 --- a/binaries/data/mods/public/maps/random/rmgen/player.js +++ b/binaries/data/mods/public/maps/random/rmgen/player.js @@ -2,6 +2,23 @@ * @file These functions locate and place the starting entities of players. */ +/** + * These are identifiers of functions that can generate parts of a player base. + * There must be a function starting with placePlayerBase and ending with this name. + * This is a global so mods can extend this from external files. + */ +var g_PlayerBaseFunctions = [ + // Possibly mark player class first here and use it afterwards + "CityPatch", + // Create the largest and most important entities first + "Trees", + "Mines", + "Treasures", + "Berries", + "Chicken", + "Decoratives" +]; + /** * Gets the default starting entities for the civ of the given player, as defined by the civ file. */ @@ -44,22 +61,86 @@ function placeStartingEntities(fx, fz, playerID, civEntities, dist = 6, orientat } /** - * Places the default starting entities as defined by the civilization definition and walls for Iberians. + * Places the default starting entities as defined by the civilization definition, optionally including city walls. */ -function placeCivDefaultEntities(fx, fz, playerID, kwargs, dist = 6, orientation = BUILDING_ORIENTATION) +function placeCivDefaultStartingEntities(x, z, playerID, wallType, dist = 6, orientation = BUILDING_ORIENTATION) { - placeStartingEntities(fx, fz, playerID, getStartingEntities(playerID), dist, orientation); + placeStartingEntities(x, z, playerID, getStartingEntities(playerID), dist, orientation); + placeStartingWalls(x, z, playerID, wallType, orientation); +} +/** + * If the map is large enough and the civilization defines them, places the initial city walls or towers. + * @param {string|boolean} wallType - Either "towers" to only place the wall turrets or a boolean indicating enclosing city walls. + */ +function placeStartingWalls(x, z, playerID, wallType, orientation = BUILDING_ORIENTATION) +{ let civ = getCivCode(playerID); - if (civ == "iber" && getMapSize() > 128) + if (civ != "iber" || getMapSize() <= 128) + return; + + if (wallType == "towers") + placePolygonalWall(x, z, 15, ["entry"], "tower", civ, playerID, orientation, 7); + else if (wallType) + placeGenericFortress(x, z, 20, playerID); +} + +/** + * Places the civic center and starting resources for all given players. + */ +function placePlayerBases(playerBaseArgs) +{ + let [playerIDs, playerX, playerZ] = playerBaseArgs.PlayerPlacement; + + for (let i = 0; i < getNumPlayers(); ++i) { - if (kwargs && kwargs.iberWall == "towers") - placePolygonalWall(fx, fz, 15, ["entry"], "tower", civ, playerID, orientation, 7); - else if (!kwargs || kwargs.iberWall) - placeGenericFortress(fx, fz, 20, playerID); + playerBaseArgs.playerID = playerIDs[i]; + playerBaseArgs.playerX = playerX[i]; + playerBaseArgs.playerZ = playerZ[i]; + placePlayerBase(playerBaseArgs); } } +/** + * Places the civic center and starting resources. + */ +function placePlayerBase(playerBaseArgs) +{ + log("Creating base for player " + playerBaseArgs.playerID + "..."); + + let fx = fractionToTiles(playerBaseArgs.playerX); + let fz = fractionToTiles(playerBaseArgs.playerZ); + + placeCivDefaultStartingEntities(fx, fz, playerBaseArgs.playerID, playerBaseArgs.Walls !== undefined ? playerBaseArgs.Walls : true); + + if (playerBaseArgs.PlayerTileClass !== undefined) + addCivicCenterAreaToClass(Math.round(fx), Math.round(fz), playerBaseArgs.PlayerTileClass); + + for (let functionID of g_PlayerBaseFunctions) + { + let funcName = "placePlayerBase" + functionID; + let func = global[funcName]; + if (!func) + throw new Error("Could not find " + funcName); + + if (!playerBaseArgs[functionID]) + continue; + + let args = playerBaseArgs[functionID]; + + // Copy some global arguments to the arguments for each function + for (let prop of ["playerID", "playerX", "playerZ", "BaseResourceClass", "baseResourceConstraint"]) + args[prop] = playerBaseArgs[prop]; + + func(args); + } +} + +function defaultPlayerBaseRadius() +{ + return scaleByMapSize(15, 25); +} + /** * Marks the corner and center tiles of an area that is about the size of a Civic Center with the given TileClass. * Used to prevent resource collisions with the Civic Center. @@ -75,6 +156,250 @@ function addCivicCenterAreaToClass(ix, iz, tileClass) addToClass(ix - 5, iz, tileClass); } +/** + * Helper function. + */ +function getPlayerBaseArgs(playerBaseArgs) +{ + let baseResourceConstraint = playerBaseArgs.BaseResourceClass && avoidClasses(playerBaseArgs.BaseResourceClass, 4); + + if (playerBaseArgs.baseResourceConstraint) + baseResourceConstraint = new AndConstraint([baseResourceConstraint, playerBaseArgs.baseResourceConstraint]); + + return [ + (property, defaultVal) => playerBaseArgs[property] === undefined ? defaultVal : playerBaseArgs[property], + new Vector2D(playerBaseArgs.playerX, playerBaseArgs.playerZ).mult(getMapSize()), + baseResourceConstraint + ]; +} + +function placePlayerBaseCityPatch(args) +{ + let [get, basePosition, baseResourceConstraint] = getPlayerBaseArgs(args); + + let painters = []; + + if (args.outerTerrain && args.innerTerrain) + painters.push(new LayeredPainter([args.outerTerrain, args.innerTerrain], [get("width", 1)])); + + if (args.painters) + painters = painters.concat(args.painters); + + createArea( + new ClumpPlacer( + Math.floor(diskArea(get("radius", defaultPlayerBaseRadius() / 3))), + get("coherence", 0.6), + get("smoothness", 0.3), + get("failFraction", 10), + Math.round(basePosition.x), + Math.round(basePosition.y)), + painters); +} + +function placePlayerBaseChicken(args) +{ + let [get, basePosition, baseResourceConstraint] = getPlayerBaseArgs(args); + + for (let i = 0; i < get("groupCount", 2); ++i) + { + let success = false; + for (let tries = 0; tries < get("maxTries", 30); ++tries) + { + let loc = new Vector2D(0, get("distance", 9)).rotate(randFloat(0, 2 * Math.PI)).add(basePosition); + if (createObjectGroup( + new SimpleGroup( + [new SimpleObject(get("template", "gaia/fauna_chicken"), 5, 5, 0, get("count", 2))], + true, + args.BaseResourceClass, + loc.x, + loc.y), + 0, + baseResourceConstraint)) + { + success = true; + break; + } + } + + if (!success) + { + error("Could not place chicken for player " + args.playerID); + return; + } + } +} + +function placePlayerBaseBerries(args) +{ + let [get, basePosition, baseResourceConstraint] = getPlayerBaseArgs(args); + for (let tries = 0; tries < get("maxTries", 30); ++tries) + { + let loc = new Vector2D(0, get("distance", 12)).rotate(randFloat(0, 2 * Math.PI)).add(basePosition); + if (createObjectGroup( + new SimpleGroup( + [new SimpleObject(args.template, get("minCount", 5), get("maxCount", 5), get("maxDist", 1), get("maxDist", 3))], + true, + args.BaseResourceClass, + loc.x, + loc.y), + 0, + baseResourceConstraint)) + return; + } + + error("Could not place berries for player " + args.playerID); +} + +function placePlayerBaseMines(args) +{ + let [get, basePosition, baseResourceConstraint] = getPlayerBaseArgs(args); + + let angleBetweenMines = randFloat(get("minAngle", Math.PI / 6), get("maxAngle", Math.PI / 3)); + let mineCount = args.types.length; + + let groupElements = []; + if (args.groupElements) + groupElements = groupElements.concat(args.groupElements); + + for (let tries = 0; tries < get("maxTries", 75); ++tries) + { + // First find a place where all mines can be placed + let pos = []; + let startAngle = randFloat(0, 2 * Math.PI); + for (let i = 0; i < mineCount; ++i) + { + let angle = startAngle + angleBetweenMines * (i + (mineCount - 1) / 2); + pos[i] = new Vector2D(0, get("distance", 12)).rotate(angle).add(basePosition).round(); + if (!g_Map.validT(pos[i].x, pos[i].y) || !baseResourceConstraint.allows(pos[i].x, pos[i].y)) + { + pos = undefined; + break; + } + } + + if (!pos) + continue; + + // Place the mines + for (let i = 0; i < mineCount; ++i) + { + if (args.types[i].type && args.types[i].type == "stone_formation") + { + createStoneMineFormation(pos[i].x, pos[i].y, args.types[i].template, args.types[i].terrain); + addToClass(pos[i].x, pos[i].y, args.BaseResourceClass); + continue; + } + + createObjectGroup( + new SimpleGroup( + [new SimpleObject(args.types[i].template, 1, 1, 0, 0)].concat(groupElements), + true, + args.BaseResourceClass, + pos[i].x, + pos[i].y), + 0); + } + return; + } + + error("Could not place mines for player " + args.playerID); +} + +function placePlayerBaseTrees(args) +{ + let [get, basePosition, baseResourceConstraint] = getPlayerBaseArgs(args); + + let num = Math.floor(get("count", scaleByMapSize(7, 20))); + + for (let x = 0; x < get("maxTries", 30); ++x) + { + let loc = new Vector2D(0, randFloat(get("minDist", 11), get("maxDist", 13))).rotate(randFloat(0, 2 * Math.PI)).add(basePosition).round(); + + if (createObjectGroup( + new SimpleGroup( + [new SimpleObject(args.template, num, num, get("minDistGroup", 0), get("maxDistGroup", 5))], + false, + args.BaseResourceClass, + loc.x, + loc.y), + 0, + baseResourceConstraint)) + return; + } + + error("Could not place starting trees for player " + args.playerID); +} + +function placePlayerBaseTreasures(args) +{ + let [get, basePosition, baseResourceConstraint] = getPlayerBaseArgs(args); + + for (let resourceTypeArgs of args.types) + { + get = (property, defaultVal) => resourceTypeArgs[property] === undefined ? defaultVal : resourceTypeArgs[property]; + + let success = false; + + for (let tries = 0; tries < get("maxTries", 30); ++tries) + { + let loc = new Vector2D(0, randFloat(get("minDist", 11), get("maxDist", 13))).rotate(randFloat(0, 2 * Math.PI)).add(basePosition).round(); + + if (createObjectGroup( + new SimpleGroup( + [new SimpleObject(resourceTypeArgs.template, get("count", 14), get("count", 14), get("minDistGroup", 1), get("maxDistGroup", 3))], + false, + args.BaseResourceClass, + loc.x, + loc.y), + 0, + baseResourceConstraint)) + { + success = true; + break; + } + } + if (!success) + { + error("Could not place treasure " + resourceTypeArgs.template + " for player " + args.playerID); + return; + } + } +} + +/** + * Typically used for placing grass tufts around the civic centers. + */ +function placePlayerBaseDecoratives(args) +{ + let [get, basePosition, baseResourceConstraint] = getPlayerBaseArgs(args); + + for (let i = 0; i < get("count", scaleByMapSize(2, 5)); ++i) + { + let success = false; + for (let x = 0; x < get("maxTries", 30); ++x) + { + let loc = new Vector2D(0, randIntInclusive(get("minDist", 8), get("maxDist", 11))).rotate(randFloat(0, 2 * Math.PI)).add(basePosition).round(); + + if (createObjectGroup( + new SimpleGroup( + [new SimpleObject(args.template, get("minCount", 2), get("maxCount", 5), 0, 1)], + false, + args.BaseResourceClass, + loc.x, + loc.y), + 0, + baseResourceConstraint)) + { + success = true; + break; + } + } + if (!success) + // Don't warn since the decoratives are not important + return; + } +} + /** * Sorts an array of player IDs by team index. Players without teams come first. * Randomize order for players of the same team. @@ -124,7 +449,7 @@ function primeSortAllPlayers() /** * Determine player starting positions on a circular pattern. */ -function radialPlayerPlacement(radius = 0.35, startingAngle = undefined, centerX = 0.5, centerZ = 0.5) +function playerPlacementCircle(radius, startingAngle = undefined, centerX = 0.5, centerZ = 0.5) { let startAngle = startingAngle !== undefined ? startingAngle : randFloat(0, 2 * Math.PI); let [locations, playerAngle] = distributePointsOnCircle(getNumPlayers(), startAngle, radius, new Vector2D(centerX, centerZ)); diff --git a/binaries/data/mods/public/maps/random/rmgen2/setup.js b/binaries/data/mods/public/maps/random/rmgen2/setup.js index 3227be2b0c..8aaa885841 100644 --- a/binaries/data/mods/public/maps/random/rmgen2/setup.js +++ b/binaries/data/mods/public/maps/random/rmgen2/setup.js @@ -164,98 +164,40 @@ function addBases(type, distance, groupedDistance, startAngle) */ function createBase(player, walls = true) { - var mapSize = getMapSize(); - - // Get the x and z in tiles - var fx = fractionToTiles(player.x); - var fz = fractionToTiles(player.z); - var ix = Math.round(fx); - var iz = Math.round(fz); - - addCivicCenterAreaToClass(ix, iz, g_TileClasses.player); - - if (walls && mapSize > 192) - placeCivDefaultEntities(fx, fz, player.id); - else - placeCivDefaultEntities(fx, fz, player.id, { 'iberWall': false }); - - // Create the city patch - var radius = scaleByMapSize(15, 25); - var cityRadius = radius / 3; - var placer = new ClumpPlacer(PI * cityRadius * cityRadius, 0.6, 0.3, 10, ix, iz); - var painter = new LayeredPainter([g_Terrains.roadWild, g_Terrains.road], [1]); - createArea(placer, painter, null); - - // TODO: retry loops are needed as resources might conflict with neighboring ones - - // Create initial berry bushes at random angle - var bbAngle = randFloat(0, 2 * Math.PI); - var bbDist = 10; - var bbX = Math.round(fx + bbDist * cos(bbAngle)); - var bbZ = Math.round(fz + bbDist * sin(bbAngle)); - var group = new SimpleGroup( - [new SimpleObject(g_Gaia.fruitBush, 5, 5, 0, 3)], - true, g_TileClasses.baseResource, bbX, bbZ - ); - createObjectGroup(group, 0, avoidClasses(g_TileClasses.baseResource, 2)); - - // Create metal mine at a different angle - var mAngle = bbAngle; - while (Math.abs(mAngle - bbAngle) < Math.PI / 3) - mAngle = randFloat(0, 2 * Math.PI); - - var mDist = 12; - var mX = Math.round(fx + mDist * cos(mAngle)); - var mZ = Math.round(fz + mDist * sin(mAngle)); - group = new SimpleGroup( - [new SimpleObject(g_Gaia.metalLarge, 1, 1, 0, 0)], - true, g_TileClasses.baseResource, mX, mZ - ); - createObjectGroup(group, 0, avoidClasses(g_TileClasses.baseResource, 2)); - - // Create stone mine beside metal - mAngle += randFloat(PI / 8, PI / 4); - mX = Math.round(fx + mDist * cos(mAngle)); - mZ = Math.round(fz + mDist * sin(mAngle)); - group = new SimpleGroup( - [new SimpleObject(g_Gaia.stoneLarge, 1, 1, 0, 2)], - true, g_TileClasses.baseResource, mX, mZ - ); - createObjectGroup(group, 0, avoidClasses(g_TileClasses.baseResource, 2)); - - placeDefaultChicken( - fx, - fz, - g_TileClasses.baseResource, - avoidClasses(g_TileClasses.baseResource, 4), - g_Gaia.chicken - ); - - // Create starting trees - var num = currentBiome() == "savanna" ? 5 : 15; - for (var tries = 0; tries < 10; ++tries) - { - var tAngle = randFloat(0, 2 * Math.PI); - var tDist = randFloat(12, 13); - var tX = Math.round(fx + tDist * cos(tAngle)); - var tZ = Math.round(fz + tDist * sin(tAngle)); - - group = new SimpleGroup( - [new SimpleObject(g_Gaia.tree1, num, num, 1, 3)], - false, g_TileClasses.baseResource, tX, tZ - ); - - if (createObjectGroup(group, 0, avoidClasses(g_TileClasses.baseResource, 4))) - break; - } - - placeDefaultDecoratives( - fx, - fz, - g_Decoratives.grassShort, - g_TileClasses.baseResource, - radius, - avoidClasses(g_TileClasses.baseResource, 4)); + placePlayerBase({ + "playerID": player.id, + "playerX": player.x, + "playerZ": player.z, + "PlayerTileClass": g_TileClasses.player, + "BaseResourceClass": g_TileClasses.baseResource, + "Walls": getMapSize() > 192 && walls, + "CityPatch": { + "outerTerrain": g_Terrains.roadWild, + "innerTerrain": g_Terrains.road, + "painters": [ + paintClass(g_TileClasses.player) + ] + }, + "Chicken": { + "template": g_Gaia.chicken + }, + "Berries": { + "template": g_Gaia.fruitBush + }, + "Mines": { + "types": [ + { "template": g_Gaia.metalLarge }, + { "template": g_Gaia.stoneLarge } + ] + }, + "Trees": { + "template": g_Gaia.tree1, + "count": currentBiome() == "savanna" ? 5 : 15 + }, + "Decoratives": { + "template": g_Decoratives.grassShort + } + }); } /** diff --git a/binaries/data/mods/public/maps/random/saharan_oases.js b/binaries/data/mods/public/maps/random/saharan_oases.js index 426fb0c5a0..e30b48094a 100644 --- a/binaries/data/mods/public/maps/random/saharan_oases.js +++ b/binaries/data/mods/public/maps/random/saharan_oases.js @@ -50,85 +50,34 @@ var clGrass = createTileClass(); var clPond = createTileClass(); var clTreasure = createTileClass(); -var [playerIDs, playerX, playerZ, playerAngle] = radialPlayerPlacement(); +var [playerIDs, playerX, playerZ, playerAngle] = playerPlacementCircle(0.35); -for (var i = 0; i < numPlayers; i++) -{ - var id = playerIDs[i]; - log("Creating base for player " + id + "..."); - - var radius = scaleByMapSize(15,25); - var cliffRadius = 2; - var elevation = 20; - - // get the x and z in tiles - var fx = fractionToTiles(playerX[i]); - var fz = fractionToTiles(playerZ[i]); - var ix = Math.floor(fx); - var iz = Math.floor(fz); - addToClass(ix, iz, clPlayer); - - // 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([tCityPlaza, tCity], [1]); - createArea(placer, painter, null); - - placeCivDefaultEntities(fx, fz, id); - - placeDefaultChicken(fx, fz, clBaseResource); - - // create berry bushes - var bbAngle = randFloat(0, 2 * Math.PI); - var bbDist = 12; - var bbX = Math.round(fx + bbDist * cos(bbAngle)); - var bbZ = Math.round(fz + bbDist * sin(bbAngle)); - var group = new SimpleGroup( - [new SimpleObject(oGrapeBush, 5,5, 0,3)], - true, clBaseResource, bbX, bbZ - ); - createObjectGroup(group, 0); - - // create metal mine - var mAngle = bbAngle; - while (Math.abs(mAngle - bbAngle) < Math.PI / 3) - { - mAngle = randFloat(0, 2 * Math.PI); +placePlayerBases({ + "PlayerPlacement": [playerIDs, playerX, playerZ], + "PlayerTileClass": clPlayer, + "BaseResourceClass": clBaseResource, + "CityPatch": { + "outerTerrain": tCityPlaza, + "innerTerrain": tCity + }, + "Chicken": { + }, + "Berries": { + "template": oGrapeBush + }, + "Mines": { + "types": [ + { "template": oMetalLarge }, + { "template": oStoneLarge } + ] + }, + "Trees": { + "template": oSDatePalm + }, + "Decoratives": { + "template": aBush1 } - var mDist = radius - 5; - var mX = Math.round(fx + mDist * cos(mAngle)); - var mZ = Math.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 = Math.round(fx + mDist * cos(mAngle)); - mZ = Math.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 = Math.floor(hillSize / 100); - var tAngle = randFloat(-PI/3, 4*PI/3); - var tDist = 12; - var tX = Math.round(fx + tDist * cos(tAngle)); - var tZ = Math.round(fz + tDist * sin(tAngle)); - group = new SimpleGroup( - [new SimpleObject(oSDatePalm, num, num, 0,5)], - false, clBaseResource, tX, tZ - ); - createObjectGroup(group, 0, avoidClasses(clBaseResource,2)); - - placeDefaultDecoratives(fx, fz, aBush1, clBaseResource, radius); -} - +}); Engine.SetProgress(30); log("Creating oases..."); diff --git a/binaries/data/mods/public/maps/random/sahel.js b/binaries/data/mods/public/maps/random/sahel.js index dde33e1bcf..9a785f699b 100644 --- a/binaries/data/mods/public/maps/random/sahel.js +++ b/binaries/data/mods/public/maps/random/sahel.js @@ -39,81 +39,39 @@ var clMetal = createTileClass(); var clFood = createTileClass(); var clBaseResource = createTileClass(); -var [playerIDs, playerX, playerZ] = radialPlayerPlacement(); - -for (var i = 0; i < numPlayers; i++) -{ - var id = playerIDs[i]; - log("Creating base for player " + id + "..."); - - var radius = scaleByMapSize(15,25); - var cliffRadius = 2; - var elevation = 20; - - // get the x and z in tiles - var fx = fractionToTiles(playerX[i]); - var fz = fractionToTiles(playerZ[i]); - var ix = Math.round(fx); - var iz = Math.round(fz); - addCivicCenterAreaToClass(ix, iz, clPlayer); - - placeCivDefaultEntities(fx, fz, id); - - placeDefaultChicken(fx, fz, clBaseResource); - - // create berry bushes - var bbAngle = randFloat(0, 2 * Math.PI); - var bbDist = 12; - var bbX = Math.round(fx + bbDist * cos(bbAngle)); - var bbZ = Math.round(fz + bbDist * sin(bbAngle)); - var group = new SimpleGroup( - [new SimpleObject(oBerryBush, 5,5, 0,3)], - true, clBaseResource, bbX, bbZ - ); - createObjectGroup(group, 0); - - // create metal mine - var mAngle = bbAngle; - while (Math.abs(mAngle - bbAngle) < Math.PI / 3) - { - mAngle = randFloat(0, 2 * Math.PI); +placePlayerBases({ + "PlayerPlacement": playerPlacementCircle(0.35), + "PlayerTileClass": clPlayer, + "BaseResourceClass": clBaseResource, + "CityPatch": { + "outerTerrain": tCityTiles, + "innerTerrain": tCityTiles + }, + "Chicken": { + }, + "Berries": { + "template": oBerryBush + }, + "Mines": { + "types": [ + { + "template": oMetalLarge + }, + { + "type": "stone_formation", + "template": oStoneSmall, + "terrain": tDirt4 + } + ] + }, + "Trees": { + "template": oBaobab, + "count": scaleByMapSize(2, 7), + "minDistGroup": 2, + "maxDistGroup": 7 } - var mDist = 13; - var mX = Math.round(fx + mDist * cos(mAngle)); - var mZ = Math.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 = Math.round(fx + mDist * cos(mAngle)); - mZ = Math.round(fz + mDist * sin(mAngle)); - createStoneMineFormation(mX, mZ, oStoneSmall, tDirt4); - addToClass(mX, mZ, clPlayer); - // 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 TerrainPainter(tCityTiles); - createArea(placer, painter, null); - - var hillSize = PI * radius * radius; - // create starting trees - var num = Math.floor(hillSize / 300); - var tAngle = randFloat(-PI/3, 4*PI/3); - var tDist = randFloat(11, 13); - var tX = Math.round(fx + tDist * cos(tAngle)); - var tZ = Math.round(fz + tDist * sin(tAngle)); - group = new SimpleGroup( - [new SimpleObject(oBaobab, num, num, 2,7)], - false, clBaseResource, tX, tZ - ); - createObjectGroup(group, 0, avoidClasses(clBaseResource,2)); - -} - + // No decoratives +}); Engine.SetProgress(20); log("Creating big patches..."); diff --git a/binaries/data/mods/public/maps/random/sahel_watering_holes.js b/binaries/data/mods/public/maps/random/sahel_watering_holes.js index ed7a95be71..3963d902e2 100644 --- a/binaries/data/mods/public/maps/random/sahel_watering_holes.js +++ b/binaries/data/mods/public/maps/random/sahel_watering_holes.js @@ -52,87 +52,38 @@ var clFood = createTileClass(); var clBaseResource = createTileClass(); var clShallows = createTileClass(); -var [playerIDs, playerX, playerZ, playerAngle, startAngle] = radialPlayerPlacement(); - var waterHeight = -4; var shallowHeight = -2; -for (var i = 0; i < numPlayers; i++) -{ - var id = playerIDs[i]; - log("Creating base for player " + id + "..."); +var [playerIDs, playerX, playerZ, playerAngle, startAngle] = playerPlacementCircle(0.35); - var radius = scaleByMapSize(15,25); - var cliffRadius = 2; - var elevation = 20; - - // get the x and z in tiles - var fx = fractionToTiles(playerX[i]); - var fz = fractionToTiles(playerZ[i]); - var ix = Math.round(fx); - var iz = Math.round(fz); - addCivicCenterAreaToClass(ix, iz, clPlayer); - - // 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); - - placeCivDefaultEntities(fx, fz, id); - - placeDefaultChicken(fx, fz, clBaseResource); - - // create berry bushes - var bbAngle = randFloat(0, 2 * Math.PI); - var bbDist = 12; - var bbX = Math.round(fx + bbDist * cos(bbAngle)); - var bbZ = Math.round(fz + bbDist * sin(bbAngle)); - var group = new SimpleGroup( - [new SimpleObject(oBerryBush, 5,5, 0,3)], - true, clBaseResource, bbX, bbZ - ); - createObjectGroup(group, 0); - - // create metal mine - var mAngle = bbAngle; - while (Math.abs(mAngle - bbAngle) < Math.PI / 3) - { - mAngle = randFloat(0, 2 * Math.PI); +placePlayerBases({ + "PlayerPlacement": [playerIDs, playerX, playerZ], + "PlayerTileClass": clPlayer, + "BaseResourceClass": clBaseResource, + "CityPatch": { + "outerTerrain": tRoadWild, + "innerTerrain": tRoad + }, + "Chicken": { + }, + "Berries": { + "template": oBerryBush + }, + "Mines": { + "types": [ + { "template": oMetalLarge }, + { "template": oStoneLarge } + ] + }, + "Trees": { + "template": oBaobab, + "count": 5 + }, + "Decoratives": { + "template": aGrassShort } - var mDist = 12; - var mX = Math.round(fx + mDist * cos(mAngle)); - var mZ = Math.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 = Math.round(fx + mDist * cos(mAngle)); - mZ = Math.round(fz + mDist * sin(mAngle)); - group = new SimpleGroup( - [new SimpleObject(oStoneLarge, 1,1, 0,2)], - true, clBaseResource, mX, mZ - ); - createObjectGroup(group, 0); - - // create starting trees - var num = 5; - var tAngle = randFloat(-PI/3, 4*PI/3); - var tDist = randFloat(12, 13); - var tX = Math.round(fx + tDist * cos(tAngle)); - var tZ = Math.round(fz + tDist * sin(tAngle)); - group = new SimpleGroup( - [new SimpleObject(oBaobab, num, num, 0,3)], - false, clBaseResource, tX, tZ - ); - createObjectGroup(group, 0, avoidClasses(clBaseResource,2)); - - placeDefaultDecoratives(fx, fz, aGrassShort, clBaseResource, radius); -} +}); Engine.SetProgress(20); log("Creating rivers..."); diff --git a/binaries/data/mods/public/maps/random/schwarzwald.js b/binaries/data/mods/public/maps/random/schwarzwald.js index df48aad623..b5e229cbe9 100644 --- a/binaries/data/mods/public/maps/random/schwarzwald.js +++ b/binaries/data/mods/public/maps/random/schwarzwald.js @@ -31,8 +31,6 @@ var clOpen = createTileClass(); var templateStoneMine = 'gaia/geology_stonemine_alpine_quarry'; var templateMetalMine = 'gaia/geology_metal_alpine_slabs'; -var startingResources = ['gaia/flora_tree_pine', 'gaia/flora_tree_pine','gaia/flora_tree_pine', templateStoneMine, - 'gaia/flora_bush_grapes', 'gaia/flora_tree_aleppo_pine','gaia/flora_tree_aleppo_pine','gaia/flora_tree_aleppo_pine', 'gaia/flora_bush_berry', templateMetalMine]; var aGrass = 'actor|props/flora/grass_soft_small_tall.xml'; var aGrassShort = 'actor|props/flora/grass_soft_large.xml'; var aRockLarge = 'actor|geology/stone_granite_med.xml'; @@ -94,7 +92,6 @@ var maxPlayerRadius = Math.min(mapRadius - baseRadius, 3/4 * mapRadius); var playerStartLocX = []; var playerStartLocZ = []; -var playerAngle = []; var playerAngleStart = randFloat(0, 2*PI); var playerAngleAddAvrg = 2*PI / numPlayers; var playerAngleMaxOff = playerAngleAddAvrg/4; @@ -137,8 +134,6 @@ for (var i = 0; i < 5; i++) globalSmoothHeightmap(); rescaleHeightmap(heightRange.min, heightRange.max); -Engine.SetProgress(50); - ////////// // Setup height limit ////////// @@ -168,37 +163,52 @@ var playerHeight = (heighLimits[4] + heighLimits[5]) / 2; for (var i=0; i < numPlayers; i++) { - playerAngle[i] = (playerAngleStart + i*playerAngleAddAvrg + randFloat(0, playerAngleMaxOff))%(2*PI); - - var x = Math.round(mapCenterX + randFloat(minPlayerRadius, maxPlayerRadius)*cos(playerAngle[i])); - var z = Math.round(mapCenterZ + randFloat(minPlayerRadius, maxPlayerRadius)*sin(playerAngle[i])); + let playerAngle = (playerAngleStart + i * playerAngleAddAvrg + randFloat(0, playerAngleMaxOff)) % (2* Math.PI); + let x = Math.round(mapCenterX + randFloat(minPlayerRadius, maxPlayerRadius) * Math.cos(playerAngle)); + let z = Math.round(mapCenterZ + randFloat(minPlayerRadius, maxPlayerRadius) * Math.sin(playerAngle)); playerStartLocX[i] = x; playerStartLocZ[i] = z; rectangularSmoothToHeight({"x": x,"y": z} , 20, 20, playerHeight, 0.8); - - placeCivDefaultEntities(x, z, i+1, { 'iberWall': false }); - - // Place base texture - var placer = new ClumpPlacer(2*baseRadius*baseRadius, 2/3, 1/8, 10, x, z); - var painter = [new TerrainPainter([baseTex], [baseRadius/4, baseRadius/4]), paintClass(clPlayer)]; - createArea(placer, painter); - - // Place starting resources - var distToSL = 15; - var resStartAngle = playerAngle[i] + PI; - var resAddAngle = 2*PI / startingResources.length; - for (var rIndex = 0; rIndex < startingResources.length; rIndex++) - { - var angleOff = randFloat(-resAddAngle/2, resAddAngle/2); - var placeX = x + distToSL*cos(resStartAngle + rIndex*resAddAngle + angleOff); - var placeZ = z + distToSL*sin(resStartAngle + rIndex*resAddAngle + angleOff); - placeObject(placeX, placeZ, startingResources[rIndex], 0, randFloat(0, 2*PI)); - addToClass(Math.round(placeX), Math.round(placeZ), clBaseResource); - } } +placePlayerBases({ + "PlayerPlacement": [sortAllPlayers(), playerStartLocX.map(tilesToFraction), playerStartLocZ.map(tilesToFraction)], + "BaseResourceClass": clBaseResource, + "Walls": false, + // player class painted below + "CityPatch": { + "radius": 0.8 * baseRadius, + "smoothness": 1/8, + "painters": [ + new TerrainPainter([baseTex], [baseRadius/4, baseRadius/4]), + paintClass(clPlayer) + ] + }, + // No chicken + "Berries": { + "template": "gaia/flora_bush_berry", + "minCount": 2, + "maxCount": 2, + "minDist": 10, + "maxDist": 10 + }, + "Mines": { + "types": [ + { "template": templateMetalMine }, + { "template": templateStoneMine } + ], + "distance": 15, + "minAngle": Math.PI / 2, + "maxAngle": Math.PI + }, + "Trees": { + "template": "gaia/flora_tree_oak_large", + "count": 2 + } +}); + // Add further stone and metal mines distributeEntitiesByHeight({ 'min': heighLimits[3], 'max': ((heighLimits[4] + heighLimits[3]) / 2) }, startLocations, 40, [templateStoneMine, templateMetalMine]); distributeEntitiesByHeight({ 'min': ((heighLimits[5] + heighLimits[6]) / 2), 'max': heighLimits[7] }, startLocations, 40, [templateStoneMine, templateMetalMine]); diff --git a/binaries/data/mods/public/maps/random/snowflake_searocks.js b/binaries/data/mods/public/maps/random/snowflake_searocks.js index 1f33595955..668ab6bea7 100644 --- a/binaries/data/mods/public/maps/random/snowflake_searocks.js +++ b/binaries/data/mods/public/maps/random/snowflake_searocks.js @@ -61,7 +61,7 @@ const islandBetweenPlayerAndCenterDist = 0.16; const islandBetweenPlayerAndCenterRadius = 0.81; const centralIslandRadius = 0.36; -var [playerIDs, playerX, playerZ, playerAngle, startAngle] = radialPlayerPlacement(); +var [playerIDs, playerX, playerZ, playerAngle, startAngle] = playerPlacementCircle(0.35); var numIslands = 0; var isConnected = []; @@ -218,76 +218,39 @@ for (let i = 0; i < numPlayers; ++i) createIsland(i, 1, clPlayer); } -for (var i = 0; i < numPlayers; ++i) -{ - var id = playerIDs[i]; - log("Creating base for player " + id + "..."); - - // get the x and z in tiles - var fx = fractionToTiles(playerX[i]); - var fz = fractionToTiles(playerZ[i]); - var ix = Math.round(fx); - var iz = Math.round(fz); - - // create the city patch - var cityRadius = playerIslandRadius/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); - - placeCivDefaultEntities(fx, fz, id, { 'iberWall': 'towers' }); - - placeDefaultChicken(fx, fz, clBaseResource); - - // create berry bushes - var bbAngle = randFloat(0, 2 * Math.PI); - var bbDist = 10; - var bbX = Math.round(fx + bbDist * cos(bbAngle)); - var bbZ = Math.round(fz + bbDist * sin(bbAngle)); - var group = new SimpleGroup( - [new SimpleObject(oFruitBush, 5,5, 0,3)], - true, clBaseResource, bbX, bbZ - ); - createObjectGroup(group, 0); - - // create metal mine - var mAngle = bbAngle; - while (Math.abs(mAngle - bbAngle) < Math.PI / 3) - mAngle = randFloat(0, 2 * Math.PI); - - var mDist = playerIslandRadius - 4; - var mX = Math.round(fx + mDist * cos(mAngle)); - var mZ = Math.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 = Math.round(fx + mDist * cos(mAngle)); - mZ = Math.round(fz + mDist * sin(mAngle)); - group = new SimpleGroup( - [new SimpleObject(oStoneLarge, 1,1, 0,2)], - true, clBaseResource, mX, mZ - ); - createObjectGroup(group, 0); - - // create starting trees - var num = Math.floor(scaleByMapSize(10, 50)); - var tAngle = randFloat(-PI/3, 4*PI/3); - var tDist = 11; - var tX = Math.round(fx + tDist * cos(tAngle)); - var tZ = Math.round(fz + tDist * sin(tAngle)); - group = new SimpleGroup( - [new SimpleObject(oTree1, num, num, 0,4)], - false, clBaseResource, tX, tZ - ); - createObjectGroup(group, 0, [avoidClasses(clBaseResource,2), stayClasses(clPlayer, 3)]); - - placeDefaultDecoratives(fx, fz, aGrassShort, clBaseResource, playerIslandRadius); -} +placePlayerBases({ + "PlayerPlacement": [playerIDs, playerX, playerZ], + // PlayerTileClass already marked above + "BaseResourceClass": clBaseResource, + "baseResourceConstraint": stayClasses(clPlayer, 4), + "Walls": "towers", + "CityPatch": { + "outerTerrain": tRoadWild, + "innerTerrain": tRoad + }, + "Chicken": { + }, + "Berries": { + "template": oFruitBush, + "distance": playerIslandRadius - 4 + }, + "Mines": { + "types": [ + { "template": oMetalLarge }, + { "template": oStoneLarge } + ], + "distance": playerIslandRadius - 4 + }, + "Trees": { + "template": oTree1, + "count": scaleByMapSize(10, 50), + "minDist": 11, + "maxDist": 11 + }, + "Decoratives": { + "template": aGrassShort + } +}); Engine.SetProgress(30); log("Creating connectors..."); diff --git a/binaries/data/mods/public/maps/random/survivalofthefittest.js b/binaries/data/mods/public/maps/random/survivalofthefittest.js index d7933bd9fd..ff1de2d541 100644 --- a/binaries/data/mods/public/maps/random/survivalofthefittest.js +++ b/binaries/data/mods/public/maps/random/survivalofthefittest.js @@ -66,7 +66,7 @@ createArea( ]); Engine.SetProgress(10); -var [playerIDs, playerX, playerZ, playerAngle, startAngle] = radialPlayerPlacement(0.3); +var [playerIDs, playerX, playerZ, playerAngle, startAngle] = playerPlacementCircle(0.3); var halfway = distributePointsOnCircle(numPlayers, startAngle, fractionToTiles(0.375), mapCenter)[0].map(v => v.round()); var attacker = distributePointsOnCircle(numPlayers, startAngle, fractionToTiles(0.45), mapCenter)[0].map(v => v.round()); var passage = distributePointsOnCircle(numPlayers, startAngle + Math.PI / numPlayers, fractionToTiles(0.5), mapCenter)[0]; @@ -79,7 +79,12 @@ for (let i = 0; i < numPlayers; ++i) placeStartingEntities(playerPos.x, playerPos.y, playerIDs[i], getStartingEntities(playerIDs[i]).filter(ent => ent.Template.indexOf("civil_centre") != -1 || ent.Template.indexOf("infantry") != -1)); - placeDefaultDecoratives(playerPos.x, playerPos.y, aGrassShort, clBaseResource, scaleByMapSize(15, 25)); + placePlayerBaseDecoratives({ + "playerX": playerX[i], + "playerZ": playerZ[i], + "template": aGrassShort, + "BaseResourceClass": clBaseResource + }); log("Creating passage separating players..."); createArea( diff --git a/binaries/data/mods/public/maps/random/syria.js b/binaries/data/mods/public/maps/random/syria.js index 409ee0eab9..b12877bc62 100644 --- a/binaries/data/mods/public/maps/random/syria.js +++ b/binaries/data/mods/public/maps/random/syria.js @@ -45,7 +45,7 @@ var clFood = createTileClass(); var clBaseResource = createTileClass(); var clGrass = createTileClass(); -var [playerIDs, playerX, playerZ] = radialPlayerPlacement(); +var [playerIDs, playerX, playerZ] = playerPlacementCircle(0.35); for (let i = 0; i < numPlayers; ++i) { @@ -67,78 +67,34 @@ for (let i = 0; i < numPlayers; ++i) } Engine.SetProgress(10); -for (var i = 0; i < numPlayers; i++) -{ - var id = playerIDs[i]; - log("Creating base for player " + id + "..."); - - // scale radius of player area by map size - var radius = scaleByMapSize(15,25); - - // get the x and z in tiles - var fx = fractionToTiles(playerX[i]); - var fz = fractionToTiles(playerZ[i]); - var ix = Math.round(fx); - var iz = Math.round(fz); - - // create the city patch - var placer = new ClumpPlacer(diskArea(10), 0.6, 0.3, 10, ix, iz); - var painter = new LayeredPainter([tRoadWild, tRoad], [3]); - createArea(placer, painter, null); - - placeCivDefaultEntities(fx, fz, id); - - placeDefaultChicken(fx, fz, clBaseResource); - - // create berry bushes - var bbAngle = randFloat(0, 2 * Math.PI); - var bbDist = 12; - var bbX = Math.round(fx + bbDist * cos(bbAngle)); - var bbZ = Math.round(fz + bbDist * sin(bbAngle)); - var group = new SimpleGroup( - [new SimpleObject(oBush, 5,5, 0,3)], - true, clBaseResource, bbX, bbZ - ); - createObjectGroup(group, 0); - - // create metal mine - var mAngle = bbAngle; - while (Math.abs(mAngle - bbAngle) < Math.PI / 3) - { - mAngle = randFloat(0, 2 * Math.PI); +placePlayerBases({ + "PlayerPlacement": [playerIDs, playerX, playerZ], + // PlayerTileClass marked above + "BaseResourceClass": clBaseResource, + "CityPatch": { + "outerTerrain": tRoadWild, + "innerTerrain": tRoad, + "radius": 10, + "width": 3 + }, + "Chicken": { + }, + "Berries": { + "template": oBush + }, + "Mines": { + "types": [ + { "template": oMetalLarge }, + { "template": oStoneLarge } + ], + "groupElements": [new RandomObject(aBushes, 2, 4, 2, 3)] + }, + "Trees": { + "template": pickRandom([oPalm, oTamarix]), + "count": 3 } - var mDist = 11; - var mX = Math.round(fx + mDist * cos(mAngle)); - var mZ = Math.round(fz + mDist * sin(mAngle)); - group = new SimpleGroup( - [new SimpleObject(oMetalLarge, 1,1, 0,0), new RandomObject(aBushes, 2,4, 0,2)], - true, clBaseResource, mX, mZ - ); - createObjectGroup(group, 0); - - // create stone mines - mAngle += randFloat(PI/8, PI/4); - mX = Math.round(fx + mDist * cos(mAngle)); - mZ = Math.round(fz + mDist * sin(mAngle)); - group = new SimpleGroup( - [new SimpleObject(oStoneLarge, 1,1, 0,2), new RandomObject(aBushes, 2,4, 0,2)], - true, clBaseResource, mX, mZ - ); - createObjectGroup(group, 0); - - // create starting trees - var num = 3; - var tAngle = randFloat(-PI/3, 4*PI/3); - var tDist = randFloat(11, 13); - var tX = Math.round(fx + tDist * cos(tAngle)); - var tZ = Math.round(fz + tDist * sin(tAngle)); - group = new SimpleGroup( - [new SimpleObject(pickRandom([oPalm, oTamarix]), num, num, 0,5)], - false, clBaseResource, tX, tZ - ); - createObjectGroup(group, 0, avoidClasses(clBaseResource,2)); -} - + // No decoratives +}); Engine.SetProgress(20); log("Creating bumps..."); diff --git a/binaries/data/mods/public/maps/random/the_nile.js b/binaries/data/mods/public/maps/random/the_nile.js index 3789ece3e4..1810149e8a 100644 --- a/binaries/data/mods/public/maps/random/the_nile.js +++ b/binaries/data/mods/public/maps/random/the_nile.js @@ -61,83 +61,33 @@ var clPond = createTileClass(); var clShore = createTileClass(); var clTreasure = createTileClass(); -var [playerIDs, playerX, playerZ] = playerPlacementRiver(0, 0.4); - -for (var i = 0; i < numPlayers; i++) -{ - var id = playerIDs[i]; - log("Creating base for player " + id + "..."); - - var radius = scaleByMapSize(15,25); - var cliffRadius = 2; - var elevation = 20; - - // get the x and z in tiles - var fx = fractionToTiles(playerX[i]); - var fz = fractionToTiles(playerZ[i]); - var ix = Math.floor(fx); - var iz = Math.floor(fz); - addToClass(ix, iz, clPlayer); - - // 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([tCityPlaza, tCity], [1]); - createArea(placer, painter, null); - - placeCivDefaultEntities(fx, fz, id); - - placeDefaultChicken(fx, fz, clBaseResource); - - // create berry bushes - var bbAngle = randFloat(0, 2 * Math.PI); - var bbDist = 12; - var bbX = Math.round(fx + bbDist * cos(bbAngle)); - var bbZ = Math.round(fz + bbDist * sin(bbAngle)); - var group = new SimpleGroup( - [new SimpleObject(oBerryBush, 5,5, 0,3)], - true, clBaseResource, bbX, bbZ - ); - createObjectGroup(group, 0); - - // create metal mine - var mAngle = bbAngle; - while (Math.abs(mAngle - bbAngle) < Math.PI / 3) - mAngle = randFloat(0, 2 * Math.PI); - var mDist = radius - 4; - var mX = Math.round(fx + mDist * cos(mAngle)); - var mZ = Math.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 = Math.round(fx + mDist * cos(mAngle)); - mZ = Math.round(fz + mDist * sin(mAngle)); - group = new SimpleGroup( - [new SimpleObject(oStoneLarge, 1,1, 0,2)], - true, clBaseResource, mX, mZ - ); - createObjectGroup(group, 0); - - // create starting trees - var num = 2; - var tAngle = randFloat(-PI/3, 4*PI/3); - var tDist = randFloat(11, 13); - var tX = Math.round(fx + tDist * cos(tAngle)); - var tZ = Math.round(fz + tDist * sin(tAngle)); - group = new SimpleGroup( - [new SimpleObject(oDatePalm, num, num, 0,5)], - false, clBaseResource, tX, tZ - ); - createObjectGroup(group, 0, avoidClasses(clBaseResource,2)); - - placeDefaultDecoratives(fx, fz, aBush1, clBaseResource, radius); -} - +placePlayerBases({ + "PlayerPlacement": playerPlacementRiver(0, 0.4), + "PlayerTileClass": clPlayer, + "BaseResourceClass": clBaseResource, + "CityPatch": { + "outerTerrain": tCityPlaza, + "innerTerrain": tCity + }, + "Chicken": { + }, + "Berries": { + "template": oBerryBush + }, + "Mines": { + "types": [ + { "template": oMetalLarge }, + { "template": oStoneLarge } + ] + }, + "Trees": { + "template": oDatePalm, + "count": 2 + }, + "Decoratives": { + "template": aBush1 + } +}); Engine.SetProgress(30); const riverTextures = [ 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 index 2fda095134..169aacaf7f 100644 --- a/binaries/data/mods/public/maps/random/the_unknown/unknown_common.js +++ b/binaries/data/mods/public/maps/random/the_unknown/unknown_common.js @@ -109,7 +109,7 @@ var playerX = []; var playerZ = []; var g_StartingTreasures = false; -var g_IberianWalls = "walls"; +var g_StartingWalls = true; function createUnknownMap() { @@ -131,10 +131,10 @@ function createUnknownMap() */ function unknownArchipelago() { - g_IberianWalls = "towers"; + g_StartingWalls = "towers"; g_StartingTreasures = true; - let [pIDs, islandX, islandZ] = radialPlayerPlacement(); + let [pIDs, islandX, islandZ] = playerPlacementCircle(0.35); if (g_PlayerBases) { [playerIDs, playerX, playerZ] = [pIDs, islandX, islandZ]; @@ -219,7 +219,7 @@ function unknownContinent() if (g_PlayerBases) { log("Ensuring player area..."); - [playerIDs, playerX, playerZ] = radialPlayerPlacement(0.25); + [playerIDs, playerX, playerZ] = playerPlacementCircle(0.25); markPlayerArea("small"); for (let i = 0; i < numPlayers; ++i) @@ -419,7 +419,7 @@ function unknownRiversAndLake() if (g_PlayerBases) { let playerAngle; - [playerIDs, playerX, playerZ, playerAngle, startAngle] = radialPlayerPlacement(); + [playerIDs, playerX, playerZ, playerAngle, startAngle] = playerPlacementCircle(0.35); markPlayerArea("small"); } @@ -575,7 +575,7 @@ function unknownLakes() if (g_PlayerBases) { - [playerIDs, playerX, playerZ] = radialPlayerPlacement(); + [playerIDs, playerX, playerZ] = playerPlacementCircle(0.35); markPlayerArea("large"); } @@ -603,7 +603,7 @@ function unknownPasses() let startAngle; if (g_PlayerBases) { - [playerIDs, playerX, playerZ, playerAngle, startAngle] = radialPlayerPlacement(); + [playerIDs, playerX, playerZ, playerAngle, startAngle] = playerPlacementCircle(0.35); markPlayerArea("small"); } else @@ -682,7 +682,7 @@ function unknownLowlands() let startAngle; if (g_PlayerBases) { - [playerIDs, playerX, playerZ, playerAngle, startAngle] = radialPlayerPlacement(); + [playerIDs, playerX, playerZ, playerAngle, startAngle] = playerPlacementCircle(0.35); markPlayerArea("small"); } else @@ -734,7 +734,7 @@ function unknownMainland() if (g_PlayerBases) { - [playerIDs, playerX, playerZ] = radialPlayerPlacement(); + [playerIDs, playerX, playerZ] = playerPlacementCircle(0.35); markPlayerArea("small"); } } @@ -1031,94 +1031,41 @@ function createUnknownObjects() 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 = Math.round(fx); - var iz = Math.round(fz); - - placeCivDefaultEntities(fx, fz, id, { "iberWall": g_IberianWalls }); - - placeDefaultChicken(fx, fz, clBaseResource); - - // create berry bushes - var bbAngle = randFloat(0, 2 * Math.PI); - var bbDist = 12; - var bbX = Math.round(fx + bbDist * cos(bbAngle)); - var bbZ = Math.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, 2 * Math.PI); - var bbDist = 13; - var bbX = Math.round(fx + bbDist * cos(bbAngle)); - var bbZ = Math.round(fz + bbDist * sin(bbAngle)); - group = new SimpleGroup( - [new SimpleObject(oWoodTreasure, 14, 14, 0, 3)], - true, clBaseResource, bbX, bbZ - ); - createObjectGroup(group, 0); + placePlayerBases({ + "PlayerPlacement": [playerIDs, playerX, playerZ], + "BaseResourceClass": clBaseResource, + "Walls": g_StartingWalls, + "CityPatch": { + "outerTerrain": tRoadWild, + "innerTerrain": tRoad, + "painters": [ + paintClass(clPlayer) + ] + }, + "Chicken": { + }, + "Berries": { + "template": oFruitBush + }, + "Mines": { + "types": [ + { "template": oMetalLarge }, + { "template": oStoneLarge } + ] + }, + "Treasures": { + "types": [ + { + "template": oWoodTreasure, + "count": g_StartingTreasures ? 14 : 0 + } + ] + }, + "Trees": { + "template": oTree1 + }, + "Decoratives": { + "template": aGrassShort } - - // create metal mine - var mAngle = bbAngle; - while (Math.abs(mAngle - bbAngle) < Math.PI / 3) - { - mAngle = randFloat(0, 2 * Math.PI); - } - var mDist = 12; - var mX = Math.round(fx + mDist * cos(mAngle)); - var mZ = Math.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 = Math.round(fx + mDist * cos(mAngle)); - mZ = Math.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 = Math.floor(hillSize / 100); - var tAngle = randFloat(-PI/3, 4*PI/3); - var tDist = randFloat(11, 13); - var tX = Math.round(fx + tDist * cos(tAngle)); - var tZ = Math.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, paintClass(clPlayer)], null); - } + }); } diff --git a/binaries/data/mods/public/maps/random/volcanic_lands.js b/binaries/data/mods/public/maps/random/volcanic_lands.js index 042a622fb1..82f8d4d25e 100644 --- a/binaries/data/mods/public/maps/random/volcanic_lands.js +++ b/binaries/data/mods/public/maps/random/volcanic_lands.js @@ -34,74 +34,26 @@ var clRock = createTileClass(); var clMetal = createTileClass(); var clBaseResource = createTileClass(); -var [playerIDs, playerX, playerZ] = radialPlayerPlacement(); - -for (var i = 0; i < numPlayers; i++) -{ - var id = playerIDs[i]; - log("Creating base for player " + id + "..."); - - var radius = scaleByMapSize(15,25); - - // get the x and z in tiles - var fx = fractionToTiles(playerX[i]); - var fz = fractionToTiles(playerZ[i]); - var ix = Math.round(fx); - var iz = Math.round(fz); - addCivicCenterAreaToClass(ix, iz, clPlayer); - - // 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); - - placeCivDefaultEntities(fx, fz, id); - - // create metal mine - var bbAngle = randFloat(0, 2 * Math.PI); - var bbDist = 12; - var mAngle = bbAngle; - while (Math.abs(mAngle - bbAngle) < Math.PI / 3) - mAngle = randFloat(0, 2 * Math.PI); - - var mDist = 12; - var mX = Math.round(fx + mDist * cos(mAngle)); - var mZ = Math.round(fz + mDist * sin(mAngle)); - var 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 = Math.round(fx + mDist * cos(mAngle)); - mZ = Math.round(fz + mDist * sin(mAngle)); - group = new SimpleGroup( - [new SimpleObject(oStoneLarge, 1,1, 0,2)], - true, clBaseResource, mX, mZ - ); - createObjectGroup(group, 0); - - // create starting trees - var hillSize = PI * radius * radius; - var num = Math.floor(hillSize / 60); - var tries = 10; - for (var x = 0; x < tries; ++x) - { - var tAngle = randFloat(-PI/3, 4*PI/3); - var tDist = randFloat(12, 13); - var tX = Math.round(fx + tDist * cos(tAngle)); - var tZ = Math.round(fz + tDist * sin(tAngle)); - group = new SimpleGroup( - [new SimpleObject(oTree, num, num, 0, 3)], - false, clBaseResource, tX, tZ - ); - if (createObjectGroup(group, 0, avoidClasses(clBaseResource, 2))) - break; +placePlayerBases({ + "PlayerPlacement": playerPlacementCircle(0.35), + "PlayerTileClass": clPlayer, + "BaseResourceClass": clBaseResource, + "CityPatch": { + "outerTerrain": tRoadWild, + "innerTerrain": tRoad + }, + // No berries, no chicken, no decoratives + "Mines": { + "types": [ + { "template": oMetalLarge }, + { "template": oStoneLarge } + ] + }, + "Trees": { + "template": oTree, + "count": scaleByMapSize(12, 30) } -} +}); Engine.SetProgress(15); createVolcano(0.5, 0.5, clHill, tCliff, [tLava1, tLava2, tLava3], true, ELEVATION_SET); diff --git a/binaries/data/mods/public/maps/random/wild_lake.js b/binaries/data/mods/public/maps/random/wild_lake.js index 2aaab6a7dc..1cd70d1c45 100644 --- a/binaries/data/mods/public/maps/random/wild_lake.js +++ b/binaries/data/mods/public/maps/random/wild_lake.js @@ -610,7 +610,7 @@ Engine.SetProgress(55); for (let p = 0; p < playerIDs.length; ++p) { let point = startLocations[p]; - placeCivDefaultEntities(point.x, point.y, playerIDs[p], { "iberWall": g_Map.size > 192 }); + placeCivDefaultStartingEntities(point.x, point.y, playerIDs[p], g_Map.size > 192); placeStartLocationResources(point); }