diff --git a/Quaver.API/Maps/Processors/Scoring/JudgementWindows.cs b/Quaver.API/Maps/Processors/Scoring/JudgementWindows.cs index b8bfafca9..99dfd6ae9 100644 --- a/Quaver.API/Maps/Processors/Scoring/JudgementWindows.cs +++ b/Quaver.API/Maps/Processors/Scoring/JudgementWindows.cs @@ -35,6 +35,9 @@ public class JudgementWindows public Judgement ComboBreakJudgement { get; set; } = Judgement.Miss; + // Never actually null; the nullability is to allow migration from the old database schema without this column. + public Judgement? LNMissJudgement { get; set; } = Judgement.Good; + /// /// Returns the value of the window from /// diff --git a/Quaver.API/Maps/Processors/Scoring/ScoreProcessorKeys.cs b/Quaver.API/Maps/Processors/Scoring/ScoreProcessorKeys.cs index 2ef72870d..f679c4ff9 100644 --- a/Quaver.API/Maps/Processors/Scoring/ScoreProcessorKeys.cs +++ b/Quaver.API/Maps/Processors/Scoring/ScoreProcessorKeys.cs @@ -198,8 +198,16 @@ public Judgement CalculateScore(int hitDifference, KeyPressType keyPressType, bo if (!(absoluteDifference <= window)) continue; - // Make Okays no longer possible on releases (good window increases) - if (keyPressType == KeyPressType.Release && j == Judgement.Okay) + // Releasing an LN late rounds the judgement up to what holding it forever would give + // On Default*, this rounds up to a Good + if (keyPressType == KeyPressType.Release && hitDifference < 0 && i > (int)Windows.LNMissJudgement) + { + judgement = Windows.LNMissJudgement.Value; + break; + } + + // Make Okays no longer possible on releases (good window increases) unless LNMissJudgement is Okay or worse + if (keyPressType == KeyPressType.Release && j == Judgement.Okay && (int)Windows.LNMissJudgement < (int)Judgement.Okay) { judgement = Judgement.Good; break; diff --git a/Quaver.API/Replays/Virtual/VirtualReplayPlayer.cs b/Quaver.API/Replays/Virtual/VirtualReplayPlayer.cs index ee055a6d9..d462160fe 100644 --- a/Quaver.API/Replays/Virtual/VirtualReplayPlayer.cs +++ b/Quaver.API/Replays/Virtual/VirtualReplayPlayer.cs @@ -340,12 +340,12 @@ private void HandleMissedLongNoteReleases() continue; // Judgement when a user doesn't release an LN. - var missedReleaseJudgement = Judgement.Good; + var missedReleaseJudgement = ScoreProcessor.Windows.LNMissJudgement; - ScoreProcessor.CalculateScore(missedReleaseJudgement, true); + ScoreProcessor.CalculateScore(missedReleaseJudgement.Value, true); // Add new miss stat. - var stat = new HitStat(HitStatType.Miss, KeyPressType.None, hitObject, hitObject.EndTime, missedReleaseJudgement, int.MinValue, + var stat = new HitStat(HitStatType.Miss, KeyPressType.None, hitObject, hitObject.EndTime, missedReleaseJudgement.Value, int.MinValue, ScoreProcessor.Accuracy, ScoreProcessor.Health); ScoreProcessor.Stats.Add(stat);