mirror of https://github.com/ppy/osu
Merge pull request #19958 from peppy/fix-fail-freq-stuck
Ensure fail animation sequence isn't run after the player exit sequence has started
This commit is contained in:
commit
cf6bb3b030
|
@ -146,6 +146,7 @@ public virtual bool TryTransferTrack([NotNull] WorkingBeatmap target)
|
|||
/// Get the loaded audio track instance. <see cref="LoadTrack"/> must have first been called.
|
||||
/// This generally happens via MusicController when changing the global beatmap.
|
||||
/// </summary>
|
||||
[NotNull]
|
||||
public Track Track
|
||||
{
|
||||
get
|
||||
|
|
|
@ -1,14 +1,11 @@
|
|||
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
|
||||
// See the LICENCE file in the repository root for full licence text.
|
||||
|
||||
#nullable disable
|
||||
|
||||
using osu.Framework.Audio;
|
||||
using osu.Framework.Bindables;
|
||||
using osu.Game.Rulesets.UI;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using JetBrains.Annotations;
|
||||
using ManagedBass.Fx;
|
||||
using osu.Framework.Allocation;
|
||||
using osu.Framework.Audio.Sample;
|
||||
|
@ -34,27 +31,27 @@ namespace osu.Game.Screens.Play
|
|||
/// </summary>
|
||||
public class FailAnimation : Container
|
||||
{
|
||||
public Action OnComplete;
|
||||
public Action? OnComplete;
|
||||
|
||||
private readonly DrawableRuleset drawableRuleset;
|
||||
private readonly BindableDouble trackFreq = new BindableDouble(1);
|
||||
private readonly BindableDouble volumeAdjustment = new BindableDouble(0.5);
|
||||
|
||||
private Container filters;
|
||||
private Container filters = null!;
|
||||
|
||||
private Box redFlashLayer;
|
||||
private Box redFlashLayer = null!;
|
||||
|
||||
private Track track;
|
||||
private Track track = null!;
|
||||
|
||||
private AudioFilter failLowPassFilter;
|
||||
private AudioFilter failHighPassFilter;
|
||||
private AudioFilter failLowPassFilter = null!;
|
||||
private AudioFilter failHighPassFilter = null!;
|
||||
|
||||
private const float duration = 2500;
|
||||
|
||||
private Sample failSample;
|
||||
private Sample? failSample;
|
||||
|
||||
[Resolved]
|
||||
private OsuConfigManager config { get; set; }
|
||||
private OsuConfigManager config { get; set; } = null!;
|
||||
|
||||
protected override Container<Drawable> Content { get; } = new Container
|
||||
{
|
||||
|
@ -66,8 +63,7 @@ public class FailAnimation : Container
|
|||
/// <summary>
|
||||
/// The player screen background, used to adjust appearance on failing.
|
||||
/// </summary>
|
||||
[CanBeNull]
|
||||
public BackgroundScreen Background { private get; set; }
|
||||
public BackgroundScreen? Background { private get; set; }
|
||||
|
||||
public FailAnimation(DrawableRuleset drawableRuleset)
|
||||
{
|
||||
|
@ -105,6 +101,7 @@ private void load(AudioManager audio, IBindable<WorkingBeatmap> beatmap)
|
|||
}
|
||||
|
||||
private bool started;
|
||||
private bool filtersRemoved;
|
||||
|
||||
/// <summary>
|
||||
/// Start the fail animation playing.
|
||||
|
@ -113,6 +110,7 @@ private void load(AudioManager audio, IBindable<WorkingBeatmap> beatmap)
|
|||
public void Start()
|
||||
{
|
||||
if (started) throw new InvalidOperationException("Animation cannot be started more than once.");
|
||||
if (filtersRemoved) throw new InvalidOperationException("Animation cannot be started after filters have been removed.");
|
||||
|
||||
started = true;
|
||||
|
||||
|
@ -125,7 +123,7 @@ public void Start()
|
|||
|
||||
failHighPassFilter.CutoffTo(300);
|
||||
failLowPassFilter.CutoffTo(300, duration, Easing.OutCubic);
|
||||
failSample.Play();
|
||||
failSample?.Play();
|
||||
|
||||
track.AddAdjustment(AdjustableProperty.Frequency, trackFreq);
|
||||
track.AddAdjustment(AdjustableProperty.Volume, volumeAdjustment);
|
||||
|
@ -155,10 +153,15 @@ public void Start()
|
|||
|
||||
public void RemoveFilters(bool resetTrackFrequency = true)
|
||||
{
|
||||
if (resetTrackFrequency)
|
||||
track?.RemoveAdjustment(AdjustableProperty.Frequency, trackFreq);
|
||||
filtersRemoved = true;
|
||||
|
||||
track?.RemoveAdjustment(AdjustableProperty.Volume, volumeAdjustment);
|
||||
if (!started)
|
||||
return;
|
||||
|
||||
if (resetTrackFrequency)
|
||||
track.RemoveAdjustment(AdjustableProperty.Frequency, trackFreq);
|
||||
|
||||
track.RemoveAdjustment(AdjustableProperty.Volume, volumeAdjustment);
|
||||
|
||||
if (filters.Parent == null)
|
||||
return;
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
#nullable disable
|
||||
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Threading;
|
||||
|
@ -827,9 +828,17 @@ protected override bool OnScroll(ScrollEvent e)
|
|||
|
||||
private bool onFail()
|
||||
{
|
||||
// Failing after the quit sequence has started may cause weird side effects with the fail animation / effects.
|
||||
if (GameplayState.HasQuit)
|
||||
return false;
|
||||
|
||||
if (!CheckModsAllowFailure())
|
||||
return false;
|
||||
|
||||
Debug.Assert(!GameplayState.HasFailed);
|
||||
Debug.Assert(!GameplayState.HasPassed);
|
||||
Debug.Assert(!GameplayState.HasQuit);
|
||||
|
||||
GameplayState.HasFailed = true;
|
||||
|
||||
updateGameplayState();
|
||||
|
|
Loading…
Reference in New Issue