Move miss combo calculations into the ScoreKeeper.

This commit is contained in:
Steve Checkoway
2006-10-01 04:02:28 +00:00
parent 9df54e925c
commit fcbe0609c3
6 changed files with 45 additions and 50 deletions
+21 -42
View File
@@ -1536,55 +1536,24 @@ void Player::RandomizeNotes( int iNoteRow )
void Player::HandleTapRowScore( unsigned row )
{
PlayerNumber pn = m_pPlayerState->m_PlayerNumber;
const TapNote &lastTN = NoteDataWithScoring::LastTapNoteWithResult( m_NoteData, row, pn );
TapNoteScore scoreOfLastTap = lastTN.result.tns;
bool NoCheating = true;
bool bNoCheating = true;
#ifdef DEBUG
NoCheating = false;
bNoCheating = false;
#endif
if( GAMESTATE->m_bDemonstrationOrJukebox )
NoCheating = false;
bNoCheating = false;
// don't accumulate points if AutoPlay is on.
if( NoCheating && m_pPlayerState->m_PlayerController == PC_AUTOPLAY )
if( bNoCheating && m_pPlayerState->m_PlayerController == PC_AUTOPLAY )
return;
/* Update miss combo, and handle "combo stopped" messages. */
/* When is m_pPlayerStageStats NULL? Would it be cleaner to pass Player a dummy
* PlayerStageStats in this case, instead of having to carefully check for NULL
* every time we use it? -glenn */
int iDummy = 0;
int &iCurCombo = m_pPlayerStageStats ? m_pPlayerStageStats->iCurCombo : iDummy;
int &iCurMissCombo = m_pPlayerStageStats ? m_pPlayerStageStats->iCurMissCombo : iDummy;
switch( scoreOfLastTap )
{
case TNS_W1:
case TNS_W2:
case TNS_W3:
iCurMissCombo = 0;
SCREENMAN->PostMessageToTopScreen( SM_MissComboAborted, 0 );
break;
PlayerNumber pn = m_pPlayerState->m_PlayerNumber;
TapNoteScore scoreOfLastTap = NoteDataWithScoring::LastTapNoteWithResult(m_NoteData, row, pn).result.tns;
const int iOldCombo = m_pPlayerStageStats ? m_pPlayerStageStats->iCurCombo : 0;
case TNS_Miss:
++iCurMissCombo;
if( scoreOfLastTap == TNS_Miss )
m_LastTapNoteScore = TNS_Miss;
case TNS_W4:
case TNS_W5:
if( iCurCombo > 50 )
SCREENMAN->PostMessageToTopScreen( SM_ComboStopped, 0 );
iCurCombo = 0;
break;
default:
ASSERT( 0 );
}
/* The score keeper updates the hit combo. Remember the old combo for handling announcers. */
const int iOldCombo = iCurCombo;
for( int track = 0; track < m_NoteData.GetNumTracks(); ++track )
{
const TapNote &tn = m_NoteData.GetTapNote( track, row );
@@ -1598,11 +1567,21 @@ void Player::HandleTapRowScore( unsigned row )
if( m_pSecondaryScoreKeeper )
m_pSecondaryScoreKeeper->HandleTapScore( tn );
}
bool bComboStopped = false;
bool bMissComboStopped = false;
if( m_pPrimaryScoreKeeper != NULL )
m_pPrimaryScoreKeeper->HandleTapRowScore( m_NoteData, row );
m_pPrimaryScoreKeeper->HandleTapRowScore( m_NoteData, row, bComboStopped, bMissComboStopped );
if( bMissComboStopped )
SCREENMAN->PostMessageToTopScreen( SM_MissComboAborted, 0 );
if( bComboStopped && iOldCombo > 50 )
SCREENMAN->PostMessageToTopScreen( SM_ComboStopped, 0 );
if( m_pSecondaryScoreKeeper != NULL )
m_pSecondaryScoreKeeper->HandleTapRowScore( m_NoteData, row );
m_pSecondaryScoreKeeper->HandleTapRowScore( m_NoteData, row, bComboStopped, bMissComboStopped );
const int iCurCombo = m_pPlayerStageStats ? m_pPlayerStageStats->iCurCombo : 0;
const int iCurMissCombo = m_pPlayerStageStats ? m_pPlayerStageStats->iCurMissCombo : 0;
if( m_pPlayerStageStats && m_pCombo )
{
+1 -1
View File
@@ -49,7 +49,7 @@ public:
virtual void OnNextSong( int iSongInCourseIndex, const Steps* pSteps, const NoteData* pNoteData ) = 0; // before a song plays (called multiple times if course)
virtual void HandleTapScore( const TapNote &tn ) = 0;
virtual void HandleTapRowScore( const NoteData &nd, int iRow ) = 0;
virtual void HandleTapRowScore( const NoteData &nd, int iRow, bool &bComboStopped, bool &bMissComboStopped ) = 0;
virtual void HandleHoldScore( const TapNote &tn ) = 0;
protected:
+16 -3
View File
@@ -350,10 +350,13 @@ void ScoreKeeperNormal::HandleTapScore( const TapNote &tn )
}
}
void ScoreKeeperNormal::HandleTapRowScore( const NoteData &nd, int iRow )
void ScoreKeeperNormal::HandleTapRowScore( const NoteData &nd, int iRow, bool &bComboStopped, bool &bMissComboStopped )
{
TapNoteScore scoreOfLastTap;
int iNumTapsInRow;
bComboStopped = false;
bMissComboStopped = false;
GetScoreOfLastTapInRow( nd, iRow, scoreOfLastTap, iNumTapsInRow );
if( iNumTapsInRow <= 0 )
@@ -373,10 +376,20 @@ void ScoreKeeperNormal::HandleTapRowScore( const NoteData &nd, int iRow )
// Regular combo
//
const int iComboCountIfHit = m_bComboIsPerRow? 1: iNumTapsInRow;
if( scoreOfLastTap >= m_MinScoreToContinueCombo )
m_pPlayerStageStats->iCurCombo += iComboCountIfHit;
if( scoreOfLastTap >= m_MinScoreToMaintainCombo )
{
bMissComboStopped = true;
m_pPlayerStageStats->iCurMissCombo = 0;
if( scoreOfLastTap >= m_MinScoreToContinueCombo )
m_pPlayerStageStats->iCurCombo += iComboCountIfHit;
}
else if( scoreOfLastTap < m_MinScoreToMaintainCombo )
{
bComboStopped = true;
m_pPlayerStageStats->iCurCombo = 0;
if( scoreOfLastTap == TNS_Miss )
++m_pPlayerStageStats->iCurMissCombo;
}
AddScore( scoreOfLastTap ); // only score once per row
+1 -1
View File
@@ -51,7 +51,7 @@ public:
void OnNextSong( int iSongInCourseIndex, const Steps* pSteps, const NoteData* pNoteData );
void HandleTapScore( const TapNote &tn );
void HandleTapRowScore( const NoteData &nd, int iRow );
void HandleTapRowScore( const NoteData &nd, int iRow, bool &bComboStopped, bool &bMissComboStopped );
void HandleHoldScore( const TapNote &tn );
// This must be calculated using only cached radar values so that we can
+5 -2
View File
@@ -31,12 +31,15 @@ void ScoreKeeperRave::HandleTapScore( const TapNote &tn )
#define CROSSED( val ) (fOld < val && fNew >= val)
#define CROSSED_ATTACK_LEVEL( level ) CROSSED(1.f/NUM_ATTACK_LEVELS*(level+1))
void ScoreKeeperRave::HandleTapRowScore( const NoteData &nd, int iRow )
void ScoreKeeperRave::HandleTapRowScore( const NoteData &nd, int iRow, bool &bComboStopped, bool &bMissComboStopped )
{
TapNoteScore scoreOfLastTap;
int iNumTapsInRow;
float fPercentToMove;
bComboStopped = false;
bMissComboStopped = false;
GetScoreOfLastTapInRow( nd, iRow, scoreOfLastTap, iNumTapsInRow );
if( iNumTapsInRow <= 0 )
return;
+1 -1
View File
@@ -13,7 +13,7 @@ public:
ScoreKeeperRave( PlayerState *pPlayerState, PlayerStageStats *pPlayerStageStats );
void OnNextSong( int iSongInCourseIndex, const Steps *pSteps, const NoteData *pNoteData ) { }
void HandleTapScore( const TapNote &tn );
void HandleTapRowScore( const NoteData &nd, int iRow );
void HandleTapRowScore( const NoteData &nd, int iRow, bool &bComboStopped, bool &bMissComboStopped );
void HandleHoldScore( const TapNote &tn );
protected: