diff --git a/stepmania/src/GameConstantsAndTypes.cpp b/stepmania/src/GameConstantsAndTypes.cpp index 70482dbe5f..d55ae36c42 100644 --- a/stepmania/src/GameConstantsAndTypes.cpp +++ b/stepmania/src/GameConstantsAndTypes.cpp @@ -121,6 +121,9 @@ static const char *SongSortOrderNames[NUM_SORT_ORDERS] = { "HARD METER", "SORT", "COURSES", + "NONSTOP", + "ONI", + "ENDLESS", "ROULETTE" }; diff --git a/stepmania/src/GameConstantsAndTypes.h b/stepmania/src/GameConstantsAndTypes.h index 292f52991a..000fb4b5d3 100644 --- a/stepmania/src/GameConstantsAndTypes.h +++ b/stepmania/src/GameConstantsAndTypes.h @@ -114,8 +114,11 @@ enum SongSortOrder { SORT_EASY_METER, SORT_MEDIUM_METER, SORT_HARD_METER, - SORT_SORT, - SORT_COURSES, + SORT_MENU, + SORT_ALL_COURSES, + SORT_NONSTOP_COURSES, + SORT_ONI_COURSES, + SORT_ENDLESS_COURSES, SORT_ROULETTE, NUM_SORT_ORDERS, SORT_INVALID diff --git a/stepmania/src/MusicWheel.cpp b/stepmania/src/MusicWheel.cpp index f4c3068678..d5dbe343f9 100644 --- a/stepmania/src/MusicWheel.cpp +++ b/stepmania/src/MusicWheel.cpp @@ -32,6 +32,7 @@ #include "Banner.h" #include "Notes.h" #include "UnlockSystem.h" +#include "ModeChoice.h" #define FADE_SECONDS THEME->GetMetricF("MusicWheel","FadeSeconds") @@ -52,7 +53,10 @@ CachedThemeMetricF ITEM_SPACING_Y ("MusicWheel","ItemSpacingY"); CachedThemeMetricB USE_3D ("MusicWheel","Use3D"); CachedThemeMetricI NUM_WHEEL_ITEMS_METRIC ("MusicWheel","NumWheelItems"); #define NUM_WHEEL_ITEMS min( MAX_WHEEL_ITEMS, (int) NUM_WHEEL_ITEMS_METRIC ) +#define MENU_NAMES THEME->GetMetric ("MusicWheel","MenuNames") +#define MENU_ACTIONS THEME->GetMetric ("MusicWheel","MenuActions") + const int MAX_WHEEL_SOUND_SPEED = 15; @@ -155,10 +159,13 @@ MusicWheel::MusicWheel() if( GAMESTATE->m_SongSortOrder == SORT_INVALID ) { - if( GAMESTATE->IsCourseMode() ) - GAMESTATE->m_SongSortOrder = SORT_COURSES; - else - GAMESTATE->m_SongSortOrder = SortOrder[0]; + switch( GAMESTATE->m_PlayMode ) + { + case PLAY_MODE_ONI: GAMESTATE->m_SongSortOrder = SORT_ONI_COURSES; break; + case PLAY_MODE_NONSTOP: GAMESTATE->m_SongSortOrder = SORT_NONSTOP_COURSES; break; + case PLAY_MODE_ENDLESS: GAMESTATE->m_SongSortOrder = SORT_ENDLESS_COURSES; break; + default: GAMESTATE->m_SongSortOrder = SortOrder[0]; break; + } } /* Build all of the wheel item data. Do tihs after selecting @@ -273,12 +280,14 @@ bool MusicWheel::SelectSort( SongSortOrder so ) vector &from = m_WheelItemDatas[GAMESTATE->m_SongSortOrder]; for( i=0; im_SongSortOrder == so ) - m_iSelection = i; // select it + if( m_CurWheelItemData[i]->m_SongSortOrder != so ) + continue; + if( !m_CurWheelItemData[i]->m_Action.DescribesCurrentMode() ) + continue; + m_iSelection = i; // select it + break; } return true; @@ -359,14 +372,38 @@ void MusicWheel::BuildWheelItemDatas( vector &arrayWheelItemDatas switch( so ) { - case SORT_SORT: + case SORT_MENU: + { arrayWheelItemDatas.clear(); // clear out the previous wheel items - for( i=0; i Names, Actions; + split( sNames, ",", Names ); + split( sActions, ",", Actions ); + if( Names.size() != Actions.size() ) + RageException::Throw("MusicWheel::MenuNames and MusicWheel::MenuActions must have the same number of components"); + + for( i=0; i parts; + split( Actions[i], "-", parts ); + + SongSortOrder so = SORT_INVALID; + for( unsigned j = 0; so == SORT_INVALID && j < parts.size(); ++j ) + so = StringToSongSortOrder( parts[j] ); + + if( so == SORT_INVALID ) + so = SORT_GROUP; + RageColor c = RageColor(1,1,0,1); - arrayWheelItemDatas.push_back( WheelItemData(TYPE_SORT, NULL, "", NULL, c, (SongSortOrder)i) ); - } + WheelItemData wid( TYPE_SORT, NULL, "", NULL, c, so ); + wid.m_sLabel = Names[i]; + wid.m_Action.FromString( Actions[i], true ); + + arrayWheelItemDatas.push_back( wid ); + } break; + } case SORT_PREFERRED: case SORT_ROULETTE: case SORT_GROUP: @@ -514,19 +551,31 @@ void MusicWheel::BuildWheelItemDatas( vector &arrayWheelItemDatas } break; } - case SORT_COURSES: + case SORT_ALL_COURSES: + case SORT_NONSTOP_COURSES: + case SORT_ONI_COURSES: + case SORT_ENDLESS_COURSES: { vector apCourses; - switch( GAMESTATE->m_PlayMode ) + switch( so ) { - case PLAY_MODE_NONSTOP: SONGMAN->GetNonstopCourses( apCourses, PREFSMAN->m_bAutogenGroupCourses ); break; - case PLAY_MODE_ONI: SONGMAN->GetOniCourses( apCourses, PREFSMAN->m_bAutogenGroupCourses ); break; - case PLAY_MODE_ENDLESS: SONGMAN->GetEndlessCourses( apCourses, PREFSMAN->m_bAutogenGroupCourses ); break; - default: SONGMAN->GetAllCourses( apCourses, PREFSMAN->m_bAutogenGroupCourses ); break; + case SORT_NONSTOP_COURSES: SONGMAN->GetNonstopCourses( apCourses, PREFSMAN->m_bAutogenGroupCourses ); break; + case SORT_ONI_COURSES: SONGMAN->GetOniCourses( apCourses, PREFSMAN->m_bAutogenGroupCourses ); break; + case SORT_ENDLESS_COURSES: SONGMAN->GetEndlessCourses( apCourses, PREFSMAN->m_bAutogenGroupCourses ); break; + case SORT_ALL_COURSES: SONGMAN->GetAllCourses( apCourses, PREFSMAN->m_bAutogenGroupCourses ); break; + default: ASSERT(0); break; } + LOG->Trace("generate %i", apCourses.size()); SortCoursePointerArrayByDifficulty( apCourses ); + if( so == SORT_ALL_COURSES ) + SortCoursePointerArrayByType( apCourses ); + + arrayWheelItemDatas.clear(); // clear out the previous wheel items + + CString sLastSection = ""; + int iSectionColorIndex = 0; for( unsigned c=0; c &arrayWheelItemDatas if ( GAMESTATE->m_pUnlockingSys->CourseIsLocked(pCourse) ) continue; + CString sThisSection = ""; + if( so == SORT_ALL_COURSES ) + switch( pCourse->GetPlayMode() ) + { + case PLAY_MODE_ONI: sThisSection = "Oni"; break; + case PLAY_MODE_NONSTOP: sThisSection = "Nonstop"; break; + case PLAY_MODE_ENDLESS: sThisSection = "Endless"; break; + } + // check that this course has at least one song playable in the current style - if( pCourse->IsPlayableIn(GAMESTATE->GetCurrentStyleDef()->m_NotesType) ) - arrayWheelItemDatas.push_back( WheelItemData(TYPE_COURSE, NULL, "", pCourse, pCourse->GetColor(), SORT_INVALID) ); + if( !pCourse->IsPlayableIn(GAMESTATE->GetCurrentStyleDef()->m_NotesType) ) + continue; + + if( sThisSection != sLastSection ) // new section, make a section item + { + RageColor c = SECTION_COLORS(iSectionColorIndex); + iSectionColorIndex = (iSectionColorIndex+1) % NUM_SECTION_COLORS; + arrayWheelItemDatas.push_back( WheelItemData(TYPE_SECTION, NULL, sThisSection, NULL, c, SORT_INVALID) ); + sLastSection = sThisSection; + } + + arrayWheelItemDatas.push_back( WheelItemData(TYPE_COURSE, NULL, sThisSection, pCourse, pCourse->GetColor(), SORT_INVALID) ); } break; } @@ -776,14 +844,17 @@ void MusicWheel::Update( float fDeltaTime ) case SORT_EASY_METER: case SORT_MEDIUM_METER: case SORT_HARD_METER: - case SORT_COURSES: + case SORT_ALL_COURSES: + case SORT_NONSTOP_COURSES: + case SORT_ONI_COURSES: + case SORT_ENDLESS_COURSES: // Look for the last selected song or course if( GAMESTATE->m_pCurCourse ) SelectCourse( GAMESTATE->m_pCurCourse ); if( GAMESTATE->m_pCurSong ) SelectSong( GAMESTATE->m_pCurSong ); break; - case SORT_SORT: + case SORT_MENU: SelectSort( m_LastSongSortOrder ); break; default: @@ -997,6 +1068,7 @@ void MusicWheel::ChangeMusic(int dist) bool MusicWheel::ChangeSort( SongSortOrder new_so ) // return true if change successful { + ASSERT( new_so < NUM_SORT_ORDERS ); if( GAMESTATE->m_SongSortOrder == new_so ) return false; @@ -1009,6 +1081,8 @@ bool MusicWheel::ChangeSort( SongSortOrder new_so ) // return true if change suc return false; // don't continue } + SCREENMAN->PostMessageToTopScreen( SM_SortOrderChanging, 0 ); + m_soundChangeSort.Play(); TweenOffScreen(true); @@ -1033,10 +1107,10 @@ bool MusicWheel::NextSort() // return true if change successful /* It isn't, which means we're either in the sort menu or in a sort selected * from the sort menu. If we're in the sort menu, return to the first sort. * Otherwise, return to the sort menu. */ - if( GAMESTATE->m_SongSortOrder == SORT_SORT ) + if( GAMESTATE->m_SongSortOrder == SORT_MENU ) so = SortOrder[0]; else - so = SORT_SORT; + so = SORT_MENU; } else { ++cur; if( SortOrder[cur] == SORT_INVALID ) @@ -1102,6 +1176,7 @@ bool MusicWheel::Select() // return true if this selection ends the screen case TYPE_COURSE: return true; case TYPE_SORT: + m_CurWheelItemData[m_iSelection]->m_Action.ApplyToAllPlayers(); ChangeSort( m_CurWheelItemData[m_iSelection]->m_SongSortOrder ); return false; default: @@ -1361,9 +1436,12 @@ CString MusicWheel::GetSectionNameFromSongAndSort( const Song* pSong, SongSortOr return ssprintf("%02d", pNotes->GetMeter() ); return "N/A"; } - case SORT_SORT: - case SORT_COURSES: + case SORT_MENU: return ""; + case SORT_ALL_COURSES: + case SORT_NONSTOP_COURSES: + case SORT_ONI_COURSES: + case SORT_ENDLESS_COURSES: default: ASSERT(0); return ""; diff --git a/stepmania/src/MusicWheel.h b/stepmania/src/MusicWheel.h index 076bf5a2e9..da3ddc6d82 100644 --- a/stepmania/src/MusicWheel.h +++ b/stepmania/src/MusicWheel.h @@ -29,7 +29,8 @@ class Song; const int MAX_WHEEL_ITEMS = 15; const ScreenMessage SM_SongChanged = ScreenMessage(SM_User+47); // this should be unique! -const ScreenMessage SM_SortOrderChanged = ScreenMessage(SM_User+48); +const ScreenMessage SM_SortOrderChanging= ScreenMessage(SM_User+48); +const ScreenMessage SM_SortOrderChanged = ScreenMessage(SM_User+49); struct CompareSongPointerArrayBySectionName; diff --git a/stepmania/src/MusicWheelItem.cpp b/stepmania/src/MusicWheelItem.cpp index 87f2e5fa80..368c011f84 100644 --- a/stepmania/src/MusicWheelItem.cpp +++ b/stepmania/src/MusicWheelItem.cpp @@ -142,7 +142,7 @@ void MusicWheelItem::LoadFromWheelItemData( WheelItemData* pWID ) bt = &m_textCourse; break; case TYPE_SORT: - sDisplayName = SongSortOrderToString(data->m_SongSortOrder); + sDisplayName = data->m_sLabel; bt = &m_textSort; break; default: diff --git a/stepmania/src/MusicWheelItem.h b/stepmania/src/MusicWheelItem.h index fd692bd7de..83494e84fb 100644 --- a/stepmania/src/MusicWheelItem.h +++ b/stepmania/src/MusicWheelItem.h @@ -17,6 +17,7 @@ #include "WheelNotifyIcon.h" #include "TextBanner.h" #include "GameConstantsAndTypes.h" +#include "ModeChoice.h" class Course; class Song; @@ -72,6 +73,10 @@ struct WheelItemData Song* m_pSong; RageColor m_color; // either text color or section background color WheelNotifyIcon::Flags m_Flags; + + // for TYPE_SORT + CString m_sLabel; + ModeChoice m_Action; SongSortOrder m_SongSortOrder; }; diff --git a/stepmania/src/ScreenSelectMusic.cpp b/stepmania/src/ScreenSelectMusic.cpp index cc77cd02ee..b8634f60ce 100644 --- a/stepmania/src/ScreenSelectMusic.cpp +++ b/stepmania/src/ScreenSelectMusic.cpp @@ -348,17 +348,21 @@ void ScreenSelectMusic::SkipCoursePartTweens() void ScreenSelectMusic::TweenOnScreen() { - if( GAMESTATE->m_SongSortOrder == SORT_COURSES ) + switch( GAMESTATE->m_SongSortOrder ) { + case SORT_ALL_COURSES: + case SORT_NONSTOP_COURSES: + case SORT_ONI_COURSES: + case SORT_ENDLESS_COURSES: TweenCoursePartsOnScreen( true ); TweenSongPartsOffScreen(); SkipSongPartTweens(); - } - else - { + break; + default: TweenSongPartsOnScreen( true ); TweenCoursePartsOffScreen(); SkipCoursePartTweens(); + break; } ON_COMMAND( m_sprBannerMask ); @@ -392,10 +396,18 @@ void ScreenSelectMusic::TweenOnScreen() void ScreenSelectMusic::TweenOffScreen() { - if( GAMESTATE->m_SongSortOrder == SORT_COURSES ) + switch( GAMESTATE->m_SongSortOrder ) + { + case SORT_ALL_COURSES: + case SORT_NONSTOP_COURSES: + case SORT_ONI_COURSES: + case SORT_ENDLESS_COURSES: TweenCoursePartsOffScreen(); - else + break; + default: TweenSongPartsOffScreen(); + break; + } OFF_COMMAND( m_sprBannerMask ); OFF_COMMAND( m_Banner ); @@ -477,10 +489,19 @@ void ScreenSelectMusic::TweenScoreOnAndOffAfterChangeSort() apActorsInScore[i]->SetLatestTween(original); } - if( GAMESTATE->m_SongSortOrder == SORT_COURSES ) + switch( GAMESTATE->m_SongSortOrder ) + { + case SORT_ALL_COURSES: + case SORT_NONSTOP_COURSES: + case SORT_ONI_COURSES: + case SORT_ENDLESS_COURSES: EnterCourseDisplayMode(); - else - ExitCourseDisplayMode(); + break; + default: + if( GAMESTATE->m_SongSortOrder != SORT_MENU ) + ExitCourseDisplayMode(); + break; + } } void ScreenSelectMusic::Update( float fDeltaTime ) @@ -590,12 +611,7 @@ void ScreenSelectMusic::Input( const DeviceInput& DeviceI, InputEventType type, if( ( GAMESTATE->IsExtraStage() && !PREFSMAN->m_bPickExtraStage ) || GAMESTATE->IsExtraStage2() ) m_soundLocked.Play(); else - m_MusicWheel.ChangeSort( SORT_SORT ); -// if( m_MusicWheel.NextSort() ) -// { -// SOUNDMAN->StopMusic(); -// TweenScoreOnAndOffAfterChangeSort(); -// } + m_MusicWheel.ChangeSort( SORT_MENU ); return; } if( !GAMESTATE->IsExtraStage() && !GAMESTATE->IsExtraStage2() && CodeDetector::DetectAndAdjustMusicOptions(GameI.controller) ) @@ -744,6 +760,10 @@ void ScreenSelectMusic::HandleScreenMessage( const ScreenMessage SM ) case SM_SortOrderChanged: SortOrderChanged(); break; + case SM_SortOrderChanging: +// m_MusicSortDisplay.FadeOff( 0, "fade", TWEEN_TIME ); + TweenScoreOnAndOffAfterChangeSort(); + break; } } @@ -757,14 +777,7 @@ void ScreenSelectMusic::MenuStart( PlayerNumber pn ) // m_soundLocked.Play(); // else { - if( m_MusicWheel.NextSort() ) - { - SOUNDMAN->StopMusic(); - -// m_MusicSortDisplay.FadeOff( 0, "fade", TWEEN_TIME ); - - TweenScoreOnAndOffAfterChangeSort(); - } + m_MusicWheel.NextSort(); } return; } @@ -840,7 +853,6 @@ void ScreenSelectMusic::MenuStart( PlayerNumber pn ) case TYPE_ROULETTE: case TYPE_SORT: break; - break; default: ASSERT(0); }