diff --git a/lib/rmg/CRmgTemplate.cpp b/lib/rmg/CRmgTemplate.cpp index f42367dbe..313bf13f6 100644 --- a/lib/rmg/CRmgTemplate.cpp +++ b/lib/rmg/CRmgTemplate.cpp @@ -205,9 +205,17 @@ std::set ZoneOptions::getDefaultTownTypes() const return defaultTowns; } -const std::set & ZoneOptions::getTownTypes() const +const std::set ZoneOptions::getTownTypes() const { - return townTypes; + if (townTypes.empty()) + { + //Assume that all towns are allowed, unless banned + return vstd::difference(getDefaultTownTypes(), bannedTownTypes); + } + else + { + return vstd::difference(townTypes, bannedTownTypes); + } } void ZoneOptions::setTownTypes(const std::set & value) @@ -376,6 +384,7 @@ void ZoneOptions::serializeJson(JsonSerializeFormat & handler) handler.serializeBool("townsAreSameType", townsAreSameType, false); handler.serializeIdArray("allowedMonsters", monsterTypes, std::set()); handler.serializeIdArray("allowedTowns", townTypes, std::set()); + handler.serializeIdArray("bannedTowns", bannedTownTypes, std::set()); { //TODO: add support for std::map to serializeEnum diff --git a/lib/rmg/CRmgTemplate.h b/lib/rmg/CRmgTemplate.h index bc25263d0..c6d1622d3 100644 --- a/lib/rmg/CRmgTemplate.h +++ b/lib/rmg/CRmgTemplate.h @@ -145,7 +145,7 @@ public: const CTownInfo & getPlayerTowns() const; const CTownInfo & getNeutralTowns() const; std::set getDefaultTownTypes() const; - const std::set & getTownTypes() const; + const std::set getTownTypes() const; const std::set & getMonsterTypes() const; void setTownTypes(const std::set & value); @@ -188,6 +188,7 @@ protected: bool townsAreSameType; std::set townTypes; + std::set bannedTownTypes; std::set monsterTypes; std::map mines; //obligatory mines to spawn in this zone