From 751ca831c29646b1c154c6da24d36cb28d980bbf Mon Sep 17 00:00:00 2001 From: Glenn Maynard Date: Mon, 15 Sep 2003 22:48:37 +0000 Subject: [PATCH] Add StageStats::bFailedEarlier, to simplify gameplay logic. This should fix course weirdness. --- stepmania/src/CombinedLifeMeterEnemy.h | 1 - stepmania/src/CombinedLifeMeterTug.h | 1 - stepmania/src/LifeMeter.h | 2 - stepmania/src/LifeMeterBar.cpp | 6 +- stepmania/src/LifeMeterBar.h | 1 - stepmania/src/LifeMeterBattery.cpp | 14 +-- stepmania/src/LifeMeterBattery.h | 2 - stepmania/src/ScreenGameplay.cpp | 117 ++++++++++++------------- stepmania/src/StageStats.cpp | 1 + stepmania/src/StageStats.h | 7 +- 10 files changed, 66 insertions(+), 86 deletions(-) diff --git a/stepmania/src/CombinedLifeMeterEnemy.h b/stepmania/src/CombinedLifeMeterEnemy.h index 5bf604286a..01be2c7b11 100644 --- a/stepmania/src/CombinedLifeMeterEnemy.h +++ b/stepmania/src/CombinedLifeMeterEnemy.h @@ -31,7 +31,6 @@ public: virtual bool IsInDanger( PlayerNumber pn ) { return false; }; virtual bool IsHot( PlayerNumber pn ) { return false; }; virtual bool IsFailing( PlayerNumber pn ) { return false; }; - virtual bool FailedEarlier( PlayerNumber pn ) { return false; }; virtual void OnTaunt(); protected: diff --git a/stepmania/src/CombinedLifeMeterTug.h b/stepmania/src/CombinedLifeMeterTug.h index 782774769f..10d2e2f257 100644 --- a/stepmania/src/CombinedLifeMeterTug.h +++ b/stepmania/src/CombinedLifeMeterTug.h @@ -28,7 +28,6 @@ public: virtual bool IsInDanger( PlayerNumber pn ) { return false; }; virtual bool IsHot( PlayerNumber pn ) { return false; }; virtual bool IsFailing( PlayerNumber pn ) { return false; }; - virtual bool FailedEarlier( PlayerNumber pn ) { return false; }; protected: diff --git a/stepmania/src/LifeMeter.h b/stepmania/src/LifeMeter.h index 7af5628ee0..679ebc5283 100644 --- a/stepmania/src/LifeMeter.h +++ b/stepmania/src/LifeMeter.h @@ -34,7 +34,6 @@ public: virtual bool IsInDanger() = 0; virtual bool IsHot() = 0; virtual bool IsFailing() = 0; - virtual bool FailedEarlier() = 0; virtual void UpdateNonstopLifebar(int cleared, int total, int ProgressiveLifebarDifficulty) = 0; @@ -59,7 +58,6 @@ public: virtual bool IsInDanger( PlayerNumber pn ) = 0; virtual bool IsHot( PlayerNumber pn ) = 0; virtual bool IsFailing( PlayerNumber pn ) = 0; - virtual bool FailedEarlier( PlayerNumber pn ) = 0; virtual void OnTaunt() {}; }; diff --git a/stepmania/src/LifeMeterBar.cpp b/stepmania/src/LifeMeterBar.cpp index dae4aee084..33012bdbf3 100644 --- a/stepmania/src/LifeMeterBar.cpp +++ b/stepmania/src/LifeMeterBar.cpp @@ -376,7 +376,7 @@ void LifeMeterBar::ChangeLife( TapNoteScore score ) CLAMP( m_fLifePercentage, 0, 1 ); if( m_fLifePercentage <= FAIL_THRESHOLD ) - m_bFailedEarlier = true; + GAMESTATE->m_CurStageStats.bFailedEarlier[m_PlayerNumber] = true; m_fLifeVelocity += fDeltaLife; } @@ -414,10 +414,6 @@ bool LifeMeterBar::IsFailing() return m_fLifePercentage <= 0; } -bool LifeMeterBar::FailedEarlier() -{ - return m_bFailedEarlier; -} void LifeMeterBar::Update( float fDeltaTime ) { diff --git a/stepmania/src/LifeMeterBar.h b/stepmania/src/LifeMeterBar.h index cc1303456b..396c9c061b 100644 --- a/stepmania/src/LifeMeterBar.h +++ b/stepmania/src/LifeMeterBar.h @@ -35,7 +35,6 @@ public: virtual bool IsInDanger(); virtual bool IsHot(); virtual bool IsFailing(); - virtual bool FailedEarlier(); void UpdateNonstopLifebar(int cleared, int total, int ProgressiveLifebarDifficulty); void FillForHowToPlay(int NumPerfects, int NumMisses); diff --git a/stepmania/src/LifeMeterBattery.cpp b/stepmania/src/LifeMeterBattery.cpp index 1ba9407c07..5599105959 100644 --- a/stepmania/src/LifeMeterBattery.cpp +++ b/stepmania/src/LifeMeterBattery.cpp @@ -34,7 +34,6 @@ LifeMeterBattery::LifeMeterBattery() { m_iLivesLeft = GAMESTATE->m_SongOptions.m_iBatteryLives; m_iTrailingLivesLeft = m_iLivesLeft; - m_bFailedEarlier = false; m_fBatteryBlinkTime = 0; @@ -90,7 +89,7 @@ void LifeMeterBattery::Load( PlayerNumber pn ) void LifeMeterBattery::OnSongEnded() { - if( m_bFailedEarlier ) + if( GAMESTATE->m_CurStageStats.bFailedEarlier[m_PlayerNumber] ) return; if( m_iLivesLeft < GAMESTATE->m_SongOptions.m_iBatteryLives ) @@ -107,7 +106,7 @@ void LifeMeterBattery::OnSongEnded() void LifeMeterBattery::ChangeLife( TapNoteScore score ) { - if( m_bFailedEarlier ) + if( GAMESTATE->m_CurStageStats.bFailedEarlier[m_PlayerNumber] ) return; switch( score ) @@ -134,7 +133,7 @@ void LifeMeterBattery::ChangeLife( TapNoteScore score ) ASSERT(0); } if( m_iLivesLeft == 0 ) - m_bFailedEarlier = true; + GAMESTATE->m_CurStageStats.bFailedEarlier[m_PlayerNumber] = true; } void LifeMeterBattery::ChangeLife( HoldNoteScore score, TapNoteScore tscore ) @@ -188,12 +187,7 @@ bool LifeMeterBattery::IsHot() bool LifeMeterBattery::IsFailing() { - return m_bFailedEarlier; -} - -bool LifeMeterBattery::FailedEarlier() -{ - return m_bFailedEarlier; + return GAMESTATE->m_CurStageStats.bFailedEarlier[m_PlayerNumber]; } void LifeMeterBattery::Refresh() diff --git a/stepmania/src/LifeMeterBattery.h b/stepmania/src/LifeMeterBattery.h index 2b4c62ce8b..a026d07132 100644 --- a/stepmania/src/LifeMeterBattery.h +++ b/stepmania/src/LifeMeterBattery.h @@ -34,7 +34,6 @@ public: virtual bool IsInDanger(); virtual bool IsHot(); virtual bool IsFailing(); - virtual bool FailedEarlier(); virtual void UpdateNonstopLifebar(int cleared, int total, int ProgressiveLifebarDifficulty) { }; @@ -43,7 +42,6 @@ public: private: int m_iLivesLeft; // dead when 0 int m_iTrailingLivesLeft; // lags m_iLivesLeft - bool m_bFailedEarlier; float m_fBatteryBlinkTime; // if > 0 battery is blinking diff --git a/stepmania/src/ScreenGameplay.cpp b/stepmania/src/ScreenGameplay.cpp index 677cb62dce..18c7ee7f18 100644 --- a/stepmania/src/ScreenGameplay.cpp +++ b/stepmania/src/ScreenGameplay.cpp @@ -905,10 +905,8 @@ bool ScreenGameplay::AllAreFailing() bool ScreenGameplay::AllFailedEarlier() { for( int p=0; pIsPlayerEnabled(p) ) - if( (m_pLifeMeter[p] && !m_pLifeMeter[p]->FailedEarlier()) || - (m_pCombinedLifeMeter && !m_pCombinedLifeMeter->FailedEarlier((PlayerNumber)p)) ) - return false; + if( GAMESTATE->IsPlayerEnabled(p) && !GAMESTATE->m_CurStageStats.bFailedEarlier[p] ) + return false; return true; } @@ -1104,9 +1102,6 @@ void ScreenGameplay::Update( float fDeltaTime ) } } } - /* What is this line for? pn is always 2 here which goes into iPossibleDancePoints[0] - GAMESTATE->m_CurStageStats.bFailed[pn] = true; - */ // // Check to see if it's time to play a ScreenGameplay comment @@ -1156,74 +1151,62 @@ void ScreenGameplay::Update( float fDeltaTime ) m_soundAssistTick.Play(); } +/* Set m_CurStageStats.bFailed for failed players, send SM_BeginFailed + * if all players failed, and kill dead Oni players. This is all FAIL_ARCADE + * only. In FAIL_END_OF_SONG, this happens in SM_NotesEnded. */ void ScreenGameplay::UpdateCheckFail() { - int pn; - switch( GAMESTATE->m_SongOptions.m_FailType ) - { - case SongOptions::FAIL_ARCADE: - switch( GAMESTATE->m_SongOptions.m_LifeType ) - { - case SongOptions::LIFE_BAR: - if( AllAreFailing() ) SCREENMAN->PostMessageToTopScreen( SM_BeginFailed, 0 ); - if( AllAreInDanger() ) m_Background.TurnDangerOn(); - else m_Background.TurnDangerOff(); - // check for individual fail - for ( pn=0; pnIsFailing() && !GAMESTATE->m_CurStageStats.bFailed[pn]) || - (m_pCombinedLifeMeter && m_pCombinedLifeMeter->IsFailing((PlayerNumber)pn) && !GAMESTATE->m_CurStageStats.bFailed[pn]) ) - { - LOG->Trace("Player %d failed", (int)pn); - GAMESTATE->m_CurStageStats.bFailed[pn] = true; // fail - } - } - break; - case SongOptions::LIFE_BATTERY: - if( AllFailedEarlier() )SCREENMAN->PostMessageToTopScreen( SM_BeginFailed, 0 ); - if( AllAreInDanger() ) m_Background.TurnDangerOn(); - else m_Background.TurnDangerOff(); + if( GAMESTATE->m_SongOptions.m_FailType != SongOptions::FAIL_ARCADE ) + return; - // check for individual fail - for( pn=0; pnIsPlayerEnabled(pn) ) - continue; - if( (m_pLifeMeter[pn] && !m_pLifeMeter[pn]->IsFailing()) || - (m_pCombinedLifeMeter && !m_pCombinedLifeMeter->IsFailing((PlayerNumber)pn)) ) - continue; /* isn't failing */ - if( GAMESTATE->m_CurStageStats.bFailed[pn] ) - continue; /* failed and is already dead */ - - if( !AllFailedEarlier() ) // if not the last one to fail - { - // kill them! - m_soundOniDie.PlayRandom(); - ShowOniGameOver((PlayerNumber)pn); - m_Player[pn].Init(); // remove all notes and scoring - m_Player[pn].FadeToFail(); // tell the NoteField to fade to white - } - GAMESTATE->m_CurStageStats.bFailed[pn] = true; - } - break; - } - break; - case SongOptions::FAIL_END_OF_SONG: - // we still need to check for fail for scoring purposes + /* Handle the background danger graphic. */ + if( AllAreFailing() ) SCREENMAN->PostMessageToTopScreen( SM_BeginFailed, 0 ); + if( AllAreInDanger() ) m_Background.TurnDangerOn(); + else m_Background.TurnDangerOff(); + + int pn; + switch( GAMESTATE->m_SongOptions.m_LifeType ) + { + case SongOptions::LIFE_BAR: + // check for individual fail for ( pn=0; pnIsFailing() && !GAMESTATE->m_CurStageStats.bFailed[pn]) || - (m_pCombinedLifeMeter && m_pCombinedLifeMeter->IsFailing((PlayerNumber)pn) && !GAMESTATE->m_CurStageStats.bFailed[pn]) ) + if( !GAMESTATE->IsPlayerEnabled(pn) ) + continue; + if( GAMESTATE->m_CurStageStats.bFailed[pn] ) + continue; /* already failed */ + + if( (m_pLifeMeter[pn] && m_pLifeMeter[pn]->IsFailing()) || + (m_pCombinedLifeMeter && m_pCombinedLifeMeter->IsFailing((PlayerNumber)pn)) ) { LOG->Trace("Player %d failed", (int)pn); GAMESTATE->m_CurStageStats.bFailed[pn] = true; // fail } } break; - case SongOptions::FAIL_OFF: + case SongOptions::LIFE_BATTERY: + // check for individual fail + for( pn=0; pnIsPlayerEnabled(pn) ) + continue; + if( (m_pLifeMeter[pn] && !m_pLifeMeter[pn]->IsFailing()) || + (m_pCombinedLifeMeter && !m_pCombinedLifeMeter->IsFailing((PlayerNumber)pn)) ) + continue; /* isn't failing */ + if( GAMESTATE->m_CurStageStats.bFailed[pn] ) + continue; /* failed and is already dead */ + + if( !AllFailedEarlier() ) // if not the last one to fail + { + // kill them! + m_soundOniDie.PlayRandom(); + ShowOniGameOver((PlayerNumber)pn); + m_Player[pn].Init(); // remove all notes and scoring + m_Player[pn].FadeToFail(); // tell the NoteField to fade to white + } + GAMESTATE->m_CurStageStats.bFailed[pn] = true; + } break; - default: - ASSERT(0); } } @@ -1586,6 +1569,14 @@ void ScreenGameplay::HandleScreenMessage( const ScreenMessage SM ) GAMESTATE->RemoveAllActiveAttacks(); + /* All players failed. */ + if( GAMESTATE->m_SongOptions.m_FailType == SongOptions::FAIL_END_OF_SONG && AllFailedEarlier() ) + { + for( p=0; pIsPlayerEnabled(p) ) + GAMESTATE->m_CurStageStats.bFailed[p]=true; + } + for( p=0; pIsPlayerEnabled(p) ) diff --git a/stepmania/src/StageStats.cpp b/stepmania/src/StageStats.cpp index 2f5d0218b0..a400382726 100644 --- a/stepmania/src/StageStats.cpp +++ b/stepmania/src/StageStats.cpp @@ -36,6 +36,7 @@ void StageStats::AddStats( const StageStats& other ) iMeter[p] += other.iMeter[p] * iLengthMultiplier; fAliveSeconds[p] += other.fAliveSeconds[p]; bFailed[p] |= other.bFailed[p]; + bFailedEarlier[p] |= other.bFailedEarlier[p]; iPossibleDancePoints[p] += other.iPossibleDancePoints[p]; iActualDancePoints[p] += other.iActualDancePoints[p]; diff --git a/stepmania/src/StageStats.h b/stepmania/src/StageStats.h index 0811138f24..29ebe984f7 100644 --- a/stepmania/src/StageStats.h +++ b/stepmania/src/StageStats.h @@ -29,7 +29,12 @@ struct StageStats enum { STAGE_INVALID, STAGE_NORMAL, STAGE_EXTRA, STAGE_EXTRA2 } StageType; int iMeter[NUM_PLAYERS]; float fAliveSeconds[NUM_PLAYERS]; // how far into the music did they last before failing? Updated by Gameplay. - bool bFailed[NUM_PLAYERS]; // true if they have failed at any point during the song + /* This indicates whether the player failed the song; it's always false for FAIL_OFF + * and is only set to true in FAIL_END_OF_SONG at the end of the song. */ + bool bFailed[NUM_PLAYERS]; + /* This indicates whether the player bottomed out his bar/ran out of lives at some + * point during the song. It's set in all fail modes. */ + bool bFailedEarlier[NUM_PLAYERS]; int iPossibleDancePoints[NUM_PLAYERS]; int iActualDancePoints[NUM_PLAYERS]; int iTapNoteScores[NUM_PLAYERS][NUM_TAP_NOTE_SCORES];