Line data Source code
1 : /*
2 : Minetest
3 : Copyright (C) 2010-2013 celeron55, Perttu Ahola <celeron55@gmail.com>
4 :
5 : This program is free software; you can redistribute it and/or modify
6 : it under the terms of the GNU Lesser General Public License as published by
7 : the Free Software Foundation; either version 2.1 of the License, or
8 : (at your option) any later version.
9 :
10 : This program is distributed in the hope that it will be useful,
11 : but WITHOUT ANY WARRANTY; without even the implied warranty of
12 : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 : GNU Lesser General Public License for more details.
14 :
15 : You should have received a copy of the GNU Lesser General Public License along
16 : with this program; if not, write to the Free Software Foundation, Inc.,
17 : 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18 : */
19 :
20 : #ifndef MAPGEN_HEADER
21 : #define MAPGEN_HEADER
22 :
23 : #include "noise.h"
24 : #include "nodedef.h"
25 : #include "mapnode.h"
26 : #include "util/string.h"
27 : #include "util/container.h"
28 :
29 : #define DEFAULT_MAPGEN "v6"
30 :
31 : /////////////////// Mapgen flags
32 : #define MG_TREES 0x01
33 : #define MG_CAVES 0x02
34 : #define MG_DUNGEONS 0x04
35 : #define MG_FLAT 0x08
36 : #define MG_LIGHT 0x10
37 :
38 : class Settings;
39 : class MMVManip;
40 : class INodeDefManager;
41 :
42 : extern FlagDesc flagdesc_mapgen[];
43 : extern FlagDesc flagdesc_gennotify[];
44 :
45 : class Biome;
46 : class EmergeManager;
47 : class MapBlock;
48 : class VoxelManipulator;
49 : struct BlockMakeData;
50 : class VoxelArea;
51 : class Map;
52 :
53 : enum MapgenObject {
54 : MGOBJ_VMANIP,
55 : MGOBJ_HEIGHTMAP,
56 : MGOBJ_BIOMEMAP,
57 : MGOBJ_HEATMAP,
58 : MGOBJ_HUMIDMAP,
59 : MGOBJ_GENNOTIFY
60 : };
61 :
62 : enum GenNotifyType {
63 : GENNOTIFY_DUNGEON,
64 : GENNOTIFY_TEMPLE,
65 : GENNOTIFY_CAVE_BEGIN,
66 : GENNOTIFY_CAVE_END,
67 : GENNOTIFY_LARGECAVE_BEGIN,
68 : GENNOTIFY_LARGECAVE_END,
69 : GENNOTIFY_DECORATION,
70 : NUM_GENNOTIFY_TYPES
71 : };
72 :
73 : // TODO(hmmmm/paramat): make stone type selection dynamic
74 : enum MgStoneType {
75 : STONE,
76 : DESERT_STONE,
77 : SANDSTONE,
78 : };
79 :
80 0 : struct GenNotifyEvent {
81 : GenNotifyType type;
82 : v3s16 pos;
83 : u32 id;
84 : };
85 :
86 0 : class GenerateNotifier {
87 : public:
88 : GenerateNotifier();
89 : GenerateNotifier(u32 notify_on, std::set<u32> *notify_on_deco_ids);
90 :
91 : void setNotifyOn(u32 notify_on);
92 : void setNotifyOnDecoIds(std::set<u32> *notify_on_deco_ids);
93 :
94 : bool addEvent(GenNotifyType type, v3s16 pos, u32 id=0);
95 : void getEvents(std::map<std::string, std::vector<v3s16> > &event_map,
96 : bool peek_events=false);
97 :
98 : private:
99 : u32 m_notify_on;
100 : std::set<u32> *m_notify_on_deco_ids;
101 : std::list<GenNotifyEvent> m_notify_events;
102 : };
103 :
104 0 : struct MapgenSpecificParams {
105 : virtual void readParams(const Settings *settings) = 0;
106 : virtual void writeParams(Settings *settings) const = 0;
107 0 : virtual ~MapgenSpecificParams() {}
108 : };
109 :
110 0 : struct MapgenParams {
111 : std::string mg_name;
112 : s16 chunksize;
113 : u64 seed;
114 : s16 water_level;
115 : u32 flags;
116 :
117 : NoiseParams np_biome_heat;
118 : NoiseParams np_biome_heat_blend;
119 : NoiseParams np_biome_humidity;
120 : NoiseParams np_biome_humidity_blend;
121 :
122 : MapgenSpecificParams *sparams;
123 :
124 0 : MapgenParams() :
125 : mg_name(DEFAULT_MAPGEN),
126 : chunksize(5),
127 : seed(0),
128 : water_level(1),
129 : flags(MG_TREES | MG_CAVES | MG_LIGHT),
130 : np_biome_heat(NoiseParams(50, 50, v3f(1000.0, 1000.0, 1000.0), 5349, 3, 0.5, 2.0)),
131 : np_biome_heat_blend(NoiseParams(0, 1.5, v3f(8.0, 8.0, 8.0), 13, 2, 1.0, 2.0)),
132 : np_biome_humidity(NoiseParams(50, 50, v3f(1000.0, 1000.0, 1000.0), 842, 3, 0.5, 2.0)),
133 : np_biome_humidity_blend(NoiseParams(0, 1.5, v3f(8.0, 8.0, 8.0), 90003, 2, 1.0, 2.0)),
134 0 : sparams(NULL)
135 0 : {}
136 :
137 : void load(const Settings &settings);
138 : void save(Settings &settings) const;
139 : };
140 :
141 : class Mapgen {
142 : public:
143 : int seed;
144 : int water_level;
145 : u32 flags;
146 : bool generating;
147 : int id;
148 :
149 : MMVManip *vm;
150 : INodeDefManager *ndef;
151 :
152 : u32 blockseed;
153 : s16 *heightmap;
154 : u8 *biomemap;
155 : float *heatmap;
156 : float *humidmap;
157 : v3s16 csize;
158 :
159 : GenerateNotifier gennotify;
160 :
161 : Mapgen();
162 : Mapgen(int mapgenid, MapgenParams *params, EmergeManager *emerge);
163 : virtual ~Mapgen();
164 :
165 : static u32 getBlockSeed(v3s16 p, int seed);
166 : static u32 getBlockSeed2(v3s16 p, int seed);
167 : s16 findGroundLevelFull(v2s16 p2d);
168 : s16 findGroundLevel(v2s16 p2d, s16 ymin, s16 ymax);
169 : void updateHeightmap(v3s16 nmin, v3s16 nmax);
170 : void updateLiquid(UniqueQueue<v3s16> *trans_liquid, v3s16 nmin, v3s16 nmax);
171 :
172 : void setLighting(u8 light, v3s16 nmin, v3s16 nmax);
173 : void lightSpread(VoxelArea &a, v3s16 p, u8 light);
174 :
175 : void calcLighting(v3s16 nmin, v3s16 nmax);
176 : void calcLighting(v3s16 nmin, v3s16 nmax,
177 : v3s16 full_nmin, v3s16 full_nmax);
178 :
179 : void propagateSunlight(v3s16 nmin, v3s16 nmax);
180 : void spreadLight(v3s16 nmin, v3s16 nmax);
181 :
182 : void calcLightingOld(v3s16 nmin, v3s16 nmax);
183 :
184 0 : virtual void makeChunk(BlockMakeData *data) {}
185 0 : virtual int getGroundLevelAtPoint(v2s16 p) { return 0; }
186 : };
187 :
188 4 : struct MapgenFactory {
189 : virtual Mapgen *createMapgen(int mgid, MapgenParams *params,
190 : EmergeManager *emerge) = 0;
191 : virtual MapgenSpecificParams *createMapgenParams() = 0;
192 0 : virtual ~MapgenFactory() {}
193 : };
194 :
195 : #endif
|