From 6b6199d3a467fa21d53c1f0b45353a68ba2897b5 Mon Sep 17 00:00:00 2001 From: Ivan Savenko Date: Wed, 7 May 2025 22:44:44 +0300 Subject: [PATCH] Implemented giving bonuses to commanders --- lib/mapObjectConstructors/CRewardableConstructor.cpp | 1 + lib/mapObjects/TownBuildingInstance.cpp | 1 + lib/networkPacks/NetPacksLib.cpp | 3 +++ lib/networkPacks/PacksForClient.h | 10 ++++++++-- lib/rewardable/Info.cpp | 1 + lib/rewardable/Interface.cpp | 9 +++++++++ lib/rewardable/Reward.h | 2 ++ 7 files changed, 25 insertions(+), 2 deletions(-) diff --git a/lib/mapObjectConstructors/CRewardableConstructor.cpp b/lib/mapObjectConstructors/CRewardableConstructor.cpp index 852af6470..d358b0272 100644 --- a/lib/mapObjectConstructors/CRewardableConstructor.cpp +++ b/lib/mapObjectConstructors/CRewardableConstructor.cpp @@ -72,6 +72,7 @@ Rewardable::Configuration CRewardableConstructor::generateConfiguration(IGameCal for(auto & rewardInfo : result.info) { assignBonuses(rewardInfo.reward.heroBonuses, objectID); + assignBonuses(rewardInfo.reward.commanderBonuses, objectID); assignBonuses(rewardInfo.reward.playerBonuses, objectID); } diff --git a/lib/mapObjects/TownBuildingInstance.cpp b/lib/mapObjects/TownBuildingInstance.cpp index 22674dc2f..56bfea3b3 100644 --- a/lib/mapObjects/TownBuildingInstance.cpp +++ b/lib/mapObjects/TownBuildingInstance.cpp @@ -102,6 +102,7 @@ Rewardable::Configuration TownRewardableBuildingInstance::generateConfiguration( for(auto & rewardInfo : result.info) { assignBonuses(rewardInfo.reward.heroBonuses); + assignBonuses(rewardInfo.reward.commanderBonuses); assignBonuses(rewardInfo.reward.playerBonuses); } return result; diff --git a/lib/networkPacks/NetPacksLib.cpp b/lib/networkPacks/NetPacksLib.cpp index 9cf7621fe..58369b351 100644 --- a/lib/networkPacks/NetPacksLib.cpp +++ b/lib/networkPacks/NetPacksLib.cpp @@ -1014,6 +1014,9 @@ void GiveBonus::applyGs(CGameState *gs) case ETarget::OBJECT: cbsn = dynamic_cast(gs->getObjInstance(id.as())); break; + case ETarget::HERO_COMMANDER: + cbsn = gs->getHero(id.as())->getCommander(); + break; case ETarget::PLAYER: cbsn = gs->getPlayerState(id.as()); break; diff --git a/lib/networkPacks/PacksForClient.h b/lib/networkPacks/PacksForClient.h index 9b3a2f992..8067aa6dd 100644 --- a/lib/networkPacks/PacksForClient.h +++ b/lib/networkPacks/PacksForClient.h @@ -409,8 +409,14 @@ struct DLL_LINKAGE SetAvailableHero : public CPackForClient struct DLL_LINKAGE GiveBonus : public CPackForClient { using VariantType = VariantIdentifier; - enum class ETarget : int8_t { OBJECT, PLAYER, BATTLE }; - + enum class ETarget : int8_t + { + OBJECT, + PLAYER, + BATTLE, + HERO_COMMANDER + }; + explicit GiveBonus(ETarget Who = ETarget::OBJECT) :who(Who) { diff --git a/lib/rewardable/Info.cpp b/lib/rewardable/Info.cpp index 409f7c3ca..c0516125d 100644 --- a/lib/rewardable/Info.cpp +++ b/lib/rewardable/Info.cpp @@ -175,6 +175,7 @@ void Rewardable::Info::configureReward(Rewardable::Configuration & object, vstd: reward.removeObject = source["removeObject"].Bool(); reward.heroBonuses = randomizer.loadBonuses(source["bonuses"]); + reward.commanderBonuses = randomizer.loadBonuses(source["commanderBonuses"]); reward.playerBonuses = randomizer.loadBonuses(source["playerBonuses"]); reward.guards = randomizer.loadCreatures(source["guards"], rng, variables); diff --git a/lib/rewardable/Interface.cpp b/lib/rewardable/Interface.cpp index 76ec474ed..d9ebbb691 100644 --- a/lib/rewardable/Interface.cpp +++ b/lib/rewardable/Interface.cpp @@ -157,6 +157,15 @@ void Rewardable::Interface::grantRewardAfterLevelup(const Rewardable::VisitInfo cb->giveHeroBonus(&gb); } + if (hero->getCommander()) + { + for(const Bonus & bonus : info.reward.commanderBonuses) + { + GiveBonus gb(GiveBonus::ETarget::HERO_COMMANDER, hero->id, bonus); + cb->giveHeroBonus(&gb); + } + } + for(const Bonus & bonus : info.reward.playerBonuses) { GiveBonus gb(GiveBonus::ETarget::PLAYER, hero->getOwner(), bonus); diff --git a/lib/rewardable/Reward.h b/lib/rewardable/Reward.h index 0b42d250e..973fbcdcd 100644 --- a/lib/rewardable/Reward.h +++ b/lib/rewardable/Reward.h @@ -87,6 +87,7 @@ struct DLL_LINKAGE Reward final /// list of bonuses, e.g. morale/luck std::vector heroBonuses; + std::vector commanderBonuses; std::vector playerBonuses; /// skills that hero may receive or lose @@ -147,6 +148,7 @@ struct DLL_LINKAGE Reward final if (h.version >= Handler::Version::REWARDABLE_EXTENSIONS) { h & playerBonuses; + h & commanderBonuses; } h & grantedArtifacts; if (h.version >= Handler::Version::REWARDABLE_EXTENSIONS)