2003-02-16 04:01:45 +00:00
#include "global.h"
2003-01-26 07:33:03 +00:00
#include "ScreenRanking.h"
2005-07-20 09:48:19 +00:00
#include "ScreenManager.h"
2003-01-26 07:33:03 +00:00
#include "SongManager.h"
#include "GameState.h"
#include "GameManager.h"
2003-12-07 07:09:13 +00:00
#include "ProfileManager.h"
2005-07-01 05:07:22 +00:00
#include "Profile.h"
2003-01-26 07:33:03 +00:00
2008-11-27 02:58:50 +00:00
static const char * RankingTypeNames [] = {
2004-05-02 03:01:27 +00:00
"Category" ,
"Course" ,
};
2008-11-27 02:58:50 +00:00
XToString ( RankingType );
LuaXType ( RankingType );
2004-01-29 01:46:08 +00:00
2005-03-28 08:01:36 +00:00
AutoScreenMessage ( SM_ShowNextPage )
AutoScreenMessage ( SM_HidePage )
2003-01-26 20:49:05 +00:00
2008-11-27 02:58:50 +00:00
REGISTER_SCREEN_CLASS ( ScreenRanking );
2003-01-26 07:33:03 +00:00
2008-11-27 02:58:50 +00:00
#define BULLET_X(row) (BULLET_START_X+ROW_SPACING_X*row)
#define BULLET_Y(row) (BULLET_START_Y+ROW_SPACING_Y*row)
#define NAME_X(row) (NAME_START_X+ROW_SPACING_X*row)
#define NAME_Y(row) (NAME_START_Y+ROW_SPACING_Y*row)
#define SCORE_X(row) (SCORE_START_X+ROW_SPACING_X*row)
#define SCORE_Y(row) (SCORE_START_Y+ROW_SPACING_Y*row)
#define POINTS_X(row) (POINTS_START_X+ROW_SPACING_X*row)
#define POINTS_Y(row) (POINTS_START_Y+ROW_SPACING_Y*row)
#define TIME_X(row) (TIME_START_X+ROW_SPACING_X*row)
#define TIME_Y(row) (TIME_START_Y+ROW_SPACING_Y*row)
2005-03-27 03:00:39 +00:00
2006-01-22 01:00:06 +00:00
static RString STEPS_TYPE_COLOR_NAME ( size_t i ) { return ssprintf ( "StepsTypeColor%d" , int ( i + 1 )); }
2005-02-28 17:18:01 +00:00
2005-02-23 06:29:05 +00:00
void ScreenRanking :: Init ()
{
2008-11-24 03:56:54 +00:00
STEPS_TYPES_TO_SHOW . Load ( m_sName , "StepsTypesToHide" ); // tricky: The metric name is "hide" because ThemeMetricStepsTypesToShow takes a list of what to hide and returns what StepsTypes to show
PAGE_FADE_SECONDS . Load ( m_sName , "PageFadeSeconds" );
2005-10-07 03:28:47 +00:00
2005-02-23 06:29:05 +00:00
ScreenAttract :: Init ();
2005-09-21 21:14:09 +00:00
m_textStepsType . SetName ( "StepsType" );
2008-11-27 02:58:50 +00:00
m_textStepsType . LoadFromFont ( THEME -> GetPathF ( m_sName , "StepsType" ) );
2005-09-21 21:14:09 +00:00
m_textStepsType . SetShadowLength ( 0 );
this -> AddChild ( & m_textStepsType );
2007-05-02 00:09:16 +00:00
LOAD_ALL_COMMANDS ( m_textStepsType );
2005-09-27 19:10:09 +00:00
2008-11-27 02:58:50 +00:00
RANKING_TYPE . Load ( m_sName , "RankingType" );
COURSES_TO_SHOW . Load ( m_sName , "CoursesToShow" );
SECONDS_PER_PAGE . Load ( m_sName , "SecondsPerPage" );
2005-09-27 19:10:09 +00:00
2007-05-02 22:43:45 +00:00
NO_SCORE_NAME . Load ( m_sName , "NoScoreName" );
ROW_SPACING_X . Load ( m_sName , "RowSpacingX" );
ROW_SPACING_Y . Load ( m_sName , "RowSpacingY" );
2006-01-15 19:13:38 +00:00
BULLET_START_X . Load ( m_sName , "BulletStartX" );
BULLET_START_Y . Load ( m_sName , "BulletStartY" );
NAME_START_X . Load ( m_sName , "NameStartX" );
NAME_START_Y . Load ( m_sName , "NameStartY" );
SCORE_START_X . Load ( m_sName , "ScoreStartX" );
SCORE_START_Y . Load ( m_sName , "ScoreStartY" );
POINTS_START_X . Load ( m_sName , "PointsStartX" );
POINTS_START_Y . Load ( m_sName , "PointsStartY" );
TIME_START_X . Load ( m_sName , "TimeStartX" );
TIME_START_Y . Load ( m_sName , "TimeStartY" );
2007-05-02 22:43:45 +00:00
STEPS_TYPE_COLOR . Load ( m_sName , STEPS_TYPE_COLOR_NAME , 5 );
2006-01-15 19:13:38 +00:00
2008-11-27 02:58:50 +00:00
if ( RANKING_TYPE == RankingType_Category )
2003-01-26 07:33:03 +00:00
{
2005-09-21 21:14:09 +00:00
m_textCategory . SetName ( "Category" );
m_textCategory . LoadFromFont ( THEME -> GetPathF ( m_sName , "category" ) );
m_textCategory . SetShadowLength ( 0 );
this -> AddChild ( & m_textCategory );
2007-05-01 21:20:14 +00:00
LOAD_ALL_COMMANDS ( m_textCategory );
2005-09-21 21:14:09 +00:00
2005-03-24 21:44:03 +00:00
for ( unsigned i = 0 ; i < STEPS_TYPES_TO_SHOW . GetValue (). size (); i ++ )
2003-01-26 07:33:03 +00:00
{
2006-09-26 20:49:10 +00:00
for ( int c = 0 ; c < NUM_RankingCategory ; c ++ )
2003-01-26 07:33:03 +00:00
{
2003-01-26 20:49:05 +00:00
PageToShow pts ;
2003-04-13 02:34:14 +00:00
pts . colorIndex = i ;
2003-01-26 20:49:05 +00:00
pts . category = ( RankingCategory ) c ;
2007-05-02 22:43:45 +00:00
StepsType st = STEPS_TYPES_TO_SHOW . GetValue ()[ i ];
pts . aTypes . push_back ( make_pair ( Difficulty_Invalid , st ) );
2003-01-26 20:49:05 +00:00
m_vPagesToShow . push_back ( pts );
2003-01-26 07:33:03 +00:00
}
}
}
2008-11-27 02:58:50 +00:00
if ( RANKING_TYPE == RankingType_SpecificTrail )
2005-09-21 21:14:09 +00:00
{
m_Banner . SetName ( "Banner" );
this -> AddChild ( & m_Banner );
2007-05-01 21:20:14 +00:00
LOAD_ALL_COMMANDS ( m_Banner );
2005-09-21 21:14:09 +00:00
m_textCourseTitle . SetName ( "CourseTitle" );
m_textCourseTitle . LoadFromFont ( THEME -> GetPathF ( m_sName , "course title" ) );
m_textCourseTitle . SetShadowLength ( 0 );
this -> AddChild ( & m_textCourseTitle );
2007-05-01 21:20:14 +00:00
LOAD_ALL_COMMANDS ( m_textCourseTitle );
2005-09-21 21:14:09 +00:00
2006-01-22 01:00:06 +00:00
vector < RString > asCoursePaths ;
2003-01-26 21:45:13 +00:00
split ( COURSES_TO_SHOW , "," , asCoursePaths , true );
2005-03-24 21:44:03 +00:00
for ( unsigned i = 0 ; i < STEPS_TYPES_TO_SHOW . GetValue (). size (); i ++ )
2003-01-26 07:33:03 +00:00
{
2003-01-26 21:45:13 +00:00
for ( unsigned c = 0 ; c < asCoursePaths . size (); c ++ )
{
PageToShow pts ;
2003-04-13 02:34:14 +00:00
pts . colorIndex = i ;
2007-05-02 22:43:45 +00:00
StepsType st = STEPS_TYPES_TO_SHOW . GetValue ()[ i ];
pts . aTypes . push_back ( make_pair ( Difficulty_Invalid , st ) );
2003-01-26 21:45:13 +00:00
pts . pCourse = SONGMAN -> GetCourseFromPath ( asCoursePaths [ c ] );
2004-06-03 20:47:37 +00:00
if ( pts . pCourse == NULL )
continue ;
2007-05-02 22:43:45 +00:00
pts . pTrail = pts . pCourse -> GetTrail ( st );
2004-06-03 20:47:37 +00:00
if ( pts . pTrail == NULL )
continue ;
m_vPagesToShow . push_back ( pts );
2003-01-26 21:45:13 +00:00
}
2003-01-26 07:33:03 +00:00
}
}
2005-09-27 19:10:09 +00:00
for ( int l = 0 ; l < NUM_RANKING_LINES ; l ++ )
{
m_sprBullets [ l ]. Load ( THEME -> GetPathG ( m_sName , ssprintf ( "bullets 1x%d" , NUM_RANKING_LINES ) ) );
m_sprBullets [ l ] -> SetName ( ssprintf ( "Bullet%d" , l + 1 ) );
m_sprBullets [ l ] -> StopAnimating ();
m_sprBullets [ l ] -> SetState ( l );
m_sprBullets [ l ] -> SetXY ( BULLET_X ( l ), BULLET_Y ( l ) );
ActorUtil :: LoadAllCommands ( * m_sprBullets [ l ], m_sName );
this -> AddChild ( m_sprBullets [ l ] );
m_textNames [ l ]. SetName ( ssprintf ( "Name%d" , l + 1 ) );
m_textNames [ l ]. LoadFromFont ( THEME -> GetPathF ( m_sName , "name" ) );
m_textNames [ l ]. SetXY ( NAME_X ( l ), NAME_Y ( l ) );
ActorUtil :: LoadAllCommands ( m_textNames [ l ], m_sName );
this -> AddChild ( & m_textNames [ l ] );
m_textScores [ l ]. SetName ( ssprintf ( "Score%d" , l + 1 ) );
m_textScores [ l ]. LoadFromFont ( THEME -> GetPathF ( m_sName , "score" ) );
m_textScores [ l ]. SetXY ( SCORE_X ( l ), SCORE_Y ( l ) );
ActorUtil :: LoadAllCommands ( m_textScores [ l ], m_sName );
this -> AddChild ( & m_textScores [ l ] );
m_textPoints [ l ]. SetName ( ssprintf ( "Points%d" , l + 1 ) );
m_textPoints [ l ]. LoadFromFont ( THEME -> GetPathF ( m_sName , "points" ) );
2007-02-13 06:32:26 +00:00
m_textPoints [ l ]. SetVisible ( false );
2005-09-27 19:10:09 +00:00
m_textPoints [ l ]. SetXY ( POINTS_X ( l ), POINTS_Y ( l ) );
ActorUtil :: LoadAllCommands ( m_textPoints [ l ], m_sName );
this -> AddChild ( & m_textPoints [ l ] );
m_textTime [ l ]. SetName ( ssprintf ( "Time%d" , l + 1 ) );
m_textTime [ l ]. LoadFromFont ( THEME -> GetPathF ( m_sName , "time" ) );
2007-02-13 06:32:26 +00:00
m_textTime [ l ]. SetVisible ( false );
2005-09-27 19:10:09 +00:00
m_textTime [ l ]. SetXY ( TIME_X ( l ), TIME_Y ( l ) );
ActorUtil :: LoadAllCommands ( m_textTime [ l ], m_sName );
this -> AddChild ( & m_textTime [ l ] );
}
}
2008-11-27 02:58:50 +00:00
void ScreenRanking :: BeginScreen ()
2005-09-27 19:10:09 +00:00
{
2008-11-27 02:58:50 +00:00
m_iNextPageToShow = 0 ;
ScreenAttract :: BeginScreen ();
this -> HandleScreenMessage ( SM_ShowNextPage );
}
void ScreenRanking :: HandleScreenMessage ( const ScreenMessage SM )
{
if ( SM == SM_ShowNextPage )
{
if ( m_iNextPageToShow < m_vPagesToShow . size () )
{
float fSecsToShow = SetPage ( m_vPagesToShow [ m_iNextPageToShow ] );
++ m_iNextPageToShow ;
this -> SortByDrawOrder ();
this -> PostScreenMessage ( SM_HidePage , fSecsToShow - PAGE_FADE_SECONDS );
}
else
{
StartTransitioningScreen ( SM_GoToNextScreen );
}
}
else if ( SM == SM_HidePage )
{
this -> PlayCommand ( "SwitchPage" );
this -> PostScreenMessage ( SM_ShowNextPage , PAGE_FADE_SECONDS );
}
ScreenAttract :: HandleScreenMessage ( SM );
}
float ScreenRanking :: SetPage ( const PageToShow & pts )
{
// This is going to take a while to load. Possibly longer than one frame.
// So, zero the next update so we don't skip.
SCREENMAN -> ZeroNextUpdate ();
//
// init page
//
StepsType st = pts . aTypes . front (). second ;
m_textStepsType . SetText ( GameManager :: GetStepsTypeInfo ( st ). GetLocalizedString () );
2005-09-27 19:10:09 +00:00
bool bShowScores = false ;
bool bShowPoints = false ;
bool bShowTime = false ;
2008-11-27 02:58:50 +00:00
switch ( RANKING_TYPE )
2005-09-21 21:42:07 +00:00
{
2008-11-27 02:58:50 +00:00
case RankingType_Category :
2005-09-27 19:10:09 +00:00
bShowScores = true ;
break ;
2008-11-27 02:58:50 +00:00
case RankingType_SpecificTrail :
2005-09-27 19:10:09 +00:00
bShowScores = ! pts . pCourse -> IsOni ();
bShowPoints = pts . pCourse -> IsOni ();
bShowTime = pts . pCourse -> IsOni ();
break ;
2005-09-21 21:42:07 +00:00
}
2005-09-27 19:10:09 +00:00
for ( int l = 0 ; l < NUM_RANKING_LINES ; l ++ )
2003-10-14 17:06:30 +00:00
{
2005-09-27 19:10:09 +00:00
m_textNames [ l ]. SetDiffuse ( STEPS_TYPE_COLOR . GetValue ( pts . colorIndex ) );
2007-02-13 06:32:26 +00:00
m_textScores [ l ]. SetVisible ( bShowScores );
2005-09-27 19:10:09 +00:00
m_textScores [ l ]. SetDiffuse ( STEPS_TYPE_COLOR . GetValue ( pts . colorIndex ) );
2007-02-13 06:32:26 +00:00
m_textPoints [ l ]. SetVisible ( bShowPoints );
2005-09-27 19:10:09 +00:00
m_textPoints [ l ]. SetDiffuse ( STEPS_TYPE_COLOR . GetValue ( pts . colorIndex ) );
2007-02-13 06:32:26 +00:00
m_textTime [ l ]. SetVisible ( bShowTime );
2005-09-27 19:10:09 +00:00
m_textTime [ l ]. SetDiffuse ( STEPS_TYPE_COLOR . GetValue ( pts . colorIndex ) );
2003-10-14 17:06:30 +00:00
}
2008-11-27 02:58:50 +00:00
switch ( RANKING_TYPE )
2003-01-26 07:33:03 +00:00
{
2008-11-27 02:58:50 +00:00
case RankingType_Category :
2003-01-26 07:33:03 +00:00
{
2003-12-28 08:20:48 +00:00
m_textCategory . SetText ( ssprintf ( "Type %c" , 'A' + pts . category ) );
2003-10-22 09:45:23 +00:00
2003-01-27 02:00:38 +00:00
for ( int l = 0 ; l < NUM_RANKING_LINES ; l ++ )
2003-01-26 07:33:03 +00:00
{
2007-05-02 22:43:45 +00:00
StepsType st = pts . aTypes . front (). second ;
2008-11-27 02:58:50 +00:00
HighScoreList & hsl = PROFILEMAN -> GetMachineProfile () -> GetCategoryHighScoreList ( st , pts . category );
2004-02-09 06:26:13 +00:00
HighScore hs ;
2003-12-28 08:20:48 +00:00
bool bRecentHighScore = false ;
2004-02-09 06:26:13 +00:00
if ( l < ( int ) hsl . vHighScores . size () )
2003-12-28 08:20:48 +00:00
{
2004-02-09 06:26:13 +00:00
hs = hsl . vHighScores [ l ];
2006-01-22 01:00:06 +00:00
RString * psName = hsl . vHighScores [ l ]. GetNameMutable ();
2003-12-28 08:20:48 +00:00
bRecentHighScore = find ( GAMESTATE -> m_vpsNamesThatWereFilled . begin (), GAMESTATE -> m_vpsNamesThatWereFilled . end (), psName ) != GAMESTATE -> m_vpsNamesThatWereFilled . end ();
}
2003-12-24 23:38:56 +00:00
else
2003-12-28 08:20:48 +00:00
{
2005-08-12 01:52:01 +00:00
hs . SetName ( NO_SCORE_NAME );
2003-12-28 08:20:48 +00:00
}
2003-10-14 17:06:30 +00:00
2004-03-08 02:50:46 +00:00
m_textNames [ l ]. SetText ( hs . GetDisplayName () );
2005-08-12 02:37:04 +00:00
m_textScores [ l ]. SetText ( ssprintf ( "%09i" , hs . GetScore ()) );
2005-02-28 17:18:01 +00:00
m_textNames [ l ]. SetDiffuse ( STEPS_TYPE_COLOR . GetValue ( pts . colorIndex ) );
m_textScores [ l ]. SetDiffuse ( STEPS_TYPE_COLOR . GetValue ( pts . colorIndex ) );
2003-02-03 05:53:59 +00:00
if ( bRecentHighScore )
{
2003-03-02 01:43:33 +00:00
m_textNames [ l ]. SetEffectGlowBlink ( 0.1f );
m_textScores [ l ]. SetEffectGlowBlink ( 0.1f );
2003-02-03 05:53:59 +00:00
}
else
{
2005-07-24 03:11:03 +00:00
m_textNames [ l ]. StopEffect ();
m_textScores [ l ]. StopEffect ();
2003-01-27 02:00:38 +00:00
}
2003-01-26 07:33:03 +00:00
}
}
2003-12-28 08:20:48 +00:00
return SECONDS_PER_PAGE ;
2008-11-27 02:58:50 +00:00
case RankingType_SpecificTrail :
2003-01-26 07:33:03 +00:00
{
2005-05-23 00:38:09 +00:00
m_textCourseTitle . SetText ( pts . pCourse -> GetDisplayFullTitle () );
2005-09-21 20:16:53 +00:00
2003-12-28 08:20:48 +00:00
m_Banner . LoadFromCourse ( pts . pCourse );
2003-07-16 02:32:37 +00:00
2004-06-03 20:47:37 +00:00
const HighScoreList & hsl = PROFILEMAN -> GetMachineProfile () -> GetCourseHighScoreList ( pts . pCourse , pts . pTrail );
2003-01-27 02:00:38 +00:00
for ( int l = 0 ; l < NUM_RANKING_LINES ; l ++ )
2003-01-26 07:33:03 +00:00
{
2004-02-09 06:26:13 +00:00
HighScore hs ;
2003-12-28 08:20:48 +00:00
bool bRecentHighScore = false ;
2004-02-09 06:26:13 +00:00
if ( l < ( int ) hsl . vHighScores . size () )
2003-12-28 08:20:48 +00:00
{
2004-02-09 06:26:13 +00:00
hs = hsl . vHighScores [ l ];
2006-01-22 01:00:06 +00:00
const RString * psName = hsl . vHighScores [ l ]. GetNameMutable ();
2003-12-28 08:20:48 +00:00
bRecentHighScore = find ( GAMESTATE -> m_vpsNamesThatWereFilled . begin (), GAMESTATE -> m_vpsNamesThatWereFilled . end (), psName ) != GAMESTATE -> m_vpsNamesThatWereFilled . end ();
}
2003-12-24 23:38:56 +00:00
else
2003-12-28 08:20:48 +00:00
{
2005-08-12 01:52:01 +00:00
hs . SetName ( NO_SCORE_NAME );
2003-12-28 08:20:48 +00:00
}
2004-02-09 06:26:13 +00:00
2004-03-08 02:50:46 +00:00
m_textNames [ l ]. SetText ( hs . GetDisplayName () );
2003-06-30 08:06:47 +00:00
if ( pts . pCourse -> IsOni () )
{
2005-08-12 02:37:04 +00:00
m_textPoints [ l ]. SetText ( ssprintf ( "%04d" , hs . GetScore ()) );
2005-08-12 02:46:58 +00:00
m_textTime [ l ]. SetText ( SecondsToMMSSMsMs ( hs . GetSurviveSeconds ()) );
2003-06-30 08:06:47 +00:00
m_textScores [ l ]. SetText ( "" );
} else {
m_textPoints [ l ]. SetText ( "" );
m_textTime [ l ]. SetText ( "" );
2005-08-12 02:37:04 +00:00
m_textScores [ l ]. SetText ( ssprintf ( "%09d" , hs . GetScore ()) );
2003-06-30 08:06:47 +00:00
}
2005-02-28 17:18:01 +00:00
m_textNames [ l ]. SetDiffuse ( STEPS_TYPE_COLOR . GetValue ( pts . colorIndex ) );
m_textPoints [ l ]. SetDiffuse ( STEPS_TYPE_COLOR . GetValue ( pts . colorIndex ) );
m_textTime [ l ]. SetDiffuse ( STEPS_TYPE_COLOR . GetValue ( pts . colorIndex ) );
m_textScores [ l ]. SetDiffuse ( STEPS_TYPE_COLOR . GetValue ( pts . colorIndex ) );
2003-12-28 08:20:48 +00:00
if ( bRecentHighScore )
2003-01-27 02:00:38 +00:00
{
2003-12-28 08:20:48 +00:00
m_textNames [ l ]. SetEffectGlowBlink ( 0.1f );
m_textScores [ l ]. SetEffectGlowBlink ( 0.1f );
}
else
{
2005-07-24 03:11:03 +00:00
m_textNames [ l ]. StopEffect ();
m_textScores [ l ]. StopEffect ();
2003-01-27 02:00:38 +00:00
}
2003-01-26 07:33:03 +00:00
}
}
2003-12-28 08:20:48 +00:00
return SECONDS_PER_PAGE ;
2003-01-26 07:33:03 +00:00
default :
ASSERT ( 0 );
2003-12-28 08:20:48 +00:00
return 0 ;
2003-01-26 07:33:03 +00:00
}
2003-01-26 20:49:05 +00:00
}
2003-01-26 07:33:03 +00:00
2004-06-08 05:22:33 +00:00
/*
2007-05-02 22:43:45 +00:00
* (c) 2001-2007 Chris Danford, Glenn Maynard
2004-06-08 05:22:33 +00:00
* All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, and/or sell copies of the Software, and to permit persons to
* whom the Software is furnished to do so, provided that the above
* copyright notice(s) and this permission notice appear in all copies of
* the Software and that both the above copyright notice(s) and this
* permission notice appear in supporting documentation.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF
* THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS
* INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT
* OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
* OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*/