1
0
mirror of https://github.com/ppy/osu.git synced 2024-09-22 00:47:24 +08:00

Merge pull request #25253 from bdach/fix-double-adjustment-application

Fix `StopUsingBeatmapClock()` applying adjustments to track it was supposed to stop using
This commit is contained in:
Dean Herbert 2023-10-27 17:07:50 +09:00 committed by GitHub
commit 344bb28469
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 33 additions and 11 deletions

View File

@ -108,6 +108,28 @@ namespace osu.Game.Tests.Gameplay
AddAssert("gameplay clock time = 10000", () => gameplayClockContainer.CurrentTime, () => Is.EqualTo(10000).Within(10f)); AddAssert("gameplay clock time = 10000", () => gameplayClockContainer.CurrentTime, () => Is.EqualTo(10000).Within(10f));
} }
[Test]
public void TestStopUsingBeatmapClock()
{
ClockBackedTestWorkingBeatmap working = null;
MasterGameplayClockContainer gameplayClockContainer = null;
BindableDouble frequencyAdjustment = new BindableDouble(2);
AddStep("create container", () =>
{
working = new ClockBackedTestWorkingBeatmap(new OsuRuleset().RulesetInfo, new FramedClock(new ManualClock()), Audio);
Child = gameplayClockContainer = new MasterGameplayClockContainer(working, 0);
gameplayClockContainer.Reset(startClock: true);
});
AddStep("apply frequency adjustment", () => gameplayClockContainer.AdjustmentsFromMods.AddAdjustment(AdjustableProperty.Frequency, frequencyAdjustment));
AddAssert("track frequency changed", () => working.Track.AggregateFrequency.Value, () => Is.EqualTo(2));
AddStep("stop using beatmap clock", () => gameplayClockContainer.StopUsingBeatmapClock());
AddAssert("frequency adjustment unapplied", () => working.Track.AggregateFrequency.Value, () => Is.EqualTo(1));
}
protected override void Dispose(bool isDisposing) protected override void Dispose(bool isDisposing)
{ {
localConfig?.Dispose(); localConfig?.Dispose();

View File

@ -41,7 +41,7 @@ namespace osu.Game.Screens.Play
private readonly WorkingBeatmap beatmap; private readonly WorkingBeatmap beatmap;
private readonly Track track; private Track track;
private readonly double skipTargetTime; private readonly double skipTargetTime;
@ -145,7 +145,7 @@ namespace osu.Game.Screens.Play
protected override void StartGameplayClock() protected override void StartGameplayClock()
{ {
addSourceClockAdjustments(); addAdjustmentsToTrack();
base.StartGameplayClock(); base.StartGameplayClock();
@ -186,20 +186,20 @@ namespace osu.Game.Screens.Play
/// </summary> /// </summary>
public void StopUsingBeatmapClock() public void StopUsingBeatmapClock()
{ {
removeSourceClockAdjustments(); removeAdjustmentsFromTrack();
var virtualTrack = new TrackVirtual(beatmap.Track.Length); track = new TrackVirtual(beatmap.Track.Length);
virtualTrack.Seek(CurrentTime); track.Seek(CurrentTime);
if (IsRunning) if (IsRunning)
virtualTrack.Start(); track.Start();
ChangeSource(virtualTrack); ChangeSource(track);
addSourceClockAdjustments(); addAdjustmentsToTrack();
} }
private bool speedAdjustmentsApplied; private bool speedAdjustmentsApplied;
private void addSourceClockAdjustments() private void addAdjustmentsToTrack()
{ {
if (speedAdjustmentsApplied) if (speedAdjustmentsApplied)
return; return;
@ -213,7 +213,7 @@ namespace osu.Game.Screens.Play
speedAdjustmentsApplied = true; speedAdjustmentsApplied = true;
} }
private void removeSourceClockAdjustments() private void removeAdjustmentsFromTrack()
{ {
if (!speedAdjustmentsApplied) if (!speedAdjustmentsApplied)
return; return;
@ -228,7 +228,7 @@ namespace osu.Game.Screens.Play
protected override void Dispose(bool isDisposing) protected override void Dispose(bool isDisposing)
{ {
base.Dispose(isDisposing); base.Dispose(isDisposing);
removeSourceClockAdjustments(); removeAdjustmentsFromTrack();
} }
ControlPointInfo IBeatSyncProvider.ControlPoints => beatmap.Beatmap.ControlPointInfo; ControlPointInfo IBeatSyncProvider.ControlPoints => beatmap.Beatmap.ControlPointInfo;