diff --git a/stepmania/Themes/default/metrics.ini b/stepmania/Themes/default/metrics.ini index db469673b1..efac2b00a4 100644 --- a/stepmania/Themes/default/metrics.ini +++ b/stepmania/Themes/default/metrics.ini @@ -2388,6 +2388,7 @@ JudgeHoldNotesOnSameRowTogether=false HoldCheckpoints=false ImmediateHoldLetGo=true RequireStepOnHoldHeads=true +CheckpointsUseTimeSignatures=false InitialHoldLife=1 [PlayerShared] diff --git a/stepmania/src/Player.cpp b/stepmania/src/Player.cpp index eecc986255..5d20995fd2 100644 --- a/stepmania/src/Player.cpp +++ b/stepmania/src/Player.cpp @@ -126,6 +126,7 @@ ThemeMetric INITIAL_HOLD_LIFE ( "Player", "InitialHoldLife" ); ThemeMetric PENALIZE_TAP_SCORE_NONE ( "Player", "PenalizeTapScoreNone" ); ThemeMetric JUDGE_HOLD_NOTES_ON_SAME_ROW_TOGETHER ( "Player", "JudgeHoldNotesOnSameRowTogether" ); ThemeMetric HOLD_CHECKPOINTS ( "Player", "HoldCheckpoints" ); +ThemeMetric CHECKPOINTS_USE_TIME_SIGNATURES ( "Player", "CheckpointsUseTimeSignatures" ); ThemeMetric IMMEDIATE_HOLD_LET_GO ( "Player", "ImmediateHoldLetGo" ); ThemeMetric REQUIRE_STEP_ON_HOLD_HEADS ( "Player", "RequireStepOnHoldHeads" ); @@ -2417,11 +2418,18 @@ void Player::CrossedRows( int iLastRowCrossed, const RageTimer &now ) // if( HOLD_CHECKPOINTS ) { - const float fBeat = NoteRowToBeat( iLastRowCrossed ); - TimeSignatureSegment tSignature = GAMESTATE->m_pCurSong->m_Timing.GetTimeSignatureSegmentAtBeat( fBeat ); - - // Most songs are in 4/4 time. The frequency for checking tick counts should reflect that. - const int CHECKPOINT_FREQUENCY_ROWS = ROWS_PER_BEAT * tSignature.m_iDenominator / (tSignature.m_iNumerator * 4); + int CHECKPOINT_FREQUENCY_ROWS; + if( CHECKPOINTS_USE_TIME_SIGNATURES ) + { + TimeSignatureSegment tSignature = GAMESTATE->m_pCurSong->m_Timing.GetTimeSignatureSegmentAtBeat( NoteRowToBeat( iLastRowCrossed ) ); + + // Most songs are in 4/4 time. The frequency for checking tick counts should reflect that. + CHECKPOINT_FREQUENCY_ROWS = ROWS_PER_BEAT * tSignature.m_iDenominator / (tSignature.m_iNumerator * 4); + } + else + { + CHECKPOINT_FREQUENCY_ROWS = ROWS_PER_BEAT/2; + } // "the first row after the start of the range that lands on a beat" int iFirstCheckpointInRange = ((m_iFirstUncrossedRow+CHECKPOINT_FREQUENCY_ROWS-1)/CHECKPOINT_FREQUENCY_ROWS) * CHECKPOINT_FREQUENCY_ROWS;