1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-08-10 22:31:40 +02:00

Implemented giving bonuses to commanders

This commit is contained in:
Ivan Savenko
2025-05-07 22:44:44 +03:00
parent 434da3ffe1
commit 6b6199d3a4
7 changed files with 25 additions and 2 deletions

View File

@@ -72,6 +72,7 @@ Rewardable::Configuration CRewardableConstructor::generateConfiguration(IGameCal
for(auto & rewardInfo : result.info) for(auto & rewardInfo : result.info)
{ {
assignBonuses(rewardInfo.reward.heroBonuses, objectID); assignBonuses(rewardInfo.reward.heroBonuses, objectID);
assignBonuses(rewardInfo.reward.commanderBonuses, objectID);
assignBonuses(rewardInfo.reward.playerBonuses, objectID); assignBonuses(rewardInfo.reward.playerBonuses, objectID);
} }

View File

@@ -102,6 +102,7 @@ Rewardable::Configuration TownRewardableBuildingInstance::generateConfiguration(
for(auto & rewardInfo : result.info) for(auto & rewardInfo : result.info)
{ {
assignBonuses(rewardInfo.reward.heroBonuses); assignBonuses(rewardInfo.reward.heroBonuses);
assignBonuses(rewardInfo.reward.commanderBonuses);
assignBonuses(rewardInfo.reward.playerBonuses); assignBonuses(rewardInfo.reward.playerBonuses);
} }
return result; return result;

View File

@@ -1014,6 +1014,9 @@ void GiveBonus::applyGs(CGameState *gs)
case ETarget::OBJECT: case ETarget::OBJECT:
cbsn = dynamic_cast<CBonusSystemNode*>(gs->getObjInstance(id.as<ObjectInstanceID>())); cbsn = dynamic_cast<CBonusSystemNode*>(gs->getObjInstance(id.as<ObjectInstanceID>()));
break; break;
case ETarget::HERO_COMMANDER:
cbsn = gs->getHero(id.as<ObjectInstanceID>())->getCommander();
break;
case ETarget::PLAYER: case ETarget::PLAYER:
cbsn = gs->getPlayerState(id.as<PlayerColor>()); cbsn = gs->getPlayerState(id.as<PlayerColor>());
break; break;

View File

@@ -409,8 +409,14 @@ struct DLL_LINKAGE SetAvailableHero : public CPackForClient
struct DLL_LINKAGE GiveBonus : public CPackForClient struct DLL_LINKAGE GiveBonus : public CPackForClient
{ {
using VariantType = VariantIdentifier<ObjectInstanceID, PlayerColor, BattleID>; using VariantType = VariantIdentifier<ObjectInstanceID, PlayerColor, BattleID>;
enum class ETarget : int8_t { OBJECT, PLAYER, BATTLE }; enum class ETarget : int8_t
{
OBJECT,
PLAYER,
BATTLE,
HERO_COMMANDER
};
explicit GiveBonus(ETarget Who = ETarget::OBJECT) explicit GiveBonus(ETarget Who = ETarget::OBJECT)
:who(Who) :who(Who)
{ {

View File

@@ -175,6 +175,7 @@ void Rewardable::Info::configureReward(Rewardable::Configuration & object, vstd:
reward.removeObject = source["removeObject"].Bool(); reward.removeObject = source["removeObject"].Bool();
reward.heroBonuses = randomizer.loadBonuses(source["bonuses"]); reward.heroBonuses = randomizer.loadBonuses(source["bonuses"]);
reward.commanderBonuses = randomizer.loadBonuses(source["commanderBonuses"]);
reward.playerBonuses = randomizer.loadBonuses(source["playerBonuses"]); reward.playerBonuses = randomizer.loadBonuses(source["playerBonuses"]);
reward.guards = randomizer.loadCreatures(source["guards"], rng, variables); reward.guards = randomizer.loadCreatures(source["guards"], rng, variables);

View File

@@ -157,6 +157,15 @@ void Rewardable::Interface::grantRewardAfterLevelup(const Rewardable::VisitInfo
cb->giveHeroBonus(&gb); 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) for(const Bonus & bonus : info.reward.playerBonuses)
{ {
GiveBonus gb(GiveBonus::ETarget::PLAYER, hero->getOwner(), bonus); GiveBonus gb(GiveBonus::ETarget::PLAYER, hero->getOwner(), bonus);

View File

@@ -87,6 +87,7 @@ struct DLL_LINKAGE Reward final
/// list of bonuses, e.g. morale/luck /// list of bonuses, e.g. morale/luck
std::vector<Bonus> heroBonuses; std::vector<Bonus> heroBonuses;
std::vector<Bonus> commanderBonuses;
std::vector<Bonus> playerBonuses; std::vector<Bonus> playerBonuses;
/// skills that hero may receive or lose /// skills that hero may receive or lose
@@ -147,6 +148,7 @@ struct DLL_LINKAGE Reward final
if (h.version >= Handler::Version::REWARDABLE_EXTENSIONS) if (h.version >= Handler::Version::REWARDABLE_EXTENSIONS)
{ {
h & playerBonuses; h & playerBonuses;
h & commanderBonuses;
} }
h & grantedArtifacts; h & grantedArtifacts;
if (h.version >= Handler::Version::REWARDABLE_EXTENSIONS) if (h.version >= Handler::Version::REWARDABLE_EXTENSIONS)