From 941085e82620ef384d89f26a101bd119a7147d00 Mon Sep 17 00:00:00 2001 From: aleos Date: Wed, 17 Jan 2024 14:05:29 -0500 Subject: [PATCH] Adds ability to clear mapflags * Added the Clear label to allow mapflags to be removed for importing use. * Converts mapflag storage into multimap. --- doc/map_zones.txt | 2 +- src/map/map.cpp | 27 ++++++++++++++++++++++----- src/map/map.hpp | 4 ++-- 3 files changed, 25 insertions(+), 8 deletions(-) diff --git a/doc/map_zones.txt b/doc/map_zones.txt index c6a985aeeb..0b3a0f8218 100644 --- a/doc/map_zones.txt +++ b/doc/map_zones.txt @@ -73,4 +73,4 @@ Mapflags: Mapflags that are applies to a zone. By default, the Value label is 1/ - Flag: Skill_Duration Value: AL_SANCTUARY,400 # Sets the 'skill_duration' mapflag to the zone. - Flag: NoMemo # Removes the 'nomemo' mapflag to the zone. Useful for import. - Value: 0 + Clear: true diff --git a/src/map/map.cpp b/src/map/map.cpp index eccf87750e..b7223fa38c 100644 --- a/src/map/map.cpp +++ b/src/map/map.cpp @@ -449,9 +449,6 @@ uint64 MapZoneDatabase::parseBodyNode(const ryml::NodeRef& node) { if (this->nodeExists(node, "Mapflags")) { const auto &mapflagNode = node["Mapflags"]; - // Mapflags are stored as double-key so that duplicate mapflags can be parsed. - uint16 mapflag_index = 0; - for (const auto &it : mapflagNode) { std::string flag_name; @@ -474,8 +471,28 @@ uint64 MapZoneDatabase::parseBodyNode(const ryml::NodeRef& node) { } else value = "1"; - zone->mapflags.insert({ std::pair(static_cast(flag), mapflag_index), value }); - mapflag_index++; + bool clear = false; + + if (this->nodeExists(it, "Clear")) { + if (!this->asBool(it, "Clear", clear)) + continue; + } + + if (!clear) { + zone->mapflags.insert({ std::pair(static_cast(flag), value) }); + } else { + // Get all mapflag keys that match + auto mapflagit = zone->mapflags.equal_range(static_cast(flag)); + + // Iterate over the mapflags to get their values + for (std::multimap::iterator it = mapflagit.first; it != mapflagit.second; ++it) { + // Compare parse value with what's already in memory + if (it->second.find(value) == 0) { + zone->mapflags.erase(it); + break; + } + } + } } } diff --git a/src/map/map.hpp b/src/map/map.hpp index 4f0624dad8..6251d9b389 100644 --- a/src/map/map.hpp +++ b/src/map/map.hpp @@ -888,7 +888,7 @@ struct s_map_zone { std::unordered_map disabled_statuses; std::unordered_map restricted_jobs; std::vector maps; - std::map, std::string> mapflags; + std::multimap mapflags; }; class MapZoneDatabase : public TypesafeYamlDatabase { @@ -898,7 +898,7 @@ public: } const std::string getDefaultLocation() override; - uint64 parseBodyNode(const ryml::NodeRef& node) override; + uint64 parseBodyNode(const ryml::NodeRef &node) override; void loadingFinished() override; };