diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/CMakeLists.txt | 2 | ||||
-rw-r--r-- | src/metadata.cpp | 69 | ||||
-rw-r--r-- | src/metadata.h | 59 | ||||
-rw-r--r-- | src/nodemetadata.cpp | 40 | ||||
-rw-r--r-- | src/nodemetadata.h | 19 |
5 files changed, 134 insertions, 55 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index cab5a1139..afb591a04 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -430,6 +430,7 @@ set(common_SRCS mapgen_valleys.cpp mapnode.cpp mapsector.cpp + metadata.cpp mg_biome.cpp mg_decoration.cpp mg_ore.cpp @@ -893,4 +894,3 @@ endif() if (BUILD_CLIENT AND USE_FREETYPE) add_subdirectory(cguittfont) endif() - diff --git a/src/metadata.cpp b/src/metadata.cpp new file mode 100644 index 000000000..8e04aa2d3 --- /dev/null +++ b/src/metadata.cpp @@ -0,0 +1,69 @@ +/* +Minetest +Copyright (C) 2010-2013 celeron55, Perttu Ahola <celeron55@gmail.com> + +This program is free software; you can redistribute it and/or modify +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 Lesser General Public License for more details. + +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. +*/ + +#include "metadata.h" +#include "exceptions.h" +#include "gamedef.h" +#include "log.h" +#include <sstream> + +/* + Metadata +*/ + +void Metadata::clear() +{ + m_stringvars.clear(); +} + +bool Metadata::empty() const +{ + return m_stringvars.size() == 0; +} + +std::string Metadata::getString(const std::string &name, + u16 recursion) const +{ + StringMap::const_iterator it = m_stringvars.find(name); + if (it == m_stringvars.end()) + return ""; + + return resolveString(it->second, recursion); +} + +void Metadata::setString(const std::string &name, const std::string &var) +{ + if (var.empty()) { + m_stringvars.erase(name); + } else { + m_stringvars[name] = var; + } +} + +std::string Metadata::resolveString(const std::string &str, + u16 recursion) const +{ + if (recursion > 1) { + return str; + } + if (str.substr(0, 2) == "${" && str[str.length() - 1] == '}') { + return getString(str.substr(2, str.length() - 3), recursion + 1); + } + return str; +} diff --git a/src/metadata.h b/src/metadata.h new file mode 100644 index 000000000..a96bfc408 --- /dev/null +++ b/src/metadata.h @@ -0,0 +1,59 @@ +/* +Minetest +Copyright (C) 2010-2013 celeron55, Perttu Ahola <celeron55@gmail.com> + +This program is free software; you can redistribute it and/or modify +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 Lesser General Public License for more details. + +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. +*/ + +#ifndef METADATA_HEADER +#define METADATA_HEADER + +#include "irr_v3d.h" +#include <iostream> +#include <vector> +#include "util/string.h" + +/* + NodeMetadata stores arbitary amounts of data for special blocks. + Used for furnaces, chests and signs. + + There are two interaction methods: inventory menu and text input. + Only one can be used for a single metadata, thus only inventory OR + text input should exist in a metadata. +*/ + +class Inventory; +class IItemDefManager; + +class Metadata +{ +public: + void clear(); + bool empty() const; + + // Generic key/value store + std::string getString(const std::string &name, u16 recursion = 0) const; + void setString(const std::string &name, const std::string &var); + // Support variable names in values + std::string resolveString(const std::string &str, u16 recursion = 0) const; + const StringMap &getStrings() const + { + return m_stringvars; + } +private: + StringMap m_stringvars; +}; + +#endif diff --git a/src/nodemetadata.cpp b/src/nodemetadata.cpp index 0801a028b..9b60cf33e 100644 --- a/src/nodemetadata.cpp +++ b/src/nodemetadata.cpp @@ -31,10 +31,8 @@ with this program; if not, write to the Free Software Foundation, Inc., */ NodeMetadata::NodeMetadata(IItemDefManager *item_def_mgr): - m_stringvars(), m_inventory(new Inventory(item_def_mgr)) -{ -} +{} NodeMetadata::~NodeMetadata() { @@ -70,13 +68,13 @@ void NodeMetadata::deSerialize(std::istream &is) void NodeMetadata::clear() { - m_stringvars.clear(); + Metadata::clear(); m_inventory->clear(); } bool NodeMetadata::empty() const { - return m_stringvars.size() == 0 && m_inventory->getLists().size() == 0; + return Metadata::empty() && m_inventory->getLists().size() == 0; } /* @@ -216,35 +214,3 @@ int NodeMetadataList::countNonEmpty() const } return n; } - -std::string NodeMetadata::getString(const std::string &name, - unsigned short recursion) const -{ - StringMap::const_iterator it = m_stringvars.find(name); - if (it == m_stringvars.end()) - return ""; - - return resolveString(it->second, recursion); -} - -void NodeMetadata::setString(const std::string &name, const std::string &var) -{ - if (var.empty()) { - m_stringvars.erase(name); - } else { - m_stringvars[name] = var; - } -} - -std::string NodeMetadata::resolveString(const std::string &str, - unsigned short recursion) const -{ - if (recursion > 1) { - return str; - } - if (str.substr(0, 2) == "${" && str[str.length() - 1] == '}') { - return getString(str.substr(2, str.length() - 3), recursion + 1); - } - return str; -} - diff --git a/src/nodemetadata.h b/src/nodemetadata.h index da1bf595d..f46c0fe91 100644 --- a/src/nodemetadata.h +++ b/src/nodemetadata.h @@ -20,10 +20,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #ifndef NODEMETADATA_HEADER #define NODEMETADATA_HEADER -#include "irr_v3d.h" -#include <iostream> -#include <vector> -#include "util/string.h" +#include "metadata.h" /* NodeMetadata stores arbitary amounts of data for special blocks. @@ -37,7 +34,7 @@ with this program; if not, write to the Free Software Foundation, Inc., class Inventory; class IItemDefManager; -class NodeMetadata +class NodeMetadata : public Metadata { public: NodeMetadata(IItemDefManager *item_def_mgr); @@ -49,16 +46,6 @@ public: void clear(); bool empty() const; - // Generic key/value store - std::string getString(const std::string &name, unsigned short recursion = 0) const; - void setString(const std::string &name, const std::string &var); - // Support variable names in values - std::string resolveString(const std::string &str, unsigned short recursion = 0) const; - StringMap getStrings() const - { - return m_stringvars; - } - // The inventory Inventory *getInventory() { @@ -66,7 +53,6 @@ public: } private: - StringMap m_stringvars; Inventory *m_inventory; }; @@ -101,4 +87,3 @@ private: }; #endif - |