1
0
mirror of https://github.com/ppy/osu.git synced 2024-11-11 07:07:45 +08:00

Prevent non-combo affecting judgements from triggering sudden death

This commit is contained in:
David Zhao 2019-06-21 14:29:16 +09:00
parent d5a7b839ee
commit de59e038ac
5 changed files with 74 additions and 7 deletions

View File

@ -0,0 +1,65 @@
// 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.
using System.Linq;
using NUnit.Framework;
using osu.Game.Beatmaps;
using osu.Game.Rulesets.Scoring;
using osu.Game.Rulesets.Taiko.Beatmaps;
using osu.Game.Rulesets.Taiko.Mods;
using osu.Game.Rulesets.Taiko.Objects;
using osu.Game.Screens.Play;
using osu.Game.Tests.Visual;
namespace osu.Game.Rulesets.Taiko.Tests
{
public class TestSceneTaikoSuddenDeath : PlayerTestScene
{
public TestSceneTaikoSuddenDeath()
: base(new TaikoRuleset())
{
}
protected override bool AllowFail => true;
protected override Player CreatePlayer(Ruleset ruleset) => new ScoreAccessiblePlayer();
protected override IBeatmap CreateBeatmap(RulesetInfo ruleset) =>
new TaikoBeatmap
{
HitObjects =
{
new Swell { StartTime = 1500 },
new Hit { StartTime = 100000 },
},
BeatmapInfo =
{
Ruleset = new TaikoRuleset().RulesetInfo
}
};
[Test]
public void TestSpinnerDoesNotFail()
{
bool judged = false;
AddStep("Setup judgements", () =>
{
judged = false;
Mods.Value = Mods.Value.Concat(new[] { new TaikoModSuddenDeath() }).ToArray();
((ScoreAccessiblePlayer)Player).ScoreProcessor.NewJudgement += b => judged = true;
});
AddUntilStep("swell judged", () => judged);
AddAssert("not failed", () => !Player.HasFailed);
}
private class ScoreAccessiblePlayer : TestPlayer
{
public ScoreAccessiblePlayer()
: base(false, false)
{
}
public new ScoreProcessor ScoreProcessor => base.ScoreProcessor;
}
}
}

View File

@ -43,7 +43,7 @@ namespace osu.Game.Tests.Visual.Gameplay
protected override void LoadComplete() protected override void LoadComplete()
{ {
base.LoadComplete(); base.LoadComplete();
ScoreProcessor.FailConditions += _ => true; ScoreProcessor.FailConditions += (_, __) => true;
} }
} }
} }

View File

@ -3,6 +3,7 @@
using osu.Framework.Graphics.Sprites; using osu.Framework.Graphics.Sprites;
using osu.Game.Graphics; using osu.Game.Graphics;
using osu.Game.Rulesets.Judgements;
using osu.Game.Rulesets.Scoring; using osu.Game.Rulesets.Scoring;
namespace osu.Game.Rulesets.Mods namespace osu.Game.Rulesets.Mods
@ -14,6 +15,6 @@ namespace osu.Game.Rulesets.Mods
public override IconUsage Icon => OsuIcon.ModPerfect; public override IconUsage Icon => OsuIcon.ModPerfect;
public override string Description => "SS or quit."; public override string Description => "SS or quit.";
protected override bool FailCondition(ScoreProcessor scoreProcessor) => scoreProcessor.Accuracy.Value != 1; protected override bool FailCondition(ScoreProcessor scoreProcessor, JudgementResult result) => scoreProcessor.Accuracy.Value != 1;
} }
} }

View File

@ -4,6 +4,7 @@
using System; using System;
using osu.Framework.Graphics.Sprites; using osu.Framework.Graphics.Sprites;
using osu.Game.Graphics; using osu.Game.Graphics;
using osu.Game.Rulesets.Judgements;
using osu.Game.Rulesets.Scoring; using osu.Game.Rulesets.Scoring;
using osu.Game.Scoring; using osu.Game.Scoring;
@ -27,6 +28,6 @@ namespace osu.Game.Rulesets.Mods
public ScoreRank AdjustRank(ScoreRank rank, double accuracy) => rank; public ScoreRank AdjustRank(ScoreRank rank, double accuracy) => rank;
protected virtual bool FailCondition(ScoreProcessor scoreProcessor) => scoreProcessor.Combo.Value == 0; protected virtual bool FailCondition(ScoreProcessor scoreProcessor, JudgementResult result) => scoreProcessor.Combo.Value == 0 && result.Judgement.AffectsCombo;
} }
} }

View File

@ -40,7 +40,7 @@ namespace osu.Game.Rulesets.Scoring
/// <summary> /// <summary>
/// Additional conditions on top of <see cref="DefaultFailCondition"/> that cause a failing state. /// Additional conditions on top of <see cref="DefaultFailCondition"/> that cause a failing state.
/// </summary> /// </summary>
public event Func<ScoreProcessor, bool> FailConditions; public event Func<ScoreProcessor, JudgementResult, bool> FailConditions;
/// <summary> /// <summary>
/// The current total score. /// The current total score.
@ -151,12 +151,12 @@ namespace osu.Game.Rulesets.Scoring
/// This can only ever notify subscribers once. /// This can only ever notify subscribers once.
/// </para> /// </para>
/// </summary> /// </summary>
protected void UpdateFailed() protected void UpdateFailed(JudgementResult result)
{ {
if (HasFailed) if (HasFailed)
return; return;
if (!DefaultFailCondition && FailConditions?.Invoke(this) != true) if (!DefaultFailCondition && FailConditions?.Invoke(this, result) != true)
return; return;
if (Failed?.Invoke() != false) if (Failed?.Invoke() != false)
@ -287,7 +287,7 @@ namespace osu.Game.Rulesets.Scoring
ApplyResult(result); ApplyResult(result);
updateScore(); updateScore();
UpdateFailed(); UpdateFailed(result);
NotifyNewJudgement(result); NotifyNewJudgement(result);
} }