]> git.lizzy.rs Git - dragonfireclient.git/blobdiff - src/mapgen/mapgen_v6.cpp
mapgen: drop mapgen id from child mapgens.
[dragonfireclient.git] / src / mapgen / mapgen_v6.cpp
index 6dcf834d26c957578ecc7d2793321ca4db3cfd79..2b73c2975b1da15fdff944c163668605027d6146 100644 (file)
@@ -1,8 +1,8 @@
 /*
 Minetest
-Copyright (C) 2010-2015 celeron55, Perttu Ahola <celeron55@gmail.com>
-Copyright (C) 2013-2016 kwolekr, Ryan Kwolek <kwolekr@minetest.net>
-Copyright (C) 2014-2017 paramat
+Copyright (C) 2010-2018 celeron55, Perttu Ahola <celeron55@gmail.com>
+Copyright (C) 2013-2018 kwolekr, Ryan Kwolek <kwolekr@minetest.net>
+Copyright (C) 2014-2018 paramat
 
 This program is free software; you can redistribute it and/or modify
 it under the terms of the GNU Lesser General Public License as published by
@@ -55,17 +55,19 @@ FlagDesc flagdesc_mapgen_v6[] = {
 /////////////////////////////////////////////////////////////////////////////
 
 
-MapgenV6::MapgenV6(int mapgenid, MapgenV6Params *params, EmergeManager *emerge)
-       : Mapgen(mapgenid, params, emerge)
+MapgenV6::MapgenV6(MapgenV6Params *params, EmergeManager *emerge)
+       : Mapgen(MAPGEN_V6, params, emerge)
 {
        m_emerge = emerge;
        ystride = csize.X; //////fix this
 
        heightmap = new s16[csize.X * csize.Z];
 
-       spflags     = params->spflags;
-       freq_desert = params->freq_desert;
-       freq_beach  = params->freq_beach;
+       spflags      = params->spflags;
+       freq_desert  = params->freq_desert;
+       freq_beach   = params->freq_beach;
+       dungeon_ymin = params->dungeon_ymin;
+       dungeon_ymax = params->dungeon_ymax;
 
        np_cave        = &params->np_cave;
        np_humidity    = &params->np_humidity;
@@ -85,7 +87,7 @@ MapgenV6::MapgenV6(int mapgenid, MapgenV6Params *params, EmergeManager *emerge)
                        csize.X + 2 * MAP_BLOCKSIZE, csize.Y + 2 * MAP_BLOCKSIZE);
 
        //// Resolve nodes to be used
-       INodeDefManager *ndef = emerge->ndef;
+       const NodeDefManager *ndef = emerge->ndef;
 
        c_stone           = ndef->getId("mapgen_stone");
        c_dirt            = ndef->getId("mapgen_dirt");
@@ -166,6 +168,8 @@ void MapgenV6Params::readParams(const Settings *settings)
        settings->getFlagStrNoEx("mgv6_spflags", spflags, flagdesc_mapgen_v6);
        settings->getFloatNoEx("mgv6_freq_desert", freq_desert);
        settings->getFloatNoEx("mgv6_freq_beach",  freq_beach);
+       settings->getS16NoEx("mgv6_dungeon_ymin",  dungeon_ymin);
+       settings->getS16NoEx("mgv6_dungeon_ymax",  dungeon_ymax);
 
        settings->getNoiseParams("mgv6_np_terrain_base",   np_terrain_base);
        settings->getNoiseParams("mgv6_np_terrain_higher", np_terrain_higher);
@@ -186,6 +190,8 @@ void MapgenV6Params::writeParams(Settings *settings) const
        settings->setFlagStr("mgv6_spflags", spflags, flagdesc_mapgen_v6, U32_MAX);
        settings->setFloat("mgv6_freq_desert", freq_desert);
        settings->setFloat("mgv6_freq_beach",  freq_beach);
+       settings->setS16("mgv6_dungeon_ymin",  dungeon_ymin);
+       settings->setS16("mgv6_dungeon_ymax",  dungeon_ymax);
 
        settings->setNoiseParams("mgv6_np_terrain_base",   np_terrain_base);
        settings->setNoiseParams("mgv6_np_terrain_higher", np_terrain_higher);
@@ -217,7 +223,7 @@ s16 MapgenV6::find_stone_level(v2s16 p2d)
                if (c != CONTENT_IGNORE && (c == c_stone || c == c_desert_stone))
                        break;
 
-               vm->m_area.add_y(em, i, -1);
+               VoxelArea::add_y(em, i, -1);
        }
        return (y >= y_nodes_min) ? y : y_nodes_min - 1;
 }
@@ -553,20 +559,16 @@ void MapgenV6::makeChunk(BlockMakeData *data)
        updateHeightmap(node_min, node_max);
 
        // Add dungeons
-       if ((flags & MG_DUNGEONS) && (stone_surface_max_y >= node_min.Y)) {
+       if ((flags & MG_DUNGEONS) && stone_surface_max_y >= node_min.Y &&
+                       full_node_min.Y >= dungeon_ymin && full_node_max.Y <= dungeon_ymax) {
                DungeonParams dp;
 
                dp.seed             = seed;
-               dp.c_water          = c_water_source;
-               dp.c_river_water    = c_water_source;
-
                dp.only_in_ground   = true;
                dp.corridor_len_min = 1;
                dp.corridor_len_max = 13;
                dp.rooms_min        = 2;
                dp.rooms_max        = 16;
-               dp.y_min            = -MAX_MAP_GENERATION_LIMIT;
-               dp.y_max            = MAX_MAP_GENERATION_LIMIT;
 
                dp.np_density
                        = NoiseParams(0.9, 0.5, v3f(500.0, 500.0, 500.0), 0, 2, 0.8, 2.0);
@@ -691,7 +693,7 @@ int MapgenV6::generateGround()
                                        vm->m_data[i] = n_air;
                                }
                        }
-                       vm->m_area.add_y(em, i, 1);
+                       VoxelArea::add_y(em, i, 1);
                }
        }
 
@@ -754,7 +756,7 @@ void MapgenV6::addMud()
                        vm->m_data[i] = addnode;
                        mudcount++;
 
-                       vm->m_area.add_y(em, i, 1);
+                       VoxelArea::add_y(em, i, 1);
                }
        }
 }
@@ -794,7 +796,7 @@ void MapgenV6::flowMud(s16 &mudflow_minpos, s16 &mudflow_maxpos)
                                                        n->getContent() == c_gravel)
                                                break;
 
-                                       vm->m_area.add_y(em, i, -1);
+                                       VoxelArea::add_y(em, i, -1);
                                }
 
                                // Stop if out of area
@@ -810,7 +812,7 @@ void MapgenV6::flowMud(s16 &mudflow_minpos, s16 &mudflow_maxpos)
                                        // Don't flow it if the stuff under it is not mud
                                        {
                                                u32 i2 = i;
-                                               vm->m_area.add_y(em, i2, -1);
+                                               VoxelArea::add_y(em, i2, -1);
                                                // Cancel if out of area
                                                if (!vm->m_area.contains(i2))
                                                        continue;
@@ -821,7 +823,7 @@ void MapgenV6::flowMud(s16 &mudflow_minpos, s16 &mudflow_maxpos)
                                        }
                                }
 
-                               v3s16 dirs4[4] = {
+                               static const v3s16 dirs4[4] = {
                                        v3s16(0, 0, 1), // back
                                        v3s16(1, 0, 0), // right
                                        v3s16(0, 0, -1), // front
@@ -831,7 +833,7 @@ void MapgenV6::flowMud(s16 &mudflow_minpos, s16 &mudflow_maxpos)
                                // Check that upper is walkable. Cancel
                                // dropping if upper keeps it in place.
                                u32 i3 = i;
-                               vm->m_area.add_y(em, i3, 1);
+                               VoxelArea::add_y(em, i3, 1);
                                MapNode *n3 = NULL;
 
                                if (vm->m_area.contains(i3)) {
@@ -844,7 +846,7 @@ void MapgenV6::flowMud(s16 &mudflow_minpos, s16 &mudflow_maxpos)
                                for (const v3s16 &dirp : dirs4) {
                                        u32 i2 = i;
                                        // Move to side
-                                       vm->m_area.add_p(em, i2, dirp);
+                                       VoxelArea::add_p(em, i2, dirp);
                                        // Fail if out of area
                                        if (!vm->m_area.contains(i2))
                                                continue;
@@ -853,7 +855,7 @@ void MapgenV6::flowMud(s16 &mudflow_minpos, s16 &mudflow_maxpos)
                                        if (ndef->get(*n2).walkable)
                                                continue;
                                        // Check that under side is air
-                                       vm->m_area.add_y(em, i2, -1);
+                                       VoxelArea::add_y(em, i2, -1);
                                        if (!vm->m_area.contains(i2))
                                                continue;
                                        n2 = &vm->m_data[i2];
@@ -862,7 +864,7 @@ void MapgenV6::flowMud(s16 &mudflow_minpos, s16 &mudflow_maxpos)
                                        // Loop further down until not air
                                        bool dropped_to_unknown = false;
                                        do {
-                                               vm->m_area.add_y(em, i2, -1);
+                                               VoxelArea::add_y(em, i2, -1);
                                                n2 = &vm->m_data[i2];
                                                // if out of known area
                                                if (!vm->m_area.contains(i2) ||
@@ -872,7 +874,7 @@ void MapgenV6::flowMud(s16 &mudflow_minpos, s16 &mudflow_maxpos)
                                                }
                                        } while (!ndef->get(*n2).walkable);
                                        // Loop one up so that we're in air
-                                       vm->m_area.add_y(em, i2, 1);
+                                       VoxelArea::add_y(em, i2, 1);
 
                                        // Move mud to new place. Outside mapchunk remove
                                        // any decorations above removed or placed mud.
@@ -912,17 +914,17 @@ void MapgenV6::moveMud(u32 remove_index, u32 place_index,
                                vm->m_data[above_remove_index].getContent() != c_water_source &&
                                vm->m_data[above_remove_index].getContent() != CONTENT_IGNORE) {
                        vm->m_data[above_remove_index] = n_air;
-                       vm->m_area.add_y(em, above_remove_index, 1);
+                       VoxelArea::add_y(em, above_remove_index, 1);
                }
                // Mud placed may have partially-buried a stacked decoration, search
                // above and remove.
-               vm->m_area.add_y(em, place_index, 1);
+               VoxelArea::add_y(em, place_index, 1);
                while (vm->m_area.contains(place_index) &&
                                vm->m_data[place_index].getContent() != CONTENT_AIR &&
                                vm->m_data[place_index].getContent() != c_water_source &&
                                vm->m_data[place_index].getContent() != CONTENT_IGNORE) {
                        vm->m_data[place_index] = n_air;
-                       vm->m_area.add_y(em, place_index, 1);
+                       VoxelArea::add_y(em, place_index, 1);
                }
        }
 }
@@ -996,7 +998,7 @@ void MapgenV6::placeTreesAndJungleGrass()
                                u32 vi = vm->m_area.index(x, y, z);
                                // place on dirt_with_grass, since we know it is exposed to sunlight
                                if (vm->m_data[vi].getContent() == c_dirt_with_grass) {
-                                       vm->m_area.add_y(em, vi, 1);
+                                       VoxelArea::add_y(em, vi, 1);
                                        vm->m_data[vi] = n_junglegrass;
                                }
                        }
@@ -1066,7 +1068,7 @@ void MapgenV6::growGrass() // Add surface nodes
                                                ndef->get(n).liquid_type != LIQUID_NONE ||
                                                n.getContent() == c_ice)
                                        break;
-                               vm->m_area.add_y(em, i, -1);
+                               VoxelArea::add_y(em, i, -1);
                        }
                        surface_y = (y >= full_node_min.Y) ? y : full_node_min.Y;
                }
@@ -1080,10 +1082,10 @@ void MapgenV6::growGrass() // Add surface nodes
                        } else if (bt == BT_TUNDRA) {
                                if (c == c_dirt) {
                                        vm->m_data[i] = n_snowblock;
-                                       vm->m_area.add_y(em, i, -1);
+                                       VoxelArea::add_y(em, i, -1);
                                        vm->m_data[i] = n_dirt_with_snow;
                                } else if (c == c_stone && surface_y < node_max.Y) {
-                                       vm->m_area.add_y(em, i, 1);
+                                       VoxelArea::add_y(em, i, 1);
                                        vm->m_data[i] = n_snowblock;
                                }
                        } else if (c == c_dirt) {