2003-02-16 04:01:45 +00:00
#include "global.h"
2002-06-24 22:04:31 +00:00
#include "ScreenEvaluation.h"
#include "SongManager.h"
#include "ScreenManager.h"
#include "GameManager.h"
#include "RageUtil.h"
#include "GameConstantsAndTypes.h"
2003-08-03 00:13:55 +00:00
#include "Steps.h"
2002-07-23 01:41:40 +00:00
#include "PrefsManager.h"
2002-06-24 22:04:31 +00:00
#include "RageLog.h"
#include "AnnouncerManager.h"
2002-07-23 01:41:40 +00:00
#include "GameState.h"
2002-11-11 04:53:31 +00:00
#include "ThemeManager.h"
2004-07-08 00:10:34 +00:00
#include "GameSoundManager.h"
2003-04-15 02:47:24 +00:00
#include "ActorUtil.h"
2003-07-17 20:10:07 +00:00
#include "Course.h"
2003-11-16 04:45:12 +00:00
#include "LightsManager.h"
2003-12-07 07:09:13 +00:00
#include "ProfileManager.h"
2005-07-01 05:07:22 +00:00
#include "Profile.h"
2003-12-18 03:14:39 +00:00
#include "song.h"
2005-02-16 03:25:45 +00:00
#include "StatsManager.h"
2004-02-11 22:34:04 +00:00
#include "Grade.h"
2004-02-12 09:44:16 +00:00
#include "CodeDetector.h"
#include "RageDisplay.h"
#include "StepMania.h"
2004-02-17 01:16:57 +00:00
#include "CryptManager.h"
2004-10-03 05:27:52 +00:00
#include "MemoryCardManager.h"
2004-12-20 06:25:59 +00:00
#include "PlayerState.h"
2005-02-12 21:03:39 +00:00
#include "CommonMetrics.h"
2005-10-08 02:10:32 +00:00
#include "ScoreKeeperNormal.h"
2005-09-05 02:26:50 +00:00
#include "InputEventPlus.h"
2002-06-24 22:04:31 +00:00
2006-01-27 21:31:56 +00:00
const int NUM_SCORE_DIGITS = 9 ;
2003-03-28 23:13:32 +00:00
2003-12-19 09:30:54 +00:00
2003-03-28 05:47:42 +00:00
// metrics that are common to all ScreenEvaluation classes
2006-01-27 21:31:56 +00:00
#define BANNER_WIDTH THEME->GetMetricF(m_sName,"BannerWidth")
#define BANNER_HEIGHT THEME->GetMetricF(m_sName,"BannerHeight")
2006-01-04 22:30:51 +00:00
static const char * JudgeLineNames [] =
2003-10-27 22:24:33 +00:00
{
2006-07-07 18:45:15 +00:00
"W1" , "W2" , "W3" , "W4" , "W5" , "Miss" , "Held" , "MaxCombo"
2003-10-27 22:24:33 +00:00
};
2005-10-09 04:30:59 +00:00
XToString ( JudgeLine , NUM_JudgeLine );
2006-09-27 05:18:47 +00:00
#define FOREACH_JudgeLine( rc ) FOREACH_ENUM2( JudgeLine, rc )
2005-10-09 04:30:59 +00:00
2006-01-04 22:30:51 +00:00
static const char * StatLineNames [ NUM_StatLine ] =
2003-12-16 10:04:37 +00:00
{
2005-05-09 06:15:59 +00:00
"Jumps" , "Holds" , "Mines" , "Hands" , "Rolls" ,
2003-12-16 10:04:37 +00:00
};
2005-10-09 04:30:59 +00:00
XToString ( StatLine , NUM_StatLine );
2006-09-27 05:18:47 +00:00
#define FOREACH_StatLine( rc ) FOREACH_ENUM2( StatLine, rc )
2003-12-16 10:04:37 +00:00
2006-01-27 21:31:56 +00:00
#define CHEER_DELAY_SECONDS THEME->GetMetricF(m_sName,"CheerDelaySeconds")
#define BAR_ACTUAL_MAX_COMMAND THEME->GetMetricA(m_sName,"BarActualMaxCommand")
2003-04-15 02:47:24 +00:00
2003-03-28 05:47:42 +00:00
// metrics that are specific to classes derived from ScreenEvaluation
2006-01-27 21:31:56 +00:00
#define SHOW_BANNER_AREA THEME->GetMetricB(m_sName,"ShowBannerArea")
#define SHOW_GRADE_AREA THEME->GetMetricB(m_sName,"ShowGradeArea")
#define SHOW_POINTS_AREA THEME->GetMetricB(m_sName,"ShowPointsArea")
#define SHOW_BONUS_AREA THEME->GetMetricB(m_sName,"ShowBonusArea")
#define SHOW_SURVIVED_AREA THEME->GetMetricB(m_sName,"ShowSurvivedArea")
#define SHOW_WIN_AREA THEME->GetMetricB(m_sName,"ShowWinArea")
#define SHOW_JUDGMENT_LABELS THEME->GetMetricB(m_sName,"ShowJudgmentLabels")
#define SHOW_JUDGMENT( l ) THEME->GetMetricB(m_sName,"Show"+JudgeLineToString(l))
#define SHOW_STATS_LABELS THEME->GetMetricB(m_sName,"ShowStatsLabels")
2005-09-10 21:00:28 +00:00
2006-07-05 21:53:12 +00:00
#define SHOW_STAT( s ) THEME->GetMetricB(m_sName,"Show"+StatLineToString(s))
2006-01-27 21:31:56 +00:00
#define SHOW_SCORE_AREA THEME->GetMetricB(m_sName,"ShowScoreArea")
#define SHOW_TOTAL_SCORE_AREA THEME->GetMetricB(m_sName,"ShowTotalScoreArea")
#define SHOW_TIME_AREA THEME->GetMetricB(m_sName,"ShowTimeArea")
#define SHOW_RECORDS_AREA THEME->GetMetricB(m_sName,"ShowRecordsArea")
#define MAX_COMBO_NUM_DIGITS THEME->GetMetricI(m_sName,"MaxComboNumDigits")
#define PLAYER_OPTIONS_SEPARATOR THEME->GetMetric (m_sName,"PlayerOptionsSeparator")
2004-02-11 22:34:04 +00:00
2003-03-24 21:37:13 +00:00
2003-11-26 04:20:38 +00:00
static const int NUM_SHOWN_RADAR_CATEGORIES = 5 ;
2002-06-24 22:04:31 +00:00
2005-03-28 08:01:36 +00:00
AutoScreenMessage ( SM_PlayCheer )
AutoScreenMessage ( SM_AddBonus )
2002-06-24 22:04:31 +00:00
2006-01-15 20:46:15 +00:00
REGISTER_SCREEN_CLASS ( ScreenEvaluation );
2006-01-15 18:54:03 +00:00
ScreenEvaluation :: ScreenEvaluation ()
2004-02-18 02:31:43 +00:00
{
2003-03-24 21:37:13 +00:00
//
// debugging
//
2003-12-20 00:20:21 +00:00
if ( PREFSMAN -> m_bScreenTestMode )
{
2004-08-09 05:01:24 +00:00
PROFILEMAN -> LoadFirstAvailableProfile ( PLAYER_1 );
PROFILEMAN -> LoadFirstAvailableProfile ( PLAYER_2 );
2004-02-17 01:16:57 +00:00
2005-07-25 03:59:24 +00:00
GAMESTATE -> m_PlayMode . Set ( PLAY_MODE_REGULAR );
2005-05-07 08:34:20 +00:00
GAMESTATE -> m_pCurStyle . Set ( GAMEMAN -> GameAndStringToStyle ( GAMEMAN -> GetDefaultGame (), "versus" ) );
2005-02-23 21:13:09 +00:00
STATSMAN -> m_CurStageStats . playMode = GAMESTATE -> m_PlayMode ;
STATSMAN -> m_CurStageStats . pStyle = GAMESTATE -> m_pCurStyle ;
STATSMAN -> m_CurStageStats . StageType = StageStats :: STAGE_NORMAL ;
2003-12-20 00:20:21 +00:00
GAMESTATE -> m_MasterPlayerNumber = PLAYER_1 ;
2005-02-24 12:27:30 +00:00
GAMESTATE -> m_pCurSong . Set ( SONGMAN -> GetRandomSong () );
2005-04-20 06:13:06 +00:00
STATSMAN -> m_CurStageStats . vpPlayedSongs . push_back ( GAMESTATE -> m_pCurSong );
2005-05-05 05:06:44 +00:00
STATSMAN -> m_CurStageStats . vpPossibleSongs . push_back ( GAMESTATE -> m_pCurSong );
2005-05-18 07:14:19 +00:00
GAMESTATE -> m_pCurCourse . Set ( SONGMAN -> GetRandomCourse () );
2004-03-20 02:59:08 +00:00
GAMESTATE -> m_iCurrentStageIndex = 0 ;
2005-05-05 05:06:44 +00:00
FOREACH_PlayerNumber ( p )
{
2006-06-26 12:14:30 +00:00
if ( RandomInt ( 2 ) )
2006-08-05 08:02:49 +00:00
PO_GROUP_ASSIGN_N ( GAMESTATE -> m_pPlayerState [ p ] -> m_PlayerOptions , ModsLevel_Stage , m_bTransforms , PlayerOptions :: TRANSFORM_ECHO , true ); // show "disqualified"
2005-05-05 05:06:44 +00:00
2006-09-15 05:56:43 +00:00
GAMESTATE -> JoinPlayer ( p );
2005-05-05 05:06:44 +00:00
GAMESTATE -> m_pCurSteps [ p ]. Set ( GAMESTATE -> m_pCurSong -> GetAllSteps ()[ 0 ] );
2005-05-06 13:47:33 +00:00
vector < Trail *> apTrails ;
GAMESTATE -> m_pCurCourse -> GetAllTrails ( apTrails );
2005-07-12 19:23:22 +00:00
if ( apTrails . size () )
GAMESTATE -> m_pCurTrail [ p ]. Set ( apTrails [ 0 ] );
2005-05-05 05:06:44 +00:00
STATSMAN -> m_CurStageStats . m_player [ p ]. vpPlayedSteps . push_back ( GAMESTATE -> m_pCurSteps [ PLAYER_1 ] );
STATSMAN -> m_CurStageStats . m_player [ p ]. vpPossibleSteps . push_back ( GAMESTATE -> m_pCurSteps [ PLAYER_1 ] );
2006-08-05 02:38:05 +00:00
2006-08-05 08:02:49 +00:00
PO_GROUP_ASSIGN ( GAMESTATE -> m_pPlayerState [ p ] -> m_PlayerOptions , ModsLevel_Stage , m_fScrollSpeed , 2.0f );
PO_GROUP_CALL ( GAMESTATE -> m_pPlayerState [ p ] -> m_PlayerOptions , ModsLevel_Stage , ChooseRandomModifiers );
2005-05-05 05:06:44 +00:00
}
2003-12-22 01:55:03 +00:00
for ( float f = 0 ; f < 100.0f ; f += 1.0f )
2003-12-21 08:55:59 +00:00
{
2003-12-22 01:55:03 +00:00
float fP1 = fmodf ( f / 100 * 4 + .3f , 1 );
2005-02-16 03:25:45 +00:00
STATSMAN -> m_CurStageStats . m_player [ PLAYER_1 ]. SetLifeRecordAt ( fP1 , f );
STATSMAN -> m_CurStageStats . m_player [ PLAYER_2 ]. SetLifeRecordAt ( 1 - fP1 , f );
2003-12-21 08:55:59 +00:00
}
2003-12-22 01:55:03 +00:00
2005-05-08 22:03:41 +00:00
FOREACH_PlayerNumber ( p )
2004-06-22 08:41:25 +00:00
{
2005-09-26 19:08:45 +00:00
float fSeconds = GAMESTATE -> m_pCurSong -> GetStepsSeconds ();
2006-06-26 12:14:30 +00:00
STATSMAN -> m_CurStageStats . m_player [ p ]. iActualDancePoints = RandomInt ( 3 );
2005-05-08 22:03:41 +00:00
STATSMAN -> m_CurStageStats . m_player [ p ]. iPossibleDancePoints = 2 ;
2006-06-26 12:14:30 +00:00
if ( RandomInt ( 2 ) )
2005-09-26 19:08:45 +00:00
STATSMAN -> m_CurStageStats . m_player [ p ]. iCurCombo = 11000 ;
else
STATSMAN -> m_CurStageStats . m_player [ p ]. iCurCombo = 0 ;
STATSMAN -> m_CurStageStats . m_player [ p ]. UpdateComboList ( 0 , true );
STATSMAN -> m_CurStageStats . m_player [ p ]. iCurCombo += 50 ;
STATSMAN -> m_CurStageStats . m_player [ p ]. UpdateComboList ( 0.10f * fSeconds , false );
STATSMAN -> m_CurStageStats . m_player [ p ]. iCurCombo = 0 ;
STATSMAN -> m_CurStageStats . m_player [ p ]. UpdateComboList ( 0.15f * fSeconds , false );
STATSMAN -> m_CurStageStats . m_player [ p ]. iCurCombo = 1 ;
STATSMAN -> m_CurStageStats . m_player [ p ]. UpdateComboList ( 0.25f * fSeconds , false );
STATSMAN -> m_CurStageStats . m_player [ p ]. iCurCombo = 50 ;
STATSMAN -> m_CurStageStats . m_player [ p ]. UpdateComboList ( 0.35f * fSeconds , false );
STATSMAN -> m_CurStageStats . m_player [ p ]. iCurCombo = 0 ;
STATSMAN -> m_CurStageStats . m_player [ p ]. UpdateComboList ( 0.45f * fSeconds , false );
STATSMAN -> m_CurStageStats . m_player [ p ]. iCurCombo = 1 ;
STATSMAN -> m_CurStageStats . m_player [ p ]. UpdateComboList ( 0.50f * fSeconds , false );
STATSMAN -> m_CurStageStats . m_player [ p ]. iCurCombo = 100 ;
STATSMAN -> m_CurStageStats . m_player [ p ]. UpdateComboList ( 1.00f * fSeconds , false );
2006-06-26 12:14:30 +00:00
if ( RandomInt ( 5 ) == 0 )
2005-05-08 22:03:41 +00:00
{
STATSMAN -> m_CurStageStats . m_player [ p ]. bFailedEarlier = true ;
}
2006-06-26 12:14:30 +00:00
STATSMAN -> m_CurStageStats . m_player [ p ]. iTapNoteScores [ TNS_W1 ] = RandomInt ( 3 );
STATSMAN -> m_CurStageStats . m_player [ p ]. iTapNoteScores [ TNS_W2 ] = RandomInt ( 3 );
STATSMAN -> m_CurStageStats . m_player [ p ]. iTapNoteScores [ TNS_W3 ] = RandomInt ( 3 );
2005-10-09 04:30:59 +00:00
STATSMAN -> m_CurStageStats . m_player [ p ]. iPossibleGradePoints = 4 * ScoreKeeperNormal :: TapNoteScoreToGradePoints ( TNS_W1 , false );
2005-05-08 22:03:41 +00:00
STATSMAN -> m_CurStageStats . m_player [ p ]. fLifeRemainingSeconds = randomf ( 90 , 580 );
2004-06-22 08:41:25 +00:00
}
2004-01-22 07:22:45 +00:00
2005-02-16 03:25:45 +00:00
STATSMAN -> m_vPlayedStageStats . clear ();
2003-12-20 00:20:21 +00:00
}
2005-02-23 06:29:05 +00:00
}
2003-12-20 00:20:21 +00:00
2005-02-23 06:29:05 +00:00
void ScreenEvaluation :: Init ()
{
LOG -> Trace ( "ScreenEvaluation::Init()" );
2005-02-23 19:18:11 +00:00
/* Commit stats to the profile, so any profile stats displayed on this screen
* include the last game. */
GAMESTATE -> CommitStageStats ();
2004-03-23 06:11:10 +00:00
LIGHTSMAN -> SetLightsMode ( LIGHTSMODE_MENU );
2003-11-16 04:45:12 +00:00
2004-02-12 09:44:16 +00:00
ZERO ( m_bSavedScreenshot );
2005-09-11 04:12:50 +00:00
SUMMARY . Load ( m_sName , "Summary" );
2002-06-24 22:04:31 +00:00
2003-01-24 02:43:07 +00:00
//
// Figure out which statistics and songs we're going to display
//
2006-07-03 00:04:30 +00:00
STATSMAN -> CalcAccumPlayedStageStats ();
2005-02-16 19:40:09 +00:00
2005-09-11 04:12:50 +00:00
if ( SUMMARY )
2005-09-11 01:02:53 +00:00
STATSMAN -> GetFinalEvalStageStats ( STATSMAN -> m_CurStageStats );
2005-09-11 01:03:28 +00:00
m_bFailed = STATSMAN -> m_CurStageStats . AllFailed ();
2003-03-28 23:13:32 +00:00
/*
2003-01-24 02:43:07 +00:00
//
2003-03-24 21:37:13 +00:00
// Debugging
2003-01-24 02:43:07 +00:00
//
2002-06-24 22:04:31 +00:00
{
2004-05-24 06:10:11 +00:00
FOREACH_PlayerNumber( p ) // foreach line
2006-01-07 04:11:29 +00:00
for( int r=0; r<NUM_RadarCategory; r++ ) // foreach line
2002-10-06 17:02:04 +00:00
{
2005-09-11 01:46:55 +00:00
STATSMAN->m_CurStageStats.radarPossible[p][r] = 0.5f + r/10.0f;
STATSMAN->m_CurStageStats.radarActual[p][r] = 0.5f + r/10.0f;
2002-10-06 17:02:04 +00:00
}
2002-08-22 09:31:32 +00:00
}
2003-03-28 23:13:32 +00:00
*/
2002-06-24 22:04:31 +00:00
2005-10-08 04:50:28 +00:00
if ( PREFSMAN -> m_ScoringType == PrefsManager :: SCORING_OLD )
2004-05-04 00:00:17 +00:00
{
2005-09-11 00:38:16 +00:00
FOREACH_PlayerNumber ( p )
2004-05-04 00:00:17 +00:00
{
const int ScoreBonuses [] = { 10000000 , 10000000 , 1000000 , 100000 , 10000 , 1000 , 100 };
2005-09-11 01:46:55 +00:00
Grade g = STATSMAN -> m_CurStageStats . m_player [ p ]. GetGrade ();
2006-09-13 03:11:38 +00:00
if ( g < ( int ) ARRAYLEN ( ScoreBonuses ) )
2004-02-27 01:54:55 +00:00
{
2005-09-11 00:38:16 +00:00
STATSMAN -> m_CurStageStats . m_player [ p ]. iBonus += ScoreBonuses [( int ) g ];
2005-09-11 01:46:55 +00:00
STATSMAN -> m_CurStageStats . m_player [ p ]. iBonus += ScoreBonuses [( int ) g ];
2004-02-27 01:54:55 +00:00
}
2003-08-11 12:14:26 +00:00
}
2002-07-23 01:41:40 +00:00
}
2005-09-11 01:25:58 +00:00
//
// update persistent statistics
//
2005-09-11 04:12:50 +00:00
STATSMAN -> m_CurStageStats . CommitScores ( SUMMARY );
2005-09-11 01:44:13 +00:00
2005-09-11 01:25:58 +00:00
FOREACH_HumanPlayer ( p )
2005-10-01 00:18:13 +00:00
STATSMAN -> m_CurStageStats . m_player [ p ]. CalcAwards ( p , STATSMAN -> m_CurStageStats . bGaveUp , STATSMAN -> m_CurStageStats . bUsedAutoplay );
2005-09-11 01:25:58 +00:00
2005-09-11 02:10:33 +00:00
// Run this here, so STATSMAN->m_CurStageStats is available to overlays.
ScreenWithMenuElements :: Init ();
2005-09-11 01:24:28 +00:00
//
// Calculate grades
//
Grade grade [ NUM_PLAYERS ];
FOREACH_PlayerNumber ( p )
{
if ( GAMESTATE -> IsPlayerEnabled ( p ) )
2005-09-11 01:25:58 +00:00
grade [ p ] = STATSMAN -> m_CurStageStats . m_player [ p ]. GetGrade ();
2005-09-11 01:24:28 +00:00
else
grade [ p ] = Grade_Failed ;
}
2003-01-24 02:43:07 +00:00
m_bTryExtraStage =
GAMESTATE -> HasEarnedExtraStage () &&
2005-09-11 03:15:22 +00:00
! GAMESTATE -> IsCourseMode () &&
2005-09-11 04:12:50 +00:00
! SUMMARY ;
2003-02-28 04:31:36 +00:00
2003-03-24 21:37:13 +00:00
2004-01-11 07:01:06 +00:00
//
2005-08-31 23:23:24 +00:00
// load sounds
2004-01-11 07:01:06 +00:00
//
2005-03-16 02:36:34 +00:00
m_soundStart . Load ( THEME -> GetPathS ( m_sName , "start" ) );
2004-01-11 07:01:06 +00:00
2004-05-31 06:04:30 +00:00
2003-01-24 02:43:07 +00:00
//
2003-03-24 21:37:13 +00:00
// init banner area
2003-01-24 02:43:07 +00:00
//
2003-03-28 05:47:42 +00:00
if ( SHOW_BANNER_AREA )
2003-03-24 21:37:13 +00:00
{
2005-09-11 04:12:50 +00:00
if ( SUMMARY )
2003-03-24 21:37:13 +00:00
{
2005-09-11 04:12:50 +00:00
for ( unsigned i = 0 ; i < STATSMAN -> m_CurStageStats . vpPlayedSongs . size (); i ++ )
2003-03-24 21:37:13 +00:00
{
2005-09-11 04:12:50 +00:00
Song * pSong = STATSMAN -> m_CurStageStats . vpPlayedSongs [ i ];
2003-03-24 21:37:13 +00:00
2005-09-11 04:12:50 +00:00
m_SmallBanner [ i ]. LoadFromSong ( pSong );
m_SmallBanner [ i ]. ScaleToClipped ( BANNER_WIDTH , BANNER_HEIGHT );
m_SmallBanner [ i ]. SetName ( ssprintf ( "SmallBanner%d" , i + 1 ) );
2006-09-23 03:37:45 +00:00
ActorUtil :: LoadAllCommands ( m_SmallBanner [ i ], m_sName );
SET_XY ( m_SmallBanner [ i ] );
2005-09-11 04:12:50 +00:00
this -> AddChild ( & m_SmallBanner [ i ] );
m_sprSmallBannerFrame [ i ]. Load ( THEME -> GetPathG ( m_sName , "banner frame" ) );
m_sprSmallBannerFrame [ i ] -> SetName ( ssprintf ( "SmallBanner%d" , i + 1 ) );
2006-09-23 03:37:45 +00:00
ActorUtil :: LoadAllCommands ( * m_sprSmallBannerFrame [ i ], m_sName );
SET_XY ( m_sprSmallBannerFrame [ i ] );
2005-09-11 04:12:50 +00:00
this -> AddChild ( m_sprSmallBannerFrame [ i ] );
2003-03-24 21:37:13 +00:00
}
2005-09-11 04:12:50 +00:00
}
else
{
if ( GAMESTATE -> IsCourseMode () )
m_LargeBanner . LoadFromCourse ( GAMESTATE -> m_pCurCourse );
else
m_LargeBanner . LoadFromSong ( GAMESTATE -> m_pCurSong );
m_LargeBanner . ScaleToClipped ( BANNER_WIDTH , BANNER_HEIGHT );
m_LargeBanner . SetName ( "LargeBanner" );
2006-09-23 03:37:45 +00:00
ActorUtil :: LoadAllCommands ( m_LargeBanner , m_sName );
SET_XY ( m_LargeBanner );
2005-09-11 04:12:50 +00:00
this -> AddChild ( & m_LargeBanner );
2004-08-30 04:09:23 +00:00
2005-09-11 04:12:50 +00:00
m_sprLargeBannerFrame . Load ( THEME -> GetPathG ( m_sName , "banner frame" ) );
m_sprLargeBannerFrame -> SetName ( "LargeBannerFrame" );
2006-09-23 03:37:45 +00:00
ActorUtil :: LoadAllCommands ( * m_sprLargeBannerFrame , m_sName );
SET_XY ( m_sprLargeBannerFrame );
2005-09-11 04:12:50 +00:00
this -> AddChild ( m_sprLargeBannerFrame );
2003-03-24 21:37:13 +00:00
}
2005-08-29 10:31:27 +00:00
}
2004-03-20 07:46:56 +00:00
2005-08-29 10:31:27 +00:00
{
2005-09-11 04:12:50 +00:00
if ( ! SUMMARY )
2004-03-20 07:46:56 +00:00
{
2005-09-11 04:12:50 +00:00
FOREACH_EnabledPlayer ( p )
2004-03-20 07:46:56 +00:00
{
2005-09-11 04:12:50 +00:00
m_DifficultyIcon [ p ]. Load ( THEME -> GetPathG ( m_sName , "difficulty icons" ) );
if ( GAMESTATE -> IsCourseMode () )
m_DifficultyIcon [ p ]. SetFromTrail ( p , GAMESTATE -> m_pCurTrail [ p ] );
else
m_DifficultyIcon [ p ]. SetFromSteps ( p , GAMESTATE -> m_pCurSteps [ p ] );
m_DifficultyIcon [ p ]. SetName ( ssprintf ( "DifficultyIconP%d" , p + 1 ) );
2006-09-23 03:37:45 +00:00
ActorUtil :: LoadAllCommands ( m_DifficultyIcon [ p ], m_sName );
SET_XY ( m_DifficultyIcon [ p ] );
2005-09-11 04:12:50 +00:00
this -> AddChild ( & m_DifficultyIcon [ p ] );
m_DifficultyMeter [ p ]. SetName ( ssprintf ( "DifficultyMeterP%d" , p + 1 ) );
m_DifficultyMeter [ p ]. Load ( ssprintf ( "ScreenEvaluation DifficultyMeterP%d" , p + 1 ) );
if ( GAMESTATE -> IsCourseMode () )
m_DifficultyMeter [ p ]. SetFromTrail ( GAMESTATE -> m_pCurTrail [ p ] );
else
m_DifficultyMeter [ p ]. SetFromSteps ( GAMESTATE -> m_pCurSteps [ p ] );
2006-09-23 03:37:45 +00:00
ActorUtil :: LoadAllCommands ( m_DifficultyMeter [ p ], m_sName );
SET_XY ( m_DifficultyMeter [ p ] );
2005-09-11 04:12:50 +00:00
this -> AddChild ( & m_DifficultyMeter [ p ] );
m_textPlayerOptions [ p ]. LoadFromFont ( THEME -> GetPathF ( m_sName , "PlayerOptions" ) );
m_textPlayerOptions [ p ]. SetName ( ssprintf ( "PlayerOptionsP%d" , p + 1 ) );
2006-09-23 03:37:45 +00:00
ActorUtil :: LoadAllCommands ( m_textPlayerOptions [ p ], m_sName );
SET_XY ( m_textPlayerOptions [ p ] );
2006-01-22 01:00:06 +00:00
vector < RString > v ;
2006-08-05 02:38:05 +00:00
GAMESTATE -> m_pPlayerState [ p ] -> m_PlayerOptions . GetStage (). GetLocalizedMods ( v );
2006-01-22 01:00:06 +00:00
RString sPO = join ( PLAYER_OPTIONS_SEPARATOR , v );
2005-09-11 04:12:50 +00:00
m_textPlayerOptions [ p ]. SetText ( sPO );
this -> AddChild ( & m_textPlayerOptions [ p ] );
2004-03-20 07:46:56 +00:00
}
}
2003-03-24 21:37:13 +00:00
}
//
// init grade area
//
2003-03-28 05:47:42 +00:00
if ( SHOW_GRADE_AREA )
2002-08-22 09:31:32 +00:00
{
2004-05-02 11:35:13 +00:00
FOREACH_EnabledPlayer ( p )
2003-03-25 21:17:29 +00:00
{
2005-02-15 19:44:34 +00:00
m_sprGradeFrame [ p ]. Load ( THEME -> GetPathG ( m_sName , ssprintf ( "grade frame p%d" , p + 1 )) );
2004-05-30 21:34:42 +00:00
m_sprGradeFrame [ p ] -> SetName ( ssprintf ( "GradeFrameP%d" , p + 1 ) );
2006-09-23 03:37:45 +00:00
ActorUtil :: LoadAllCommands ( * m_sprGradeFrame [ p ], m_sName );
SET_XY ( m_sprGradeFrame [ p ] );
2004-05-30 21:34:42 +00:00
this -> AddChild ( m_sprGradeFrame [ p ] );
2003-03-24 21:37:13 +00:00
2005-02-15 19:44:34 +00:00
m_Grades [ p ]. Load ( THEME -> GetPathG ( m_sName , "grades" ) );
2005-09-11 01:24:28 +00:00
m_Grades [ p ]. SetGrade ( p , grade [ p ] );
2003-04-15 02:47:24 +00:00
m_Grades [ p ]. SetName ( ssprintf ( "GradeP%d" , p + 1 ) );
2006-09-23 03:37:45 +00:00
ActorUtil :: LoadAllCommands ( m_Grades [ p ], m_sName );
SET_XY ( m_Grades [ p ] );
2003-03-28 05:47:42 +00:00
this -> AddChild ( & m_Grades [ p ] );
2003-03-25 21:17:29 +00:00
}
2003-03-24 21:37:13 +00:00
}
2003-03-28 05:47:42 +00:00
//
// init points area
//
if ( SHOW_POINTS_AREA )
{
2004-05-02 11:35:13 +00:00
FOREACH_EnabledPlayer ( p )
2003-03-28 05:47:42 +00:00
{
2005-02-15 19:44:34 +00:00
m_sprPercentFrame [ p ]. Load ( THEME -> GetPathG ( m_sName , ssprintf ( "percent frame p%d" , p + 1 )) );
2004-05-30 21:34:42 +00:00
m_sprPercentFrame [ p ] -> SetName ( ssprintf ( "PercentFrameP%d" , p + 1 ) );
2006-09-23 03:37:45 +00:00
ActorUtil :: LoadAllCommands ( * m_sprPercentFrame [ p ], m_sName );
SET_XY ( m_sprPercentFrame [ p ] );
2004-05-30 21:34:42 +00:00
this -> AddChild ( m_sprPercentFrame [ p ] );
2003-03-28 05:47:42 +00:00
2003-10-05 23:16:29 +00:00
/* Use "ScreenEvaluation Percent" for the [metric set], but position and
2003-10-05 00:33:05 +00:00
* tween it with "PercentP1X", etc. */
2005-02-16 23:03:01 +00:00
m_Percent [ p ]. SetName ( ssprintf ( "PercentP%d" , p + 1 ) );
2005-08-23 21:04:35 +00:00
m_Percent [ p ]. Load ( GAMESTATE -> m_pPlayerState [ p ], & STATSMAN -> m_CurStageStats . m_player [ p ], "ScreenEvaluation Percent" , true );
2006-09-23 03:37:45 +00:00
ActorUtil :: LoadAllCommands ( m_Percent [ p ], m_sName );
SET_XY ( m_Percent [ p ] );
2003-10-05 00:33:05 +00:00
this -> AddChild ( & m_Percent [ p ] );
2003-03-28 05:47:42 +00:00
}
}
2003-03-24 21:37:13 +00:00
//
// init bonus area
//
2003-03-28 05:47:42 +00:00
if ( SHOW_BONUS_AREA )
2003-03-24 21:37:13 +00:00
{
2004-05-02 11:35:13 +00:00
FOREACH_EnabledPlayer ( p )
2002-06-24 22:04:31 +00:00
{
2005-02-15 19:44:34 +00:00
m_sprBonusFrame [ p ]. Load ( THEME -> GetPathG ( m_sName , ssprintf ( "bonus frame p%d" , p + 1 )) );
2004-05-30 21:34:42 +00:00
m_sprBonusFrame [ p ] -> SetName ( ssprintf ( "BonusFrameP%d" , p + 1 ) );
2006-09-23 03:37:45 +00:00
ActorUtil :: LoadAllCommands ( * m_sprBonusFrame [ p ], m_sName );
SET_XY ( m_sprBonusFrame [ p ] );
2004-05-30 21:34:42 +00:00
this -> AddChild ( m_sprBonusFrame [ p ] );
2003-03-28 05:47:42 +00:00
2003-11-26 04:20:38 +00:00
for ( int r = 0 ; r < NUM_SHOWN_RADAR_CATEGORIES ; r ++ ) // foreach line
2003-03-28 05:47:42 +00:00
{
2005-02-15 19:44:34 +00:00
m_sprPossibleBar [ p ][ r ]. Load ( THEME -> GetPathG ( m_sName , ssprintf ( "bar possible p%d" , p + 1 )) );
2005-09-11 01:46:55 +00:00
m_sprPossibleBar [ p ][ r ]. SetWidth ( m_sprPossibleBar [ p ][ r ]. GetUnzoomedWidth () * STATSMAN -> m_CurStageStats . m_player [ p ]. radarPossible [ r ] );
2003-04-15 02:47:24 +00:00
m_sprPossibleBar [ p ][ r ]. SetName ( ssprintf ( "BarPossible%dP%d" , r + 1 , p + 1 ) );
2006-09-23 03:37:45 +00:00
ActorUtil :: LoadAllCommands ( m_sprPossibleBar [ p ][ r ], m_sName );
SET_XY ( m_sprPossibleBar [ p ][ r ] );
2003-03-28 05:47:42 +00:00
this -> AddChild ( & m_sprPossibleBar [ p ][ r ] );
2005-02-15 19:44:34 +00:00
m_sprActualBar [ p ][ r ]. Load ( THEME -> GetPathG ( m_sName , ssprintf ( "bar actual p%d" , p + 1 )) );
2003-07-24 13:35:20 +00:00
// should be out of the possible bar, not actual (whatever value that is at)
2005-09-11 01:46:55 +00:00
m_sprActualBar [ p ][ r ]. SetWidth ( m_sprPossibleBar [ p ][ r ]. GetUnzoomedWidth () * STATSMAN -> m_CurStageStats . m_player [ p ]. radarActual [ r ] );
2003-07-24 13:35:20 +00:00
float value = ( float ) 100 * m_sprActualBar [ p ][ r ]. GetUnzoomedWidth () / m_sprPossibleBar [ p ][ r ]. GetUnzoomedWidth ();
LOG -> Trace ( "Radar bar %d of 5 - %f percent" , r , value );
2003-04-15 02:47:24 +00:00
m_sprActualBar [ p ][ r ]. SetName ( ssprintf ( "BarActual%dP%d" , r + 1 , p + 1 ) );
2006-09-23 03:37:45 +00:00
ActorUtil :: LoadAllCommands ( m_sprActualBar [ p ][ r ], m_sName );
SET_XY ( m_sprActualBar [ p ][ r ] );
2003-07-24 13:35:20 +00:00
// .99999 is fairly close to 1.00, so we use that
2005-09-11 01:46:55 +00:00
if ( STATSMAN -> m_CurStageStats . m_player [ p ]. radarActual [ r ] > 0.99999f )
2004-12-03 05:19:46 +00:00
m_sprActualBar [ p ][ r ]. RunCommands ( BAR_ACTUAL_MAX_COMMAND );
2003-03-28 05:47:42 +00:00
this -> AddChild ( & m_sprActualBar [ p ][ r ] );
}
2002-06-24 22:04:31 +00:00
}
}
2003-03-28 05:47:42 +00:00
2003-01-24 02:43:07 +00:00
//
2003-03-28 05:47:42 +00:00
// init survived area
//
if ( SHOW_SURVIVED_AREA )
{
2004-05-02 11:35:13 +00:00
FOREACH_EnabledPlayer ( p )
2003-03-28 05:47:42 +00:00
{
2005-02-15 19:44:34 +00:00
m_sprSurvivedFrame [ p ]. Load ( THEME -> GetPathG ( m_sName , ssprintf ( "survived frame p%d" , p + 1 )) );
2004-05-30 21:34:42 +00:00
m_sprSurvivedFrame [ p ] -> SetName ( ssprintf ( "SurvivedFrameP%d" , p + 1 ) );
2006-09-23 03:37:45 +00:00
ActorUtil :: LoadAllCommands ( * m_sprSurvivedFrame [ p ], m_sName );
SET_XY ( m_sprSurvivedFrame [ p ] );
2004-05-30 21:34:42 +00:00
this -> AddChild ( m_sprSurvivedFrame [ p ] );
2003-03-28 05:47:42 +00:00
2004-07-25 07:22:31 +00:00
m_textSurvivedNumber [ p ]. LoadFromFont ( THEME -> GetPathF ( m_sName , "stage" ) );
2004-03-20 02:59:08 +00:00
m_textSurvivedNumber [ p ]. SetShadowLength ( 0 );
2003-07-06 10:01:59 +00:00
// curewater: edited the "# stages cleared" text so it deducts one if you failed.
// Should be accurate, but I'm not sure if its "standard" that (bool)true = 1. (assumption)
2005-10-02 20:01:53 +00:00
m_textSurvivedNumber [ p ]. SetText ( ssprintf ( "%02d" , STATSMAN -> m_CurStageStats . m_player [ p ]. iSongsPassed ) );
2003-04-15 02:47:24 +00:00
m_textSurvivedNumber [ p ]. SetName ( ssprintf ( "SurvivedNumberP%d" , p + 1 ) );
2006-09-23 03:37:45 +00:00
ActorUtil :: LoadAllCommands ( m_textSurvivedNumber [ p ], m_sName );
SET_XY ( m_textSurvivedNumber [ p ] );
2003-03-28 05:47:42 +00:00
this -> AddChild ( & m_textSurvivedNumber [ p ] );
}
}
2003-04-15 02:47:24 +00:00
//
// init win area
//
if ( SHOW_WIN_AREA )
{
2004-05-02 11:35:13 +00:00
FOREACH_EnabledPlayer ( p )
2003-04-15 02:47:24 +00:00
{
2004-06-01 05:46:21 +00:00
m_sprWinFrame [ p ]. Load ( THEME -> GetPathG ( m_sName , ssprintf ( "win frame p%d" , p + 1 )) );
2004-05-30 21:34:42 +00:00
m_sprWinFrame [ p ] -> SetName ( ssprintf ( "WinFrameP%d" , p + 1 ) );
2006-09-23 03:37:45 +00:00
ActorUtil :: LoadAllCommands ( * m_sprWinFrame [ p ], m_sName );
SET_XY ( m_sprWinFrame [ p ] );
2004-05-30 21:34:42 +00:00
this -> AddChild ( m_sprWinFrame [ p ] );
2003-04-15 02:47:24 +00:00
2004-06-01 05:46:21 +00:00
m_sprWin [ p ]. Load ( THEME -> GetPathG ( m_sName , ssprintf ( "win p%d 1x3" , p + 1 )) );
2003-04-15 02:47:24 +00:00
m_sprWin [ p ]. StopAnimating ();
2004-05-30 21:34:42 +00:00
int iFrame = GAMESTATE -> GetStageResult ( p );
2003-04-21 02:41:10 +00:00
m_sprWin [ p ]. SetState ( iFrame );
2003-04-15 02:47:24 +00:00
m_sprWin [ p ]. SetName ( ssprintf ( "WinP%d" , p + 1 ) );
2006-09-23 03:37:45 +00:00
ActorUtil :: LoadAllCommands ( m_sprWin [ p ], m_sName );
SET_XY ( m_sprWin [ p ] );
2003-04-15 02:47:24 +00:00
this -> AddChild ( & m_sprWin [ p ] );
}
}
2003-03-28 05:47:42 +00:00
//
// init judgment area
2003-01-24 02:43:07 +00:00
//
2005-10-09 04:30:59 +00:00
FOREACH_JudgeLine ( l )
2002-09-10 08:21:55 +00:00
{
2005-10-09 04:30:59 +00:00
if ( l == 0 && ! GAMESTATE -> ShowW1 () )
2003-04-11 00:12:07 +00:00
continue ; // skip
2003-03-28 05:47:42 +00:00
if ( SHOW_JUDGMENT ( l ) )
2002-09-10 08:21:55 +00:00
{
2005-09-10 21:00:28 +00:00
if ( SHOW_JUDGMENT_LABELS )
{
m_sprJudgeLabels [ l ]. Load ( THEME -> GetPathG ( m_sName , "judge labels" ) );
m_sprJudgeLabels [ l ]. StopAnimating ();
m_sprJudgeLabels [ l ]. SetState ( l );
2005-10-09 04:30:59 +00:00
m_sprJudgeLabels [ l ]. SetName ( JudgeLineToString ( l ) + "Label" );
2006-09-23 03:37:45 +00:00
ActorUtil :: LoadAllCommands ( m_sprJudgeLabels [ l ], m_sName );
SET_XY ( m_sprJudgeLabels [ l ] );
2005-09-10 21:00:28 +00:00
this -> AddChild ( & m_sprJudgeLabels [ l ] );
}
2003-03-28 05:47:42 +00:00
2004-05-02 11:35:13 +00:00
FOREACH_EnabledPlayer ( p )
2003-03-28 05:47:42 +00:00
{
2004-07-25 07:22:31 +00:00
m_textJudgeNumbers [ l ][ p ]. LoadFromFont ( THEME -> GetPathF ( m_sName , "judge" ) );
2004-03-20 02:59:08 +00:00
m_textJudgeNumbers [ l ][ p ]. SetShadowLength ( 0 );
2005-10-27 05:16:19 +00:00
m_textJudgeNumbers [ l ][ p ]. RunCommands ( CommonMetrics :: PLAYER_COLOR . GetValue ( p ) );
2005-10-09 04:30:59 +00:00
m_textJudgeNumbers [ l ][ p ]. SetName ( JudgeLineToString ( l ) + ssprintf ( "NumberP%d" , p + 1 ) );
2006-09-23 03:37:45 +00:00
ActorUtil :: LoadAllCommands ( m_textJudgeNumbers [ l ][ p ], m_sName );
SET_XY ( m_textJudgeNumbers [ l ][ p ] );
2003-03-28 05:47:42 +00:00
this -> AddChild ( & m_textJudgeNumbers [ l ][ p ] );
int iValue ;
switch ( l )
{
2006-07-07 19:34:51 +00:00
case JudgeLine_W1 : iValue = STATSMAN -> m_CurStageStats . m_player [ p ]. iTapNoteScores [ TNS_W1 ]; break ;
case JudgeLine_W2 : iValue = STATSMAN -> m_CurStageStats . m_player [ p ]. iTapNoteScores [ TNS_W2 ]; break ;
case JudgeLine_W3 : iValue = STATSMAN -> m_CurStageStats . m_player [ p ]. iTapNoteScores [ TNS_W3 ]; break ;
case JudgeLine_W4 : iValue = STATSMAN -> m_CurStageStats . m_player [ p ]. iTapNoteScores [ TNS_W4 ]; break ;
case JudgeLine_W5 : iValue = STATSMAN -> m_CurStageStats . m_player [ p ]. iTapNoteScores [ TNS_W5 ]; break ;
2005-10-09 04:30:59 +00:00
case JudgeLine_Miss : iValue = STATSMAN -> m_CurStageStats . m_player [ p ]. iTapNoteScores [ TNS_Miss ]; break ;
case JudgeLine_Held : iValue = STATSMAN -> m_CurStageStats . m_player [ p ]. iHoldNoteScores [ HNS_Held ]; break ;
2006-07-07 19:34:51 +00:00
case JudgeLine_MaxCombo : iValue = STATSMAN -> m_CurStageStats . m_player [ p ]. GetMaxCombo (). cnt ; break ;
DEFAULT_FAIL ( l );
2003-03-28 05:47:42 +00:00
}
2004-03-20 02:59:08 +00:00
// UGLY... generalize this
2005-10-09 04:30:59 +00:00
int iNumDigits = ( l == JudgeLine_MaxCombo ) ? MAX_COMBO_NUM_DIGITS : 4 ;
2004-03-20 02:59:08 +00:00
m_textJudgeNumbers [ l ][ p ]. SetText ( ssprintf ( "%*d" , iNumDigits , iValue ) );
2003-03-28 05:47:42 +00:00
}
2002-09-10 08:21:55 +00:00
}
}
2005-10-09 04:30:59 +00:00
FOREACH_StatLine ( l )
2003-12-16 10:04:37 +00:00
{
if ( ! SHOW_STAT ( l ) )
continue ;
2005-09-10 21:00:28 +00:00
if ( SHOW_STATS_LABELS )
{
2005-10-09 04:30:59 +00:00
m_sprStatsLabel [ l ]. Load ( THEME -> GetPathG ( m_sName , "label " + StatLineToString ( l )) );
2005-09-10 21:00:28 +00:00
m_sprStatsLabel [ l ] -> StopAnimating ();
2005-10-09 04:30:59 +00:00
m_sprStatsLabel [ l ] -> SetName ( StatLineToString ( l ) + "Label" );
2006-09-23 03:37:45 +00:00
ActorUtil :: LoadAllCommands ( * m_sprStatsLabel [ l ], m_sName );
SET_XY ( m_sprStatsLabel [ l ] );
2005-09-10 21:00:28 +00:00
this -> AddChild ( m_sprStatsLabel [ l ] );
}
2003-12-16 10:04:37 +00:00
2004-05-02 11:35:13 +00:00
FOREACH_EnabledPlayer ( p )
2003-12-16 10:04:37 +00:00
{
2005-02-15 19:44:34 +00:00
m_textStatsText [ l ][ p ]. LoadFromFont ( THEME -> GetPathF ( m_sName , "stats" ) );
2005-10-27 05:16:19 +00:00
m_textStatsText [ l ][ p ]. RunCommands ( CommonMetrics :: PLAYER_COLOR . GetValue ( p ) );
2005-10-09 04:30:59 +00:00
m_textStatsText [ l ][ p ]. SetName ( StatLineToString ( l ) + ssprintf ( "TextP%d" , p + 1 ) );
2006-09-23 03:37:45 +00:00
ActorUtil :: LoadAllCommands ( m_textStatsText [ l ][ p ], m_sName );
SET_XY ( m_textStatsText [ l ][ p ] );
2003-12-16 10:04:37 +00:00
this -> AddChild ( & m_textStatsText [ l ][ p ] );
2005-10-09 04:30:59 +00:00
static const int indeces [ NUM_StatLine ] =
2003-12-16 10:04:37 +00:00
{
2005-12-24 20:18:56 +00:00
RadarCategory_Jumps , RadarCategory_Holds , RadarCategory_Mines , RadarCategory_Hands , RadarCategory_Rolls
2003-12-16 10:04:37 +00:00
};
const int ind = indeces [ l ];
2005-09-11 01:46:55 +00:00
const int iActual = ( int ) roundf ( STATSMAN -> m_CurStageStats . m_player [ p ]. radarActual [ ind ]);
const int iPossible = ( int ) roundf ( STATSMAN -> m_CurStageStats . m_player [ p ]. radarPossible [ ind ]);
2003-12-16 10:04:37 +00:00
2004-03-20 02:59:08 +00:00
m_textStatsText [ l ][ p ]. SetText ( ssprintf ( "%3d/%3d" , iActual , iPossible ) );
2003-12-16 10:04:37 +00:00
}
}
2003-03-24 21:37:13 +00:00
//
// init score area
//
2003-03-28 05:47:42 +00:00
if ( SHOW_SCORE_AREA )
2003-03-24 21:37:13 +00:00
{
2005-02-15 19:44:34 +00:00
m_sprScoreLabel . Load ( THEME -> GetPathG ( m_sName , "score label" ) );
2004-05-30 21:34:42 +00:00
m_sprScoreLabel -> SetName ( "ScoreLabel" );
2006-09-23 03:37:45 +00:00
ActorUtil :: LoadAllCommands ( * m_sprScoreLabel , m_sName );
SET_XY ( m_sprScoreLabel );
2004-05-30 21:34:42 +00:00
this -> AddChild ( m_sprScoreLabel );
2003-03-24 21:37:13 +00:00
2004-05-02 11:35:13 +00:00
FOREACH_EnabledPlayer ( p )
2003-03-28 05:47:42 +00:00
{
2004-07-25 07:22:31 +00:00
m_textScore [ p ]. LoadFromFont ( THEME -> GetPathF ( m_sName , "score" ) );
2004-03-20 02:59:08 +00:00
m_textScore [ p ]. SetShadowLength ( 0 );
2005-10-27 05:16:19 +00:00
m_textScore [ p ]. RunCommands ( CommonMetrics :: PLAYER_COLOR . GetValue ( p ) );
2003-04-15 02:47:24 +00:00
m_textScore [ p ]. SetName ( ssprintf ( "ScoreNumberP%d" , p + 1 ) );
2006-09-23 03:37:45 +00:00
ActorUtil :: LoadAllCommands ( m_textScore [ p ], m_sName );
SET_XY ( m_textScore [ p ] );
2005-09-11 01:46:55 +00:00
m_textScore [ p ]. SetText ( ssprintf ( "%*.0i" , NUM_SCORE_DIGITS , STATSMAN -> m_CurStageStats . m_player [ p ]. iScore ) );
2003-03-28 23:13:32 +00:00
this -> AddChild ( & m_textScore [ p ] );
2003-03-28 05:47:42 +00:00
}
}
2003-12-19 09:30:54 +00:00
if ( SHOW_TOTAL_SCORE_AREA )
{
2005-02-15 19:44:34 +00:00
m_sprTotalScoreLabel . Load ( THEME -> GetPathG ( m_sName , "totalscore label" ) );
2004-05-30 21:34:42 +00:00
m_sprTotalScoreLabel -> SetName ( "TotalScoreLabel" );
2006-09-23 03:37:45 +00:00
ActorUtil :: LoadAllCommands ( * m_sprTotalScoreLabel , m_sName );
SET_XY ( m_sprTotalScoreLabel );
2004-05-30 21:34:42 +00:00
this -> AddChild ( m_sprTotalScoreLabel );
2003-12-19 09:30:54 +00:00
2004-05-02 11:35:13 +00:00
FOREACH_EnabledPlayer ( p )
2003-12-19 09:30:54 +00:00
{
int iTotalScore = 0 ;
2005-02-16 03:25:45 +00:00
for ( unsigned i = 0 ; i < STATSMAN -> m_vPlayedStageStats . size (); i ++ )
iTotalScore += STATSMAN -> m_vPlayedStageStats [ i ]. m_player [ p ]. iScore ;
2003-12-19 09:30:54 +00:00
2005-09-11 01:46:55 +00:00
//iTotalScore += STATSMAN->m_CurStageStats.m_player[p].iScore;
2003-12-19 09:30:54 +00:00
2004-07-25 07:22:31 +00:00
m_textTotalScore [ p ]. LoadFromFont ( THEME -> GetPathF ( m_sName , "totalscore" ) );
2004-03-20 02:59:08 +00:00
m_textTotalScore [ p ]. SetShadowLength ( 0 );
2005-10-27 05:16:19 +00:00
m_textTotalScore [ p ]. RunCommands ( CommonMetrics :: PLAYER_COLOR . GetValue ( p ) );
2003-12-19 09:30:54 +00:00
m_textTotalScore [ p ]. SetName ( ssprintf ( "TotalScoreNumberP%d" , p + 1 ) );
m_textTotalScore [ p ]. SetText ( ssprintf ( "%*.0i" , NUM_SCORE_DIGITS + 2 , iTotalScore ) );
2006-09-23 03:37:45 +00:00
ActorUtil :: LoadAllCommands ( m_textTotalScore [ p ], m_sName );
SET_XY ( m_textTotalScore [ p ] );
2003-12-19 09:30:54 +00:00
this -> AddChild ( & m_textTotalScore [ p ] );
}
}
2003-03-28 05:47:42 +00:00
//
// init time area
//
if ( SHOW_TIME_AREA )
{
2005-02-15 19:44:34 +00:00
m_sprTimeLabel . Load ( THEME -> GetPathG ( m_sName , "time label" ) );
2004-05-30 21:34:42 +00:00
m_sprTimeLabel -> SetName ( "TimeLabel" );
2006-09-23 03:37:45 +00:00
ActorUtil :: LoadAllCommands ( * m_sprTimeLabel , m_sName );
SET_XY ( m_sprTimeLabel );
2004-05-30 21:34:42 +00:00
this -> AddChild ( m_sprTimeLabel );
2003-03-28 05:47:42 +00:00
2004-05-02 11:35:13 +00:00
FOREACH_EnabledPlayer ( p )
2003-03-28 05:47:42 +00:00
{
2004-07-25 07:22:31 +00:00
m_textTime [ p ]. LoadFromFont ( THEME -> GetPathF ( m_sName , "time" ) );
2004-03-20 02:59:08 +00:00
m_textTime [ p ]. SetShadowLength ( 0 );
2005-10-27 05:16:19 +00:00
m_textTime [ p ]. RunCommands ( CommonMetrics :: PLAYER_COLOR . GetValue ( p ) );
2003-12-21 04:19:51 +00:00
m_textTime [ p ]. SetName ( ssprintf ( "TimeNumberP%d" , p + 1 ) );
2006-09-23 03:37:45 +00:00
ActorUtil :: LoadAllCommands ( m_textTime [ p ], m_sName );
SET_XY ( m_textTime [ p ] );
2005-09-11 01:46:55 +00:00
m_textTime [ p ]. SetText ( SecondsToMMSSMsMs ( STATSMAN -> m_CurStageStats . m_player [ p ]. fAliveSeconds ) );
2003-03-28 23:13:32 +00:00
this -> AddChild ( & m_textTime [ p ] );
2003-03-28 05:47:42 +00:00
}
}
//
2005-09-10 16:37:58 +00:00
// init records area
2003-03-28 05:47:42 +00:00
//
2005-09-10 16:37:58 +00:00
if ( SHOW_RECORDS_AREA )
2003-03-28 05:47:42 +00:00
{
2005-09-10 16:37:58 +00:00
FOREACH_EnabledPlayer ( p )
2003-03-24 21:37:13 +00:00
{
2005-09-11 01:44:13 +00:00
if ( STATSMAN -> m_CurStageStats . m_player [ p ]. m_iMachineHighScoreIndex != - 1 )
2005-09-10 16:37:58 +00:00
{
2005-09-11 01:44:13 +00:00
m_sprMachineRecord [ p ]. Load ( THEME -> GetPathG ( m_sName , ssprintf ( "MachineRecord %02d" , STATSMAN -> m_CurStageStats . m_player [ p ]. m_iMachineHighScoreIndex + 1 ) ) );
2005-09-10 16:37:58 +00:00
m_sprMachineRecord [ p ] -> SetName ( ssprintf ( "MachineRecordP%d" , p + 1 ) );
2006-09-23 03:37:45 +00:00
ActorUtil :: LoadAllCommands ( * m_sprMachineRecord [ p ], m_sName );
SET_XY ( m_sprMachineRecord [ p ] );
2005-09-10 16:37:58 +00:00
this -> AddChild ( m_sprMachineRecord [ p ] );
}
2005-09-11 01:44:13 +00:00
if ( STATSMAN -> m_CurStageStats . m_player [ p ]. m_iPersonalHighScoreIndex != - 1 )
2005-09-10 16:37:58 +00:00
{
2005-09-11 01:44:13 +00:00
m_sprPersonalRecord [ p ]. Load ( THEME -> GetPathG ( m_sName , ssprintf ( "PersonalRecord %02d" , STATSMAN -> m_CurStageStats . m_player [ p ]. m_iPersonalHighScoreIndex + 1 ) ) );
2005-09-10 16:37:58 +00:00
m_sprPersonalRecord [ p ] -> SetName ( ssprintf ( "PersonalRecordP%d" , p + 1 ) );
2006-09-23 03:37:45 +00:00
ActorUtil :: LoadAllCommands ( * m_sprPersonalRecord [ p ], m_sName );
SET_XY ( m_sprPersonalRecord [ p ] );
2005-09-10 16:37:58 +00:00
this -> AddChild ( m_sprPersonalRecord [ p ] );
}
2003-03-24 21:37:13 +00:00
}
}
2002-09-09 05:22:02 +00:00
2003-10-19 21:38:11 +00:00
bool bOneHasNewTopRecord = false ;
2004-05-04 00:00:17 +00:00
FOREACH_PlayerNumber ( p )
2005-09-11 01:44:13 +00:00
if ( GAMESTATE -> IsPlayerEnabled ( p ) && ( STATSMAN -> m_CurStageStats . m_player [ p ]. m_iMachineHighScoreIndex != - 1 || STATSMAN -> m_CurStageStats . m_player [ p ]. m_iPersonalHighScoreIndex != - 1 ) )
2004-05-04 00:00:17 +00:00
bOneHasNewTopRecord = true ;
2004-01-22 02:39:55 +00:00
2005-08-14 11:38:31 +00:00
Grade best_grade = Grade_NoData ;
2004-05-04 00:00:17 +00:00
FOREACH_PlayerNumber ( p )
2005-09-11 01:24:28 +00:00
best_grade = min ( best_grade , grade [ p ] );
2002-06-24 22:04:31 +00:00
2003-10-17 08:03:46 +00:00
if ( PREFSMAN -> m_bAllowExtraStage && m_bTryExtraStage )
2002-06-24 22:04:31 +00:00
{
2005-02-15 19:44:34 +00:00
m_sprTryExtraStage . Load ( THEME -> GetPathG ( m_sName , GAMESTATE -> IsExtraStage () ? "try extra2" : "try extra1" ) );
2004-05-30 21:34:42 +00:00
m_sprTryExtraStage -> SetName ( "TryExtraStage" );
2006-09-23 03:37:45 +00:00
ActorUtil :: LoadAllCommands ( * m_sprTryExtraStage , m_sName );
SET_XY ( m_sprTryExtraStage );
2004-05-30 21:34:42 +00:00
this -> AddChild ( m_sprTryExtraStage );
2002-06-24 22:04:31 +00:00
2003-03-12 01:26:44 +00:00
if ( GAMESTATE -> IsExtraStage () )
2005-02-15 19:44:34 +00:00
SOUND -> PlayOnce ( THEME -> GetPathS ( m_sName , "try extra2" ) );
2003-03-12 01:26:44 +00:00
else
2005-02-15 19:44:34 +00:00
SOUND -> PlayOnce ( THEME -> GetPathS ( m_sName , "try extra1" ) );
2002-06-24 22:04:31 +00:00
}
2003-10-19 21:38:11 +00:00
else if ( bOneHasNewTopRecord && ANNOUNCER -> HasSoundsFor ( "evaluation new record" ) )
2002-09-09 05:22:02 +00:00
{
2003-07-26 22:53:22 +00:00
SOUND -> PlayOnceFromDir ( ANNOUNCER -> GetPathTo ( "evaluation new record" ) );
2002-09-09 05:22:02 +00:00
}
2002-06-24 22:04:31 +00:00
else
2003-03-28 05:47:42 +00:00
{
2005-09-11 04:12:50 +00:00
if ( SUMMARY || GAMESTATE -> IsCourseMode () )
{
SOUND -> PlayOnceFromDir ( ANNOUNCER -> GetPathTo ( "evaluation final " + GradeToOldString ( best_grade )) );
}
else
2002-06-24 22:04:31 +00:00
{
2003-05-13 13:35:32 +00:00
switch ( GAMESTATE -> m_PlayMode )
{
2003-08-19 04:27:50 +00:00
case PLAY_MODE_BATTLE :
2003-05-13 13:35:32 +00:00
{
2003-06-30 18:08:27 +00:00
bool bWon = GAMESTATE -> GetStageResult ( GAMESTATE -> m_MasterPlayerNumber ) == RESULT_WIN ;
2003-05-13 13:35:32 +00:00
if ( bWon )
2003-07-26 22:53:22 +00:00
SOUND -> PlayOnceFromDir ( ANNOUNCER -> GetPathTo ( "evaluation win" ) );
2003-05-13 13:35:32 +00:00
else
2003-07-26 22:53:22 +00:00
SOUND -> PlayOnceFromDir ( ANNOUNCER -> GetPathTo ( "evaluation lose" ) );
2003-05-13 13:35:32 +00:00
}
break ;
default :
2004-04-23 02:37:09 +00:00
SOUND -> PlayOnceFromDir ( ANNOUNCER -> GetPathTo ( "evaluation " + GradeToOldString ( best_grade )) );
2003-05-13 13:35:32 +00:00
break ;
}
2002-06-24 22:04:31 +00:00
}
}
2004-01-20 07:09:44 +00:00
switch ( best_grade )
2002-10-18 19:01:32 +00:00
{
2005-08-14 11:38:31 +00:00
case Grade_Tier01 :
case Grade_Tier02 :
case Grade_Tier03 :
2003-04-15 02:47:24 +00:00
this -> PostScreenMessage ( SM_PlayCheer , CHEER_DELAY_SECONDS );
2002-10-18 19:01:32 +00:00
break ;
}
2004-05-02 03:01:27 +00:00
this -> SortByDrawOrder ();
2002-08-27 16:53:25 +00:00
2005-03-21 20:14:08 +00:00
this -> PostScreenMessage ( SM_AddBonus , 1.5f );
2005-09-10 23:28:23 +00:00
}
2002-06-24 22:04:31 +00:00
2005-09-05 02:26:50 +00:00
void ScreenEvaluation :: Input ( const InputEventPlus & input )
2002-06-24 22:04:31 +00:00
{
2004-05-01 23:19:33 +00:00
if ( IsTransitioning () )
2002-06-24 22:04:31 +00:00
return ;
2005-09-05 02:26:50 +00:00
if ( input . GameI . IsValid () )
2004-02-12 09:44:16 +00:00
{
2005-09-05 02:26:50 +00:00
if ( CodeDetector :: EnteredCode ( input . GameI . controller , CODE_SAVE_SCREENSHOT1 ) ||
CodeDetector :: EnteredCode ( input . GameI . controller , CODE_SAVE_SCREENSHOT2 ) )
2004-02-12 09:44:16 +00:00
{
2006-09-13 10:02:58 +00:00
PlayerNumber pn = input . pn ;
2004-02-12 09:44:16 +00:00
if ( ! m_bSavedScreenshot [ pn ] && // only allow one screenshot
2005-05-09 08:44:01 +00:00
PROFILEMAN -> IsPersistentProfile ( pn ) )
2004-02-12 09:44:16 +00:00
{
2005-01-27 20:06:20 +00:00
if ( PROFILEMAN -> ProfileWasLoadedFromMemoryCard ( pn ) )
2004-10-03 05:27:52 +00:00
MEMCARDMAN -> MountCard ( pn );
2004-02-22 05:04:11 +00:00
Profile * pProfile = PROFILEMAN -> GetProfile ( pn );
2006-01-22 01:00:06 +00:00
RString sDir = PROFILEMAN -> GetProfileDir (( ProfileSlot ) pn ) + "Screenshots/" ;
2004-02-22 05:04:11 +00:00
int iScreenshotIndex = pProfile -> GetNextScreenshotIndex ();
2006-01-22 01:00:06 +00:00
RString sFileName = StepMania :: SaveScreenshot ( sDir , true , true , iScreenshotIndex );
RString sPath = sDir + sFileName ;
2004-02-17 01:16:57 +00:00
if ( ! sFileName . empty () )
{
2005-10-17 00:50:06 +00:00
const HighScore & hs = STATSMAN -> m_CurStageStats . m_player [ pn ]. m_HighScore ;
2004-06-12 07:01:07 +00:00
Screenshot screenshot ;
2004-02-17 01:16:57 +00:00
screenshot . sFileName = sFileName ;
2006-05-16 00:47:02 +00:00
screenshot . sMD5 = CRYPTMAN -> GetMD5ForFile ( sPath );
2004-06-12 07:01:07 +00:00
screenshot . highScore = hs ;
2004-02-17 01:16:57 +00:00
pProfile -> AddScreenshot ( screenshot );
}
2005-04-28 20:42:42 +00:00
if ( PROFILEMAN -> ProfileWasLoadedFromMemoryCard ( pn ) )
MEMCARDMAN -> UnmountCard ( pn );
2004-02-12 09:44:16 +00:00
m_bSavedScreenshot [ pn ] = true ;
return ; // handled
}
}
}
2005-09-05 02:26:50 +00:00
ScreenWithMenuElements :: Input ( input );
2002-06-24 22:04:31 +00:00
}
void ScreenEvaluation :: HandleScreenMessage ( const ScreenMessage SM )
{
2005-03-23 08:48:38 +00:00
if ( SM == SM_MenuTimer )
2002-06-24 22:04:31 +00:00
{
2004-01-12 23:18:38 +00:00
EndScreen ();
2005-03-23 08:48:38 +00:00
}
else if ( SM == SM_PlayCheer )
{
2003-07-26 22:53:22 +00:00
SOUND -> PlayOnceFromDir ( ANNOUNCER -> GetPathTo ( "evaluation cheer" ) );
2005-03-23 08:48:38 +00:00
}
else if ( SM == SM_AddBonus )
{
2005-03-21 20:14:08 +00:00
FOREACH_EnabledPlayer ( p )
{
if ( STATSMAN -> m_CurStageStats . m_player [ p ]. iBonus == 0 )
continue ;
if ( GAMESTATE -> IsCourseMode () )
continue ;
int increment = STATSMAN -> m_CurStageStats . m_player [ p ]. iBonus / 10 ;
if ( increment < 1 )
increment = min ( 1024 , STATSMAN -> m_CurStageStats . m_player [ p ]. iBonus );
STATSMAN -> m_CurStageStats . m_player [ p ]. iBonus -= increment ;
STATSMAN -> m_CurStageStats . m_player [ p ]. iScore += increment ;
if ( SHOW_SCORE_AREA )
m_textScore [ p ]. SetText ( ssprintf ( "%*.0i" , NUM_SCORE_DIGITS , STATSMAN -> m_CurStageStats . m_player [ p ]. iScore ) );
}
2002-06-24 22:04:31 +00:00
}
2005-07-12 06:56:09 +00:00
ScreenWithMenuElements :: HandleScreenMessage ( SM );
2002-06-24 22:04:31 +00:00
}
2006-09-15 01:47:24 +00:00
void ScreenEvaluation :: MenuBack ( const InputEventPlus & input )
2002-06-24 22:04:31 +00:00
{
2006-09-15 01:47:24 +00:00
MenuStart ( input );
2002-06-24 22:04:31 +00:00
}
2006-09-15 01:47:24 +00:00
void ScreenEvaluation :: MenuStart ( const InputEventPlus & input )
2004-01-12 23:18:38 +00:00
{
m_soundStart . Play ();
EndScreen ();
}
void ScreenEvaluation :: EndScreen ()
2002-06-24 22:04:31 +00:00
{
2004-05-24 06:10:11 +00:00
FOREACH_PlayerNumber ( p )
2003-03-25 22:23:58 +00:00
m_Grades [ p ]. SettleImmediately ();
2005-10-13 22:17:13 +00:00
StartTransitioningScreen ( SM_GoToNextScreen );
2002-06-24 22:04:31 +00:00
}
2004-06-08 05:22:33 +00:00
/*
* (c) 2001-2004 Chris Danford
* 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.
*/