X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fmapgen.h;h=653b79ed82b56adda6519a59847b4a6e5ec9096e;hb=9762650f978cc7bae78861b70a051b26cc5e2dc6;hp=3ec14829626aed22809ef037f8a66e521f2a4181;hpb=9b5c492be57945c2df63e84ce8dbf057f45b2754;p=minetest.git diff --git a/src/mapgen.h b/src/mapgen.h index 3ec148296..653b79ed8 100644 --- a/src/mapgen.h +++ b/src/mapgen.h @@ -26,16 +26,19 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "util/string.h" #include "util/container.h" -#define DEFAULT_MAPGEN "v6" +#define MAPGEN_DEFAULT MAPGEN_V7 +#define MAPGEN_DEFAULT_NAME "v7" /////////////////// Mapgen flags -#define MG_TREES 0x01 +#define MG_TREES 0x01 // Deprecated. Moved into mgv6 flags #define MG_CAVES 0x02 #define MG_DUNGEONS 0x04 -#define MG_FLAT 0x08 +#define MG_FLAT 0x08 // Deprecated. Moved into mgv6 flags #define MG_LIGHT 0x10 #define MG_DECORATIONS 0x20 +typedef u8 biome_t; // copy from mg_biome.h to avoid an unnecessary include + class Settings; class MMVManip; class INodeDefManager; @@ -105,37 +108,42 @@ class GenerateNotifier { std::list m_notify_events; }; -struct MapgenSpecificParams { - virtual void readParams(const Settings *settings) = 0; - virtual void writeParams(Settings *settings) const = 0; - virtual ~MapgenSpecificParams() {} +enum MapgenType { + MAPGEN_V5, + MAPGEN_V6, + MAPGEN_V7, + MAPGEN_FLAT, + MAPGEN_FRACTAL, + MAPGEN_VALLEYS, + MAPGEN_SINGLENODE, + MAPGEN_INVALID, }; struct MapgenParams { - std::string mg_name; + MapgenType mgtype; s16 chunksize; u64 seed; s16 water_level; + s16 mapgen_limit; u32 flags; BiomeParams *bparams; - MapgenSpecificParams *sparams; MapgenParams() : - mg_name(DEFAULT_MAPGEN), + mgtype(MAPGEN_DEFAULT), chunksize(5), seed(0), water_level(1), + mapgen_limit(MAX_MAP_GENERATION_LIMIT), flags(MG_CAVES | MG_LIGHT | MG_DECORATIONS), - bparams(NULL), - sparams(NULL) + bparams(NULL) { } virtual ~MapgenParams(); - void load(const Settings &settings); - void save(Settings &settings) const; + virtual void readParams(const Settings *settings); + virtual void writeParams(Settings *settings) const; }; @@ -150,8 +158,9 @@ struct MapgenParams { */ class Mapgen { public: - int seed; + s32 seed; int water_level; + int mapgen_limit; u32 flags; bool generating; int id; @@ -161,7 +170,7 @@ class Mapgen { u32 blockseed; s16 *heightmap; - u8 *biomemap; + biome_t *biomemap; v3s16 csize; BiomeGen *biomegen; @@ -171,8 +180,10 @@ class Mapgen { Mapgen(int mapgenid, MapgenParams *params, EmergeManager *emerge); virtual ~Mapgen(); - static u32 getBlockSeed(v3s16 p, int seed); - static u32 getBlockSeed2(v3s16 p, int seed); + virtual MapgenType getType() const { return MAPGEN_INVALID; } + + static u32 getBlockSeed(v3s16 p, s32 seed); + static u32 getBlockSeed2(v3s16 p, s32 seed); s16 findGroundLevelFull(v2s16 p2d); s16 findGroundLevel(v2s16 p2d, s16 ymin, s16 ymax); s16 findLiquidSurface(v2s16 p2d, s16 ymin, s16 ymax); @@ -196,7 +207,19 @@ class Mapgen { // signify this and to cause Server::findSpawnPos() to try another (X, Z). virtual int getSpawnLevelAtPoint(v2s16 p) { return 0; } + // Mapgen management functions + static MapgenType getMapgenType(const std::string &mgname); + static const char *getMapgenName(MapgenType mgtype); + static Mapgen *createMapgen(MapgenType mgtype, int mgid, + MapgenParams *params, EmergeManager *emerge); + static MapgenParams *createMapgenParams(MapgenType mgtype); + static void getMapgenNames(std::vector *mgnames, bool include_hidden); + private: + // isLiquidHorizontallyFlowable() is a helper function for updateLiquid() + // that checks whether there are floodable nodes without liquid beneath + // the node at index vi. + inline bool isLiquidHorizontallyFlowable(u32 vi, v3s16 em); DISABLE_CLASS_COPY(Mapgen); }; @@ -216,40 +239,56 @@ class Mapgen { */ class MapgenBasic : public Mapgen { public: + MapgenBasic(int mapgenid, MapgenParams *params, EmergeManager *emerge); + virtual ~MapgenBasic(); + + virtual void generateCaves(s16 max_stone_y, s16 large_cave_depth); + virtual bool generateCaverns(s16 max_stone_y); + virtual void generateDungeons(s16 max_stone_y, MgStoneType stone_type); + virtual MgStoneType generateBiomes(); + virtual void dustTopNodes(); + +protected: EmergeManager *m_emerge; - BiomeManager *bmgr; + BiomeManager *m_bmgr; Noise *noise_filler_depth; - Noise *noise_cave1; - Noise *noise_cave2; v3s16 node_min; v3s16 node_max; v3s16 full_node_min; v3s16 full_node_max; + // Content required for generateBiomes content_t c_stone; - content_t c_water_source; - content_t c_river_water_source; content_t c_desert_stone; content_t c_sandstone; + content_t c_water_source; + content_t c_river_water_source; + content_t c_lava_source; + + // Content required for generateDungeons + content_t c_cobble; + content_t c_stair_cobble; + content_t c_mossycobble; + content_t c_stair_desert_stone; + content_t c_sandstonebrick; + content_t c_stair_sandstone_block; int ystride; + int zstride; int zstride_1d; - float cave_width; + int zstride_1u1d; - MapgenBasic(int mapgenid, MapgenParams *params, EmergeManager *emerge); + u32 spflags; - virtual MgStoneType generateBiomes(); - virtual void dustTopNodes(); - virtual void generateCaves(s16 max_stone_y, s16 large_cave_depth); -}; - -struct MapgenFactory { - virtual Mapgen *createMapgen(int mgid, MapgenParams *params, - EmergeManager *emerge) = 0; - virtual MapgenSpecificParams *createMapgenParams() = 0; - virtual ~MapgenFactory() {} + NoiseParams np_cave1; + NoiseParams np_cave2; + NoiseParams np_cavern; + float cave_width; + float cavern_limit; + float cavern_taper; + float cavern_threshold; }; #endif