diff --git a/Themes/_fallback/Languages/en.ini b/Themes/_fallback/Languages/en.ini index ea0b08a71d..d5429ea236 100644 --- a/Themes/_fallback/Languages/en.ini +++ b/Themes/_fallback/Languages/en.ini @@ -133,6 +133,7 @@ EffectDown=EffectDown Right=Right Select=Select Start=Start +Restart=Restart Up=Up UpLeft=UpLeft UpRight=UpRight diff --git a/src/Game.cpp b/src/Game.cpp index b2e318cca3..f6dfaffb83 100644 --- a/src/Game.cpp +++ b/src/Game.cpp @@ -24,6 +24,7 @@ static const Game::PerButtonInfo g_CommonButtonInfo[] = { GameButtonType_Menu }, // GAME_BUTTON_START { GameButtonType_Menu }, // GAME_BUTTON_SELECT { GameButtonType_Menu }, // GAME_BUTTON_BACK + { GameButtonType_Menu }, // GAME_BUTTON_RESTART { GameButtonType_Menu }, // GAME_BUTTON_COIN { GameButtonType_Menu }, // GAME_BUTTON_OPERATOR { GameButtonType_Menu }, // GAME_BUTTON_EFFECT_UP diff --git a/src/GameInput.h b/src/GameInput.h index c3ed05ea06..5533d81cc3 100644 --- a/src/GameInput.h +++ b/src/GameInput.h @@ -26,6 +26,7 @@ enum GameButton GAME_BUTTON_START, GAME_BUTTON_SELECT, GAME_BUTTON_BACK, + GAME_BUTTON_RESTART, GAME_BUTTON_COIN, /**< Insert a coin to play. */ GAME_BUTTON_OPERATOR, /**< Access the operator menu. */ GAME_BUTTON_EFFECT_UP, diff --git a/src/InputMapper.cpp b/src/InputMapper.cpp index fc4ec6e644..1927ef2255 100644 --- a/src/InputMapper.cpp +++ b/src/InputMapper.cpp @@ -1208,6 +1208,7 @@ static const InputScheme::GameButtonInfo g_CommonGameButtonInfo[] = { "Start", GAME_BUTTON_START }, { "Select", GAME_BUTTON_SELECT }, { "Back", GAME_BUTTON_BACK }, + { "Restart", GAME_BUTTON_RESTART }, { "Coin", GAME_BUTTON_COIN }, { "Operator", GAME_BUTTON_OPERATOR }, { "EffectUp", GAME_BUTTON_EFFECT_UP }, diff --git a/src/Screen.cpp b/src/Screen.cpp index be254d134a..9f60bf74e3 100644 --- a/src/Screen.cpp +++ b/src/Screen.cpp @@ -228,9 +228,10 @@ bool Screen::Input( const InputEventPlus &input ) return this->MenuBack( input ); } return false; - case GAME_BUTTON_START: return this->MenuStart ( input ); - case GAME_BUTTON_SELECT: return this->MenuSelect( input ); - case GAME_BUTTON_COIN: return this->MenuCoin ( input ); + case GAME_BUTTON_START: return this->MenuStart ( input ); + case GAME_BUTTON_SELECT: return this->MenuSelect ( input ); + case GAME_BUTTON_RESTART: return this->MenuRestart( input ); + case GAME_BUTTON_COIN: return this->MenuCoin ( input ); default: return false; } } diff --git a/src/Screen.h b/src/Screen.h index 946d2ff590..43a848de18 100644 --- a/src/Screen.h +++ b/src/Screen.h @@ -141,6 +141,7 @@ public: virtual bool MenuRight(const InputEventPlus &) { return false; } virtual bool MenuStart(const InputEventPlus &) { return false; } virtual bool MenuSelect(const InputEventPlus &) { return false; } + virtual bool MenuRestart(const InputEventPlus &) { return false; } virtual bool MenuBack(const InputEventPlus &) { return false; } virtual bool MenuCoin(const InputEventPlus &) { return false; } // todo? -aj diff --git a/src/ScreenEvaluation.cpp b/src/ScreenEvaluation.cpp index 933fab89cd..c0b935a33e 100644 --- a/src/ScreenEvaluation.cpp +++ b/src/ScreenEvaluation.cpp @@ -729,6 +729,13 @@ bool ScreenEvaluation::Input( const InputEventPlus &input ) if( IsTransitioning() ) return false; + if (input.MenuI == GAME_BUTTON_RESTART && input.type == IET_FIRST_PRESS && + GAMESTATE->IsEventMode() && !GAMESTATE->IsCourseMode()) + { + return MenuRestart(input); + } + + if( input.GameI.IsValid() ) { if( CodeDetector::EnteredCode(input.GameI.controller, CODE_SAVE_SCREENSHOT1) || @@ -795,6 +802,16 @@ bool ScreenEvaluation::MenuStart( const InputEventPlus &input ) return true; } +bool ScreenEvaluation::MenuRestart( const InputEventPlus &input ) +{ + if( IsTransitioning() ) + return false; + + SCREENMAN->GetTopScreen()->SetNextScreenName("ScreenGameplay"); + StartTransitioningScreen( SM_GoToNextScreen ); + return true; +} + void ScreenEvaluation::HandleMenuStart() { StartTransitioningScreen( SM_GoToNextScreen ); diff --git a/src/ScreenEvaluation.h b/src/ScreenEvaluation.h index b098849188..6feccc83bf 100644 --- a/src/ScreenEvaluation.h +++ b/src/ScreenEvaluation.h @@ -57,6 +57,7 @@ public: virtual bool MenuBack( const InputEventPlus &input ); virtual bool MenuStart( const InputEventPlus &input ); + virtual bool MenuRestart( const InputEventPlus &input ); virtual void PushSelf( lua_State *L ); StageStats *GetStageStats() { return m_pStageStats; } diff --git a/src/ScreenGameplay.cpp b/src/ScreenGameplay.cpp index 1041403134..adb0d83a50 100644 --- a/src/ScreenGameplay.cpp +++ b/src/ScreenGameplay.cpp @@ -890,6 +890,20 @@ bool ScreenGameplay::Center1Player() const GAMESTATE->GetCurrentStyle(PLAYER_INVALID)->m_StyleType == StyleType_OnePlayerOneSide; } +bool ScreenGameplay::MenuRestart( const InputEventPlus &input ) +{ + if( IsTransitioning() ) + return false; + + m_DancingState = STATE_OUTRO; + m_pSoundMusic->StopPlaying(); + m_GameplayAssist.StopPlaying(); // Stop any queued assist ticks. + + SCREENMAN->GetTopScreen()->SetNextScreenName("ScreenGameplay"); + m_Cancel.StartTransitioning( SM_GoToNextScreen ); + return true; +} + // fill in m_apSongsQueue, m_vpStepsQueue, m_asModifiersQueue void ScreenGameplay::InitSongQueues() { @@ -2404,6 +2418,12 @@ bool ScreenGameplay::Input( const InputEventPlus &input ) return false; } + if (input.MenuI == GAME_BUTTON_RESTART && input.type == IET_FIRST_PRESS && + GAMESTATE->IsEventMode() && !GAMESTATE->IsCourseMode()) + { + return MenuRestart(input); + } + if(m_DancingState != STATE_OUTRO && GAMESTATE->IsHumanPlayer(input.pn) && !m_Cancel.IsTransitioning() ) diff --git a/src/ScreenGameplay.h b/src/ScreenGameplay.h index 2431dd6f54..9739e19195 100644 --- a/src/ScreenGameplay.h +++ b/src/ScreenGameplay.h @@ -165,6 +165,8 @@ public: * @return true if we center the solo player, false otherwise. */ bool Center1Player() const; + bool MenuRestart( const InputEventPlus &input ); + // Lua virtual void PushSelf( lua_State *L ); Song *GetNextCourseSong() const;