ModeMenuAvailable metric removed; change Codes instead.

Merge the sort menu into the mode menu.
GAMESTATE->m_SortOrder is now GAMESTATE->m_PreferredSortOrder.
Allow the mode menu to have non-mutually-exclusive items.
This commit is contained in:
Glenn Maynard
2005-01-29 20:46:08 +00:00
parent 46f414e7e5
commit 8d48438c15
16 changed files with 116 additions and 141 deletions
+82 -77
View File
@@ -50,7 +50,6 @@ ThemeMetric<bool> USE_3D ("MusicWheel","Use3D");
ThemeMetric<float> NUM_WHEEL_ITEMS_TO_DRAW ("MusicWheel","NumWheelItems");
#define NUM_WHEEL_ITEMS ((int)ceil(NUM_WHEEL_ITEMS_TO_DRAW+2))
#define MOST_PLAYED_SONGS_TO_SHOW THEME->GetMetricI("MusicWheel","MostPlayedSongsToShow")
#define SORT_MENU_CHOICE_NAMES THEME->GetMetric ("MusicWheel","SortMenuChoiceNames")
#define MODE_MENU_CHOICE_NAMES THEME->GetMetric ("MusicWheel","ModeMenuChoiceNames")
#define CHOICE( sChoiceName ) THEME->GetMetricM("MusicWheel",ssprintf("Choice%s",sChoiceName.c_str()))
#define WHEEL_ITEM_ON_DELAY_CENTER THEME->GetMetricF("MusicWheel","WheelItemOnDelayCenter")
@@ -79,6 +78,38 @@ MusicWheel::MusicWheel()
{
}
SortOrder ForceAppropriateSort( PlayMode pm, SortOrder so )
{
switch( pm )
{
// in course modes, force a particular sort
case PLAY_MODE_ONI: return SORT_ONI_COURSES;
case PLAY_MODE_NONSTOP: return SORT_NONSTOP_COURSES;
case PLAY_MODE_ENDLESS: return SORT_ENDLESS_COURSES;
}
/* If we're not in a course mode, don't start in a course sort. */
switch( so )
{
case SORT_ONI_COURSES:
case SORT_NONSTOP_COURSES:
case SORT_ENDLESS_COURSES:
so = SORT_INVALID;
break;
}
// if no preferred sort, fall back to theme default
if( so == SORT_INVALID )
{
so = StringToSortOrder( DEFAULT_SORT );
ASSERT( so != SORT_INVALID );
return so;
}
return so;
}
void MusicWheel::Load()
{
LOG->Trace( "MusicWheel::MusicWheel()" );
@@ -113,7 +144,6 @@ void MusicWheel::Load()
m_iSelection = 0;
m_LastSortOrder = SORT_INVALID;
m_WheelState = STATE_SELECTING_MUSIC;
m_fTimeLeftInState = 0;
@@ -152,31 +182,13 @@ void MusicWheel::Load()
GAMESTATE->m_SongOptions = so;
}
/* Never start in the sort or mode menu. We won't have a valid m_LastSortOrder
* and some elements may not initialize correctly. */
switch( GAMESTATE->m_SortOrder )
{
case SORT_SORT_MENU:
case SORT_MODE_MENU:
GAMESTATE->m_SortOrder = SORT_INVALID;
}
m_SortOrder = GAMESTATE->m_PreferredSortOrder;
switch( GAMESTATE->m_PlayMode )
{
// in course modes, force a particular sort
case PLAY_MODE_ONI: GAMESTATE->m_SortOrder = SORT_ONI_COURSES; break;
case PLAY_MODE_NONSTOP: GAMESTATE->m_SortOrder = SORT_NONSTOP_COURSES; break;
case PLAY_MODE_ENDLESS: GAMESTATE->m_SortOrder = SORT_ENDLESS_COURSES; break;
default:
// if no player preferred sort, fall back to theme default
if( GAMESTATE->m_SortOrder == SORT_INVALID )
{
GAMESTATE->m_SortOrder = StringToSortOrder( DEFAULT_SORT );
ASSERT( GAMESTATE->m_SortOrder != SORT_INVALID );
}
/* Never start in the mode menu; some elements may not initialize correctly. */
if( m_SortOrder == SORT_MODE_MENU )
m_SortOrder = SORT_INVALID;
break;
}
m_SortOrder = ForceAppropriateSort( GAMESTATE->m_PlayMode, m_SortOrder );
/* Update for SORT_MOST_PLAYED. */
SONGMAN->UpdateBest();
@@ -197,6 +209,19 @@ void MusicWheel::Load()
}
LOG->Trace( "took: %s", times.c_str() );
/* Set m_LastModeMenuItem to the first item that matches the current mode. (Do this
* after building wheel item data.) */
{
const vector<WheelItemData> &from = m_WheelItemDatas[SORT_MODE_MENU];
for( unsigned i=0; i<from.size(); i++ )
if( from[i].m_Action.DescribesCurrentModeForAllPlayers() )
{
m_sLastModeMenuItem = from[i].m_Action.m_sName;
break;
}
}
// HACK: invalidate currently selected song in the case that it
// cannot be played due to lack of stages remaining
// checking for event mode shouldn't be necessary here
@@ -236,7 +261,7 @@ bool MusicWheel::SelectSongOrCourse()
return true;
// Select the first selectable song based on the sort order...
vector<WheelItemData> &wiWheelItems = m_WheelItemDatas[GAMESTATE->m_SortOrder];
vector<WheelItemData> &wiWheelItems = m_WheelItemDatas[m_SortOrder];
for( unsigned i = 0; i < wiWheelItems.size(); i++ )
{
if( wiWheelItems[i].m_pSong )
@@ -271,7 +296,7 @@ bool MusicWheel::SelectSong( Song *p )
return false;
unsigned i;
vector<WheelItemData> &from = m_WheelItemDatas[GAMESTATE->m_SortOrder];
vector<WheelItemData> &from = m_WheelItemDatas[m_SortOrder];
for( i=0; i<from.size(); i++ )
{
if( from[i].m_pSong == p )
@@ -301,7 +326,7 @@ bool MusicWheel::SelectCourse( Course *p )
GAMESTATE->m_pCurCourse = p;
unsigned i;
vector<WheelItemData> &from = m_WheelItemDatas[GAMESTATE->m_SortOrder];
vector<WheelItemData> &from = m_WheelItemDatas[m_SortOrder];
for( i=0; i<from.size(); i++ )
{
if( from[i].m_pCourse == p )
@@ -324,26 +349,17 @@ bool MusicWheel::SelectCourse( Course *p )
return true;
}
static bool DescribesCurrentModeForAllPlayersAndSort( const GameCommand &gc, SortOrder so )
bool MusicWheel::SelectModeMenuItem()
{
const SortOrder OldSortOrder = GAMESTATE->m_SortOrder;
GAMESTATE->m_SortOrder = so;
bool bRet = gc.DescribesCurrentModeForAllPlayers();
GAMESTATE->m_SortOrder = OldSortOrder;
return bRet;
}
bool MusicWheel::SelectSort( SortOrder so )
{
if(so == SORT_INVALID)
return false;
const vector<WheelItemData> &from = m_WheelItemDatas[GAMESTATE->m_SortOrder];
/* Select the last-chosen option. */
const vector<WheelItemData> &from = m_WheelItemDatas[m_SortOrder];
unsigned i;
for( i=0; i<from.size(); i++ )
if( DescribesCurrentModeForAllPlayersAndSort( from[i].m_Action, so) )
{
const GameCommand &gc = from[i].m_Action;
if( gc.m_sName == m_sLastModeMenuItem )
break;
}
if( i == from.size() )
return false;
@@ -352,7 +368,7 @@ bool MusicWheel::SelectSort( SortOrder so )
for( i=0; i<m_CurWheelItemData.size(); i++ )
{
if( !DescribesCurrentModeForAllPlayersAndSort( m_CurWheelItemData[i]->m_Action, so) )
if( m_CurWheelItemData[i]->m_Action.m_sName != m_sLastModeMenuItem )
continue;
m_iSelection = i; // select it
break;
@@ -437,11 +453,10 @@ void MusicWheel::BuildWheelItemDatas( vector<WheelItemData> &arrayWheelItemDatas
{
switch( so )
{
case SORT_SORT_MENU:
case SORT_MODE_MENU:
{
arrayWheelItemDatas.clear(); // clear out the previous wheel items
CString sNames = (so==SORT_SORT_MENU) ? SORT_MENU_CHOICE_NAMES : MODE_MENU_CHOICE_NAMES;
CString sNames = MODE_MENU_CHOICE_NAMES;
vector<CString> vsNames;
split( sNames, ",", vsNames );
for( unsigned i=0; i<vsNames.size(); ++i )
@@ -939,30 +954,29 @@ void MusicWheel::Update( float fDeltaTime )
SCREENMAN->PostMessageToTopScreen( SM_SortOrderChanged, 0 );
SetOpenGroup(SongUtil::GetSectionNameFromSongAndSort( pPrevSelectedSong, GAMESTATE->m_SortOrder ));
SetOpenGroup(SongUtil::GetSectionNameFromSongAndSort( pPrevSelectedSong, m_SortOrder ));
m_iSelection = 0;
//
// Select the previously selected item
//
switch( GAMESTATE->m_SortOrder )
switch( m_SortOrder )
{
default:
// Look for the last selected song or course
SelectSongOrCourse();
break;
case SORT_SORT_MENU:
case SORT_MODE_MENU:
SelectSort( m_LastSortOrder );
SelectModeMenuItem();
break;
}
//
// Change difficulty for sorts by meter
// Change difficulty for sorts by meter - XXX: with GameCommand?
//
Difficulty dc = DIFFICULTY_INVALID;
switch( GAMESTATE->m_SortOrder )
switch( m_SortOrder )
{
case SORT_EASY_METER: dc = DIFFICULTY_EASY; break;
case SORT_MEDIUM_METER: dc = DIFFICULTY_MEDIUM; break;
@@ -1142,18 +1156,12 @@ void MusicWheel::ChangeMusic(int dist)
bool MusicWheel::ChangeSort( SortOrder new_so ) // return true if change successful
{
ASSERT( new_so < NUM_SORT_ORDERS );
if( GAMESTATE->m_SortOrder == new_so )
if( m_SortOrder == new_so )
return false;
/* Don't change to SORT_SORT_MENU or SORT_MODE_MENU if they don't have at least
* two choices. */
switch( new_so )
{
case SORT_SORT_MENU:
case SORT_MODE_MENU:
if( m_WheelItemDatas[new_so].size() < 2 )
return false;
}
/* Don't change to SORT_MODE_MENU if it doesn't have at least two choices. */
if( new_so == SORT_MODE_MENU && m_WheelItemDatas[new_so].size() < 2 )
return false;
switch( m_WheelState )
{
@@ -1170,8 +1178,11 @@ bool MusicWheel::ChangeSort( SortOrder new_so ) // return true if change success
TweenOffScreen(true);
m_LastSortOrder = GAMESTATE->m_SortOrder;
GAMESTATE->m_SortOrder = new_so;
/* Save the new preference. */
if( IsSongSort(new_so) )
GAMESTATE->m_PreferredSortOrder = new_so;
m_SortOrder = new_so;
m_WheelState = STATE_FLYING_OFF_BEFORE_NEXT_SORT;
return true;
@@ -1180,16 +1191,12 @@ bool MusicWheel::ChangeSort( SortOrder new_so ) // return true if change success
bool MusicWheel::NextSort() // return true if change successful
{
// don't allow NextSort when on the sort menu or mode menu
switch( GAMESTATE->m_SortOrder )
{
case SORT_SORT_MENU:
case SORT_MODE_MENU:
if( m_SortOrder == SORT_MODE_MENU )
return false;
}
// find the index of the current sort
int cur = 0;
while( cur < int(ARRAYSIZE(SORT_ORDERS)) && SORT_ORDERS[cur] != GAMESTATE->m_SortOrder )
while( cur < int(ARRAYSIZE(SORT_ORDERS)) && SORT_ORDERS[cur] != m_SortOrder )
++cur;
// move to the next sort with wrapping
@@ -1263,11 +1270,9 @@ bool MusicWheel::Select() // return true if this selection ends the screen
LOG->Trace("New sort order selected: %s - %s",
m_CurWheelItemData[m_iSelection]->m_sLabel.c_str(),
SortOrderToString(m_CurWheelItemData[m_iSelection]->m_Action.m_SortOrder).c_str() );
ChangeSort( m_CurWheelItemData[m_iSelection]->m_Action.m_SortOrder );
// Do this after ChangeSort so that be don't mess with
// GAMESTATE->m_SortOrder before ChangeSort gets a crack at it.
m_CurWheelItemData[m_iSelection]->m_Action.ApplyToAllPlayers();
ChangeSort( GAMESTATE->m_PreferredSortOrder );
m_sLastModeMenuItem = m_CurWheelItemData[m_iSelection]->m_Action.m_sName;
return false;
default:
ASSERT(0);
@@ -1307,7 +1312,7 @@ void MusicWheel::StartRandom()
void MusicWheel::SetOpenGroup(CString group, SortOrder so)
{
if( so == SORT_INVALID)
so = GAMESTATE->m_SortOrder;
so = m_SortOrder;
m_sExpandedSectionName = group;
@@ -1544,7 +1549,7 @@ Song *MusicWheel::GetPreferredSelectionForRandomOrPortal()
}
CString sPreferredGroup = m_sExpandedSectionName;
vector<WheelItemData> &wid = m_WheelItemDatas[GAMESTATE->m_SortOrder];
vector<WheelItemData> &wid = m_WheelItemDatas[m_SortOrder];
StepsType st = GAMESTATE->GetCurrentStyle()->m_StepsType;