summaryrefslogtreecommitdiff
path: root/src/mapgen.cpp
diff options
context:
space:
mode:
authorkwolekr <kwolekr@minetest.net>2014-11-12 23:01:13 -0500
committerkwolekr <kwolekr@minetest.net>2014-11-12 23:02:41 -0500
commit7616537bc071bc93f8d36c84b94603528be1efb0 (patch)
tree487185069e4f39f1f828a831b1d1ba9c88ed4298 /src/mapgen.cpp
parentf25cc0dbae0209f2647ac5eec9fe6ddb08174f55 (diff)
downloadminetest-7616537bc071bc93f8d36c84b94603528be1efb0.tar.gz
minetest-7616537bc071bc93f8d36c84b94603528be1efb0.tar.bz2
minetest-7616537bc071bc93f8d36c84b94603528be1efb0.zip
Add Generator Element Management framework
Add BiomeManager, OreManager, DecorationManager, and SchematicManager
Diffstat (limited to 'src/mapgen.cpp')
-rw-r--r--src/mapgen.cpp84
1 files changed, 77 insertions, 7 deletions
diff --git a/src/mapgen.cpp b/src/mapgen.cpp
index 3627675dc..1d3b5869b 100644
--- a/src/mapgen.cpp
+++ b/src/mapgen.cpp
@@ -37,6 +37,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "filesys.h"
#include "log.h"
+const char *GenElementManager::ELEMENT_TITLE = "element";
FlagDesc flagdesc_mapgen[] = {
{"trees", MG_TREES},
@@ -57,16 +58,10 @@ FlagDesc flagdesc_gennotify[] = {
{NULL, 0}
};
-///////////////////////////////////////////////////////////////////////////////
-
-
-
-
///////////////////////////////////////////////////////////////////////////////
-
Mapgen::Mapgen() {
seed = 0;
water_level = 0;
@@ -283,10 +278,85 @@ void Mapgen::calcLightingOld(v3s16 nmin, v3s16 nmax) {
std::map<v3s16, u8> unlight_from;
voxalgo::clearLightAndCollectSources(*vm, a, bank, ndef,
- light_sources, unlight_from);
+ light_sources, unlight_from);
voxalgo::propagateSunlight(*vm, a, sunlight, light_sources, ndef);
vm->unspreadLight(bank, unlight_from, light_sources, ndef);
vm->spreadLight(bank, light_sources, ndef);
}
}
+
+
+///////////////////////////////////////////////////////////////////////////////
+
+
+GenElementManager::~GenElementManager()
+{
+ for (size_t i = 0; i != m_elements.size(); i++)
+ delete m_elements[i];
+}
+
+
+u32 GenElementManager::add(GenElement *elem)
+{
+ size_t nelem = m_elements.size();
+
+ for (size_t i = 0; i != nelem; i++) {
+ if (m_elements[i] == NULL) {
+ elem->id = i;
+ m_elements[i] = elem;
+ return i;
+ }
+ }
+
+ if (nelem >= this->ELEMENT_LIMIT)
+ return -1;
+
+ elem->id = nelem;
+ m_elements.push_back(elem);
+
+ verbosestream << "GenElementManager: added " << this->ELEMENT_TITLE
+ << " element '" << elem->name << "'" << std::endl;
+
+ return nelem;
+}
+
+
+GenElement *GenElementManager::get(u32 id)
+{
+ return (id < m_elements.size()) ? m_elements[id] : NULL;
+}
+
+
+GenElement *GenElementManager::getByName(const char *name)
+{
+ for (size_t i = 0; i != m_elements.size(); i++) {
+ GenElement *elem = m_elements[i];
+ if (elem && !strcmp(elem->name.c_str(), name))
+ return elem;
+ }
+
+ return NULL;
+}
+
+GenElement *GenElementManager::getByName(std::string &name)
+{
+ return getByName(name.c_str());
+}
+
+
+GenElement *GenElementManager::update(u32 id, GenElement *elem)
+{
+ if (id >= m_elements.size())
+ return false;
+
+ GenElement *old_elem = m_elements[id];
+ m_elements[id] = elem;
+ return old_elem;
+}
+
+
+GenElement *GenElementManager::remove(u32 id)
+{
+ return update(id, NULL);
+}