diff --git a/binaries/data/mods/public/art/textures/ui/session/icons/mappreview/pompeii.png b/binaries/data/mods/public/art/textures/ui/session/icons/mappreview/pompeii.png new file mode 100644 index 0000000000..f2278fd17d --- /dev/null +++ b/binaries/data/mods/public/art/textures/ui/session/icons/mappreview/pompeii.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:950886dd090f80e269b040c03eb82ffca0d2315eab5717475e62a683c943bf0b +size 149436 diff --git a/binaries/data/mods/public/maps/random/bahrain.js b/binaries/data/mods/public/maps/random/bahrain.js index c0d21e87b8..ca350a09ad 100644 --- a/binaries/data/mods/public/maps/random/bahrain.js +++ b/binaries/data/mods/public/maps/random/bahrain.js @@ -72,11 +72,8 @@ g_Decoratives.bushSmall = "actor|props/flora/bush_medit_la_dry"; const heightScale = num => num * g_MapSettings.Size / 320; const heightSeaGround = heightScale(-6); -const heightReedsMin = heightScale(-2); -const heightReedsMax = heightScale(-0.5); const heightWaterLevel = heightScale(0); const heightShoreline = heightScale(0.5); -const heightHills = heightScale(16); var g_Map = new RandomMap(0, g_Terrains.mainTerrain); var mapBounds = g_Map.getBounds(); diff --git a/binaries/data/mods/public/maps/random/pompeii.js b/binaries/data/mods/public/maps/random/pompeii.js new file mode 100644 index 0000000000..3452627d8f --- /dev/null +++ b/binaries/data/mods/public/maps/random/pompeii.js @@ -0,0 +1,427 @@ +/** + * Heightmap image source: + * Imagery by Jesse Allen, NASA's Earth Observatory, + * using data from the General Bathymetric Chart of the Oceans (GEBCO) + * produced by the British Oceanographic Data Centre. + * https://visibleearth.nasa.gov/view.php?id=73934 + * + * Licensing: Public Domain, https://visibleearth.nasa.gov/useteEngine.php + * + * The heightmap image is reproduced using: + * wget https://eoimages.gsfc.nasa.gov/images/imagerecords/73000/73934/gebco_08_rev_elev_C1_grey_geo.tif + * lat=41.1; lon=14.25; width=1.4; + * lat1=$(bc <<< ";scale=5;$lat-$width/2"); lon1=$(bc <<< ";scale=5;$lon+$width/2"); lat2=$(bc <<< ";scale=5;$lat+$width/2"); lon2=$(bc <<< ";scale=5;$lon-$width/2") + * gdal_translate -projwin $lon2 $lat2 $lon1 $lat1 gebco_08_rev_elev_C1_grey_geo.tif pompeii.tif + * convert pompeii.tif -resize 512 -contrast-stretch 0 pompeii.png + * No further changes should be applied to the image to keep it easily interchangeable. + */ + +Engine.LoadLibrary("rmgen"); +Engine.LoadLibrary("rmgen2"); +Engine.LoadLibrary("rmbiome"); +Engine.LoadLibrary("heightmap"); + +setBiome("generic/mediterranean"); + +g_Terrains.lavaOuter = "LavaTest06"; +g_Terrains.lavaInner = "LavaTest05"; +g_Terrains.mainTerrain = "ocean_rock_a"; +g_Terrains.forestFloor1 = "dirt_burned"; +g_Terrains.forestFloor2 = "shoreline_stoney_a"; +g_Terrains.tier1Terrain = "rock_metamorphic"; +g_Terrains.tier2Terrain = "fissures"; +g_Terrains.tier3Terrain = "LavaTest06"; +g_Terrains.tier4Terrain = "ocean_rock_b"; +g_Terrains.roadWild = "road1"; +g_Terrains.road = "road1"; +g_Terrains.water = "ocean_rock_a"; +g_Terrains.cliff = "ocean_rock_b"; + +g_Gaia.mainHuntableAnimal = "gaia/fauna_goat"; +g_Gaia.secondaryHuntableAnimal = "gaia/fauna_hawk"; +g_Gaia.fruitBush = "gaia/fauna_chicken"; +g_Gaia.fish = "gaia/fauna_fish"; +g_Gaia.tree1 = "gaia/flora_tree_dead"; +g_Gaia.tree2 = "gaia/flora_tree_oak_dead"; +g_Gaia.tree3 = "gaia/flora_tree_dead"; +g_Gaia.tree4 = "gaia/flora_tree_oak_dead"; +g_Gaia.tree5 = "gaia/flora_tree_dead"; +g_Gaia.stoneSmall = "gaia/geology_stone_alpine_a"; +g_Gaia.columnsDoric = "gaia/ruins/column_doric"; +g_Gaia.romanStatue = "gaia/ruins/stone_statues_roman"; +g_Gaia.unfinishedTemple = "gaia/ruins/unfinished_greek_temple"; + +g_Decoratives.smoke1 = "actor|particle/smoke_volcano.xml"; +g_Decoratives.smoke2 = "actor|particle/smoke_curved.xml"; +g_Decoratives.grass = "actor|props/flora/grass_field_parched_short.xml"; +g_Decoratives.grassShort = "actor|props/flora/grass_soft_dry_tuft_a.xml"; +g_Decoratives.bushMedium = "actor|props/special/eyecandy/barrels_buried.xml"; +g_Decoratives.bushSmall = "actor|props/special/eyecandy/handcart_1_broken.xml"; +g_Decoratives.skeleton = "actor|props/special/eyecandy/skeleton.xml"; +g_Decoratives.shipwrecks = [ + "actor|props/special/eyecandy/shipwreck_hull.xml", + "actor|props/special/eyecandy/shipwreck_ram_side.xml", + "actor|props/special/eyecandy/shipwreck_sail_boat.xml", + "actor|props/special/eyecandy/shipwreck_sail_boat_cut.xml", + "actor|props/special/eyecandy/barrels_floating.xml" +]; +g_Decoratives.statues = [ + "actor|props/special/eyecandy/statue_aphrodite_huge.xml", + "actor|props/special/eyecandy/sele_colonnade.xml", + "actor|props/special/eyecandy/well_1_b.xml", + "actor|props/special/eyecandy/anvil.xml", + "actor|props/special/eyecandy/wheel_laying.xml", + "actor|props/special/eyecandy/vase_rome_a.xml" +]; + +const heightScale = num => num * g_MapSettings.Size / 320; + +const heightSeaGround = heightScale(-30); +const heightWaterLevel = heightScale(0); +const heightLavaVesuv = heightScale(40); +const heightMountains = 140; + +var g_Map = new RandomMap(0, g_Terrains.mainTerrain); +var mapCenter = g_Map.getCenter(); + +initTileClasses(["decorative", "lava"]); + +g_Map.LoadHeightmapImage("pompeii.png", 0, heightMountains); +Engine.SetProgress(15); + +g_Map.log("Lowering sea ground"); +createArea( + new MapBoundsPlacer(), + new SmoothElevationPainter(ELEVATION_SET, heightSeaGround, 2), + new HeightConstraint(-Infinity, heightWaterLevel)); +Engine.SetProgress(20); + +g_Map.log("Smoothing heightmap"); +globalSmoothHeightmap(0.8); +Engine.SetProgress(25); + +g_Map.log("Marking water"); +createArea( + new MapBoundsPlacer(), + new TileClassPainter(g_TileClasses.water), + new HeightConstraint(-Infinity, heightWaterLevel)); +Engine.SetProgress(30); + +g_Map.log("Marking land"); +createArea( + new MapBoundsPlacer(), + new TileClassPainter(g_TileClasses.land), + avoidClasses(g_TileClasses.water, 0)); +Engine.SetProgress(35); + +g_Map.log("Painting cliffs"); +createArea( + new MapBoundsPlacer(), + [ + new TerrainPainter(g_Terrains.cliff), + new TileClassPainter(g_TileClasses.mountain), + ], + [ + avoidClasses(g_TileClasses.water, 2), + new SlopeConstraint(2, Infinity) + ]); +Engine.SetProgress(45); + +g_Map.log("Painting lava"); +var areaVesuv = createArea( + new RectPlacer(new Vector2D(mapCenter.x, fractionToTiles(0.3)), new Vector2D(fractionToTiles(0.7), fractionToTiles(0.15))), + [ + new LayeredPainter([g_Terrains.lavaOuter, g_Terrains.lavaInner], [scaleByMapSize(2, 4)]), + new TileClassPainter(g_TileClasses.lava) + ], + new HeightConstraint(heightLavaVesuv, Infinity)); +Engine.SetProgress(20); + +g_Map.log("Adding smoke..."); +createObjectGroupsByAreas( + new SimpleGroup( + [ + new SimpleObject(g_Decoratives.smoke1, 1, 1, 0, 4), + new SimpleObject(g_Decoratives.smoke2, 2, 2, 0, 4) + ], + false), + 0, + stayClasses(g_TileClasses.lava, 0), + scaleByMapSize(4, 12), + 20, + [areaVesuv]); + +if (!isNomad()) +{ + g_Map.log("Placing players"); + let playerBases = placeRandom( + sortAllPlayers(), + [ + avoidClasses(g_TileClasses.mountain, 5), + stayClasses(g_TileClasses.land, defaultPlayerBaseRadius() / 3) + ]); + + g_Map.log("Flatten the initial CC area..."); + for (let player of playerBases) + createArea( + new ClumpPlacer(diskArea(defaultPlayerBaseRadius() * 0.8), 0.95, 0.6, Infinity, player.position), + new SmoothElevationPainter(ELEVATION_SET, g_Map.getHeight(player.position), 6)); +} +Engine.SetProgress(50); + +addElements([ + { + "func": addLayeredPatches, + "avoid": [ + g_TileClasses.dirt, 5, + g_TileClasses.forest, 2, + g_TileClasses.mountain, 2, + g_TileClasses.player, 12, + g_TileClasses.lava, 2, + g_TileClasses.water, 3 + ], + "sizes": ["normal"], + "mixes": ["normal"], + "amounts": ["normal"] + }, + { + "func": addDecoration, + "avoid": [ + g_TileClasses.forest, 2, + g_TileClasses.mountain, 2, + g_TileClasses.player, 12, + g_TileClasses.lava, 2, + g_TileClasses.water, 3 + ], + "sizes": ["normal"], + "mixes": ["normal"], + "amounts": ["normal"] + } +]); +Engine.SetProgress(50); + +addElements(shuffleArray([ + { + "func": addMetal, + "avoid": [ + g_TileClasses.berries, 5, + g_TileClasses.forest, 3, + g_TileClasses.mountain, 2, + g_TileClasses.player, 30, + g_TileClasses.rock, 10, + g_TileClasses.metal, 20, + g_TileClasses.lava, 5, + g_TileClasses.water, 3 + ], + "sizes": ["normal"], + "mixes": ["same"], + "amounts": ["few"] + }, + { + "func": addStone, + "avoid": [ + g_TileClasses.berries, 5, + g_TileClasses.forest, 3, + g_TileClasses.mountain, 2, + g_TileClasses.player, 30, + g_TileClasses.rock, 20, + g_TileClasses.metal, 10, + g_TileClasses.lava, 5, + g_TileClasses.water, 5 + ], + "sizes": ["normal"], + "mixes": ["same"], + "amounts": ["few"] + }, + { + "func": addForests, + "avoid": [ + g_TileClasses.berries, 5, + g_TileClasses.forest, 18, + g_TileClasses.metal, 3, + g_TileClasses.mountain, 5, + g_TileClasses.player, 20, + g_TileClasses.rock, 3, + g_TileClasses.water, 2 + ], + "sizes": ["normal"], + "mixes": ["same"], + "amounts": ["many"] + } +])); +Engine.SetProgress(60); + +addElements(shuffleArray([ + { + "func": addAnimals, + "avoid": [ + g_TileClasses.animals, 20, + g_TileClasses.forest, 2, + g_TileClasses.metal, 2, + g_TileClasses.mountain, 1, + g_TileClasses.player, 20, + g_TileClasses.rock, 2, + g_TileClasses.lava, 10, + g_TileClasses.water, 3 + ], + "sizes": ["normal"], + "mixes": ["same"], + "amounts": ["few"] + }, + { + "func": addFish, + "avoid": [ + g_TileClasses.fish, 12, + g_TileClasses.player, 8 + ], + "stay": [g_TileClasses.water, 4], + "sizes": ["normal"], + "mixes": ["same"], + "amounts": ["few"] + }, + { + "func": addStragglerTrees, + "avoid": [ + g_TileClasses.berries, 5, + g_TileClasses.forest, 7, + g_TileClasses.metal, 2, + g_TileClasses.mountain, 1, + g_TileClasses.player, 12, + g_TileClasses.rock, 2, + g_TileClasses.lava, 5, + g_TileClasses.water, 5 + ], + "sizes": ["normal"], + "mixes": ["same"], + "amounts": ["tons"] + } +])); +Engine.SetProgress(65); + +g_Map.log("Adding gatherable stone statues..."); +createObjectGroups( + new SimpleGroup( + [new SimpleObject(g_Gaia.romanStatue, 1, 1, 1, 4)], + true, + g_TileClasses.metal + ), + 0, + avoidClasses( + g_TileClasses.water, 2, + g_TileClasses.player, 20, + g_TileClasses.mountain, 3, + g_TileClasses.forest, 2, + g_TileClasses.lava, 5, + g_TileClasses.metal, 20 + ), + 5 * scaleByMapSize(1, 4), + 50); +Engine.SetProgress(75); + +g_Map.log("Adding stone ruins..."); +createObjectGroups( + new SimpleGroup( + [ + new SimpleObject(g_Gaia.unfinishedTemple, 0, 1, 1, 4), + new SimpleObject(g_Gaia.columnsDoric, 1, 1, 1, 4) + ], + true, + g_TileClasses.decorative + ), + 0, + avoidClasses( + g_TileClasses.water, 2, + g_TileClasses.player, 20, + g_TileClasses.mountain, 5, + g_TileClasses.forest, 2, + g_TileClasses.lava, 5, + g_TileClasses.decorative, 20 + ), + 10 * scaleByMapSize(1, 4), + 20); +Engine.SetProgress(80); + +g_Map.log("Adding shipwrecks..."); +createObjectGroups( + new SimpleGroup(g_Decoratives.shipwrecks.map(shipwreck => new SimpleObject(shipwreck, 0, 1, 1, 20)), true, g_TileClasses.decorative), + 0, + [ + avoidClasses(g_TileClasses.decorative, 20), + stayClasses(g_TileClasses.water, 0) + ], + scaleByMapSize(1, 5), + 20); +Engine.SetProgress(85); + +g_Map.log("Adding more statues..."); +createObjectGroups( + new SimpleGroup(g_Decoratives.statues.map(ruin => new SimpleObject(ruin, 0, 1, 1, 20)), true, g_TileClasses.decorative), + 0, + avoidClasses( + g_TileClasses.water, 2, + g_TileClasses.player, 20, + g_TileClasses.mountain, 2, + g_TileClasses.forest, 2, + g_TileClasses.lava, 5, + g_TileClasses.decorative, 20 + ), + 10 * scaleByMapSize(1, 4), + 20); +Engine.SetProgress(90); + +g_Map.log("Adding skeletons..."); +createObjectGroups( + new SimpleGroup( + [new SimpleObject(g_Decoratives.skeleton, 3, 10, 1, 7)], + true, + g_TileClasses.dirt + ), + 0, + avoidClasses( + g_TileClasses.water, 2, + g_TileClasses.player, 10, + g_TileClasses.mountain, 2, + g_TileClasses.forest, 2, + g_TileClasses.decorative, 2 + ), + 30 * scaleByMapSize(1, 4), + 20); +Engine.SetProgress(95); + +placePlayersNomad( + g_Map.createTileClass(), + [ + stayClasses(g_TileClasses.land, 5), + avoidClasses( + g_TileClasses.forest, 1, + g_TileClasses.rock, 4, + g_TileClasses.metal, 4, + g_TileClasses.animals, 2, + g_TileClasses.mountain, 2) + ]); + +setWaterTint(0.5, 0.5, 0.5); +setWaterColor(0.3, 0.3, 0.3); +setWaterWaviness(8); +setWaterMurkiness(0.87); +setWaterType("lake"); + +setTerrainAmbientColor(0.3, 0.3, 0.3); +setUnitsAmbientColor(0.3, 0.3, 0.3); + +setSunColor(0.8, 0.8, 0.8); +setSunRotation(Math.PI); +setSunElevation(1/2); + +setFogFactor(0); +setFogThickness(0); +setFogColor(0.69, 0.616, 0.541); + +setSkySet("stormy"); + +setPPEffect("hdr"); +setPPContrast(0.67); +setPPSaturation(0.42); +setPPBloom(0.23); + +g_Map.ExportMap(); diff --git a/binaries/data/mods/public/maps/random/pompeii.json b/binaries/data/mods/public/maps/random/pompeii.json new file mode 100644 index 0000000000..f22088b073 --- /dev/null +++ b/binaries/data/mods/public/maps/random/pompeii.json @@ -0,0 +1,11 @@ +{ + "settings" : { + "Name" : "Pompeii", + "Script" : "pompeii.js", + "Description" : "Pompeii was an ancient Roman coastal city, in the Campania region of Italy. Pompeii, along with much of the surrounding area, was mostly destroyed and buried under 4 to 6 meters of volcanic ash and pumice in the eruption of Mount Vesuvius in AD 79.", + "Keywords": [], + "Preview" : "pompeii.png", + "CircularMap" : true + } +} + diff --git a/binaries/data/mods/public/maps/random/red_sea.png b/binaries/data/mods/public/maps/random/red_sea.png index cccb52f921..30de09d855 100644 --- a/binaries/data/mods/public/maps/random/red_sea.png +++ b/binaries/data/mods/public/maps/random/red_sea.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:df490cf60c98b01e6063ab53b7571c74f6c85826ef62e987e309189a06b2ea57 -size 125299 +oid sha256:0a854726e4062f3e47f4e015384b309233a7001879b1606e7a3ea7be0a5f67cb +size 109309