X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fmg_ore.h;h=e95fdd330dedeaaf0ee006f1cdea8dfba407197b;hb=3251e4493846e981b9dc707c635ee5f966f7d40c;hp=4bf415734af3f0c40c315dc28c38f46333833d10;hpb=8d3a68f343777c438b9caf9f646e913d4b66e046;p=dragonfireclient.git diff --git a/src/mg_ore.h b/src/mg_ore.h index 4bf415734..e95fdd330 100644 --- a/src/mg_ore.h +++ b/src/mg_ore.h @@ -20,96 +20,152 @@ with this program; if not, write to the Free Software Foundation, Inc., #ifndef MG_ORE_HEADER #define MG_ORE_HEADER -#include "util/string.h" -#include "mapgen.h" +#include "util/cpp11_container.h" +#include "objdef.h" +#include "noise.h" +#include "nodedef.h" -class NoiseParams; class Noise; class Mapgen; -class ManualMapVoxelManipulator; +class MMVManip; /////////////////// Ore generation flags -// Use absolute value of height to determine ore placement -#define OREFLAG_ABSHEIGHT 0x01 - -// Use 3d noise to get density of ore placement, instead of just the position -#define OREFLAG_DENSITY 0x02 // not yet implemented - -// For claylike ore types, place ore if the number of surrounding -// nodes isn't the specified node -#define OREFLAG_NODEISNT 0x04 // not yet implemented +#define OREFLAG_ABSHEIGHT 0x01 +#define OREFLAG_PUFF_CLIFFS 0x02 +#define OREFLAG_PUFF_ADDITIVE 0x04 +#define OREFLAG_USE_NOISE 0x08 #define ORE_RANGE_ACTUAL 1 #define ORE_RANGE_MIRROR 2 - enum OreType { ORE_SCATTER, ORE_SHEET, - ORE_CLAYLIKE + ORE_PUFF, + ORE_BLOB, + ORE_VEIN, }; extern FlagDesc flagdesc_ore[]; -class Ore : public GenElement { +class Ore : public ObjDef, public NodeResolver { public: + static const bool NEEDS_NOISE = false; + content_t c_ore; // the node to place std::vector c_wherein; // the nodes to be placed in u32 clust_scarcity; // ore cluster has a 1-in-clust_scarcity chance of appearing at a node s16 clust_num_ores; // how many ore nodes are in a chunk s16 clust_size; // how large (in nodes) a chunk of ore is - s16 height_min; - s16 height_max; + s16 y_min; + s16 y_max; u8 ore_param2; // to set node-specific attributes u32 flags; // attributes for this ore - float nthresh; // threshhold for noise at which an ore is placed - NoiseParams *np; // noise for distribution of clusters (NULL for uniform scattering) + float nthresh; // threshold for noise at which an ore is placed + NoiseParams np; // noise for distribution of clusters (NULL for uniform scattering) Noise *noise; + UNORDERED_SET biomes; Ore(); virtual ~Ore(); + virtual void resolveNodeNames(); + size_t placeOre(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax); - virtual void generate(ManualMapVoxelManipulator *vm, int seed, - u32 blockseed, v3s16 nmin, v3s16 nmax) = 0; + virtual void generate(MMVManip *vm, int mapseed, u32 blockseed, + v3s16 nmin, v3s16 nmax, u8 *biomemap) = 0; }; class OreScatter : public Ore { - virtual ~OreScatter() {} - virtual void generate(ManualMapVoxelManipulator *vm, int seed, - u32 blockseed, v3s16 nmin, v3s16 nmax); +public: + static const bool NEEDS_NOISE = false; + + virtual void generate(MMVManip *vm, int mapseed, u32 blockseed, + v3s16 nmin, v3s16 nmax, u8 *biomemap); }; class OreSheet : public Ore { - virtual ~OreSheet() {} - virtual void generate(ManualMapVoxelManipulator *vm, int seed, - u32 blockseed, v3s16 nmin, v3s16 nmax); +public: + static const bool NEEDS_NOISE = true; + + u16 column_height_min; + u16 column_height_max; + float column_midpoint_factor; + + virtual void generate(MMVManip *vm, int mapseed, u32 blockseed, + v3s16 nmin, v3s16 nmax, u8 *biomemap); }; -class OreManager : public GenElementManager { +class OrePuff : public Ore { public: - static const char *ELEMENT_TITLE; - static const size_t ELEMENT_LIMIT = 0x10000; + static const bool NEEDS_NOISE = true; + + NoiseParams np_puff_top; + NoiseParams np_puff_bottom; + Noise *noise_puff_top; + Noise *noise_puff_bottom; + + OrePuff(); + virtual ~OrePuff(); - OreManager(IGameDef *gamedef) {} - ~OreManager() {} + virtual void generate(MMVManip *vm, int mapseed, u32 blockseed, + v3s16 nmin, v3s16 nmax, u8 *biomemap); +}; + +class OreBlob : public Ore { +public: + static const bool NEEDS_NOISE = true; - Ore *create(int type) + virtual void generate(MMVManip *vm, int mapseed, u32 blockseed, + v3s16 nmin, v3s16 nmax, u8 *biomemap); +}; + +class OreVein : public Ore { +public: + static const bool NEEDS_NOISE = true; + + float random_factor; + Noise *noise2; + + OreVein(); + virtual ~OreVein(); + + virtual void generate(MMVManip *vm, int mapseed, u32 blockseed, + v3s16 nmin, v3s16 nmax, u8 *biomemap); +}; + +class OreManager : public ObjDefManager { +public: + OreManager(IGameDef *gamedef); + virtual ~OreManager() {} + + const char *getObjectTitle() const + { + return "ore"; + } + + static Ore *create(OreType type) { switch (type) { case ORE_SCATTER: return new OreScatter; case ORE_SHEET: return new OreSheet; - //case ORE_CLAYLIKE: //TODO: implement this! - // return new OreClaylike; + case ORE_PUFF: + return new OrePuff; + case ORE_BLOB: + return new OreBlob; + case ORE_VEIN: + return new OreVein; default: return NULL; } } - size_t placeAllOres(Mapgen *mg, u32 seed, v3s16 nmin, v3s16 nmax); + void clear(); + + size_t placeAllOres(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax); }; #endif