aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/mapgen_valleys.cpp88
-rw-r--r--src/mapgen_valleys.h20
2 files changed, 61 insertions, 47 deletions
diff --git a/src/mapgen_valleys.cpp b/src/mapgen_valleys.cpp
index c14ceb51e..93f47cd5f 100644
--- a/src/mapgen_valleys.cpp
+++ b/src/mapgen_valleys.cpp
@@ -185,19 +185,19 @@ MapgenValleys::~MapgenValleys()
MapgenValleysParams::MapgenValleysParams()
{
spflags = MG_VALLEYS_CLIFFS | MG_VALLEYS_RUGGED
- | MG_VALLEYS_HUMID_RIVERS | MG_VALLEYS_ALT_CHILL;
+ | MG_VALLEYS_HUMID_RIVERS | MG_VALLEYS_ALT_CHILL;
- altitude_chill = 90; // The altitude at which temperature drops by 20C.
+ altitude_chill = 90; // The altitude at which temperature drops by 20C.
// Water in caves will never be higher than this.
- cave_water_max_height = MAX_MAP_GENERATION_LIMIT;
- humidity = 50;
+ cave_water_max_height = MAX_MAP_GENERATION_LIMIT;
+ humidity = 50;
// the maximum humidity around rivers in otherwise dry areas
- humidity_break_point = 65;
- lava_max_height = 0; // Lava will never be higher than this.
- river_depth = 4; // How deep to carve river channels.
- river_size = 5; // How wide to make rivers.
- temperature = 50;
- water_features = 3; // How often water will occur in caves.
+ humidity_break_point = 65;
+ lava_max_height = 0; // Lava will never be higher than this.
+ river_depth = 4; // How deep to carve river channels.
+ river_size = 5; // How wide to make rivers.
+ temperature = 50;
+ water_features = 3; // How often water will occur in caves.
np_cliffs = NoiseParams(0.f, 1.f, v3f(750, 750, 750), 8445, 5, 1.f, 2.f);
np_corr = NoiseParams(0.f, 1.f, v3f(40, 40, 40), -3536, 4, 1.f, 2.f);
@@ -285,7 +285,7 @@ void MapgenValleys::makeChunk(BlockMakeData *data)
data->blockpos_requested.Z <= data->blockpos_max.Z);
this->generating = true;
- this->vm = data->vmanip;
+ this->vm = data->vmanip;
this->ndef = data->nodedef;
//TimeTaker t("makeChunk");
@@ -375,9 +375,9 @@ void MapgenValleys::makeChunk(BlockMakeData *data)
if (flags & MG_LIGHT)
calcLighting(
- node_min - v3s16(0, 1, 0),
- node_max + v3s16(0, 1, 0),
- full_node_min,
+ node_min - v3s16(0, 1, 0),
+ node_max + v3s16(0, 1, 0),
+ full_node_min,
full_node_max);
//mapgen_profiler->avg("liquid_lighting", tll.stop() / 1000.f);
@@ -535,7 +535,7 @@ float MapgenValleys::terrainLevelFromNoise(TerrainNoise *tn)
}
if (fast_terrain) {
- // The penultimate step builds up the heights, but we reduce it
+ // The penultimate step builds up the heights, but we reduce it
// occasionally to create cliffs.
float delta = sin(tn->inter_valley_fill) * *tn->slope;
if (cliff_terrain && tn->cliffs >= 0.2f)
@@ -544,8 +544,8 @@ float MapgenValleys::terrainLevelFromNoise(TerrainNoise *tn)
mount += delta;
// Use yet another noise to make the heights look more rugged.
- if (rugged_terrain
- && mount > water_level
+ if (rugged_terrain
+ && mount > water_level
&& fabs(inter_valley_slope * tn->inter_valley_fill) < 0.3f)
mount += ((delta < 0.f) ? -1.f : 1.f) * pow(fabs(delta), 0.5f) * fabs(sin(tn->corr));
}
@@ -576,9 +576,9 @@ float MapgenValleys::adjustedTerrainLevelFromNoise(TerrainNoise *tn)
float MapgenValleys::humidityByTerrain(
- float humidity_base,
- float mount,
- float rivers,
+ float humidity_base,
+ float mount,
+ float rivers,
float valley)
{
// Although the original valleys adjusts humidity by distance
@@ -603,9 +603,23 @@ float MapgenValleys::humidityByTerrain(
}
-inline int MapgenValleys::getGroundLevelAtPoint(v2s16 p)
+int MapgenValleys::getGroundLevelAtPoint(v2s16 p)
{
- // Base terrain calculation
+ // ***********************************************
+ // This method (deliberately) does not return correct
+ // terrain values. This may be a problem in the future.
+ // ***********************************************
+
+ // Since MT doesn't normally deal with rivers, check
+ // to make sure this isn't a request for a location
+ // in a river.
+ float rivers = NoisePerlin2D(&noise_rivers->np, p.X, p.Y, seed);
+
+ // If it's wet, return an unusable number.
+ if (fabs(rivers) < river_size)
+ return MAX_MAP_GENERATION_LIMIT;
+
+ // Otherwise, return the real result.
return terrainLevelAtPoint(p.X, p.Y);
}
@@ -709,14 +723,14 @@ int MapgenValleys::generateTerrain()
if (!fast_terrain) {
// Assign the humidity adjusted by water proximity.
noise_humidity->result[index_2d] = humidityByTerrain(
- noise_humidity->result[index_2d],
- surface_max_y,
- noise_rivers->result[index_2d],
+ noise_humidity->result[index_2d],
+ surface_max_y,
+ noise_rivers->result[index_2d],
noise_valley_depth->result[index_2d]);
// Assign the heat adjusted by altitude. See humidity, above.
if (use_altitude_chill && surface_max_y > 0)
- noise_heat->result[index_2d]
+ noise_heat->result[index_2d]
*= pow(0.5f, (surface_max_y - altitude_chill / 3.f) / altitude_chill);
}
}
@@ -759,15 +773,15 @@ MgStoneType MapgenValleys::generateBiomes(float *heat_map, float *humidity_map)
// 1. At the surface of stone below air or water.
// 2. At the surface of water below air.
// 3. When stone or water is detected but biome has not yet been calculated.
- if ((c == c_stone && (air_above || water_above || !biome))
- || ((c == c_water_source || c == c_river_water_source)
+ if ((c == c_stone && (air_above || water_above || !biome))
+ || ((c == c_water_source || c == c_river_water_source)
&& (air_above || !biome))) {
// Both heat and humidity have already been adjusted for altitude.
biome = bmgr->getBiome(heat_map[index], humidity_map[index], y);
depth_top = biome->depth_top;
- base_filler = MYMAX(depth_top
- + biome->depth_filler
+ base_filler = MYMAX(depth_top
+ + biome->depth_filler
+ noise_filler_depth->result[index], 0.f);
depth_water_top = biome->depth_water_top;
@@ -787,8 +801,8 @@ MgStoneType MapgenValleys::generateBiomes(float *heat_map, float *humidity_map)
// any top/filler nodes above are structurally supported.
// This is done by aborting the cycle of top/filler placement
// immediately by forcing nplaced to stone level.
- if (c_below == CONTENT_AIR
- || c_below == c_water_source
+ if (c_below == CONTENT_AIR
+ || c_below == c_water_source
|| c_below == c_river_water_source)
nplaced = U16_MAX;
@@ -805,7 +819,7 @@ MgStoneType MapgenValleys::generateBiomes(float *heat_map, float *humidity_map)
air_above = false;
water_above = false;
} else if (c == c_water_source) {
- vm->m_data[vi] = MapNode((y > (s32)(water_level - depth_water_top))
+ vm->m_data[vi] = MapNode((y > (s32)(water_level - depth_water_top))
? biome->c_water_top : biome->c_water);
nplaced = 0; // Enable top/filler placement for next surface
air_above = false;
@@ -910,8 +924,8 @@ void MapgenValleys::generateSimpleCaves(s16 max_stone_y)
index_3d = (z - node_min.Z) * zstride + (csize.Y + 1) * ystride + (x - node_min.X);
// Dig caves on down loop to check for air above.
- for (s16 y = node_max.Y + 1;
- y >= node_min.Y - 1;
+ for (s16 y = node_max.Y + 1;
+ y >= node_min.Y - 1;
y--, index_3d -= ystride, vm->m_area.add_y(em, index_data, -1)) {
float terrain = noise_terrain_height->result[index_2d];
@@ -936,7 +950,7 @@ void MapgenValleys::generateSimpleCaves(s16 max_stone_y)
// When both n's are true, we're in a cave.
vm->m_data[index_data] = n_air;
air_above = true;
- } else if (air_above
+ } else if (air_above
&& (c == c_stone || c == c_sandstone || c == c_desert_stone)) {
// At the cave floor
s16 sr = ps.next() & 1023;
@@ -959,7 +973,7 @@ void MapgenValleys::generateSimpleCaves(s16 max_stone_y)
}
if (base_water_chance > 0 && y <= cave_water_max_height) {
- s16 water_chance = base_water_chance
+ s16 water_chance = base_water_chance
- (abs(y - water_level) / (water_features * 1000));
// Waterfalls may get out of control above ground.
diff --git a/src/mapgen_valleys.h b/src/mapgen_valleys.h
index 9c08b16d1..5fd549096 100644
--- a/src/mapgen_valleys.h
+++ b/src/mapgen_valleys.h
@@ -81,15 +81,15 @@ struct MapgenValleysParams : public MapgenSpecificParams {
};
struct TerrainNoise {
- s16 x;
- s16 z;
- float terrain_height;
- float *rivers;
- float *valley;
- float valley_profile;
- float *slope;
- float inter_valley_fill;
- float cliffs;
+ s16 x;
+ s16 z;
+ float terrain_height;
+ float *rivers;
+ float *valley;
+ float valley_profile;
+ float *slope;
+ float inter_valley_fill;
+ float cliffs;
float corr;
};
@@ -100,7 +100,7 @@ public:
~MapgenValleys();
virtual void makeChunk(BlockMakeData *data);
- inline int getGroundLevelAtPoint(v2s16 p);
+ int getGroundLevelAtPoint(v2s16 p);
private:
EmergeManager *m_emerge;