Add Ore generation flags, implement ore absolute height

This commit is contained in:
kwolekr 2013-03-31 20:02:03 -04:00
parent 35ed5198fe
commit 8d4b768297
6 changed files with 72 additions and 9 deletions

@ -394,6 +394,13 @@ All default ores are of the uniformly-distributed scatter type.
Places ore if there are no more than clust_scarcity number of specified nodes within a Von Neumann Places ore if there are no more than clust_scarcity number of specified nodes within a Von Neumann
neighborhood of clust_size radius. neighborhood of clust_size radius.
Ore attributes
-------------------
Currently supported flags: absheight
- absheight
Also produce this same ore between the height range of -height_max and -height_min.
Useful for having ore in sky realms without having to duplicate ore entries.
Representations of simple things Representations of simple things
-------------------------------- --------------------------------
Position/vector: Position/vector:
@ -1723,6 +1730,8 @@ Ore definition (register_ore)
^ In this example, there is a 3x3x3 cluster where 8 out of the 27 nodes are coal ore ^ In this example, there is a 3x3x3 cluster where 8 out of the 27 nodes are coal ore
height_min = -31000, height_min = -31000,
height_max = 64, height_max = 64,
flags = "",
^ Attributes for this ore generation
noise_threshhold = 0.5, noise_threshhold = 0.5,
^ If noise is above this threshhold, ore is placed. Not needed for a uniform distribution ^ If noise is above this threshhold, ore is placed. Not needed for a uniform distribution
noise_params = {offset=0, scale=1, spread={x=100, y=100, z=100}, seed=23, octaves=3, persist=0.70} noise_params = {offset=0, scale=1, spread={x=100, y=100, z=100}, seed=23, octaves=3, persist=0.70}

@ -45,6 +45,13 @@ FlagDesc flagdesc_mapgen[] = {
{NULL, 0} {NULL, 0}
}; };
FlagDesc flagdesc_ore[] = {
{"absheight", OREFLAG_ABSHEIGHT},
{"scatter_noisedensity", OREFLAG_DENSITY},
{"claylike_nodeisnt", OREFLAG_NODEISNT},
{NULL, 0}
};
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
@ -87,7 +94,12 @@ void Ore::resolveNodeNames(INodeDefManager *ndef) {
void OreScatter::generate(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax) { void OreScatter::generate(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax) {
if (nmin.Y > height_max || nmax.Y < height_min) int in_range = 0;
in_range |= (nmin.Y <= height_max && nmax.Y >= height_min);
if (flags & OREFLAG_ABSHEIGHT)
in_range |= (nmin.Y >= -height_max && nmax.Y <= -height_min) << 1;
if (!in_range)
return; return;
resolveNodeNames(mg->ndef); resolveNodeNames(mg->ndef);
@ -95,9 +107,15 @@ void OreScatter::generate(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax) {
MapNode n_ore(ore); MapNode n_ore(ore);
ManualMapVoxelManipulator *vm = mg->vm; ManualMapVoxelManipulator *vm = mg->vm;
PseudoRandom pr(blockseed); PseudoRandom pr(blockseed);
int ymin, ymax;
int ymin = MYMAX(nmin.Y, height_min); if (in_range & ORE_RANGE_MIRROR) {
int ymax = MYMIN(nmax.Y, height_max); ymin = MYMAX(nmin.Y, -height_max);
ymax = MYMIN(nmax.Y, -height_min);
} else {
ymin = MYMAX(nmin.Y, height_min);
ymax = MYMIN(nmax.Y, height_max);
}
if (clust_size >= ymax - ymin + 1) if (clust_size >= ymax - ymin + 1)
return; return;
@ -131,7 +149,12 @@ void OreScatter::generate(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax) {
void OreSheet::generate(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax) { void OreSheet::generate(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax) {
if (nmin.Y > height_max || nmax.Y < height_min) int in_range = 0;
in_range |= (nmin.Y <= height_max && nmax.Y >= height_min);
if (flags & OREFLAG_ABSHEIGHT)
in_range |= (nmin.Y >= -height_max && nmax.Y <= -height_min) << 1;
if (!in_range)
return; return;
resolveNodeNames(mg->ndef); resolveNodeNames(mg->ndef);
@ -139,9 +162,16 @@ void OreSheet::generate(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax) {
MapNode n_ore(ore); MapNode n_ore(ore);
ManualMapVoxelManipulator *vm = mg->vm; ManualMapVoxelManipulator *vm = mg->vm;
PseudoRandom pr(blockseed + 4234); PseudoRandom pr(blockseed + 4234);
int ymin, ymax;
if (in_range & ORE_RANGE_MIRROR) {
ymin = MYMAX(nmin.Y, -height_max);
ymax = MYMIN(nmax.Y, -height_min);
} else {
ymin = MYMAX(nmin.Y, height_min);
ymax = MYMIN(nmax.Y, height_max);
}
int ymin = MYMAX(nmin.Y, height_min);
int ymax = MYMIN(nmax.Y, height_max);
if (clust_size >= ymax - ymin + 1) if (clust_size >= ymax - ymin + 1)
return; return;

@ -36,7 +36,17 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#define MGV6_BIOME_BLEND 0x10 #define MGV6_BIOME_BLEND 0x10
#define MG_FLAT 0x20 #define MG_FLAT 0x20
/////////////////// 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
extern FlagDesc flagdesc_mapgen[]; extern FlagDesc flagdesc_mapgen[];
extern FlagDesc flagdesc_ore[];
class BiomeDefManager; class BiomeDefManager;
class Biome; class Biome;
@ -103,6 +113,9 @@ enum OreType {
ORE_CLAYLIKE ORE_CLAYLIKE
}; };
#define ORE_RANGE_ACTUAL 1
#define ORE_RANGE_MIRROR 2
class Ore { class Ore {
public: public:
std::string ore_name; std::string ore_name;
@ -115,6 +128,7 @@ public:
s16 clust_size; // how large (in nodes) a chunk of ore is s16 clust_size; // how large (in nodes) a chunk of ore is
s16 height_min; s16 height_min;
s16 height_max; s16 height_max;
u32 flags; // attributes for this ore
float nthresh; // threshhold for noise at which an ore is placed float nthresh; // threshhold for noise at which an ore is placed
NoiseParams *np; // noise for distribution of clusters (NULL for uniform scattering) NoiseParams *np; // noise for distribution of clusters (NULL for uniform scattering)
Noise *noise; Noise *noise;

@ -717,6 +717,7 @@ static int l_register_ore(lua_State *L)
ore->clust_size = getintfield_default(L, index, "clust_size", 0); ore->clust_size = getintfield_default(L, index, "clust_size", 0);
ore->height_min = getintfield_default(L, index, "height_min", 0); ore->height_min = getintfield_default(L, index, "height_min", 0);
ore->height_max = getintfield_default(L, index, "height_max", 0); ore->height_max = getintfield_default(L, index, "height_max", 0);
ore->flags = getflagsfield(L, index, "flags", flagdesc_ore);
ore->nthresh = getfloatfield_default(L, index, "noise_threshhold", 0.); ore->nthresh = getfloatfield_default(L, index, "noise_threshhold", 0.);
lua_getfield(L, index, "noise_params"); lua_getfield(L, index, "noise_params");

@ -336,6 +336,13 @@ void setboolfield(lua_State *L, int table,
lua_setfield(L, table, fieldname); lua_setfield(L, table, fieldname);
} }
u32 getflagsfield(lua_State *L, int table,
const char *fieldname, FlagDesc *flagdesc) {
std::string flagstring;
flagstring = getstringfield_default(L, table, fieldname, "");
return readFlagString(flagstring, flagdesc);
}
/* minetest specific types */ /* minetest specific types */
MapNode readnode(lua_State *L, int index, INodeDefManager *ndef) MapNode readnode(lua_State *L, int index, INodeDefManager *ndef)

@ -51,6 +51,8 @@ bool getboolfield(lua_State *L, int table,
const char *fieldname, bool &result); const char *fieldname, bool &result);
bool getfloatfield(lua_State *L, int table, bool getfloatfield(lua_State *L, int table,
const char *fieldname, float &result); const char *fieldname, float &result);
u32 getflagsfield(lua_State *L, int table,
const char *fieldname, FlagDesc *flagdesc);
std::string checkstringfield(lua_State *L, int table, std::string checkstringfield(lua_State *L, int table,
const char *fieldname); const char *fieldname);