diff --git a/osu.Game.Rulesets.Mania.Tests/Mods/TestSceneManiaModPerfect.cs b/osu.Game.Rulesets.Mania.Tests/Mods/TestSceneManiaModPerfect.cs index b7a9b31dcc..e823d57b0b 100644 --- a/osu.Game.Rulesets.Mania.Tests/Mods/TestSceneManiaModPerfect.cs +++ b/osu.Game.Rulesets.Mania.Tests/Mods/TestSceneManiaModPerfect.cs @@ -31,9 +31,12 @@ namespace osu.Game.Rulesets.Mania.Tests.Mods public void TestHoldNote(bool shouldMiss) => CreateHitObjectTest(new HitObjectTestData(new HoldNote { StartTime = 1000, EndTime = 3000 }), shouldMiss); [Test] - public void TestGreatHit() => CreateModTest(new ModTestData + public void TestPerfectHits([Values] bool requirePerfectHits) => CreateModTest(new ModTestData { - Mod = new ManiaModPerfect(), + Mod = new ManiaModPerfect + { + RequirePerfectHits = { Value = requirePerfectHits } + }, PassCondition = () => ((ModFailConditionTestPlayer)Player).CheckFailed(false), Autoplay = false, CreateBeatmap = () => new Beatmap @@ -47,6 +50,32 @@ namespace osu.Game.Rulesets.Mania.Tests.Mods }, }, ReplayFrames = new List + { + new ManiaReplayFrame(1000, ManiaAction.Key1), + new ManiaReplayFrame(2000) + } + }); + + [Test] + public void TestGreatHit([Values] bool requirePerfectHits) => CreateModTest(new ModTestData + { + Mod = new ManiaModPerfect + { + RequirePerfectHits = { Value = requirePerfectHits } + }, + PassCondition = () => ((ModFailConditionTestPlayer)Player).CheckFailed(requirePerfectHits), + Autoplay = false, + CreateBeatmap = () => new Beatmap + { + HitObjects = new List + { + new Note + { + StartTime = 1000, + } + }, + }, + ReplayFrames = new List { new ManiaReplayFrame(1020, ManiaAction.Key1), new ManiaReplayFrame(2000) diff --git a/osu.Game.Rulesets.Mania/Mods/ManiaModPerfect.cs b/osu.Game.Rulesets.Mania/Mods/ManiaModPerfect.cs index b02a18c9f4..7ce750f4f8 100644 --- a/osu.Game.Rulesets.Mania/Mods/ManiaModPerfect.cs +++ b/osu.Game.Rulesets.Mania/Mods/ManiaModPerfect.cs @@ -1,6 +1,8 @@ // Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. +using osu.Framework.Bindables; +using osu.Game.Configuration; using osu.Game.Rulesets.Judgements; using osu.Game.Rulesets.Mods; using osu.Game.Rulesets.Scoring; @@ -9,13 +11,16 @@ namespace osu.Game.Rulesets.Mania.Mods { public class ManiaModPerfect : ModPerfect { + [SettingSource("Require perfect hits")] + public BindableBool RequirePerfectHits { get; } = new BindableBool(); + protected override bool FailCondition(HealthProcessor healthProcessor, JudgementResult result) { if (!isRelevantResult(result.Judgement.MinResult) && !isRelevantResult(result.Judgement.MaxResult) && !isRelevantResult(result.Type)) return false; // Mania allows imperfect "Great" hits without failing. - if (result.Judgement.MaxResult == HitResult.Perfect) + if (result.Judgement.MaxResult == HitResult.Perfect && !RequirePerfectHits.Value) return result.Type < HitResult.Great; return result.Type != result.Judgement.MaxResult;