Pārlūkot izejas kodu

Removed pointers from PlayerState

Ivan Savenko 6 mēneši atpakaļ
vecāks
revīzija
331debaa3f

+ 1 - 1
lib/CGameInfoCallback.cpp

@@ -229,7 +229,7 @@ void CGameInfoCallback::getThievesGuildInfo(SThievesGuildInfo & thi, const CGObj
 
 	if(obj->ID == Obj::TOWN || obj->ID == Obj::TAVERN)
 	{
-		int taverns = gameState()->players[*getPlayerID()].valOfBonuses(BonusType::THIEVES_GUILD_ACCESS);
+		int taverns = gameState()->players.at(*getPlayerID()).valOfBonuses(BonusType::THIEVES_GUILD_ACCESS);
 		gameState()->obtainPlayersStats(thi, taverns);
 	}
 	else if(obj->ID == Obj::DEN_OF_THIEVES)

+ 26 - 60
lib/CPlayerState.cpp

@@ -10,18 +10,25 @@
 #include "StdInc.h"
 
 #include "CPlayerState.h"
-#include "json/JsonNode.h"
-#include "mapObjects/CGDwelling.h"
-#include "mapObjects/CGTownInstance.h"
+#include "GameLibrary.h"
+#include "IGameCallback.h"
 #include "mapObjects/CGHeroInstance.h"
+#include "mapObjects/CGTownInstance.h"
+#include "gameState/CGameState.h"
 #include "gameState/QuestInfo.h"
 #include "texts/CGeneralTextHandler.h"
-#include "GameLibrary.h"
+#include "json/JsonNode.h"
 
 VCMI_LIB_NAMESPACE_BEGIN
 
 PlayerState::PlayerState()
-	: color(-1)
+	:PlayerState(nullptr)
+{}
+
+PlayerState::PlayerState(IGameCallback *cb)
+	: CBonusSystemNode(PLAYER)
+	, GameCallbackHolder(cb)
+	, color(-1)
 	, human(false)
 	, cheated(false)
 	, playerLocalSettings(std::make_unique<JsonNode>())
@@ -29,7 +36,6 @@ PlayerState::PlayerState()
 	, enteredLosingCheatCode(false)
 	, status(EPlayerStatus::INGAME)
 {
-	setNodeType(PLAYER);
 }
 
 PlayerState::~PlayerState() = default;
@@ -103,90 +109,50 @@ template<typename T>
 std::vector<T> PlayerState::getObjectsOfType() const
 {
 	std::vector<T> result;
-	for (auto const & object : ownedObjects)
+	for (const ObjectInstanceID & objectID : ownedObjects)
 	{
-		auto casted = dynamic_cast<T>(object);
+		auto objectPtr = cb->gameState()->getObjInstance(objectID);
+		auto casted = dynamic_cast<T>(objectPtr);
 		if (casted)
 			result.push_back(casted);
 	}
 	return result;
 }
 
-const std::vector<const CGHeroInstance *> & PlayerState::getHeroes() const
+std::vector<const CGHeroInstance *> PlayerState::getHeroes() const
 {
-	return constOwnedHeroes;
+	return getObjectsOfType<const CGHeroInstance *>();
 }
 
-const std::vector<const CGTownInstance *> & PlayerState::getTowns() const
+std::vector<const CGTownInstance *> PlayerState::getTowns() const
 {
-	return constOwnedTowns;
+	return getObjectsOfType<const CGTownInstance *>();
 }
 
-const std::vector<CGHeroInstance *> & PlayerState::getHeroes()
+std::vector<CGHeroInstance *> PlayerState::getHeroes()
 {
-	return ownedHeroes;
+	return getObjectsOfType<CGHeroInstance *>();
 }
 
-const std::vector<CGTownInstance *> & PlayerState::getTowns()
+std::vector<CGTownInstance *> PlayerState::getTowns()
 {
-	return ownedTowns;
+	return getObjectsOfType<CGTownInstance *>();
 }
 
 std::vector<const CGObjectInstance *> PlayerState::getOwnedObjects() const
 {
-	return {ownedObjects.begin(), ownedObjects.end()};
+	return getObjectsOfType<const CGObjectInstance *>();
 }
 
 void PlayerState::addOwnedObject(CGObjectInstance * object)
 {
 	assert(object->asOwnable() != nullptr);
-	ownedObjects.push_back(object);
-
-	auto * town = dynamic_cast<CGTownInstance*>(object);
-	auto * hero = dynamic_cast<CGHeroInstance*>(object);
-
-	if (town)
-	{
-		ownedTowns.push_back(town);
-		constOwnedTowns.push_back(town);
-	}
-
-	if (hero)
-	{
-		ownedHeroes.push_back(hero);
-		constOwnedHeroes.push_back(hero);
-	}
-}
-
-void PlayerState::postDeserialize()
-{
-	for (const auto& object : ownedObjects)
-	{
-		auto* town = dynamic_cast<CGTownInstance*>(object);
-		auto* hero = dynamic_cast<CGHeroInstance*>(object);
-
-		if (town)
-		{
-			ownedTowns.push_back(town);
-			constOwnedTowns.push_back(town);
-		}
-
-		if (hero)
-		{
-			ownedHeroes.push_back(hero);
-			constOwnedHeroes.push_back(hero);
-		}
-	}
+	ownedObjects.push_back(object->id);
 }
 
 void PlayerState::removeOwnedObject(CGObjectInstance * object)
 {
-	vstd::erase(ownedObjects, object);
-	vstd::erase(ownedTowns, object);
-	vstd::erase(constOwnedTowns, object);
-	vstd::erase(ownedHeroes, object);
-	vstd::erase(constOwnedHeroes, object);
+	vstd::erase(ownedObjects, object->id);
 }
 
-
 VCMI_LIB_NAMESPACE_END

+ 10 - 17
lib/CPlayerState.h

@@ -12,10 +12,11 @@
 #include <vcmi/Player.h>
 #include <vcmi/Team.h>
 
-#include "bonuses/Bonus.h"
-#include "bonuses/CBonusSystemNode.h"
+#include "GameCallbackHolder.h"
 #include "ResourceSet.h"
 #include "TurnTimerInfo.h"
+#include "bonuses/Bonus.h"
+#include "bonuses/CBonusSystemNode.h"
 
 VCMI_LIB_NAMESPACE_BEGIN
 
@@ -25,7 +26,7 @@ class CGTownInstance;
 class CGDwelling;
 struct QuestInfo;
 
-class DLL_LINKAGE PlayerState : public CBonusSystemNode, public Player
+class DLL_LINKAGE PlayerState : public CBonusSystemNode, public Player, public GameCallbackHolder
 {
 	struct VisitedObjectGlobal
 	{
@@ -47,12 +48,7 @@ class DLL_LINKAGE PlayerState : public CBonusSystemNode, public Player
 		}
 	};
 
-	std::vector<CGObjectInstance*> ownedObjects;
-
-	std::vector<const CGTownInstance*> constOwnedTowns; //not serialized
-	std::vector<const CGHeroInstance*> constOwnedHeroes; //not serialized
-	std::vector<CGTownInstance*> ownedTowns; //not serialized
-	std::vector<CGHeroInstance*> ownedHeroes; //not serialized
+	std::vector<ObjectInstanceID> ownedObjects;
 
 	template<typename T>
 	std::vector<T> getObjectsOfType() const;
@@ -78,6 +74,7 @@ public:
 	std::optional<ui8> daysWithoutCastle;
 	TurnTimerInfo turnTimer;
 
+	PlayerState(IGameCallback *cb);
 	PlayerState();
 	~PlayerState();
 
@@ -97,16 +94,15 @@ public:
 	std::string getNameTextID() const override;
 	void registerIcons(const IconRegistar & cb) const override;
 
-	const std::vector<const CGHeroInstance* > & getHeroes() const;
-	const std::vector<const CGTownInstance* > & getTowns() const;
-	const std::vector<CGHeroInstance* > & getHeroes();
-	const std::vector<CGTownInstance* > & getTowns();
+	std::vector<const CGHeroInstance* > getHeroes() const;
+	std::vector<const CGTownInstance* > getTowns() const;
+	std::vector<CGHeroInstance* > getHeroes();
+	std::vector<CGTownInstance* > getTowns();
 
 	std::vector<const CGObjectInstance* > getOwnedObjects() const;
 
 	void addOwnedObject(CGObjectInstance * object);
 	void removeOwnedObject(CGObjectInstance * object);
-	void postDeserialize();
 
 	bool checkVanquished() const
 	{
@@ -135,9 +131,6 @@ public:
 		h & enteredWinningCheatCode;
 		h & static_cast<CBonusSystemNode&>(*this);
 		h & destroyedObjects;
-
-		if (!h.saving)
-			postDeserialize();
 	}
 };
 

+ 1 - 1
lib/GameCallbackHolder.h

@@ -16,7 +16,7 @@ class IGameCallback;
 class DLL_LINKAGE GameCallbackHolder
 {
 public:
-	IGameCallback * const cb;
+	IGameCallback * cb;
 
 	explicit GameCallbackHolder(IGameCallback *cb):
 		cb(cb)

+ 5 - 2
lib/gameState/CGameState.cpp

@@ -274,7 +274,7 @@ void CGameState::updateOnLoad(StartInfo * si)
 	assert(callback);
 	scenarioOps->playerInfos = si->playerInfos;
 	for(auto & i : si->playerInfos)
-		players[i.first].human = i.second.isControlledByHuman();
+		players.at(i.first).human = i.second.isControlledByHuman();
 	scenarioOps->extraOptionsInfo = si->extraOptionsInfo;
 	scenarioOps->turnTimerInfo = si->turnTimerInfo;
 	scenarioOps->simturnsInfo = si->simturnsInfo;
@@ -514,7 +514,7 @@ void CGameState::initPlayerStates()
 	logGlobal->debug("\tCreating player entries in gs");
 	for(auto & elem : scenarioOps->playerInfos)
 	{
-		PlayerState & p = players[elem.first];
+		PlayerState & p = players.at(elem.first);
 		p.color=elem.first;
 		p.human = elem.second.isControlledByHuman();
 		p.team = map->players[elem.first.getNum()].team;
@@ -1572,6 +1572,9 @@ void CGameState::buildBonusSystemTree()
 
 void CGameState::deserializationFix()
 {
+	for(auto & player : players)
+		player.second.cb = callback;
+
 	buildGlobalTeamPlayerTree();
 	attachArmedObjects();
 }

+ 2 - 2
lib/gameState/CGameStateCampaign.cpp

@@ -523,7 +523,7 @@ void CGameStateCampaign::initHeroes()
 		}
 		assert(humanPlayer != PlayerColor::NEUTRAL);
 
-		const auto & heroes = gameState->players[humanPlayer].getHeroes();
+		const auto & heroes = gameState->players.at(humanPlayer).getHeroes();
 
 		if (chosenBonus->info1 == HeroTypeID::CAMP_STRONGEST) //most powerful
 		{
@@ -607,7 +607,7 @@ void CGameStateCampaign::initStartingResources()
 			//increasing resource quantity
 			for (auto & re : res)
 			{
-				gameState->players[ps->color].resources[re] += chosenBonus->info2;
+				gameState->players.at(ps->color).resources[re] += chosenBonus->info2;
 			}
 		}
 	}

+ 1 - 1
lib/networkPacks/NetPacksLib.cpp

@@ -903,7 +903,7 @@ void SetCommanderProperty::applyGs(CGameState *gs)
 void AddQuest::applyGs(CGameState *gs)
 {
 	assert (vstd::contains(gs->players, player));
-	auto * vec = &gs->players[player].quests;
+	auto * vec = &gs->players.at(player).quests;
 	if (!vstd::contains(*vec, quest))
 		vec->push_back (quest);
 	else