From 3cd6734c107d531263d9ff4d23c17e809f0fac4d Mon Sep 17 00:00:00 2001 From: Hivie Date: Wed, 6 Aug 2025 11:29:22 +0100 Subject: [PATCH] add check for inconsistent settings --- osu.Game/Rulesets/Edit/BeatmapVerifier.cs | 3 + .../Edit/Checks/CheckInconsistentSettings.cs | 80 +++++++++++++++++++ 2 files changed, 83 insertions(+) create mode 100644 osu.Game/Rulesets/Edit/Checks/CheckInconsistentSettings.cs diff --git a/osu.Game/Rulesets/Edit/BeatmapVerifier.cs b/osu.Game/Rulesets/Edit/BeatmapVerifier.cs index a403ea7d9a..d3f0011d34 100644 --- a/osu.Game/Rulesets/Edit/BeatmapVerifier.cs +++ b/osu.Game/Rulesets/Edit/BeatmapVerifier.cs @@ -51,6 +51,9 @@ namespace osu.Game.Rulesets.Edit new CheckTitleMarkers(), new CheckInconsistentMetadata(), new CheckMissingGenreLanguage(), + + // Settings + new CheckInconsistentSettings(), }; public IEnumerable Run(BeatmapVerifierContext context) diff --git a/osu.Game/Rulesets/Edit/Checks/CheckInconsistentSettings.cs b/osu.Game/Rulesets/Edit/Checks/CheckInconsistentSettings.cs new file mode 100644 index 0000000000..2591496e98 --- /dev/null +++ b/osu.Game/Rulesets/Edit/Checks/CheckInconsistentSettings.cs @@ -0,0 +1,80 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. +// See the LICENCE file in the repository root for full licence text. + +using System; +using System.Collections.Generic; +using System.Globalization; +using osu.Game.Beatmaps; +using osu.Game.Rulesets.Edit.Checks.Components; + +namespace osu.Game.Rulesets.Edit.Checks +{ + public class CheckInconsistentSettings : ICheck + { + public CheckMetadata Metadata => new CheckMetadata(CheckCategory.Settings, "Inconsistent settings", CheckScope.BeatmapSet); + + public IEnumerable PossibleTemplates => new IssueTemplate[] + { + new IssueTemplateInconsistentSetting(this, IssueType.Warning), + new IssueTemplateInconsistentSetting(this, IssueType.Negligible), + }; + + public IEnumerable Run(BeatmapVerifierContext context) + { + var difficulties = context.BeatmapsetDifficulties; + + if (difficulties.Count <= 1) + yield break; + + var referenceBeatmap = context.Beatmap; + + // Define fields to check + var fieldsToCheck = new (IssueType issueType, string fieldName, Func fieldSelector)[] + { + (IssueType.Warning, "Audio lead-in", b => b.AudioLeadIn.ToString(CultureInfo.InvariantCulture)), + (IssueType.Warning, "Countdown", b => b.Countdown.ToString()), + (IssueType.Warning, "Countdown offset", b => b.CountdownOffset.ToString()), + (IssueType.Warning, "Epilepsy warning", b => b.EpilepsyWarning.ToString()), + (IssueType.Warning, "Letterbox during breaks", b => b.LetterboxInBreaks.ToString()), + (IssueType.Warning, "Samples match playback rate", b => b.SamplesMatchPlaybackRate.ToString()), + (IssueType.Warning, "widescreen support", b => b.WidescreenStoryboard.ToString()), + (IssueType.Negligible, "Tick Rate", b => b.Difficulty.SliderTickRate.ToString(CultureInfo.InvariantCulture)), + }; + + foreach (var beatmap in difficulties) + { + if (beatmap == referenceBeatmap) + continue; + + // Check each setting for inconsistencies + foreach ((var issueType, string fieldName, var fieldSelector) in fieldsToCheck) + { + string referenceField = fieldSelector(referenceBeatmap); + string currentField = fieldSelector(beatmap); + + if (referenceField != currentField) + { + yield return new IssueTemplateInconsistentSetting(this, issueType).Create( + fieldName, + referenceBeatmap.BeatmapInfo.DifficultyName, + beatmap.BeatmapInfo.DifficultyName, + referenceField, + currentField + ); + } + } + } + } + + public class IssueTemplateInconsistentSetting : IssueTemplate + { + public IssueTemplateInconsistentSetting(ICheck check, IssueType issueType) + : base(check, issueType, "Inconsistent \"{0}\" setting between \"{1}\" and \"{2}\"; \"{3}\" and \"{4}\" respectively.") + { + } + + public Issue Create(string fieldName, string referenceDifficulty, string currentDifficulty, string referenceValue, string currentValue) + => new Issue(this, fieldName, referenceDifficulty, currentDifficulty, referenceValue, currentValue); + } + } +}