diff --git a/osu.Game.Rulesets.Mania/Mods/ManiaModPerfect.cs b/osu.Game.Rulesets.Mania/Mods/ManiaModPerfect.cs index b02a18c9f4..abcee50e82 100644 --- a/osu.Game.Rulesets.Mania/Mods/ManiaModPerfect.cs +++ b/osu.Game.Rulesets.Mania/Mods/ManiaModPerfect.cs @@ -9,7 +9,7 @@ namespace osu.Game.Rulesets.Mania.Mods { public class ManiaModPerfect : ModPerfect { - protected override bool FailCondition(HealthProcessor healthProcessor, JudgementResult result) + public override bool FailCondition(JudgementResult result) { if (!isRelevantResult(result.Judgement.MinResult) && !isRelevantResult(result.Judgement.MaxResult) && !isRelevantResult(result.Type)) return false; diff --git a/osu.Game.Rulesets.Osu/Mods/OsuModTargetPractice.cs b/osu.Game.Rulesets.Osu/Mods/OsuModTargetPractice.cs index a5846efdfe..cd271290c6 100644 --- a/osu.Game.Rulesets.Osu/Mods/OsuModTargetPractice.cs +++ b/osu.Game.Rulesets.Osu/Mods/OsuModTargetPractice.cs @@ -16,6 +16,7 @@ using osu.Game.Beatmaps.Timing; using osu.Game.Configuration; using osu.Game.Graphics; using osu.Game.Overlays.Settings; +using osu.Game.Rulesets.Judgements; using osu.Game.Rulesets.Mods; using osu.Game.Rulesets.Objects.Drawables; using osu.Game.Rulesets.Objects.Types; @@ -32,7 +33,7 @@ using osuTK.Graphics; namespace osu.Game.Rulesets.Osu.Mods { public class OsuModTargetPractice : ModWithVisibilityAdjustment, IApplicableToDrawableRuleset, - IApplicableToHealthProcessor, IApplicableToDifficulty, IApplicableFailOverride, IHasSeed, IHidesApproachCircles + IApplicableToHealthProcessor, IApplicableToDifficulty, IApplicableFailOverride, IHasSeed, IHidesApproachCircles, IHasFailCondition { public override string Name => "Target Practice"; public override string Acronym => "TP"; @@ -103,12 +104,14 @@ namespace osu.Game.Rulesets.Osu.Mods public bool RestartOnFail => false; - public void ApplyToHealthProcessor(HealthProcessor healthProcessor) - { - // Sudden death - healthProcessor.FailConditions += (_, result) + // Sudden death + public bool FailCondition(JudgementResult result) => result.Type.AffectsCombo() && !result.IsHit; + + public void ApplyToHealthProcessor(HealthProcessor healthProcessor) + { + healthProcessor.FailConditions.Add(this); } #endregion diff --git a/osu.Game/Rulesets/Mods/ModAccuracyChallenge.cs b/osu.Game/Rulesets/Mods/ModAccuracyChallenge.cs index 9570cddb0a..1ee0b8c466 100644 --- a/osu.Game/Rulesets/Mods/ModAccuracyChallenge.cs +++ b/osu.Game/Rulesets/Mods/ModAccuracyChallenge.cs @@ -74,7 +74,7 @@ namespace osu.Game.Rulesets.Mods public ScoreRank AdjustRank(ScoreRank rank, double accuracy) => rank; - protected override bool FailCondition(HealthProcessor healthProcessor, JudgementResult result) => false; + public override bool FailCondition(JudgementResult result) => false; public enum AccuracyMode { diff --git a/osu.Game/Rulesets/Mods/ModFailCondition.cs b/osu.Game/Rulesets/Mods/ModFailCondition.cs index fab592d59c..96881c2d4d 100644 --- a/osu.Game/Rulesets/Mods/ModFailCondition.cs +++ b/osu.Game/Rulesets/Mods/ModFailCondition.cs @@ -9,7 +9,7 @@ using osu.Game.Rulesets.Scoring; namespace osu.Game.Rulesets.Mods { - public abstract class ModFailCondition : Mod, IApplicableToHealthProcessor, IApplicableFailOverride + public abstract class ModFailCondition : Mod, IApplicableToHealthProcessor, IApplicableFailOverride, IHasFailCondition { public override Type[] IncompatibleMods => new[] { typeof(ModNoFail), typeof(ModCinema) }; @@ -20,12 +20,12 @@ namespace osu.Game.Rulesets.Mods public virtual bool RestartOnFail => Restart.Value; - private Action? triggerFailureDelegate; + private Action? triggerFailureDelegate; public void ApplyToHealthProcessor(HealthProcessor healthProcessor) { triggerFailureDelegate = healthProcessor.TriggerFailure; - healthProcessor.FailConditions += FailCondition; + healthProcessor.FailConditions.Add(this); } /// @@ -45,6 +45,6 @@ namespace osu.Game.Rulesets.Mods /// Using outside values to evaluate failure may introduce event ordering discrepancies, use /// an with instead. /// - protected abstract bool FailCondition(HealthProcessor healthProcessor, JudgementResult result); + public abstract bool FailCondition(JudgementResult result); } } diff --git a/osu.Game/Rulesets/Mods/ModPerfect.cs b/osu.Game/Rulesets/Mods/ModPerfect.cs index 5bedf443da..d8020905da 100644 --- a/osu.Game/Rulesets/Mods/ModPerfect.cs +++ b/osu.Game/Rulesets/Mods/ModPerfect.cs @@ -28,7 +28,7 @@ namespace osu.Game.Rulesets.Mods Restart.Value = Restart.Default = true; } - protected override bool FailCondition(HealthProcessor healthProcessor, JudgementResult result) + public override bool FailCondition(JudgementResult result) => (isRelevantResult(result.Judgement.MinResult) || isRelevantResult(result.Judgement.MaxResult) || isRelevantResult(result.Type)) && result.Type != result.Judgement.MaxResult; diff --git a/osu.Game/Rulesets/Mods/ModSuddenDeath.cs b/osu.Game/Rulesets/Mods/ModSuddenDeath.cs index d07ff6ce87..070818e1c3 100644 --- a/osu.Game/Rulesets/Mods/ModSuddenDeath.cs +++ b/osu.Game/Rulesets/Mods/ModSuddenDeath.cs @@ -23,7 +23,7 @@ namespace osu.Game.Rulesets.Mods public override Type[] IncompatibleMods => base.IncompatibleMods.Append(typeof(ModPerfect)).ToArray(); - protected override bool FailCondition(HealthProcessor healthProcessor, JudgementResult result) + public override bool FailCondition(JudgementResult result) => result.Type.AffectsCombo() && !result.IsHit; }