2011-12-14 00:23:17 +03:00
# include "StdInc.h"
2007-08-27 17:15:03 +03:00
# include "CCallback.h"
2011-12-14 00:23:17 +03:00
2010-12-20 23:22:53 +02:00
# include "lib/CCreatureHandler.h"
2009-05-20 13:08:56 +03:00
# include "client/CGameInfo.h"
# include "lib/CGameState.h"
2010-12-25 21:23:30 +02:00
# include "lib/BattleState.h"
2009-05-20 13:08:56 +03:00
# include "client/CPlayerInterface.h"
2008-08-30 00:41:32 +03:00
# include "client/Client.h"
2013-04-07 13:48:07 +03:00
# include "lib/mapping/CMap.h"
2010-12-20 23:22:53 +02:00
# include "lib/CBuildingHandler.h"
# include "lib/CDefObjInfoHandler.h"
# include "lib/CGeneralTextHandler.h"
# include "lib/CHeroHandler.h"
# include "lib/CObjectHandler.h"
2008-07-27 20:07:37 +03:00
# include "lib/Connection.h"
2008-07-28 15:44:08 +03:00
# include "lib/NetPacks.h"
2010-04-06 11:59:24 +03:00
# include "client/mapHandler.h"
2010-12-20 23:22:53 +02:00
# include "lib/CSpellHandler.h"
# include "lib/CArtHandler.h"
2011-12-14 00:23:17 +03:00
# include "lib/GameConstants.h"
2008-08-04 18:56:36 +03:00
# ifdef min
# undef min
# endif
# ifdef max
# undef max
# endif
2012-02-20 00:03:43 +03:00
# include "lib/UnlockGuard.h"
2008-03-14 20:24:37 +02:00
2009-04-15 17:03:31 +03:00
/*
* CCallback . cpp , part of VCMI engine
*
* Authors : listed in file AUTHORS in main folder
*
* License : GNU General Public License v2 .0 or later
* Full text of license available in license . txt file , in main folder
*
*/
2009-03-07 00:11:17 +02:00
template < ui16 N > bool isType ( CPack * pack )
{
return pack - > getType ( ) = = N ;
}
2010-06-30 22:27:35 +03:00
bool CCallback : : teleportHero ( const CGHeroInstance * who , const CGTownInstance * where )
{
CastleTeleportHero pack ( who - > id , where - > id , 1 ) ;
sendRequest ( & pack ) ;
return true ;
}
2009-08-04 02:53:18 +03:00
bool CCallback : : moveHero ( const CGHeroInstance * h , int3 dst )
2009-03-12 20:50:36 +02:00
{
2009-03-20 20:51:48 +02:00
MoveHero pack ( dst , h - > id ) ;
2009-08-04 02:53:18 +03:00
sendRequest ( & pack ) ;
2007-08-30 13:11:53 +03:00
return true ;
2007-08-29 15:18:31 +03:00
}
2012-07-15 18:34:00 +03:00
2013-05-27 13:53:28 +03:00
int CCallback : : selectionMade ( int selection , QueryID queryID )
2007-12-25 18:25:53 +02:00
{
2013-02-11 17:42:09 +03:00
ASSERT_IF_CALLED_WITH_PLAYER
2013-05-27 13:53:28 +03:00
if ( queryID = = QueryID ( - 1 ) )
2012-07-15 18:34:00 +03:00
{
2013-04-09 17:31:36 +03:00
logGlobal - > errorStream ( ) < < " Cannot answer the query -1! " ;
2012-07-15 18:34:00 +03:00
return false ;
}
QueryReply pack ( queryID , selection ) ;
2013-02-11 17:42:09 +03:00
pack . player = * player ;
2012-07-15 18:34:00 +03:00
return sendRequest ( & pack ) ;
2007-12-25 18:25:53 +02:00
}
2012-07-15 18:34:00 +03:00
2013-02-11 02:24:57 +03:00
void CCallback : : recruitCreatures ( const CGObjectInstance * obj , CreatureID ID , ui32 amount , si32 level /*=-1*/ )
2008-04-11 20:41:02 +03:00
{
2012-09-23 21:01:04 +03:00
if ( player ! = obj - > tempOwner & & obj - > ID ! = Obj : : WAR_MACHINE_FACTORY )
2010-05-15 11:33:32 +03:00
return ;
2009-03-20 20:51:48 +02:00
2010-07-10 19:50:23 +03:00
RecruitCreatures pack ( obj - > id , ID , amount , level ) ;
2009-08-04 02:53:18 +03:00
sendRequest ( & pack ) ;
2008-04-11 20:41:02 +03:00
}
2007-09-14 16:11:10 +03:00
2013-02-16 17:03:47 +03:00
bool CCallback : : dismissCreature ( const CArmedInstance * obj , SlotID stackPos )
2008-05-23 22:50:11 +03:00
{
2010-05-02 21:20:26 +03:00
if ( ( ( player > = 0 ) & & obj - > tempOwner ! = player ) | | ( obj - > stacksCount ( ) < 2 & & obj - > needsLastStack ( ) ) )
2008-05-31 23:37:54 +03:00
return false ;
2009-03-20 20:51:48 +02:00
DisbandCreature pack ( stackPos , obj - > id ) ;
2009-08-04 02:53:18 +03:00
sendRequest ( & pack ) ;
2008-05-31 23:37:54 +03:00
return true ;
2008-05-23 22:50:11 +03:00
}
2011-05-03 06:14:18 +03:00
2013-02-16 17:03:47 +03:00
bool CCallback : : upgradeCreature ( const CArmedInstance * obj , SlotID stackPos , CreatureID newID )
2008-05-23 22:50:11 +03:00
{
2009-03-20 20:51:48 +02:00
UpgradeCreature pack ( stackPos , obj - > id , newID ) ;
2009-08-04 02:53:18 +03:00
sendRequest ( & pack ) ;
2008-05-23 22:50:11 +03:00
return false ;
}
2011-05-03 06:14:18 +03:00
2008-07-27 20:07:37 +03:00
void CCallback : : endTurn ( )
{
2013-04-09 17:31:36 +03:00
logGlobal - > traceStream ( ) < < " Player " < < * player < < " ended his turn. " ;
2009-03-20 20:51:48 +02:00
EndTurn pack ;
2009-08-04 02:53:18 +03:00
sendRequest ( & pack ) ; //report that we ended turn
2008-07-27 20:07:37 +03:00
}
2013-02-16 17:03:47 +03:00
int CCallback : : swapCreatures ( const CArmedInstance * s1 , const CArmedInstance * s2 , SlotID p1 , SlotID p2 )
2008-01-26 21:36:31 +02:00
{
2009-03-20 20:51:48 +02:00
ArrangeStacks pack ( 1 , p1 , p2 , s1 - > id , s2 - > id , 0 ) ;
2009-08-04 02:53:18 +03:00
sendRequest ( & pack ) ;
2008-04-13 14:05:39 +03:00
return 0 ;
2008-01-26 21:36:31 +02:00
}
2008-01-27 18:07:27 +02:00
2013-02-16 17:03:47 +03:00
int CCallback : : mergeStacks ( const CArmedInstance * s1 , const CArmedInstance * s2 , SlotID p1 , SlotID p2 )
2009-04-12 03:58:41 +03:00
{
2009-03-20 20:51:48 +02:00
ArrangeStacks pack ( 2 , p1 , p2 , s1 - > id , s2 - > id , 0 ) ;
2009-08-04 02:53:18 +03:00
sendRequest ( & pack ) ;
2008-04-13 14:05:39 +03:00
return 0 ;
2008-01-30 00:47:43 +02:00
}
2013-02-16 17:03:47 +03:00
int CCallback : : splitStack ( const CArmedInstance * s1 , const CArmedInstance * s2 , SlotID p1 , SlotID p2 , int val )
2008-01-30 00:47:43 +02:00
{
2009-03-20 20:51:48 +02:00
ArrangeStacks pack ( 3 , p1 , p2 , s1 - > id , s2 - > id , val ) ;
2009-08-04 02:53:18 +03:00
sendRequest ( & pack ) ;
2008-04-19 19:15:04 +03:00
return 0 ;
2008-01-30 00:47:43 +02:00
}
2008-01-27 18:07:27 +02:00
bool CCallback : : dismissHero ( const CGHeroInstance * hero )
{
2008-08-02 00:41:38 +03:00
if ( player ! = hero - > tempOwner ) return false ;
2009-03-20 20:51:48 +02:00
DismissHero pack ( hero - > id ) ;
2009-08-04 02:53:18 +03:00
sendRequest ( & pack ) ;
2008-08-02 00:41:38 +03:00
return true ;
2008-01-27 18:07:27 +02:00
}
2010-08-03 14:36:52 +03:00
// int CCallback::getMySerial() const
2013-02-12 18:46:43 +03:00
// {
2010-08-03 14:36:52 +03:00
// boost::shared_lock<boost::shared_mutex> lock(*gs->mx);
// return gs->players[player].serial;
// }
2007-11-19 00:58:28 +02:00
2012-04-14 05:20:22 +03:00
bool CCallback : : swapArtifacts ( const ArtifactLocation & l1 , const ArtifactLocation & l2 )
2008-01-30 12:55:43 +02:00
{
2012-04-14 05:20:22 +03:00
ExchangeArtifacts ea ;
ea . src = l1 ;
ea . dst = l2 ;
sendRequest ( & ea ) ;
return true ;
2008-01-30 12:55:43 +02:00
}
2007-11-19 00:58:28 +02:00
2010-02-16 16:39:56 +02:00
/**
* Assembles or disassembles a combination artifact .
* @ param hero Hero holding the artifact ( s ) .
* @ param artifactSlot The worn slot ID of the combination - or constituent artifact .
* @ param assemble True for assembly operation , false for disassembly .
* @ param assembleTo If assemble is true , this represents the artifact ID of the combination
* artifact to assemble to . Otherwise it ' s not used .
*/
2013-02-16 17:03:47 +03:00
bool CCallback : : assembleArtifacts ( const CGHeroInstance * hero , ArtifactPosition artifactSlot , bool assemble , ArtifactID assembleTo )
2010-02-16 16:39:56 +02:00
{
if ( player ! = hero - > tempOwner )
return false ;
AssembleArtifacts aa ( hero - > id , artifactSlot , assemble , assembleTo ) ;
sendRequest ( & aa ) ;
return true ;
}
2013-02-11 22:11:34 +03:00
bool CCallback : : buildBuilding ( const CGTownInstance * town , BuildingID buildingID )
2008-03-21 02:03:31 +02:00
{
2008-08-01 14:21:15 +03:00
if ( town - > tempOwner ! = player )
2008-03-23 03:01:17 +02:00
return false ;
2011-07-05 09:14:07 +03:00
if ( ! canBuildStructure ( town , buildingID ) )
return false ;
2008-08-01 14:21:15 +03:00
2009-03-20 20:51:48 +02:00
BuildStructure pack ( town - > id , buildingID ) ;
2009-08-04 02:53:18 +03:00
sendRequest ( & pack ) ;
2008-03-21 02:03:31 +02:00
return true ;
}
2010-12-22 22:14:40 +02:00
int CBattleCallback : : battleMakeAction ( BattleAction * action )
2008-09-29 00:01:49 +03:00
{
2013-02-04 00:05:44 +03:00
assert ( action - > actionType = = Battle : : HERO_SPELL ) ;
2009-03-20 20:51:48 +02:00
MakeCustomAction mca ( * action ) ;
2009-08-04 02:53:18 +03:00
sendRequest ( & mca ) ;
2008-09-29 00:01:49 +03:00
return 0 ;
}
2012-07-15 18:34:00 +03:00
int CBattleCallback : : sendRequest ( const CPack * request )
2010-12-22 22:14:40 +02:00
{
2013-02-11 17:42:09 +03:00
int requestID = cl - > sendRequest ( request , * player ) ;
2010-12-22 22:14:40 +02:00
if ( waitTillRealize )
2011-07-05 22:05:41 +03:00
{
2013-04-09 17:31:36 +03:00
logGlobal - > traceStream ( ) < < boost : : format ( " We'll wait till request %d is answered. \n " ) % requestID ;
2012-04-06 18:02:15 +03:00
auto gsUnlocker = vstd : : makeUnlockSharedGuardIf ( getGsMutex ( ) , unlockGsWhenWaiting ) ;
2012-03-26 01:46:14 +03:00
cl - > waitingRequest . waitWhileContains ( requestID ) ;
2011-07-05 22:05:41 +03:00
}
2012-07-15 18:34:00 +03:00
2014-02-02 00:34:14 +03:00
boost : : this_thread : : interruption_point ( ) ;
2012-07-15 18:34:00 +03:00
return requestID ;
2010-12-22 22:14:40 +02:00
}
2008-08-16 11:47:41 +03:00
void CCallback : : swapGarrisonHero ( const CGTownInstance * town )
{
2013-02-23 15:22:23 +03:00
if ( town - > tempOwner = = * player
| | ( town - > garrisonHero & & town - > garrisonHero - > tempOwner = = * player ) )
{
GarrisonHeroSwap pack ( town - > id ) ;
sendRequest ( & pack ) ;
}
2008-08-25 13:25:16 +03:00
}
2013-02-11 02:24:57 +03:00
void CCallback : : buyArtifact ( const CGHeroInstance * hero , ArtifactID aid )
2008-08-25 13:25:16 +03:00
{
if ( hero - > tempOwner ! = player ) return ;
2009-03-20 20:51:48 +02:00
BuyArtifact pack ( hero - > id , aid ) ;
2009-08-04 02:53:18 +03:00
sendRequest ( & pack ) ;
2008-08-28 20:36:34 +03:00
}
2013-06-26 14:18:27 +03:00
void CCallback : : trade ( const CGObjectInstance * market , EMarketMode : : EMarketMode mode , int id1 , int id2 , int val1 , const CGHeroInstance * hero /* = nullptr*/ )
2008-09-07 06:38:37 +03:00
{
2010-05-18 10:01:54 +03:00
TradeOnMarketplace pack ;
pack . market = market ;
pack . hero = hero ;
pack . mode = mode ;
pack . r1 = id1 ;
pack . r2 = id2 ;
pack . val = val1 ;
2009-08-04 02:53:18 +03:00
sendRequest ( & pack ) ;
2008-09-18 16:54:54 +03:00
}
2008-09-19 11:16:19 +03:00
void CCallback : : setFormation ( const CGHeroInstance * hero , bool tight )
2008-09-18 16:54:54 +03:00
{
2010-05-02 21:20:26 +03:00
const_cast < CGHeroInstance * > ( hero ) - > formation = tight ;
2009-03-20 20:51:48 +02:00
SetFormation pack ( hero - > id , tight ) ;
2009-08-04 02:53:18 +03:00
sendRequest ( & pack ) ;
2008-10-19 02:20:48 +03:00
}
void CCallback : : setSelection ( const CArmedInstance * obj )
{
2014-03-01 15:23:33 +03:00
if ( ! player | | obj - > getOwner ( ) ! = * player )
{
logGlobal - > errorStream ( ) < < boost : : format ( " Cannot set selection to the object that is not owned. Object owner is %s, callback player %s " ) % obj - > getOwner ( ) % player ;
return ;
}
2008-12-27 03:01:59 +02:00
SetSelection ss ;
2013-02-11 17:42:09 +03:00
ss . player = * player ;
2008-12-27 03:01:59 +02:00
ss . id = obj - > id ;
2011-08-25 18:24:37 +03:00
sendRequest ( & ( CPackForClient & ) ss ) ;
2009-09-13 01:17:23 +03:00
2014-03-01 15:23:33 +03:00
if ( obj - > getOwner ( ) ! = * player )
{
// Cf. bug #1679 http://bugs.vcmi.eu/view.php?id=1679
logGlobal - > warnStream ( ) < < " The selection request became invalid because of event that occurred after it was made. Object owner is now " < < obj - > getOwner ( ) ;
throw std : : runtime_error ( " setSelection not allowed " ) ;
}
2012-09-23 21:01:04 +03:00
if ( obj - > ID = = Obj : : HERO )
2009-09-13 01:17:23 +03:00
{
2011-06-25 17:22:19 +03:00
if ( cl - > pathInfo - > hero ! = obj ) //calculate new paths only if we selected a different hero
cl - > calculatePaths ( static_cast < const CGHeroInstance * > ( obj ) ) ;
2009-09-13 01:17:23 +03:00
//nasty workaround. TODO: nice workaround
2013-02-21 05:25:44 +03:00
cl - > gs - > getPlayer ( * player ) - > currentSelection = obj - > id ;
2009-09-13 01:17:23 +03:00
}
2008-10-26 22:58:34 +02:00
}
2010-07-09 02:03:27 +03:00
void CCallback : : recruitHero ( const CGObjectInstance * townOrTavern , const CGHeroInstance * hero )
2008-10-26 22:58:34 +02:00
{
2013-02-09 20:37:38 +03:00
assert ( townOrTavern ) ;
assert ( hero ) ;
2008-10-26 22:58:34 +02:00
ui8 i = 0 ;
2013-02-11 17:42:09 +03:00
for ( ; i < gs - > players [ * player ] . availableHeroes . size ( ) ; i + + )
2009-03-09 12:37:49 +02:00
{
2013-02-11 17:42:09 +03:00
if ( gs - > players [ * player ] . availableHeroes [ i ] = = hero )
2009-03-09 12:37:49 +02:00
{
2013-02-14 02:55:42 +03:00
HireHero pack ( i , townOrTavern - > id ) ;
2013-02-11 17:42:09 +03:00
pack . player = * player ;
2009-08-04 02:53:18 +03:00
sendRequest ( & pack ) ;
2009-03-09 12:37:49 +02:00
return ;
}
}
2008-10-26 22:58:34 +02:00
}
2009-03-28 02:38:48 +02:00
void CCallback : : save ( const std : : string & fname )
{
cl - > save ( fname ) ;
2009-04-04 22:26:41 +03:00
}
2009-04-05 17:37:14 +03:00
void CCallback : : sendMessage ( const std : : string & mess )
{
2013-02-11 17:42:09 +03:00
ASSERT_IF_CALLED_WITH_PLAYER
PlayerMessage pm ( * player , mess ) ;
2011-08-25 18:24:37 +03:00
sendRequest ( & ( CPackForClient & ) pm ) ;
2009-05-12 06:35:51 +03:00
}
2009-07-20 04:47:49 +03:00
2009-07-26 06:33:13 +03:00
void CCallback : : buildBoat ( const IShipyard * obj )
{
BuildBoat bb ;
bb . objid = obj - > o - > id ;
2009-08-04 02:53:18 +03:00
sendRequest ( & bb ) ;
}
2013-03-03 20:06:03 +03:00
CCallback : : CCallback ( CGameState * GS , boost : : optional < PlayerColor > Player , CClient * C )
2010-12-22 22:14:40 +02:00
: CBattleCallback ( GS , Player , C )
2009-08-04 02:53:18 +03:00
{
waitTillRealize = false ;
2012-02-17 00:46:28 +03:00
unlockGsWhenWaiting = false ;
2009-07-26 06:33:13 +03:00
}
2013-02-12 18:46:43 +03:00
CCallback : : ~ CCallback ( )
{
//trivial, but required. Don`t remove.
}
2009-08-30 15:47:40 +03:00
const CGPathNode * CCallback : : getPathInfo ( int3 tile )
{
2012-02-26 21:31:59 +03:00
if ( ! gs - > map - > isInTheMap ( tile ) )
return nullptr ;
validatePaths ( ) ;
2009-08-30 15:47:40 +03:00
return & cl - > pathInfo - > nodes [ tile . x ] [ tile . y ] [ tile . z ] ;
}
2013-12-20 16:07:58 +03:00
int CCallback : : getDistance ( int3 tile )
2013-12-20 12:43:12 +03:00
{
CGPath ret ;
if ( getPath2 ( tile , ret ) )
return ret . nodes . size ( ) ;
else
return 255 ;
}
2014-02-15 22:39:03 +03:00
bool CCallback : : canMoveBetween ( const int3 & a , const int3 & b )
{
//TODO: merge with Pathfinder::canMoveBetween
return gs - > checkForVisitableDir ( a , b ) & & gs - > checkForVisitableDir ( b , a ) ;
}
2009-08-30 15:47:40 +03:00
bool CCallback : : getPath2 ( int3 dest , CGPath & ret )
{
2009-10-23 05:11:45 +03:00
if ( ! gs - > map - > isInTheMap ( dest ) )
return false ;
2012-02-26 21:31:59 +03:00
validatePaths ( ) ;
2011-06-25 17:22:19 +03:00
boost : : unique_lock < boost : : mutex > pathLock ( cl - > pathMx ) ;
2009-08-30 15:47:40 +03:00
return cl - > pathInfo - > getPath ( dest , ret ) ;
}
2014-02-07 11:23:31 +03:00
int CCallback : : getMovementCost ( const CGHeroInstance * hero , int3 dest )
{
return gs - > getMovementCost ( hero , hero - > visitablePos ( ) , dest , hero - > movement ) ;
}
2009-09-07 05:29:44 +03:00
void CCallback : : recalculatePaths ( )
{
2013-02-11 17:42:09 +03:00
cl - > calculatePaths ( cl - > IGameCallback : : getSelectedHero ( * player ) ) ;
2009-09-07 05:29:44 +03:00
}
void CCallback : : calculatePaths ( const CGHeroInstance * hero , CPathsInfo & out , int3 src /*= int3(-1,-1,-1)*/ , int movement /*= -1*/ )
{
gs - > calculatePaths ( hero , out , src , movement ) ;
}
2010-02-21 17:03:30 +02:00
void CCallback : : dig ( const CGObjectInstance * hero )
{
DigWithHero dwh ;
dwh . id = hero - > id ;
sendRequest ( & dwh ) ;
}
2013-02-11 02:24:57 +03:00
void CCallback : : castSpell ( const CGHeroInstance * hero , SpellID spellID , const int3 & pos )
2010-03-11 01:16:30 +02:00
{
CastAdvSpell cas ;
cas . hid = hero - > id ;
cas . sid = spellID ;
cas . pos = pos ;
sendRequest ( & cas ) ;
}
2011-05-30 02:49:25 +03:00
2013-12-06 22:44:11 +03:00
void CCallback : : unregisterAllInterfaces ( )
2011-05-30 02:49:25 +03:00
{
2013-12-06 22:44:11 +03:00
cl - > playerint . clear ( ) ;
cl - > battleints . clear ( ) ;
2011-05-30 02:49:25 +03:00
}
2012-02-26 21:31:59 +03:00
void CCallback : : validatePaths ( )
{
2013-02-11 17:42:09 +03:00
ASSERT_IF_CALLED_WITH_PLAYER
const CGHeroInstance * h = cl - > IGameCallback : : getSelectedHero ( * player ) ;
2012-02-28 14:26:08 +03:00
if ( h & & ( cl - > pathInfo - > hero ! = h //wrong hero
2013-06-23 00:47:51 +03:00
| | cl - > pathInfo - > hpos ! = h - > getPosition ( false ) //wrong hero position
2012-02-28 14:26:08 +03:00
| | ! cl - > pathInfo - > isValid ) ) //paths invalidated by game event
2013-02-12 18:46:43 +03:00
{
2012-02-26 21:31:59 +03:00
recalculatePaths ( ) ;
}
}
2013-02-16 17:03:47 +03:00
int CCallback : : mergeOrSwapStacks ( const CArmedInstance * s1 , const CArmedInstance * s2 , SlotID p1 , SlotID p2 )
2012-03-11 04:26:11 +03:00
{
if ( s1 - > getCreature ( p1 ) = = s2 - > getCreature ( p2 ) )
return mergeStacks ( s1 , s2 , p1 , p2 ) ;
else
return swapCreatures ( s1 , s2 , p1 , p2 ) ;
}
2013-06-23 19:09:15 +03:00
void CCallback : : registerGameInterface ( shared_ptr < IGameEventsReceiver > gameEvents )
2013-06-22 21:22:44 +03:00
{
2013-06-23 19:09:15 +03:00
cl - > additionalPlayerInts [ * player ] . push_back ( gameEvents ) ;
2013-06-22 21:22:44 +03:00
}
2013-06-23 19:09:15 +03:00
void CCallback : : registerBattleInterface ( shared_ptr < IBattleEventsReceiver > battleEvents )
2013-06-22 21:22:44 +03:00
{
2013-06-23 19:09:15 +03:00
cl - > additionalBattleInts [ * player ] . push_back ( battleEvents ) ;
2013-06-22 21:22:44 +03:00
}
2013-06-23 19:09:15 +03:00
void CCallback : : unregisterGameInterface ( shared_ptr < IGameEventsReceiver > gameEvents )
2013-06-22 21:22:44 +03:00
{
2013-06-23 19:09:15 +03:00
cl - > additionalPlayerInts [ * player ] - = gameEvents ;
2013-06-22 21:22:44 +03:00
}
2013-06-23 19:09:15 +03:00
void CCallback : : unregisterBattleInterface ( shared_ptr < IBattleEventsReceiver > battleEvents )
2013-06-22 21:22:44 +03:00
{
2013-06-23 19:09:15 +03:00
cl - > additionalBattleInts [ * player ] - = battleEvents ;
2013-06-22 21:22:44 +03:00
}
2013-03-03 20:06:03 +03:00
CBattleCallback : : CBattleCallback ( CGameState * GS , boost : : optional < PlayerColor > Player , CClient * C )
2010-12-22 22:14:40 +02:00
{
gs = GS ;
player = Player ;
cl = C ;
2011-01-08 20:33:40 +02:00
}
2011-02-12 18:12:48 +02:00
bool CBattleCallback : : battleMakeTacticAction ( BattleAction * action )
{
2011-08-25 23:02:38 +03:00
assert ( cl - > gs - > curB - > tacticDistance ) ;
2011-02-12 18:12:48 +02:00
MakeAction ma ;
ma . ba = * action ;
sendRequest ( & ma ) ;
return true ;
2013-04-09 17:31:36 +03:00
}