X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fmapgen.h;h=5b5ed19a28b172d24e4cdac99db6a0a4e898ef34;hb=dfe00abc5addd66dbf840d7e826690291f4afd93;hp=81de0d176514ce778e818aa1ea3b984ec340cd1e;hpb=cde3d38766a19ddbe001e70573eb521eaf62cc66;p=dragonfireclient.git diff --git a/src/mapgen.h b/src/mapgen.h index 81de0d176..5b5ed19a2 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,327 +20,195 @@ with this program; if not, write to the Free Software Foundation, Inc., #ifndef MAPGEN_HEADER #define MAPGEN_HEADER -#include "irrlichttypes_extrabloated.h" -#include "util/container.h" // UniqueQueue -#include "gamedef.h" -#include "mapnode.h" #include "noise.h" +#include "nodedef.h" +#include "mapnode.h" +#include "util/string.h" +#include "util/container.h" -class BiomeDefManager; -class Biome; +#define DEFAULT_MAPGEN "v6" -//struct BlockMakeData; -class MapBlock; -class ManualMapVoxelManipulator; -class VoxelManipulator; +/////////////////// Mapgen flags +#define MG_TREES 0x01 +#define MG_CAVES 0x02 +#define MG_DUNGEONS 0x04 +#define MG_FLAT 0x08 +#define MG_LIGHT 0x10 + +class Settings; +class MMVManip; class INodeDefManager; +extern FlagDesc flagdesc_mapgen[]; +extern FlagDesc flagdesc_gennotify[]; -enum BiomeType -{ - BT_NORMAL, - BT_DESERT +class Biome; +class EmergeManager; +class MapBlock; +class VoxelManipulator; +struct BlockMakeData; +class VoxelArea; +class Map; + +enum MapgenObject { + MGOBJ_VMANIP, + MGOBJ_HEIGHTMAP, + MGOBJ_BIOMEMAP, + MGOBJ_HEATMAP, + MGOBJ_HUMIDMAP, + MGOBJ_GENNOTIFY }; +enum GenNotifyType { + GENNOTIFY_DUNGEON, + GENNOTIFY_TEMPLE, + GENNOTIFY_CAVE_BEGIN, + GENNOTIFY_CAVE_END, + GENNOTIFY_LARGECAVE_BEGIN, + GENNOTIFY_LARGECAVE_END, + GENNOTIFY_DECORATION, + NUM_GENNOTIFY_TYPES +}; -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(); +struct GenNotifyEvent { + GenNotifyType type; + v3s16 pos; + u32 id; }; +class GenerateNotifier { +public: + GenerateNotifier(); + GenerateNotifier(u32 notify_on, std::set *notify_on_deco_ids); -/////////////////// Mapgen flags -#define MG_TREES 0x01 -#define MG_CAVES 0x02 -#define MG_DUNGEONS 0x04 -#define MGV6_FORESTS 0x08 -#define MGV6_BIOME_BLEND 0x10 - -#define AVERAGE_MUD_AMOUNT 4 - -/////////////////// Mapgen V6 perlin noise default values -NoiseParams nparams_v6_def_terrain_base = - {-AVERAGE_MUD_AMOUNT, 20.0, v3f(250.0, 250.0, 250.0), 82341, 5, 0.6}; -NoiseParams nparams_v6_def_terrain_higher = - {20.0, 16.0, v3f(500.0, 500.0, 500.0), 85309, 5, 0.6}; -NoiseParams nparams_v6_def_steepness = - {0.85, 0.5, v3f(125.0, 125.0, 125.0), -932, 5, 0.7}; -NoiseParams nparams_v6_def_height_select = - {0.5, 1.0, v3f(250.0, 250.0, 250.0), 4213, 5, 0.69}; -NoiseParams nparams_v6_def_trees = - {0.0, 1.0, v3f(125.0, 125.0, 125.0), 2, 4, 0.66}; -NoiseParams nparams_v6_def_mud = - {AVERAGE_MUD_AMOUNT, 2.0, v3f(200.0, 200.0, 200.0), 91013, 3, 0.55}; -NoiseParams nparams_v6_def_beach = - {0.0, 1.0, v3f(250.0, 250.0, 250.0), 59420, 3, 0.50}; -NoiseParams nparams_v6_def_biome = - {0.0, 1.0, v3f(250.0, 250.0, 250.0), 9130, 3, 0.50}; -NoiseParams nparams_v6_def_cave = - {6.0, 6.0, v3f(250.0, 250.0, 250.0), 34329, 3, 0.50}; - -/////////////////// Mapgen V7 perlin noise default values -NoiseParams nparams_v7_def_terrain = - {10.0, 12.0, v3f(350., 350., 350.), 82341, 5, 0.6}; //terrain -NoiseParams nparams_v7_def_bgroup = - {0.5, 1/(2*1.6), v3f(350., 350., 350.), 5923, 2, 0.60}; //0 to 1 -NoiseParams nparams_v7_def_heat = - {25.0, 50.0, v3f(500., 500., 500.), 35293, 1, 0.00}; //-25 to 75 -NoiseParams nparams_v7_def_humidity = - {50, 100/(2*1.6), v3f(750., 750., 750.), 12094, 2, 0.60}; //0 to 100 + void setNotifyOn(u32 notify_on); + void setNotifyOnDecoIds(std::set *notify_on_deco_ids); + + bool addEvent(GenNotifyType type, v3s16 pos, u32 id=0); + void getEvents(std::map > &event_map, + bool peek_events=false); + +private: + u32 m_notify_on; + std::set *m_notify_on_deco_ids; + std::list m_notify_events; +}; + +struct MapgenSpecificParams { + virtual void readParams(const Settings *settings) = 0; + virtual void writeParams(Settings *settings) const = 0; + virtual ~MapgenSpecificParams() {} +}; struct MapgenParams { - int seed; - int water_level; - int chunksize; + std::string mg_name; + s16 chunksize; + u64 seed; + s16 water_level; u32 flags; - MapgenParams() { - seed = 0; - water_level = 1; - chunksize = 5; - flags = MG_TREES | MG_CAVES | MGV6_BIOME_BLEND; - } + NoiseParams np_biome_heat; + NoiseParams np_biome_humidity; -}; + MapgenSpecificParams *sparams; -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; - } -}; + MapgenParams() : + mg_name(DEFAULT_MAPGEN), + chunksize(5), + seed(0), + water_level(1), + flags(MG_TREES | MG_CAVES | MG_LIGHT), + np_biome_heat(NoiseParams(50, 50, v3f(500.0, 500.0, 500.0), 5349, 3, 0.5, 2.0)), + np_biome_humidity(NoiseParams(50, 50, v3f(500.0, 500.0, 500.0), 842, 3, 0.5, 2.0)), + 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; - } + void load(const Settings &settings); + void save(Settings &settings) const; }; - class Mapgen { public: int seed; int water_level; + u32 flags; bool generating; int id; - virtual void makeChunk(BlockMakeData *data) {}; - - //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); -}; - - -class MapgenV6 : public Mapgen { -public: - //ManualMapVoxelManipulator &vmanip; + MMVManip *vm; + INodeDefManager *ndef; - int ystride; + u32 blockseed; + s16 *heightmap; + u8 *biomemap; v3s16 csize; - 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; - Noise *noise_cave; - - 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; - float *map_cave; - - u32 flags; - float freq_desert; - float freq_beach; - - MapgenV6(int mapgenid, MapgenV6Params *params); - ~MapgenV6(); - - void makeChunk(BlockMakeData *data); - - - 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); -}; + GenerateNotifier gennotify; + Mapgen(); + Mapgen(int mapgenid, MapgenParams *params, EmergeManager *emerge); + virtual ~Mapgen(); -class MapgenV7 : public Mapgen { -public: - BlockMakeData *data; - ManualMapVoxelManipulator *vmanip; - INodeDefManager *ndef; - BiomeDefManager *biomedef; - - int ystride; - int zstride; + static u32 getBlockSeed(v3s16 p, int seed); + static u32 getBlockSeed2(v3s16 p, int seed); + 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); - v3s16 csize; + void setLighting(u8 light, v3s16 nmin, v3s16 nmax); + void lightSpread(VoxelArea &a, v3s16 p, u8 light); - Noise *noise_terrain; - Noise *noise_bgroup; - Noise *noise_heat; - Noise *noise_humidity; + void calcLighting(v3s16 nmin, v3s16 nmax); + void calcLighting(v3s16 nmin, v3s16 nmax, + v3s16 full_nmin, v3s16 full_nmax); - v3s16 node_min; - v3s16 node_max; + void propagateSunlight(v3s16 nmin, v3s16 nmax); + void spreadLight(v3s16 nmin, v3s16 nmax); - float *map_terrain; - float *map_bgroup; - float *map_heat; - float *map_humidity; + void calcLightingOld(v3s16 nmin, v3s16 nmax); - bool generating; - int id; - u32 flags; + virtual void makeChunk(BlockMakeData *data) {} + virtual int getGroundLevelAtPoint(v2s16 p) { return 0; } +}; -/* - NoiseParams *np_terrain; - NoiseParams *np_bgroup; - NoiseParams *np_heat; - NoiseParams *np_humidity;*/ - - //should these be broken off into a "commonly used nodes" class? - MapNode n_air; - MapNode n_water; - MapNode n_lava; - - MapgenV7(BiomeDefManager *biomedef, int mapgenid, MapgenV7Params *params); - ~MapgenV7(); - - void makeChunk(BlockMakeData *data); - void updateLiquid(v3s16 node_min, v3s16 node_max); - void updateLighting(v3s16 node_min, v3s16 node_max); - - //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); +struct MapgenFactory { + virtual Mapgen *createMapgen(int mgid, MapgenParams *params, + EmergeManager *emerge) = 0; + virtual MapgenSpecificParams *createMapgenParams() = 0; + virtual ~MapgenFactory() {} }; -class EmergeManager { +class GenElement { public: - //settings - int mg_version; - MapgenParams *params; - - //mapgen objects here - Mapgen *mapgen; - - //biome manager - BiomeDefManager *biomedef; - - EmergeManager(IGameDef *gamedef, int mg_version=6); - ~EmergeManager(); - - Mapgen *getMapgen(); - void setMapgenParams(); - void addBlockToQueue(); - - //mapgen helper methods - Biome *getBiomeAtPoint(v3s16 p); - int getGroundLevelAtPoint(v2s16 p); - bool isBlockUnderground(v3s16 blockpos); - u32 getBlockSeed(v3s16 p); + virtual ~GenElement() {} + u32 id; + std::string name; }; +class GenElementManager { +public: + static const char *ELEMENT_TITLE; + static const size_t ELEMENT_LIMIT = -1; -/* -namespace mapgen -{ - // Finds precise ground level at any position - s16 find_ground_level_from_noise(u64 seed, v2s16 p2d, s16 precision); - - // Find out if block is completely underground - bool block_is_underground(u64 seed, v3s16 blockpos); - - // Get a pseudorandom seed for a position on the map - u32 get_blockseed(u64 seed, v3s16 p); + GenElementManager(IGameDef *gamedef); + virtual ~GenElementManager(); - // Main map generation routine - void make_block(BlockMakeData *data); + virtual GenElement *create(int type) = 0; + virtual u32 add(GenElement *elem); + virtual GenElement *get(u32 id); + virtual GenElement *update(u32 id, GenElement *elem); + virtual GenElement *remove(u32 id); + virtual void clear(); - //These are used by FarMesh - bool get_have_beach(u64 seed, v2s16 p2d); - double tree_amount_2d(u64 seed, v2s16 p); + virtual GenElement *getByName(const std::string &name); - struct BlockMakeData - { - bool no_op; - ManualMapVoxelManipulator *vmanip; // Destructor deletes - u64 seed; - v3s16 blockpos_min; - v3s16 blockpos_max; - v3s16 blockpos_requested; - UniqueQueue transforming_liquid; - INodeDefManager *nodedef; + INodeDefManager *getNodeDef() { return m_ndef; } - BlockMakeData(); - ~BlockMakeData(); - }; +protected: + INodeDefManager *m_ndef; + std::vector m_elements; +}; -}; // namespace mapgen -*/ #endif -