From d9eb540d4cf0513d4c9659c638a579b2975c1f91 Mon Sep 17 00:00:00 2001 From: Chris Danford Date: Sun, 10 Apr 2005 06:21:59 +0000 Subject: [PATCH] Add GiveUpGoesToNextScreen. Used in workout so that giving up doesn't loose everything you've done in the stage so far. --- stepmania/Themes/default/metrics.ini | 1 + stepmania/src/ScreenGameplay.cpp | 154 +++++++++++++++------------ stepmania/src/ScreenGameplay.h | 1 + 3 files changed, 85 insertions(+), 71 deletions(-) diff --git a/stepmania/Themes/default/metrics.ini b/stepmania/Themes/default/metrics.ini index 4871530355..0a28e3d6e5 100644 --- a/stepmania/Themes/default/metrics.ini +++ b/stepmania/Themes/default/metrics.ini @@ -1188,6 +1188,7 @@ PlayerP2TwoPlayersTwoSidesX=SCREEN_CENTER_X+160 PlayerP1OnePlayerTwoSidesX=SCREEN_CENTER_X PlayerP2OnePlayerTwoSidesX=SCREEN_CENTER_X StopCourseEarly=0 +GivingUpGoesToNextScreen=0 [ScreenGameplayExtra] Class=ScreenGameplay diff --git a/stepmania/src/ScreenGameplay.cpp b/stepmania/src/ScreenGameplay.cpp index 668391bd60..e396ada40b 100644 --- a/stepmania/src/ScreenGameplay.cpp +++ b/stepmania/src/ScreenGameplay.cpp @@ -78,6 +78,7 @@ AutoScreenMessage( SM_SaveChangedBeforeGoingBack ) AutoScreenMessage( SM_GoToScreenAfterBack ) AutoScreenMessage( SM_BeginFailed ) +AutoScreenMessage( SM_LeaveGameplay ) // received while STATE_INTRO AutoScreenMessage( SM_StartHereWeGo ) @@ -95,6 +96,7 @@ ScreenGameplay::ScreenGameplay( CString sName ) : ScreenWithMenuElements(sName) START_GIVES_UP.Load( sName, "StartGivesUp" ); BACK_GIVES_UP.Load( sName, "BackGivesUp" ); GIVING_UP_FAILS.Load( sName, "GivingUpFails" ); + GIVING_UP_GOES_TO_NEXT_SCREEN.Load( sName, "GivingUpGoesToNextScreen" ); } void ScreenGameplay::Init() @@ -1523,6 +1525,11 @@ void ScreenGameplay::Update( float fDeltaTime ) this->PostScreenMessage( SM_NotesEnded, 0 ); } + else if( GIVING_UP_GOES_TO_NEXT_SCREEN ) + { + HandleScreenMessage( SM_LeaveGameplay ); + return; + } else { BackOutFromGameplay(); @@ -2129,77 +2136,7 @@ void ScreenGameplay::HandleScreenMessage( const ScreenMessage SM ) if( bStopCourseEarly || bAllReallyFailed || bIsLastSong ) { // Time to leave from ScreenGameplay - - // update dancing characters for win / lose - DancingCharacters *Dancers = m_SongBackground.GetDancingCharacters(); - if( Dancers ) - { - FOREACH_EnabledPlayer(p) - { - /* XXX: In battle modes, switch( GAMESTATE->GetStageResult(p) ). */ - if( STATSMAN->m_CurStageStats.m_player[p].bFailed ) - Dancers->Change2DAnimState( p, AS2D_FAIL ); // fail anim - else if( m_pLifeMeter[p] && m_pLifeMeter[p]->GetLife() == 1.0f ) // full life - Dancers->Change2DAnimState( p, AS2D_WINFEVER ); // full life pass anim - else - Dancers->Change2DAnimState( p, AS2D_WIN ); // pass anim - } - } - - /* End round. */ - if( m_DancingState == STATE_OUTRO ) // ScreenGameplay already ended - return; // ignore - m_DancingState = STATE_OUTRO; - AbortGiveUp( false ); - - GAMESTATE->RemoveAllActiveAttacks(); - FOREACH_EnabledPlayer( p ) - m_ActiveAttackList[p].Refresh(); - - LIGHTSMAN->SetLightsMode( LIGHTSMODE_ALL_CLEARED ); - - - if( bAllReallyFailed ) - { - this->PostScreenMessage( SM_BeginFailed, 0 ); - return; - } - - // do they deserve an extra stage? - if( GAMESTATE->HasEarnedExtraStage() ) - { - TweenOffScreen(); - m_Extra.StartTransitioning( SM_GoToNextScreen ); - SOUND->PlayOnceFromAnnouncer( "gameplay extra" ); - } - else - { - TweenOffScreen(); - - switch( GAMESTATE->m_PlayMode ) - { - case PLAY_MODE_BATTLE: - case PLAY_MODE_RAVE: - { - PlayerNumber winner = GAMESTATE->GetBestPlayer(); - switch( winner ) - { - case PLAYER_INVALID: - m_Draw.StartTransitioning( SM_GoToNextScreen ); - break; - default: - m_Win[winner].StartTransitioning( SM_GoToNextScreen ); - break; - } - } - break; - default: - m_Cleared.StartTransitioning( SM_GoToNextScreen ); - break; - } - - SOUND->PlayOnceFromAnnouncer( "gameplay cleared" ); - } + HandleScreenMessage( SM_LeaveGameplay ); } else { @@ -2213,6 +2150,81 @@ void ScreenGameplay::HandleScreenMessage( const ScreenMessage SM ) return; } } + else if( SM == SM_LeaveGameplay ) + { + // update dancing characters for win / lose + DancingCharacters *Dancers = m_SongBackground.GetDancingCharacters(); + if( Dancers ) + { + FOREACH_EnabledPlayer(p) + { + /* XXX: In battle modes, switch( GAMESTATE->GetStageResult(p) ). */ + if( STATSMAN->m_CurStageStats.m_player[p].bFailed ) + Dancers->Change2DAnimState( p, AS2D_FAIL ); // fail anim + else if( m_pLifeMeter[p] && m_pLifeMeter[p]->GetLife() == 1.0f ) // full life + Dancers->Change2DAnimState( p, AS2D_WINFEVER ); // full life pass anim + else + Dancers->Change2DAnimState( p, AS2D_WIN ); // pass anim + } + } + + /* End round. */ + if( m_DancingState == STATE_OUTRO ) // ScreenGameplay already ended + return; // ignore + m_DancingState = STATE_OUTRO; + AbortGiveUp( false ); + + GAMESTATE->RemoveAllActiveAttacks(); + FOREACH_EnabledPlayer( p ) + m_ActiveAttackList[p].Refresh(); + + LIGHTSMAN->SetLightsMode( LIGHTSMODE_ALL_CLEARED ); + + bool bAllReallyFailed = STATSMAN->m_CurStageStats.AllFailed(); + + if( bAllReallyFailed ) + { + this->PostScreenMessage( SM_BeginFailed, 0 ); + return; + } + + // do they deserve an extra stage? + if( GAMESTATE->HasEarnedExtraStage() ) + { + TweenOffScreen(); + m_Extra.StartTransitioning( SM_GoToNextScreen ); + SOUND->PlayOnceFromAnnouncer( "gameplay extra" ); + } + else + { + TweenOffScreen(); + + switch( GAMESTATE->m_PlayMode ) + { + case PLAY_MODE_BATTLE: + case PLAY_MODE_RAVE: + { + PlayerNumber winner = GAMESTATE->GetBestPlayer(); + switch( winner ) + { + case PLAYER_INVALID: + m_Draw.StartTransitioning( SM_GoToNextScreen ); + break; + default: + m_Win[winner].StartTransitioning( SM_GoToNextScreen ); + break; + } + } + break; + default: + m_Cleared.StartTransitioning( SM_GoToNextScreen ); + break; + } + + SOUND->PlayOnceFromAnnouncer( "gameplay cleared" ); + } + + } else if( SM == SM_StartLoadingNextSong ) { m_pSoundMusic->Stop(); diff --git a/stepmania/src/ScreenGameplay.h b/stepmania/src/ScreenGameplay.h index 05db700035..9160018421 100644 --- a/stepmania/src/ScreenGameplay.h +++ b/stepmania/src/ScreenGameplay.h @@ -51,6 +51,7 @@ protected: ThemeMetric START_GIVES_UP; ThemeMetric BACK_GIVES_UP; ThemeMetric GIVING_UP_FAILS; + ThemeMetric GIVING_UP_GOES_TO_NEXT_SCREEN; void TweenOnScreen(); void TweenOffScreen();