Split up the course sort into four sorts: all courses, and one ofr each

course mode.

Fix score not tweening when switching sorts via the menu.

Rename SORT_SORT to SORT_MODE.  Add metrics to define what
sorts are listed.  This can also change modes, but this has only been
tested for changing the play mode, not the play style.
This commit is contained in:
Glenn Maynard
2003-07-20 08:54:31 +00:00
parent 57d2c07c27
commit 5cb0b4f7cd
7 changed files with 160 additions and 58 deletions
+3
View File
@@ -121,6 +121,9 @@ static const char *SongSortOrderNames[NUM_SORT_ORDERS] = {
"HARD METER",
"SORT",
"COURSES",
"NONSTOP",
"ONI",
"ENDLESS",
"ROULETTE"
};
+5 -2
View File
@@ -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
+108 -30
View File
@@ -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<WheelItemData> &from = m_WheelItemDatas[GAMESTATE->m_SongSortOrder];
for( i=0; i<from.size(); i++ )
{
if( from[i].m_SongSortOrder == so )
{
// make its group the currently expanded group
SetOpenGroup(from[i].m_sSectionName);
break;
}
if( from[i].m_SongSortOrder != so )
continue;
if( !from[i].m_Action.DescribesCurrentMode() )
continue;
// make its group the currently expanded group
SetOpenGroup(from[i].m_sSectionName);
break;
}
if(i == from.size())
@@ -286,8 +295,12 @@ bool MusicWheel::SelectSort( SongSortOrder so )
for( i=0; i<m_CurWheelItemData.size(); i++ )
{
if( m_CurWheelItemData[i]->m_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<WheelItemData> &arrayWheelItemDatas
switch( so )
{
case SORT_SORT:
case SORT_MENU:
{
arrayWheelItemDatas.clear(); // clear out the previous wheel items
for( i=0; i<MAX_SELECTABLE_SORT; i++ )
CString sNames = MENU_NAMES, sActions = MENU_ACTIONS;
vector<CString> 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<Names.size(); ++i )
{
/* Look for sort names. */
vector<CString> 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<WheelItemData> &arrayWheelItemDatas
}
break;
}
case SORT_COURSES:
case SORT_ALL_COURSES:
case SORT_NONSTOP_COURSES:
case SORT_ONI_COURSES:
case SORT_ENDLESS_COURSES:
{
vector<Course*> 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<apCourses.size(); c++ ) // foreach course
{
Course* pCourse = apCourses[c];
@@ -535,9 +584,28 @@ void MusicWheel::BuildWheelItemDatas( vector<WheelItemData> &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 "";
+2 -1
View File
@@ -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;
+1 -1
View File
@@ -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:
+5
View File
@@ -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;
};
+36 -24
View File
@@ -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);
}