]> git.lizzy.rs Git - dragonfireclient.git/blobdiff - src/mapgen/mapgen_v7.cpp
Randomwalk caves: Add parameters for number, proportion flooded. Allow small caves...
[dragonfireclient.git] / src / mapgen / mapgen_v7.cpp
index 57646bd79bdee11777b932ed78f8e456fd416ea5..eaaff6ac6fad9c2911ed6ec322f3040d63230521 100644 (file)
@@ -52,8 +52,8 @@ FlagDesc flagdesc_mapgen_v7[] = {
 ////////////////////////////////////////////////////////////////////////////////
 
 
-MapgenV7::MapgenV7(int mapgenid, MapgenV7Params *params, EmergeManager *emerge)
-       : MapgenBasic(mapgenid, params, emerge)
+MapgenV7::MapgenV7(MapgenV7Params *params, EmergeManager *emerge)
+       : MapgenBasic(MAPGEN_V7, params, emerge)
 {
        spflags              = params->spflags;
        mount_zero_level     = params->mount_zero_level;
@@ -62,14 +62,19 @@ MapgenV7::MapgenV7(int mapgenid, MapgenV7Params *params, EmergeManager *emerge)
        floatland_level      = params->floatland_level;
        shadow_limit         = params->shadow_limit;
 
-       cave_width           = params->cave_width;
-       large_cave_depth     = params->large_cave_depth;
-       lava_depth           = params->lava_depth;
-       cavern_limit         = params->cavern_limit;
-       cavern_taper         = params->cavern_taper;
-       cavern_threshold     = params->cavern_threshold;
-       dungeon_ymin         = params->dungeon_ymin;
-       dungeon_ymax         = params->dungeon_ymax;
+       cave_width         = params->cave_width;
+       large_cave_depth   = params->large_cave_depth;
+       lava_depth         = params->lava_depth;
+       small_cave_num_min = params->small_cave_num_min;
+       small_cave_num_max = params->small_cave_num_max;
+       large_cave_num_min = params->large_cave_num_min;
+       large_cave_num_max = params->large_cave_num_max;
+       large_cave_flooded = params->large_cave_flooded;
+       cavern_limit       = params->cavern_limit;
+       cavern_taper       = params->cavern_taper;
+       cavern_threshold   = params->cavern_threshold;
+       dungeon_ymin       = params->dungeon_ymin;
+       dungeon_ymax       = params->dungeon_ymax;
 
        // This is to avoid a divide-by-zero.
        // Parameter will be saved to map_meta.txt in limited form.
@@ -113,9 +118,10 @@ MapgenV7::MapgenV7(int mapgenid, MapgenV7Params *params, EmergeManager *emerge)
                        new Noise(&params->np_mountain, seed, csize.X, csize.Y + 2, csize.Z);
 
        // 3D noise, 1 down overgeneration
-       MapgenBasic::np_cave1  = params->np_cave1;
-       MapgenBasic::np_cave2  = params->np_cave2;
-       MapgenBasic::np_cavern = params->np_cavern;
+       MapgenBasic::np_cave1    = params->np_cave1;
+       MapgenBasic::np_cave2    = params->np_cave2;
+       MapgenBasic::np_cavern   = params->np_cavern;
+       MapgenBasic::np_dungeons = params->np_dungeons;
 }
 
 
@@ -159,7 +165,8 @@ MapgenV7Params::MapgenV7Params():
        np_ridge             (0.0,   1.0,   v3f(100,  100,  100),  6467,  4, 0.75, 2.0),
        np_cavern            (0.0,   1.0,   v3f(384,  128,  384),  723,   5, 0.63, 2.0),
        np_cave1             (0.0,   12.0,  v3f(61,   61,   61),   52534, 3, 0.5,  2.0),
-       np_cave2             (0.0,   12.0,  v3f(67,   67,   67),   10325, 3, 0.5,  2.0)
+       np_cave2             (0.0,   12.0,  v3f(67,   67,   67),   10325, 3, 0.5,  2.0),
+       np_dungeons          (0.9,   0.5,   v3f(500,  500,  500),  0,     2, 0.8,  2.0)
 {
 }
 
@@ -171,6 +178,11 @@ void MapgenV7Params::readParams(const Settings *settings)
        settings->getFloatNoEx("mgv7_cave_width",           cave_width);
        settings->getS16NoEx("mgv7_large_cave_depth",       large_cave_depth);
        settings->getS16NoEx("mgv7_lava_depth",             lava_depth);
+       settings->getU16NoEx("mgv7_small_cave_num_min",     small_cave_num_min);
+       settings->getU16NoEx("mgv7_small_cave_num_max",     small_cave_num_max);
+       settings->getU16NoEx("mgv7_large_cave_num_min",     large_cave_num_min);
+       settings->getU16NoEx("mgv7_large_cave_num_max",     large_cave_num_max);
+       settings->getFloatNoEx("mgv7_large_cave_flooded",   large_cave_flooded);
        settings->getFloatNoEx("mgv7_float_mount_density",  float_mount_density);
        settings->getFloatNoEx("mgv7_float_mount_height",   float_mount_height);
        settings->getFloatNoEx("mgv7_float_mount_exponent", float_mount_exponent);
@@ -196,6 +208,7 @@ void MapgenV7Params::readParams(const Settings *settings)
        settings->getNoiseParams("mgv7_np_cavern",            np_cavern);
        settings->getNoiseParams("mgv7_np_cave1",             np_cave1);
        settings->getNoiseParams("mgv7_np_cave2",             np_cave2);
+       settings->getNoiseParams("mgv7_np_dungeons",          np_dungeons);
 }
 
 
@@ -206,6 +219,11 @@ void MapgenV7Params::writeParams(Settings *settings) const
        settings->setFloat("mgv7_cave_width",           cave_width);
        settings->setS16("mgv7_large_cave_depth",       large_cave_depth);
        settings->setS16("mgv7_lava_depth",             lava_depth);
+       settings->setU16("mgv7_small_cave_num_min",     small_cave_num_min);
+       settings->setU16("mgv7_small_cave_num_max",     small_cave_num_max);
+       settings->setU16("mgv7_large_cave_num_min",     large_cave_num_min);
+       settings->setU16("mgv7_large_cave_num_max",     large_cave_num_max);
+       settings->setFloat("mgv7_large_cave_flooded",   large_cave_flooded);
        settings->setFloat("mgv7_float_mount_density",  float_mount_density);
        settings->setFloat("mgv7_float_mount_height",   float_mount_height);
        settings->setFloat("mgv7_float_mount_exponent", float_mount_exponent);
@@ -231,6 +249,7 @@ void MapgenV7Params::writeParams(Settings *settings) const
        settings->setNoiseParams("mgv7_np_cavern",            np_cavern);
        settings->setNoiseParams("mgv7_np_cave1",             np_cave1);
        settings->setNoiseParams("mgv7_np_cave2",             np_cave2);
+       settings->setNoiseParams("mgv7_np_dungeons",          np_dungeons);
 }
 
 
@@ -326,8 +345,10 @@ void MapgenV7::makeChunk(BlockMakeData *data)
        updateHeightmap(node_min, node_max);
 
        // Init biome generator, place biome-specific nodes, and build biomemap
-       biomegen->calcBiomeNoise(node_min);
-       generateBiomes();
+       if (flags & MG_BIOMES) {
+               biomegen->calcBiomeNoise(node_min);
+               generateBiomes();
+       }
 
        // Generate tunnels, caverns and large randomwalk caves
        if (flags & MG_CAVES) {
@@ -350,6 +371,9 @@ void MapgenV7::makeChunk(BlockMakeData *data)
                        generateCavesRandomWalk(stone_surface_max_y, large_cave_depth);
        }
 
+       // Generate the registered ores
+       m_emerge->oremgr->placeAllOres(this, blockseed, node_min, node_max);
+
        // Generate dungeons
        if ((flags & MG_DUNGEONS) && full_node_min.Y >= dungeon_ymin &&
                        full_node_max.Y <= dungeon_ymax)
@@ -359,11 +383,9 @@ void MapgenV7::makeChunk(BlockMakeData *data)
        if (flags & MG_DECORATIONS)
                m_emerge->decomgr->placeAllDecos(this, blockseed, node_min, node_max);
 
-       // Generate the registered ores
-       m_emerge->oremgr->placeAllOres(this, blockseed, node_min, node_max);
-
        // Sprinkle some dust on top after everything else was generated
-       dustTopNodes();
+       if (flags & MG_BIOMES)
+               dustTopNodes();
 
        // Update liquids
        updateLiquid(&data->transforming_liquid, full_node_min, full_node_max);
@@ -591,6 +613,11 @@ void MapgenV7::generateRidgeTerrain()
                        float uwatern = noise_ridge_uwater->result[index2d] * 2.0f;
                        if (std::fabs(uwatern) > width)
                                continue;
+                       // Optimises, but also avoids removing nodes placed by mods in
+                       // 'on-generated', when generating outside mapchunk.
+                       content_t c = vm->m_data[vi].getContent();
+                       if (c != c_stone)
+                               continue;
 
                        float altitude = y - water_level;
                        float height_mod = (altitude + 17.0f) / 2.5f;