diff --git a/src/Etterna/Actor/Gameplay/PlayerReplay.cpp b/src/Etterna/Actor/Gameplay/PlayerReplay.cpp index 5b51ed8c98..e22e5df3c5 100644 --- a/src/Etterna/Actor/Gameplay/PlayerReplay.cpp +++ b/src/Etterna/Actor/Gameplay/PlayerReplay.cpp @@ -341,14 +341,11 @@ PlayerReplay::UpdateTapNotesMissedOlderThan(float fMissIfOlderThanSeconds) if (m_pPrimaryScoreKeeper) m_pPrimaryScoreKeeper->HandleTapScore(tn); } else { + if ((PlayerAI::IsTapAtRowAndColumn(iter.Row(), iter.Track()))) + continue; + tn.result.tns = TNS_Miss; - // avoid scoring notes that get passed when seeking in pm - // not sure how many rows grace time is needed (if any?) - if (GAMESTATE->m_pPlayerState->m_PlayerOptions.GetCurrent() - .m_bPractice && - iMissIfOlderThanThisRow - iter.Row() > 8) - tn.result.tns = TNS_None; if (GAMESTATE->CountNotesSeparately()) { SetJudgment(iter.Row(), iter.Track(), tn); HandleTapRowScore(iter.Row()); diff --git a/src/Etterna/Models/Misc/PlayerAI.cpp b/src/Etterna/Models/Misc/PlayerAI.cpp index 66d19f01da..fe1984f17c 100644 --- a/src/Etterna/Models/Misc/PlayerAI.cpp +++ b/src/Etterna/Models/Misc/PlayerAI.cpp @@ -248,6 +248,18 @@ PlayerAI::TapExistsAtOrBeforeThisRow(int noteRow) } } +bool +PlayerAI::IsTapAtRowAndColumn(int noteRow, int col) +{ + if (m_ReplayTapMap.count(noteRow) == 0) + return false; + for (auto& tap : m_ReplayTapMap[noteRow]) { + if (tap.track == col) + return true; + } + return false; +} + vector PlayerAI::GetTapsAtOrBeforeRow(int noteRow) { diff --git a/src/Etterna/Models/Misc/PlayerAI.h b/src/Etterna/Models/Misc/PlayerAI.h index 113de20f2a..e55ca4cbe1 100644 --- a/src/Etterna/Models/Misc/PlayerAI.h +++ b/src/Etterna/Models/Misc/PlayerAI.h @@ -73,6 +73,8 @@ class PlayerAI // screen static void CalculateRadarValuesForReplay(RadarValues& rv, RadarValues& possibleRV); + // Find a tap at the given row and column + static bool IsTapAtRowAndColumn(int noteRow, int col); }; #endif