diff --git a/builtin/settingtypes.txt b/builtin/settingtypes.txt index afcee0f8c..d969799ce 100644 --- a/builtin/settingtypes.txt +++ b/builtin/settingtypes.txt @@ -1760,14 +1760,16 @@ mgfractal_np_cave2 (Cave2 noise) noise_params_3d 0, 12, (67, 67, 67), 10325, 3, [*Mapgen Valleys] # Map generation attributes specific to Mapgen Valleys. -# 'altitude_chill' makes higher elevations colder, which may cause biome issues. -# 'humid_rivers' modifies the humidity around rivers and in areas where water would tend to pool, -# it may interfere with delicately adjusted biomes. -# Flags that are not enabled are not modified from the default. -# Flags starting with 'no' are used to explicitly disable them. -mgvalleys_spflags (Mapgen Valleys specific flags) flags altitude_chill,humid_rivers altitude_chill,noaltitude_chill,humid_rivers,nohumid_rivers +# 'altitude_chill': Reduces heat with altitude. +# 'humid_rivers': Increases humidity around rivers and where water pools. +# 'vary_river_depth': If enabled, low humidity and high heat causes rivers +# to become shallower and occasionally dry. +# 'altitude_dry': Reduces humidity with altitude. +mgvalleys_spflags (Mapgen Valleys specific flags) flags altitude_chill,humid_rivers,vary_river_depth,altitude_dry altitude_chill,noaltitude_chill,humid_rivers,nohumid_rivers,vary_river_depth,novary_river_depth,altitude_dry,noaltitude_dry -# The altitude at which temperature drops by 20. +# The vertical distance over which heat drops by 20 if 'altitude_chill' is +# enabled. Also the vertical distance over which humidity drops by 10 if +# 'altitude_dry' is enabled. mgvalleys_altitude_chill (Altitude chill) int 90 # Depth below which you'll find large caves. diff --git a/src/mapgen/mapgen_valleys.cpp b/src/mapgen/mapgen_valleys.cpp index 341ce3137..0a0f93a75 100644 --- a/src/mapgen/mapgen_valleys.cpp +++ b/src/mapgen/mapgen_valleys.cpp @@ -44,10 +44,12 @@ with this program; if not, write to the Free Software Foundation, Inc., #include -static FlagDesc flagdesc_mapgen_valleys[] = { - {"altitude_chill", MGVALLEYS_ALT_CHILL}, - {"humid_rivers", MGVALLEYS_HUMID_RIVERS}, - {NULL, 0} +FlagDesc flagdesc_mapgen_valleys[] = { + {"altitude_chill", MGVALLEYS_ALT_CHILL}, + {"humid_rivers", MGVALLEYS_HUMID_RIVERS}, + {"vary_river_depth", MGVALLEYS_VARY_RIVER_DEPTH}, + {"altitude_dry", MGVALLEYS_ALT_DRY}, + {NULL, 0} }; @@ -94,8 +96,6 @@ MapgenValleys::MapgenValleys(int mapgenid, MapgenValleysParams *params, MapgenBasic::np_cave2 = params->np_cave2; MapgenBasic::np_cavern = params->np_cavern; - humid_rivers = (spflags & MGVALLEYS_HUMID_RIVERS); - use_altitude_chill = (spflags & MGVALLEYS_ALT_CHILL); humidity_adjust = bp->np_humidity.offset - 50.0f; } @@ -298,10 +298,10 @@ void MapgenValleys::calculateNoise() float heat_offset = 0.0f; float humidity_scale = 1.0f; // Altitude chill tends to reduce the average heat. - if (use_altitude_chill) + if (spflags & MGVALLEYS_ALT_CHILL) heat_offset = 5.0f; // River humidity tends to increase the humidity range. - if (humid_rivers) + if (spflags & MGVALLEYS_HUMID_RIVERS) humidity_scale = 0.8f; for (s32 index = 0; index < csize.X * csize.Z; index++) { @@ -477,17 +477,16 @@ int MapgenValleys::generateTerrain() if (surface_y > surface_max_y) surface_max_y = std::ceil(surface_y); - if (humid_rivers) { - // Derive heat from (base) altitude. This will be most correct - // at rivers, since other surface heights may vary below. - if (use_altitude_chill && (surface_y > 0.0f || river_y > 0.0f)) - t_heat -= alt_to_heat * - std::fmax(surface_y, river_y) / altitude_chill; - - // If humidity is low or heat is high, lower the water table + // Optionally vary river depth according to heat and humidity + if (spflags & MGVALLEYS_VARY_RIVER_DEPTH) { + float heat = ((spflags & MGVALLEYS_ALT_CHILL) && + (surface_y > 0.0f || river_y > 0.0f)) ? + t_heat - alt_to_heat * + std::fmax(surface_y, river_y) / altitude_chill : + t_heat; float delta = m_bgen->humidmap[index_2d] - 50.0f; if (delta < 0.0f) { - float t_evap = (t_heat - 32.0f) / evaporation; + float t_evap = (heat - 32.0f) / evaporation; river_y += delta * std::fmax(t_evap, 0.08f); } } @@ -534,33 +533,32 @@ int MapgenValleys::generateTerrain() } } - if (humid_rivers) { - // Use base ground (water table) in a riverbed, to avoid an - // unnatural rise in humidity. - float t_alt = std::fmax(noise_rivers->result[index_2d], - (float)heightmap[index_2d]); - float humid = m_bgen->humidmap[index_2d]; - float water_depth = (t_alt - river_y) / humidity_dropoff; - humid *= 1.0f + std::pow(0.5f, std::fmax(water_depth, 1.0f)); - - // Reduce humidity with altitude (ignoring riverbeds) - if (t_alt > 0.0f) - humid -= alt_to_humid * t_alt / altitude_chill; - - m_bgen->humidmap[index_2d] = humid; - } - - // Assign the heat adjusted by any changed altitudes. - // The altitude will change about half the time. - if (use_altitude_chill) { + // Optionally increase humidity around rivers + if (spflags & MGVALLEYS_HUMID_RIVERS) { // Ground height ignoring riverbeds float t_alt = std::fmax(noise_rivers->result[index_2d], (float)heightmap[index_2d]); + float water_depth = (t_alt - river_y) / humidity_dropoff; + m_bgen->humidmap[index_2d] *= + 1.0f + std::pow(0.5f, std::fmax(water_depth, 1.0f)); + } - if (humid_rivers && heightmap[index_2d] == (s16)myround(surface_y)) - // The altitude hasn't changed. Use the first result - m_bgen->heatmap[index_2d] = t_heat; - else if (t_alt > 0.0f) + // Optionally decrease humidity with altitude + if (spflags & MGVALLEYS_ALT_DRY) { + // Ground height ignoring riverbeds + float t_alt = std::fmax(noise_rivers->result[index_2d], + (float)heightmap[index_2d]); + if (t_alt > 0.0f) + m_bgen->humidmap[index_2d] -= + alt_to_humid * t_alt / altitude_chill; + } + + // Optionally decrease heat with altitude + if (spflags & MGVALLEYS_ALT_CHILL) { + // Ground height ignoring riverbeds + float t_alt = std::fmax(noise_rivers->result[index_2d], + (float)heightmap[index_2d]); + if (t_alt > 0.0f) m_bgen->heatmap[index_2d] -= alt_to_heat * t_alt / altitude_chill; } diff --git a/src/mapgen/mapgen_valleys.h b/src/mapgen/mapgen_valleys.h index f6a486d86..8bde7a622 100644 --- a/src/mapgen/mapgen_valleys.h +++ b/src/mapgen/mapgen_valleys.h @@ -28,9 +28,11 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "mapgen.h" -////////////// Mapgen Valleys flags -#define MGVALLEYS_ALT_CHILL 0x01 -#define MGVALLEYS_HUMID_RIVERS 0x02 +/////////////////// Mapgen Valleys flags +#define MGVALLEYS_ALT_CHILL 0x01 +#define MGVALLEYS_HUMID_RIVERS 0x02 +#define MGVALLEYS_VARY_RIVER_DEPTH 0x04 +#define MGVALLEYS_ALT_DRY 0x08 // Feed only one variable into these #define MYSQUARE(x) (x) * (x) @@ -39,12 +41,15 @@ with this program; if not, write to the Free Software Foundation, Inc., class BiomeManager; class BiomeGenOriginal; +extern FlagDesc flagdesc_mapgen_valleys[]; + struct MapgenValleysParams : public MapgenParams { - u32 spflags = MGVALLEYS_HUMID_RIVERS | MGVALLEYS_ALT_CHILL; - u16 altitude_chill = 90; // The altitude at which temperature drops by 20C - u16 river_depth = 4; // How deep to carve river channels - u16 river_size = 5; // How wide to make rivers + u32 spflags = MGVALLEYS_ALT_CHILL | MGVALLEYS_HUMID_RIVERS | + MGVALLEYS_VARY_RIVER_DEPTH | MGVALLEYS_ALT_DRY; + u16 altitude_chill = 90; + u16 river_depth = 4; + u16 river_size = 5; float cave_width = 0.09f; s16 large_cave_depth = -33; @@ -53,7 +58,7 @@ struct MapgenValleysParams : public MapgenParams { s16 cavern_taper = 192; float cavern_threshold = 0.6f; s16 dungeon_ymin = -31000; - s16 dungeon_ymax = 63; // No higher than surface mapchunks + s16 dungeon_ymax = 63; NoiseParams np_filler_depth; NoiseParams np_inter_valley_fill; @@ -88,7 +93,8 @@ struct TerrainNoise { class MapgenValleys : public MapgenBasic { public: - MapgenValleys(int mapgenid, MapgenValleysParams *params, EmergeManager *emerge); + MapgenValleys(int mapgenid, MapgenValleysParams *params, + EmergeManager *emerge); ~MapgenValleys(); virtual MapgenType getType() const { return MAPGEN_VALLEYS; } @@ -100,8 +106,6 @@ private: BiomeGenOriginal *m_bgen; float altitude_chill; - bool humid_rivers; - bool use_altitude_chill; float humidity_adjust; float river_depth_bed; float river_size_factor;