diff --git a/binaries/data/mods/public/maps/random/alpine_lakes.js b/binaries/data/mods/public/maps/random/alpine_lakes.js new file mode 100644 index 0000000000..204be880eb --- /dev/null +++ b/binaries/data/mods/public/maps/random/alpine_lakes.js @@ -0,0 +1,567 @@ +RMS.LoadLibrary("rmgen"); + + +var rt = randInt(1,2); +if (rt == 1) +{ + var tGrass = ["alpine_dirt_grass_50"]; + var tGrassPForest = "alpine_forrestfloor"; + var tGrassDForest = "alpine_forrestfloor"; + var tCliff = ["alpine_cliff_a", "alpine_cliff_b", "alpine_cliff_c"]; + var tGrassA = "alpine_grass_rocky"; + var tGrassB = ["alpine_grass_snow_50", "alpine_dirt_snow"]; + var tGrassC = ["alpine_snow_a", "alpine_snow_b"]; + var tDirt = ["alpine_dirt", "alpine_grass_d"]; + var tRoad = "new_alpine_citytile"; + var tRoadWild = "new_alpine_citytile"; + var tShore = "alpine_shore_rocks_grass_50"; + var tWater = "alpine_shore_rocks"; + + // gaia entities + var oPine = "gaia/flora_tree_pine"; + var oBerryBush = "gaia/flora_bush_berry"; + var oChicken = "gaia/fauna_chicken"; + var oDeer = "gaia/fauna_deer"; + var oGoat = "gaia/fauna_goat"; + var oFish = "gaia/fauna_fish"; + var oRabbit = "gaia/fauna_rabbit"; + var oStoneLarge = "gaia/geology_stonemine_alpine_quarry"; + var oStoneSmall = "gaia/geology_stone_alpine_a"; + var oMetalLarge = "gaia/geology_metal_alpine_slabs"; +} +else +{ + var tGrass = ["alpine_snow_a", "alpine_snow_b"]; + var tGrassPForest = "alpine_forrestfloor_snow"; + var tGrassDForest = "alpine_forrestfloor_snow"; + var tCliff = ["alpine_cliff_a", "alpine_cliff_b"]; + var tGrassA = "alpine_grass_snow_50"; + var tGrassB = ["alpine_grass_snow_50", "alpine_dirt_snow"]; + var tGrassC = ["alpine_snow_rocky"]; + var tDirt = ["alpine_dirt_snow", "alpine_snow_a"]; + var tRoad = "new_alpine_citytile"; + var tRoadWild = "new_alpine_citytile"; + var tShore = "alpine_shore_rocks_icy"; + var tWater = "alpine_shore_rocks"; + + // gaia entities + var oPine = "gaia/flora_tree_pine_w"; + var oBerryBush = "gaia/flora_bush_berry"; + var oChicken = "gaia/fauna_chicken"; + var oDeer = "gaia/fauna_deer"; + var oGoat = "gaia/fauna_goat"; + var oFish = "gaia/fauna_fish"; + var oRabbit = "gaia/fauna_rabbit"; + var oStoneLarge = "gaia/geology_stonemine_alpine_quarry"; + var oStoneSmall = "gaia/geology_stone_alpine_a"; + var oMetalLarge = "gaia/geology_metal_alpine_slabs"; +} +// decorative props +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"; +var aRockMedium = "actor|geology/stone_granite_med.xml"; +var aReeds = "actor|props/flora/reeds_pond_lush_a.xml"; +var aLillies = "actor|props/flora/water_lillies.xml"; +var aBushMedium = "actor|props/flora/bush_medit_me.xml"; +var aBushSmall = "actor|props/flora/bush_medit_sm.xml"; + +var pForestD = [tGrassDForest + TERRAIN_SEPARATOR + oPine, tGrassDForest]; +var pForestP = [tGrassPForest + TERRAIN_SEPARATOR + oPine, tGrassPForest]; +const BUILDING_ANGlE = 0.75*PI; + +// 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 clPass = createTileClass(); + +for (var ix = 0; ix < mapSize; ix++) +{ + for (var iz = 0; iz < mapSize; iz++) + { + var x = ix / (mapSize + 1.0); + var z = iz / (mapSize + 1.0); + placeTerrain(ix, iz, tGrass); + } +} + +// 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]); + ix = round(fx); + 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; + 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 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 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(oPine, 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); + } +} + +RMS.SetProgress(20); + +for (var i = 0; i < scaleByMapSize(15,40); i++) +{ + var ix = randInt(1, mapSize - 1); + var iz = randInt(1, mapSize - 1); + var ix2 = randInt(1, mapSize - 1); + var iz2 = randInt(1, mapSize - 1); + var placer = new PathPlacer(ix, iz, ix2, iz2, scaleByMapSize(9,15), 0.4, 3*(scaleByMapSize(1,4)), 0.1, 0.1); + var terrainPainter = new LayeredPainter( + [tCliff, tGrass], // terrains + [3] // widths + ); + var elevationPainter = new SmoothElevationPainter( + ELEVATION_SET, // type + 25, // elevation + 3 // blend radius + ); + createArea(placer, [terrainPainter, elevationPainter, paintClass(clHill)], avoidClasses(clPlayer, 15)); +} + +for (var i = 0; i < numPlayers; i++) +{ + if (i+1 == numPlayers) + { + var placer = new PathPlacer(fractionToTiles(playerX[i]), fractionToTiles(playerZ[i]), fractionToTiles(playerX[0]), fractionToTiles(playerZ[0]), scaleByMapSize(12,25), 0.4, 3*(scaleByMapSize(1,4)), 0.1, 0); + } + else + { + var placer = new PathPlacer(fractionToTiles(playerX[i]), fractionToTiles(playerZ[i]), fractionToTiles(playerX[i+1]), fractionToTiles(playerZ[i+1]), scaleByMapSize(12,25), 0.4, 3*(scaleByMapSize(1,4)), 0.1, 0); + } + var terrainPainter = new LayeredPainter( + [tGrass, tGrass], // terrains + [1] // widths + ); + var elevationPainter = new SmoothElevationPainter( + ELEVATION_SET, // type + 3, // elevation + 3 // blend radius + ); + createArea(placer, [terrainPainter, elevationPainter, paintClass(clPass)], null); +} + +// create lakes +log("Creating lakes..."); +placer = new ClumpPlacer(scaleByMapSize(160, 700), 0.2, 0.1, 1); +terrainPainter = new LayeredPainter( + [tShore, tWater, tWater], // terrains + [1, 3] // widths +); +elevationPainter = new SmoothElevationPainter(ELEVATION_SET, -5, 5); +createAreas( + placer, + [terrainPainter, elevationPainter, paintClass(clWater)], + avoidClasses(clPlayer, 12, clWater, 8, clPass, 4), + scaleByMapSize(5, 16) +); + +paintTerrainBasedOnHeight(3.1, 20, 0, tCliff); +paintTerrainBasedOnHeight(20, 21, 1, tGrass); + +// 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, 10), + scaleByMapSize(100, 200) +); + +// create hills +log("Creating hills..."); +placer = new ClumpPlacer(scaleByMapSize(20, 150), 0.2, 0.1, 1); +terrainPainter = new LayeredPainter( + [tGrass, tCliff, tGrass], // terrains + [1, 2] // widths +); +elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 18, 2); +createAreas( + placer, + [terrainPainter, elevationPainter, paintClass(clHill)], + avoidClasses(clPlayer, 12, clHill, 15, clWater, 2, clPass, 1), + scaleByMapSize(1, 4) * numPlayers +); + + +// calculate desired number of trees for map (based on size) + +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 + + + +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, clPass, 1), + num + ); +} + +RMS.SetProgress(60); + +// 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) + ); +} + +// 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(tGrassB); + createAreas( + placer, + painter, + avoidClasses(clWater, 3, clForest, 0, clHill, 0, clDirt, 5, clPlayer, 12), + scaleByMapSize(15, 45) + ); +} +RMS.SetProgress(65); + + +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(70); + +// 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(75); + +// create deer +log("Creating deer..."); +group = new SimpleGroup( + [new SimpleObject(oDeer, 5,7, 0,4)], + true, clFood +); +createObjectGroups(group, 0, + avoidClasses(clWater, 3, clForest, 0, clPlayer, 10, clHill, 1, clFood, 20), + 3 * numPlayers, 50 +); + +// create rabbit +log("Creating rabbit..."); +group = new SimpleGroup( + [new SimpleObject(oRabbit, 2,3, 0,2)], + true, clFood +); +createObjectGroups(group, 0, + avoidClasses(clWater, 3, clForest, 0, clPlayer, 10, clHill, 1, clFood, 20), + 3 * numPlayers, 50 +); + +// create fish +log("Creating fish..."); +group = new SimpleGroup( + [new SimpleObject(oFish, 2,3, 0,2)], + true, clFood +); +createObjectGroups(group, 0, + [avoidClasses(clFood, 20), stayClasses(clWater, 6)], + 11 * numPlayers, 60 +); + +RMS.SetProgress(85); + + +// create straggler trees +log("Creating straggler trees..."); +var types = [oPine, oPine]; // 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 + ); +} + + +//create small grass tufts +log("Creating small grass tufts..."); +var planetm = 1; + +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), + 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), + 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, 2, clHill, 1, clPlayer, 1, clDirt, 1), + planetm * scaleByMapSize(13, 200), 50 +); + + + +var 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(); \ No newline at end of file diff --git a/binaries/data/mods/public/maps/random/alpine_lakes.json b/binaries/data/mods/public/maps/random/alpine_lakes.json new file mode 100644 index 0000000000..f7d62602d2 --- /dev/null +++ b/binaries/data/mods/public/maps/random/alpine_lakes.json @@ -0,0 +1,11 @@ +{ + "settings" : { + "Name" : "Alpine Lakes", + "Script" : "alpine_lakes.js", + "Description" : "High mountains bordering deep valleys strung with mountain streams and broader finger-like lakes.", + "BaseTerrain" : ["alpine_dirt_grass_50"], + "BaseHeight" : 3, + "CircularMap" : true, + "XXXXXX" : "Optionally define other things here, like we would for a scenario" + } +} \ No newline at end of file diff --git a/binaries/data/mods/public/maps/random/alpine_valley.js b/binaries/data/mods/public/maps/random/alpine_valley.js new file mode 100644 index 0000000000..dcfbbfbd16 --- /dev/null +++ b/binaries/data/mods/public/maps/random/alpine_valley.js @@ -0,0 +1,589 @@ +RMS.LoadLibrary("rmgen"); + +TILE_CENTERED_HEIGHT_MAP = true; +var rt = randInt(1,2); +if (rt == 1) +{ + var tGrass = ["alpine_dirt_grass_50"]; + var tGrassPForest = "alpine_forrestfloor"; + var tGrassDForest = "alpine_forrestfloor"; + var tCliff = ["alpine_cliff_a", "alpine_cliff_b", "alpine_cliff_c"]; + var tGrassA = "alpine_grass_rocky"; + var tGrassB = ["alpine_grass_snow_50", "alpine_dirt_snow"]; + var tGrassC = ["alpine_snow_a", "alpine_snow_b"]; + var tDirt = ["alpine_dirt", "alpine_grass_d"]; + var tRoad = "new_alpine_citytile"; + var tRoadWild = "new_alpine_citytile"; + var tShore = "alpine_shore_rocks_grass_50"; + var tWater = "alpine_shore_rocks"; + + // gaia entities + var oPine = "gaia/flora_tree_pine"; + var oBerryBush = "gaia/flora_bush_berry"; + var oChicken = "gaia/fauna_chicken"; + var oDeer = "gaia/fauna_deer"; + var oGoat = "gaia/fauna_goat"; + var oFish = "gaia/fauna_fish"; + var oRabbit = "gaia/fauna_rabbit"; + var oStoneLarge = "gaia/geology_stonemine_alpine_quarry"; + var oStoneSmall = "gaia/geology_stone_alpine_a"; + var oMetalLarge = "gaia/geology_metal_alpine_slabs"; +} +else +{ + var tGrass = ["alpine_snow_a", "alpine_snow_b"]; + var tGrassPForest = "alpine_forrestfloor_snow"; + var tGrassDForest = "alpine_forrestfloor_snow"; + var tCliff = ["alpine_cliff_a", "alpine_cliff_b"]; + var tGrassA = "alpine_grass_snow_50"; + var tGrassB = ["alpine_grass_snow_50", "alpine_dirt_snow"]; + var tGrassC = ["alpine_snow_rocky"]; + var tDirt = ["alpine_dirt_snow", "alpine_snow_a"]; + var tRoad = "new_alpine_citytile"; + var tRoadWild = "new_alpine_citytile"; + var tShore = "alpine_shore_rocks_icy"; + var tWater = "alpine_shore_rocks"; + + // gaia entities + var oPine = "gaia/flora_tree_pine_w"; + var oBerryBush = "gaia/flora_bush_berry"; + var oChicken = "gaia/fauna_chicken"; + var oDeer = "gaia/fauna_deer"; + var oGoat = "gaia/fauna_goat"; + var oFish = "gaia/fauna_fish"; + var oRabbit = "gaia/fauna_rabbit"; + var oStoneLarge = "gaia/geology_stonemine_alpine_quarry"; + var oStoneSmall = "gaia/geology_stone_alpine_a"; + var oMetalLarge = "gaia/geology_metal_alpine_slabs"; +} +// decorative props +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"; +var aRockMedium = "actor|geology/stone_granite_med.xml"; +var aReeds = "actor|props/flora/reeds_pond_lush_a.xml"; +var aLillies = "actor|props/flora/water_lillies.xml"; +var aBushMedium = "actor|props/flora/bush_medit_me.xml"; +var aBushSmall = "actor|props/flora/bush_medit_sm.xml"; + +var pForestD = [tGrassDForest + TERRAIN_SEPARATOR + oPine, tGrassDForest]; +var pForestP = [tGrassPForest + TERRAIN_SEPARATOR + oPine, tGrassPForest]; +const BUILDING_ANGlE = 0.75*PI; + +// 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 clPass = createTileClass(); + +for (var ix = 0; ix < mapSize; ix++) +{ + for (var iz = 0; iz < mapSize; iz++) + { + var x = ix / (mapSize + 1.0); + var z = iz / (mapSize + 1.0); + placeTerrain(ix, iz, tGrass); + } +} + +// 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]); + ix = round(fx); + 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; + 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 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 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(oPine, 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); + } +} + +RMS.SetProgress(20); + +//create hills +log ("Creating hills..."); +for (var i = 0; i < scaleByMapSize(15,40); i++) +{ + var ix = randInt(1, mapSize - 1); + var iz = randInt(1, mapSize - 1); + var ix2 = randInt(1, mapSize - 1); + var iz2 = randInt(1, mapSize - 1); + var placer = new PathPlacer(ix, iz, ix2, iz2, scaleByMapSize(7,13), 0.4, 3*(scaleByMapSize(1,4)), 0.1, 0.1); + var terrainPainter = new LayeredPainter( + [tCliff, tGrass], // terrains + [3] // widths + ); + var elevationPainter = new SmoothElevationPainter( + ELEVATION_SET, // type + 20, // elevation + 3 // blend radius + ); + createArea(placer, [terrainPainter, elevationPainter, paintClass(clHill)], avoidClasses(clPlayer, 15)); +} + +//create passages +log ("Creating passages..."); +for (var i = 0; i < numPlayers; i++) +{ + if (i+1 == numPlayers) + { + var placer = new PathPlacer(fractionToTiles(playerX[i]), fractionToTiles(playerZ[i]), fractionToTiles(playerX[0]), fractionToTiles(playerZ[0]), scaleByMapSize(12,25), 0.4, 3*(scaleByMapSize(1,4)), 0.1, 0); + } + else + { + var placer = new PathPlacer(fractionToTiles(playerX[i]), fractionToTiles(playerZ[i]), fractionToTiles(playerX[i+1]), fractionToTiles(playerZ[i+1]), scaleByMapSize(12,25), 0.4, 3*(scaleByMapSize(1,4)), 0.1, 0); + } + var terrainPainter = new LayeredPainter( + [tGrass, tGrass], // terrains + [1] // widths + ); + var elevationPainter = new SmoothElevationPainter( + ELEVATION_SET, // type + 3, // elevation + 3 // blend radius + ); + createArea(placer, [terrainPainter, elevationPainter, paintClass(clPass)], null); +} + +//create rivers +log ("Creating rivers..."); +for (var m = 0; m < scaleByMapSize(1,3)*randInt(3,4); m++) +{ + var tang = randFloat(0, TWO_PI); + var placer = new PathPlacer(fractionToTiles(0.5), fractionToTiles(0.5), fractionToTiles(0.5 + 0.49*cos(tang)), fractionToTiles(0.5 + 0.49*sin(tang)), scaleByMapSize(10,20), 0.4, 3*(scaleByMapSize(1,4)), 0.1, 0.05); + var terrainPainter = new LayeredPainter( + [tShore, tWater, tWater], // terrains + [1, 3] // widths + ); + var elevationPainter = new SmoothElevationPainter( + ELEVATION_SET, // type + -4, // elevation + 4 // blend radius + ); + createArea(placer, [terrainPainter, elevationPainter, paintClass(clWater)], avoidClasses(clPlayer, 15)); + placer = new ClumpPlacer(floor(PI*scaleByMapSize(10,20)*scaleByMapSize(10,20)/4), 0.95, 0.6, 10, fractionToTiles(0.5 + 0.49*cos(tang)), fractionToTiles(0.5 + 0.49*sin(tang))); + var painter = new LayeredPainter([tWater, tWater], [1]); + var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, -4, 4); + createArea(placer, [painter, elevationPainter], avoidClasses(clPlayer, 15)); +} +paintTerrainBasedOnHeight(3.1, 20, 0, tCliff); +paintTerrainBasedOnHeight(20, 21, 1, tGrass); + +for (var i = 0; i < numPlayers; i++) +{ + if (i+1 == numPlayers) + { + passageMaker(fractionToTiles(playerX[i]), fractionToTiles(playerZ[i]), fractionToTiles(playerX[0]), fractionToTiles(playerZ[0]), 6, -2, -2, 2) + } + else + { + passageMaker(fractionToTiles(playerX[i]), fractionToTiles(playerZ[i]), fractionToTiles(playerX[i+1]), fractionToTiles(playerZ[i+1]), 6, -2, -2, 2) + } +} + +// 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, 10), + scaleByMapSize(100, 200) +); + +// create hills +log("Creating hills..."); +placer = new ClumpPlacer(scaleByMapSize(20, 150), 0.2, 0.1, 1); +terrainPainter = new LayeredPainter( + [tGrass, tCliff, tGrass], // terrains + [1, 2] // widths +); +elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 18, 2); +createAreas( + placer, + [terrainPainter, elevationPainter, paintClass(clHill)], + avoidClasses(clPlayer, 12, clHill, 15, clWater, 2, clPass, 1), + scaleByMapSize(1, 4) * numPlayers +); + + +// calculate desired number of trees for map (based on size) + +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 + + + +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, clPass, 1), + num + ); +} + +RMS.SetProgress(60); + +// 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) + ); +} + +// 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(tGrassB); + createAreas( + placer, + painter, + avoidClasses(clWater, 3, clForest, 0, clHill, 0, clDirt, 5, clPlayer, 12), + scaleByMapSize(15, 45) + ); +} +RMS.SetProgress(65); + + +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(70); + +// 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(75); + +// create deer +log("Creating deer..."); +group = new SimpleGroup( + [new SimpleObject(oDeer, 5,7, 0,4)], + true, clFood +); +createObjectGroups(group, 0, + avoidClasses(clWater, 3, clForest, 0, clPlayer, 10, clHill, 1, clFood, 20), + 3 * numPlayers, 50 +); + +// create rabbit +log("Creating rabbit..."); +group = new SimpleGroup( + [new SimpleObject(oRabbit, 2,3, 0,2)], + true, clFood +); +createObjectGroups(group, 0, + avoidClasses(clWater, 3, clForest, 0, clPlayer, 10, clHill, 1, clFood, 20), + 3 * numPlayers, 50 +); + +// create fish +log("Creating fish..."); +group = new SimpleGroup( + [new SimpleObject(oFish, 2,3, 0,2)], + true, clFood +); +createObjectGroups(group, 0, + [avoidClasses(clFood, 20), stayClasses(clWater, 6)], + 11 * numPlayers, 60 +); + +RMS.SetProgress(85); + + +// create straggler trees +log("Creating straggler trees..."); +var types = [oPine, oPine]; // 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 + ); +} + + +//create small grass tufts +log("Creating small grass tufts..."); +var planetm = 1; + +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), + 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), + 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, 2, clHill, 1, clPlayer, 1, clDirt, 1), + planetm * scaleByMapSize(13, 200), 50 +); + + + +var 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(); \ No newline at end of file diff --git a/binaries/data/mods/public/maps/random/alpine_valley.json b/binaries/data/mods/public/maps/random/alpine_valley.json new file mode 100644 index 0000000000..4dc260f6b2 --- /dev/null +++ b/binaries/data/mods/public/maps/random/alpine_valley.json @@ -0,0 +1,11 @@ +{ + "settings" : { + "Name" : "Alpine Valley", + "Script" : "alpine_valley.js", + "Description" : "High mountains bordering deep valleys", + "BaseTerrain" : ["alpine_dirt_grass_50"], + "BaseHeight" : 3, + "CircularMap" : true, + "XXXXXX" : "Optionally define other things here, like we would for a scenario" + } +} \ No newline at end of file diff --git a/binaries/data/mods/public/maps/random/archipelago.js b/binaries/data/mods/public/maps/random/archipelago.js new file mode 100644 index 0000000000..a85561e77d --- /dev/null +++ b/binaries/data/mods/public/maps/random/archipelago.js @@ -0,0 +1,544 @@ +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 = 0.75*PI; + +// 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.8,1.2)), 0.80, 0.1, 10); +terrainPainter = new LayeredPainter( + [tGrass, tGrass], // terrains + [2] // widths +); +elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 3, 4); +createAreas( + placer, + [terrainPainter, elevationPainter, paintClass(clLand)], + null, + scaleByMapSize(10, 50) +); + +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)]; +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)], + 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)], + 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/archipelago.json b/binaries/data/mods/public/maps/random/archipelago.json new file mode 100644 index 0000000000..807bd5171c --- /dev/null +++ b/binaries/data/mods/public/maps/random/archipelago.json @@ -0,0 +1,11 @@ +{ + "settings" : { + "Name" : "Archipelago", + "Script" : "archipelago.js", + "Description" : "Players start in small islands in the western part of the map. There is a big continent in the west ready for expansion.", + "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/canyon.js b/binaries/data/mods/public/maps/random/canyon.js new file mode 100644 index 0000000000..9cedb0f13a --- /dev/null +++ b/binaries/data/mods/public/maps/random/canyon.js @@ -0,0 +1,719 @@ +RMS.LoadLibrary("rmgen"); + + +//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(); + +// 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"; +var oFood = "gaia/special_treasure_food_bin"; + +// 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 aTree = rBiomeA9(); + +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 = 0.75*PI; + +// 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 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(); + +for (var ix = 0; ix < mapSize; ix++) +{ + for (var iz = 0; iz < mapSize; iz++) + { + var x = ix / (mapSize + 1.0); + var z = iz / (mapSize + 1.0); + placeTerrain(ix, iz, tGrass); + } +} + +var fx = fractionToTiles(0.5); +var fz = fractionToTiles(0.5); +ix = round(fx); +iz = round(fz); + +var lSize = sqrt(sqrt(sqrt(scaleByMapSize(1, 6)))); + +var placer = new ClumpPlacer(mapArea * 0.065 * lSize, 0.7, 0.1, 10, ix, iz); +var terrainPainter = new LayeredPainter( + [tGrass, tGrass], // terrains + [3] // widths +); +var elevationPainter = new SmoothElevationPainter( + ELEVATION_SET, // type + 3, // elevation + 3 // blend radius +); +createArea(placer, [terrainPainter, elevationPainter, paintClass(clLand)], null); + +// 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(18,32); + var cliffRadius = 2; + var elevation = 20; + var hillSize = PI * radius * radius; + // get the x and z in tiles + fx = fractionToTiles(playerX[i]); + fz = fractionToTiles(playerZ[i]); + ix = round(fx); + iz = round(fz); + // create the hill + var placer = new ClumpPlacer(hillSize, 0.65, 0.1, 10, ix, iz); + var terrainPainter = new LayeredPainter( + [tGrass, tGrass], // terrains + [cliffRadius] // widths + ); + var elevationPainter = new SmoothElevationPainter( + ELEVATION_SET, // type + 3, // elevation + cliffRadius // blend radius + ); + createArea(placer, [terrainPainter, elevationPainter, paintClass(clLand)], null); + + + + // 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 metal mine + var mAngle = bbAngle; + while(abs(mAngle - bbAngle) < PI/3) + { + mAngle = randFloat(0, TWO_PI); + } + var mDist = radius - 7; + 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 the city patch + var cityRadius = radius/2; + placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, fractionToTiles(playerX[i]), fractionToTiles(playerZ[i])); + var painter = new LayeredPainter([tGrass, tGrass], [1]); + createArea(placer, [painter, paintClass(clPlayer)], null); + +} + +placer = new ClumpPlacer(150, 0.6, 0.3, 10, fractionToTiles(0.5), fractionToTiles(0.5)); +var painter = new LayeredPainter([tRoad, tRoad], [1]); +createArea(placer, [painter, paintClass(clHill)], null); + +for (var i = 0; i < scaleByMapSize(9,16); i++) +{ + var ix = randInt(1, mapSize - 1); + var iz = randInt(1, mapSize - 1); + var ix2 = randInt(1, mapSize - 1); + var iz2 = randInt(1, mapSize - 1); + var placer = new PathPlacer(ix, iz, ix2, iz2, scaleByMapSize(11,16), 0.4, 3*(scaleByMapSize(1,4)), 0.1, 0); + var terrainPainter = new LayeredPainter( + [tGrass, tGrass], // terrains + [3] // widths + ); + var elevationPainter = new SmoothElevationPainter( + ELEVATION_SET, // type + 30, // elevation + 3 // blend radius + ); + createArea(placer, [terrainPainter, elevationPainter, paintClass(clHill2)], avoidClasses(clPlayer, 6, clHill2, 3, clHill, 2)); +} + +for (var g = 0; g < scaleByMapSize(20,80); g++) +{ + var tx = randInt(1, mapSize - 1); + var tz = randInt(1, mapSize - 1); + + placer = new ClumpPlacer(mapArea * 0.01 * lSize, 0.7, 0.1, 10, tx, tz); + terrainPainter = new LayeredPainter( + [tGrass, tGrass], // terrains + [3] // widths + ); + elevationPainter = new SmoothElevationPainter( + ELEVATION_SET, // type + 3, // elevation + 3 // blend radius + ); + var newarea = createArea(placer, [terrainPainter, elevationPainter, paintClass(clLand)], avoidClasses(clLand, 6)); + if (newarea !== null) + { + var distances = new Array(0); + var d1 = 9999; + var d2 = 9999; + var p1 = -1; + var p2 = 0; + for (var i = 0; i < numPlayers; i++) + { + distances.push(sqrt((tx-mapSize*playerX[i])*(tx-mapSize*playerX[i])+(tz-mapSize*playerZ[i])*(tz-mapSize*playerZ[i]))); + } + for (var a = 0; a < numPlayers; a++) + { + if (d1 >= distances[a]) + { + d2 = d1; + d1 = distances[a]; + p2 = p1; + p1 = a; + } + else if (d2 >= distances[a]) + { + d2 = distances[a]; + p2 = a; + } + } + + var placer = new PathPlacer(tx, tz, mapSize*playerX[p1], mapSize*playerZ[p1], scaleByMapSize(11,17), 0.4, 3*(scaleByMapSize(1,4)), 0.1, 0.1); + var terrainPainter = new LayeredPainter( + [tGrass, tGrass], // terrains + [3] // widths + ); + var elevationPainter = new SmoothElevationPainter( + ELEVATION_SET, // type + 3, // elevation + 3 // blend radius + ); + createArea(placer, [terrainPainter, elevationPainter, paintClass(clLand)], null); + + var placer = new PathPlacer(tx, tz, mapSize*playerX[p2], mapSize*playerZ[p2], scaleByMapSize(11,17), 0.4, 3*(scaleByMapSize(1,4)), 0.1, 0.1); + var terrainPainter = new LayeredPainter( + [tGrass, tGrass], // terrains + [3] // widths + ); + var elevationPainter = new SmoothElevationPainter( + ELEVATION_SET, // type + 3, // elevation + 3 // blend radius + ); + createArea(placer, [terrainPainter, elevationPainter, paintClass(clLand)], null); + } +} + + +for (var i = 0; i < numPlayers; i++) +{ + if (i+1 == numPlayers) + { + var placer = new PathPlacer(fractionToTiles(playerX[i]), fractionToTiles(playerZ[i]), fractionToTiles(playerX[0]), fractionToTiles(playerZ[0]), scaleByMapSize(8,13), 0.4, 3*(scaleByMapSize(1,4)), 0.1, 0); + } + else + { + var placer = new PathPlacer(fractionToTiles(playerX[i]), fractionToTiles(playerZ[i]), fractionToTiles(playerX[i+1]), fractionToTiles(playerZ[i+1]), scaleByMapSize(8,13), 0.4, 3*(scaleByMapSize(1,4)), 0.1, 0); + } + var terrainPainter = new LayeredPainter( + [tRoadWild, tRoad], // terrains + [1] // widths + ); + var elevationPainter = new SmoothElevationPainter( + ELEVATION_SET, // type + 3, // elevation + 3 // blend radius + ); + createArea(placer, [terrainPainter, elevationPainter, paintClass(clLand), paintClass(clHill)], null); + + var placer = new PathPlacer(fractionToTiles(playerX[i]), fractionToTiles(playerZ[i]), fractionToTiles(0.5), fractionToTiles(0.5), scaleByMapSize(8,13), 0.4, 3*(scaleByMapSize(1,4)), 0.1, 0); + var terrainPainter = new LayeredPainter( + [tRoadWild, tRoad], // terrains + [1] // widths + ); + var elevationPainter = new SmoothElevationPainter( + ELEVATION_SET, // type + 3, // elevation + 3 // blend radius + ); + createArea(placer, [terrainPainter, elevationPainter, paintClass(clLand), paintClass(clHill)], null); + +} + +for (var i = 0; i < numPlayers; i++) +{ + // create the city patch + var cityRadius = radius/3; + 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); +} + +placer = new ClumpPlacer(150, 0.6, 0.3, 10, fractionToTiles(0.5), fractionToTiles(0.5)); +var painter = new LayeredPainter([tRoad, tRoad], [1]); +createArea(placer, [painter, paintClass(clHill)], null); + +RMS.SetProgress(20); + +paintTerrainBasedOnHeight(3.1, 29, 0, tCliff); +paintTileClassBasedOnHeight(3.1, 32, 0, clHill2); + +// 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, 2), stayClasses(clLand, 2)], + 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, 8, clHill2, 8), stayClasses(clLand, 5)], + scaleByMapSize(1, 4) * numPlayers +); + +// 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, 40, 2); +createAreas( + placer, + [terrainPainter, elevationPainter, paintClass(clHill)], + avoidClasses(clLand, 1, clHill, 1), + scaleByMapSize(20, 150) +); + +// 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, 1, clForest, 5, clHill, 1, clHill2, 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)]; +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, 4, clHill2, 0), stayClasses(clLand, 3)], + 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, 4, clHill2, 0), stayClasses(clLand, 3)], + 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, 3, clRock, 10, clHill, 1, clHill2, 1), stayClasses(clLand, 2)], + scaleByMapSize(6,24), 100 +); + +// create small stone quarries +group = new SimpleGroup([new SimpleObject(oStoneSmall, 2,5, 1,3)], true, clRock); +createObjectGroups(group, 0, + [avoidClasses(clForest, 1, clPlayer, 3, clRock, 10, clHill, 1, clHill2, 1), stayClasses(clLand, 2)], + scaleByMapSize(6,24), 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, 3, clMetal, 10, clRock, 5, clHill, 1, clHill2, 1), stayClasses(clLand, 2)], + scaleByMapSize(6,24), 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), + 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), + 3*scaleByMapSize(8, 131), 50 +); + +// create actor trees +log("Creating actor trees..."); +group = new SimpleGroup( + [new SimpleObject(aTree, 1,1, 0,1)], + true +); +createObjectGroups( + group, 0, + avoidClasses(clLand, 5), + scaleByMapSize(200, 800), 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, 4, clHill, 1, clFood, 20, clHill2, 1), stayClasses(clLand, 3)], + 3 * numPlayers, 50 +); + +// create berries +log("Creating berries..."); +group = new SimpleGroup( + [new SimpleObject(oBerryBush, 5,7, 0,4)], + true, clFood +); +createObjectGroups(group, 0, + [avoidClasses(clWater, 0, clForest, 0, clPlayer, 4, clHill, 1, clFood, 20, clHill2, 1), stayClasses(clLand, 3)], + 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, 4, clHill, 1, clFood, 20, clHill2, 1), stayClasses(clLand, 3)], + 3 * numPlayers, 50 +); + +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, 9, clMetal, 1, clRock, 1, clHill2, 1), stayClasses(clLand, 3)], + 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 +); + +// create treasures +var fx = fractionToTiles(0.5); +var fz = fractionToTiles(0.5); +for (var i = 0; i < randInt(3,8); i++) +{ + placeObject(fx+randFloat(-7,7), fz+randFloat(-7,7), oWood, 0, randFloat(0, TWO_PI)) +} +for (var i = 0; i < randInt(3,8); i++) +{ + placeObject(fx+randFloat(-7,7), fz+randFloat(-7,7), oFood, 0, randFloat(0, TWO_PI)) +} + +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(); \ No newline at end of file diff --git a/binaries/data/mods/public/maps/random/canyon.json b/binaries/data/mods/public/maps/random/canyon.json new file mode 100644 index 0000000000..35e112e7de --- /dev/null +++ b/binaries/data/mods/public/maps/random/canyon.json @@ -0,0 +1,11 @@ +{ + "settings" : { + "Name" : "Canyon", + "Script" : "canyon.js", + "Description" : "Players start around the map in deep canyons.", + "BaseTerrain" : ["medit_sea_depths"], + "BaseHeight" : 30, + "CircularMap" : true, + "XXXXXX" : "Optionally define other things here, like we would for a scenario" + } +} \ No newline at end of file diff --git a/binaries/data/mods/public/maps/random/migration.js b/binaries/data/mods/public/maps/random/migration.js index 1b37e3116d..efd09240b4 100644 --- a/binaries/data/mods/public/maps/random/migration.js +++ b/binaries/data/mods/public/maps/random/migration.js @@ -34,6 +34,7 @@ var oSheep = rBiomeE10(); var oStoneLarge = rBiomeE11(); var oStoneSmall = rBiomeE12(); var oMetalLarge = rBiomeE13(); +var oWood = "gaia/special_treasure_wood"; // decorative props var aGrass = rBiomeA1(); @@ -182,6 +183,17 @@ for (var i = 0; i < numPlayers; i++) ); 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) @@ -208,7 +220,7 @@ for (var i = 0; i < numPlayers; i++) createObjectGroup(group, 0); var hillSize = PI * radius * radius; // create starting straggler trees - var num = hillSize / 50; + var num = hillSize / 100; for (var j = 0; j < num; j++) { var tAngle = randFloat(0, TWO_PI); diff --git a/binaries/data/mods/public/maps/random/migration.json b/binaries/data/mods/public/maps/random/migration.json index a909831e31..d7ee8a14bf 100644 --- a/binaries/data/mods/public/maps/random/migration.json +++ b/binaries/data/mods/public/maps/random/migration.json @@ -2,7 +2,7 @@ "settings" : { "Name" : "Migration", "Script" : "migration.js", - "Description" : "Players start in small islands in the western part of the map. There is a big continent in the west ready for expansion.", + "Description" : "Players start in small islands in the eastern part of the map. There is a big continent in the west ready for expansion.", "BaseTerrain" : ["medit_sand_wet"], "BaseHeight" : -5, "CircularMap" : true, diff --git a/binaries/data/mods/public/maps/random/rmgen/library.js b/binaries/data/mods/public/maps/random/rmgen/library.js index 71bdb57b01..e8c86c947b 100644 --- a/binaries/data/mods/public/maps/random/rmgen/library.js +++ b/binaries/data/mods/public/maps/random/rmgen/library.js @@ -508,12 +508,29 @@ function addToClass(x, z, id) } } +// Remove point from the given class by id +function removeFromClass(x, z, id) +{ + var tileClass = getTileClass(id); + + if (tileClass !== null) + { + tileClass.remove(x, z); + } +} + // Create a painter for the given class function paintClass(id) { return new TileClassPainter(getTileClass(id)); } +// Create a painter for the given class +function unPaintClass(id) +{ + return new TileClassUnPainter(getTileClass(id)); +} + // Create an avoid constraint for the given classes by the given distances function avoidClasses(/*class1, dist1, class2, dist2, etc*/) { diff --git a/binaries/data/mods/public/maps/random/rmgen/misc.js b/binaries/data/mods/public/maps/random/rmgen/misc.js index b104a2f070..8dcab7848d 100644 --- a/binaries/data/mods/public/maps/random/rmgen/misc.js +++ b/binaries/data/mods/public/maps/random/rmgen/misc.js @@ -1 +1 @@ -///////////////////////////////////////////////////////////////////////////////////////// // passageMaker // // Function for creating shallow water between two given points by changing the heiight of all tiles in // the path with height less than or equal to "maxheight" to "height" // // x1,z1: Starting point of path // x2,z2: Ending point of path // width: Width of the shallow // maxheight: Maximum height that it changes // height: Height of the shallow // smooth: smooth elevation in borders // tileclass: (Optianal) - Adds those tiles to the class given // terrain: (Optional) - Changes the texture of the elevated land // ///////////////////////////////////////////////////////////////////////////////////////// function passageMaker(x1, z1, x2, z2, width, maxheight, height, smooth, tileclass, terrain) { var mapSize = g_Map.size; for (var ix = 0; ix < mapSize; ix++) { for (var iz = 0; iz < mapSize; iz++) { var a = z1-z2; var b = x2-x1; var c = (z1*(x1-x2))-(x1*(z1-z2)); var dis = abs(a*ix + b*iz + c)/sqrt(a*a + b*b); var k = (a*ix + b*iz + c)/(a*a + b*b); var my = iz-(b*k); var inline = 0; if (b == 0) { if ((iz <= Math.max(z1,z2))&&(Math.min(z1,z2))) { inline = 1; } } else { if ((my <= Math.max(z1,z2))&&(my >= Math.min(z1,z2))) { inline = 1; } } if ((dis <= width)&&(inline)) { if(g_Map.getHeight(ix, iz) <= maxheight) { if (dis >= width - smooth) { g_Map.setHeight(ix, iz, ((width - dis)*(height)+(g_Map.getHeight(ix, iz))*(dis + smooth - width))/(width - smooth)/2); } else { g_Map.setHeight(ix, iz, height); } if (tileclass !== null) { addToClass(ix, iz, tileclass); } if (terrain !== null) { placeTerrain(ix, iz, terrain); } } } } } } ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //rndRiver is a fuction that creates random values useful for making a jagged river. // //it works the same as sin or cos function. the only difference is that it's period is 1 instead of 2*pi //it needs the "seed" parameter to use it to make random curves that don't get broken. //seed must be created using randFloat(). or else it won't work // // f: Input: Same as angle in a sine function // seed: Random Seed: Best to implement is to use randFloat() // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// function rndRiver(f, seed) { var rndRq = seed; var rndRw = rndRq; var rndRe = 0; var rndRr = f-floor(f); var rndRa = 0; for (var rndRx=0; rndRx<=floor(f); rndRx++) { rndRw = 10*(rndRw-floor(rndRw)); } if (rndRx%2==0) { var rndRs = -1; } else { var rndRs = 1; } rndRe = (floor(rndRw))%5; if (rndRe==0) { rndRa = (rndRs)*2.3*(rndRr)*(rndRr-1)*(rndRr-0.5)*(rndRr-0.5); } else if (rndRe==1) { rndRa = (rndRs)*2.6*(rndRr)*(rndRr-1)*(rndRr-0.3)*(rndRr-0.7); } else if (rndRe==2) { rndRa = (rndRs)*22*(rndRr)*(rndRr-1)*(rndRr-0.2)*(rndRr-0.3)*(rndRr-0.3)*(rndRr-0.8); } else if (rndRe==3) { rndRa = (rndRs)*180*(rndRr)*(rndRr-1)*(rndRr-0.2)*(rndRr-0.2)*(rndRr-0.4)*(rndRr-0.6)*(rndRr-0.6)*(rndRr-0.8); } else if (rndRe==4) { rndRa = (rndRs)*2.6*(rndRr)*(rndRr-1)*(rndRr-0.5)*(rndRr-0.7); } return rndRa; } ///////////////////////////////////////////////////////////////////////////////////////// // createStartingPlayerEntities // // Creates the starting player entities // fx&fz: position of player base // playerid: id of player // civEntities: use getStartingEntities(id-1) fo this one // BUILDING_ANGlE: angle of main base building // /////////////////////////////////////////////////////////////////////////////////////////// function createStartingPlayerEntities(fx, fz, playerid, civEntities, BUILDING_ANGlE) { var uDist = 6; var uSpace = 2; placeObject(fx, fz, civEntities[0].Template, playerid, BUILDING_ANGlE); for (var j = 1; j < civEntities.length; ++j) { var uAngle = -BUILDING_ANGlE + PI * (j - 1) / 2; var count = (civEntities[j].Count !== undefined ? civEntities[j].Count : 1); for (var numberofentities = 0; numberofentities < count; numberofentities++) { var ux = fx + uDist * cos(uAngle) + numberofentities * uSpace * cos(uAngle + PI/2) - (0.75 * uSpace * floor(count / 2) * cos(uAngle + PI/2)); var uz = fz + uDist * sin(uAngle) + numberofentities * uSpace * sin(uAngle + PI/2) - (0.75 * uSpace * floor(count / 2) * sin(uAngle + PI/2)); placeObject(ux, uz, civEntities[j].Template, playerid, (j % 2 - 1) * PI + uAngle); } } } \ No newline at end of file +///////////////////////////////////////////////////////////////////////////////////////// // passageMaker // // Function for creating shallow water between two given points by changing the heiight of all tiles in // the path with height less than or equal to "maxheight" to "height" // // x1,z1: Starting point of path // x2,z2: Ending point of path // width: Width of the shallow // maxheight: Maximum height that it changes // height: Height of the shallow // smooth: smooth elevation in borders // tileclass: (Optianal) - Adds those tiles to the class given // terrain: (Optional) - Changes the texture of the elevated land // ///////////////////////////////////////////////////////////////////////////////////////// function passageMaker(x1, z1, x2, z2, width, maxheight, height, smooth, tileclass, terrain) { var mapSize = g_Map.size; for (var ix = 0; ix < mapSize; ix++) { for (var iz = 0; iz < mapSize; iz++) { var a = z1-z2; var b = x2-x1; var c = (z1*(x1-x2))-(x1*(z1-z2)); var dis = abs(a*ix + b*iz + c)/sqrt(a*a + b*b); var k = (a*ix + b*iz + c)/(a*a + b*b); var my = iz-(b*k); var inline = 0; if (b == 0) { if ((iz <= Math.max(z1,z2))&&(Math.min(z1,z2))) { inline = 1; } } else { if ((my <= Math.max(z1,z2))&&(my >= Math.min(z1,z2))) { inline = 1; } } if ((dis <= width)&&(inline)) { if(g_Map.getHeight(ix, iz) <= maxheight) { if (dis >= width - smooth) { g_Map.setHeight(ix, iz, ((width - dis)*(height)+(g_Map.getHeight(ix, iz))*(dis + smooth - width))/(smooth)/2); } else { g_Map.setHeight(ix, iz, height); } if (tileclass !== undefined) { addToClass(ix, iz, tileclass); } if (terrain !== undefined) { placeTerrain(ix, iz, terrain); } } } } } } ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //rndRiver is a fuction that creates random values useful for making a jagged river. // //it works the same as sin or cos function. the only difference is that it's period is 1 instead of 2*pi //it needs the "seed" parameter to use it to make random curves that don't get broken. //seed must be created using randFloat(). or else it won't work // // f: Input: Same as angle in a sine function // seed: Random Seed: Best to implement is to use randFloat() // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// function rndRiver(f, seed) { var rndRq = seed; var rndRw = rndRq; var rndRe = 0; var rndRr = f-floor(f); var rndRa = 0; for (var rndRx=0; rndRx<=floor(f); rndRx++) { rndRw = 10*(rndRw-floor(rndRw)); } if (rndRx%2==0) { var rndRs = -1; } else { var rndRs = 1; } rndRe = (floor(rndRw))%5; if (rndRe==0) { rndRa = (rndRs)*2.3*(rndRr)*(rndRr-1)*(rndRr-0.5)*(rndRr-0.5); } else if (rndRe==1) { rndRa = (rndRs)*2.6*(rndRr)*(rndRr-1)*(rndRr-0.3)*(rndRr-0.7); } else if (rndRe==2) { rndRa = (rndRs)*22*(rndRr)*(rndRr-1)*(rndRr-0.2)*(rndRr-0.3)*(rndRr-0.3)*(rndRr-0.8); } else if (rndRe==3) { rndRa = (rndRs)*180*(rndRr)*(rndRr-1)*(rndRr-0.2)*(rndRr-0.2)*(rndRr-0.4)*(rndRr-0.6)*(rndRr-0.6)*(rndRr-0.8); } else if (rndRe==4) { rndRa = (rndRs)*2.6*(rndRr)*(rndRr-1)*(rndRr-0.5)*(rndRr-0.7); } return rndRa; } ///////////////////////////////////////////////////////////////////////////////////////// // createStartingPlayerEntities // // Creates the starting player entities // fx&fz: position of player base // playerid: id of player // civEntities: use getStartingEntities(id-1) fo this one // BUILDING_ANGlE: angle of main base building // /////////////////////////////////////////////////////////////////////////////////////////// function createStartingPlayerEntities(fx, fz, playerid, civEntities, BUILDING_ANGlE) { var uDist = 6; var uSpace = 2; placeObject(fx, fz, civEntities[0].Template, playerid, BUILDING_ANGlE); for (var j = 1; j < civEntities.length; ++j) { var uAngle = -BUILDING_ANGlE + PI * (j - 1) / 2; var count = (civEntities[j].Count !== undefined ? civEntities[j].Count : 1); for (var numberofentities = 0; numberofentities < count; numberofentities++) { var ux = fx + uDist * cos(uAngle) + numberofentities * uSpace * cos(uAngle + PI/2) - (0.75 * uSpace * floor(count / 2) * cos(uAngle + PI/2)); var uz = fz + uDist * sin(uAngle) + numberofentities * uSpace * sin(uAngle + PI/2) - (0.75 * uSpace * floor(count / 2) * sin(uAngle + PI/2)); placeObject(ux, uz, civEntities[j].Template, playerid, (j % 2 - 1) * PI + uAngle); } } } ///////////////////////////////////////////////////////////////////////////////////////// // paintTerrainBasedOnHeight // // paints the tiles which have a height between minheight and maxheight with the given terrain // minheight: minimum height of the tile // maxheight: maximum height of the tile // mode: accepts 4 values. 0 means the it will select tiles with height more than minheight and less than maxheight. // 1 means it selects tiles with height more than or equal to minheight and less than max height. 2 means more than // minheight and less than or equal to maxheight. 3 means more than or equal to minheight and less than or equal to maxheight // terrain: intended terrain texture // /////////////////////////////////////////////////////////////////////////////////////////// function paintTerrainBasedOnHeight(minheight, maxheight, mode, terrain) { var mSize = g_Map.size; for (var qx = 0; qx < mSize; qx++) { for (var qz = 0; qz < mSize; qz++) { if (mode == 0) { if ((g_Map.getHeight(qx, qz) > minheight)&&(g_Map.getHeight(qx, qz) < maxheight)) { placeTerrain(qx, qz, terrain); } } else if (mode == 1) { if ((g_Map.getHeight(qx, qz) >= minheight)&&(g_Map.getHeight(qx, qz) < maxheight)) { placeTerrain(qx, qz, terrain); } } else if (mode == 2) { if ((g_Map.getHeight(qx, qz) > minheight)&&(g_Map.getHeight(qx, qz) <= maxheight)) { placeTerrain(qx, qz, terrain); } } else if (mode == 3) { if ((g_Map.getHeight(qx, qz) >= minheight)&&(g_Map.getHeight(qx, qz) <= maxheight)) { placeTerrain(qx, qz, terrain); } } } } } ///////////////////////////////////////////////////////////////////////////////////////// // paintTileClassBasedOnHeight // // paints the tiles which have a height between minheight and maxheight with the given tile class // minheight: minimum height of the tile // maxheight: maximum height of the tile // mode: accepts 4 values. 0 means the it will select tiles with height more than minheight and less than maxheight. // 1 means it selects tiles with height more than or equal to minheight and less than max height. 2 means more than // minheight and less than or equal to maxheight. 3 means more than or equal to minheight and less than or equal to maxheight // tileclass: intended tile class // /////////////////////////////////////////////////////////////////////////////////////////// function paintTileClassBasedOnHeight(minheight, maxheight, mode, tileclass) { var mSize = g_Map.size; for (var qx = 0; qx < mSize; qx++) { for (var qz = 0; qz < mSize; qz++) { if (mode == 0) { if ((g_Map.getHeight(qx, qz) > minheight)&&(g_Map.getHeight(qx, qz) < maxheight)) { addToClass(qx, qz, tileclass); } } else if (mode == 1) { if ((g_Map.getHeight(qx, qz) >= minheight)&&(g_Map.getHeight(qx, qz) < maxheight)) { addToClass(qx, qz, tileclass); } } else if (mode == 2) { if ((g_Map.getHeight(qx, qz) > minheight)&&(g_Map.getHeight(qx, qz) <= maxheight)) { addToClass(qx, qz, tileclass); } } else if (mode == 3) { if ((g_Map.getHeight(qx, qz) >= minheight)&&(g_Map.getHeight(qx, qz) <= maxheight)) { addToClass(qx, qz, tileclass); } } } } } \ No newline at end of file diff --git a/binaries/data/mods/public/maps/random/rmgen/painter.js b/binaries/data/mods/public/maps/random/rmgen/painter.js index 12f0717ab3..564f66a754 100644 --- a/binaries/data/mods/public/maps/random/rmgen/painter.js +++ b/binaries/data/mods/public/maps/random/rmgen/painter.js @@ -410,3 +410,27 @@ TileClassPainter.prototype.paint = function(area) this.tileClass.add(pt.x, pt.z); } }; + +///////////////////////////////////////////////////////////////////////////// +// TileClassUnPainter +// +// Class for unpainting tileClasses over an area +// +// tileClass: TileClass object +// +///////////////////////////////////////////////////////////////////////////// + +function TileClassUnPainter(tileClass) +{ + this.tileClass = tileClass; +} + +TileClassUnPainter.prototype.paint = function(area) +{ + var length = area.points.length; + for (var i=0; i < length; i++) + { + var pt = area.points[i]; + this.tileClass.remove(pt.x, pt.z); + } +}; diff --git a/binaries/data/mods/public/maps/random/rmgen/randombiome.js b/binaries/data/mods/public/maps/random/rmgen/randombiome.js index f4a59c638f..2ed0219c9c 100644 --- a/binaries/data/mods/public/maps/random/rmgen/randombiome.js +++ b/binaries/data/mods/public/maps/random/rmgen/randombiome.js @@ -1 +1 @@ -///////////////////////////////////////////////////////////////////////////////////////////// // definitions ///////////////////////////////////////////////////////////////////////////////////////////// var biomeID = 1; var rbt1 = ["temp_grass_long_b"]; var rbt2 = "temp_forestfloor_pine"; var rbt3 = "temp_plants_bog"; var rbt4 = ["temp_cliff_a", "temp_cliff_b"]; var rbt5 = "temp_grass_d"; var rbt6 = "temp_grass_c"; var rbt7 = "temp_grass_clovers_2"; var rbt8 = ["temp_dirt_gravel", "temp_dirt_gravel_b"]; var rbt9 = ["temp_dirt_gravel", "temp_dirt_gravel_b"]; var rbt10 = "temp_road"; var rbt11 = "temp_road_overgrown"; var rbt12 = "temp_grass_plants"; var rbt13 = "temp_mud_plants"; var rbt14 = "sand_grass_25"; var rbt15 = "medit_sand_wet"; // gaia entities var rbe1 = "gaia/flora_tree_oak"; var rbe2 = "gaia/flora_tree_oak_large"; var rbe3 = "gaia/flora_tree_apple"; var rbe4 = "gaia/flora_tree_pine"; var rbe5 = "gaia/flora_tree_aleppo_pine"; var rbe6 = "gaia/flora_bush_berry"; var rbe7 = "gaia/fauna_chicken"; var rbe8 = "gaia/fauna_deer"; var rbe9 = "gaia/fauna_fish"; var rbe10 = "gaia/fauna_sheep"; var rbe11 = "gaia/geology_stonemine_medit_quarry"; var rbe12 = "gaia/geology_stone_mediterranean"; var rbe13 = "gaia/geology_metal_mediterranean_slabs"; // decorative props var rba1 = "actor|props/flora/grass_soft_large_tall.xml"; var rba2 = "actor|props/flora/grass_soft_large.xml"; var rba3 = "actor|props/flora/reeds_pond_lush_a.xml"; var rba4 = "actor|props/flora/pond_lillies_large.xml"; var rba5 = "actor|geology/stone_granite_large.xml"; var rba6 = "actor|geology/stone_granite_med.xml"; var rba7 = "actor|props/flora/bush_medit_me.xml"; var rba8 = "actor|props/flora/bush_medit_sm.xml"; ///////////////////////////////////////////////////////////////////////////////////////////// // randomizeBiome: randomizes the biomeID and returns the value ///////////////////////////////////////////////////////////////////////////////////////////// function randomizeBiome() { biomeID = randInt(1,7); if (biomeID == 1){ rbt1 = ["temp_grass_long_b"]; rbt2 = "temp_forestfloor_pine"; rbt3 = "temp_plants_bog"; rbt4 = ["temp_cliff_a", "temp_cliff_b"]; rbt5 = "temp_grass_d"; rbt6 = "temp_grass_c"; rbt7 = "temp_grass_clovers_2"; rbt8 = ["temp_dirt_gravel", "temp_dirt_gravel_b"]; rbt9 = ["temp_dirt_gravel", "temp_dirt_gravel_b"]; rbt10 = "temp_road"; rbt11 = "temp_road_overgrown"; rbt12 = "temp_grass_plants"; rbt13 = "temp_mud_plants"; rbt14 = "sand_grass_25"; rbt15 = "medit_sand_wet"; // gaia entities rbe1 = "gaia/flora_tree_oak"; rbe2 = "gaia/flora_tree_oak_large"; rbe3 = "gaia/flora_tree_apple"; rbe4 = "gaia/flora_tree_pine"; rbe5 = "gaia/flora_tree_aleppo_pine"; rbe6 = "gaia/flora_bush_berry"; rbe7 = "gaia/fauna_chicken"; rbe8 = "gaia/fauna_deer"; rbe9 = "gaia/fauna_fish"; rbe10 = "gaia/fauna_sheep"; rbe11 = "gaia/geology_stonemine_medit_quarry"; rbe12 = "gaia/geology_stone_mediterranean"; rbe13 = "gaia/geology_metal_mediterranean_slabs"; // decorative props rba1 = "actor|props/flora/grass_soft_large_tall.xml"; rba2 = "actor|props/flora/grass_soft_large.xml"; rba3 = "actor|props/flora/reeds_pond_lush_a.xml"; rba4 = "actor|props/flora/water_lillies.xml"; rba5 = "actor|geology/stone_granite_large.xml"; rba6 = "actor|geology/stone_granite_med.xml"; rba7 = "actor|props/flora/bush_medit_me.xml"; rba8 = "actor|props/flora/bush_medit_sm.xml"; } //snowy else if (biomeID == 2) { setSunColour(0.550, 0.601, 0.644); // a little darker rbt1 = ["polar_snow_b", "snow grass 75", "snow rocks", "snow forest"]; rbt2 = "polar_tundra_snow"; rbt3 = "polar_tundra_snow"; rbt4 = ["polar_cliff_a", "polar_cliff_b"]; rbt5 = "snow grass 2"; rbt6 = "polar_snow_a"; rbt7 = "polar_ice_snow"; rbt8 = ["polar_snow_rocks", "polar_cliff_snow"]; rbt9 = ["polar_ice_b", "polar_ice_c"]; rbt10 = "new_alpine_citytile"; rbt11 = "polar_ice_cracked"; rbt12 = "snow grass 2"; rbt13 = "polar_ice"; rbt14 = "alpine_shore_rocks_icy"; rbt15 = "alpine_shore_rocks"; // gaia entities rbe1 = "gaia/flora_tree_pine_w"; rbe2 = "gaia/flora_tree_pine_w"; rbe3 = "gaia/flora_tree_pine_w"; rbe4 = "gaia/flora_tree_pine_w"; rbe5 = "gaia/flora_tree_pine"; rbe6 = "gaia/flora_bush_berry"; rbe7 = "gaia/fauna_chicken"; rbe8 = "gaia/fauna_muskox"; rbe9 = "gaia/fauna_fish_tuna"; rbe10 = "gaia/fauna_walrus"; rbe11 = "gaia/geology_stonemine_alpine_quarry"; rbe12 = "gaia/geology_stone_alpine_a"; rbe13 = "gaia/geology_metal_alpine_slabs"; // decorative props rba1 = "actor|props/flora/grass_soft_dry_small_tall.xml"; rba2 = "actor|props/flora/grass_soft_dry_large.xml"; rba3 = "actor|props/flora/reeds_pond_dry.xml"; rba4 = "actor|geology/stone_granite_large.xml"; rba5 = "actor|geology/stone_granite_large.xml"; rba6 = "actor|geology/stone_granite_med.xml"; rba7 = "actor|props/flora/bush_desert_dry_a.xml"; rba8 = "actor|props/flora/bush_desert_dry_a.xml"; } //desert else if (biomeID == 3) { setSunColour(0.733, 0.746, 0.574); rbt1 = ["desert_dirt_rough", "desert_dirt_rough_2", "desert_sand_dunes_50", "desert_sand_smooth"]; rbt2 = "forestfloor_dirty"; rbt3 = "desert_forestfloor_palms"; rbt4 = ["desert_cliff_1", "desert_cliff_2", "desert_cliff_3", "desert_cliff_4", "desert_cliff_5"]; rbt5 = ["desert_dirt_persia_1", "desert_dirt_persia_2"]; rbt6 = "dirta"; rbt7 = "medit_dirt_dry"; rbt8 = ["desert_dirt_rocks_1", "desert_dirt_rocks_2", "desert_dirt_rocks_3"]; rbt9 = ["desert_lakebed_dry", "desert_lakebed_dry_b"]; rbt10 = "desert_city_tile"; rbt11 = "desert_city_tile"; rbt12 = "desert_dirt_rough"; rbt13 = "desert_shore_stones"; rbt14 = "dirta"; rbt15 = "desert_sand_wet"; // gaia entities rbe1 = "gaia/flora_tree_cretan_date_palm_short"; rbe2 = "gaia/flora_tree_cretan_date_palm_tall"; rbe3 = "gaia/flora_tree_fig"; rbe4 = "gaia/flora_tree_dead"; rbe5 = "gaia/flora_tree_date_palm"; rbe6 = "gaia/flora_bush_grapes"; rbe7 = "gaia/fauna_chicken"; rbe8 = "gaia/fauna_camel"; rbe9 = "gaia/fauna_fish"; rbe10 = "gaia/fauna_gazelle"; rbe11 = "gaia/geology_stonemine_desert_quarry"; rbe12 = "gaia/geology_stone_desert_small"; rbe13 = "gaia/geology_metal_desert_slabs"; // decorative props rba1 = "actor|props/flora/grass_soft_dry_small_tall.xml"; rba2 = "actor|props/flora/grass_soft_dry_large.xml"; rba3 = "actor|props/flora/reeds_pond_lush_a.xml"; rba4 = "actor|props/flora/reeds_pond_lush_b.xml"; rba5 = "actor|geology/stone_desert_med.xml"; rba6 = "actor|geology/stone_desert_med.xml"; rba7 = "actor|props/flora/bush_desert_dry_a.xml"; rba8 = "actor|props/flora/bush_desert_dry_a.xml"; } //alpine else if (biomeID == 4) { rbt1 = ["alpine_dirt_grass_50"]; rbt2 = "alpine_forrestfloor"; rbt3 = "alpine_forrestfloor"; rbt4 = ["alpine_cliff_a", "alpine_cliff_b", "alpine_cliff_c"]; rbt5 = "alpine_grass_rocky"; rbt6 = ["alpine_grass_snow_50", "alpine_dirt_snow"]; rbt7 = ["alpine_snow_a", "alpine_snow_b"]; rbt8 = "alpine_cliff_snow"; rbt9 = ["alpine_dirt", "alpine_grass_d"]; rbt10 = "new_alpine_citytile"; rbt11 = "new_alpine_citytile"; rbt12 = "new_alpine_grass_a"; rbt13 = "alpine_shore_rocks"; rbt14 = "alpine_shore_rocks_grass_50"; rbt15 = "alpine_shore_rocks"; // gaia entities rbe1 = "gaia/flora_tree_pine"; rbe2 = "gaia/flora_tree_pine"; rbe3 = "gaia/flora_tree_pine"; rbe4 = "gaia/flora_tree_pine"; rbe5 = "gaia/flora_tree_pine"; rbe6 = "gaia/flora_bush_berry"; rbe7 = "gaia/fauna_chicken"; rbe8 = "gaia/fauna_goat"; rbe9 = "gaia/fauna_fish_tuna"; rbe10 = "gaia/fauna_deer"; rbe11 = "gaia/geology_stonemine_alpine_quarry"; rbe12 = "gaia/geology_stone_alpine_a"; rbe13 = "gaia/geology_metal_alpine_slabs"; // decorative props rba1 = "actor|props/flora/grass_soft_dry_small_tall.xml"; rba2 = "actor|props/flora/grass_soft_dry_large.xml"; rba3 = "actor|props/flora/reeds_pond_dry.xml"; rba4 = "actor|geology/stone_granite_large.xml"; rba5 = "actor|geology/stone_granite_large.xml"; rba6 = "actor|geology/stone_granite_med.xml"; rba7 = "actor|props/flora/bush_desert_dry_a.xml"; rba8 = "actor|props/flora/bush_desert_dry_a.xml"; } //medit else if (biomeID == 5){ rbt1 = ["medit_grass_field_a", "medit_grass_field_b"]; rbt2 = "medit_plants_dirt"; rbt3 = "medit_grass_shrubs"; rbt4 = ["medit_cliff_grass", "medit_cliff_greek", "medit_cliff_greek_2", "medit_cliff_aegean", "medit_cliff_italia", "medit_cliff_italia_grass"]; rbt5 = "medit_grass_field_b"; rbt6 = "medit_grass_field_brown"; rbt7 = "medit_grass_field_dry"; rbt8 = ["medit_rocks_grass_shrubs", "medit_rocks_shrubs"]; rbt9 = ["medit_dirt", "medit_dirt_b"]; rbt10 = "medit_city_tile"; rbt11 = "medit_city_tile"; rbt12 = "medit_grass_wild"; rbt13 = "medit_sand"; rbt14 = "sand_grass_25"; rbt15 = "medit_sand_wet"; // gaia entities rbe1 = "gaia/flora_tree_cretan_date_palm_short"; rbe2 = "gaia/flora_tree_medit_fan_palm"; rbe3 = "gaia/flora_tree_apple"; rbe4 = "gaia/flora_tree_cypress"; rbe5 = "gaia/flora_tree_aleppo_pine"; rbe6 = "gaia/flora_bush_berry"; rbe7 = "gaia/fauna_chicken"; rbe8 = "gaia/fauna_deer"; rbe9 = "gaia/fauna_fish"; rbe10 = "gaia/fauna_sheep"; rbe11 = "gaia/geology_stonemine_medit_quarry"; rbe12 = "gaia/geology_stone_mediterranean"; rbe13 = "gaia/geology_metal_mediterranean_slabs"; // decorative props rba1 = "actor|props/flora/grass_soft_large_tall.xml"; rba2 = "actor|props/flora/grass_soft_large.xml"; rba3 = "actor|props/flora/reeds_pond_lush_b.xml"; rba4 = "actor|props/flora/water_lillies.xml"; rba5 = "actor|geology/stone_granite_large.xml"; rba6 = "actor|geology/stone_granite_med.xml"; rba7 = "actor|props/flora/bush_medit_me.xml"; rba8 = "actor|props/flora/bush_medit_sm.xml"; } //savanah else if (biomeID == 6) { rbt1 = ["savanna_grass_a", "savanna_grass_b"]; rbt2 = "savanna_forestfloor_a"; rbt3 = "savanna_forestfloor_b"; rbt4 = ["savanna_cliff_a", "savanna_cliff_b"]; rbt5 = "savanna_shrubs_a"; rbt6 = "savanna_dirt_rocks_b"; rbt7 = "dirt_brown_e"; rbt8 = ["savanna_grass_a", "savanna_grass_b"]; rbt9 = ["savanna_dirt_rocks_b", "dirt_brown_e"]; rbt10 = "savanna_tile_a"; rbt11 = "savanna_tile_a"; rbt12 = "savanna_grass_a"; rbt13 = "savanna_riparian"; rbt14 = "savanna_riparian_bank"; rbt15 = "savanna_riparian_wet"; // gaia entities rbe1 = "gaia/flora_tree_baobab"; rbe2 = "gaia/flora_tree_baobab"; rbe3 = "gaia/flora_tree_baobab"; rbe4 = "gaia/flora_tree_baobab"; rbe5 = "gaia/flora_tree_baobab"; rbe6 = "gaia/flora_bush_grapes"; rbe7 = "gaia/fauna_chicken"; var rts = randInt(1,4); if (rts==1){ rbe8 = "gaia/fauna_wildebeest"; } else if (rts==2) { rbe8 = "gaia/fauna_zebra"; } else if (rts==3) { rbe8 = "gaia/fauna_giraffe"; } else if (rts==4) { rbe8 = "gaia/fauna_elephant_african_bush"; } rbe9 = "gaia/fauna_fish"; rbe10 = "gaia/fauna_gazelle"; rbe11 = "gaia/geology_stonemine_desert_quarry"; rbe12 = "gaia/geology_stone_savanna_small"; rbe13 = "gaia/geology_metal_savanna_slabs"; // decorative props rba1 = "actor|props/flora/grass_savanna.xml"; rba2 = "actor|props/flora/grass_medit_field.xml"; rba3 = "actor|props/flora/reeds_pond_lush_a.xml"; rba4 = "actor|props/flora/reeds_pond_lush_b.xml"; rba5 = "actor|geology/stone_savanna_med.xml"; rba6 = "actor|geology/stone_savanna_med.xml"; rba7 = "actor|props/flora/bush_desert_dry_a.xml"; rba8 = "actor|props/flora/bush_dry_a.xml"; } else if (biomeID == 7){ rbt1 = ["tropic_grass_c", "tropic_grass_c", "tropic_grass_c", "tropic_grass_c", "tropic_grass_plants", "tropic_plants", "tropic_plants_b"]; rbt2 = "tropic_plants_c"; rbt3 = "tropic_plants_c"; rbt4 = ["tropic_cliff_a", "tropic_cliff_a", "tropic_cliff_a", "tropic_cliff_a_plants"]; rbt5 = "tropic_grass_c"; rbt6 = "tropic_grass_plants"; rbt7 = "tropic_plants"; rbt8 = ["tropic_cliff_grass"]; rbt9 = ["tropic_dirt_a", "tropic_dirt_a_plants"]; rbt10 = "tropic_citytile_a"; rbt11 = "tropic_citytile_plants"; rbt12 = "tropic_plants_b"; rbt13 = "temp_mud_plants"; rbt14 = "tropic_beach_dry"; rbt15 = "tropic_beach_wet"; // gaia entities rbe1 = "gaia/flora_tree_poplar"; rbe2 = "gaia/flora_tree_poplar"; rbe3 = "gaia/flora_tree_poplar"; rbe4 = "gaia/flora_tree_cretan_date_palm_short"; rbe5 = "gaia/flora_tree_cretan_date_palm_tall"; rbe6 = "gaia/flora_bush_berry"; rbe7 = "gaia/fauna_chicken"; rbe8 = "gaia/fauna_deer"; rbe9 = "gaia/fauna_fish"; rbe10 = "gaia/fauna_tiger"; rbe11 = "gaia/geology_stonemine_tropic_quarry"; rbe12 = "gaia/geology_stone_tropic_a"; rbe13 = "gaia/geology_metal_tropic_slabs"; // decorative props rba1 = "actor|props/flora/plant_tropic_a.xml"; rba2 = "actor|props/flora/plant_lg.xml"; rba3 = "actor|props/flora/reeds_pond_lush_b.xml"; rba4 = "actor|props/flora/water_lillies.xml"; rba5 = "actor|geology/stone_granite_large.xml"; rba6 = "actor|geology/stone_granite_med.xml"; rba7 = "actor|props/flora/plant_tropic_large.xml"; rba8 = "actor|props/flora/plant_tropic_large.xml"; } return biomeID; } ///////////////////////////////////////////////////////////////////////////////////////////// // These functions return the values needed for a randomized biome ///////////////////////////////////////////////////////////////////////////////////////////// function rBiomeT1() { return rbt1; } function rBiomeT2() { return rbt2; } function rBiomeT3() { return rbt3; } function rBiomeT4() { return rbt4; } function rBiomeT5() { return rbt5; } function rBiomeT6() { return rbt6; } function rBiomeT7() { return rbt7; } function rBiomeT8() { return rbt8; } function rBiomeT9() { return rbt9; } function rBiomeT10() { return rbt10; } function rBiomeT11() { return rbt11; } function rBiomeT12() { return rbt12; } function rBiomeT13() { return rbt13; } function rBiomeT14() { return rbt14; } function rBiomeT15() { return rbt15; } function rBiomeE1() { return rbe1; } function rBiomeE2() { return rbe2; } function rBiomeE3() { return rbe3; } function rBiomeE4() { return rbe4; } function rBiomeE5() { return rbe5; } function rBiomeE6() { return rbe6; } function rBiomeE7() { return rbe7; } function rBiomeE8() { return rbe8; } function rBiomeE9() { return rbe9; } function rBiomeE10() { return rbe10; } function rBiomeE11() { return rbe11; } function rBiomeE12() { return rbe12; } function rBiomeE13() { return rbe13; } function rBiomeA1() { return rba1; } function rBiomeA2() { return rba2; } function rBiomeA3() { return rba3; } function rBiomeA4() { return rba4; } function rBiomeA5() { return rba5; } function rBiomeA6() { return rba6; } function rBiomeA7() { return rba7; } function rBiomeA8() { return rba8; } \ No newline at end of file +///////////////////////////////////////////////////////////////////////////////////////////// // definitions ///////////////////////////////////////////////////////////////////////////////////////////// var biomeID = 1; var rbt1 = ["temp_grass_long_b"]; var rbt2 = "temp_forestfloor_pine"; var rbt3 = "temp_plants_bog"; var rbt4 = ["temp_cliff_a", "temp_cliff_b"]; var rbt5 = "temp_grass_d"; var rbt6 = "temp_grass_c"; var rbt7 = "temp_grass_clovers_2"; var rbt8 = ["temp_dirt_gravel", "temp_dirt_gravel_b"]; var rbt9 = ["temp_dirt_gravel", "temp_dirt_gravel_b"]; var rbt10 = "temp_road"; var rbt11 = "temp_road_overgrown"; var rbt12 = "temp_grass_plants"; var rbt13 = "temp_mud_plants"; var rbt14 = "sand_grass_25"; var rbt15 = "medit_sand_wet"; // gaia entities var rbe1 = "gaia/flora_tree_oak"; var rbe2 = "gaia/flora_tree_oak_large"; var rbe3 = "gaia/flora_tree_apple"; var rbe4 = "gaia/flora_tree_pine"; var rbe5 = "gaia/flora_tree_aleppo_pine"; var rbe6 = "gaia/flora_bush_berry"; var rbe7 = "gaia/fauna_chicken"; var rbe8 = "gaia/fauna_deer"; var rbe9 = "gaia/fauna_fish"; var rbe10 = "gaia/fauna_sheep"; var rbe11 = "gaia/geology_stonemine_medit_quarry"; var rbe12 = "gaia/geology_stone_mediterranean"; var rbe13 = "gaia/geology_metal_mediterranean_slabs"; // decorative props var rba1 = "actor|props/flora/grass_soft_large_tall.xml"; var rba2 = "actor|props/flora/grass_soft_large.xml"; var rba3 = "actor|props/flora/reeds_pond_lush_a.xml"; var rba4 = "actor|props/flora/pond_lillies_large.xml"; var rba5 = "actor|geology/stone_granite_large.xml"; var rba6 = "actor|geology/stone_granite_med.xml"; var rba7 = "actor|props/flora/bush_medit_me.xml"; var rba8 = "actor|props/flora/bush_medit_sm.xml"; var rba9 = "actor|flora/trees/oak.xml"; ///////////////////////////////////////////////////////////////////////////////////////////// // randomizeBiome: randomizes the biomeID and returns the value ///////////////////////////////////////////////////////////////////////////////////////////// function randomizeBiome() { biomeID = randInt(1,7); //temperate if (biomeID == 1){ rbt1 = ["temp_grass_long_b"]; rbt2 = "temp_forestfloor_pine"; rbt3 = "temp_plants_bog"; rbt4 = ["temp_cliff_a", "temp_cliff_b"]; rbt5 = "temp_grass_d"; rbt6 = "temp_grass_c"; rbt7 = "temp_grass_clovers_2"; rbt8 = ["temp_dirt_gravel", "temp_dirt_gravel_b"]; rbt9 = ["temp_dirt_gravel", "temp_dirt_gravel_b"]; rbt10 = "temp_road"; rbt11 = "temp_road_overgrown"; rbt12 = "temp_grass_plants"; rbt13 = "temp_mud_plants"; rbt14 = "sand_grass_25"; rbt15 = "medit_sand_wet"; // gaia entities rbe1 = "gaia/flora_tree_oak"; rbe2 = "gaia/flora_tree_oak_large"; rbe3 = "gaia/flora_tree_apple"; rbe4 = "gaia/flora_tree_pine"; rbe5 = "gaia/flora_tree_aleppo_pine"; rbe6 = "gaia/flora_bush_berry"; rbe7 = "gaia/fauna_chicken"; rbe8 = "gaia/fauna_deer"; rbe9 = "gaia/fauna_fish"; rbe10 = "gaia/fauna_sheep"; rbe11 = "gaia/geology_stonemine_medit_quarry"; rbe12 = "gaia/geology_stone_mediterranean"; rbe13 = "gaia/geology_metal_mediterranean_slabs"; // decorative props rba1 = "actor|props/flora/grass_soft_large_tall.xml"; rba2 = "actor|props/flora/grass_soft_large.xml"; rba3 = "actor|props/flora/reeds_pond_lush_a.xml"; rba4 = "actor|props/flora/water_lillies.xml"; rba5 = "actor|geology/stone_granite_large.xml"; rba6 = "actor|geology/stone_granite_med.xml"; rba7 = "actor|props/flora/bush_medit_me.xml"; rba8 = "actor|props/flora/bush_medit_sm.xml"; rba9 = "actor|flora/trees/oak.xml"; } //snowy else if (biomeID == 2) { setSunColour(0.550, 0.601, 0.644); // a little darker rbt1 = ["polar_snow_b", "snow grass 75", "snow rocks", "snow forest"]; rbt2 = "polar_tundra_snow"; rbt3 = "polar_tundra_snow"; rbt4 = ["polar_cliff_a", "polar_cliff_b"]; rbt5 = "snow grass 2"; rbt6 = "polar_snow_a"; rbt7 = "polar_ice_snow"; rbt8 = ["polar_snow_rocks", "polar_cliff_snow"]; rbt9 = ["polar_ice_b", "polar_ice_c"]; rbt10 = "new_alpine_citytile"; rbt11 = "polar_ice_cracked"; rbt12 = "snow grass 2"; rbt13 = "polar_ice"; rbt14 = "alpine_shore_rocks_icy"; rbt15 = "alpine_shore_rocks"; // gaia entities rbe1 = "gaia/flora_tree_pine_w"; rbe2 = "gaia/flora_tree_pine_w"; rbe3 = "gaia/flora_tree_pine_w"; rbe4 = "gaia/flora_tree_pine_w"; rbe5 = "gaia/flora_tree_pine"; rbe6 = "gaia/flora_bush_berry"; rbe7 = "gaia/fauna_chicken"; rbe8 = "gaia/fauna_muskox"; rbe9 = "gaia/fauna_fish_tuna"; rbe10 = "gaia/fauna_walrus"; rbe11 = "gaia/geology_stonemine_alpine_quarry"; rbe12 = "gaia/geology_stone_alpine_a"; rbe13 = "gaia/geology_metal_alpine_slabs"; // decorative props rba1 = "actor|props/flora/grass_soft_dry_small_tall.xml"; rba2 = "actor|props/flora/grass_soft_dry_large.xml"; rba3 = "actor|props/flora/reeds_pond_dry.xml"; rba4 = "actor|geology/stone_granite_large.xml"; rba5 = "actor|geology/stone_granite_large.xml"; rba6 = "actor|geology/stone_granite_med.xml"; rba7 = "actor|props/flora/bush_desert_dry_a.xml"; rba8 = "actor|props/flora/bush_desert_dry_a.xml"; rba9 = "actor|flora/trees/pine_w.xml"; } //desert else if (biomeID == 3) { setSunColour(0.733, 0.746, 0.574); rbt1 = ["desert_dirt_rough", "desert_dirt_rough_2", "desert_sand_dunes_50", "desert_sand_smooth"]; rbt2 = "forestfloor_dirty"; rbt3 = "desert_forestfloor_palms"; rbt4 = ["desert_cliff_1", "desert_cliff_2", "desert_cliff_3", "desert_cliff_4", "desert_cliff_5"]; rbt5 = ["desert_dirt_persia_1", "desert_dirt_persia_2"]; rbt6 = "dirta"; rbt7 = "medit_dirt_dry"; rbt8 = ["desert_dirt_rocks_1", "desert_dirt_rocks_2", "desert_dirt_rocks_3"]; rbt9 = ["desert_lakebed_dry", "desert_lakebed_dry_b"]; rbt10 = "desert_city_tile"; rbt11 = "desert_city_tile"; rbt12 = "desert_dirt_rough"; rbt13 = "desert_shore_stones"; rbt14 = "dirta"; rbt15 = "desert_sand_wet"; // gaia entities rbe1 = "gaia/flora_tree_cretan_date_palm_short"; rbe2 = "gaia/flora_tree_cretan_date_palm_tall"; rbe3 = "gaia/flora_tree_fig"; rbe4 = "gaia/flora_tree_dead"; rbe5 = "gaia/flora_tree_date_palm"; rbe6 = "gaia/flora_bush_grapes"; rbe7 = "gaia/fauna_chicken"; rbe8 = "gaia/fauna_camel"; rbe9 = "gaia/fauna_fish"; rbe10 = "gaia/fauna_gazelle"; rbe11 = "gaia/geology_stonemine_desert_quarry"; rbe12 = "gaia/geology_stone_desert_small"; rbe13 = "gaia/geology_metal_desert_slabs"; // decorative props rba1 = "actor|props/flora/grass_soft_dry_small_tall.xml"; rba2 = "actor|props/flora/grass_soft_dry_large.xml"; rba3 = "actor|props/flora/reeds_pond_lush_a.xml"; rba4 = "actor|props/flora/reeds_pond_lush_b.xml"; rba5 = "actor|geology/stone_desert_med.xml"; rba6 = "actor|geology/stone_desert_med.xml"; rba7 = "actor|props/flora/bush_desert_dry_a.xml"; rba8 = "actor|props/flora/bush_desert_dry_a.xml"; rba9 = "actor|flora/trees/palm_date.xml"; } //alpine else if (biomeID == 4) { rbt1 = ["alpine_dirt_grass_50"]; rbt2 = "alpine_forrestfloor"; rbt3 = "alpine_forrestfloor"; rbt4 = ["alpine_cliff_a", "alpine_cliff_b", "alpine_cliff_c"]; rbt5 = "alpine_grass_rocky"; rbt6 = ["alpine_grass_snow_50", "alpine_dirt_snow"]; rbt7 = ["alpine_snow_a", "alpine_snow_b"]; rbt8 = "alpine_cliff_snow"; rbt9 = ["alpine_dirt", "alpine_grass_d"]; rbt10 = "new_alpine_citytile"; rbt11 = "new_alpine_citytile"; rbt12 = "new_alpine_grass_a"; rbt13 = "alpine_shore_rocks"; rbt14 = "alpine_shore_rocks_grass_50"; rbt15 = "alpine_shore_rocks"; // gaia entities rbe1 = "gaia/flora_tree_pine"; rbe2 = "gaia/flora_tree_pine"; rbe3 = "gaia/flora_tree_pine"; rbe4 = "gaia/flora_tree_pine"; rbe5 = "gaia/flora_tree_pine"; rbe6 = "gaia/flora_bush_berry"; rbe7 = "gaia/fauna_chicken"; rbe8 = "gaia/fauna_goat"; rbe9 = "gaia/fauna_fish_tuna"; rbe10 = "gaia/fauna_deer"; rbe11 = "gaia/geology_stonemine_alpine_quarry"; rbe12 = "gaia/geology_stone_alpine_a"; rbe13 = "gaia/geology_metal_alpine_slabs"; // decorative props rba1 = "actor|props/flora/grass_soft_dry_small_tall.xml"; rba2 = "actor|props/flora/grass_soft_dry_large.xml"; rba3 = "actor|props/flora/reeds_pond_dry.xml"; rba4 = "actor|geology/stone_granite_large.xml"; rba5 = "actor|geology/stone_granite_large.xml"; rba6 = "actor|geology/stone_granite_med.xml"; rba7 = "actor|props/flora/bush_desert_dry_a.xml"; rba8 = "actor|props/flora/bush_desert_dry_a.xml"; rba9 = "actor|flora/trees/pine.xml"; } //medit else if (biomeID == 5){ rbt1 = ["medit_grass_field_a", "medit_grass_field_b"]; rbt2 = "medit_plants_dirt"; rbt3 = "medit_grass_shrubs"; rbt4 = ["medit_cliff_grass", "medit_cliff_greek", "medit_cliff_greek_2", "medit_cliff_aegean", "medit_cliff_italia", "medit_cliff_italia_grass"]; rbt5 = "medit_grass_field_b"; rbt6 = "medit_grass_field_brown"; rbt7 = "medit_grass_field_dry"; rbt8 = ["medit_rocks_grass_shrubs", "medit_rocks_shrubs"]; rbt9 = ["medit_dirt", "medit_dirt_b"]; rbt10 = "medit_city_tile"; rbt11 = "medit_city_tile"; rbt12 = "medit_grass_wild"; rbt13 = "medit_sand"; rbt14 = "sand_grass_25"; rbt15 = "medit_sand_wet"; // gaia entities rbe1 = "gaia/flora_tree_cretan_date_palm_short"; rbe2 = "gaia/flora_tree_medit_fan_palm"; rbe3 = "gaia/flora_tree_apple"; rbe4 = "gaia/flora_tree_cypress"; rbe5 = "gaia/flora_tree_aleppo_pine"; rbe6 = "gaia/flora_bush_berry"; rbe7 = "gaia/fauna_chicken"; rbe8 = "gaia/fauna_deer"; rbe9 = "gaia/fauna_fish"; rbe10 = "gaia/fauna_sheep"; rbe11 = "gaia/geology_stonemine_medit_quarry"; rbe12 = "gaia/geology_stone_mediterranean"; rbe13 = "gaia/geology_metal_mediterranean_slabs"; // decorative props rba1 = "actor|props/flora/grass_soft_large_tall.xml"; rba2 = "actor|props/flora/grass_soft_large.xml"; rba3 = "actor|props/flora/reeds_pond_lush_b.xml"; rba4 = "actor|props/flora/water_lillies.xml"; rba5 = "actor|geology/stone_granite_large.xml"; rba6 = "actor|geology/stone_granite_med.xml"; rba7 = "actor|props/flora/bush_medit_me.xml"; rba8 = "actor|props/flora/bush_medit_sm.xml"; rba9 = "actor|flora/trees/palm_cretan_date.xml"; } //savanah else if (biomeID == 6) { rbt1 = ["savanna_grass_a", "savanna_grass_b"]; rbt2 = "savanna_forestfloor_a"; rbt3 = "savanna_forestfloor_b"; rbt4 = ["savanna_cliff_a", "savanna_cliff_b"]; rbt5 = "savanna_shrubs_a"; rbt6 = "savanna_dirt_rocks_b"; rbt7 = "dirt_brown_e"; rbt8 = ["savanna_grass_a", "savanna_grass_b"]; rbt9 = ["savanna_dirt_rocks_b", "dirt_brown_e"]; rbt10 = "savanna_tile_a"; rbt11 = "savanna_tile_a"; rbt12 = "savanna_grass_a"; rbt13 = "savanna_riparian"; rbt14 = "savanna_riparian_bank"; rbt15 = "savanna_riparian_wet"; // gaia entities rbe1 = "gaia/flora_tree_baobab"; rbe2 = "gaia/flora_tree_baobab"; rbe3 = "gaia/flora_tree_baobab"; rbe4 = "gaia/flora_tree_baobab"; rbe5 = "gaia/flora_tree_baobab"; rbe6 = "gaia/flora_bush_grapes"; rbe7 = "gaia/fauna_chicken"; var rts = randInt(1,4); if (rts==1){ rbe8 = "gaia/fauna_wildebeest"; } else if (rts==2) { rbe8 = "gaia/fauna_zebra"; } else if (rts==3) { rbe8 = "gaia/fauna_giraffe"; } else if (rts==4) { rbe8 = "gaia/fauna_elephant_african_bush"; } rbe9 = "gaia/fauna_fish"; rbe10 = "gaia/fauna_gazelle"; rbe11 = "gaia/geology_stonemine_desert_quarry"; rbe12 = "gaia/geology_stone_savanna_small"; rbe13 = "gaia/geology_metal_savanna_slabs"; // decorative props rba1 = "actor|props/flora/grass_savanna.xml"; rba2 = "actor|props/flora/grass_medit_field.xml"; rba3 = "actor|props/flora/reeds_pond_lush_a.xml"; rba4 = "actor|props/flora/reeds_pond_lush_b.xml"; rba5 = "actor|geology/stone_savanna_med.xml"; rba6 = "actor|geology/stone_savanna_med.xml"; rba7 = "actor|props/flora/bush_desert_dry_a.xml"; rba8 = "actor|props/flora/bush_dry_a.xml"; rba9 = "actor|flora/trees/baobab.xml"; } //tropic else if (biomeID == 7){ rbt1 = ["tropic_grass_c", "tropic_grass_c", "tropic_grass_c", "tropic_grass_c", "tropic_grass_plants", "tropic_plants", "tropic_plants_b"]; rbt2 = "tropic_plants_c"; rbt3 = "tropic_plants_c"; rbt4 = ["tropic_cliff_a", "tropic_cliff_a", "tropic_cliff_a", "tropic_cliff_a_plants"]; rbt5 = "tropic_grass_c"; rbt6 = "tropic_grass_plants"; rbt7 = "tropic_plants"; rbt8 = ["tropic_cliff_grass"]; rbt9 = ["tropic_dirt_a", "tropic_dirt_a_plants"]; rbt10 = "tropic_citytile_a"; rbt11 = "tropic_citytile_plants"; rbt12 = "tropic_plants_b"; rbt13 = "temp_mud_plants"; rbt14 = "tropic_beach_dry"; rbt15 = "tropic_beach_wet"; // gaia entities rbe1 = "gaia/flora_tree_poplar"; rbe2 = "gaia/flora_tree_poplar"; rbe3 = "gaia/flora_tree_poplar"; rbe4 = "gaia/flora_tree_cretan_date_palm_short"; rbe5 = "gaia/flora_tree_cretan_date_palm_tall"; rbe6 = "gaia/flora_bush_berry"; rbe7 = "gaia/fauna_chicken"; rbe8 = "gaia/fauna_deer"; rbe9 = "gaia/fauna_fish"; rbe10 = "gaia/fauna_tiger"; rbe11 = "gaia/geology_stonemine_tropic_quarry"; rbe12 = "gaia/geology_stone_tropic_a"; rbe13 = "gaia/geology_metal_tropic_slabs"; // decorative props rba1 = "actor|props/flora/plant_tropic_a.xml"; rba2 = "actor|props/flora/plant_lg.xml"; rba3 = "actor|props/flora/reeds_pond_lush_b.xml"; rba4 = "actor|props/flora/water_lillies.xml"; rba5 = "actor|geology/stone_granite_large.xml"; rba6 = "actor|geology/stone_granite_med.xml"; rba7 = "actor|props/flora/plant_tropic_large.xml"; rba8 = "actor|props/flora/plant_tropic_large.xml"; rba9 = "actor|flora/trees/poplar.xml"; } return biomeID; } ///////////////////////////////////////////////////////////////////////////////////////////// // These functions return the values needed for a randomized biome ///////////////////////////////////////////////////////////////////////////////////////////// function rBiomeT1() { return rbt1; } function rBiomeT2() { return rbt2; } function rBiomeT3() { return rbt3; } function rBiomeT4() { return rbt4; } function rBiomeT5() { return rbt5; } function rBiomeT6() { return rbt6; } function rBiomeT7() { return rbt7; } function rBiomeT8() { return rbt8; } function rBiomeT9() { return rbt9; } function rBiomeT10() { return rbt10; } function rBiomeT11() { return rbt11; } function rBiomeT12() { return rbt12; } function rBiomeT13() { return rbt13; } function rBiomeT14() { return rbt14; } function rBiomeT15() { return rbt15; } function rBiomeE1() { return rbe1; } function rBiomeE2() { return rbe2; } function rBiomeE3() { return rbe3; } function rBiomeE4() { return rbe4; } function rBiomeE5() { return rbe5; } function rBiomeE6() { return rbe6; } function rBiomeE7() { return rbe7; } function rBiomeE8() { return rbe8; } function rBiomeE9() { return rbe9; } function rBiomeE10() { return rbe10; } function rBiomeE11() { return rbe11; } function rBiomeE12() { return rbe12; } function rBiomeE13() { return rbe13; } function rBiomeA1() { return rba1; } function rBiomeA2() { return rba2; } function rBiomeA3() { return rba3; } function rBiomeA4() { return rba4; } function rBiomeA5() { return rba5; } function rBiomeA6() { return rba6; } function rBiomeA7() { return rba7; } function rBiomeA8() { return rba8; } function rBiomeA9() { return rba9; } \ No newline at end of file diff --git a/binaries/data/mods/public/maps/random/saharan_oases.js b/binaries/data/mods/public/maps/random/saharan_oases.js new file mode 100644 index 0000000000..33a99f60d9 --- /dev/null +++ b/binaries/data/mods/public/maps/random/saharan_oases.js @@ -0,0 +1,346 @@ +RMS.LoadLibrary("rmgen"); + +var tCity = "desert_city_tile"; +var tCityPlaza = "desert_city_tile_plaza"; +var tSand = ["desert_dirt_rough", "desert_dirt_rough_2", "desert_sand_dunes_50", "desert_sand_smooth"]; +var tDunes = "desert_sand_dunes_100"; +var tFineSand = "desert_sand_smooth"; +var tCliff = ["desert_cliff_badlands", "desert_cliff_badlands_2"]; +var tForestFloor = "desert_forestfloor_palms"; +var tGrass = "desert_dirt_rough_2"; +var tGrassSand50 = "desert_sand_dunes_50"; +var tGrassSand25 = "desert_dirt_rough"; +var tDirt = "desert_dirt_rough"; +var tDirtCracks = "desert_dirt_cracks"; +var tShore = "desert_shore_stones"; +var tWaterDeep = "desert_shore_stones_wet"; +var tLush = "desert_grass_a"; +var tSLush = "desert_grass_a_sand"; +var tSDry = "desert_plants_b"; +// gaia entities +var oBerryBush = "gaia/flora_bush_berry"; +var oChicken = "gaia/fauna_chicken"; +var oCamel = "gaia/fauna_camel"; +var oFish = "gaia/fauna_fish"; +var oGazelle = "gaia/fauna_gazelle"; +var oGiraffe = "gaia/fauna_giraffe"; +var oGoat = "gaia/fauna_goat"; +var oWildebeest = "gaia/fauna_wildebeest"; +var oStoneLarge = "gaia/geology_stonemine_desert_badlands_quarry"; +var oStoneSmall = "gaia/geology_stone_desert_small"; +var oMetalLarge = "gaia/geology_metal_desert_slabs"; +var oDatePalm = "gaia/flora_tree_date_palm"; +var oSDatePalm = "gaia/flora_tree_cretan_date_palm_short"; +var eObelisk = "other/obelisk"; +var ePyramid = "other/pyramid_minor"; +var oWood = "gaia/special_treasure_wood"; +var oFood = "gaia/special_treasure_food_bin"; + +// decorative props +var aBush1 = "actor|props/flora/bush_desert_a.xml"; +var aBush2 = "actor|props/flora/bush_desert_dry_a.xml"; +var aBush3 = "actor|props/flora/bush_medit_sm_dry.xml"; +var aBush4 = "actor|props/flora/plant_desert_a.xml"; +var aBushes = [aBush1, aBush2, aBush3, aBush4]; +var aDecorativeRock = "actor|geology/stone_desert_med.xml"; +var aReeds = "actor|props/flora/reeds_pond_lush_a.xml"; +var aLillies = "actor|props/flora/water_lillies.xml"; + +// terrain + entity (for painting) +var pForest = [tLush + TERRAIN_SEPARATOR + oDatePalm, tLush + TERRAIN_SEPARATOR + oSDatePalm, tLush]; +var pForestOasis = [tLush + TERRAIN_SEPARATOR + oDatePalm, tLush + TERRAIN_SEPARATOR + oSDatePalm, tLush]; + +var BUILDING_ANGlE = 0.75*PI; + +log("Initializing map..."); + +InitMap(); + +var numPlayers = getNumPlayers(); +var mapSize = getMapSize(); +var mapArea = mapSize*mapSize; + +// create tile classes + +var clPlayer = 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 clGrass = createTileClass(); +var clDesert = createTileClass(); +var clPond = createTileClass(); +var clShore = createTileClass(); +var clTreasure = createTileClass(); + +// randomize player order +var playerIDs = []; +for (var i = 0; i < numPlayers; i++) +{ + playerIDs.push(i+1); +} +playerIDs = sortPlayers(playerIDs); + +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 = floor(fx); + var iz = 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); + + // 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 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(oSDatePalm, 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(aBush1, 2,5, 0,1, -PI/8,PI/8)], + false, clBaseResource, gX, gZ + ); + createObjectGroup(group, 0); + } +} + +RMS.SetProgress(30); + +for (var i = 0; i < numPlayers; i++) +{ + // create the oases + log("Creating oases..."); + var oRadius = scaleByMapSize(15, 60); + placer = new ClumpPlacer(PI*oRadius*oRadius*0.185, 0.6, 0.15, 0, mapSize*(0.5 + 0.18*cos(playerAngle[i]) + scaleByMapSize(1, 4)*cos(playerAngle[i])/100), mapSize*(0.5 + 0.18*sin(playerAngle[i]) + scaleByMapSize(1, 4)*sin(playerAngle[i])/100)); + painter = new LayeredPainter([tSLush ,[tLush, pForest], [tLush, pForestOasis], tShore, tShore, tWaterDeep], [2, 2, 1, 3, 1]); + var elevationPainter = new SmoothElevationPainter(ELEVATION_MODIFY, -3, 8); + createArea(placer, [painter, elevationPainter, paintClass(clWater)], null); +} + +// create grass patches +log("Creating grass 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,tGrassSand50],[tGrassSand50,tGrassSand25], [tGrassSand25,tGrass]], // terrains + [1,1] // widths + ); + createAreas( + placer, + [painter, paintClass(clDirt)], + avoidClasses(clForest, 0, clGrass, 5, clPlayer, 0, clWater, 1, clDirt, 5, clShore, 1), + scaleByMapSize(15, 45) + ); +} + +RMS.SetProgress(55); + +// 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( + [[tDirt,tDirtCracks],[tDirt,tFineSand], [tDirtCracks,tFineSand]], // terrains + [1,1] // widths + ); + createAreas( + placer, + [painter, paintClass(clDirt)], + avoidClasses(clForest, 0, clDirt, 5, clPlayer, 0, clWater, 1, clGrass, 5, clShore, 1), + scaleByMapSize(15, 45) + ); +} + +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); +createObjectGroups(group, 0, + avoidClasses(clForest, 1, clPlayer, 12, clRock, 10, clWater, 1), + 2*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, 12, clRock, 10, clWater, 1), + 2*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, 12, clMetal, 10, clRock, 5, clWater, 1), + 2*scaleByMapSize(4,16), 100 +); + +// create small decorative rocks +log("Creating small decorative rocks..."); +group = new SimpleGroup( + [new SimpleObject(aDecorativeRock, 1,3, 0,1)], + true +); +createObjectGroups( + group, 0, + avoidClasses(clWater, 1, clForest, 0, clPlayer, 0, clPond, 1), + scaleByMapSize(16, 262), 50 +); + +// create gazelles +log("Creating gazelles..."); +group = new SimpleGroup([new SimpleObject(oGazelle, 5,7, 0,4)], true, clFood); +createObjectGroups(group, 0, + borderClasses(clWater, 8, 5), + 3*scaleByMapSize(5,20), 50 +); + +// create goats +log("Creating goats..."); +group = new SimpleGroup([new SimpleObject(oGoat, 2,4, 0,3)], true, clFood); +createObjectGroups(group, 0, + borderClasses(clWater, 8, 5), + 3*scaleByMapSize(5,20), 50 +); + +// create treasures +log("Creating treasures..."); +group = new SimpleGroup([new SimpleObject(oFood, 1,1, 0,2)], true, clTreasure); +createObjectGroups(group, 0, + borderClasses(clWater, 8, 5), + 3*scaleByMapSize(5,20), 50 +); + +group = new SimpleGroup([new SimpleObject(oWood, 1,1, 0,2)], true, clTreasure); +createObjectGroups(group, 0, + borderClasses(clWater, 8, 5), + 3*scaleByMapSize(5,20), 50 +); + +// create camels +log("Creating camels..."); +group = new SimpleGroup([new SimpleObject(oCamel, 2,4, 0,2)], true, clFood); +createObjectGroups(group, 0, + borderClasses(clWater, 8, 5), + 3*scaleByMapSize(5,20), 50 +); + +// Set environment +setSkySet("sunny"); +setSunColour(0.711, 0.746, 0.574); +setWaterColour(0.292, 0.347, 0.691); +setWaterTint(0.550, 0.543, 0.437); +setWaterReflectionTint(0.562, 0.511, 0.425); +setWaterMurkiness(0.83); +setWaterReflectionTintStrength(0.377); + +// Export map data +ExportMap(); \ No newline at end of file diff --git a/binaries/data/mods/public/maps/random/saharan_oases.json b/binaries/data/mods/public/maps/random/saharan_oases.json new file mode 100644 index 0000000000..4b01850325 --- /dev/null +++ b/binaries/data/mods/public/maps/random/saharan_oases.json @@ -0,0 +1,11 @@ +{ + "settings" : { + "Name" : "Saharan Oases", + "Script" : "saharan_oases.js", + "Description" : "Each players starts near an Oasis in a large, open desert", + "BaseTerrain" : ["desert_sand_dunes_100"], + "BaseHeight" : 1, + "CircularMap" : true, + "XXXXXX" : "Optionally define other things here, like we would for a scenario" + } +} \ No newline at end of file diff --git a/binaries/data/mods/public/maps/random/the_nile.js b/binaries/data/mods/public/maps/random/the_nile.js index 1284972f13..f6f6007a62 100644 --- a/binaries/data/mods/public/maps/random/the_nile.js +++ b/binaries/data/mods/public/maps/random/the_nile.js @@ -1,6 +1,5 @@ RMS.LoadLibrary("rmgen"); - var tCity = "desert_city_tile"; var tCityPlaza = "desert_city_tile_plaza"; var tSand = ["desert_dirt_rough", "desert_dirt_rough_2", "desert_sand_dunes_50", "desert_sand_smooth"];