From b2de486aecbb775e6721ffe8802d7c64af557ed8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Tue, 20 May 2025 14:14:36 +0200 Subject: [PATCH 1/2] Add failing test case --- .../Mods/TestSceneOsuModStrictTracking.cs | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/osu.Game.Rulesets.Osu.Tests/Mods/TestSceneOsuModStrictTracking.cs b/osu.Game.Rulesets.Osu.Tests/Mods/TestSceneOsuModStrictTracking.cs index 66a60e3542..170d9830f2 100644 --- a/osu.Game.Rulesets.Osu.Tests/Mods/TestSceneOsuModStrictTracking.cs +++ b/osu.Game.Rulesets.Osu.Tests/Mods/TestSceneOsuModStrictTracking.cs @@ -49,5 +49,59 @@ namespace osu.Game.Rulesets.Osu.Tests.Mods }, PassCondition = () => Player.ScoreProcessor.Combo.Value == 2 }); + + [Test] + public void TestRewind() + { + bool seekedBack = false; + bool missRecorded = false; + + CreateModTest(new ModTestData + { + Mod = new OsuModStrictTracking(), + Autoplay = false, + CreateBeatmap = () => new Beatmap + { + HitObjects = new List + { + new Slider + { + StartTime = 1000, + Path = new SliderPath + { + ControlPoints = + { + new PathControlPoint(), + new PathControlPoint(new Vector2(0, 100)) + } + } + } + } + }, + ReplayFrames = new List + { + new OsuReplayFrame(0, new Vector2(100, 0)), + new OsuReplayFrame(1000, new Vector2(100, 0)), + new OsuReplayFrame(1050, new Vector2()), + new OsuReplayFrame(1100, new Vector2(), OsuAction.LeftButton), + new OsuReplayFrame(1750, new Vector2(0, 100), OsuAction.LeftButton), + new OsuReplayFrame(1751, new Vector2(0, 100)), + }, + PassCondition = () => seekedBack && !missRecorded, + }); + AddStep("subscribe to new judgements", () => Player.ScoreProcessor.NewJudgement += j => + { + if (!j.IsHit) + missRecorded = true; + }); + AddUntilStep("wait for gameplay completion", () => Player.GameplayState.HasCompleted); + AddAssert("no misses", () => missRecorded, () => Is.False); + AddStep("seek back", () => + { + Player.GameplayClockContainer.Stop(); + Player.Seek(1040); + seekedBack = true; + }); + } } } From 3a136a4c811ac54b85be92b77911b38b04dcccf5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Tue, 20 May 2025 14:04:01 +0200 Subject: [PATCH 2/2] Fix Strict Tracking running miss-on-tracking-loss logic during rewind Probably closes https://github.com/ppy/osu/issues/29945. --- osu.Game.Rulesets.Osu/Mods/OsuModStrictTracking.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/osu.Game.Rulesets.Osu/Mods/OsuModStrictTracking.cs b/osu.Game.Rulesets.Osu/Mods/OsuModStrictTracking.cs index 7d2fd628f6..5ee8814b5a 100644 --- a/osu.Game.Rulesets.Osu/Mods/OsuModStrictTracking.cs +++ b/osu.Game.Rulesets.Osu/Mods/OsuModStrictTracking.cs @@ -16,6 +16,7 @@ using osu.Game.Rulesets.Osu.Judgements; using osu.Game.Rulesets.Osu.Objects; using osu.Game.Rulesets.Osu.Objects.Drawables; using osu.Game.Rulesets.UI; +using osu.Game.Screens.Play; namespace osu.Game.Rulesets.Osu.Mods { @@ -39,6 +40,9 @@ namespace osu.Game.Rulesets.Osu.Mods if (slider.Time.Current < slider.HitObject.StartTime) return; + if ((slider.Clock as IGameplayClock)?.IsRewinding == true) + return; + var tail = slider.NestedHitObjects.OfType().First(); if (!tail.Judged)