1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-06-15 00:05:02 +02:00

fix Eye of magi, also fix #1608

Conflicts:
	lib/CObjectHandler.cpp
This commit is contained in:
AlexVinS
2014-06-21 17:41:05 +04:00
parent c7772aa5a4
commit 4e4ba6654c
5 changed files with 47 additions and 5 deletions

View File

@ -101,7 +101,6 @@ struct OCM_HLP_CGIN
} ocmptwo_cgin ; } ocmptwo_cgin ;
CPlayerInterface::CPlayerInterface(PlayerColor Player) CPlayerInterface::CPlayerInterface(PlayerColor Player)
{ {
logGlobal->traceStream() << "\tHuman player interface for player " << Player << " being constructed"; logGlobal->traceStream() << "\tHuman player interface for player " << Player << " being constructed";
@ -1503,8 +1502,16 @@ void CPlayerInterface::centerView (int3 pos, int focusTime)
if(focusTime) if(focusTime)
{ {
GH.totalRedraw(); GH.totalRedraw();
#ifdef VCMI_SDL1
CSDL_Ext::update(screen); CSDL_Ext::update(screen);
SDL_Delay(focusTime); SDL_Delay(focusTime);
#else
{
auto unlockPim = vstd::makeUnlockGuard(*pim);
IgnoreEvents ignore(*this);
SDL_Delay(focusTime);
}
#endif
} }
} }
@ -2553,6 +2560,16 @@ bool CPlayerInterface::capturedAllEvents()
return true; return true;
} }
if(ignoreEvents)
{
boost::unique_lock<boost::mutex> un(eventsM);
while(!events.empty())
{
events.pop();
}
return true;
}
return false; return false;
} }

View File

@ -269,7 +269,25 @@ private:
template <typename Handler> void serializeTempl(Handler &h, const int version); template <typename Handler> void serializeTempl(Handler &h, const int version);
private: private:
struct IgnoreEvents
{
CPlayerInterface & owner;
IgnoreEvents(CPlayerInterface & Owner):owner(Owner)
{
owner.ignoreEvents = true;
};
~IgnoreEvents()
{
owner.ignoreEvents = false;
};
};
bool duringMovement; bool duringMovement;
bool ignoreEvents;
void doMoveHero(const CGHeroInstance *h, CGPath path); void doMoveHero(const CGHeroInstance *h, CGPath path);
}; };

View File

@ -164,6 +164,11 @@ void SetMovePoints::applyCl( CClient *cl )
void FoWChange::applyCl( CClient *cl ) void FoWChange::applyCl( CClient *cl )
{ {
for(auto &i : cl->playerint) for(auto &i : cl->playerint)
{
if(cl->getPlayerRelations(i.first, player) == PlayerRelations::SAME_PLAYER && waitForDialogs && LOCPLINT == i.second.get())
{
LOCPLINT->waitWhileDialog();
}
if(cl->getPlayerRelations(i.first, player) != PlayerRelations::ENEMIES) if(cl->getPlayerRelations(i.first, player) != PlayerRelations::ENEMIES)
{ {
if(mode) if(mode)
@ -171,7 +176,7 @@ void FoWChange::applyCl( CClient *cl )
else else
i.second->tileHidden(tiles); i.second->tileHidden(tiles);
} }
}
cl->invalidatePaths(); cl->invalidatePaths();
} }

View File

@ -302,16 +302,17 @@ struct SetMovePoints : public CPackForClient //111
struct FoWChange : public CPackForClient //112 struct FoWChange : public CPackForClient //112
{ {
FoWChange(){type = 112;}; FoWChange(){type = 112;waitForDialogs = false;};
void applyCl(CClient *cl); void applyCl(CClient *cl);
DLL_LINKAGE void applyGs(CGameState *gs); DLL_LINKAGE void applyGs(CGameState *gs);
std::unordered_set<int3, struct ShashInt3 > tiles; std::unordered_set<int3, struct ShashInt3 > tiles;
PlayerColor player; PlayerColor player;
ui8 mode; //mode==0 - hide, mode==1 - reveal ui8 mode; //mode==0 - hide, mode==1 - reveal
bool waitForDialogs;
template <typename Handler> void serialize(Handler &h, const int version) template <typename Handler> void serialize(Handler &h, const int version)
{ {
h & tiles & player & mode; h & tiles & player & mode & waitForDialogs;
} }
}; };

View File

@ -1294,6 +1294,7 @@ void CGMagi::onHeroVisit(const CGHeroInstance * h) const
FoWChange fw; FoWChange fw;
fw.player = h->tempOwner; fw.player = h->tempOwner;
fw.mode = 1; fw.mode = 1;
fw.waitForDialogs = true;
for(auto it : eyelist[subID]) for(auto it : eyelist[subID])
{ {