From f2809028de32a916a9c684f7c6c2b5fbc557c7f1 Mon Sep 17 00:00:00 2001 From: "D.J. Rideout" Date: Sat, 18 Jan 2025 19:15:31 -0330 Subject: [PATCH] Refactor SwitchToDifficulty/SwitchToPreferredDifficulty --- src/ScreenSelectMusic.cpp | 192 ++++++++++++++------------------------ src/ScreenSelectMusic.h | 2 + 2 files changed, 74 insertions(+), 120 deletions(-) diff --git a/src/ScreenSelectMusic.cpp b/src/ScreenSelectMusic.cpp index 88402052db..dc126fc530 100644 --- a/src/ScreenSelectMusic.cpp +++ b/src/ScreenSelectMusic.cpp @@ -1627,78 +1627,88 @@ void ScreenSelectMusic::AfterStepsOrTrailChange( const std::vector } } +void ScreenSelectMusic::SwitchPlayerStepDifficulty(PlayerNumber pn, Difficulty d) +{ + // Find the closest match to the given difficulty and StepsType. + int iCurDifference = -1; + int& iSelection = m_iSelection[pn]; + int i = 0; + for (Steps* s : m_vpSteps) + { + // If the current steps are listed, use them. + if (GAMESTATE->m_pCurSteps[pn] == s) + { + iSelection = i; + break; + } + + if (d != Difficulty_Invalid) + { + int iDifficultyDifference = std::abs(s->GetDifficulty() - d); + int iStepsTypeDifference = 0; + if (GAMESTATE->m_PreferredStepsType != StepsType_Invalid) + iStepsTypeDifference = std::abs(s->m_StepsType - GAMESTATE->m_PreferredStepsType); + int iTotalDifference = iStepsTypeDifference * NUM_Difficulty + iDifficultyDifference; + + if (iCurDifference == -1 || iTotalDifference < iCurDifference) + { + iSelection = i; + iCurDifference = iTotalDifference; + } + } + i += 1; + } + + CLAMP(iSelection, 0, m_vpSteps.size() - 1); +} + +void ScreenSelectMusic::SwitchPlayerCourseDifficulty(PlayerNumber pn, Difficulty d) +{ + // Find the closest match to the given difficulty. + int iCurDifference = -1; + int& iSelection = m_iSelection[pn]; + int i = 0; + for (Trail* t : m_vpTrails) + { + // If the current trail is listed, use it. + if (GAMESTATE->m_pCurTrail[pn] == m_vpTrails[i]) + { + iSelection = i; + break; + } + + if (d != Difficulty_Invalid && GAMESTATE->m_PreferredStepsType != StepsType_Invalid) + { + int iDifficultyDifference = std::abs(t->m_CourseDifficulty - d); + int iStepsTypeDifference = std::abs(t->m_StepsType - GAMESTATE->m_PreferredStepsType); + int iTotalDifference = iStepsTypeDifference * NUM_CourseDifficulty + iDifficultyDifference; + + if (iCurDifference == -1 || iTotalDifference < iCurDifference) + { + iSelection = i; + iCurDifference = iTotalDifference; + } + } + i += 1; + } + + CLAMP(iSelection, 0, m_vpTrails.size() - 1); +} + void ScreenSelectMusic::SwitchToDifficulty(Difficulty d) { if (!GAMESTATE->m_pCurCourse) { FOREACH_HumanPlayer(pn) { - // Find the closest match to the given difficulty and StepsType. - int iCurDifference = -1; - int& iSelection = m_iSelection[pn]; - int i = 0; - for (Steps* s : m_vpSteps) - { - // If the current steps are listed, use them. - if (GAMESTATE->m_pCurSteps[pn] == s) - { - iSelection = i; - break; - } - - if (d != Difficulty_Invalid) - { - int iDifficultyDifference = std::abs(s->GetDifficulty() - d); - int iStepsTypeDifference = 0; - if (GAMESTATE->m_PreferredStepsType != StepsType_Invalid) - iStepsTypeDifference = std::abs(s->m_StepsType - GAMESTATE->m_PreferredStepsType); - int iTotalDifference = iStepsTypeDifference * NUM_Difficulty + iDifficultyDifference; - - if (iCurDifference == -1 || iTotalDifference < iCurDifference) - { - iSelection = i; - iCurDifference = iTotalDifference; - } - } - i += 1; - } - - CLAMP(iSelection, 0, m_vpSteps.size() - 1); + SwitchPlayerStepDifficulty(pn, d); } } else { FOREACH_HumanPlayer(pn) { - // Find the closest match to the given difficulty. - int iCurDifference = -1; - int& iSelection = m_iSelection[pn]; - int i = 0; - for (Trail* t : m_vpTrails) - { - // If the current trail is listed, use it. - if (GAMESTATE->m_pCurTrail[pn] == m_vpTrails[i]) - { - iSelection = i; - break; - } - - if (d != Difficulty_Invalid && GAMESTATE->m_PreferredStepsType != StepsType_Invalid) - { - int iDifficultyDifference = std::abs(t->m_CourseDifficulty - d); - int iStepsTypeDifference = std::abs(t->m_StepsType - GAMESTATE->m_PreferredStepsType); - int iTotalDifference = iStepsTypeDifference * NUM_CourseDifficulty + iDifficultyDifference; - - if (iCurDifference == -1 || iTotalDifference < iCurDifference) - { - iSelection = i; - iCurDifference = iTotalDifference; - } - } - i += 1; - } - - CLAMP(iSelection, 0, m_vpTrails.size() - 1); + SwitchPlayerCourseDifficulty(pn, d); } } @@ -1715,72 +1725,14 @@ void ScreenSelectMusic::SwitchToPreferredDifficulty() { FOREACH_HumanPlayer( pn ) { - // Find the closest match to the user's preferred difficulty and StepsType. - int iCurDifference = -1; - int &iSelection = m_iSelection[pn]; - int i = 0; - for (Steps *s : m_vpSteps) - { - // If the current steps are listed, use them. - if( GAMESTATE->m_pCurSteps[pn] == s ) - { - iSelection = i; - break; - } - - if( GAMESTATE->m_PreferredDifficulty[pn] != Difficulty_Invalid ) - { - int iDifficultyDifference = std::abs( s->GetDifficulty() - GAMESTATE->m_PreferredDifficulty[pn] ); - int iStepsTypeDifference = 0; - if( GAMESTATE->m_PreferredStepsType != StepsType_Invalid ) - iStepsTypeDifference = std::abs( s->m_StepsType - GAMESTATE->m_PreferredStepsType ); - int iTotalDifference = iStepsTypeDifference * NUM_Difficulty + iDifficultyDifference; - - if( iCurDifference == -1 || iTotalDifference < iCurDifference ) - { - iSelection = i; - iCurDifference = iTotalDifference; - } - } - i += 1; - } - - CLAMP( iSelection, 0, m_vpSteps.size()-1 ); + SwitchPlayerStepDifficulty(pn, GAMESTATE->m_PreferredDifficulty[pn]); } } else { FOREACH_HumanPlayer( pn ) { - // Find the closest match to the user's preferred difficulty. - int iCurDifference = -1; - int &iSelection = m_iSelection[pn]; - int i = 0; - for (Trail *t : m_vpTrails) - { - // If the current trail is listed, use it. - if( GAMESTATE->m_pCurTrail[pn] == m_vpTrails[i] ) - { - iSelection = i; - break; - } - - if( GAMESTATE->m_PreferredCourseDifficulty[pn] != Difficulty_Invalid && GAMESTATE->m_PreferredStepsType != StepsType_Invalid ) - { - int iDifficultyDifference = std::abs( t->m_CourseDifficulty - GAMESTATE->m_PreferredCourseDifficulty[pn] ); - int iStepsTypeDifference = std::abs( t->m_StepsType - GAMESTATE->m_PreferredStepsType ); - int iTotalDifference = iStepsTypeDifference * NUM_CourseDifficulty + iDifficultyDifference; - - if( iCurDifference == -1 || iTotalDifference < iCurDifference ) - { - iSelection = i; - iCurDifference = iTotalDifference; - } - } - i += 1; - } - - CLAMP( iSelection, 0, m_vpTrails.size()-1 ); + SwitchPlayerCourseDifficulty(pn, GAMESTATE->m_PreferredCourseDifficulty[pn]); } } diff --git a/src/ScreenSelectMusic.h b/src/ScreenSelectMusic.h index 81566f5e68..5cb60bc00e 100644 --- a/src/ScreenSelectMusic.h +++ b/src/ScreenSelectMusic.h @@ -65,6 +65,8 @@ protected: void ChangeSteps( PlayerNumber pn, int dir ); void AfterStepsOrTrailChange( const std::vector &vpns ); + void SwitchPlayerStepDifficulty(PlayerNumber pn, Difficulty d); + void SwitchPlayerCourseDifficulty(PlayerNumber pn, Difficulty d); void SwitchToDifficulty(Difficulty d); void SwitchToPreferredDifficulty(); void AfterMusicChange();