From 3ff91dffb0f0471df4e1204da87bf7100fd4f29b Mon Sep 17 00:00:00 2001 From: Chris Danford Date: Sat, 11 Jan 2003 08:55:21 +0000 Subject: [PATCH] NEW FEATURE: AutoSync status now shown during gameplay with icon NEW FEATURE: added autogen icon to select music NEW FEATURE: toggle for easter eggs in Machine Options NEW FEATURE: marvelous step timing togglable in Machine Options NEW FEATURE: Grade AAAA (all marvelous) CHANGE: Only show ScreenHowToPlay if at least one player chose easy --- stepmania/NEWS | 6 ++ stepmania/Themes/default/metrics.ini | 33 ++++-- stepmania/src/ActorFrame.cpp | 29 ++++- stepmania/src/ActorFrame.h | 4 +- stepmania/src/Combo.cpp | 12 ++- stepmania/src/GameConstantsAndTypes.h | 2 + stepmania/src/GameState.cpp | 13 +-- stepmania/src/GameState.h | 2 +- stepmania/src/GhostArrow.cpp | 50 +++++---- stepmania/src/GhostArrowBright.cpp | 58 +++++----- stepmania/src/Grade.cpp | 4 +- stepmania/src/Grade.h | 2 +- stepmania/src/GradeDisplay.cpp | 32 +++--- stepmania/src/Judgement.cpp | 28 ++--- stepmania/src/LifeMeterBar.cpp | 9 ++ stepmania/src/LifeMeterBattery.cpp | 1 + stepmania/src/MusicWheel.cpp | 1 - stepmania/src/NoteData.cpp | 2 +- stepmania/src/NoteDataWithScoring.cpp | 9 +- stepmania/src/Player.cpp | 69 +++++++----- stepmania/src/PrefsManager.cpp | 40 ++++--- stepmania/src/PrefsManager.h | 14 ++- stepmania/src/RageInput.cpp | 1 + stepmania/src/ScoreDisplayRolling.cpp | 1 + stepmania/src/ScoreKeeperMAX2.cpp | 1 + stepmania/src/ScreenAppearanceOptions.cpp | 6 +- stepmania/src/ScreenAttract.cpp | 6 +- stepmania/src/ScreenAttract.h | 3 + stepmania/src/ScreenDemonstration.cpp | 5 +- stepmania/src/ScreenEvaluation.cpp | 123 ++++++++-------------- stepmania/src/ScreenEvaluation.h | 2 +- stepmania/src/ScreenGameOver.cpp | 2 + stepmania/src/ScreenGameplay.cpp | 106 ++++++++++++------- stepmania/src/ScreenGameplay.h | 39 +++---- stepmania/src/ScreenInstructions.cpp | 24 ++++- stepmania/src/ScreenLogo.cpp | 69 ++++++++++++ stepmania/src/ScreenLogo.h | 9 ++ stepmania/src/ScreenMachineOptions.cpp | 44 ++++---- stepmania/src/ScreenMusicScroll.cpp | 2 +- stepmania/src/ScreenPrompt.cpp | 3 +- stepmania/src/ScreenSelectMode.cpp | 2 +- stepmania/src/ScreenSelectMusic.cpp | 15 +++ stepmania/src/ScreenSelectMusic.h | 1 + stepmania/src/ScreenSongOptions.cpp | 6 +- stepmania/src/ScreenTitleMenu.cpp | 78 +++++--------- stepmania/src/ScreenTitleMenu.h | 12 +-- stepmania/src/SmallGradeDisplay.cpp | 19 ++-- stepmania/src/SongOptions.cpp | 7 +- stepmania/src/SongOptions.h | 5 +- stepmania/src/StepMania.dsp | 8 +- stepmania/src/StepMania.vcproj | 36 +++++++ 51 files changed, 654 insertions(+), 401 deletions(-) create mode 100644 stepmania/src/ScreenLogo.cpp diff --git a/stepmania/NEWS b/stepmania/NEWS index 48b842dabb..9f26e23b5d 100644 --- a/stepmania/NEWS +++ b/stepmania/NEWS @@ -1,4 +1,10 @@ ----------------------- Version 3.01 --------------------------- +NEW FEATURE: AutoSync status now shown during gameplay with icon +NEW FEATURE: added autogen icon to select music +NEW FEATURE: toggle for easter eggs in Machine Options +NEW FEATURE: marvelous step timing togglable in Machine Options +NEW FEATURE: Grade AAAA (all marvelous) +CHANGE: Only show ScreenHowToPlay if at least one player chose easy NEW FEATURE: New High Score screen NEW FEATURE: Full "attract" sequence NEW FEATURE: .SM files can now contain UTF-8 text. diff --git a/stepmania/Themes/default/metrics.ini b/stepmania/Themes/default/metrics.ini index cc44d70c82..96d0f17076 100644 --- a/stepmania/Themes/default/metrics.ini +++ b/stepmania/Themes/default/metrics.ini @@ -30,18 +30,12 @@ ChoicesSpacingY=42 ChoicesShadowLength=5 HelpX=320 HelpY=440 -LogoX=320 -LogoY=240 -VersionX=590 -VersionY=20 -SongsX=20 -SongsY=20 ColorNotSelected=1,1,1,1 ColorSelected=0.5,1,0.5,1 ZoomNotSelected=1.0 ZoomSelected=1.3 -SecondsBeforeDemonstration=30 -SecondsBetweenAttract=12 +SecondsBetweenComments=12 +SecondsBeforeAttract=30 HelpText=Use &UP; &DOWN; to select, then press START NextScreen=ScreenCaution @@ -332,8 +326,8 @@ SurviveTimeX=320 SurviveTimeY=340 DebugX=320 DebugY=240 -AutoPlayX=320 -AutoPlayY=360 +StatusIconsX=320 +StatusIconsY=400 SecondsBetweenComments=10 DemonstrationSeconds=30 TickEarlySeconds=0.058 @@ -355,6 +349,11 @@ PercentBaseP1X=120 PercentBaseP2X=572 PercentBaseY=134 JudgeLabelsX=320 +MarvelousP1X=230 +MarvelousP2X=410 +MarvelousOniP1X=230 +MarvelousOniP2X=410 +MarvelousY=176 PerfectP1X=230 PerfectP2X=410 PerfectOniP1X=230 @@ -538,6 +537,8 @@ HelpText=Use arrow keys to navigate, ENTER to assign, SPACE to clear, ESCAPE whe ShowSeconds=0.25 ZoomStart=1.0 ZoomEnd=1.5 +ColorMarvelousStart=1.0,1.0,0.3,1 // yellow +ColorMarvelousEnd=1.0,1.0,0.3,0 // yellow no alpha ColorPerfectStart=1.0,1.0,0.3,1 // yellow ColorPerfectEnd=1.0,1.0,0.3,0 // yellow no alpha ColorGreatStart=0.0,1.0,0.4,1 // green @@ -551,6 +552,8 @@ ColorBooEnd=0.8,0.0,0.6,0 // purple no alpha ShowSeconds=0.25 ZoomStart=1.0 ZoomEnd=1.5 +ColorMarvelousStart=1.0,1.0,0.3,1 // yellow +ColorMarvelousEnd=1.0,1.0,0.3,0 // yellow no alpha ColorPerfectStart=1.0,1.0,0.3,1 // yellow ColorPerfectEnd=1.0,1.0,0.3,0 // yellow no alpha ColorGreatStart=0.0,1.0,0.4,1 // green @@ -587,6 +590,8 @@ RightEdge=620 BottomEdge=460 [Player] +JudgeMarvelousZoomX=1.3 +JudgeMarvelousZoomY=1.3 JudgePerfectZoomX=1.3 JudgePerfectZoomY=1.3 JudgeGreatZoomX=1.2 @@ -694,6 +699,8 @@ JudgeDifficulty=Increase this value to cause your steps to be judged more strict LifeDifficulty=Increate this value to cause your life meter to::drain faster and refill slower. HiddenSongs=Some songs are only playable during Oni courses and::with roulette. Leave this "OFF" to always display all songs. ShowStats=Display Performance Statistics in the upper right corner::of the screen. FPS = frames per second.::TPF = triangles per frame. DPF = draws per frame. +EasterEggs=Enable or disable some special easter eggs. +MarvelousTiming=Enable or disable marvelous judgement. [ScreenGraphicOptions] DisplayMode=Chose whether you would like StepMania to run full screen,::or to display in a window on your desktop. @@ -742,6 +749,12 @@ SecondsToShow=10 NextScreen=ScreenLogo [ScreenLogo] +LogoX=320 +LogoY=240 +VersionX=590 +VersionY=20 +SongsX=20 +SongsY=20 SecondsToShow=5 NextScreen=ScreenDemonstration diff --git a/stepmania/src/ActorFrame.cpp b/stepmania/src/ActorFrame.cpp index 74008fac9e..3538b718ff 100644 --- a/stepmania/src/ActorFrame.cpp +++ b/stepmania/src/ActorFrame.cpp @@ -12,13 +12,40 @@ #include "ActorFrame.h" -void ActorFrame::AddChild( Actor* pActor) +void ActorFrame::AddChild( Actor* pActor ) { ASSERT( pActor ); ASSERT( (void*)pActor != (void*)0xC0000005 ); m_SubActors.push_back( pActor ); } +void ActorFrame::MoveToBack( Actor* pActor ) +{ + vector::iterator iter = find( m_SubActors.begin(), m_SubActors.end(), pActor ); + if( iter == m_SubActors.end() ) // didn't find + { + ASSERT(0); // called with a pActor that doesn't exist + return; + } + + m_SubActors.erase( iter ); + m_SubActors.push_back( pActor ); +} + +void ActorFrame::MoveToFront( Actor* pActor ) +{ + vector::iterator iter = find( m_SubActors.begin(), m_SubActors.end(), pActor ); + if( iter == m_SubActors.end() ) // didn't find + { + ASSERT(0); // called with a pActor that doesn't exist + return; + } + + m_SubActors.erase( iter ); + m_SubActors.insert( m_SubActors.begin(), pActor ); +} + + void ActorFrame::DrawPrimitives() { // draw all sub-ActorFrames while we're in the ActorFrame's local coordinate space diff --git a/stepmania/src/ActorFrame.h b/stepmania/src/ActorFrame.h index baa1f431ba..06f8560f95 100644 --- a/stepmania/src/ActorFrame.h +++ b/stepmania/src/ActorFrame.h @@ -16,7 +16,9 @@ class ActorFrame : public Actor { public: - virtual void AddChild( Actor* pActor); + virtual void AddChild( Actor* pActor ); + virtual void MoveToBack( Actor* pActor ); + virtual void MoveToFront( Actor* pActor ); virtual ~ActorFrame() { } virtual void Update( float fDeltaTime ); diff --git a/stepmania/src/Combo.cpp b/stepmania/src/Combo.cpp index b24d0865fe..e74a3dabab 100644 --- a/stepmania/src/Combo.cpp +++ b/stepmania/src/Combo.cpp @@ -57,6 +57,7 @@ void Combo::UpdateScore( TapNoteScore score, int iNumNotesInThisRow ) switch( score ) { + case TNS_MARVELOUS: case TNS_PERFECT: case TNS_GREAT: { @@ -64,10 +65,15 @@ void Combo::UpdateScore( TapNoteScore score, int iNumNotesInThisRow ) m_iCurCombo += iNumNotesInThisRow; // continue combo - if( score == TNS_PERFECT ) m_iCurComboOfPerfects += iNumNotesInThisRow; - else m_iCurComboOfPerfects = 0; + switch( score ) + { + case TNS_MARVELOUS: + case TNS_PERFECT: + m_iCurComboOfPerfects += iNumNotesInThisRow; + break; + } - if( m_iCurComboOfPerfects>=150 && (m_iCurComboOfPerfects%150)==0 && RandomFloat(0,1) > 0.5 && !GAMESTATE->m_bDemonstration ) + if( (m_iCurComboOfPerfects>=150) && (m_iCurComboOfPerfects%150)==0 && !GAMESTATE->m_bDemonstration ) SCREENMAN->SendMessageToTopScreen( SM_BeginToasty, 0 ); diff --git a/stepmania/src/GameConstantsAndTypes.h b/stepmania/src/GameConstantsAndTypes.h index dc2e0ab0c1..e5dc2bd39d 100644 --- a/stepmania/src/GameConstantsAndTypes.h +++ b/stepmania/src/GameConstantsAndTypes.h @@ -124,6 +124,7 @@ enum TapNoteScore { TNS_GOOD, TNS_GREAT, TNS_PERFECT, + TNS_MARVELOUS, NUM_TAP_NOTE_SCORES }; @@ -131,6 +132,7 @@ inline int TapNoteScoreToDancePoints( TapNoteScore tns ) { switch( tns ) { + case TNS_MARVELOUS: return +3; case TNS_PERFECT: return +2; case TNS_GREAT: return +1; case TNS_GOOD: return +0; diff --git a/stepmania/src/GameState.cpp b/stepmania/src/GameState.cpp index 3252d8825f..85f40da961 100644 --- a/stepmania/src/GameState.cpp +++ b/stepmania/src/GameState.cpp @@ -343,10 +343,11 @@ Grade GameState::GetCurrentGrade( PlayerNumber pn ) LOG->Trace( "iPossibleDancePoints: %i", m_iPossibleDancePoints[pn] ); LOG->Trace( "fPercentDancePoints: %f", fPercentDancePoints ); - if ( fPercentDancePoints >= 1.00 ) return GRADE_AAA; - else if( fPercentDancePoints >= 0.93 ) return GRADE_AA; - else if( fPercentDancePoints >= 0.80 ) return GRADE_A; - else if( fPercentDancePoints >= 0.65 ) return GRADE_B; - else if( fPercentDancePoints >= 0.45 ) return GRADE_C; - else return GRADE_D; + if ( fPercentDancePoints >= 1+1/3.0f ) return GRADE_AAAA; + if ( fPercentDancePoints >= 1.00 ) return GRADE_AAA; + else if( fPercentDancePoints >= 0.93 ) return GRADE_AA; + else if( fPercentDancePoints >= 0.80 ) return GRADE_A; + else if( fPercentDancePoints >= 0.65 ) return GRADE_B; + else if( fPercentDancePoints >= 0.45 ) return GRADE_C; + else return GRADE_D; } diff --git a/stepmania/src/GameState.h b/stepmania/src/GameState.h index ba4f0dfa6c..7304e63c4f 100644 --- a/stepmania/src/GameState.h +++ b/stepmania/src/GameState.h @@ -59,7 +59,7 @@ public: CString m_sLoadingMessage; CString m_sPreferredGroup; - Difficulty m_PreferredDifficulty[NUM_PLAYERS]; + Difficulty m_PreferredDifficulty[NUM_PLAYERS]; SongSortOrder m_SongSortOrder; // used by MusicWheel PlayMode m_PlayMode; bool m_bEditing; // NoteField does special stuff when this is true diff --git a/stepmania/src/GhostArrow.cpp b/stepmania/src/GhostArrow.cpp index 6d45b07c6b..9c38ef20e0 100644 --- a/stepmania/src/GhostArrow.cpp +++ b/stepmania/src/GhostArrow.cpp @@ -16,21 +16,24 @@ #include "ThemeManager.h" -#define SHOW_SECONDS THEME->GetMetricF("GhostArrow","ShowSeconds") -#define ZOOM_START THEME->GetMetricF("GhostArrow","ZoomStart") -#define ZOOM_END THEME->GetMetricF("GhostArrow","ZoomEnd") -#define COLOR_PERFECT_START THEME->GetMetricC("GhostArrow","ColorPerfectStart") -#define COLOR_PERFECT_END THEME->GetMetricC("GhostArrow","ColorPerfectEnd") -#define COLOR_GREAT_START THEME->GetMetricC("GhostArrow","ColorGreatStart") -#define COLOR_GREAT_END THEME->GetMetricC("GhostArrow","ColorGreatEnd") -#define COLOR_GOOD_START THEME->GetMetricC("GhostArrow","ColorGoodStart") -#define COLOR_GOOD_END THEME->GetMetricC("GhostArrow","ColorGoodEnd") -#define COLOR_BOO_START THEME->GetMetricC("GhostArrow","ColorBooStart") -#define COLOR_BOO_END THEME->GetMetricC("GhostArrow","ColorBooEnd") +#define SHOW_SECONDS THEME->GetMetricF("GhostArrow","ShowSeconds") +#define ZOOM_START THEME->GetMetricF("GhostArrow","ZoomStart") +#define ZOOM_END THEME->GetMetricF("GhostArrow","ZoomEnd") +#define COLOR_MARVELOUS_START THEME->GetMetricC("GhostArrow","ColorMarvelousStart") +#define COLOR_MARVELOUS_END THEME->GetMetricC("GhostArrow","ColorMarvelousEnd") +#define COLOR_PERFECT_START THEME->GetMetricC("GhostArrow","ColorPerfectStart") +#define COLOR_PERFECT_END THEME->GetMetricC("GhostArrow","ColorPerfectEnd") +#define COLOR_GREAT_START THEME->GetMetricC("GhostArrow","ColorGreatStart") +#define COLOR_GREAT_END THEME->GetMetricC("GhostArrow","ColorGreatEnd") +#define COLOR_GOOD_START THEME->GetMetricC("GhostArrow","ColorGoodStart") +#define COLOR_GOOD_END THEME->GetMetricC("GhostArrow","ColorGoodEnd") +#define COLOR_BOO_START THEME->GetMetricC("GhostArrow","ColorBooStart") +#define COLOR_BOO_END THEME->GetMetricC("GhostArrow","ColorBooEnd") float g_fShowSeconds; float g_fZoomStart, g_fZoomEnd; RageColor + g_colorMarvelousStart, g_colorMarvelousEnd, g_colorPerfectStart, g_colorPerfectEnd, g_colorGreatStart, g_colorGreatEnd, g_colorGoodStart, g_colorGoodEnd, @@ -38,17 +41,19 @@ RageColor GhostArrow::GhostArrow() { - g_fShowSeconds = SHOW_SECONDS; - g_fZoomStart = ZOOM_START; - g_fZoomEnd = ZOOM_END; - g_colorPerfectStart = COLOR_PERFECT_START; - g_colorPerfectEnd = COLOR_PERFECT_END; - g_colorGreatStart = COLOR_GREAT_START; - g_colorGreatEnd = COLOR_GREAT_END; - g_colorGoodStart = COLOR_GOOD_START; - g_colorGoodEnd = COLOR_GOOD_END; - g_colorBooStart = COLOR_BOO_START; - g_colorBooEnd = COLOR_BOO_END; + g_fShowSeconds = SHOW_SECONDS; + g_fZoomStart = ZOOM_START; + g_fZoomEnd = ZOOM_END; + g_colorMarvelousStart = COLOR_MARVELOUS_START; + g_colorMarvelousEnd = COLOR_MARVELOUS_END; + g_colorPerfectStart = COLOR_PERFECT_START; + g_colorPerfectEnd = COLOR_PERFECT_END; + g_colorGreatStart = COLOR_GREAT_START; + g_colorGreatEnd = COLOR_GREAT_END; + g_colorGoodStart = COLOR_GOOD_START; + g_colorGoodEnd = COLOR_GOOD_END; + g_colorBooStart = COLOR_BOO_START; + g_colorBooEnd = COLOR_BOO_END; SetDiffuse( RageColor(1,1,1,0) ); @@ -69,6 +74,7 @@ void GhostArrow::Step( TapNoteScore score ) RageColor colorStart, colorEnd; switch( score ) { + case TNS_MARVELOUS: colorStart = g_colorMarvelousStart; colorEnd = g_colorMarvelousEnd; break; case TNS_PERFECT: colorStart = g_colorPerfectStart; colorEnd = g_colorPerfectEnd; break; case TNS_GREAT: colorStart = g_colorGreatStart; colorEnd = g_colorGreatEnd; break; case TNS_GOOD: colorStart = g_colorGoodStart; colorEnd = g_colorGoodEnd; break; diff --git a/stepmania/src/GhostArrowBright.cpp b/stepmania/src/GhostArrowBright.cpp index 9a5f2c1612..726663e763 100644 --- a/stepmania/src/GhostArrowBright.cpp +++ b/stepmania/src/GhostArrowBright.cpp @@ -16,22 +16,25 @@ #include "ThemeManager.h" -#define SHOW_SECONDS THEME->GetMetricF("GhostArrowBright","ShowSeconds") -#define ZOOM_START THEME->GetMetricF("GhostArrowBright","ZoomStart") -#define ZOOM_END THEME->GetMetricF("GhostArrowBright","ZoomEnd") -#define COLOR_PERFECT_START THEME->GetMetricC("GhostArrowBright","ColorPerfectStart") -#define COLOR_PERFECT_END THEME->GetMetricC("GhostArrowBright","ColorPerfectEnd") -#define COLOR_GREAT_START THEME->GetMetricC("GhostArrowBright","ColorGreatStart") -#define COLOR_GREAT_END THEME->GetMetricC("GhostArrowBright","ColorGreatEnd") -#define COLOR_GOOD_START THEME->GetMetricC("GhostArrowBright","ColorGoodStart") -#define COLOR_GOOD_END THEME->GetMetricC("GhostArrowBright","ColorGoodEnd") -#define COLOR_BOO_START THEME->GetMetricC("GhostArrowBright","ColorBooStart") -#define COLOR_BOO_END THEME->GetMetricC("GhostArrowBright","ColorBooEnd") +#define SHOW_SECONDS THEME->GetMetricF("GhostArrowBright","ShowSeconds") +#define ZOOM_START THEME->GetMetricF("GhostArrowBright","ZoomStart") +#define ZOOM_END THEME->GetMetricF("GhostArrowBright","ZoomEnd") +#define COLOR_MARVELOUS_START THEME->GetMetricC("GhostArrowBright","ColorMarvelousStart") +#define COLOR_MARVELOUS_END THEME->GetMetricC("GhostArrowBright","ColorMarvelousEnd") +#define COLOR_PERFECT_START THEME->GetMetricC("GhostArrowBright","ColorPerfectStart") +#define COLOR_PERFECT_END THEME->GetMetricC("GhostArrowBright","ColorPerfectEnd") +#define COLOR_GREAT_START THEME->GetMetricC("GhostArrowBright","ColorGreatStart") +#define COLOR_GREAT_END THEME->GetMetricC("GhostArrowBright","ColorGreatEnd") +#define COLOR_GOOD_START THEME->GetMetricC("GhostArrowBright","ColorGoodStart") +#define COLOR_GOOD_END THEME->GetMetricC("GhostArrowBright","ColorGoodEnd") +#define COLOR_BOO_START THEME->GetMetricC("GhostArrowBright","ColorBooStart") +#define COLOR_BOO_END THEME->GetMetricC("GhostArrowBright","ColorBooEnd") // "2" appended so the names won't conflict with the GhostArrow float g_fShowSeconds2; float g_fZoomStart2, g_fZoomEnd2; RageColor + g_colorMarvelousStart2, g_colorMarvelousEnd2, g_colorPerfectStart2, g_colorPerfectEnd2, g_colorGreatStart2, g_colorGreatEnd2, g_colorGoodStart2, g_colorGoodEnd2, @@ -40,17 +43,19 @@ RageColor GhostArrowBright::GhostArrowBright() { - g_fShowSeconds2 = SHOW_SECONDS; - g_fZoomStart2 = ZOOM_START; - g_fZoomEnd2 = ZOOM_END; - g_colorPerfectStart2= COLOR_PERFECT_START; - g_colorPerfectEnd2 = COLOR_PERFECT_END; - g_colorGreatStart2 = COLOR_GREAT_START; - g_colorGreatEnd2 = COLOR_GREAT_END; - g_colorGoodStart2 = COLOR_GOOD_START; - g_colorGoodEnd2 = COLOR_GOOD_END; - g_colorBooStart2 = COLOR_BOO_START; - g_colorBooEnd2 = COLOR_BOO_END; + g_fShowSeconds2 = SHOW_SECONDS; + g_fZoomStart2 = ZOOM_START; + g_fZoomEnd2 = ZOOM_END; + g_colorMarvelousStart2 = COLOR_MARVELOUS_START; + g_colorMarvelousEnd2 = COLOR_MARVELOUS_END; + g_colorPerfectStart2 = COLOR_PERFECT_START; + g_colorPerfectEnd2 = COLOR_PERFECT_END; + g_colorGreatStart2 = COLOR_GREAT_START; + g_colorGreatEnd2 = COLOR_GREAT_END; + g_colorGoodStart2 = COLOR_GOOD_START; + g_colorGoodEnd2 = COLOR_GOOD_END; + g_colorBooStart2 = COLOR_BOO_START; + g_colorBooEnd2 = COLOR_BOO_END; SetDiffuse( RageColor(1,1,1,0) ); @@ -71,10 +76,11 @@ void GhostArrowBright::Step( TapNoteScore score ) RageColor colorStart, colorEnd; switch( score ) { - case TNS_PERFECT: colorStart = g_colorPerfectStart2; colorEnd = g_colorPerfectEnd2; break; - case TNS_GREAT: colorStart = g_colorGreatStart2; colorEnd = g_colorGreatEnd2; break; - case TNS_GOOD: colorStart = g_colorGoodStart2; colorEnd = g_colorGoodEnd2; break; - case TNS_BOO: colorStart = g_colorBooStart2; colorEnd = g_colorBooEnd2; break; + case TNS_MARVELOUS: colorStart = g_colorMarvelousStart2;colorEnd = g_colorMarvelousEnd2; break; + case TNS_PERFECT: colorStart = g_colorPerfectStart2; colorEnd = g_colorPerfectEnd2; break; + case TNS_GREAT: colorStart = g_colorGreatStart2; colorEnd = g_colorGreatEnd2; break; + case TNS_GOOD: colorStart = g_colorGoodStart2; colorEnd = g_colorGoodEnd2; break; + case TNS_BOO: colorStart = g_colorBooStart2; colorEnd = g_colorBooEnd2; break; case TNS_MISS: // miss should never be passed in here default: ASSERT(0); diff --git a/stepmania/src/Grade.cpp b/stepmania/src/Grade.cpp index 67d5304c03..1ad3765b53 100644 --- a/stepmania/src/Grade.cpp +++ b/stepmania/src/Grade.cpp @@ -16,6 +16,7 @@ CString GradeToString( Grade g ) { switch( g ) { + case GRADE_AAAA: return "AAAA"; case GRADE_AAA: return "AAA"; case GRADE_AA: return "AA"; case GRADE_A: return "A"; @@ -32,7 +33,8 @@ Grade StringToGrade( const CString &sGrade ) { CString s = sGrade; s.MakeUpper(); - if ( s == "AAA" ) return GRADE_AAA; + if ( s == "AAAA" ) return GRADE_AAAA; + else if( s == "AAA" ) return GRADE_AAA; else if( s == "AA" ) return GRADE_AA; else if( s == "A" ) return GRADE_A; else if( s == "B" ) return GRADE_B; diff --git a/stepmania/src/Grade.h b/stepmania/src/Grade.h index 93d51a1ebe..efaf2be314 100644 --- a/stepmania/src/Grade.h +++ b/stepmania/src/Grade.h @@ -15,7 +15,7 @@ enum Grade { GRADE_NO_DATA=0, GRADE_E, GRADE_D, GRADE_C, GRADE_B, GRADE_A, - GRADE_AA,GRADE_AAA }; + GRADE_AA,GRADE_AAA,GRADE_AAAA }; CString GradeToString( Grade g ); Grade StringToGrade( const CString &s ); diff --git a/stepmania/src/GradeDisplay.cpp b/stepmania/src/GradeDisplay.cpp index 652bcb6068..5b4fc7b6c8 100644 --- a/stepmania/src/GradeDisplay.cpp +++ b/stepmania/src/GradeDisplay.cpp @@ -26,7 +26,7 @@ const float GRADES_TO_SCROLL = NUM_GRADE_FRAMES*4; GradeDisplay::GradeDisplay() { - Load( THEME->GetPathTo("Graphics","evaluation grades 1x7") ); + Load( THEME->GetPathTo("Graphics","evaluation grades 1x8") ); StopAnimating(); m_fTimeLeftInScroll = 0; @@ -85,13 +85,14 @@ void GradeDisplay::SetGrade( PlayerNumber pn, Grade g ) int iNumCols = (this->GetNumStates()>8) ? 2 : 1; switch( g ) { - case GRADE_AAA: SetState( 0*iNumCols+pn ); break; - case GRADE_AA: SetState( 1*iNumCols+pn ); break; - case GRADE_A: SetState( 2*iNumCols+pn ); break; - case GRADE_B: SetState( 3*iNumCols+pn ); break; - case GRADE_C: SetState( 4*iNumCols+pn ); break; - case GRADE_D: SetState( 5*iNumCols+pn ); break; - case GRADE_E: SetState( 6*iNumCols+pn ); break; + case GRADE_AAAA: SetState( 0*iNumCols+pn ); break; + case GRADE_AAA: SetState( 1*iNumCols+pn ); break; + case GRADE_AA: SetState( 2*iNumCols+pn ); break; + case GRADE_A: SetState( 3*iNumCols+pn ); break; + case GRADE_B: SetState( 4*iNumCols+pn ); break; + case GRADE_C: SetState( 5*iNumCols+pn ); break; + case GRADE_D: SetState( 6*iNumCols+pn ); break; + case GRADE_E: SetState( 7*iNumCols+pn ); break; case GRADE_NO_DATA: SetDiffuse( RageColor(1,1,1,0) ); break; default: ASSERT(0); } @@ -110,13 +111,14 @@ void GradeDisplay::SpinAndSettleOn( Grade g ) int iFrameNo=0; switch( g ) { - case GRADE_AAA: iFrameNo = 0; break; - case GRADE_AA: iFrameNo = 1; break; - case GRADE_A: iFrameNo = 2; break; - case GRADE_B: iFrameNo = 3; break; - case GRADE_C: iFrameNo = 4; break; - case GRADE_D: iFrameNo = 5; break; - case GRADE_E: iFrameNo = 6; break; + case GRADE_AAAA: iFrameNo = 0; break; + case GRADE_AAA: iFrameNo = 1; break; + case GRADE_AA: iFrameNo = 2; break; + case GRADE_A: iFrameNo = 3; break; + case GRADE_B: iFrameNo = 4; break; + case GRADE_C: iFrameNo = 5; break; + case GRADE_D: iFrameNo = 6; break; + case GRADE_E: iFrameNo = 7; break; default: ASSERT(0); } diff --git a/stepmania/src/Judgement.cpp b/stepmania/src/Judgement.cpp index aa5ccbf64a..cf63f8a403 100644 --- a/stepmania/src/Judgement.cpp +++ b/stepmania/src/Judgement.cpp @@ -53,28 +53,15 @@ void Judgement::SetJudgement( TapNoteScore score ) switch( score ) { - case TNS_PERFECT: m_sprJudgement.SetState( 0 ); break; - case TNS_GREAT: m_sprJudgement.SetState( 1 ); break; - case TNS_GOOD: m_sprJudgement.SetState( 2 ); break; - case TNS_BOO: m_sprJudgement.SetState( 3 ); break; - case TNS_MISS: m_sprJudgement.SetState( 4 ); break; - default: ASSERT( false ); + case TNS_MARVELOUS: m_sprJudgement.SetState( 0 ); break; + case TNS_PERFECT: m_sprJudgement.SetState( 1 ); break; + case TNS_GREAT: m_sprJudgement.SetState( 2 ); break; + case TNS_GOOD: m_sprJudgement.SetState( 3 ); break; + case TNS_BOO: m_sprJudgement.SetState( 4 ); break; + case TNS_MISS: m_sprJudgement.SetState( 5 ); break; + default: ASSERT(0); } - // Chris: Resize the graphic file itself if you want the size different for Ez2. - /* - if ( GAMESTATE->m_CurGame == GAME_EZ2 ) // Resize Judgement graphics for Ez2. - { - m_sprJudgement.SetHeight( 22.0f * 2.1f ); - m_sprJudgement.SetWidth( 143.0f * 2.1f ); - if ( score == TNS_PERFECT || score == TNS_GREAT ) - { - m_sprJudgement.SetHeight( 22.0f * 2.6f ); - m_sprJudgement.SetWidth( 143.0f * 2.8f ); - } - } - */ - m_fDisplayCountdown = JUDGEMENT_DISPLAY_TIME; m_sprJudgement.SetEffectNone(); @@ -100,6 +87,7 @@ void Judgement::SetJudgement( TapNoteScore score ) float fMagnitudeX, fMagnitudeY; switch( score ) { + case TNS_MARVELOUS: fMagnitudeX = 1.50f; fMagnitudeY = 2.00f; break; case TNS_PERFECT: fMagnitudeX = 1.50f; fMagnitudeY = 2.00f; break; case TNS_GREAT: fMagnitudeX = 1.30f; fMagnitudeY = 1.50f; break; case TNS_GOOD: fMagnitudeX = 1.10f; fMagnitudeY = 1.25f; break; diff --git a/stepmania/src/LifeMeterBar.cpp b/stepmania/src/LifeMeterBar.cpp index 36207e9b7b..c45a7e5ce3 100644 --- a/stepmania/src/LifeMeterBar.cpp +++ b/stepmania/src/LifeMeterBar.cpp @@ -276,11 +276,14 @@ void LifeMeterBar::ChangeLife( TapNoteScore score ) case SongOptions::DRAIN_NORMAL: switch( score ) { + case TNS_MARVELOUS: fDeltaLife = +0.008f; break; case TNS_PERFECT: fDeltaLife = +0.008f; break; case TNS_GREAT: fDeltaLife = +0.004f; break; case TNS_GOOD: fDeltaLife = +0.000f; break; case TNS_BOO: fDeltaLife = -0.040f; break; case TNS_MISS: fDeltaLife = -0.080f; break; + default: + ASSERT(0); } if( IsHot() && score < TNS_GOOD ) fDeltaLife = -0.10f; // make it take a while to get back to "doing great" @@ -288,21 +291,27 @@ void LifeMeterBar::ChangeLife( TapNoteScore score ) case SongOptions::DRAIN_NO_RECOVER: switch( score ) { + case TNS_MARVELOUS: fDeltaLife = +0.000f; break; case TNS_PERFECT: fDeltaLife = +0.000f; break; case TNS_GREAT: fDeltaLife = +0.000f; break; case TNS_GOOD: fDeltaLife = +0.000f; break; case TNS_BOO: fDeltaLife = -0.040f; break; case TNS_MISS: fDeltaLife = -0.080f; break; + default: + ASSERT(0); } break; case SongOptions::DRAIN_SUDDEN_DEATH: switch( score ) { + case TNS_MARVELOUS: fDeltaLife = +0; break; case TNS_PERFECT: fDeltaLife = +0; break; case TNS_GREAT: fDeltaLife = +0; break; case TNS_GOOD: fDeltaLife = -1.0; break; case TNS_BOO: fDeltaLife = -1.0; break; case TNS_MISS: fDeltaLife = -1.0; break; + default: + ASSERT(0); } break; default: diff --git a/stepmania/src/LifeMeterBattery.cpp b/stepmania/src/LifeMeterBattery.cpp index 225250f8b7..0103d20e1e 100644 --- a/stepmania/src/LifeMeterBattery.cpp +++ b/stepmania/src/LifeMeterBattery.cpp @@ -104,6 +104,7 @@ void LifeMeterBattery::ChangeLife( TapNoteScore score ) switch( score ) { + case TNS_MARVELOUS: case TNS_PERFECT: case TNS_GREAT: break; diff --git a/stepmania/src/MusicWheel.cpp b/stepmania/src/MusicWheel.cpp index 435436fe72..33f9fc2c3b 100644 --- a/stepmania/src/MusicWheel.cpp +++ b/stepmania/src/MusicWheel.cpp @@ -100,7 +100,6 @@ WheelItemDisplay::WheelItemDisplay() for( int p=0; pGetPathTo("Graphics","select music small grades 2x8") ); m_GradeDisplay[p].SetZoom( 1.0f ); m_GradeDisplay[p].SetXY( GRADE_X(p), 0 ); } diff --git a/stepmania/src/NoteData.cpp b/stepmania/src/NoteData.cpp index 6fbb619f17..d326fa4685 100644 --- a/stepmania/src/NoteData.cpp +++ b/stepmania/src/NoteData.cpp @@ -298,7 +298,7 @@ int NoteData::GetPossibleDancePoints() //An "OK" (Successful Freeze step) will add 6 points //A "NG" (Unsuccessful Freeze step) is worth 0 points - return GetNumTapNotes()*TapNoteScoreToDancePoints(TNS_PERFECT) + + return GetNumTapNotes()*TapNoteScoreToDancePoints(TNS_PERFECT) + // not Marvelous GetNumHoldNotes()*HoldNoteScoreToDancePoints(HNS_OK); } diff --git a/stepmania/src/NoteDataWithScoring.cpp b/stepmania/src/NoteDataWithScoring.cpp index a0ddd507ab..2c0d01b064 100644 --- a/stepmania/src/NoteDataWithScoring.cpp +++ b/stepmania/src/NoteDataWithScoring.cpp @@ -59,7 +59,7 @@ int NoteDataWithScoring::GetNumDoublesWithScore( TapNoteScore tns, const float f for( unsigned i=iStartIndex; iGetMetricF("Player","JudgeMarvelousZoomX") +#define JUDGE_MARVELOUS_ZOOM_Y THEME->GetMetricF("Player","JudgeMarvelousZoomY") #define JUDGE_PERFECT_ZOOM_X THEME->GetMetricF("Player","JudgePerfectZoomX") #define JUDGE_PERFECT_ZOOM_Y THEME->GetMetricF("Player","JudgePerfectZoomY") #define JUDGE_GREAT_ZOOM_X THEME->GetMetricF("Player","JudgeGreatZoomX") @@ -41,15 +43,18 @@ // cache because reading from theme metrics is slow -float g_fJudgePerfectZoomX, - g_fJudgePerfectZoomY, - g_fJudgeGreatZoomX, - g_fJudgeGreatZoomY, - g_fJudgeGoodZoomX, - g_fJudgeGoodZoomY, - g_fJudgeBooZoomX, - g_fJudgeBooZoomY, - g_fComboJudgeTweenSeconds; +float + g_fJudgeMarvelousZoomX, + g_fJudgeMarvelousZoomY, + g_fJudgePerfectZoomX, + g_fJudgePerfectZoomY, + g_fJudgeGreatZoomX, + g_fJudgeGreatZoomY, + g_fJudgeGoodZoomX, + g_fJudgeGoodZoomY, + g_fJudgeBooZoomX, + g_fJudgeBooZoomY, + g_fComboJudgeTweenSeconds; int g_iBrightGhostThreshold; // these two items are in the @@ -68,6 +73,8 @@ const float HOLD_ARROW_NG_TIME = 0.18f; Player::Player() { // Update theme metrics cache + g_fJudgeMarvelousZoomX = JUDGE_MARVELOUS_ZOOM_X; + g_fJudgeMarvelousZoomY = JUDGE_MARVELOUS_ZOOM_Y; g_fJudgePerfectZoomX = JUDGE_PERFECT_ZOOM_X; g_fJudgePerfectZoomY = JUDGE_PERFECT_ZOOM_Y; g_fJudgeGreatZoomX = JUDGE_GREAT_ZOOM_X; @@ -393,21 +400,26 @@ void Player::Step( int col ) // compute the score for this hit const float fStepBeat = NoteRowToBeat( (float)iIndexOverlappingNote ); const float fBeatsUntilStep = fStepBeat - fSongBeat; - const float fPercentFromPerfect = fabsf( fBeatsUntilStep / GetMaxBeatDifference() ); + const float fSecondsFromPerfect = fabsf( fBeatsUntilStep / GAMESTATE->m_fCurBPS ); +// const float fPercentFromPerfect = fabsf( fBeatsUntilStep / GetMaxBeatDifference() ); const float fNoteOffset = fBeatsUntilStep / GAMESTATE->m_fCurBPS; //the offset from the actual step in seconds TapNoteScore score; - LOG->Trace("fPercentFromPerfect %f", fPercentFromPerfect); - if( fPercentFromPerfect < PREFSMAN->m_fJudgeWindowPerfectPercent ) score = TNS_PERFECT; - else if( fPercentFromPerfect < PREFSMAN->m_fJudgeWindowGreatPercent ) score = TNS_GREAT; - else if( fPercentFromPerfect < PREFSMAN->m_fJudgeWindowGoodPercent ) score = TNS_GOOD; + LOG->Trace("fSecondsFromPerfect = %f", fSecondsFromPerfect); + if( fSecondsFromPerfect <= PREFSMAN->m_fJudgeWindowMarvelousSeconds ) score = TNS_MARVELOUS; + else if( fSecondsFromPerfect <= PREFSMAN->m_fJudgeWindowPerfectSeconds ) score = TNS_PERFECT; + else if( fSecondsFromPerfect <= PREFSMAN->m_fJudgeWindowGreatSeconds ) score = TNS_GREAT; + else if( fSecondsFromPerfect <= PREFSMAN->m_fJudgeWindowGoodSeconds ) score = TNS_GOOD; //we have to mark boo's as better than MISS's now that the window is expanded - else if( fPercentFromPerfect < 1.0f ) score = TNS_BOO; - else score = TNS_NONE; + else if( fSecondsFromPerfect <= 1.0f ) score = TNS_BOO; + else score = TNS_NONE; if( !GAMESTATE->m_bEditing && (GAMESTATE->m_bDemonstration || PREFSMAN->m_bAutoPlay) ) + score = TNS_MARVELOUS; + + if( score==TNS_MARVELOUS && !PREFSMAN->m_bMarvelousTiming ) score = TNS_PERFECT; bDestroyedNote = (score >= TNS_GOOD); @@ -415,7 +427,7 @@ void Player::Step( int col ) LOG->Trace("(%2d/%2d)Note offset: %f, Score: %i", m_iOffsetSample, SAMPLE_COUNT, fNoteOffset, score); SetTapNoteScore(col, iIndexOverlappingNote, score); - if (GAMESTATE->m_SongOptions.m_AutoAdjust == SongOptions::ADJUST_ON) + if (GAMESTATE->m_SongOptions.m_bAutoSync ) { m_fOffset[m_iOffsetSample++] = fNoteOffset; if (m_iOffsetSample >= SAMPLE_COUNT) @@ -460,7 +472,7 @@ void Player::OnRowDestroyed( int iIndexThatWasSteppedOn ) LOG->Trace( "Player::OnRowDestroyed" ); // find the minimum score of the row - TapNoteScore score = TNS_PERFECT; + TapNoteScore score = TNS_MARVELOUS; for( int t=0; tm_fCurBPS * PREFSMAN->m_fJudgeWindowSeconds * GAMESTATE->m_SongOptions.m_fMusicRate; + return GAMESTATE->m_fCurBPS * GAMESTATE->m_SongOptions.m_fMusicRate * PREFSMAN->m_fJudgeWindowBooSeconds * PREFSMAN->m_fJudgeWindowScale; } void Player::FadeToFail() diff --git a/stepmania/src/PrefsManager.cpp b/stepmania/src/PrefsManager.cpp index dbbfb9a4cb..d85872bb89 100644 --- a/stepmania/src/PrefsManager.cpp +++ b/stepmania/src/PrefsManager.cpp @@ -52,15 +52,17 @@ PrefsManager::PrefsManager() m_bEventMode = false; m_iNumArcadeStages = 3; m_bAutoPlay = false; - m_fJudgeWindowSeconds = 0.17f; - m_fJudgeWindowPerfectPercent = 0.25f; - m_fJudgeWindowGreatPercent = 0.50f; - m_fJudgeWindowGoodPercent = 0.75f; + m_fJudgeWindowScale = 1.0f; + m_fJudgeWindowMarvelousSeconds = 0.023f; + m_fJudgeWindowPerfectSeconds = 0.043f; + m_fJudgeWindowGreatSeconds = 0.086f; + m_fJudgeWindowGoodSeconds = 0.129f; + m_fJudgeWindowBooSeconds = 0.172f; m_fLifeDifficultyScale = 1.0f; m_iMovieDecodeMS = 2; m_bUseBGIfNoBanner = false; m_bDelayedEscape = true; - m_bHowToPlay = true; + m_bInstructions = true; m_bShowDontDie = true; m_bShowSelectGroup = true; m_bArcadeOptionsNavigation = false; @@ -68,6 +70,8 @@ PrefsManager::PrefsManager() m_bCoinOpMode = false; m_bMusicWheelUsesSections = true; m_bChangeBannersWhenFast = false; + m_bEasterEggs = true; + m_bMarvelousTiming = true; /* I'd rather get occasional people asking for support for this even though it's * already here than lots of people asking why songs aren't being displayed. */ @@ -107,17 +111,17 @@ PrefsManager::~PrefsManager() ini.GetValueB( "Options", "EventMode", m_bEventMode ); ini.GetValueI( "Options", "NumArcadeStages", m_iNumArcadeStages ); ini.GetValueB( "Options", "AutoPlay", m_bAutoPlay ); - ini.GetValueF( "Options", "JudgeWindowSeconds", m_fJudgeWindowSeconds ); - ini.GetValueF( "Options", "JudgeWindowPerfectPercent", m_fJudgeWindowPerfectPercent ); - ini.GetValueF( "Options", "JudgeWindowGreatPercent", m_fJudgeWindowGreatPercent ); - ini.GetValueF( "Options", "JudgeWindowGoodPercent", m_fJudgeWindowGoodPercent ); + ini.GetValueF( "Options", "JudgeWindowScale", m_fJudgeWindowScale ); + ini.GetValueF( "Options", "JudgeWindowPerfectSeconds", m_fJudgeWindowPerfectSeconds ); + ini.GetValueF( "Options", "JudgeWindowGreatSeconds", m_fJudgeWindowGreatSeconds ); + ini.GetValueF( "Options", "JudgeWindowGoodSeconds", m_fJudgeWindowGoodSeconds ); ini.GetValueF( "Options", "LifeDifficultyScale", m_fLifeDifficultyScale ); ini.GetValueI( "Options", "MovieDecodeMS", m_iMovieDecodeMS ); ini.GetValueB( "Options", "UseBGIfNoBanner", m_bUseBGIfNoBanner ); ini.GetValueB( "Options", "DelayedEscape", m_bDelayedEscape ); ini.GetValueB( "Options", "HiddenSongs", m_bHiddenSongs ); ini.GetValueB( "Options", "Vsync", m_bVsync ); - ini.GetValueB( "Options", "HowToPlay", m_bHowToPlay ); + ini.GetValueB( "Options", "HowToPlay", m_bInstructions ); ini.GetValueB( "Options", "Caution", m_bShowDontDie ); ini.GetValueB( "Options", "SelectGroup", m_bShowSelectGroup ); ini.GetValueB( "Options", "ArcadeOptionsNavigation", m_bArcadeOptionsNavigation ); @@ -127,6 +131,8 @@ PrefsManager::~PrefsManager() ini.GetValueB( "Options", "MusicWheelUsesSections", m_bMusicWheelUsesSections ); ini.GetValueB( "Options", "ChangeBannersWhenFast", m_bChangeBannersWhenFast ); ini.GetValue ( "Options", "SoundDrivers", m_bSoundDrivers ); + ini.GetValueB( "Options", "EasterEggs", m_bEasterEggs ); + ini.GetValueB( "Options", "MarvelousTiming", m_bMarvelousTiming ); ini.GetValueF( "Options", "SoundVolume", m_fSoundVolume ); m_asAdditionalSongFolders.clear(); @@ -164,17 +170,17 @@ void PrefsManager::SaveGlobalPrefsToDisk() ini.SetValueB( "Options", "MenuTimer", m_bMenuTimer ); ini.SetValueI( "Options", "NumArcadeStages", m_iNumArcadeStages ); ini.SetValueB( "Options", "AutoPlay", m_bAutoPlay ); - ini.SetValueF( "Options", "JudgeWindowSeconds", m_fJudgeWindowSeconds ); - ini.SetValueF( "Options", "JudgeWindowPerfectPercent", m_fJudgeWindowPerfectPercent ); - ini.SetValueF( "Options", "JudgeWindowGreatPercent", m_fJudgeWindowGreatPercent ); - ini.SetValueF( "Options", "JudgeWindowGoodPercent", m_fJudgeWindowGoodPercent ); + ini.SetValueF( "Options", "JudgeWindowScale", m_fJudgeWindowScale ); + ini.SetValueF( "Options", "JudgeWindowPerfectSeconds", m_fJudgeWindowPerfectSeconds ); + ini.SetValueF( "Options", "JudgeWindowGreatSeconds", m_fJudgeWindowGreatSeconds ); + ini.SetValueF( "Options", "JudgeWindowGoodSeconds", m_fJudgeWindowGoodSeconds ); ini.SetValueF( "Options", "LifeDifficultyScale", m_fLifeDifficultyScale ); ini.SetValueI( "Options", "MovieDecodeMS", m_iMovieDecodeMS ); ini.SetValueB( "Options", "UseBGIfNoBanner", m_bUseBGIfNoBanner ); ini.SetValueB( "Options", "DelayedEscape", m_bDelayedEscape ); ini.SetValueB( "Options", "HiddenSongs", m_bHiddenSongs ); ini.SetValueB( "Options", "Vsync", m_bVsync ); - ini.SetValueB( "Options", "HowToPlay", m_bHowToPlay ); + ini.SetValueB( "Options", "HowToPlay", m_bInstructions ); ini.SetValueB( "Options", "Caution", m_bShowDontDie ); ini.SetValueB( "Options", "SelectGroup", m_bShowSelectGroup ); ini.SetValueB( "Options", "ArcadeOptionsNavigation", m_bArcadeOptionsNavigation ); @@ -182,7 +188,9 @@ void PrefsManager::SaveGlobalPrefsToDisk() ini.SetValueI( "Options", "UnloadTextureDelaySeconds", m_iUnloadTextureDelaySeconds ); ini.SetValueB( "Options", "MusicWheelUsesSections", m_bMusicWheelUsesSections ); ini.SetValueB( "Options", "ChangeBannersWhenFast", m_bChangeBannersWhenFast ); - ini.SetValueB( "Options", "CoinOpMode", m_bCoinOpMode ); + ini.SetValue ( "Options", "SoundDrivers", m_bSoundDrivers ); + ini.SetValueB( "Options", "EasterEggs", m_bEasterEggs ); + ini.SetValueB( "Options", "MarvelousTiming", m_bMarvelousTiming ); /* Only write this if it's been changed. This ensures that we can change * the default and have it take effect for everyone (except people who diff --git a/stepmania/src/PrefsManager.h b/stepmania/src/PrefsManager.h index 651789eca6..b68ddee65e 100644 --- a/stepmania/src/PrefsManager.h +++ b/stepmania/src/PrefsManager.h @@ -42,18 +42,22 @@ public: bool m_bShowDanger; int m_iNumArcadeStages; bool m_bEventMode; - float m_fJudgeWindowSeconds; + float m_fJudgeWindowScale; float m_fLifeDifficultyScale; - float m_fJudgeWindowPerfectPercent; - float m_fJudgeWindowGreatPercent; - float m_fJudgeWindowGoodPercent; + float m_fJudgeWindowMarvelousSeconds; + float m_fJudgeWindowPerfectSeconds; + float m_fJudgeWindowGreatSeconds; + float m_fJudgeWindowGoodSeconds; + float m_fJudgeWindowBooSeconds; bool m_bAutoPlay; bool m_bDelayedEscape; - bool m_bHowToPlay, m_bShowDontDie, m_bShowSelectGroup; + bool m_bInstructions, m_bShowDontDie, m_bShowSelectGroup; bool m_bArcadeOptionsNavigation; bool m_bCoinOpMode; bool m_bMusicWheelUsesSections; bool m_bChangeBannersWhenFast; + bool m_bEasterEggs; + bool m_bMarvelousTiming; CStringArray m_asAdditionalSongFolders; CString m_DWIPath; diff --git a/stepmania/src/RageInput.cpp b/stepmania/src/RageInput.cpp index d61dd0fb9d..5bff68f4ff 100644 --- a/stepmania/src/RageInput.cpp +++ b/stepmania/src/RageInput.cpp @@ -416,6 +416,7 @@ void RageInput::Update( float fDeltaTime ) for( int axis=0; axisTrace( "axis %d = %d", axis, val ); if( val < -16000 ) { JoystickButton b = (JoystickButton)(JOY_LEFT+2*axis); diff --git a/stepmania/src/ScoreDisplayRolling.cpp b/stepmania/src/ScoreDisplayRolling.cpp index be86956049..956e22b3f4 100644 --- a/stepmania/src/ScoreDisplayRolling.cpp +++ b/stepmania/src/ScoreDisplayRolling.cpp @@ -136,6 +136,7 @@ void ScoreDisplayRolling::AddToScore( TapNoteScore score, int iCurCombo ) int p; // score multiplier switch( score ) { + case TNS_MARVELOUS: p = 10; break; case TNS_PERFECT: p = 10; break; case TNS_GREAT: p = 5; break; default: p = 0; break; diff --git a/stepmania/src/ScoreKeeperMAX2.cpp b/stepmania/src/ScoreKeeperMAX2.cpp index 45ac54a1b6..43ec4dd899 100644 --- a/stepmania/src/ScoreKeeperMAX2.cpp +++ b/stepmania/src/ScoreKeeperMAX2.cpp @@ -32,6 +32,7 @@ void ScoreKeeperMAX2::AddScore( TapNoteScore score ) switch( score ) { + case TNS_MARVELOUS: p = 10; break; case TNS_PERFECT: p = 10; break; case TNS_GREAT: p = 5; break; default: p = 0; break; diff --git a/stepmania/src/ScreenAppearanceOptions.cpp b/stepmania/src/ScreenAppearanceOptions.cpp index 0841a0307f..18668bd745 100644 --- a/stepmania/src/ScreenAppearanceOptions.cpp +++ b/stepmania/src/ScreenAppearanceOptions.cpp @@ -30,7 +30,7 @@ enum { AO_ANNOUNCER = 0, AO_THEME, AO_SKIN, - AO_HOWTOPLAY, + AO_INSTRUCTIONS, AO_CAUTION, AO_SELECT_GROUP, AO_WHEEL_SECTIONS, @@ -154,7 +154,7 @@ void ScreenAppearanceOptions::ImportOptions() if( m_iSelectedOption[0][AO_SKIN] == -1 ) m_iSelectedOption[0][AO_SKIN] = 0; - m_iSelectedOption[0][AO_HOWTOPLAY] = PREFSMAN->m_bHowToPlay? 1:0; + m_iSelectedOption[0][AO_INSTRUCTIONS] = PREFSMAN->m_bInstructions? 1:0; m_iSelectedOption[0][AO_CAUTION] = PREFSMAN->m_bShowDontDie? 1:0; m_iSelectedOption[0][AO_SELECT_GROUP] = PREFSMAN->m_bShowSelectGroup? 1:0; m_iSelectedOption[0][AO_WHEEL_SECTIONS] = PREFSMAN->m_bMusicWheelUsesSections? 1:0; @@ -179,7 +179,7 @@ void ScreenAppearanceOptions::ExportOptions() CString sNewSkin = m_OptionRowData[AO_SKIN].szOptionsText[iSelectedSkin]; GAMEMAN->SwitchNoteSkin( sNewSkin ); - PREFSMAN->m_bHowToPlay = !!m_iSelectedOption[0][AO_HOWTOPLAY]; + PREFSMAN->m_bInstructions = !!m_iSelectedOption[0][AO_INSTRUCTIONS]; PREFSMAN->m_bShowDontDie = !!m_iSelectedOption[0][AO_CAUTION]; PREFSMAN->m_bShowSelectGroup = !!m_iSelectedOption[0][AO_SELECT_GROUP]; PREFSMAN->m_bMusicWheelUsesSections = !!m_iSelectedOption[0][AO_WHEEL_SECTIONS]; diff --git a/stepmania/src/ScreenAttract.cpp b/stepmania/src/ScreenAttract.cpp index 4a1e55a8b6..874b75fc0e 100644 --- a/stepmania/src/ScreenAttract.cpp +++ b/stepmania/src/ScreenAttract.cpp @@ -52,7 +52,7 @@ void ScreenAttract::Input( const DeviceInput& DeviceI, const InputEventType type if(type != IET_FIRST_PRESS) return; // don't care - if( m_Fade.IsClosing() ) + if( m_Fade.IsOpening() || m_Fade.IsClosing() ) return; if( MenuI.IsValid() ) @@ -64,6 +64,7 @@ void ScreenAttract::Input( const DeviceInput& DeviceI, const InputEventType type m_Fade.CloseWipingRight( SM_GoToNextScreen ); break; case MENU_BUTTON_START: + m_soundMusic.Stop(); GAMESTATE->m_bSideIsJoined[MenuI.player] = true; GAMESTATE->m_MasterPlayerNumber = MenuI.player; GAMESTATE->m_bPlayersCanJoin = false; @@ -96,7 +97,8 @@ void ScreenAttract::FirstUpdate() m_soundStart.Load( THEME->GetPathTo("Sounds","menu start") ); - SOUNDMAN->PlayMusic( THEME->GetPathTo("Sounds",this->GetElementName() + " music") ); + m_soundMusic.Load( THEME->GetPathTo("Sounds",this->GetElementName() + " music") ); + m_soundMusic.Play(); this->SendScreenMessage( SM_BeginFadingOut, SECONDS_TO_SHOW ); } diff --git a/stepmania/src/ScreenAttract.h b/stepmania/src/ScreenAttract.h index 6fc7fdcb23..86ce8e38a2 100644 --- a/stepmania/src/ScreenAttract.h +++ b/stepmania/src/ScreenAttract.h @@ -19,6 +19,7 @@ #include "RandomSample.h" #include "BGAnimation.h" #include "RageTimer.h" +#include "RageSound.h" class ScreenAttract : public Screen @@ -40,6 +41,8 @@ protected: BGAnimation m_Background; TransitionFade m_Fade; RandomSample m_soundStart; + + RageSound m_soundMusic; }; diff --git a/stepmania/src/ScreenDemonstration.cpp b/stepmania/src/ScreenDemonstration.cpp index 3c7b212071..5c78f0aed6 100644 --- a/stepmania/src/ScreenDemonstration.cpp +++ b/stepmania/src/ScreenDemonstration.cpp @@ -120,6 +120,7 @@ ScreenDemonstration::ScreenDemonstration() : ScreenGameplay( false ) ScreenDemonstration::~ScreenDemonstration() { GAMESTATE->m_bDemonstration = false; + GAMESTATE->Reset(); } void ScreenDemonstration::FirstUpdate() @@ -151,7 +152,9 @@ void ScreenDemonstration::Update( float fDeltaTime ) { ScreenGameplay::Update( fDeltaTime ); - m_textAutoPlay.SetDiffuse( RageColor(1,1,1,0) ); // hide autoplay + // hide status icons + for( int i=0; iGetMetric("ScreenEvaluation","SongSelectScreen") +#define SONGSEL_SCREEN THEME->GetMetric("ScreenEvaluation","SongSelectScreen") #define BANNER_X THEME->GetMetricF("ScreenEvaluation","BannerX") #define BANNER_Y THEME->GetMetricF("ScreenEvaluation","BannerY") #define STAGE_X THEME->GetMetricF("ScreenEvaluation","StageX") @@ -38,6 +38,8 @@ #define PERCENT_BASE_X( p ) THEME->GetMetricF("ScreenEvaluation",ssprintf("PercentBaseP%dX",p+1)) #define PERCENT_BASE_Y THEME->GetMetricF("ScreenEvaluation","PercentBaseY") #define JUDGE_LABELS_X THEME->GetMetricF("ScreenEvaluation","JudgeLabelsX") +#define MARVELOUS_X(o,p) THEME->GetMetricF("ScreenEvaluation",ssprintf("Marvelous%sP%dX",o?"Oni":"",p+1)) +#define MARVELOUS_Y THEME->GetMetricF("ScreenEvaluation","MarvelousY") #define PERFECT_X(o,p) THEME->GetMetricF("ScreenEvaluation",ssprintf("Perfect%sP%dX",o?"Oni":"",p+1)) #define PERFECT_Y THEME->GetMetricF("ScreenEvaluation","PerfectY") #define GREAT_X(o,p) THEME->GetMetricF("ScreenEvaluation",ssprintf("Great%sP%dX",o?"Oni":"",p+1)) @@ -77,25 +79,27 @@ float JUDGE_X( bool oni, int p, int l ) { switch( l ) { - case 0: return PERFECT_X(oni,p); - case 1: return GREAT_X(oni,p); - case 2: return GOOD_X(oni,p); - case 3: return BOO_X(oni,p); - case 4: return MISS_X(oni,p); - case 5: return OK_X(oni,p); - case 6: return MAX_COMBO_X(oni,p); + case 0: return MARVELOUS_X(oni,p); + case 1: return PERFECT_X(oni,p); + case 2: return GREAT_X(oni,p); + case 3: return GOOD_X(oni,p); + case 4: return BOO_X(oni,p); + case 5: return MISS_X(oni,p); + case 6: return OK_X(oni,p); + case 7: return MAX_COMBO_X(oni,p); 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; + case 0: return MARVELOUS_Y; + case 1: return PERFECT_Y; + case 2: return GREAT_Y; + case 3: return GOOD_Y; + case 4: return BOO_Y; + case 5: return MISS_Y; + case 6: return OK_Y; + case 7: return MAX_COMBO_Y; default: ASSERT(0); return 0; } } @@ -168,23 +172,6 @@ ScreenEvaluation::ScreenEvaluation( bool bSummary ) } - /////////////////////////// - // Andy: - // Fake COOL! / GOOD / OOPS for Ez2dancer using the DDR Rankings. -/* Todo: Accomodate this using theme metrics - - if( GAMESTATE->m_CurGame == GAME_EZ2 ) - { - for( int p=0; pTrace( "iActualDancePoints: %i", iActualDancePoints[p] ); - LOG->Trace( "iPossibleDancePoints: %i", iPossibleDancePoints[p] ); - LOG->Trace( "fPercentDancePoints: %f", fPercentDancePoints ); - - if ( fPercentDancePoints >= 1.00 ) grade[p] = GRADE_AAA; - else if( fPercentDancePoints >= 0.93 ) grade[p] = GRADE_AA; - else if( fPercentDancePoints >= 0.80 ) grade[p] = GRADE_A; - else if( fPercentDancePoints >= 0.65 ) grade[p] = GRADE_B; - else if( fPercentDancePoints >= 0.45 ) grade[p] = GRADE_C; - else grade[p] = GRADE_D; + grade[p] = GAMESTATE->GetCurrentGrade( (PlayerNumber)p ); } Grade max_grade = GRADE_NO_DATA; @@ -505,7 +470,7 @@ ScreenEvaluation::ScreenEvaluation( bool bSummary ) for( l=0; lGetPathTo("Graphics","evaluation judge labels 1x7") ); + m_sprJudgeLabels[l].Load( THEME->GetPathTo("Graphics","evaluation judge labels 1x8") ); m_sprJudgeLabels[l].StopAnimating(); m_sprJudgeLabels[l].SetState( l ); m_sprJudgeLabels[l].SetXY( JUDGE_LABELS_X, JUDGE_Y(l) ); @@ -536,13 +501,14 @@ ScreenEvaluation::ScreenEvaluation( bool bSummary ) this->AddChild( &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]) ); + m_textJudgeNumbers[0][p].SetText( ssprintf("%4d", iTapNoteScores[p][TNS_MARVELOUS]) ); + m_textJudgeNumbers[1][p].SetText( ssprintf("%4d", iTapNoteScores[p][TNS_PERFECT]) ); + m_textJudgeNumbers[2][p].SetText( ssprintf("%4d", iTapNoteScores[p][TNS_GREAT]) ); + m_textJudgeNumbers[3][p].SetText( ssprintf("%4d", iTapNoteScores[p][TNS_GOOD]) ); + m_textJudgeNumbers[4][p].SetText( ssprintf("%4d", iTapNoteScores[p][TNS_BOO]) ); + m_textJudgeNumbers[5][p].SetText( ssprintf("%4d", iTapNoteScores[p][TNS_MISS]) ); + m_textJudgeNumbers[6][p].SetText( ssprintf("%4d", iHoldNoteScores[p][HNS_OK]) ); + m_textJudgeNumbers[7][p].SetText( ssprintf("%4d", iMaxCombo[p]) ); if( m_ResultMode==RM_ONI ) @@ -579,13 +545,14 @@ ScreenEvaluation::ScreenEvaluation( bool bSummary ) case RM_ARCADE_STAGE: switch( max_grade ) { - case GRADE_E: SOUNDMAN->PlayOnceFromDir( ANNOUNCER->GetPathTo("evaluation e") ); break; - case GRADE_D: SOUNDMAN->PlayOnceFromDir( ANNOUNCER->GetPathTo("evaluation d") ); break; - case GRADE_C: SOUNDMAN->PlayOnceFromDir( ANNOUNCER->GetPathTo("evaluation c") ); break; - case GRADE_B: SOUNDMAN->PlayOnceFromDir( ANNOUNCER->GetPathTo("evaluation b") ); break; - case GRADE_A: SOUNDMAN->PlayOnceFromDir( ANNOUNCER->GetPathTo("evaluation a") ); break; - case GRADE_AA: SOUNDMAN->PlayOnceFromDir( ANNOUNCER->GetPathTo("evaluation aa") ); break; - case GRADE_AAA: SOUNDMAN->PlayOnceFromDir( ANNOUNCER->GetPathTo("evaluation aaa") ); break; + case GRADE_E: SOUNDMAN->PlayOnceFromDir( ANNOUNCER->GetPathTo("evaluation e") ); break; + case GRADE_D: SOUNDMAN->PlayOnceFromDir( ANNOUNCER->GetPathTo("evaluation d") ); break; + case GRADE_C: SOUNDMAN->PlayOnceFromDir( ANNOUNCER->GetPathTo("evaluation c") ); break; + case GRADE_B: SOUNDMAN->PlayOnceFromDir( ANNOUNCER->GetPathTo("evaluation b") ); break; + case GRADE_A: SOUNDMAN->PlayOnceFromDir( ANNOUNCER->GetPathTo("evaluation a") ); break; + case GRADE_AA: SOUNDMAN->PlayOnceFromDir( ANNOUNCER->GetPathTo("evaluation aa") ); break; + case GRADE_AAA: SOUNDMAN->PlayOnceFromDir( ANNOUNCER->GetPathTo("evaluation aaa") ); break; + case GRADE_AAAA: SOUNDMAN->PlayOnceFromDir( ANNOUNCER->GetPathTo("evaluation aaaa") ); break; case GRADE_NO_DATA: default: ASSERT(0); // invalid grade @@ -595,13 +562,14 @@ ScreenEvaluation::ScreenEvaluation( bool bSummary ) case RM_ARCADE_SUMMARY: switch( max_grade ) { - case GRADE_E: SOUNDMAN->PlayOnceFromDir( ANNOUNCER->GetPathTo("evaluation final e") ); break; - case GRADE_D: SOUNDMAN->PlayOnceFromDir( ANNOUNCER->GetPathTo("evaluation final d") ); break; - case GRADE_C: SOUNDMAN->PlayOnceFromDir( ANNOUNCER->GetPathTo("evaluation final c") ); break; - case GRADE_B: SOUNDMAN->PlayOnceFromDir( ANNOUNCER->GetPathTo("evaluation final b") ); break; - case GRADE_A: SOUNDMAN->PlayOnceFromDir( ANNOUNCER->GetPathTo("evaluation final a") ); break; - case GRADE_AA: SOUNDMAN->PlayOnceFromDir( ANNOUNCER->GetPathTo("evaluation final aa") ); break; - case GRADE_AAA: SOUNDMAN->PlayOnceFromDir( ANNOUNCER->GetPathTo("evaluation final aaa") ); break; + case GRADE_E: SOUNDMAN->PlayOnceFromDir( ANNOUNCER->GetPathTo("evaluation final e") ); break; + case GRADE_D: SOUNDMAN->PlayOnceFromDir( ANNOUNCER->GetPathTo("evaluation final d") ); break; + case GRADE_C: SOUNDMAN->PlayOnceFromDir( ANNOUNCER->GetPathTo("evaluation final c") ); break; + case GRADE_B: SOUNDMAN->PlayOnceFromDir( ANNOUNCER->GetPathTo("evaluation final b") ); break; + case GRADE_A: SOUNDMAN->PlayOnceFromDir( ANNOUNCER->GetPathTo("evaluation final a") ); break; + case GRADE_AA: SOUNDMAN->PlayOnceFromDir( ANNOUNCER->GetPathTo("evaluation final aa") ); break; + case GRADE_AAA: SOUNDMAN->PlayOnceFromDir( ANNOUNCER->GetPathTo("evaluation final aaa") ); break; + case GRADE_AAAA: SOUNDMAN->PlayOnceFromDir( ANNOUNCER->GetPathTo("evaluation final aaaa") ); break; case GRADE_NO_DATA: default: ASSERT(0); // invalid grade @@ -616,6 +584,7 @@ ScreenEvaluation::ScreenEvaluation( bool bSummary ) { case GRADE_AA: case GRADE_AAA: + case GRADE_AAAA: this->SendScreenMessage( SM_PlayCheer, 2.5f ); break; } diff --git a/stepmania/src/ScreenEvaluation.h b/stepmania/src/ScreenEvaluation.h index d3d99110b5..1ae06d22db 100644 --- a/stepmania/src/ScreenEvaluation.h +++ b/stepmania/src/ScreenEvaluation.h @@ -22,7 +22,7 @@ #include "DifficultyIcon.h" -const int NUM_JUDGE_LINES = 7; // perfect, great, good, boo, miss, ok, max_combo +const int NUM_JUDGE_LINES = 8; // marvelous, 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 diff --git a/stepmania/src/ScreenGameOver.cpp b/stepmania/src/ScreenGameOver.cpp index 3c3629f6e9..e715270563 100644 --- a/stepmania/src/ScreenGameOver.cpp +++ b/stepmania/src/ScreenGameOver.cpp @@ -30,6 +30,8 @@ const ScreenMessage SM_PlayAnnouncer = ScreenMessage(SM_User + 3); ScreenGameOver::ScreenGameOver() { + GAMESTATE->Reset(); + m_Background.LoadFromAniDir( THEME->GetPathTo("BGAnimations","game over") ); this->AddChild( &m_Background ); diff --git a/stepmania/src/ScreenGameplay.cpp b/stepmania/src/ScreenGameplay.cpp index 236bd0d480..1495de1be0 100644 --- a/stepmania/src/ScreenGameplay.cpp +++ b/stepmania/src/ScreenGameplay.cpp @@ -67,8 +67,8 @@ #define DIFFICULTY_Y( p, e, r ) THEME->GetMetricF("ScreenGameplay",ssprintf("DifficultyP%d%s%sY",p+1,e?"Extra":"",r?"Reverse":"")) #define DEBUG_X THEME->GetMetricF("ScreenGameplay","DebugX") #define DEBUG_Y THEME->GetMetricF("ScreenGameplay","DebugY") -#define AUTOPLAY_X THEME->GetMetricF("ScreenGameplay","AutoPlayX") -#define AUTOPLAY_Y THEME->GetMetricF("ScreenGameplay","AutoPlayY") +#define STATUS_ICONS_X THEME->GetMetricF("ScreenGameplay","StatusIconsX") +#define STATUS_ICONS_Y THEME->GetMetricF("ScreenGameplay","StatusIconsY") #define SURVIVE_TIME_X THEME->GetMetricF("ScreenGameplay","SurviveTimeX") #define SURVIVE_TIME_Y THEME->GetMetricF("ScreenGameplay","SurviveTimeY") #define SECONDS_BETWEEN_COMMENTS THEME->GetMetricF("ScreenGameplay","SecondsBetweenComments") @@ -209,7 +209,7 @@ void ScreenGameplay::FirstUpdate() - m_bChangedOffsetOrBPM = (GAMESTATE->m_SongOptions.m_AutoAdjust == SongOptions::ADJUST_ON); + m_bChangedOffsetOrBPM = GAMESTATE->m_SongOptions.m_bAutoSync; m_DancingState = STATE_INTRO; @@ -392,11 +392,16 @@ void ScreenGameplay::FirstUpdate() m_textDebug.SetDiffuse( RageColor(1,1,1,1) ); this->AddChild( &m_textDebug ); - m_textAutoPlay.LoadFromFont( THEME->GetPathTo("Fonts","normal") ); - m_textAutoPlay.SetXY( AUTOPLAY_X, AUTOPLAY_Y ); - m_textAutoPlay.SetText( "AutoPlay is ON" ); - m_textAutoPlay.SetDiffuse( RageColor(1,1,1,PREFSMAN->m_bAutoPlay?1:0) ); - this->AddChild( &m_textAutoPlay ); + + for( int s=0; sGetPathTo("Graphics",ssprintf("gameplay status icons 1x%d",NUM_STATUS_ICONS)) ); + m_sprStatusIcons[s].StopAnimating(); + m_sprStatusIcons[s].SetState(s); + this->AddChild( &m_sprStatusIcons[s] ); + } + + PositionStatusIcons(); // position them m_StarWipe.SetClosed(); @@ -861,26 +866,16 @@ void ScreenGameplay::Input( const DeviceInput& DeviceI, const InputEventType typ { case SDLK_F6: m_bChangedOffsetOrBPM = true; - - if (GAMESTATE->m_SongOptions.m_AutoAdjust == SongOptions::ADJUST_ON) { - GAMESTATE->m_SongOptions.m_AutoAdjust = SongOptions::ADJUST_OFF; - m_textDebug.SetText( "AutoAdjust is OFF" ); - } else { - GAMESTATE->m_SongOptions.m_AutoAdjust = SongOptions::ADJUST_ON; - m_textDebug.SetText( "AutoAdjust is ON" ); - } - m_textDebug.SetDiffuse( RageColor(1,1,1,1) ); - m_textDebug.StopTweening(); - m_textDebug.BeginTweening( 3 ); // sleep - m_textDebug.BeginTweening( 0.5f ); // fade out - m_textDebug.SetTweenDiffuse( RageColor(1,1,1,0) ); + GAMESTATE->m_SongOptions.m_bAutoSync = !GAMESTATE->m_SongOptions.m_bAutoSync; // toggle + PositionStatusIcons(); break; case SDLK_F7: if( GAMESTATE->m_SongOptions.m_AssistType == SongOptions::ASSIST_NONE ) GAMESTATE->m_SongOptions.m_AssistType = SongOptions::ASSIST_TICK; else GAMESTATE->m_SongOptions.m_AssistType = SongOptions::ASSIST_NONE; - m_textDebug.SetText( ssprintf( "Assist tick is %s.", (GAMESTATE->m_SongOptions.m_AssistType==SongOptions::ASSIST_NONE)?"OFF":"ON") ); + + m_textDebug.SetText( ssprintf("Assist Tick is %s", GAMESTATE->m_SongOptions.m_AssistType==SongOptions::ASSIST_TICK?"ON":"OFF") ); m_textDebug.SetDiffuse( RageColor(1,1,1,1) ); m_textDebug.StopTweening(); m_textDebug.BeginTweening( 3 ); // sleep @@ -889,7 +884,7 @@ void ScreenGameplay::Input( const DeviceInput& DeviceI, const InputEventType typ break; case SDLK_F8: PREFSMAN->m_bAutoPlay = !PREFSMAN->m_bAutoPlay; - m_textAutoPlay.SetDiffuse( RageColor(1,1,1,PREFSMAN->m_bAutoPlay?1:0) ); + PositionStatusIcons(); break; case SDLK_F9: case SDLK_F10: @@ -988,12 +983,44 @@ void ScreenGameplay::Input( const DeviceInput& DeviceI, const InputEventType typ m_Player[StyleI.player].Step( StyleI.col ); } +void ScreenGameplay::PositionStatusIcons() +{ + bool status[NUM_STATUS_ICONS] = { + PREFSMAN->m_bAutoPlay, + GAMESTATE->m_SongOptions.m_bAutoSync + }; + + vector vActorsToShow; + + for( int i=0; iSetY( STATUS_ICONS_Y ); + if( vActorsToShow.size()-1 == 0 ) + vActorsToShow[a]->SetX( center_x ); + else + vActorsToShow[a]->SetX( SCALE(a, 0.0f, vActorsToShow.size()-1, left_most_x, right_most_x) ); + } +} + void SaveChanges() { /* XXX: Hmm. Better would be to make sure m_pCurCourse is only set when we're * playing out of a course, and use that here, so these things wouldn't need to * special case play modes. Need to make sure m_pCurCourse gets erased * correctly, though. -glenn */ + /* That's a very clever idea! I will look into this soon. -Chris */ switch( GAMESTATE->m_PlayMode ) { case PLAY_MODE_ARCADE: @@ -1195,24 +1222,23 @@ void ScreenGameplay::HandleScreenMessage( const ScreenMessage SM ) break; case SM_BeginToasty: - this->SendScreenMessage( SM_PlayToastySound, 0.3f ); + if( PREFSMAN->m_bEasterEggs ) + { + m_soundToasty.Play(); - // set off screen - m_sprToasty.StopTweening(); - m_sprToasty.SetDiffuse( RageColor(1,1,1,1) ); - m_sprToasty.SetX( SCREEN_RIGHT+m_sprToasty.GetUnzoomedWidth()/2 ); - m_sprToasty.SetY( SCREEN_BOTTOM-m_sprToasty.GetUnzoomedHeight()/2 ); - m_sprToasty.BeginTweening( 0.2f, Actor::TWEEN_BIAS_BEGIN ); // slide on - m_sprToasty.SetTweenX( SCREEN_RIGHT-m_sprToasty.GetUnzoomedWidth()/2 ); - m_sprToasty.BeginTweening( 0.6f ); // sleep - m_sprToasty.BeginTweening( 0.3f, Actor::TWEEN_BIAS_END ); // slide off - m_sprToasty.SetTweenX( SCREEN_RIGHT+m_sprToasty.GetUnzoomedWidth()/2 ); - m_sprToasty.BeginTweening( 0.001f ); // fade out - m_sprToasty.SetDiffuse( RageColor(1,1,1,0) ); - break; - - case SM_PlayToastySound: - m_soundToasty.Play(); + // set off screen + m_sprToasty.StopTweening(); + m_sprToasty.SetDiffuse( RageColor(1,1,1,1) ); + m_sprToasty.SetX( SCREEN_RIGHT+m_sprToasty.GetUnzoomedWidth()/2 ); + m_sprToasty.SetY( SCREEN_BOTTOM-m_sprToasty.GetUnzoomedHeight()/2 ); + m_sprToasty.BeginTweening( 0.2f, Actor::TWEEN_BIAS_BEGIN ); // slide on + m_sprToasty.SetTweenX( SCREEN_RIGHT-m_sprToasty.GetUnzoomedWidth()/2 ); + m_sprToasty.BeginTweening( 0.6f ); // sleep + m_sprToasty.BeginTweening( 0.3f, Actor::TWEEN_BIAS_END ); // slide off + m_sprToasty.SetTweenX( SCREEN_RIGHT+m_sprToasty.GetUnzoomedWidth()/2 ); + m_sprToasty.BeginTweening( 0.001f ); // fade out + m_sprToasty.SetDiffuse( RageColor(1,1,1,0) ); + } break; case SM_100Combo: diff --git a/stepmania/src/ScreenGameplay.h b/stepmania/src/ScreenGameplay.h index c5bc5589d2..4e544586c7 100644 --- a/stepmania/src/ScreenGameplay.h +++ b/stepmania/src/ScreenGameplay.h @@ -77,33 +77,36 @@ protected: STATE_OUTRO, // not allowed to press Back NUM_DANCING_STATES }; - DancingState m_DancingState; - bool m_bChangedOffsetOrBPM; + DancingState m_DancingState; + bool m_bChangedOffsetOrBPM; - float m_fTimeLeftBeforeDancingComment; // this counter is only running while STATE_DANCING + float m_fTimeLeftBeforeDancingComment; // this counter is only running while STATE_DANCING - Background m_Background; + Background m_Background; - TransitionOniFade m_OniFade; // shows between songs in a course + TransitionOniFade m_OniFade; // shows between songs in a course - Sprite m_sprLifeFrame; - LifeMeter* m_pLifeMeter[NUM_PLAYERS]; - BitmapText m_textStageNumber; - BitmapText m_textCourseSongNumber[NUM_PLAYERS]; + Sprite m_sprLifeFrame; + LifeMeter* m_pLifeMeter[NUM_PLAYERS]; + BitmapText m_textStageNumber; + BitmapText m_textCourseSongNumber[NUM_PLAYERS]; - Sprite m_sprMiddleFrame; - BPMDisplay m_BPMDisplay; + Sprite m_sprMiddleFrame; + BPMDisplay m_BPMDisplay; - Sprite m_sprScoreFrame; - ScoreDisplay* m_pScoreDisplay[NUM_PLAYERS]; - BitmapText m_textPlayerOptions[NUM_PLAYERS]; - BitmapText m_textSongOptions; + Sprite m_sprScoreFrame; + ScoreDisplay* m_pScoreDisplay[NUM_PLAYERS]; + BitmapText m_textPlayerOptions[NUM_PLAYERS]; + BitmapText m_textSongOptions; - BitmapText m_textDebug; - BitmapText m_textAutoPlay; // shows whether AutoPlay is on. + BitmapText m_textDebug; + +#define NUM_STATUS_ICONS 2 + Sprite m_sprStatusIcons[NUM_STATUS_ICONS]; // shows whether these options are on. + void PositionStatusIcons(); // reposition the three above when the value of one changes - BitmapText m_MaxCombo; + BitmapText m_MaxCombo; TransitionFadeWipe m_Fade; TransitionStarWipe m_StarWipe; diff --git a/stepmania/src/ScreenInstructions.cpp b/stepmania/src/ScreenInstructions.cpp index 72cc121571..6cad65d14a 100644 --- a/stepmania/src/ScreenInstructions.cpp +++ b/stepmania/src/ScreenInstructions.cpp @@ -36,6 +36,7 @@ ScreenInstructions::ScreenInstructions() { LOG->Trace( "ScreenInstructions::ScreenInstructions()" ); + m_Menu.Load( THEME->GetPathTo("BGAnimations","Instructions"), THEME->GetPathTo("Graphics","Instructions Top Edge"), @@ -43,13 +44,32 @@ ScreenInstructions::ScreenInstructions() ); this->AddChild( &m_Menu ); - if(!PREFSMAN->m_bHowToPlay) + + if(!PREFSMAN->m_bInstructions) { + this->SendScreenMessage( SM_GoToNextScreen, 0 ); m_Menu.ImmedOffScreenToMenu(); - this->SendScreenMessage( SM_GoToNextScreen, 0.f ); return; } + // + // Skip this screen unless someone chose easy + // + Difficulty easiestDiffuclty = DIFFICULTY_HARD; + for( int p=0; pIsPlayerEnabled(p) ) + continue; + easiestDiffuclty = min( easiestDiffuclty, GAMESTATE->m_PreferredDifficulty[p] ); + } + if( easiestDiffuclty != DIFFICULTY_EASY ) + { + this->SendScreenMessage( SM_GoToNextScreen, 0 ); + m_Menu.ImmedOffScreenToMenu(); + return; + } + + m_Menu.TweenOnScreenFromMenu( SM_None, true ); CString sHowToPlayPath; diff --git a/stepmania/src/ScreenLogo.cpp b/stepmania/src/ScreenLogo.cpp new file mode 100644 index 0000000000..dd848baac7 --- /dev/null +++ b/stepmania/src/ScreenLogo.cpp @@ -0,0 +1,69 @@ +#include "stdafx.h" +/* +----------------------------------------------------------------------------- + Class: ScreenLogo + + Desc: See header. + + Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved. + Chris Danford +----------------------------------------------------------------------------- +*/ + +#include "ScreenLogo.h" +#include "ThemeManager.h" +#include "GameState.h" +#include "GameDef.h" +#include "RageLog.h" +#include "SongManager.h" + +#define LOGO_X THEME->GetMetricF("ScreenLogo","LogoX") +#define LOGO_Y THEME->GetMetricF("ScreenLogo","LogoY") +#define VERSION_X THEME->GetMetricF("ScreenLogo","VersionX") +#define VERSION_Y THEME->GetMetricF("ScreenLogo","VersionY") +#define SONGS_X THEME->GetMetricF("ScreenLogo","SongsX") +#define SONGS_Y THEME->GetMetricF("ScreenLogo","SongsY") + +ScreenLogo::ScreenLogo() +{ + LOG->Trace( "ScreenLogo::ScreenLogo()" ); + +} + +void ScreenLogo::FirstUpdate() +{ + ScreenAttract::FirstUpdate(); + + // we have to do init here because ScreenAttract does it's initialization in FirstUpdate() + + m_sprLogo.Load( THEME->GetPathTo("Graphics",ssprintf("logo %s",GAMESTATE->GetCurrentGameDef()->m_szName)) ); + m_sprLogo.SetXY( LOGO_X, LOGO_Y ); + m_sprLogo.SetGlow( RageColor(1,1,1,1) ); + m_sprLogo.SetZoomY( 0 ); + m_sprLogo.StopTweening(); + m_sprLogo.BeginTweening( 0.5f ); // sleep + m_sprLogo.BeginTweening( 0.5f, Actor::TWEEN_BOUNCE_END ); + m_sprLogo.SetEffectGlowing(1, RageColor(1,1,1,0.1f), RageColor(1,1,1,0.3f) ); + m_sprLogo.SetTweenZoom( 1 ); + this->AddChild( &m_sprLogo ); + + m_textVersion.LoadFromFont( THEME->GetPathTo("Fonts","normal") ); + m_textVersion.SetText( "v3.0 final" ); + m_textVersion.SetDiffuse( RageColor(0.6f,0.6f,0.6f,1) ); // light gray + m_textVersion.SetXY( VERSION_X, VERSION_Y ); + m_textVersion.SetZoom( 0.5f ); + m_textVersion.SetShadowLength( 2 ); + this->AddChild( &m_textVersion ); + + + m_textSongs.LoadFromFont( THEME->GetPathTo("Fonts","normal") ); + m_textSongs.SetHorizAlign( Actor::align_left ); + m_textSongs.SetText( ssprintf("Found %u Songs", SONGMAN->m_pSongs.size()) ); + m_textSongs.SetDiffuse( RageColor(0.6f,0.6f,0.6f,1) ); // light gray + m_textSongs.SetXY( SONGS_X, SONGS_Y ); + m_textSongs.SetZoom( 0.5f ); + m_textSongs.SetShadowLength( 2 ); + this->AddChild( &m_textSongs ); + + this->MoveToBack( &(ScreenAttract::m_Fade) ); // put it in the back so it covers up the stuff we just added +} diff --git a/stepmania/src/ScreenLogo.h b/stepmania/src/ScreenLogo.h index a29c6bab41..708e37c840 100644 --- a/stepmania/src/ScreenLogo.h +++ b/stepmania/src/ScreenLogo.h @@ -1,3 +1,5 @@ +#ifndef SCREENLOGO_H +#define SCREENLOGO_H /* ----------------------------------------------------------------------------- Class: ScreenLogo @@ -15,12 +17,19 @@ class ScreenLogo : public ScreenAttract { public: + ScreenLogo(); + + virtual void FirstUpdate(); private: virtual CString GetMetricName() { return "Logo"; }; // used to look up theme metrics virtual CString GetElementName() { return "logo"; }; // used to look up theme elements + Sprite m_sprLogo; + BitmapText m_textVersion; + BitmapText m_textSongs; }; +#endif \ No newline at end of file diff --git a/stepmania/src/ScreenMachineOptions.cpp b/stepmania/src/ScreenMachineOptions.cpp index bbebca1151..be8828be9c 100644 --- a/stepmania/src/ScreenMachineOptions.cpp +++ b/stepmania/src/ScreenMachineOptions.cpp @@ -31,6 +31,8 @@ enum { MO_LIFE_DIFFICULTY, MO_HIDDEN_SONGS, MO_SHOWSTATS, + MO_EASTER_EGGS, + MO_MARVELOUS, NUM_MACHINE_OPTIONS_LINES }; /* Hmm. Ignore JoyAxes and Back Delayed probably belong in "input options", @@ -43,6 +45,8 @@ OptionRowData g_MachineOptionsLines[NUM_MACHINE_OPTIONS_LINES] = { { "Life\nDifficulty", 7, {"1","2","3","4","5","6","7"} }, { "Hidden\nSongs", 2, {"OFF","ON"} }, { "Show\nStats", 2, {"OFF","ON"} }, + { "Easter\nEggs", 2, {"OFF","ON"} }, + { "Marvelous\nTiming", 2, {"OFF","ON"} }, }; ScreenMachineOptions::ScreenMachineOptions() : @@ -88,15 +92,15 @@ void ScreenMachineOptions::ImportOptions() * impossible, and perhaps it *is* justice that even the CPU fails * it. :) */ - if( PREFSMAN->m_fJudgeWindowSeconds == 0.27f ) m_iSelectedOption[0][MO_JUDGE_DIFFICULTY] = 0; - else if( PREFSMAN->m_fJudgeWindowSeconds == 0.24f ) m_iSelectedOption[0][MO_JUDGE_DIFFICULTY] = 1; - else if( PREFSMAN->m_fJudgeWindowSeconds == 0.21f ) m_iSelectedOption[0][MO_JUDGE_DIFFICULTY] = 2; - else if( PREFSMAN->m_fJudgeWindowSeconds == 0.18f ) m_iSelectedOption[0][MO_JUDGE_DIFFICULTY] = 3; - else if( PREFSMAN->m_fJudgeWindowSeconds == 0.15f ) m_iSelectedOption[0][MO_JUDGE_DIFFICULTY] = 4; - else if( PREFSMAN->m_fJudgeWindowSeconds == 0.12f ) m_iSelectedOption[0][MO_JUDGE_DIFFICULTY] = 5; - else if( PREFSMAN->m_fJudgeWindowSeconds == 0.09f ) m_iSelectedOption[0][MO_JUDGE_DIFFICULTY] = 6; - else if( PREFSMAN->m_fJudgeWindowSeconds == 0.06f ) m_iSelectedOption[0][MO_JUDGE_DIFFICULTY] = 7; - else m_iSelectedOption[0][MO_JUDGE_DIFFICULTY] = 3; + if( PREFSMAN->m_fJudgeWindowScale == 1.50f ) m_iSelectedOption[0][MO_JUDGE_DIFFICULTY] = 0; + else if( PREFSMAN->m_fJudgeWindowScale == 1.33f ) m_iSelectedOption[0][MO_JUDGE_DIFFICULTY] = 1; + else if( PREFSMAN->m_fJudgeWindowScale == 1.16f ) m_iSelectedOption[0][MO_JUDGE_DIFFICULTY] = 2; + else if( PREFSMAN->m_fJudgeWindowScale == 1.00f ) m_iSelectedOption[0][MO_JUDGE_DIFFICULTY] = 3; + else if( PREFSMAN->m_fJudgeWindowScale == 0.84f ) m_iSelectedOption[0][MO_JUDGE_DIFFICULTY] = 4; + else if( PREFSMAN->m_fJudgeWindowScale == 0.66f ) m_iSelectedOption[0][MO_JUDGE_DIFFICULTY] = 5; + else if( PREFSMAN->m_fJudgeWindowScale == 0.50f ) m_iSelectedOption[0][MO_JUDGE_DIFFICULTY] = 6; + else if( PREFSMAN->m_fJudgeWindowScale == 0.33f ) m_iSelectedOption[0][MO_JUDGE_DIFFICULTY] = 7; + else m_iSelectedOption[0][MO_JUDGE_DIFFICULTY] = 3; if( PREFSMAN->m_fLifeDifficultyScale == 1.60f ) m_iSelectedOption[0][MO_LIFE_DIFFICULTY] = 0; else if( PREFSMAN->m_fLifeDifficultyScale == 1.40f ) m_iSelectedOption[0][MO_LIFE_DIFFICULTY] = 1; @@ -108,6 +112,8 @@ void ScreenMachineOptions::ImportOptions() else m_iSelectedOption[0][MO_LIFE_DIFFICULTY] = 3; m_iSelectedOption[0][MO_SHOWSTATS] = PREFSMAN->m_bShowStats ? 1:0; + m_iSelectedOption[0][MO_EASTER_EGGS] = PREFSMAN->m_bEasterEggs ? 1:0; + m_iSelectedOption[0][MO_MARVELOUS] = PREFSMAN->m_bMarvelousTiming ? 1:0; } void ScreenMachineOptions::ExportOptions() @@ -120,14 +126,14 @@ void ScreenMachineOptions::ExportOptions() switch( m_iSelectedOption[0][MO_JUDGE_DIFFICULTY] ) { - case 0: PREFSMAN->m_fJudgeWindowSeconds = 0.27f; break; - case 1: PREFSMAN->m_fJudgeWindowSeconds = 0.24f; break; - case 2: PREFSMAN->m_fJudgeWindowSeconds = 0.21f; break; - case 3: PREFSMAN->m_fJudgeWindowSeconds = 0.18f; break; - case 4: PREFSMAN->m_fJudgeWindowSeconds = 0.15f; break; - case 5: PREFSMAN->m_fJudgeWindowSeconds = 0.12f; break; - case 6: PREFSMAN->m_fJudgeWindowSeconds = 0.09f; break; - case 7: PREFSMAN->m_fJudgeWindowSeconds = 0.06f; break; + case 0: PREFSMAN->m_fJudgeWindowScale = 1.50f; break; + case 1: PREFSMAN->m_fJudgeWindowScale = 1.33f; break; + case 2: PREFSMAN->m_fJudgeWindowScale = 1.16f; break; + case 3: PREFSMAN->m_fJudgeWindowScale = 1.00f; break; + case 4: PREFSMAN->m_fJudgeWindowScale = 0.84f; break; + case 5: PREFSMAN->m_fJudgeWindowScale = 0.66f; break; + case 6: PREFSMAN->m_fJudgeWindowScale = 0.50f; break; + case 7: PREFSMAN->m_fJudgeWindowScale = 0.33f; break; default: ASSERT(0); } @@ -143,7 +149,9 @@ void ScreenMachineOptions::ExportOptions() default: ASSERT(0); } - PREFSMAN->m_bShowStats = m_iSelectedOption[0][MO_SHOWSTATS] == 1; + PREFSMAN->m_bShowStats = m_iSelectedOption[0][MO_SHOWSTATS] == 1; + PREFSMAN->m_bEasterEggs = m_iSelectedOption[0][MO_EASTER_EGGS] == 1; + PREFSMAN->m_bMarvelousTiming = m_iSelectedOption[0][MO_MARVELOUS] == 1; } void ScreenMachineOptions::GoToPrevState() diff --git a/stepmania/src/ScreenMusicScroll.cpp b/stepmania/src/ScreenMusicScroll.cpp index 3a6f990830..77d0214926 100644 --- a/stepmania/src/ScreenMusicScroll.cpp +++ b/stepmania/src/ScreenMusicScroll.cpp @@ -236,7 +236,7 @@ void ScreenMusicScroll::HandleScreenMessage( const ScreenMessage SM ) m_Fade.CloseWipingRight( SM_GoToNextScreen ); break; case SM_GoToNextScreen: - SCREENMAN->SetNewScreen( "ScreenTitleMenu" ); + SCREENMAN->SetNewScreen( "ScreenCompany" ); break; } } diff --git a/stepmania/src/ScreenPrompt.cpp b/stepmania/src/ScreenPrompt.cpp index 72c134fa27..4845b4ece4 100644 --- a/stepmania/src/ScreenPrompt.cpp +++ b/stepmania/src/ScreenPrompt.cpp @@ -95,7 +95,7 @@ void ScreenPrompt::Input( const DeviceInput& DeviceI, const InputEventType type, if( m_Fade.IsOpening() ) return; - if( DeviceI.device == DEVICE_KEYBOARD ) + if( DeviceI.device==DEVICE_KEYBOARD && type==IET_FIRST_PRESS ) { switch( DeviceI.button ) { @@ -144,6 +144,7 @@ void ScreenPrompt::MenuRight( PlayerNumber pn ) m_bAnswer = !m_bAnswer; m_textAnswer[m_bAnswer].SetEffectGlowing(); + m_rectAnswerBox.StopTweening(); m_rectAnswerBox.BeginTweening( 0.2f ); m_rectAnswerBox.SetTweenXY( m_textAnswer[m_bAnswer].GetX(), m_textAnswer[m_bAnswer].GetY() ); m_rectAnswerBox.SetTweenZoomX( m_textAnswer[m_bAnswer].GetWidestLineWidthInSourcePixels()+10.0f ); diff --git a/stepmania/src/ScreenSelectMode.cpp b/stepmania/src/ScreenSelectMode.cpp index c9547ed646..5e4c4cedec 100644 --- a/stepmania/src/ScreenSelectMode.cpp +++ b/stepmania/src/ScreenSelectMode.cpp @@ -300,7 +300,7 @@ void ScreenSelectMode::AfterChange() { for( unsigned i=0; iGetPathTo("graphics","select music difficulty icons 1x6") ); m_DifficultyIcon[p].SetXY( DIFFICULTY_ICON_X(p), DIFFICULTY_ICON_Y(p) ); this->AddChild( &m_DifficultyIcon[p] ); + + m_AutoGenIcon[p].Load( THEME->GetPathTo("graphics","select music autogen icon") ); + m_AutoGenIcon[p].SetXY( DIFFICULTY_ICON_X(p), DIFFICULTY_ICON_Y(p) ); + this->AddChild( &m_AutoGenIcon[p] ); } m_GrooveRadar.SetXY( RADAR_X, RADAR_Y ); @@ -286,6 +290,7 @@ void ScreenSelectMusic::TweenOnScreen() // m_textPlayerOptions[p].SetTweenZoomY( fOriginalZoomY ); m_DifficultyIcon[p].FadeOn( 0, "foldy", TWEEN_TIME ); + m_AutoGenIcon[p].FadeOn( 0, "foldy", TWEEN_TIME ); m_FootMeter[p].FadeOn( 0, "foldy", TWEEN_TIME ); } @@ -328,6 +333,7 @@ void ScreenSelectMusic::TweenOffScreen() // m_textPlayerOptions[p].FadeOff( 0, "fade", TWEEN_TIME ); m_DifficultyIcon[p].FadeOff( 0, "foldy", TWEEN_TIME ); + m_AutoGenIcon[p].FadeOff( 0, "foldy", TWEEN_TIME ); m_FootMeter[p].FadeOff( 0, "foldy", TWEEN_TIME ); } @@ -690,6 +696,15 @@ void ScreenSelectMusic::AfterNotesChange( PlayerNumber pn ) m_HighScore[pn].SetScore( (float)m_pNotes->m_iTopScore ); m_DifficultyIcon[pn].SetFromNotes( pn, pNotes ); + if( pNotes && pNotes->IsAutogen() ) + { + m_AutoGenIcon[pn].SetEffectCamelion(); + } + else + { + m_AutoGenIcon[pn].SetEffectNone(); + m_AutoGenIcon[pn].SetDiffuse( RageColor(1,1,1,0) ); + } m_FootMeter[pn].SetFromNotes( pNotes ); m_GrooveRadar.SetFromNotes( pn, pNotes ); m_MusicWheel.NotesChanged( pn ); diff --git a/stepmania/src/ScreenSelectMusic.h b/stepmania/src/ScreenSelectMusic.h index fdaff5cf3f..96b054faa8 100644 --- a/stepmania/src/ScreenSelectMusic.h +++ b/stepmania/src/ScreenSelectMusic.h @@ -66,6 +66,7 @@ protected: Sprite m_sprCDTitle; Sprite m_sprDifficultyFrame[NUM_PLAYERS]; DifficultyIcon m_DifficultyIcon[NUM_PLAYERS]; + Sprite m_AutoGenIcon[NUM_PLAYERS]; GrooveRadar m_GrooveRadar; // BitmapText m_textPlayerOptions[NUM_PLAYERS]; BitmapText m_textSongOptions; diff --git a/stepmania/src/ScreenSongOptions.cpp b/stepmania/src/ScreenSongOptions.cpp index 21b66c9a96..1ee6191abf 100644 --- a/stepmania/src/ScreenSongOptions.cpp +++ b/stepmania/src/ScreenSongOptions.cpp @@ -27,7 +27,7 @@ enum { SO_FAIL, SO_ASSIST, SO_RATE, - SO_AUTOADJ, + SO_AUTOSYNC, NUM_SONG_OPTIONS_LINES }; @@ -65,7 +65,7 @@ void ScreenSongOptions::ImportOptions() m_iSelectedOption[0][SO_BAT_LIVES] = so.m_iBatteryLives-1; m_iSelectedOption[0][SO_FAIL] = so.m_FailType; m_iSelectedOption[0][SO_ASSIST] = so.m_AssistType; - m_iSelectedOption[0][SO_AUTOADJ] = so.m_AutoAdjust; + m_iSelectedOption[0][SO_AUTOSYNC] = so.m_bAutoSync; if( so.m_fMusicRate == 0.7f ) m_iSelectedOption[0][SO_RATE] = 0; else if( so.m_fMusicRate == 0.8f ) m_iSelectedOption[0][SO_RATE] = 1; @@ -88,7 +88,7 @@ void ScreenSongOptions::ExportOptions() so.m_iBatteryLives = m_iSelectedOption[0][SO_BAT_LIVES]+1; so.m_FailType = (SongOptions::FailType)m_iSelectedOption[0][SO_FAIL]; so.m_AssistType = (SongOptions::AssistType)m_iSelectedOption[0][SO_ASSIST]; - so.m_AutoAdjust = (SongOptions::AutoAdjustType)m_iSelectedOption[0][SO_AUTOADJ]; + so.m_bAutoSync = m_iSelectedOption[0][SO_AUTOSYNC] != 0; switch( m_iSelectedOption[0][SO_RATE] ) { diff --git a/stepmania/src/ScreenTitleMenu.cpp b/stepmania/src/ScreenTitleMenu.cpp index 145ed279ea..5fb35936f6 100644 --- a/stepmania/src/ScreenTitleMenu.cpp +++ b/stepmania/src/ScreenTitleMenu.cpp @@ -42,27 +42,22 @@ const CString CHOICE_TEXT[ScreenTitleMenu::NUM_TITLE_MENU_CHOICES] = { "EXIT", }; +#define HELP_X THEME->GetMetricF("ScreenTitleMenu","HelpX") +#define HELP_Y THEME->GetMetricF("ScreenTitleMenu","HelpY") #define CHOICES_X THEME->GetMetricF("ScreenTitleMenu","ChoicesX") #define CHOICES_START_Y THEME->GetMetricF("ScreenTitleMenu","ChoicesStartY") #define CHOICES_SPACING_Y THEME->GetMetricF("ScreenTitleMenu","ChoicesSpacingY") #define CHOICES_SHADOW_LENGTH THEME->GetMetricF("ScreenTitleMenu","ChoicesShadowLength") -#define HELP_X THEME->GetMetricF("ScreenTitleMenu","HelpX") -#define HELP_Y THEME->GetMetricF("ScreenTitleMenu","HelpY") -#define LOGO_X THEME->GetMetricF("ScreenTitleMenu","LogoX") -#define LOGO_Y THEME->GetMetricF("ScreenTitleMenu","LogoY") -#define VERSION_X THEME->GetMetricF("ScreenTitleMenu","VersionX") -#define VERSION_Y THEME->GetMetricF("ScreenTitleMenu","VersionY") -#define SONGS_X THEME->GetMetricF("ScreenTitleMenu","SongsX") -#define SONGS_Y THEME->GetMetricF("ScreenTitleMenu","SongsY") #define COLOR_NOT_SELECTED THEME->GetMetricC("ScreenTitleMenu","ColorNotSelected") #define COLOR_SELECTED THEME->GetMetricC("ScreenTitleMenu","ColorSelected") #define ZOOM_NOT_SELECTED THEME->GetMetricF("ScreenTitleMenu","ZoomNotSelected") #define ZOOM_SELECTED THEME->GetMetricF("ScreenTitleMenu","ZoomSelected") -#define SECONDS_BETWEEN_ATTRACT THEME->GetMetricF("ScreenTitleMenu","SecondsBetweenAttract") +#define SECONDS_BETWEEN_COMMENTS THEME->GetMetricF("ScreenTitleMenu","SecondsBetweenComments") +#define SECONDS_BEFORE_ATTRACT THEME->GetMetricF("ScreenTitleMenu","SecondsBeforeAttract") #define HELP_TEXT THEME->GetMetric("ScreenTitleMenu","HelpText") #define NEXT_SCREEN THEME->GetMetric("ScreenTitleMenu","NextScreen") -const ScreenMessage SM_PlayAttract = ScreenMessage(SM_User+1); +const ScreenMessage SM_PlayComment = ScreenMessage(SM_User+1); const ScreenMessage SM_GoToNextScreen = ScreenMessage(SM_User+12); const ScreenMessage SM_GoToAttractLoop = ScreenMessage(SM_User+13); @@ -70,21 +65,15 @@ const ScreenMessage SM_GoToAttractLoop = ScreenMessage(SM_User+13); ScreenTitleMenu::ScreenTitleMenu() { LOG->Trace( "ScreenTitleMenu::ScreenTitleMenu()" ); +} - m_Background.LoadFromAniDir( THEME->GetPathTo("BGAnimations","title menu") ); - this->AddChild( &m_Background ); +void ScreenTitleMenu::FirstUpdate() +{ + LOG->Trace( "ScreenTitleMenu::FirstUpdate()" ); - m_sprLogo.Load( THEME->GetPathTo("Graphics",ssprintf("title menu logo %s",GAMESTATE->GetCurrentGameDef()->m_szName)) ); - m_sprLogo.SetXY( LOGO_X, LOGO_Y ); - m_sprLogo.SetGlow( RageColor(1,1,1,1) ); - m_sprLogo.SetZoomY( 0 ); - m_sprLogo.StopTweening(); - m_sprLogo.BeginTweening( 0.5f ); // sleep - m_sprLogo.BeginTweening( 0.5f, Actor::TWEEN_BOUNCE_END ); - m_sprLogo.SetEffectGlowing(1, RageColor(1,1,1,0.1f), RageColor(1,1,1,0.3f) ); - m_sprLogo.SetTweenZoom( 1 ); - this->AddChild( &m_sprLogo ); + ScreenLogo::FirstUpdate(); + // we have to do init here because ScreenLogo does it's initialization in FirstUpdate() m_textHelp.LoadFromFont( THEME->GetPathTo("Fonts","help") ); m_textHelp.SetText( HELP_TEXT ); m_textHelp.SetXY( HELP_X, HELP_Y ); @@ -93,24 +82,6 @@ ScreenTitleMenu::ScreenTitleMenu() m_textHelp.SetShadowLength( 2 ); this->AddChild( &m_textHelp ); - m_textVersion.LoadFromFont( THEME->GetPathTo("Fonts","normal") ); - m_textVersion.SetText( "v3.0 final" ); - m_textVersion.SetDiffuse( RageColor(0.6f,0.6f,0.6f,1) ); // light gray - m_textVersion.SetXY( VERSION_X, VERSION_Y ); - m_textVersion.SetZoom( 0.5f ); - m_textVersion.SetShadowLength( 2 ); - this->AddChild( &m_textVersion ); - - - m_textSongs.LoadFromFont( THEME->GetPathTo("Fonts","normal") ); - m_textSongs.SetHorizAlign( Actor::align_left ); - m_textSongs.SetText( ssprintf("Found %u Songs", SONGMAN->m_pSongs.size()) ); - m_textSongs.SetDiffuse( RageColor(0.6f,0.6f,0.6f,1) ); // light gray - m_textSongs.SetXY( SONGS_X, SONGS_Y ); - m_textSongs.SetZoom( 0.5f ); - m_textSongs.SetShadowLength( 2 ); - this->AddChild( &m_textSongs ); - int i; for( i=0; i< NUM_TITLE_MENU_CHOICES; i++ ) { @@ -122,12 +93,6 @@ ScreenTitleMenu::ScreenTitleMenu() this->AddChild( &m_textChoice[i] ); } - - m_Fade.SetClosed(); - m_Fade.OpenWipingRight( SM_None ); - - this->AddChild( &m_Fade ); - SOUNDMAN->PlayOnceFromDir( ANNOUNCER->GetPathTo("title menu game name") ); @@ -142,11 +107,14 @@ ScreenTitleMenu::ScreenTitleMenu() LoseFocus( i ); GainFocus( m_TitleMenuChoice ); + m_soundMusic.Stop(); + SOUNDMAN->PlayMusic( THEME->GetPathTo("Sounds","title menu music") ); - this->SendScreenMessage( SM_PlayAttract, SECONDS_BETWEEN_ATTRACT ); -} + this->SendScreenMessage( SM_PlayComment, SECONDS_BETWEEN_COMMENTS); + this->MoveToBack( &(ScreenAttract::m_Fade) ); // put it in the back so it covers up the stuff we just added +} ScreenTitleMenu::~ScreenTitleMenu() { @@ -167,6 +135,12 @@ void ScreenTitleMenu::Input( const DeviceInput& DeviceI, const InputEventType ty void ScreenTitleMenu::Update( float fDelta ) { + if(TimeToDemonstration.PeekDeltaTime() >= SECONDS_BEFORE_ATTRACT) + { + this->SendScreenMessage( SM_GoToAttractLoop, 0 ); + TimeToDemonstration.GetDeltaTime(); + } + Screen::Update(fDelta); } @@ -175,9 +149,9 @@ void ScreenTitleMenu::HandleScreenMessage( const ScreenMessage SM ) { switch( SM ) { - case SM_PlayAttract: + case SM_PlayComment: m_soundAttract.PlayRandom(); - this->SendScreenMessage( SM_PlayAttract, SECONDS_BETWEEN_ATTRACT ); + this->SendScreenMessage( SM_PlayComment, SECONDS_BETWEEN_COMMENTS ); break; case SM_GoToNextScreen: switch( m_TitleMenuChoice ) @@ -246,6 +220,8 @@ void ScreenTitleMenu::GainFocus( int iChoiceIndex ) void ScreenTitleMenu::MenuUp( PlayerNumber pn ) { + TimeToDemonstration.GetDeltaTime(); /* Reset the demonstration timer when a key is pressed. */ + LoseFocus( m_TitleMenuChoice ); if( m_TitleMenuChoice == 0 ) // wrap around @@ -261,6 +237,8 @@ void ScreenTitleMenu::MenuUp( PlayerNumber pn ) void ScreenTitleMenu::MenuDown( PlayerNumber pn ) { + TimeToDemonstration.GetDeltaTime(); /* Reset the demonstration timer when a key is pressed. */ + LoseFocus( m_TitleMenuChoice ); if( m_TitleMenuChoice == (int)ScreenTitleMenu::NUM_TITLE_MENU_CHOICES-1 ) diff --git a/stepmania/src/ScreenTitleMenu.h b/stepmania/src/ScreenTitleMenu.h index 31f6c22456..94d40b5a33 100644 --- a/stepmania/src/ScreenTitleMenu.h +++ b/stepmania/src/ScreenTitleMenu.h @@ -9,7 +9,7 @@ ----------------------------------------------------------------------------- */ -#include "Screen.h" +#include "ScreenLogo.h" #include "Sprite.h" #include "BitmapText.h" #include "TransitionFade.h" @@ -18,12 +18,14 @@ #include "RageTimer.h" -class ScreenTitleMenu : public Screen +class ScreenTitleMenu : public ScreenLogo { public: ScreenTitleMenu(); virtual ~ScreenTitleMenu(); + virtual void FirstUpdate(); + virtual void Input( const DeviceInput& DeviceI, const InputEventType type, const GameInput &GameI, const MenuInput &MenuI, const StyleInput &StyleI ); virtual void Update( float fDelta ); virtual void HandleScreenMessage( const ScreenMessage SM ); @@ -54,15 +56,9 @@ private: TitleMenuChoice m_TitleMenuChoice; - BGAnimation m_Background; - Sprite m_sprLogo; BitmapText m_textHelp; - BitmapText m_textVersion; - BitmapText m_textSongs; BitmapText m_textChoice[NUM_TITLE_MENU_CHOICES]; - TransitionFade m_Fade; - RandomSample m_soundAttract; RandomSample m_soundChange; RandomSample m_soundSelect; diff --git a/stepmania/src/SmallGradeDisplay.cpp b/stepmania/src/SmallGradeDisplay.cpp index cf07f5d821..419d305479 100644 --- a/stepmania/src/SmallGradeDisplay.cpp +++ b/stepmania/src/SmallGradeDisplay.cpp @@ -25,7 +25,7 @@ const float GRADES_TO_SCROLL = NUM_GRADE_FRAMES*4; SmallGradeDisplay::SmallGradeDisplay() { - Load( THEME->GetPathTo("Graphics","select music small grades 2x8") ); + Load( THEME->GetPathTo("Graphics","select music small grades 2x9") ); StopAnimating(); SetGrade( PLAYER_1, GRADE_NO_DATA ); @@ -50,14 +50,15 @@ void SmallGradeDisplay::SetGrade( PlayerNumber pn, Grade g ) int iNumCols = 2; switch( g ) { - case GRADE_AAA: SetState( 0*iNumCols+pn ); break; - case GRADE_AA: SetState( 1*iNumCols+pn ); break; - case GRADE_A: SetState( 2*iNumCols+pn ); break; - case GRADE_B: SetState( 3*iNumCols+pn ); break; - case GRADE_C: SetState( 4*iNumCols+pn ); break; - case GRADE_D: SetState( 5*iNumCols+pn ); break; - case GRADE_E: SetState( 6*iNumCols+pn ); break; - case GRADE_NO_DATA: SetState( 7*iNumCols+pn ); break; + case GRADE_AAAA: SetState( 0*iNumCols+pn ); break; + case GRADE_AAA: SetState( 1*iNumCols+pn ); break; + case GRADE_AA: SetState( 2*iNumCols+pn ); break; + case GRADE_A: SetState( 3*iNumCols+pn ); break; + case GRADE_B: SetState( 4*iNumCols+pn ); break; + case GRADE_C: SetState( 5*iNumCols+pn ); break; + case GRADE_D: SetState( 6*iNumCols+pn ); break; + case GRADE_E: SetState( 7*iNumCols+pn ); break; + case GRADE_NO_DATA: SetState( 8*iNumCols+pn ); break; default: ASSERT(0); } } diff --git a/stepmania/src/SongOptions.cpp b/stepmania/src/SongOptions.cpp index cedd14ff8b..754d7e0a2e 100644 --- a/stepmania/src/SongOptions.cpp +++ b/stepmania/src/SongOptions.cpp @@ -49,11 +49,8 @@ CString SongOptions::GetString() sReturn += s + "xMusic, "; } - switch( m_AutoAdjust ) - { - case ADJUST_OFF: break; - case ADJUST_ON: sReturn += "AutoAdjust, "; break; - } + if( m_bAutoSync ) + sReturn += "AutoSync, "; if( sReturn.GetLength() > 2 ) sReturn.erase( sReturn.GetLength()-2 ); // delete the trailing ", " diff --git a/stepmania/src/SongOptions.h b/stepmania/src/SongOptions.h index 7601a70513..1bde170a69 100644 --- a/stepmania/src/SongOptions.h +++ b/stepmania/src/SongOptions.h @@ -25,8 +25,7 @@ struct SongOptions enum AssistType { ASSIST_NONE=0, ASSIST_TICK }; AssistType m_AssistType; float m_fMusicRate; - enum AutoAdjustType { ADJUST_OFF=0, ADJUST_ON }; - AutoAdjustType m_AutoAdjust; + bool m_bAutoSync; SongOptions() { Init(); }; void Init() @@ -37,7 +36,7 @@ struct SongOptions m_FailType = FAIL_ARCADE; m_AssistType = ASSIST_NONE; m_fMusicRate = 1.0f; - m_AutoAdjust = ADJUST_OFF; + m_bAutoSync = false; }; CString GetString(); void FromString( CString sOptions ); diff --git a/stepmania/src/StepMania.dsp b/stepmania/src/StepMania.dsp index 57b74cfb58..588a9f91a7 100644 --- a/stepmania/src/StepMania.dsp +++ b/stepmania/src/StepMania.dsp @@ -60,7 +60,7 @@ IntDir=.\../Release6 TargetDir=\stepmania\stepmania TargetName=StepMania SOURCE="$(InputPath)" -PreLink_Cmds=disasm\verinc cl /Zl /nologo /c verstub.cpp /Fo$(IntDir)\ +PreLink_Cmds=disasm\verinc cl /Zl /nologo /c verstub.cpp /Fo$(IntDir)\ PostBuild_Cmds=disasm\mapconv $(IntDir)\$(TargetName).map $(TargetDir)\StepMania.vdi ia32.vdi # End Special Build Tool @@ -95,7 +95,7 @@ IntDir=.\../Debug6 TargetDir=\stepmania\stepmania TargetName=StepMania-debug SOURCE="$(InputPath)" -PreLink_Cmds=disasm\verinc cl /Zl /nologo /c verstub.cpp /Fo$(IntDir)\ +PreLink_Cmds=disasm\verinc cl /Zl /nologo /c verstub.cpp /Fo$(IntDir)\ PostBuild_Cmds=disasm\mapconv $(IntDir)\$(TargetName).map $(TargetDir)\StepMania.vdi ia32.vdi # End Special Build Tool @@ -1409,6 +1409,10 @@ SOURCE=.\ScreenInstructions.h # End Source File # Begin Source File +SOURCE=.\ScreenLogo.cpp +# End Source File +# Begin Source File + SOURCE=.\ScreenLogo.h # End Source File # Begin Source File diff --git a/stepmania/src/StepMania.vcproj b/stepmania/src/StepMania.vcproj index 78ffc90b51..9fc074ee45 100644 --- a/stepmania/src/StepMania.vcproj +++ b/stepmania/src/StepMania.vcproj @@ -231,6 +231,12 @@ cl /Zl /nologo /c verstub.cpp /Fo$(IntDir)\ + + + + @@ -249,12 +255,33 @@ cl /Zl /nologo /c verstub.cpp /Fo$(IntDir)\ + + + + + + + + + + + + + + @@ -273,6 +300,9 @@ cl /Zl /nologo /c verstub.cpp /Fo$(IntDir)\ + + @@ -396,6 +426,12 @@ cl /Zl /nologo /c verstub.cpp /Fo$(IntDir)\ + + + +