[*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
-
-# The altitude at which temperature drops by 20.
+# '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 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.
#include <cmath>
-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}
};
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;
}
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++) {
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);
}
}
}
}
- if (humid_rivers) {
- // Use base ground (water table) in a riverbed, to avoid an
- // unnatural rise in humidity.
+ // 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 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));
+ m_bgen->humidmap[index_2d] *=
+ 1.0f + std::pow(0.5f, std::fmax(water_depth, 1.0f));
+ }
- // Reduce humidity with altitude (ignoring riverbeds)
+ // 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)
- humid -= alt_to_humid * t_alt / altitude_chill;
-
- m_bgen->humidmap[index_2d] = humid;
+ m_bgen->humidmap[index_2d] -=
+ alt_to_humid * t_alt / altitude_chill;
}
- // Assign the heat adjusted by any changed altitudes.
- // The altitude will change about half the time.
- if (use_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 (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)
+ if (t_alt > 0.0f)
m_bgen->heatmap[index_2d] -=
alt_to_heat * t_alt / altitude_chill;
}
#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)
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;
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;
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; }
BiomeGenOriginal *m_bgen;
float altitude_chill;
- bool humid_rivers;
- bool use_altitude_chill;
float humidity_adjust;
float river_depth_bed;
float river_size_factor;