diff --git a/stepmania/Themes/default/Graphics/MusicSortDisplay AllCourses.png b/stepmania/Themes/default/Graphics/MusicSortDisplay AllCourses.png new file mode 100644 index 0000000000..a95e0f0850 Binary files /dev/null and b/stepmania/Themes/default/Graphics/MusicSortDisplay AllCourses.png differ diff --git a/stepmania/Themes/default/Graphics/MusicSortDisplay ModeMenu.png b/stepmania/Themes/default/Graphics/MusicSortDisplay ModeMenu.png new file mode 100644 index 0000000000..f9e64cd563 Binary files /dev/null and b/stepmania/Themes/default/Graphics/MusicSortDisplay ModeMenu.png differ diff --git a/stepmania/Themes/default/Graphics/MusicSortDisplay TopGrades.png b/stepmania/Themes/default/Graphics/MusicSortDisplay TopGrades.png new file mode 100644 index 0000000000..b31f84daf4 Binary files /dev/null and b/stepmania/Themes/default/Graphics/MusicSortDisplay TopGrades.png differ diff --git a/stepmania/src/GameConstantsAndTypes.cpp b/stepmania/src/GameConstantsAndTypes.cpp index f08114f7d1..7d0cdadae1 100644 --- a/stepmania/src/GameConstantsAndTypes.cpp +++ b/stepmania/src/GameConstantsAndTypes.cpp @@ -103,17 +103,17 @@ static const CString SortOrderNames[NUM_SORT_ORDERS] = { "Preferred", "Group", "Title", - "BPM", + "Bpm", "Popularity", - "TopGrade", + "TopGrades", "Artist", "Genre", "EasyMeter", "MediumMeter", "HardMeter", "ChallengeMeter", - "Mode", - "Courses", + "ModeMenu", + "AllCourses", "Nonstop", "Oni", "Endless", @@ -122,6 +122,28 @@ static const CString SortOrderNames[NUM_SORT_ORDERS] = { XToString( SortOrder, NUM_SORT_ORDERS ); StringToX( SortOrder ); +static void LuaSortOrder(lua_State* L) +{ + FOREACH_SortOrder( so ) + { + CString s = SortOrderToString( so ); + + // [uppercase] -> _[uppercase] + for( unsigned i=0; iSetGlobal( "SORT"+s, so ); + } +} +REGISTER_WITH_LUA_FUNCTION( LuaSortOrder ); + static const CString TapNoteScoreNames[NUM_TAP_NOTE_SCORES] = { "None", diff --git a/stepmania/src/GameConstantsAndTypes.h b/stepmania/src/GameConstantsAndTypes.h index d3fe58d4b8..f340cbdd66 100644 --- a/stepmania/src/GameConstantsAndTypes.h +++ b/stepmania/src/GameConstantsAndTypes.h @@ -97,8 +97,8 @@ enum SortOrder { SORT_GROUP, SORT_TITLE, SORT_BPM, - SORT_MOST_PLAYED, - SORT_GRADE, + SORT_POPULARITY, + SORT_TOP_GRADES, SORT_ARTIST, SORT_GENRE, SORT_EASY_METER, diff --git a/stepmania/src/GameState.cpp b/stepmania/src/GameState.cpp index 420cc706b7..7046270db8 100644 --- a/stepmania/src/GameState.cpp +++ b/stepmania/src/GameState.cpp @@ -151,6 +151,7 @@ void GameState::Reset() m_PreferredDifficulty[p].Set( DIFFICULTY_INVALID ); m_PreferredCourseDifficulty[p].Set( DIFFICULTY_MEDIUM ); } + m_SortOrder = SORT_INVALID; m_PreferredSortOrder = SORT_INVALID; m_PlayMode = PLAY_MODE_INVALID; m_bEditing = false; @@ -1938,6 +1939,7 @@ public: static int GetPreferredDifficulty( T* p, lua_State *L ) { lua_pushnumber(L, p->m_PreferredDifficulty[IArg(1)] ); return 1; } static int AnyPlayerHasRankingFeats( T* p, lua_State *L ) { lua_pushboolean(L, p->AnyPlayerHasRankingFeats() ); return 1; } static int GetPlayMode( T* p, lua_State *L ) { lua_pushnumber(L, p->m_PlayMode ); return 1; } + static int GetSortOrder( T* p, lua_State *L ) { lua_pushnumber(L, p->m_SortOrder ); return 1; } static int IsGoalComplete( T* p, lua_State *L ) { lua_pushboolean(L, p->IsGoalComplete((PlayerNumber)IArg(1)) ); return 1; } static void Register(lua_State *L) @@ -1961,6 +1963,7 @@ public: ADD_METHOD( GetPreferredDifficulty ) ADD_METHOD( AnyPlayerHasRankingFeats ) ADD_METHOD( GetPlayMode ) + ADD_METHOD( GetSortOrder ) ADD_METHOD( IsGoalComplete ) Luna::Register( L ); diff --git a/stepmania/src/GameState.h b/stepmania/src/GameState.h index 06daa76acf..f9029f3759 100644 --- a/stepmania/src/GameState.h +++ b/stepmania/src/GameState.h @@ -104,6 +104,7 @@ public: CString m_sPreferredSongGroup; // GROUP_ALL_MUSIC denotes no preferred group bool m_bChangedFailTypeOnScreenSongOptions; // true if FailType was changed in the song options screen BroadcastOnChange1D m_PreferredDifficulty; + SortOrder m_SortOrder; // set by MusicWheel SortOrder m_PreferredSortOrder; // used by MusicWheel bool m_bEditing; // NoteField does special stuff when this is true bool m_bDemonstrationOrJukebox; // ScreenGameplay does special stuff when this is true diff --git a/stepmania/src/MusicWheel.cpp b/stepmania/src/MusicWheel.cpp index 6ad278cda3..899dbe5843 100644 --- a/stepmania/src/MusicWheel.cpp +++ b/stepmania/src/MusicWheel.cpp @@ -45,7 +45,7 @@ static const SortOrder g_SongSortOrders[] = SORT_GROUP, SORT_TITLE, SORT_BPM, - SORT_MOST_PLAYED, + SORT_POPULARITY, SORT_ARTIST, SORT_GENRE, }; @@ -211,7 +211,10 @@ void MusicWheel::Load( CString sType ) /* Only save the sort order if the player didn't already have one. If he did, don't * overwrite it. */ if( GAMESTATE->m_PreferredSortOrder == SORT_INVALID ) + { GAMESTATE->m_PreferredSortOrder = m_SortOrder; + GAMESTATE->m_SortOrder = m_SortOrder; + } /* Update for SORT_MOST_PLAYED. */ SONGMAN->UpdateBest(); @@ -424,7 +427,7 @@ void MusicWheel::GetSongList(vector &arraySongs, SortOrder so, CString sP // SONGMAN->GetSongs( apAllSongs, GAMESTATE->m_sPreferredGroup, GAMESTATE->GetNumStagesLeft() ); // else // SONGMAN->GetSongs( apAllSongs, GAMESTATE->GetNumStagesLeft() ); - if( so == SORT_MOST_PLAYED ) + if( so == SORT_POPULARITY ) SONGMAN->GetBestSongs( apAllSongs, GAMESTATE->m_sPreferredSongGroup, GAMESTATE->GetNumStagesLeft() ); else SONGMAN->GetSongs( apAllSongs, GAMESTATE->m_sPreferredSongGroup, GAMESTATE->GetNumStagesLeft() ); @@ -514,8 +517,8 @@ void MusicWheel::BuildWheelItemDatas( vector &arrayWheelItemDatas case SORT_GROUP: case SORT_TITLE: case SORT_BPM: - case SORT_MOST_PLAYED: - case SORT_GRADE: + case SORT_POPULARITY: + case SORT_TOP_GRADES: case SORT_ARTIST: case SORT_GENRE: case SORT_EASY_METER: @@ -550,12 +553,12 @@ void MusicWheel::BuildWheelItemDatas( vector &arrayWheelItemDatas case SORT_BPM: SongUtil::SortSongPointerArrayByBPM( arraySongs ); break; - case SORT_MOST_PLAYED: + case SORT_POPULARITY: if( (int) arraySongs.size() > MOST_PLAYED_SONGS_TO_SHOW ) arraySongs.erase( arraySongs.begin()+MOST_PLAYED_SONGS_TO_SHOW, arraySongs.end() ); bUseSections = false; break; - case SORT_GRADE: + case SORT_TOP_GRADES: SongUtil::SortSongPointerArrayByGrade( arraySongs ); break; case SORT_ARTIST: @@ -608,7 +611,7 @@ void MusicWheel::BuildWheelItemDatas( vector &arrayWheelItemDatas * so don't re-sort for them. */ // /* We're using sections, so use the section name as the top-level // * sort. */ - if( so != SORT_GRADE && so != SORT_BPM ) + if( so != SORT_TOP_GRADES && so != SORT_BPM ) SongUtil::SortSongPointerArrayBySectionName(arraySongs, so); // make WheelItemDatas with sections @@ -767,7 +770,7 @@ void MusicWheel::BuildWheelItemDatas( vector &arrayWheelItemDatas } // init crowns - if( so == SORT_MOST_PLAYED ) + if( so == SORT_POPULARITY ) { // init crown icons for( unsigned i=0; i< min(3u,arrayWheelItemDatas.size()); i++ ) @@ -1258,6 +1261,7 @@ bool MusicWheel::ChangeSort( SortOrder new_so ) // return true if change success /* Save the new preference. */ if( IsSongSort(new_so) ) GAMESTATE->m_PreferredSortOrder = new_so; + GAMESTATE->m_SortOrder = new_so; m_SortOrder = new_so; diff --git a/stepmania/src/ScreenNetSelectMusic.cpp b/stepmania/src/ScreenNetSelectMusic.cpp index 9823c4c674..8f06dc0159 100644 --- a/stepmania/src/ScreenNetSelectMusic.cpp +++ b/stepmania/src/ScreenNetSelectMusic.cpp @@ -138,6 +138,7 @@ void ScreenNetSelectMusic::Input( const DeviceInput& DeviceI, const InputEventTy so = SORT_TITLE; GAMESTATE->m_PreferredSortOrder = so; + GAMESTATE->m_SortOrder = so; m_MusicWheel.SelectSection( ssprintf("%c", c ) ); m_MusicWheel.SetOpenGroup( ssprintf("%c", c ), so ); m_MusicWheel.Move( +1 ); @@ -468,6 +469,7 @@ void ScreenNetSelectMusic::StartSelectedSong() } GAMESTATE->m_PreferredSortOrder = m_MusicWheel.GetSortOrder(); + GAMESTATE->m_SortOrder = m_MusicWheel.GetSortOrder(); GAMESTATE->m_pPreferredSong = pSong; TweenOffScreen(); diff --git a/stepmania/src/ScreenSelectMusic.cpp b/stepmania/src/ScreenSelectMusic.cpp index 6daf7c3573..ec8e1e9dc2 100644 --- a/stepmania/src/ScreenSelectMusic.cpp +++ b/stepmania/src/ScreenSelectMusic.cpp @@ -1476,6 +1476,14 @@ void ScreenSelectMusic::AfterMusicChange() g_bWantFallbackCdTitle = false; bool bWantBanner = true; + static SortOrder s_lastSortOrder = SORT_INVALID; + if( m_MusicWheel.GetSortOrder() != s_lastSortOrder ) + { + // Reload to let Lua metrics have a chance to change the help text. + ScreenWithMenuElements::LoadHelpText(); + s_lastSortOrder = m_MusicWheel.GetSortOrder(); + } + switch( m_MusicWheel.GetSelectedType() ) { case TYPE_SECTION: diff --git a/stepmania/src/ScreenWithMenuElements.cpp b/stepmania/src/ScreenWithMenuElements.cpp index 33d0659efa..22a0d04a41 100644 --- a/stepmania/src/ScreenWithMenuElements.cpp +++ b/stepmania/src/ScreenWithMenuElements.cpp @@ -84,9 +84,7 @@ void ScreenWithMenuElements::Init() m_textHelp->SetName( "HelpDisplay", "Help" ); m_textHelp->Load(); SET_XY_AND_ON_COMMAND( m_textHelp ); - CStringArray asHelpTips; - split( THEME->GetMetric(m_sName,"HelpText"), "\n", asHelpTips ); - m_textHelp->SetTips( asHelpTips ); + LoadHelpText(); this->AddChild( m_textHelp ); m_sprUnderlay.Load( THEME->GetPathB(m_sName,"underlay") ); @@ -125,6 +123,13 @@ ScreenWithMenuElements::~ScreenWithMenuElements() SAFE_DELETE( m_textHelp ); } +void ScreenWithMenuElements::LoadHelpText() +{ + CStringArray asHelpTips; + split( THEME->GetMetric(m_sName,"HelpText"), "\n", asHelpTips ); + m_textHelp->SetTips( asHelpTips ); +} + void ScreenWithMenuElements::StartPlayingMusic() { /* Some screens should leave the music alone (eg. ScreenPlayerOptions music diff --git a/stepmania/src/ScreenWithMenuElements.h b/stepmania/src/ScreenWithMenuElements.h index 050ad40361..3bd8303b11 100644 --- a/stepmania/src/ScreenWithMenuElements.h +++ b/stepmania/src/ScreenWithMenuElements.h @@ -32,6 +32,7 @@ public: protected: virtual void StartPlayingMusic(); + void LoadHelpText(); AutoActor m_sprUnderlay; AutoActor m_autoHeader; diff --git a/stepmania/src/SongUtil.cpp b/stepmania/src/SongUtil.cpp index 72933a5f4c..9f2e2dcff8 100644 --- a/stepmania/src/SongUtil.cpp +++ b/stepmania/src/SongUtil.cpp @@ -254,9 +254,9 @@ CString SongUtil::GetSectionNameFromSongAndSort( const Song* pSong, SortOrder so iMaxBPM += iBPMGroupSize - (iMaxBPM%iBPMGroupSize) - 1; return ssprintf("%03d-%03d",iMaxBPM-(iBPMGroupSize-1), iMaxBPM); } - case SORT_MOST_PLAYED: + case SORT_POPULARITY: return ""; - case SORT_GRADE: + case SORT_TOP_GRADES: { int iCounts[NUM_GRADES]; PROFILEMAN->GetMachineProfile()->GetGrades( pSong, GAMESTATE->GetCurrentStyle()->m_StepsType, iCounts );