X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fmapgen.h;h=3c897e02315a58c58b3ea5d42d2e4d826070fb22;hb=58e6d25e033c76dc91aaac18fdeda92ac23fe0e1;hp=ba1ea86c3bed4eecfa7f3e5924b9b5b3420d2336;hpb=631a835e0782a2696762e3d55f75616f5a063394;p=oweals%2Fminetest.git diff --git a/src/mapgen.h b/src/mapgen.h index ba1ea86c3..3c897e023 100644 --- a/src/mapgen.h +++ b/src/mapgen.h @@ -1,6 +1,6 @@ /* -Minetest-c55 -Copyright (C) 2010-2011 celeron55, Perttu Ahola +Minetest +Copyright (C) 2010-2013 celeron55, Perttu Ahola 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 @@ -20,276 +20,316 @@ with this program; if not, write to the Free Software Foundation, Inc., #ifndef MAPGEN_HEADER #define MAPGEN_HEADER -#include "irrlichttypes_extrabloated.h" +#include "irrlichttypes_bloated.h" #include "util/container.h" // UniqueQueue #include "gamedef.h" +#include "nodedef.h" #include "mapnode.h" #include "noise.h" #include "settings.h" +#define DEFAULT_MAPGEN "v6" + /////////////////// Mapgen flags #define MG_TREES 0x01 #define MG_CAVES 0x02 #define MG_DUNGEONS 0x04 -#define MGV6_FORESTS 0x08 -#define MGV6_BIOME_BLEND 0x10 +#define MG_FLAT 0x08 +#define MG_LIGHT 0x10 + +/////////////////// 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 + +/////////////////// Decoration flags +#define DECO_PLACE_CENTER_X 1 +#define DECO_PLACE_CENTER_Y 2 +#define DECO_PLACE_CENTER_Z 4 + +#define ORE_RANGE_ACTUAL 1 +#define ORE_RANGE_MIRROR 2 -#define AVERAGE_MUD_AMOUNT 4 +#define NUM_GEN_NOTIFY 6 + + +extern FlagDesc flagdesc_mapgen[]; +extern FlagDesc flagdesc_ore[]; +extern FlagDesc flagdesc_deco_schematic[]; +extern FlagDesc flagdesc_gennotify[]; class BiomeDefManager; class Biome; - -//struct BlockMakeData; +class EmergeManager; class MapBlock; class ManualMapVoxelManipulator; class VoxelManipulator; -class INodeDefManager; - -extern NoiseParams nparams_v6_def_terrain_base; -extern NoiseParams nparams_v6_def_terrain_higher; -extern NoiseParams nparams_v6_def_steepness; -extern NoiseParams nparams_v6_def_height_select; -extern NoiseParams nparams_v6_def_trees; -extern NoiseParams nparams_v6_def_mud; -extern NoiseParams nparams_v6_def_beach; -extern NoiseParams nparams_v6_def_biome; -extern NoiseParams nparams_v6_def_cave; - -extern NoiseParams nparams_v7_def_terrain; -extern NoiseParams nparams_v7_def_bgroup; -extern NoiseParams nparams_v7_def_heat; -extern NoiseParams nparams_v7_def_humidity; - -enum BiomeType -{ - BT_NORMAL, - BT_DESERT +struct BlockMakeData; +class VoxelArea; +class Map; + + +enum MapgenObject { + MGOBJ_VMANIP, + MGOBJ_HEIGHTMAP, + MGOBJ_BIOMEMAP, + MGOBJ_HEATMAP, + MGOBJ_HUMIDMAP, + MGOBJ_GENNOTIFY }; +enum GenNotify { + GENNOTIFY_DUNGEON, + GENNOTIFY_TEMPLE, + GENNOTIFY_CAVE_BEGIN, + GENNOTIFY_CAVE_END, + GENNOTIFY_LARGECAVE_BEGIN, + GENNOTIFY_LARGECAVE_END +}; -struct BlockMakeData { - bool no_op; - ManualMapVoxelManipulator *vmanip; - u64 seed; - v3s16 blockpos_min; - v3s16 blockpos_max; - v3s16 blockpos_requested; - UniqueQueue transforming_liquid; - INodeDefManager *nodedef; - - BlockMakeData(); - ~BlockMakeData(); +enum OreType { + ORE_SCATTER, + ORE_SHEET, + ORE_CLAYLIKE }; +struct MapgenSpecificParams { + virtual void readParams(Settings *settings) = 0; + virtual void writeParams(Settings *settings) = 0; + virtual ~MapgenSpecificParams() {} +}; + struct MapgenParams { - int mg_version; + std::string mg_name; int chunksize; u64 seed; int water_level; u32 flags; + MapgenSpecificParams *sparams; + MapgenParams() { - mg_version = 6; + mg_name = DEFAULT_MAPGEN; seed = 0; water_level = 1; chunksize = 5; - flags = MG_TREES | MG_CAVES | MGV6_BIOME_BLEND; - } - - static MapgenParams *createMapgenParams(int mgver); - static MapgenParams *getParamsFromSettings(Settings *settings); - -}; - -struct MapgenV6Params : public MapgenParams { - float freq_desert; - float freq_beach; - NoiseParams *np_terrain_base; - NoiseParams *np_terrain_higher; - NoiseParams *np_steepness; - NoiseParams *np_height_select; - NoiseParams *np_trees; - NoiseParams *np_mud; - NoiseParams *np_beach; - NoiseParams *np_biome; - NoiseParams *np_cave; - - MapgenV6Params() { - freq_desert = 0.45; - freq_beach = 0.15; - np_terrain_base = &nparams_v6_def_terrain_base; - np_terrain_higher = &nparams_v6_def_terrain_higher; - np_steepness = &nparams_v6_def_steepness; - np_height_select = &nparams_v6_def_height_select; - np_trees = &nparams_v6_def_trees; - np_mud = &nparams_v6_def_mud; - np_beach = &nparams_v6_def_beach; - np_biome = &nparams_v6_def_biome; - np_cave = &nparams_v6_def_cave; + flags = MG_TREES | MG_CAVES | MG_LIGHT; + sparams = NULL; } }; -struct MapgenV7Params : public MapgenParams { - NoiseParams *np_terrain; - NoiseParams *np_bgroup; - NoiseParams *np_heat; - NoiseParams *np_humidity; - - MapgenV7Params() { - np_terrain = &nparams_v7_def_terrain; - np_bgroup = &nparams_v7_def_bgroup; - np_heat = &nparams_v7_def_heat; - np_humidity = &nparams_v7_def_humidity; - } -}; - - class Mapgen { public: int seed; int water_level; bool generating; int id; + ManualMapVoxelManipulator *vm; + INodeDefManager *ndef; + + s16 *heightmap; + u8 *biomemap; + v3s16 csize; + + u32 gennotify; + std::vector *gen_notifications[NUM_GEN_NOTIFY]; - virtual void makeChunk(BlockMakeData *data) {}; - virtual int getGroundLevelAtPoint(v2s16 p) = 0; + Mapgen(); + virtual ~Mapgen(); - //Legacy functions for Farmesh (pending removal) - static bool get_have_beach(u64 seed, v2s16 p2d); - static double tree_amount_2d(u64 seed, v2s16 p); - static s16 find_ground_level_from_noise(u64 seed, v2s16 p2d, s16 precision); + s16 findGroundLevelFull(v2s16 p2d); + s16 findGroundLevel(v2s16 p2d, s16 ymin, s16 ymax); + void updateHeightmap(v3s16 nmin, v3s16 nmax); + void updateLiquid(UniqueQueue *trans_liquid, v3s16 nmin, v3s16 nmax); + void setLighting(v3s16 nmin, v3s16 nmax, u8 light); + void lightSpread(VoxelArea &a, v3s16 p, u8 light); + void calcLighting(v3s16 nmin, v3s16 nmax); + void calcLightingOld(v3s16 nmin, v3s16 nmax); + + virtual void makeChunk(BlockMakeData *data) {} + virtual int getGroundLevelAtPoint(v2s16 p) { return 0; } }; +struct MapgenFactory { + virtual Mapgen *createMapgen(int mgid, MapgenParams *params, + EmergeManager *emerge) = 0; + virtual MapgenSpecificParams *createMapgenParams() = 0; + virtual ~MapgenFactory() {} +}; -class MapgenV6 : public Mapgen { +class Ore { public: - //ManualMapVoxelManipulator &vmanip; - - int ystride; - v3s16 csize; + std::string ore_name; + std::vector wherein_names; + content_t ore; + std::vector wherein; // the node to be replaced + 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; + 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) + Noise *noise; + + Ore() { + ore = CONTENT_IGNORE; + np = NULL; + noise = NULL; + } - v3s16 node_min; - v3s16 node_max; - - Noise *noise_terrain_base; - Noise *noise_terrain_higher; - Noise *noise_steepness; - Noise *noise_height_select; - Noise *noise_trees; - Noise *noise_mud; - Noise *noise_beach; - Noise *noise_biome; - - float *map_terrain_base; - float *map_terrain_higher; - float *map_steepness; - float *map_height_select; - float *map_trees; - float *map_mud; - float *map_beach; - float *map_biome; - - NoiseParams *np_cave; + virtual ~Ore(); - u32 flags; - float freq_desert; - float freq_beach; - - MapgenV6(int mapgenid, MapgenV6Params *params); - ~MapgenV6(); - - void makeChunk(BlockMakeData *data); - int getGroundLevelAtPoint(v2s16 p); - - - static s16 find_ground_level(VoxelManipulator &vmanip, v2s16 p2d, INodeDefManager *ndef); - static s16 find_stone_level(VoxelManipulator &vmanip, v2s16 p2d, INodeDefManager *ndef); - void make_tree(ManualMapVoxelManipulator &vmanip, v3s16 p0, bool is_apple_tree, INodeDefManager *ndef); - double tree_amount_2d(u64 seed, v2s16 p); - bool block_is_underground(u64 seed, v3s16 blockpos); - double base_rock_level_2d(u64 seed, v2s16 p); - s16 find_ground_level_from_noise(u64 seed, v2s16 p2d, s16 precision); - double get_mud_add_amount(u64 seed, v2s16 p); - bool get_have_beach(u64 seed, v2s16 p2d); - BiomeType get_biome(u64 seed, v2s16 p2d); - u32 get_blockseed(u64 seed, v3s16 p); + void resolveNodeNames(INodeDefManager *ndef); + void placeOre(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax); + virtual void generate(ManualMapVoxelManipulator *vm, int seed, + u32 blockseed, v3s16 nmin, v3s16 nmax) = 0; }; +class OreScatter : public Ore { + ~OreScatter() {} + virtual void generate(ManualMapVoxelManipulator *vm, int seed, + u32 blockseed, v3s16 nmin, v3s16 nmax); +}; -class MapgenV7 : public Mapgen { -public: - BlockMakeData *data; - ManualMapVoxelManipulator *vmanip; - INodeDefManager *ndef; - BiomeDefManager *biomedef; - - int ystride; - int zstride; +class OreSheet : public Ore { + ~OreSheet() {} + virtual void generate(ManualMapVoxelManipulator *vm, int seed, + u32 blockseed, v3s16 nmin, v3s16 nmax); +}; - v3s16 csize; +Ore *createOre(OreType type); - Noise *noise_terrain; - Noise *noise_bgroup; - Noise *noise_heat; - Noise *noise_humidity; - v3s16 node_min; - v3s16 node_max; +enum DecorationType { + DECO_SIMPLE = 1, + DECO_SCHEMATIC, + DECO_LSYSTEM +}; - float *map_terrain; - float *map_bgroup; - float *map_heat; - float *map_humidity; +#if 0 +struct CutoffData { + VoxelArea a; + Decoration *deco; + //v3s16 p; + //v3s16 size; + //s16 height; + + CutoffData(s16 x, s16 y, s16 z, s16 h) { + p = v3s16(x, y, z); + height = h; + } +}; +#endif - bool generating; - int id; - u32 flags; +class Decoration { +public: + INodeDefManager *ndef; - //should these be broken off into a "commonly used nodes" class? - MapNode n_air; - MapNode n_water; - MapNode n_lava; + int mapseed; + std::string place_on_name; + content_t c_place_on; + s16 sidelen; + float fill_ratio; + NoiseParams *np; - MapgenV7(BiomeDefManager *biomedef, int mapgenid, MapgenV7Params *params); - ~MapgenV7(); + std::set biomes; + //std::list cutoffs; + //JMutex cutoff_mutex; - void makeChunk(BlockMakeData *data); - int getGroundLevelAtPoint(v2s16 p); + Decoration(); + virtual ~Decoration(); - Biome *getBiomeAtPoint(v3s16 p); - void updateLiquid(v3s16 node_min, v3s16 node_max); - void updateLighting(v3s16 node_min, v3s16 node_max); + virtual void resolveNodeNames(INodeDefManager *ndef); + void placeDeco(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax); + void placeCutoffs(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax); - //Legacy functions for Farmesh (pending removal) -// static bool get_have_beach(u64 seed, v2s16 p2d); -// static double tree_amount_2d(u64 seed, v2s16 p); -// static s16 find_ground_level_from_noise(u64 seed, v2s16 p2d, s16 precision); + virtual void generate(Mapgen *mg, PseudoRandom *pr, s16 max_y, v3s16 p) = 0; + virtual int getHeight() = 0; + virtual std::string getName() = 0; }; -class EmergeManager { +class DecoSimple : public Decoration { public: - //settings - MapgenParams *params; + std::string deco_name; + std::string spawnby_name; + content_t c_deco; + content_t c_spawnby; + s16 deco_height; + s16 deco_height_max; + s16 nspawnby; + + std::vector decolist_names; + std::vector c_decolist; + + ~DecoSimple() {} + + void resolveNodeNames(INodeDefManager *ndef); + virtual void generate(Mapgen *mg, PseudoRandom *pr, s16 max_y, v3s16 p); + virtual int getHeight(); + virtual std::string getName(); +}; + +#define MTSCHEM_FILE_SIGNATURE 0x4d54534d // 'MTSM' +#define MTSCHEM_FILE_VER_HIGHEST_READ 3 +#define MTSCHEM_FILE_VER_HIGHEST_WRITE 3 + +#define MTSCHEM_PROB_NEVER 0x00 +#define MTSCHEM_PROB_ALWAYS 0xFF - //mapgen objects here - Mapgen *mapgen; +class DecoSchematic : public Decoration { +public: + std::string filename; - //biome manager - BiomeDefManager *biomedef; + std::vector *node_names; + std::vector c_nodes; + std::map replacements; - EmergeManager(IGameDef *gamedef, BiomeDefManager *bdef, MapgenParams *mgparams); - ~EmergeManager(); + u32 flags; + Rotation rotation; + v3s16 size; + MapNode *schematic; + u8 *slice_probs; + + DecoSchematic(); + ~DecoSchematic(); + + void resolveNodeNames(INodeDefManager *ndef); + virtual void generate(Mapgen *mg, PseudoRandom *pr, s16 max_y, v3s16 p); + virtual int getHeight(); + virtual std::string getName(); + + void blitToVManip(v3s16 p, ManualMapVoxelManipulator *vm, + Rotation rot, bool force_placement); + + bool loadSchematicFile(); + void saveSchematicFile(INodeDefManager *ndef); + + bool getSchematicFromMap(Map *map, v3s16 p1, v3s16 p2); + void placeStructure(Map *map, v3s16 p, bool force_placement); + void applyProbabilities(v3s16 p0, + std::vector > *plist, + std::vector > *splist); +}; - Mapgen *getMapgen(); - void addBlockToQueue(); +void build_nnlist_and_update_ids(MapNode *nodes, u32 nodecount, + std::vector *usednodes); - //mapgen helper methods - Biome *getBiomeAtPoint(v3s16 p); - int getGroundLevelAtPoint(v2s16 p); - bool isBlockUnderground(v3s16 blockpos); - u32 getBlockSeed(v3s16 p); +/* +class DecoLSystem : public Decoration { +public: + virtual void generate(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax); }; +*/ + +Decoration *createDecoration(DecorationType type); #endif