diff --git a/lib/CPlayerState.cpp b/lib/CPlayerState.cpp index 069be91c1..bb1b8363e 100644 --- a/lib/CPlayerState.cpp +++ b/lib/CPlayerState.cpp @@ -112,24 +112,24 @@ std::vector PlayerState::getObjectsOfType() const return result; } -std::vector PlayerState::getHeroes() const +const std::vector & PlayerState::getHeroes() const { - return getObjectsOfType(); + return constOwnedHeroes; } -std::vector PlayerState::getTowns() const +const std::vector & PlayerState::getTowns() const { - return getObjectsOfType(); + return constOwnedTowns; } -std::vector PlayerState::getHeroes() +const std::vector & PlayerState::getHeroes() { - return getObjectsOfType(); + return ownedHeroes; } -std::vector PlayerState::getTowns() +const std::vector & PlayerState::getTowns() { - return getObjectsOfType(); + return ownedTowns; } std::vector PlayerState::getOwnedObjects() const @@ -141,11 +141,51 @@ void PlayerState::addOwnedObject(CGObjectInstance * object) { assert(object->asOwnable() != nullptr); ownedObjects.push_back(object); + + auto * town = dynamic_cast(object); + auto * hero = dynamic_cast(object); + + if (town) + { + ownedTowns.push_back(town); + constOwnedTowns.push_back(town); + } + + if (hero) + { + ownedHeroes.push_back(hero); + constOwnedHeroes.push_back(hero); + } +} + +void PlayerState::postDeserialize() +{ + for (const auto& object : ownedObjects) + { + auto* town = dynamic_cast(object); + auto* hero = dynamic_cast(object); + + if (town) + { + ownedTowns.push_back(town); + constOwnedTowns.push_back(town); + } + + if (hero) + { + ownedHeroes.push_back(hero); + constOwnedHeroes.push_back(hero); + } + } } void PlayerState::removeOwnedObject(CGObjectInstance * object) { vstd::erase(ownedObjects, object); + vstd::erase(ownedTowns, object); + vstd::erase(constOwnedTowns, object); + vstd::erase(ownedHeroes, object); + vstd::erase(constOwnedHeroes, object); } diff --git a/lib/CPlayerState.h b/lib/CPlayerState.h index 411b0945f..6456681ed 100644 --- a/lib/CPlayerState.h +++ b/lib/CPlayerState.h @@ -49,6 +49,11 @@ class DLL_LINKAGE PlayerState : public CBonusSystemNode, public Player std::vector ownedObjects; + std::vector constOwnedTowns; //not serialized + std::vector constOwnedHeroes; //not serialized + std::vector ownedTowns; //not serialized + std::vector ownedHeroes; //not serialized + template std::vector getObjectsOfType() const; @@ -92,15 +97,16 @@ public: std::string getNameTextID() const override; void registerIcons(const IconRegistar & cb) const override; - std::vector getHeroes() const; - std::vector getTowns() const; - std::vector getHeroes(); - std::vector getTowns(); + const std::vector & getHeroes() const; + const std::vector & getTowns() const; + const std::vector & getHeroes(); + const std::vector & getTowns(); std::vector getOwnedObjects() const; void addOwnedObject(CGObjectInstance * object); void removeOwnedObject(CGObjectInstance * object); + void postDeserialize(); bool checkVanquished() const { @@ -145,6 +151,9 @@ public: h & enteredWinningCheatCode; h & static_cast(*this); h & destroyedObjects; + + if (!h.saving) + postDeserialize(); } };