From 71492cd106299ab662ff6e830f4d6a7ea2a484e7 Mon Sep 17 00:00:00 2001 From: Chris Danford Date: Tue, 15 May 2007 19:32:39 +0000 Subject: [PATCH] add PreferredStepsType, fix StepsType jumps when changing songs if multiple StepsTypes are shown --- stepmania/src/GameState.cpp | 11 +++--- stepmania/src/GameState.h | 5 +-- stepmania/src/MessageManager.cpp | 1 + stepmania/src/MessageManager.h | 1 + stepmania/src/ScreenSelectMusic.cpp | 52 +++++++++++++++++++---------- 5 files changed, 47 insertions(+), 23 deletions(-) diff --git a/stepmania/src/GameState.cpp b/stepmania/src/GameState.cpp index f709b84e9a..3d2ad6753d 100644 --- a/stepmania/src/GameState.cpp +++ b/stepmania/src/GameState.cpp @@ -108,6 +108,7 @@ GameState::GameState() : m_PlayMode( Message_PlayModeChanged ), m_sPreferredSongGroup( Message_PreferredSongGroupChanged ), m_sPreferredCourseGroup( Message_PreferredCourseGroupChanged ), + m_PreferredStepsType( Message_PreferredStepsTypeChanged ), m_PreferredDifficulty( Message_PreferredDifficultyP1Changed ), m_PreferredCourseDifficulty( Message_PreferredCourseDifficultyP1Changed ), m_SortOrder( Message_SortOrderChanged ), @@ -219,6 +220,7 @@ void GameState::ApplyCmdline() void GameState::ResetPlayer( PlayerNumber pn ) { + m_PreferredStepsType.Set( StepsType_Invalid ); m_PreferredDifficulty[pn].Set( Difficulty_Invalid ); m_PreferredCourseDifficulty[pn].Set( Difficulty_Medium ); m_iPlayerStageTokens[pn] = 0; @@ -726,7 +728,7 @@ void GameState::LoadCurrentSettingsFromProfile( PlayerNumber pn ) ApplyPreferredModifiers( pn, sModifiers ); } // Only set the sort order if it wasn't already set by a GameCommand (or by an earlier profile) - if( m_PreferredSortOrder == SortOrder_Invalid && pProfile->m_SortOrder != SortOrder_Invalid ) + if( m_PreferredSortOrder == SortOrder_Invalid && pProfile->m_SortOrder != SortOrder_Invalid ) m_PreferredSortOrder = pProfile->m_SortOrder; if( pProfile->m_LastDifficulty != Difficulty_Invalid ) m_PreferredDifficulty[pn].Set( pProfile->m_LastDifficulty ); @@ -1715,9 +1717,10 @@ bool GameState::DifficultiesLocked() const return false; } -bool GameState::ChangePreferredDifficulty( PlayerNumber pn, Difficulty dc ) +bool GameState::ChangePreferredDifficultyAndStepsType( PlayerNumber pn, Difficulty dc, StepsType st ) { m_PreferredDifficulty[pn].Set( dc ); + m_PreferredStepsType.Set( st ); if( DifficultiesLocked() ) FOREACH_PlayerNumber( p ) if( p != pn ) @@ -1768,10 +1771,10 @@ Difficulty GameState::GetClosestShownDifficulty( PlayerNumber pn ) const return iClosest; } -bool GameState::ChangePreferredCourseDifficulty( PlayerNumber pn, CourseDifficulty cd ) +bool GameState::ChangePreferredCourseDifficultyAndStepsType( PlayerNumber pn, CourseDifficulty cd, StepsType st ) { m_PreferredCourseDifficulty[pn].Set( cd ); - + m_PreferredStepsType.Set( st ); if( PREFSMAN->m_bLockCourseDifficulties ) FOREACH_PlayerNumber( p ) if( p != pn ) diff --git a/stepmania/src/GameState.h b/stepmania/src/GameState.h index 30f4eceb4e..85307165b8 100644 --- a/stepmania/src/GameState.h +++ b/stepmania/src/GameState.h @@ -71,9 +71,9 @@ public: PlayerNumber m_MasterPlayerNumber; // used in Styles where one player controls both sides bool m_bMultiplayer; bool DifficultiesLocked() const; - bool ChangePreferredDifficulty( PlayerNumber pn, Difficulty dc ); + bool ChangePreferredDifficultyAndStepsType( PlayerNumber pn, Difficulty dc, StepsType st ); bool ChangePreferredDifficulty( PlayerNumber pn, int dir ); - bool ChangePreferredCourseDifficulty( PlayerNumber pn, CourseDifficulty cd ); + bool ChangePreferredCourseDifficultyAndStepsType( PlayerNumber pn, CourseDifficulty cd, StepsType st ); bool ChangePreferredCourseDifficulty( PlayerNumber pn, int dir ); bool IsCourseDifficultyShown( CourseDifficulty cd ); Difficulty GetClosestShownDifficulty( PlayerNumber pn ) const; @@ -115,6 +115,7 @@ public: BroadcastOnChange m_sPreferredSongGroup; // GROUP_ALL denotes no preferred group BroadcastOnChange m_sPreferredCourseGroup; // GROUP_ALL denotes no preferred group bool m_bChangedFailTypeOnScreenSongOptions; // true if FailType was changed in the song options screen + BroadcastOnChange m_PreferredStepsType; BroadcastOnChange1D m_PreferredDifficulty; BroadcastOnChange1D m_PreferredCourseDifficulty;// used in nonstop BroadcastOnChange m_SortOrder; // set by MusicWheel diff --git a/stepmania/src/MessageManager.cpp b/stepmania/src/MessageManager.cpp index 44a07ede56..2ddc4bc3f3 100644 --- a/stepmania/src/MessageManager.cpp +++ b/stepmania/src/MessageManager.cpp @@ -27,6 +27,7 @@ static const char *MessageIDNames[] = { "EditCourseDifficultyChanged", "EditSourceStepsChanged", "EditSourceStepsTypeChanged", + "PreferredStepsTypeChanged", "PreferredDifficultyP1Changed", "PreferredDifficultyP2Changed", "PreferredCourseDifficultyP1Changed", diff --git a/stepmania/src/MessageManager.h b/stepmania/src/MessageManager.h index 2c9e00c1dc..b11326ac51 100644 --- a/stepmania/src/MessageManager.h +++ b/stepmania/src/MessageManager.h @@ -24,6 +24,7 @@ enum MessageID Message_EditCourseDifficultyChanged, Message_EditSourceStepsChanged, Message_EditSourceStepsTypeChanged, + Message_PreferredStepsTypeChanged, Message_PreferredDifficultyP1Changed, Message_PreferredDifficultyP2Changed, Message_PreferredCourseDifficultyP1Changed, diff --git a/stepmania/src/ScreenSelectMusic.cpp b/stepmania/src/ScreenSelectMusic.cpp index 4b86654a65..22682adf32 100644 --- a/stepmania/src/ScreenSelectMusic.cpp +++ b/stepmania/src/ScreenSelectMusic.cpp @@ -629,8 +629,9 @@ void ScreenSelectMusic::ChangeDifficulty( PlayerNumber pn, int dir ) if( CLAMP(m_iSelection[pn],0,m_vpSteps.size()-1) ) return; - // the user explicity switched difficulties. Update the preferred difficulty - GAMESTATE->ChangePreferredDifficulty( pn, m_vpSteps[ m_iSelection[pn] ]->GetDifficulty() ); + // the user explicity switched difficulties. Update the preferred Difficulty and StepsType + Steps *pSteps = m_vpSteps[ m_iSelection[pn] ]; + GAMESTATE->ChangePreferredDifficultyAndStepsType( pn, pSteps->GetDifficulty(), pSteps->m_StepsType ); } else if( GAMESTATE->m_pCurCourse ) { @@ -638,11 +639,17 @@ void ScreenSelectMusic::ChangeDifficulty( PlayerNumber pn, int dir ) if( CLAMP(m_iSelection[pn],0,m_vpTrails.size()-1) ) return; - // the user explicity switched difficulties. Update the preferred difficulty - GAMESTATE->ChangePreferredCourseDifficulty( pn, m_vpTrails[ m_iSelection[pn] ]->m_CourseDifficulty ); + // the user explicity switched difficulties. Update the preferred Difficulty and StepsType + Trail *pTrail = m_vpTrails[ m_iSelection[pn] ]; + GAMESTATE->ChangePreferredCourseDifficultyAndStepsType( pn, pTrail->m_CourseDifficulty, pTrail->m_StepsType ); } else { + // If we're showing multiple StepsTypes in the list, don't allow changing the difficulty/StepsType + // when a non-Song, non-Course is selected. Chaning the preferred Difficulty and StepsType + // by direction is complicated when multiple StepsTypes are being shown, so we don't support it. + if( CommonMetrics::AUTO_SET_STYLE ) + return; if( !GAMESTATE->ChangePreferredDifficulty( pn, dir ) ) return; } @@ -1022,26 +1029,30 @@ void ScreenSelectMusic::SwitchToPreferredDifficulty() { FOREACH_HumanPlayer( pn ) { - /* Find the closest match to the user's preferred difficulty. */ + /* Find the closest match to the user's preferred difficulty and StepsType. */ int iCurDifference = -1; int &iSelection = m_iSelection[pn]; - for( unsigned i=0; im_pCurSteps[pn] == m_vpSteps[i] ) + if( GAMESTATE->m_pCurSteps[pn] == *s ) { iSelection = i; break; } - if( GAMESTATE->m_PreferredDifficulty[pn] != Difficulty_Invalid ) + if( GAMESTATE->m_PreferredDifficulty[pn] != Difficulty_Invalid && GAMESTATE->m_PreferredStepsType != StepsType_Invalid ) { - int iDiff = abs(m_vpSteps[i]->GetDifficulty() - GAMESTATE->m_PreferredDifficulty[pn]); + int iDifficultyDifference = abs( (*s)->GetDifficulty() - GAMESTATE->m_PreferredDifficulty[pn] ); + int iStepsTypeDifference = abs( (*s)->m_StepsType - GAMESTATE->m_PreferredStepsType ); + int iTotalDifference = iStepsTypeDifference * NUM_Difficulty + iDifficultyDifference; - if( iCurDifference == -1 || iDiff < iCurDifference ) + if( iCurDifference == -1 || iTotalDifference < iCurDifference ) { iSelection = i; - iCurDifference = iDiff; + iCurDifference = iTotalDifference; } } } @@ -1056,8 +1067,10 @@ void ScreenSelectMusic::SwitchToPreferredDifficulty() /* Find the closest match to the user's preferred difficulty. */ int iCurDifference = -1; int &iSelection = m_iSelection[pn]; - for( unsigned i=0; im_pCurTrail[pn] == m_vpTrails[i] ) { @@ -1065,12 +1078,17 @@ void ScreenSelectMusic::SwitchToPreferredDifficulty() break; } - int iDiff = abs(m_vpTrails[i]->m_CourseDifficulty - GAMESTATE->m_PreferredCourseDifficulty[pn]); - - if( iCurDifference == -1 || iDiff < iCurDifference ) + if( GAMESTATE->m_PreferredCourseDifficulty[pn] != Difficulty_Invalid && GAMESTATE->m_PreferredStepsType != StepsType_Invalid ) { - iSelection = i; - iCurDifference = iDiff; + int iDifficultyDifference = abs( (*t)->m_CourseDifficulty - GAMESTATE->m_PreferredCourseDifficulty[pn] ); + int iStepsTypeDifference = abs( (*t)->m_StepsType - GAMESTATE->m_PreferredStepsType ); + int iTotalDifference = iStepsTypeDifference * NUM_CourseDifficulty + iDifficultyDifference; + + if( iCurDifference == -1 || iTotalDifference < iCurDifference ) + { + iSelection = i; + iCurDifference = iTotalDifference; + } } }