diff --git a/stepmania/Themes/default/metrics.ini b/stepmania/Themes/default/metrics.ini index 014b23950b..0b5bfa7c16 100644 --- a/stepmania/Themes/default/metrics.ini +++ b/stepmania/Themes/default/metrics.ini @@ -35,6 +35,27 @@ CurrentModeY=0 CurrentModeZoom=1 [ScreenTitleMenu] +# 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=8 +Choice1=screen,ScreenCaution +Name1=GAME START +Choice2=screen,ScreenSelectGame +Name2=SELECT GAME +Choice3=screen,ScreenOptionsMenu +Name3=OPTIONS +Choice4=screen,ScreenEditMenu +Name4=EDIT/SYNC SONGS +Choice5=screen,ScreenEditCoursesMenu +Name5=EDIT COURSES +Choice6=screen,ScreenJukeboxMenu +Name6=JUKEBOX +Choice7=screen,ScreenExit +Name7=EXIT +Choice8=screen,ScreenTest +Name8=SANDBOX +TimerSeconds=-1 // none LogoHomeOnCommand=x,320;y,240;zoomy,0;sleep,0.5;bounceend,0.5;zoomy,1;glowshift;effectperiod,2.5;effectcolor1,1,1,1,0.1;effectcolor2,1,1,1,0.3 LogoOnCommand=x,320;y,240;zoomy,0;sleep,0.5;bounceend,0.5;zoomy,1;glowshift;effectperiod,2.5;effectcolor1,1,1,1,0.1;effectcolor2,1,1,1,0.3 VersionOnCommand=horizalign,right;x,620;y,20;diffuse,0.6,0.6,0.6,1;zoom,0.5;shadowlength,2 @@ -54,11 +75,11 @@ MenuCommandOnCreate=diffusealpha,0;sleep,0.1;linear,0.5;diffusealpha,1; MenuCommandSelectDelay=0.5 SecondsBetweenComments=12 SecondsBeforeAttract=30 +HelpText= HelpTextHome=Use &UP; &DOWN; to select, then press START HelpTextPay=Press START to begin HelpTextFree=Press START to begin HelpTextEvent=Press START to begin -NextScreen=ScreenCaution [ScreenCaution] NextScreen=ScreenSelectStyle diff --git a/stepmania/src/ScreenTitleMenu.cpp b/stepmania/src/ScreenTitleMenu.cpp index c47b283096..594489fba4 100644 --- a/stepmania/src/ScreenTitleMenu.cpp +++ b/stepmania/src/ScreenTitleMenu.cpp @@ -24,7 +24,6 @@ #include "GameManager.h" #include "InputMapper.h" #include "ThemeManager.h" -#include "SDL_utils.h" #include "RageSounds.h" #include "CodeDetector.h" #include "RageTextureManager.h" @@ -51,14 +50,16 @@ #define SECONDS_BETWEEN_COMMENTS THEME->GetMetricF("ScreenTitleMenu","SecondsBetweenComments") #define SECONDS_BEFORE_ATTRACT THEME->GetMetricF("ScreenTitleMenu","SecondsBeforeAttract") #define HELP_TEXT( coin_mode ) THEME->GetMetric("ScreenTitleMenu","HelpText"+Capitalize(CoinModeToString(coin_mode))) -#define NEXT_SCREEN THEME->GetMetric("ScreenTitleMenu","NextScreen") +// #define NEXT_SCREEN THEME->GetMetric("ScreenTitleMenu","NextScreen") #define MENU_ITEM_CREATE THEME->GetMetric("ScreenTitleMenu","MenuCommandOnCreate") #define MENU_ITEM_SELECT_DELAY THEME->GetMetricF("ScreenTitleMenu","MenuCommandSelectDelay") +#define NAME( choice ) THEME->GetMetric (m_sName,ssprintf("Name%d",choice+1)) + const ScreenMessage SM_PlayComment = ScreenMessage(SM_User+1); const ScreenMessage SM_GoToAttractLoop = ScreenMessage(SM_User+13); -ScreenTitleMenu::ScreenTitleMenu() : Screen("ScreenTitleMenu") +ScreenTitleMenu::ScreenTitleMenu() : ScreenSelect("ScreenTitleMenu") { LOG->Trace( "ScreenTitleMenu::ScreenTitleMenu()" ); @@ -73,10 +74,6 @@ ScreenTitleMenu::ScreenTitleMenu() : Screen("ScreenTitleMenu") this->AddChild( &m_JointPremium ); } - - m_Background.LoadFromAniDir( THEME->GetPathToB("ScreenTitleMenu background") ); - this->AddChild( &m_Background ); - m_sprLogo.Load( THEME->GetPathToG(ssprintf("ScreenLogo %s",GAMESTATE->GetCurrentGameDef()->m_szName)) ); m_sprLogo.Command( PREFSMAN->m_iCoinMode==COIN_HOME ? LOGO_HOME_ON_COMMAND : LOGO_ON_COMMAND ); this->AddChild( &m_sprLogo ); @@ -112,12 +109,11 @@ ScreenTitleMenu::ScreenTitleMenu() : Screen("ScreenTitleMenu") switch( PREFSMAN->m_iCoinMode ) { case COIN_HOME: - int i; - for( i=0; iGetPathToF("ScreenTitleMenu choices") ); m_textChoice[i].SetHorizAlign( (enum Actor::HorizAlign)MENU_TEXT_ALIGN ); - m_textChoice[i].SetText( ChoiceToString((Choice)i) ); + m_textChoice[i].SetText( NAME(i) ); m_textChoice[i].SetXY( CHOICES_X, CHOICES_START_Y + i*CHOICES_SPACING_Y ); m_textChoice[i].SetShadowLength( CHOICES_SHADOW_LENGTH ); m_textChoice[i].EnableShadow( true ); @@ -132,29 +128,24 @@ ScreenTitleMenu::ScreenTitleMenu() : Screen("ScreenTitleMenu") } - m_In.Load( THEME->GetPathToB("ScreenTitleMenu in") ); - m_In.StartTransitioning(); - this->AddChild( &m_In ); +// m_AttractOut.Load( THEME->GetPathToB("ScreenTitleMenu out") ); +// this->AddChild( &m_AttractOut ); - m_Out.Load( THEME->GetPathToB("ScreenTitleMenu out") ); - this->AddChild( &m_Out ); - - m_BeginOut.Load( THEME->GetPathToB("ScreenTitleMenu begin out") ); - this->AddChild( &m_BeginOut ); +// m_BeginOut.Load( THEME->GetPathToB("ScreenTitleMenu begin out") ); +// this->AddChild( &m_BeginOut ); SOUND->PlayOnceFromDir( ANNOUNCER->GetPathTo("title menu game name") ); - m_soundAttract.Load( ANNOUNCER->GetPathTo("title menu attract") ); m_soundChange.Load( THEME->GetPathToS("ScreenTitleMenu change") ); m_soundSelect.Load( THEME->GetPathToS("Common start") ); m_soundInvalid.Load( THEME->GetPathToS("Common invalid") ); - m_Choice = CHOICE_GAME_START; + m_Choice = 0; - for( int i=0; iPostScreenMessage( SM_PlayComment, SECONDS_BETWEEN_COMMENTS); - this->MoveToTail( &m_In ); // put it in the back so it covers up the stuff we just added - this->MoveToTail( &m_Out ); // put it in the back so it covers up the stuff we just added - this->MoveToTail( &m_BeginOut ); // put it in the back so it covers up the stuff we just added +// this->MoveToTail( &m_AttractOut ); // put it in the back so it covers up the stuff we just added } ScreenTitleMenu::~ScreenTitleMenu() @@ -176,18 +165,22 @@ ScreenTitleMenu::~ScreenTitleMenu() LOG->Trace( "ScreenTitleMenu::~ScreenTitleMenu()" ); } +void ScreenTitleMenu::UpdateSelectableChoices() +{ + +} void ScreenTitleMenu::MoveCursor( bool up ) { if( PREFSMAN->m_iCoinMode != COIN_HOME ) return; - if( m_BeginOut.IsTransitioning() ) - return; +// if( m_BeginOut.IsTransitioning() ) +// return; TimeToDemonstration.GetDeltaTime(); /* Reset the demonstration timer when a key is pressed. */ LoseFocus( m_Choice ); - m_Choice = Choice( m_Choice + (up? -1:+1) ); - wrap( (int&)m_Choice, (int)NUM_CHOICES ); + m_Choice += (up? -1:+1); + wrap( (int&)m_Choice, m_aModeChoices.size() ); m_soundChange.Play(); GainFocus( m_Choice ); } @@ -200,16 +193,17 @@ void ScreenTitleMenu::Input( const DeviceInput& DeviceI, const InputEventType ty return; /* If the CoinMode was changed, we need to reload this screen - * so that the right choices will show */ + * so that the right m_aModeChoices will show */ if( ScreenAttract::ChangeCoinModeInput( DeviceI, type, GameI, MenuI, StyleI ) ) { SCREENMAN->SetNewScreen( "ScreenTitleMenu" ); + return; } if( !MenuI.IsValid() ) return; - if( m_In.IsTransitioning() || m_Out.IsTransitioning() ) + if( m_Menu.m_In.IsTransitioning() || m_Menu.m_Back.IsTransitioning() ) /* not m_Menu.m_Out */ return; switch( MenuI.button ) @@ -221,45 +215,24 @@ void ScreenTitleMenu::Input( const DeviceInput& DeviceI, const InputEventType ty MoveCursor( false ); break; case MENU_BUTTON_BACK: - if( m_BeginOut.IsTransitioning() ) + if( m_Menu.m_Out.IsTransitioning() ) break; - m_Out.StartTransitioning( SM_GoToAttractLoop ); + m_Menu.Back( SM_GoToAttractLoop ); break; case MENU_BUTTON_START: - /* break if the choice is invalid */ - if( m_Choice == CHOICE_JUKEBOX || - m_Choice == CHOICE_EDIT || - m_Choice == CHOICE_EDIT_COURSES ) + /* return if the choice is invalid */ + const ModeChoice &mc = m_aModeChoices[m_Choice]; + if( mc.m_bInvalid ) { - if( SONGMAN->GetNumSongs() == 0 ) - { - m_soundInvalid.Play(); - SCREENMAN->SystemMessage( "No songs are installed" ); - return; - } - } - if( m_Choice == CHOICE_EDIT_COURSES ) - { - vector vCourses; - SONGMAN->GetAllCourses( vCourses, false ); - - if( vCourses.size() == 0 ) - { - m_soundInvalid.Play(); - SCREENMAN->SystemMessage( "No courses are installed" ); - return; - } - } - if( m_Choice == CHOICE_EXIT ) - { - LOG->Trace("CHOICE_EXIT: shutting down"); - ExitGame(); + m_soundInvalid.Play(); + if( mc.m_sInvalidReason != "" ) + SCREENMAN->SystemMessage( mc.m_sInvalidReason ); return; } if( Screen::JoinInput( DeviceI, type, GameI, MenuI, StyleI ) ) - if( !m_BeginOut.IsTransitioning() ) - m_BeginOut.StartTransitioning( SM_GoToNextScreen ); + if( !m_Menu.m_Out.IsTransitioning() ) + m_Menu.StartTransitioning( SM_GoToNextScreen ); } // detect codes @@ -318,50 +291,23 @@ void ScreenTitleMenu::HandleScreenMessage( const ScreenMessage SM ) switch( SM ) { case SM_PlayComment: - m_soundAttract.PlayRandom(); + SOUND->PlayOnceFromDir( ANNOUNCER->GetPathTo("title menu attract") ); this->PostScreenMessage( SM_PlayComment, SECONDS_BETWEEN_COMMENTS ); break; case SM_GoToNextScreen: - switch( m_Choice ) + /* XXX: Bad hack: we only want to set default options if we're actually + * going into the game. We don't want to set it if we're going into the + * editor menu, since that never resets options (so it'll maintain changes + * when entering and exiting the editor), and the editor probably shouldn't + * use default options. */ + if( m_Choice == 0 ) { - case CHOICE_GAME_START: - { - // apply default options - for( int p=0; pm_PlayerOptions[p].FromString( PREFSMAN->m_sDefaultModifiers ); - GAMESTATE->m_SongOptions.FromString( PREFSMAN->m_sDefaultModifiers ); - - SCREENMAN->SetNewScreen( NEXT_SCREEN ); - } - break; - case CHOICE_SELECT_GAME: - SCREENMAN->SetNewScreen( "ScreenSelectGame" ); - break; - case CHOICE_OPTIONS: - SCREENMAN->SetNewScreen( "ScreenOptionsMenu" ); - break; - case CHOICE_JUKEBOX: - SCREENMAN->SetNewScreen( "ScreenJukeboxMenu" ); - break; - #ifdef DEBUG -// case CHOICE_NETWORKPLAY: -// NETWORKMAN->Connect(); -// break; - case CHOICE_SANDBOX: - SCREENMAN->SetNewScreen( "ScreenTest" ); - break; - #endif - case CHOICE_EDIT: - SCREENMAN->SetNewScreen( "ScreenEditMenu" ); - break; - case CHOICE_EDIT_COURSES: - SCREENMAN->SetNewScreen( "ScreenEditCoursesMenu" ); - break; - case CHOICE_EXIT: - default: - RAGE_ASSERT_M(0, "CHOICE_EXIT reached?"); // should never get here - break; + // apply default options + for( int p=0; pm_PlayerOptions[p].FromString( PREFSMAN->m_sDefaultModifiers ); + GAMESTATE->m_SongOptions.FromString( PREFSMAN->m_sDefaultModifiers ); } + m_aModeChoices[m_Choice].ApplyToAllPlayers(); break; case SM_GoToAttractLoop: SCREENMAN->SetNewScreen( "ScreenCompany" ); diff --git a/stepmania/src/ScreenTitleMenu.h b/stepmania/src/ScreenTitleMenu.h index e59fa9e45d..bb51065d74 100644 --- a/stepmania/src/ScreenTitleMenu.h +++ b/stepmania/src/ScreenTitleMenu.h @@ -14,12 +14,12 @@ #include "Sprite.h" #include "BitmapText.h" #include "RageSound.h" -#include "BGAnimation.h" #include "RageTimer.h" -#include "RandomSample.h" +#include "ScreenSelect.h" +#define MAX_MODE_CHOICES 30 -class ScreenTitleMenu : public Screen +class ScreenTitleMenu : public ScreenSelect { public: ScreenTitleMenu(); @@ -29,56 +29,22 @@ public: virtual void Update( float fDelta ); virtual void HandleScreenMessage( const ScreenMessage SM ); - enum Choice - { - CHOICE_GAME_START = 0, - CHOICE_SELECT_GAME, - CHOICE_OPTIONS, - CHOICE_EDIT, - CHOICE_EDIT_COURSES, - CHOICE_JUKEBOX, - #ifdef DEBUG -// CHOICE_NETWORKPLAY, - CHOICE_SANDBOX, - #endif - CHOICE_EXIT, - NUM_CHOICES // leave this at the end! - }; - - CString ChoiceToString( Choice c ) - { - const CString s[NUM_CHOICES] = { - "GAME START", - "SELECT GAME", - "OPTIONS", - "EDIT/SYNC SONGS", - "EDIT COURSES", - "JUKEBOX", - #ifdef DEBUG -// "NETWORK PLAY", - "SANDBOX", - #endif - "EXIT" - }; - return s[c]; - } - - private: + int GetSelectionIndex( PlayerNumber pn ) { return m_Choice; } + void UpdateSelectableChoices(); + void GainFocus( int iChoiceIndex ); void LoseFocus( int iChoiceIndex ); void MoveCursor( bool up ); - Choice m_Choice; + unsigned m_Choice; - BGAnimation m_Background; Sprite m_sprLogo; BitmapText m_textVersion; BitmapText m_textSongs; BitmapText m_textHelp; - BitmapText m_textChoice[NUM_CHOICES]; + BitmapText m_textChoice[MAX_MODE_CHOICES]; - RandomSample m_soundAttract; RageSound m_soundChange; RageSound m_soundSelect; RageSound m_soundInvalid; @@ -88,9 +54,7 @@ private: BGAnimation m_CoinMode; BGAnimation m_JointPremium; - Transition m_In; - Transition m_Out; - Transition m_BeginOut; + Transition m_AttractOut; };