diff options
Diffstat (limited to 'src/biome.cpp')
-rw-r--r-- | src/biome.cpp | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/src/biome.cpp b/src/biome.cpp index e68429eff..83d4e7a4c 100644 --- a/src/biome.cpp +++ b/src/biome.cpp @@ -21,6 +21,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "nodedef.h" #include "map.h" //for ManualMapVoxelManipulator #include "log.h" +#include "util/numeric.h" #include "main.h" @@ -203,3 +204,54 @@ u8 BiomeDefManager::getBiomeIdByName(const char *name) { return 0; } + + +///////////////////////////// Weather + + +s16 BiomeDefManager::calcBlockHeat(v3s16 p, u64 seed, float timeofday, float totaltime) { + //variant 1: full random + //f32 heat = NoisePerlin3D(np_heat, p.X, env->getGameTime()/100, p.Z, seed); + + //variant 2: season change based on default heat map + const f32 offset = 20; // = np_heat->offset + const f32 scale = 20; // = np_heat->scale + const f32 range = 20; + f32 heat = NoisePerlin2D(np_heat, p.X, p.Z, seed); // 0..50..100 + + heat -= np_heat->offset; // -50..0..+50 + + // normalizing - todo REMOVE after fixed NoiseParams nparams_biome_def_heat = {50, 50, -> 20, 50, + if (np_heat->scale) + heat /= np_heat->scale / scale; // -20..0..+20 + + f32 seasonv = totaltime; + seasonv /= 86400 * g_settings->getS16("year_days"); // season change speed + seasonv += (f32)p.X / 3000; // you can walk to area with other season + seasonv = sin(seasonv * M_PI); + heat += (range * (heat < 0 ? 2 : 0.5)) * seasonv; // -60..0..30 + + heat += offset; // -40..0..50 + heat += p.Y / -333; // upper=colder, lower=hotter, 3c per 1000 + + // daily change, hotter at sun +4, colder at night -4 + heat += 8 * (sin(cycle_shift(timeofday, -0.25) * M_PI) - 0.5); //-44..20..54 + + return heat; +} + + +s16 BiomeDefManager::calcBlockHumidity(v3s16 p, u64 seed, float timeofday, float totaltime) { + + f32 humidity = NoisePerlin2D(np_humidity, p.X, p.Z, seed); + + f32 seasonv = totaltime; + seasonv /= 86400 * 2; // bad weather change speed (2 days) + seasonv += (f32)p.Z / 300; + humidity += 30 * sin(seasonv * M_PI); + + humidity += -12 * (sin(cycle_shift(timeofday, -0.1) * M_PI) - 0.5); + humidity = rangelim(humidity, 0, 100); + + return humidity; +} |