diff --git a/stepmania/src/GameState.cpp b/stepmania/src/GameState.cpp index 5ff987422f..8035825bf6 100644 --- a/stepmania/src/GameState.cpp +++ b/stepmania/src/GameState.cpp @@ -1038,10 +1038,14 @@ void GameState::ApplyModifiers( PlayerNumber pn, RString sModifiers ) void GameState::StoreSelectedOptions() { FOREACH_PlayerNumber( pn ) - { m_pPlayerState[pn]->m_StoredPlayerOptions = m_pPlayerState[pn]->m_PlayerOptions; + m_StoredSongOptions = m_SongOptions; +} + +void GameState::StoreStageOptions() +{ + FOREACH_PlayerNumber( pn ) m_pPlayerState[pn]->m_StagePlayerOptions = m_pPlayerState[pn]->m_PlayerOptions; - } m_StoredSongOptions = m_SongOptions; } @@ -1078,15 +1082,19 @@ bool GameState::IsDisqualified( PlayerNumber pn ) if( !GAMESTATE->IsHumanPlayer(pn) ) return false; + const PlayerOptions &po = GAMESTATE->m_pPlayerState[pn]->m_StoredPlayerOptions; + + // Check the stored player options for disqualify. Don't disqualify because + // of mods that were forced. if( GAMESTATE->IsCourseMode() ) { - return GAMESTATE->m_pPlayerState[pn]->m_PlayerOptions.IsEasierForCourseAndTrail( + return po.IsEasierForCourseAndTrail( GAMESTATE->m_pCurCourse, GAMESTATE->m_pCurTrail[pn] ); } else { - return GAMESTATE->m_pPlayerState[pn]->m_PlayerOptions.IsEasierForSongAndSteps( + return po.IsEasierForSongAndSteps( GAMESTATE->m_pCurSong, GAMESTATE->m_pCurSteps[pn] ); } diff --git a/stepmania/src/GameState.h b/stepmania/src/GameState.h index 72098b9619..61f01a4a4d 100644 --- a/stepmania/src/GameState.h +++ b/stepmania/src/GameState.h @@ -208,6 +208,7 @@ public: void GetDefaultSongOptions( SongOptions &so ); void ApplyModifiers( PlayerNumber pn, RString sModifiers ); void StoreSelectedOptions(); + void StoreStageOptions(); void RestoreSelectedOptions(); void RestoreStageOptions(); void ResetCurrentOptions(); diff --git a/stepmania/src/PlayerOptions.cpp b/stepmania/src/PlayerOptions.cpp index f81609194f..fd2313d7b6 100644 --- a/stepmania/src/PlayerOptions.cpp +++ b/stepmania/src/PlayerOptions.cpp @@ -574,7 +574,7 @@ bool PlayerOptions::operator==( const PlayerOptions &other ) const return true; } -bool PlayerOptions::IsEasierForSongAndSteps( Song* pSong, Steps* pSteps ) +bool PlayerOptions::IsEasierForSongAndSteps( Song* pSong, Steps* pSteps ) const { if( m_fTimeSpacing && pSong->HasSignificantBpmChangesOrStops() ) return true; @@ -606,7 +606,7 @@ bool PlayerOptions::IsEasierForSongAndSteps( Song* pSong, Steps* pSteps ) return false; } -bool PlayerOptions::IsEasierForCourseAndTrail( Course* pCourse, Trail* pTrail ) +bool PlayerOptions::IsEasierForCourseAndTrail( Course* pCourse, Trail* pTrail ) const { ASSERT( pCourse ); ASSERT( pTrail ); diff --git a/stepmania/src/PlayerOptions.h b/stepmania/src/PlayerOptions.h index c9e14f61c9..954450d096 100644 --- a/stepmania/src/PlayerOptions.h +++ b/stepmania/src/PlayerOptions.h @@ -157,8 +157,8 @@ public: // return true if any mods being used will make the song(s) easier - bool IsEasierForSongAndSteps( Song* pSong, Steps* pSteps ); - bool IsEasierForCourseAndTrail( Course* pCourse, Trail* pTrail ); + bool IsEasierForSongAndSteps( Song* pSong, Steps* pSteps ) const; + bool IsEasierForCourseAndTrail( Course* pCourse, Trail* pTrail ) const; }; #endif diff --git a/stepmania/src/ScreenGameplay.cpp b/stepmania/src/ScreenGameplay.cpp index 746666e824..4522a14ae9 100644 --- a/stepmania/src/ScreenGameplay.cpp +++ b/stepmania/src/ScreenGameplay.cpp @@ -378,8 +378,14 @@ void ScreenGameplay::Init( bool bUseSongBackgroundAndForeground ) this->FillPlayerInfo( m_vPlayerInfo ); ASSERT_M( !m_vPlayerInfo.empty(), "m_vPlayerInfo must be filled by FillPlayerInfo" ); + /* Save selected options before we change them in ScreenInitCommand. */ + GAMESTATE->StoreSelectedOptions(); + ScreenWithMenuElements::Init(); + /* Save selected stage options now that we've changed them in ScreenInitCommand. */ + GAMESTATE->StoreStageOptions(); + /* Pause MEMCARDMAN. If a memory card is removed, we don't want to interrupt the * player by making a noise until the game finishes. */ if( !GAMESTATE->m_bDemonstrationOrJukebox ) @@ -398,9 +404,6 @@ void ScreenGameplay::Init( bool bUseSongBackgroundAndForeground ) if( GAMESTATE->m_pCurSong == NULL && GAMESTATE->m_pCurCourse == NULL ) return; // ScreenDemonstration will move us to the next screen. We just need to survive for one update without crashing. - /* Save selected options before we change them. */ - GAMESTATE->StoreSelectedOptions(); - /* Save settings to the profile now. Don't do this on extra stages, since the * user doesn't have full control; saving would force profiles to DIFFICULTY_HARD * and save over their default modifiers every time someone got an extra stage. diff --git a/stepmania/src/ScreenPlayerOptions.cpp b/stepmania/src/ScreenPlayerOptions.cpp index b285a8a403..c0e55085b8 100644 --- a/stepmania/src/ScreenPlayerOptions.cpp +++ b/stepmania/src/ScreenPlayerOptions.cpp @@ -160,6 +160,7 @@ void ScreenPlayerOptions::UpdateDisqualified( int row, PlayerNumber pn ) vector v; v.push_back( pn ); ExportOptions( row, v ); + GAMESTATE->StoreSelectedOptions(); bool bRowCausesDisqualified = GAMESTATE->IsDisqualified( pn ); m_bRowCausesDisqualified[pn][row] = bRowCausesDisqualified;