1
0
mirror of https://github.com/ppy/osu.git synced 2024-12-14 21:02:55 +08:00

Merge pull request #9007 from peppy/fix-failure-logic

Fix mod failure checks executing actual game logic
This commit is contained in:
Dan Balasescu 2020-05-14 23:06:34 +09:00 committed by GitHub
commit 4b0ca87a0a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 25 additions and 21 deletions

View File

@ -24,7 +24,8 @@ namespace osu.Game.Rulesets.Osu.Mods
public override double ScoreMultiplier => 1; public override double ScoreMultiplier => 1;
public override Type[] IncompatibleMods => new[] { typeof(OsuModSpunOut), typeof(ModRelax), typeof(ModSuddenDeath), typeof(ModNoFail), typeof(ModAutoplay) }; public override Type[] IncompatibleMods => new[] { typeof(OsuModSpunOut), typeof(ModRelax), typeof(ModSuddenDeath), typeof(ModNoFail), typeof(ModAutoplay) };
public bool AllowFail => false; public bool PerformFail() => false;
public bool RestartOnFail => false; public bool RestartOnFail => false;
private OsuInputManager inputManager; private OsuInputManager inputManager;

View File

@ -33,7 +33,8 @@ namespace osu.Game.Tests.Visual.Gameplay
{ {
public new ScoreProcessor ScoreProcessor => base.ScoreProcessor; public new ScoreProcessor ScoreProcessor => base.ScoreProcessor;
public new HUDOverlay HUDOverlay => base.HUDOverlay; public new HUDOverlay HUDOverlay => base.HUDOverlay;
public new bool AllowFail => base.AllowFail;
public bool AllowFail => base.CheckModsAllowFailure();
protected override bool PauseOnFocusLost => false; protected override bool PauseOnFocusLost => false;

View File

@ -11,10 +11,11 @@ namespace osu.Game.Rulesets.Mods
/// <summary> /// <summary>
/// Whether we should allow failing at the current point in time. /// Whether we should allow failing at the current point in time.
/// </summary> /// </summary>
bool AllowFail { get; } /// <returns>Whether the fail should be allowed to proceed. Return false to block.</returns>
bool PerformFail();
/// <summary> /// <summary>
/// Whether we want to restart on fail. Only used if <see cref="AllowFail"/> is true. /// Whether we want to restart on fail. Only used if <see cref="PerformFail"/> returns true.
/// </summary> /// </summary>
bool RestartOnFail { get; } bool RestartOnFail { get; }
} }

View File

@ -27,7 +27,8 @@ namespace osu.Game.Rulesets.Mods
public override string Description => "Watch a perfect automated play through the song."; public override string Description => "Watch a perfect automated play through the song.";
public override double ScoreMultiplier => 1; public override double ScoreMultiplier => 1;
public bool AllowFail => false; public bool PerformFail() => false;
public bool RestartOnFail => false; public bool RestartOnFail => false;
public override Type[] IncompatibleMods => new[] { typeof(ModRelax), typeof(ModSuddenDeath), typeof(ModNoFail) }; public override Type[] IncompatibleMods => new[] { typeof(ModRelax), typeof(ModSuddenDeath), typeof(ModNoFail) };

View File

@ -14,7 +14,7 @@ namespace osu.Game.Rulesets.Mods
/// <summary> /// <summary>
/// We never fail, 'yo. /// We never fail, 'yo.
/// </summary> /// </summary>
public bool AllowFail => false; public bool PerformFail() => false;
public bool RestartOnFail => false; public bool RestartOnFail => false;

View File

@ -48,17 +48,14 @@ namespace osu.Game.Rulesets.Mods
retries = Retries.Value; retries = Retries.Value;
} }
public bool AllowFail public bool PerformFail()
{ {
get if (retries == 0) return true;
{
if (retries == 0) return true;
health.Value = health.MaxValue; health.Value = health.MaxValue;
retries--; retries--;
return false; return false;
}
} }
public bool RestartOnFail => false; public bool RestartOnFail => false;

View File

@ -20,7 +20,8 @@ namespace osu.Game.Rulesets.Mods
public override bool Ranked => true; public override bool Ranked => true;
public override Type[] IncompatibleMods => new[] { typeof(ModNoFail), typeof(ModRelax), typeof(ModAutoplay) }; public override Type[] IncompatibleMods => new[] { typeof(ModNoFail), typeof(ModRelax), typeof(ModAutoplay) };
public bool AllowFail => true; public bool PerformFail() => true;
public bool RestartOnFail => true; public bool RestartOnFail => true;
public void ApplyToHealthProcessor(HealthProcessor healthProcessor) public void ApplyToHealthProcessor(HealthProcessor healthProcessor)

View File

@ -105,7 +105,7 @@ namespace osu.Game.Screens.Play
/// Whether failing should be allowed. /// Whether failing should be allowed.
/// By default, this checks whether all selected mods allow failing. /// By default, this checks whether all selected mods allow failing.
/// </summary> /// </summary>
protected virtual bool AllowFail => Mods.Value.OfType<IApplicableFailOverride>().All(m => m.AllowFail); protected virtual bool CheckModsAllowFailure() => Mods.Value.OfType<IApplicableFailOverride>().All(m => m.PerformFail());
private readonly bool allowPause; private readonly bool allowPause;
private readonly bool showResults; private readonly bool showResults;
@ -485,7 +485,7 @@ namespace osu.Game.Screens.Play
private bool onFail() private bool onFail()
{ {
if (!AllowFail) if (!CheckModsAllowFailure())
return false; return false;
HasFailed = true; HasFailed = true;

View File

@ -12,7 +12,7 @@ namespace osu.Game.Screens.Play
private readonly Score score; private readonly Score score;
// Disallow replays from failing. (see https://github.com/ppy/osu/issues/6108) // Disallow replays from failing. (see https://github.com/ppy/osu/issues/6108)
protected override bool AllowFail => false; protected override bool CheckModsAllowFailure() => false;
public ReplayPlayer(Score score, bool allowPause = true, bool showResults = true) public ReplayPlayer(Score score, bool allowPause = true, bool showResults = true)
: base(allowPause, showResults) : base(allowPause, showResults)

View File

@ -41,7 +41,7 @@ namespace osu.Game.Tests.Visual
{ {
} }
protected override bool AllowFail => true; protected override bool CheckModsAllowFailure() => true;
public bool CheckFailed(bool failed) public bool CheckFailed(bool failed)
{ {

View File

@ -64,12 +64,14 @@ namespace osu.Game.Tests.Visual
protected class ModTestPlayer : TestPlayer protected class ModTestPlayer : TestPlayer
{ {
protected override bool AllowFail { get; } private readonly bool allowFail;
protected override bool CheckModsAllowFailure() => allowFail;
public ModTestPlayer(bool allowFail) public ModTestPlayer(bool allowFail)
: base(false, false) : base(false, false)
{ {
AllowFail = allowFail; this.allowFail = allowFail;
} }
} }