diff --git a/stepmania/src/GameState.cpp b/stepmania/src/GameState.cpp index 858d4610ae..0a7a94c539 100644 --- a/stepmania/src/GameState.cpp +++ b/stepmania/src/GameState.cpp @@ -316,7 +316,7 @@ void GameState::Reset() m_sEditLocalProfileID.Set( "" ); m_bBackedOutOfFinalStage = false; - + m_bEarnedExtraStage = false; ApplyCmdline(); } @@ -642,6 +642,7 @@ void GameState::BeginStage() FOREACH_HumanPlayer( pn ) if( CurrentOptionsDisqualifyPlayer(pn) ) STATSMAN->m_CurStageStats.m_player[pn].m_bDisqualified = true; + m_bEarnedExtraStage = false; } void GameState::CancelStage() @@ -684,7 +685,7 @@ void GameState::FinishStage() m_iNumStagesOfThisSong = 0; - if( HasEarnedExtraStage() ) + if( HasEarnedExtraStageInternal() ) { LOG->Trace( "awarded extra stage" ); FOREACH_HumanPlayer( p ) @@ -693,6 +694,7 @@ void GameState::FinishStage() { ++m_iAwardedExtraStages[p]; ++m_iPlayerStageTokens[p]; + m_bEarnedExtraStage = true; } } } @@ -1125,9 +1127,9 @@ bool GameState::IsBattleMode() const default: return false; } -} +} -bool GameState::HasEarnedExtraStage() const +bool GameState::HasEarnedExtraStageInternal() const { if( IsEventMode() ) return false; @@ -1153,8 +1155,12 @@ bool GameState::HasEarnedExtraStage() const m_pCurSteps[pn]->GetDifficulty() != Difficulty_Challenge ) continue; /* not hard enough! */ - if( (IsExtraStage() && STATSMAN->m_CurStageStats.m_player[pn].GetGrade() <= GRADE_TIER_FOR_EXTRA_1) || - (IsExtraStage2() && STATSMAN->m_CurStageStats.m_player[pn].GetGrade() <= GRADE_TIER_FOR_EXTRA_2) ) + if( IsExtraStage() ) + { + if( STATSMAN->m_CurStageStats.m_player[pn].GetGrade() <= GRADE_TIER_FOR_EXTRA_2 ) + return true; + } + else if( STATSMAN->m_CurStageStats.m_player[pn].GetGrade() <= GRADE_TIER_FOR_EXTRA_1 ) { return true; } diff --git a/stepmania/src/GameState.h b/stepmania/src/GameState.h index 85307165b8..e1ba4e2721 100644 --- a/stepmania/src/GameState.h +++ b/stepmania/src/GameState.h @@ -129,7 +129,6 @@ public: int m_iCurrentStageIndex; // Num stages available for player. Resets when player joins/continues. int m_iPlayerStageTokens[NUM_PLAYERS]; - int m_iAwardedExtraStages[NUM_PLAYERS]; static int GetNumStagesMultiplierForSong( const Song* pSong ); static int GetNumStagesForSongAndStyleType( const Song* pSong, StyleType st ); @@ -245,7 +244,7 @@ public: Character* m_pCurCharacters[NUM_PLAYERS]; - bool HasEarnedExtraStage() const; + bool HasEarnedExtraStage() const { return m_bEarnedExtraStage; } // @@ -319,6 +318,13 @@ public: // Lua void PushSelf( lua_State *L ); + + // Keep extra stage logic internal to GameState. +private: + bool HasEarnedExtraStageInternal() const; + int m_iAwardedExtraStages[NUM_PLAYERS]; + bool m_bEarnedExtraStage; + }; PlayerNumber GetNextHumanPlayer( PlayerNumber pn ); diff --git a/stepmania/src/ScreenEvaluation.cpp b/stepmania/src/ScreenEvaluation.cpp index ddb8dd4642..b33903888c 100644 --- a/stepmania/src/ScreenEvaluation.cpp +++ b/stepmania/src/ScreenEvaluation.cpp @@ -656,10 +656,7 @@ void ScreenEvaluation::Init() FOREACH_PlayerNumber( p ) best_grade = min( best_grade, grade[p] ); - if( PREFSMAN->m_bAllowExtraStage && - GAMESTATE->IsAnExtraStage() && - !GAMESTATE->IsCourseMode() && - !SUMMARY ) + if( !SUMMARY && GAMESTATE->HasEarnedExtraStage() ) { m_sprTryExtraStage.Load( THEME->GetPathG(m_sName,GAMESTATE->IsExtraStage2()?"try extra2":"try extra1") ); m_sprTryExtraStage->SetName( "TryExtraStage" );