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:
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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;
|
||||||
|
@@ -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;
|
||||||
|
@@ -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)
|
||||||
{
|
{
|
||||||
|
@@ -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);
|
||||||
|
@@ -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);
|
||||||
|
@@ -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)
|
||||||
|
Reference in New Issue
Block a user