2022-11-18 17:54:10 +02:00
/*
2022-12-21 17:06:47 +02:00
* BattleWindow . cpp , part of VCMI engine
2022-11-18 17:54:10 +02:00
*
* 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
*
*/
# include "StdInc.h"
2022-12-21 17:06:47 +02:00
# include "BattleWindow.h"
2022-11-28 16:43:38 +02:00
2022-12-09 13:38:46 +02:00
# include "BattleInterface.h"
# include "BattleInterfaceClasses.h"
2022-12-21 17:02:53 +02:00
# include "BattleFieldController.h"
2022-12-09 13:38:46 +02:00
# include "BattleStacksController.h"
# include "BattleActionsController.h"
2022-11-28 16:43:38 +02:00
2022-11-18 17:54:10 +02:00
# include "../CGameInfo.h"
2022-12-21 17:02:53 +02:00
# include "../CMessage.h"
2022-11-18 17:54:10 +02:00
# include "../CPlayerInterface.h"
2022-12-21 17:02:53 +02:00
# include "../CMusicHandler.h"
# include "../gui/Canvas.h"
2022-11-18 17:54:10 +02:00
# include "../gui/CCursorHandler.h"
# include "../gui/CGuiHandler.h"
# include "../windows/CSpellWindow.h"
2022-12-21 17:02:53 +02:00
# include "../widgets/AdventureMapClasses.h"
2022-11-28 16:43:38 +02:00
# include "../widgets/Buttons.h"
# include "../widgets/Images.h"
# include "../../CCallback.h"
# include "../../lib/CGeneralTextHandler.h"
# include "../../lib/mapObjects/CGHeroInstance.h"
2022-11-18 17:54:10 +02:00
# include "../../lib/CStack.h"
# include "../../lib/CConfigHandler.h"
2022-12-21 17:06:47 +02:00
BattleWindow : : BattleWindow ( BattleInterface & owner ) :
2022-11-18 17:54:10 +02:00
owner ( owner )
{
OBJ_CONSTRUCTION_CAPTURING_ALL_NO_DISPOSE ;
2022-12-21 17:02:53 +02:00
pos . w = 800 ;
pos . h = 600 ;
pos = center ( ) ;
// create background for panel/ribbon at the bottom
menuTactics = std : : make_shared < CPicture > ( " COPLACBR.BMP " , 0 , 556 ) ;
menuBattle = std : : make_shared < CPicture > ( " CBAR.BMP " , 0 , 556 ) ;
menuTactics - > colorize ( owner . curInt - > playerID ) ;
menuBattle - > colorize ( owner . curInt - > playerID ) ;
2022-11-18 17:54:10 +02:00
//preparing buttons and console
2022-12-21 17:06:47 +02:00
bOptions = std : : make_shared < CButton > ( Point ( 3 , 5 + 556 ) , " icm003.def " , CGI - > generaltexth - > zelp [ 381 ] , std : : bind ( & BattleWindow : : bOptionsf , this ) , SDLK_o ) ;
bSurrender = std : : make_shared < CButton > ( Point ( 54 , 5 + 556 ) , " icm001.def " , CGI - > generaltexth - > zelp [ 379 ] , std : : bind ( & BattleWindow : : bSurrenderf , this ) , SDLK_s ) ;
bFlee = std : : make_shared < CButton > ( Point ( 105 , 5 + 556 ) , " icm002.def " , CGI - > generaltexth - > zelp [ 380 ] , std : : bind ( & BattleWindow : : bFleef , this ) , SDLK_r ) ;
bAutofight = std : : make_shared < CButton > ( Point ( 158 , 5 + 556 ) , " icm004.def " , CGI - > generaltexth - > zelp [ 382 ] , std : : bind ( & BattleWindow : : bAutofightf , this ) , SDLK_a ) ;
bSpell = std : : make_shared < CButton > ( Point ( 645 , 5 + 556 ) , " icm005.def " , CGI - > generaltexth - > zelp [ 385 ] , std : : bind ( & BattleWindow : : bSpellf , this ) , SDLK_c ) ;
bWait = std : : make_shared < CButton > ( Point ( 696 , 5 + 556 ) , " icm006.def " , CGI - > generaltexth - > zelp [ 386 ] , std : : bind ( & BattleWindow : : bWaitf , this ) , SDLK_w ) ;
bDefence = std : : make_shared < CButton > ( Point ( 747 , 5 + 556 ) , " icm007.def " , CGI - > generaltexth - > zelp [ 387 ] , std : : bind ( & BattleWindow : : bDefencef , this ) , SDLK_d ) ;
bConsoleUp = std : : make_shared < CButton > ( Point ( 624 , 5 + 556 ) , " ComSlide.def " , std : : make_pair ( " " , " " ) , std : : bind ( & BattleWindow : : bConsoleUpf , this ) , SDLK_UP ) ;
bConsoleDown = std : : make_shared < CButton > ( Point ( 624 , 24 + 556 ) , " ComSlide.def " , std : : make_pair ( " " , " " ) , std : : bind ( & BattleWindow : : bConsoleDownf , this ) , SDLK_DOWN ) ;
2022-11-18 17:54:10 +02:00
bDefence - > assignedKeys . insert ( SDLK_SPACE ) ;
bConsoleUp - > setImageOrder ( 0 , 1 , 0 , 0 ) ;
bConsoleDown - > setImageOrder ( 2 , 3 , 2 , 2 ) ;
2022-12-21 17:02:53 +02:00
btactNext = std : : make_shared < CButton > ( Point ( 213 , 4 + 556 ) , " icm011.def " , std : : make_pair ( " " , " " ) , [ & ] ( ) { bTacticNextStack ( ) ; } , SDLK_SPACE ) ;
btactEnd = std : : make_shared < CButton > ( Point ( 419 , 4 + 556 ) , " icm012.def " , std : : make_pair ( " " , " " ) , [ & ] ( ) { bTacticPhaseEnd ( ) ; } , SDLK_RETURN ) ;
console = std : : make_shared < BattleConsole > ( menuBattle , Point ( 211 , 4 + 556 ) , Point ( 211 , 4 ) , Point ( 406 , 38 ) ) ;
2022-11-18 17:54:10 +02:00
GH . statusbar = console ;
2022-12-21 17:02:53 +02:00
owner . console = console ;
owner . fieldController . reset ( new BattleFieldController ( owner ) ) ;
owner . fieldController - > createHeroes ( ) ;
//create stack queue and adjust our own position
bool embedQueue ;
std : : string queueSize = settings [ " battle " ] [ " queueSize " ] . String ( ) ;
if ( queueSize = = " auto " )
embedQueue = screen - > h < 700 ;
else
embedQueue = screen - > h < 700 | | queueSize = = " small " ;
queue = std : : make_shared < StackQueue > ( embedQueue , owner ) ;
if ( ! embedQueue & & settings [ " battle " ] [ " showQueue " ] . Bool ( ) )
{
//re-center, taking into account stack queue position
pos . y - = queue - > pos . h ;
pos . h + = queue - > pos . h ;
pos = center ( ) ;
}
2022-11-18 17:54:10 +02:00
2022-12-13 13:58:16 +02:00
if ( owner . tacticsMode )
2022-11-18 17:54:10 +02:00
tacticPhaseStarted ( ) ;
else
tacticPhaseEnded ( ) ;
2022-12-21 17:02:53 +02:00
addUsedEvents ( RCLICK | KEYBOARD ) ;
2022-11-18 17:54:10 +02:00
}
2022-12-21 18:04:19 +02:00
BattleWindow : : ~ BattleWindow ( )
{
CPlayerInterface : : battleInt = nullptr ;
}
2022-12-21 17:06:47 +02:00
void BattleWindow : : hideQueue ( )
2022-11-27 02:26:02 +02:00
{
2022-12-21 17:02:53 +02:00
Settings showQueue = settings . write [ " battle " ] [ " showQueue " ] ;
showQueue - > Bool ( ) = false ;
queue - > disable ( ) ;
if ( ! queue - > embedded )
{
moveBy ( Point ( 0 , - queue - > pos . h / 2 ) ) ;
GH . totalRedraw ( ) ;
}
2022-11-27 02:26:02 +02:00
}
2022-12-21 17:06:47 +02:00
void BattleWindow : : showQueue ( )
2022-11-27 02:26:02 +02:00
{
2022-12-21 17:02:53 +02:00
Settings showQueue = settings . write [ " battle " ] [ " showQueue " ] ;
showQueue - > Bool ( ) = true ;
queue - > enable ( ) ;
if ( ! queue - > embedded )
{
moveBy ( Point ( 0 , + queue - > pos . h / 2 ) ) ;
GH . totalRedraw ( ) ;
}
}
2022-12-21 17:06:47 +02:00
void BattleWindow : : updateQueue ( )
2022-12-21 17:02:53 +02:00
{
queue - > update ( ) ;
}
2022-12-21 17:06:47 +02:00
void BattleWindow : : activate ( )
2022-12-21 17:02:53 +02:00
{
2022-12-30 12:32:36 +02:00
GH . statusbar = console ;
2022-12-21 17:02:53 +02:00
CIntObject : : activate ( ) ;
LOCPLINT - > cingconsole - > activate ( ) ;
}
2022-12-21 17:06:47 +02:00
void BattleWindow : : deactivate ( )
2022-12-21 17:02:53 +02:00
{
CIntObject : : deactivate ( ) ;
LOCPLINT - > cingconsole - > deactivate ( ) ;
}
2022-12-21 17:06:47 +02:00
void BattleWindow : : keyPressed ( const SDL_KeyboardEvent & key )
2022-12-21 17:02:53 +02:00
{
if ( key . keysym . sym = = SDLK_q & & key . state = = SDL_PRESSED )
{
if ( settings [ " battle " ] [ " showQueue " ] . Bool ( ) ) //hide queue
hideQueue ( ) ;
else
showQueue ( ) ;
}
else if ( key . keysym . sym = = SDLK_f & & key . state = = SDL_PRESSED )
{
owner . actionsController - > enterCreatureCastingMode ( ) ;
}
else if ( key . keysym . sym = = SDLK_ESCAPE )
{
if ( owner . getAnimationCondition ( EAnimationEvents : : OPENING ) = = true )
CCS - > soundh - > stopSound ( owner . battleIntroSoundChannel ) ;
else
owner . actionsController - > endCastingSpell ( ) ;
}
2022-11-27 02:26:02 +02:00
}
2022-12-21 17:06:47 +02:00
void BattleWindow : : clickRight ( tribool down , bool previousState )
2022-12-21 17:02:53 +02:00
{
if ( ! down )
owner . actionsController - > endCastingSpell ( ) ;
}
2022-11-27 02:26:02 +02:00
2022-12-21 17:06:47 +02:00
void BattleWindow : : tacticPhaseStarted ( )
2022-11-18 17:54:10 +02:00
{
2022-12-21 17:02:53 +02:00
menuBattle - > disable ( ) ;
console - > disable ( ) ;
2022-11-18 17:54:10 +02:00
2022-12-21 17:02:53 +02:00
menuTactics - > enable ( ) ;
btactNext - > enable ( ) ;
btactEnd - > enable ( ) ;
2022-11-18 17:54:10 +02:00
}
2022-12-21 17:02:53 +02:00
2022-12-21 17:06:47 +02:00
void BattleWindow : : tacticPhaseEnded ( )
2022-11-18 17:54:10 +02:00
{
2022-12-21 17:02:53 +02:00
menuBattle - > enable ( ) ;
console - > enable ( ) ;
2022-11-20 22:56:42 +02:00
2022-12-21 17:02:53 +02:00
menuTactics - > disable ( ) ;
btactNext - > disable ( ) ;
btactEnd - > disable ( ) ;
2022-11-18 17:54:10 +02:00
}
2022-12-21 17:06:47 +02:00
void BattleWindow : : bOptionsf ( )
2022-11-18 17:54:10 +02:00
{
2022-12-13 13:58:16 +02:00
if ( owner . actionsController - > spellcastingModeActive ( ) )
2022-11-18 17:54:10 +02:00
return ;
2022-12-18 22:32:07 +02:00
CCS - > curh - > set ( Cursor : : Map : : POINTER ) ;
2022-11-18 17:54:10 +02:00
2022-12-09 13:26:17 +02:00
GH . pushIntT < BattleOptionsWindow > ( owner ) ;
2022-11-18 17:54:10 +02:00
}
2022-12-21 17:06:47 +02:00
void BattleWindow : : bSurrenderf ( )
2022-11-18 17:54:10 +02:00
{
2022-12-13 13:58:16 +02:00
if ( owner . actionsController - > spellcastingModeActive ( ) )
2022-11-18 17:54:10 +02:00
return ;
2022-12-13 13:58:16 +02:00
int cost = owner . curInt - > cb - > battleGetSurrenderCost ( ) ;
2022-11-18 17:54:10 +02:00
if ( cost > = 0 )
{
2022-12-13 13:58:16 +02:00
std : : string enemyHeroName = owner . curInt - > cb - > battleGetEnemyHero ( ) . name ;
2022-11-18 17:54:10 +02:00
if ( enemyHeroName . empty ( ) )
{
logGlobal - > warn ( " Surrender performed without enemy hero, should not happen! " ) ;
enemyHeroName = " #ENEMY# " ;
}
std : : string surrenderMessage = boost : : str ( boost : : format ( CGI - > generaltexth - > allTexts [ 32 ] ) % enemyHeroName % cost ) ; //%s states: "I will accept your surrender and grant you and your troops safe passage for the price of %d gold."
2022-12-13 13:58:16 +02:00
owner . curInt - > showYesNoDialog ( surrenderMessage , [ this ] ( ) { reallySurrender ( ) ; } , nullptr ) ;
2022-11-18 17:54:10 +02:00
}
}
2022-12-21 17:06:47 +02:00
void BattleWindow : : bFleef ( )
2022-11-18 17:54:10 +02:00
{
2022-12-13 13:58:16 +02:00
if ( owner . actionsController - > spellcastingModeActive ( ) )
2022-11-18 17:54:10 +02:00
return ;
2022-12-13 13:58:16 +02:00
if ( owner . curInt - > cb - > battleCanFlee ( ) )
2022-11-18 17:54:10 +02:00
{
2022-12-21 17:06:47 +02:00
CFunctionList < void ( ) > ony = std : : bind ( & BattleWindow : : reallyFlee , this ) ;
2022-12-13 13:58:16 +02:00
owner . curInt - > showYesNoDialog ( CGI - > generaltexth - > allTexts [ 28 ] , ony , nullptr ) ; //Are you sure you want to retreat?
2022-11-18 17:54:10 +02:00
}
else
{
std : : vector < std : : shared_ptr < CComponent > > comps ;
std : : string heroName ;
//calculating fleeing hero's name
2022-12-13 13:58:16 +02:00
if ( owner . attackingHeroInstance )
if ( owner . attackingHeroInstance - > tempOwner = = owner . curInt - > cb - > getMyColor ( ) )
heroName = owner . attackingHeroInstance - > name ;
if ( owner . defendingHeroInstance )
if ( owner . defendingHeroInstance - > tempOwner = = owner . curInt - > cb - > getMyColor ( ) )
heroName = owner . defendingHeroInstance - > name ;
2022-11-18 17:54:10 +02:00
//calculating text
auto txt = boost : : format ( CGI - > generaltexth - > allTexts [ 340 ] ) % heroName ; //The Shackles of War are present. %s can not retreat!
//printing message
2022-12-13 13:58:16 +02:00
owner . curInt - > showInfoDialog ( boost : : to_string ( txt ) , comps ) ;
2022-11-18 17:54:10 +02:00
}
}
2022-12-21 17:06:47 +02:00
void BattleWindow : : reallyFlee ( )
2022-11-18 17:54:10 +02:00
{
2022-12-13 13:58:16 +02:00
owner . giveCommand ( EActionType : : RETREAT ) ;
2022-12-18 22:32:07 +02:00
CCS - > curh - > set ( Cursor : : Map : : POINTER ) ;
2022-11-18 17:54:10 +02:00
}
2022-12-21 17:06:47 +02:00
void BattleWindow : : reallySurrender ( )
2022-11-18 17:54:10 +02:00
{
2022-12-13 13:58:16 +02:00
if ( owner . curInt - > cb - > getResourceAmount ( Res : : GOLD ) < owner . curInt - > cb - > battleGetSurrenderCost ( ) )
2022-11-18 17:54:10 +02:00
{
2022-12-13 13:58:16 +02:00
owner . curInt - > showInfoDialog ( CGI - > generaltexth - > allTexts [ 29 ] ) ; //You don't have enough gold!
2022-11-18 17:54:10 +02:00
}
else
{
2022-12-13 13:58:16 +02:00
owner . giveCommand ( EActionType : : SURRENDER ) ;
2022-12-18 22:32:07 +02:00
CCS - > curh - > set ( Cursor : : Map : : POINTER ) ;
2022-11-18 17:54:10 +02:00
}
}
2022-12-21 17:06:47 +02:00
void BattleWindow : : bAutofightf ( )
2022-11-18 17:54:10 +02:00
{
2022-12-13 13:58:16 +02:00
if ( owner . actionsController - > spellcastingModeActive ( ) )
2022-11-18 17:54:10 +02:00
return ;
//Stop auto-fight mode
2022-12-13 13:58:16 +02:00
if ( owner . curInt - > isAutoFightOn )
2022-11-18 17:54:10 +02:00
{
2022-12-13 13:58:16 +02:00
assert ( owner . curInt - > autofightingAI ) ;
owner . curInt - > isAutoFightOn = false ;
2022-11-18 17:54:10 +02:00
logGlobal - > trace ( " Stopping the autofight... " ) ;
}
2022-12-13 13:58:16 +02:00
else if ( ! owner . curInt - > autofightingAI )
2022-11-18 17:54:10 +02:00
{
2022-12-13 13:58:16 +02:00
owner . curInt - > isAutoFightOn = true ;
2022-11-18 17:54:10 +02:00
blockUI ( true ) ;
auto ai = CDynLibHandler : : getNewBattleAI ( settings [ " server " ] [ " friendlyAI " ] . String ( ) ) ;
2022-12-23 14:40:45 +02:00
ai - > initBattleInterface ( owner . curInt - > env , owner . curInt - > cb ) ;
2022-12-13 13:58:16 +02:00
ai - > battleStart ( owner . army1 , owner . army2 , int3 ( 0 , 0 , 0 ) , owner . attackingHeroInstance , owner . defendingHeroInstance , owner . curInt - > cb - > battleGetMySide ( ) ) ;
owner . curInt - > autofightingAI = ai ;
owner . curInt - > cb - > registerBattleInterface ( ai ) ;
2022-11-18 17:54:10 +02:00
2022-12-13 13:58:16 +02:00
owner . requestAutofightingAIToTakeAction ( ) ;
2022-11-18 17:54:10 +02:00
}
}
2022-12-21 17:06:47 +02:00
void BattleWindow : : bSpellf ( )
2022-11-18 17:54:10 +02:00
{
2022-12-13 13:58:16 +02:00
if ( owner . actionsController - > spellcastingModeActive ( ) )
2022-11-18 17:54:10 +02:00
return ;
2022-12-13 13:58:16 +02:00
if ( ! owner . myTurn )
2022-11-18 17:54:10 +02:00
return ;
2022-12-13 13:58:16 +02:00
auto myHero = owner . currentHero ( ) ;
2022-11-18 17:54:10 +02:00
if ( ! myHero )
return ;
2022-12-18 22:32:07 +02:00
CCS - > curh - > set ( Cursor : : Map : : POINTER ) ;
2022-11-18 17:54:10 +02:00
2022-12-13 13:58:16 +02:00
ESpellCastProblem : : ESpellCastProblem spellCastProblem = owner . curInt - > cb - > battleCanCastSpell ( myHero , spells : : Mode : : HERO ) ;
2022-11-18 17:54:10 +02:00
if ( spellCastProblem = = ESpellCastProblem : : OK )
{
2022-12-13 13:58:16 +02:00
GH . pushIntT < CSpellWindow > ( myHero , owner . curInt . get ( ) ) ;
2022-11-18 17:54:10 +02:00
}
else if ( spellCastProblem = = ESpellCastProblem : : MAGIC_IS_BLOCKED )
{
//TODO: move to spell mechanics, add more information to spell cast problem
//Handle Orb of Inhibition-like effects -> we want to display dialog with info, why casting is impossible
2022-12-13 13:58:16 +02:00
auto blockingBonus = owner . currentHero ( ) - > getBonusLocalFirst ( Selector : : type ( ) ( Bonus : : BLOCK_ALL_MAGIC ) ) ;
2022-11-18 17:54:10 +02:00
if ( ! blockingBonus )
return ;
if ( blockingBonus - > source = = Bonus : : ARTIFACT )
{
2022-12-01 23:58:01 +02:00
const auto artID = ArtifactID ( blockingBonus - > sid ) ;
2022-11-18 17:54:10 +02:00
//If we have artifact, put name of our hero. Otherwise assume it's the enemy.
//TODO check who *really* is source of bonus
2022-12-13 13:58:16 +02:00
std : : string heroName = myHero - > hasArt ( artID ) ? myHero - > name : owner . enemyHero ( ) . name ;
2022-11-18 17:54:10 +02:00
//%s wields the %s, an ancient artifact which creates a p dead to all magic.
LOCPLINT - > showInfoDialog ( boost : : str ( boost : : format ( CGI - > generaltexth - > allTexts [ 683 ] )
% heroName % CGI - > artifacts ( ) - > getByIndex ( artID ) - > getName ( ) ) ) ;
}
}
}
2022-12-21 17:06:47 +02:00
void BattleWindow : : bWaitf ( )
2022-11-18 17:54:10 +02:00
{
2022-12-13 13:58:16 +02:00
if ( owner . actionsController - > spellcastingModeActive ( ) )
2022-11-18 17:54:10 +02:00
return ;
2022-12-13 13:58:16 +02:00
if ( owner . stacksController - > getActiveStack ( ) ! = nullptr )
owner . giveCommand ( EActionType : : WAIT ) ;
2022-11-18 17:54:10 +02:00
}
2022-12-21 17:06:47 +02:00
void BattleWindow : : bDefencef ( )
2022-11-18 17:54:10 +02:00
{
2022-12-13 13:58:16 +02:00
if ( owner . actionsController - > spellcastingModeActive ( ) )
2022-11-18 17:54:10 +02:00
return ;
2022-12-13 13:58:16 +02:00
if ( owner . stacksController - > getActiveStack ( ) ! = nullptr )
owner . giveCommand ( EActionType : : DEFEND ) ;
2022-11-18 17:54:10 +02:00
}
2022-12-21 17:06:47 +02:00
void BattleWindow : : bConsoleUpf ( )
2022-11-18 17:54:10 +02:00
{
2022-12-13 13:58:16 +02:00
if ( owner . actionsController - > spellcastingModeActive ( ) )
2022-11-18 17:54:10 +02:00
return ;
console - > scrollUp ( ) ;
}
2022-12-21 17:06:47 +02:00
void BattleWindow : : bConsoleDownf ( )
2022-11-18 17:54:10 +02:00
{
2022-12-13 13:58:16 +02:00
if ( owner . actionsController - > spellcastingModeActive ( ) )
2022-11-18 17:54:10 +02:00
return ;
console - > scrollDown ( ) ;
}
2022-12-21 17:06:47 +02:00
void BattleWindow : : bTacticNextStack ( )
2022-11-18 17:54:10 +02:00
{
2022-12-13 13:58:16 +02:00
owner . tacticNextStack ( nullptr ) ;
2022-11-18 17:54:10 +02:00
}
2022-12-21 17:06:47 +02:00
void BattleWindow : : bTacticPhaseEnd ( )
2022-11-18 17:54:10 +02:00
{
2022-12-13 13:58:16 +02:00
owner . tacticPhaseEnd ( ) ;
2022-11-18 17:54:10 +02:00
}
2022-12-21 17:06:47 +02:00
void BattleWindow : : blockUI ( bool on )
2022-11-18 17:54:10 +02:00
{
bool canCastSpells = false ;
2022-12-13 13:58:16 +02:00
auto hero = owner . curInt - > cb - > battleGetMyHero ( ) ;
2022-11-18 17:54:10 +02:00
if ( hero )
{
2022-12-13 13:58:16 +02:00
ESpellCastProblem : : ESpellCastProblem spellcastingProblem = owner . curInt - > cb - > battleCanCastSpell ( hero , spells : : Mode : : HERO ) ;
2022-11-18 17:54:10 +02:00
//if magic is blocked, we leave button active, so the message can be displayed after button click
canCastSpells = spellcastingProblem = = ESpellCastProblem : : OK | | spellcastingProblem = = ESpellCastProblem : : MAGIC_IS_BLOCKED ;
}
2022-12-13 13:58:16 +02:00
bool canWait = owner . stacksController - > getActiveStack ( ) ? ! owner . stacksController - > getActiveStack ( ) - > waitedThisTurn : false ;
2022-11-18 17:54:10 +02:00
bOptions - > block ( on ) ;
2022-12-13 13:58:16 +02:00
bFlee - > block ( on | | ! owner . curInt - > cb - > battleCanFlee ( ) ) ;
bSurrender - > block ( on | | owner . curInt - > cb - > battleGetSurrenderCost ( ) < 0 ) ;
2022-11-18 17:54:10 +02:00
// block only if during enemy turn and auto-fight is off
// otherwise - crash on accessing non-exisiting active stack
2022-12-13 13:58:16 +02:00
bAutofight - > block ( ! owner . curInt - > isAutoFightOn & & ! owner . stacksController - > getActiveStack ( ) ) ;
2022-11-18 17:54:10 +02:00
2022-12-13 13:58:16 +02:00
if ( owner . tacticsMode & & btactEnd & & btactNext )
2022-11-18 17:54:10 +02:00
{
btactNext - > block ( on ) ;
btactEnd - > block ( on ) ;
}
else
{
bConsoleUp - > block ( on ) ;
bConsoleDown - > block ( on ) ;
}
2022-12-13 13:58:16 +02:00
bSpell - > block ( on | | owner . tacticsMode | | ! canCastSpells ) ;
bWait - > block ( on | | owner . tacticsMode | | ! canWait ) ;
bDefence - > block ( on | | owner . tacticsMode ) ;
2022-11-18 17:54:10 +02:00
}
2022-12-21 17:02:53 +02:00
2022-12-21 17:06:47 +02:00
void BattleWindow : : showAll ( SDL_Surface * to )
2022-12-21 17:02:53 +02:00
{
CIntObject : : showAll ( to ) ;
if ( screen - > w ! = 800 | | screen - > h ! = 600 )
CMessage : : drawBorder ( owner . curInt - > playerID , to , pos . w + 28 , pos . h + 29 , pos . x - 14 , pos . y - 15 ) ;
}
2022-12-21 17:06:47 +02:00
void BattleWindow : : show ( SDL_Surface * to )
2022-12-21 17:02:53 +02:00
{
CIntObject : : show ( to ) ;
LOCPLINT - > cingconsole - > show ( to ) ;
}