mirror of
https://github.com/vcmi/vcmi.git
synced 2025-11-06 09:09:40 +02:00
Removed pointers from PlayerState
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@ class IGameCallback;
|
||||
class DLL_LINKAGE GameCallbackHolder
|
||||
{
|
||||
public:
|
||||
IGameCallback * const cb;
|
||||
IGameCallback * cb;
|
||||
|
||||
explicit GameCallbackHolder(IGameCallback *cb):
|
||||
cb(cb)
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user