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