mirror of
https://github.com/vcmi/vcmi.git
synced 2024-12-24 22:14:36 +02:00
* refactoring
This commit is contained in:
parent
86dc9386d6
commit
d540723739
@ -83,7 +83,7 @@ void CBattleAI::init( CBattleCallback * CB )
|
|||||||
{
|
{
|
||||||
print("init called, saving ptr to IBattleCallback");
|
print("init called, saving ptr to IBattleCallback");
|
||||||
cbc = cb = CB;
|
cbc = cb = CB;
|
||||||
playerID = CB->getPlayerID();; //TODO should be sth in callback
|
playerID = *CB->getPlayerID();; //TODO should be sth in callback
|
||||||
|
|
||||||
wasWaitingForRealize = cb->waitTillRealize;
|
wasWaitingForRealize = cb->waitTillRealize;
|
||||||
wasUnlockingGs = CB->unlockGsWhenWaiting;
|
wasUnlockingGs = CB->unlockGsWhenWaiting;
|
||||||
|
@ -868,7 +868,7 @@ void VCAI::init(CCallback * CB)
|
|||||||
cbc = CB;
|
cbc = CB;
|
||||||
NET_EVENT_HANDLER;
|
NET_EVENT_HANDLER;
|
||||||
LOG_ENTRY;
|
LOG_ENTRY;
|
||||||
playerID = myCb->getMyColor();
|
playerID = *myCb->getMyColor();
|
||||||
myCb->waitTillRealize = true;
|
myCb->waitTillRealize = true;
|
||||||
myCb->unlockGsWhenWaiting = true;
|
myCb->unlockGsWhenWaiting = true;
|
||||||
|
|
||||||
|
@ -58,6 +58,7 @@ bool CCallback::moveHero(const CGHeroInstance *h, int3 dst)
|
|||||||
|
|
||||||
int CCallback::selectionMade(int selection, int queryID)
|
int CCallback::selectionMade(int selection, int queryID)
|
||||||
{
|
{
|
||||||
|
ASSERT_IF_CALLED_WITH_PLAYER
|
||||||
if(queryID == -1)
|
if(queryID == -1)
|
||||||
{
|
{
|
||||||
tlog1 << "Cannot answer the query -1!\n";
|
tlog1 << "Cannot answer the query -1!\n";
|
||||||
@ -65,7 +66,7 @@ int CCallback::selectionMade(int selection, int queryID)
|
|||||||
}
|
}
|
||||||
|
|
||||||
QueryReply pack(queryID,selection);
|
QueryReply pack(queryID,selection);
|
||||||
pack.player = player;
|
pack.player = *player;
|
||||||
return sendRequest(&pack);
|
return sendRequest(&pack);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -97,7 +98,7 @@ bool CCallback::upgradeCreature(const CArmedInstance *obj, int stackPos, Creatur
|
|||||||
|
|
||||||
void CCallback::endTurn()
|
void CCallback::endTurn()
|
||||||
{
|
{
|
||||||
tlog5 << "Player " << (unsigned)player << " ended his turn." << std::endl;
|
tlog5 << "Player " << (unsigned)*player << " ended his turn." << std::endl;
|
||||||
EndTurn pack;
|
EndTurn pack;
|
||||||
sendRequest(&pack); //report that we ended turn
|
sendRequest(&pack); //report that we ended turn
|
||||||
}
|
}
|
||||||
@ -186,7 +187,7 @@ int CBattleCallback::battleMakeAction(BattleAction* action)
|
|||||||
|
|
||||||
int CBattleCallback::sendRequest(const CPack *request)
|
int CBattleCallback::sendRequest(const CPack *request)
|
||||||
{
|
{
|
||||||
int requestID = cl->sendRequest(request, player);
|
int requestID = cl->sendRequest(request, *player);
|
||||||
if(waitTillRealize)
|
if(waitTillRealize)
|
||||||
{
|
{
|
||||||
tlog5 << boost::format("We'll wait till request %d is answered.\n") % requestID;
|
tlog5 << boost::format("We'll wait till request %d is answered.\n") % requestID;
|
||||||
@ -199,7 +200,7 @@ int CBattleCallback::sendRequest(const CPack *request)
|
|||||||
|
|
||||||
void CCallback::swapGarrisonHero( const CGTownInstance *town )
|
void CCallback::swapGarrisonHero( const CGTownInstance *town )
|
||||||
{
|
{
|
||||||
if(town->tempOwner != player) return;
|
if(town->tempOwner != *player) return;
|
||||||
|
|
||||||
GarrisonHeroSwap pack(town->id);
|
GarrisonHeroSwap pack(town->id);
|
||||||
sendRequest(&pack);
|
sendRequest(&pack);
|
||||||
@ -235,7 +236,7 @@ void CCallback::setFormation(const CGHeroInstance * hero, bool tight)
|
|||||||
void CCallback::setSelection(const CArmedInstance * obj)
|
void CCallback::setSelection(const CArmedInstance * obj)
|
||||||
{
|
{
|
||||||
SetSelection ss;
|
SetSelection ss;
|
||||||
ss.player = player;
|
ss.player = *player;
|
||||||
ss.id = obj->id;
|
ss.id = obj->id;
|
||||||
sendRequest(&(CPackForClient&)ss);
|
sendRequest(&(CPackForClient&)ss);
|
||||||
|
|
||||||
@ -245,7 +246,7 @@ void CCallback::setSelection(const CArmedInstance * obj)
|
|||||||
cl->calculatePaths(static_cast<const CGHeroInstance *>(obj));
|
cl->calculatePaths(static_cast<const CGHeroInstance *>(obj));
|
||||||
|
|
||||||
//nasty workaround. TODO: nice workaround
|
//nasty workaround. TODO: nice workaround
|
||||||
cl->gs->getPlayer(player)->currentSelection = obj->id;
|
cl->gs->getPlayer(*player)->currentSelection = obj->id;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -254,12 +255,12 @@ void CCallback::recruitHero(const CGObjectInstance *townOrTavern, const CGHeroIn
|
|||||||
assert(townOrTavern);
|
assert(townOrTavern);
|
||||||
assert(hero);
|
assert(hero);
|
||||||
ui8 i=0;
|
ui8 i=0;
|
||||||
for(; i<gs->players[player].availableHeroes.size(); i++)
|
for(; i<gs->players[*player].availableHeroes.size(); i++)
|
||||||
{
|
{
|
||||||
if(gs->players[player].availableHeroes[i] == hero)
|
if(gs->players[*player].availableHeroes[i] == hero)
|
||||||
{
|
{
|
||||||
HireHero pack(i,townOrTavern->id);
|
HireHero pack(i,townOrTavern->id);
|
||||||
pack.player = player;
|
pack.player = *player;
|
||||||
sendRequest(&pack);
|
sendRequest(&pack);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -274,7 +275,8 @@ void CCallback::save( const std::string &fname )
|
|||||||
|
|
||||||
void CCallback::sendMessage(const std::string &mess)
|
void CCallback::sendMessage(const std::string &mess)
|
||||||
{
|
{
|
||||||
PlayerMessage pm(player, mess);
|
ASSERT_IF_CALLED_WITH_PLAYER
|
||||||
|
PlayerMessage pm(*player, mess);
|
||||||
sendRequest(&(CPackForClient&)pm);
|
sendRequest(&(CPackForClient&)pm);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -285,7 +287,7 @@ void CCallback::buildBoat( const IShipyard *obj )
|
|||||||
sendRequest(&bb);
|
sendRequest(&bb);
|
||||||
}
|
}
|
||||||
|
|
||||||
CCallback::CCallback( CGameState * GS, int Player, CClient *C )
|
CCallback::CCallback( CGameState * GS, boost::optional<TPlayerColor> Player, CClient *C )
|
||||||
:CBattleCallback(GS, Player, C)
|
:CBattleCallback(GS, Player, C)
|
||||||
{
|
{
|
||||||
waitTillRealize = false;
|
waitTillRealize = false;
|
||||||
@ -314,7 +316,7 @@ bool CCallback::getPath2( int3 dest, CGPath &ret )
|
|||||||
|
|
||||||
void CCallback::recalculatePaths()
|
void CCallback::recalculatePaths()
|
||||||
{
|
{
|
||||||
cl->calculatePaths(cl->IGameCallback::getSelectedHero(player));
|
cl->calculatePaths(cl->IGameCallback::getSelectedHero(*player));
|
||||||
}
|
}
|
||||||
|
|
||||||
void CCallback::calculatePaths( const CGHeroInstance *hero, CPathsInfo &out, int3 src /*= int3(-1,-1,-1)*/, int movement /*= -1*/ )
|
void CCallback::calculatePaths( const CGHeroInstance *hero, CPathsInfo &out, int3 src /*= int3(-1,-1,-1)*/, int movement /*= -1*/ )
|
||||||
@ -340,15 +342,16 @@ void CCallback::castSpell(const CGHeroInstance *hero, SpellID spellID, const int
|
|||||||
|
|
||||||
void CCallback::unregisterMyInterface()
|
void CCallback::unregisterMyInterface()
|
||||||
{
|
{
|
||||||
assert(player >= 0); //works only for player callback
|
ASSERT_IF_CALLED_WITH_PLAYER
|
||||||
cl->playerint.erase(player);
|
cl->playerint.erase(*player);
|
||||||
cl->battleints.erase(player);
|
cl->battleints.erase(*player);
|
||||||
//TODO? should callback be disabled as well?
|
//TODO? should callback be disabled as well?
|
||||||
}
|
}
|
||||||
|
|
||||||
void CCallback::validatePaths()
|
void CCallback::validatePaths()
|
||||||
{
|
{
|
||||||
const CGHeroInstance *h = cl->IGameCallback::getSelectedHero(player);
|
ASSERT_IF_CALLED_WITH_PLAYER
|
||||||
|
const CGHeroInstance *h = cl->IGameCallback::getSelectedHero(*player);
|
||||||
if(h && ( cl->pathInfo->hero != h //wrong hero
|
if(h && ( cl->pathInfo->hero != h //wrong hero
|
||||||
|| cl->pathInfo->hpos != h->getPosition(false) //wrong hero positoin
|
|| cl->pathInfo->hpos != h->getPosition(false) //wrong hero positoin
|
||||||
|| !cl->pathInfo->isValid)) //paths invalidated by game event
|
|| !cl->pathInfo->isValid)) //paths invalidated by game event
|
||||||
@ -365,7 +368,7 @@ int CCallback::mergeOrSwapStacks(const CArmedInstance *s1, const CArmedInstance
|
|||||||
return swapCreatures(s1, s2, p1, p2);
|
return swapCreatures(s1, s2, p1, p2);
|
||||||
}
|
}
|
||||||
|
|
||||||
CBattleCallback::CBattleCallback(CGameState *GS, int Player, CClient *C )
|
CBattleCallback::CBattleCallback(CGameState *GS, boost::optional<TPlayerColor> Player, CClient *C )
|
||||||
{
|
{
|
||||||
gs = GS;
|
gs = GS;
|
||||||
player = Player;
|
player = Player;
|
||||||
|
@ -86,7 +86,7 @@ protected:
|
|||||||
//virtual bool hasAccess(int playerId) const;
|
//virtual bool hasAccess(int playerId) const;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
CBattleCallback(CGameState *GS, int Player, CClient *C);
|
CBattleCallback(CGameState *GS, boost::optional<TPlayerColor> Player, CClient *C);
|
||||||
int battleMakeAction(BattleAction* action) OVERRIDE;//for casting spells by hero - DO NOT use it for moving active stack
|
int battleMakeAction(BattleAction* action) OVERRIDE;//for casting spells by hero - DO NOT use it for moving active stack
|
||||||
bool battleMakeTacticAction(BattleAction * action) OVERRIDE; // performs tactic phase actions
|
bool battleMakeTacticAction(BattleAction * action) OVERRIDE; // performs tactic phase actions
|
||||||
|
|
||||||
@ -101,7 +101,7 @@ private:
|
|||||||
void validatePaths(); //recalcualte paths if necessary
|
void validatePaths(); //recalcualte paths if necessary
|
||||||
|
|
||||||
public:
|
public:
|
||||||
CCallback(CGameState * GS, int Player, CClient *C);
|
CCallback(CGameState * GS, boost::optional<TPlayerColor> Player, CClient *C);
|
||||||
|
|
||||||
//client-specific functionalities (pathfinding)
|
//client-specific functionalities (pathfinding)
|
||||||
virtual const CGPathNode *getPathInfo(int3 tile); //uses main, client pathfinder info
|
virtual const CGPathNode *getPathInfo(int3 tile); //uses main, client pathfinder info
|
||||||
|
2
Global.h
2
Global.h
@ -519,6 +519,8 @@ template<typename T, size_t N> char (&_ArrayCountObj(const T (&)[N]))[N];
|
|||||||
|
|
||||||
#define THROW_FORMAT(message, formatting_elems) throw std::runtime_error(boost::str(boost::format(message) % formatting_elems))
|
#define THROW_FORMAT(message, formatting_elems) throw std::runtime_error(boost::str(boost::format(message) % formatting_elems))
|
||||||
|
|
||||||
|
#define ASSERT_IF_CALLED_WITH_PLAYER if(!player) {tlog1 << __FUNCTION__ << "\n"; assert(0);}
|
||||||
|
|
||||||
//XXX pls dont - 'debug macros' are usually more trouble than it's worth
|
//XXX pls dont - 'debug macros' are usually more trouble than it's worth
|
||||||
#define HANDLE_EXCEPTION \
|
#define HANDLE_EXCEPTION \
|
||||||
catch (const std::exception& e) { \
|
catch (const std::exception& e) { \
|
||||||
|
@ -4,7 +4,10 @@
|
|||||||
<PropertyGroup Label="UserMacros">
|
<PropertyGroup Label="UserMacros">
|
||||||
<VCMI_Out>$(SolutionDir)</VCMI_Out>
|
<VCMI_Out>$(SolutionDir)</VCMI_Out>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup />
|
<PropertyGroup>
|
||||||
|
<IncludePath>C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Include;$(IncludePath)</IncludePath>
|
||||||
|
<LibraryPath>C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Lib;G:\boost\SDL_mixer-1.2.11\lib;G:\boost\zlib125-dll\lib;G:\boost\SDL-1.2.14\lib;G:\boost\SDL_image-1.2.10\lib;G:\boost\SDL_ttf-2.0.10\lib;G:\boost\boost_1_51_0\stage\lib;$(VCInstallDir)lib;$(VCInstallDir)atlmfc\lib;$(WindowsSdkDir)lib;$(FrameworkSDKDir)\lib</LibraryPath>
|
||||||
|
</PropertyGroup>
|
||||||
<ItemDefinitionGroup>
|
<ItemDefinitionGroup>
|
||||||
<ClCompile>
|
<ClCompile>
|
||||||
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
|
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
|
||||||
|
@ -114,7 +114,7 @@ void CMessage::dispose()
|
|||||||
delete cancel;
|
delete cancel;
|
||||||
}
|
}
|
||||||
|
|
||||||
SDL_Surface * CMessage::drawDialogBox(int w, int h, int playerColor)
|
SDL_Surface * CMessage::drawDialogBox(int w, int h, TPlayerColor playerColor)
|
||||||
{
|
{
|
||||||
//prepare surface
|
//prepare surface
|
||||||
SDL_Surface * ret = SDL_CreateRGBSurface(SDL_SWSURFACE, w, h, screen->format->BitsPerPixel, screen->format->Rmask, screen->format->Gmask, screen->format->Bmask, screen->format->Amask);
|
SDL_Surface * ret = SDL_CreateRGBSurface(SDL_SWSURFACE, w, h, screen->format->BitsPerPixel, screen->format->Rmask, screen->format->Gmask, screen->format->Bmask, screen->format->Amask);
|
||||||
@ -219,7 +219,7 @@ std::vector<std::string> CMessage::breakText( std::string text, size_t maxLineSi
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CMessage::drawIWindow(CInfoWindow * ret, std::string text, int player)
|
void CMessage::drawIWindow(CInfoWindow * ret, std::string text, TPlayerColor player)
|
||||||
{
|
{
|
||||||
bool blitOr = false;
|
bool blitOr = false;
|
||||||
if(dynamic_cast<CSelWindow*>(ret)) //it's selection window, so we'll blit "or" between components
|
if(dynamic_cast<CSelWindow*>(ret)) //it's selection window, so we'll blit "or" between components
|
||||||
@ -304,7 +304,7 @@ void CMessage::drawIWindow(CInfoWindow * ret, std::string text, int player)
|
|||||||
ret->components[i]->moveBy(Point(ret->pos.x, ret->pos.y));
|
ret->components[i]->moveBy(Point(ret->pos.x, ret->pos.y));
|
||||||
}
|
}
|
||||||
|
|
||||||
void CMessage::drawBorder(int playerColor, SDL_Surface * ret, int w, int h, int x, int y)
|
void CMessage::drawBorder(TPlayerColor playerColor, SDL_Surface * ret, int w, int h, int x, int y)
|
||||||
{
|
{
|
||||||
std::vector<SDL_Surface *> &box = piecesOfBox[playerColor];
|
std::vector<SDL_Surface *> &box = piecesOfBox[playerColor];
|
||||||
|
|
||||||
|
@ -31,12 +31,12 @@ public:
|
|||||||
static SDL_Surface * blitTextOnSur(std::vector<std::vector<SDL_Surface*> > * txtg, int fontHeight, int & curh, SDL_Surface * ret, int xCenterPos=-1); //xPos==-1 works as if ret->w/2
|
static SDL_Surface * blitTextOnSur(std::vector<std::vector<SDL_Surface*> > * txtg, int fontHeight, int & curh, SDL_Surface * ret, int xCenterPos=-1); //xPos==-1 works as if ret->w/2
|
||||||
|
|
||||||
/// Draw border on exiting surface
|
/// Draw border on exiting surface
|
||||||
static void drawBorder(int playerColor, SDL_Surface * ret, int w, int h, int x=0, int y=0);
|
static void drawBorder(TPlayerColor playerColor, SDL_Surface * ret, int w, int h, int x=0, int y=0);
|
||||||
|
|
||||||
/// Draw simple dialog box (borders and background only)
|
/// Draw simple dialog box (borders and background only)
|
||||||
static SDL_Surface * drawDialogBox(int w, int h, int playerColor=1);
|
static SDL_Surface * drawDialogBox(int w, int h, TPlayerColor playerColor=1);
|
||||||
|
|
||||||
static void drawIWindow(CInfoWindow * ret, std::string text, int player);
|
static void drawIWindow(CInfoWindow * ret, std::string text, TPlayerColor player);
|
||||||
|
|
||||||
/// split text in lines
|
/// split text in lines
|
||||||
static std::vector<std::string> breakText(std::string text, size_t maxLineWidth, EFonts font);
|
static std::vector<std::string> breakText(std::string text, size_t maxLineWidth, EFonts font);
|
||||||
|
@ -644,7 +644,7 @@ bool CGarrisonInt::getSplittingMode()
|
|||||||
|
|
||||||
void CGarrisonInt::setArmy(const CArmedInstance *army, bool bottomGarrison)
|
void CGarrisonInt::setArmy(const CArmedInstance *army, bool bottomGarrison)
|
||||||
{
|
{
|
||||||
owned[bottomGarrison] = army ? (army->tempOwner == LOCPLINT->playerID || army->tempOwner == 254) : false; //254 - neutral objects (pandora, banks)
|
owned[bottomGarrison] = army ? (army->tempOwner == LOCPLINT->playerID || army->tempOwner == GameConstants::UNFLAGGABLE_PLAYER) : false;
|
||||||
armedObjs[bottomGarrison] = army;
|
armedObjs[bottomGarrison] = army;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4063,13 +4063,13 @@ void CArtPlace::createImage()
|
|||||||
if (ourArt)
|
if (ourArt)
|
||||||
graphic = ourArt->artType->iconIndex;
|
graphic = ourArt->artType->iconIndex;
|
||||||
if (locked)
|
if (locked)
|
||||||
graphic = GameConstants::ID_LOCK;
|
graphic = ArtifactID::ART_LOCK;
|
||||||
|
|
||||||
image = new CAnimImage("artifact", graphic);
|
image = new CAnimImage("artifact", graphic);
|
||||||
if (!ourArt)
|
if (!ourArt)
|
||||||
image->disable();
|
image->disable();
|
||||||
|
|
||||||
selection = new CAnimImage("artifact", GameConstants::ID_SELECTION);
|
selection = new CAnimImage("artifact", ArtifactID::ART_SELECTION);
|
||||||
selection->disable();
|
selection->disable();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4081,7 +4081,7 @@ void CArtPlace::lockSlot(bool on)
|
|||||||
locked = on;
|
locked = on;
|
||||||
|
|
||||||
if (on)
|
if (on)
|
||||||
image->setFrame(GameConstants::ID_LOCK);
|
image->setFrame(ArtifactID::ART_LOCK);
|
||||||
else
|
else
|
||||||
image->setFrame(ourArt->artType->iconIndex);
|
image->setFrame(ourArt->artType->iconIndex);
|
||||||
}
|
}
|
||||||
@ -4388,7 +4388,7 @@ void CArtPlace::setArtifact(const CArtifactInstance *art)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
image->enable();
|
image->enable();
|
||||||
image->setFrame(locked ? GameConstants::ID_LOCK : art->artType->iconIndex);
|
image->setFrame(locked ? ArtifactID::ART_LOCK : art->artType->iconIndex);
|
||||||
|
|
||||||
std::string artDesc = ourArt->artType->Description();
|
std::string artDesc = ourArt->artType->Description();
|
||||||
if (vstd::contains (artDesc, '{'))
|
if (vstd::contains (artDesc, '{'))
|
||||||
|
@ -41,9 +41,9 @@ namespace SiegeStuffThatShouldBeMovedToHandlers // <=== TODO
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int lineToWallHex(int line) //returns hex with wall in given line (y coordinate)
|
static BattleHex lineToWallHex(int line) //returns hex with wall in given line (y coordinate)
|
||||||
{
|
{
|
||||||
static const int lineToHex[] = {12, 29, 45, 62, 78, 95, 112, 130, 147, 165, 182};
|
static const BattleHex lineToHex[] = {12, 29, 45, 62, 78, 95, 112, 130, 147, 165, 182};
|
||||||
|
|
||||||
return lineToHex[line];
|
return lineToHex[line];
|
||||||
}
|
}
|
||||||
@ -107,7 +107,7 @@ void CCallbackBase::setBattle(const BattleInfo *B)
|
|||||||
battle = B;
|
battle = B;
|
||||||
}
|
}
|
||||||
|
|
||||||
int CCallbackBase::getPlayerID() const
|
boost::optional<TPlayerColor> CCallbackBase::getPlayerID() const
|
||||||
{
|
{
|
||||||
return player;
|
return player;
|
||||||
}
|
}
|
||||||
@ -136,7 +136,7 @@ std::vector<shared_ptr<const CObstacleInstance> > CBattleInfoEssentials::battleG
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if(player >= 0 && *perspective != battleGetMySide())
|
if(!!player && *perspective != battleGetMySide())
|
||||||
{
|
{
|
||||||
tlog1 << "Unauthorized access attempt!\n";
|
tlog1 << "Unauthorized access attempt!\n";
|
||||||
assert(0); //I want to notice if that happens
|
assert(0); //I want to notice if that happens
|
||||||
@ -219,14 +219,14 @@ const CGTownInstance * CBattleInfoEssentials::battleGetDefendedTown() const
|
|||||||
BattlePerspective::BattlePerspective CBattleInfoEssentials::battleGetMySide() const
|
BattlePerspective::BattlePerspective CBattleInfoEssentials::battleGetMySide() const
|
||||||
{
|
{
|
||||||
RETURN_IF_NOT_BATTLE(BattlePerspective::INVALID);
|
RETURN_IF_NOT_BATTLE(BattlePerspective::INVALID);
|
||||||
if(player < 0)
|
if(!player)
|
||||||
return BattlePerspective::ALL_KNOWING;
|
return BattlePerspective::ALL_KNOWING;
|
||||||
if(player == getBattle()->sides[0])
|
if(*player == getBattle()->sides[0])
|
||||||
return BattlePerspective::LEFT_SIDE;
|
return BattlePerspective::LEFT_SIDE;
|
||||||
if(player == getBattle()->sides[1])
|
if(*player == getBattle()->sides[1])
|
||||||
return BattlePerspective::RIGHT_SIDE;
|
return BattlePerspective::RIGHT_SIDE;
|
||||||
|
|
||||||
tlog1 << "Cannot find player " << player << " in battle!\n";
|
tlog1 << "Cannot find player " << *player << " in battle!\n";
|
||||||
return BattlePerspective::INVALID;
|
return BattlePerspective::INVALID;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -423,7 +423,7 @@ si8 CBattleInfoCallback::battleHasWallPenalty(const IBonusBearer *bonusBearer, B
|
|||||||
if (shooterPosition > destHex && ((destHex % GameConstants::BFIELD_WIDTH - shooterPosition % GameConstants::BFIELD_WIDTH) < 2)) //shooting up high
|
if (shooterPosition > destHex && ((destHex % GameConstants::BFIELD_WIDTH - shooterPosition % GameConstants::BFIELD_WIDTH) < 2)) //shooting up high
|
||||||
row -= 2;
|
row -= 2;
|
||||||
const int wallPos = lineToWallHex(row);
|
const int wallPos = lineToWallHex(row);
|
||||||
if (battleHexToWallPart(wallPos) != -1) //wall still exists or is indestructible
|
if (battleHexToWallPart(wallPos) < 0) //wall still exists or is indestructible
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2218,31 +2218,36 @@ ReachabilityInfo::Parameters::Parameters(const CStack *Stack)
|
|||||||
ESpellCastProblem::ESpellCastProblem CPlayerBattleCallback::battleCanCastThisSpell(const CSpell * spell) const
|
ESpellCastProblem::ESpellCastProblem CPlayerBattleCallback::battleCanCastThisSpell(const CSpell * spell) const
|
||||||
{
|
{
|
||||||
RETURN_IF_NOT_BATTLE(ESpellCastProblem::INVALID);
|
RETURN_IF_NOT_BATTLE(ESpellCastProblem::INVALID);
|
||||||
return CBattleInfoCallback::battleCanCastThisSpell(player, spell, ECastingMode::HERO_CASTING);
|
ASSERT_IF_CALLED_WITH_PLAYER
|
||||||
|
return CBattleInfoCallback::battleCanCastThisSpell(*player, spell, ECastingMode::HERO_CASTING);
|
||||||
}
|
}
|
||||||
|
|
||||||
ESpellCastProblem::ESpellCastProblem CPlayerBattleCallback::battleCanCastThisSpell(const CSpell * spell, BattleHex destination) const
|
ESpellCastProblem::ESpellCastProblem CPlayerBattleCallback::battleCanCastThisSpell(const CSpell * spell, BattleHex destination) const
|
||||||
{
|
{
|
||||||
RETURN_IF_NOT_BATTLE(ESpellCastProblem::INVALID);
|
RETURN_IF_NOT_BATTLE(ESpellCastProblem::INVALID);
|
||||||
return battleCanCastThisSpellHere(player, spell, ECastingMode::HERO_CASTING, destination);
|
ASSERT_IF_CALLED_WITH_PLAYER
|
||||||
|
return battleCanCastThisSpellHere(*player, spell, ECastingMode::HERO_CASTING, destination);
|
||||||
}
|
}
|
||||||
|
|
||||||
ESpellCastProblem::ESpellCastProblem CPlayerBattleCallback::battleCanCreatureCastThisSpell(const CSpell * spell, BattleHex destination) const
|
ESpellCastProblem::ESpellCastProblem CPlayerBattleCallback::battleCanCreatureCastThisSpell(const CSpell * spell, BattleHex destination) const
|
||||||
{
|
{
|
||||||
RETURN_IF_NOT_BATTLE(ESpellCastProblem::INVALID);
|
RETURN_IF_NOT_BATTLE(ESpellCastProblem::INVALID);
|
||||||
return battleCanCastThisSpellHere(player, spell, ECastingMode::CREATURE_ACTIVE_CASTING, destination);
|
ASSERT_IF_CALLED_WITH_PLAYER
|
||||||
|
return battleCanCastThisSpellHere(*player, spell, ECastingMode::CREATURE_ACTIVE_CASTING, destination);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CPlayerBattleCallback::battleCanFlee() const
|
bool CPlayerBattleCallback::battleCanFlee() const
|
||||||
{
|
{
|
||||||
RETURN_IF_NOT_BATTLE(false);
|
RETURN_IF_NOT_BATTLE(false);
|
||||||
return CBattleInfoEssentials::battleCanFlee(player);
|
ASSERT_IF_CALLED_WITH_PLAYER
|
||||||
|
return CBattleInfoEssentials::battleCanFlee(*player);
|
||||||
}
|
}
|
||||||
|
|
||||||
TStacks CPlayerBattleCallback::battleGetStacks(EStackOwnership whose /*= MINE_AND_ENEMY*/, bool onlyAlive /*= true*/) const
|
TStacks CPlayerBattleCallback::battleGetStacks(EStackOwnership whose /*= MINE_AND_ENEMY*/, bool onlyAlive /*= true*/) const
|
||||||
{
|
{
|
||||||
TStacks ret;
|
TStacks ret;
|
||||||
RETURN_IF_NOT_BATTLE(ret);
|
RETURN_IF_NOT_BATTLE(ret);
|
||||||
|
ASSERT_IF_CALLED_WITH_PLAYER
|
||||||
vstd::copy_if(battleGetAllStacks(), std::back_inserter(ret), [=](const CStack *s) -> bool
|
vstd::copy_if(battleGetAllStacks(), std::back_inserter(ret), [=](const CStack *s) -> bool
|
||||||
{
|
{
|
||||||
const bool ownerMatches = (whose == MINE_AND_ENEMY)
|
const bool ownerMatches = (whose == MINE_AND_ENEMY)
|
||||||
@ -2258,13 +2263,15 @@ TStacks CPlayerBattleCallback::battleGetStacks(EStackOwnership whose /*= MINE_AN
|
|||||||
int CPlayerBattleCallback::battleGetSurrenderCost() const
|
int CPlayerBattleCallback::battleGetSurrenderCost() const
|
||||||
{
|
{
|
||||||
RETURN_IF_NOT_BATTLE(-3)
|
RETURN_IF_NOT_BATTLE(-3)
|
||||||
return CBattleInfoCallback::battleGetSurrenderCost(player);
|
ASSERT_IF_CALLED_WITH_PLAYER
|
||||||
|
return CBattleInfoCallback::battleGetSurrenderCost(*player);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CPlayerBattleCallback::battleCanCastSpell(ESpellCastProblem::ESpellCastProblem *outProblem /*= nullptr*/) const
|
bool CPlayerBattleCallback::battleCanCastSpell(ESpellCastProblem::ESpellCastProblem *outProblem /*= nullptr*/) const
|
||||||
{
|
{
|
||||||
RETURN_IF_NOT_BATTLE(false);
|
RETURN_IF_NOT_BATTLE(false);
|
||||||
auto problem = CBattleInfoCallback::battleCanCastSpell(player, ECastingMode::HERO_CASTING);
|
ASSERT_IF_CALLED_WITH_PLAYER
|
||||||
|
auto problem = CBattleInfoCallback::battleCanCastSpell(*player, ECastingMode::HERO_CASTING);
|
||||||
if(outProblem)
|
if(outProblem)
|
||||||
*outProblem = problem;
|
*outProblem = problem;
|
||||||
|
|
||||||
|
@ -45,13 +45,13 @@ class DLL_LINKAGE CCallbackBase
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
CGameState *gs;
|
CGameState *gs;
|
||||||
int player; // -1 gives access to all information, otherwise callback provides only information "visible" for player
|
boost::optional<TPlayerColor> player; // not set gives access to all information, otherwise callback provides only information "visible" for player
|
||||||
|
|
||||||
CCallbackBase(CGameState *GS, int Player)
|
CCallbackBase(CGameState *GS, boost::optional<TPlayerColor> Player)
|
||||||
: battle(nullptr), gs(GS), player(Player)
|
: battle(nullptr), gs(GS), player(Player)
|
||||||
{}
|
{}
|
||||||
CCallbackBase()
|
CCallbackBase()
|
||||||
: battle(nullptr), gs(nullptr), player(-1)
|
: battle(nullptr), gs(nullptr)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
void setBattle(const BattleInfo *B);
|
void setBattle(const BattleInfo *B);
|
||||||
@ -59,7 +59,7 @@ protected:
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
boost::shared_mutex &getGsMutex(); //just return a reference to mutex, does not lock nor anything
|
boost::shared_mutex &getGsMutex(); //just return a reference to mutex, does not lock nor anything
|
||||||
int getPlayerID() const;
|
boost::optional<TPlayerColor> getPlayerID() const;
|
||||||
|
|
||||||
friend class CBattleInfoEssentials;
|
friend class CBattleInfoEssentials;
|
||||||
};
|
};
|
||||||
|
@ -2109,12 +2109,12 @@ bool CGameState::isVisible(int3 pos, TPlayerColor player)
|
|||||||
return getPlayerTeam(player)->fogOfWarMap[pos.x][pos.y][pos.z];
|
return getPlayerTeam(player)->fogOfWarMap[pos.x][pos.y][pos.z];
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CGameState::isVisible( const CGObjectInstance *obj, int player )
|
bool CGameState::isVisible( const CGObjectInstance *obj, boost::optional<TPlayerColor> player )
|
||||||
{
|
{
|
||||||
if(player == -1)
|
if(!player)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
if(player == GameConstants::NEUTRAL_PLAYER) //-> TODO ??? needed?
|
if(*player == GameConstants::NEUTRAL_PLAYER) //-> TODO ??? needed?
|
||||||
return false;
|
return false;
|
||||||
//object is visible when at least one blocked tile is visible
|
//object is visible when at least one blocked tile is visible
|
||||||
for(int fx=0; fx<8; ++fx)
|
for(int fx=0; fx<8; ++fx)
|
||||||
@ -2124,7 +2124,7 @@ bool CGameState::isVisible( const CGObjectInstance *obj, int player )
|
|||||||
int3 pos = obj->pos + int3(fx-7,fy-5,0);
|
int3 pos = obj->pos + int3(fx-7,fy-5,0);
|
||||||
if(map->isInTheMap(pos)
|
if(map->isInTheMap(pos)
|
||||||
&& !((obj->defInfo->blockMap[fy] >> (7 - fx)) & 1)
|
&& !((obj->defInfo->blockMap[fy] >> (7 - fx)) & 1)
|
||||||
&& isVisible(pos, player) )
|
&& isVisible(pos, *player) )
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -419,7 +419,7 @@ public:
|
|||||||
void deserializationFix();
|
void deserializationFix();
|
||||||
|
|
||||||
bool isVisible(int3 pos, TPlayerColor player);
|
bool isVisible(int3 pos, TPlayerColor player);
|
||||||
bool isVisible(const CGObjectInstance *obj, int player);
|
bool isVisible(const CGObjectInstance *obj, boost::optional<TPlayerColor> player);
|
||||||
|
|
||||||
CGameState(); //c-tor
|
CGameState(); //c-tor
|
||||||
virtual ~CGameState(); //d-tor
|
virtual ~CGameState(); //d-tor
|
||||||
|
@ -75,6 +75,7 @@ namespace GameConstants
|
|||||||
const int HEROES_QUANTITY=156;
|
const int HEROES_QUANTITY=156;
|
||||||
const int SPELLS_QUANTITY=70;
|
const int SPELLS_QUANTITY=70;
|
||||||
const int PRIMARY_SKILLS=4;
|
const int PRIMARY_SKILLS=4;
|
||||||
|
const int UNFLAGGABLE_PLAYER = 254; //254 - neutral objects (pandora, banks)
|
||||||
const int NEUTRAL_PLAYER=255;
|
const int NEUTRAL_PLAYER=255;
|
||||||
const int NAMES_PER_TOWN=16;
|
const int NAMES_PER_TOWN=16;
|
||||||
const int CREATURES_PER_TOWN = 7; //without upgrades
|
const int CREATURES_PER_TOWN = 7; //without upgrades
|
||||||
@ -86,7 +87,6 @@ namespace GameConstants
|
|||||||
const int BATTLE_PENALTY_DISTANCE = 10; //if the distance is > than this, then shooting stack has distance penalty
|
const int BATTLE_PENALTY_DISTANCE = 10; //if the distance is > than this, then shooting stack has distance penalty
|
||||||
|
|
||||||
const ui16 BACKPACK_START = 19;
|
const ui16 BACKPACK_START = 19;
|
||||||
const int ID_CATAPULT = 3, ID_SELECTION=144, ID_LOCK = 145;
|
|
||||||
|
|
||||||
const int TERRAIN_TYPES=10;
|
const int TERRAIN_TYPES=10;
|
||||||
const int RESOURCE_QUANTITY=8;
|
const int RESOURCE_QUANTITY=8;
|
||||||
@ -596,6 +596,7 @@ public:
|
|||||||
CENTAUR_AXE = 7,
|
CENTAUR_AXE = 7,
|
||||||
BLACKSHARD_OF_THE_DEAD_KNIGHT = 8,
|
BLACKSHARD_OF_THE_DEAD_KNIGHT = 8,
|
||||||
CORNUCOPIA = 140,
|
CORNUCOPIA = 140,
|
||||||
|
ART_SELECTION = 144,
|
||||||
ART_LOCK = 145,
|
ART_LOCK = 145,
|
||||||
AXE_OF_SMASHING = 146,
|
AXE_OF_SMASHING = 146,
|
||||||
MITHRIL_MAIL = 147,
|
MITHRIL_MAIL = 147,
|
||||||
|
@ -427,18 +427,18 @@ std::vector < std::string > CGameInfoCallback::getObjDescriptions(int3 pos) cons
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CGameInfoCallback::isVisible(int3 pos, int Player) const
|
bool CGameInfoCallback::isVisible(int3 pos, boost::optional<TPlayerColor> Player) const
|
||||||
{
|
{
|
||||||
//boost::shared_lock<boost::shared_mutex> lock(*gs->mx);
|
//boost::shared_lock<boost::shared_mutex> lock(*gs->mx);
|
||||||
return gs->map->isInTheMap(pos) && (Player == -1 || gs->isVisible(pos, Player));
|
return gs->map->isInTheMap(pos) && (!Player || gs->isVisible(pos, *Player));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CGameInfoCallback::isVisible(int3 pos) const
|
bool CGameInfoCallback::isVisible(int3 pos) const
|
||||||
{
|
{
|
||||||
return isVisible(pos,player);
|
return isVisible(pos, player);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CGameInfoCallback::isVisible( const CGObjectInstance *obj, int Player ) const
|
bool CGameInfoCallback::isVisible( const CGObjectInstance *obj, boost::optional<TPlayerColor> Player ) const
|
||||||
{
|
{
|
||||||
return gs->isVisible(obj, Player);
|
return gs->isVisible(obj, Player);
|
||||||
}
|
}
|
||||||
@ -508,11 +508,12 @@ int3 CGameInfoCallback::getMapSize() const
|
|||||||
|
|
||||||
std::vector<const CGHeroInstance *> CGameInfoCallback::getAvailableHeroes(const CGObjectInstance * townOrTavern) const
|
std::vector<const CGHeroInstance *> CGameInfoCallback::getAvailableHeroes(const CGObjectInstance * townOrTavern) const
|
||||||
{
|
{
|
||||||
|
ASSERT_IF_CALLED_WITH_PLAYER
|
||||||
std::vector<const CGHeroInstance *> ret;
|
std::vector<const CGHeroInstance *> ret;
|
||||||
//ERROR_RET_VAL_IF(!isOwnedOrVisited(townOrTavern), "Town or tavern must be owned or visited!", ret);
|
//ERROR_RET_VAL_IF(!isOwnedOrVisited(townOrTavern), "Town or tavern must be owned or visited!", ret);
|
||||||
//TODO: town needs to be owned, advmap tavern needs to be visited; to be reimplemented when visit tracking is done
|
//TODO: town needs to be owned, advmap tavern needs to be visited; to be reimplemented when visit tracking is done
|
||||||
ret.resize(gs->players[player].availableHeroes.size());
|
ret.resize(gs->players[*player].availableHeroes.size());
|
||||||
std::copy(gs->players[player].availableHeroes.begin(),gs->players[player].availableHeroes.end(),ret.begin());
|
std::copy(gs->players[*player].availableHeroes.begin(),gs->players[*player].availableHeroes.end(),ret.begin());
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -625,9 +626,9 @@ const CMapHeader * CGameInfoCallback::getMapHeader() const
|
|||||||
return gs->map;
|
return gs->map;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CGameInfoCallback::hasAccess(int playerId) const
|
bool CGameInfoCallback::hasAccess(boost::optional<TPlayerColor> playerId) const
|
||||||
{
|
{
|
||||||
return player < 0 || gs->getPlayerRelations( playerId, player ) != PlayerRelations::ENEMIES;
|
return !player || gs->getPlayerRelations( *playerId, *player ) != PlayerRelations::ENEMIES;
|
||||||
}
|
}
|
||||||
|
|
||||||
EPlayerStatus::EStatus CGameInfoCallback::getPlayerStatus(TPlayerColor player) const
|
EPlayerStatus::EStatus CGameInfoCallback::getPlayerStatus(TPlayerColor player) const
|
||||||
@ -653,7 +654,7 @@ bool CGameInfoCallback::canGetFullInfo(const CGObjectInstance *obj) const
|
|||||||
return !obj || hasAccess(obj->tempOwner);
|
return !obj || hasAccess(obj->tempOwner);
|
||||||
}
|
}
|
||||||
|
|
||||||
int CGameInfoCallback::getHeroCount( int player, bool includeGarrisoned ) const
|
int CGameInfoCallback::getHeroCount( TPlayerColor player, bool includeGarrisoned ) const
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
const PlayerState *p = gs->getPlayer(player);
|
const PlayerState *p = gs->getPlayer(player);
|
||||||
@ -687,7 +688,7 @@ CGameInfoCallback::CGameInfoCallback()
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
CGameInfoCallback::CGameInfoCallback(CGameState *GS, int Player)
|
CGameInfoCallback::CGameInfoCallback(CGameState *GS, boost::optional<TPlayerColor> Player)
|
||||||
{
|
{
|
||||||
gs = GS;
|
gs = GS;
|
||||||
player = Player;
|
player = Player;
|
||||||
@ -696,28 +697,27 @@ CGameInfoCallback::CGameInfoCallback(CGameState *GS, int Player)
|
|||||||
const std::vector< std::vector< std::vector<ui8> > > & CPlayerSpecificInfoCallback::getVisibilityMap() const
|
const std::vector< std::vector< std::vector<ui8> > > & CPlayerSpecificInfoCallback::getVisibilityMap() const
|
||||||
{
|
{
|
||||||
//boost::shared_lock<boost::shared_mutex> lock(*gs->mx);
|
//boost::shared_lock<boost::shared_mutex> lock(*gs->mx);
|
||||||
return gs->getPlayerTeam(player)->fogOfWarMap;
|
return gs->getPlayerTeam(*player)->fogOfWarMap;
|
||||||
}
|
}
|
||||||
|
|
||||||
int CPlayerSpecificInfoCallback::howManyTowns() const
|
int CPlayerSpecificInfoCallback::howManyTowns() const
|
||||||
{
|
{
|
||||||
//boost::shared_lock<boost::shared_mutex> lock(*gs->mx);
|
//boost::shared_lock<boost::shared_mutex> lock(*gs->mx);
|
||||||
ERROR_RET_VAL_IF(player == -1, "Applicable only for player callbacks", -1);
|
ERROR_RET_VAL_IF(!player, "Applicable only for player callbacks", -1);
|
||||||
return CGameInfoCallback::howManyTowns(player);
|
return CGameInfoCallback::howManyTowns(*player);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector < const CGTownInstance *> CPlayerSpecificInfoCallback::getTownsInfo(bool onlyOur) const
|
std::vector < const CGTownInstance *> CPlayerSpecificInfoCallback::getTownsInfo(bool onlyOur) const
|
||||||
{
|
{
|
||||||
//boost::shared_lock<boost::shared_mutex> lock(*gs->mx);
|
//boost::shared_lock<boost::shared_mutex> lock(*gs->mx);
|
||||||
std::vector < const CGTownInstance *> ret = std::vector < const CGTownInstance *>();
|
std::vector < const CGTownInstance *> ret = std::vector < const CGTownInstance *>();
|
||||||
for ( auto i=gs->players.begin() ; i!=gs->players.end();i++)
|
BOOST_FOREACH(auto i, gs->players)
|
||||||
{
|
{
|
||||||
for (size_t j = 0; j < (*i).second.towns.size(); ++j)
|
BOOST_FOREACH(auto town, i.second.towns)
|
||||||
{
|
{
|
||||||
if ((*i).first==player
|
if (i.first==player || (isVisible(town, player) && !onlyOur))
|
||||||
|| (isVisible((*i).second.towns[j],player) && !onlyOur))
|
|
||||||
{
|
{
|
||||||
ret.push_back((*i).second.towns[j]);
|
ret.push_back(town);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} // for ( std::map<int, PlayerState>::iterator i=gs->players.begin() ; i!=gs->players.end();i++)
|
} // for ( std::map<int, PlayerState>::iterator i=gs->players.begin() ; i!=gs->players.end();i++)
|
||||||
@ -727,18 +727,18 @@ std::vector < const CGHeroInstance *> CPlayerSpecificInfoCallback::getHeroesInfo
|
|||||||
{
|
{
|
||||||
//boost::shared_lock<boost::shared_mutex> lock(*gs->mx);
|
//boost::shared_lock<boost::shared_mutex> lock(*gs->mx);
|
||||||
std::vector < const CGHeroInstance *> ret;
|
std::vector < const CGHeroInstance *> ret;
|
||||||
for(size_t i=0;i<gs->map->heroes.size();i++)
|
BOOST_FOREACH(auto hero, gs->map->heroes)
|
||||||
{
|
{
|
||||||
if( (gs->map->heroes[i]->tempOwner==player) ||
|
if( !player || (hero->tempOwner == *player) ||
|
||||||
(isVisible(gs->map->heroes[i]->getPosition(false),player) && !onlyOur) )
|
(isVisible(hero->getPosition(false), player) && !onlyOur) )
|
||||||
{
|
{
|
||||||
ret.push_back(gs->map->heroes[i]);
|
ret.push_back(hero);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int CPlayerSpecificInfoCallback::getMyColor() const
|
boost::optional<TPlayerColor> CPlayerSpecificInfoCallback::getMyColor() const
|
||||||
{
|
{
|
||||||
return player;
|
return player;
|
||||||
}
|
}
|
||||||
@ -749,9 +749,9 @@ int CPlayerSpecificInfoCallback::getHeroSerial(const CGHeroInstance * hero, bool
|
|||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
size_t index = 0;
|
size_t index = 0;
|
||||||
auto & heroes = gs->players[player].heroes;
|
auto & heroes = gs->players[*player].heroes;
|
||||||
|
|
||||||
for (auto curHero= heroes.begin(); curHero!=heroes.end(); curHero++)
|
for (auto curHero = heroes.begin(); curHero!=heroes.end(); curHero++)
|
||||||
{
|
{
|
||||||
if (includeGarrisoned || !(*curHero)->inTownGarrison)
|
if (includeGarrisoned || !(*curHero)->inTownGarrison)
|
||||||
index++;
|
index++;
|
||||||
@ -764,13 +764,13 @@ int CPlayerSpecificInfoCallback::getHeroSerial(const CGHeroInstance * hero, bool
|
|||||||
|
|
||||||
int3 CPlayerSpecificInfoCallback::getGrailPos( double &outKnownRatio )
|
int3 CPlayerSpecificInfoCallback::getGrailPos( double &outKnownRatio )
|
||||||
{
|
{
|
||||||
if (CGObelisk::obeliskCount == 0)
|
if (!player || CGObelisk::obeliskCount == 0)
|
||||||
{
|
{
|
||||||
outKnownRatio = 0.0;
|
outKnownRatio = 0.0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
outKnownRatio = static_cast<double>(CGObelisk::visited[gs->getPlayerTeam(player)->id]) / CGObelisk::obeliskCount;
|
outKnownRatio = static_cast<double>(CGObelisk::visited[gs->getPlayerTeam(*player)->id]) / CGObelisk::obeliskCount;
|
||||||
}
|
}
|
||||||
return gs->map->grailPos;
|
return gs->map->grailPos;
|
||||||
}
|
}
|
||||||
@ -788,8 +788,9 @@ std::vector < const CGObjectInstance * > CPlayerSpecificInfoCallback::getMyObjec
|
|||||||
|
|
||||||
std::vector < const CGDwelling * > CPlayerSpecificInfoCallback::getMyDwellings() const
|
std::vector < const CGDwelling * > CPlayerSpecificInfoCallback::getMyDwellings() const
|
||||||
{
|
{
|
||||||
|
ASSERT_IF_CALLED_WITH_PLAYER
|
||||||
std::vector < const CGDwelling * > ret;
|
std::vector < const CGDwelling * > ret;
|
||||||
BOOST_FOREACH(CGDwelling * dw, gs->getPlayer(player)->dwellings)
|
BOOST_FOREACH(CGDwelling * dw, gs->getPlayer(*player)->dwellings)
|
||||||
{
|
{
|
||||||
ret.push_back(dw);
|
ret.push_back(dw);
|
||||||
}
|
}
|
||||||
@ -799,7 +800,7 @@ std::vector < const CGDwelling * > CPlayerSpecificInfoCallback::getMyDwellings()
|
|||||||
std::vector <QuestInfo> CPlayerSpecificInfoCallback::getMyQuests() const
|
std::vector <QuestInfo> CPlayerSpecificInfoCallback::getMyQuests() const
|
||||||
{
|
{
|
||||||
std::vector <QuestInfo> ret;
|
std::vector <QuestInfo> ret;
|
||||||
BOOST_FOREACH (auto quest, gs->getPlayer(player)->quests)
|
BOOST_FOREACH (auto quest, gs->getPlayer(*player)->quests)
|
||||||
{
|
{
|
||||||
ret.push_back (quest);
|
ret.push_back (quest);
|
||||||
}
|
}
|
||||||
@ -809,13 +810,14 @@ std::vector <QuestInfo> CPlayerSpecificInfoCallback::getMyQuests() const
|
|||||||
int CPlayerSpecificInfoCallback::howManyHeroes(bool includeGarrisoned) const
|
int CPlayerSpecificInfoCallback::howManyHeroes(bool includeGarrisoned) const
|
||||||
{
|
{
|
||||||
//boost::shared_lock<boost::shared_mutex> lock(*gs->mx);
|
//boost::shared_lock<boost::shared_mutex> lock(*gs->mx);
|
||||||
ERROR_RET_VAL_IF(player == -1, "Applicable only for player callbacks", -1);
|
ERROR_RET_VAL_IF(!player, "Applicable only for player callbacks", -1);
|
||||||
return getHeroCount(player,includeGarrisoned);
|
return getHeroCount(*player,includeGarrisoned);
|
||||||
}
|
}
|
||||||
|
|
||||||
const CGHeroInstance* CPlayerSpecificInfoCallback::getHeroBySerial(int serialId, bool includeGarrisoned) const
|
const CGHeroInstance* CPlayerSpecificInfoCallback::getHeroBySerial(int serialId, bool includeGarrisoned) const
|
||||||
{
|
{
|
||||||
const PlayerState *p = getPlayer(player);
|
ASSERT_IF_CALLED_WITH_PLAYER
|
||||||
|
const PlayerState *p = getPlayer(*player);
|
||||||
ERROR_RET_VAL_IF(!p, "No player info", NULL);
|
ERROR_RET_VAL_IF(!p, "No player info", NULL);
|
||||||
|
|
||||||
if (!includeGarrisoned)
|
if (!includeGarrisoned)
|
||||||
@ -830,7 +832,8 @@ const CGHeroInstance* CPlayerSpecificInfoCallback::getHeroBySerial(int serialId,
|
|||||||
|
|
||||||
const CGTownInstance* CPlayerSpecificInfoCallback::getTownBySerial(int serialId) const
|
const CGTownInstance* CPlayerSpecificInfoCallback::getTownBySerial(int serialId) const
|
||||||
{
|
{
|
||||||
const PlayerState *p = getPlayer(player);
|
ASSERT_IF_CALLED_WITH_PLAYER
|
||||||
|
const PlayerState *p = getPlayer(*player);
|
||||||
ERROR_RET_VAL_IF(!p, "No player info", NULL);
|
ERROR_RET_VAL_IF(!p, "No player info", NULL);
|
||||||
ERROR_RET_VAL_IF(serialId < 0 || serialId >= p->towns.size(), "No player info", NULL);
|
ERROR_RET_VAL_IF(serialId < 0 || serialId >= p->towns.size(), "No player info", NULL);
|
||||||
return p->towns[serialId];
|
return p->towns[serialId];
|
||||||
@ -839,15 +842,15 @@ const CGTownInstance* CPlayerSpecificInfoCallback::getTownBySerial(int serialId)
|
|||||||
int CPlayerSpecificInfoCallback::getResourceAmount(Res::ERes type) const
|
int CPlayerSpecificInfoCallback::getResourceAmount(Res::ERes type) const
|
||||||
{
|
{
|
||||||
//boost::shared_lock<boost::shared_mutex> lock(*gs->mx);
|
//boost::shared_lock<boost::shared_mutex> lock(*gs->mx);
|
||||||
ERROR_RET_VAL_IF(player == -1, "Applicable only for player callbacks", -1);
|
ERROR_RET_VAL_IF(!player, "Applicable only for player callbacks", -1);
|
||||||
return getResource(player, type);
|
return getResource(*player, type);
|
||||||
}
|
}
|
||||||
|
|
||||||
TResources CPlayerSpecificInfoCallback::getResourceAmount() const
|
TResources CPlayerSpecificInfoCallback::getResourceAmount() const
|
||||||
{
|
{
|
||||||
//boost::shared_lock<boost::shared_mutex> lock(*gs->mx);
|
//boost::shared_lock<boost::shared_mutex> lock(*gs->mx);
|
||||||
ERROR_RET_VAL_IF(player == -1, "Applicable only for player callbacks", TResources());
|
ERROR_RET_VAL_IF(!player, "Applicable only for player callbacks", TResources());
|
||||||
return gs->players[player].resources;
|
return gs->players[*player].resources;
|
||||||
}
|
}
|
||||||
|
|
||||||
CGHeroInstance *CNonConstInfoCallback::getHero(int objid)
|
CGHeroInstance *CNonConstInfoCallback::getHero(int objid)
|
||||||
@ -880,7 +883,7 @@ const TeamState * CGameInfoCallback::getTeam( ui8 teamID ) const
|
|||||||
{
|
{
|
||||||
ERROR_RET_VAL_IF(!vstd::contains(gs->teams, teamID), "Cannot find info for team " << int(teamID), NULL);
|
ERROR_RET_VAL_IF(!vstd::contains(gs->teams, teamID), "Cannot find info for team " << int(teamID), NULL);
|
||||||
const TeamState *ret = &gs->teams[teamID];
|
const TeamState *ret = &gs->teams[teamID];
|
||||||
ERROR_RET_VAL_IF(player != -1 && !vstd::contains(ret->players, player), "Illegal attempt to access team data!", NULL);
|
ERROR_RET_VAL_IF(!!player && !vstd::contains(ret->players, *player), "Illegal attempt to access team data!", NULL);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -64,10 +64,10 @@ class DLL_LINKAGE CGameInfoCallback : public virtual CCallbackBase
|
|||||||
{
|
{
|
||||||
protected:
|
protected:
|
||||||
CGameInfoCallback();
|
CGameInfoCallback();
|
||||||
CGameInfoCallback(CGameState *GS, int Player);
|
CGameInfoCallback(CGameState *GS, boost::optional<TPlayerColor> Player);
|
||||||
bool hasAccess(int playerId) const;
|
bool hasAccess(boost::optional<TPlayerColor> playerId) const;
|
||||||
bool isVisible(int3 pos, int Player) const;
|
bool isVisible(int3 pos, boost::optional<TPlayerColor> Player) const;
|
||||||
bool isVisible(const CGObjectInstance *obj, int Player) const;
|
bool isVisible(const CGObjectInstance *obj, boost::optional<TPlayerColor> Player) const;
|
||||||
bool isVisible(const CGObjectInstance *obj) const;
|
bool isVisible(const CGObjectInstance *obj) const;
|
||||||
|
|
||||||
bool canGetFullInfo(const CGObjectInstance *obj) const; //true we player owns obj or ally owns obj or privileged mode
|
bool canGetFullInfo(const CGObjectInstance *obj) const; //true we player owns obj or ally owns obj or privileged mode
|
||||||
@ -97,7 +97,7 @@ public:
|
|||||||
//hero
|
//hero
|
||||||
const CGHeroInstance* getHero(int objid) const;
|
const CGHeroInstance* getHero(int objid) const;
|
||||||
const CGHeroInstance* getHeroWithSubid(int subid) const;
|
const CGHeroInstance* getHeroWithSubid(int subid) const;
|
||||||
int getHeroCount(int player, bool includeGarrisoned) const;
|
int getHeroCount(TPlayerColor player, bool includeGarrisoned) const;
|
||||||
bool getHeroInfo(const CGObjectInstance *hero, InfoAboutHero &dest) const;
|
bool getHeroInfo(const CGObjectInstance *hero, InfoAboutHero &dest) const;
|
||||||
int getSpellCost(const CSpell * sp, const CGHeroInstance * caster) const; //when called during battle, takes into account creatures' spell cost reduction
|
int getSpellCost(const CSpell * sp, const CGHeroInstance * caster) const; //when called during battle, takes into account creatures' spell cost reduction
|
||||||
int estimateSpellDamage(const CSpell * sp, const CGHeroInstance * hero) const; //estimates damage of given spell; returns 0 if spell causes no dmg
|
int estimateSpellDamage(const CSpell * sp, const CGHeroInstance * hero) const; //estimates damage of given spell; returns 0 if spell causes no dmg
|
||||||
@ -146,7 +146,7 @@ public:
|
|||||||
int howManyTowns() const;
|
int howManyTowns() const;
|
||||||
int howManyHeroes(bool includeGarrisoned = true) const;
|
int howManyHeroes(bool includeGarrisoned = true) const;
|
||||||
int3 getGrailPos(double &outKnownRatio);
|
int3 getGrailPos(double &outKnownRatio);
|
||||||
int getMyColor() const;
|
boost::optional<TPlayerColor> getMyColor() const;
|
||||||
|
|
||||||
std::vector <const CGTownInstance *> getTownsInfo(bool onlyOur = true) const; //true -> only owned; false -> all visible
|
std::vector <const CGTownInstance *> getTownsInfo(bool onlyOur = true) const; //true -> only owned; false -> all visible
|
||||||
int getHeroSerial(const CGHeroInstance * hero, bool includeGarrisoned=true) const;
|
int getHeroSerial(const CGHeroInstance * hero, bool includeGarrisoned=true) const;
|
||||||
|
@ -599,7 +599,7 @@ void CMapLoaderH3M::loadArtifactsOfHero(CGHeroInstance * hero)
|
|||||||
if(!loadArtifactToSlot(hero, ArtifactPosition::MACH4))
|
if(!loadArtifactToSlot(hero, ArtifactPosition::MACH4))
|
||||||
{
|
{
|
||||||
// catapult by default
|
// catapult by default
|
||||||
hero->putArtifact(ArtifactPosition::MACH4, createArtifact(GameConstants::ID_CATAPULT));
|
hero->putArtifact(ArtifactPosition::MACH4, createArtifact(ArtifactID::CATAPULT));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2361,8 +2361,8 @@ bool CGameHandler::arrangeStacks( si32 id1, si32 id2, ui8 what, ui8 p1, ui8 p2,
|
|||||||
|
|
||||||
if(what==1) //swap
|
if(what==1) //swap
|
||||||
{
|
{
|
||||||
if ( ((s1->tempOwner != player && s1->tempOwner != 254) && s1->getStackCount(p1)) //why 254??
|
if ( ((s1->tempOwner != player && s1->tempOwner != GameConstants::UNFLAGGABLE_PLAYER) && s1->getStackCount(p1)) //why 254??
|
||||||
|| ((s2->tempOwner != player && s2->tempOwner != 254) && s2->getStackCount(p2)))
|
|| ((s2->tempOwner != player && s2->tempOwner != GameConstants::UNFLAGGABLE_PLAYER) && s2->getStackCount(p2)))
|
||||||
{
|
{
|
||||||
complain("Can't take troops from another player!");
|
complain("Can't take troops from another player!");
|
||||||
return false;
|
return false;
|
||||||
@ -2373,7 +2373,7 @@ bool CGameHandler::arrangeStacks( si32 id1, si32 id2, ui8 what, ui8 p1, ui8 p2,
|
|||||||
else if(what==2)//merge
|
else if(what==2)//merge
|
||||||
{
|
{
|
||||||
if (( s1->getCreature(p1) != s2->getCreature(p2) && complain("Cannot merge different creatures stacks!"))
|
if (( s1->getCreature(p1) != s2->getCreature(p2) && complain("Cannot merge different creatures stacks!"))
|
||||||
|| (((s1->tempOwner != player && s1->tempOwner != 254) && s2->getStackCount(p2)) && complain("Can't take troops from another player!")))
|
|| (((s1->tempOwner != player && s1->tempOwner != GameConstants::UNFLAGGABLE_PLAYER) && s2->getStackCount(p2)) && complain("Can't take troops from another player!")))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
moveStack(sl1, sl2);
|
moveStack(sl1, sl2);
|
||||||
@ -2425,7 +2425,7 @@ bool CGameHandler::arrangeStacks( si32 id1, si32 id2, ui8 what, ui8 p1, ui8 p2,
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
int CGameHandler::getPlayerAt( CConnection *c ) const
|
TPlayerColor CGameHandler::getPlayerAt( CConnection *c ) const
|
||||||
{
|
{
|
||||||
std::set<int> all;
|
std::set<int> all;
|
||||||
for(std::map<int,CConnection*>::const_iterator i=connections.begin(); i!=connections.end(); i++)
|
for(std::map<int,CConnection*>::const_iterator i=connections.begin(); i!=connections.end(); i++)
|
||||||
@ -2852,7 +2852,7 @@ bool CGameHandler::moveArtifact(const ArtifactLocation &al1, const ArtifactLocat
|
|||||||
&& srcArtifact && !srcArtifact->canBePutAt(dst, true))
|
&& srcArtifact && !srcArtifact->canBePutAt(dst, true))
|
||||||
COMPLAIN_RET("Cannot move artifact!");
|
COMPLAIN_RET("Cannot move artifact!");
|
||||||
|
|
||||||
if ((srcArtifact && srcArtifact->artType->id == GameConstants::ID_LOCK) || (destArtifact && destArtifact->artType->id == GameConstants::ID_LOCK))
|
if ((srcArtifact && srcArtifact->artType->id == ArtifactID::ART_LOCK) || (destArtifact && destArtifact->artType->id == ArtifactID::ART_LOCK))
|
||||||
COMPLAIN_RET("Cannot move artifact locks.");
|
COMPLAIN_RET("Cannot move artifact locks.");
|
||||||
|
|
||||||
if (dst.slot >= GameConstants::BACKPACK_START && srcArtifact->artType->isBig())
|
if (dst.slot >= GameConstants::BACKPACK_START && srcArtifact->artType->isBig())
|
||||||
@ -3548,7 +3548,7 @@ bool CGameHandler::makeBattleAction( BattleAction &ba )
|
|||||||
const CGHeroInstance * attackingHero = gs->curB->heroes[ba.side];
|
const CGHeroInstance * attackingHero = gs->curB->heroes[ba.side];
|
||||||
CHeroHandler::SBallisticsLevelInfo sbi = VLC->heroh->ballistics[attackingHero->getSecSkillLevel(SecondarySkill::BALLISTICS)];
|
CHeroHandler::SBallisticsLevelInfo sbi = VLC->heroh->ballistics[attackingHero->getSecSkillLevel(SecondarySkill::BALLISTICS)];
|
||||||
|
|
||||||
int attackedPart = gs->curB->battleHexToWallPart(ba.destinationTile);
|
EWallParts::EWallParts attackedPart = gs->curB->battleHexToWallPart(ba.destinationTile);
|
||||||
if(attackedPart < 0)
|
if(attackedPart < 0)
|
||||||
{
|
{
|
||||||
complain("catapult tried to attack non-catapultable hex!");
|
complain("catapult tried to attack non-catapultable hex!");
|
||||||
@ -3571,20 +3571,20 @@ bool CGameHandler::makeBattleAction( BattleAction &ba )
|
|||||||
int dmgChance[] = { sbi.noDmg, sbi.oneDmg, sbi.twoDmg }; //dmgChance[i] - chance for doing i dmg when hit is successful
|
int dmgChance[] = { sbi.noDmg, sbi.oneDmg, sbi.twoDmg }; //dmgChance[i] - chance for doing i dmg when hit is successful
|
||||||
switch(attackedPart)
|
switch(attackedPart)
|
||||||
{
|
{
|
||||||
case 0: //keep
|
case EWallParts::KEEP:
|
||||||
chanceForHit = sbi.keep;
|
chanceForHit = sbi.keep;
|
||||||
break;
|
break;
|
||||||
case 1: //bottom tower
|
case EWallParts::BOTTOM_TOWER:
|
||||||
case 6: //upper tower
|
case EWallParts::UPPER_TOWER:
|
||||||
chanceForHit = sbi.tower;
|
chanceForHit = sbi.tower;
|
||||||
break;
|
break;
|
||||||
case 2: //bottom wall
|
case EWallParts::BOTTOM_WALL:
|
||||||
case 3: //below gate
|
case EWallParts::BELOW_GATE:
|
||||||
case 4: //over gate
|
case EWallParts::OVER_GATE:
|
||||||
case 5: //upper wall
|
case EWallParts::UPPER_WAL:
|
||||||
chanceForHit = sbi.wall;
|
chanceForHit = sbi.wall;
|
||||||
break;
|
break;
|
||||||
case 7: //gate
|
case EWallParts::GATE:
|
||||||
chanceForHit = sbi.gate;
|
chanceForHit = sbi.gate;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -6188,7 +6188,7 @@ CasualtiesAfterBattle::CasualtiesAfterBattle(const CArmedInstance *army, BattleI
|
|||||||
heroWithDeadCommander = -1;
|
heroWithDeadCommander = -1;
|
||||||
|
|
||||||
int color = army->tempOwner;
|
int color = army->tempOwner;
|
||||||
if(color == 254)
|
if(color == GameConstants::UNFLAGGABLE_PLAYER)
|
||||||
color = GameConstants::NEUTRAL_PLAYER;
|
color = GameConstants::NEUTRAL_PLAYER;
|
||||||
|
|
||||||
BOOST_FOREACH(CStack *st, bat->stacks)
|
BOOST_FOREACH(CStack *st, bat->stacks)
|
||||||
|
@ -193,7 +193,7 @@ public:
|
|||||||
|
|
||||||
void init(StartInfo *si);
|
void init(StartInfo *si);
|
||||||
void handleConnection(std::set<int> players, CConnection &c);
|
void handleConnection(std::set<int> players, CConnection &c);
|
||||||
int getPlayerAt(CConnection *c) const;
|
TPlayerColor getPlayerAt(CConnection *c) const;
|
||||||
|
|
||||||
void playerMessage( TPlayerColor player, const std::string &message);
|
void playerMessage( TPlayerColor player, const std::string &message);
|
||||||
bool makeBattleAction(BattleAction &ba);
|
bool makeBattleAction(BattleAction &ba);
|
||||||
|
Loading…
Reference in New Issue
Block a user