]> git.lizzy.rs Git - dragonfireclient.git/blobdiff - src/mapgen_valleys.cpp
GenericCAO: Fix light position for non-players, remove deprecated initialisation...
[dragonfireclient.git] / src / mapgen_valleys.cpp
index ce7a95329856753ca20dbf68669460ead2a6e41d..e4ddc164bd4febd041a57592e8aac57cbe63a20a 100644 (file)
@@ -1,8 +1,7 @@
 /*
 Minetest Valleys C
-Copyright (C) 2010-2015 kwolekr, Ryan Kwolek <kwolekr@minetest.net>
-Copyright (C) 2010-2015 paramat, Matt Gregory
-Copyright (C) 2016 Duane Robertson <duane@duanerobertson.com>
+Copyright (C) 2016-2017 Duane Robertson <duane@duanerobertson.com>
+Copyright (C) 2016-2017 paramat
 
 Based on Valleys Mapgen by Gael de Sailly
  (https://forum.minetest.net/viewtopic.php?f=9&t=11430)
@@ -31,13 +30,11 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "mapblock.h"
 #include "mapnode.h"
 #include "map.h"
-#include "content_sao.h"
 #include "nodedef.h"
 #include "voxelalgorithms.h"
 #include "settings.h" // For g_settings
 #include "emerge.h"
 #include "dungeongen.h"
-#include "treegen.h"
 #include "mg_biome.h"
 #include "mg_ore.h"
 #include "mg_decoration.h"
@@ -68,22 +65,19 @@ MapgenValleys::MapgenValleys(int mapgenid, MapgenValleysParams *params, EmergeMa
        : MapgenBasic(mapgenid, params, emerge)
 {
        // NOTE: MapgenValleys has a hard dependency on BiomeGenOriginal
-       this->m_bgen = (BiomeGenOriginal *)biomegen;
-
-       this->map_gen_limit = MYMIN(MAX_MAP_GENERATION_LIMIT,
-                       g_settings->getU16("map_generation_limit"));
+       m_bgen = (BiomeGenOriginal *)biomegen;
 
        BiomeParamsOriginal *bp = (BiomeParamsOriginal *)params->bparams;
 
-       this->spflags            = params->spflags;
-       this->altitude_chill     = params->altitude_chill;
-       this->large_cave_depth   = params->large_cave_depth;
-       this->lava_features_lim  = rangelim(params->lava_features, 0, 10);
-       this->massive_cave_depth = params->massive_cave_depth;
-       this->river_depth_bed    = params->river_depth + 1.f;
-       this->river_size_factor  = params->river_size / 100.f;
-       this->water_features_lim = rangelim(params->water_features, 0, 10);
-       this->cave_width         = params->cave_width;
+       spflags            = params->spflags;
+       altitude_chill     = params->altitude_chill;
+       large_cave_depth   = params->large_cave_depth;
+       lava_features_lim  = rangelim(params->lava_features, 0, 10);
+       massive_cave_depth = params->massive_cave_depth;
+       river_depth_bed    = params->river_depth + 1.f;
+       river_size_factor  = params->river_size / 100.f;
+       water_features_lim = rangelim(params->water_features, 0, 10);
+       cave_width         = params->cave_width;
 
        //// 2D Terrain noise
        noise_filler_depth       = new Noise(&params->np_filler_depth,       seed, csize.X, csize.Z);
@@ -101,18 +95,15 @@ MapgenValleys::MapgenValleys(int mapgenid, MapgenValleysParams *params, EmergeMa
        noise_cave2             = new Noise(&params->np_cave2,             seed, csize.X, csize.Y + 1, csize.Z);
        noise_massive_caves     = new Noise(&params->np_massive_caves,     seed, csize.X, csize.Y + 1, csize.Z);
 
-       this->humid_rivers       = (spflags & MGVALLEYS_HUMID_RIVERS);
-       this->use_altitude_chill = (spflags & MGVALLEYS_ALT_CHILL);
-       this->humidity_adjust    = bp->np_humidity.offset - 50.f;
+       humid_rivers       = (spflags & MGVALLEYS_HUMID_RIVERS);
+       use_altitude_chill = (spflags & MGVALLEYS_ALT_CHILL);
+       humidity_adjust    = bp->np_humidity.offset - 50.f;
 
        // a small chance of overflows if the settings are very high
-       this->cave_water_max_height = water_level + MYMAX(0, water_features_lim - 4) * 50;
-       this->lava_max_height       = water_level + MYMAX(0, lava_features_lim - 4) * 50;
+       cave_water_max_height = water_level + MYMAX(0, water_features_lim - 4) * 50;
+       lava_max_height       = water_level + MYMAX(0, lava_features_lim - 4) * 50;
 
        tcave_cache = new float[csize.Y + 2];
-
-       // Resolve content to be used
-       c_lava_source = ndef->getId("mapgen_lava_source");
 }
 
 
@@ -135,16 +126,6 @@ MapgenValleys::~MapgenValleys()
 
 MapgenValleysParams::MapgenValleysParams()
 {
-       spflags            = MGVALLEYS_HUMID_RIVERS | MGVALLEYS_ALT_CHILL;
-       altitude_chill     = 90; // The altitude at which temperature drops by 20C.
-       large_cave_depth   = -33;
-       lava_features      = 0;  // How often water will occur in caves.
-       massive_cave_depth = -256;  // highest altitude of massive caves
-       river_depth        = 4;  // How deep to carve river channels.
-       river_size         = 5;  // How wide to make rivers.
-       water_features     = 0;  // How often water will occur in caves.
-       cave_width         = 0.09;
-
        np_cave1              = NoiseParams(0,     12,   v3f(61,   61,   61),   52534, 3, 0.5,   2.0);
        np_cave2              = NoiseParams(0,     12,   v3f(67,   67,   67),   10325, 3, 0.5,   2.0);
        np_filler_depth       = NoiseParams(0.f,   1.2f, v3f(256,  256,  256),  1605,  3, 0.5f,  2.f);
@@ -238,19 +219,25 @@ void MapgenValleys::makeChunk(BlockMakeData *data)
 
        blockseed = getBlockSeed2(full_node_min, seed);
 
-       // Generate noise maps and base terrain height.
-       calculateNoise();
-
        // Generate biome noises.  Note this must be executed strictly before
        // generateTerrain, because generateTerrain depends on intermediate
        // biome-related noises.
        m_bgen->calcBiomeNoise(node_min);
 
+       // Generate noise maps and base terrain height.
+       // Modify heat and humidity maps.
+       calculateNoise();
+
        // Generate base terrain with initial heightmaps
        s16 stone_surface_max_y = generateTerrain();
 
+       // Recalculate heightmap
+       updateHeightmap(node_min, node_max);
+
        // Place biome-specific nodes and build biomemap
-       MgStoneType stone_type = generateBiomes();
+       MgStoneType mgstone_type;
+       content_t biome_stone;
+       generateBiomes(&mgstone_type, &biome_stone, water_level - 1);
 
        // Cave creation.
        if (flags & MG_CAVES)
@@ -258,14 +245,16 @@ void MapgenValleys::makeChunk(BlockMakeData *data)
 
        // Dungeon creation
        if ((flags & MG_DUNGEONS) && node_max.Y < 50)
-               generateDungeons(stone_surface_max_y, stone_type);
+               generateDungeons(stone_surface_max_y, mgstone_type, biome_stone);
 
        // Generate the registered decorations
        if (flags & MG_DECORATIONS)
-               m_emerge->decomgr->placeAllDecos(this, blockseed, node_min, node_max);
+               m_emerge->decomgr->placeAllDecos(this, blockseed,
+                       node_min, node_max, water_level - 1);
 
        // Generate the registered ores
-       m_emerge->oremgr->placeAllOres(this, blockseed, node_min, node_max);
+       m_emerge->oremgr->placeAllOres(this, blockseed,
+               node_min, node_max, water_level - 1);
 
        // Sprinkle some dust on top after everything else was generated
        dustTopNodes();
@@ -445,8 +434,8 @@ int MapgenValleys::getSpawnLevelAtPoint(v2s16 p)
        if (level_at_point <= water_level ||
                        level_at_point > water_level + 32)
                return MAX_MAP_GENERATION_LIMIT;  // Unsuitable spawn point
-       else
-               return level_at_point;
+
+       return level_at_point;
 }
 
 
@@ -487,7 +476,7 @@ int MapgenValleys::generateTerrain()
        MapNode n_stone(c_stone);
        MapNode n_water(c_water_source);
 
-       v3s16 em = vm->m_area.getExtent();
+       const v3s16 &em = vm->m_area.getExtent();
        s16 surface_max_y = -MAX_MAP_GENERATION_LIMIT;
        u32 index_2d = 0;
 
@@ -549,10 +538,6 @@ int MapgenValleys::generateTerrain()
                        index_3d += ystride;
                }
 
-               // This happens if we're generating a chunk that doesn't
-               // contain the terrain surface, in which case, we need
-               // to set heightmap to a value outside of the chunk,
-               // to avoid confusing lua mods that use heightmap.
                if (heightmap[index_2d] == -MAX_MAP_GENERATION_LIMIT) {
                        s16 surface_y_int = myround(surface_y);
                        if (surface_y_int > node_max.Y + 1 || surface_y_int < node_min.Y - 1) {
@@ -613,7 +598,7 @@ void MapgenValleys::generateCaves(s16 max_stone_y, s16 large_cave_depth)
        MapNode n_lava(c_lava_source);
        MapNode n_water(c_river_water_source);
 
-       v3s16 em = vm->m_area.getExtent();
+       const v3s16 &em = vm->m_area.getExtent();
 
        // Cave blend distance near YMIN, YMAX
        const float massive_cave_blend = 128.f;
@@ -621,7 +606,7 @@ void MapgenValleys::generateCaves(s16 max_stone_y, s16 large_cave_depth)
        const float massive_cave_threshold = 0.6f;
        // mct: 1 = small rare caves, 0.5 1/3rd ground volume, 0 = 1/2 ground volume.
 
-       float yblmin = -map_gen_limit + massive_cave_blend * 1.5f;
+       float yblmin = -mapgen_limit + massive_cave_blend * 1.5f;
        float yblmax = massive_cave_depth - massive_cave_blend * 1.5f;
        bool made_a_big_one = false;
 
@@ -646,11 +631,11 @@ void MapgenValleys::generateCaves(s16 max_stone_y, s16 large_cave_depth)
 
        // lava_depth varies between one and ten as you approach
        //  the bottom of the world.
-       s16 lava_depth = ceil((lava_max_height - node_min.Y + 1) * 10.f / map_gen_limit);
+       s16 lava_depth = ceil((lava_max_height - node_min.Y + 1) * 10.f / mapgen_limit);
        // This allows random lava spawns to be less common at the surface.
        s16 lava_chance = MYCUBE(lava_features_lim) * lava_depth;
        // water_depth varies between ten and one on the way down.
-       s16 water_depth = ceil((map_gen_limit - abs(node_min.Y) + 1) * 10.f / map_gen_limit);
+       s16 water_depth = ceil((mapgen_limit - abs(node_min.Y) + 1) * 10.f / mapgen_limit);
        // This allows random water spawns to be more common at the surface.
        s16 water_chance = MYCUBE(water_features_lim) * water_depth;
 
@@ -684,7 +669,8 @@ void MapgenValleys::generateCaves(s16 max_stone_y, s16 large_cave_depth)
                        // Saves some time.
                        if (y > terrain + 10)
                                continue;
-                       else if (y < terrain - 40)
+
+                       if (y < terrain - 40)
                                underground = true;
 
                        // Dig massive caves.
@@ -751,7 +737,7 @@ void MapgenValleys::generateCaves(s16 max_stone_y, s16 large_cave_depth)
                u32 bruises_count = ps.range(0, 2);
                for (u32 i = 0; i < bruises_count; i++) {
                        CavesRandomWalk cave(ndef, &gennotify, seed, water_level,
-                               c_water_source, c_lava_source);
+                               c_water_source, c_lava_source, lava_max_height);
 
                        cave.makeCave(vm, node_min, node_max, &ps, true, max_stone_y, heightmap);
                }