2023-09-22 01:39:35 +02:00
/*
* CHighScoreScreen . 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
*
*/
# include "StdInc.h"
# include "CHighScoreScreen.h"
# include "../gui/CGuiHandler.h"
2023-09-22 20:39:20 +02:00
# include "../gui/WindowHandler.h"
# include "../gui/Shortcut.h"
2023-09-22 01:39:35 +02:00
# include "../widgets/TextControls.h"
# include "../widgets/Buttons.h"
# include "../widgets/Images.h"
2023-09-23 16:28:28 +02:00
# include "../widgets/MiscWidgets.h"
2023-09-22 01:39:35 +02:00
# include "../windows/InfoWindows.h"
# include "../render/Canvas.h"
# include "../CGameInfo.h"
2023-09-22 20:39:20 +02:00
# include "../CVideoHandler.h"
2023-09-22 21:45:12 +02:00
# include "../CMusicHandler.h"
2023-09-22 01:39:35 +02:00
# include "../../lib/CGeneralTextHandler.h"
# include "../../lib/CConfigHandler.h"
# include "../../lib/CCreatureHandler.h"
# include "../../lib/constants/EntityIdentifiers.h"
2023-09-23 13:14:45 +02:00
# include "../../lib/TextOperations.h"
# include "vstd/DateUtils.h"
2023-09-22 01:39:35 +02:00
2023-09-23 01:03:15 +02:00
auto HighScoreCalculation : : calculate ( )
2023-09-23 00:21:36 +02:00
{
2023-09-24 02:00:42 +02:00
struct Result
2023-09-23 14:51:39 +02:00
{
2023-09-24 02:00:42 +02:00
int basic = 0 ;
int total = 0 ;
int sumDays = 0 ;
bool cheater = false ;
2023-09-23 14:51:39 +02:00
} ;
2023-09-24 02:00:42 +02:00
Result firstResult , summary ;
const std : : array < double , 5 > difficultyMultipliers { 0.8 , 1.0 , 1.3 , 1.6 , 2.0 } ;
2023-09-23 14:51:39 +02:00
for ( auto & param : parameters )
{
double tmp = 200 - ( param . day + 10 ) / ( param . townAmount + 5 ) + ( param . allDefeated ? 25 : 0 ) + ( param . hasGrail ? 25 : 0 ) ;
2023-09-24 02:00:42 +02:00
firstResult = Result { static_cast < int > ( tmp ) , static_cast < int > ( tmp * difficultyMultipliers . at ( param . difficulty ) ) , param . day , param . usedCheat } ;
summary . basic + = firstResult . basic * 5.0 / parameters . size ( ) ;
summary . total + = firstResult . total * 5.0 / parameters . size ( ) ;
summary . sumDays + = firstResult . sumDays ;
summary . cheater | = firstResult . cheater ;
2023-09-23 14:51:39 +02:00
}
2023-09-24 02:00:42 +02:00
if ( parameters . size ( ) = = 1 )
return firstResult ;
2023-09-23 14:51:39 +02:00
2023-09-24 02:00:42 +02:00
return summary ;
2023-09-23 01:36:01 +02:00
}
CreatureID HighScoreCalculation : : getCreatureForPoints ( int points , bool campaign )
{
2023-09-23 14:51:39 +02:00
static const JsonNode configCreatures ( JsonPath : : builtin ( " CONFIG/highscoreCreatures.json " ) ) ;
auto creatures = configCreatures [ " creatures " ] . Vector ( ) ;
int divide = campaign ? 5 : 1 ;
2023-09-23 01:36:01 +02:00
2023-09-23 14:51:39 +02:00
for ( auto & creature : creatures )
if ( points / divide < = creature [ " max " ] . Integer ( ) & & points / divide > = creature [ " min " ] . Integer ( ) )
return CreatureID : : decode ( creature [ " creature " ] . String ( ) ) ;
2023-09-23 01:36:01 +02:00
2023-09-23 14:51:39 +02:00
return - 1 ;
2023-09-23 00:21:36 +02:00
}
2023-09-23 13:14:45 +02:00
CHighScoreScreen : : CHighScoreScreen ( HighScorePage highscorepage , int highlighted )
: CWindowObject ( BORDERED ) , highscorepage ( highscorepage ) , highlighted ( highlighted )
2023-09-22 01:39:35 +02:00
{
2023-09-23 14:51:39 +02:00
addUsedEvents ( SHOW_POPUP ) ;
2023-09-22 01:39:35 +02:00
OBJ_CONSTRUCTION_CAPTURING_ALL_NO_DISPOSE ;
pos = center ( Rect ( 0 , 0 , 800 , 600 ) ) ;
updateShadow ( ) ;
2023-09-23 14:51:39 +02:00
addHighScores ( ) ;
addButtons ( ) ;
}
void CHighScoreScreen : : showPopupWindow ( const Point & cursorPosition )
{
2023-09-24 02:00:42 +02:00
for ( int i = 0 ; i < screenRows ; i + + )
2023-09-23 14:51:39 +02:00
{
2023-09-24 02:00:42 +02:00
bool currentGameNotInListEntry = i = = ( screenRows - 1 ) & & highlighted > ( screenRows - 1 ) ;
2023-09-23 23:11:17 +02:00
2023-09-23 14:51:39 +02:00
Rect r = Rect ( 80 , 40 + i * 50 , 635 , 50 ) ;
if ( r . isInside ( cursorPosition - pos ) )
{
2023-09-23 23:11:17 +02:00
std : : string tmp = persistentStorage [ " highscore " ] [ highscorepage = = HighScorePage : : SCENARIO ? " scenario " : " campaign " ] [ currentGameNotInListEntry ? highlighted : i ] [ " datetime " ] . String ( ) ;
2023-09-23 14:51:39 +02:00
if ( ! tmp . empty ( ) )
CRClickPopup : : createAndPush ( tmp ) ;
}
}
2023-09-22 01:39:35 +02:00
}
void CHighScoreScreen : : addButtons ( )
{
OBJ_CONSTRUCTION_CAPTURING_ALL_NO_DISPOSE ;
2023-09-23 14:51:39 +02:00
buttons . clear ( ) ;
2023-09-22 01:39:35 +02:00
2023-09-23 20:41:30 +02:00
buttons . push_back ( std : : make_shared < CButton > ( Point ( 31 , 113 ) , AnimationPath : : builtin ( " HISCCAM.DEF " ) , CButton : : tooltip ( ) , [ & ] ( ) { buttonCampaignClick ( ) ; } ) ) ;
buttons . push_back ( std : : make_shared < CButton > ( Point ( 31 , 345 ) , AnimationPath : : builtin ( " HISCSTA.DEF " ) , CButton : : tooltip ( ) , [ & ] ( ) { buttonScenarioClick ( ) ; } ) ) ;
2023-09-23 14:51:39 +02:00
buttons . push_back ( std : : make_shared < CButton > ( Point ( 726 , 113 ) , AnimationPath : : builtin ( " HISCRES.DEF " ) , CButton : : tooltip ( ) , [ & ] ( ) { buttonResetClick ( ) ; } ) ) ;
buttons . push_back ( std : : make_shared < CButton > ( Point ( 726 , 345 ) , AnimationPath : : builtin ( " HISCEXT.DEF " ) , CButton : : tooltip ( ) , [ & ] ( ) { buttonExitClick ( ) ; } ) ) ;
2023-09-22 01:39:35 +02:00
}
void CHighScoreScreen : : addHighScores ( )
{
OBJ_CONSTRUCTION_CAPTURING_ALL_NO_DISPOSE ;
2023-09-23 14:51:39 +02:00
background = std : : make_shared < CPicture > ( ImagePath : : builtin ( highscorepage = = HighScorePage : : SCENARIO ? " HISCORE " : " HISCORE2 " ) ) ;
texts . clear ( ) ;
images . clear ( ) ;
// Header
2023-09-23 20:41:30 +02:00
texts . push_back ( std : : make_shared < CLabel > ( 115 , 20 , FONT_MEDIUM , ETextAlignment : : CENTER , Colors : : WHITE , CGI - > generaltexth - > translate ( " core.genrltxt.433 " ) ) ) ; // rank
texts . push_back ( std : : make_shared < CLabel > ( 225 , 20 , FONT_MEDIUM , ETextAlignment : : CENTER , Colors : : WHITE , CGI - > generaltexth - > translate ( " core.genrltxt.434 " ) ) ) ; // player
2023-09-23 14:51:39 +02:00
if ( highscorepage = = HighScorePage : : SCENARIO )
{
2023-09-23 20:41:30 +02:00
texts . push_back ( std : : make_shared < CLabel > ( 405 , 20 , FONT_MEDIUM , ETextAlignment : : CENTER , Colors : : WHITE , CGI - > generaltexth - > translate ( " core.genrltxt.435 " ) ) ) ; // land
texts . push_back ( std : : make_shared < CLabel > ( 557 , 20 , FONT_MEDIUM , ETextAlignment : : CENTER , Colors : : WHITE , CGI - > generaltexth - > translate ( " core.genrltxt.436 " ) ) ) ; // days
texts . push_back ( std : : make_shared < CLabel > ( 627 , 20 , FONT_MEDIUM , ETextAlignment : : CENTER , Colors : : WHITE , CGI - > generaltexth - > translate ( " core.genrltxt.75 " ) ) ) ; // score
2023-09-23 14:51:39 +02:00
}
else
{
2023-09-23 20:41:30 +02:00
texts . push_back ( std : : make_shared < CLabel > ( 405 , 20 , FONT_MEDIUM , ETextAlignment : : CENTER , Colors : : WHITE , CGI - > generaltexth - > translate ( " core.genrltxt.672 " ) ) ) ; // campaign
texts . push_back ( std : : make_shared < CLabel > ( 592 , 20 , FONT_MEDIUM , ETextAlignment : : CENTER , Colors : : WHITE , CGI - > generaltexth - > translate ( " core.genrltxt.75 " ) ) ) ; // score
2023-09-23 14:51:39 +02:00
}
// Content
2023-09-23 15:11:48 +02:00
int y = 66 ;
2023-09-23 14:51:39 +02:00
auto & data = persistentStorage [ " highscore " ] [ highscorepage = = HighScorePage : : SCENARIO ? " scenario " : " campaign " ] ;
2023-09-24 02:00:42 +02:00
for ( int i = 0 ; i < screenRows ; i + + )
2023-09-23 14:51:39 +02:00
{
2023-09-24 02:00:42 +02:00
bool currentGameNotInListEntry = ( i = = ( screenRows - 1 ) & & highlighted > ( screenRows - 1 ) ) ;
2023-09-23 22:45:38 +02:00
auto & curData = data [ currentGameNotInListEntry ? highlighted : i ] ;
2023-09-23 14:51:39 +02:00
2023-09-23 22:45:38 +02:00
ColorRGBA color = ( i = = highlighted | | currentGameNotInListEntry ) ? Colors : : YELLOW : Colors : : WHITE ;
texts . push_back ( std : : make_shared < CLabel > ( 115 , y + i * 50 , FONT_MEDIUM , ETextAlignment : : CENTER , color , std : : to_string ( ( currentGameNotInListEntry ? highlighted : i ) + 1 ) ) ) ;
2023-09-23 14:51:39 +02:00
std : : string tmp = curData [ " player " ] . String ( ) ;
TextOperations : : trimRightUnicode ( tmp , std : : max ( 0 , ( int ) TextOperations : : getUnicodeCharactersCount ( tmp ) - 13 ) ) ;
2023-09-23 15:11:48 +02:00
texts . push_back ( std : : make_shared < CLabel > ( 225 , y + i * 50 , FONT_MEDIUM , ETextAlignment : : CENTER , color , tmp ) ) ;
2023-09-23 14:51:39 +02:00
if ( highscorepage = = HighScorePage : : SCENARIO )
{
2023-09-25 18:06:40 +02:00
std : : string tmp = curData [ " scenarioName " ] . String ( ) ;
2023-09-23 14:51:39 +02:00
TextOperations : : trimRightUnicode ( tmp , std : : max ( 0 , ( int ) TextOperations : : getUnicodeCharactersCount ( tmp ) - 25 ) ) ;
2023-09-23 15:11:48 +02:00
texts . push_back ( std : : make_shared < CLabel > ( 405 , y + i * 50 , FONT_MEDIUM , ETextAlignment : : CENTER , color , tmp ) ) ;
texts . push_back ( std : : make_shared < CLabel > ( 557 , y + i * 50 , FONT_MEDIUM , ETextAlignment : : CENTER , color , std : : to_string ( curData [ " days " ] . Integer ( ) ) ) ) ;
texts . push_back ( std : : make_shared < CLabel > ( 627 , y + i * 50 , FONT_MEDIUM , ETextAlignment : : CENTER , color , std : : to_string ( curData [ " points " ] . Integer ( ) ) ) ) ;
2023-09-23 14:51:39 +02:00
}
else
{
2023-09-25 18:06:40 +02:00
std : : string tmp = curData [ " campaignName " ] . String ( ) ;
2023-09-23 14:51:39 +02:00
TextOperations : : trimRightUnicode ( tmp , std : : max ( 0 , ( int ) TextOperations : : getUnicodeCharactersCount ( tmp ) - 25 ) ) ;
2023-09-23 15:11:48 +02:00
texts . push_back ( std : : make_shared < CLabel > ( 405 , y + i * 50 , FONT_MEDIUM , ETextAlignment : : CENTER , color , tmp ) ) ;
texts . push_back ( std : : make_shared < CLabel > ( 592 , y + i * 50 , FONT_MEDIUM , ETextAlignment : : CENTER , color , std : : to_string ( curData [ " points " ] . Integer ( ) ) ) ) ;
2023-09-23 14:51:39 +02:00
}
2023-09-23 23:11:17 +02:00
if ( curData [ " points " ] . Integer ( ) > 0 & & curData [ " points " ] . Integer ( ) < = ( ( highscorepage = = HighScorePage : : CAMPAIGN ) ? 2500 : 500 ) )
2023-09-23 14:51:39 +02:00
images . push_back ( std : : make_shared < CAnimImage > ( AnimationPath : : builtin ( " CPRSMALL " ) , ( * CGI - > creh ) [ HighScoreCalculation : : getCreatureForPoints ( curData [ " points " ] . Integer ( ) , highscorepage = = HighScorePage : : CAMPAIGN ) ] - > getIconIndex ( ) , 0 , 670 , y - 15 + i * 50 ) ) ;
}
2023-09-22 01:39:35 +02:00
}
2023-09-23 20:41:30 +02:00
void CHighScoreScreen : : buttonCampaignClick ( )
2023-09-22 01:39:35 +02:00
{
2023-09-23 14:51:39 +02:00
highscorepage = HighScorePage : : CAMPAIGN ;
addHighScores ( ) ;
addButtons ( ) ;
redraw ( ) ;
2023-09-22 01:39:35 +02:00
}
2023-09-23 20:41:30 +02:00
void CHighScoreScreen : : buttonScenarioClick ( )
2023-09-22 01:39:35 +02:00
{
OBJ_CONSTRUCTION_CAPTURING_ALL_NO_DISPOSE ;
2023-09-23 14:51:39 +02:00
highscorepage = HighScorePage : : SCENARIO ;
addHighScores ( ) ;
addButtons ( ) ;
redraw ( ) ;
2023-09-22 01:39:35 +02:00
}
void CHighScoreScreen : : buttonResetClick ( )
{
2023-09-23 14:51:39 +02:00
CInfoWindow : : showYesNoDialog (
CGI - > generaltexth - > allTexts [ 666 ] ,
{ } ,
[ this ] ( )
{
Settings entry = persistentStorage . write [ " highscore " ] ;
entry - > clear ( ) ;
addHighScores ( ) ;
addButtons ( ) ;
redraw ( ) ;
} ,
0
) ;
2023-09-22 01:39:35 +02:00
}
void CHighScoreScreen : : buttonExitClick ( )
{
2023-09-23 14:51:39 +02:00
close ( ) ;
2023-09-22 01:39:35 +02:00
}
2023-09-22 20:39:20 +02:00
2023-09-23 00:21:36 +02:00
CHighScoreInputScreen : : CHighScoreInputScreen ( bool won , HighScoreCalculation calc )
2023-10-08 20:27:56 +02:00
: CWindowObject ( BORDERED ) , won ( won ) , calc ( calc ) , videoSoundHandle ( - 1 )
2023-09-22 20:39:20 +02:00
{
2023-09-23 15:11:48 +02:00
addUsedEvents ( LCLICK | KEYBOARD ) ;
2023-09-22 20:39:20 +02:00
2023-09-23 14:51:39 +02:00
OBJ_CONSTRUCTION_CAPTURING_ALL_NO_DISPOSE ;
2023-09-22 20:39:20 +02:00
pos = center ( Rect ( 0 , 0 , 800 , 600 ) ) ;
updateShadow ( ) ;
2023-09-23 16:28:28 +02:00
background = std : : make_shared < TransparentFilledRectangle > ( Rect ( 0 , 0 , pos . w , pos . h ) , Colors : : BLACK ) ;
2023-09-23 14:51:39 +02:00
if ( won )
{
int border = 100 ;
int textareaW = ( ( pos . w - 2 * border ) / 4 ) ;
2023-09-23 20:41:30 +02:00
std : : vector < std : : string > t = { " 438 " , " 439 " , " 440 " , " 441 " , " 676 " } ; // time, score, difficulty, final score, rank
2023-09-23 14:51:39 +02:00
for ( int i = 0 ; i < 5 ; i + + )
texts . push_back ( std : : make_shared < CMultiLineLabel > ( Rect ( textareaW * i + border - ( textareaW / 2 ) , 450 , textareaW , 100 ) , FONT_HIGH_SCORE , ETextAlignment : : TOPCENTER , Colors : : WHITE , CGI - > generaltexth - > translate ( " core.genrltxt. " + t [ i ] ) ) ) ;
std : : string creatureName = ( calc . calculate ( ) . cheater ) ? CGI - > generaltexth - > translate ( " core.genrltxt.260 " ) : ( * CGI - > creh ) [ HighScoreCalculation : : getCreatureForPoints ( calc . calculate ( ) . total , calc . isCampaign ) ] - > getNameSingularTranslated ( ) ;
t = { std : : to_string ( calc . calculate ( ) . sumDays ) , std : : to_string ( calc . calculate ( ) . basic ) , CGI - > generaltexth - > translate ( " core.arraytxt. " + std : : to_string ( ( 142 + calc . parameters [ 0 ] . difficulty ) ) ) , std : : to_string ( calc . calculate ( ) . total ) , creatureName } ;
for ( int i = 0 ; i < 5 ; i + + )
texts . push_back ( std : : make_shared < CMultiLineLabel > ( Rect ( textareaW * i + border - ( textareaW / 2 ) , 530 , textareaW , 100 ) , FONT_HIGH_SCORE , ETextAlignment : : TOPCENTER , Colors : : WHITE , t [ i ] ) ) ;
2023-09-22 21:45:12 +02:00
2023-09-23 14:51:39 +02:00
CCS - > musich - > playMusic ( AudioPath : : builtin ( " music/Win Scenario " ) , true , true ) ;
}
else
CCS - > musich - > playMusic ( AudioPath : : builtin ( " music/UltimateLose " ) , false , true ) ;
2023-09-22 21:45:12 +02:00
2023-09-23 14:51:39 +02:00
video = won ? " HSANIM.SMK " : " LOSEGAME.SMK " ;
2023-09-22 20:39:20 +02:00
}
2023-09-23 14:51:39 +02:00
int CHighScoreInputScreen : : addEntry ( std : : string text ) {
2023-09-23 22:15:05 +02:00
std : : vector < JsonNode > baseNode = persistentStorage [ " highscore " ] [ calc . isCampaign ? " campaign " : " scenario " ] . Vector ( ) ;
auto sortFunctor = [ ] ( const JsonNode & left , const JsonNode & right )
2023-09-23 14:51:39 +02:00
{
2023-09-23 23:11:17 +02:00
if ( left [ " points " ] . Integer ( ) = = right [ " points " ] . Integer ( ) )
return left [ " posFlag " ] . Integer ( ) > right [ " posFlag " ] . Integer ( ) ;
2023-09-23 22:15:05 +02:00
return left [ " points " ] . Integer ( ) > right [ " points " ] . Integer ( ) ;
} ;
2023-09-23 14:51:39 +02:00
2023-09-23 22:15:05 +02:00
JsonNode newNode = JsonNode ( ) ;
newNode [ " player " ] . String ( ) = text ;
if ( calc . isCampaign )
2023-09-25 18:06:40 +02:00
newNode [ " campaignName " ] . String ( ) = calc . calculate ( ) . cheater ? CGI - > generaltexth - > translate ( " core.genrltxt.260 " ) : calc . parameters [ 0 ] . campaignName ;
2023-09-23 22:15:05 +02:00
else
2023-09-25 18:06:40 +02:00
newNode [ " scenarioName " ] . String ( ) = calc . calculate ( ) . cheater ? CGI - > generaltexth - > translate ( " core.genrltxt.260 " ) : calc . parameters [ 0 ] . scenarioName ;
2023-09-23 22:15:05 +02:00
newNode [ " days " ] . Integer ( ) = calc . calculate ( ) . sumDays ;
newNode [ " points " ] . Integer ( ) = calc . calculate ( ) . cheater ? 0 : calc . calculate ( ) . total ;
newNode [ " datetime " ] . String ( ) = vstd : : getFormattedDateTime ( std : : time ( 0 ) ) ;
newNode [ " posFlag " ] . Bool ( ) = true ;
baseNode . push_back ( newNode ) ;
boost : : range : : sort ( baseNode , sortFunctor ) ;
int pos = - 1 ;
for ( int i = 0 ; i < baseNode . size ( ) ; i + + )
{
if ( ! baseNode [ i ] [ " posFlag " ] . isNull ( ) )
2023-09-23 14:51:39 +02:00
{
2023-09-23 22:15:05 +02:00
baseNode [ i ] [ " posFlag " ] . clear ( ) ;
pos = i ;
2023-09-23 14:51:39 +02:00
}
}
2023-09-23 23:11:17 +02:00
Settings s = persistentStorage . write [ " highscore " ] [ calc . isCampaign ? " campaign " : " scenario " ] ;
2023-09-23 22:15:05 +02:00
s - > Vector ( ) = baseNode ;
2023-09-23 14:51:39 +02:00
2023-09-23 22:15:05 +02:00
return pos ;
2023-09-22 20:39:20 +02:00
}
void CHighScoreInputScreen : : show ( Canvas & to )
{
2023-09-22 21:45:12 +02:00
CCS - > videoh - > update ( pos . x , pos . y , to . getInternalSurface ( ) , true , false ,
2023-09-23 14:51:39 +02:00
[ & ] ( )
{
if ( won )
{
CCS - > videoh - > close ( ) ;
video = " HSLOOP.SMK " ;
2023-10-07 23:07:10 +02:00
auto audioData = CCS - > videoh - > getAudio ( VideoPath : : builtin ( video ) ) ;
2023-10-08 20:27:56 +02:00
videoSoundHandle = CCS - > soundh - > playSound ( audioData ) ;
2023-09-23 14:51:39 +02:00
CCS - > videoh - > open ( VideoPath : : builtin ( video ) ) ;
}
else
close ( ) ;
} ) ;
redraw ( ) ;
2023-09-22 20:39:20 +02:00
CIntObject : : show ( to ) ;
}
void CHighScoreInputScreen : : activate ( )
{
2023-10-07 23:07:10 +02:00
auto audioData = CCS - > videoh - > getAudio ( VideoPath : : builtin ( video ) ) ;
2023-10-08 20:27:56 +02:00
videoSoundHandle = CCS - > soundh - > playSound ( audioData ) ;
2023-09-23 16:28:28 +02:00
if ( ! CCS - > videoh - > open ( VideoPath : : builtin ( video ) ) )
{
if ( ! won )
close ( ) ;
}
else
background = nullptr ;
2023-09-22 20:39:20 +02:00
CIntObject : : activate ( ) ;
}
void CHighScoreInputScreen : : deactivate ( )
{
2023-09-23 14:51:39 +02:00
CCS - > videoh - > close ( ) ;
2023-10-08 20:27:56 +02:00
CCS - > soundh - > stopSound ( videoSoundHandle ) ;
2023-09-22 20:39:20 +02:00
CIntObject : : deactivate ( ) ;
}
void CHighScoreInputScreen : : clickPressed ( const Point & cursorPosition )
{
2023-09-23 14:51:39 +02:00
OBJ_CONSTRUCTION_CAPTURING_ALL_NO_DISPOSE ;
if ( ! won )
{
close ( ) ;
return ;
}
if ( ! input )
{
2023-09-26 22:06:04 +02:00
input = std : : make_shared < CHighScoreInput > ( calc . parameters [ 0 ] . playerName ,
2023-09-23 14:51:39 +02:00
[ & ] ( std : : string text )
{
if ( ! text . empty ( ) )
{
int pos = addEntry ( text ) ;
close ( ) ;
GH . windows ( ) . createAndPushWindow < CHighScoreScreen > ( calc . isCampaign ? CHighScoreScreen : : HighScorePage : : CAMPAIGN : CHighScoreScreen : : HighScorePage : : SCENARIO , pos ) ;
}
else
close ( ) ;
} ) ;
}
2023-09-22 20:39:20 +02:00
}
2023-09-23 15:11:48 +02:00
void CHighScoreInputScreen : : keyPressed ( EShortcut key )
{
clickPressed ( Point ( ) ) ;
}
2023-09-26 22:06:04 +02:00
CHighScoreInput : : CHighScoreInput ( std : : string playerName , std : : function < void ( std : : string text ) > readyCB )
2023-09-23 20:41:30 +02:00
: CWindowObject ( 0 , ImagePath : : builtin ( " HIGHNAME " ) ) , ready ( readyCB )
2023-09-22 20:39:20 +02:00
{
2023-09-23 14:51:39 +02:00
OBJ_CONSTRUCTION_CAPTURING_ALL_NO_DISPOSE ;
2023-09-22 20:39:20 +02:00
pos = center ( Rect ( 0 , 0 , 232 , 212 ) ) ;
updateShadow ( ) ;
2023-09-23 14:51:39 +02:00
text = std : : make_shared < CMultiLineLabel > ( Rect ( 15 , 15 , 202 , 202 ) , FONT_SMALL , ETextAlignment : : TOPCENTER , Colors : : WHITE , CGI - > generaltexth - > translate ( " core.genrltxt.96 " ) ) ;
2023-09-22 20:39:20 +02:00
2023-09-23 14:51:39 +02:00
buttonOk = std : : make_shared < CButton > ( Point ( 26 , 142 ) , AnimationPath : : builtin ( " MUBCHCK.DEF " ) , CGI - > generaltexth - > zelp [ 560 ] , std : : bind ( & CHighScoreInput : : okay , this ) , EShortcut : : GLOBAL_ACCEPT ) ;
buttonCancel = std : : make_shared < CButton > ( Point ( 142 , 142 ) , AnimationPath : : builtin ( " MUBCANC.DEF " ) , CGI - > generaltexth - > zelp [ 561 ] , std : : bind ( & CHighScoreInput : : abort , this ) , EShortcut : : GLOBAL_CANCEL ) ;
2023-09-22 20:39:20 +02:00
statusBar = CGStatusBar : : create ( std : : make_shared < CPicture > ( background - > getSurface ( ) , Rect ( 7 , 186 , 218 , 18 ) , 7 , 186 ) ) ;
2023-09-23 14:51:39 +02:00
textInput = std : : make_shared < CTextInput > ( Rect ( 18 , 104 , 200 , 25 ) , FONT_SMALL , 0 ) ;
2023-09-26 22:06:04 +02:00
textInput - > setText ( playerName ) ;
2023-09-22 20:39:20 +02:00
}
void CHighScoreInput : : okay ( )
{
2023-09-23 14:51:39 +02:00
ready ( textInput - > getText ( ) ) ;
2023-09-22 20:39:20 +02:00
}
void CHighScoreInput : : abort ( )
{
2023-09-23 14:51:39 +02:00
ready ( " " ) ;
2023-09-22 20:39:20 +02:00
}