X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fmapgen.h;h=7b8ff57ca42ee0bfe03043a7f8c623777b890d4d;hb=45589fae58157c8a66c640a1db5795a42a86fc1c;hp=57d0ee8a01d06de3b9707cc450fad4c59695b1e9;hpb=f37a3a84fafb91bcfc109fed95aa6d42726f1bf7;p=dragonfireclient.git diff --git a/src/mapgen.h b/src/mapgen.h index 57d0ee8a0..7b8ff57ca 100644 --- a/src/mapgen.h +++ b/src/mapgen.h @@ -1,18 +1,18 @@ /* -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 General Public License as published by -the Free Software Foundation; either version 2 of the License, or +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. +GNU Lesser General Public License for more details. -You should have received a copy of the GNU General Public License along +You should have received a copy of the GNU Lesser General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ @@ -20,47 +20,292 @@ with this program; if not, write to the Free Software Foundation, Inc., #ifndef MAPGEN_HEADER #define MAPGEN_HEADER -#include "common_irrlicht.h" -#include "utility.h" // UniqueQueue +#include "irrlichttypes_extrabloated.h" +#include "util/container.h" // UniqueQueue +#include "gamedef.h" +#include "nodedef.h" +#include "mapnode.h" +#include "noise.h" +#include "settings.h" +#include -struct BlockMakeData; +/////////////////// Mapgen flags +#define MG_TREES 0x01 +#define MG_CAVES 0x02 +#define MG_DUNGEONS 0x04 +#define MGV6_JUNGLES 0x08 +#define MGV6_BIOME_BLEND 0x10 +#define MG_FLAT 0x20 +#define MG_NOLIGHT 0x40 +#define MGV7_MOUNTAINS 0x80 +#define MGV7_RIDGES 0x100 + +/////////////////// 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 + +extern FlagDesc flagdesc_mapgen[]; +extern FlagDesc flagdesc_ore[]; +extern FlagDesc flagdesc_deco_schematic[]; + +class BiomeDefManager; +class Biome; +class EmergeManager; class MapBlock; class ManualMapVoxelManipulator; +class VoxelManipulator; +struct BlockMakeData; +class VoxelArea; +class Map; + +struct MapgenParams { + std::string mg_name; + int chunksize; + u64 seed; + int water_level; + u32 flags; + + MapgenParams() { + mg_name = "v6"; + seed = 0; + water_level = 1; + chunksize = 5; + flags = MG_TREES | MG_CAVES | MGV6_BIOME_BLEND; + } + + virtual bool readParams(Settings *settings) { return true; } + virtual void writeParams(Settings *settings) {} + virtual ~MapgenParams() {} +}; + +class Mapgen { +public: + int seed; + int water_level; + bool generating; + int id; + ManualMapVoxelManipulator *vm; + INodeDefManager *ndef; + + s16 *heightmap; + u8 *biomemap; + v3s16 csize; + + Mapgen(); + virtual ~Mapgen() {} + + 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; } + + //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 MapgenParams *createMapgenParams() = 0; + virtual ~MapgenFactory() {} +}; + +enum MapgenObject { + MGOBJ_VMANIP, + MGOBJ_HEIGHTMAP, + MGOBJ_BIOMEMAP, + MGOBJ_HEATMAP, + MGOBJ_HUMIDMAP +}; + +enum OreType { + ORE_SCATTER, + ORE_SHEET, + ORE_CLAYLIKE +}; + +#define ORE_RANGE_ACTUAL 1 +#define ORE_RANGE_MIRROR 2 + +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; +}; -namespace mapgen -{ - // Finds precise ground level at any position - s16 find_ground_level_from_noise(u64 seed, v2s16 p2d, s16 precision); +class OreScatter : public Ore { + ~OreScatter() {} + virtual void generate(ManualMapVoxelManipulator *vm, int seed, + u32 blockseed, v3s16 nmin, v3s16 nmax); +}; - // Find out if block is completely underground - bool block_is_underground(u64 seed, v3s16 blockpos); +class OreSheet : public Ore { + ~OreSheet() {} + virtual void generate(ManualMapVoxelManipulator *vm, int seed, + u32 blockseed, v3s16 nmin, v3s16 nmax); +}; - // Main map generation routine - void make_block(BlockMakeData *data); +Ore *createOre(OreType type); + + +enum DecorationType { + DECO_SIMPLE, + DECO_SCHEMATIC, + DECO_LSYSTEM +}; + +#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 + +class Decoration { +public: + INodeDefManager *ndef; - // Add objects according to block content - void add_random_objects(MapBlock *block); + int mapseed; + std::string place_on_name; + content_t c_place_on; + s16 sidelen; + float fill_ratio; + NoiseParams *np; - /* - These are used by FarMesh - */ - bool get_have_sand(u64 seed, v2s16 p2d); - double tree_amount_2d(u64 seed, v2s16 p); + std::set biomes; + //std::list cutoffs; + //JMutex cutoff_mutex; + + 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; +}; + +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(); +}; - struct BlockMakeData - { - bool no_op; - ManualMapVoxelManipulator *vmanip; - u64 seed; - v3s16 blockpos; - UniqueQueue transforming_liquid; +#define MTSCHEM_FILE_SIGNATURE 0x4d54534d // 'MTSM' - BlockMakeData(); - ~BlockMakeData(); - }; +class DecoSchematic : public Decoration { +public: + std::string filename; + + std::vector *node_names; + std::vector c_nodes; + std::map replacements; + + u32 flags; + Rotation rotation; + v3s16 size; + MapNode *schematic; + + 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); + void applyProbabilities(std::vector > *plist, v3s16 p0); +}; + +void build_nnlist_and_update_ids(MapNode *nodes, u32 nodecount, + std::vector *usednodes); + +/* +class DecoLSystem : public Decoration { +public: + virtual void generate(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax); +}; +*/ -}; // namespace mapgen +Decoration *createDecoration(DecorationType type); #endif