From c39a9cac63d9f8ec1dab8f10e00e3dc94cca9f84 Mon Sep 17 00:00:00 2001 From: nordsoft Date: Sun, 30 Apr 2023 01:43:02 +0400 Subject: [PATCH] Minor changes --- lib/mapObjects/CRewardableObject.cpp | 16 +++++++--------- lib/mapObjects/CRewardableObject.h | 19 ++++++++++--------- 2 files changed, 17 insertions(+), 18 deletions(-) diff --git a/lib/mapObjects/CRewardableObject.cpp b/lib/mapObjects/CRewardableObject.cpp index 978fe38fb..f5775cf1b 100644 --- a/lib/mapObjects/CRewardableObject.cpp +++ b/lib/mapObjects/CRewardableObject.cpp @@ -212,11 +212,6 @@ ui16 Rewardable::Configuration::getResetDuration() const return resetParameters.period; } - - - - - void CRewardableObject::onHeroVisit(const CGHeroInstance *h) const { auto grantRewardWithMessage = [&](int index, bool markAsVisit) -> void @@ -292,6 +287,9 @@ void CRewardableObject::onHeroVisit(const CGHeroInstance *h) const case Rewardable::SELECT_FIRST: // give first available grantRewardWithMessage(rewards[0], true); break; + case Rewardable::SELECT_RANDOM: // give random + grantRewardWithMessage(*RandomGeneratorUtil::nextItem(rewards, cb->gameState()->getRandomGenerator()), true); + break; } break; } @@ -317,7 +315,7 @@ void CRewardableObject::onHeroVisit(const CGHeroInstance *h) const void CRewardableObject::heroLevelUpDone(const CGHeroInstance *hero) const { - grantRewardAfterLevelup(configuration.info[configuration.selectedReward], hero); + grantRewardAfterLevelup(configuration.info[selectedReward], hero); } void CRewardableObject::blockingDialogAnswered(const CGHeroInstance *hero, ui32 answer) const @@ -476,7 +474,7 @@ bool CRewardableObject::wasVisitedBefore(const CGHeroInstance * contextHero) con case Rewardable::VISIT_UNLIMITED: return false; case Rewardable::VISIT_ONCE: - return configuration.onceVisitableObjectCleared; + return onceVisitableObjectCleared; case Rewardable::VISIT_PLAYER: return vstd::contains(cb->getPlayerState(contextHero->getOwner())->visitedObjects, ObjectInstanceID(id)); case Rewardable::VISIT_BONUS: @@ -540,10 +538,10 @@ void CRewardableObject::setPropertyDer(ui8 what, ui32 val) initObj(cb->gameState()->getRandomGenerator()); break; case ObjProperty::REWARD_SELECT: - configuration.selectedReward = val; + selectedReward = val; break; case ObjProperty::REWARD_CLEARED: - configuration.onceVisitableObjectCleared = val; + onceVisitableObjectCleared = val; break; } } diff --git a/lib/mapObjects/CRewardableObject.h b/lib/mapObjects/CRewardableObject.h index 5144a43a1..fd5cbb1b0 100644 --- a/lib/mapObjects/CRewardableObject.h +++ b/lib/mapObjects/CRewardableObject.h @@ -271,9 +271,10 @@ namespace Rewardable { SELECT_FIRST, // first reward that matches limiters SELECT_PLAYER, // player can select from all allowed rewards + SELECT_RANDOM, // one random reward from all mathing limiters }; - const std::array SelectModeString{"selectFirst", "selectPlayer"}; + const std::array SelectModeString{"selectFirst", "selectPlayer", "selectRandom"}; const std::array VisitModeString{"unlimited", "once", "hero", "bonus", "player"}; /// Base class that can handle granting rewards to visiting heroes. @@ -292,9 +293,6 @@ namespace Rewardable /// contols who can visit an object, uses EVisitMode enum ui8 visitMode = Rewardable::VISIT_UNLIMITED; - /// reward selected by player - ui16 selectedReward = 0; - /// how and when should the object be reset CRewardResetInfo resetParameters; @@ -304,8 +302,6 @@ namespace Rewardable /// if true - object info will shown in infobox (like resource pickup) EInfoWindowMode infoWindowType = EInfoWindowMode::AUTO; - bool onceVisitableObjectCleared = false; - EVisitMode getVisitMode() const; ui16 getResetDuration() const; @@ -322,8 +318,6 @@ namespace Rewardable h & onSelect; h & visitMode; h & selectMode; - h & selectedReward; - h & onceVisitableObjectCleared; h & infoWindowType; } }; @@ -342,8 +336,13 @@ protected: /// grants reward to hero void grantRewardBeforeLevelup(const CRewardVisitInfo & reward, const CGHeroInstance * hero) const; - /// caster to cast adveture spells + /// caster to cast adveture spells, no serialize mutable spells::ExternalCaster caster; + + /// reward selected by player, no serialize + ui16 selectedReward = 0; + + bool onceVisitableObjectCleared = false; public: @@ -382,6 +381,8 @@ public: template void serialize(Handler &h, const int version) { h & static_cast(*this); + h & configuration; + h & onceVisitableObjectCleared; } friend class CRewardableConstructor;