Skip to content

Commit 9270530

Browse files
committedJul 3, 2016
Mapgen: Refactor mapgen creation and management
- Move mapgen creation logic out of EmergeManager and into Mapgen - Internally represent mapgen type as an enum value, instead of a string - Remove the need for a MapgenFactory per mapgen
1 parent 70e2c1c commit 9270530

12 files changed

+160
-164
lines changed
 

‎src/emerge.cpp

+9-59
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,6 @@ with this program; if not, write to the Free Software Foundation, Inc.,
3434
#include "log.h"
3535
#include "map.h"
3636
#include "mapblock.h"
37-
#include "mapgen_flat.h"
38-
#include "mapgen_fractal.h"
39-
#include "mapgen_v5.h"
40-
#include "mapgen_v6.h"
41-
#include "mapgen_v7.h"
42-
#include "mapgen_valleys.h"
43-
#include "mapgen_singlenode.h"
4437
#include "mg_biome.h"
4538
#include "mg_ore.h"
4639
#include "mg_decoration.h"
@@ -53,13 +46,6 @@ with this program; if not, write to the Free Software Foundation, Inc.,
5346
#include "settings.h"
5447
#include "voxel.h"
5548

56-
57-
struct MapgenDesc {
58-
const char *name;
59-
MapgenFactory *factory;
60-
bool is_user_visible;
61-
};
62-
6349
class EmergeThread : public Thread {
6450
public:
6551
bool enable_mapgen_debug_info;
@@ -99,20 +85,6 @@ class EmergeThread : public Thread {
9985
friend class EmergeManager;
10086
};
10187

102-
////
103-
//// Built-in mapgens
104-
////
105-
106-
MapgenDesc g_reg_mapgens[] = {
107-
{"v5", new MapgenFactoryV5, true},
108-
{"v6", new MapgenFactoryV6, true},
109-
{"v7", new MapgenFactoryV7, true},
110-
{"flat", new MapgenFactoryFlat, true},
111-
{"fractal", new MapgenFactoryFractal, true},
112-
{"valleys", new MapgenFactoryValleys, true},
113-
{"singlenode", new MapgenFactorySinglenode, false},
114-
};
115-
11688
////
11789
//// EmergeManager
11890
////
@@ -195,24 +167,24 @@ void EmergeManager::initMapgens()
195167
if (m_mapgens.size())
196168
return;
197169

198-
MapgenFactory *mgfactory = getMapgenFactory(params.mg_name);
199-
if (!mgfactory) {
170+
MapgenType mgtype = Mapgen::getMapgenType(params.mg_name);
171+
if (mgtype == MAPGEN_INVALID) {
172+
const char *default_mapgen_name = Mapgen::getMapgenName(MAPGEN_DEFAULT);
200173
errorstream << "EmergeManager: mapgen " << params.mg_name <<
201-
" not registered; falling back to " << DEFAULT_MAPGEN << std::endl;
202-
203-
params.mg_name = DEFAULT_MAPGEN;
174+
" not registered; falling back to " <<
175+
default_mapgen_name << std::endl;
204176

205-
mgfactory = getMapgenFactory(params.mg_name);
206-
FATAL_ERROR_IF(mgfactory == NULL, "Couldn't use any mapgen!");
177+
params.mg_name = default_mapgen_name;
178+
mgtype = MAPGEN_DEFAULT;
207179
}
208180

209181
if (!params.sparams) {
210-
params.sparams = mgfactory->createMapgenParams();
182+
params.sparams = Mapgen::createMapgenParams(mgtype);
211183
params.sparams->readParams(g_settings);
212184
}
213185

214186
for (u32 i = 0; i != m_threads.size(); i++) {
215-
Mapgen *mg = mgfactory->createMapgen(i, &params, this);
187+
Mapgen *mg = Mapgen::createMapgen(mgtype, i, &params, this);
216188
m_mapgens.push_back(mg);
217189
}
218190
}
@@ -369,28 +341,6 @@ bool EmergeManager::isBlockUnderground(v3s16 blockpos)
369341
return blockpos.Y * (MAP_BLOCKSIZE + 1) <= params.water_level;
370342
}
371343

372-
373-
void EmergeManager::getMapgenNames(
374-
std::vector<const char *> *mgnames, bool include_hidden)
375-
{
376-
for (u32 i = 0; i != ARRLEN(g_reg_mapgens); i++) {
377-
if (include_hidden || g_reg_mapgens[i].is_user_visible)
378-
mgnames->push_back(g_reg_mapgens[i].name);
379-
}
380-
}
381-
382-
383-
MapgenFactory *EmergeManager::getMapgenFactory(const std::string &mgname)
384-
{
385-
for (u32 i = 0; i != ARRLEN(g_reg_mapgens); i++) {
386-
if (mgname == g_reg_mapgens[i].name)
387-
return g_reg_mapgens[i].factory;
388-
}
389-
390-
return NULL;
391-
}
392-
393-
394344
bool EmergeManager::pushBlockEmergeData(
395345
v3s16 pos,
396346
u16 peer_requested,

‎src/emerge.h

-3
Original file line numberDiff line numberDiff line change
@@ -140,9 +140,6 @@ class EmergeManager {
140140
int getGroundLevelAtPoint(v2s16 p);
141141
bool isBlockUnderground(v3s16 blockpos);
142142

143-
static MapgenFactory *getMapgenFactory(const std::string &mgname);
144-
static void getMapgenNames(
145-
std::vector<const char *> *mgnames, bool include_hidden);
146143
static v3s16 getContainingChunk(v3s16 blockpos, s16 chunksize);
147144

148145
private:

‎src/mapgen.cpp

+109-3
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,13 @@ with this program; if not, write to the Free Software Foundation, Inc.,
3939
#include "util/numeric.h"
4040
#include "filesys.h"
4141
#include "log.h"
42+
#include "mapgen_flat.h"
43+
#include "mapgen_fractal.h"
44+
#include "mapgen_v5.h"
45+
#include "mapgen_v6.h"
46+
#include "mapgen_v7.h"
47+
#include "mapgen_valleys.h"
48+
#include "mapgen_singlenode.h"
4249
#include "cavegen.h"
4350
#include "dungeongen.h"
4451

@@ -63,6 +70,28 @@ FlagDesc flagdesc_gennotify[] = {
6370
{NULL, 0}
6471
};
6572

73+
struct MapgenDesc {
74+
const char *name;
75+
bool is_user_visible;
76+
};
77+
78+
////
79+
//// Built-in mapgens
80+
////
81+
82+
static MapgenDesc g_reg_mapgens[] = {
83+
{"v5", true},
84+
{"v6", true},
85+
{"v7", true},
86+
{"flat", true},
87+
{"fractal", true},
88+
{"valleys", true},
89+
{"singlenode", false},
90+
};
91+
92+
STATIC_ASSERT(
93+
ARRLEN(g_reg_mapgens) == MAPGEN_INVALID,
94+
registered_mapgens_is_wrong_size);
6695

6796
////
6897
//// Mapgen
@@ -121,6 +150,83 @@ Mapgen::~Mapgen()
121150
}
122151

123152

153+
MapgenType Mapgen::getMapgenType(const std::string &mgname)
154+
{
155+
for (size_t i = 0; i != ARRLEN(g_reg_mapgens); i++) {
156+
if (mgname == g_reg_mapgens[i].name)
157+
return (MapgenType)i;
158+
}
159+
160+
return MAPGEN_INVALID;
161+
}
162+
163+
164+
const char *Mapgen::getMapgenName(MapgenType mgtype)
165+
{
166+
size_t index = (size_t)mgtype;
167+
if (index == MAPGEN_INVALID || index >= ARRLEN(g_reg_mapgens))
168+
return "invalid";
169+
170+
return g_reg_mapgens[index].name;
171+
}
172+
173+
174+
Mapgen *Mapgen::createMapgen(MapgenType mgtype, int mgid,
175+
MapgenParams *params, EmergeManager *emerge)
176+
{
177+
switch (mgtype) {
178+
case MAPGEN_FLAT:
179+
return new MapgenFlat(mgid, params, emerge);
180+
case MAPGEN_FRACTAL:
181+
return new MapgenFractal(mgid, params, emerge);
182+
case MAPGEN_SINGLENODE:
183+
return new MapgenSinglenode(mgid, params, emerge);
184+
case MAPGEN_V5:
185+
return new MapgenV5(mgid, params, emerge);
186+
case MAPGEN_V6:
187+
return new MapgenV6(mgid, params, emerge);
188+
case MAPGEN_V7:
189+
return new MapgenV7(mgid, params, emerge);
190+
case MAPGEN_VALLEYS:
191+
return new MapgenValleys(mgid, params, emerge);
192+
default:
193+
return NULL;
194+
}
195+
}
196+
197+
198+
MapgenSpecificParams *Mapgen::createMapgenParams(MapgenType mgtype)
199+
{
200+
switch (mgtype) {
201+
case MAPGEN_FLAT:
202+
return new MapgenFlatParams;
203+
case MAPGEN_FRACTAL:
204+
return new MapgenFractalParams;
205+
case MAPGEN_SINGLENODE:
206+
return new MapgenSinglenodeParams;
207+
case MAPGEN_V5:
208+
return new MapgenV5Params;
209+
case MAPGEN_V6:
210+
return new MapgenV6Params;
211+
case MAPGEN_V7:
212+
return new MapgenV7Params;
213+
case MAPGEN_VALLEYS:
214+
return new MapgenValleysParams;
215+
default:
216+
return NULL;
217+
}
218+
}
219+
220+
221+
void Mapgen::getMapgenNames(std::vector<const char *> *mgnames, bool include_hidden)
222+
{
223+
for (u32 i = 0; i != ARRLEN(g_reg_mapgens); i++) {
224+
if (include_hidden || g_reg_mapgens[i].is_user_visible)
225+
mgnames->push_back(g_reg_mapgens[i].name);
226+
}
227+
}
228+
229+
124230
u32 Mapgen::getBlockSeed(v3s16 p, s32 seed)
125231
{
126232
return (u32)seed +
@@ -891,9 +997,9 @@ void MapgenParams::load(const Settings &settings)
891997
}
892998

893999
delete sparams;
894-
MapgenFactory *mgfactory = EmergeManager::getMapgenFactory(mg_name);
895-
if (mgfactory) {
896-
sparams = mgfactory->createMapgenParams();
1000+
MapgenType mgtype = Mapgen::getMapgenType(mg_name);
1001+
if (mgtype != MAPGEN_INVALID) {
1002+
sparams = Mapgen::createMapgenParams(mgtype);
8971003
sparams->readParams(&settings);
8981004
}
8991005
}

‎src/mapgen.h

+24-9
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
2626
#include "util/string.h"
2727
#include "util/container.h"
2828

29-
#define DEFAULT_MAPGEN "v6"
29+
#define MAPGEN_DEFAULT MAPGEN_V6
30+
#define MAPGEN_DEFAULT_NAME "v6"
3031

3132
/////////////////// Mapgen flags
3233
#define MG_TREES 0x01
@@ -107,6 +108,17 @@ class GenerateNotifier {
107108
std::list<GenNotifyEvent> m_notify_events;
108109
};
109110

111+
enum MapgenType {
112+
MAPGEN_V5,
113+
MAPGEN_V6,
114+
MAPGEN_V7,
115+
MAPGEN_FLAT,
116+
MAPGEN_FRACTAL,
117+
MAPGEN_VALLEYS,
118+
MAPGEN_SINGLENODE,
119+
MAPGEN_INVALID,
120+
};
121+
110122
struct MapgenSpecificParams {
111123
virtual void readParams(const Settings *settings) = 0;
112124
virtual void writeParams(Settings *settings) const = 0;
@@ -124,7 +136,7 @@ struct MapgenParams {
124136
MapgenSpecificParams *sparams;
125137

126138
MapgenParams() :
127-
mg_name(DEFAULT_MAPGEN),
139+
mg_name(MAPGEN_DEFAULT_NAME),
128140
chunksize(5),
129141
seed(0),
130142
water_level(1),
@@ -173,6 +185,8 @@ class Mapgen {
173185
Mapgen(int mapgenid, MapgenParams *params, EmergeManager *emerge);
174186
virtual ~Mapgen();
175187

188+
virtual MapgenType getType() const { return MAPGEN_INVALID; }
189+
176190
static u32 getBlockSeed(v3s16 p, s32 seed);
177191
static u32 getBlockSeed2(v3s16 p, s32 seed);
178192
s16 findGroundLevelFull(v2s16 p2d);
@@ -198,6 +212,14 @@ class Mapgen {
198212
// signify this and to cause Server::findSpawnPos() to try another (X, Z).
199213
virtual int getSpawnLevelAtPoint(v2s16 p) { return 0; }
200214

215+
// Mapgen management functions
216+
static MapgenType getMapgenType(const std::string &mgname);
217+
static const char *getMapgenName(MapgenType mgtype);
218+
static Mapgen *createMapgen(MapgenType mgtype, int mgid,
219+
MapgenParams *params, EmergeManager *emerge);
220+
static MapgenSpecificParams *createMapgenParams(MapgenType mgtype);
221+
static void getMapgenNames(std::vector<const char *> *mgnames, bool include_hidden);
222+
201223
private:
202224
// isLiquidHorizontallyFlowable() is a helper function for updateLiquid()
203225
// that checks whether there are floodable nodes without liquid beneath
@@ -267,11 +289,4 @@ class MapgenBasic : public Mapgen {
267289
float cave_width;
268290
};
269291

270-
struct MapgenFactory {
271-
virtual Mapgen *createMapgen(int mgid, MapgenParams *params,
272-
EmergeManager *emerge) = 0;
273-
virtual MapgenSpecificParams *createMapgenParams() = 0;
274-
virtual ~MapgenFactory() {}
275-
};
276-
277292
#endif

‎src/mapgen_flat.h

+2-12
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,8 @@ class MapgenFlat : public MapgenBasic {
5858
MapgenFlat(int mapgenid, MapgenParams *params, EmergeManager *emerge);
5959
~MapgenFlat();
6060

61+
virtual MapgenType getType() const { return MAPGEN_FLAT; }
62+
6163
virtual void makeChunk(BlockMakeData *data);
6264
int getSpawnLevelAtPoint(v2s16 p);
6365
s16 generateTerrain();
@@ -72,16 +74,4 @@ class MapgenFlat : public MapgenBasic {
7274
Noise *noise_terrain;
7375
};
7476

75-
struct MapgenFactoryFlat : public MapgenFactory {
76-
Mapgen *createMapgen(int mgid, MapgenParams *params, EmergeManager *emerge)
77-
{
78-
return new MapgenFlat(mgid, params, emerge);
79-
};
80-
81-
MapgenSpecificParams *createMapgenParams()
82-
{
83-
return new MapgenFlatParams();
84-
};
85-
};
86-
8777
#endif

‎src/mapgen_fractal.h

+2-12
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,8 @@ class MapgenFractal : public MapgenBasic {
6262
MapgenFractal(int mapgenid, MapgenParams *params, EmergeManager *emerge);
6363
~MapgenFractal();
6464

65+
virtual MapgenType getType() const { return MAPGEN_FRACTAL; }
66+
6567
virtual void makeChunk(BlockMakeData *data);
6668
int getSpawnLevelAtPoint(v2s16 p);
6769
bool getFractalAtPoint(s16 x, s16 y, s16 z);
@@ -83,16 +85,4 @@ class MapgenFractal : public MapgenBasic {
8385
Noise *noise_seabed;
8486
};
8587

86-
struct MapgenFactoryFractal : public MapgenFactory {
87-
Mapgen *createMapgen(int mgid, MapgenParams *params, EmergeManager *emerge)
88-
{
89-
return new MapgenFractal(mgid, params, emerge);
90-
};
91-
92-
MapgenSpecificParams *createMapgenParams()
93-
{
94-
return new MapgenFractalParams();
95-
};
96-
};
97-
9888
#endif

‎src/mapgen_singlenode.h

+4-13
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,9 @@ with this program; if not, write to the Free Software Foundation, Inc.,
2323
#include "mapgen.h"
2424

2525
struct MapgenSinglenodeParams : public MapgenSpecificParams {
26-
2726
MapgenSinglenodeParams() {}
2827
~MapgenSinglenodeParams() {}
29-
28+
3029
void readParams(const Settings *settings) {}
3130
void writeParams(Settings *settings) const {}
3231
};
@@ -39,19 +38,11 @@ class MapgenSinglenode : public Mapgen {
3938

4039
MapgenSinglenode(int mapgenid, MapgenParams *params, EmergeManager *emerge);
4140
~MapgenSinglenode();
42-
41+
42+
virtual MapgenType getType() const { return MAPGEN_SINGLENODE; }
43+
4344
void makeChunk(BlockMakeData *data);
4445
int getSpawnLevelAtPoint(v2s16 p);
4546
};
4647

47-
struct MapgenFactorySinglenode : public MapgenFactory {
48-
Mapgen *createMapgen(int mgid, MapgenParams *params, EmergeManager *emerge) {
49-
return new MapgenSinglenode(mgid, params, emerge);
50-
};
51-
52-
MapgenSpecificParams *createMapgenParams() {
53-
return new MapgenSinglenodeParams();
54-
};
55-
};
56-
5748
#endif

‎src/mapgen_v5.h

+2-13
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@ class MapgenV5 : public MapgenBasic {
5353
MapgenV5(int mapgenid, MapgenParams *params, EmergeManager *emerge);
5454
~MapgenV5();
5555

56+
virtual MapgenType getType() const { return MAPGEN_V5; }
57+
5658
virtual void makeChunk(BlockMakeData *data);
5759
int getSpawnLevelAtPoint(v2s16 p);
5860
int generateBaseTerrain();
@@ -63,17 +65,4 @@ class MapgenV5 : public MapgenBasic {
6365
Noise *noise_ground;
6466
};
6567

66-
67-
struct MapgenFactoryV5 : public MapgenFactory {
68-
Mapgen *createMapgen(int mgid, MapgenParams *params, EmergeManager *emerge)
69-
{
70-
return new MapgenV5(mgid, params, emerge);
71-
};
72-
73-
MapgenSpecificParams *createMapgenParams()
74-
{
75-
return new MapgenV5Params();
76-
};
77-
};
78-
7968
#endif

‎src/mapgen_v6.h

+2-14
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,8 @@ class MapgenV6 : public Mapgen {
127127
MapgenV6(int mapgenid, MapgenParams *params, EmergeManager *emerge);
128128
~MapgenV6();
129129

130+
virtual MapgenType getType() const { return MAPGEN_V6; }
131+
130132
void makeChunk(BlockMakeData *data);
131133
int getGroundLevelAtPoint(v2s16 p);
132134
int getSpawnLevelAtPoint(v2s16 p);
@@ -162,18 +164,4 @@ class MapgenV6 : public Mapgen {
162164
virtual void generateCaves(int max_stone_y);
163165
};
164166

165-
166-
struct MapgenFactoryV6 : public MapgenFactory {
167-
Mapgen *createMapgen(int mgid, MapgenParams *params, EmergeManager *emerge)
168-
{
169-
return new MapgenV6(mgid, params, emerge);
170-
};
171-
172-
MapgenSpecificParams *createMapgenParams()
173-
{
174-
return new MapgenV6Params();
175-
};
176-
};
177-
178-
179167
#endif

‎src/mapgen_v7.h

+2-12
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@ class MapgenV7 : public MapgenBasic {
5959
MapgenV7(int mapgenid, MapgenParams *params, EmergeManager *emerge);
6060
~MapgenV7();
6161

62+
virtual MapgenType getType() const { return MAPGEN_V7; }
63+
6264
virtual void makeChunk(BlockMakeData *data);
6365
int getSpawnLevelAtPoint(v2s16 p);
6466

@@ -80,16 +82,4 @@ class MapgenV7 : public MapgenBasic {
8082
Noise *noise_ridge;
8183
};
8284

83-
struct MapgenFactoryV7 : public MapgenFactory {
84-
Mapgen *createMapgen(int mgid, MapgenParams *params, EmergeManager *emerge)
85-
{
86-
return new MapgenV7(mgid, params, emerge);
87-
};
88-
89-
MapgenSpecificParams *createMapgenParams()
90-
{
91-
return new MapgenV7Params();
92-
};
93-
};
94-
9585
#endif

‎src/mapgen_valleys.h

+2-12
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,8 @@ class MapgenValleys : public MapgenBasic {
9191
MapgenValleys(int mapgenid, MapgenParams *params, EmergeManager *emerge);
9292
~MapgenValleys();
9393

94+
virtual MapgenType getType() const { return MAPGEN_VALLEYS; }
95+
9496
virtual void makeChunk(BlockMakeData *data);
9597
int getSpawnLevelAtPoint(v2s16 p);
9698

@@ -137,16 +139,4 @@ class MapgenValleys : public MapgenBasic {
137139
virtual void generateCaves(s16 max_stone_y, s16 large_cave_depth);
138140
};
139141

140-
struct MapgenFactoryValleys : public MapgenFactory {
141-
Mapgen *createMapgen(int mgid, MapgenParams *params, EmergeManager *emerge)
142-
{
143-
return new MapgenValleys(mgid, params, emerge);
144-
};
145-
146-
MapgenSpecificParams *createMapgenParams()
147-
{
148-
return new MapgenValleysParams();
149-
};
150-
};
151-
152142
#endif

‎src/script/lua_api/l_mainmenu.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
3131
#include "filesys.h"
3232
#include "convert_json.h"
3333
#include "serverlist.h"
34-
#include "emerge.h"
34+
#include "mapgen.h"
3535
#include "sound.h"
3636
#include "settings.h"
3737
#include "log.h"
@@ -707,7 +707,7 @@ int ModApiMainMenu::l_set_topleft_text(lua_State *L)
707707
int ModApiMainMenu::l_get_mapgen_names(lua_State *L)
708708
{
709709
std::vector<const char *> names;
710-
EmergeManager::getMapgenNames(&names, lua_toboolean(L, 1));
710+
Mapgen::getMapgenNames(&names, lua_toboolean(L, 1));
711711

712712
lua_newtable(L);
713713
for (size_t i = 0; i != names.size(); i++) {

0 commit comments

Comments
 (0)
Please sign in to comment.