diff --git a/stepmania/src/ScreenSelectMaster.cpp b/stepmania/src/ScreenSelectMaster.cpp index 5fb73819cb..13c77152e4 100644 --- a/stepmania/src/ScreenSelectMaster.cpp +++ b/stepmania/src/ScreenSelectMaster.cpp @@ -14,8 +14,6 @@ #include "Foreach.h" #include "RageSoundManager.h" -#define CURSOR_OFFSET_X_FROM_ICON( p, part ) THEME->GetMetricF(m_sName,ssprintf("CursorPart%dP%dOffsetXFromIcon",part+1,p+1)) -#define CURSOR_OFFSET_Y_FROM_ICON( p, part ) THEME->GetMetricF(m_sName,ssprintf("CursorPart%dP%dOffsetYFromIcon",part+1,p+1)) #define OPTION_ORDER( dir ) THEME->GetMetric (m_sName,"OptionOrder"+CString(dir)) /* OptionOrderLeft=0:1,1:2,2:3,3:4 */ @@ -26,6 +24,9 @@ const char *ScreenSelectMaster::dirs[NUM_DIRS] = const ScreenMessage SM_PlayPostSwitchPage = (ScreenMessage)(SM_User+1); +CString CURSOR_OFFSET_X_FROM_ICON_NAME( size_t p, size_t part ) { return ssprintf("CursorPart%dP%dOffsetXFromIcon",part+1,p+1); } +CString CURSOR_OFFSET_Y_FROM_ICON_NAME( size_t p, size_t part ) { return ssprintf("CursorPart%dP%dOffsetYFromIcon",part+1,p+1); } + REGISTER_SCREEN_CLASS( ScreenSelectMaster ); ScreenSelectMaster::ScreenSelectMaster( CString sClassName ) : ScreenSelect( sClassName ), NUM_ICON_PARTS(m_sName,"NumIconParts"), @@ -33,6 +34,8 @@ ScreenSelectMaster::ScreenSelectMaster( CString sClassName ) : ScreenSelect( sCl NUM_CURSOR_PARTS(m_sName,"NumCursorParts"), SHARED_PREVIEW_AND_CURSOR(m_sName,"SharedPreviewAndCursor"), NUM_CHOICES_ON_PAGE_1(m_sName,"NumChoicesOnPage1"), + CURSOR_OFFSET_X_FROM_ICON(m_sName,CURSOR_OFFSET_X_FROM_ICON_NAME,NUM_PLAYERS,NUM_CURSOR_PARTS), + CURSOR_OFFSET_Y_FROM_ICON(m_sName,CURSOR_OFFSET_Y_FROM_ICON_NAME,NUM_PLAYERS,NUM_CURSOR_PARTS), PRE_SWITCH_PAGE_SECONDS(m_sName,"PreSwitchPageSeconds"), POST_SWITCH_PAGE_SECONDS(m_sName,"PostSwitchPageSeconds"), EXTRA_SLEEP_AFTER_TWEEN_OFF_SECONDS(m_sName,"ExtraSleepAfterTweenOffSeconds"), @@ -106,7 +109,7 @@ ScreenSelectMaster::ScreenSelectMaster( CString sClassName ) : ScreenSelect( sCl { const GameCommand& mc = m_aGameCommands[c]; - m_sprScroll[c][0].Load( THEME->GetPathG(m_sName,ssprintf("%s Scroll Choice%s",mc.m_sName.c_str())) ); + m_sprScroll[c][0].Load( THEME->GetPathG(m_sName,ssprintf("Scroll Choice%s",mc.m_sName.c_str())) ); m_sprScroll[c][0]->SetName( ssprintf("Scroll") ); m_sprScroll[c][0]->PlayCommand( "Init" ); m_Scroller[0].AddChild( m_sprScroll[c][0] ); @@ -812,12 +815,12 @@ void ScreenSelectMaster::TweenOffScreen() float ScreenSelectMaster::GetCursorX( PlayerNumber pn, int iPartIndex ) { - return m_sprIcon[0][m_iChoice[pn]]->GetX() + CURSOR_OFFSET_X_FROM_ICON(pn, iPartIndex); + return m_sprIcon[0][m_iChoice[pn]]->GetX() + CURSOR_OFFSET_X_FROM_ICON.GetValue(pn, iPartIndex); } float ScreenSelectMaster::GetCursorY( PlayerNumber pn, int iPartIndex ) { - return m_sprIcon[0][m_iChoice[pn]]->GetY() + CURSOR_OFFSET_Y_FROM_ICON(pn, iPartIndex); + return m_sprIcon[0][m_iChoice[pn]]->GetY() + CURSOR_OFFSET_Y_FROM_ICON.GetValue(pn, iPartIndex); } /* diff --git a/stepmania/src/ScreenSelectMaster.h b/stepmania/src/ScreenSelectMaster.h index 7a35805069..6ad71d896b 100644 --- a/stepmania/src/ScreenSelectMaster.h +++ b/stepmania/src/ScreenSelectMaster.h @@ -10,6 +10,9 @@ #include "ActorScroller.h" #define MAX_CHOICES 30 +#define MAX_ICON_PARTS 3 +#define MAX_PREVIEW_PARTS 3 +#define MAX_CURSOR_PARTS 3 class ScreenSelectMaster : public ScreenSelect { @@ -38,8 +41,8 @@ protected: ThemeMetric NUM_CURSOR_PARTS; ThemeMetric SHARED_PREVIEW_AND_CURSOR; ThemeMetric NUM_CHOICES_ON_PAGE_1; - //ThemeMetric CURSOR_OFFSET_X_FROM_ICON( p, part ) THEME->GetMetricF(m_sName,ssprintf("CursorPart%dP%dOffsetXFromIcon",part+1,p+1)) - //ThemeMetric CURSOR_OFFSET_Y_FROM_ICON( p, part ) THEME->GetMetricF(m_sName,ssprintf("CursorPart%dP%dOffsetYFromIcon",part+1,p+1)) + ThemeMetric2D CURSOR_OFFSET_X_FROM_ICON; + ThemeMetric2D CURSOR_OFFSET_Y_FROM_ICON; ThemeMetric PRE_SWITCH_PAGE_SECONDS; ThemeMetric POST_SWITCH_PAGE_SECONDS; ThemeMetric EXTRA_SLEEP_AFTER_TWEEN_OFF_SECONDS; @@ -77,13 +80,10 @@ protected: AutoActor m_sprExplanation[NUM_PAGES]; AutoActor m_sprMore[NUM_PAGES]; -#define MAX_ICON_PARTS 3 // icon is the piece shared, per-choice piece AutoActor m_sprIcon[MAX_ICON_PARTS][MAX_CHOICES]; -#define MAX_PREVIEW_PARTS 3 // preview is per-choice, per-player piece AutoActor m_sprPreview[MAX_PREVIEW_PARTS][MAX_CHOICES][NUM_PLAYERS]; -#define MAX_CURSOR_PARTS 3 // cursor is the per-player that's shared by all choices AutoActor m_sprCursor[MAX_CURSOR_PARTS][NUM_PLAYERS]; // scroll is the per-player, per-choice piece that's scrolled diff --git a/stepmania/src/ThemeMetric.h b/stepmania/src/ThemeMetric.h index 3f265b3d6c..016de434e0 100644 --- a/stepmania/src/ThemeMetric.h +++ b/stepmania/src/ThemeMetric.h @@ -79,6 +79,62 @@ public: } }; +typedef CString (*MetricName1D)(size_t N); + +template +class ThemeMetric1D : public IThemeMetric +{ + ThemeMetric m_metric[N]; + +public: + ThemeMetric1D( const CString& sGroup, MetricName1D pfn, size_t nToInit ) + { + ASSERT( nToInit <= N ); + for( unsigned i=0; i +class ThemeMetric2D : public IThemeMetric +{ + ThemeMetric m_metric[N][M]; + +public: + ThemeMetric2D( const CString& sGroup, MetricName2D pfn, size_t nToInit, size_t mToInit ) + { + ASSERT( nToInit <= N ); + ASSERT( mToInit <= M ); + for( unsigned i=0; i