From ac4e25e17f8afd86fced37dffd482ffe52d8168d Mon Sep 17 00:00:00 2001 From: Spahbod Date: Mon, 23 Apr 2012 08:58:55 +0000 Subject: [PATCH] Added volcanic lands and a new islands random maps. Changed the name of previous islands map to "cycladic archipelago". This was SVN commit r11653. --- .../maps/random/cycladic_archipelago.js | 586 +++++++++ .../maps/random/cycladic_archipelago.json | 11 + .../data/mods/public/maps/random/islands.js | 1133 ++++++++--------- .../data/mods/public/maps/random/islands.json | 4 +- .../mods/public/maps/random/volcanic_lands.js | 380 ++++++ .../public/maps/random/volcanic_lands.json | 12 + 6 files changed, 1538 insertions(+), 588 deletions(-) create mode 100644 binaries/data/mods/public/maps/random/cycladic_archipelago.js create mode 100644 binaries/data/mods/public/maps/random/cycladic_archipelago.json create mode 100644 binaries/data/mods/public/maps/random/volcanic_lands.js create mode 100644 binaries/data/mods/public/maps/random/volcanic_lands.json diff --git a/binaries/data/mods/public/maps/random/cycladic_archipelago.js b/binaries/data/mods/public/maps/random/cycladic_archipelago.js new file mode 100644 index 0000000000..8a5e01ac11 --- /dev/null +++ b/binaries/data/mods/public/maps/random/cycladic_archipelago.js @@ -0,0 +1,586 @@ +RMS.LoadLibrary("rmgen"); + +// terrain textures +const tOceanDepths = "medit_sea_depths"; +const tOceanRockDeep = "medit_sea_coral_deep"; +const tOceanRockShallow = "medit_rocks_wet"; +const tOceanCoral = "medit_sea_coral_plants"; +const tBeachWet = "medit_sand_wet"; +const tBeachDry = "medit_sand"; +const tBeachGrass = "medit_rocks_grass"; +const tBeach = ["medit_rocks_grass","medit_sand", "medit_rocks_grass_shrubs"] +//const tBeachBlend = ["medit_rocks_grass","medit_grass_field_dry", "medit_grass_field_brown","medit_rocks_shrubs", "medit_rocks_grass_shrubs"]; +const tBeachBlend = ["medit_rocks_grass", "medit_rocks_grass_shrubs"]; +const tBeachCliff = "medit_dirt"; +const tCity = "medit_city_tile"; +const tGrassDry = ["medit_grass_field_dry", "medit_grass_field_b"]; +//const tGrass = ["medit_grass_field_dry", "medit_grass_field_brown", "medit_grass_field_b"]; +const tGrass = ["medit_rocks_grass", "medit_rocks_grass","medit_dirt","medit_rocks_grass_shrubs"]; +const tGrassLush = ["grass_temperate_dry_tufts", "medit_grass_flowers"]; +const tGrassShrubs = "medit_shrubs"; +const tCliffShrubs = ["medit_cliff_aegean_shrubs", "medit_cliff_italia_grass","medit_cliff_italia"] +const tGrassRock = ["medit_rocks_grass"]; +const tDirt = "medit_dirt"; +const tDirtGrass = "medit_dirt_b"; +const tDirtCliff = "medit_cliff_italia"; +const tGrassCliff = "medit_cliff_italia_grass"; +const tCliff = ["medit_cliff_italia", "medit_cliff_italia", "medit_cliff_italia_grass"]; +const tForestFloor = "medit_forestfloor_a"; + +// gaia entities +const oBeech = "gaia/flora_tree_euro_beech"; +const oBerryBush = "gaia/flora_bush_berry"; +const oCarob = "gaia/flora_tree_carob"; +const oCypress1 = "gaia/flora_tree_cypress"; +const oCypress2 = "gaia/flora_tree_cypress"; +const oLombardyPoplar = "gaia/flora_tree_poplar_lombardy"; +const oOak = "gaia/flora_tree_oak"; +const oPalm = "gaia/flora_tree_medit_fan_palm"; +const oPine = "gaia/flora_tree_aleppo_pine"; +const oPoplar = "gaia/flora_tree_poplar"; +const oDateT = "gaia/flora_tree_cretan_date_palm_tall"; +const oDateS = "gaia/flora_tree_cretan_date_palm_short"; +const oChicken = "gaia/fauna_chicken"; +const oDeer = "gaia/fauna_deer"; +const oFish = "gaia/fauna_fish"; +const oWhale = "gaia/fauna_whale_humpback"; +const oStoneLarge = "gaia/geology_stonemine_medit_quarry"; +const oStoneSmall = "gaia/geology_stone_mediterranean"; +const oMetalLarge = "gaia/geology_metal_mediterranean_slabs"; +const oShipwreck = "other/special_treasure_shipwreck"; +const oShipDebris = "other/special_treasure_shipwreck_debris"; + +// decorative props +const aBushLargeDry = "actor|props/flora/bush_medit_la_dry.xml"; +const aBushLarge = "actor|props/flora/bush_medit_la.xml"; +const aBushMedDry = "actor|props/flora/bush_medit_me_dry.xml"; +const aBushMed = "actor|props/flora/bush_medit_me.xml"; +const aBushSmall = "actor|props/flora/bush_medit_sm.xml"; +const aBushSmallDry = "actor|props/flora/bush_medit_sm_dry.xml"; +const aGrass = "actor|props/flora/grass_soft_large_tall.xml"; +const aGrassDry = "actor|props/flora/grass_soft_dry_large_tall.xml"; +const aRockLarge = "actor|geology/stone_granite_large.xml"; +const aRockMed = "actor|geology/stone_granite_med.xml"; +const aRockSmall = "actor|geology/stone_granite_small.xml"; + + +// terrain + entity (for painting) +var pPalmForest = [tForestFloor+TERRAIN_SEPARATOR+oPalm, tGrass]; +var pPineForest = [tForestFloor+TERRAIN_SEPARATOR+oPine, tGrass]; +var pPoplarForest = [tForestFloor+TERRAIN_SEPARATOR+oLombardyPoplar, tGrass]; +var pMainForest = [tForestFloor+TERRAIN_SEPARATOR+oCarob, tForestFloor+TERRAIN_SEPARATOR+oBeech, tGrass, tGrass]; + +const BUILDING_ANGlE = -PI/4; + +// initialize map + +log("Initializing map..."); + +InitMap(); + +var numPlayers = getNumPlayers(); +var mapSize = getMapSize(); + +// create tile classes + +var clCoral = createTileClass(); +var clPlayer = createTileClass(); +var clIsland = createTileClass(); +var clCity = createTileClass(); +var clDirt = createTileClass(); +var clHill = createTileClass(); +var clForest = createTileClass(); +var clWater = createTileClass(); +var clRock = createTileClass(); +var clMetal = createTileClass(); +var clFood = createTileClass(); +var clBaseResource = createTileClass(); + +// randomize player order +var playerIDs = []; +for (var i = 0; i < numPlayers; i++) +{ + playerIDs.push(i+1); +} +playerIDs = sortPlayers(playerIDs); + +//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]]; + +//figure out how many spoke islands +var numIslands =6; +if(numPlayers<6){ + numIslands=6; +}else{ + numIslands=numPlayers; +} + +//figure out coordinates of spoke islands +var islandX = new Array(numIslands); +var islandZ = new Array(numIslands); +var islandAngle = new Array(numIslands); +//holds all land areas +var areas = []; + +var startAngle = randFloat() * 2 * PI; +for (var i=0; i < numIslands; i++) +{ + islandAngle[i] = startAngle + i*2*PI/numIslands; + islandX[i] = 0.5 + 0.39*cos(islandAngle[i]); + islandZ[i] = 0.5 + 0.39*sin(islandAngle[i]); +} + + +for(var i=0;i=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 = round(fx); + var iz = 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); + + + // get civ specific starting entities + var civEntities = getStartingEntities(id-1); + + // create starting units + createStartingPlayerEntities(fx, fz, id, civEntities, BUILDING_ANGlE) + + + nPlayer++; +} +} + + +RMS.SetProgress(15); + + +// get the x and z in tiles + +var nCenter=floor(scaleByMapSize(1,4)) +var startAngle = randFloat() * 2 * PI; +for (var i=0; i < nCenter; i++) +{ + var fx=.5; + var fz=.5; + if(nCenter==1){ + fx=.5; + fz=.5; + }else{ + var isangle = startAngle + i*2*PI/nCenter+randFloat(-PI/8,PI/8); + var dRadius = randFloat(.1,.16); + fx = 0.5 + dRadius*cos(isangle); + fz = 0.5 + dRadius*sin(isangle); + } + var ix = round(fractionToTiles(fx)); + var iz = round(fractionToTiles(fz)); + + var radius = scaleByMapSize(15,30); + var coral= 2; + var wet = 3; + var dry = 1; + var gbeach = 2; + var elevation = 3; + + var islandSize = PI*radius*radius; + var islandBottom=PI*(radius+coral)*(radius+coral); + + //create base + var placer = new ClumpPlacer(islandBottom, .7, .1, 10, ix, iz); + var terrainPainter = new LayeredPainter( + [tOceanRockDeep, tOceanCoral], + [5] + ); + createArea(placer, [terrainPainter, paintClass(clCoral)],avoidClasses(clCoral,0,clPlayer,0)); + + // create island + var placer = new ClumpPlacer(islandSize, .7, .1, 10, ix, iz); + var terrainPainter = new LayeredPainter( + [tOceanCoral,tBeachWet, tBeachDry, tBeach, tBeachBlend, tGrass], + [1,wet,dry,1,gbeach] + ); + var elevationPainter = new SmoothElevationPainter( + ELEVATION_SET, + elevation, + 5 + ); + var temp = createArea(placer, [terrainPainter, paintClass(clIsland), elevationPainter],avoidClasses(clPlayer,0)); + + areas.push(temp); +} +RMS.SetProgress(30); + +// create bumps +log("Creating bumps..."); +placer = new ClumpPlacer(scaleByMapSize(20, 60), 0.3, 0.06, 1); +painter = new SmoothElevationPainter(ELEVATION_MODIFY, 2, 3); +createAreasInAreas( + placer, + painter, + avoidClasses(clCity, 0), + scaleByMapSize(25, 75),15, + areas +); + +// create hills +log("Creating hills..."); +placer = new ClumpPlacer(scaleByMapSize(20, 150), 0.2, 0.1, 1); +terrainPainter = new LayeredPainter( + [tCliff, tCliffShrubs], // terrains + [2] // widths +); +elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 12, 2); +createAreasInAreas( + placer, + [terrainPainter, elevationPainter, paintClass(clHill)], + avoidClasses(clCity, 15, clHill, 15), + scaleByMapSize(5, 30), 15, + areas +); + +RMS.SetProgress(40); +//find all water +for (var ix = 0; ix < mapSize; ix++) +{ + for (var iz = 0; iz < mapSize; iz++) + { + if(getHeight(ix,iz)<0){ + addToClass(ix,iz,clWater); + } + } +} + +// create forests +log("Creating forests..."); +var types = [ + [[tForestFloor, tGrass, pPalmForest], [tForestFloor, pPalmForest]], + [[tForestFloor, tGrass, pPineForest], [tForestFloor, pPineForest]], + [[tForestFloor, tGrass, pPoplarForest], [tForestFloor, pPoplarForest]], + [[tForestFloor, tGrass, pMainForest], [tForestFloor, pMainForest]] +]; // some variation +var size = 5; //size +var num = scaleByMapSize(10, 64); //number +for (var i = 0; i < types.length; ++i) +{ + placer = new ClumpPlacer(6+randInt(12), 0.1, 0.1, 1); + painter = new LayeredPainter( + types[i], // terrains + [2] // widths + ); + createAreasInAreas( + placer, + [painter, paintClass(clForest)], + avoidClasses(clCity, 1, clWater, 3, clForest, 3, clHill, 1), + num, 20, areas + ); +} + +RMS.SetProgress(60); + +log("Creating stone mines..."); +// create large stone quarries +group = new SimpleGroup([new SimpleObject(oStoneSmall, 0,2, 0,4), new SimpleObject(oStoneLarge, 1,1, 0,4)], true, clRock); +createObjectGroupsByAreas(group, 0, + [avoidClasses(clWater, 1, clForest, 1, clHill, 1, clPlayer, 5, clRock, 1)], + scaleByMapSize(4,16), 200, areas +); + +// create small stone quarries +group = new SimpleGroup([new SimpleObject(oStoneSmall, 2,5, 1,3)], true, clRock); +createObjectGroupsByAreas(group, 0, + [avoidClasses(clWater, 1, clForest, 1, clHill, 1, clPlayer, 5, clRock, 2)], + scaleByMapSize(4,16), 200, areas +); +RMS.SetProgress(70); + +log("Creating metal mines..."); +// create large metal quarries +group = new SimpleGroup([new SimpleObject(oMetalLarge, 1,1, 0,4)], true, clMetal); +createObjectGroupsByAreas(group, 0, + [avoidClasses(clWater, 1, clForest, 1, clHill, 1, clPlayer, 5, clMetal, 2, clRock, 1)], + scaleByMapSize(4,16), 200, areas +); + +RMS.SetProgress(80); + + + +//create shrub patches +log("Creating shrub patches..."); +var sizes = [scaleByMapSize(2, 32), scaleByMapSize(3, 48), scaleByMapSize(5, 80)]; +for (var i = 0; i < sizes.length; i++) +{ + placer = new ClumpPlacer(sizes[i], 0.3, 0.06, 0.5); + painter = new LayeredPainter([tBeachBlend,tGrassShrubs],[1]); + createAreasInAreas( + placer, + [painter, paintClass(clDirt)], + avoidClasses(clWater, 3, clHill, 0, clDirt, 6, clCity, 0), + scaleByMapSize(4, 16), 20, areas + ); +} + +//create grass patches +log("Creating grass patches..."); +var sizes = [scaleByMapSize(2, 32), scaleByMapSize(3, 48), scaleByMapSize(5, 80)]; +for (var i = 0; i < sizes.length; i++) +{ + placer = new ClumpPlacer(sizes[i], 0.3, 0.06, 0.5); + painter = new LayeredPainter([tGrassDry],[]); + createAreasInAreas( + placer, + [painter, paintClass(clDirt)], + avoidClasses(clWater, 3, clHill, 0, clDirt, 6, clCity, 0), + scaleByMapSize(4, 16), 20, areas + ); +} + +RMS.SetProgress(90); + +log("Creating straggler trees..."); +// create straggler trees +var trees = [oCarob, oBeech, oLombardyPoplar, oLombardyPoplar, oPine]; +for (var t in trees) +{ + group = new SimpleGroup([new SimpleObject(trees[t], 1,1, 0,1)], true, clForest); + createObjectGroupsByAreas(group, 0, + avoidClasses(clWater, 2, clForest, 2, clCity, 3, clBaseResource, 1, clRock, 1, clMetal, 1, clPlayer, 1, clHill, 1), + scaleByMapSize(2, 38), 50, areas + ); +} + + +// create straggler cypresses +group = new SimpleGroup( + [new SimpleObject(oCypress2, 1,3, 0,3), new SimpleObject(oCypress1, 0,2, 0,2)], + true +); +createObjectGroupsByAreas(group, 0, + avoidClasses(clWater, 2, clForest, 2, clCity, 3, clBaseResource, 1, clRock, 1, clMetal, 1, clPlayer, 1, clHill, 1), + scaleByMapSize(5, 75), 50, areas +); + + +// create straggler date palms +group = new SimpleGroup( + [new SimpleObject(oDateS, 1,3, 0,3), new SimpleObject(oDateT, 0,2, 0,2)], + true +); +createObjectGroupsByAreas(group, 0, + avoidClasses(clWater, 2, clForest, 1, clCity, 0, clBaseResource, 1, clRock, 1, clMetal, 1, clPlayer, 1, clHill, 1), + scaleByMapSize(5, 75), 50, areas +); + +log("Creating rocks..."); +// create rocks +group = new SimpleGroup( + [new SimpleObject(aRockSmall, 0,3, 0,2), new SimpleObject(aRockMed, 0,2, 0,2), + new SimpleObject(aRockLarge, 0,1, 0,2)] +); +createObjectGroups(group, 0, + avoidClasses(clWater, 0, clCity, 0), + scaleByMapSize(30, 180), 50 +); + +// create deer +log("Creating deer..."); +group = new SimpleGroup( + [new SimpleObject(oDeer, 5,7, 0,4)], + true, clFood +); +createObjectGroups(group, 0, + avoidClasses(clWater, 5, clForest, 1, clHill, 1, clCity, 10, clMetal, 2, clRock, 2, clFood, 8), + 3 * numPlayers, 50 +); + +RMS.SetProgress(95); + +log("Creating berry bushes..."); +// create berry bushes +group = new SimpleGroup([new SimpleObject(oBerryBush, 5,7, 0,3)], true, clFood); +createObjectGroups(group, 0, + avoidClasses(clWater, 2, clForest, 1, clHill, 1, clCity, 10, clMetal, 2, clRock, 2, clFood, 8), + 1.5 * numPlayers, 100 +); + +log("Creating Fish..."); +// create Fish +group = new SimpleGroup([new SimpleObject(oFish, 1,1, 0,3)], true, clFood); +createObjectGroups(group, 0, + [stayClasses(clWater,1),avoidClasses(clFood, 8)], + scaleByMapSize(40,200), 100 +); + +log("Creating Whales..."); +// create Whales +group = new SimpleGroup([new SimpleObject(oWhale, 1,1, 0,3)], true, clFood); +createObjectGroups(group, 0, + [stayClasses(clWater,1),avoidClasses(clFood, 8, clPlayer,4,clIsland,4)], + scaleByMapSize(10,40), 100 +); + +log("Creating shipwrecks..."); +// create shipwreck +group = new SimpleGroup([new SimpleObject(oShipwreck, 1,1, 0,3)], true, clFood); +createObjectGroups(group, 0, + [stayClasses(clWater,1),avoidClasses(clFood, 8)], + scaleByMapSize(6,16), 100 +); + +log("Creating shipwreck debris..."); +// create shipwreck debris +group = new SimpleGroup([new SimpleObject(oShipDebris, 1,2, 0,4)], true, clFood); +createObjectGroups(group, 0, + [stayClasses(clWater,1),avoidClasses(clFood, 8)], + scaleByMapSize(10,20), 100 +); + +// Adjust environment +setSkySet("sunny"); +setWaterMurkiness(0.626953); +setWaterShininess(0.732422); +setWaterTint(0, 0.501961, 0.501961); +setWaterReflectionTint(0.313726, 0.376471, 0.521569); +setWaterReflectionTintStrength(0.615234); + +// Export map data +ExportMap(); diff --git a/binaries/data/mods/public/maps/random/cycladic_archipelago.json b/binaries/data/mods/public/maps/random/cycladic_archipelago.json new file mode 100644 index 0000000000..e433d9c3c9 --- /dev/null +++ b/binaries/data/mods/public/maps/random/cycladic_archipelago.json @@ -0,0 +1,11 @@ +{ + "settings" : { + "Name" : "Cycladic Archipelago", + "Script" : "cycladic_archipelago.js", + "Description" : "Each player starts on an island surrounded by water.", + "BaseTerrain" : ["medit_sea_depths"], + "BaseHeight" : -5, + "CircularMap" : true, + "XXXXXX" : "Optionally define other things here, like we would for a scenario" + } +} diff --git a/binaries/data/mods/public/maps/random/islands.js b/binaries/data/mods/public/maps/random/islands.js index 8a5e01ac11..23420648c6 100644 --- a/binaries/data/mods/public/maps/random/islands.js +++ b/binaries/data/mods/public/maps/random/islands.js @@ -1,586 +1,547 @@ -RMS.LoadLibrary("rmgen"); - -// terrain textures -const tOceanDepths = "medit_sea_depths"; -const tOceanRockDeep = "medit_sea_coral_deep"; -const tOceanRockShallow = "medit_rocks_wet"; -const tOceanCoral = "medit_sea_coral_plants"; -const tBeachWet = "medit_sand_wet"; -const tBeachDry = "medit_sand"; -const tBeachGrass = "medit_rocks_grass"; -const tBeach = ["medit_rocks_grass","medit_sand", "medit_rocks_grass_shrubs"] -//const tBeachBlend = ["medit_rocks_grass","medit_grass_field_dry", "medit_grass_field_brown","medit_rocks_shrubs", "medit_rocks_grass_shrubs"]; -const tBeachBlend = ["medit_rocks_grass", "medit_rocks_grass_shrubs"]; -const tBeachCliff = "medit_dirt"; -const tCity = "medit_city_tile"; -const tGrassDry = ["medit_grass_field_dry", "medit_grass_field_b"]; -//const tGrass = ["medit_grass_field_dry", "medit_grass_field_brown", "medit_grass_field_b"]; -const tGrass = ["medit_rocks_grass", "medit_rocks_grass","medit_dirt","medit_rocks_grass_shrubs"]; -const tGrassLush = ["grass_temperate_dry_tufts", "medit_grass_flowers"]; -const tGrassShrubs = "medit_shrubs"; -const tCliffShrubs = ["medit_cliff_aegean_shrubs", "medit_cliff_italia_grass","medit_cliff_italia"] -const tGrassRock = ["medit_rocks_grass"]; -const tDirt = "medit_dirt"; -const tDirtGrass = "medit_dirt_b"; -const tDirtCliff = "medit_cliff_italia"; -const tGrassCliff = "medit_cliff_italia_grass"; -const tCliff = ["medit_cliff_italia", "medit_cliff_italia", "medit_cliff_italia_grass"]; -const tForestFloor = "medit_forestfloor_a"; - -// gaia entities -const oBeech = "gaia/flora_tree_euro_beech"; -const oBerryBush = "gaia/flora_bush_berry"; -const oCarob = "gaia/flora_tree_carob"; -const oCypress1 = "gaia/flora_tree_cypress"; -const oCypress2 = "gaia/flora_tree_cypress"; -const oLombardyPoplar = "gaia/flora_tree_poplar_lombardy"; -const oOak = "gaia/flora_tree_oak"; -const oPalm = "gaia/flora_tree_medit_fan_palm"; -const oPine = "gaia/flora_tree_aleppo_pine"; -const oPoplar = "gaia/flora_tree_poplar"; -const oDateT = "gaia/flora_tree_cretan_date_palm_tall"; -const oDateS = "gaia/flora_tree_cretan_date_palm_short"; -const oChicken = "gaia/fauna_chicken"; -const oDeer = "gaia/fauna_deer"; -const oFish = "gaia/fauna_fish"; -const oWhale = "gaia/fauna_whale_humpback"; -const oStoneLarge = "gaia/geology_stonemine_medit_quarry"; -const oStoneSmall = "gaia/geology_stone_mediterranean"; -const oMetalLarge = "gaia/geology_metal_mediterranean_slabs"; -const oShipwreck = "other/special_treasure_shipwreck"; -const oShipDebris = "other/special_treasure_shipwreck_debris"; - -// decorative props -const aBushLargeDry = "actor|props/flora/bush_medit_la_dry.xml"; -const aBushLarge = "actor|props/flora/bush_medit_la.xml"; -const aBushMedDry = "actor|props/flora/bush_medit_me_dry.xml"; -const aBushMed = "actor|props/flora/bush_medit_me.xml"; -const aBushSmall = "actor|props/flora/bush_medit_sm.xml"; -const aBushSmallDry = "actor|props/flora/bush_medit_sm_dry.xml"; -const aGrass = "actor|props/flora/grass_soft_large_tall.xml"; -const aGrassDry = "actor|props/flora/grass_soft_dry_large_tall.xml"; -const aRockLarge = "actor|geology/stone_granite_large.xml"; -const aRockMed = "actor|geology/stone_granite_med.xml"; -const aRockSmall = "actor|geology/stone_granite_small.xml"; - - -// terrain + entity (for painting) -var pPalmForest = [tForestFloor+TERRAIN_SEPARATOR+oPalm, tGrass]; -var pPineForest = [tForestFloor+TERRAIN_SEPARATOR+oPine, tGrass]; -var pPoplarForest = [tForestFloor+TERRAIN_SEPARATOR+oLombardyPoplar, tGrass]; -var pMainForest = [tForestFloor+TERRAIN_SEPARATOR+oCarob, tForestFloor+TERRAIN_SEPARATOR+oBeech, tGrass, tGrass]; - -const BUILDING_ANGlE = -PI/4; - -// initialize map - -log("Initializing map..."); - -InitMap(); - -var numPlayers = getNumPlayers(); -var mapSize = getMapSize(); - -// create tile classes - -var clCoral = createTileClass(); -var clPlayer = createTileClass(); -var clIsland = createTileClass(); -var clCity = createTileClass(); -var clDirt = createTileClass(); -var clHill = createTileClass(); -var clForest = createTileClass(); -var clWater = createTileClass(); -var clRock = createTileClass(); -var clMetal = createTileClass(); -var clFood = createTileClass(); -var clBaseResource = createTileClass(); - -// randomize player order -var playerIDs = []; -for (var i = 0; i < numPlayers; i++) -{ - playerIDs.push(i+1); -} -playerIDs = sortPlayers(playerIDs); - -//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]]; - -//figure out how many spoke islands -var numIslands =6; -if(numPlayers<6){ - numIslands=6; -}else{ - numIslands=numPlayers; -} - -//figure out coordinates of spoke islands -var islandX = new Array(numIslands); -var islandZ = new Array(numIslands); -var islandAngle = new Array(numIslands); -//holds all land areas -var areas = []; - -var startAngle = randFloat() * 2 * PI; -for (var i=0; i < numIslands; i++) -{ - islandAngle[i] = startAngle + i*2*PI/numIslands; - islandX[i] = 0.5 + 0.39*cos(islandAngle[i]); - islandZ[i] = 0.5 + 0.39*sin(islandAngle[i]); -} - - -for(var i=0;i=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 = round(fx); - var iz = 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); - - - // get civ specific starting entities - var civEntities = getStartingEntities(id-1); - - // create starting units - createStartingPlayerEntities(fx, fz, id, civEntities, BUILDING_ANGlE) - - - nPlayer++; -} -} - - -RMS.SetProgress(15); - - -// get the x and z in tiles - -var nCenter=floor(scaleByMapSize(1,4)) -var startAngle = randFloat() * 2 * PI; -for (var i=0; i < nCenter; i++) -{ - var fx=.5; - var fz=.5; - if(nCenter==1){ - fx=.5; - fz=.5; - }else{ - var isangle = startAngle + i*2*PI/nCenter+randFloat(-PI/8,PI/8); - var dRadius = randFloat(.1,.16); - fx = 0.5 + dRadius*cos(isangle); - fz = 0.5 + dRadius*sin(isangle); - } - var ix = round(fractionToTiles(fx)); - var iz = round(fractionToTiles(fz)); - - var radius = scaleByMapSize(15,30); - var coral= 2; - var wet = 3; - var dry = 1; - var gbeach = 2; - var elevation = 3; - - var islandSize = PI*radius*radius; - var islandBottom=PI*(radius+coral)*(radius+coral); - - //create base - var placer = new ClumpPlacer(islandBottom, .7, .1, 10, ix, iz); - var terrainPainter = new LayeredPainter( - [tOceanRockDeep, tOceanCoral], - [5] - ); - createArea(placer, [terrainPainter, paintClass(clCoral)],avoidClasses(clCoral,0,clPlayer,0)); - - // create island - var placer = new ClumpPlacer(islandSize, .7, .1, 10, ix, iz); - var terrainPainter = new LayeredPainter( - [tOceanCoral,tBeachWet, tBeachDry, tBeach, tBeachBlend, tGrass], - [1,wet,dry,1,gbeach] - ); - var elevationPainter = new SmoothElevationPainter( - ELEVATION_SET, - elevation, - 5 - ); - var temp = createArea(placer, [terrainPainter, paintClass(clIsland), elevationPainter],avoidClasses(clPlayer,0)); - - areas.push(temp); -} -RMS.SetProgress(30); - -// create bumps -log("Creating bumps..."); -placer = new ClumpPlacer(scaleByMapSize(20, 60), 0.3, 0.06, 1); -painter = new SmoothElevationPainter(ELEVATION_MODIFY, 2, 3); -createAreasInAreas( - placer, - painter, - avoidClasses(clCity, 0), - scaleByMapSize(25, 75),15, - areas -); - -// create hills -log("Creating hills..."); -placer = new ClumpPlacer(scaleByMapSize(20, 150), 0.2, 0.1, 1); -terrainPainter = new LayeredPainter( - [tCliff, tCliffShrubs], // terrains - [2] // widths -); -elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 12, 2); -createAreasInAreas( - placer, - [terrainPainter, elevationPainter, paintClass(clHill)], - avoidClasses(clCity, 15, clHill, 15), - scaleByMapSize(5, 30), 15, - areas -); - -RMS.SetProgress(40); -//find all water -for (var ix = 0; ix < mapSize; ix++) -{ - for (var iz = 0; iz < mapSize; iz++) - { - if(getHeight(ix,iz)<0){ - addToClass(ix,iz,clWater); - } - } -} - -// create forests -log("Creating forests..."); -var types = [ - [[tForestFloor, tGrass, pPalmForest], [tForestFloor, pPalmForest]], - [[tForestFloor, tGrass, pPineForest], [tForestFloor, pPineForest]], - [[tForestFloor, tGrass, pPoplarForest], [tForestFloor, pPoplarForest]], - [[tForestFloor, tGrass, pMainForest], [tForestFloor, pMainForest]] -]; // some variation -var size = 5; //size -var num = scaleByMapSize(10, 64); //number -for (var i = 0; i < types.length; ++i) -{ - placer = new ClumpPlacer(6+randInt(12), 0.1, 0.1, 1); - painter = new LayeredPainter( - types[i], // terrains - [2] // widths - ); - createAreasInAreas( - placer, - [painter, paintClass(clForest)], - avoidClasses(clCity, 1, clWater, 3, clForest, 3, clHill, 1), - num, 20, areas - ); -} - -RMS.SetProgress(60); - -log("Creating stone mines..."); -// create large stone quarries -group = new SimpleGroup([new SimpleObject(oStoneSmall, 0,2, 0,4), new SimpleObject(oStoneLarge, 1,1, 0,4)], true, clRock); -createObjectGroupsByAreas(group, 0, - [avoidClasses(clWater, 1, clForest, 1, clHill, 1, clPlayer, 5, clRock, 1)], - scaleByMapSize(4,16), 200, areas -); - -// create small stone quarries -group = new SimpleGroup([new SimpleObject(oStoneSmall, 2,5, 1,3)], true, clRock); -createObjectGroupsByAreas(group, 0, - [avoidClasses(clWater, 1, clForest, 1, clHill, 1, clPlayer, 5, clRock, 2)], - scaleByMapSize(4,16), 200, areas -); -RMS.SetProgress(70); - -log("Creating metal mines..."); -// create large metal quarries -group = new SimpleGroup([new SimpleObject(oMetalLarge, 1,1, 0,4)], true, clMetal); -createObjectGroupsByAreas(group, 0, - [avoidClasses(clWater, 1, clForest, 1, clHill, 1, clPlayer, 5, clMetal, 2, clRock, 1)], - scaleByMapSize(4,16), 200, areas -); - -RMS.SetProgress(80); - - - -//create shrub patches -log("Creating shrub patches..."); -var sizes = [scaleByMapSize(2, 32), scaleByMapSize(3, 48), scaleByMapSize(5, 80)]; -for (var i = 0; i < sizes.length; i++) -{ - placer = new ClumpPlacer(sizes[i], 0.3, 0.06, 0.5); - painter = new LayeredPainter([tBeachBlend,tGrassShrubs],[1]); - createAreasInAreas( - placer, - [painter, paintClass(clDirt)], - avoidClasses(clWater, 3, clHill, 0, clDirt, 6, clCity, 0), - scaleByMapSize(4, 16), 20, areas - ); -} - -//create grass patches -log("Creating grass patches..."); -var sizes = [scaleByMapSize(2, 32), scaleByMapSize(3, 48), scaleByMapSize(5, 80)]; -for (var i = 0; i < sizes.length; i++) -{ - placer = new ClumpPlacer(sizes[i], 0.3, 0.06, 0.5); - painter = new LayeredPainter([tGrassDry],[]); - createAreasInAreas( - placer, - [painter, paintClass(clDirt)], - avoidClasses(clWater, 3, clHill, 0, clDirt, 6, clCity, 0), - scaleByMapSize(4, 16), 20, areas - ); -} - -RMS.SetProgress(90); - -log("Creating straggler trees..."); -// create straggler trees -var trees = [oCarob, oBeech, oLombardyPoplar, oLombardyPoplar, oPine]; -for (var t in trees) -{ - group = new SimpleGroup([new SimpleObject(trees[t], 1,1, 0,1)], true, clForest); - createObjectGroupsByAreas(group, 0, - avoidClasses(clWater, 2, clForest, 2, clCity, 3, clBaseResource, 1, clRock, 1, clMetal, 1, clPlayer, 1, clHill, 1), - scaleByMapSize(2, 38), 50, areas - ); -} - - -// create straggler cypresses -group = new SimpleGroup( - [new SimpleObject(oCypress2, 1,3, 0,3), new SimpleObject(oCypress1, 0,2, 0,2)], - true -); -createObjectGroupsByAreas(group, 0, - avoidClasses(clWater, 2, clForest, 2, clCity, 3, clBaseResource, 1, clRock, 1, clMetal, 1, clPlayer, 1, clHill, 1), - scaleByMapSize(5, 75), 50, areas -); - - -// create straggler date palms -group = new SimpleGroup( - [new SimpleObject(oDateS, 1,3, 0,3), new SimpleObject(oDateT, 0,2, 0,2)], - true -); -createObjectGroupsByAreas(group, 0, - avoidClasses(clWater, 2, clForest, 1, clCity, 0, clBaseResource, 1, clRock, 1, clMetal, 1, clPlayer, 1, clHill, 1), - scaleByMapSize(5, 75), 50, areas -); - -log("Creating rocks..."); -// create rocks -group = new SimpleGroup( - [new SimpleObject(aRockSmall, 0,3, 0,2), new SimpleObject(aRockMed, 0,2, 0,2), - new SimpleObject(aRockLarge, 0,1, 0,2)] -); -createObjectGroups(group, 0, - avoidClasses(clWater, 0, clCity, 0), - scaleByMapSize(30, 180), 50 -); - -// create deer -log("Creating deer..."); -group = new SimpleGroup( - [new SimpleObject(oDeer, 5,7, 0,4)], - true, clFood -); -createObjectGroups(group, 0, - avoidClasses(clWater, 5, clForest, 1, clHill, 1, clCity, 10, clMetal, 2, clRock, 2, clFood, 8), - 3 * numPlayers, 50 -); - -RMS.SetProgress(95); - -log("Creating berry bushes..."); -// create berry bushes -group = new SimpleGroup([new SimpleObject(oBerryBush, 5,7, 0,3)], true, clFood); -createObjectGroups(group, 0, - avoidClasses(clWater, 2, clForest, 1, clHill, 1, clCity, 10, clMetal, 2, clRock, 2, clFood, 8), - 1.5 * numPlayers, 100 -); - -log("Creating Fish..."); -// create Fish -group = new SimpleGroup([new SimpleObject(oFish, 1,1, 0,3)], true, clFood); -createObjectGroups(group, 0, - [stayClasses(clWater,1),avoidClasses(clFood, 8)], - scaleByMapSize(40,200), 100 -); - -log("Creating Whales..."); -// create Whales -group = new SimpleGroup([new SimpleObject(oWhale, 1,1, 0,3)], true, clFood); -createObjectGroups(group, 0, - [stayClasses(clWater,1),avoidClasses(clFood, 8, clPlayer,4,clIsland,4)], - scaleByMapSize(10,40), 100 -); - -log("Creating shipwrecks..."); -// create shipwreck -group = new SimpleGroup([new SimpleObject(oShipwreck, 1,1, 0,3)], true, clFood); -createObjectGroups(group, 0, - [stayClasses(clWater,1),avoidClasses(clFood, 8)], - scaleByMapSize(6,16), 100 -); - -log("Creating shipwreck debris..."); -// create shipwreck debris -group = new SimpleGroup([new SimpleObject(oShipDebris, 1,2, 0,4)], true, clFood); -createObjectGroups(group, 0, - [stayClasses(clWater,1),avoidClasses(clFood, 8)], - scaleByMapSize(10,20), 100 -); - -// Adjust environment -setSkySet("sunny"); -setWaterMurkiness(0.626953); -setWaterShininess(0.732422); -setWaterTint(0, 0.501961, 0.501961); -setWaterReflectionTint(0.313726, 0.376471, 0.521569); -setWaterReflectionTintStrength(0.615234); - -// Export map data -ExportMap(); +RMS.LoadLibrary("rmgen"); + +TILE_CENTERED_HEIGHT_MAP = true; +//random terrain textures +var rt = randomizeBiome(); + +var tGrass = rBiomeT1(); +var tGrassPForest = rBiomeT2(); +var tGrassDForest = rBiomeT3(); +var tCliff = rBiomeT4(); +var tGrassA = rBiomeT5(); +var tGrassB = rBiomeT6(); +var tGrassC = rBiomeT7(); +var tHill = rBiomeT8(); +var tDirt = rBiomeT9(); +var tRoad = rBiomeT10(); +var tRoadWild = rBiomeT11(); +var tGrassPatch = rBiomeT12(); +var tShoreBlend = rBiomeT13(); +var tShore = rBiomeT14(); +var tWater = rBiomeT15(); +if (rt == 2) +{ + tShore = "alpine_shore_rocks_icy"; + tWater = "alpine_shore_rocks"; +} + +// gaia entities +var oOak = rBiomeE1(); +var oOakLarge = rBiomeE2(); +var oApple = rBiomeE3(); +var oPine = rBiomeE4(); +var oAleppoPine = rBiomeE5(); +var oBerryBush = rBiomeE6(); +var oChicken = rBiomeE7(); +var oDeer = rBiomeE8(); +var oFish = rBiomeE9(); +var oSheep = rBiomeE10(); +var oStoneLarge = rBiomeE11(); +var oStoneSmall = rBiomeE12(); +var oMetalLarge = rBiomeE13(); +var oWood = "gaia/special_treasure_wood"; + +// decorative props +var aGrass = rBiomeA1(); +var aGrassShort = rBiomeA2(); +var aReeds = rBiomeA3(); +var aLillies = rBiomeA4(); +var aRockLarge = rBiomeA5(); +var aRockMedium = rBiomeA6(); +var aBushMedium = rBiomeA7(); +var aBushSmall = rBiomeA8(); + +var pForestD = [tGrassDForest + TERRAIN_SEPARATOR + oOak, tGrassDForest + TERRAIN_SEPARATOR + oOakLarge, tGrassDForest]; +var pForestP = [tGrassPForest + TERRAIN_SEPARATOR + oPine, tGrassPForest + TERRAIN_SEPARATOR + oAleppoPine, tGrassPForest]; +const BUILDING_ANGlE = -PI/4; + +// initialize map + +log("Initializing map..."); + +InitMap(); + +var numPlayers = getNumPlayers(); +var mapSize = getMapSize(); +var mapArea = mapSize*mapSize; + +// create tile classes + +var clPlayer = createTileClass(); +var clHill = createTileClass(); +var clForest = createTileClass(); +var clWater = createTileClass(); +var clDirt = createTileClass(); +var clRock = createTileClass(); +var clMetal = createTileClass(); +var clFood = createTileClass(); +var clBaseResource = createTileClass(); +var clSettlement = createTileClass(); +var clLand = createTileClass(); + + + +// randomize player order +var playerIDs = []; +for (var i = 0; i < numPlayers; i++) +{ + playerIDs.push(i+1); +} +playerIDs = sortPlayers(playerIDs); + +// place players + +var playerX = new Array(numPlayers); +var playerZ = new Array(numPlayers); +var playerAngle = new Array(numPlayers); + +var startAngle = randFloat(0, TWO_PI); +for (var i = 0; i < numPlayers; i++) +{ + playerAngle[i] = startAngle + i*TWO_PI/numPlayers; + playerX[i] = 0.5 + 0.35*cos(playerAngle[i]); + playerZ[i] = 0.5 + 0.35*sin(playerAngle[i]); +} + +for (var i = 0; i < numPlayers; i++) +{ + var id = playerIDs[i]; + log("Creating base for player " + id + "..."); + + // some constants + var radius = scaleByMapSize(17,29); + var shoreRadius = 4; + var elevation = 3; + + var hillSize = PI * radius * radius; + // get the x and z in tiles + var fx = fractionToTiles(playerX[i]); + var fz = fractionToTiles(playerZ[i]); + var ix = round(fx); + var iz = round(fz); + // create the hill + var placer = new ClumpPlacer(hillSize, 0.80, 0.1, 10, ix, iz); + var terrainPainter = new LayeredPainter( + [tGrass , tGrass, tGrass], // terrains + [1, shoreRadius] // widths + ); + var elevationPainter = new SmoothElevationPainter( + ELEVATION_SET, // type + elevation, // elevation + shoreRadius // blend radius + ); + createArea(placer, [terrainPainter, elevationPainter, paintClass(clPlayer)], null); + + // get civ specific starting entities + var civEntities = getStartingEntities(id-1); + + // create starting units + createStartingPlayerEntities(fx, fz, id, civEntities, BUILDING_ANGlE) + + // create animals + for (var j = 0; j < 2; ++j) + { + var aAngle = randFloat(0, TWO_PI); + var aDist = 7; + var aX = round(fx + aDist * cos(aAngle)); + var aZ = round(fz + aDist * sin(aAngle)); + var group = new SimpleGroup( + [new SimpleObject(oChicken, 5,5, 0,3)], + true, clBaseResource, aX, aZ + ); + createObjectGroup(group, 0); + } + + // create berry bushes + var bbAngle = randFloat(0, TWO_PI); + var bbDist = 12; + var bbX = round(fx + bbDist * cos(bbAngle)); + var bbZ = round(fz + bbDist * sin(bbAngle)); + group = new SimpleGroup( + [new SimpleObject(oBerryBush, 5,5, 0,3)], + true, clBaseResource, bbX, bbZ + ); + createObjectGroup(group, 0); + + // create woods + var bbAngle = randFloat(0, TWO_PI); + var bbDist = 13; + var bbX = round(fx + bbDist * cos(bbAngle)); + var bbZ = round(fz + bbDist * sin(bbAngle)); + group = new SimpleGroup( + [new SimpleObject(oWood, 7,7, 0,3)], + true, clBaseResource, bbX, bbZ + ); + createObjectGroup(group, 0); + + // create metal mine + var mAngle = bbAngle; + while(abs(mAngle - bbAngle) < PI/3) + { + mAngle = randFloat(0, TWO_PI); + } + var mDist = radius - 4; + var mX = round(fx + mDist * cos(mAngle)); + var mZ = round(fz + mDist * sin(mAngle)); + group = new SimpleGroup( + [new SimpleObject(oMetalLarge, 1,1, 0,0)], + true, clBaseResource, mX, mZ + ); + createObjectGroup(group, 0); + + // create stone mines + mAngle += randFloat(PI/8, PI/4); + mX = round(fx + mDist * cos(mAngle)); + mZ = round(fz + mDist * sin(mAngle)); + group = new SimpleGroup( + [new SimpleObject(oStoneLarge, 1,1, 0,2)], + true, clBaseResource, mX, mZ + ); + createObjectGroup(group, 0); + var hillSize = PI * radius * radius; + // create starting straggler trees + var num = hillSize / 100; + for (var j = 0; j < num; j++) + { + var tAngle = randFloat(0, TWO_PI); + var tDist = randFloat(6, radius - 2); + var tX = round(fx + tDist * cos(tAngle)); + var tZ = round(fz + tDist * sin(tAngle)); + group = new SimpleGroup( + [new SimpleObject(oOak, 1,3, 0,2)], + false, clBaseResource, tX, tZ + ); + createObjectGroup(group, 0, avoidClasses(clBaseResource,2)); + } + + // create grass tufts + var num = hillSize / 250; + for (var j = 0; j < num; j++) + { + var gAngle = randFloat(0, TWO_PI); + var gDist = radius - (5 + randInt(7)); + var gX = round(fx + gDist * cos(gAngle)); + var gZ = round(fz + gDist * sin(gAngle)); + group = new SimpleGroup( + [new SimpleObject(aGrassShort, 2,5, 0,1, -PI/8,PI/8)], + false, clBaseResource, gX, gZ + ); + createObjectGroup(group, 0); + } +} + +// create islands +log("Creating islands..."); +placer = new ClumpPlacer(floor(hillSize*randFloat(0.5,2)), 0.80, 0.1, 0); +terrainPainter = new LayeredPainter( + [tGrass, tGrass], // terrains + [2] // widths +); +elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 3, 4); +createAreas( + placer, + [terrainPainter, elevationPainter, paintClass(clLand)], + avoidClasses(clLand, 3, clPlayer, 3), + scaleByMapSize(2, 6)*randInt(8,14), 30 +); + +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 = round(fx); + var iz = round(fz); + // create the city patch + var cityRadius = radius/3; + placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz); + var painter = new LayeredPainter([tRoadWild, tRoad], [1]); + createArea(placer, painter, null); +} + +// create bumps +log("Creating bumps..."); +placer = new ClumpPlacer(scaleByMapSize(20, 50), 0.3, 0.06, 1); +painter = new SmoothElevationPainter(ELEVATION_MODIFY, 2, 2); +createAreas( + placer, + painter, + [avoidClasses(clWater, 2, clPlayer, 0), stayClasses(clLand, 3)], + scaleByMapSize(100, 200) +); + +// create hills +log("Creating hills..."); +placer = new ClumpPlacer(scaleByMapSize(20, 150), 0.2, 0.1, 1); +terrainPainter = new LayeredPainter( + [tCliff, tHill], // terrains + [2] // widths +); +elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 18, 2); +createAreas( + placer, + [terrainPainter, elevationPainter, paintClass(clHill)], + [avoidClasses(clPlayer, 2, clHill, 15), stayClasses(clLand, 0)], + scaleByMapSize(8, 25) +); + + +// calculate desired number of trees for map (based on size) +if (rt == 6) +{ +var MIN_TREES = 200; +var MAX_TREES = 1250; +var P_FOREST = 0.02; +} +else if (rt == 7) +{ +var MIN_TREES = 1000; +var MAX_TREES = 6000; +var P_FOREST = 0.6; +} +else +{ +var MIN_TREES = 500; +var MAX_TREES = 3000; +var P_FOREST = 0.7; +} +var totalTrees = scaleByMapSize(MIN_TREES, MAX_TREES); +var numForest = totalTrees * P_FOREST; +var numStragglers = totalTrees * (1.0 - P_FOREST); + +// create forests +log("Creating forests..."); +var types = [ + [[tGrassDForest, tGrass, pForestD], [tGrassDForest, pForestD]], + [[tGrassPForest, tGrass, pForestP], [tGrassPForest, pForestP]] +]; // some variation + +if (rt == 6) +{ +var size = numForest / (0.5 * scaleByMapSize(2,8) * numPlayers); +} +else +{ +var size = numForest / (scaleByMapSize(2,8) * numPlayers); +} +var num = floor(size / types.length); +for (var i = 0; i < types.length; ++i) +{ + placer = new ClumpPlacer(numForest / num, 0.1, 0.1, 1); + painter = new LayeredPainter( + types[i], // terrains + [2] // widths + ); + createAreas( + placer, + [painter, paintClass(clForest)], + [avoidClasses(clPlayer, 0, clForest, 10, clHill, 0), stayClasses(clLand, 4)], + num + ); +} + +RMS.SetProgress(50); +// create dirt patches +log("Creating dirt patches..."); +var sizes = [scaleByMapSize(3, 48), scaleByMapSize(5, 84), scaleByMapSize(8, 128)]; +var numb = 1; +if (rt == 6) + numb = 3 +for (var i = 0; i < sizes.length; i++) +{ + placer = new ClumpPlacer(sizes[i], 0.3, 0.06, 0.5); + painter = new LayeredPainter( + [[tGrass,tGrassA],[tGrassA,tGrassB], [tGrassB,tGrassC]], // terrains + [1,1] // widths + ); + createAreas( + placer, + [painter, paintClass(clDirt)], + [avoidClasses(clForest, 0, clHill, 0, clDirt, 5, clPlayer, 0), stayClasses(clLand, 4)], + numb*scaleByMapSize(15, 45) + ); +} + +// create grass patches +log("Creating grass patches..."); +var sizes = [scaleByMapSize(2, 32), scaleByMapSize(3, 48), scaleByMapSize(5, 80)]; +for (var i = 0; i < sizes.length; i++) +{ + placer = new ClumpPlacer(sizes[i], 0.3, 0.06, 0.5); + painter = new TerrainPainter(tGrassPatch); + createAreas( + placer, + painter, + [avoidClasses(clForest, 0, clHill, 0, clDirt, 5, clPlayer, 0), stayClasses(clLand, 4)], + numb*scaleByMapSize(15, 45) + ); +} +RMS.SetProgress(55); + + +log("Creating stone mines..."); +// create large stone quarries +group = new SimpleGroup([new SimpleObject(oStoneSmall, 0,2, 0,4), new SimpleObject(oStoneLarge, 1,1, 0,4)], true, clRock); +createObjectGroups(group, 0, + [avoidClasses(clForest, 1, clPlayer, 0, clRock, 10, clHill, 1), stayClasses(clLand, 3)], + scaleByMapSize(4,16), 100 +); + +// create small stone quarries +group = new SimpleGroup([new SimpleObject(oStoneSmall, 2,5, 1,3)], true, clRock); +createObjectGroups(group, 0, + [avoidClasses(clForest, 1, clPlayer, 0, clRock, 10, clHill, 1), stayClasses(clLand, 3)], + scaleByMapSize(4,16), 100 +); + +log("Creating metal mines..."); +// create large metal quarries +group = new SimpleGroup([new SimpleObject(oMetalLarge, 1,1, 0,4)], true, clMetal); +createObjectGroups(group, 0, + [avoidClasses(clForest, 1, clPlayer, 0, clMetal, 10, clRock, 5, clHill, 1), stayClasses(clLand, 3)], + scaleByMapSize(4,16), 100 +); + +RMS.SetProgress(65); + +// create small decorative rocks +log("Creating small decorative rocks..."); +group = new SimpleGroup( + [new SimpleObject(aRockMedium, 1,3, 0,1)], + true +); +createObjectGroups( + group, 0, + [avoidClasses(clWater, 0, clForest, 0, clPlayer, 0, clHill, 0), stayClasses(clLand, 3)], + scaleByMapSize(16, 262), 50 +); + + +// create large decorative rocks +log("Creating large decorative rocks..."); +group = new SimpleGroup( + [new SimpleObject(aRockLarge, 1,2, 0,1), new SimpleObject(aRockMedium, 1,3, 0,2)], + true +); +createObjectGroups( + group, 0, + [avoidClasses(clWater, 0, clForest, 0, clPlayer, 0, clHill, 0), stayClasses(clLand, 3)], + scaleByMapSize(8, 131), 50 +); + +RMS.SetProgress(70); + +// create deer +log("Creating deer..."); +group = new SimpleGroup( + [new SimpleObject(oDeer, 5,7, 0,4)], + true, clFood +); +createObjectGroups(group, 0, + [avoidClasses(clWater, 0, clForest, 0, clPlayer, 0, clHill, 1, clFood, 20), stayClasses(clLand, 2)], + 3 * numPlayers, 50 +); + +RMS.SetProgress(75); + +// create sheep +log("Creating sheep..."); +group = new SimpleGroup( + [new SimpleObject(oSheep, 2,3, 0,2)], + true, clFood +); +createObjectGroups(group, 0, + [avoidClasses(clWater, 0, clForest, 0, clPlayer, 0, clHill, 1, clFood, 20), stayClasses(clLand, 2)], + 3 * numPlayers, 50 +); + +// create fish +log("Creating fish..."); +group = new SimpleGroup( + [new SimpleObject(oFish, 2,3, 0,2)], + true, clFood +); +createObjectGroups(group, 0, + avoidClasses(clLand, 4, clForest, 0, clPlayer, 0, clHill, 0, clFood, 20), + 25 * numPlayers, 60 +); + +RMS.SetProgress(85); + + +// create straggler trees +log("Creating straggler trees..."); +var types = [oOak, oOakLarge, oPine, oApple]; // some variation +var num = floor(numStragglers / types.length); +for (var i = 0; i < types.length; ++i) +{ + group = new SimpleGroup( + [new SimpleObject(types[i], 1,1, 0,3)], + true, clForest + ); + createObjectGroups(group, 0, + [avoidClasses(clWater, 1, clForest, 1, clHill, 1, clPlayer, 0, clMetal, 1, clRock, 1), stayClasses(clLand, 4)], + num + ); +} + +var planetm = 1; +if (rt==7) +{ + planetm = 8; +} +//create small grass tufts +log("Creating small grass tufts..."); +group = new SimpleGroup( + [new SimpleObject(aGrassShort, 1,2, 0,1, -PI/8,PI/8)] +); +createObjectGroups(group, 0, + [avoidClasses(clWater, 2, clHill, 2, clPlayer, 2, clDirt, 0), stayClasses(clLand, 3)], + planetm * scaleByMapSize(13, 200) +); + +RMS.SetProgress(90); + +// create large grass tufts +log("Creating large grass tufts..."); +group = new SimpleGroup( + [new SimpleObject(aGrass, 2,4, 0,1.8, -PI/8,PI/8), new SimpleObject(aGrassShort, 3,6, 1.2,2.5, -PI/8,PI/8)] +); +createObjectGroups(group, 0, + [avoidClasses(clWater, 3, clHill, 2, clPlayer, 2, clDirt, 1, clForest, 0), stayClasses(clLand, 3)], + planetm * scaleByMapSize(13, 200) +); + +RMS.SetProgress(95); + +// create bushes +log("Creating bushes..."); +group = new SimpleGroup( + [new SimpleObject(aBushMedium, 1,2, 0,2), new SimpleObject(aBushSmall, 2,4, 0,2)] +); +createObjectGroups(group, 0, + [avoidClasses(clWater, 1, clHill, 1, clPlayer, 1, clDirt, 1), stayClasses(clLand, 3)], + planetm * scaleByMapSize(13, 200), 50 +); + +rt = randInt(1,3) +if (rt==1){ +setSkySet("cirrus"); +} +else if (rt ==2){ +setSkySet("cumulus"); +} +else if (rt ==3){ +setSkySet("sunny"); +} +setSunRotation(randFloat(0, TWO_PI)); +setSunElevation(randFloat(PI/ 5, PI / 3)); +setWaterTint(0.447, 0.412, 0.322); // muddy brown +setWaterReflectionTint(0.447, 0.412, 0.322); // muddy brown +setWaterMurkiness(1.0); +setWaterReflectionTintStrength(0.677); + +// Export map data +ExportMap(); diff --git a/binaries/data/mods/public/maps/random/islands.json b/binaries/data/mods/public/maps/random/islands.json index aa6fa06f9c..f8e4e10256 100644 --- a/binaries/data/mods/public/maps/random/islands.json +++ b/binaries/data/mods/public/maps/random/islands.json @@ -2,8 +2,8 @@ "settings" : { "Name" : "Islands", "Script" : "islands.js", - "Description" : "Each player starts on an island surrounded by water.", - "BaseTerrain" : ["medit_sea_depths"], + "Description" : "Players start in small islands while there are many others around.", + "BaseTerrain" : ["medit_sand_wet"], "BaseHeight" : -5, "CircularMap" : true, "XXXXXX" : "Optionally define other things here, like we would for a scenario" diff --git a/binaries/data/mods/public/maps/random/volcanic_lands.js b/binaries/data/mods/public/maps/random/volcanic_lands.js new file mode 100644 index 0000000000..5a7987ab6e --- /dev/null +++ b/binaries/data/mods/public/maps/random/volcanic_lands.js @@ -0,0 +1,380 @@ +RMS.LoadLibrary("rmgen"); + +var tGrass = ["cliff volcanic light", "ocean_rock_a", "ocean_rock_b"]; +var tGrassA = "cliff volcanic light"; +var tGrassB = "ocean_rock_a"; +var tGrassC = "ocean_rock_b"; +var tCliff = "cliff volcanic coarse" +var tDirt = ["ocean_rock_a", "ocean_rock_b"]; +var tRoad = "road1"; +var tRoadWild = "road1"; +var tShoreBlend = "temp_grass_plants"; +var tShore = "temp_plants_bog"; +var tWater = "temp_mud_a"; +var tLava1 = "LavaTest05" +var tLava2 = "LavaTest04" +var tLava3 = "LavaTest03" + +// gaia entities +var oTree = "gaia/flora_tree_dead"; +var oStoneLarge = "gaia/geology_stonemine_alpine_quarry"; +var oStoneSmall = "gaia/geology_stone_alpine_a"; +var oMetalLarge = "gaia/geology_metal_alpine_slabs"; + +// decorative props +var aRockLarge = "actor|geology/stone_granite_med.xml"; +var aRockMedium = "actor|geology/stone_granite_med.xml"; +var aSmoke = "actor|particle/smoke.xml"; + +var pForestD = [tGrassC + TERRAIN_SEPARATOR + oTree, tGrassC]; +var pForestP = [tGrassB + TERRAIN_SEPARATOR + oTree, tGrassB]; +const BUILDING_ANGlE = -PI/4; + +// initialize map + +log("Initializing map..."); + +InitMap(); + +var numPlayers = getNumPlayers(); +var mapSize = getMapSize(); +var mapArea = mapSize*mapSize; + +// create tile classes + +var clPlayer = createTileClass(); +var clHill = createTileClass(); +var clHill2 = createTileClass(); +var clHill3 = createTileClass(); +var clHill4 = createTileClass(); +var clForest = createTileClass(); +var clWater = createTileClass(); +var clDirt = createTileClass(); +var clRock = createTileClass(); +var clMetal = createTileClass(); +var clFood = createTileClass(); +var clBaseResource = createTileClass(); +var clSettlement = createTileClass(); + + +// randomize player order +var playerIDs = []; +for (var i = 0; i < numPlayers; i++) +{ + playerIDs.push(i+1); +} +playerIDs = sortPlayers(playerIDs); + +// place players + +var playerX = new Array(numPlayers); +var playerZ = new Array(numPlayers); +var playerAngle = new Array(numPlayers); + +var startAngle = randFloat(0, TWO_PI); +for (var i = 0; i < numPlayers; i++) +{ + playerAngle[i] = startAngle + i*TWO_PI/numPlayers; + playerX[i] = 0.5 + 0.35*cos(playerAngle[i]); + playerZ[i] = 0.5 + 0.35*sin(playerAngle[i]); +} + +for (var i = 0; i < numPlayers; i++) +{ + var id = playerIDs[i]; + log("Creating base for player " + id + "..."); + + // some constants + 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 = round(fx); + var iz = round(fz); + addToClass(ix, iz, clPlayer); + addToClass(ix+5, iz, clPlayer); + addToClass(ix, iz+5, clPlayer); + addToClass(ix-5, iz, clPlayer); + addToClass(ix, iz-5, 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); + + // get civ specific starting entities + var civEntities = getStartingEntities(id-1); + + // create starting units + createStartingPlayerEntities(fx, fz, id, civEntities, BUILDING_ANGlE) + + // create metal mine + var bbAngle = randFloat(0, TWO_PI); + var bbDist = 12; + var bbX = round(fx + bbDist * cos(bbAngle)); + var bbZ = round(fz + bbDist * sin(bbAngle)); + var mAngle = bbAngle; + while(abs(mAngle - bbAngle) < PI/3) + { + mAngle = randFloat(0, TWO_PI); + } + var mDist = radius - 4; + var mX = round(fx + mDist * cos(mAngle)); + var mZ = 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 = round(fx + mDist * cos(mAngle)); + mZ = round(fz + mDist * sin(mAngle)); + group = new SimpleGroup( + [new SimpleObject(oStoneLarge, 1,1, 0,2)], + true, clBaseResource, mX, mZ + ); + createObjectGroup(group, 0); + var hillSize = PI * radius * radius; + // create starting trees + var num = floor(hillSize / 60); + var tAngle = randFloat(0, TWO_PI); + var tDist = randFloat(9, radius - 2); + var tX = round(fx + tDist * cos(tAngle)); + var tZ = round(fz + tDist * sin(tAngle)); + group = new SimpleGroup( + [new SimpleObject(oTree, num, num, 0,7)], + false, clBaseResource, tX, tZ + ); + createObjectGroup(group, 0, avoidClasses(clBaseResource,2)); + +} + +RMS.SetProgress(15); + +// create volcano +log("Creating volcano"); +var fx = fractionToTiles(0.5); +var fz = fractionToTiles(0.5); +var ix = round(fx); +var iz = round(fz); + +var placer = new ClumpPlacer(mapArea * 0.067, 0.7, 0.05, 100, ix, iz); +var terrainPainter = new LayeredPainter( + [tCliff, tCliff], // terrains + [3] // widths +); +var elevationPainter = new SmoothElevationPainter( + ELEVATION_SET, // type + 15, // elevation + 3 // blend radius +); +createArea(placer, [terrainPainter, elevationPainter, paintClass(clHill)], null); + +var placer = new ClumpPlacer(mapArea * 0.05, 0.7, 0.05, 100, ix, iz); +var terrainPainter = new LayeredPainter( + [tCliff, tCliff], // terrains + [3] // widths +); +var elevationPainter = new SmoothElevationPainter( + ELEVATION_SET, // type + 25, // elevation + 3 // blend radius +); +createArea(placer, [terrainPainter, elevationPainter, paintClass(clHill2)], stayClasses(clHill, 1)); + +var placer = new ClumpPlacer(mapArea * 0.02, 0.7, 0.05, 100, ix, iz); +var terrainPainter = new LayeredPainter( + [tCliff, tCliff], // terrains + [3] // widths +); +var elevationPainter = new SmoothElevationPainter( + ELEVATION_SET, // type + 45, // elevation + 3 // blend radius +); +createArea(placer, [terrainPainter, elevationPainter, paintClass(clHill3)], stayClasses(clHill2, 1)); + +var placer = new ClumpPlacer(mapArea * 0.011, 0.7, 0.05, 100, ix, iz); +var terrainPainter = new LayeredPainter( + [tCliff, tCliff], // terrains + [3] // widths +); +var elevationPainter = new SmoothElevationPainter( + ELEVATION_SET, // type + 62, // elevation + 3 // blend radius +); +createArea(placer, [terrainPainter, elevationPainter, paintClass(clHill4)], stayClasses(clHill3, 1)); + +var placer = new ClumpPlacer(mapArea * 0.003, 0.7, 0.05, 100, ix, iz); +var terrainPainter = new LayeredPainter( + [tCliff, tLava1, tLava2, tLava3], // terrains + [1, 1, 1] // widths +); +var elevationPainter = new SmoothElevationPainter( + ELEVATION_SET, // type + 42, // elevation + 1 // blend radius +); +createArea(placer, [terrainPainter, elevationPainter, paintClass(clHill4)], stayClasses(clHill4, 1)); + +var num = floor(mapArea * 0.03 / 15); +var tX = round(fx); +var tZ = round(fz); +var group = new SimpleGroup( + [new SimpleObject(aSmoke, num, num, 0,7)], + false, clBaseResource, tX, tZ +); +createObjectGroup(group, 0, stayClasses(clHill4,1)); + +RMS.SetProgress(45); + +// create hills +log("Creating hills..."); +placer = new ClumpPlacer(scaleByMapSize(20, 150), 0.2, 0.1, 1); +terrainPainter = new LayeredPainter( + [tCliff, tGrass], // terrains + [2] // widths +); +elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 18, 2); +createAreas( + placer, + [terrainPainter, elevationPainter, paintClass(clHill)], + avoidClasses(clPlayer, 12, clHill, 15, clWater, 2), + scaleByMapSize(2, 8) * numPlayers +); + + +// calculate desired number of trees for map (based on size) + +var MIN_TREES = 200; +var MAX_TREES = 1250; +var P_FOREST = 0.7; + +var totalTrees = scaleByMapSize(MIN_TREES, MAX_TREES); +var numForest = totalTrees * P_FOREST; +var numStragglers = totalTrees * (1.0 - P_FOREST); + +// create forests +log("Creating forests..."); +var types = [ + [[tGrassB, tGrassA, pForestD], [tGrassB, pForestD]], + [[tGrassB, tGrassA, pForestP], [tGrassB, pForestP]] +]; // some variation + + +var size = numForest / (scaleByMapSize(2,8) * numPlayers); + +var num = floor(size / types.length); +for (var i = 0; i < types.length; ++i) +{ + placer = new ClumpPlacer(numForest / num, 0.1, 0.1, 1); + painter = new LayeredPainter( + types[i], // terrains + [2] // widths + ); + createAreas( + placer, + [painter, paintClass(clForest)], + avoidClasses(clPlayer, 12, clForest, 10, clHill, 0, clWater, 2), + num + ); +} + +RMS.SetProgress(70); + +// create dirt patches +log("Creating dirt patches..."); +var sizes = [scaleByMapSize(3, 48), scaleByMapSize(5, 84), scaleByMapSize(8, 128)]; +for (var i = 0; i < sizes.length; i++) +{ + placer = new ClumpPlacer(sizes[i], 0.3, 0.06, 0.5); + painter = new LayeredPainter( + [[tGrass,tGrassA],[tGrassA,tGrassB], [tGrassB,tGrassC]], // terrains + [1,1] // widths + ); + createAreas( + placer, + [painter, paintClass(clDirt)], + avoidClasses(clWater, 3, clForest, 0, clHill, 0, clDirt, 5, clPlayer, 12), + scaleByMapSize(15, 45) + ); +} + + + +log("Creating stone mines..."); +// create large stone quarries +group = new SimpleGroup([new SimpleObject(oStoneSmall, 0,2, 0,4), new SimpleObject(oStoneLarge, 1,1, 0,4)], true, clRock); +createObjectGroups(group, 0, + avoidClasses(clWater, 3, clForest, 1, clPlayer, 10, clRock, 10, clHill, 1), + scaleByMapSize(4,16), 100 +); + +// create small stone quarries +group = new SimpleGroup([new SimpleObject(oStoneSmall, 2,5, 1,3)], true, clRock); +createObjectGroups(group, 0, + avoidClasses(clWater, 3, clForest, 1, clPlayer, 10, clRock, 10, clHill, 1), + scaleByMapSize(4,16), 100 +); + +log("Creating metal mines..."); +// create large metal quarries +group = new SimpleGroup([new SimpleObject(oMetalLarge, 1,1, 0,4)], true, clMetal); +createObjectGroups(group, 0, + avoidClasses(clWater, 3, clForest, 1, clPlayer, 10, clMetal, 10, clRock, 5, clHill, 1), + scaleByMapSize(4,16), 100 +); + +RMS.SetProgress(90); + +// create small decorative rocks +log("Creating small decorative rocks..."); +group = new SimpleGroup( + [new SimpleObject(aRockMedium, 1,3, 0,1)], + true +); +createObjectGroups( + group, 0, + avoidClasses(clWater, 0, clForest, 0, clPlayer, 0, clHill, 0), + scaleByMapSize(16, 262), 50 +); + + +// create large decorative rocks +log("Creating large decorative rocks..."); +group = new SimpleGroup( + [new SimpleObject(aRockLarge, 1,2, 0,1), new SimpleObject(aRockMedium, 1,3, 0,2)], + true +); +createObjectGroups( + group, 0, + avoidClasses(clWater, 0, clForest, 0, clPlayer, 0, clHill, 0), + scaleByMapSize(8, 131), 50 +); + +RMS.SetProgress(95); + +// create straggler trees +log("Creating straggler trees..."); +var types = [oTree]; // some variation +var num = floor(numStragglers / types.length); +for (var i = 0; i < types.length; ++i) +{ + group = new SimpleGroup( + [new SimpleObject(types[i], 1,1, 0,3)], + true, clForest + ); + createObjectGroups(group, 0, + avoidClasses(clWater, 5, clForest, 1, clHill, 1, clPlayer, 12, clMetal, 1, clRock, 1), + num + ); +} + +ExportMap(); diff --git a/binaries/data/mods/public/maps/random/volcanic_lands.json b/binaries/data/mods/public/maps/random/volcanic_lands.json new file mode 100644 index 0000000000..8183585da0 --- /dev/null +++ b/binaries/data/mods/public/maps/random/volcanic_lands.json @@ -0,0 +1,12 @@ +{ + "settings" : { + "Name" : "Volcanic Lands", + "Script" : "volcanic_lands.js", + "Description" : "A grey dead land where players start around a smoking volcano.", + "BaseTerrain" : "ocean_rock_a", + "BaseHeight" : 1, + "CircularMap" : true, + "Keywords": ["demo"], + "XXXXXX" : "Optionally define other things here, like we would for a scenario" + } +} \ No newline at end of file