From 224de9cc1ea9d911b1718f200ae5b3c4b8b10ec5 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Sat, 5 Aug 2017 11:59:58 +0900 Subject: [PATCH] Implement NoFail mod --- osu.Game/Rulesets/Mods/Mod.cs | 5 +++++ osu.Game/Rulesets/Mods/ModNoFail.cs | 5 +++++ osu.Game/Rulesets/Scoring/ScoreProcessor.cs | 7 ++++--- osu.Game/Screens/Play/Player.cs | 6 +++++- 4 files changed, 19 insertions(+), 4 deletions(-) diff --git a/osu.Game/Rulesets/Mods/Mod.cs b/osu.Game/Rulesets/Mods/Mod.cs index c00847b7d8..69daedb7a7 100644 --- a/osu.Game/Rulesets/Mods/Mod.cs +++ b/osu.Game/Rulesets/Mods/Mod.cs @@ -45,5 +45,10 @@ namespace osu.Game.Rulesets.Mods /// The mods this mod cannot be enabled with. /// public virtual Type[] IncompatibleMods => new Type[] { }; + + /// + /// Whether we should allow fails at the + /// + public virtual bool AllowFail => true; } } diff --git a/osu.Game/Rulesets/Mods/ModNoFail.cs b/osu.Game/Rulesets/Mods/ModNoFail.cs index 613e1e1d4d..d41c4e3956 100644 --- a/osu.Game/Rulesets/Mods/ModNoFail.cs +++ b/osu.Game/Rulesets/Mods/ModNoFail.cs @@ -15,5 +15,10 @@ namespace osu.Game.Rulesets.Mods public override double ScoreMultiplier => 0.5; public override bool Ranked => true; public override Type[] IncompatibleMods => new[] { typeof(ModRelax), typeof(ModSuddenDeath), typeof(ModAutoplay) }; + + /// + /// We never fail, 'yo. + /// + public override bool AllowFail => false; } } \ No newline at end of file diff --git a/osu.Game/Rulesets/Scoring/ScoreProcessor.cs b/osu.Game/Rulesets/Scoring/ScoreProcessor.cs index 79fb34a523..cd9089c859 100644 --- a/osu.Game/Rulesets/Scoring/ScoreProcessor.cs +++ b/osu.Game/Rulesets/Scoring/ScoreProcessor.cs @@ -16,8 +16,9 @@ namespace osu.Game.Rulesets.Scoring { /// /// Invoked when the ScoreProcessor is in a failed state. + /// Return true if the fail was permitted. /// - public event Action Failed; + public event Func Failed; /// /// Invoked when a new judgement has occurred. This occurs after the judgement has been processed by the . @@ -106,8 +107,8 @@ namespace osu.Game.Rulesets.Scoring if (alreadyFailed || !HasFailed) return; - alreadyFailed = true; - Failed?.Invoke(); + if (Failed?.Invoke() != false) + alreadyFailed = true; } /// diff --git a/osu.Game/Screens/Play/Player.cs b/osu.Game/Screens/Play/Player.cs index 39128eb85e..345ad60d47 100644 --- a/osu.Game/Screens/Play/Player.cs +++ b/osu.Game/Screens/Play/Player.cs @@ -238,13 +238,17 @@ namespace osu.Game.Screens.Play } } - private void onFail() + private bool onFail() { + if (Beatmap.Value.Mods.Value.Any(m => !m.AllowFail)) + return false; + decoupledClock.Stop(); HasFailed = true; failOverlay.Retries = RestartCount; failOverlay.Show(); + return true; } protected override void OnEntering(Screen last)