summaryrefslogtreecommitdiff
path: root/src/mapgen.cpp
diff options
context:
space:
mode:
authorkwolekr <kwolekr@minetest.net>2016-06-14 00:10:55 -0400
committerkwolekr <kwolekr@minetest.net>2016-07-03 14:04:11 -0400
commit92705306bfb4994107a43514f29997cea15d48dc (patch)
treed1919cc2b5091ef6e31cdd312f5cd92ba058e76e /src/mapgen.cpp
parent70e2c1c7d413d20757f571e3f1e02b05c95418f1 (diff)
downloadminetest-92705306bfb4994107a43514f29997cea15d48dc.tar.gz
minetest-92705306bfb4994107a43514f29997cea15d48dc.tar.bz2
minetest-92705306bfb4994107a43514f29997cea15d48dc.zip
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
Diffstat (limited to 'src/mapgen.cpp')
-rw-r--r--src/mapgen.cpp112
1 files changed, 109 insertions, 3 deletions
diff --git a/src/mapgen.cpp b/src/mapgen.cpp
index 1e0e3aa44..e45233b33 100644
--- a/src/mapgen.cpp
+++ b/src/mapgen.cpp
@@ -39,6 +39,13 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "util/numeric.h"
#include "filesys.h"
#include "log.h"
+#include "mapgen_flat.h"
+#include "mapgen_fractal.h"
+#include "mapgen_v5.h"
+#include "mapgen_v6.h"
+#include "mapgen_v7.h"
+#include "mapgen_valleys.h"
+#include "mapgen_singlenode.h"
#include "cavegen.h"
#include "dungeongen.h"
@@ -63,6 +70,28 @@ FlagDesc flagdesc_gennotify[] = {
{NULL, 0}
};
+struct MapgenDesc {
+ const char *name;
+ bool is_user_visible;
+};
+
+////
+//// Built-in mapgens
+////
+
+static MapgenDesc g_reg_mapgens[] = {
+ {"v5", true},
+ {"v6", true},
+ {"v7", true},
+ {"flat", true},
+ {"fractal", true},
+ {"valleys", true},
+ {"singlenode", false},
+};
+
+STATIC_ASSERT(
+ ARRLEN(g_reg_mapgens) == MAPGEN_INVALID,
+ registered_mapgens_is_wrong_size);
////
//// Mapgen
@@ -121,6 +150,83 @@ Mapgen::~Mapgen()
}
+MapgenType Mapgen::getMapgenType(const std::string &mgname)
+{
+ for (size_t i = 0; i != ARRLEN(g_reg_mapgens); i++) {
+ if (mgname == g_reg_mapgens[i].name)
+ return (MapgenType)i;
+ }
+
+ return MAPGEN_INVALID;
+}
+
+
+const char *Mapgen::getMapgenName(MapgenType mgtype)
+{
+ size_t index = (size_t)mgtype;
+ if (index == MAPGEN_INVALID || index >= ARRLEN(g_reg_mapgens))
+ return "invalid";
+
+ return g_reg_mapgens[index].name;
+}
+
+
+Mapgen *Mapgen::createMapgen(MapgenType mgtype, int mgid,
+ MapgenParams *params, EmergeManager *emerge)
+{
+ switch (mgtype) {
+ case MAPGEN_FLAT:
+ return new MapgenFlat(mgid, params, emerge);
+ case MAPGEN_FRACTAL:
+ return new MapgenFractal(mgid, params, emerge);
+ case MAPGEN_SINGLENODE:
+ return new MapgenSinglenode(mgid, params, emerge);
+ case MAPGEN_V5:
+ return new MapgenV5(mgid, params, emerge);
+ case MAPGEN_V6:
+ return new MapgenV6(mgid, params, emerge);
+ case MAPGEN_V7:
+ return new MapgenV7(mgid, params, emerge);
+ case MAPGEN_VALLEYS:
+ return new MapgenValleys(mgid, params, emerge);
+ default:
+ return NULL;
+ }
+}
+
+
+MapgenSpecificParams *Mapgen::createMapgenParams(MapgenType mgtype)
+{
+ switch (mgtype) {
+ case MAPGEN_FLAT:
+ return new MapgenFlatParams;
+ case MAPGEN_FRACTAL:
+ return new MapgenFractalParams;
+ case MAPGEN_SINGLENODE:
+ return new MapgenSinglenodeParams;
+ case MAPGEN_V5:
+ return new MapgenV5Params;
+ case MAPGEN_V6:
+ return new MapgenV6Params;
+ case MAPGEN_V7:
+ return new MapgenV7Params;
+ case MAPGEN_VALLEYS:
+ return new MapgenValleysParams;
+ default:
+ return NULL;
+ }
+}
+
+
+void Mapgen::getMapgenNames(std::vector<const char *> *mgnames, bool include_hidden)
+{
+ for (u32 i = 0; i != ARRLEN(g_reg_mapgens); i++) {
+ if (include_hidden || g_reg_mapgens[i].is_user_visible)
+ mgnames->push_back(g_reg_mapgens[i].name);
+ }
+}
+
+
u32 Mapgen::getBlockSeed(v3s16 p, s32 seed)
{
return (u32)seed +
@@ -891,9 +997,9 @@ void MapgenParams::load(const Settings &settings)
}
delete sparams;
- MapgenFactory *mgfactory = EmergeManager::getMapgenFactory(mg_name);
- if (mgfactory) {
- sparams = mgfactory->createMapgenParams();
+ MapgenType mgtype = Mapgen::getMapgenType(mg_name);
+ if (mgtype != MAPGEN_INVALID) {
+ sparams = Mapgen::createMapgenParams(mgtype);
sparams->readParams(&settings);
}
}