From fc9f07158a0eaa8b1714e5e8b0177d188018ac86 Mon Sep 17 00:00:00 2001 From: Jason Felds Date: Wed, 8 Jun 2011 16:14:11 -0400 Subject: [PATCH] 99% fix scoring with warps and fakes. Now all charts can seek 100%. This does force yet another cache reload. Hopefully it won't slow first loads too much. --- Docs/Changelog_sm5.txt | 6 ++++++ src/NoteData.cpp | 29 +++++++++++++++++++++-------- src/NoteDataUtil.cpp | 5 +++++ src/ScoreKeeperNormal.cpp | 4 ++++ src/ScreenEdit.cpp | 5 +++++ src/ScreenGameplay.cpp | 2 +- src/Song.cpp | 2 +- 7 files changed, 43 insertions(+), 10 deletions(-) diff --git a/Docs/Changelog_sm5.txt b/Docs/Changelog_sm5.txt index e9ccf1cc69..0739778269 100644 --- a/Docs/Changelog_sm5.txt +++ b/Docs/Changelog_sm5.txt @@ -8,6 +8,12 @@ ________________________________________________________________________________ StepMania 5.0 Preview 2 | 20110??? -------------------------------------------------------------------------------- +2011/06/08 +---------- +* Any notes in a fake segment or warp segment are completely ignored for + scoring purposes. Now you can get 100% on your warping goodness! + [Wolfman2000] + 2011/06/06 ---------- * [PlayerOptions] Removed the ScoreDisplay mod choices. Use lua to make your diff --git a/src/NoteData.cpp b/src/NoteData.cpp index eac5bc42b4..50265d5b65 100644 --- a/src/NoteData.cpp +++ b/src/NoteData.cpp @@ -9,6 +9,7 @@ #include "RageUtil.h" #include "RageLog.h" #include "XmlFile.h" +#include "GameState.h" // blame radar calculations. #include "Foreach.h" #include "RageUtil_AutoPtr.h" @@ -467,7 +468,8 @@ int NoteData::GetNumTapNotes( int iStartIndex, int iEndIndex ) const { const TapNote &tn = GetTapNote(t, r); if( tn.type != TapNote::empty && tn.type != TapNote::mine - && tn.type != TapNote::lift && tn.type != TapNote::fake ) + && tn.type != TapNote::lift && tn.type != TapNote::fake + && GAMESTATE->GetProcessedTimingData()->IsJudgableAtRow(r) ) iNumNotes++; } } @@ -485,7 +487,7 @@ int NoteData::GetNumRowsWithTap( int iStartIndex, int iEndIndex ) const { int iNumNotes = 0; FOREACH_NONEMPTY_ROW_ALL_TRACKS_RANGE( *this, r, iStartIndex, iEndIndex ) - if( IsThereATapAtRow(r) ) + if( IsThereATapAtRow(r) && GAMESTATE->GetProcessedTimingData()->IsJudgableAtRow(r) ) iNumNotes++; return iNumNotes; @@ -498,7 +500,8 @@ int NoteData::GetNumMines( int iStartIndex, int iEndIndex ) const for( int t=0; tGetProcessedTimingData()->IsJudgableAtRow(r)) iNumMines++; } @@ -509,7 +512,7 @@ int NoteData::GetNumRowsWithTapOrHoldHead( int iStartIndex, int iEndIndex ) cons { int iNumNotes = 0; FOREACH_NONEMPTY_ROW_ALL_TRACKS_RANGE( *this, r, iStartIndex, iEndIndex ) - if( IsThereATapOrHoldHeadAtRow(r) ) + if( IsThereATapOrHoldHeadAtRow(r) && GAMESTATE->GetProcessedTimingData()->IsJudgableAtRow(r) ) iNumNotes++; return iNumNotes; @@ -560,7 +563,8 @@ int NoteData::GetNumRowsWithSimultaneousPresses( int iMinSimultaneousPresses, in { if( !RowNeedsAtLeastSimultaneousPresses(iMinSimultaneousPresses,r) ) continue; - + if (!GAMESTATE->GetProcessedTimingData()->IsJudgableAtRow(r)) + continue; iNum++; } @@ -576,7 +580,10 @@ int NoteData::GetNumRowsWithSimultaneousTaps( int iMinTaps, int iStartIndex, int for( int t=0; tGetProcessedTimingData()->IsJudgableAtRow(r)) iNumNotesThisIndex++; } if( iNumNotesThisIndex >= iMinTaps ) @@ -598,6 +605,8 @@ int NoteData::GetNumHoldNotes( int iStartIndex, int iEndIndex ) const if( lBegin->second.type != TapNote::hold_head || lBegin->second.subType != TapNote::hold_head_hold ) continue; + if (!GAMESTATE->GetProcessedTimingData()->IsJudgableAtRow(lBegin->first)) + continue; iNumHolds++; } } @@ -616,6 +625,8 @@ int NoteData::GetNumRolls( int iStartIndex, int iEndIndex ) const if( lBegin->second.type != TapNote::hold_head || lBegin->second.subType != TapNote::hold_head_roll ) continue; + if (!GAMESTATE->GetProcessedTimingData()->IsJudgableAtRow(lBegin->first)) + continue; iNumRolls++; } } @@ -629,7 +640,8 @@ int NoteData::GetNumLifts( int iStartIndex, int iEndIndex ) const for( int t=0; tGetProcessedTimingData()->IsJudgableAtRow(r)) iNumLifts++; } @@ -643,7 +655,8 @@ int NoteData::GetNumFakes( int iStartIndex, int iEndIndex ) const for( int t=0; tGetProcessedTimingData()->IsJudgableAtRow(r)) iNumFakes++; } diff --git a/src/NoteDataUtil.cpp b/src/NoteDataUtil.cpp index ccb9faf2b4..7ecbbe46ac 100644 --- a/src/NoteDataUtil.cpp +++ b/src/NoteDataUtil.cpp @@ -799,6 +799,11 @@ RadarStats CalculateRadarStatsFast( const NoteData &in, RadarStats &out ) { FOREACH_NONEMPTY_ROW_IN_TRACK_RANGE( in, t, r, 0, MAX_NOTE_ROW ) { + /* This function deals strictly with taps, jumps, hands, and quads. + * As such, all rows in here have to be judgable. */ + if (!GAMESTATE->GetProcessedTimingData()->IsJudgableAtRow(r)) + continue; + const TapNote &tn = in.GetTapNote(t, r); switch( tn.type ) { diff --git a/src/ScoreKeeperNormal.cpp b/src/ScoreKeeperNormal.cpp index e3872b8c83..d5b3494a5f 100644 --- a/src/ScoreKeeperNormal.cpp +++ b/src/ScoreKeeperNormal.cpp @@ -219,6 +219,8 @@ void ScoreKeeperNormal::OnNextSong( int iSongInCourseIndex, const Steps* pSteps, ASSERT( m_iMaxPossiblePoints >= 0 ); m_iMaxScoreSoFar += m_iMaxPossiblePoints; + GAMESTATE->SetProcessedTimingData(const_cast(&pSteps->m_Timing)); + m_iNumTapsAndHolds = pNoteData->GetNumRowsWithTapOrHoldHead() + pNoteData->GetNumHoldNotes() + pNoteData->GetNumRolls(); @@ -232,6 +234,8 @@ void ScoreKeeperNormal::OnNextSong( int iSongInCourseIndex, const Steps* pSteps, ASSERT( m_iPointBonus >= 0 ); m_iTapNotesHit = 0; + + GAMESTATE->SetProcessedTimingData(NULL); } static int GetScore(int p, int Z, int S, int n) diff --git a/src/ScreenEdit.cpp b/src/ScreenEdit.cpp index c6905545f4..ac98d5c18e 100644 --- a/src/ScreenEdit.cpp +++ b/src/ScreenEdit.cpp @@ -1152,6 +1152,9 @@ void ScreenEdit::UpdateTextInfo() sText += ssprintf( TAP_NOTE_TYPE_FORMAT.GetValue(), TAP_NOTE_TYPE.GetValue().c_str(), TapNoteTypeToString( m_selectedTap.type ).c_str() ); break; } + + GAMESTATE->SetProcessedTimingData(&m_pSteps->m_Timing); + sText += ssprintf( NUM_STEPS_FORMAT.GetValue(), TAP_STEPS.GetValue().c_str(), m_NoteDataEdit.GetNumTapNotes() ); sText += ssprintf( NUM_JUMPS_FORMAT.GetValue(), JUMPS.GetValue().c_str(), m_NoteDataEdit.GetNumJumps() ); sText += ssprintf( NUM_HANDS_FORMAT.GetValue(), HANDS.GetValue().c_str(), m_NoteDataEdit.GetNumHands() ); @@ -1182,6 +1185,8 @@ void ScreenEdit::UpdateTextInfo() } m_textInfo.SetText( sText ); + + GAMESTATE->SetProcessedTimingData(NULL); } void ScreenEdit::DrawPrimitives() diff --git a/src/ScreenGameplay.cpp b/src/ScreenGameplay.cpp index e29d45fa63..a0eb87b581 100644 --- a/src/ScreenGameplay.cpp +++ b/src/ScreenGameplay.cpp @@ -2299,9 +2299,9 @@ void ScreenGameplay::SaveStats() GAMESTATE->SetProcessedTimingData(&GAMESTATE->m_pCurSteps[pn]->m_Timing); NoteDataUtil::CalculateRadarValues( nd, fMusicLen, rv ); pss.m_radarPossible += rv; - GAMESTATE->SetProcessedTimingData(NULL); NoteDataWithScoring::GetActualRadarValues( nd, pss, fMusicLen, rv ); pss.m_radarActual += rv; + GAMESTATE->SetProcessedTimingData(NULL); } } diff --git a/src/Song.cpp b/src/Song.cpp index 62696a93e2..e6196ac12e 100644 --- a/src/Song.cpp +++ b/src/Song.cpp @@ -41,7 +41,7 @@ * @brief The internal version of the cache for StepMania. * * Increment this value to invalidate the current cache. */ -const int FILE_CACHE_VERSION = 179; +const int FILE_CACHE_VERSION = 180; /** @brief How long does a song sample last by default? */ const float DEFAULT_MUSIC_SAMPLE_LENGTH = 12.f;