diff --git a/Templates/Rulesets/ruleset-empty/osu.Game.Rulesets.EmptyFreeform/Objects/Drawables/DrawableEmptyFreeformHitObject.cs b/Templates/Rulesets/ruleset-empty/osu.Game.Rulesets.EmptyFreeform/Objects/Drawables/DrawableEmptyFreeformHitObject.cs
index e8f511bc4b..3ad8f06fb4 100644
--- a/Templates/Rulesets/ruleset-empty/osu.Game.Rulesets.EmptyFreeform/Objects/Drawables/DrawableEmptyFreeformHitObject.cs
+++ b/Templates/Rulesets/ruleset-empty/osu.Game.Rulesets.EmptyFreeform/Objects/Drawables/DrawableEmptyFreeformHitObject.cs
@@ -26,7 +26,7 @@ namespace osu.Game.Rulesets.EmptyFreeform.Objects.Drawables
{
if (timeOffset >= 0)
// todo: implement judgement logic
- ApplyResult(static r => r.Type = HitResult.Perfect);
+ ApplyResult(static (r, hitObject) => r.Type = HitResult.Perfect);
}
protected override void UpdateHitStateTransforms(ArmedState state)
diff --git a/Templates/Rulesets/ruleset-example/osu.Game.Rulesets.Pippidon/Objects/Drawables/DrawablePippidonHitObject.cs b/Templates/Rulesets/ruleset-example/osu.Game.Rulesets.Pippidon/Objects/Drawables/DrawablePippidonHitObject.cs
index a8bb57ba18..925f2d04bf 100644
--- a/Templates/Rulesets/ruleset-example/osu.Game.Rulesets.Pippidon/Objects/Drawables/DrawablePippidonHitObject.cs
+++ b/Templates/Rulesets/ruleset-example/osu.Game.Rulesets.Pippidon/Objects/Drawables/DrawablePippidonHitObject.cs
@@ -50,10 +50,10 @@ namespace osu.Game.Rulesets.Pippidon.Objects.Drawables
{
if (timeOffset >= 0)
{
- ApplyResult(static (r, isHovered) =>
+ ApplyResult(static (r, hitObject) =>
{
- r.Type = isHovered ? HitResult.Perfect : HitResult.Miss;
- }, IsHovered);
+ r.Type = hitObject.IsHovered ? HitResult.Perfect : HitResult.Miss;
+ });
}
}
diff --git a/Templates/Rulesets/ruleset-scrolling-empty/osu.Game.Rulesets.EmptyScrolling/Objects/Drawables/DrawableEmptyScrollingHitObject.cs b/Templates/Rulesets/ruleset-scrolling-empty/osu.Game.Rulesets.EmptyScrolling/Objects/Drawables/DrawableEmptyScrollingHitObject.cs
index 070a802aea..408bbea717 100644
--- a/Templates/Rulesets/ruleset-scrolling-empty/osu.Game.Rulesets.EmptyScrolling/Objects/Drawables/DrawableEmptyScrollingHitObject.cs
+++ b/Templates/Rulesets/ruleset-scrolling-empty/osu.Game.Rulesets.EmptyScrolling/Objects/Drawables/DrawableEmptyScrollingHitObject.cs
@@ -24,7 +24,7 @@ namespace osu.Game.Rulesets.EmptyScrolling.Objects.Drawables
{
if (timeOffset >= 0)
// todo: implement judgement logic
- ApplyResult(static r => r.Type = HitResult.Perfect);
+ ApplyResult(static (r, hitObject) => r.Type = HitResult.Perfect);
}
protected override void UpdateHitStateTransforms(ArmedState state)
diff --git a/Templates/Rulesets/ruleset-scrolling-example/osu.Game.Rulesets.Pippidon/Objects/Drawables/DrawablePippidonHitObject.cs b/Templates/Rulesets/ruleset-scrolling-example/osu.Game.Rulesets.Pippidon/Objects/Drawables/DrawablePippidonHitObject.cs
index 9983ec20b0..2c9eac7f65 100644
--- a/Templates/Rulesets/ruleset-scrolling-example/osu.Game.Rulesets.Pippidon/Objects/Drawables/DrawablePippidonHitObject.cs
+++ b/Templates/Rulesets/ruleset-scrolling-example/osu.Game.Rulesets.Pippidon/Objects/Drawables/DrawablePippidonHitObject.cs
@@ -50,10 +50,11 @@ namespace osu.Game.Rulesets.Pippidon.Objects.Drawables
{
if (timeOffset >= 0)
{
- ApplyResult(static (r, pippidonHitObject) =>
+ ApplyResult(static (r, hitObject) =>
{
+ var pippidonHitObject = (DrawablePippidonHitObject)hitObject;
r.Type = pippidonHitObject.currentLane.Value == pippidonHitObject.HitObject.Lane ? HitResult.Perfect : HitResult.Miss;
- }, this);
+ });
}
}
diff --git a/osu.Game.Rulesets.Catch/Objects/Drawables/DrawableCatchHitObject.cs b/osu.Game.Rulesets.Catch/Objects/Drawables/DrawableCatchHitObject.cs
index 5a921f36f5..721c6aaa59 100644
--- a/osu.Game.Rulesets.Catch/Objects/Drawables/DrawableCatchHitObject.cs
+++ b/osu.Game.Rulesets.Catch/Objects/Drawables/DrawableCatchHitObject.cs
@@ -64,10 +64,11 @@ namespace osu.Game.Rulesets.Catch.Objects.Drawables
if (timeOffset >= 0 && Result != null)
{
- ApplyResult(static (r, state) =>
+ ApplyResult(static (r, hitObject) =>
{
- r.Type = state.CheckPosition.Invoke(state.HitObject) ? r.Judgement.MaxResult : r.Judgement.MinResult;
- }, this);
+ var catchHitObject = (DrawableCatchHitObject)hitObject;
+ r.Type = catchHitObject.CheckPosition!.Invoke(catchHitObject.HitObject) ? r.Judgement.MaxResult : r.Judgement.MinResult;
+ });
}
}
diff --git a/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableHoldNote.cs b/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableHoldNote.cs
index e5056d5167..6c70ab3526 100644
--- a/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableHoldNote.cs
+++ b/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableHoldNote.cs
@@ -265,7 +265,7 @@ namespace osu.Game.Rulesets.Mania.Objects.Drawables
if (Tail.AllJudged)
{
if (Tail.IsHit)
- ApplyResult(static r => r.Type = r.Judgement.MaxResult);
+ ApplyResult(static (r, _) => r.Type = r.Judgement.MaxResult);
else
MissForcefully();
}
diff --git a/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableHoldNoteBody.cs b/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableHoldNoteBody.cs
index 317da0580c..731b1b6298 100644
--- a/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableHoldNoteBody.cs
+++ b/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableHoldNoteBody.cs
@@ -11,6 +11,8 @@ namespace osu.Game.Rulesets.Mania.Objects.Drawables
public override bool DisplayResult => false;
+ private bool hit;
+
public DrawableHoldNoteBody()
: this(null)
{
@@ -25,7 +27,12 @@ namespace osu.Game.Rulesets.Mania.Objects.Drawables
{
if (AllJudged) return;
- ApplyResult(static (r, hit) => r.Type = hit ? r.Judgement.MaxResult : r.Judgement.MinResult, hit);
+ this.hit = hit;
+ ApplyResult(static (r, hitObject) =>
+ {
+ var holdNoteBody = (DrawableHoldNoteBody)hitObject;
+ r.Type = holdNoteBody.hit ? r.Judgement.MaxResult : r.Judgement.MinResult;
+ });
}
}
}
diff --git a/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableManiaHitObject.cs b/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableManiaHitObject.cs
index dea0817869..2d10fa27cd 100644
--- a/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableManiaHitObject.cs
+++ b/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableManiaHitObject.cs
@@ -87,7 +87,7 @@ namespace osu.Game.Rulesets.Mania.Objects.Drawables
///
/// Causes this to get missed, disregarding all conditions in implementations of .
///
- public virtual void MissForcefully() => ApplyResult(static r => r.Type = r.Judgement.MinResult);
+ public virtual void MissForcefully() => ApplyResult(static (r, _) => r.Type = r.Judgement.MinResult);
}
public abstract partial class DrawableManiaHitObject : DrawableManiaHitObject
diff --git a/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableNote.cs b/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableNote.cs
index 985007f905..a70253798a 100644
--- a/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableNote.cs
+++ b/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableNote.cs
@@ -38,6 +38,8 @@ namespace osu.Game.Rulesets.Mania.Objects.Drawables
private Drawable headPiece;
+ private HitResult hitResult;
+
public DrawableNote()
: this(null)
{
@@ -89,18 +91,22 @@ namespace osu.Game.Rulesets.Mania.Objects.Drawables
if (!userTriggered)
{
if (!HitObject.HitWindows.CanBeHit(timeOffset))
- ApplyResult(static r => r.Type = r.Judgement.MinResult);
+ ApplyResult(static (r, _) => r.Type = r.Judgement.MinResult);
return;
}
- var result = HitObject.HitWindows.ResultFor(timeOffset);
- if (result == HitResult.None)
+ hitResult = HitObject.HitWindows.ResultFor(timeOffset);
+ if (hitResult == HitResult.None)
return;
- result = GetCappedResult(result);
+ hitResult = GetCappedResult(hitResult);
- ApplyResult(static (r, result) => r.Type = result, result);
+ ApplyResult(static (r, hitObject) =>
+ {
+ var note = (DrawableNote)hitObject;
+ r.Type = note.hitResult;
+ });
}
///
diff --git a/osu.Game.Rulesets.Osu.Tests/TestSceneHitCircle.cs b/osu.Game.Rulesets.Osu.Tests/TestSceneHitCircle.cs
index 30b0451a3b..8d4145f2c1 100644
--- a/osu.Game.Rulesets.Osu.Tests/TestSceneHitCircle.cs
+++ b/osu.Game.Rulesets.Osu.Tests/TestSceneHitCircle.cs
@@ -136,7 +136,7 @@ namespace osu.Game.Rulesets.Osu.Tests
if (auto && !userTriggered && timeOffset > hitOffset && CheckHittable?.Invoke(this, Time.Current, HitResult.Great) == ClickAction.Hit)
{
// force success
- ApplyResult(r => r.Type = HitResult.Great);
+ ApplyResult(static (r, _) => r.Type = HitResult.Great);
}
else
base.CheckForResult(userTriggered, timeOffset);
diff --git a/osu.Game.Rulesets.Osu.Tests/TestSceneHitCircleLateFade.cs b/osu.Game.Rulesets.Osu.Tests/TestSceneHitCircleLateFade.cs
index 7824f26251..2d1e9c1270 100644
--- a/osu.Game.Rulesets.Osu.Tests/TestSceneHitCircleLateFade.cs
+++ b/osu.Game.Rulesets.Osu.Tests/TestSceneHitCircleLateFade.cs
@@ -208,7 +208,7 @@ namespace osu.Game.Rulesets.Osu.Tests
if (shouldHit && !userTriggered && timeOffset >= 0)
{
// force success
- ApplyResult(r => r.Type = HitResult.Great);
+ ApplyResult(static (r, _) => r.Type = HitResult.Great);
}
else
base.CheckForResult(userTriggered, timeOffset);
diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableHitCircle.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableHitCircle.cs
index 8284229d82..ce5422b180 100644
--- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableHitCircle.cs
+++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableHitCircle.cs
@@ -44,6 +44,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
private Container scaleContainer;
private InputManager inputManager;
+ private HitResult hitResult;
public DrawableHitCircle()
: this(null)
@@ -155,34 +156,34 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
if (!userTriggered)
{
if (!HitObject.HitWindows.CanBeHit(timeOffset))
- ApplyResult(static r => r.Type = r.Judgement.MinResult);
+ ApplyResult(static (r, _) => r.Type = r.Judgement.MinResult);
return;
}
- var result = ResultFor(timeOffset);
- var clickAction = CheckHittable?.Invoke(this, Time.Current, result);
+ hitResult = ResultFor(timeOffset);
+ var clickAction = CheckHittable?.Invoke(this, Time.Current, hitResult);
if (clickAction == ClickAction.Shake)
Shake();
- if (result == HitResult.None || clickAction != ClickAction.Hit)
+ if (hitResult == HitResult.None || clickAction != ClickAction.Hit)
return;
- ApplyResult(static (r, state) =>
+ ApplyResult(static (r, hitObject) =>
{
- var (hitCircle, hitResult) = state;
+ var hitCircle = (DrawableHitCircle)hitObject;
var circleResult = (OsuHitCircleJudgementResult)r;
// Todo: This should also consider misses, but they're a little more interesting to handle, since we don't necessarily know the position at the time of a miss.
- if (hitResult.IsHit())
+ if (hitCircle.hitResult.IsHit())
{
var localMousePosition = hitCircle.ToLocalSpace(hitCircle.inputManager.CurrentState.Mouse.Position);
circleResult.CursorPositionAtHit = hitCircle.HitObject.StackedPosition + (localMousePosition - hitCircle.DrawSize / 2);
}
- circleResult.Type = hitResult;
- }, (this, result));
+ circleResult.Type = hitCircle.hitResult;
+ });
}
///
diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableOsuHitObject.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableOsuHitObject.cs
index cc06d009c9..6de60a9d51 100644
--- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableOsuHitObject.cs
+++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableOsuHitObject.cs
@@ -100,12 +100,12 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
///
/// Causes this to get hit, disregarding all conditions in implementations of .
///
- public void HitForcefully() => ApplyResult(static r => r.Type = r.Judgement.MaxResult);
+ public void HitForcefully() => ApplyResult(static (r, _) => r.Type = r.Judgement.MaxResult);
///
/// Causes this to get missed, disregarding all conditions in implementations of .
///
- public void MissForcefully() => ApplyResult(static r => r.Type = r.Judgement.MinResult);
+ public void MissForcefully() => ApplyResult(static (r, _) => r.Type = r.Judgement.MinResult);
private RectangleF parentScreenSpaceRectangle => ((DrawableOsuHitObject)ParentHitObject)?.parentScreenSpaceRectangle ?? Parent!.ScreenSpaceDrawQuad.AABBFloat;
diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSlider.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSlider.cs
index 3c298cc6af..c0ff258352 100644
--- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSlider.cs
+++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSlider.cs
@@ -292,10 +292,10 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
if (HitObject.ClassicSliderBehaviour)
{
// Classic behaviour means a slider is judged proportionally to the number of nested hitobjects hit. This is the classic osu!stable scoring.
- ApplyResult(static (r, nestedHitObjects) =>
+ ApplyResult(static (r, hitObject) =>
{
- int totalTicks = nestedHitObjects.Count;
- int hitTicks = nestedHitObjects.Count(h => h.IsHit);
+ int totalTicks = hitObject.NestedHitObjects.Count;
+ int hitTicks = hitObject.NestedHitObjects.Count(h => h.IsHit);
if (hitTicks == totalTicks)
r.Type = HitResult.Great;
@@ -306,16 +306,16 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
double hitFraction = (double)hitTicks / totalTicks;
r.Type = hitFraction >= 0.5 ? HitResult.Ok : HitResult.Meh;
}
- }, NestedHitObjects);
+ });
}
else
{
// If only the nested hitobjects are judged, then the slider's own judgement is ignored for scoring purposes.
// But the slider needs to still be judged with a reasonable hit/miss result for visual purposes (hit/miss transforms, etc).
- ApplyResult(static (r, nestedHitObjects) =>
+ ApplyResult(static (r, hitObject) =>
{
- r.Type = nestedHitObjects.Any(h => h.Result.IsHit) ? r.Judgement.MaxResult : r.Judgement.MinResult;
- }, NestedHitObjects);
+ r.Type = hitObject.NestedHitObjects.Any(h => h.Result.IsHit) ? r.Judgement.MaxResult : r.Judgement.MinResult;
+ });
}
}
diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs
index d21d02c8ce..3679bc9775 100644
--- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs
+++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs
@@ -258,8 +258,9 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
foreach (var tick in ticks.Where(t => !t.Result.HasResult))
tick.TriggerResult(false);
- ApplyResult(static (r, spinner) =>
+ ApplyResult(static (r, hitObject) =>
{
+ var spinner = (DrawableSpinner)hitObject;
if (spinner.Progress >= 1)
r.Type = HitResult.Great;
else if (spinner.Progress > .9)
@@ -268,7 +269,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
r.Type = HitResult.Meh;
else if (spinner.Time.Current >= spinner.HitObject.EndTime)
r.Type = r.Judgement.MinResult;
- }, this);
+ });
}
protected override void Update()
diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinnerTick.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinnerTick.cs
index 1c3ff29118..628f07a281 100644
--- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinnerTick.cs
+++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinnerTick.cs
@@ -11,6 +11,8 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
{
public override bool DisplayResult => false;
+ private bool hit;
+
public DrawableSpinnerTick()
: this(null)
{
@@ -35,6 +37,14 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
/// Apply a judgement result.
///
/// Whether this tick was reached.
- internal void TriggerResult(bool hit) => ApplyResult(static (r, hit) => r.Type = hit ? r.Judgement.MaxResult : r.Judgement.MinResult, hit);
+ internal void TriggerResult(bool hit)
+ {
+ this.hit = hit;
+ ApplyResult(static (r, hitObject) =>
+ {
+ var spinnerTick = (DrawableSpinnerTick)hitObject;
+ r.Type = spinnerTick.hit ? r.Judgement.MaxResult : r.Judgement.MinResult;
+ });
+ }
}
}
diff --git a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableDrumRoll.cs b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableDrumRoll.cs
index d3fe363857..2e40875af1 100644
--- a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableDrumRoll.cs
+++ b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableDrumRoll.cs
@@ -143,7 +143,7 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables
if (timeOffset < 0)
return;
- ApplyResult(static r => r.Type = r.Judgement.MaxResult);
+ ApplyResult(static (r, _) => r.Type = r.Judgement.MaxResult);
}
protected override void UpdateHitStateTransforms(ArmedState state)
@@ -192,10 +192,10 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables
if (!ParentHitObject.Judged)
return;
- ApplyResult(static (r, parentHitObject) =>
+ ApplyResult(static (r, hitObject) =>
{
- r.Type = parentHitObject.IsHit ? r.Judgement.MaxResult : r.Judgement.MinResult;
- }, ParentHitObject);
+ r.Type = hitObject.IsHit ? r.Judgement.MaxResult : r.Judgement.MinResult;
+ });
}
public override bool OnPressed(KeyBindingPressEvent e) => false;
diff --git a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableDrumRollTick.cs b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableDrumRollTick.cs
index de9a3a31c5..aa678d7043 100644
--- a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableDrumRollTick.cs
+++ b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableDrumRollTick.cs
@@ -49,14 +49,14 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables
if (!userTriggered)
{
if (timeOffset > HitObject.HitWindow)
- ApplyResult(static r => r.Type = r.Judgement.MinResult);
+ ApplyResult(static (r, _) => r.Type = r.Judgement.MinResult);
return;
}
if (Math.Abs(timeOffset) > HitObject.HitWindow)
return;
- ApplyResult(static r => r.Type = r.Judgement.MaxResult);
+ ApplyResult(static (r, _) => r.Type = r.Judgement.MaxResult);
}
public override void OnKilled()
@@ -64,7 +64,7 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables
base.OnKilled();
if (Time.Current > HitObject.GetEndTime() && !Judged)
- ApplyResult(static r => r.Type = r.Judgement.MinResult);
+ ApplyResult(static (r, _) => r.Type = r.Judgement.MinResult);
}
protected override void UpdateHitStateTransforms(ArmedState state)
@@ -105,10 +105,11 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables
if (!ParentHitObject.Judged)
return;
- ApplyResult(static (r, parentHitObject) =>
+ ApplyResult(static (r, hitObject) =>
{
- r.Type = parentHitObject.IsHit ? r.Judgement.MaxResult : r.Judgement.MinResult;
- }, ParentHitObject);
+ var nestedHit = (StrongNestedHit)hitObject;
+ r.Type = nestedHit.ParentHitObject!.IsHit ? r.Judgement.MaxResult : r.Judgement.MinResult;
+ });
}
public override bool OnPressed(KeyBindingPressEvent e) => false;
diff --git a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableFlyingHit.cs b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableFlyingHit.cs
index 1332b9e950..4349dff9f9 100644
--- a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableFlyingHit.cs
+++ b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableFlyingHit.cs
@@ -25,7 +25,7 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables
protected override void LoadComplete()
{
base.LoadComplete();
- ApplyResult(static r => r.Type = r.Judgement.MaxResult);
+ ApplyResult(static (r, _) => r.Type = r.Judgement.MaxResult);
}
protected override void LoadSamples()
diff --git a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableHit.cs b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableHit.cs
index c3bd76bf81..cf8e4050ee 100644
--- a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableHit.cs
+++ b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableHit.cs
@@ -37,6 +37,8 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables
private double? lastPressHandleTime;
+ private HitResult hitResult;
+
private readonly Bindable type = new Bindable();
public DrawableHit()
@@ -99,18 +101,24 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables
if (!userTriggered)
{
if (!HitObject.HitWindows.CanBeHit(timeOffset))
- ApplyResult(static r => r.Type = r.Judgement.MinResult);
+ ApplyResult(static (r, _) => r.Type = r.Judgement.MinResult);
return;
}
- var result = HitObject.HitWindows.ResultFor(timeOffset);
- if (result == HitResult.None)
+ hitResult = HitObject.HitWindows.ResultFor(timeOffset);
+ if (hitResult == HitResult.None)
return;
if (!validActionPressed)
- ApplyResult(static r => r.Type = r.Judgement.MinResult);
+ ApplyResult(static (r, _) => r.Type = r.Judgement.MinResult);
else
- ApplyResult(static (r, result) => r.Type = result, result);
+ {
+ ApplyResult(static (r, hitObject) =>
+ {
+ var drawableHit = (DrawableHit)hitObject;
+ r.Type = drawableHit.hitResult;
+ });
+ }
}
public override bool OnPressed(KeyBindingPressEvent e)
@@ -209,19 +217,19 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables
if (!ParentHitObject.Result.IsHit)
{
- ApplyResult(static r => r.Type = r.Judgement.MinResult);
+ ApplyResult(static (r, _) => r.Type = r.Judgement.MinResult);
return;
}
if (!userTriggered)
{
if (timeOffset - ParentHitObject.Result.TimeOffset > SECOND_HIT_WINDOW)
- ApplyResult(static r => r.Type = r.Judgement.MinResult);
+ ApplyResult(static (r, _) => r.Type = r.Judgement.MinResult);
return;
}
if (Math.Abs(timeOffset - ParentHitObject.Result.TimeOffset) <= SECOND_HIT_WINDOW)
- ApplyResult(static r => r.Type = r.Judgement.MaxResult);
+ ApplyResult(static (r, _) => r.Type = r.Judgement.MaxResult);
}
public override bool OnPressed(KeyBindingPressEvent e)
diff --git a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableStrongNestedHit.cs b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableStrongNestedHit.cs
index 4080c14066..8f99538448 100644
--- a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableStrongNestedHit.cs
+++ b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableStrongNestedHit.cs
@@ -27,7 +27,7 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables
// it can happen that the hit window of the nested strong hit extends past the lifetime of the parent object.
// this is a safety to prevent such cases from causing the nested hit to never be judged and as such prevent gameplay from completing.
if (!Judged && Time.Current > ParentHitObject?.HitObject.GetEndTime())
- ApplyResult(static r => r.Type = r.Judgement.MinResult);
+ ApplyResult(static (r, _) => r.Type = r.Judgement.MinResult);
}
}
}
diff --git a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableSwell.cs b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableSwell.cs
index d48b78283b..0781ea5e2a 100644
--- a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableSwell.cs
+++ b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableSwell.cs
@@ -41,6 +41,8 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables
private double? lastPressHandleTime;
+ private int numHits;
+
public override bool DisplayResult => false;
public DrawableSwell()
@@ -192,7 +194,7 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables
nextTick?.TriggerResult(true);
- int numHits = ticks.Count(r => r.IsHit);
+ numHits = ticks.Count(r => r.IsHit);
float completion = (float)numHits / HitObject.RequiredHits;
@@ -206,14 +208,14 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables
expandingRing.ScaleTo(1f + Math.Min(target_ring_scale - 1f, (target_ring_scale - 1f) * completion * 1.3f), 260, Easing.OutQuint);
if (numHits == HitObject.RequiredHits)
- ApplyResult(static r => r.Type = r.Judgement.MaxResult);
+ ApplyResult(static (r, _) => r.Type = r.Judgement.MaxResult);
}
else
{
if (timeOffset < 0)
return;
- int numHits = 0;
+ numHits = 0;
foreach (var tick in ticks)
{
@@ -227,11 +229,11 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables
tick.TriggerResult(false);
}
- ApplyResult(static (r, state) =>
+ ApplyResult(static (r, hitObject) =>
{
- var (numHits, hitObject) = state;
- r.Type = numHits == hitObject.RequiredHits ? r.Judgement.MaxResult : r.Judgement.MinResult;
- }, (numHits, HitObject));
+ var swell = (DrawableSwell)hitObject;
+ r.Type = swell.numHits == swell.HitObject.RequiredHits ? r.Judgement.MaxResult : r.Judgement.MinResult;
+ });
}
}
diff --git a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableSwellTick.cs b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableSwellTick.cs
index ad1d09bc7b..557438e5e5 100644
--- a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableSwellTick.cs
+++ b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableSwellTick.cs
@@ -15,6 +15,8 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables
{
public override bool DisplayResult => false;
+ private bool hit;
+
public DrawableSwellTick()
: this(null)
{
@@ -29,11 +31,13 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables
public void TriggerResult(bool hit)
{
+ this.hit = hit;
HitObject.StartTime = Time.Current;
- ApplyResult(static (r, hit) =>
+ ApplyResult(static (r, hitObject) =>
{
- r.Type = hit ? r.Judgement.MaxResult : r.Judgement.MinResult;
- }, hit);
+ var swellTick = (DrawableSwellTick)hitObject;
+ r.Type = swellTick.hit ? r.Judgement.MaxResult : r.Judgement.MinResult;
+ });
}
protected override void CheckForResult(bool userTriggered, double timeOffset)
diff --git a/osu.Game.Tests/Gameplay/TestSceneDrawableHitObject.cs b/osu.Game.Tests/Gameplay/TestSceneDrawableHitObject.cs
index 10dbede2e0..bf1e52aab5 100644
--- a/osu.Game.Tests/Gameplay/TestSceneDrawableHitObject.cs
+++ b/osu.Game.Tests/Gameplay/TestSceneDrawableHitObject.cs
@@ -216,7 +216,7 @@ namespace osu.Game.Tests.Gameplay
LifetimeStart = LIFETIME_ON_APPLY;
}
- public void MissForcefully() => ApplyResult(r => r.Type = HitResult.Miss);
+ public void MissForcefully() => ApplyResult(static (r, _) => r.Type = HitResult.Miss);
protected override void UpdateHitStateTransforms(ArmedState state)
{
diff --git a/osu.Game.Tests/Visual/Gameplay/TestScenePoolingRuleset.cs b/osu.Game.Tests/Visual/Gameplay/TestScenePoolingRuleset.cs
index fea7456472..00bd58e303 100644
--- a/osu.Game.Tests/Visual/Gameplay/TestScenePoolingRuleset.cs
+++ b/osu.Game.Tests/Visual/Gameplay/TestScenePoolingRuleset.cs
@@ -431,7 +431,7 @@ namespace osu.Game.Tests.Visual.Gameplay
protected override void CheckForResult(bool userTriggered, double timeOffset)
{
if (timeOffset > HitObject.Duration)
- ApplyResult(r => r.Type = r.Judgement.MaxResult);
+ ApplyResult(static (r, _) => r.Type = r.Judgement.MaxResult);
}
protected override void UpdateHitStateTransforms(ArmedState state)
@@ -468,7 +468,7 @@ namespace osu.Game.Tests.Visual.Gameplay
public override void OnKilled()
{
base.OnKilled();
- ApplyResult(r => r.Type = r.Judgement.MinResult);
+ ApplyResult(static (r, _) => r.Type = r.Judgement.MinResult);
}
}
@@ -547,7 +547,7 @@ namespace osu.Game.Tests.Visual.Gameplay
{
base.CheckForResult(userTriggered, timeOffset);
if (timeOffset >= 0)
- ApplyResult(r => r.Type = r.Judgement.MaxResult);
+ ApplyResult(static (r, _) => r.Type = r.Judgement.MaxResult);
}
}
@@ -596,7 +596,7 @@ namespace osu.Game.Tests.Visual.Gameplay
{
base.CheckForResult(userTriggered, timeOffset);
if (timeOffset >= 0)
- ApplyResult(r => r.Type = r.Judgement.MaxResult);
+ ApplyResult(static (r, _) => r.Type = r.Judgement.MaxResult);
}
}
diff --git a/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs b/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs
index 9acd7b3c0f..bffe174be1 100644
--- a/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs
+++ b/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs
@@ -687,14 +687,12 @@ namespace osu.Game.Rulesets.Objects.Drawables
/// the of the .
///
/// The callback that applies changes to the .
- /// The state passed to the callback.
- /// The type of the state information that is passed to the callback method.
- protected void ApplyResult(Action application, TState state)
+ protected void ApplyResult(Action application)
{
if (Result.HasResult)
throw new InvalidOperationException("Cannot apply result on a hitobject that already has a result.");
- application?.Invoke(Result, state);
+ application?.Invoke(Result, this);
if (!Result.HasResult)
throw new InvalidOperationException($"{GetType().ReadableName()} applied a {nameof(JudgementResult)} but did not update {nameof(JudgementResult.Type)}.");
@@ -716,13 +714,6 @@ namespace osu.Game.Rulesets.Objects.Drawables
OnNewResult?.Invoke(this, Result);
}
- ///
- /// Applies the of this , notifying responders such as
- /// the of the .
- ///
- /// The callback that applies changes to the .
- protected void ApplyResult(Action application) => ApplyResult