From a0b00eae77dcce6b646bc3eab70702f3d22a1722 Mon Sep 17 00:00:00 2001 From: Chris Danford Date: Fri, 13 Feb 2004 05:10:18 +0000 Subject: [PATCH] add choice name indirection to make it easier to add/remove options, and to give theme elements more logical names --- stepmania/Themes/default/metrics.ini | 7 +++--- stepmania/src/ScreenSelect.cpp | 33 +++++++++++++++++++--------- stepmania/src/ScreenSelect.h | 2 +- stepmania/src/ScreenSelectMaster.cpp | 19 ++++++++-------- 4 files changed, 38 insertions(+), 23 deletions(-) diff --git a/stepmania/Themes/default/metrics.ini b/stepmania/Themes/default/metrics.ini index 521728a691..8d67487c08 100644 --- a/stepmania/Themes/default/metrics.ini +++ b/stepmania/Themes/default/metrics.ini @@ -37,7 +37,8 @@ CurrentModeZoom=1 # Note that we don't use the "name" parameter to Choices here. Name1 is # the displayed text, which might be translated or otherwise changed. The "name,foo" # parameter to ModeChoices is an asset name, which is used in filenames. -NumChoices=7 // no SANDBOX +ChoiceNames=1,2,3,4,5,6,7 +//,8 Choice1=screen,ScreenCaution Name1=GAME START Choice2=screen,ScreenSelectGame@ScreenOptionsMaster @@ -99,7 +100,7 @@ BounceJoinMessage=1 FoldOnJoin=1 [ScreenSelectStyle] -NumChoices=5 +ChoiceNames=1,2,3,4,5 # The "name" here affects the announcer, eg. "ScreenSelectStyle comment single". Choice1=Style,single;name,single Choice2=Style,versus;name,versus @@ -259,7 +260,7 @@ MemoryCardIcons=0 TimerSeconds=0 [ScreenSelectDifficulty] -NumChoices=8 +ChoiceNames=1,2,3,4,5,6,7,8 Choice1=PlayMode,arcade;Difficulty,beginner;name,beginner Choice2=PlayMode,arcade;Difficulty,easy;name,easy Choice3=PlayMode,arcade;Difficulty,medium;name,medium diff --git a/stepmania/src/ScreenSelect.cpp b/stepmania/src/ScreenSelect.cpp index 18eb8294d9..be219e4bfd 100644 --- a/stepmania/src/ScreenSelect.cpp +++ b/stepmania/src/ScreenSelect.cpp @@ -30,13 +30,13 @@ #include "arch/ArchHooks/ArchHooks.h" -#define NUM_CHOICES THEME->GetMetricI(m_sName,"NumChoices") -#define CHOICE( choice ) THEME->GetMetric (m_sName,ssprintf("Choice%d",choice+1)) +#define CHOICE_NAMES THEME->GetMetric (m_sName,"ChoiceNames") +#define CHOICE( choice_name ) THEME->GetMetric (m_sName,ssprintf("Choice%s",choice_name.c_str())) #define NUM_CODES THEME->GetMetricI(m_sName,"NumCodes") -#define CODE( choice ) THEME->GetMetric (m_sName,ssprintf("Code%d",choice+1)) -#define CODE_ACTION( choice ) THEME->GetMetric (m_sName,ssprintf("Code%dAction",choice+1)) +#define CODE( c ) THEME->GetMetric (m_sName,ssprintf("Code%d",c+1)) +#define CODE_ACTION( c ) THEME->GetMetric (m_sName,ssprintf("Code%dAction",c+1)) #define HELP_TEXT THEME->GetMetric (m_sName,"HelpText") -#define NEXT_SCREEN( choice ) THEME->GetMetric (m_sName,ssprintf("NextScreen%d",choice+1)) +#define NEXT_SCREEN( c ) THEME->GetMetric (m_sName,ssprintf("NextScreen%d",c+1)) ScreenSelect::ScreenSelect( CString sClassName ) : Screen(sClassName) { @@ -44,19 +44,29 @@ ScreenSelect::ScreenSelect( CString sClassName ) : Screen(sClassName) m_sName = sClassName; + // Instead of using NUM_CHOICES, use a comma-separated list of choices. Each + // element in the list is a choice name. This level of indirection + // makes it easier to add or remove items without having to change a bunch + // of indices. + CStringArray asChoiceNames; + split( CHOICE_NAMES, ",", asChoiceNames, true ); + int c; - for( c=0; cGetPathTo(BGAnimations, m_sName, mc.m_sName, true); // true="optional" if( sBGAnimationDir == "" ) sBGAnimationDir = THEME->GetPathToB(m_sName+" background"); - m_BGAnimations[c].LoadFromAniDir( sBGAnimationDir ); + BGAnimation *pBGA = new BGAnimation; + m_vpBGAnimations.push_back( pBGA ); } m_Menu.Load( sClassName ); @@ -80,6 +90,9 @@ ScreenSelect::ScreenSelect( CString sClassName ) : Screen(sClassName) ScreenSelect::~ScreenSelect() { LOG->Trace( "ScreenSelect::~ScreenSelect()" ); + for( int i=0; im_MasterPlayerNumber != PLAYER_INVALID ) { int iSelection = this->GetSelectionIndex(GAMESTATE->m_MasterPlayerNumber); - m_BGAnimations[iSelection].Update( fDelta ); + m_vpBGAnimations[iSelection]->Update( fDelta ); } } @@ -109,7 +122,7 @@ void ScreenSelect::DrawPrimitives() if( GAMESTATE->m_MasterPlayerNumber != PLAYER_INVALID ) { int iSelection = this->GetSelectionIndex(GAMESTATE->m_MasterPlayerNumber); - m_BGAnimations[iSelection].Draw(); + m_vpBGAnimations[iSelection]->Draw(); } m_Menu.DrawBottomLayer(); Screen::DrawPrimitives(); diff --git a/stepmania/src/ScreenSelect.h b/stepmania/src/ScreenSelect.h index b74ce0bc05..9523f73876 100644 --- a/stepmania/src/ScreenSelect.h +++ b/stepmania/src/ScreenSelect.h @@ -42,7 +42,7 @@ protected: void FinalizeChoices(); MenuElements m_Menu; - BGAnimation m_BGAnimations[MAX_CHOICES]; + vector m_vpBGAnimations; vector m_aModeChoices; // derived classes should look here for what choices are available vector m_aCodes; diff --git a/stepmania/src/ScreenSelectMaster.cpp b/stepmania/src/ScreenSelectMaster.cpp index 0ad4512415..c629e08dbb 100644 --- a/stepmania/src/ScreenSelectMaster.cpp +++ b/stepmania/src/ScreenSelectMaster.cpp @@ -101,9 +101,9 @@ ScreenSelectMaster::ScreenSelectMaster( CString sClassName ) : ScreenSelect( sCl for( unsigned c=0; cGetPathToG(sFName) ); m_sprScroll[c][0]->SetName( ssprintf("Scroll") ); m_Scroller[0].AddChild( m_sprScroll[c][0] ); @@ -128,9 +128,9 @@ ScreenSelectMaster::ScreenSelectMaster( CString sClassName ) : ScreenSelect( sCl for( unsigned c=0; cGetPathToG(sFName) ); m_sprScroll[c][p]->SetName( ssprintf("ScrollP%d",p+1) ); m_Scroller[p].AddChild( m_sprScroll[c][p] ); @@ -141,12 +141,12 @@ ScreenSelectMaster::ScreenSelectMaster( CString sClassName ) : ScreenSelect( sCl for( unsigned c=0; cGetPathToG(sFName) ); m_sprIcon[i][c]->SetName( ssprintf("IconPart%dChoice%d",i+1,c+1) ); this->AddChild( m_sprIcon[i][c] ); @@ -157,7 +157,7 @@ ScreenSelectMaster::ScreenSelectMaster( CString sClassName ) : ScreenSelect( sCl { for( i=0; iGetPathToG(sFName) ); m_sprPreview[i][c][0]->SetName( ssprintf("PreviewPart%d",i+1) ); this->AddChild( m_sprPreview[i][c][0] ); @@ -171,7 +171,7 @@ ScreenSelectMaster::ScreenSelectMaster( CString sClassName ) : ScreenSelect( sCl continue; // skip for( i=0; iGetPathToG(sFName) ); m_sprPreview[i][c][p]->SetName( ssprintf("PreviewPart%dP%d",i+1,p+1) ); this->AddChild( m_sprPreview[i][c][p] ); @@ -575,7 +575,8 @@ void ScreenSelectMaster::MenuStart( PlayerNumber pn ) if( m_bChosen[pn] == true ) return; - SOUND->PlayOnceFromDir( ANNOUNCER->GetPathTo(ssprintf("%s comment %s",m_sName.c_str(), m_aModeChoices[m_iChoice[pn]].m_sName.c_str())) ); + ModeChoice &mc = m_aModeChoices[m_iChoice[pn]]; + SOUND->PlayOnceFromDir( ANNOUNCER->GetPathTo(ssprintf("%s comment %s",m_sName.c_str(), mc.m_sName.c_str())) ); m_soundSelect.Play(); float fSecs = 0;