X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fmapgen.h;h=8c34a9719bb106c4f676c640c6ee0ad204fbfd26;hb=115f52af862bc5bf1cb47fe2cc6e0eadb85915a6;hp=4cee3c2aafaa7deb3d834d5be89ab7c5c366a3d1;hpb=5a34f40d80ea1a339b599bc11db549a6bd86912f;p=dragonfireclient.git diff --git a/src/mapgen.h b/src/mapgen.h index 4cee3c2aa..8c34a9719 100644 --- a/src/mapgen.h +++ b/src/mapgen.h @@ -1,6 +1,8 @@ /* Minetest -Copyright (C) 2010-2013 celeron55, Perttu Ahola +Copyright (C) 2010-2015 celeron55, Perttu Ahola +Copyright (C) 2013-2016 kwolekr, Ryan Kwolek +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 @@ -17,62 +19,44 @@ with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#ifndef MAPGEN_HEADER -#define MAPGEN_HEADER +#pragma once -#include "irrlichttypes_bloated.h" -#include "util/container.h" // UniqueQueue -#include "gamedef.h" -#include "nodedef.h" -#include "mapnode.h" #include "noise.h" -#include "settings.h" +#include "nodedef.h" +#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_CAVES 0x02 -#define MG_DUNGEONS 0x04 -#define MG_FLAT 0x08 -#define MG_NOLIGHT 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 MG_TREES 0x01 // Deprecated. Moved into mgv6 flags +#define MG_CAVES 0x02 +#define MG_DUNGEONS 0x04 +#define MG_FLAT 0x08 // Deprecated. Moved into mgv6 flags +#define MG_LIGHT 0x10 +#define MG_DECORATIONS 0x20 -#define ORE_RANGE_ACTUAL 1 -#define ORE_RANGE_MIRROR 2 - -#define NUM_GEN_NOTIFY 6 +typedef u8 biome_t; // copy from mg_biome.h to avoid an unnecessary include +class Settings; +class MMVManip; +class INodeDefManager; extern FlagDesc flagdesc_mapgen[]; -extern FlagDesc flagdesc_ore[]; -extern FlagDesc flagdesc_deco_schematic[]; extern FlagDesc flagdesc_gennotify[]; -class BiomeDefManager; class Biome; +class BiomeGen; +struct BiomeParams; +class BiomeManager; class EmergeManager; class MapBlock; -class ManualMapVoxelManipulator; class VoxelManipulator; struct BlockMakeData; class VoxelArea; class Map; - enum MapgenObject { MGOBJ_VMANIP, MGOBJ_HEIGHTMAP, @@ -82,254 +66,234 @@ enum MapgenObject { MGOBJ_GENNOTIFY }; -enum GenNotify { +enum GenNotifyType { GENNOTIFY_DUNGEON, GENNOTIFY_TEMPLE, GENNOTIFY_CAVE_BEGIN, GENNOTIFY_CAVE_END, GENNOTIFY_LARGECAVE_BEGIN, - GENNOTIFY_LARGECAVE_END -}; - -enum OreType { - ORE_SCATTER, - ORE_SHEET, - ORE_CLAYLIKE + GENNOTIFY_LARGECAVE_END, + GENNOTIFY_DECORATION, + NUM_GENNOTIFY_TYPES }; - -struct MapgenSpecificParams { - virtual void readParams(Settings *settings) = 0; - virtual void writeParams(Settings *settings) = 0; - virtual ~MapgenSpecificParams() {} +enum MgStoneType { + MGSTONE_STONE, + MGSTONE_DESERT_STONE, + MGSTONE_SANDSTONE, + MGSTONE_OTHER, }; -struct MapgenParams { - std::string mg_name; - int chunksize; - u64 seed; - int water_level; - u32 flags; - - MapgenSpecificParams *sparams; - - MapgenParams() { - mg_name = "v6"; - seed = 0; - water_level = 1; - chunksize = 5; - flags = MG_TREES | MG_CAVES; - sparams = NULL; - } +struct GenNotifyEvent { + GenNotifyType type; + v3s16 pos; + u32 id; }; -class Mapgen { +class GenerateNotifier { 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]; + GenerateNotifier() = default; + GenerateNotifier(u32 notify_on, std::set *notify_on_deco_ids); - Mapgen(); - virtual ~Mapgen(); + void setNotifyOn(u32 notify_on); + void setNotifyOnDecoIds(std::set *notify_on_deco_ids); - 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 Ore { -public: - 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; - } - - virtual ~Ore(); - - 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; -}; + bool addEvent(GenNotifyType type, v3s16 pos, u32 id=0); + void getEvents(std::map > &event_map, + bool peek_events=false); -class OreScatter : public Ore { - ~OreScatter() {} - virtual void generate(ManualMapVoxelManipulator *vm, int seed, - u32 blockseed, v3s16 nmin, v3s16 nmax); +private: + u32 m_notify_on = 0; + std::set *m_notify_on_deco_ids; + std::list m_notify_events; }; -class OreSheet : public Ore { - ~OreSheet() {} - virtual void generate(ManualMapVoxelManipulator *vm, int seed, - u32 blockseed, v3s16 nmin, v3s16 nmax); +enum MapgenType { + MAPGEN_V5, + MAPGEN_V6, + MAPGEN_V7, + MAPGEN_FLAT, + MAPGEN_FRACTAL, + MAPGEN_VALLEYS, + MAPGEN_SINGLENODE, + MAPGEN_CARPATHIAN, + MAPGEN_INVALID, }; -Ore *createOre(OreType type); +struct MapgenParams { + MapgenParams() = default; + virtual ~MapgenParams(); + 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; -enum DecorationType { - DECO_SIMPLE, - DECO_SCHEMATIC, - DECO_LSYSTEM -}; + BiomeParams *bparams = nullptr; -#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 + s16 mapgen_edge_min = -MAX_MAP_GENERATION_LIMIT; + s16 mapgen_edge_max = MAX_MAP_GENERATION_LIMIT; -class Decoration { -public: - INodeDefManager *ndef; + virtual void readParams(const Settings *settings); + virtual void writeParams(Settings *settings) const; - int mapseed; - std::string place_on_name; - content_t c_place_on; - s16 sidelen; - float fill_ratio; - NoiseParams *np; + bool saoPosOverLimit(const v3f &p); + s32 getSpawnRangeMax(); - std::set biomes; - //std::list cutoffs; - //JMutex cutoff_mutex; +private: + void calcMapgenEdges(); - Decoration(); - virtual ~Decoration(); - - 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); - - virtual void generate(Mapgen *mg, PseudoRandom *pr, s16 max_y, v3s16 p) = 0; - virtual int getHeight() = 0; - virtual std::string getName() = 0; + 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 DecoSimple : public Decoration { -public: - 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 +/* + Generic interface for map generators. All mapgens must inherit this class. + If a feature exposed by a public member pointer is not supported by a + certain mapgen, it must be set to NULL. -class DecoSchematic : public Decoration { + Apart from makeChunk, getGroundLevelAtPoint, and getSpawnLevelAtPoint, all + methods can be used by constructing a Mapgen base class and setting the + appropriate public members (e.g. vm, ndef, and so on). +*/ +class Mapgen { public: - std::string filename; + s32 seed = 0; + int water_level = 0; + int mapgen_limit = 0; + u32 flags = 0; + bool generating = false; + int id = -1; + + MMVManip *vm = nullptr; + INodeDefManager *ndef = nullptr; + + u32 blockseed; + s16 *heightmap = nullptr; + biome_t *biomemap = nullptr; + v3s16 csize; - std::vector *node_names; - std::vector c_nodes; - std::map replacements; + BiomeGen *biomegen = nullptr; + GenerateNotifier gennotify; - u32 flags; - Rotation rotation; - v3s16 size; - MapNode *schematic; - u8 *slice_probs; + Mapgen() = default; + Mapgen(int mapgenid, MapgenParams *params, EmergeManager *emerge); + virtual ~Mapgen() = default; + DISABLE_CLASS_COPY(Mapgen); - DecoSchematic(); - ~DecoSchematic(); + virtual MapgenType getType() const { return MAPGEN_INVALID; } - void resolveNodeNames(INodeDefManager *ndef); - virtual void generate(Mapgen *mg, PseudoRandom *pr, s16 max_y, v3s16 p); - virtual int getHeight(); - virtual std::string getName(); + 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); + void updateHeightmap(v3s16 nmin, v3s16 nmax); + void updateLiquid(UniqueQueue *trans_liquid, v3s16 nmin, v3s16 nmax); - void blitToVManip(v3s16 p, ManualMapVoxelManipulator *vm, - Rotation rot, bool force_placement); + void setLighting(u8 light, v3s16 nmin, v3s16 nmax); + void lightSpread(VoxelArea &a, v3s16 p, u8 light); + void calcLighting(v3s16 nmin, v3s16 nmax, v3s16 full_nmin, v3s16 full_nmax, + bool propagate_shadow = true); + void propagateSunlight(v3s16 nmin, v3s16 nmax, bool propagate_shadow); + void spreadLight(v3s16 nmin, v3s16 nmax); - bool loadSchematicFile(); - void saveSchematicFile(INodeDefManager *ndef); + virtual void makeChunk(BlockMakeData *data) {} + virtual int getGroundLevelAtPoint(v2s16 p) { return 0; } - bool getSchematicFromMap(Map *map, v3s16 p1, v3s16 p2); - void placeStructure(Map *map, v3s16 p); - void applyProbabilities(v3s16 p0, - std::vector > *plist, - std::vector > *splist); + // getSpawnLevelAtPoint() is a function within each mapgen that returns a + // suitable y co-ordinate for player spawn ('suitable' usually meaning + // within 16 nodes of water_level). If a suitable spawn level cannot be + // found at the specified (X, Z) 'MAX_MAP_GENERATION_LIMIT' is returned to + // 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 *mgnames, bool include_hidden); + +private: + // 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); }; -void build_nnlist_and_update_ids(MapNode *nodes, u32 nodecount, - std::vector *usednodes); - /* -class DecoLSystem : public Decoration { + MapgenBasic is a Mapgen implementation that handles basic functionality + the majority of conventional mapgens will probably want to use, but isn't + generic enough to be included as part of the base Mapgen class (such as + generating biome terrain over terrain node skeletons, generating caves, + dungeons, etc.) + + Inherit MapgenBasic instead of Mapgen to add this basic functionality to + your mapgen without having to reimplement it. Feel free to override any of + these methods if you desire different or more advanced behavior. + + Note that you must still create your own generateTerrain implementation when + inheriting MapgenBasic. +*/ +class MapgenBasic : public Mapgen { public: - virtual void generate(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax); + 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, content_t biome_stone); + virtual void generateBiomes(MgStoneType *mgstone_type, + content_t *biome_stone, s16 biome_zero_level); + virtual void dustTopNodes(); + +protected: + EmergeManager *m_emerge; + BiomeManager *m_bmgr; + + Noise *noise_filler_depth; + + 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_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; + int zstride_1u1d; + + u32 spflags; + + NoiseParams np_cave1; + NoiseParams np_cave2; + NoiseParams np_cavern; + float cave_width; + float cavern_limit; + float cavern_taper; + float cavern_threshold; + int lava_depth; }; -*/ - -Decoration *createDecoration(DecorationType type); - -#endif -