1 /* 2 Minetest 3 Copyright (C) 2015-2020 paramat 4 Copyright (C) 2014-2016 kwolekr, Ryan Kwolek <kwolekr@minetest.net> 5 6 This program is free software; you can redistribute it and/or modify 7 it under the terms of the GNU Lesser General Public License as published by 8 the Free Software Foundation; either version 2.1 of the License, or 9 (at your option) any later version. 10 11 This program is distributed in the hope that it will be useful, 12 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 GNU Lesser General Public License for more details. 15 16 You should have received a copy of the GNU Lesser General Public License along 17 with this program; if not, write to the Free Software Foundation, Inc., 18 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 19 */ 20 21 #pragma once 22 23 #include <unordered_set> 24 #include "objdef.h" 25 #include "noise.h" 26 #include "nodedef.h" 27 28 typedef u16 biome_t; // copy from mg_biome.h to avoid an unnecessary include 29 30 class Noise; 31 class Mapgen; 32 class MMVManip; 33 34 /////////////////// Ore generation flags 35 36 #define OREFLAG_ABSHEIGHT 0x01 // Non-functional but kept to not break flags 37 #define OREFLAG_PUFF_CLIFFS 0x02 38 #define OREFLAG_PUFF_ADDITIVE 0x04 39 #define OREFLAG_USE_NOISE 0x08 40 #define OREFLAG_USE_NOISE2 0x10 41 42 enum OreType { 43 ORE_SCATTER, 44 ORE_SHEET, 45 ORE_PUFF, 46 ORE_BLOB, 47 ORE_VEIN, 48 ORE_STRATUM, 49 }; 50 51 extern FlagDesc flagdesc_ore[]; 52 53 class Ore : public ObjDef, public NodeResolver { 54 public: 55 const bool needs_noise; 56 57 content_t c_ore; // the node to place 58 std::vector<content_t> c_wherein; // the nodes to be placed in 59 u32 clust_scarcity; // ore cluster has a 1-in-clust_scarcity chance of appearing at a node 60 s16 clust_num_ores; // how many ore nodes are in a chunk 61 s16 clust_size; // how large (in nodes) a chunk of ore is 62 s16 y_min; 63 s16 y_max; 64 u8 ore_param2; // to set node-specific attributes 65 u32 flags = 0; // attributes for this ore 66 float nthresh; // threshold for noise at which an ore is placed 67 NoiseParams np; // noise for distribution of clusters (NULL for uniform scattering) 68 Noise *noise = nullptr; 69 std::unordered_set<biome_t> biomes; 70 Ore(bool needs_noise)71 explicit Ore(bool needs_noise): needs_noise(needs_noise) {} 72 virtual ~Ore(); 73 74 virtual void resolveNodeNames(); 75 76 size_t placeOre(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax); 77 virtual void generate(MMVManip *vm, int mapseed, u32 blockseed, 78 v3s16 nmin, v3s16 nmax, biome_t *biomemap) = 0; 79 80 protected: 81 void cloneTo(Ore *def) const; 82 }; 83 84 class OreScatter : public Ore { 85 public: OreScatter()86 OreScatter() : Ore(false) {} 87 88 ObjDef *clone() const; 89 90 void generate(MMVManip *vm, int mapseed, u32 blockseed, 91 v3s16 nmin, v3s16 nmax, biome_t *biomemap) override; 92 }; 93 94 class OreSheet : public Ore { 95 public: OreSheet()96 OreSheet() : Ore(true) {} 97 98 ObjDef *clone() const; 99 100 u16 column_height_min; 101 u16 column_height_max; 102 float column_midpoint_factor; 103 104 void generate(MMVManip *vm, int mapseed, u32 blockseed, 105 v3s16 nmin, v3s16 nmax, biome_t *biomemap) override; 106 }; 107 108 class OrePuff : public Ore { 109 public: 110 ObjDef *clone() const; 111 112 NoiseParams np_puff_top; 113 NoiseParams np_puff_bottom; 114 Noise *noise_puff_top = nullptr; 115 Noise *noise_puff_bottom = nullptr; 116 OrePuff()117 OrePuff() : Ore(true) {} 118 virtual ~OrePuff(); 119 120 void generate(MMVManip *vm, int mapseed, u32 blockseed, 121 v3s16 nmin, v3s16 nmax, biome_t *biomemap) override; 122 }; 123 124 class OreBlob : public Ore { 125 public: 126 ObjDef *clone() const; 127 OreBlob()128 OreBlob() : Ore(true) {} 129 void generate(MMVManip *vm, int mapseed, u32 blockseed, 130 v3s16 nmin, v3s16 nmax, biome_t *biomemap) override; 131 }; 132 133 class OreVein : public Ore { 134 public: 135 ObjDef *clone() const; 136 137 float random_factor; 138 Noise *noise2 = nullptr; 139 int sizey_prev = 0; 140 OreVein()141 OreVein() : Ore(true) {} 142 virtual ~OreVein(); 143 144 void generate(MMVManip *vm, int mapseed, u32 blockseed, 145 v3s16 nmin, v3s16 nmax, biome_t *biomemap) override; 146 }; 147 148 class OreStratum : public Ore { 149 public: 150 ObjDef *clone() const; 151 152 NoiseParams np_stratum_thickness; 153 Noise *noise_stratum_thickness = nullptr; 154 u16 stratum_thickness; 155 OreStratum()156 OreStratum() : Ore(false) {} 157 virtual ~OreStratum(); 158 159 void generate(MMVManip *vm, int mapseed, u32 blockseed, 160 v3s16 nmin, v3s16 nmax, biome_t *biomemap) override; 161 }; 162 163 class OreManager : public ObjDefManager { 164 public: 165 OreManager(IGameDef *gamedef); 166 virtual ~OreManager() = default; 167 168 OreManager *clone() const; 169 getObjectTitle()170 const char *getObjectTitle() const 171 { 172 return "ore"; 173 } 174 create(OreType type)175 static Ore *create(OreType type) 176 { 177 switch (type) { 178 case ORE_SCATTER: 179 return new OreScatter; 180 case ORE_SHEET: 181 return new OreSheet; 182 case ORE_PUFF: 183 return new OrePuff; 184 case ORE_BLOB: 185 return new OreBlob; 186 case ORE_VEIN: 187 return new OreVein; 188 case ORE_STRATUM: 189 return new OreStratum; 190 default: 191 return nullptr; 192 } 193 } 194 195 void clear(); 196 197 size_t placeAllOres(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax); 198 199 private: OreManager()200 OreManager() {}; 201 }; 202