diff --git a/osu.Game/Rulesets/Judgements/JudgementResult.cs b/osu.Game/Rulesets/Judgements/JudgementResult.cs index 2685cb4e2a..9fdbdae396 100644 --- a/osu.Game/Rulesets/Judgements/JudgementResult.cs +++ b/osu.Game/Rulesets/Judgements/JudgementResult.cs @@ -33,16 +33,19 @@ namespace osu.Game.Rulesets.Judgements public readonly Judgement Judgement; /// - /// The offset from a perfect hit at which this occurred. + /// The offset of from the end time of , clamped by . /// Populated when this is applied via . /// public double TimeOffset { get; internal set; } /// /// The absolute time at which this occurred. - /// Equal to the (end) time of the + . + /// Populated when this is applied via . /// - public double TimeAbsolute => HitObject.GetEndTime() + TimeOffset; + /// + /// This is initially set to the end time of . + /// + public double TimeAbsolute { get; internal set; } /// /// The combo prior to this occurring. @@ -83,6 +86,14 @@ namespace osu.Game.Rulesets.Judgements { HitObject = hitObject; Judgement = judgement; + Reset(); + } + + internal void Reset() + { + Type = HitResult.None; + TimeOffset = 0; + TimeAbsolute = HitObject.GetEndTime(); } public override string ToString() => $"{Type} (Score:{Judgement.NumericResultFor(this)} HP:{Judgement.HealthIncreaseFor(this)} {Judgement})"; diff --git a/osu.Game/Rulesets/Judgements/JudgementResultEntry.cs b/osu.Game/Rulesets/Judgements/JudgementResultEntry.cs index b9d75d3acb..09351e6974 100644 --- a/osu.Game/Rulesets/Judgements/JudgementResultEntry.cs +++ b/osu.Game/Rulesets/Judgements/JudgementResultEntry.cs @@ -7,15 +7,14 @@ namespace osu.Game.Rulesets.Judgements { internal class JudgementResultEntry { - public readonly double Time; + public double Time => Result.TimeAbsolute; public readonly HitObjectLifetimeEntry HitObjectEntry; public readonly JudgementResult Result; - public JudgementResultEntry(double time, HitObjectLifetimeEntry hitObjectEntry, JudgementResult result) + public JudgementResultEntry(HitObjectLifetimeEntry hitObjectEntry, JudgementResult result) { - Time = time; HitObjectEntry = hitObjectEntry; Result = result; } diff --git a/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs b/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs index 02fc5637d8..0c59d638b6 100644 --- a/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs +++ b/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs @@ -673,7 +673,8 @@ namespace osu.Game.Rulesets.Objects.Drawables $"{GetType().ReadableName()} applied an invalid hit result (was: {Result.Type}, expected: [{Result.Judgement.MinResult} ... {Result.Judgement.MaxResult}])."); } - Result.TimeOffset = Math.Min(MaximumJudgementOffset, Time.Current - HitObject.GetEndTime()); + Result.TimeAbsolute = Time.Current; + Result.TimeOffset = Math.Min(MaximumJudgementOffset, Result.TimeAbsolute - HitObject.GetEndTime()); if (Result.HasResult) updateState(Result.IsHit ? ArmedState.Hit : ArmedState.Miss); diff --git a/osu.Game/Rulesets/UI/Playfield.cs b/osu.Game/Rulesets/UI/Playfield.cs index 1d9390ea14..40e84a60e3 100644 --- a/osu.Game/Rulesets/UI/Playfield.cs +++ b/osu.Game/Rulesets/UI/Playfield.cs @@ -455,7 +455,7 @@ namespace osu.Game.Rulesets.UI private void onNewResult(DrawableHitObject drawable, JudgementResult result) { // Not using result.TimeAbsolute because that might change and also there is a potential precision issue. - judgementResults.Push(new JudgementResultEntry(Time.Current, drawable.Entry.AsNonNull(), result)); + judgementResults.Push(new JudgementResultEntry(drawable.Entry.AsNonNull(), result)); NewResult?.Invoke(drawable, result); } @@ -466,8 +466,7 @@ namespace osu.Game.Rulesets.UI RevertResult?.Invoke(result); entry.HitObjectEntry.OnRevertResult(); - result.TimeOffset = 0; - result.Type = HitResult.None; + result.Reset(); } #region Editor logic