diff --git a/stepmania/NEWS b/stepmania/NEWS index e1afcb071e..694f0f9f64 100644 --- a/stepmania/NEWS +++ b/stepmania/NEWS @@ -1,4 +1,4 @@ -------------------------CVS after 3.00 beta 6---------------- +------------------------CVS after 3.00 beta 6---------------- NEW FEATURE: Delayed escape/back key is now optional. CHANGE: Slow-motion is now on ~ instead of shift, since we use shift elsewhere now. @@ -79,6 +79,7 @@ BUG FIX: Timer expiration while in Roulette spinning now resets the timer to force a selection. BUG FIX: OnlyDedicatedMenuButtons option now correctly saves on exit. BUG FIX: Announcer now says "danger comments" at the appropriate time. +BUG FIX: Song titles on the Select Group screen are now cropped. ------------------------CVS after 3.00 beta 5---------------- OPTIMIZATION: Much faster song loading. diff --git a/stepmania/README-FIRST.TXT b/stepmania/README-FIRST.TXT index 3ea92c4695..680c28ab9a 100644 --- a/stepmania/README-FIRST.TXT +++ b/stepmania/README-FIRST.TXT @@ -45,6 +45,8 @@ Table of Contents 21. Building StepMania from CVS Source 22. Thanks +See the file "NEWS" for version history. + ************************************************************ 1. About StepMania ************************************************************ diff --git a/stepmania/Themes/default/metrics.ini b/stepmania/Themes/default/metrics.ini index 245b269b5b..ba15ced4b0 100644 --- a/stepmania/Themes/default/metrics.ini +++ b/stepmania/Themes/default/metrics.ini @@ -1,8 +1,8 @@ [General] -UseCautionOrSelectPlayer=0 -UseNormalOrEZ2SelectStyle=0 -SkipSelectDifficulty=0 -StageScreenType=0 +CautionType=1 // 0 for skip, 1 for DDR caution, 2 for Ez2's SelectPlayer +SelectStyleType=0 // 0 for MAX type, 1 for 5th type, 2 for EZ2 type +SelectDifficultyType=1 // 0 for skip, 1 for MAX type +StageType=0 // 0 for MAX, 1 for Pump, 2 for EZ2 [TitleMenu] ChoicesX=320 @@ -83,7 +83,7 @@ ButtonSpacingY=26 ContentsX=320 ContentsY=260 TitlesStartX=20 -TitlesStartY=280 +TitlesStartY=276 TitlesSpacingX=200 TitlesColumns=3 TitlesRows=10 @@ -134,6 +134,28 @@ SongOptionsY=298 HelpText=! or " change music Hold ! and " then press START to change sort::## easier difficulty $$ harder difficulty::#$#$ to change sort TimerSeconds=60 +[SelectCourse] +BannerFrameX=160 +BannerFrameY=118 +BannerX=150 +BannerY=132 +BannerWidth=286 +BannerHeight=92 +StagesX=58 +StagesY=74 +TimeX=192 +TimeY=74 +ContentsX=160 +ContentsY=320 +WheelX=480 +WheelY=248 +ScoreP1X=520 +ScoreP1Y=210 +ScoreP2X=520 +ScoreP2Y=286 +HelpText=Use ! " to select, then press START +TimerSeconds=60 + [Gameplay] TopFrameX=320 TopFrameY=36 @@ -152,11 +174,11 @@ LifeP2ExtraY=450 StageX=320 StageY=54 StageExtraY=422 -SongNumberP1X=288 -SongNumberP1Y=40 +SongNumberP1X=290 +SongNumberP1Y=54 SongNumberP1ExtraY=440 -SongNumberP2X=352 -SongNumberP2Y=40 +SongNumberP2X=350 +SongNumberP2Y=54 SongNumberP2ExtraY=440 ScoreP1X=100 ScoreP1Y=442 @@ -198,25 +220,57 @@ StageY=64 GradeP1X=94 GradeP2X=546 GradeY=100 +PercentBaseP1X=130 +PercentBaseP2X=582 +PercentBaseY=134 JudgeLabelsX=320 -JudgeNumbersP1X=232 -JudgeNumbersP2X=408 -JudgeStartY=170 -JudgeSpacingY=32 +PerfectP1X=230 +PerfectP2X=410 +PerfectY=176 +GreatP1X=230 +GreatP2X=410 +GreatY=208 +GoodP1X=230 +GoodP2X=410 +GoodY=240 +BooP1X=230 +BooP2X=410 +BooY=272 +MissP1X=230 +MissP2X=410 +MissY=304 +OKP1X=230 +OKP2X=410 +OKY=336 +MaxComboP1X=134 +MaxComboP2X=578 +MaxComboY=334 ScoreLabelsX=320 ScoreNumbersP1X=150 ScoreNumbersP2X=490 ScoreY=378 -BonusP1X=100 -BonusP2X=540 -BonusY=250 +BonusP1X=96 +BonusP2X=544 +BonusY=256 +BarP1BaseX=176 +BarP2BaseX=466 +BarP1Rotation=3.1415 +BarP2Rotation=0 +BarStartY=194 +BarSpacingY=27 +BarWidth=106 +BarHeight=16 +SongsSurvivedP1X=96 +SongsSurvivedP2X=544 +SongsSurvivedY=240 NewRecordP1X=150 NewRecordP2X=490 -NewRecordY=120 +NewRecordY=404 TryExtraStageX=320 TryExtraStageY=420 HelpText=Press START to continue TimerSeconds=40 +SpinGrades=1 [Other] StatsX=632 @@ -233,10 +287,10 @@ SectionNameX=-30 SectionZoom=1.0 RouletteX=-30 RouletteZoom=1.3 -CourseX=-30 +CourseX=-130 CourseZoom=1.3 -GradeP1X=86 -GradeP2Y=112 +GradeP1X=82 +GradeP2Y=118 [MusicWheel] FadeSeconds=1 diff --git a/stepmania/src/Background.cpp b/stepmania/src/Background.cpp index 61c6382d2f..d8df60c8d2 100644 --- a/stepmania/src/Background.cpp +++ b/stepmania/src/Background.cpp @@ -97,12 +97,12 @@ void Background::Unload() m_BackgroundAnimations.RemoveAll(); } -void Background::LoadFromSong( Song* pSong, bool bDisableVisualizations ) +void Background::LoadFromSong( Song* pSong ) { /* Endless was crashing due to this; is there any reason not to * fix it this way? -glenn */ + /* Correct. I added the same chage. -Chris */ Unload(); -// ASSERT( m_BackgroundAnimations.GetSize() == 0 ); // forgot to call Unload() after song end // // figure out what BackgroundMode to use diff --git a/stepmania/src/Background.h b/stepmania/src/Background.h index 19fa457230..4d44f7e972 100644 --- a/stepmania/src/Background.h +++ b/stepmania/src/Background.h @@ -35,7 +35,7 @@ public: Background(); ~Background(); - virtual void LoadFromSong( Song *pSong, bool bDisableVisualizations = false ); + virtual void LoadFromSong( Song *pSong ); virtual void Unload(); // call this on before calling load virtual void Update( float fDeltaTime ); diff --git a/stepmania/src/BitmapText.cpp b/stepmania/src/BitmapText.cpp index b2b8689151..c58db27f53 100644 --- a/stepmania/src/BitmapText.cpp +++ b/stepmania/src/BitmapText.cpp @@ -131,6 +131,20 @@ void BitmapText::SetText( CString sText ) } +void BitmapText::CropToWidth( int iMaxWidthInSourcePixels ) +{ + iMaxWidthInSourcePixels = max( 0, iMaxWidthInSourcePixels ); + + for( int l=0; l iMaxWidthInSourcePixels ) + { + m_iLineLengths[l]--; + m_iLineWidths[l] = m_pFont->GetLineWidthInSourcePixels( m_szTextLines[l], m_iLineLengths[l] ); + } + } + +} // draw text at x, y using colorTop blended down to colorBottom, with size multiplied by scale void BitmapText::DrawPrimitives() @@ -158,9 +172,9 @@ void BitmapText::DrawPrimitives() int iY; // the center position of the first row of characters switch( m_VertAlign ) { - case align_bottom: iY = -(m_iNumLines-1) * iHeight; break; - case align_middle: iY = -(m_iNumLines-1) * iHeight/2; break; - case align_top: iY = 0; break; + case align_bottom: iY = -(m_iNumLines) * iHeight + iHeight/2; break; + case align_middle: iY = -(m_iNumLines-1) * iHeight/2; break; + case align_top: iY = + iHeight/2; break; default: ASSERT( false ); } diff --git a/stepmania/src/BitmapText.h b/stepmania/src/BitmapText.h index 78c96ca71b..e7aae21f40 100644 --- a/stepmania/src/BitmapText.h +++ b/stepmania/src/BitmapText.h @@ -32,6 +32,7 @@ public: void SetText( CString sText ); int GetWidestLineWidthInSourcePixels() { return m_iWidestLineWidth; }; + void CropToWidth( int iWidthInSourcePixels ); virtual void DrawPrimitives(); diff --git a/stepmania/src/Combo.cpp b/stepmania/src/Combo.cpp index df3a5aaa10..0510fb9e30 100644 --- a/stepmania/src/Combo.cpp +++ b/stepmania/src/Combo.cpp @@ -30,7 +30,7 @@ Combo::Combo() m_textComboNumber.LoadFromFont( THEME->GetPathTo("Fonts","combo numbers") ); m_textComboNumber.TurnShadowOn(); m_textComboNumber.SetHorizAlign( Actor::align_right ); - m_textComboNumber.SetX( -0 ); + m_textComboNumber.SetX( 0 ); m_textComboNumber.SetDiffuseColor( D3DXCOLOR(1,1,1,0) ); // invisible m_sprCombo.SetDiffuseColor( D3DXCOLOR(1,1,1,0) ); // invisible @@ -77,7 +77,7 @@ void Combo::ContinueCombo() m_sprCombo.SetDiffuseColor( D3DXCOLOR(1,1,1,1) ); // visible m_textComboNumber.SetText( ssprintf("%d", m_iCurCombo) ); - float fNewZoom = min( 0.5f + m_iCurCombo/800.0f, 1.1f ); + float fNewZoom = min( 0.5f + m_iCurCombo/800.0f, 1.0f ); m_textComboNumber.SetZoom( fNewZoom ); //this->SetZoom( 1.2f ); diff --git a/stepmania/src/FadingBanner.cpp b/stepmania/src/FadingBanner.cpp index 58bc186047..b8e7412e0f 100644 --- a/stepmania/src/FadingBanner.cpp +++ b/stepmania/src/FadingBanner.cpp @@ -72,7 +72,7 @@ void FadingBanner::SetRoulette() m_Banner[0].LoadRoulette(); } -void FadingBanner::SetFromCourse( Course *pCourse ) +void FadingBanner::SetFromCourse( Course* pCourse ) { BeforeChange(); m_Banner[0].LoadFromCourse( pCourse ); diff --git a/stepmania/src/FadingBanner.h b/stepmania/src/FadingBanner.h index 9eb090bb32..6cad3e972a 100644 --- a/stepmania/src/FadingBanner.h +++ b/stepmania/src/FadingBanner.h @@ -12,7 +12,8 @@ #include "Banner.h" #include "ActorFrame.h" - +class Song; +class Course; class FadingBanner : public ActorFrame { @@ -26,8 +27,7 @@ public: void SetFromSong( Song* pSong ); void SetFromGroup( const CString &sGroupName ); void SetRoulette(); - void SetFromCourse( Course *pCourse ); - //void SetFromTexture( const CString &sTexturePath ); + void SetFromCourse( Course* pCourse ); protected: void BeforeChange(); diff --git a/stepmania/src/Font.cpp b/stepmania/src/Font.cpp index 4f21c98492..65d0bc0c71 100644 --- a/stepmania/src/Font.cpp +++ b/stepmania/src/Font.cpp @@ -78,7 +78,7 @@ Font::Font( const CString &sFontFilePath ) // sanity check if( sCharacters.GetLength() != m_pTexture->GetNumFrames() ) throw RageException( "The characters in '%s' does not match the number of frames in the texture." - "The font has %d frames, and the texture has %d frames.", + "The font has %d characters, and the texture has %d frames.", m_sFontFilePath, sCharacters.GetLength(), m_pTexture->GetNumFrames() ); // set the char to frame number map diff --git a/stepmania/src/GradeDisplay.cpp b/stepmania/src/GradeDisplay.cpp index 767f1a3778..a464c62175 100644 --- a/stepmania/src/GradeDisplay.cpp +++ b/stepmania/src/GradeDisplay.cpp @@ -30,7 +30,7 @@ GradeDisplay::GradeDisplay() m_fTimeLeftInScroll = 0; m_bDoScrolling = false; - SetGrade( GRADE_NO_DATA ); + SetGrade( PLAYER_1, GRADE_NO_DATA ); } void GradeDisplay::Update( float fDeltaTime ) @@ -65,7 +65,7 @@ void GradeDisplay::DrawPrimitives() Sprite::DrawPrimitives(); } -void GradeDisplay::SetGrade( Grade g ) +void GradeDisplay::SetGrade( PlayerNumber p, Grade g ) { m_Grade = g; @@ -74,18 +74,20 @@ void GradeDisplay::SetGrade( Grade g ) SetDiffuseColor( D3DXCOLOR(1,1,1,1) ); + // Ugly... This has to handle cases where the sprite has 7, 8, 14, or 16 states + int iNumCols = (this->GetNumStates()>8) ? 2 : 1; switch( g ) { - case GRADE_AAA: SetState(0); break; - case GRADE_AA: SetState(1); break; - case GRADE_A: SetState(2); break; - case GRADE_B: SetState(3); break; - case GRADE_C: SetState(4); break; - case GRADE_D: SetState(5); break; - case GRADE_E: SetState(6); break; + case GRADE_AAA: SetState( 0*iNumCols+p ); break; + case GRADE_AA: SetState( 1*iNumCols+p ); break; + case GRADE_A: SetState( 2*iNumCols+p ); break; + case GRADE_B: SetState( 3*iNumCols+p ); break; + case GRADE_C: SetState( 4*iNumCols+p ); break; + case GRADE_D: SetState( 5*iNumCols+p ); break; + case GRADE_E: SetState( 6*iNumCols+p ); break; case GRADE_NO_DATA: - if( this->GetNumStates() == 8 ) - SetState(7); + if( this->GetNumStates()%8 == 0 ) + SetState( 7*iNumCols+p ); else SetDiffuseColor( D3DXCOLOR(1,1,1,0) ); // don't show anything break; diff --git a/stepmania/src/GradeDisplay.h b/stepmania/src/GradeDisplay.h index b5577880f6..713c13da8c 100644 --- a/stepmania/src/GradeDisplay.h +++ b/stepmania/src/GradeDisplay.h @@ -25,7 +25,7 @@ public: virtual void Update( float fDeltaTime ); virtual void DrawPrimitives(); - void SetGrade( Grade g ); + void SetGrade( PlayerNumber p, Grade g ); void SpinAndSettleOn( Grade g ); void SettleImmediately(); diff --git a/stepmania/src/MusicWheel.cpp b/stepmania/src/MusicWheel.cpp index 627c85a07b..b83ea8e891 100644 --- a/stepmania/src/MusicWheel.cpp +++ b/stepmania/src/MusicWheel.cpp @@ -111,7 +111,7 @@ WheelItemDisplay::WheelItemDisplay() for( int p=0; pGetPathTo("Graphics","select music small grades 1x8") ); + m_GradeDisplay[p].Load( THEME->GetPathTo("Graphics","select music small grades 2x8") ); m_GradeDisplay[p].SetZoom( 1.0f ); m_GradeDisplay[p].SetXY( p==PLAYER_1 ? GRADE_P1_X : GRADE_P2_X, 0 ); } @@ -205,12 +205,12 @@ void WheelItemDisplay::RefreshGrades() { const DifficultyClass dc = GAMESTATE->m_PreferredDifficultyClass[p]; const Grade grade = m_pSong->GetGradeForDifficultyClass( GAMESTATE->GetCurrentStyleDef()->m_NotesType, dc ); - m_GradeDisplay[p].SetGrade( grade ); - m_GradeDisplay[p].SetDiffuseColor( PlayerToColor((PlayerNumber)p) ); + m_GradeDisplay[p].SetGrade( (PlayerNumber)p, grade ); + //m_GradeDisplay[p].SetDiffuseColor( PlayerToColor((PlayerNumber)p) ); } else // this is a section display { - m_GradeDisplay[p].SetGrade( GRADE_NO_DATA ); + m_GradeDisplay[p].SetGrade( (PlayerNumber)p, GRADE_NO_DATA ); } } diff --git a/stepmania/src/RageDisplay.cpp b/stepmania/src/RageDisplay.cpp index ac0005dc66..2ca24bb60d 100644 --- a/stepmania/src/RageDisplay.cpp +++ b/stepmania/src/RageDisplay.cpp @@ -98,7 +98,7 @@ RageDisplay::RageDisplay( HWND hWnd ) int RageDisplay::MaxRefresh(int iWidth, int iHeight) const { - int mx = D3DPRESENT_RATE_DEFAULT; + UINT mx = D3DPRESENT_RATE_DEFAULT; for( UINT u=0; uGetAdapterModeCount(D3DADAPTER_DEFAULT); u++ ) { D3DDISPLAYMODE mode; diff --git a/stepmania/src/RageInput.cpp b/stepmania/src/RageInput.cpp index 60f73762d5..f7e20f0d0b 100644 --- a/stepmania/src/RageInput.cpp +++ b/stepmania/src/RageInput.cpp @@ -877,7 +877,7 @@ RageInput::pump_t::~pump_t() CloseHandle(h); } -RageInput::pump_t::init(int devno) +void RageInput::pump_t::init(int devno) { const int pump_usb_vid = 0x0d2f, pump_usb_pid = 0x0001; h = USB::OpenUSB (pump_usb_vid, pump_usb_pid, devno); diff --git a/stepmania/src/RageInput.h b/stepmania/src/RageInput.h index 3e5cb7b2cf..10f8a830fa 100644 --- a/stepmania/src/RageInput.h +++ b/stepmania/src/RageInput.h @@ -141,7 +141,7 @@ private: pump_t(); ~pump_t(); - init(int devno); + void init(int devno); /* added a return type because it generates a warning in VC7 -Chris */ int GetPadEvent(); } *m_Pumps; diff --git a/stepmania/src/ScreenCaution.cpp b/stepmania/src/ScreenCaution.cpp index e9bd30c272..513669d3e5 100644 --- a/stepmania/src/ScreenCaution.cpp +++ b/stepmania/src/ScreenCaution.cpp @@ -16,13 +16,20 @@ #include "GameConstantsAndTypes.h" #include "ScreenSelectStyle.h" #include "ScreenEZ2SelectStyle.h" +#include "ScreenSelectStyle5th.h" #include "RageTextureManager.h" #include "PrefsManager.h" #include "AnnouncerManager.h" #include "GameState.h" -#define USE_NORMAL_OR_EZ2_SELECT_STYLE THEME->GetMetricB("General","UseNormalOrEZ2SelectStyle") +#define SELECT_STYLE_TYPE THEME->GetMetricI("General","SelectStyleType") +enum SelectStyleType // for use with the metric above +{ + SELECT_STYLE_TYPE_MAX = 0, + SELECT_STYLE_TYPE_5TH, + SELECT_STYLE_TYPE_EZ2, +}; const ScreenMessage SM_GoToPrevState = ScreenMessage(SM_User-6); @@ -73,10 +80,21 @@ void ScreenCaution::HandleScreenMessage( const ScreenMessage SM ) SCREENMAN->SetNewScreen( new ScreenTitleMenu ); break; case SM_GoToSelectMusic: - if( USE_NORMAL_OR_EZ2_SELECT_STYLE ) - SCREENMAN->SetNewScreen( new ScreenEz2SelectStyle ); - else + switch( SELECT_STYLE_TYPE ) + { + case SELECT_STYLE_TYPE_MAX: SCREENMAN->SetNewScreen( new ScreenSelectStyle ); + break; + case SELECT_STYLE_TYPE_5TH: + SCREENMAN->SetNewScreen( new ScreenSelectStyle5th ); + break; + case SELECT_STYLE_TYPE_EZ2: + SCREENMAN->SetNewScreen( new ScreenEz2SelectStyle ); + break; + default: + ASSERT(0); + break; + } break; } } diff --git a/stepmania/src/ScreenEvaluation.cpp b/stepmania/src/ScreenEvaluation.cpp index be8034a891..2ad2f403e4 100644 --- a/stepmania/src/ScreenEvaluation.cpp +++ b/stepmania/src/ScreenEvaluation.cpp @@ -33,11 +33,31 @@ #define GRADE_P1_X THEME->GetMetricF("Evaluation","GradeP1X") #define GRADE_P2_X THEME->GetMetricF("Evaluation","GradeP2X") #define GRADE_Y THEME->GetMetricF("Evaluation","GradeY") +#define PERCENT_BASE_P1_X THEME->GetMetricF("Evaluation","PercentBaseP1X") +#define PERCENT_BASE_P2_X THEME->GetMetricF("Evaluation","PercentBaseP2X") +#define PERCENT_BASE_Y THEME->GetMetricF("Evaluation","PercentBaseY") #define JUDGE_LABELS_X THEME->GetMetricF("Evaluation","JudgeLabelsX") -#define JUDGE_NUMBERS_P1_X THEME->GetMetricF("Evaluation","JudgeNumbersP1X") -#define JUDGE_NUMBERS_P2_X THEME->GetMetricF("Evaluation","JudgeNumbersP2X") -#define JUDGE_START_Y THEME->GetMetricF("Evaluation","JudgeStartY") -#define JUDGE_SPACING_Y THEME->GetMetricF("Evaluation","JudgeSpacingY") +#define PERFECT_P1_X THEME->GetMetricF("Evaluation","PerfectP1X") +#define PERFECT_P2_X THEME->GetMetricF("Evaluation","PerfectP2X") +#define PERFECT_Y THEME->GetMetricF("Evaluation","PerfectY") +#define GREAT_P1_X THEME->GetMetricF("Evaluation","GreatP1X") +#define GREAT_P2_X THEME->GetMetricF("Evaluation","GreatP2X") +#define GREAT_Y THEME->GetMetricF("Evaluation","GreatY") +#define GOOD_P1_X THEME->GetMetricF("Evaluation","GoodP1X") +#define GOOD_P2_X THEME->GetMetricF("Evaluation","GoodP2X") +#define GOOD_Y THEME->GetMetricF("Evaluation","GoodY") +#define BOO_P1_X THEME->GetMetricF("Evaluation","BooP1X") +#define BOO_P2_X THEME->GetMetricF("Evaluation","BooP2X") +#define BOO_Y THEME->GetMetricF("Evaluation","BooY") +#define MISS_P1_X THEME->GetMetricF("Evaluation","MissP1X") +#define MISS_P2_X THEME->GetMetricF("Evaluation","MissP2X") +#define MISS_Y THEME->GetMetricF("Evaluation","MissY") +#define OK_P1_X THEME->GetMetricF("Evaluation","OKP1X") +#define OK_P2_X THEME->GetMetricF("Evaluation","OKP2X") +#define OK_Y THEME->GetMetricF("Evaluation","OKY") +#define MAX_COMBO_P1_X THEME->GetMetricF("Evaluation","MaxComboP1X") +#define MAX_COMBO_P2_X THEME->GetMetricF("Evaluation","MaxComboP2X") +#define MAX_COMBO_Y THEME->GetMetricF("Evaluation","MaxComboY") #define SCORE_LABELS_X THEME->GetMetricF("Evaluation","ScoreLabelsX") #define SCORE_NUMBERS_P1_X THEME->GetMetricF("Evaluation","ScoreNumbersP1X") #define SCORE_NUMBERS_P2_X THEME->GetMetricF("Evaluation","ScoreNumbersP2X") @@ -45,6 +65,17 @@ #define BONUS_P1_X THEME->GetMetricF("Evaluation","BonusP1X") #define BONUS_P2_X THEME->GetMetricF("Evaluation","BonusP2X") #define BONUS_Y THEME->GetMetricF("Evaluation","BonusY") +#define BAR_P1_BASE_X THEME->GetMetricF("Evaluation","BarP1BaseX") +#define BAR_P2_BASE_X THEME->GetMetricF("Evaluation","BarP2BaseX") +#define BAR_P1_ROTATION THEME->GetMetricF("Evaluation","BarP1Rotation") +#define BAR_P2_ROTATION THEME->GetMetricF("Evaluation","BarP2Rotation") +#define BAR_START_Y THEME->GetMetricF("Evaluation","BarStartY") +#define BAR_SPACING_Y THEME->GetMetricF("Evaluation","BarSpacingY") +#define BAR_WIDTH THEME->GetMetricF("Evaluation","BarWidth") +#define BAR_HEIGHT THEME->GetMetricF("Evaluation","BarHeight") +#define SONGS_SURVIVED_P1_X THEME->GetMetricF("Evaluation","SongsSurvivedP1X") +#define SONGS_SURVIVED_P2_X THEME->GetMetricF("Evaluation","SongsSurvivedP2X") +#define SONGS_SURVIVED_Y THEME->GetMetricF("Evaluation","SongsSurvivedY") #define NEW_RECORD_P1_X THEME->GetMetricF("Evaluation","NewRecordP1X") #define NEW_RECORD_P2_X THEME->GetMetricF("Evaluation","NewRecordP2X") #define NEW_RECORD_Y THEME->GetMetricF("Evaluation","NewRecordY") @@ -52,6 +83,7 @@ #define TRY_EXTRA_STAGE_Y THEME->GetMetricF("Evaluation","TryExtraStageY") #define HELP_TEXT THEME->GetMetric("Evaluation","HelpText") #define TIMER_SECONDS THEME->GetMetricI("Evaluation","TimerSeconds") +#define SPIN_GRADES THEME->GetMetricB("Evaluation","SpinGrades") float GRADE_X( int p ) { switch( p ) { @@ -60,13 +92,37 @@ float GRADE_X( int p ) { default: ASSERT(0); return 0; } } -float JUDGE_NUMBERS_X( int p ) { +float PERCENT_BASE_X( int p ) { switch( p ) { - case PLAYER_1: return JUDGE_NUMBERS_P1_X; - case PLAYER_2: return JUDGE_NUMBERS_P2_X; + case PLAYER_1: return PERCENT_BASE_P1_X; + case PLAYER_2: return PERCENT_BASE_P2_X; default: ASSERT(0); return 0; } } +float JUDGE_X( int p, int l ) { + switch( l ) { + case 0: return p==PLAYER_1 ? PERFECT_P1_X : PERFECT_P2_X; + case 1: return p==PLAYER_1 ? GREAT_P1_X : GREAT_P2_X; + case 2: return p==PLAYER_1 ? GOOD_P1_X : GOOD_P2_X; + case 3: return p==PLAYER_1 ? BOO_P1_X : BOO_P2_X; + case 4: return p==PLAYER_1 ? MISS_P1_X : MISS_P2_X; + case 5: return p==PLAYER_1 ? OK_P1_X : OK_P2_X; + case 6: return p==PLAYER_1 ? MAX_COMBO_P1_X : MAX_COMBO_P2_X; + default: ASSERT(0); return 0; + } +} +float JUDGE_Y( int l ) { + switch( l ) { + case 0: return PERFECT_Y; + case 1: return GREAT_Y; + case 2: return GOOD_Y; + case 3: return BOO_Y; + case 4: return MISS_Y; + case 5: return OK_Y; + case 6: return MAX_COMBO_Y; + default: ASSERT(0); return 0; + } +} float SCORE_NUMBERS_X( int p ) { switch( p ) { case PLAYER_1: return SCORE_NUMBERS_P1_X; @@ -81,6 +137,27 @@ float BONUS_X( int p ) { default: ASSERT(0); return 0; } } +float BAR_BASE_X( int p ) { + switch( p ) { + case PLAYER_1: return BAR_P1_BASE_X; + case PLAYER_2: return BAR_P2_BASE_X; + default: ASSERT(0); return 0; + } +} +float BAR_ROTATION( int p ) { + switch( p ) { + case PLAYER_1: return BAR_P1_ROTATION; + case PLAYER_2: return BAR_P2_ROTATION; + default: ASSERT(0); return 0; + } +} +float SONGS_SURVIVED_X( int p ) { + switch( p ) { + case PLAYER_1: return SONGS_SURVIVED_P1_X; + case PLAYER_2: return SONGS_SURVIVED_P2_X; + default: ASSERT(0); return 0; + } +} float NEW_RECORD_X( int p ) { switch( p ) { case PLAYER_1: return NEW_RECORD_P1_X; @@ -118,7 +195,6 @@ ScreenEvaluation::ScreenEvaluation( bool bSummary ) ASSERT(0); } - /////////////////////////// // Figure out which statistics we're going to display /////////////////////////// @@ -177,57 +253,50 @@ ScreenEvaluation::ScreenEvaluation( bool bSummary ) /////////////////////////// // Init the song banners depending on m_ResultMode /////////////////////////// - /* EZ2 should hide these things by placing them off screen with theme metrics - if( GAMESTATE->m_CurGame != GAME_EZ2 ) + // EZ2 should hide these things by placing them off screen with theme metrics + switch( m_ResultMode ) { - */ - switch( m_ResultMode ) + case RM_ARCADE_STAGE: + m_BannerWithFrame[0].LoadFromSongAndNotes( GAMESTATE->m_pCurSong, GAMESTATE->m_pCurNotes ); + m_BannerWithFrame[0].SetXY( BANNER_X, BANNER_Y ); + this->AddSubActor( &m_BannerWithFrame[0] ); + + m_textStage.LoadFromFont( THEME->GetPathTo("Fonts","header1") ); + m_textStage.TurnShadowOff(); + m_textStage.SetXY( STAGE_X, STAGE_Y ); + m_textStage.SetZoom( 0.5f ); + m_textStage.SetText( GAMESTATE->GetStageText() + " Stage" ); + this->AddSubActor( &m_textStage ); + + break; + case RM_ARCADE_SUMMARY: { - case RM_ARCADE_STAGE: - m_BannerWithFrame[0].LoadFromSongAndNotes( GAMESTATE->m_pCurSong, GAMESTATE->m_pCurNotes ); - m_BannerWithFrame[0].SetXY( BANNER_X, BANNER_Y ); - this->AddSubActor( &m_BannerWithFrame[0] ); - - m_textStage.LoadFromFont( THEME->GetPathTo("Fonts","header1") ); - m_textStage.TurnShadowOff(); - m_textStage.SetXY( STAGE_X, STAGE_Y ); - m_textStage.SetZoom( 0.5f ); - m_textStage.SetText( GAMESTATE->GetStageText() + " Stage" ); - this->AddSubActor( &m_textStage ); - - break; - case RM_ARCADE_SUMMARY: + // crop down to 3 + for( int p=0; pm_apSongsPlayed.GetSize() > STAGES_TO_SHOW_IN_SUMMARY ) - GAMESTATE->m_apSongsPlayed.RemoveAt( 0, GAMESTATE->m_apSongsPlayed.GetSize() - STAGES_TO_SHOW_IN_SUMMARY ); - } - - const int iSongsToShow = GAMESTATE->m_apSongsPlayed.GetSize(); - ASSERT( iSongsToShow > 0 ); - - for( int i=0; im_apSongsPlayed[i] ); - float fBannerOffset = i - (iSongsToShow-1)/2.0f; - m_BannerWithFrame[i].SetXY( BANNER_X + fBannerOffset*32, BANNER_Y + fBannerOffset*16 ); - m_BannerWithFrame[i].SetZoom( 0.70f ); - this->AddSubActor( &m_BannerWithFrame[i] ); - } + if( GAMESTATE->m_apSongsPlayed.GetSize() > STAGES_TO_SHOW_IN_SUMMARY ) + GAMESTATE->m_apSongsPlayed.RemoveAt( 0, GAMESTATE->m_apSongsPlayed.GetSize() - STAGES_TO_SHOW_IN_SUMMARY ); } - break; - case RM_ONI: - m_BannerWithFrame[0].LoadFromCourse( GAMESTATE->m_pCurCourse ); - m_BannerWithFrame[0].SetXY( BANNER_X, BANNER_Y ); - this->AddSubActor( &m_BannerWithFrame[0] ); - break; - } - /* - } - */ + const int iSongsToShow = GAMESTATE->m_apSongsPlayed.GetSize(); + ASSERT( iSongsToShow > 0 ); + + for( int i=0; im_apSongsPlayed[i] ); + float fBannerOffset = i - (iSongsToShow-1)/2.0f; + m_BannerWithFrame[i].SetXY( BANNER_X + fBannerOffset*32, BANNER_Y + fBannerOffset*16 ); + m_BannerWithFrame[i].SetZoom( 0.70f ); + this->AddSubActor( &m_BannerWithFrame[i] ); + } + } + break; + case RM_ONI: + m_BannerWithFrame[0].LoadFromCourse( GAMESTATE->m_pCurCourse ); + m_BannerWithFrame[0].SetXY( BANNER_X, BANNER_Y ); + this->AddSubActor( &m_BannerWithFrame[0] ); + break; + } ////////////////////////// @@ -242,82 +311,9 @@ ScreenEvaluation::ScreenEvaluation( bool bSummary ) this->AddSubActor( &m_Menu ); - for( l=0; lm_CurGame != GAME_EZ2) - { - */ - m_sprJudgeLabels[l].Load( THEME->GetPathTo("Graphics","evaluation judge labels") ); - m_sprJudgeLabels[l].StopAnimating(); - m_sprJudgeLabels[l].SetState( l ); - m_sprJudgeLabels[l].SetXY( JUDGE_LABELS_X, JUDGE_START_Y + l*JUDGE_SPACING_Y ); - m_sprJudgeLabels[l].SetZoom( 1.0f ); - this->AddSubActor( &m_sprJudgeLabels[l] ); - /* - } - */ - - for( p=0; pGetPathTo("Fonts","score numbers") ); - m_textJudgeNumbers[l][p].TurnShadowOff(); - m_textJudgeNumbers[l][p].SetXY( JUDGE_NUMBERS_X(p), JUDGE_START_Y + l*JUDGE_SPACING_Y ); - m_textJudgeNumbers[l][p].SetZoom( 0.7f ); - m_textJudgeNumbers[l][p].SetDiffuseColor( PlayerToColor(p) ); - -/* - TODO: This should somehow be accomodated with a switch in the theme metric file. - - // RE-ARRANGE the scoreboard for EZ2Dancer Scoring - - if (l == 0 && GAMESTATE->m_CurGame == GAME_EZ2) // Change Position For Ez2dancer - { - m_textJudgeNumbers[l][p].SetXY( JUDGE_NUMBERS_X_EZ2[p], JUDGE_EZ2_COOL_Y); - } - else if (l == 2 && GAMESTATE->m_CurGame == GAME_EZ2) - { - m_textJudgeNumbers[l][p].SetXY( JUDGE_NUMBERS_X_EZ2[p], JUDGE_EZ2_COOL_Y + 55); - } - else if (l == 4 && GAMESTATE->m_CurGame == GAME_EZ2) - { - m_textJudgeNumbers[l][p].SetXY( JUDGE_NUMBERS_X_EZ2[p], JUDGE_EZ2_COOL_Y + 120); - } - else if ((l == 1 || l == 3 ) && GAMESTATE->m_CurGame == GAME_EZ2) - { - m_textJudgeNumbers[l][p].SetZoomX(0); // Hide These Ones - } - else if (l == 5 && GAMESTATE->m_CurGame == GAME_EZ2 ) // sneakily use this one for the max combo. - { - if (p == PLAYER_1 ) - { - m_textJudgeNumbers[l][p].SetXY( JUDGE_NUMBERS_X_EZ2[p]-40, JUDGE_EZ2_COOL_Y + 180); - } - else - { - m_textJudgeNumbers[l][p].SetXY( JUDGE_NUMBERS_X_EZ2[p]+40, JUDGE_EZ2_COOL_Y + 180); - } - } -*/ - this->AddSubActor( &m_textJudgeNumbers[l][p] ); - } - } - -/* if (GAMESTATE->m_CurGame != GAME_EZ2) - { -*/ - m_sprScoreLabel.Load( THEME->GetPathTo("Graphics","evaluation score labels") ); - m_sprScoreLabel.SetState( m_ResultMode==RM_ONI ? 1 : 0 ); - m_sprScoreLabel.StopAnimating(); - m_sprScoreLabel.SetXY( SCORE_LABELS_X, SCORE_Y ); - m_sprScoreLabel.SetZoom( 1.0f ); - this->AddSubActor( &m_sprScoreLabel ); -/* } -*/ - for( p=0; pIsPlayerEnabled( (PlayerNumber)p ) ) // || GAMESTATE->m_CurGame == GAME_EZ2 ) // If EZ2 wants to hide this graphic, place it somewhere off screen using theme metrics + if( !GAMESTATE->IsPlayerEnabled( (PlayerNumber)p ) ) // If EZ2 wants to hide this graphic, place it somewhere off screen using theme metrics continue; // skip m_ScoreDisplay[p].SetXY( SCORE_NUMBERS_X(p), SCORE_Y ); @@ -366,50 +362,6 @@ ScreenEvaluation::ScreenEvaluation( bool bSummary ) max_grade = max( max_grade, grade[p] ); - ////////////////////////// - // Set Numbers - ////////////////////////// - for( p=0; pIsPlayerEnabled( (PlayerNumber)p ) ) - continue; // skip - - m_textJudgeNumbers[0][p].SetText( ssprintf("%4d", iTapNoteScores[p][TNS_PERFECT]) ); - m_textJudgeNumbers[1][p].SetText( ssprintf("%4d", iTapNoteScores[p][TNS_GREAT]) ); - m_textJudgeNumbers[2][p].SetText( ssprintf("%4d", iTapNoteScores[p][TNS_GOOD]) ); - m_textJudgeNumbers[3][p].SetText( ssprintf("%4d", iTapNoteScores[p][TNS_BOO]) ); - m_textJudgeNumbers[4][p].SetText( ssprintf("%4d", iTapNoteScores[p][TNS_MISS]) ); - m_textJudgeNumbers[5][p].SetText( ssprintf("%4d", iHoldNoteScores[p][HNS_OK]) ); - - if( m_ResultMode==RM_ONI ) - { - const float fSurviveSeconds = GAMESTATE->GetPlayerSurviveTime( (PlayerNumber)p ); - int iMinsDisplay = (int)fSurviveSeconds/60; - int iSecsDisplay = (int)fSurviveSeconds - iMinsDisplay*60; - int iLeftoverDisplay = int( (fSurviveSeconds - iMinsDisplay*60 - iSecsDisplay) * 100 ); - m_ScoreDisplay[p].SetText( ssprintf( "%02d:%02d:%02d", iMinsDisplay, iSecsDisplay, iLeftoverDisplay ) ); - } - else - { - m_ScoreDisplay[p].SetScore( fScore[p] ); - } - - /* - TODO: Accomodate this with a theme metric - - // SNEAKY! We take the max combo, and put it into element 5, because Ez2dancer - // doesn't care for OK's and plus this text element is already nicely aligned =) - if (GAMESTATE->m_CurGame == GAME_EZ2) - { - m_textJudgeNumbers[5][p].SetText( ssprintf("%4d", iMaxCombo[p]) ); - } - */ - - m_BonusInfoFrame[p].SetBonusInfo( (PlayerNumber)p, fPossibleRadarValues[p], fActualRadarValues[p], iMaxCombo[p] ); - m_StageBox[p].SetStageInfo( (PlayerNumber)p, GAMESTATE->m_iSongsBeforeFail[p] ); - } - - //////////////////////// // update persistent statistics //////////////////////// @@ -462,91 +414,182 @@ ScreenEvaluation::ScreenEvaluation( bool bSummary ) m_bTryExtraStage = false; + ////////////////////////// + // Init non-ResultMode specific displays + ////////////////////////// + for( l=0; lGetPathTo("Graphics","evaluation judge labels") ); + m_sprJudgeLabels[l].StopAnimating(); + m_sprJudgeLabels[l].SetState( l ); + m_sprJudgeLabels[l].SetXY( JUDGE_LABELS_X, JUDGE_Y(l) ); + m_sprJudgeLabels[l].SetZoom( 1.0f ); + this->AddSubActor( &m_sprJudgeLabels[l] ); + } + + m_sprScoreLabel.Load( THEME->GetPathTo("Graphics","evaluation score labels") ); + m_sprScoreLabel.SetState( m_ResultMode==RM_ONI ? 1 : 0 ); + m_sprScoreLabel.StopAnimating(); + m_sprScoreLabel.SetXY( SCORE_LABELS_X, SCORE_Y ); + m_sprScoreLabel.SetZoom( 1.0f ); + this->AddSubActor( &m_sprScoreLabel ); + for( p=0; pIsPlayerEnabled( (PlayerNumber)p ) ) continue; // skip -/* Chris: If you don't want EZ2 to have a grade frame, then make a theme that has a 1x1 transparent graphic for the grade frame. - - if ( GAMESTATE->m_CurGame != GAME_EZ2) + for( l=0; lGetPathTo("Graphics","evaluation grade frame") ); - m_sprGradeFrame[p].StopAnimating(); - m_sprGradeFrame[p].SetState( p ); - m_sprGradeFrame[p].SetXY( GRADE_X(p), GRADE_Y ); - this->AddSubActor( &m_sprGradeFrame[p] ); -/* } -*/ + m_textJudgeNumbers[l][p].LoadFromFont( THEME->GetPathTo("Fonts","score numbers") ); + m_textJudgeNumbers[l][p].TurnShadowOff(); + m_textJudgeNumbers[l][p].SetXY( JUDGE_X(p,l), JUDGE_Y(l) ); + m_textJudgeNumbers[l][p].SetZoom( 0.7f ); + m_textJudgeNumbers[l][p].SetDiffuseColor( PlayerToColor(p) ); + this->AddSubActor( &m_textJudgeNumbers[l][p] ); + } + + m_textJudgeNumbers[0][p].SetText( ssprintf("%4d", iTapNoteScores[p][TNS_PERFECT]) ); + m_textJudgeNumbers[1][p].SetText( ssprintf("%4d", iTapNoteScores[p][TNS_GREAT]) ); + m_textJudgeNumbers[2][p].SetText( ssprintf("%4d", iTapNoteScores[p][TNS_GOOD]) ); + m_textJudgeNumbers[3][p].SetText( ssprintf("%4d", iTapNoteScores[p][TNS_BOO]) ); + m_textJudgeNumbers[4][p].SetText( ssprintf("%4d", iTapNoteScores[p][TNS_MISS]) ); + m_textJudgeNumbers[5][p].SetText( ssprintf("%4d", iHoldNoteScores[p][HNS_OK]) ); + m_textJudgeNumbers[6][p].SetText( ssprintf("%4d", iMaxCombo[p]) ); + + + if( m_ResultMode==RM_ONI ) + m_ScoreDisplay[p].SetText( SecondsToTime(GAMESTATE->GetPlayerSurviveTime( (PlayerNumber)p )) ); + else + m_ScoreDisplay[p].SetScore( fScore[p] ); + } + + + ///////////////////////////////// + // Init ResultMode-specific displays + ///////////////////////////////// + for( p=0; pIsPlayerEnabled( (PlayerNumber)p ) ) + continue; // skip + + // If EZ2 shouldn't have a grade frame, then make a theme that has a 1x1 transparent graphic for the grade frame. + switch( m_ResultMode ) { case RM_ONI: { - m_textOniPercent[p].LoadFromFont( THEME->GetPathTo("Fonts","header1") ); - m_textOniPercent[p].SetXY( GRADE_X(p), GRADE_Y ); - m_textOniPercent[p].SetShadowLength( 2 ); - m_textOniPercent[p].SetZoomX( 1.3f ); - m_textOniPercent[p].SetZoomY( 2.5f ); - m_textOniPercent[p].SetEffectGlowing( 1.0f ); + m_sprPercentFrame[p].Load( THEME->GetPathTo("Graphics","evaluation percent frame") ); + m_sprPercentFrame[p].StopAnimating(); + m_sprPercentFrame[p].SetState( p ); + m_sprPercentFrame[p].SetXY( GRADE_X(p), GRADE_Y ); + this->AddSubActor( &m_sprPercentFrame[p] ); + m_textOniPercentLarge[p].LoadFromFont( THEME->GetPathTo("Fonts","oni percent numbers") ); + m_textOniPercentLarge[p].TurnShadowOff(); + m_textOniPercentLarge[p].SetXY( PERCENT_BASE_X(p), PERCENT_BASE_Y ); + m_textOniPercentLarge[p].SetHorizAlign( Actor::align_right ); + m_textOniPercentLarge[p].SetVertAlign( Actor::align_bottom ); + m_textOniPercentLarge[p].SetEffectGlowing( 1.0f ); + this->AddSubActor( &m_textOniPercentLarge[p] ); + + m_textOniPercentSmall[p].LoadFromFont( THEME->GetPathTo("Fonts","oni percent numbers") ); + m_textOniPercentSmall[p].TurnShadowOff(); + m_textOniPercentSmall[p].SetZoom( 0.5f ); + m_textOniPercentSmall[p].SetXY( PERCENT_BASE_X(p), PERCENT_BASE_Y ); + m_textOniPercentSmall[p].SetHorizAlign( Actor::align_left ); + m_textOniPercentSmall[p].SetVertAlign( Actor::align_bottom ); + m_textOniPercentSmall[p].SetEffectGlowing( 1.0f ); + this->AddSubActor( &m_textOniPercentSmall[p] ); + + iPossibleDancePoints[p] = max( 1, iPossibleDancePoints[p] ); float fPercentDancePoints = iActualDancePoints[p] / (float)iPossibleDancePoints[p] + 0.0001f; // correct for rounding errors - fPercentDancePoints = max( 0, fPercentDancePoints ); - m_textOniPercent[p].SetText( ssprintf("%.1f%%", fPercentDancePoints*100) ); - this->AddSubActor( &m_textOniPercent[p] ); + int iPercentDancePointsLarge = int(fPercentDancePoints*100); + int iPercentDancePointsSmall = int( (fPercentDancePoints*100 - int(fPercentDancePoints*100)) * 10 ); + m_textOniPercentLarge[p].SetText( ssprintf("%02d%", iPercentDancePointsLarge) ); + m_textOniPercentSmall[p].SetText( ssprintf(".%01d%%", iPercentDancePointsSmall) ); - m_StageBox[p].SetXY( BONUS_X(p), BONUS_Y ); - this->AddSubActor( &m_StageBox[p] ); + // StageInfo stuff + m_sprCourseFrame[p].Load( THEME->GetPathTo("Graphics","evaluation stage frame 2x1") ); + m_sprCourseFrame[p].StopAnimating(); + m_sprCourseFrame[p].SetState( p ); + m_sprCourseFrame[p].SetXY( BONUS_X(p), BONUS_Y ); + this->AddSubActor( &m_sprCourseFrame[p] ); + + m_textSongsSurvived[p].LoadFromFont( THEME->GetPathTo("Fonts","oni stage numbers") ); + m_textSongsSurvived[p].TurnShadowOff(); + m_textSongsSurvived[p].SetXY( SONGS_SURVIVED_X(p), SONGS_SURVIVED_Y ); + m_textSongsSurvived[p].SetText( ssprintf("%02d", GAMESTATE->m_iSongsBeforeFail[p]) ); + this->AddSubActor( &m_textSongsSurvived[p] ); } break; case RM_ARCADE_STAGE: case RM_ARCADE_SUMMARY: - /* - Todo: Accomodate this in theme metrics - - if (GAMESTATE->m_CurGame != GAME_EZ2 ) { - */ + m_sprGradeFrame[p].Load( THEME->GetPathTo("Graphics","evaluation grade frame") ); + m_sprGradeFrame[p].StopAnimating(); + m_sprGradeFrame[p].SetState( p ); + m_sprGradeFrame[p].SetXY( GRADE_X(p), GRADE_Y ); + this->AddSubActor( &m_sprGradeFrame[p] ); + + // Ez2dancer should control the grade tween using theme metrics m_Grades[p].SetXY( GRADE_X(p), GRADE_Y ); m_Grades[p].SetZ( -2 ); m_Grades[p].SetZoom( 1.0f ); m_Grades[p].SetEffectGlowing( 1.0f ); - m_Grades[p].SpinAndSettleOn( grade[p] ); + if( SPIN_GRADES ) + m_Grades[p].SpinAndSettleOn( grade[p] ); + else + m_Grades[p].SetGrade( (PlayerNumber)p, grade[p] ); + this->AddSubActor( &m_Grades[p] ); - m_BonusInfoFrame[p].SetXY( BONUS_X(p), BONUS_Y ); - this->AddSubActor( &m_BonusInfoFrame[p] ); - /* - } - else // Ez2dancer Style Grade Display. - { - m_Grades[p].SetXY( GRADE_X[p], GRADE_Y + 150); - m_Grades[p].SetZ( -2 ); - if (p == PLAYER_1 ) + // Bonus info frame + m_sprBonusFrame[p].Load( THEME->GetPathTo("Graphics","evaluation bonus frame 2x1") ); + m_sprBonusFrame[p].StopAnimating(); + m_sprBonusFrame[p].SetState( p ); + m_sprBonusFrame[p].SetXY( BONUS_X(p), BONUS_Y ); + this->AddSubActor( &m_sprBonusFrame[p] ); + + for( int l=0; lGetPathTo("Graphics","evaluation bars possible 1x2") ); + m_sprPossibleBar[p][l].SetState( p ); + m_sprPossibleBar[p][l].SetWidth( 1 ); + m_sprPossibleBar[p][l].SetHeight( 1 ); + m_sprPossibleBar[p][l].SetHorizAlign( Actor::align_left ); + m_sprPossibleBar[p][l].SetX( BAR_BASE_X(p) ); + m_sprPossibleBar[p][l].SetY( BAR_START_Y + BAR_SPACING_Y*l ); + m_sprPossibleBar[p][l].SetRotation( BAR_ROTATION(p) ); + m_sprPossibleBar[p][l].SetZoomX( 0 ); + m_sprPossibleBar[p][l].SetZoomY( BAR_HEIGHT ); + m_sprPossibleBar[p][l].BeginTweening( 0.5f ); + m_sprPossibleBar[p][l].SetTweenZoomX( BAR_WIDTH*fPossibleRadarValues[p][l] ); + this->AddSubActor( &m_sprPossibleBar[p][l] ); + + m_sprActualBar[p][l].Load( THEME->GetPathTo("Graphics","evaluation bars actual 1x2") ); + m_sprActualBar[p][l].SetState( p ); + m_sprActualBar[p][l].StopAnimating(); + m_sprActualBar[p][l].SetWidth( 1 ); + m_sprActualBar[p][l].SetHeight( 1 ); + m_sprActualBar[p][l].SetHorizAlign( Actor::align_left ); + m_sprActualBar[p][l].SetX( BAR_BASE_X(p) ); + m_sprActualBar[p][l].SetY( BAR_START_Y + BAR_SPACING_Y*l ); + m_sprActualBar[p][l].SetRotation( BAR_ROTATION(p) ); + m_sprActualBar[p][l].SetZoomX( 0 ); + m_sprActualBar[p][l].SetZoomY( BAR_HEIGHT ); + m_sprActualBar[p][l].BeginTweening( 0.5f ); + m_sprActualBar[p][l].SetTweenZoomX( BAR_WIDTH*fActualRadarValues[p][l] ); + if( fActualRadarValues[p][l] == fPossibleRadarValues[p][l] ) + m_sprActualBar[p][l].SetEffectGlowing(); + this->AddSubActor( &m_sprActualBar[p][l] ); } - m_Grades[p].SetGrade( grade[p] ); - m_Grades[p].SetRotation( D3DX_PI ); - m_Grades[p].SetZoom( 8 ); - m_Grades[p].BeginTweening( 0.6f ); - - m_Grades[p].SetTweenRotationZ( 0 ); - m_Grades[p].SetTweenZoom( 2 ); - + break; } - */ - this->AddSubActor( &m_Grades[p] ); - break; } -/* Chris: If EZ2 wants to hide these things, place them off screen using theme metrics - - if ( GAMESTATE->m_CurGame == GAME_EZ2) - continue; -*/ - m_bNewRecord[p] = false; - + // Chris: If EZ2 wants to hide these things, place them off screen using theme metrics if( m_bNewRecord[p] ) { m_textNewRecord[p].LoadFromFont( THEME->GetPathTo("Fonts","header1") ); @@ -565,9 +608,9 @@ ScreenEvaluation::ScreenEvaluation( bool bSummary ) m_textTryExtraStage.LoadFromFont( THEME->GetPathTo("Fonts","header1") ); m_textTryExtraStage.SetXY( TRY_EXTRA_STAGE_X, TRY_EXTRA_STAGE_Y ); if( GAMESTATE->IsExtraStage() ) - m_textTryExtraStage.SetText( "Try Another Extra Stage!" ); + m_textTryExtraStage.SetText( "One More ExtraStage!!!" ); else - m_textTryExtraStage.SetText( "Try Extra Stage!" ); + m_textTryExtraStage.SetText( "Try ExtraStage!!!" ); m_textTryExtraStage.SetZoom( 1 ); m_textTryExtraStage.SetEffectGlowing( 1.0f ); this->AddSubActor( &m_textTryExtraStage ); @@ -642,19 +685,11 @@ void ScreenEvaluation::TweenOnScreen() for( i=0; im_CurGame != GAME_EZ2) - { - */ - fOriginalY = m_sprJudgeLabels[i].GetY(); - m_sprJudgeLabels[i].SetY( fOriginalY + SCREEN_HEIGHT ); - m_sprJudgeLabels[i].BeginTweeningQueued( 0.2f + 0.1f*i ); - m_sprJudgeLabels[i].BeginTweeningQueued( MENU_ELEMENTS_TWEEN_TIME, Actor::TWEEN_BIAS_BEGIN ); - m_sprJudgeLabels[i].SetTweenY( fOriginalY ); - /* - } - */ + fOriginalY = m_sprJudgeLabels[i].GetY(); + m_sprJudgeLabels[i].SetY( fOriginalY + SCREEN_HEIGHT ); + m_sprJudgeLabels[i].BeginTweeningQueued( 0.2f + 0.1f*i ); + m_sprJudgeLabels[i].BeginTweeningQueued( MENU_ELEMENTS_TWEEN_TIME, Actor::TWEEN_BIAS_BEGIN ); + m_sprJudgeLabels[i].SetTweenY( fOriginalY ); for( int p=0; pm_CurGame != GAME_EZ2) + fOriginalY = m_sprScoreLabel.GetY(); + m_sprScoreLabel.SetY( fOriginalY + SCREEN_HEIGHT ); + m_sprScoreLabel.BeginTweeningQueued( 0.8f + 0.1f*i ); + m_sprScoreLabel.BeginTweeningQueued( MENU_ELEMENTS_TWEEN_TIME, Actor::TWEEN_BIAS_BEGIN ); + m_sprScoreLabel.SetTweenY( fOriginalY ); + + for( p=0; p apActorsInBonusOrStageInfo; + apActorsInBonusOrStageInfo.Add( &m_sprBonusFrame[p] ); + for( i=0; iGetX(); + apActorsInBonusOrStageInfo[i]->SetX( fOriginalX + SCREEN_WIDTH/2*(p==PLAYER_1 ? 1 : -1) ); + apActorsInBonusOrStageInfo[i]->BeginTweeningQueued( 0.2f ); + apActorsInBonusOrStageInfo[i]->BeginTweeningQueued( MENU_ELEMENTS_TWEEN_TIME, Actor::TWEEN_BIAS_BEGIN ); + apActorsInBonusOrStageInfo[i]->SetTweenX( fOriginalX ); + } + + m_sprGradeFrame[p].BeginTweening( MENU_ELEMENTS_TWEEN_TIME ); + m_sprGradeFrame[p].SetTweenZoomY( 0 ); + + m_Grades[p].BeginTweening( MENU_ELEMENTS_TWEEN_TIME ); + m_Grades[p].SetTweenZoomY( 0 ); + + m_textOniPercentLarge[p].BeginTweening( MENU_ELEMENTS_TWEEN_TIME ); + m_textOniPercentLarge[p].SetTweenZoomY( 0 ); + + m_textOniPercentSmall[p].BeginTweening( MENU_ELEMENTS_TWEEN_TIME ); + m_textOniPercentSmall[p].SetTweenZoomY( 0 ); + + m_textNewRecord[p].BeginTweening( MENU_ELEMENTS_TWEEN_TIME ); + m_textNewRecord[p].SetTweenZoomY( 0 ); + } + + m_textTryExtraStage.BeginTweening( MENU_ELEMENTS_TWEEN_TIME ); + m_textTryExtraStage.SetTweenZoomY( 0 ); } void ScreenEvaluation::TweenOffScreen() @@ -735,15 +776,8 @@ void ScreenEvaluation::TweenOffScreen() for( i=0; im_CurGame != GAME_EZ2) - { - */ - m_sprJudgeLabels[i].BeginTweeningQueued( MENU_ELEMENTS_TWEEN_TIME, Actor::TWEEN_BIAS_END ); - m_sprJudgeLabels[i].SetTweenZoomY( 0 ); - /* - } - */ + m_sprJudgeLabels[i].BeginTweeningQueued( MENU_ELEMENTS_TWEEN_TIME, Actor::TWEEN_BIAS_END ); + m_sprJudgeLabels[i].SetTweenZoomY( 0 ); for( int p=0; pm_CurGame != GAME_EZ2) + m_sprScoreLabel.BeginTweeningQueued( MENU_ELEMENTS_TWEEN_TIME, Actor::TWEEN_BIAS_END ); + m_sprScoreLabel.SetTweenZoomY( 0 ); + + + for( p=0; p apActorsInBonusOrStageInfo; + apActorsInBonusOrStageInfo.Add( &m_sprBonusFrame[p] ); + for( i=0; iBeginTweeningQueued( MENU_ELEMENTS_TWEEN_TIME, Actor::TWEEN_BIAS_END ); + apActorsInBonusOrStageInfo[i]->SetTweenZoomY( 0 ); + } m_sprGradeFrame[p].BeginTweening( MENU_ELEMENTS_TWEEN_TIME ); m_sprGradeFrame[p].SetTweenZoomY( 0 ); @@ -784,8 +824,11 @@ void ScreenEvaluation::TweenOffScreen() m_Grades[p].BeginTweening( MENU_ELEMENTS_TWEEN_TIME ); m_Grades[p].SetTweenZoomY( 0 ); - m_textOniPercent[p].BeginTweening( MENU_ELEMENTS_TWEEN_TIME ); - m_textOniPercent[p].SetTweenZoomY( 0 ); + m_textOniPercentLarge[p].BeginTweening( MENU_ELEMENTS_TWEEN_TIME ); + m_textOniPercentLarge[p].SetTweenZoomY( 0 ); + + m_textOniPercentSmall[p].BeginTweening( MENU_ELEMENTS_TWEEN_TIME ); + m_textOniPercentSmall[p].SetTweenZoomY( 0 ); m_textNewRecord[p].BeginTweening( MENU_ELEMENTS_TWEEN_TIME ); m_textNewRecord[p].SetTweenZoomY( 0 ); diff --git a/stepmania/src/ScreenEvaluation.h b/stepmania/src/ScreenEvaluation.h index 839d05b95f..20a7f37076 100644 --- a/stepmania/src/ScreenEvaluation.h +++ b/stepmania/src/ScreenEvaluation.h @@ -18,12 +18,11 @@ #include "MenuElements.h" #include "Banner.h" #include "ScoreDisplayNormal.h" -#include "BonusInfoFrame.h" #include "StageBox.h" #include "BannerWithFrame.h" -const int NUM_JUDGE_LINES = 6; // perfect, great, good, boo, miss, ok +const int NUM_JUDGE_LINES = 7; // perfect, great, good, boo, miss, ok, max_combo const int STAGES_TO_SHOW_IN_SUMMARY = 3; // only show the latest three stages in a summary class ScreenEvaluation : public Screen @@ -49,12 +48,24 @@ protected: BannerWithFrame m_BannerWithFrame[STAGES_TO_SHOW_IN_SUMMARY]; BitmapText m_textStage; + // used in arcade Sprite m_sprGradeFrame[NUM_PLAYERS]; GradeDisplay m_Grades[NUM_PLAYERS]; - BitmapText m_textOniPercent[NUM_PLAYERS]; - BonusInfoFrame m_BonusInfoFrame[NUM_PLAYERS]; // used in arcade - StageBox m_StageBox[NUM_PLAYERS]; // used in Oni + // used in Oni/Endless + Sprite m_sprPercentFrame[NUM_PLAYERS]; + BitmapText m_textOniPercentLarge[NUM_PLAYERS]; + BitmapText m_textOniPercentSmall[NUM_PLAYERS]; + + // used in arcade + Sprite m_sprBonusFrame[NUM_PLAYERS]; + Sprite m_sprPossibleBar[NUM_PLAYERS][NUM_RADAR_VALUES]; + Sprite m_sprActualBar[NUM_PLAYERS][NUM_RADAR_VALUES]; + + // used in Oni/Endless + Sprite m_sprCourseFrame[NUM_PLAYERS]; + BitmapText m_textTime[NUM_PLAYERS]; + BitmapText m_textSongsSurvived[NUM_PLAYERS]; Sprite m_sprJudgeLabels[NUM_JUDGE_LINES]; BitmapText m_textJudgeNumbers[NUM_JUDGE_LINES][NUM_PLAYERS]; diff --git a/stepmania/src/ScreenEz2SelectPlayer.cpp b/stepmania/src/ScreenEz2SelectPlayer.cpp index 8a71e03fc1..90e058db57 100644 --- a/stepmania/src/ScreenEz2SelectPlayer.cpp +++ b/stepmania/src/ScreenEz2SelectPlayer.cpp @@ -26,13 +26,20 @@ Andrew Livy #include "GameState.h" #include "RageException.h" #include "RageTimer.h" +#include "ScreenSelectStyle5th.h" /* Constants */ const ScreenMessage SM_GoToPrevState = ScreenMessage(SM_User + 1); const ScreenMessage SM_GoToNextState = ScreenMessage(SM_User + 2); -#define USE_NORMAL_OR_EZ2_SELECT_STYLE THEME->GetMetricB("General","UseNormalOrEZ2SelectStyle") +#define SELECT_STYLE_TYPE THEME->GetMetricI("General","SelectStyleType") +enum SelectStyleType // for use with the metric above +{ + SELECT_STYLE_TYPE_MAX = 0, + SELECT_STYLE_TYPE_5TH, + SELECT_STYLE_TYPE_EZ2, +}; const float TWEEN_TIME = 0.35f; const D3DXCOLOR OPT_NOT_SELECTED = D3DXCOLOR(0.3f,0.3f,0.3f,1); @@ -240,10 +247,21 @@ void ScreenEz2SelectPlayer::HandleScreenMessage( const ScreenMessage SM ) SCREENMAN->SetNewScreen( new ScreenTitleMenu ); break; case SM_GoToNextState: - if( USE_NORMAL_OR_EZ2_SELECT_STYLE ) - SCREENMAN->SetNewScreen( new ScreenEz2SelectStyle ); - else + switch( SELECT_STYLE_TYPE ) + { + case SELECT_STYLE_TYPE_MAX: SCREENMAN->SetNewScreen( new ScreenSelectStyle ); + break; + case SELECT_STYLE_TYPE_5TH: + SCREENMAN->SetNewScreen( new ScreenSelectStyle5th ); + break; + case SELECT_STYLE_TYPE_EZ2: + SCREENMAN->SetNewScreen( new ScreenEz2SelectStyle ); + break; + default: + ASSERT(0); + break; + } break; } } diff --git a/stepmania/src/ScreenEz2SelectStyle.cpp b/stepmania/src/ScreenEz2SelectStyle.cpp index 30eb39af85..4ea04dcd7d 100644 --- a/stepmania/src/ScreenEz2SelectStyle.cpp +++ b/stepmania/src/ScreenEz2SelectStyle.cpp @@ -113,7 +113,12 @@ const float OPT_YP[NUM_EZ2P_GRAPHICS] = { }; // tells us the default Y position -#define SKIP_SELECT_DIFFICULTY THEME->GetMetricB("General","SkipSelectDifficulty") +#define SELECT_DIFFICULTY_TYPE THEME->GetMetricI("General","SelectDifficultyType") +enum SelectDifficultyType // for use with the metric above +{ + SELECT_DIFFICULTY_TYPE_SKIP = 0, + SELECT_DIFFICULTY_TYPE_MAX, +}; float ez2p_lasttimercheck[2]; @@ -343,10 +348,17 @@ void ScreenEz2SelectStyle::HandleScreenMessage( const ScreenMessage SM ) SCREENMAN->SetNewScreen( new ScreenTitleMenu ); break; case SM_GoToNextState: - if( SKIP_SELECT_DIFFICULTY ) + switch( SELECT_DIFFICULTY_TYPE ) + { + case SELECT_DIFFICULTY_TYPE_SKIP: SCREENMAN->SetNewScreen( new ScreenSelectGroup ); - else + break; + case SELECT_DIFFICULTY_TYPE_MAX: SCREENMAN->SetNewScreen( new ScreenSelectDifficulty ); + break; + default: + ASSERT(0); + } break; } } diff --git a/stepmania/src/ScreenGameplay.cpp b/stepmania/src/ScreenGameplay.cpp index 7256919006..1d705ed613 100644 --- a/stepmania/src/ScreenGameplay.cpp +++ b/stepmania/src/ScreenGameplay.cpp @@ -692,6 +692,7 @@ void ScreenGameplay::LoadNextSong( bool bFirstLoad ) m_Player[p].Load( (PlayerNumber)p, &newNoteData, m_pLifeMeter[p], m_pScoreDisplay[p] ); } + m_Background.LoadFromSong( GAMESTATE->m_pCurSong ); m_Background.LoadFromSong( GAMESTATE->m_pCurSong ); m_Background.SetDiffuseColor( D3DXCOLOR(0.5f,0.5f,0.5f,1) ); m_Background.BeginTweeningQueued( 2 ); @@ -922,7 +923,7 @@ void ScreenGameplay::Input( const DeviceInput& DeviceI, const InputEventType typ if( GAMESTATE->m_bDemonstration ) { - if( MenuI.button == MENU_BUTTON_START && !m_Fade.IsClosing() ) + if( MenuI.button==MENU_BUTTON_START && !m_Fade.IsClosing() ) { m_soundMusic.Stop(); SOUND->PlayOnceStreamed( THEME->GetPathTo("Sounds","insert coin") ); @@ -930,6 +931,10 @@ void ScreenGameplay::Input( const DeviceInput& DeviceI, const InputEventType typ this->SendScreenMessage( SM_GoToTitleMenu, 0 ); // m_Fade.CloseWipingRight( SM_GoToTitleMenu ); } + else if( DeviceI.device==DEVICE_KEYBOARD && DeviceI.button==DIK_ESCAPE && !m_Fade.IsClosing() ) + { + this->SendScreenMessage( SM_BeginFadingToTitleMenu, 0 ); + } return; // don't fall through below } @@ -1410,12 +1415,12 @@ void ScreenGameplay::HandleScreenMessage( const ScreenMessage SM ) ShowSavePrompt( SM_GoToScreenAfterFail ); break; } - if( PREFSMAN->m_bEventMode ) + if( GAMESTATE->m_PlayMode == PLAY_MODE_ONI || GAMESTATE->m_PlayMode == PLAY_MODE_ENDLESS ) + SCREENMAN->SetNewScreen( new ScreenEvaluation(false) ); + else if( PREFSMAN->m_bEventMode ) this->SendScreenMessage( SM_GoToScreenAfterBack, 0 ); else if( GAMESTATE->IsExtraStage() || GAMESTATE->IsExtraStage2() ) SCREENMAN->SetNewScreen( new ScreenEvaluation(true) ); - else if( GAMESTATE->m_PlayMode == PLAY_MODE_ONI || GAMESTATE->m_PlayMode == PLAY_MODE_ENDLESS ) - SCREENMAN->SetNewScreen( new ScreenEvaluation(false) ); else SCREENMAN->SetNewScreen( new ScreenGameOver ); break; diff --git a/stepmania/src/ScreenSelectCourse.cpp b/stepmania/src/ScreenSelectCourse.cpp index f8f09394b0..50baa555a1 100644 --- a/stepmania/src/ScreenSelectCourse.cpp +++ b/stepmania/src/ScreenSelectCourse.cpp @@ -32,29 +32,53 @@ #include "RageMusic.h" -const float COURSE_INFO_FRAME_X = 160; -const float COURSE_INFO_FRAME_Y = SCREEN_TOP+118; +#define BANNER_FRAME_X THEME->GetMetricF("SelectCourse","BannerFrameX") +#define BANNER_FRAME_Y THEME->GetMetricF("SelectCourse","BannerFrameY") +#define BANNER_X THEME->GetMetricF("SelectCourse","BannerX") +#define BANNER_Y THEME->GetMetricF("SelectCourse","BannerY") +#define BANNER_WIDTH THEME->GetMetricF("SelectCourse","BannerWidth") +#define BANNER_HEIGHT THEME->GetMetricF("SelectCourse","BannerHeight") +#define STAGES_X THEME->GetMetricF("SelectCourse","StagesX") +#define STAGES_Y THEME->GetMetricF("SelectCourse","StagesY") +#define TIME_X THEME->GetMetricF("SelectCourse","TimeX") +#define TIME_Y THEME->GetMetricF("SelectCourse","TimeY") +#define CONTENTS_X THEME->GetMetricF("SelectCourse","ContentsX") +#define CONTENTS_Y THEME->GetMetricF("SelectCourse","ContentsY") +#define WHEEL_X THEME->GetMetricF("SelectCourse","WheelX") +#define WHEEL_Y THEME->GetMetricF("SelectCourse","WheelY") +#define SCORE_P1_X THEME->GetMetricF("SelectCourse","ScoreP1X") +#define SCORE_P1_Y THEME->GetMetricF("SelectCourse","ScoreP1Y") +#define SCORE_P2_X THEME->GetMetricF("SelectCourse","ScoreP2X") +#define SCORE_P2_Y THEME->GetMetricF("SelectCourse","ScoreP2Y") +#define HELP_TEXT THEME->GetMetric("SelectCourse","HelpText") +#define TIMER_SECONDS THEME->GetMetricI("SelectCourse","TimerSeconds") -const float COURSE_CONTENTS_FRAME_X = 160; -const float COURSE_CONTENTS_FRAME_Y = CENTER_Y+70; - -const float WHEEL_X = CENTER_X+160; -const float WHEEL_Y = CENTER_Y+8; +float BEST_TIME_X( int p ) { + switch( p ) { + case PLAYER_1: return SCORE_P1_X; + case PLAYER_2: return SCORE_P2_X; + default: ASSERT(0); return 0; + } +} +float BEST_TIME_Y( int p ) { + switch( p ) { + case PLAYER_1: return SCORE_P1_Y; + case PLAYER_2: return SCORE_P2_Y; + default: ASSERT(0); return 0; + } +} const float TWEEN_TIME = 0.5f; - - const ScreenMessage SM_GoToPrevState = ScreenMessage(SM_User+1); const ScreenMessage SM_GoToNextState = ScreenMessage(SM_User+2); -const ScreenMessage SM_ConfirmChange = ScreenMessage(SM_User+3); ScreenSelectCourse::ScreenSelectCourse() { LOG->Trace( "ScreenSelectCourse::ScreenSelectCourse()" ); - + if( !MUSIC->IsPlaying() || MUSIC->GetLoadedFilePath() != THEME->GetPathTo("Sounds","select course music") ) { MUSIC->Load( THEME->GetPathTo("Sounds","select course music") ); @@ -67,20 +91,49 @@ ScreenSelectCourse::ScreenSelectCourse() m_Menu.Load( THEME->GetPathTo("Graphics","select course background"), THEME->GetPathTo("Graphics","select course top edge"), - ssprintf("%c or %c change course then press START", char(1), char(2)), - false, true, 60 + HELP_TEXT, false, true, TIMER_SECONDS ); this->AddSubActor( &m_Menu ); - m_CourseInfoFrame.SetXY( COURSE_INFO_FRAME_X, COURSE_INFO_FRAME_Y ); - this->AddSubActor( &m_CourseInfoFrame ); + m_Banner.SetXY( BANNER_X, BANNER_Y ); + m_Banner.SetCroppedSize( BANNER_WIDTH, BANNER_HEIGHT ); + this->AddSubActor( &m_Banner ); - m_CourseContentsFrame.SetXY( COURSE_CONTENTS_FRAME_X, COURSE_CONTENTS_FRAME_Y ); + m_sprBannerFrame.Load( THEME->GetPathTo("Graphics","select course info frame") ); + m_sprBannerFrame.SetXY( BANNER_FRAME_X, BANNER_FRAME_Y ); + this->AddSubActor( &m_sprBannerFrame ); + + m_textNumStages.LoadFromFont( THEME->GetPathTo("Fonts","header1") ); + m_textNumStages.SetXY( STAGES_X, STAGES_Y ); + this->AddSubActor( &m_textNumStages ); + + m_textTime.LoadFromFont( THEME->GetPathTo("Fonts","header1") ); + m_textTime.SetXY( TIME_X, TIME_Y ); + this->AddSubActor( &m_textTime ); + + m_CourseContentsFrame.SetXY( CONTENTS_X, CONTENTS_Y ); this->AddSubActor( &m_CourseContentsFrame ); m_MusicWheel.SetXY( WHEEL_X, WHEEL_Y ); this->AddSubActor( &m_MusicWheel ); + for( int p=0; pIsPlayerEnabled((PlayerNumber)p) ) + continue; // skip + + m_sprHighScoreFrame[p].Load( THEME->GetPathTo("Graphics","select music score frame") ); + m_sprHighScoreFrame[p].StopAnimating(); + m_sprHighScoreFrame[p].SetState( p ); + m_sprHighScoreFrame[p].SetXY( BEST_TIME_X(p), BEST_TIME_Y(p) ); + this->AddSubActor( &m_sprHighScoreFrame[p] ); + + m_HighScore[p].SetXY( BEST_TIME_X(p), BEST_TIME_Y(p) ); + m_HighScore[p].SetZoom( 0.6f ); + m_HighScore[p].SetDiffuseColor( PlayerToColor(p) ); + this->AddSubActor( &m_HighScore[p] ); + } + m_textHoldForOptions.LoadFromFont( THEME->GetPathTo("Fonts","Stage") ); m_textHoldForOptions.SetXY( CENTER_X, CENTER_Y ); m_textHoldForOptions.SetText( "press START again for options" ); @@ -117,24 +170,55 @@ void ScreenSelectCourse::DrawPrimitives() void ScreenSelectCourse::TweenOnScreen() { - m_CourseInfoFrame.SetXY( COURSE_INFO_FRAME_X - 400, COURSE_INFO_FRAME_Y ); - m_CourseInfoFrame.BeginTweening( TWEEN_TIME, Actor::TWEEN_BIAS_END ); - m_CourseInfoFrame.SetTweenXY( COURSE_INFO_FRAME_X, COURSE_INFO_FRAME_Y ); + Actor* pActorsInCourseInfoFrame[] = { &m_sprBannerFrame, &m_Banner, &m_textNumStages, &m_textTime }; + const int iNumActorsInGroupInfoFrame = sizeof(pActorsInCourseInfoFrame) / sizeof(Actor*); + int i; + for( i=0; iGetX(); + pActorsInCourseInfoFrame[i]->SetX( fOriginalX-400 ); + pActorsInCourseInfoFrame[i]->BeginTweening( TWEEN_TIME, TWEEN_BOUNCE_END ); + pActorsInCourseInfoFrame[i]->SetTweenX( fOriginalX ); + } - m_CourseContentsFrame.SetXY( COURSE_CONTENTS_FRAME_X - 400, COURSE_CONTENTS_FRAME_Y ); + m_CourseContentsFrame.SetXY( CONTENTS_X - 400, CONTENTS_Y ); m_CourseContentsFrame.BeginTweeningQueued( TWEEN_TIME, Actor::TWEEN_BIAS_END ); - m_CourseContentsFrame.SetTweenXY( COURSE_CONTENTS_FRAME_X, COURSE_CONTENTS_FRAME_Y ); + m_CourseContentsFrame.SetTweenXY( CONTENTS_X, CONTENTS_Y ); + + Actor* pActorsInScore[] = { &m_sprHighScoreFrame[0], &m_sprHighScoreFrame[1], &m_HighScore[0], &m_HighScore[1] }; + const int iNumActorsInScore = sizeof(pActorsInScore) / sizeof(Actor*); + for( i=0; iGetX(); + pActorsInScore[i]->SetX( fOriginalX+400 ); + pActorsInScore[i]->BeginTweening( TWEEN_TIME, TWEEN_BIAS_END ); + pActorsInScore[i]->SetTweenX( fOriginalX ); + } m_MusicWheel.TweenOnScreen(); } void ScreenSelectCourse::TweenOffScreen() { - m_CourseInfoFrame.BeginTweeningQueued( TWEEN_TIME*1.5f, Actor::TWEEN_BOUNCE_BEGIN ); - m_CourseInfoFrame.SetTweenXY( COURSE_INFO_FRAME_X - 400, COURSE_INFO_FRAME_Y ); + Actor* pActorsInCourseInfoFrame[] = { &m_sprBannerFrame, &m_Banner, &m_textNumStages, &m_textTime }; + const int iNumActorsInGroupInfoFrame = sizeof(pActorsInCourseInfoFrame) / sizeof(Actor*); + int i; + for( i=0; iBeginTweeningQueued( TWEEN_TIME, TWEEN_BOUNCE_BEGIN ); + pActorsInCourseInfoFrame[i]->SetTweenX( pActorsInCourseInfoFrame[i]->GetX()-400 ); + } m_CourseContentsFrame.BeginTweeningQueued( TWEEN_TIME, Actor::TWEEN_BOUNCE_BEGIN ); - m_CourseContentsFrame.SetTweenXY( COURSE_CONTENTS_FRAME_X - 400, COURSE_CONTENTS_FRAME_Y ); + m_CourseContentsFrame.SetTweenXY( CONTENTS_X - 400, CONTENTS_Y ); + + Actor* pActorsInScore[] = { &m_sprHighScoreFrame[0], &m_sprHighScoreFrame[1], &m_HighScore[0], &m_HighScore[1] }; + const int iNumActorsInScore = sizeof(pActorsInScore) / sizeof(Actor*); + for( i=0; iBeginTweening( TWEEN_TIME, TWEEN_BIAS_BEGIN ); + pActorsInScore[i]->SetTweenX( pActorsInScore[i]->GetX()+400 ); + } m_MusicWheel.TweenOffScreen(); } @@ -252,6 +336,8 @@ void ScreenSelectCourse::MenuStart( const PlayerNumber p ) pCourse->GetPlayerOptions( &GAMESTATE->m_PlayerOptions[p] ); pCourse->GetSongOptions( &GAMESTATE->m_SongOptions ); + m_Menu.StopTimer(); + this->SendScreenMessage( SM_GoToNextState, 2.5f ); break; @@ -274,11 +360,19 @@ void ScreenSelectCourse::AfterCourseChange() case TYPE_COURSE: { Course* pCourse = m_MusicWheel.GetSelectedCourse(); - m_CourseInfoFrame.SetFromCourse( pCourse ); + + m_textNumStages.SetText( ssprintf("%d", pCourse->m_iStages) ); + float fTotalSeconds = 0; + for( int i=0; im_iStages; i++ ) + fTotalSeconds += pCourse->m_apSongs[i]->m_fMusicLengthSeconds; + m_textTime.SetText( SecondsToTime(fTotalSeconds) ); + + m_Banner.SetFromCourse( pCourse ); + m_CourseContentsFrame.SetFromCourse( pCourse ); } break; - case TYPE_SECTION: // this probably means "no courses" + case TYPE_SECTION: // if we get here, there are no courses break; default: ASSERT(0); diff --git a/stepmania/src/ScreenSelectCourse.h b/stepmania/src/ScreenSelectCourse.h index ec5d353a22..f0f10bab86 100644 --- a/stepmania/src/ScreenSelectCourse.h +++ b/stepmania/src/ScreenSelectCourse.h @@ -15,9 +15,9 @@ #include "RandomStream.h" #include "GameConstantsAndTypes.h" #include "MusicWheel.h" -#include "CourseInfoFrame.h" #include "CourseContentsFrame.h" #include "MenuElements.h" +#include "FadingBanner.h" class ScreenSelectCourse : public Screen @@ -44,8 +44,13 @@ protected: MenuElements m_Menu; - CourseInfoFrame m_CourseInfoFrame; + Sprite m_sprBannerFrame; + FadingBanner m_Banner; + BitmapText m_textNumStages; + BitmapText m_textTime; CourseContentsFrame m_CourseContentsFrame; + Sprite m_sprHighScoreFrame[NUM_PLAYERS]; + ScoreDisplayNormal m_HighScore[NUM_PLAYERS]; MusicWheel m_MusicWheel; bool m_bMadeChoice; diff --git a/stepmania/src/ScreenSelectDifficulty.cpp b/stepmania/src/ScreenSelectDifficulty.cpp index 4398f44732..80c792d7e7 100644 --- a/stepmania/src/ScreenSelectDifficulty.cpp +++ b/stepmania/src/ScreenSelectDifficulty.cpp @@ -484,6 +484,9 @@ void ScreenSelectDifficulty::TweenOffScreen() for( p=0; pGetMetric("SelectStyle","HelpText") #define TIMER_SECONDS THEME->GetMetricI("SelectStyle","TimerSeconds") -#define SKIP_SELECT_DIFFICULTY THEME->GetMetricB("General","SkipSelectDifficulty") +#define SELECT_DIFFICULTY_TYPE THEME->GetMetricI("General","SelectDifficultyType") +enum SelectDifficultyType // for use with the metric above +{ + SELECT_DIFFICULTY_TYPE_SKIP = 0, + SELECT_DIFFICULTY_TYPE_MAX, +}; const ScreenMessage SM_GoToPrevState = ScreenMessage(SM_User + 1); const ScreenMessage SM_GoToNextState = ScreenMessage(SM_User + 2); @@ -152,10 +157,17 @@ void ScreenSelectStyle::HandleScreenMessage( const ScreenMessage SM ) SCREENMAN->SetNewScreen( new ScreenTitleMenu ); break; case SM_GoToNextState: - if( SKIP_SELECT_DIFFICULTY ) + switch( SELECT_DIFFICULTY_TYPE ) + { + case SELECT_DIFFICULTY_TYPE_SKIP: SCREENMAN->SetNewScreen( new ScreenSelectGroup ); - else + break; + case SELECT_DIFFICULTY_TYPE_MAX: SCREENMAN->SetNewScreen( new ScreenSelectDifficulty ); + break; + default: + ASSERT(0); + } break; } } diff --git a/stepmania/src/ScreenSelectStyle5th.cpp b/stepmania/src/ScreenSelectStyle5th.cpp new file mode 100644 index 0000000000..9db4430bd6 --- /dev/null +++ b/stepmania/src/ScreenSelectStyle5th.cpp @@ -0,0 +1,475 @@ +#include "stdafx.h" +/* +----------------------------------------------------------------------------- + Class: ScreenSelectStyle5th + + Desc: See header. + + Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved. + Chris Danford +----------------------------------------------------------------------------- +*/ + + +#include "ScreenSelectStyle5th.h" +#include "ScreenManager.h" +#include "PrefsManager.h" +#include "RageMusic.h" +#include "ScreenTitleMenu.h" +#include "ScreenCaution.h" +#include "GameConstantsAndTypes.h" +#include "PrefsManager.h" +#include "ScreenSelectDifficulty.h" +#include "ScreenSandbox.h" +#include "GameManager.h" +#include "RageLog.h" +#include "GameState.h" +#include "PrefsManager.h" + + +const CString DANCE_STYLES[] = { + "single", + "versus", + "double", + "couple", + "solo", +}; +const int NUM_DANCE_STYLES = sizeof(DANCE_STYLES)/sizeof(CString); + +const float PAD_X[NUM_STYLE_PADS] = { + CENTER_X-250, + CENTER_X-125, + CENTER_X-20, + CENTER_X+125, + CENTER_X+250, +}; +const float PAD_Y[NUM_STYLE_PADS] = { + CENTER_Y+60, + CENTER_Y-30, + CENTER_Y+70, + CENTER_Y-30, + CENTER_Y+60, +}; +const float DANCER_X[NUM_STYLE_DANCERS] = { + PAD_X[0], + PAD_X[1]-35, + PAD_X[1]+35, + PAD_X[2], + PAD_X[3]-35, + PAD_X[3]+35, + PAD_X[4], +}; +const float DANCER_Y[NUM_STYLE_DANCERS] = { + PAD_Y[0], + PAD_Y[1]+20, + PAD_Y[1]-20, + PAD_Y[2], + PAD_Y[3]+20, + PAD_Y[3]-20, + PAD_Y[4], +}; + +CString TEXT_EXPLANATION1[NUM_DANCE_STYLES] = { + "1 Player", + "2 Players", + "1 Player", + "2 Players", + "1 Player" +}; +CString TEXT_EXPLANATION2[NUM_DANCE_STYLES] = { + "Dance using 4 panels on one pad", + "Each uses 4 panels on one pad", + "Dance using 8 panels on two pads", + "Each uses 4 panels on one pad", + "Dance using 6 panels on one pad" +}; + +const float EXPLANATION1_ZOOM_X = 0.8f; +const float EXPLANATION1_ZOOM_Y = 1; +const float EXPLANATION2_ZOOM_X = 0.5f; +const float EXPLANATION2_ZOOM_Y = 0.7f; + +const float ICON_X = 120; +const float ICON_Y = SCREEN_HEIGHT - 70; + +const float EXPLANATION1_X = ICON_X+110; +const float EXPLANATION1_Y = ICON_Y-16; +const float EXPLANATION2_X = EXPLANATION1_X; +const float EXPLANATION2_Y = ICON_Y+16; + +const float HELP_X = CENTER_X; +const float HELP_Y = SCREEN_HEIGHT-20; + +const float TWEEN_TIME = 0.35f; + +const D3DXCOLOR COLOR_P1_SELECTED = D3DXCOLOR(0.4f,1.0f,0.8f,1); +const D3DXCOLOR COLOR_P2_SELECTED = D3DXCOLOR(1.0f,0.5f,0.2f,1); +const D3DXCOLOR COLOR_P1_NOT_SELECTED = COLOR_P1_SELECTED*0.5f + D3DXCOLOR(0,0,0,0.5f); +const D3DXCOLOR COLOR_P2_NOT_SELECTED = COLOR_P2_SELECTED*0.5f + D3DXCOLOR(0,0,0,0.5f); + + +const ScreenMessage SM_GoToPrevState = ScreenMessage(SM_User + 1); +const ScreenMessage SM_GoToNextState = ScreenMessage(SM_User + 2); +const ScreenMessage SM_UpdateAnimations = ScreenMessage(SM_User + 3); +const ScreenMessage SM_TweenExplanation2 = ScreenMessage(SM_User + 4); + + +ScreenSelectStyle5th::ScreenSelectStyle5th() +{ + LOG->Trace( "ScreenSelectStyle5th::ScreenSelectStyle5th()" ); + + m_iSelection = 0; // single + + + for( int i=0; iGetPathTo("Graphics",ssprintf("select style pad game %d style %d",GAMESTATE->m_CurGame,i)) ); +// m_sprPad[i].SetXY( PAD_X[i], PAD_Y[i] ); +// m_sprPad[i].SetZoom( 1 ); + this->AddSubActor( &m_sprPad[i] ); + } + + + for( i=0; iGetPathTo("Graphics",ssprintf("select style player game %d style %d",GAMESTATE->m_CurGame,i)) ); + m_sprDancer[i].SetVertAlign( Actor::align_top ); +// m_sprDancer[i].SetXY( DANCER_X[i], DANCER_Y[i] ); +// m_sprDancer[i].SetZoom( 2 ); + m_sprDancer[i].StopAnimating(); + this->AddSubActor( &m_sprDancer[i] ); + } + + + m_sprStyleIcon.Load( THEME->GetPathTo("Graphics",ssprintf("select style icons game %d",GAMESTATE->m_CurGame)) ); + m_sprStyleIcon.TurnShadowOff(); + m_sprStyleIcon.StopAnimating(); + m_sprStyleIcon.SetXY( ICON_X, ICON_Y ); + this->AddSubActor( &m_sprStyleIcon ); + + + m_textExplanation1.LoadFromFont( THEME->GetPathTo("Fonts","header1") ); + m_textExplanation1.SetDiffuseColor( D3DXCOLOR(0,0.7f,0,1) ); + m_textExplanation1.SetXY( EXPLANATION1_X, EXPLANATION1_Y ); + m_textExplanation1.SetZ( -1 ); + m_textExplanation1.SetZoomX( EXPLANATION1_ZOOM_X ); + m_textExplanation1.SetZoomY( EXPLANATION1_ZOOM_Y ); + m_textExplanation1.SetHorizAlign( BitmapText::align_left ); + this->AddSubActor( &m_textExplanation1 ); + + m_textExplanation2.LoadFromFont( THEME->GetPathTo("Fonts","header1") ); + m_textExplanation2.SetDiffuseColor( D3DXCOLOR(0,0.7f,0,1) ); + m_textExplanation2.SetXY( EXPLANATION2_X, EXPLANATION2_Y ); + m_textExplanation2.SetZ( -1 ); + m_textExplanation2.SetZoomX( EXPLANATION2_ZOOM_X ); + m_textExplanation2.SetZoomY( EXPLANATION2_ZOOM_Y ); + m_textExplanation2.SetHorizAlign( BitmapText::align_left ); + this->AddSubActor( &m_textExplanation2 ); + + m_Menu.Load( + THEME->GetPathTo("Graphics","select style background"), + THEME->GetPathTo("Graphics","select style top edge"), + ssprintf("Use %c %c to select, then press START", char(1), char(2)), + false, true, 40 + ); + this->AddSubActor( &m_Menu ); + + m_soundChange.Load( THEME->GetPathTo("Graphics","select style change") ); + m_soundSelect.Load( THEME->GetPathTo("Sounds","menu start") ); + + + SOUND->PlayOnceStreamedFromDir( ANNOUNCER->GetPathTo(ANNOUNCER_SELECT_STYLE_INTRO) ); + + + if( !MUSIC->IsPlaying() ) + { + MUSIC->Load( THEME->GetPathTo("Sounds","select style music") ); + MUSIC->Play( true ); + } + + m_soundChange.PlayRandom(); + TweenOnScreen(); + m_Menu.TweenOnScreenFromBlack( SM_None ); +} + + +ScreenSelectStyle5th::~ScreenSelectStyle5th() +{ + LOG->Trace( "ScreenSelectStyle5th::~ScreenSelectStyle5th()" ); + +} + +void ScreenSelectStyle5th::DrawPrimitives() +{ + m_Menu.DrawBottomLayer(); + Screen::DrawPrimitives(); + m_Menu.DrawTopLayer(); +} + +void ScreenSelectStyle5th::Input( const DeviceInput& DeviceI, const InputEventType type, const GameInput &GameI, const MenuInput &MenuI, const StyleInput &StyleI ) +{ + LOG->Trace( "ScreenSelectStyle5th::Input()" ); + + if( m_Menu.IsClosing() ) + return; + + Screen::Input( DeviceI, type, GameI, MenuI, StyleI ); // default input handler +} + +void ScreenSelectStyle5th::HandleScreenMessage( const ScreenMessage SM ) +{ + Screen::HandleScreenMessage( SM ); + + switch( SM ) + { + case SM_MenuTimer: + MenuStart(PLAYER_1); + break; + case SM_GoToPrevState: + MUSIC->Stop(); + SCREENMAN->SetNewScreen( new ScreenTitleMenu ); + break; + case SM_GoToNextState: + SCREENMAN->SetNewScreen( new ScreenSelectDifficulty ); + break; + case SM_TweenExplanation2: + m_textExplanation2.BeginTweening( 0.7f ); + m_textExplanation2.SetTweenZoomX( EXPLANATION2_ZOOM_X ); + break; + case SM_UpdateAnimations: + for( int i=0; im_CurStyle = Style( m_iSelection ); + GAMESTATE->m_MasterPlayerNumber = p; + + AnnouncerElement ae; + switch( GAMESTATE->m_CurStyle ) + { + case STYLE_DANCE_SINGLE: ae = ANNOUNCER_SELECT_STYLE_COMMENT_SINGLE; break; + case STYLE_DANCE_VERSUS: ae = ANNOUNCER_SELECT_STYLE_COMMENT_VERSUS; break; + case STYLE_DANCE_DOUBLE: ae = ANNOUNCER_SELECT_STYLE_COMMENT_DOUBLE; break; + case STYLE_DANCE_COUPLE: ae = ANNOUNCER_SELECT_STYLE_COMMENT_COUPLE; break; + case STYLE_DANCE_SOLO: ae = ANNOUNCER_SELECT_STYLE_COMMENT_SOLO; break; + case STYLE_PUMP_SINGLE: ae = ANNOUNCER_SELECT_STYLE_COMMENT_SINGLE; break; + case STYLE_PUMP_VERSUS: ae = ANNOUNCER_SELECT_STYLE_COMMENT_VERSUS; break; + default: ASSERT(0); break; // invalid Style + } + SOUND->PlayOnceStreamedFromDir( ANNOUNCER->GetPathTo(ae) ); + + this->ClearMessageQueue(); + + TweenOffScreen(); + m_Menu.TweenOffScreenToMenu( SM_GoToNextState ); + m_soundSelect.PlayRandom(); +} + +void ScreenSelectStyle5th::MenuBack( const PlayerNumber p ) +{ + MUSIC->Stop(); + + m_Menu.TweenOffScreenToBlack( SM_GoToPrevState, true ); +} + +void ScreenSelectStyle5th::BeforeChange() +{ + switch( m_iSelection ) + { + case 0: + m_sprDancer[0].BeginTweening( TWEEN_TIME ); + m_sprDancer[0].SetTweenDiffuseColor( COLOR_P1_NOT_SELECTED ); + break; + case 1: + m_sprDancer[1].BeginTweening( TWEEN_TIME ); + m_sprDancer[1].SetTweenDiffuseColor( COLOR_P1_NOT_SELECTED ); + m_sprDancer[2].BeginTweening( TWEEN_TIME ); + m_sprDancer[2].SetTweenDiffuseColor( COLOR_P2_NOT_SELECTED ); + break; + case 2: + m_sprDancer[3].BeginTweening( TWEEN_TIME ); + m_sprDancer[3].SetTweenDiffuseColor( COLOR_P1_NOT_SELECTED ); + break; + case 3: + m_sprDancer[4].BeginTweening( TWEEN_TIME ); + m_sprDancer[4].SetTweenDiffuseColor( COLOR_P1_NOT_SELECTED ); + m_sprDancer[5].BeginTweening( TWEEN_TIME ); + m_sprDancer[5].SetTweenDiffuseColor( COLOR_P2_NOT_SELECTED ); + break; + case 4: + m_sprDancer[6].BeginTweening( TWEEN_TIME ); + m_sprDancer[6].SetTweenDiffuseColor( COLOR_P1_NOT_SELECTED ); + break; + } + + +} + +void ScreenSelectStyle5th::AfterChange() +{ + this->ClearMessageQueue(); + + m_textExplanation1.SetText( TEXT_EXPLANATION1[m_iSelection] ); + m_textExplanation1.SetZoomX( 0 ); + m_textExplanation1.BeginTweening( 0.6f ); + m_textExplanation1.SetTweenZoomX( EXPLANATION1_ZOOM_X ); + + m_textExplanation2.SetText( TEXT_EXPLANATION2[m_iSelection] ); + m_textExplanation2.StopTweening(); + m_textExplanation2.SetZoomX( 0 ); + + switch( m_iSelection ) + { + case 0: + m_sprPad[0].BeginTweening( TWEEN_TIME ); + m_sprPad[0].SetTweenDiffuseColor( D3DXCOLOR(1,1,1,1) ); + m_sprDancer[0].BeginTweening( TWEEN_TIME ); + m_sprDancer[0].SetTweenDiffuseColor( COLOR_P1_SELECTED ); + m_sprDancer[0].StartAnimating(); + m_sprStyleIcon.SetState( 0 ); + break; + case 1: + m_sprPad[1].BeginTweening( TWEEN_TIME ); + m_sprPad[1].SetTweenDiffuseColor( D3DXCOLOR(1,1,1,1) ); + m_sprDancer[1].BeginTweening( TWEEN_TIME ); + m_sprDancer[1].SetTweenDiffuseColor( COLOR_P1_SELECTED ); + m_sprDancer[1].StartAnimating(); + m_sprDancer[2].BeginTweening( TWEEN_TIME ); + m_sprDancer[2].SetTweenDiffuseColor( COLOR_P2_SELECTED ); + m_sprDancer[2].StartAnimating(); + m_sprStyleIcon.SetState( 1 ); + break; + case 2: + m_sprPad[2].BeginTweening( TWEEN_TIME ); + m_sprPad[2].SetTweenDiffuseColor( D3DXCOLOR(1,1,1,1) ); + m_sprDancer[3].BeginTweening( TWEEN_TIME ); + m_sprDancer[3].SetTweenDiffuseColor( COLOR_P1_SELECTED ); + m_sprDancer[3].StartAnimating(); + m_sprStyleIcon.SetState( 2 ); + break; + case 3: + m_sprPad[3].BeginTweening( TWEEN_TIME ); + m_sprPad[3].SetTweenDiffuseColor( D3DXCOLOR(1,1,1,1) ); + m_sprDancer[4].BeginTweening( TWEEN_TIME ); + m_sprDancer[4].SetTweenDiffuseColor( COLOR_P1_SELECTED ); + m_sprDancer[4].StartAnimating(); + m_sprDancer[5].BeginTweening( TWEEN_TIME ); + m_sprDancer[5].SetTweenDiffuseColor( COLOR_P2_SELECTED ); + m_sprDancer[5].StartAnimating(); + m_sprStyleIcon.SetState( 3 ); + break; + case 4: + m_sprPad[4].BeginTweening( TWEEN_TIME ); + m_sprPad[4].SetTweenDiffuseColor( D3DXCOLOR(1,1,1,1) ); + m_sprDancer[6].BeginTweening( TWEEN_TIME ); + m_sprDancer[6].SetTweenDiffuseColor( COLOR_P1_SELECTED ); + m_sprDancer[6].StartAnimating(); + m_sprStyleIcon.SetState( 4 ); + break; + } + + this->SendScreenMessage( SM_TweenExplanation2, 1 ); + this->SendScreenMessage( SM_UpdateAnimations, TWEEN_TIME ); +} + +void ScreenSelectStyle5th::TweenOffScreen() +{ + for( int i=0; iSendScreenMessage( SM_TweenExplanation2, 1 ); + this->SendScreenMessage( SM_UpdateAnimations, TWEEN_TIME ); + +} diff --git a/stepmania/src/ScreenSelectStyle5th.h b/stepmania/src/ScreenSelectStyle5th.h new file mode 100644 index 0000000000..998e1f37ef --- /dev/null +++ b/stepmania/src/ScreenSelectStyle5th.h @@ -0,0 +1,69 @@ +/* +----------------------------------------------------------------------------- + Class: ScreenSelectStyle5th + + Desc: DDR 5th Mix-style screen selection. + + Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved. + Chris Danford +----------------------------------------------------------------------------- +*/ + +#include "Screen.h" +#include "Sprite.h" +#include "BitmapText.h" +#include "TransitionFade.h" +#include "Quad.h" +#include "RandomSample.h" +#include "Quad.h" +#include "TransitionKeepAlive.h" +#include "MenuElements.h" + +// +// TODO: Remove dance hard coded portions +// + +const int NUM_STYLE_DANCERS = 7; // single, versus dancers, double, couple dancers, solo +const int NUM_STYLE_PADS = 5; + + +class ScreenSelectStyle5th : public Screen +{ +public: + ScreenSelectStyle5th(); + virtual ~ScreenSelectStyle5th(); + + virtual void DrawPrimitives(); + virtual void Input( const DeviceInput& DeviceI, const InputEventType type, const GameInput &GameI, const MenuInput &MenuI, const StyleInput &StyleI ); + virtual void HandleScreenMessage( const ScreenMessage SM ); + + void MenuLeft( const PlayerNumber p ); + void MenuRight( const PlayerNumber p ); + void MenuStart( const PlayerNumber p ); + void MenuBack( const PlayerNumber p ); + void TweenOffScreen(); + void TweenOnScreen(); + +private: + void BeforeChange(); + void AfterChange(); + + MenuElements m_Menu; + + Sprite m_sprDancer[NUM_STYLE_DANCERS]; + Sprite m_sprPad[NUM_STYLE_PADS]; + + Sprite m_sprStyleIcon; + + BitmapText m_textExplanation1; + BitmapText m_textExplanation2; + Quad m_rectCursor; + + RandomSample m_soundChange; + RandomSample m_soundSelect; + + int m_iSelection; + +}; + + diff --git a/stepmania/src/ScreenStage.cpp b/stepmania/src/ScreenStage.cpp index 5c693d2209..216d9f1ab3 100644 --- a/stepmania/src/ScreenStage.cpp +++ b/stepmania/src/ScreenStage.cpp @@ -26,13 +26,12 @@ #include "AnnouncerManager.h" #include "GameState.h" -#define STAGE_SCREEN_TYPE THEME->GetMetricI("General","StageScreenType") - -enum StageScreenTypes // magic number nuker! for use with the metrics +#define STAGE_TYPE THEME->GetMetricI("General","StageType") +enum StageType // for use with the metric above { - SCREENTYPE_DANCE, - SCREENTYPE_PUMP, - SCREENTYPE_EZ2 + STAGE_TYPE_MAX = 0, + STAGE_TYPE_PUMP, + STAGE_TYPE_EZ2 }; const ScreenMessage SM_StartFadingOut = ScreenMessage(SM_User + 1); @@ -40,14 +39,14 @@ const ScreenMessage SM_DoneFadingIn = ScreenMessage(SM_User + 2); const ScreenMessage SM_GoToNextState = ScreenMessage(SM_User + 3); -enum StageType +enum StageMode { - TYPE_NORMAL, - TYPE_FINAL, - TYPE_EXTRA1, - TYPE_EXTRA2, - TYPE_ONI, - TYPE_ENDLESS + MODE_NORMAL, + MODE_FINAL, + MODE_EXTRA1, + MODE_EXTRA2, + MODE_ONI, + MODE_ENDLESS }; ScreenStage::ScreenStage() @@ -76,18 +75,18 @@ ScreenStage::ScreenStage() m_frameStage.SetTweenY( CENTER_Y ); - StageType stage_type; - if( GAMESTATE->m_PlayMode == PLAY_MODE_ONI ) stage_type = TYPE_ONI; - else if( GAMESTATE->m_PlayMode == PLAY_MODE_ENDLESS ) stage_type = TYPE_ENDLESS; - else if( GAMESTATE->IsExtraStage() ) stage_type = TYPE_EXTRA1; - else if( GAMESTATE->IsExtraStage2() ) stage_type = TYPE_EXTRA2; - else if( GAMESTATE->IsFinalStage() ) stage_type = TYPE_FINAL; - else stage_type = TYPE_NORMAL; + StageMode stage_mode; + if( GAMESTATE->m_PlayMode == PLAY_MODE_ONI ) stage_mode = MODE_ONI; + else if( GAMESTATE->m_PlayMode == PLAY_MODE_ENDLESS ) stage_mode = MODE_ENDLESS; + else if( GAMESTATE->IsExtraStage() ) stage_mode = MODE_EXTRA1; + else if( GAMESTATE->IsExtraStage2() ) stage_mode = MODE_EXTRA2; + else if( GAMESTATE->IsFinalStage() ) stage_mode = MODE_FINAL; + else stage_mode = MODE_NORMAL; - switch( stage_type ) + switch( stage_mode ) { - case TYPE_NORMAL: + case MODE_NORMAL: { const int iStageNo = GAMESTATE->GetStageIndex()+1; switch( iStageNo ) @@ -101,19 +100,19 @@ ScreenStage::ScreenStage() } } break; - case TYPE_FINAL: + case MODE_FINAL: SOUND->PlayOnceStreamedFromDir( ANNOUNCER->GetPathTo(ANNOUNCER_STAGE_FINAL) ); break; - case TYPE_EXTRA1: + case MODE_EXTRA1: SOUND->PlayOnceStreamedFromDir( ANNOUNCER->GetPathTo(ANNOUNCER_STAGE_EXTRA1) ); break; - case TYPE_EXTRA2: + case MODE_EXTRA2: SOUND->PlayOnceStreamedFromDir( ANNOUNCER->GetPathTo(ANNOUNCER_STAGE_EXTRA2) ); break; - case TYPE_ONI: + case MODE_ONI: SOUND->PlayOnceStreamedFromDir( ANNOUNCER->GetPathTo(ANNOUNCER_STAGE_ONI) ); break; - case TYPE_ENDLESS: + case MODE_ENDLESS: SOUND->PlayOnceStreamedFromDir( ANNOUNCER->GetPathTo(ANNOUNCER_STAGE_ENDLESS) ); break; default: @@ -126,7 +125,7 @@ ScreenStage::ScreenStage() // the ez2Final is so that when we're in normal we can go and see if we're really // FINAL or not. at the end of normal, if we WERE FINAL, we set it back to final // hacky or what? =) - if ( STAGE_SCREEN_TYPE == SCREENTYPE_EZ2 && stage_type == TYPE_FINAL ) + if( STAGE_TYPE == STAGE_TYPE_EZ2 && stage_mode == MODE_FINAL ) { for( int i=0; i<4; i++ ) { @@ -134,12 +133,12 @@ ScreenStage::ScreenStage() m_sprNumbers[i].StopAnimating(); } ez2Final=1; - stage_type = TYPE_NORMAL; + stage_mode = MODE_NORMAL; } - switch( stage_type ) + switch( stage_mode ) { - case TYPE_NORMAL: + case MODE_NORMAL: { const int iStageNo = GAMESTATE->GetStageIndex()+1; @@ -187,7 +186,7 @@ ScreenStage::ScreenStage() // EZ2 TYPE DEFINITION // ///////////////////////// - if ( STAGE_SCREEN_TYPE == SCREENTYPE_EZ2) // Initialize and manipulate existing graphics for Ez2dancer Screen Type + if ( STAGE_TYPE == STAGE_TYPE_EZ2) // Initialize and manipulate existing graphics for Ez2dancer Screen Type { for( i=0; iGetPathTo("Graphics","stage final") ); m_frameStage.AddSubActor( &m_sprStage ); break; - case TYPE_EXTRA1: + case MODE_EXTRA1: m_sprStage.Load( THEME->GetPathTo("Graphics","stage extra1") ); m_frameStage.AddSubActor( &m_sprStage ); break; - case TYPE_EXTRA2: + case MODE_EXTRA2: m_sprStage.Load( THEME->GetPathTo("Graphics","stage extra2") ); m_frameStage.AddSubActor( &m_sprStage ); break; - case TYPE_ONI: + case MODE_ONI: m_sprStage.Load( THEME->GetPathTo("Graphics","stage oni") ); m_frameStage.AddSubActor( &m_sprStage ); break; - case TYPE_ENDLESS: + case MODE_ENDLESS: m_sprStage.Load( THEME->GetPathTo("Graphics","stage endless") ); m_frameStage.AddSubActor( &m_sprStage ); break; @@ -482,7 +481,7 @@ void ScreenStage::DrawPrimitives() { DISPLAY->EnableZBuffer(); - if ( STAGE_SCREEN_TYPE == SCREENTYPE_DANCE) // only DANCE uses the quadmask + if ( STAGE_TYPE == STAGE_TYPE_MAX) // only DANCE uses the quadmask m_quadMask.Draw(); m_frameStage.Draw(); @@ -490,7 +489,7 @@ void ScreenStage::DrawPrimitives() m_Fade.Draw(); - if ( STAGE_SCREEN_TYPE == SCREENTYPE_PUMP) // only PUMP uses the song background on the stage screen + if ( STAGE_TYPE == STAGE_TYPE_PUMP) // only PUMP uses the song background on the stage screen m_sprSongBackground.Draw(); } diff --git a/stepmania/src/ScreenTitleMenu.cpp b/stepmania/src/ScreenTitleMenu.cpp index bfaf8e0567..30f3a4b904 100644 --- a/stepmania/src/ScreenTitleMenu.cpp +++ b/stepmania/src/ScreenTitleMenu.cpp @@ -31,7 +31,8 @@ #include "GameState.h" #include "GameManager.h" #include "ScreenGameplay.h" - +#include "ScreenSelectStyle5th.h" +#include "ScreenEz2SelectStyle.h" const CString CHOICE_TEXT[ScreenTitleMenu::NUM_TITLE_MENU_CHOICES] = { "GAME START", @@ -61,7 +62,20 @@ const CString CHOICE_TEXT[ScreenTitleMenu::NUM_TITLE_MENU_CHOICES] = { #define SECONDS_BETWEEN_ATTRACT THEME->GetMetricF("TitleMenu","SecondsBetweenAttract") #define HELP_TEXT THEME->GetMetric("TitleMenu","HelpText") -#define USE_CAUTION_OR_SELECT_PLAYER THEME->GetMetricB("General","UseCautionOrSelectPlayer") +#define CAUTION_TYPE THEME->GetMetricI("General","CautionType") +enum CautionType // for use with the metric above +{ + CAUTION_TYPE_SKIP = 0, + CAUTION_TYPE_DDR, + CAUTION_TYPE_EZ2_SELECT_PLAYER, +}; +#define SELECT_STYLE_TYPE THEME->GetMetricI("General","SelectStyleType") +enum SelectStyleType // for use with the metric above +{ + SELECT_STYLE_TYPE_MAX = 0, + SELECT_STYLE_TYPE_5TH, + SELECT_STYLE_TYPE_EZ2, +}; const ScreenMessage SM_PlayAttract = ScreenMessage(SM_User+1); const ScreenMessage SM_GoToNextScreen = ScreenMessage(SM_User+12); @@ -210,10 +224,33 @@ void ScreenTitleMenu::HandleScreenMessage( const ScreenMessage SM ) switch( m_TitleMenuChoice ) { case CHOICE_GAME_START: - if( USE_CAUTION_OR_SELECT_PLAYER ) - SCREENMAN->SetNewScreen( new ScreenEz2SelectPlayer ); - else + switch( CAUTION_TYPE ) + { + case CAUTION_TYPE_SKIP: + switch( SELECT_STYLE_TYPE ) + { + case SELECT_STYLE_TYPE_MAX: + SCREENMAN->SetNewScreen( new ScreenSelectStyle ); + break; + case SELECT_STYLE_TYPE_5TH: + SCREENMAN->SetNewScreen( new ScreenSelectStyle5th ); + break; + case SELECT_STYLE_TYPE_EZ2: + SCREENMAN->SetNewScreen( new ScreenEz2SelectStyle ); + break; + default: + ASSERT(0); + } + break; + case CAUTION_TYPE_DDR: SCREENMAN->SetNewScreen( new ScreenCaution ); + break; + case CAUTION_TYPE_EZ2_SELECT_PLAYER: + SCREENMAN->SetNewScreen( new ScreenEz2SelectPlayer ); + break; + default: + ASSERT(0); + } break; case CHOICE_SELECT_GAME: SCREENMAN->SetNewScreen( new ScreenSelectGame ); diff --git a/stepmania/src/Song.cpp b/stepmania/src/Song.cpp index 5bc8151b1e..73f1bcca3d 100644 --- a/stepmania/src/Song.cpp +++ b/stepmania/src/Song.cpp @@ -153,7 +153,7 @@ void Song::GetBeatAndBPSFromElapsedTime( float fElapsedTime, float &fBeatOut, fl for( int i=0; i + + + + @@ -423,6 +429,12 @@ + + + + @@ -441,12 +453,6 @@ - - - - - - - - - - - - @@ -683,16 +677,10 @@ RelativePath="SnapDisplay.h"> + RelativePath="SongSelector.cpp"> - - - - + RelativePath="SongSelector.h"> @@ -706,12 +694,6 @@ - - - - GetValue(sScreenName,sValueName,sValue) ) return sValue; - ASSERT(0); +#ifdef _DEBUG + if( IDRETRY == AfxMessageBox( ssprintf("The theme metric %s-%s is missing. Correct this and click Retry, or Cancel to break.",sScreenName,sValueName), MB_RETRYCANCEL ) ) + goto try_metric_again; +#endif + throw RageException( "Theme metric '%s : %s' could not be found in '%s' or '%s'.", sScreenName, sValueName, diff --git a/stepmania/src/song.h b/stepmania/src/song.h index c324bd30c4..acd5344245 100644 --- a/stepmania/src/song.h +++ b/stepmania/src/song.h @@ -124,7 +124,7 @@ public: fMinBPM = 100000; // inf for( int i=0; i