Browse Source

Move UpgradeInfo class to header and source files

MichalZr6 11 months ago
parent
commit
f893c80192

+ 2 - 1
AI/Nullkiller/AIGateway.cpp

@@ -19,6 +19,7 @@
 #include "../../lib/CConfigHandler.h"
 #include "../../lib/IGameSettings.h"
 #include "../../lib/gameState/CGameState.h"
+#include "../../lib/gameState/UpgradeInfo.h"
 #include "../../lib/serializer/CTypeList.h"
 #include "../../lib/networkPacks/PacksForClient.h"
 #include "../../lib/networkPacks/PacksForClientBattle.h"
@@ -805,7 +806,7 @@ bool AIGateway::makePossibleUpgrades(const CArmedInstance * obj)
 						myCb->upgradeCreature(obj, SlotID(i), upgID);
 						upgraded = true;
 						logAi->debug("Upgraded %d %s to %s", s->count, upgradeInfo.oldID.toCreature()->getNamePluralTranslated(), 
-							upgradeInfo.getNextUpgrade().toCreature()->getNamePluralTranslated());
+							upgradeInfo.getUpgrade().toCreature()->getNamePluralTranslated());
 					}
 					else
 						break;

+ 2 - 1
AI/VCAI/VCAI.cpp

@@ -22,6 +22,7 @@
 #include "../../lib/CConfigHandler.h"
 #include "../../lib/IGameSettings.h"
 #include "../../lib/gameState/CGameState.h"
+#include "../../lib/gameState/UpgradeInfo.h"
 #include "../../lib/bonuses/Limiters.h"
 #include "../../lib/bonuses/Updaters.h"
 #include "../../lib/bonuses/Propagators.h"
@@ -770,7 +771,7 @@ void makePossibleUpgrades(const CArmedInstance * obj)
 					{
 						cb->upgradeCreature(obj, SlotID(i), upgID);
 						logAi->debug("Upgraded %d %s to %s", s->count, upgradeInfo.oldID.toCreature()->getNamePluralTranslated(), 
-							upgradeInfo.getNextUpgrade().toCreature()->getNamePluralTranslated());
+							upgradeInfo.getUpgrade().toCreature()->getNamePluralTranslated());
 					}
 					else
 						break;

+ 1 - 0
client/widgets/CGarrisonInt.cpp

@@ -33,6 +33,7 @@
 #include "../../lib/mapObjects/CGHeroInstance.h"
 #include "../../lib/networkPacks/ArtifactLocation.h"
 #include "../../lib/gameState/CGameState.h"
+#include "../../lib/gameState/UpgradeInfo.h"
 
 void CGarrisonSlot::setHighlight(bool on)
 {

+ 2 - 1
client/windows/CCreatureWindow.cpp

@@ -35,6 +35,7 @@
 #include "../../lib/IGameSettings.h"
 #include "../../lib/entities/hero/CHeroHandler.h"
 #include "../../lib/gameState/CGameState.h"
+#include "../../lib/gameState/UpgradeInfo.h"
 #include "../../lib/networkPacks/ArtifactLocation.h"
 #include "../../lib/texts/CGeneralTextHandler.h"
 #include "../../lib/texts/TextOperations.h"
@@ -363,7 +364,7 @@ CStackWindow::ButtonsSection::ButtonsSection(CStackWindow * owner, int yOffset)
 
 		for(size_t buttonIndex = 0; buttonIndex < buttonsToCreate; buttonIndex++)
 		{
-			TResources totalCost = upgradeInfo.info.getUpgradeCosts().at(buttonIndex) * parent->info->creatureCount;
+			TResources totalCost = upgradeInfo.info.getAvailableUpgradeCosts().at(buttonIndex) * parent->info->creatureCount;
 
 			auto onUpgrade = [=]()
 			{

+ 4 - 3
client/windows/GUIClasses.cpp

@@ -53,6 +53,7 @@
 #include "../lib/gameState/CGameState.h"
 #include "../lib/gameState/SThievesGuildInfo.h"
 #include "../lib/gameState/TavernHeroesPool.h"
+#include "../lib/gameState/UpgradeInfo.h"
 #include "../lib/texts/CGeneralTextHandler.h"
 #include "../lib/IGameSettings.h"
 #include "ConditionalWait.h"
@@ -1159,7 +1160,7 @@ void CHillFortWindow::updateGarrisons()
 				LOCPLINT->cb->fillUpgradeInfo(hero, SlotID(i), info);
 				if(info.canUpgrade())	//we have upgrades here - update costs
 				{
-					costs[i] = info.getNextUpgradeCosts() * hero->getStackCount(SlotID(i));
+					costs[i] = info.getUpgradeCosts() * hero->getStackCount(SlotID(i));
 					totalSum += costs[i];
 				}
 			}
@@ -1271,7 +1272,7 @@ void CHillFortWindow::makeDeal(SlotID slot)
 					{
 						UpgradeInfo info(s->getCreatureID());
 						LOCPLINT->cb->fillUpgradeInfo(hero, SlotID(i), info);
-						LOCPLINT->cb->upgradeCreature(hero, SlotID(i), info.getNextUpgrade());
+						LOCPLINT->cb->upgradeCreature(hero, SlotID(i), info.getUpgrade());
 					}
 				}
 			}
@@ -1309,7 +1310,7 @@ CHillFortWindow::State CHillFortWindow::getState(SlotID slot)
 	if(!info.hasUpgrades())
 		return State::ALREADY_UPGRADED;
 
-	if(!(info.getNextUpgradeCosts() * hero->getStackCount(slot)).canBeAfforded(myRes))
+	if(!(info.getUpgradeCosts() * hero->getStackCount(slot)).canBeAfforded(myRes))
 		return State::UNAFFORDABLE;
 
 	return State::MAKE_UPGRADE;

+ 1 - 0
lib/CMakeLists.txt

@@ -109,6 +109,7 @@ set(lib_MAIN_SRCS
 	gameState/RumorState.cpp
 	gameState/TavernHeroesPool.cpp
 	gameState/GameStatistics.cpp
+	gameState/UpgradeInfo.cpp
 
 	mapObjectConstructors/AObjectTypeHandler.cpp
 	mapObjectConstructors/CBankInstanceConstructor.cpp

+ 1 - 19
lib/gameState/CGameState.cpp

@@ -52,6 +52,7 @@
 #include "../rmg/CMapGenerator.h"
 #include "../serializer/CMemorySerializer.h"
 #include "../spells/CSpellHandler.h"
+#include "UpgradeInfo.h"
 
 #include <vstd/RNG.h>
 
@@ -1779,23 +1780,4 @@ ArtifactID CGameState::pickRandomArtifact(vstd::RNG & rand, int flags)
 	return pickRandomArtifact(rand, flags, [](const ArtifactID &) { return true; });
 }
 
-void UpgradeInfo::addUpgrade(const CreatureID & upgradeID, const Creature * creature, int costModifier)
-{
-	isAvailable = costModifier >= 0;
-	upgradesIDs.push_back(upgradeID);
-	
-	ResourceSet upgradeCost = (upgradeID.toCreature()->getFullRecruitCost() - creature->getFullRecruitCost()) * costModifier / 100;
-	upgradeCost.positive(); //upgrade cost can't be negative, ignore missing resources
-	upgradesCosts.push_back(std::move(upgradeCost));
-
-	// sort from highest ID to smallest
-	size_t pos = upgradesIDs.size() - 1;
-	while(pos > 0 && upgradesIDs[pos] > upgradesIDs[pos - 1])
-	{
-		std::swap(upgradesIDs[pos], upgradesIDs[pos - 1]);
-		std::swap(upgradesCosts[pos], upgradesCosts[pos - 1]);
-		--pos;
-	}
-}
-
 VCMI_LIB_NAMESPACE_END

+ 1 - 64
lib/gameState/CGameState.h

@@ -38,71 +38,8 @@ class TavernHeroesPool;
 struct SThievesGuildInfo;
 class CRandomGenerator;
 class GameSettings;
-
-class UpgradeInfo
-{
-public:
-	UpgradeInfo() = delete;
-	UpgradeInfo(CreatureID base)
-		: oldID(base), isAvailable(true)
-	{ }
-
-	CreatureID oldID; //creature to be upgraded
-
-	const std::vector<CreatureID> & getAvailableUpgrades() const
-	{
-		return upgradesIDs;
-	}
-
-	const CreatureID & getNextUpgrade() const
-	{
-		return upgradesIDs.back();
-	}
-
-	const ResourceSet & getUpgradeCostsFor(CreatureID id) const
-	{
-		auto idIt = std::find(upgradesIDs.begin(), upgradesIDs.end(), id);
-
-		assert(idIt != upgradesIDs.end());
-
-		return upgradesCosts[std::distance(upgradesIDs.begin(), idIt)];
-	}
-
-	const std::vector<ResourceSet> & getUpgradeCosts() const
-	{
-		return upgradesCosts;
-	}
-
-	const ResourceSet & getNextUpgradeCosts() const
-	{
-		return upgradesCosts.back();
-	}
-
-	bool canUpgrade() const
-	{
-		return !upgradesIDs.empty() && isAvailable;
-	}
-
-	bool hasUpgrades() const
-	{
-		return !upgradesIDs.empty();
-	}
-
-	// Adds a new upgrade and ensures alignment and sorted order
-	void addUpgrade(const CreatureID & upgradeID, const Creature * creature, int costModifier = 100);
-
-	auto size() const
-	{
-		return upgradesIDs.size();
-	}
-
-private:
-	std::vector<CreatureID> upgradesIDs; //possible upgrades
-	std::vector<ResourceSet> upgradesCosts; // cost[upgrade_serial] -> set of pairs<resource_ID,resource_amount>; cost is for single unit (not entire stack)
-	bool isAvailable;		// flag for unavailableUpgrades like in miniHillFort from HoTA
-};
-
 class BattleInfo;
+class UpgradeInfo;
 
 DLL_LINKAGE std::ostream & operator<<(std::ostream & os, const EVictoryLossCheckResult & victoryLossCheckResult);
 

+ 36 - 0
lib/gameState/UpgradeInfo.cpp

@@ -0,0 +1,36 @@
+/*
+ * UpgradeInfo.cpp, part of VCMI engine
+ *
+ * Authors: listed in file AUTHORS in main folder
+ *
+ * License: GNU General Public License v2.0 or later
+ * Full text of license available in license.txt file, in main folder
+ *
+ */
+#include "StdInc.h"
+#include "UpgradeInfo.h"
+#include "CCreatureHandler.h"
+
+VCMI_LIB_NAMESPACE_BEGIN
+
+void UpgradeInfo::addUpgrade(const CreatureID & upgradeID, const Creature * creature, int costPercentageModifier)
+{
+	isAvailable = costPercentageModifier >= 0;
+
+	upgradesIDs.push_back(upgradeID);
+
+	ResourceSet upgradeCost = (upgradeID.toCreature()->getFullRecruitCost() - creature->getFullRecruitCost()) * costPercentageModifier / 100;
+	upgradeCost.positive(); //upgrade cost can't be negative, ignore missing resources
+	upgradesCosts.push_back(std::move(upgradeCost));
+
+	// sort from highest ID to smallest
+	size_t pos = upgradesIDs.size() - 1;
+	while(pos > 0 && upgradesIDs[pos] > upgradesIDs[pos - 1])
+	{
+		std::swap(upgradesIDs[pos], upgradesIDs[pos - 1]);
+		std::swap(upgradesCosts[pos], upgradesCosts[pos - 1]);
+		--pos;
+	}
+}
+
+VCMI_LIB_NAMESPACE_END

+ 82 - 0
lib/gameState/UpgradeInfo.h

@@ -0,0 +1,82 @@
+/*
+ * UpgradeInfo.h, part of VCMI engine
+ *
+ * Authors: listed in file AUTHORS in main folder
+ *
+ * License: GNU General Public License v2.0 or later
+ * Full text of license available in license.txt file, in main folder
+ *
+ */
+#pragma once
+
+#include "../lib/constants/EntityIdentifiers.h"
+#include "../lib/ResourceSet.h"
+
+VCMI_LIB_NAMESPACE_BEGIN
+
+class DLL_LINKAGE UpgradeInfo
+{
+public:
+	UpgradeInfo() = delete;
+	UpgradeInfo(CreatureID base)
+		: oldID(base), isAvailable(true)
+	{
+	}
+
+	CreatureID oldID; //creature to be upgraded
+
+	const std::vector<CreatureID> & getAvailableUpgrades() const
+	{
+		return upgradesIDs;
+	}
+
+	const CreatureID & getUpgrade() const
+	{
+		return upgradesIDs.back();
+	}
+
+	const ResourceSet & getUpgradeCostsFor(CreatureID id) const
+	{
+		auto idIt = std::find(upgradesIDs.begin(), upgradesIDs.end(), id);
+
+		assert(idIt != upgradesIDs.end());
+
+		return upgradesCosts[std::distance(upgradesIDs.begin(), idIt)];
+	}
+
+	const std::vector<ResourceSet> & getAvailableUpgradeCosts() const
+	{
+		return upgradesCosts;
+	}
+
+	const ResourceSet & getUpgradeCosts() const
+	{
+		return upgradesCosts.back();
+	}
+
+	bool canUpgrade() const
+	{
+		return !upgradesIDs.empty() && isAvailable;
+	}
+
+	bool hasUpgrades() const
+	{
+		return !upgradesIDs.empty();
+	}
+
+	// Adds a new upgrade and ensures alignment and sorted order
+	void addUpgrade(const CreatureID & upgradeID, const Creature * creature, int costPercentageModifier = 100);
+
+	auto size() const
+	{
+		return upgradesIDs.size();
+	}
+
+private:
+	std::vector<CreatureID> upgradesIDs; //possible upgrades
+	std::vector<ResourceSet> upgradesCosts; // cost[upgrade_serial] -> set of pairs<resource_ID,resource_amount>; cost is for single unit (not entire stack)
+	bool isAvailable;		// flag for unavailableUpgrades like in miniHillFort from HoTA
+};
+
+VCMI_LIB_NAMESPACE_END
+

+ 1 - 0
lib/mapObjects/CGHeroInstance.cpp

@@ -25,6 +25,7 @@
 #include "../CSkillHandler.h"
 #include "../IGameCallback.h"
 #include "../gameState/CGameState.h"
+#include "../gameState/UpgradeInfo.h"
 #include "../CCreatureHandler.h"
 #include "../mapping/CMap.h"
 #include "../StartInfo.h"

+ 1 - 0
lib/mapObjects/CGHeroInstance.h

@@ -23,6 +23,7 @@ class CHero;
 class CGBoat;
 class CGTownInstance;
 class CMap;
+class UpgradeInfo;
 struct TerrainTile;
 struct TurnInfo;
 

+ 1 - 0
lib/mapObjects/CGTownInstance.cpp

@@ -20,6 +20,7 @@
 #include "../texts/CGeneralTextHandler.h"
 #include "../IGameCallback.h"
 #include "../gameState/CGameState.h"
+#include "../gameState/UpgradeInfo.h"
 #include "../mapping/CMap.h"
 #include "../CPlayerState.h"
 #include "../StartInfo.h"

+ 2 - 4
lib/mapObjects/MiscObjects.cpp

@@ -32,6 +32,7 @@
 #include "../networkPacks/PacksForClient.h"
 #include "../networkPacks/PacksForClientBattle.h"
 #include "../networkPacks/StackLocation.h"
+#include "../lib/gameState/UpgradeInfo.h"
 
 #include <vstd/RNG.h>
 
@@ -1323,12 +1324,9 @@ void HillFort::fillUpgradeInfo(UpgradeInfo & info, const CStackInstance &stack)
 
 	int costModifier = upgradeCostPercentage[index];
 
-	if(costModifier < 0) // upgrade not allowed
-		return;
-
 	for(const auto & nid : stack.getCreature()->upgrades)
 	{
-		info.addUpgrade(nid, stack.getType(), costModifier / 100);
+		info.addUpgrade(nid, stack.getType(), costModifier);
 	}
 }
 

+ 1 - 0
lib/mapObjects/MiscObjects.h

@@ -16,6 +16,7 @@
 VCMI_LIB_NAMESPACE_BEGIN
 
 class CMap;
+class UpgradeInfo;
 
 // This one teleport-specific, but has to be available everywhere in callbacks and netpacks
 // For now it's will be there till teleports code refactored and moved into own file

+ 1 - 0
server/CGameHandler.cpp

@@ -53,6 +53,7 @@
 #include "../lib/filesystem/Filesystem.h"
 
 #include "../lib/gameState/CGameState.h"
+#include "../lib/gameState/UpgradeInfo.h"
 
 #include "../lib/mapping/CMap.h"
 #include "../lib/mapping/CMapService.h"