From 47a3f3662efa427e6a1cd8c0d058b133500b6809 Mon Sep 17 00:00:00 2001 From: Derrick Timmermans Date: Wed, 19 Jun 2024 12:35:23 +0200 Subject: [PATCH 1/3] Remove lane bindable usage to switch playfields --- .../Components/HitObjectLine/LineLifetimeEntry.cs | 4 ---- osu.Game.Rulesets.Sentakki/UI/LanedPlayfield.cs | 9 ++------- osu.Game.Rulesets.Sentakki/UI/SentakkiPlayfield.cs | 14 ++++++++++++++ 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/osu.Game.Rulesets.Sentakki/UI/Components/HitObjectLine/LineLifetimeEntry.cs b/osu.Game.Rulesets.Sentakki/UI/Components/HitObjectLine/LineLifetimeEntry.cs index 374dcbe2a..f29ded3bc 100644 --- a/osu.Game.Rulesets.Sentakki/UI/Components/HitObjectLine/LineLifetimeEntry.cs +++ b/osu.Game.Rulesets.Sentakki/UI/Components/HitObjectLine/LineLifetimeEntry.cs @@ -33,7 +33,6 @@ public LineLifetimeEntry(DrawableSentakkiRuleset? drawableSentakkiRuleset, doubl public void Add(SentakkiLanedHitObject hitObject) { - hitObject.LaneBindable.ValueChanged += onLaneChanged; hitObject.BreakBindable.ValueChanged += onBreakChanged; HitObjects.AddInPlace(hitObject, Comparer.Create((lhs, rhs) => lhs.Lane.CompareTo(rhs.Lane))); UpdateLine(); @@ -41,14 +40,11 @@ public void Add(SentakkiLanedHitObject hitObject) public void Remove(SentakkiLanedHitObject hitObject) { - hitObject.LaneBindable.ValueChanged -= onLaneChanged; hitObject.BreakBindable.ValueChanged -= onBreakChanged; HitObjects.Remove(hitObject); UpdateLine(); } - private void onLaneChanged(ValueChangedEvent obj) => UpdateLine(); - private void onBreakChanged(ValueChangedEvent obj) => UpdateLine(); public Action OnLineUpdated = null!; diff --git a/osu.Game.Rulesets.Sentakki/UI/LanedPlayfield.cs b/osu.Game.Rulesets.Sentakki/UI/LanedPlayfield.cs index 04e4b3647..d4f5c44e5 100644 --- a/osu.Game.Rulesets.Sentakki/UI/LanedPlayfield.cs +++ b/osu.Game.Rulesets.Sentakki/UI/LanedPlayfield.cs @@ -65,12 +65,7 @@ public override void Add(HitObject h) { case SentakkiLanedHitObject laned: HitObjectLineRenderer.AddHitObject(laned); - laned.LaneBindable.BindValueChanged(lane => - { - if (lane.OldValue != lane.NewValue) - Lanes[lane.OldValue].Remove(h); - Lanes[lane.NewValue].Add(h); - }, true); + Lanes[laned.Lane].Add(h); break; } } @@ -81,7 +76,7 @@ public override bool Remove(HitObject hitObject) return false; HitObjectLineRenderer.RemoveHitObject(lanedHitObject); - return Lanes[lanedHitObject.Lane].Remove(lanedHitObject); + return Lanes[lanedHitObject.Lane].Remove(hitObject: lanedHitObject); } private void onHitObjectLoaded(Drawable hitObject) diff --git a/osu.Game.Rulesets.Sentakki/UI/SentakkiPlayfield.cs b/osu.Game.Rulesets.Sentakki/UI/SentakkiPlayfield.cs index 995755222..984c25a2e 100644 --- a/osu.Game.Rulesets.Sentakki/UI/SentakkiPlayfield.cs +++ b/osu.Game.Rulesets.Sentakki/UI/SentakkiPlayfield.cs @@ -143,6 +143,20 @@ public override void Add(HitObject h) } } + public override bool Remove(HitObject h) + { + switch (h) + { + case SentakkiLanedHitObject: + return LanedPlayfield.Remove(h); + + case Touch: + return touchPlayfield.Remove(h); + default: + return base.Remove(h); + } + } + private void onNewResult(DrawableHitObject judgedObject, JudgementResult result) { if (!judgedObject.DisplayResult || !DisplayJudgements.Value || judgedObject is not DrawableSentakkiHitObject sentakkiHitObject) From c2a6c5b34d7e946119b3b47e2e72c8ef34725bf6 Mon Sep 17 00:00:00 2001 From: Derrick Timmermans Date: Wed, 19 Jun 2024 13:21:34 +0200 Subject: [PATCH 2/3] Add/Remove DrawableHitObject methods in laned playefields --- .../UI/LanedPlayfield.cs | 21 ++++++++++-- .../UI/SentakkiPlayfield.cs | 33 +++++++++++++++++++ 2 files changed, 52 insertions(+), 2 deletions(-) diff --git a/osu.Game.Rulesets.Sentakki/UI/LanedPlayfield.cs b/osu.Game.Rulesets.Sentakki/UI/LanedPlayfield.cs index d4f5c44e5..d316dd36e 100644 --- a/osu.Game.Rulesets.Sentakki/UI/LanedPlayfield.cs +++ b/osu.Game.Rulesets.Sentakki/UI/LanedPlayfield.cs @@ -4,6 +4,7 @@ using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.Pooling; using osu.Game.Rulesets.Objects; +using osu.Game.Rulesets.Objects.Drawables; using osu.Game.Rulesets.Sentakki.Objects; using osu.Game.Rulesets.Sentakki.Objects.Drawables; using osu.Game.Rulesets.Sentakki.Objects.Drawables.Pieces.Slides; @@ -75,8 +76,24 @@ public override bool Remove(HitObject hitObject) if (hitObject is not SentakkiLanedHitObject lanedHitObject) return false; - HitObjectLineRenderer.RemoveHitObject(lanedHitObject); - return Lanes[lanedHitObject.Lane].Remove(hitObject: lanedHitObject); + return Lanes[lanedHitObject.Lane].Remove(lanedHitObject); + } + public override void Add(DrawableHitObject h) + { + switch (h) + { + case DrawableSentakkiLanedHitObject laned: + Lanes[laned.HitObject.Lane].Add(h); + break; + } + } + + public override bool Remove(DrawableHitObject hitObject) + { + if (hitObject is not DrawableSentakkiLanedHitObject lanedHitObject) + return false; + + return Lanes[lanedHitObject.HitObject.Lane].Remove(lanedHitObject); } private void onHitObjectLoaded(Drawable hitObject) diff --git a/osu.Game.Rulesets.Sentakki/UI/SentakkiPlayfield.cs b/osu.Game.Rulesets.Sentakki/UI/SentakkiPlayfield.cs index 984c25a2e..ceda9886a 100644 --- a/osu.Game.Rulesets.Sentakki/UI/SentakkiPlayfield.cs +++ b/osu.Game.Rulesets.Sentakki/UI/SentakkiPlayfield.cs @@ -157,6 +157,39 @@ public override bool Remove(HitObject h) } } + public override void Add(DrawableHitObject h) + { + switch (h) + { + case SentakkiLanedHitObject: + LanedPlayfield.Add(h); + break; + + case Touch: + touchPlayfield.Add(h); + break; + + default: + base.Add(h); + break; + } + } + + public override bool Remove(DrawableHitObject h) + { + switch (h) + { + case SentakkiLanedHitObject: + return LanedPlayfield.Remove(h); + + case Touch: + return touchPlayfield.Remove(h); + default: + return base.Remove(h); + } + } + + private void onNewResult(DrawableHitObject judgedObject, JudgementResult result) { if (!judgedObject.DisplayResult || !DisplayJudgements.Value || judgedObject is not DrawableSentakkiHitObject sentakkiHitObject) From 1d9f88a656d026e8ab49b58d8980055d213118d7 Mon Sep 17 00:00:00 2001 From: Derrick Timmermans Date: Wed, 19 Jun 2024 14:43:29 +0200 Subject: [PATCH 3/3] Ensure line renderer behaves correctly --- .../HitObjectLine/LineLifetimeEntry.cs | 2 ++ .../Components/HitObjectLine/LineRenderer.cs | 4 +++ .../UI/LanedPlayfield.cs | 33 ++++--------------- .../UI/SentakkiPlayfield.cs | 33 ------------------- 4 files changed, 13 insertions(+), 59 deletions(-) diff --git a/osu.Game.Rulesets.Sentakki/UI/Components/HitObjectLine/LineLifetimeEntry.cs b/osu.Game.Rulesets.Sentakki/UI/Components/HitObjectLine/LineLifetimeEntry.cs index f29ded3bc..e3ce3b8cb 100644 --- a/osu.Game.Rulesets.Sentakki/UI/Components/HitObjectLine/LineLifetimeEntry.cs +++ b/osu.Game.Rulesets.Sentakki/UI/Components/HitObjectLine/LineLifetimeEntry.cs @@ -34,6 +34,7 @@ public LineLifetimeEntry(DrawableSentakkiRuleset? drawableSentakkiRuleset, doubl public void Add(SentakkiLanedHitObject hitObject) { hitObject.BreakBindable.ValueChanged += onBreakChanged; + hitObject.ColourBindable.ValueChanged += onColorChanged; HitObjects.AddInPlace(hitObject, Comparer.Create((lhs, rhs) => lhs.Lane.CompareTo(rhs.Lane))); UpdateLine(); } @@ -46,6 +47,7 @@ public void Remove(SentakkiLanedHitObject hitObject) } private void onBreakChanged(ValueChangedEvent obj) => UpdateLine(); + private void onColorChanged(ValueChangedEvent obj) => UpdateLine(); public Action OnLineUpdated = null!; diff --git a/osu.Game.Rulesets.Sentakki/UI/Components/HitObjectLine/LineRenderer.cs b/osu.Game.Rulesets.Sentakki/UI/Components/HitObjectLine/LineRenderer.cs index 10ef16a22..99a442e82 100644 --- a/osu.Game.Rulesets.Sentakki/UI/Components/HitObjectLine/LineRenderer.cs +++ b/osu.Game.Rulesets.Sentakki/UI/Components/HitObjectLine/LineRenderer.cs @@ -85,7 +85,11 @@ public void AddHitObject(SentakkiLanedHitObject hitObject) public void RemoveHitObject(SentakkiLanedHitObject hitObject) { + // Ensure that we don't continue to receive time changes + startTimeMap[hitObject].UnbindAll(); + startTimeMap.Remove(hitObject); + removeHitObjectFromEntry(hitObject.StartTime, hitObject); } diff --git a/osu.Game.Rulesets.Sentakki/UI/LanedPlayfield.cs b/osu.Game.Rulesets.Sentakki/UI/LanedPlayfield.cs index d316dd36e..0eca6756d 100644 --- a/osu.Game.Rulesets.Sentakki/UI/LanedPlayfield.cs +++ b/osu.Game.Rulesets.Sentakki/UI/LanedPlayfield.cs @@ -4,7 +4,6 @@ using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.Pooling; using osu.Game.Rulesets.Objects; -using osu.Game.Rulesets.Objects.Drawables; using osu.Game.Rulesets.Sentakki.Objects; using osu.Game.Rulesets.Sentakki.Objects.Drawables; using osu.Game.Rulesets.Sentakki.Objects.Drawables.Pieces.Slides; @@ -60,15 +59,13 @@ public LanedPlayfield() }); } - public override void Add(HitObject h) + public override void Add(HitObject hitObject) { - switch (h) - { - case SentakkiLanedHitObject laned: - HitObjectLineRenderer.AddHitObject(laned); - Lanes[laned.Lane].Add(h); - break; - } + if (hitObject is not SentakkiLanedHitObject lanedHitObject) + return; + + HitObjectLineRenderer.AddHitObject(lanedHitObject); + Lanes[lanedHitObject.Lane].Add(lanedHitObject); } public override bool Remove(HitObject hitObject) @@ -76,25 +73,9 @@ public override bool Remove(HitObject hitObject) if (hitObject is not SentakkiLanedHitObject lanedHitObject) return false; + HitObjectLineRenderer.RemoveHitObject(lanedHitObject); return Lanes[lanedHitObject.Lane].Remove(lanedHitObject); } - public override void Add(DrawableHitObject h) - { - switch (h) - { - case DrawableSentakkiLanedHitObject laned: - Lanes[laned.HitObject.Lane].Add(h); - break; - } - } - - public override bool Remove(DrawableHitObject hitObject) - { - if (hitObject is not DrawableSentakkiLanedHitObject lanedHitObject) - return false; - - return Lanes[lanedHitObject.HitObject.Lane].Remove(lanedHitObject); - } private void onHitObjectLoaded(Drawable hitObject) { diff --git a/osu.Game.Rulesets.Sentakki/UI/SentakkiPlayfield.cs b/osu.Game.Rulesets.Sentakki/UI/SentakkiPlayfield.cs index ceda9886a..984c25a2e 100644 --- a/osu.Game.Rulesets.Sentakki/UI/SentakkiPlayfield.cs +++ b/osu.Game.Rulesets.Sentakki/UI/SentakkiPlayfield.cs @@ -157,39 +157,6 @@ public override bool Remove(HitObject h) } } - public override void Add(DrawableHitObject h) - { - switch (h) - { - case SentakkiLanedHitObject: - LanedPlayfield.Add(h); - break; - - case Touch: - touchPlayfield.Add(h); - break; - - default: - base.Add(h); - break; - } - } - - public override bool Remove(DrawableHitObject h) - { - switch (h) - { - case SentakkiLanedHitObject: - return LanedPlayfield.Remove(h); - - case Touch: - return touchPlayfield.Remove(h); - default: - return base.Remove(h); - } - } - - private void onNewResult(DrawableHitObject judgedObject, JudgementResult result) { if (!judgedObject.DisplayResult || !DisplayJudgements.Value || judgedObject is not DrawableSentakkiHitObject sentakkiHitObject)