2009-04-15 14:03:31 +00:00
/*
* CGameHandler.h, 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
*
*/
2017-07-13 11:26:03 +03:00
#pragma once
2018-03-17 17:58:30 +03:00
#include <vcmi/Environment.h>
2017-07-13 11:26:03 +03:00
#include "../lib/FunctionList.h"
#include "../lib/IGameCallback.h"
2018-03-17 17:58:30 +03:00
#include "../lib/battle/CBattleInfoCallback.h"
2017-07-13 11:26:03 +03:00
#include "../lib/battle/BattleAction.h"
2018-03-17 17:58:30 +03:00
#include "../lib/ScriptHandler.h"
2017-07-13 11:26:03 +03:00
#include "CQuery.h"
2009-04-15 14:03:31 +00:00
2022-07-26 16:07:42 +03:00
VCMI_LIB_NAMESPACE_BEGIN
2008-12-27 01:01:59 +00:00
class CGameState ;
struct StartInfo ;
struct BattleResult ;
struct BattleAttack ;
struct BattleStackAttacked ;
2009-03-06 22:11:17 +00:00
struct CPack ;
struct Query ;
2010-01-30 12:46:15 +00:00
struct SetResources ;
struct NewStructures ;
2008-12-27 01:01:59 +00:00
class CGHeroInstance ;
2010-05-18 07:01:54 +00:00
class IMarket ;
2017-06-06 07:53:51 +03:00
class SpellCastEnvironment ;
2014-11-25 22:00:04 +03:00
2022-09-21 19:31:14 +03:00
#if SCRIPTING_ENABLED
2018-03-17 17:58:30 +03:00
namespace scripting
{
class PoolImpl ;
}
2022-09-21 19:31:14 +03:00
#endif
2018-03-17 17:58:30 +03:00
2018-01-05 20:21:07 +03:00
template < typename T > class CApplier ;
2022-07-26 16:07:42 +03:00
VCMI_LIB_NAMESPACE_END
class CGameHandler ;
class CVCMIServer ;
2018-01-05 20:21:07 +03:00
class CBaseForGHApply ;
2008-12-27 01:01:59 +00:00
struct PlayerStatus
{
2013-04-20 11:34:01 +00:00
bool makingTurn ;
2008-12-27 01:01:59 +00:00
2013-04-20 11:34:01 +00:00
PlayerStatus () : makingTurn ( false ){};
2008-12-27 01:01:59 +00:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2013-04-20 11:34:01 +00:00
h & makingTurn ;
2008-12-27 01:01:59 +00:00
}
};
class PlayerStatuses
{
public :
2013-03-03 17:06:03 +00:00
std :: map < PlayerColor , PlayerStatus > players ;
2008-12-27 01:01:59 +00:00
boost :: mutex mx ;
boost :: condition_variable cv ; //notifies when any changes are made
2013-03-03 17:06:03 +00:00
void addPlayer ( PlayerColor player );
PlayerStatus operator []( PlayerColor player );
bool checkFlag ( PlayerColor player , bool PlayerStatus ::* flag );
void setFlag ( PlayerColor player , bool PlayerStatus ::* flag , bool val );
2008-12-27 01:01:59 +00:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & players ;
}
};
2010-12-11 23:11:26 +00:00
struct CasualtiesAfterBattle
{
typedef std :: pair < StackLocation , int > TStackAndItsNewCount ;
2015-11-07 11:42:06 +03:00
typedef std :: map < CreatureID , TQuantity > TSummoned ;
2010-12-11 23:11:26 +00:00
enum { ERASE = - 1 };
2015-11-07 11:42:06 +03:00
const CArmedInstance * army ;
2010-12-11 23:11:26 +00:00
std :: vector < TStackAndItsNewCount > newStackCounts ;
2013-12-19 14:35:49 +00:00
std :: vector < ArtifactLocation > removedWarMachines ;
2015-11-07 11:42:06 +03:00
TSummoned summoned ;
ObjectInstanceID heroWithDeadCommander ; //TODO: unify stack locations
2010-12-11 23:11:26 +00:00
2023-04-06 19:34:07 +04:00
CasualtiesAfterBattle ( const CArmedInstance * _army , const BattleInfo * bat );
2015-11-07 11:42:06 +03:00
void updateArmy ( CGameHandler * gh );
2010-12-11 23:11:26 +00:00
};
2018-03-17 17:58:30 +03:00
class CGameHandler : public IGameCallback , public CBattleInfoCallback , public Environment
2008-12-27 01:01:59 +00:00
{
2018-01-05 20:21:07 +03:00
CVCMIServer * lobby ;
std :: shared_ptr < CApplier < CBaseForGHApply >> applier ;
2023-03-25 20:29:33 +01:00
std :: unique_ptr < boost :: thread > battleThread ;
2009-03-09 10:37:49 +00:00
public :
2017-07-20 07:08:49 +03:00
using FireShieldInfo = std :: vector < std :: pair < const CStack * , int64_t >> ;
2013-04-20 16:01:58 +00:00
//use enums as parameters, because doMove(sth, true, false, true) is not readable
enum EGuardLook { CHECK_FOR_GUARDS , IGNORE_GUARDS };
enum EVisitDest { VISIT_DEST , DONT_VISIT_DEST };
enum ELEaveTile { LEAVING_TILE , REMAINING_ON_TILE };
2018-01-05 20:21:07 +03:00
std :: map < PlayerColor , std :: set < std :: shared_ptr < CConnection >>> connections ; //player color -> connection to client with interface of that player
2008-12-27 01:01:59 +00:00
PlayerStatuses states ; //player color -> player state
2009-04-12 00:58:41 +00:00
//queries stuff
2009-04-12 01:48:50 +00:00
boost :: recursive_mutex gsm ;
2009-04-12 00:58:41 +00:00
ui32 QID ;
2013-04-20 11:34:01 +00:00
Queries queries ;
2012-07-15 15:34:00 +00:00
2017-06-06 07:53:51 +03:00
SpellCastEnvironment * spellEnv ;
2018-03-17 17:58:30 +03:00
const Services * services () const override ;
const BattleCb * battle () const override ;
const GameCb * game () const override ;
vstd :: CLoggerBase * logger () const override ;
events :: EventBus * eventBus () const override ;
2013-04-20 11:34:01 +00:00
bool isValidObject ( const CGObjectInstance * obj ) const ;
2016-10-01 20:06:13 +03:00
bool isBlockedByQueries ( const CPack * pack , PlayerColor player );
2013-02-13 23:55:42 +00:00
bool isAllowedExchange ( ObjectInstanceID id1 , ObjectInstanceID id2 );
2008-12-27 01:01:59 +00:00
void giveSpells ( const CGTownInstance * t , const CGHeroInstance * h );
2011-12-22 13:05:19 +00:00
int moveStack ( int stack , BattleHex dest ); //returned value - travelled distance
2010-12-22 20:14:40 +00:00
void runBattle ();
2010-01-29 20:52:45 +00:00
2009-09-28 14:21:48 +00:00
////used only in endBattle - don't touch elsewhere
2010-05-26 21:59:58 +00:00
bool visitObjectAfterVictory ;
2009-09-28 14:21:48 +00:00
//
2023-04-06 19:34:07 +04:00
void endBattle ( int3 tile , const CGHeroInstance * hero1 , const CGHeroInstance * hero2 ); //ends battle
void endBattleConfirm ( const BattleInfo * battleInfo );
2017-07-20 07:08:49 +03:00
void makeAttack ( const CStack * attacker , const CStack * defender , int distance , BattleHex targetHex , bool first , bool ranged , bool counter );
2022-09-19 17:45:48 +03:00
// damage, drain life & fire shield; returns amount of drained life
int64_t applyBattleEffects ( BattleAttack & bat , std :: shared_ptr < battle :: CUnitState > attackerState , FireShieldInfo & fireShield , const CStack * def , int distance , bool secondary );
2018-03-17 17:58:30 +03:00
void sendGenericKilledLog ( const CStack * defender , int32_t killed , bool multiple );
void addGenericKilledLog ( BattleLogMessage & blm , const CStack * defender , int32_t killed , bool multiple );
2016-02-09 10:59:33 +03:00
void checkBattleStateChanges ();
2010-12-22 20:14:40 +00:00
void setupBattle ( int3 tile , const CArmedInstance * armies [ 2 ], const CGHeroInstance * heroes [ 2 ], bool creatureBank , const CGTownInstance * town );
2013-02-04 19:43:16 +00:00
void setBattleResult ( BattleResult :: EResult resultType , int victoriusSide );
2008-12-27 01:01:59 +00:00
2018-01-05 20:21:07 +03:00
CGameHandler ( CVCMIServer * lobby );
2018-01-13 11:43:26 +03:00
~ CGameHandler ();
2008-12-27 01:01:59 +00:00
//////////////////////////////////////////////////////////////////////////
//from IGameCallback
//do sth
2013-06-26 11:18:27 +00:00
void changeSpells ( const CGHeroInstance * hero , bool give , const std :: set < SpellID > & spells ) override ;
bool removeObject ( const CGObjectInstance * obj ) override ;
void setOwner ( const CGObjectInstance * obj , PlayerColor owner ) override ;
void changePrimSkill ( const CGHeroInstance * hero , PrimarySkill :: PrimarySkill which , si64 val , bool abs = false ) override ;
2016-10-01 20:06:13 +03:00
void changeSecSkill ( const CGHeroInstance * hero , SecondarySkill which , int val , bool abs = false ) override ;
2013-04-20 11:34:01 +00:00
2016-10-01 20:06:13 +03:00
void showBlockingDialog ( BlockingDialog * iw ) override ;
2015-03-08 16:52:50 +03:00
void showTeleportDialog ( TeleportDialog * iw ) override ;
2013-06-26 11:18:27 +00:00
void showGarrisonDialog ( ObjectInstanceID upobj , ObjectInstanceID hid , bool removableUnits ) override ;
void showThievesGuildWindow ( PlayerColor player , ObjectInstanceID requestingObjId ) override ;
2023-04-05 03:26:29 +03:00
void giveResource ( PlayerColor player , GameResID which , int val ) override ;
2013-06-26 11:18:27 +00:00
void giveResources ( PlayerColor player , TResources resources ) override ;
2010-12-26 14:34:11 +00:00
2013-06-26 11:18:27 +00:00
void giveCreatures ( const CArmedInstance * objid , const CGHeroInstance * h , const CCreatureSet & creatures , bool remove ) override ;
void takeCreatures ( ObjectInstanceID objid , const std :: vector < CStackBasicDescriptor > & creatures ) override ;
2015-09-04 18:08:25 +03:00
bool changeStackType ( const StackLocation & sl , const CCreature * c ) override ;
2013-06-26 11:18:27 +00:00
bool changeStackCount ( const StackLocation & sl , TQuantity count , bool absoluteValue = false ) override ;
bool insertNewStack ( const StackLocation & sl , const CCreature * c , TQuantity count ) override ;
bool eraseStack ( const StackLocation & sl , bool forceRemoval = false ) override ;
bool swapStacks ( const StackLocation & sl1 , const StackLocation & sl2 ) override ;
bool addToSlot ( const StackLocation & sl , const CCreature * c , TQuantity count ) override ;
void tryJoiningArmy ( const CArmedInstance * src , const CArmedInstance * dst , bool removeObjWhenFinished , bool allowMerging ) override ;
bool moveStack ( const StackLocation & src , const StackLocation & dst , TQuantity count = - 1 ) override ;
2016-10-01 20:06:13 +03:00
2013-06-26 11:18:27 +00:00
void removeAfterVisit ( const CGObjectInstance * object ) override ;
2010-12-26 14:34:11 +00:00
2023-03-20 01:18:32 +02:00
bool giveHeroNewArtifact ( const CGHeroInstance * h , const CArtifact * artType , ArtifactPosition pos = ArtifactPosition :: FIRST_AVAILABLE ) override ;
2023-03-18 22:58:39 +02:00
bool giveHeroArtifact ( const CGHeroInstance * h , const CArtifactInstance * a , ArtifactPosition pos ) override ;
2016-10-01 20:06:13 +03:00
void putArtifact ( const ArtifactLocation & al , const CArtifactInstance * a ) override ;
2013-06-26 11:18:27 +00:00
void removeArtifact ( const ArtifactLocation & al ) override ;
2022-11-06 23:59:30 +02:00
bool moveArtifact ( const ArtifactLocation & al1 , const ArtifactLocation & al2 ) override ;
2022-11-10 19:09:37 +02:00
bool bulkMoveArtifacts ( ObjectInstanceID srcHero , ObjectInstanceID dstHero , bool swap );
2023-04-08 00:41:55 +03:00
bool eraseArtifactByClient ( const ArtifactLocation & al );
2018-03-17 17:58:30 +03:00
void synchronizeArtifactHandlerLists ();
2010-12-26 14:34:11 +00:00
2013-06-26 11:18:27 +00:00
void heroVisitCastle ( const CGTownInstance * obj , const CGHeroInstance * hero ) override ;
void stopHeroVisitCastle ( const CGTownInstance * obj , const CGHeroInstance * hero ) override ;
void startBattlePrimary ( const CArmedInstance * army1 , const CArmedInstance * army2 , int3 tile , const CGHeroInstance * hero1 , const CGHeroInstance * hero2 , bool creatureBank = false , const CGTownInstance * town = nullptr ) override ; //use hero=nullptr for no hero
void startBattleI ( const CArmedInstance * army1 , const CArmedInstance * army2 , int3 tile , bool creatureBank = false ) override ; //if any of armies is hero, hero will be used
2016-10-01 20:06:13 +03:00
void startBattleI ( const CArmedInstance * army1 , const CArmedInstance * army2 , bool creatureBank = false ) override ; //if any of armies is hero, hero will be used, visitable tile of second obj is place of battle
2015-03-08 17:04:09 +03:00
bool moveHero ( ObjectInstanceID hid , int3 dst , ui8 teleporting , bool transit = false , PlayerColor asker = PlayerColor :: NEUTRAL ) override ;
2013-06-26 11:18:27 +00:00
void giveHeroBonus ( GiveBonus * bonus ) override ;
void setMovePoints ( SetMovePoints * smp ) override ;
void setManaPoints ( ObjectInstanceID hid , int val ) override ;
void giveHero ( ObjectInstanceID id , PlayerColor player ) override ;
2023-02-16 21:35:15 +02:00
void changeObjPos ( ObjectInstanceID objid , int3 newPos ) override ;
2013-06-26 11:18:27 +00:00
void heroExchange ( ObjectInstanceID hero1 , ObjectInstanceID hero2 ) override ;
2013-05-27 21:46:04 +00:00
2014-06-24 14:50:27 +03:00
void changeFogOfWar ( int3 center , ui32 radius , PlayerColor player , bool hide ) override ;
void changeFogOfWar ( std :: unordered_set < int3 , ShashInt3 > & tiles , PlayerColor player , bool hide ) override ;
2023-04-10 05:46:45 +04:00
void castSpell ( const spells :: Caster * caster , SpellID spellID , const int3 & pos ) override ;
2013-05-27 21:46:04 +00:00
2013-06-26 11:18:27 +00:00
bool isVisitCoveredByAnotherQuery ( const CGObjectInstance * obj , const CGHeroInstance * hero ) override ;
2018-03-17 17:58:30 +03:00
void setObjProperty ( ObjectInstanceID objid , int prop , si64 val ) override ;
void showInfoDialog ( InfoWindow * iw ) override ;
void showInfoDialog ( const std :: string & msg , PlayerColor player ) override ;
2013-05-27 21:46:04 +00:00
2010-12-26 14:34:11 +00:00
//////////////////////////////////////////////////////////////////////////
2013-02-13 23:55:42 +00:00
void useScholarSkill ( ObjectInstanceID hero1 , ObjectInstanceID hero2 );
2010-12-26 14:34:11 +00:00
void setPortalDwelling ( const CGTownInstance * town , bool forced , bool clear );
2010-05-26 21:59:58 +00:00
void visitObjectOnTile ( const TerrainTile & t , const CGHeroInstance * h );
2013-03-03 17:06:03 +00:00
bool teleportHero ( ObjectInstanceID hid , ObjectInstanceID dstid , ui8 source , PlayerColor asker = PlayerColor :: NEUTRAL );
2020-09-28 16:39:55 +03:00
void visitCastleObjects ( const CGTownInstance * obj , const CGHeroInstance * hero ) override ;
2013-02-12 19:49:40 +00:00
void levelUpHero ( const CGHeroInstance * hero , SecondarySkill skill ); //handle client respond and send one more request if needed
2013-02-08 22:42:46 +00:00
void levelUpHero ( const CGHeroInstance * hero ); //initial call - check if hero have remaining levelups & handle them
2012-05-18 14:02:27 +00:00
void levelUpCommander ( const CCommanderInstance * c , int skill ); //secondary skill 1 to 6, special skill : skill - 100
2012-05-07 12:54:22 +00:00
void levelUpCommander ( const CCommanderInstance * c );
2013-04-20 11:34:01 +00:00
void expGiven ( const CGHeroInstance * hero ); //triggers needed level-ups, handles also commander of this hero
2008-12-27 01:01:59 +00:00
//////////////////////////////////////////////////////////////////////////
2012-03-27 20:08:54 +00:00
void init ( StartInfo * si );
2018-01-05 20:21:07 +03:00
void handleClientDisconnection ( std :: shared_ptr < CConnection > c );
void handleReceivedPack ( CPackForServer * pack );
PlayerColor getPlayerAt ( std :: shared_ptr < CConnection > c ) const ;
2022-10-05 19:04:51 +04:00
bool hasPlayerAt ( PlayerColor player , std :: shared_ptr < CConnection > c ) const ;
2009-03-09 10:37:49 +00:00
2016-10-02 16:21:46 +03:00
void playerMessage ( PlayerColor player , const std :: string & message , ObjectInstanceID currObj );
2016-02-13 17:40:31 +03:00
void updateGateState ();
2009-04-16 00:28:54 +00:00
bool makeBattleAction ( BattleAction & ba );
2012-08-27 12:34:43 +00:00
bool makeAutomaticAction ( const CStack * stack , BattleAction & ba ); //used when action is taken by stack without volition of player (eg. unguided catapult attack)
2009-04-16 00:28:54 +00:00
bool makeCustomAction ( BattleAction & ba );
2016-11-02 20:11:01 +03:00
void stackEnchantedTrigger ( const CStack * stack );
2016-10-28 23:37:45 +02:00
void stackTurnTrigger ( const CStack * stack );
2017-07-09 10:18:46 +02:00
2012-05-18 20:50:16 +00:00
void removeObstacle ( const CObstacleInstance & obstacle );
2017-06-06 07:53:51 +03:00
bool queryReply ( QueryID qid , const JsonNode & answer , PlayerColor player );
2013-03-03 17:06:03 +00:00
bool hireHero ( const CGObjectInstance * obj , ui8 hid , PlayerColor player );
2023-03-31 20:02:09 +03:00
bool buildBoat ( ObjectInstanceID objid , PlayerColor player );
2013-02-13 23:55:42 +00:00
bool setFormation ( ObjectInstanceID hid , ui8 formation );
2013-03-03 17:06:03 +00:00
bool tradeResources ( const IMarket * market , ui32 val , PlayerColor player , ui32 id1 , ui32 id2 );
2017-10-28 11:04:55 +02:00
bool sacrificeCreatures ( const IMarket * market , const CGHeroInstance * hero , const std :: vector < SlotID > & slot , const std :: vector < ui32 > & count );
2023-04-05 03:26:29 +03:00
bool sendResources ( ui32 val , PlayerColor player , GameResID r1 , PlayerColor r2 );
bool sellCreatures ( ui32 count , const IMarket * market , const CGHeroInstance * hero , SlotID slot , GameResID resourceID );
2013-02-16 14:03:47 +00:00
bool transformInUndead ( const IMarket * market , const CGHeroInstance * hero , SlotID slot );
bool assembleArtifacts ( ObjectInstanceID heroID , ArtifactPosition artifactSlot , bool assemble , ArtifactID assembleTo );
2013-02-13 23:55:42 +00:00
bool buyArtifact ( ObjectInstanceID hid , ArtifactID aid ); //for blacksmith and mage guild only -> buying for gold in common buildings
2023-04-05 03:26:29 +03:00
bool buyArtifact ( const IMarket * m , const CGHeroInstance * h , GameResID rid , ArtifactID aid ); //for artifact merchant and black market -> buying for any resource in special building / advobject
bool sellArtifact ( const IMarket * m , const CGHeroInstance * h , ArtifactInstanceID aid , GameResID rid ); //for artifact merchant selling
2012-05-02 08:37:11 +00:00
//void lootArtifacts (TArtHolder source, TArtHolder dest, std::vector<ui32> &arts); //after battle - move al arts to winer
2013-02-12 19:49:40 +00:00
bool buySecSkill ( const IMarket * m , const CGHeroInstance * h , SecondarySkill skill );
2013-02-13 23:55:42 +00:00
bool garrisonSwap ( ObjectInstanceID tid );
2022-05-19 15:14:50 +03:00
bool swapGarrisonOnSiege ( ObjectInstanceID tid ) override ;
2013-02-16 14:03:47 +00:00
bool upgradeCreature ( ObjectInstanceID objid , SlotID pos , CreatureID upgID );
2014-09-19 00:18:49 +03:00
bool recruitCreatures ( ObjectInstanceID objid , ObjectInstanceID dst , CreatureID crid , ui32 cram , si32 level );
2013-02-13 23:55:42 +00:00
bool buildStructure ( ObjectInstanceID tid , BuildingID bid , bool force = false ); //force - for events: no cost, no checkings
bool razeStructure ( ObjectInstanceID tid , BuildingID bid );
2013-02-16 14:03:47 +00:00
bool disbandCreature ( ObjectInstanceID id , SlotID pos );
2013-03-03 17:06:03 +00:00
bool arrangeStacks ( ObjectInstanceID id1 , ObjectInstanceID id2 , ui8 what , SlotID p1 , SlotID p2 , si32 val , PlayerColor player );
2021-11-28 15:57:38 +03:00
bool bulkMoveArmy ( ObjectInstanceID srcArmy , ObjectInstanceID destArmy , SlotID srcSlot );
bool bulkSplitStack ( SlotID src , ObjectInstanceID srcOwner , si32 howMany );
bool bulkMergeStacks ( SlotID slotSrc , ObjectInstanceID srcOwner );
bool bulkSmartSplitStack ( SlotID slotSrc , ObjectInstanceID srcOwner );
2009-03-09 10:37:49 +00:00
void save ( const std :: string & fname );
2022-09-23 15:02:19 +04:00
bool load ( const std :: string & fname );
2018-01-05 20:21:07 +03:00
2009-03-09 19:40:43 +00:00
void handleTimeEvents ();
2013-03-14 20:44:00 +00:00
void handleTownEvents ( CGTownInstance * town , NewTurn & n );
2009-03-26 23:05:40 +00:00
bool complain ( const std :: string & problem ); //sends message to all clients, prints on the logs and return true
2009-07-06 19:41:27 +00:00
void objectVisited ( const CGObjectInstance * obj , const CGHeroInstance * h );
2013-04-20 11:34:01 +00:00
void objectVisitEnded ( const CObjectVisitQuery & query );
2013-03-03 17:06:03 +00:00
void engageIntoBattle ( PlayerColor player );
2010-02-21 15:03:30 +00:00
bool dig ( const CGHeroInstance * h );
2010-12-12 23:44:16 +00:00
void moveArmy ( const CArmedInstance * src , const CArmedInstance * dst , bool allowMerging );
2018-03-17 17:58:30 +03:00
const ObjectInstanceID putNewObject ( Obj ID , int subID , int3 pos );
2008-12-27 01:01:59 +00:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2017-07-31 16:35:42 +03:00
h & QID ;
h & states ;
h & finishingBattle ;
2022-06-20 17:39:50 +03:00
h & getRandomGenerator ();
2018-03-17 17:58:30 +03:00
2022-09-21 19:31:14 +03:00
#if SCRIPTING_ENABLED
2022-06-20 17:39:50 +03:00
JsonNode scriptsState ;
if ( h . saving )
serverScripts -> serializeState ( h . saving , scriptsState );
h & scriptsState ;
if ( ! h . saving )
serverScripts -> serializeState ( h . saving , scriptsState );
2022-09-21 19:31:14 +03:00
#endif
2008-12-27 01:01:59 +00:00
}
2009-03-09 10:37:49 +00:00
void sendMessageToAll ( const std :: string & message );
2018-01-05 20:21:07 +03:00
void sendMessageTo ( std :: shared_ptr < CConnection > c , const std :: string & message );
2018-02-26 00:16:15 +08:00
void sendToAllClients ( CPackForClient * pack );
void sendAndApply ( CPackForClient * pack ) override ;
void applyAndSend ( CPackForClient * pack );
void sendAndApply ( CGarrisonOperationPack * pack );
void sendAndApply ( SetResources * pack );
void sendAndApply ( NewStructures * pack );
2009-03-09 10:37:49 +00:00
2023-02-12 09:23:39 +02:00
void wrongPlayerMessage ( CPackForServer * pack , PlayerColor expectedplayer );
void throwNotAllowedAction ( CPackForServer * pack );
void throwOnWrongOwner ( CPackForServer * pack , ObjectInstanceID id );
void throwOnWrongPlayer ( CPackForServer * pack , PlayerColor player );
void throwAndComplain ( CPackForServer * pack , std :: string txt );
bool isPlayerOwns ( CPackForServer * pack , ObjectInstanceID id );
2013-04-20 11:34:01 +00:00
struct FinishingBattleHelper
{
FinishingBattleHelper ();
2017-07-01 16:30:13 +03:00
FinishingBattleHelper ( std :: shared_ptr < const CBattleQuery > Query , int RemainingBattleQueriesCount );
2023-04-06 19:34:07 +04:00
inline bool isDraw () const { return winnerSide == 2 ;}
2013-04-20 11:34:01 +00:00
const CGHeroInstance * winnerHero , * loserHero ;
PlayerColor victor , loser ;
2023-04-06 19:34:07 +04:00
ui8 winnerSide ;
2013-04-20 11:34:01 +00:00
int remainingBattleQueriesCount ;
template < typename Handler > void serialize ( Handler & h , const int version )
{
2017-07-31 16:35:42 +03:00
h & winnerHero ;
h & loserHero ;
h & victor ;
h & loser ;
2023-04-06 19:34:07 +04:00
h & winnerSide ;
2017-07-01 16:30:13 +03:00
h & remainingBattleQueriesCount ;
2013-04-20 11:34:01 +00:00
}
};
2015-12-29 05:43:33 +03:00
std :: unique_ptr < FinishingBattleHelper > finishingBattle ;
2013-04-20 11:34:01 +00:00
void battleAfterLevelUp ( const BattleResult & result );
2010-10-24 11:35:14 +00:00
void run ( bool resume );
2008-12-27 01:01:59 +00:00
void newTurn ();
2017-07-20 07:08:49 +03:00
void handleAttackBeforeCasting ( bool ranged , const CStack * attacker , const CStack * defender );
void handleAfterAttackCasting ( bool ranged , const CStack * attacker , const CStack * defender );
2018-03-02 13:22:51 +03:00
void attackCasting ( bool ranged , Bonus :: BonusType attackMode , const battle :: Unit * attacker , const battle :: Unit * defender );
2017-10-28 11:04:55 +02:00
bool sacrificeArtifact ( const IMarket * m , const CGHeroInstance * hero , const std :: vector < ArtifactPosition > & slot );
2013-02-10 23:24:57 +00:00
void spawnWanderingMonsters ( CreatureID creatureID );
2016-10-02 16:21:46 +03:00
void handleCheatCode ( std :: string & cheat , PlayerColor player , const CGHeroInstance * hero , const CGTownInstance * town , bool & cheated );
2013-11-17 17:57:04 +00:00
2016-09-09 20:30:36 +03:00
CRandomGenerator & getRandomGenerator ();
2022-09-21 19:31:14 +03:00
#if SCRIPTING_ENABLED
2018-03-17 17:58:30 +03:00
scripting :: Pool * getGlobalContextPool () const override ;
scripting :: Pool * getContextPool () const override ;
2022-09-21 19:31:14 +03:00
#endif
2018-03-17 17:58:30 +03:00
friend class CVCMIServer ;
2013-11-17 17:57:04 +00:00
private :
2018-03-17 17:58:30 +03:00
std :: unique_ptr < events :: EventBus > serverEventBus ;
2022-09-21 19:31:14 +03:00
#if SCRIPTING_ENABLED
2018-03-17 17:58:30 +03:00
std :: shared_ptr < scripting :: PoolImpl > serverScripts ;
2022-09-21 19:31:14 +03:00
#endif
2018-03-17 17:58:30 +03:00
void reinitScripting ();
2013-12-17 17:14:55 +00:00
std :: list < PlayerColor > generatePlayerTurnOrder () const ;
2013-11-17 17:57:04 +00:00
void makeStackDoNothing ( const CStack * next );
2014-06-25 17:11:07 +03:00
void getVictoryLossMessage ( PlayerColor player , const EVictoryLossCheckResult & victoryLossCheckResult , InfoWindow & out ) const ;
2013-11-30 09:43:31 +00:00
// Check for victory and loss conditions
void checkVictoryLossConditionsForPlayer ( PlayerColor player );
void checkVictoryLossConditions ( const std :: set < PlayerColor > & playerColors );
void checkVictoryLossConditionsForAll ();
2018-03-17 17:58:30 +03:00
2021-11-28 15:57:38 +03:00
const std :: string complainNoCreatures ;
const std :: string complainNotEnoughCreatures ;
const std :: string complainInvalidSlot ;
2008-12-27 01:01:59 +00:00
};
2018-01-25 20:21:34 +03:00
class ExceptionNotAllowedAction : public std :: exception
{
};