mirror of
https://github.com/ppy/osu.git
synced 2025-02-26 06:42:54 +08:00
Merge pull request #27683 from 64ArthurAraujo/verify-abnormal-difficulty-settings
Add verify checks for abnormal difficulty settings
This commit is contained in:
commit
fcfb9d6db5
@ -0,0 +1,158 @@
|
|||||||
|
// 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.Catch.Edit.Checks;
|
||||||
|
using osu.Game.Rulesets.Edit;
|
||||||
|
using osu.Game.Rulesets.Edit.Checks;
|
||||||
|
using osu.Game.Rulesets.Objects;
|
||||||
|
using osu.Game.Tests.Beatmaps;
|
||||||
|
|
||||||
|
namespace osu.Game.Rulesets.Catch.Tests.Editor.Checks
|
||||||
|
{
|
||||||
|
[TestFixture]
|
||||||
|
public class CheckCatchAbnormalDifficultySettingsTest
|
||||||
|
{
|
||||||
|
private CheckCatchAbnormalDifficultySettings check = null!;
|
||||||
|
|
||||||
|
private readonly IBeatmap beatmap = new Beatmap<HitObject>();
|
||||||
|
|
||||||
|
[SetUp]
|
||||||
|
public void Setup()
|
||||||
|
{
|
||||||
|
check = new CheckCatchAbnormalDifficultySettings();
|
||||||
|
|
||||||
|
beatmap.BeatmapInfo.Ruleset = new CatchRuleset().RulesetInfo;
|
||||||
|
beatmap.Difficulty = new BeatmapDifficulty
|
||||||
|
{
|
||||||
|
ApproachRate = 5,
|
||||||
|
CircleSize = 5,
|
||||||
|
DrainRate = 5,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestNormalSettings()
|
||||||
|
{
|
||||||
|
var context = getContext();
|
||||||
|
var issues = check.Run(context).ToList();
|
||||||
|
|
||||||
|
Assert.That(issues, Has.Count.EqualTo(0));
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestApproachRateTwoDecimals()
|
||||||
|
{
|
||||||
|
beatmap.Difficulty.ApproachRate = 5.55f;
|
||||||
|
|
||||||
|
var context = getContext();
|
||||||
|
var issues = check.Run(context).ToList();
|
||||||
|
|
||||||
|
Assert.That(issues, Has.Count.EqualTo(1));
|
||||||
|
Assert.That(issues.Single().Template is CheckAbnormalDifficultySettings.IssueTemplateMoreThanOneDecimal);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestCircleSizeTwoDecimals()
|
||||||
|
{
|
||||||
|
beatmap.Difficulty.CircleSize = 5.55f;
|
||||||
|
|
||||||
|
var context = getContext();
|
||||||
|
var issues = check.Run(context).ToList();
|
||||||
|
|
||||||
|
Assert.That(issues, Has.Count.EqualTo(1));
|
||||||
|
Assert.That(issues.Single().Template is CheckAbnormalDifficultySettings.IssueTemplateMoreThanOneDecimal);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestDrainRateTwoDecimals()
|
||||||
|
{
|
||||||
|
beatmap.Difficulty.DrainRate = 5.55f;
|
||||||
|
|
||||||
|
var context = getContext();
|
||||||
|
var issues = check.Run(context).ToList();
|
||||||
|
|
||||||
|
Assert.That(issues, Has.Count.EqualTo(1));
|
||||||
|
Assert.That(issues.Single().Template is CheckAbnormalDifficultySettings.IssueTemplateMoreThanOneDecimal);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestApproachRateUnder()
|
||||||
|
{
|
||||||
|
beatmap.Difficulty.ApproachRate = -10;
|
||||||
|
|
||||||
|
var context = getContext();
|
||||||
|
var issues = check.Run(context).ToList();
|
||||||
|
|
||||||
|
Assert.That(issues, Has.Count.EqualTo(1));
|
||||||
|
Assert.That(issues.Single().Template is CheckAbnormalDifficultySettings.IssueTemplateOutOfRange);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestCircleSizeUnder()
|
||||||
|
{
|
||||||
|
beatmap.Difficulty.CircleSize = -10;
|
||||||
|
|
||||||
|
var context = getContext();
|
||||||
|
var issues = check.Run(context).ToList();
|
||||||
|
|
||||||
|
Assert.That(issues, Has.Count.EqualTo(1));
|
||||||
|
Assert.That(issues.Single().Template is CheckAbnormalDifficultySettings.IssueTemplateOutOfRange);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestDrainRateUnder()
|
||||||
|
{
|
||||||
|
beatmap.Difficulty.DrainRate = -10;
|
||||||
|
|
||||||
|
var context = getContext();
|
||||||
|
var issues = check.Run(context).ToList();
|
||||||
|
|
||||||
|
Assert.That(issues, Has.Count.EqualTo(1));
|
||||||
|
Assert.That(issues.Single().Template is CheckAbnormalDifficultySettings.IssueTemplateOutOfRange);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestApproachRateOver()
|
||||||
|
{
|
||||||
|
beatmap.Difficulty.ApproachRate = 20;
|
||||||
|
|
||||||
|
var context = getContext();
|
||||||
|
var issues = check.Run(context).ToList();
|
||||||
|
|
||||||
|
Assert.That(issues, Has.Count.EqualTo(1));
|
||||||
|
Assert.That(issues.Single().Template is CheckAbnormalDifficultySettings.IssueTemplateOutOfRange);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestCircleSizeOver()
|
||||||
|
{
|
||||||
|
beatmap.Difficulty.CircleSize = 20;
|
||||||
|
|
||||||
|
var context = getContext();
|
||||||
|
var issues = check.Run(context).ToList();
|
||||||
|
|
||||||
|
Assert.That(issues, Has.Count.EqualTo(1));
|
||||||
|
Assert.That(issues.Single().Template is CheckAbnormalDifficultySettings.IssueTemplateOutOfRange);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestDrainRateOver()
|
||||||
|
{
|
||||||
|
beatmap.Difficulty.DrainRate = 20;
|
||||||
|
|
||||||
|
var context = getContext();
|
||||||
|
var issues = check.Run(context).ToList();
|
||||||
|
|
||||||
|
Assert.That(issues, Has.Count.EqualTo(1));
|
||||||
|
Assert.That(issues.Single().Template is CheckAbnormalDifficultySettings.IssueTemplateOutOfRange);
|
||||||
|
}
|
||||||
|
|
||||||
|
private BeatmapVerifierContext getContext()
|
||||||
|
{
|
||||||
|
return new BeatmapVerifierContext(beatmap, new TestWorkingBeatmap(beatmap));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -13,7 +13,8 @@ namespace osu.Game.Rulesets.Catch.Edit
|
|||||||
{
|
{
|
||||||
private readonly List<ICheck> checks = new List<ICheck>
|
private readonly List<ICheck> checks = new List<ICheck>
|
||||||
{
|
{
|
||||||
new CheckBananaShowerGap()
|
new CheckBananaShowerGap(),
|
||||||
|
new CheckCatchAbnormalDifficultySettings(),
|
||||||
};
|
};
|
||||||
|
|
||||||
public IEnumerable<Issue> Run(BeatmapVerifierContext context)
|
public IEnumerable<Issue> Run(BeatmapVerifierContext context)
|
||||||
|
@ -0,0 +1,39 @@
|
|||||||
|
// 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.Collections.Generic;
|
||||||
|
using osu.Game.Rulesets.Edit;
|
||||||
|
using osu.Game.Rulesets.Edit.Checks;
|
||||||
|
using osu.Game.Rulesets.Edit.Checks.Components;
|
||||||
|
|
||||||
|
namespace osu.Game.Rulesets.Catch.Edit.Checks
|
||||||
|
{
|
||||||
|
public class CheckCatchAbnormalDifficultySettings : CheckAbnormalDifficultySettings
|
||||||
|
{
|
||||||
|
public override CheckMetadata Metadata => new CheckMetadata(CheckCategory.Settings, "Checks catch relevant settings");
|
||||||
|
|
||||||
|
public override IEnumerable<Issue> Run(BeatmapVerifierContext context)
|
||||||
|
{
|
||||||
|
var diff = context.Beatmap.Difficulty;
|
||||||
|
Issue? issue;
|
||||||
|
|
||||||
|
if (HasMoreThanOneDecimalPlace("Approach rate", diff.ApproachRate, out issue))
|
||||||
|
yield return issue;
|
||||||
|
|
||||||
|
if (OutOfRange("Approach rate", diff.ApproachRate, out issue))
|
||||||
|
yield return issue;
|
||||||
|
|
||||||
|
if (HasMoreThanOneDecimalPlace("Circle size", diff.CircleSize, out issue))
|
||||||
|
yield return issue;
|
||||||
|
|
||||||
|
if (OutOfRange("Circle size", diff.CircleSize, out issue))
|
||||||
|
yield return issue;
|
||||||
|
|
||||||
|
if (HasMoreThanOneDecimalPlace("Drain rate", diff.DrainRate, out issue))
|
||||||
|
yield return issue;
|
||||||
|
|
||||||
|
if (OutOfRange("Drain rate", diff.DrainRate, out issue))
|
||||||
|
yield return issue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,63 @@
|
|||||||
|
// 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 NUnit.Framework;
|
||||||
|
using osu.Game.Beatmaps;
|
||||||
|
using osu.Game.Rulesets.Edit;
|
||||||
|
using osu.Game.Rulesets.Objects;
|
||||||
|
using osu.Game.Tests.Beatmaps;
|
||||||
|
using osu.Game.Rulesets.Mania.Edit.Checks;
|
||||||
|
using System.Linq;
|
||||||
|
|
||||||
|
namespace osu.Game.Rulesets.Mania.Tests.Editor.Checks
|
||||||
|
{
|
||||||
|
[TestFixture]
|
||||||
|
public class CheckKeyCountTest
|
||||||
|
{
|
||||||
|
private CheckKeyCount check = null!;
|
||||||
|
|
||||||
|
private IBeatmap beatmap = null!;
|
||||||
|
|
||||||
|
[SetUp]
|
||||||
|
public void Setup()
|
||||||
|
{
|
||||||
|
check = new CheckKeyCount();
|
||||||
|
|
||||||
|
beatmap = new Beatmap<HitObject>
|
||||||
|
{
|
||||||
|
BeatmapInfo = new BeatmapInfo
|
||||||
|
{
|
||||||
|
Ruleset = new ManiaRuleset().RulesetInfo
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestKeycountFour()
|
||||||
|
{
|
||||||
|
beatmap.Difficulty.CircleSize = 4;
|
||||||
|
|
||||||
|
var context = getContext();
|
||||||
|
var issues = check.Run(context).ToList();
|
||||||
|
|
||||||
|
Assert.That(issues, Has.Count.EqualTo(0));
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestKeycountSmallerThanFour()
|
||||||
|
{
|
||||||
|
beatmap.Difficulty.CircleSize = 1;
|
||||||
|
|
||||||
|
var context = getContext();
|
||||||
|
var issues = check.Run(context).ToList();
|
||||||
|
|
||||||
|
Assert.That(issues, Has.Count.EqualTo(1));
|
||||||
|
Assert.That(issues.Single().Template is CheckKeyCount.IssueTemplateKeycountTooLow);
|
||||||
|
}
|
||||||
|
|
||||||
|
private BeatmapVerifierContext getContext()
|
||||||
|
{
|
||||||
|
return new BeatmapVerifierContext(beatmap, new TestWorkingBeatmap(beatmap));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,121 @@
|
|||||||
|
// 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.Mania.Edit.Checks;
|
||||||
|
using osu.Game.Rulesets.Edit;
|
||||||
|
using osu.Game.Rulesets.Edit.Checks;
|
||||||
|
using osu.Game.Rulesets.Objects;
|
||||||
|
using osu.Game.Tests.Beatmaps;
|
||||||
|
|
||||||
|
namespace osu.Game.Rulesets.Mania.Tests.Editor.Checks
|
||||||
|
{
|
||||||
|
[TestFixture]
|
||||||
|
public class CheckManiaAbnormalDifficultySettingsTest
|
||||||
|
{
|
||||||
|
private CheckManiaAbnormalDifficultySettings check = null!;
|
||||||
|
|
||||||
|
private readonly IBeatmap beatmap = new Beatmap<HitObject>();
|
||||||
|
|
||||||
|
[SetUp]
|
||||||
|
public void Setup()
|
||||||
|
{
|
||||||
|
check = new CheckManiaAbnormalDifficultySettings();
|
||||||
|
|
||||||
|
beatmap.BeatmapInfo.Ruleset = new ManiaRuleset().RulesetInfo;
|
||||||
|
beatmap.Difficulty = new BeatmapDifficulty
|
||||||
|
{
|
||||||
|
OverallDifficulty = 5,
|
||||||
|
DrainRate = 5,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestNormalSettings()
|
||||||
|
{
|
||||||
|
var context = getContext();
|
||||||
|
var issues = check.Run(context).ToList();
|
||||||
|
|
||||||
|
Assert.That(issues, Has.Count.EqualTo(0));
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestOverallDifficultyTwoDecimals()
|
||||||
|
{
|
||||||
|
beatmap.Difficulty.OverallDifficulty = 5.55f;
|
||||||
|
|
||||||
|
var context = getContext();
|
||||||
|
var issues = check.Run(context).ToList();
|
||||||
|
|
||||||
|
Assert.That(issues, Has.Count.EqualTo(1));
|
||||||
|
Assert.That(issues.Single().Template is CheckAbnormalDifficultySettings.IssueTemplateMoreThanOneDecimal);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestDrainRateTwoDecimals()
|
||||||
|
{
|
||||||
|
beatmap.Difficulty.DrainRate = 5.55f;
|
||||||
|
|
||||||
|
var context = getContext();
|
||||||
|
var issues = check.Run(context).ToList();
|
||||||
|
|
||||||
|
Assert.That(issues, Has.Count.EqualTo(1));
|
||||||
|
Assert.That(issues.Single().Template is CheckAbnormalDifficultySettings.IssueTemplateMoreThanOneDecimal);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestOverallDifficultyUnder()
|
||||||
|
{
|
||||||
|
beatmap.Difficulty.OverallDifficulty = -10;
|
||||||
|
|
||||||
|
var context = getContext();
|
||||||
|
var issues = check.Run(context).ToList();
|
||||||
|
|
||||||
|
Assert.That(issues, Has.Count.EqualTo(1));
|
||||||
|
Assert.That(issues.Single().Template is CheckAbnormalDifficultySettings.IssueTemplateOutOfRange);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestDrainRateUnder()
|
||||||
|
{
|
||||||
|
beatmap.Difficulty.DrainRate = -10;
|
||||||
|
|
||||||
|
var context = getContext();
|
||||||
|
var issues = check.Run(context).ToList();
|
||||||
|
|
||||||
|
Assert.That(issues, Has.Count.EqualTo(1));
|
||||||
|
Assert.That(issues.Single().Template is CheckAbnormalDifficultySettings.IssueTemplateOutOfRange);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestOverallDifficultyOver()
|
||||||
|
{
|
||||||
|
beatmap.Difficulty.OverallDifficulty = 20;
|
||||||
|
|
||||||
|
var context = getContext();
|
||||||
|
var issues = check.Run(context).ToList();
|
||||||
|
|
||||||
|
Assert.That(issues, Has.Count.EqualTo(1));
|
||||||
|
Assert.That(issues.Single().Template is CheckAbnormalDifficultySettings.IssueTemplateOutOfRange);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestDrainRateOver()
|
||||||
|
{
|
||||||
|
beatmap.Difficulty.DrainRate = 20;
|
||||||
|
|
||||||
|
var context = getContext();
|
||||||
|
var issues = check.Run(context).ToList();
|
||||||
|
|
||||||
|
Assert.That(issues, Has.Count.EqualTo(1));
|
||||||
|
Assert.That(issues.Single().Template is CheckAbnormalDifficultySettings.IssueTemplateOutOfRange);
|
||||||
|
}
|
||||||
|
|
||||||
|
private BeatmapVerifierContext getContext()
|
||||||
|
{
|
||||||
|
return new BeatmapVerifierContext(beatmap, new TestWorkingBeatmap(beatmap));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
39
osu.Game.Rulesets.Mania/Edit/Checks/CheckKeyCount.cs
Normal file
39
osu.Game.Rulesets.Mania/Edit/Checks/CheckKeyCount.cs
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
// 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.Collections.Generic;
|
||||||
|
using osu.Game.Rulesets.Edit;
|
||||||
|
using osu.Game.Rulesets.Edit.Checks.Components;
|
||||||
|
|
||||||
|
namespace osu.Game.Rulesets.Mania.Edit.Checks
|
||||||
|
{
|
||||||
|
public class CheckKeyCount : ICheck
|
||||||
|
{
|
||||||
|
public CheckMetadata Metadata => new CheckMetadata(CheckCategory.Settings, "Check mania keycount.");
|
||||||
|
|
||||||
|
public IEnumerable<IssueTemplate> PossibleTemplates => new IssueTemplate[]
|
||||||
|
{
|
||||||
|
new IssueTemplateKeycountTooLow(this),
|
||||||
|
};
|
||||||
|
|
||||||
|
public IEnumerable<Issue> Run(BeatmapVerifierContext context)
|
||||||
|
{
|
||||||
|
var diff = context.Beatmap.Difficulty;
|
||||||
|
|
||||||
|
if (diff.CircleSize < 4)
|
||||||
|
{
|
||||||
|
yield return new IssueTemplateKeycountTooLow(this).Create(diff.CircleSize);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class IssueTemplateKeycountTooLow : IssueTemplate
|
||||||
|
{
|
||||||
|
public IssueTemplateKeycountTooLow(ICheck check)
|
||||||
|
: base(check, IssueType.Problem, "Key count is {0} and must be 4 or higher.")
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public Issue Create(float current) => new Issue(this, current);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,33 @@
|
|||||||
|
// 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.Collections.Generic;
|
||||||
|
using osu.Game.Rulesets.Edit;
|
||||||
|
using osu.Game.Rulesets.Edit.Checks;
|
||||||
|
using osu.Game.Rulesets.Edit.Checks.Components;
|
||||||
|
|
||||||
|
namespace osu.Game.Rulesets.Mania.Edit.Checks
|
||||||
|
{
|
||||||
|
public class CheckManiaAbnormalDifficultySettings : CheckAbnormalDifficultySettings
|
||||||
|
{
|
||||||
|
public override CheckMetadata Metadata => new CheckMetadata(CheckCategory.Settings, "Checks mania relevant settings");
|
||||||
|
|
||||||
|
public override IEnumerable<Issue> Run(BeatmapVerifierContext context)
|
||||||
|
{
|
||||||
|
var diff = context.Beatmap.Difficulty;
|
||||||
|
Issue? issue;
|
||||||
|
|
||||||
|
if (HasMoreThanOneDecimalPlace("Overall difficulty", diff.OverallDifficulty, out issue))
|
||||||
|
yield return issue;
|
||||||
|
|
||||||
|
if (OutOfRange("Overall difficulty", diff.OverallDifficulty, out issue))
|
||||||
|
yield return issue;
|
||||||
|
|
||||||
|
if (HasMoreThanOneDecimalPlace("Drain rate", diff.DrainRate, out issue))
|
||||||
|
yield return issue;
|
||||||
|
|
||||||
|
if (OutOfRange("Drain rate", diff.DrainRate, out issue))
|
||||||
|
yield return issue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
26
osu.Game.Rulesets.Mania/Edit/ManiaBeatmapVerifier.cs
Normal file
26
osu.Game.Rulesets.Mania/Edit/ManiaBeatmapVerifier.cs
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
// 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.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using osu.Game.Rulesets.Edit;
|
||||||
|
using osu.Game.Rulesets.Edit.Checks.Components;
|
||||||
|
using osu.Game.Rulesets.Mania.Edit.Checks;
|
||||||
|
|
||||||
|
namespace osu.Game.Rulesets.Mania.Edit
|
||||||
|
{
|
||||||
|
public class ManiaBeatmapVerifier : IBeatmapVerifier
|
||||||
|
{
|
||||||
|
private readonly List<ICheck> checks = new List<ICheck>
|
||||||
|
{
|
||||||
|
// Settings
|
||||||
|
new CheckKeyCount(),
|
||||||
|
new CheckManiaAbnormalDifficultySettings(),
|
||||||
|
};
|
||||||
|
|
||||||
|
public IEnumerable<Issue> Run(BeatmapVerifierContext context)
|
||||||
|
{
|
||||||
|
return checks.SelectMany(check => check.Run(context));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -65,6 +65,8 @@ namespace osu.Game.Rulesets.Mania
|
|||||||
|
|
||||||
public override HitObjectComposer CreateHitObjectComposer() => new ManiaHitObjectComposer(this);
|
public override HitObjectComposer CreateHitObjectComposer() => new ManiaHitObjectComposer(this);
|
||||||
|
|
||||||
|
public override IBeatmapVerifier CreateBeatmapVerifier() => new ManiaBeatmapVerifier();
|
||||||
|
|
||||||
public override ISkin? CreateSkinTransformer(ISkin skin, IBeatmap beatmap)
|
public override ISkin? CreateSkinTransformer(ISkin skin, IBeatmap beatmap)
|
||||||
{
|
{
|
||||||
switch (skin)
|
switch (skin)
|
||||||
|
@ -0,0 +1,194 @@
|
|||||||
|
// 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 osu.Game.Rulesets.Osu.Edit.Checks;
|
||||||
|
using NUnit.Framework;
|
||||||
|
using osu.Game.Beatmaps;
|
||||||
|
using osu.Game.Rulesets.Objects;
|
||||||
|
using osu.Game.Rulesets.Edit.Checks;
|
||||||
|
using osu.Game.Rulesets.Edit;
|
||||||
|
using osu.Game.Tests.Beatmaps;
|
||||||
|
using System.Linq;
|
||||||
|
|
||||||
|
namespace osu.Game.Rulesets.Osu.Tests.Editor.Checks
|
||||||
|
{
|
||||||
|
[TestFixture]
|
||||||
|
public class CheckOsuAbnormalDifficultySettingsTest
|
||||||
|
{
|
||||||
|
private CheckOsuAbnormalDifficultySettings check = null!;
|
||||||
|
|
||||||
|
private readonly IBeatmap beatmap = new Beatmap<HitObject>();
|
||||||
|
|
||||||
|
[SetUp]
|
||||||
|
public void Setup()
|
||||||
|
{
|
||||||
|
check = new CheckOsuAbnormalDifficultySettings();
|
||||||
|
|
||||||
|
beatmap.Difficulty = new BeatmapDifficulty
|
||||||
|
{
|
||||||
|
ApproachRate = 5,
|
||||||
|
CircleSize = 5,
|
||||||
|
DrainRate = 5,
|
||||||
|
OverallDifficulty = 5,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestNormalSettings()
|
||||||
|
{
|
||||||
|
var context = getContext();
|
||||||
|
var issues = check.Run(context).ToList();
|
||||||
|
|
||||||
|
Assert.That(issues, Has.Count.EqualTo(0));
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestApproachRateTwoDecimals()
|
||||||
|
{
|
||||||
|
beatmap.Difficulty.ApproachRate = 5.55f;
|
||||||
|
|
||||||
|
var context = getContext();
|
||||||
|
var issues = check.Run(context).ToList();
|
||||||
|
|
||||||
|
Assert.That(issues, Has.Count.EqualTo(1));
|
||||||
|
Assert.That(issues.Single().Template is CheckAbnormalDifficultySettings.IssueTemplateMoreThanOneDecimal);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestCircleSizeTwoDecimals()
|
||||||
|
{
|
||||||
|
beatmap.Difficulty.CircleSize = 5.55f;
|
||||||
|
|
||||||
|
var context = getContext();
|
||||||
|
var issues = check.Run(context).ToList();
|
||||||
|
|
||||||
|
Assert.That(issues, Has.Count.EqualTo(1));
|
||||||
|
Assert.That(issues.Single().Template is CheckAbnormalDifficultySettings.IssueTemplateMoreThanOneDecimal);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestDrainRateTwoDecimals()
|
||||||
|
{
|
||||||
|
beatmap.Difficulty.DrainRate = 5.55f;
|
||||||
|
|
||||||
|
var context = getContext();
|
||||||
|
var issues = check.Run(context).ToList();
|
||||||
|
|
||||||
|
Assert.That(issues, Has.Count.EqualTo(1));
|
||||||
|
Assert.That(issues.Single().Template is CheckAbnormalDifficultySettings.IssueTemplateMoreThanOneDecimal);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestOverallDifficultyTwoDecimals()
|
||||||
|
{
|
||||||
|
beatmap.Difficulty.OverallDifficulty = 5.55f;
|
||||||
|
|
||||||
|
var context = getContext();
|
||||||
|
var issues = check.Run(context).ToList();
|
||||||
|
|
||||||
|
Assert.That(issues, Has.Count.EqualTo(1));
|
||||||
|
Assert.That(issues.Single().Template is CheckAbnormalDifficultySettings.IssueTemplateMoreThanOneDecimal);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestApproachRateUnder()
|
||||||
|
{
|
||||||
|
beatmap.Difficulty.ApproachRate = -10;
|
||||||
|
|
||||||
|
var context = getContext();
|
||||||
|
var issues = check.Run(context).ToList();
|
||||||
|
|
||||||
|
Assert.That(issues, Has.Count.EqualTo(1));
|
||||||
|
Assert.That(issues.Single().Template is CheckAbnormalDifficultySettings.IssueTemplateOutOfRange);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestCircleSizeUnder()
|
||||||
|
{
|
||||||
|
beatmap.Difficulty.CircleSize = -10;
|
||||||
|
|
||||||
|
var context = getContext();
|
||||||
|
var issues = check.Run(context).ToList();
|
||||||
|
|
||||||
|
Assert.That(issues, Has.Count.EqualTo(1));
|
||||||
|
Assert.That(issues.Single().Template is CheckAbnormalDifficultySettings.IssueTemplateOutOfRange);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestDrainRateUnder()
|
||||||
|
{
|
||||||
|
beatmap.Difficulty.DrainRate = -10;
|
||||||
|
|
||||||
|
var context = getContext();
|
||||||
|
var issues = check.Run(context).ToList();
|
||||||
|
|
||||||
|
Assert.That(issues, Has.Count.EqualTo(1));
|
||||||
|
Assert.That(issues.Single().Template is CheckAbnormalDifficultySettings.IssueTemplateOutOfRange);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestOverallDifficultyUnder()
|
||||||
|
{
|
||||||
|
beatmap.Difficulty.OverallDifficulty = -10;
|
||||||
|
|
||||||
|
var context = getContext();
|
||||||
|
var issues = check.Run(context).ToList();
|
||||||
|
|
||||||
|
Assert.That(issues, Has.Count.EqualTo(1));
|
||||||
|
Assert.That(issues.Single().Template is CheckAbnormalDifficultySettings.IssueTemplateOutOfRange);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestApproachRateOver()
|
||||||
|
{
|
||||||
|
beatmap.Difficulty.ApproachRate = 20;
|
||||||
|
|
||||||
|
var context = getContext();
|
||||||
|
var issues = check.Run(context).ToList();
|
||||||
|
|
||||||
|
Assert.That(issues, Has.Count.EqualTo(1));
|
||||||
|
Assert.That(issues.Single().Template is CheckAbnormalDifficultySettings.IssueTemplateOutOfRange);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestCircleSizeOver()
|
||||||
|
{
|
||||||
|
beatmap.Difficulty.CircleSize = 20;
|
||||||
|
|
||||||
|
var context = getContext();
|
||||||
|
var issues = check.Run(context).ToList();
|
||||||
|
|
||||||
|
Assert.That(issues, Has.Count.EqualTo(1));
|
||||||
|
Assert.That(issues.Single().Template is CheckAbnormalDifficultySettings.IssueTemplateOutOfRange);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestDrainRateOver()
|
||||||
|
{
|
||||||
|
beatmap.Difficulty.DrainRate = 20;
|
||||||
|
|
||||||
|
var context = getContext();
|
||||||
|
var issues = check.Run(context).ToList();
|
||||||
|
|
||||||
|
Assert.That(issues, Has.Count.EqualTo(1));
|
||||||
|
Assert.That(issues.Single().Template is CheckAbnormalDifficultySettings.IssueTemplateOutOfRange);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestOverallDifficultyOver()
|
||||||
|
{
|
||||||
|
beatmap.Difficulty.OverallDifficulty = 20;
|
||||||
|
|
||||||
|
var context = getContext();
|
||||||
|
var issues = check.Run(context).ToList();
|
||||||
|
|
||||||
|
Assert.That(issues, Has.Count.EqualTo(1));
|
||||||
|
Assert.That(issues.Single().Template is CheckAbnormalDifficultySettings.IssueTemplateOutOfRange);
|
||||||
|
}
|
||||||
|
|
||||||
|
private BeatmapVerifierContext getContext()
|
||||||
|
{
|
||||||
|
return new BeatmapVerifierContext(beatmap, new TestWorkingBeatmap(beatmap));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,45 @@
|
|||||||
|
// 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.Collections.Generic;
|
||||||
|
using osu.Game.Rulesets.Edit;
|
||||||
|
using osu.Game.Rulesets.Edit.Checks;
|
||||||
|
using osu.Game.Rulesets.Edit.Checks.Components;
|
||||||
|
|
||||||
|
namespace osu.Game.Rulesets.Osu.Edit.Checks
|
||||||
|
{
|
||||||
|
public class CheckOsuAbnormalDifficultySettings : CheckAbnormalDifficultySettings
|
||||||
|
{
|
||||||
|
public override CheckMetadata Metadata => new CheckMetadata(CheckCategory.Settings, "Checks osu relevant settings");
|
||||||
|
|
||||||
|
public override IEnumerable<Issue> Run(BeatmapVerifierContext context)
|
||||||
|
{
|
||||||
|
var diff = context.Beatmap.Difficulty;
|
||||||
|
Issue? issue;
|
||||||
|
|
||||||
|
if (HasMoreThanOneDecimalPlace("Approach rate", diff.ApproachRate, out issue))
|
||||||
|
yield return issue;
|
||||||
|
|
||||||
|
if (OutOfRange("Approach rate", diff.ApproachRate, out issue))
|
||||||
|
yield return issue;
|
||||||
|
|
||||||
|
if (HasMoreThanOneDecimalPlace("Overall difficulty", diff.OverallDifficulty, out issue))
|
||||||
|
yield return issue;
|
||||||
|
|
||||||
|
if (OutOfRange("Overall difficulty", diff.OverallDifficulty, out issue))
|
||||||
|
yield return issue;
|
||||||
|
|
||||||
|
if (HasMoreThanOneDecimalPlace("Circle size", diff.CircleSize, out issue))
|
||||||
|
yield return issue;
|
||||||
|
|
||||||
|
if (OutOfRange("Circle size", diff.CircleSize, out issue))
|
||||||
|
yield return issue;
|
||||||
|
|
||||||
|
if (HasMoreThanOneDecimalPlace("Drain rate", diff.DrainRate, out issue))
|
||||||
|
yield return issue;
|
||||||
|
|
||||||
|
if (OutOfRange("Drain rate", diff.DrainRate, out issue))
|
||||||
|
yield return issue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -21,6 +21,9 @@ namespace osu.Game.Rulesets.Osu.Edit
|
|||||||
new CheckTimeDistanceEquality(),
|
new CheckTimeDistanceEquality(),
|
||||||
new CheckLowDiffOverlaps(),
|
new CheckLowDiffOverlaps(),
|
||||||
new CheckTooShortSliders(),
|
new CheckTooShortSliders(),
|
||||||
|
|
||||||
|
// Settings
|
||||||
|
new CheckOsuAbnormalDifficultySettings(),
|
||||||
};
|
};
|
||||||
|
|
||||||
public IEnumerable<Issue> Run(BeatmapVerifierContext context)
|
public IEnumerable<Issue> Run(BeatmapVerifierContext context)
|
||||||
|
@ -0,0 +1,120 @@
|
|||||||
|
// 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 osu.Game.Rulesets.Taiko.Edit.Checks;
|
||||||
|
using NUnit.Framework;
|
||||||
|
using osu.Game.Beatmaps;
|
||||||
|
using osu.Game.Rulesets.Objects;
|
||||||
|
using osu.Game.Rulesets.Edit.Checks;
|
||||||
|
using osu.Game.Rulesets.Edit;
|
||||||
|
using osu.Game.Tests.Beatmaps;
|
||||||
|
using System.Linq;
|
||||||
|
|
||||||
|
namespace osu.Game.Rulesets.Taiko.Tests.Editor.Checks
|
||||||
|
{
|
||||||
|
[TestFixture]
|
||||||
|
public class CheckTaikoAbnormalDifficultySettingsTest
|
||||||
|
{
|
||||||
|
private CheckTaikoAbnormalDifficultySettings check = null!;
|
||||||
|
|
||||||
|
private readonly IBeatmap beatmap = new Beatmap<HitObject>();
|
||||||
|
|
||||||
|
[SetUp]
|
||||||
|
public void Setup()
|
||||||
|
{
|
||||||
|
check = new CheckTaikoAbnormalDifficultySettings();
|
||||||
|
|
||||||
|
beatmap.BeatmapInfo.Ruleset = new TaikoRuleset().RulesetInfo;
|
||||||
|
beatmap.Difficulty = new BeatmapDifficulty
|
||||||
|
{
|
||||||
|
OverallDifficulty = 5,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestNormalSettings()
|
||||||
|
{
|
||||||
|
var context = getContext();
|
||||||
|
var issues = check.Run(context).ToList();
|
||||||
|
|
||||||
|
Assert.That(issues, Has.Count.EqualTo(0));
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestOverallDifficultyTwoDecimals()
|
||||||
|
{
|
||||||
|
beatmap.Difficulty.OverallDifficulty = 5.55f;
|
||||||
|
|
||||||
|
var context = getContext();
|
||||||
|
var issues = check.Run(context).ToList();
|
||||||
|
|
||||||
|
Assert.That(issues, Has.Count.EqualTo(1));
|
||||||
|
Assert.That(issues.Single().Template is CheckAbnormalDifficultySettings.IssueTemplateMoreThanOneDecimal);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestDrainRateTwoDecimals()
|
||||||
|
{
|
||||||
|
beatmap.Difficulty.DrainRate = 5.55f;
|
||||||
|
|
||||||
|
var context = getContext();
|
||||||
|
var issues = check.Run(context).ToList();
|
||||||
|
|
||||||
|
Assert.That(issues, Has.Count.EqualTo(1));
|
||||||
|
Assert.That(issues.Single().Template is CheckAbnormalDifficultySettings.IssueTemplateMoreThanOneDecimal);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestOverallDifficultyUnder()
|
||||||
|
{
|
||||||
|
beatmap.Difficulty.OverallDifficulty = -10;
|
||||||
|
|
||||||
|
var context = getContext();
|
||||||
|
var issues = check.Run(context).ToList();
|
||||||
|
|
||||||
|
Assert.That(issues, Has.Count.EqualTo(1));
|
||||||
|
Assert.That(issues.Single().Template is CheckAbnormalDifficultySettings.IssueTemplateOutOfRange);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestOverallDifficultyOver()
|
||||||
|
{
|
||||||
|
beatmap.Difficulty.OverallDifficulty = 20;
|
||||||
|
|
||||||
|
var context = getContext();
|
||||||
|
var issues = check.Run(context).ToList();
|
||||||
|
|
||||||
|
Assert.That(issues, Has.Count.EqualTo(1));
|
||||||
|
Assert.That(issues.Single().Template is CheckAbnormalDifficultySettings.IssueTemplateOutOfRange);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestDrainRateUnder()
|
||||||
|
{
|
||||||
|
beatmap.Difficulty.DrainRate = -10;
|
||||||
|
|
||||||
|
var context = getContext();
|
||||||
|
var issues = check.Run(context).ToList();
|
||||||
|
|
||||||
|
Assert.That(issues, Has.Count.EqualTo(1));
|
||||||
|
Assert.That(issues.Single().Template is CheckAbnormalDifficultySettings.IssueTemplateOutOfRange);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestDrainRateOver()
|
||||||
|
{
|
||||||
|
beatmap.Difficulty.DrainRate = 20;
|
||||||
|
|
||||||
|
var context = getContext();
|
||||||
|
var issues = check.Run(context).ToList();
|
||||||
|
|
||||||
|
Assert.That(issues, Has.Count.EqualTo(1));
|
||||||
|
Assert.That(issues.Single().Template is CheckAbnormalDifficultySettings.IssueTemplateOutOfRange);
|
||||||
|
}
|
||||||
|
|
||||||
|
private BeatmapVerifierContext getContext()
|
||||||
|
{
|
||||||
|
return new BeatmapVerifierContext(beatmap, new TestWorkingBeatmap(beatmap));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,33 @@
|
|||||||
|
// 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.Collections.Generic;
|
||||||
|
using osu.Game.Rulesets.Edit;
|
||||||
|
using osu.Game.Rulesets.Edit.Checks;
|
||||||
|
using osu.Game.Rulesets.Edit.Checks.Components;
|
||||||
|
|
||||||
|
namespace osu.Game.Rulesets.Taiko.Edit.Checks
|
||||||
|
{
|
||||||
|
public class CheckTaikoAbnormalDifficultySettings : CheckAbnormalDifficultySettings
|
||||||
|
{
|
||||||
|
public override CheckMetadata Metadata => new CheckMetadata(CheckCategory.Settings, "Checks taiko relevant settings");
|
||||||
|
|
||||||
|
public override IEnumerable<Issue> Run(BeatmapVerifierContext context)
|
||||||
|
{
|
||||||
|
var diff = context.Beatmap.Difficulty;
|
||||||
|
Issue? issue;
|
||||||
|
|
||||||
|
if (HasMoreThanOneDecimalPlace("Overall difficulty", diff.OverallDifficulty, out issue))
|
||||||
|
yield return issue;
|
||||||
|
|
||||||
|
if (OutOfRange("Overall difficulty", diff.OverallDifficulty, out issue))
|
||||||
|
yield return issue;
|
||||||
|
|
||||||
|
if (HasMoreThanOneDecimalPlace("Drain rate", diff.DrainRate, out issue))
|
||||||
|
yield return issue;
|
||||||
|
|
||||||
|
if (OutOfRange("Drain rate", diff.DrainRate, out issue))
|
||||||
|
yield return issue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
24
osu.Game.Rulesets.Taiko/Edit/TaikoBeatmapVerifier.cs
Normal file
24
osu.Game.Rulesets.Taiko/Edit/TaikoBeatmapVerifier.cs
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
// 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.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using osu.Game.Rulesets.Edit;
|
||||||
|
using osu.Game.Rulesets.Edit.Checks.Components;
|
||||||
|
using osu.Game.Rulesets.Taiko.Edit.Checks;
|
||||||
|
|
||||||
|
namespace osu.Game.Rulesets.Taiko.Edit
|
||||||
|
{
|
||||||
|
public class TaikoBeatmapVerifier : IBeatmapVerifier
|
||||||
|
{
|
||||||
|
private readonly List<ICheck> checks = new List<ICheck>
|
||||||
|
{
|
||||||
|
new CheckTaikoAbnormalDifficultySettings(),
|
||||||
|
};
|
||||||
|
|
||||||
|
public IEnumerable<Issue> Run(BeatmapVerifierContext context)
|
||||||
|
{
|
||||||
|
return checks.SelectMany(check => check.Run(context));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -188,6 +188,8 @@ namespace osu.Game.Rulesets.Taiko
|
|||||||
|
|
||||||
public override HitObjectComposer CreateHitObjectComposer() => new TaikoHitObjectComposer(this);
|
public override HitObjectComposer CreateHitObjectComposer() => new TaikoHitObjectComposer(this);
|
||||||
|
|
||||||
|
public override IBeatmapVerifier CreateBeatmapVerifier() => new TaikoBeatmapVerifier();
|
||||||
|
|
||||||
public override DifficultyCalculator CreateDifficultyCalculator(IWorkingBeatmap beatmap) => new TaikoDifficultyCalculator(RulesetInfo, beatmap);
|
public override DifficultyCalculator CreateDifficultyCalculator(IWorkingBeatmap beatmap) => new TaikoDifficultyCalculator(RulesetInfo, beatmap);
|
||||||
|
|
||||||
public override PerformanceCalculator CreatePerformanceCalculator() => new TaikoPerformanceCalculator();
|
public override PerformanceCalculator CreatePerformanceCalculator() => new TaikoPerformanceCalculator();
|
||||||
|
@ -43,7 +43,7 @@ namespace osu.Game.Rulesets.Edit
|
|||||||
new CheckPreviewTime(),
|
new CheckPreviewTime(),
|
||||||
|
|
||||||
// Events
|
// Events
|
||||||
new CheckBreaks()
|
new CheckBreaks(),
|
||||||
};
|
};
|
||||||
|
|
||||||
public IEnumerable<Issue> Run(BeatmapVerifierContext context)
|
public IEnumerable<Issue> Run(BeatmapVerifierContext context)
|
||||||
|
@ -0,0 +1,59 @@
|
|||||||
|
// 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.Collections.Generic;
|
||||||
|
using System.Diagnostics.CodeAnalysis;
|
||||||
|
using osu.Game.Rulesets.Edit.Checks.Components;
|
||||||
|
|
||||||
|
namespace osu.Game.Rulesets.Edit.Checks
|
||||||
|
{
|
||||||
|
public abstract class CheckAbnormalDifficultySettings : ICheck
|
||||||
|
{
|
||||||
|
public abstract CheckMetadata Metadata { get; }
|
||||||
|
|
||||||
|
public IEnumerable<IssueTemplate> PossibleTemplates => new IssueTemplate[]
|
||||||
|
{
|
||||||
|
new IssueTemplateMoreThanOneDecimal(this),
|
||||||
|
new IssueTemplateOutOfRange(this),
|
||||||
|
};
|
||||||
|
|
||||||
|
public abstract IEnumerable<Issue> Run(BeatmapVerifierContext context);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// If the setting is out of the boundaries set by the editor (0 - 10)
|
||||||
|
/// </summary>
|
||||||
|
protected bool OutOfRange(string setting, float value, [NotNullWhen(true)] out Issue? issue)
|
||||||
|
{
|
||||||
|
bool hasIssue = value < 0f || value > 10f;
|
||||||
|
issue = hasIssue ? new IssueTemplateOutOfRange(this).Create(setting, value) : null;
|
||||||
|
return hasIssue;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected bool HasMoreThanOneDecimalPlace(string setting, float value, [NotNullWhen(true)] out Issue? issue)
|
||||||
|
{
|
||||||
|
bool hasIssue = float.Round(value, 1) != value;
|
||||||
|
issue = hasIssue ? new IssueTemplateMoreThanOneDecimal(this).Create(setting, value) : null;
|
||||||
|
return hasIssue;
|
||||||
|
}
|
||||||
|
|
||||||
|
public class IssueTemplateMoreThanOneDecimal : IssueTemplate
|
||||||
|
{
|
||||||
|
public IssueTemplateMoreThanOneDecimal(ICheck check)
|
||||||
|
: base(check, IssueType.Problem, "{0} {1} has more than one decimal place.")
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public Issue Create(string settingName, float settingValue) => new Issue(this, settingName, settingValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
public class IssueTemplateOutOfRange : IssueTemplate
|
||||||
|
{
|
||||||
|
public IssueTemplateOutOfRange(ICheck check)
|
||||||
|
: base(check, IssueType.Warning, "{0} is {1} although it is capped between 0 to 10 in-game.")
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public Issue Create(string settingName, float settingValue) => new Issue(this, settingName, settingValue);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user