1
0
mirror of https://github.com/ppy/osu.git synced 2026-05-16 12:23:02 +08:00

Merge pull request #33210 from bdach/strict-tracking-rewind

Fix Strict Tracking running miss-on-tracking-loss logic during rewind
This commit is contained in:
Dan Balasescu
2025-05-21 21:27:01 +09:00
committed by GitHub
Unverified
2 changed files with 58 additions and 0 deletions
@@ -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<HitObject>
{
new Slider
{
StartTime = 1000,
Path = new SliderPath
{
ControlPoints =
{
new PathControlPoint(),
new PathControlPoint(new Vector2(0, 100))
}
}
}
}
},
ReplayFrames = new List<ReplayFrame>
{
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;
});
}
}
}
@@ -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<StrictTrackingDrawableSliderTail>().First();
if (!tail.Judged)