]> git.lizzy.rs Git - minetest.git/blobdiff - src/mapgen.cpp
Prevent SIGFPE on entity tile loading issue. (#5178)
[minetest.git] / src / mapgen.cpp
index e45233b33199b9ec38aca193c5591540d6d011ea..00ae917a1006d96a1f852be8a6027555736d6abb 100644 (file)
@@ -50,10 +50,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "dungeongen.h"
 
 FlagDesc flagdesc_mapgen[] = {
-       {"trees",       MG_TREES},
        {"caves",       MG_CAVES},
        {"dungeons",    MG_DUNGEONS},
-       {"flat",        MG_FLAT},
        {"light",       MG_LIGHT},
        {"decorations", MG_DECORATIONS},
        {NULL,       0}
@@ -176,26 +174,26 @@ Mapgen *Mapgen::createMapgen(MapgenType mgtype, int mgid,
 {
        switch (mgtype) {
        case MAPGEN_FLAT:
-               return new MapgenFlat(mgid, params, emerge);
+               return new MapgenFlat(mgid, (MapgenFlatParams *)params, emerge);
        case MAPGEN_FRACTAL:
-               return new MapgenFractal(mgid, params, emerge);
+               return new MapgenFractal(mgid, (MapgenFractalParams *)params, emerge);
        case MAPGEN_SINGLENODE:
-               return new MapgenSinglenode(mgid, params, emerge);
+               return new MapgenSinglenode(mgid, (MapgenSinglenodeParams *)params, emerge);
        case MAPGEN_V5:
-               return new MapgenV5(mgid, params, emerge);
+               return new MapgenV5(mgid, (MapgenV5Params *)params, emerge);
        case MAPGEN_V6:
-               return new MapgenV6(mgid, params, emerge);
+               return new MapgenV6(mgid, (MapgenV6Params *)params, emerge);
        case MAPGEN_V7:
-               return new MapgenV7(mgid, params, emerge);
+               return new MapgenV7(mgid, (MapgenV7Params *)params, emerge);
        case MAPGEN_VALLEYS:
-               return new MapgenValleys(mgid, params, emerge);
+               return new MapgenValleys(mgid, (MapgenValleysParams *)params, emerge);
        default:
                return NULL;
        }
 }
 
 
-MapgenSpecificParams *Mapgen::createMapgenParams(MapgenType mgtype)
+MapgenParams *Mapgen::createMapgenParams(MapgenType mgtype)
 {
        switch (mgtype) {
        case MAPGEN_FLAT:
@@ -589,23 +587,24 @@ MapgenBasic::MapgenBasic(int mapgenid, MapgenParams *params, EmergeManager *emer
 
        //// Look up some commonly used content
        c_stone              = ndef->getId("mapgen_stone");
-       c_water_source       = ndef->getId("mapgen_water_source");
        c_desert_stone       = ndef->getId("mapgen_desert_stone");
        c_sandstone          = ndef->getId("mapgen_sandstone");
+       c_water_source       = ndef->getId("mapgen_water_source");
        c_river_water_source = ndef->getId("mapgen_river_water_source");
 
        // Fall back to more basic content if not defined
+       // river_water_source cannot fallback to water_source because river water
+       // needs to be non-renewable and have a short flow range.
        if (c_desert_stone == CONTENT_IGNORE)
                c_desert_stone = c_stone;
        if (c_sandstone == CONTENT_IGNORE)
                c_sandstone = c_stone;
-       if (c_river_water_source == CONTENT_IGNORE)
-               c_river_water_source = c_water_source;
 
        //// Content used for dungeon generation
        c_cobble               = ndef->getId("mapgen_cobble");
-       c_stair_cobble         = ndef->getId("mapgen_stair_cobble");
        c_mossycobble          = ndef->getId("mapgen_mossycobble");
+       c_stair_cobble         = ndef->getId("mapgen_stair_cobble");
+       c_stair_desert_stone   = ndef->getId("mapgen_stair_desert_stone");
        c_sandstonebrick       = ndef->getId("mapgen_sandstonebrick");
        c_stair_sandstonebrick = ndef->getId("mapgen_stair_sandstonebrick");
 
@@ -614,10 +613,12 @@ MapgenBasic::MapgenBasic(int mapgenid, MapgenParams *params, EmergeManager *emer
                c_mossycobble = c_cobble;
        if (c_stair_cobble == CONTENT_IGNORE)
                c_stair_cobble = c_cobble;
+       if (c_stair_desert_stone == CONTENT_IGNORE)
+               c_stair_desert_stone = c_desert_stone;
        if (c_sandstonebrick == CONTENT_IGNORE)
                c_sandstonebrick = c_sandstone;
        if (c_stair_sandstonebrick == CONTENT_IGNORE)
-               c_stair_sandstonebrick = c_sandstone;
+               c_stair_sandstonebrick = c_sandstonebrick;
 }
 
 
@@ -869,7 +870,7 @@ void MapgenBasic::generateDungeons(s16 max_stone_y, MgStoneType stone_type)
        case MGSTONE_DESERT_STONE:
                dp.c_wall     = c_desert_stone;
                dp.c_alt_wall = CONTENT_IGNORE;
-               dp.c_stair    = c_desert_stone;
+               dp.c_stair    = c_stair_desert_stone;
 
                dp.diagonal_dirs = true;
                dp.holesize      = v3s16(2, 3, 2);
@@ -879,7 +880,7 @@ void MapgenBasic::generateDungeons(s16 max_stone_y, MgStoneType stone_type)
        case MGSTONE_SANDSTONE:
                dp.c_wall     = c_sandstonebrick;
                dp.c_alt_wall = CONTENT_IGNORE;
-               dp.c_stair    = c_sandstonebrick;
+               dp.c_stair    = c_stair_sandstonebrick;
 
                dp.diagonal_dirs = false;
                dp.holesize      = v3s16(2, 2, 2);
@@ -970,52 +971,46 @@ void GenerateNotifier::getEvents(
 MapgenParams::~MapgenParams()
 {
        delete bparams;
-       delete sparams;
 }
 
 
-void MapgenParams::load(const Settings &settings)
+void MapgenParams::readParams(const Settings *settings)
 {
        std::string seed_str;
-       const char *seed_name = (&settings == g_settings) ? "fixed_map_seed" : "seed";
+       const char *seed_name = (settings == g_settings) ? "fixed_map_seed" : "seed";
 
-       if (settings.getNoEx(seed_name, seed_str) && !seed_str.empty())
-               seed = read_seed(seed_str.c_str());
-       else
-               myrand_bytes(&seed, sizeof(seed));
+       if (settings->getNoEx(seed_name, seed_str)) {
+               if (!seed_str.empty())
+                       seed = read_seed(seed_str.c_str());
+               else
+                       myrand_bytes(&seed, sizeof(seed));
+       }
 
-       settings.getNoEx("mg_name", mg_name);
-       settings.getS16NoEx("water_level", water_level);
-       settings.getS16NoEx("chunksize", chunksize);
-       settings.getFlagStrNoEx("mg_flags", flags, flagdesc_mapgen);
+       std::string mg_name;
+       if (settings->getNoEx("mg_name", mg_name))
+               this->mgtype = Mapgen::getMapgenType(mg_name);
+
+       settings->getS16NoEx("water_level", water_level);
+       settings->getS16NoEx("chunksize", chunksize);
+       settings->getFlagStrNoEx("mg_flags", flags, flagdesc_mapgen);
 
        delete bparams;
        bparams = BiomeManager::createBiomeParams(BIOMEGEN_ORIGINAL);
        if (bparams) {
-               bparams->readParams(&settings);
+               bparams->readParams(settings);
                bparams->seed = seed;
        }
-
-       delete sparams;
-       MapgenType mgtype = Mapgen::getMapgenType(mg_name);
-       if (mgtype != MAPGEN_INVALID) {
-               sparams = Mapgen::createMapgenParams(mgtype);
-               sparams->readParams(&settings);
-       }
 }
 
 
-void MapgenParams::save(Settings &settings) const
+void MapgenParams::writeParams(Settings *settings) const
 {
-       settings.set("mg_name", mg_name);
-       settings.setU64("seed", seed);
-       settings.setS16("water_level", water_level);
-       settings.setS16("chunksize", chunksize);
-       settings.setFlagStr("mg_flags", flags, flagdesc_mapgen, U32_MAX);
+       settings->set("mg_name", Mapgen::getMapgenName(mgtype));
+       settings->setU64("seed", seed);
+       settings->setS16("water_level", water_level);
+       settings->setS16("chunksize", chunksize);
+       settings->setFlagStr("mg_flags", flags, flagdesc_mapgen, U32_MAX);
 
        if (bparams)
-               bparams->writeParams(&settings);
-
-       if (sparams)
-               sparams->writeParams(&settings);
+               bparams->writeParams(settings);
 }