diff --git a/stepmania/src/DifficultyList.cpp b/stepmania/src/DifficultyList.cpp index 4459607036..3fe58da62a 100644 --- a/stepmania/src/DifficultyList.cpp +++ b/stepmania/src/DifficultyList.cpp @@ -9,6 +9,7 @@ #include "BitmapText.h" #include "SongManager.h" #include "ThemeManager.h" +#include "StepsUtil.h" #define ITEMS_SPACING_Y THEME->GetMetricF(m_sName,"ItemsSpacingY") #define DESCRIPTION_MAX_WIDTH THEME->GetMetricF(m_sName,"DescriptionMaxWidth") @@ -289,7 +290,7 @@ void DifficultyList::SetFromGameState() song->GetSteps( CurSteps, GAMESTATE->GetCurrentStyleDef()->m_StepsType ); /* Should match the sort in ScreenSelectMusic::AfterMusicChange. */ - SortNotesArrayByDifficulty( CurSteps ); + StepsUtil::SortNotesArrayByDifficulty( CurSteps ); unsigned i; for( i = 0; i < m_Rows.size(); ++i ) diff --git a/stepmania/src/Makefile.am b/stepmania/src/Makefile.am index 51d85fed59..86496fb335 100644 --- a/stepmania/src/Makefile.am +++ b/stepmania/src/Makefile.am @@ -59,7 +59,8 @@ NotesLoaderSM.cpp NotesLoaderSM.h NotesWriterDWI.cpp NotesWriterDWI.h NotesWrite PlayerAI.cpp PlayerAI.h PlayerNumber.cpp PlayerNumber.h PlayerOptions.cpp PlayerOptions.h Profile.cpp Profile.h \ ProfileHtml.cpp ProfileHtml.h RandomSample.cpp RandomSample.h ScoreKeeper.h ScoreKeeperMAX2.cpp ScoreKeeperMAX2.h \ ScoreKeeperRave.cpp ScoreKeeperRave.h Song.cpp song.h SongCacheIndex.cpp SongCacheIndex.h \ -SongOptions.cpp SongOptions.h StageStats.cpp StageStats.h Steps.cpp Steps.h Style.h StyleDef.cpp StyleDef.h \ +SongOptions.cpp SongOptions.h SongUtil.cpp SongUtil.h StageStats.cpp StageStats.h Steps.cpp Steps.h \ +StepsUtil.cpp StepsUtil.h Style.h StyleDef.cpp StyleDef.h \ StyleInput.h TimeConstants.cpp TimeConstants.h TimingData.cpp TimingData.h TitleSubstitution.cpp TitleSubstitution.h FileTypes = IniFile.cpp IniFile.h \ diff --git a/stepmania/src/MusicWheel.cpp b/stepmania/src/MusicWheel.cpp index 5a53cad04e..3fce9ca742 100644 --- a/stepmania/src/MusicWheel.cpp +++ b/stepmania/src/MusicWheel.cpp @@ -32,6 +32,7 @@ #include "UnlockSystem.h" #include "ModeChoice.h" #include "ActorUtil.h" +#include "SongUtil.h" #define FADE_SECONDS THEME->GetMetricF("MusicWheel","FadeSeconds") @@ -486,18 +487,18 @@ void MusicWheel::BuildWheelItemDatas( vector &arrayWheelItemDatas { case SORT_PREFERRED: case SORT_ROULETTE: - SortSongPointerArrayByGroupAndDifficulty( arraySongs ); + SongUtil::SortSongPointerArrayByGroupAndDifficulty( arraySongs ); bUseSections = false; break; case SORT_GROUP: - SortSongPointerArrayByGroupAndTitle( arraySongs ); + SongUtil::SortSongPointerArrayByGroupAndTitle( arraySongs ); bUseSections = GAMESTATE->m_sPreferredGroup == GROUP_ALL_MUSIC; break; case SORT_TITLE: - SortSongPointerArrayByTitle( arraySongs ); + SongUtil::SortSongPointerArrayByTitle( arraySongs ); break; case SORT_BPM: - SortSongPointerArrayByBPM( arraySongs ); + SongUtil::SortSongPointerArrayByBPM( arraySongs ); break; case SORT_MOST_PLAYED: if( (int) arraySongs.size() > MOST_PLAYED_SONGS_TO_SHOW ) @@ -505,22 +506,22 @@ void MusicWheel::BuildWheelItemDatas( vector &arrayWheelItemDatas bUseSections = false; break; case SORT_GRADE: - SortSongPointerArrayByGrade( arraySongs ); + SongUtil::SortSongPointerArrayByGrade( arraySongs ); break; case SORT_ARTIST: - SortSongPointerArrayByArtist( arraySongs ); + SongUtil::SortSongPointerArrayByArtist( arraySongs ); break; case SORT_EASY_METER: - SortSongPointerArrayByMeter( arraySongs, DIFFICULTY_EASY ); + SongUtil::SortSongPointerArrayByMeter( arraySongs, DIFFICULTY_EASY ); break; case SORT_MEDIUM_METER: - SortSongPointerArrayByMeter( arraySongs, DIFFICULTY_MEDIUM ); + SongUtil::SortSongPointerArrayByMeter( arraySongs, DIFFICULTY_MEDIUM ); break; case SORT_HARD_METER: - SortSongPointerArrayByMeter( arraySongs, DIFFICULTY_HARD ); + SongUtil::SortSongPointerArrayByMeter( arraySongs, DIFFICULTY_HARD ); break; case SORT_CHALLENGE_METER: - SortSongPointerArrayByMeter( arraySongs, DIFFICULTY_CHALLENGE ); + SongUtil::SortSongPointerArrayByMeter( arraySongs, DIFFICULTY_CHALLENGE ); break; default: ASSERT(0); // unhandled SortOrder @@ -547,7 +548,7 @@ void MusicWheel::BuildWheelItemDatas( vector &arrayWheelItemDatas // /* We're using sections, so use the section name as the top-level // * sort. */ if( so != SORT_GRADE && so != SORT_BPM ) - SortSongPointerArrayBySectionName(arraySongs, so); + SongUtil::SortSongPointerArrayBySectionName(arraySongs, so); // make WheelItemDatas with sections CString sLastSection = ""; @@ -555,7 +556,7 @@ void MusicWheel::BuildWheelItemDatas( vector &arrayWheelItemDatas for( unsigned i=0; i< arraySongs.size(); i++ ) { Song* pSong = arraySongs[i]; - CString sThisSection = GetSectionNameFromSongAndSort( pSong, so ); + CString sThisSection = SongUtil::GetSectionNameFromSongAndSort( pSong, so ); if( sThisSection != sLastSection) // new section, make a section item { @@ -908,7 +909,7 @@ void MusicWheel::Update( float fDeltaTime ) SCREENMAN->PostMessageToTopScreen( SM_SortOrderChanged, 0 ); - SetOpenGroup(GetSectionNameFromSongAndSort( pPrevSelectedSong, GAMESTATE->m_SortOrder )); + SetOpenGroup(SongUtil::GetSectionNameFromSongAndSort( pPrevSelectedSong, GAMESTATE->m_SortOrder )); m_iSelection = 0; diff --git a/stepmania/src/NotesLoaderBMS.cpp b/stepmania/src/NotesLoaderBMS.cpp index e31d177eb7..cc7887d6db 100644 --- a/stepmania/src/NotesLoaderBMS.cpp +++ b/stepmania/src/NotesLoaderBMS.cpp @@ -9,6 +9,7 @@ #include "GameManager.h" #include "RageException.h" #include "RageFile.h" +#include "StepsUtil.h" /* BMS encoding: tap-hold 4&8panel: Player1 Player2 @@ -724,7 +725,7 @@ void BMSLoader::SlideDuplicateDifficulties( Song &p ) vector vSteps; p.GetSteps( vSteps, st, dc ); - SortNotesArrayByDifficulty( vSteps ); + StepsUtil::SortNotesArrayByDifficulty( vSteps ); for( unsigned k=1; kGetSongNumTimesPlayed(pSongPopularThreshold); @@ -411,7 +413,7 @@ void PrintPopularity( RageFile &f, const Profile *pProfile, CString sTitle, vect } { - SortSongPointerArrayByNumPlays( vpSongs, pProfile, false ); + SongUtil::SortSongPointerArrayByNumPlays( vpSongs, pProfile, false ); PRINT_OPEN(f, "Least Popular Songs" ); { BEGIN_TABLE(1); @@ -434,7 +436,7 @@ void PrintPopularity( RageFile &f, const Profile *pProfile, CString sTitle, vect { unsigned uNumToShow = min( vpAllSteps.size(), (unsigned)100 ); - SortStepsPointerArrayByNumPlays( vpAllSteps, pProfile, true ); + StepsUtil::SortStepsPointerArrayByNumPlays( vpAllSteps, pProfile, true ); PRINT_OPEN(f, "Most Popular Steps" ); { BEGIN_TABLE(1); diff --git a/stepmania/src/ProfileManager.cpp b/stepmania/src/ProfileManager.cpp index 137238b00b..1cb58fc787 100644 --- a/stepmania/src/ProfileManager.cpp +++ b/stepmania/src/ProfileManager.cpp @@ -30,6 +30,7 @@ #include "ThemeManager.h" #include "MemoryCardManager.h" #include "XmlFile.h" +#include "StepsUtil.h" ProfileManager* PROFILEMAN = NULL; // global and accessable from anywhere in our program @@ -453,7 +454,7 @@ HighScore ProfileManager::GetHighScoreForDifficulty( const Song *s, const StyleD // return max grade of notes in difficulty class vector aNotes; s->GetSteps( aNotes, st->m_StepsType ); - SortNotesArrayByDifficulty( aNotes ); + StepsUtil::SortNotesArrayByDifficulty( aNotes ); const Steps* pSteps = s->GetStepsByDifficulty( st->m_StepsType, dc ); diff --git a/stepmania/src/ScreenCredits.cpp b/stepmania/src/ScreenCredits.cpp index 59fbb79d8c..d63afbae21 100644 --- a/stepmania/src/ScreenCredits.cpp +++ b/stepmania/src/ScreenCredits.cpp @@ -21,6 +21,8 @@ #include "Sprite.h" #include "song.h" #include "BitmapText.h" +#include "ActorUtil.h" +#include "SongUtil.h" #define BACKGROUNDS_SPACING_X THEME->GetMetricF("ScreenCredits","BackgroundsSpacingX") @@ -164,13 +166,12 @@ static const CreditLine CREDIT_LINES[] = {1,"Join the StepMania team"}, {1,"and help us out!"}, }; -#include "ActorUtil.h" ScreenCredits::ScreenCredits( CString sName ) : ScreenAttract( sName ) { vector arraySongs; SONGMAN->GetSongs( arraySongs ); - SortSongPointerArrayByTitle( arraySongs ); + SongUtil::SortSongPointerArrayByTitle( arraySongs ); // FIXME: Redo this screen with a BGA m_ScrollerBackgrounds.SetName( "Backgrounds" ); diff --git a/stepmania/src/ScreenEdit.cpp b/stepmania/src/ScreenEdit.cpp index be0537c854..70abe89291 100644 --- a/stepmania/src/ScreenEdit.cpp +++ b/stepmania/src/ScreenEdit.cpp @@ -32,6 +32,8 @@ #include "NoteFieldPositioning.h" #include "arch/arch.h" #include "NoteDataUtil.h" +#include "SongUtil.h" +#include "StepsUtil.h" const float RECORD_HOLD_SECONDS = 0.3f; @@ -947,7 +949,7 @@ void ScreenEdit::InputEdit( const DeviceInput& DeviceI, const InputEventType typ GAMESTATE->m_pCurSong->GetSteps( vSteps, st ); // Sort them by difficulty. - SortStepsByTypeAndDifficulty( vSteps ); + StepsUtil::SortStepsByTypeAndDifficulty( vSteps ); // Find out what index the current Steps are vector::iterator it = find( vSteps.begin(), vSteps.end(), pNotes ); diff --git a/stepmania/src/ScreenEnding.cpp b/stepmania/src/ScreenEnding.cpp index a08f79f89d..9547353545 100644 --- a/stepmania/src/ScreenEnding.cpp +++ b/stepmania/src/ScreenEnding.cpp @@ -25,6 +25,7 @@ #include "RageLog.h" #include "StyleDef.h" #include "GameManager.h" +#include "SongUtil.h" #define SCROLL_DELAY THEME->GetMetricF("ScreenEnding","ScrollDelay") @@ -66,7 +67,7 @@ ScreenEnding::ScreenEnding( CString sClassName ) : ScreenAttract( sClassName, fa { vector arraySongs; SONGMAN->GetSongs( arraySongs ); - SortSongPointerArrayByTitle( arraySongs ); + SongUtil::SortSongPointerArrayByTitle( arraySongs ); for( int p=0; pGetMetricF("ScreenEz2SelectMusic","ScrollingListX") #define SCROLLING_LIST_Y THEME->GetMetricF("ScreenEz2SelectMusic","ScrollingListY") @@ -654,7 +655,7 @@ void ScreenEz2SelectMusic::MusicChanged() for( pn = 0; pn < NUM_PLAYERS; ++pn) { pSong->GetSteps( m_arrayNotes[pn], GAMESTATE->GetCurrentStyleDef()->m_StepsType ); - SortNotesArrayByDifficulty( m_arrayNotes[pn] ); + StepsUtil::SortNotesArrayByDifficulty( m_arrayNotes[pn] ); } for( pn=0; pnGetMetricF("ScreenMusicScroll","ScrollDelay") @@ -36,7 +37,7 @@ ScreenMusicScroll::ScreenMusicScroll( CString sClassName ) : ScreenAttract( sCla { vector arraySongs; SONGMAN->GetSongs( arraySongs ); - SortSongPointerArrayByTitle( arraySongs ); + SongUtil::SortSongPointerArrayByTitle( arraySongs ); unsigned i; for( i=0; i < arraySongs.size(); i++ ) diff --git a/stepmania/src/ScreenOptionsMaster.cpp b/stepmania/src/ScreenOptionsMaster.cpp index 05c5b59489..d9ecd36aec 100644 --- a/stepmania/src/ScreenOptionsMaster.cpp +++ b/stepmania/src/ScreenOptionsMaster.cpp @@ -20,6 +20,7 @@ #include "StepMania.h" #include "RageSoundManager.h" #include "ProfileManager.h" +#include "StepsUtil.h" #define LINE_NAMES THEME->GetMetric (m_sName,"LineNames") #define OPTION_MENU_FLAGS THEME->GetMetric (m_sName,"OptionMenuFlags") @@ -128,7 +129,7 @@ void ScreenOptionsMaster::SetStep( OptionRowData &row, OptionRowHandler &hand ) { vector vSteps; GAMESTATE->m_pCurSong->GetSteps( vSteps, GAMESTATE->GetCurrentStyleDef()->m_StepsType ); - SortNotesArrayByDifficulty( vSteps ); + StepsUtil::SortNotesArrayByDifficulty( vSteps ); for( unsigned i=0; iGetMetricF("ScreenSelectGroup","BannerWidth") #define BANNER_HEIGHT THEME->GetMetricF("ScreenSelectGroup","BannerHeight") @@ -101,7 +102,7 @@ ScreenSelectGroup::ScreenSelectGroup( CString sClassName ) : Screen( sClassName aSongsInGroup.push_back( aAllSongs[i] ); } - SortSongPointerArrayByTitle( aSongsInGroup ); + SongUtil::SortSongPointerArrayByTitle( aSongsInGroup ); m_MusicList.AddGroup(); m_MusicList.AddSongsToGroup(aSongsInGroup); diff --git a/stepmania/src/ScreenSelectMusic.cpp b/stepmania/src/ScreenSelectMusic.cpp index aab5b5b0c3..a1ef12a6ad 100644 --- a/stepmania/src/ScreenSelectMusic.cpp +++ b/stepmania/src/ScreenSelectMusic.cpp @@ -36,6 +36,7 @@ #include "MenuTimer.h" #include "LightsManager.h" #include "StageStats.h" +#include "StepsUtil.h" const int NUM_SCORE_DIGITS = 9; @@ -1329,7 +1330,7 @@ void ScreenSelectMusic::AfterMusicChange() m_fSampleLengthSeconds = pSong->m_fMusicSampleLengthSeconds; pSong->GetSteps( m_arrayNotes, GAMESTATE->GetCurrentStyleDef()->m_StepsType ); - SortNotesArrayByDifficulty( m_arrayNotes ); + StepsUtil::SortNotesArrayByDifficulty( m_arrayNotes ); if ( PREFSMAN->m_bShowBanners ) m_Banner.LoadFromSong( pSong ); diff --git a/stepmania/src/Song.cpp b/stepmania/src/Song.cpp index 6a7c8e4eb5..ab587343a5 100644 --- a/stepmania/src/Song.cpp +++ b/stepmania/src/Song.cpp @@ -3,7 +3,7 @@ ----------------------------------------------------------------------------- Class: Song - Desc: Holds metadata for a song and the song's step data. + Desc: See header. Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved. Chris Danford @@ -36,6 +36,7 @@ #include "SDL_utils.h" #include "ProfileManager.h" #include "StageStats.h" +#include "StepsUtil.h" #include "NotesLoaderSM.h" #include "NotesLoaderDWI.h" @@ -458,7 +459,7 @@ void Song::AdjustDuplicateSteps() DeleteDuplicateSteps( this, vSteps ); CHECKPOINT; - SortNotesArrayByDifficulty( vSteps ); + StepsUtil::SortNotesArrayByDifficulty( vSteps ); CHECKPOINT; for( unsigned k=1; k 0; } -///////////////////////////////////// -// Sorting -///////////////////////////////////// - -/* Just calculating GetNumTimesPlayed within the sort is pretty slow, so let's precompute - * it. (This could be generalized with a template.) */ -map song_sort_val; - -bool CompareSongPointersBySortValueAscending(const Song *pSong1, const Song *pSong2) -{ - return song_sort_val[pSong1] < song_sort_val[pSong2]; -} - -bool CompareSongPointersBySortValueDescending(const Song *pSong1, const Song *pSong2) -{ - return song_sort_val[pSong1] > song_sort_val[pSong2]; -} - - -CString MakeSortString( CString s ) -{ - s.MakeUpper(); - - // Make sure that non-alphanumeric characters are placed at the very end - if( s.size() > 0 ) - { - if( s[0] == '.' ) // ".59" - s.erase(s.begin()); - if( (s[0] < 'A' || s[0] > 'Z') && (s[0] < '0' || s[0] > '9') ) - s = char(126) + s; - } - - return s; -} - -bool CompareSongPointersByTitle(const Song *pSong1, const Song *pSong2) -{ - // Prefer transliterations to full titles - CString s1 = pSong1->GetTranslitMainTitle(); - CString s2 = pSong2->GetTranslitMainTitle(); - if( s1 == s2 ) - { - s1 = pSong1->GetTranslitSubTitle(); - s2 = pSong2->GetTranslitSubTitle(); - } - - s1 = MakeSortString(s1); - s2 = MakeSortString(s2); - - int ret = s1.CompareNoCase( s2 ); - if(ret < 0) return true; - if(ret > 0) return false; - - /* The titles are the same. Ensure we get a consistent ordering - * by comparing the unique SongFilePaths. */ - return pSong1->GetSongFilePath().CompareNoCase(pSong2->GetSongFilePath()) < 0; -} - -void SortSongPointerArrayByTitle( vector &arraySongPointers ) -{ - sort( arraySongPointers.begin(), arraySongPointers.end(), CompareSongPointersByTitle ); -} - -static int GetSongSortDifficulty(const Song *pSong) -{ - vector aNotes; - pSong->GetSteps( aNotes, GAMESTATE->GetCurrentStyleDef()->m_StepsType ); - - /* Sort by the first difficulty found in the following order: */ - const Difficulty d[] = { DIFFICULTY_EASY, DIFFICULTY_MEDIUM, DIFFICULTY_HARD, - DIFFICULTY_CHALLENGE, DIFFICULTY_INVALID }; - - for(int i = 0; d[i] != DIFFICULTY_INVALID; ++i) - { - for( unsigned j = 0; j < aNotes.size(); ++j) - { - if(aNotes[j]->GetDifficulty() != d[i]) - continue; - - return aNotes[j]->GetMeter(); - } - } - - return 1; -} - -void SortSongPointerArrayByDifficulty( vector &arraySongPointers ) -{ - for( unsigned i = 0; i < arraySongPointers.size(); ++i ) - song_sort_val[arraySongPointers[i]] = - ssprintf("%9i", GetSongSortDifficulty(arraySongPointers[i])); - stable_sort( arraySongPointers.begin(), arraySongPointers.end(), CompareSongPointersBySortValueAscending ); -} - -bool CompareSongPointersByBPM(const Song *pSong1, const Song *pSong2) -{ - float fMinBPM1, fMaxBPM1, fMinBPM2, fMaxBPM2; - pSong1->GetDisplayBPM( fMinBPM1, fMaxBPM1 ); - pSong2->GetDisplayBPM( fMinBPM2, fMaxBPM2 ); - - if( fMaxBPM1 < fMaxBPM2 ) - return true; - if( fMaxBPM1 > fMaxBPM2 ) - return false; - - return CompareCStringsAsc( pSong1->GetSongFilePath(), pSong2->GetSongFilePath() ); -} - -void SortSongPointerArrayByBPM( vector &arraySongPointers ) -{ - sort( arraySongPointers.begin(), arraySongPointers.end(), CompareSongPointersByBPM ); -} - -void AppendOctal( int n, int digits, CString &out ) -{ - for( int p = digits-1; p >= 0; --p ) - { - const int shift = p*3; - int n2 = (n >> shift) & 0x7; - out.insert( out.end(), (char) (n2+'0') ); - } -} - -bool CompDescending( const pair &a, const pair &b ) -{ return a.second > b.second; } - -void SortSongPointerArrayByGrade( vector &arraySongPointers ) -{ - /* Optimize by pre-writing a string to compare, since doing GetNumNotesWithGrade - * inside the sort is too slow. */ - typedef pair< Song *, CString > val; - vector vals; - vals.reserve( arraySongPointers.size() ); - - unsigned i; - for( i = 0; i < arraySongPointers.size(); ++i ) - { - Song *pSong = arraySongPointers[i]; - - CString foo; - foo.reserve(256); - for( int g=GRADE_TIER_1; g<=GRADE_NO_DATA; ++g ) - { - int n = pSong->GetNumNotesWithGrade( (Grade)g ); - AppendOctal( n, 3, foo ); - } - vals.push_back( val(pSong, foo) ); - } - - sort( vals.begin(), vals.end(), CompDescending ); - - for( i = 0; i < arraySongPointers.size(); ++i ) - arraySongPointers[i] = vals[i].first; -} - - -void SortSongPointerArrayByArtist( vector &arraySongPointers ) -{ - for( unsigned i = 0; i < arraySongPointers.size(); ++i ) - song_sort_val[arraySongPointers[i]] = MakeSortString( arraySongPointers[i]->GetTranslitArtist() ); - stable_sort( arraySongPointers.begin(), arraySongPointers.end(), CompareSongPointersBySortValueAscending ); -} - -static int CompareSongPointersByGroup(const Song *pSong1, const Song *pSong2) -{ - return pSong1->m_sGroupName < pSong2->m_sGroupName; -} - -void SortSongPointerArrayByGroupAndDifficulty( vector &arraySongPointers ) -{ - SortSongPointerArrayByDifficulty( arraySongPointers ); - stable_sort( arraySongPointers.begin(), arraySongPointers.end(), CompareSongPointersByGroup ); -} - -int CompareSongPointersByGroupAndTitle(const Song *pSong1, const Song *pSong2) -{ - const CString &sGroup1 = pSong1->m_sGroupName; - const CString &sGroup2 = pSong2->m_sGroupName; - - if( sGroup1 < sGroup2 ) - return true; - if( sGroup1 > sGroup2 ) - return false; - - /* Same group; compare by name. */ - return CompareSongPointersByTitle( pSong1, pSong2 ); -} - -void SortSongPointerArrayByGroupAndTitle( vector &arraySongPointers ) -{ - sort( arraySongPointers.begin(), arraySongPointers.end(), CompareSongPointersByGroupAndTitle ); -} - -void SortSongPointerArrayByNumPlays( vector &arraySongPointers, ProfileSlot slot, bool bDescending ) -{ - Profile* pProfile = PROFILEMAN->GetProfile(slot); - if( pProfile == NULL ) - return; // nothing to do since we don't have data - SortSongPointerArrayByNumPlays( arraySongPointers, pProfile, bDescending ); -} - -void SortSongPointerArrayByNumPlays( vector &arraySongPointers, const Profile* pProfile, bool bDescending ) -{ - ASSERT( pProfile ); - for(unsigned i = 0; i < arraySongPointers.size(); ++i) - song_sort_val[arraySongPointers[i]] = ssprintf("%9i", pProfile->GetSongNumTimesPlayed(arraySongPointers[i])); - stable_sort( arraySongPointers.begin(), arraySongPointers.end(), bDescending ? CompareSongPointersBySortValueDescending : CompareSongPointersBySortValueAscending ); - song_sort_val.clear(); -} - -CString GetSectionNameFromSongAndSort( const Song* pSong, SortOrder so ) -{ - if( pSong == NULL ) - return ""; - - switch( so ) - { - case SORT_PREFERRED: - return ""; - case SORT_GROUP: - return pSong->m_sGroupName; - case SORT_TITLE: - case SORT_ARTIST: - { - CString s; - switch( so ) - { - case SORT_TITLE: s = pSong->GetTranslitMainTitle(); break; - case SORT_ARTIST: s = pSong->GetTranslitArtist(); break; - default: ASSERT(0); - } - s = MakeSortString(s); // resulting string will be uppercase - - if( s.empty() ) - return ""; - else if( s[0] >= '0' && s[0] <= '9' ) - return "NUM"; - else if( s[0] < 'A' || s[0] > 'Z') - return "OTHER"; - else - return s.Left(1); - } - case SORT_BPM: - { - const int iBPMGroupSize = 20; - float fMinBPM, fMaxBPM; - pSong->GetDisplayBPM( fMinBPM, fMaxBPM ); - int iMaxBPM = (int)fMaxBPM; - iMaxBPM += iBPMGroupSize - (iMaxBPM%iBPMGroupSize) - 1; - return ssprintf("%03d-%03d",iMaxBPM-(iBPMGroupSize-1), iMaxBPM); - } - case SORT_MOST_PLAYED: - return ""; - case SORT_GRADE: - { - for( int i=GRADE_TIER_1; iGetNumNotesWithGrade( g ); - if( iCount > 0 ) - return ssprintf( "%4s x %d", GradeToThemedString(g).c_str(), iCount ); - } - return GradeToThemedString( GRADE_NO_DATA ); - } - case SORT_EASY_METER: - { - Steps* pNotes = pSong->GetStepsByDifficulty(GAMESTATE->GetCurrentStyleDef()->m_StepsType,DIFFICULTY_EASY); - if( pNotes ) - return ssprintf("%02d", pNotes->GetMeter() ); - return "N/A"; - } - case SORT_MEDIUM_METER: - { - Steps* pNotes = pSong->GetStepsByDifficulty(GAMESTATE->GetCurrentStyleDef()->m_StepsType,DIFFICULTY_MEDIUM); - if( pNotes ) - return ssprintf("%02d", pNotes->GetMeter() ); - return "N/A"; - } - case SORT_HARD_METER: - { - Steps* pNotes = pSong->GetStepsByDifficulty(GAMESTATE->GetCurrentStyleDef()->m_StepsType,DIFFICULTY_HARD); - if( pNotes ) - return ssprintf("%02d", pNotes->GetMeter() ); - return "N/A"; - } - case SORT_CHALLENGE_METER: - { - Steps* pNotes = pSong->GetStepsByDifficulty(GAMESTATE->GetCurrentStyleDef()->m_StepsType,DIFFICULTY_CHALLENGE); - if( pNotes ) - return ssprintf("%02d", pNotes->GetMeter() ); - return "N/A"; - } - case SORT_SORT_MENU: - case SORT_MODE_MENU: - return ""; - case SORT_ALL_COURSES: - case SORT_NONSTOP_COURSES: - case SORT_ONI_COURSES: - case SORT_ENDLESS_COURSES: - default: - ASSERT(0); - return ""; - } -} - -void SortSongPointerArrayBySectionName( vector &arraySongPointers, SortOrder so ) -{ - for(unsigned i = 0; i < arraySongPointers.size(); ++i) - { - CString val = GetSectionNameFromSongAndSort( arraySongPointers[i], so ); - - /* Make sure NUM comes first and OTHER comes last. */ - if( val == "NUM" ) val = "0"; - else if( val == "OTHER" ) val = "2"; - else val = "1" + val; - - song_sort_val[arraySongPointers[i]] = val; - } - - stable_sort( arraySongPointers.begin(), arraySongPointers.end(), CompareSongPointersBySortValueAscending ); - song_sort_val.clear(); -} - -void SortSongPointerArrayByMeter( vector &arraySongPointers, Difficulty dc ) -{ - song_sort_val.clear(); - for(unsigned i = 0; i < arraySongPointers.size(); ++i) - { - Steps* pNotes = arraySongPointers[i]->GetStepsByDifficulty( GAMESTATE->GetCurrentStyleDef()->m_StepsType, dc ); - song_sort_val[arraySongPointers[i]] = ssprintf("%i", pNotes ? pNotes->GetMeter() : 0); - } - stable_sort( arraySongPointers.begin(), arraySongPointers.end(), CompareSongPointersBySortValueAscending ); -} - Song::SelectionDisplay Song::GetDisplayed() const { if( !PREFSMAN->m_bHiddenSongs ) diff --git a/stepmania/src/SongManager.cpp b/stepmania/src/SongManager.cpp index 97e28598e8..eaf9942991 100644 --- a/stepmania/src/SongManager.cpp +++ b/stepmania/src/SongManager.cpp @@ -33,6 +33,8 @@ #include "ProfileManager.h" #include "MemoryCardManager.h" #include "NotesLoaderSM.h" +#include "SongUtil.h" +#include "StepsUtil.h" SongManager* SONGMAN = NULL; // global and accessable from anywhere in our program @@ -679,11 +681,11 @@ bool CompareNotesPointersForExtra(const Steps *n1, const Steps *n2) if(d1 > d2) return false; /* n1 difficulty == n2 difficulty */ - if(CompareNotesPointersByMeter(n1,n2)) return true; - if(CompareNotesPointersByMeter(n2,n1)) return false; + if(StepsUtil::CompareNotesPointersByMeter(n1,n2)) return true; + if(StepsUtil::CompareNotesPointersByMeter(n2,n1)) return false; /* n1 meter == n2 meter */ - return CompareNotesPointersByRadarValues(n1,n2); + return StepsUtil::CompareNotesPointersByRadarValues(n1,n2); } void SongManager::GetExtraStageInfo( bool bExtra2, const StyleDef *sd, @@ -904,7 +906,7 @@ void SongManager::UpdateBest() Best.erase( Best.end()-1 ); } - SortSongPointerArrayByNumPlays( m_pBestSongs[i], (ProfileSlot) i, true ); + SongUtil::SortSongPointerArrayByNumPlays( m_pBestSongs[i], (ProfileSlot) i, true ); m_pBestCourses[i] = m_pCourses; SortCoursePointerArrayByNumPlays( m_pBestCourses[i], (ProfileSlot) i, true ); @@ -923,7 +925,7 @@ void SongManager::UpdateShuffled() void SongManager::SortSongs() { - SortSongPointerArrayByTitle( m_pSongs ); + SongUtil::SortSongPointerArrayByTitle( m_pSongs ); } void SongManager::UpdateRankingCourses() diff --git a/stepmania/src/StepMania.dsp b/stepmania/src/StepMania.dsp index 2873289b6d..4d4b4ed935 100644 --- a/stepmania/src/StepMania.dsp +++ b/stepmania/src/StepMania.dsp @@ -1,5 +1,5 @@ # Microsoft Developer Studio Project File - Name="StepMania" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# Microsoft Developer Studio Generated Build File, Format Version 60000 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Application" 0x0101 @@ -62,10 +62,10 @@ LINK32=link.exe # SUBTRACT LINK32 /verbose /profile /pdb:none /incremental:no /nodefaultlib # Begin Special Build Tool IntDir=.\../Debug6 -TargetDir=\temp\stepmania\Program +TargetDir=\stepmania\stepmania\Program TargetName=StepMania-debug SOURCE="$(InputPath)" -PreLink_Cmds=disasm\verinc cl /Zl /nologo /c verstub.cpp /Fo$(IntDir)\ +PreLink_Cmds=disasm\verinc cl /Zl /nologo /c verstub.cpp /Fo$(IntDir)\ PostBuild_Cmds=disasm\mapconv $(IntDir)\$(TargetName).map $(TargetDir)\StepMania.vdi # End Special Build Tool @@ -99,6 +99,10 @@ XBCP=xbecopy.exe # ADD BASE XBCP /NOLOGO # ADD XBCP /NOLOGO # Begin Special Build Tool +IntDir=.\../Debug_Xbox +TargetDir=\stepmania\stepmania +TargetName=default +SOURCE="$(InputPath)" PreLink_Cmds=disasm\verinc cl /Zl /nologo /c PostBuild_Cmds=disasm\mapconv $(IntDir)\$(TargetName).map $(TargetDir)\StepMania.vdi ia32.vdi # End Special Build Tool @@ -135,10 +139,10 @@ LINK32=link.exe # SUBTRACT LINK32 /verbose /pdb:none /debug # Begin Special Build Tool IntDir=.\../Release6 -TargetDir=\temp\stepmania\Program +TargetDir=\stepmania\stepmania\Program TargetName=StepMania SOURCE="$(InputPath)" -PreLink_Cmds=disasm\verinc cl /Zl /nologo /c verstub.cpp /Fo$(IntDir)\ +PreLink_Cmds=disasm\verinc cl /Zl /nologo /c verstub.cpp /Fo$(IntDir)\ PostBuild_Cmds=disasm\mapconv $(IntDir)\$(TargetName).map $(TargetDir)\StepMania.vdi # End Special Build Tool @@ -174,6 +178,10 @@ XBCP=xbecopy.exe # ADD BASE XBCP /NOLOGO # ADD XBCP /NOLOGO # Begin Special Build Tool +IntDir=.\../Release_Xbox +TargetDir=\stepmania\stepmania +TargetName=default +SOURCE="$(InputPath)" PreLink_Cmds=disasm\verinc cl /Zl /nologo /c PostBuild_Cmds=disasm\mapconv $(IntDir)\$(TargetName).map $(TargetDir)\StepMania.vdi ia32.vdi # End Special Build Tool @@ -1899,6 +1907,25 @@ SOURCE=.\SongOptions.h # End Source File # Begin Source File +SOURCE=.\SongUtil.cpp + +!IF "$(CFG)" == "StepMania - Win32 Debug" + +!ELSEIF "$(CFG)" == "StepMania - Xbox Debug" + +!ELSEIF "$(CFG)" == "StepMania - Win32 Release" + +!ELSEIF "$(CFG)" == "StepMania - Xbox Release" + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=.\SongUtil.h +# End Source File +# Begin Source File + SOURCE=.\StageStats.cpp !IF "$(CFG)" == "StepMania - Win32 Debug" @@ -1937,6 +1964,25 @@ SOURCE=.\Steps.h # End Source File # Begin Source File +SOURCE=.\StepsUtil.cpp + +!IF "$(CFG)" == "StepMania - Win32 Debug" + +!ELSEIF "$(CFG)" == "StepMania - Xbox Debug" + +!ELSEIF "$(CFG)" == "StepMania - Win32 Release" + +!ELSEIF "$(CFG)" == "StepMania - Xbox Release" + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=.\StepsUtil.h +# End Source File +# Begin Source File + SOURCE=.\StyleDef.cpp !IF "$(CFG)" == "StepMania - Win32 Debug" diff --git a/stepmania/src/StepMania.vcproj b/stepmania/src/StepMania.vcproj index 00c2186673..b8b23afbd0 100644 --- a/stepmania/src/StepMania.vcproj +++ b/stepmania/src/StepMania.vcproj @@ -803,6 +803,12 @@ cl /Zl /nologo /c verstub.cpp /Fo"$(IntDir)"\ + + + + @@ -815,6 +821,12 @@ cl /Zl /nologo /c verstub.cpp /Fo"$(IntDir)"\ + + + + diff --git a/stepmania/src/Steps.cpp b/stepmania/src/Steps.cpp index df8b8f0a23..1d1d43e485 100644 --- a/stepmania/src/Steps.cpp +++ b/stepmania/src/Steps.cpp @@ -304,82 +304,3 @@ void Steps::SetRadarValue(int r, float val) } -// -// Sorting stuff -// -map steps_sort_val; - -bool CompareStepsPointersBySortValueAscending(const Steps *pSteps1, const Steps *pSteps2) -{ - return steps_sort_val[pSteps1] < steps_sort_val[pSteps2]; -} - -bool CompareStepsPointersBySortValueDescending(const Steps *pSteps1, const Steps *pSteps2) -{ - return steps_sort_val[pSteps1] > steps_sort_val[pSteps2]; -} - -void SortStepsPointerArrayByNumPlays( vector &vStepsPointers, ProfileSlot slot, bool bDescending ) -{ - Profile* pProfile = PROFILEMAN->GetProfile(slot); - if( pProfile == NULL ) - return; // nothing to do since we don't have data - SortStepsPointerArrayByNumPlays( vStepsPointers, pProfile, bDescending ); -} - -void SortStepsPointerArrayByNumPlays( vector &vStepsPointers, const Profile* pProfile, bool bDecending ) -{ - ASSERT( pProfile ); - for(unsigned i = 0; i < vStepsPointers.size(); ++i) - steps_sort_val[vStepsPointers[i]] = ssprintf("%9i", pProfile->GetStepsNumTimesPlayed(vStepsPointers[i])); - stable_sort( vStepsPointers.begin(), vStepsPointers.end(), bDecending ? CompareStepsPointersBySortValueDescending : CompareStepsPointersBySortValueAscending ); - steps_sort_val.clear(); -} - -bool CompareNotesPointersByRadarValues(const Steps* pNotes1, const Steps* pNotes2) -{ - float fScore1 = 0; - float fScore2 = 0; - - for( int r=0; rGetRadarValues()[r]; - fScore2 += pNotes2->GetRadarValues()[r]; - } - - return fScore1 < fScore2; -} - -bool CompareNotesPointersByMeter(const Steps *pNotes1, const Steps* pNotes2) -{ - return pNotes1->GetMeter() < pNotes2->GetMeter(); -} - -bool CompareNotesPointersByDifficulty(const Steps *pNotes1, const Steps *pNotes2) -{ - return pNotes1->GetDifficulty() < pNotes2->GetDifficulty(); -} - -void SortNotesArrayByDifficulty( vector &arraySteps ) -{ - /* Sort in reverse order of priority. */ - stable_sort( arraySteps.begin(), arraySteps.end(), CompareNotesPointersByRadarValues ); - stable_sort( arraySteps.begin(), arraySteps.end(), CompareNotesPointersByMeter ); - stable_sort( arraySteps.begin(), arraySteps.end(), CompareNotesPointersByDifficulty ); -} - -bool CompareStepsPointersByTypeAndDifficulty(const Steps *pStep1, const Steps *pStep2) -{ - if( pStep1->m_StepsType < pStep2->m_StepsType ) - return true; - if( pStep1->m_StepsType > pStep2->m_StepsType ) - return false; - return pStep1->GetDifficulty() < pStep2->GetDifficulty(); -} - -void SortStepsByTypeAndDifficulty( vector &arraySongPointers ) -{ - sort( arraySongPointers.begin(), arraySongPointers.end(), CompareStepsPointersByTypeAndDifficulty ); -} - - diff --git a/stepmania/src/Steps.h b/stepmania/src/Steps.h index 65b23bee3d..3f9b7b2413 100644 --- a/stepmania/src/Steps.h +++ b/stepmania/src/Steps.h @@ -94,13 +94,4 @@ protected: RadarValues m_RadarValues; }; -bool CompareNotesPointersByRadarValues(const Steps* pNotes1, const Steps* pNotes2); -bool CompareNotesPointersByMeter(const Steps *pNotes1, const Steps* pNotes2); -bool CompareNotesPointersByDifficulty(const Steps *pNotes1, const Steps *pNotes2); -void SortNotesArrayByDifficulty( vector &arrayNotess ); -bool CompareStepsPointersByTypeAndDifficulty(const Steps *pStep1, const Steps *pStep2); -void SortStepsByTypeAndDifficulty( vector &arraySongPointers ); -void SortStepsPointerArrayByNumPlays( vector &vStepsPointers, ProfileSlot slot, bool bDescending ); -void SortStepsPointerArrayByNumPlays( vector &vStepsPointers, const Profile* pProfile, bool bDescending ); - #endif diff --git a/stepmania/src/song.h b/stepmania/src/song.h index 88bb99a7eb..a66c24b1d2 100644 --- a/stepmania/src/song.h +++ b/stepmania/src/song.h @@ -4,7 +4,7 @@ ----------------------------------------------------------------------------- Class: Song - Desc: See header. + Desc: Holds data all music metadata and notes data single, playable song. Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved. Chris Danford @@ -209,20 +209,4 @@ private: CString GetUniqueSongDescription( StepsType st ); }; -CString MakeSortString( CString s ); -void SortSongPointerArrayByDifficulty( vector &arraySongPointers ); -void SortSongPointerArrayByTitle( vector &arraySongPointers ); -void SortSongPointerArrayByBPM( vector &arraySongPointers ); -void SortSongPointerArrayByGrade( vector &arraySongPointers ); -void SortSongPointerArrayByArtist( vector &arraySongPointers ); -void SortSongPointerArrayByGroupAndDifficulty( vector &arraySongPointers ); -void SortSongPointerArrayByGroupAndTitle( vector &arraySongPointers ); -void SortSongPointerArrayByNumPlays( vector &arraySongPointers, ProfileSlot slot, bool bDescending ); -void SortSongPointerArrayByNumPlays( vector &arraySongPointers, const Profile* pProfile, bool bDescending ); -void SortSongPointerArrayByMeter( vector &arraySongPointers, Difficulty dc ); -CString GetSectionNameFromSongAndSort( const Song* pSong, SortOrder so ); -void SortSongPointerArrayBySectionName( vector &arraySongPointers, SortOrder so ); - - - #endif