aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/mapgen/mapgen_valleys.cpp66
-rw-r--r--src/mapgen/mapgen_valleys.h26
2 files changed, 47 insertions, 45 deletions
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 <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}
};
@@ -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.
+ // 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;
}
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;