Browse Source

Implemented giving bonuses to commanders

Ivan Savenko 7 months ago
parent
commit
6b6199d3a4

+ 1 - 0
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);
 	}
 

+ 1 - 0
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;

+ 3 - 0
lib/networkPacks/NetPacksLib.cpp

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

+ 8 - 2
lib/networkPacks/PacksForClient.h

@@ -409,8 +409,14 @@ struct DLL_LINKAGE SetAvailableHero : public CPackForClient
 struct DLL_LINKAGE GiveBonus : public CPackForClient
 {
 	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)
 		:who(Who)
 	{

+ 1 - 0
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);

+ 9 - 0
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);

+ 2 - 0
lib/rewardable/Reward.h

@@ -87,6 +87,7 @@ struct DLL_LINKAGE Reward final
 
 	/// list of bonuses, e.g. morale/luck
 	std::vector<Bonus> heroBonuses;
+	std::vector<Bonus> commanderBonuses;
 	std::vector<Bonus> 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)