diff --git a/stepmania/src/ScoreKeeperMAX2.cpp b/stepmania/src/ScoreKeeperMAX2.cpp index e8a3bc3037..6b732709ed 100644 --- a/stepmania/src/ScoreKeeperMAX2.cpp +++ b/stepmania/src/ScoreKeeperMAX2.cpp @@ -8,8 +8,12 @@ ScoreKeeperMAX2::ScoreKeeperMAX2(Notes *notes, NoteDataWithScoring &data, int pn // Stats_DoublesCount = true; int Meter = notes? notes->m_iMeter : 5; - int m_iNumTapNotes = data.GetNumTapNotes(); - int sum = (m_iNumTapNotes * (m_iNumTapNotes + 1)) / 2; + + /* Hold notes count as two tap notes. However, hold notes already count + * as 1 in GetNumTapNotes(), so only add 1*GetNumHoldNotes, not 2. */ + int iNumTapNotes = data.GetNumTapNotes() + data.GetNumHoldNotes(); + + int sum = (iNumTapNotes * (iNumTapNotes + 1)) / 2; if(sum) m_fScoreMultiplier = float(Meter * 1000000) / sum; @@ -22,6 +26,24 @@ ScoreKeeperMAX2::ScoreKeeperMAX2(Notes *notes, NoteDataWithScoring &data, int pn m_lScore = 0; } +void ScoreKeeperMAX2::AddScore( TapNoteScore score ) +{ + int p; // score multiplier + + switch( score ) + { + case TNS_PERFECT: p = 10; break; + case TNS_GREAT: p = 5; break; + default: p = 0; break; + } + + m_lScore += p * ++m_iTapNotesHit; + + ASSERT(m_lScore >= 0); + + GAMESTATE->m_fScore[m_PlayerNumber] = m_lScore * m_fScoreMultiplier; +} + void ScoreKeeperMAX2::HandleNoteScore( TapNoteScore score, int iNumTapsInRow ) { ScoreKeeper::HandleNoteScore(score, iNumTapsInRow); @@ -69,21 +91,8 @@ void ScoreKeeperMAX2::HandleNoteScore( TapNoteScore score, int iNumTapsInRow ) keeping these seperate for as long as possible improves accuracy. */ - int p; // score multiplier - - switch( score ) - { - case TNS_PERFECT: p = 10; break; - case TNS_GREAT: p = 5; break; - default: p = 0; break; - } - for( int i=0; i= 0); - - GAMESTATE->m_fScore[m_PlayerNumber] = m_lScore * m_fScoreMultiplier; + AddScore( score ); } @@ -92,4 +101,7 @@ void ScoreKeeperMAX2::HandleHoldNoteScore( HoldNoteScore score, TapNoteScore Tap // update dance points totals GAMESTATE->m_HoldNoteScores[m_PlayerNumber][score] ++; GAMESTATE->m_iActualDancePoints[m_PlayerNumber] += HoldNoteScoreToDancePoints( score ); + + if( score == HNS_OK ) + AddScore( TNS_PERFECT ); } diff --git a/stepmania/src/ScoreKeeperMAX2.h b/stepmania/src/ScoreKeeperMAX2.h index 00cd8b11d0..73a59f4bda 100644 --- a/stepmania/src/ScoreKeeperMAX2.h +++ b/stepmania/src/ScoreKeeperMAX2.h @@ -22,6 +22,8 @@ class ScoreKeeperMAX2: public ScoreKeeper float m_fScoreMultiplier; int m_iTapNotesHit; // number of notes judged so far, needed by scoring + void AddScore( TapNoteScore score ); + public: ScoreKeeperMAX2(Notes *notes, NoteDataWithScoring &data, int pn);