"GroupName" -> "SongGroup" to make room for CourseGroup
replace checks for "cvs" with a call to StripCvs()
m_Rows -> m_pRows
broadcast on preferred group changes
This commit is contained in:
Chris Danford
2005-06-23 08:05:09 +00:00
parent f881b0bf4d
commit 2a6dcba6e8
33 changed files with 212 additions and 190 deletions
+2 -4
View File
@@ -19,11 +19,9 @@ void AnnouncerManager::GetAnnouncerNames( CStringArray& AddTo )
{ {
GetDirListing( ANNOUNCERS_DIR+"*", AddTo, true ); GetDirListing( ANNOUNCERS_DIR+"*", AddTo, true );
// strip out the folder called "CVS" and EMPTY_ANNOUNCER_NAME StripCvs( AddTo );
for( int i=AddTo.size()-1; i>=0; i-- )
if( !stricmp( AddTo[i], "cvs" ) )
AddTo.erase(AddTo.begin()+i, AddTo.begin()+i+1 );
// strip out the empty announcer folder
for( int i=AddTo.size()-1; i>=0; i-- ) for( int i=AddTo.size()-1; i>=0; i-- )
if( !stricmp( AddTo[i], EMPTY_ANNOUNCER_NAME ) ) if( !stricmp( AddTo[i], EMPTY_ANNOUNCER_NAME ) )
AddTo.erase(AddTo.begin()+i, AddTo.begin()+i+1 ); AddTo.erase(AddTo.begin()+i, AddTo.begin()+i+1 );
+2 -2
View File
@@ -100,9 +100,9 @@ void Banner::LoadMode()
m_bScrolling = false; m_bScrolling = false;
} }
void Banner::LoadFromGroup( CString sGroupName ) void Banner::LoadFromSongGroup( CString sSongGroup )
{ {
CString sGroupBannerPath = SONGMAN->GetGroupBannerPath( sGroupName ); CString sGroupBannerPath = SONGMAN->GetSongGroupBannerPath( sSongGroup );
if( sGroupBannerPath != "" ) Load( sGroupBannerPath ); if( sGroupBannerPath != "" ) Load( sGroupBannerPath );
else LoadFallback(); else LoadFallback();
m_bScrolling = false; m_bScrolling = false;
+1 -1
View File
@@ -22,7 +22,7 @@ public:
void LoadFromSong( Song* pSong ); // NULL means no song void LoadFromSong( Song* pSong ); // NULL means no song
void LoadAllMusic(); void LoadAllMusic();
void LoadMode(); void LoadMode();
void LoadFromGroup( CString sGroupName ); void LoadFromSongGroup( CString sSongGroup );
void LoadFromCourse( Course* pCourse ); void LoadFromCourse( Course* pCourse );
void LoadCardFromCharacter( Character* pCharacter ); void LoadCardFromCharacter( Character* pCharacter );
void LoadIconFromCharacter( Character* pCharacter ); void LoadIconFromCharacter( Character* pCharacter );
+1 -1
View File
@@ -60,7 +60,7 @@ void SaveCatalogXml( LoadingWindow *loading_window )
int iTotalSongs = 0; int iTotalSongs = 0;
int iTotalSteps = 0; int iTotalSteps = 0;
vector<CString> vsGroups; vector<CString> vsGroups;
SONGMAN->GetGroupNames( vsGroups ); SONGMAN->GetSongGroupNames( vsGroups );
FOREACH_CONST( CString, vsGroups, sGroup ) FOREACH_CONST( CString, vsGroups, sGroup )
{ {
XNode* p1 = pNumSongsByGroup->AppendChild( "Group" ); XNode* p1 = pNumSongsByGroup->AppendChild( "Group" );
+5 -3
View File
@@ -242,7 +242,7 @@ void Course::LoadFromCRSFile( CString sPath )
LOG->Warn( "Course file '%s' contains a random_within_group entry '%s' that is invalid. " LOG->Warn( "Course file '%s' contains a random_within_group entry '%s' that is invalid. "
"Song should be in the format '<group>/*'.", "Song should be in the format '<group>/*'.",
sPath.c_str(), sSong.c_str()); sPath.c_str(), sSong.c_str());
if( !SONGMAN->DoesGroupExist(new_entry.group_name) ) if( !SONGMAN->DoesSongGroupExist(new_entry.group_name) )
{ {
/* XXX: We need a place to put "user warnings". This is too loud for info.txt-- /* XXX: We need a place to put "user warnings". This is too loud for info.txt--
* it obscures important warnings--and regular users never look there, anyway. */ * it obscures important warnings--and regular users never look there, anyway. */
@@ -545,9 +545,11 @@ void Course::AutogenEndlessFromGroup( CString sGroupName, Difficulty diff )
{ {
m_sMainTitle = "All Songs"; m_sMainTitle = "All Songs";
// m_sBannerPath = ""; // XXX // m_sBannerPath = ""; // XXX
} else { }
else
{
m_sMainTitle = SONGMAN->ShortenGroupName( sGroupName ); m_sMainTitle = SONGMAN->ShortenGroupName( sGroupName );
m_sBannerPath = SONGMAN->GetGroupBannerPath( sGroupName ); m_sBannerPath = SONGMAN->GetSongGroupBannerPath( sGroupName );
} }
// We want multiple songs, so we can try to prevent repeats during // We want multiple songs, so we can try to prevent repeats during
+1 -1
View File
@@ -57,7 +57,7 @@ EditCoursesSongMenu::EditCoursesSongMenu()
m_soundChangeValue.Load( THEME->GetPathS("EditCoursesSongMenu","value") ); m_soundChangeValue.Load( THEME->GetPathS("EditCoursesSongMenu","value") );
// fill in data structures // fill in data structures
SONGMAN->GetGroupNames( m_aGroups ); SONGMAN->GetSongGroupNames( m_aGroups );
m_SelectedRow = (Row)0; m_SelectedRow = (Row)0;
} }
+2 -2
View File
@@ -79,7 +79,7 @@ static void GetSongsToShowForGroup( const CString &sGroup, vector<Song*> &vpSong
static void GetGroupsToShow( vector<CString> &vsGroupsOut ) static void GetGroupsToShow( vector<CString> &vsGroupsOut )
{ {
vsGroupsOut.clear(); vsGroupsOut.clear();
SONGMAN->GetGroupNames( vsGroupsOut ); SONGMAN->GetSongGroupNames( vsGroupsOut );
for( int i = vsGroupsOut.size()-1; i>=0; i-- ) for( int i = vsGroupsOut.size()-1; i>=0; i-- )
{ {
const CString &sGroup = vsGroupsOut[i]; const CString &sGroup = vsGroupsOut[i];
@@ -320,7 +320,7 @@ void EditMenu::OnRowValueChanged( EditMenuRow row )
{ {
case ROW_GROUP: case ROW_GROUP:
m_textValue[ROW_GROUP].SetText( SONGMAN->ShortenGroupName(GetSelectedGroup()) ); m_textValue[ROW_GROUP].SetText( SONGMAN->ShortenGroupName(GetSelectedGroup()) );
m_GroupBanner.LoadFromGroup( GetSelectedGroup() ); m_GroupBanner.LoadFromSongGroup( GetSelectedGroup() );
m_GroupBanner.ScaleToClipped( GROUP_BANNER_WIDTH, GROUP_BANNER_HEIGHT ); m_GroupBanner.ScaleToClipped( GROUP_BANNER_WIDTH, GROUP_BANNER_HEIGHT );
m_pSongs.clear(); m_pSongs.clear();
GetSongsToShowForGroup( GetSelectedGroup(), m_pSongs ); GetSongsToShowForGroup( GetSelectedGroup(), m_pSongs );
+2 -2
View File
@@ -178,9 +178,9 @@ void FadingBanner::LoadMode()
m_Banner[m_iIndexLatest].LoadMode(); m_Banner[m_iIndexLatest].LoadMode();
} }
void FadingBanner::LoadFromGroup( CString sGroupName ) void FadingBanner::LoadFromSongGroup( CString sSongGroup )
{ {
const CString sGroupBannerPath = SONGMAN->GetGroupBannerPath( sGroupName ); const CString sGroupBannerPath = SONGMAN->GetSongGroupBannerPath( sSongGroup );
LoadFromCachedBanner( sGroupBannerPath ); LoadFromCachedBanner( sGroupBannerPath );
} }
+1 -1
View File
@@ -20,7 +20,7 @@ public:
void LoadFromSong( const Song* pSong ); // NULL means no song void LoadFromSong( const Song* pSong ); // NULL means no song
void LoadAllMusic(); void LoadAllMusic();
void LoadMode(); void LoadMode();
void LoadFromGroup( CString sGroupName ); void LoadFromSongGroup( CString sSongGroup );
void LoadFromCourse( const Course* pCourse ); void LoadFromCourse( const Course* pCourse );
void LoadRoulette(); void LoadRoulette();
void LoadRandom(); void LoadRandom();
+1 -1
View File
@@ -761,7 +761,7 @@ void GameCommand::ApplySelf( const vector<PlayerNumber> &vpns ) const
for( map<CString,CString>::const_iterator i = m_SetEnv.begin(); i != m_SetEnv.end(); i++ ) for( map<CString,CString>::const_iterator i = m_SetEnv.begin(); i != m_SetEnv.end(); i++ )
GAMESTATE->m_mapEnv[ i->first ] = i->second; GAMESTATE->m_mapEnv[ i->first ] = i->second;
if( !m_sSongGroup.empty() ) if( !m_sSongGroup.empty() )
GAMESTATE->m_sPreferredSongGroup = m_sSongGroup; GAMESTATE->m_sPreferredSongGroup.Set( m_sSongGroup );
if( m_SortOrder != SORT_INVALID ) if( m_SortOrder != SORT_INVALID )
GAMESTATE->m_PreferredSortOrder = m_SortOrder; GAMESTATE->m_PreferredSortOrder = m_SortOrder;
if( m_iUnlockIndex != -1 ) if( m_iUnlockIndex != -1 )
+6 -4
View File
@@ -64,6 +64,8 @@ Song* GetDefaultSong()
GameState::GameState() : GameState::GameState() :
m_pCurStyle( MESSAGE_CURRENT_STYLE_CHANGED ), m_pCurStyle( MESSAGE_CURRENT_STYLE_CHANGED ),
m_sPreferredSongGroup( MESSAGE_PREFERRED_SONG_GROUP_CHANGED ),
m_sPreferredCourseGroup(MESSAGE_PREFERRED_COURSE_GROUP_CHANGED ),
m_PreferredCourseDifficulty( MESSAGE_EDIT_PREFERRED_COURSE_DIFFICULTY_P1_CHANGED ), m_PreferredCourseDifficulty( MESSAGE_EDIT_PREFERRED_COURSE_DIFFICULTY_P1_CHANGED ),
m_PreferredDifficulty( MESSAGE_EDIT_PREFERRED_DIFFICULTY_P1_CHANGED ), m_PreferredDifficulty( MESSAGE_EDIT_PREFERRED_DIFFICULTY_P1_CHANGED ),
m_pCurSong( MESSAGE_CURRENT_SONG_CHANGED ), m_pCurSong( MESSAGE_CURRENT_SONG_CHANGED ),
@@ -167,7 +169,8 @@ void GameState::Reset()
// m_iCoins = 0; // don't reset coin count! // m_iCoins = 0; // don't reset coin count!
m_MasterPlayerNumber = PLAYER_INVALID; m_MasterPlayerNumber = PLAYER_INVALID;
m_mapEnv.clear(); m_mapEnv.clear();
m_sPreferredSongGroup = GROUP_ALL_MUSIC; m_sPreferredSongGroup.Set( GROUP_ALL_MUSIC );
m_sPreferredCourseGroup.Set( "" );
m_bChangedFailTypeOnScreenSongOptions = false; m_bChangedFailTypeOnScreenSongOptions = false;
FOREACH_PlayerNumber( p ) FOREACH_PlayerNumber( p )
{ {
@@ -610,6 +613,8 @@ void GameState::ReloadCharacters()
CStringArray as; CStringArray as;
GetDirListing( CHARACTERS_DIR "*", as, true, true ); GetDirListing( CHARACTERS_DIR "*", as, true, true );
StripCvs( as );
bool FoundDefault = false; bool FoundDefault = false;
for( unsigned i=0; i<as.size(); i++ ) for( unsigned i=0; i<as.size(); i++ )
{ {
@@ -617,9 +622,6 @@ void GameState::ReloadCharacters()
splitpath(as[i], sDummy, sCharName, sDummy); splitpath(as[i], sDummy, sCharName, sDummy);
sCharName.MakeLower(); sCharName.MakeLower();
if( sCharName == "cvs" ) // the directory called "CVS"
continue; // ignore it
if( sCharName.CompareNoCase("default")==0 ) if( sCharName.CompareNoCase("default")==0 )
FoundDefault = true; FoundDefault = true;
+2 -1
View File
@@ -101,7 +101,8 @@ public:
bool ShowMarvelous() const; bool ShowMarvelous() const;
CString m_sLoadingMessage; // used in loading screen CString m_sLoadingMessage; // used in loading screen
CString m_sPreferredSongGroup; // GROUP_ALL_MUSIC denotes no preferred group BroadcastOnChange<CString> m_sPreferredSongGroup; // GROUP_ALL_MUSIC denotes no preferred group
BroadcastOnChange<CString> m_sPreferredCourseGroup;
bool m_bChangedFailTypeOnScreenSongOptions; // true if FailType was changed in the song options screen bool m_bChangedFailTypeOnScreenSongOptions; // true if FailType was changed in the song options screen
BroadcastOnChange1D<Difficulty,NUM_PLAYERS> m_PreferredDifficulty; BroadcastOnChange1D<Difficulty,NUM_PLAYERS> m_PreferredDifficulty;
SortOrder m_SortOrder; // set by MusicWheel SortOrder m_SortOrder; // set by MusicWheel
+2
View File
@@ -48,6 +48,8 @@ static const CString MessageNames[] = {
"PlayersFinalized", "PlayersFinalized",
"AssistTickChanged", "AssistTickChanged",
"AutosyncChanged", "AutosyncChanged",
"PreferredSongGroupChanged",
"PreferredCourseGroupChanged",
}; };
XToString( Message, NUM_MESSAGES ); XToString( Message, NUM_MESSAGES );
+5 -1
View File
@@ -56,7 +56,9 @@ enum Message
MESSAGE_PLAYERS_FINALIZED, MESSAGE_PLAYERS_FINALIZED,
MESSAGE_ASSIST_TICK_CHANGED, MESSAGE_ASSIST_TICK_CHANGED,
MESSAGE_AUTOSYNC_CHANGED, MESSAGE_AUTOSYNC_CHANGED,
NUM_MESSAGES, MESSAGE_PREFERRED_SONG_GROUP_CHANGED,
MESSAGE_PREFERRED_COURSE_GROUP_CHANGED,
NUM_MESSAGES, // leave this at the end
MESSAGE_INVALID MESSAGE_INVALID
}; };
const CString& MessageToString( Message m ); const CString& MessageToString( Message m );
@@ -96,6 +98,8 @@ public:
const T Get() const { return val; } const T Get() const { return val; }
void Set( T t ) { val = t; MESSAGEMAN->Broadcast( MessageToString(mSendWhenChanged) ); } void Set( T t ) { val = t; MESSAGEMAN->Broadcast( MessageToString(mSendWhenChanged) ); }
operator T () const { return val; } operator T () const { return val; }
bool operator == ( const T &other ) const { return val == other; }
bool operator != ( const T &other ) const { return val != other; }
}; };
template<class T, int N> template<class T, int N>
+1 -1
View File
@@ -117,7 +117,7 @@ void MusicWheel::Load( CString sType )
if( GAMESTATE->m_sPreferredSongGroup == GROUP_ALL_MUSIC && !PREFSMAN->m_bPickExtraStage ) if( GAMESTATE->m_sPreferredSongGroup == GROUP_ALL_MUSIC && !PREFSMAN->m_bPickExtraStage )
{ {
ASSERT(GAMESTATE->m_pCurSong); ASSERT(GAMESTATE->m_pCurSong);
GAMESTATE->m_sPreferredSongGroup = GAMESTATE->m_pCurSong->m_sGroupName; GAMESTATE->m_sPreferredSongGroup.Set( GAMESTATE->m_pCurSong->m_sGroupName );
} }
Song* pSong; Song* pSong;
+2 -9
View File
@@ -43,10 +43,7 @@ void NoteSkinManager::RefreshNoteSkinData( const Game* pGame )
CStringArray asNoteSkinNames; CStringArray asNoteSkinNames;
GetDirListing( sBaseSkinFolder + "*", asNoteSkinNames, true ); GetDirListing( sBaseSkinFolder + "*", asNoteSkinNames, true );
// strip out "CVS" StripCvs( asNoteSkinNames );
for( int i=asNoteSkinNames.size()-1; i>=0; i-- )
if( 0 == stricmp("cvs", asNoteSkinNames[i]) )
asNoteSkinNames.erase( asNoteSkinNames.begin()+i, asNoteSkinNames.begin()+i+1 );
m_mapNameToData.clear(); m_mapNameToData.clear();
for( unsigned j=0; j<asNoteSkinNames.size(); j++ ) for( unsigned j=0; j<asNoteSkinNames.size(); j++ )
@@ -119,11 +116,7 @@ void NoteSkinManager::GetNoteSkinNames( const Game* pGame, CStringArray &AddTo,
{ {
CString sBaseSkinFolder = NOTESKINS_DIR + pGame->m_szName + "/"; CString sBaseSkinFolder = NOTESKINS_DIR + pGame->m_szName + "/";
GetDirListing( sBaseSkinFolder + "*", AddTo, true ); GetDirListing( sBaseSkinFolder + "*", AddTo, true );
StripCvs( AddTo );
// strip out "CVS"
for( int i=AddTo.size()-1; i>=0; i-- )
if( 0 == stricmp("cvs", AddTo[i]) )
AddTo.erase( AddTo.begin()+i, AddTo.begin()+i+1 );
} }
/* Move "default" to the front if it exists. */ /* Move "default" to the front if it exists. */
+4 -4
View File
@@ -412,9 +412,9 @@ public:
defOut.name = "Group"; defOut.name = "Group";
Default.m_sSongGroup = GROUP_ALL_MUSIC; Default.m_sSongGroup = GROUP_ALL_MUSIC;
vector<CString> vGroups; vector<CString> vSongGroups;
SONGMAN->GetGroupNames( vGroups ); SONGMAN->GetSongGroupNames( vSongGroups );
ASSERT( vGroups.size() ); ASSERT( vSongGroups.size() );
{ {
defOut.choices.push_back( "AllGroups" ); defOut.choices.push_back( "AllGroups" );
@@ -423,7 +423,7 @@ public:
ListEntries.push_back( mc ); ListEntries.push_back( mc );
} }
FOREACH_CONST( CString, vGroups, g ) FOREACH_CONST( CString, vSongGroups, g )
{ {
defOut.choices.push_back( *g ); defOut.choices.push_back( *g );
GameCommand mc; GameCommand mc;
+9
View File
@@ -658,6 +658,15 @@ void StripCrnl(CString &s)
s.erase(s.size()-1); s.erase(s.size()-1);
} }
void StripCvs( vector<CString> &vs )
{
for( unsigned i=0; i<vs.size(); i++ )
{
if( vs[i].Right(3).CompareNoCase("CVS") == 0 )
vs.erase( vs.begin()+i );
}
}
/* path is a .redir pathname. Read it and return the real one. */ /* path is a .redir pathname. Read it and return the real one. */
CString DerefRedir(const CString &_path) CString DerefRedir(const CString &_path)
{ {
+2
View File
@@ -309,6 +309,8 @@ void TrimLeft(CString &str, const char *s = "\r\n\t ");
void TrimRight(CString &str, const char *s = "\r\n\t "); void TrimRight(CString &str, const char *s = "\r\n\t ");
void StripCrnl(CString &s); void StripCrnl(CString &s);
void StripCvs( vector<CString> &vs ); // remove all items that end in "cvs"
CString DerefRedir( const CString &sPath ); CString DerefRedir( const CString &sPath );
bool GetFileContents( const CString &sPath, CString &sOut, bool bOneLine = false ); bool GetFileContents( const CString &sPath, CString &sOut, bool bOneLine = false );
+5 -5
View File
@@ -92,13 +92,13 @@ void ScreenMiniMenu::OnChange( PlayerNumber pn )
vector<PlayerNumber> vpns; vector<PlayerNumber> vpns;
vpns.push_back( GAMESTATE->m_MasterPlayerNumber ); vpns.push_back( GAMESTATE->m_MasterPlayerNumber );
for( unsigned i=0; i<m_Rows.size(); i++ ) for( unsigned i=0; i<m_pRows.size(); i++ )
ExportOptions( i, vpns ); ExportOptions( i, vpns );
for( unsigned i=0; i<m_Rows.size(); i++ ) for( unsigned i=0; i<m_pRows.size(); i++ )
{ {
MenuRow &mr = m_vMenuRows[i]; MenuRow &mr = m_vMenuRows[i];
OptionRow &optrow = *m_Rows[i]; OptionRow &optrow = *m_pRows[i];
if( mr.pfnEnabled ) if( mr.pfnEnabled )
{ {
optrow.GetRowDef().m_vEnabledForPlayers.clear(); optrow.GetRowDef().m_vEnabledForPlayers.clear();
@@ -111,7 +111,7 @@ void ScreenMiniMenu::OnChange( PlayerNumber pn )
void ScreenMiniMenu::ImportOptions( int r, const vector<PlayerNumber> &vpns ) void ScreenMiniMenu::ImportOptions( int r, const vector<PlayerNumber> &vpns )
{ {
OptionRow &optrow = *m_Rows[r]; OptionRow &optrow = *m_pRows[r];
MenuRow &mr = m_vMenuRows[r]; MenuRow &mr = m_vMenuRows[r];
if( !mr.choices.empty() ) if( !mr.choices.empty() )
optrow.SetOneSharedSelection( mr.iDefaultChoice ); optrow.SetOneSharedSelection( mr.iDefaultChoice );
@@ -122,7 +122,7 @@ void ScreenMiniMenu::ExportOptions( int r, const vector<PlayerNumber> &vpns )
if( r == GetCurrentRow() ) if( r == GetCurrentRow() )
s_iLastRowCode = m_vMenuRows[r].iRowCode; s_iLastRowCode = m_vMenuRows[r].iRowCode;
s_viLastAnswers.resize( m_vMenuRows.size() ); s_viLastAnswers.resize( m_vMenuRows.size() );
s_viLastAnswers[r] = m_Rows[r]->GetOneSharedSelection( true ); s_viLastAnswers[r] = m_pRows[r]->GetOneSharedSelection( true );
} }
void ScreenMiniMenu::GoToNextScreen() void ScreenMiniMenu::GoToNextScreen()
+1 -1
View File
@@ -132,7 +132,7 @@ void ScreenNetworkOptions::MenuStart( PlayerNumber pn, const InputEventType type
} }
break; break;
case PO_SERVER: case PO_SERVER:
switch (m_Rows[GetCurrentRow()]->GetOneSharedSelection()) switch( m_pRows[GetCurrentRow()]->GetOneSharedSelection() )
{ {
case NO_START_SERVER: case NO_START_SERVER:
if (!NSMAN->isLanServer) if (!NSMAN->isLanServer)
+52 -52
View File
@@ -130,7 +130,7 @@ void ScreenOptions::Init()
void ScreenOptions::LoadOptionIcon( PlayerNumber pn, int iRow, CString sText ) void ScreenOptions::LoadOptionIcon( PlayerNumber pn, int iRow, CString sText )
{ {
m_Rows[iRow]->LoadOptionIcon( pn, sText ); m_pRows[iRow]->LoadOptionIcon( pn, sText );
} }
void ScreenOptions::InitMenu( InputMode im, const vector<OptionRowDefinition> &vDefs, const vector<OptionRowHandler*> &vHands ) void ScreenOptions::InitMenu( InputMode im, const vector<OptionRowDefinition> &vDefs, const vector<OptionRowHandler*> &vHands )
@@ -143,8 +143,8 @@ void ScreenOptions::InitMenu( InputMode im, const vector<OptionRowDefinition> &v
for( unsigned r=0; r<vDefs.size(); r++ ) // foreach row for( unsigned r=0; r<vDefs.size(); r++ ) // foreach row
{ {
m_Rows.push_back( new OptionRow() ); m_pRows.push_back( new OptionRow() );
OptionRow &row = *m_Rows.back(); OptionRow &row = *m_pRows.back();
const OptionRowDefinition &def = vDefs[r]; const OptionRowDefinition &def = vDefs[r];
OptionRowHandler* hand = vHands[r]; OptionRowHandler* hand = vHands[r];
@@ -186,17 +186,17 @@ void ScreenOptions::InitMenu( InputMode im, const vector<OptionRowDefinition> &v
m_framePage.AddChild( &m_Cursor[p] ); m_framePage.AddChild( &m_Cursor[p] );
} }
for( unsigned r=0; r<m_Rows.size(); r++ ) // foreach row for( unsigned r=0; r<m_pRows.size(); r++ ) // foreach row
{ {
OptionRow &row = *m_Rows[r]; OptionRow &row = *m_pRows[r];
m_framePage.AddChild( &row ); m_framePage.AddChild( &row );
} }
if( SHOW_EXIT_ROW ) if( SHOW_EXIT_ROW )
{ {
// TRICKY: Add "EXIT" item // TRICKY: Add "EXIT" item
m_Rows.push_back( new OptionRow() ); m_pRows.push_back( new OptionRow() );
OptionRow &row = *m_Rows.back(); OptionRow &row = *m_pRows.back();
row.LoadMetrics( m_sName ); row.LoadMetrics( m_sName );
row.LoadExit(); row.LoadExit();
m_framePage.AddChild( &row ); m_framePage.AddChild( &row );
@@ -254,7 +254,7 @@ void ScreenOptions::InitMenu( InputMode im, const vector<OptionRowDefinition> &v
} }
// poke once at all the explanation metrics so that we catch missing ones early // poke once at all the explanation metrics so that we catch missing ones early
for( int r=0; r<(int)m_Rows.size(); r++ ) // foreach row for( int r=0; r<(int)m_pRows.size(); r++ ) // foreach row
{ {
GetExplanationText( r ); GetExplanationText( r );
} }
@@ -262,9 +262,9 @@ void ScreenOptions::InitMenu( InputMode im, const vector<OptionRowDefinition> &v
// put focus on the first enabled row // put focus on the first enabled row
FOREACH_PlayerNumber( p ) FOREACH_PlayerNumber( p )
{ {
for( unsigned r=0; r<m_Rows.size(); r++ ) for( unsigned r=0; r<m_pRows.size(); r++ )
{ {
const OptionRow &row = *m_Rows[r]; const OptionRow &row = *m_pRows[r];
if( row.GetRowDef().IsEnabledForPlayer(p) ) if( row.GetRowDef().IsEnabledForPlayer(p) )
{ {
m_iCurrentRow[p] = r; m_iCurrentRow[p] = r;
@@ -296,9 +296,9 @@ void ScreenOptions::InitMenu( InputMode im, const vector<OptionRowDefinition> &v
/* It's tweening into position, but on the initial tween-in we only want to /* It's tweening into position, but on the initial tween-in we only want to
* tween in the whole page at once. Since the tweens are nontrivial, it's * tween in the whole page at once. Since the tweens are nontrivial, it's
* easiest to queue the tweens and then force them to finish. */ * easiest to queue the tweens and then force them to finish. */
for( int r=0; r<(int) m_Rows.size(); r++ ) // foreach options line for( int r=0; r<(int) m_pRows.size(); r++ ) // foreach options line
{ {
OptionRow &row = *m_Rows[r]; OptionRow &row = *m_pRows[r];
row.FinishTweening(); row.FinishTweening();
} }
@@ -310,13 +310,13 @@ void ScreenOptions::InitMenu( InputMode im, const vector<OptionRowDefinition> &v
ScreenOptions::~ScreenOptions() ScreenOptions::~ScreenOptions()
{ {
LOG->Trace( "ScreenOptions::~ScreenOptions()" ); LOG->Trace( "ScreenOptions::~ScreenOptions()" );
for( unsigned i=0; i<m_Rows.size(); i++ ) for( unsigned i=0; i<m_pRows.size(); i++ )
SAFE_DELETE( m_Rows[i] ); SAFE_DELETE( m_pRows[i] );
} }
CString ScreenOptions::GetExplanationText( int iRow ) const CString ScreenOptions::GetExplanationText( int iRow ) const
{ {
OptionRow &row = *m_Rows[iRow]; OptionRow &row = *m_pRows[iRow];
CString sLineName = row.GetRowDef().name; CString sLineName = row.GetRowDef().name;
ASSERT( !sLineName.empty() ); ASSERT( !sLineName.empty() );
@@ -325,36 +325,36 @@ CString ScreenOptions::GetExplanationText( int iRow ) const
BitmapText &ScreenOptions::GetTextItemForRow( PlayerNumber pn, int iRow, int iChoiceOnRow ) BitmapText &ScreenOptions::GetTextItemForRow( PlayerNumber pn, int iRow, int iChoiceOnRow )
{ {
ASSERT_M( iRow < (int)m_Rows.size(), ssprintf("%i < %i", iRow, (int)m_Rows.size() ) ); ASSERT_M( iRow < (int)m_pRows.size(), ssprintf("%i < %i", iRow, (int)m_pRows.size() ) );
OptionRow &row = *m_Rows[iRow]; OptionRow &row = *m_pRows[iRow];
return row.GetTextItemForRow( pn, iChoiceOnRow ); return row.GetTextItemForRow( pn, iChoiceOnRow );
} }
void ScreenOptions::GetWidthXY( PlayerNumber pn, int iRow, int iChoiceOnRow, int &iWidthOut, int &iXOut, int &iYOut ) void ScreenOptions::GetWidthXY( PlayerNumber pn, int iRow, int iChoiceOnRow, int &iWidthOut, int &iXOut, int &iYOut )
{ {
ASSERT_M( iRow < (int)m_Rows.size(), ssprintf("%i < %i", iRow, (int)m_Rows.size() ) ); ASSERT_M( iRow < (int)m_pRows.size(), ssprintf("%i < %i", iRow, (int)m_pRows.size() ) );
OptionRow &row = *m_Rows[iRow]; OptionRow &row = *m_pRows[iRow];
row.GetWidthXY( pn, iChoiceOnRow, iWidthOut, iXOut, iYOut ); row.GetWidthXY( pn, iChoiceOnRow, iWidthOut, iXOut, iYOut );
} }
void ScreenOptions::PositionUnderlines( int r, PlayerNumber pn ) void ScreenOptions::PositionUnderlines( int r, PlayerNumber pn )
{ {
OptionRow &row = *m_Rows[r]; OptionRow &row = *m_pRows[r];
row.PositionUnderlines( pn ); row.PositionUnderlines( pn );
} }
void ScreenOptions::PositionAllUnderlines() void ScreenOptions::PositionAllUnderlines()
{ {
for( unsigned r=0; r<m_Rows.size(); r++ ) for( unsigned r=0; r<m_pRows.size(); r++ )
FOREACH_HumanPlayer( p ) FOREACH_HumanPlayer( p )
PositionUnderlines( r, p ); PositionUnderlines( r, p );
} }
void ScreenOptions::PositionIcons() void ScreenOptions::PositionIcons()
{ {
for( unsigned i=0; i<m_Rows.size(); i++ ) // foreach options line for( unsigned i=0; i<m_pRows.size(); i++ ) // foreach options line
{ {
OptionRow &row = *m_Rows[i]; OptionRow &row = *m_pRows[i];
row.PositionIcons(); row.PositionIcons();
continue; continue;
} }
@@ -368,7 +368,7 @@ void ScreenOptions::RefreshIcons( int row, PlayerNumber pn )
void ScreenOptions::RefreshAllIcons() void ScreenOptions::RefreshAllIcons()
{ {
FOREACH_HumanPlayer( p ) FOREACH_HumanPlayer( p )
for( unsigned r=0; r<m_Rows.size(); ++r ) for( unsigned r=0; r<m_pRows.size(); ++r )
this->RefreshIcons( r, p ); this->RefreshIcons( r, p );
} }
@@ -382,8 +382,8 @@ void ScreenOptions::PositionCursors()
if( iRow == -1 ) if( iRow == -1 )
continue; continue;
ASSERT_M( iRow >= 0 && iRow < (int)m_Rows.size(), ssprintf("%i < %i", iRow, (int)m_Rows.size() ) ); ASSERT_M( iRow >= 0 && iRow < (int)m_pRows.size(), ssprintf("%i < %i", iRow, (int)m_pRows.size() ) );
OptionRow &OptionRow = *m_Rows[iRow]; OptionRow &OptionRow = *m_pRows[iRow];
OptionsCursor &cursor = m_Cursor[pn]; OptionsCursor &cursor = m_Cursor[pn];
const int iChoiceWithFocus = OptionRow.GetChoiceInRowWithFocus(pn); const int iChoiceWithFocus = OptionRow.GetChoiceInRowWithFocus(pn);
@@ -401,9 +401,9 @@ void ScreenOptions::TweenCursor( PlayerNumber pn )
{ {
// Set the position of the cursor showing the current option the user is changing. // Set the position of the cursor showing the current option the user is changing.
const int iRow = m_iCurrentRow[pn]; const int iRow = m_iCurrentRow[pn];
ASSERT_M( iRow < (int)m_Rows.size(), ssprintf("%i < %i", iRow, (int)m_Rows.size() ) ); ASSERT_M( iRow < (int)m_pRows.size(), ssprintf("%i < %i", iRow, (int)m_pRows.size() ) );
const OptionRow &row = *m_Rows[iRow]; const OptionRow &row = *m_pRows[iRow];
const int iChoiceWithFocus = row.GetChoiceInRowWithFocus(pn); const int iChoiceWithFocus = row.GetChoiceInRowWithFocus(pn);
int iWidth, iX, iY; int iWidth, iX, iY;
@@ -436,13 +436,13 @@ void ScreenOptions::TweenCursor( PlayerNumber pn )
* Update the whole row. */ * Update the whole row. */
void ScreenOptions::UpdateText( int iRow ) void ScreenOptions::UpdateText( int iRow )
{ {
OptionRow &row = *m_Rows[iRow]; OptionRow &row = *m_pRows[iRow];
row.UpdateText(); row.UpdateText();
} }
void ScreenOptions::UpdateEnabledDisabled( int r ) void ScreenOptions::UpdateEnabledDisabled( int r )
{ {
OptionRow &row = *m_Rows[r]; OptionRow &row = *m_pRows[r];
bool bRowHasFocus[NUM_PLAYERS]; bool bRowHasFocus[NUM_PLAYERS];
FOREACH_PlayerNumber( pn ) FOREACH_PlayerNumber( pn )
@@ -454,7 +454,7 @@ void ScreenOptions::UpdateEnabledDisabled( int r )
void ScreenOptions::UpdateEnabledDisabled() void ScreenOptions::UpdateEnabledDisabled()
{ {
for( unsigned r=0; r<m_Rows.size(); r++ ) for( unsigned r=0; r<m_pRows.size(); r++ )
UpdateEnabledDisabled( r ); UpdateEnabledDisabled( r );
} }
@@ -512,7 +512,7 @@ void ScreenOptions::HandleScreenMessage( const ScreenMessage SM )
this->GoToPrevScreen(); this->GoToPrevScreen();
break; break;
case SM_GoToNextScreen: case SM_GoToNextScreen:
for( unsigned r=0; r<m_Rows.size(); r++ ) // foreach row for( unsigned r=0; r<m_pRows.size(); r++ ) // foreach row
{ {
vector<PlayerNumber> vpns; vector<PlayerNumber> vpns;
FOREACH_HumanPlayer( p ) FOREACH_HumanPlayer( p )
@@ -551,7 +551,7 @@ void ScreenOptions::PositionItems()
int P1Choice = GAMESTATE->IsHumanPlayer(PLAYER_1)? m_iCurrentRow[PLAYER_1]: m_iCurrentRow[PLAYER_2]; int P1Choice = GAMESTATE->IsHumanPlayer(PLAYER_1)? m_iCurrentRow[PLAYER_1]: m_iCurrentRow[PLAYER_2];
int P2Choice = GAMESTATE->IsHumanPlayer(PLAYER_2)? m_iCurrentRow[PLAYER_2]: m_iCurrentRow[PLAYER_1]; int P2Choice = GAMESTATE->IsHumanPlayer(PLAYER_2)? m_iCurrentRow[PLAYER_2]: m_iCurrentRow[PLAYER_1];
vector<OptionRow*> Rows( m_Rows ); vector<OptionRow*> Rows( m_pRows );
OptionRow *ExitRow = NULL; OptionRow *ExitRow = NULL;
if( (bool)SEPARATE_EXIT_ROW && Rows.back()->GetRowType() == OptionRow::ROW_EXIT ) if( (bool)SEPARATE_EXIT_ROW && Rows.back()->GetRowType() == OptionRow::ROW_EXIT )
@@ -670,14 +670,14 @@ void ScreenOptions::OnChange( PlayerNumber pn )
if( SHOW_SCROLL_BAR ) if( SHOW_SCROLL_BAR )
{ {
float fPercent = 0; float fPercent = 0;
if( m_Rows.size() > 1 ) if( m_pRows.size() > 1 )
fPercent = m_iCurrentRow[pn] / float(m_Rows.size()-1); fPercent = m_iCurrentRow[pn] / float(m_pRows.size()-1);
m_ScrollBar.SetPercentage( pn, fPercent ); m_ScrollBar.SetPercentage( pn, fPercent );
} }
/* If the last row is EXIT, and is hidden, then show MORE. */ /* If the last row is EXIT, and is hidden, then show MORE. */
const bool ShowMore = m_Rows.back()->GetRowType() == OptionRow::ROW_EXIT && m_Rows.back()->GetRowHidden(); const bool ShowMore = m_pRows.back()->GetRowType() == OptionRow::ROW_EXIT && m_pRows.back()->GetRowHidden();
if( m_bMoreShown != ShowMore ) if( m_bMoreShown != ShowMore )
{ {
m_bMoreShown = ShowMore; m_bMoreShown = ShowMore;
@@ -691,7 +691,7 @@ void ScreenOptions::OnChange( PlayerNumber pn )
TweenCursor( p ); TweenCursor( p );
int iCurrentRow = m_iCurrentRow[pn]; int iCurrentRow = m_iCurrentRow[pn];
OptionRow &row = *m_Rows[iCurrentRow]; OptionRow &row = *m_pRows[iCurrentRow];
const bool ExitSelected = row.GetRowType() == OptionRow::ROW_EXIT; const bool ExitSelected = row.GetRowType() == OptionRow::ROW_EXIT;
if( p == pn || GAMESTATE->GetNumHumanPlayers() == 1 ) if( p == pn || GAMESTATE->GetNumHumanPlayers() == 1 )
{ {
@@ -740,7 +740,7 @@ void ScreenOptions::MenuBack( PlayerNumber pn )
bool ScreenOptions::IsOnLastRow( PlayerNumber pn ) const bool ScreenOptions::IsOnLastRow( PlayerNumber pn ) const
{ {
int iCurRow = m_iCurrentRow[pn]; int iCurRow = m_iCurrentRow[pn];
return iCurRow == (int)(m_Rows.size()-1); return iCurRow == (int)(m_pRows.size()-1);
} }
bool ScreenOptions::AllAreOnLastRow() const bool ScreenOptions::AllAreOnLastRow() const
@@ -769,7 +769,7 @@ void ScreenOptions::MenuStart( PlayerNumber pn, const InputEventType type )
} }
int iCurRow = m_iCurrentRow[pn]; int iCurRow = m_iCurrentRow[pn];
OptionRow &row = *m_Rows[iCurRow]; OptionRow &row = *m_pRows[iCurRow];
/* If we are in a three-button mode, check to see if MENU_BUTTON_LEFT and /* If we are in a three-button mode, check to see if MENU_BUTTON_LEFT and
@@ -851,7 +851,7 @@ void ScreenOptions::MenuStart( PlayerNumber pn, const InputEventType type )
{ {
case NAV_THREE_KEY: case NAV_THREE_KEY:
// don't wrap // don't wrap
if( iCurRow == (int)m_Rows.size()-1 ) if( iCurRow == (int)m_pRows.size()-1 )
return; return;
MenuDown( pn, type ); MenuDown( pn, type );
break; break;
@@ -878,7 +878,7 @@ void ScreenOptions::MenuStart( PlayerNumber pn, const InputEventType type )
case NAV_FIVE_KEY: case NAV_FIVE_KEY:
/* Jump to the exit row. (If everyone's already on the exit row, then /* Jump to the exit row. (If everyone's already on the exit row, then
* we'll have already gone to the next screen above.) */ * we'll have already gone to the next screen above.) */
MoveRow( pn, m_Rows.size()-m_iCurrentRow[pn]-1, type != IET_FIRST_PRESS ); MoveRow( pn, m_pRows.size()-m_iCurrentRow[pn]-1, type != IET_FIRST_PRESS );
break; break;
} }
} }
@@ -888,7 +888,7 @@ void ScreenOptions::StoreFocus( PlayerNumber pn )
{ {
/* Long rows always put us in the center, so don't update the focus. */ /* Long rows always put us in the center, so don't update the focus. */
int iCurrentRow = m_iCurrentRow[pn]; int iCurrentRow = m_iCurrentRow[pn];
const OptionRow &row = *m_Rows[iCurrentRow]; const OptionRow &row = *m_pRows[iCurrentRow];
if( row.GetRowDef().layoutType == LAYOUT_SHOW_ONE_IN_ROW ) if( row.GetRowDef().layoutType == LAYOUT_SHOW_ONE_IN_ROW )
return; return;
@@ -905,7 +905,7 @@ void ScreenOptions::ChangeValueInRow( PlayerNumber pn, int iDelta, bool Repeat )
if( iCurRow == -1 ) // no row selected if( iCurRow == -1 ) // no row selected
return; // don't allow a move return; // don't allow a move
OptionRow &row = *m_Rows[iCurRow]; OptionRow &row = *m_pRows[iCurRow];
const int iNumChoices = row.GetRowDef().choices.size(); const int iNumChoices = row.GetRowDef().choices.size();
@@ -1018,7 +1018,7 @@ void ScreenOptions::ChangeValueInRow( PlayerNumber pn, int iDelta, bool Repeat )
void ScreenOptions::MoveRow( PlayerNumber pn, int dir, bool Repeat ) void ScreenOptions::MoveRow( PlayerNumber pn, int dir, bool Repeat )
{ {
const int iCurrentRow = m_iCurrentRow[pn]; const int iCurrentRow = m_iCurrentRow[pn];
OptionRow &row = *m_Rows[iCurrentRow]; OptionRow &row = *m_pRows[iCurrentRow];
if( row.GetFirstItemGoesDown() ) if( row.GetFirstItemGoesDown() )
{ {
@@ -1035,19 +1035,19 @@ void ScreenOptions::MoveRow( PlayerNumber pn, int dir, bool Repeat )
continue; // skip continue; // skip
int r = m_iCurrentRow[p] + dir; int r = m_iCurrentRow[p] + dir;
if( Repeat && ( r == -1 || r == (int) m_Rows.size() ) ) if( Repeat && ( r == -1 || r == (int) m_pRows.size() ) )
continue; // don't wrap while repeating continue; // don't wrap while repeating
wrap( r, m_Rows.size() ); wrap( r, m_pRows.size() );
const unsigned iOldSelection = row.GetChoiceInRowWithFocus(p); const unsigned iOldSelection = row.GetChoiceInRowWithFocus(p);
if( m_iCurrentRow[p] == r ) if( m_iCurrentRow[p] == r )
continue; continue;
m_iCurrentRow[p] = r; m_iCurrentRow[p] = r;
ASSERT( r >= 0 && r < (int)m_Rows.size() ); ASSERT( r >= 0 && r < (int)m_pRows.size() );
OptionRow &row = *m_Rows[r]; OptionRow &row = *m_pRows[r];
switch( m_OptionsNavigation ) switch( m_OptionsNavigation )
{ {
@@ -1123,20 +1123,20 @@ void ScreenOptions::MenuUpDown( PlayerNumber pn, const InputEventType type, int
bool bRepeat = type != IET_FIRST_PRESS; bool bRepeat = type != IET_FIRST_PRESS;
int iDest = -1; int iDest = -1;
for( int r=1; r<(int)m_Rows.size(); r++ ) for( int r=1; r<(int)m_pRows.size(); r++ )
{ {
int iDelta = r*iDir; int iDelta = r*iDir;
iDest = m_iCurrentRow[pn] + iDelta; iDest = m_iCurrentRow[pn] + iDelta;
int iOldDest = iDest; int iOldDest = iDest;
ASSERT( m_Rows.size() ); ASSERT( m_pRows.size() );
wrap( iDest, m_Rows.size() ); wrap( iDest, m_pRows.size() );
// Don't wrap on repeating inputs. // Don't wrap on repeating inputs.
bool bWrapped = iOldDest != iDest; bool bWrapped = iOldDest != iDest;
if( bRepeat && bWrapped ) if( bRepeat && bWrapped )
return; return;
OptionRow &row = *m_Rows[iDest]; OptionRow &row = *m_pRows[iDest];
if( row.GetRowDef().IsEnabledForPlayer(pn) ) if( row.GetRowDef().IsEnabledForPlayer(pn) )
{ {
+1 -1
View File
@@ -83,7 +83,7 @@ protected: // derived classes need access to these
protected: protected:
/* Map menu lines to m_OptionRow entries. */ /* Map menu lines to m_OptionRow entries. */
vector<OptionRow*> m_Rows; vector<OptionRow*> m_pRows;
Navigation m_OptionsNavigation; Navigation m_OptionsNavigation;
+6 -6
View File
@@ -99,7 +99,7 @@ void ScreenOptionsMaster::Init()
ScreenOptionsMaster::~ScreenOptionsMaster() ScreenOptionsMaster::~ScreenOptionsMaster()
{ {
FOREACH( OptionRow*, m_Rows, r ) FOREACH( OptionRow*, m_pRows, r )
(*r)->DetachHandler(); (*r)->DetachHandler();
FOREACH( OptionRowHandler*, OptionRowHandlers, h ) FOREACH( OptionRowHandler*, OptionRowHandlers, h )
SAFE_DELETE( *h ); SAFE_DELETE( *h );
@@ -110,13 +110,13 @@ void ScreenOptionsMaster::ImportOptions( int r, const vector<PlayerNumber> &vpns
{ {
FOREACH_CONST( PlayerNumber, vpns, pn ) FOREACH_CONST( PlayerNumber, vpns, pn )
ASSERT( GAMESTATE->IsHumanPlayer(*pn) ); ASSERT( GAMESTATE->IsHumanPlayer(*pn) );
OptionRow &row = *m_Rows[r]; OptionRow &row = *m_pRows[r];
row.ImportOptions( vpns ); row.ImportOptions( vpns );
} }
void ScreenOptionsMaster::ExportOptions( int r, const vector<PlayerNumber> &vpns ) void ScreenOptionsMaster::ExportOptions( int r, const vector<PlayerNumber> &vpns )
{ {
OptionRow &row = *m_Rows[r]; OptionRow &row = *m_pRows[r];
bool bRowHasFocus[NUM_PLAYERS]; bool bRowHasFocus[NUM_PLAYERS];
ZERO( bRowHasFocus ); ZERO( bRowHasFocus );
FOREACH_CONST( PlayerNumber, vpns, p ) FOREACH_CONST( PlayerNumber, vpns, p )
@@ -134,8 +134,8 @@ void ScreenOptionsMaster::BeginFadingOut()
m_bExportWillSetANewScreen = false; m_bExportWillSetANewScreen = false;
int iCurRow = this->GetCurrentRow(); int iCurRow = this->GetCurrentRow();
ASSERT( iCurRow >= 0 && iCurRow < (int)m_Rows.size() ); ASSERT( iCurRow >= 0 && iCurRow < (int)m_pRows.size() );
OptionRow &row = *m_Rows[iCurRow]; OptionRow &row = *m_pRows[iCurRow];
if( row.GetRowType() != OptionRow::ROW_EXIT ) if( row.GetRowType() != OptionRow::ROW_EXIT )
{ {
@@ -181,7 +181,7 @@ void ScreenOptionsMaster::GoToPrevScreen()
void ScreenOptionsMaster::RefreshIcons( int r, PlayerNumber pn ) void ScreenOptionsMaster::RefreshIcons( int r, PlayerNumber pn )
{ {
OptionRow &row = *m_Rows[r]; OptionRow &row = *m_pRows[r];
if( row.GetRowType() == OptionRow::ROW_EXIT ) if( row.GetRowType() == OptionRow::ROW_EXIT )
return; // skip return; // skip
+3 -3
View File
@@ -67,8 +67,8 @@ void ScreenPlayerOptions::Init()
FOREACH_HumanPlayer( p ) FOREACH_HumanPlayer( p )
{ {
m_bRowCausesDisqualified[p].resize( m_Rows.size(), false ); m_bRowCausesDisqualified[p].resize( m_pRows.size(), false );
for( unsigned r=0; r<m_Rows.size(); r++ ) for( unsigned r=0; r<m_pRows.size(); r++ )
UpdateDisqualified( r, p ); UpdateDisqualified( r, p );
} }
} }
@@ -146,7 +146,7 @@ void ScreenPlayerOptions::Input( const DeviceInput& DeviceI, const InputEventTyp
COMMAND( m_sprCancelAll[pn], "Show" ); COMMAND( m_sprCancelAll[pn], "Show" );
for( unsigned r=0; r<m_Rows.size(); r++ ) for( unsigned r=0; r<m_pRows.size(); r++ )
{ {
vector<PlayerNumber> v; vector<PlayerNumber> v;
v.push_back( pn ); v.push_back( pn );
+5 -5
View File
@@ -100,7 +100,7 @@ void ScreenProfileOptions::ImportOptions( int row, const vector<PlayerNumber> &v
vsProfiles.end(), vsProfiles.end(),
PREFSMAN->GetDefaultLocalProfileID(pn).Get() ); PREFSMAN->GetDefaultLocalProfileID(pn).Get() );
if( iter != vsProfiles.end() ) if( iter != vsProfiles.end() )
m_Rows[row]->SetOneSharedSelection( iter - vsProfiles.begin() + 1 ); m_pRows[row]->SetOneSharedSelection( iter - vsProfiles.begin() + 1 );
} }
break; break;
} }
@@ -117,8 +117,8 @@ void ScreenProfileOptions::ExportOptions( int row, const vector<PlayerNumber> &v
vector<CString> vsProfiles; vector<CString> vsProfiles;
PROFILEMAN->GetLocalProfileIDs( vsProfiles ); PROFILEMAN->GetLocalProfileIDs( vsProfiles );
if( m_Rows[row]->GetOneSharedSelection() > 0 ) if( m_pRows[row]->GetOneSharedSelection() > 0 )
PREFSMAN->GetDefaultLocalProfileID(pn).Set( vsProfiles[m_Rows[row]->GetOneSharedSelection()-1] ); PREFSMAN->GetDefaultLocalProfileID(pn).Set( vsProfiles[m_pRows[row]->GetOneSharedSelection()-1] );
else else
PREFSMAN->GetDefaultLocalProfileID(pn).Set( "" ); PREFSMAN->GetDefaultLocalProfileID(pn).Set( "" );
} }
@@ -222,7 +222,7 @@ CString ScreenProfileOptions::GetSelectedProfileID()
vector<CString> vsProfiles; vector<CString> vsProfiles;
PROFILEMAN->GetLocalProfileIDs( vsProfiles ); PROFILEMAN->GetLocalProfileIDs( vsProfiles );
const OptionRow &row = *m_Rows[GetCurrentRow()]; const OptionRow &row = *m_pRows[GetCurrentRow()];
const int Selection = row.GetOneSharedSelection(); const int Selection = row.GetOneSharedSelection();
if( !Selection ) if( !Selection )
return ""; return "";
@@ -231,7 +231,7 @@ CString ScreenProfileOptions::GetSelectedProfileID()
CString ScreenProfileOptions::GetSelectedProfileName() CString ScreenProfileOptions::GetSelectedProfileName()
{ {
const OptionRow &row = *m_Rows[GetCurrentRow()]; const OptionRow &row = *m_pRows[GetCurrentRow()];
const int Selection = row.GetOneSharedSelection(); const int Selection = row.GetOneSharedSelection();
if( !Selection ) if( !Selection )
return ""; return "";
+5 -5
View File
@@ -52,7 +52,7 @@ void ScreenSMOnlineLogin::Init()
InitMenu( INPUTMODE_SHARE_CURSOR, vDefs, vHands ); InitMenu( INPUTMODE_SHARE_CURSOR, vDefs, vHands );
SOUND->PlayMusic( THEME->GetPathS("ScreenMachineOptions", "music")); SOUND->PlayMusic( THEME->GetPathS("ScreenMachineOptions", "music"));
OptionRow &row = *m_Rows.back(); OptionRow &row = *m_pRows.back();
row.SetExitText("Login"); row.SetExitText("Login");
} }
} }
@@ -72,7 +72,7 @@ void ScreenSMOnlineLogin::ImportOptions( int row, const vector<PlayerNumber> &vp
{ {
iter = find(vsProfiles.begin(), vsProfiles.end(), PREFSMAN->GetDefaultLocalProfileID(pn).Get() ); iter = find(vsProfiles.begin(), vsProfiles.end(), PREFSMAN->GetDefaultLocalProfileID(pn).Get() );
if( iter != vsProfiles.end() ) if( iter != vsProfiles.end() )
m_Rows[0]->SetOneSelection((PlayerNumber) pn, iter - vsProfiles.begin()); m_pRows[0]->SetOneSelection((PlayerNumber) pn, iter - vsProfiles.begin());
} }
} }
break; break;
@@ -89,7 +89,7 @@ void ScreenSMOnlineLogin::ExportOptions( int row, const vector<PlayerNumber> &vp
PROFILEMAN->GetLocalProfileIDs( vsProfiles ); PROFILEMAN->GetLocalProfileIDs( vsProfiles );
FOREACH_EnabledPlayer( pn ) FOREACH_EnabledPlayer( pn )
PREFSMAN->GetDefaultLocalProfileID(pn).Set( vsProfiles[m_Rows[0]->GetOneSelection(pn)] ); PREFSMAN->GetDefaultLocalProfileID(pn).Set( vsProfiles[m_pRows[0]->GetOneSelection(pn)] );
} }
break; break;
} }
@@ -104,7 +104,7 @@ void ScreenSMOnlineLogin::GoToNextScreen()
{ {
vector<PlayerNumber> v; vector<PlayerNumber> v;
v.push_back( GAMESTATE->m_MasterPlayerNumber ); v.push_back( GAMESTATE->m_MasterPlayerNumber );
for( unsigned r=0; r<m_Rows.size(); r++ ) for( unsigned r=0; r<m_pRows.size(); r++ )
ExportOptions( r, v ); ExportOptions( r, v );
PREFSMAN->SaveGlobalPrefsToDisk(); PREFSMAN->SaveGlobalPrefsToDisk();
@@ -172,7 +172,7 @@ CString ScreenSMOnlineLogin::GetSelectedProfileID()
vector<CString> vsProfiles; vector<CString> vsProfiles;
PROFILEMAN->GetLocalProfileIDs( vsProfiles ); PROFILEMAN->GetLocalProfileIDs( vsProfiles );
const OptionRow &row = *m_Rows[GetCurrentRow()]; const OptionRow &row = *m_pRows[GetCurrentRow()];
const int Selection = row.GetOneSharedSelection(); const int Selection = row.GetOneSharedSelection();
if( !Selection ) if( !Selection )
return ""; return "";
+3 -3
View File
@@ -32,7 +32,7 @@ void ScreenSelectGroup::Init()
{ {
if( !PREFSMAN->m_bShowSelectGroup ) if( !PREFSMAN->m_bShowSelectGroup )
{ {
GAMESTATE->m_sPreferredSongGroup = GROUP_ALL_MUSIC; GAMESTATE->m_sPreferredSongGroup.Set( GROUP_ALL_MUSIC );
HandleScreenMessage( SM_GoToNextScreen ); HandleScreenMessage( SM_GoToNextScreen );
return; return;
} }
@@ -172,7 +172,7 @@ void ScreenSelectGroup::AfterChange()
if( sSelectedGroupName == "ALL MUSIC" ) if( sSelectedGroupName == "ALL MUSIC" )
m_Banner.LoadAllMusic(); m_Banner.LoadAllMusic();
else else
m_Banner.LoadFromGroup( sSelectedGroupName ); m_Banner.LoadFromSongGroup( sSelectedGroupName );
const int iNumSongs = m_MusicList.GetNumSongs(); const int iNumSongs = m_MusicList.GetNumSongs();
m_textNumber.SetText( ssprintf("%d", iNumSongs) ); m_textNumber.SetText( ssprintf("%d", iNumSongs) );
@@ -224,7 +224,7 @@ void ScreenSelectGroup::MenuStart( PlayerNumber pn )
m_bChosen = true; m_bChosen = true;
GAMESTATE->m_pCurSong.Set( NULL ); GAMESTATE->m_pCurSong.Set( NULL );
GAMESTATE->m_sPreferredSongGroup = (m_GroupList.GetSelectionName()=="ALL MUSIC" ? GROUP_ALL_MUSIC : m_GroupList.GetSelectionName() ); GAMESTATE->m_sPreferredSongGroup.Set( m_GroupList.GetSelectionName()=="ALL MUSIC" ? GROUP_ALL_MUSIC : m_GroupList.GetSelectionName() );
if( GAMESTATE->m_sPreferredSongGroup == GROUP_ALL_MUSIC ) if( GAMESTATE->m_sPreferredSongGroup == GROUP_ALL_MUSIC )
SOUND->PlayOnceFromAnnouncer( "select group comment all music" ); SOUND->PlayOnceFromAnnouncer( "select group comment all music" );
+1 -1
View File
@@ -1582,7 +1582,7 @@ void ScreenSelectMusic::AfterMusicChange()
switch( m_MusicWheel.GetSelectedType() ) switch( m_MusicWheel.GetSelectedType() )
{ {
case TYPE_SECTION: case TYPE_SECTION:
g_sBannerPath = SONGMAN->GetGroupBannerPath( sGroup ); g_sBannerPath = SONGMAN->GetSongGroupBannerPath( sGroup );
m_sSampleMusicToPlay = m_sSectionMusicPath; m_sSampleMusicToPlay = m_sSectionMusicPath;
break; break;
case TYPE_SORT: case TYPE_SORT:
+1 -1
View File
@@ -70,7 +70,7 @@ void ScreenTitleMenu::Init()
m_textSongs.LoadFromFont( THEME->GetPathF("Common","normal") ); m_textSongs.LoadFromFont( THEME->GetPathF("Common","normal") );
m_textSongs.SetName( "Songs" ); m_textSongs.SetName( "Songs" );
CString text = ssprintf("%d songs in %d groups, %d courses", SONGMAN->GetNumSongs(), SONGMAN->GetNumGroups(), SONGMAN->GetNumCourses() ); CString text = ssprintf("%d songs in %d groups, %d courses in %d groups", SONGMAN->GetNumSongs(), SONGMAN->GetNumSongGroups(), SONGMAN->GetNumCourses(), SONGMAN->GetNumCourseGroups() );
if( PREFSMAN->m_bUseUnlockSystem ) if( PREFSMAN->m_bUseUnlockSystem )
text += ssprintf(", %d unlocks", UNLOCKMAN->GetNumUnlocks() ); text += ssprintf(", %d unlocks", UNLOCKMAN->GetNumUnlocks() );
m_textSongs.SetText( text ); m_textSongs.SetText( text );
+63 -50
View File
@@ -171,19 +171,18 @@ void SongManager::LoadStepManiaSongDir( CString sDir, LoadingWindow *ld )
CStringArray arrayGroupDirs; CStringArray arrayGroupDirs;
GetDirListing( sDir+"*", arrayGroupDirs, true ); GetDirListing( sDir+"*", arrayGroupDirs, true );
SortCStringArray( arrayGroupDirs ); SortCStringArray( arrayGroupDirs );
StripCvs( arrayGroupDirs );
for( unsigned i=0; i< arrayGroupDirs.size(); i++ ) // for each dir in /Songs/ FOREACH_CONST( CString, arrayGroupDirs, s ) // foreach dir in /Songs/
{ {
CString sGroupDirName = arrayGroupDirs[i]; CString sGroupDirName = *s;
if( 0 == stricmp( sGroupDirName, "cvs" ) ) // the directory called "CVS"
continue; // ignore it
SanityCheckGroupDir(sDir+sGroupDirName); SanityCheckGroupDir(sDir+sGroupDirName);
// Find all Song folders in this group directory // Find all Song folders in this group directory
CStringArray arraySongDirs; CStringArray arraySongDirs;
GetDirListing( sDir+sGroupDirName + "/*", arraySongDirs, true, true ); GetDirListing( sDir+sGroupDirName + "/*", arraySongDirs, true, true );
StripCvs( arraySongDirs );
SortCStringArray( arraySongDirs ); SortCStringArray( arraySongDirs );
LOG->Trace("Attempting to load %i songs from \"%s\"", int(arraySongDirs.size()), LOG->Trace("Attempting to load %i songs from \"%s\"", int(arraySongDirs.size()),
@@ -194,9 +193,6 @@ void SongManager::LoadStepManiaSongDir( CString sDir, LoadingWindow *ld )
{ {
CString sSongDirName = arraySongDirs[j]; CString sSongDirName = arraySongDirs[j];
if( 0 == stricmp( Basename(sSongDirName), "cvs" ) ) // the directory called "CVS"
continue; // ignore it
// this is a song directory. Load a new song! // this is a song directory. Load a new song!
if( ld ) if( ld )
{ {
@@ -226,7 +222,7 @@ void SongManager::LoadStepManiaSongDir( CString sDir, LoadingWindow *ld )
AddGroup(sDir, sGroupDirName); AddGroup(sDir, sGroupDirName);
/* Cache and load the group banner. */ /* Cache and load the group banner. */
BANNERCACHE->CacheBanner( GetGroupBannerPath(sGroupDirName) ); BANNERCACHE->CacheBanner( GetSongGroupBannerPath(sGroupDirName) );
/* Load the group sym links (if any)*/ /* Load the group sym links (if any)*/
LoadGroupSymLinks(sDir, sGroupDirName); LoadGroupSymLinks(sDir, sGroupDirName);
@@ -312,44 +308,38 @@ void SongManager::FreeSongs()
m_pShuffledSongs.clear(); m_pShuffledSongs.clear();
} }
CString SongManager::GetGroupBannerPath( CString sGroupName ) CString SongManager::GetSongGroupBannerPath( CString sSongGroup )
{ {
unsigned i; for( unsigned i = 0; i < m_sSongGroupNames.size(); ++i )
for(i = 0; i < m_sSongGroupNames.size(); ++i) {
if( sGroupName == m_sSongGroupNames[i] ) break; if( sSongGroup == m_sSongGroupNames[i] )
if( i == m_sSongGroupNames.size() )
return "";
return m_sSongGroupBannerPaths[i]; return m_sSongGroupBannerPaths[i];
} }
void SongManager::GetGroupNames( CStringArray &AddTo ) ASSERT_M( 0, ssprintf("requested banner for song group '%s' that doesn't exist",sSongGroup.c_str()) );
return "";
}
void SongManager::GetSongGroupNames( CStringArray &AddTo )
{ {
AddTo.insert(AddTo.end(), m_sSongGroupNames.begin(), m_sSongGroupNames.end() ); AddTo.insert(AddTo.end(), m_sSongGroupNames.begin(), m_sSongGroupNames.end() );
} }
bool SongManager::DoesGroupExist( CString sGroupName ) bool SongManager::DoesSongGroupExist( CString sSongGroup )
{ {
for( unsigned i = 0; i < m_sSongGroupNames.size(); ++i ) return find( m_sSongGroupNames.begin(), m_sSongGroupNames.end(), sSongGroup ) != m_sSongGroupNames.end();
if( !m_sSongGroupNames[i].CompareNoCase(sGroupName) )
return true;
return false;
} }
RageColor SongManager::GetSongGroupColor( const CString &sSongGroupName ) RageColor SongManager::GetSongGroupColor( const CString &sSongGroup )
{ {
// search for the group index for( unsigned i=0; i<m_sSongGroupNames.size(); i++ )
unsigned i;
for( i=0; i<m_sSongGroupNames.size(); i++ )
{ {
if( m_sSongGroupNames[i] == sSongGroupName ) if( m_sSongGroupNames[i] == sSongGroup )
break; return SONG_GROUP_COLOR.GetValue( i%NUM_SONG_GROUP_COLORS ); // TODO: Add course group colors?
} }
ASSERT_M( i != m_sSongGroupNames.size(), sSongGroupName ); // this is not a valid group
return SONG_GROUP_COLOR.GetValue( i%NUM_SONG_GROUP_COLORS ); ASSERT_M( 0, ssprintf("requested color for song group '%s' that doesn't exist",sSongGroup.c_str()) );
return RageColor(1,1,1,1);
} }
RageColor SongManager::GetSongColor( const Song* pSong ) RageColor SongManager::GetSongColor( const Song* pSong )
@@ -390,17 +380,38 @@ RageColor SongManager::GetSongColor( const Song* pSong )
return GetSongGroupColor( pSong->m_sGroupName ); return GetSongGroupColor( pSong->m_sGroupName );
} }
RageColor SongManager::GetCourseGroupColor( const CString &sCourseGroupName ) CString SongManager::GetCourseGroupBannerPath( CString sCourseGroup )
{ {
// search for the group index for( unsigned i = 0; i < m_sCourseGroupNames.size(); ++i )
unsigned i;
for( i=0; i<m_sCourseGroupNames.size(); i++ )
{ {
if( m_sCourseGroupNames[i] == sCourseGroupName ) if( sCourseGroup == m_sCourseGroupNames[i] )
break; return m_sCourseGroupBannerPaths[i];
} }
ASSERT_M( i != m_sCourseGroupNames.size(), "Course: '" + sCourseGroupName + "' is not a valid group." ); // this is not a valid group
return COURSE_GROUP_COLOR.GetValue( i%NUM_COURSE_GROUP_COLORS.GetValue() ); ASSERT_M( 0, ssprintf("requested banner for course group '%s' that doesn't exist",sCourseGroup.c_str()) );
return "";
}
void SongManager::GetCourseGroupNames( CStringArray &AddTo )
{
AddTo.insert(AddTo.end(), m_sCourseGroupNames.begin(), m_sCourseGroupNames.end() );
}
bool SongManager::DoesCourseGroupExist( CString sCourseGroup )
{
return find( m_sCourseGroupNames.begin(), m_sCourseGroupNames.end(), sCourseGroup ) != m_sCourseGroupNames.end();
}
RageColor SongManager::GetCourseGroupColor( const CString &sCourseGroup )
{
for( unsigned i=0; i<m_sCourseGroupNames.size(); i++ )
{
if( m_sCourseGroupNames[i] == sCourseGroup )
return SONG_GROUP_COLOR.GetValue( i%NUM_SONG_GROUP_COLORS );
}
ASSERT_M( 0, ssprintf("requested color for course group '%s' that doesn't exist",sCourseGroup.c_str()) );
return RageColor(1,1,1,1);
} }
RageColor SongManager::GetCourseColor( const Course* pCourse ) RageColor SongManager::GetCourseColor( const Course* pCourse )
@@ -447,7 +458,7 @@ int SongManager::GetNumSongs() const
return m_pSongs.size(); return m_pSongs.size();
} }
int SongManager::GetNumGroups() const int SongManager::GetNumSongGroups() const
{ {
return m_sSongGroupNames.size(); return m_sSongGroupNames.size();
} }
@@ -457,6 +468,11 @@ int SongManager::GetNumCourses() const
return m_pCourses.size(); return m_pCourses.size();
} }
int SongManager::GetNumCourseGroups() const
{
return m_sCourseGroupNames.size();
}
CString SongManager::ShortenGroupName( CString sLongGroupName ) CString SongManager::ShortenGroupName( CString sLongGroupName )
{ {
sLongGroupName.Replace( "Dance Dance Revolution", "DDR" ); sLongGroupName.Replace( "Dance Dance Revolution", "DDR" );
@@ -529,22 +545,19 @@ void SongManager::InitCoursesFromDisk( LoadingWindow *ld )
m_sCourseGroupNames.push_back( "" ); m_sCourseGroupNames.push_back( "" );
} }
// TODO: Search for course group banners if any
FOREACH( CString, m_sCourseGroupNames, s )
m_sCourseGroupBannerPaths.push_back( "" );
// Find all group directories in Courses dir // Find all group directories in Courses dir
{ {
GetDirListing( COURSES_DIR+"*", m_sCourseGroupNames, true ); GetDirListing( COURSES_DIR+"*", m_sCourseGroupNames, true );
StripCvs( m_sCourseGroupNames );
SortCStringArray( m_sCourseGroupNames ); SortCStringArray( m_sCourseGroupNames );
FOREACH( CString, m_sCourseGroupNames, sCourseGroup ) // for each dir in /Courses/ FOREACH( CString, m_sCourseGroupNames, sCourseGroup ) // for each dir in /Courses/
{ {
if( 0 == stricmp( *sCourseGroup, "cvs" ) ) // the directory called "CVS"
{
vector<CString>::iterator eraseme = sCourseGroup;
sCourseGroup--;
m_sCourseGroupNames.erase( eraseme );
continue; // ignore it
}
// Find all CRS files in this group directory // Find all CRS files in this group directory
CStringArray vsCoursePaths; CStringArray vsCoursePaths;
GetDirListing( COURSES_DIR + *sCourseGroup + "/*.crs", vsCoursePaths, false, true ); GetDirListing( COURSES_DIR + *sCourseGroup + "/*.crs", vsCoursePaths, false, true );
@@ -574,7 +587,7 @@ void SongManager::InitAutogenCourses()
// Create group courses for Endless and Nonstop // Create group courses for Endless and Nonstop
// //
CStringArray saGroupNames; CStringArray saGroupNames;
this->GetGroupNames( saGroupNames ); this->GetSongGroupNames( saGroupNames );
Course* pCourse; Course* pCourse;
for( unsigned g=0; g<saGroupNames.size(); g++ ) // foreach Group for( unsigned g=0; g<saGroupNames.size(); g++ ) // foreach Group
{ {
+10 -6
View File
@@ -49,14 +49,16 @@ public:
void Reload( LoadingWindow *ld=NULL ); // songs, courses, groups - everything. void Reload( LoadingWindow *ld=NULL ); // songs, courses, groups - everything.
void PreloadSongImages(); void PreloadSongImages();
CString GetSongGroupBannerPath( CString sSongGroup );
CString GetGroupBannerPath( CString sGroupName ); void GetSongGroupNames( CStringArray &AddTo );
void GetGroupNames( CStringArray &AddTo ); bool DoesSongGroupExist( CString sSongGroup );
bool DoesGroupExist( CString sGroupName );
RageColor GetSongGroupColor( const CString &sSongGroupName ); RageColor GetSongGroupColor( const CString &sSongGroupName );
RageColor GetSongColor( const Song* pSong ); RageColor GetSongColor( const Song* pSong );
RageColor GetDifficultyColor( Difficulty dc ) const; RageColor GetDifficultyColor( Difficulty dc ) const;
CString GetCourseGroupBannerPath( CString sCourseGroup );
void GetCourseGroupNames( CStringArray &AddTo );
bool DoesCourseGroupExist( CString sCourseGroup );
RageColor GetCourseGroupColor( const CString &sCourseGroupName ); RageColor GetCourseGroupColor( const CString &sCourseGroupName );
RageColor GetCourseColor( const Course* pCourse ); RageColor GetCourseColor( const Course* pCourse );
@@ -75,8 +77,9 @@ public:
Song *FindSong( CString sPath ); Song *FindSong( CString sPath );
Course *FindCourse( CString sName ); Course *FindCourse( CString sName );
int GetNumSongs() const; int GetNumSongs() const;
int GetNumGroups() const; int GetNumSongGroups() const;
int GetNumCourses() const; int GetNumCourses() const;
int GetNumCourseGroups() const;
Song* GetRandomSong(); Song* GetRandomSong();
Course* GetRandomCourse(); Course* GetRandomCourse();
@@ -122,6 +125,7 @@ protected:
vector<Course*> m_pBestCourses[NUM_PROFILE_SLOTS][NUM_COURSE_TYPES]; vector<Course*> m_pBestCourses[NUM_PROFILE_SLOTS][NUM_COURSE_TYPES];
vector<Course*> m_pShuffledCourses; // used by GetRandomCourse vector<Course*> m_pShuffledCourses; // used by GetRandomCourse
CStringArray m_sCourseGroupNames; CStringArray m_sCourseGroupNames;
CStringArray m_sCourseGroupBannerPaths; // each song group may have a banner associated with it
ThemeMetric<int> NUM_SONG_GROUP_COLORS; ThemeMetric<int> NUM_SONG_GROUP_COLORS;
+1 -9
View File
@@ -141,15 +141,7 @@ ThemeManager::~ThemeManager()
void ThemeManager::GetThemeNames( CStringArray& AddTo ) void ThemeManager::GetThemeNames( CStringArray& AddTo )
{ {
GetDirListing( THEMES_DIR + "*", AddTo, true ); GetDirListing( THEMES_DIR + "*", AddTo, true );
StripCvs( AddTo );
// strip out the folder called "CVS"
for( CStringArray::iterator i=AddTo.begin(); i != AddTo.end(); ++i )
{
if( *i == "CVS" ) {
AddTo.erase(i, i+1);
break;
}
}
} }
bool ThemeManager::DoesThemeExist( const CString &sThemeName ) bool ThemeManager::DoesThemeExist( const CString &sThemeName )