/*
Minetest
-Copyright (C) 2010-2013 celeron55, Perttu Ahola <celeron55@gmail.com>
+Copyright (C) 2010-2015 celeron55, Perttu Ahola <celeron55@gmail.com>
+Copyright (C) 2013-2016 kwolekr, Ryan Kwolek <kwolekr@minetest.net>
+Copyright (C) 2015-2017 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
#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;
// TODO(hmmmm/paramat): make stone type selection dynamic
enum MgStoneType {
- STONE,
- DESERT_STONE,
- SANDSTONE,
+ MGSTONE_STONE,
+ MGSTONE_DESERT_STONE,
+ MGSTONE_SANDSTONE,
};
struct GenNotifyEvent {
bool peek_events=false);
private:
- u32 m_notify_on;
+ u32 m_notify_on = 0;
std::set<u32> *m_notify_on_deco_ids;
std::list<GenNotifyEvent> 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_CARPATHIAN,
+ MAPGEN_INVALID,
};
struct MapgenParams {
- std::string mg_name;
- s16 chunksize;
- u64 seed;
- s16 water_level;
- u32 flags;
-
- BiomeParams *bparams;
- MapgenSpecificParams *sparams;
-
- MapgenParams() :
- mg_name(DEFAULT_MAPGEN),
- chunksize(5),
- seed(0),
- water_level(1),
- flags(MG_CAVES | MG_LIGHT | MG_DECORATIONS),
- bparams(NULL),
- sparams(NULL)
- {
- }
-
+ MapgenParams() {}
virtual ~MapgenParams();
- void load(const Settings &settings);
- void save(Settings &settings) const;
+ MapgenType mgtype = MAPGEN_DEFAULT;
+ s16 chunksize = 5;
+ u64 seed = 0;
+ s16 water_level = 1;
+ s16 mapgen_limit = MAX_MAP_GENERATION_LIMIT;
+ u32 flags = MG_CAVES | MG_LIGHT | MG_DECORATIONS;
+
+ BiomeParams *bparams = nullptr;
+
+ s16 mapgen_edge_min = -MAX_MAP_GENERATION_LIMIT;
+ s16 mapgen_edge_max = MAX_MAP_GENERATION_LIMIT;
+
+ virtual void readParams(const Settings *settings);
+ virtual void writeParams(Settings *settings) const;
+
+ bool saoPosOverLimit(const v3f &p);
+ s32 getSpawnRangeMax();
+
+private:
+ void calcMapgenEdges();
+
+ float m_sao_limit_min = -MAX_MAP_GENERATION_LIMIT * BS;
+ float m_sao_limit_max = MAX_MAP_GENERATION_LIMIT * BS;
+ bool m_mapgen_edges_calculated = false;
};
*/
class Mapgen {
public:
- int seed;
- int water_level;
- u32 flags;
- bool generating;
- int id;
+ s32 seed = 0;
+ int water_level = 0;
+ int mapgen_limit = 0;
+ u32 flags = 0;
+ bool generating = false;
+ int id = -1;
- MMVManip *vm;
- INodeDefManager *ndef;
+ MMVManip *vm = nullptr;
+ INodeDefManager *ndef = nullptr;
u32 blockseed;
- s16 *heightmap;
- u8 *biomemap;
+ s16 *heightmap = nullptr;
+ biome_t *biomemap = nullptr;
v3s16 csize;
- BiomeGen *biomegen;
+ BiomeGen *biomegen = nullptr;
GenerateNotifier gennotify;
Mapgen();
Mapgen(int mapgenid, MapgenParams *params, EmergeManager *emerge);
virtual ~Mapgen();
+ DISABLE_CLASS_COPY(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);
// 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<const char *> *mgnames, bool include_hidden);
+
private:
- DISABLE_CLASS_COPY(Mapgen);
+ // 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);
};
/*
*/
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;
-
- MapgenBasic(int mapgenid, MapgenParams *params, EmergeManager *emerge);
+ int zstride_1u1d;
- virtual MgStoneType generateBiomes();
- virtual void dustTopNodes();
- virtual void generateCaves(s16 max_stone_y, s16 large_cave_depth);
-};
+ u32 spflags;
-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;
+ int lava_depth;
};
#endif