diff --git a/stepmania/src/GameState.cpp b/stepmania/src/GameState.cpp index e6924e9070..3380b42b4b 100644 --- a/stepmania/src/GameState.cpp +++ b/stepmania/src/GameState.cpp @@ -1293,6 +1293,12 @@ void GameState::ApplyStageModifiers( PlayerNumber pn, RString sModifiers ) m_SongOptions.FromString( ModsLevel_Stage, sModifiers ); } +void GameState::ClearStageModifiersIllegalForCourse() +{ + FOREACH_EnabledPlayer( pn ) + PO_GROUP_CALL( m_pPlayerState[pn]->m_PlayerOptions, ModsLevel_Stage, ResetSavedPrefsInvalidForCourse ); +} + bool GameState::CurrentOptionsDisqualifyPlayer( PlayerNumber pn ) { if( !PREFSMAN->m_bDisqualification ) @@ -2160,6 +2166,11 @@ public: lua_pushstring(L, so.GetString()); return 1; } + static int ClearStageModifiersIllegalForCourse( T* p, lua_State *L ) + { + p->ClearStageModifiersIllegalForCourse(); + return 0; + } static int SetSongOptions( T* p, lua_State *L ) { ModsLevel m = Enum::Check( L, 1 ); @@ -2329,6 +2340,7 @@ public: ADD_METHOD( GetSongOptionsString ); ADD_METHOD( GetSongOptions ); ADD_METHOD( GetDefaultSongOptions ); + ADD_METHOD( ClearStageModifiersIllegalForCourse ); ADD_METHOD( SetSongOptions ); ADD_METHOD( IsWinner ); ADD_METHOD( IsDraw ); diff --git a/stepmania/src/GameState.h b/stepmania/src/GameState.h index 4c9441533c..ba50321c2c 100644 --- a/stepmania/src/GameState.h +++ b/stepmania/src/GameState.h @@ -241,6 +241,7 @@ public: void ResetToDefaultSongOptions( ModsLevel l ); void ApplyPreferredModifiers( PlayerNumber pn, RString sModifiers ); void ApplyStageModifiers( PlayerNumber pn, RString sModifiers ); + void ClearStageModifiersIllegalForCourse(); void ResetOptions(); bool CurrentOptionsDisqualifyPlayer( PlayerNumber pn ); diff --git a/stepmania/src/PlayerOptions.cpp b/stepmania/src/PlayerOptions.cpp index 6d486bd06a..7ae85d1206 100644 --- a/stepmania/src/PlayerOptions.cpp +++ b/stepmania/src/PlayerOptions.cpp @@ -755,13 +755,21 @@ RString PlayerOptions::GetSavedPrefsString() const return po_prefs.GetString(); } -void PlayerOptions::ResetSavedPrefs() +void PlayerOptions::ResetPrefs( ResetPrefsType type ) { PlayerOptions defaults; #define CPY(x) this->x = defaults.x; - CPY( m_fTimeSpacing ); - CPY( m_fScrollSpeed ); - CPY( m_fScrollBPM ); + switch( type ) + { + DEFAULT_FAIL( type ); + case saved_prefs: + CPY( m_fTimeSpacing ); + CPY( m_fScrollSpeed ); + CPY( m_fScrollBPM ); + break; + case saved_prefs_invalid_for_course: + break; + } CPY( m_fScrolls[SCROLL_REVERSE] ); CPY( m_fPerspectiveTilt ); CPY( m_bTransforms[TRANSFORM_NOHOLDS] ); diff --git a/stepmania/src/PlayerOptions.h b/stepmania/src/PlayerOptions.h index 2801927cdf..07bfdf79ba 100644 --- a/stepmania/src/PlayerOptions.h +++ b/stepmania/src/PlayerOptions.h @@ -19,7 +19,14 @@ public: void Approach( const PlayerOptions& other, float fDeltaSeconds ); RString GetString( bool bForceNoteSkin = false ) const; RString GetSavedPrefsString() const; // only the basic options that players would want for every song - void ResetSavedPrefs(); + enum ResetPrefsType + { + saved_prefs, + saved_prefs_invalid_for_course + }; + void ResetPrefs( ResetPrefsType type ); + void ResetSavedPrefs() { ResetPrefs(saved_prefs); }; + void ResetSavedPrefsInvalidForCourse() { ResetPrefs(saved_prefs_invalid_for_course); } void GetMods( vector &AddTo, bool bForceNoteSkin = false ) const; void GetLocalizedMods( vector &AddTo ) const; void FromString( const RString &sMultipleMods );