1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-01-12 02:28:11 +02:00

Fix dynamic_cast on MacOSX in CQuery.cpp

This commit is contained in:
Vadim Markovtsev 2015-10-28 23:53:44 +03:00
parent 610318d5d3
commit 68cc860133
3 changed files with 85 additions and 68 deletions

View File

@ -917,7 +917,7 @@ void CGameHandler::handleConnection(std::set<PlayerColor> players, CConnection &
c << &applied;
};
CBaseForGHApply *apply = applier->apps[packType]; //and appropriae applier object
CBaseForGHApply *apply = applier->apps[packType]; //and appropriate applier object
if(isBlockedByQueries(pack, player))
{
sendPackageResponse(false);
@ -5347,7 +5347,6 @@ void CGameHandler::runBattle()
const CStack *next;
while(!battleResult.get() && (next = curB.getNextStack()) && next->willMove())
{
//check for bad morale => freeze
int nextStackMorale = next->MoraleVal();
if( nextStackMorale < 0 &&
@ -5933,4 +5932,3 @@ bool ServerSpellCastEnvironment::moveHero(ObjectInstanceID hid, int3 dst, ui8 te
{
return gh->moveHero(hid, dst, teleporting, false, asker);
}

View File

@ -244,7 +244,12 @@ CBattleQuery::CBattleQuery()
bool CBattleQuery::blocksPack(const CPack *pack) const
{
return !dynamic_cast<const MakeAction*>(pack) && !dynamic_cast<const MakeCustomAction*>(pack);
#ifndef __APPLE__
bool dynamic_success = !dynamic_cast<const MakeAction*>(pack) && !dynamic_cast<const MakeCustomAction*>(pack);
#else
const char * name = typeid(*pack).name();
return strcmp(name, typeid(MakeAction).name()) && strcmp(name, typeid(MakeCustomAction).name());
#endif
}
void CBattleQuery::onRemoval(CGameHandler *gh, PlayerColor color)
@ -272,12 +277,12 @@ bool CGarrisonDialogQuery::blocksPack(const CPack *pack) const
ourIds.insert(this->exchangingArmies[0]->id);
ourIds.insert(this->exchangingArmies[1]->id);
if (auto stacks = dynamic_cast<const ArrangeStacks*>(pack))
if (auto stacks = dynamic_ptr_cast<ArrangeStacks>(pack))
{
return !vstd::contains(ourIds, stacks->id1) || !vstd::contains(ourIds, stacks->id2);
}
if (auto arts = dynamic_cast<const ExchangeArtifacts*>(pack))
if (auto arts = dynamic_ptr_cast<ExchangeArtifacts>(pack))
{
if(auto id1 = boost::apply_visitor(GetEngagedHeroIds(), arts->src.artHolder))
if(!vstd::contains(ourIds, *id1))
@ -288,17 +293,17 @@ bool CGarrisonDialogQuery::blocksPack(const CPack *pack) const
return true;
return false;
}
if (auto dismiss = dynamic_cast<const DisbandCreature*>(pack))
if (auto dismiss = dynamic_ptr_cast<DisbandCreature>(pack))
{
return !vstd::contains(ourIds, dismiss->id);
}
if (auto dismiss = dynamic_cast<const AssembleArtifacts*>(pack))
if (auto dismiss = dynamic_ptr_cast<AssembleArtifacts>(pack))
{
return !vstd::contains(ourIds, dismiss->heroID);
}
if(auto upgrade = dynamic_cast<const UpgradeCreature*>(pack))
if(auto upgrade = dynamic_ptr_cast<UpgradeCreature>(pack))
{
return !vstd::contains(ourIds, upgrade->id);
}
@ -319,7 +324,7 @@ CBlockingDialogQuery::CBlockingDialogQuery(const BlockingDialog &bd)
void CTeleportDialogQuery::notifyObjectAboutRemoval(const CObjectVisitQuery &objectVisit) const
{
auto obj = dynamic_cast<const CGTeleport *>(objectVisit.visitedObject);
auto obj = dynamic_ptr_cast<CGTeleport>(objectVisit.visitedObject);
obj->teleportDialogAnswered(objectVisit.visitingHero, *answer, td.exits);
}
@ -373,7 +378,7 @@ bool CDialogQuery::endsByPlayerAnswer() const
bool CDialogQuery::blocksPack(const CPack *pack) const
{
//We accept only query replies from correct player
if(auto reply = dynamic_cast<const QueryReply *>(pack))
if(auto reply = dynamic_ptr_cast<QueryReply>(pack))
{
return !vstd::contains(players, reply->player);
}

View File

@ -8,3 +8,17 @@
#include <boost/random/mersenne_twister.hpp>
#include <boost/random/variate_generator.hpp>
#include <boost/system/system_error.hpp>
template<class T, class F>
inline const T * dynamic_ptr_cast(const F * ptr)
{
#ifndef __APPLE__
return dynamic_cast<const T*>(ptr);
#else
if (!strcmp(typeid(*ptr).name(), typeid(T).name()))
{
return static_cast<const T*>(ptr);
}
return nullptr;
#endif
}