diff --git a/osu.Game.Rulesets.Catch.Tests/CatchRateAdjustedDisplayDifficultyTest.cs b/osu.Game.Rulesets.Catch.Tests/CatchRateAdjustedDisplayDifficultyTest.cs index 0ec3bfd911..3af581fcf3 100644 --- a/osu.Game.Rulesets.Catch.Tests/CatchRateAdjustedDisplayDifficultyTest.cs +++ b/osu.Game.Rulesets.Catch.Tests/CatchRateAdjustedDisplayDifficultyTest.cs @@ -22,8 +22,9 @@ namespace osu.Game.Rulesets.Catch.Tests { var ruleset = new CatchRuleset(); var difficulty = new BeatmapDifficulty { ApproachRate = originalApproachRate }; + var beatmapInfo = new BeatmapInfo { Difficulty = difficulty }; - var adjustedDifficulty = ruleset.GetAdjustedDisplayDifficulty(difficulty, []); + var adjustedDifficulty = ruleset.GetAdjustedDisplayDifficulty(beatmapInfo, []); Assert.That(adjustedDifficulty.ApproachRate, Is.EqualTo(originalApproachRate)); } @@ -33,8 +34,9 @@ namespace osu.Game.Rulesets.Catch.Tests { var ruleset = new CatchRuleset(); var difficulty = new BeatmapDifficulty(); + var beatmapInfo = new BeatmapInfo { Difficulty = difficulty }; - var adjustedDifficulty = ruleset.GetAdjustedDisplayDifficulty(difficulty, [new CatchModHalfTime()]); + var adjustedDifficulty = ruleset.GetAdjustedDisplayDifficulty(beatmapInfo, [new CatchModHalfTime()]); Assert.That(adjustedDifficulty.ApproachRate, Is.EqualTo(1.67).Within(0.01)); } @@ -44,8 +46,9 @@ namespace osu.Game.Rulesets.Catch.Tests { var ruleset = new CatchRuleset(); var difficulty = new BeatmapDifficulty(); + var beatmapInfo = new BeatmapInfo { Difficulty = difficulty }; - var adjustedDifficulty = ruleset.GetAdjustedDisplayDifficulty(difficulty, [new CatchModDoubleTime()]); + var adjustedDifficulty = ruleset.GetAdjustedDisplayDifficulty(beatmapInfo, [new CatchModDoubleTime()]); Assert.That(adjustedDifficulty.ApproachRate, Is.EqualTo(7.67).Within(0.01)); } diff --git a/osu.Game.Rulesets.Catch/CatchRuleset.cs b/osu.Game.Rulesets.Catch/CatchRuleset.cs index c1fa9f574b..bdfa4e7db4 100644 --- a/osu.Game.Rulesets.Catch/CatchRuleset.cs +++ b/osu.Game.Rulesets.Catch/CatchRuleset.cs @@ -268,9 +268,9 @@ namespace osu.Game.Rulesets.Catch } /// - public override BeatmapDifficulty GetAdjustedDisplayDifficulty(IBeatmapDifficultyInfo difficulty, IReadOnlyCollection mods) + public override BeatmapDifficulty GetAdjustedDisplayDifficulty(IBeatmapInfo beatmapInfo, IReadOnlyCollection mods) { - BeatmapDifficulty adjustedDifficulty = new BeatmapDifficulty(difficulty); + BeatmapDifficulty adjustedDifficulty = base.GetAdjustedDisplayDifficulty(beatmapInfo, mods); double rate = ModUtils.CalculateRateWithMods(mods); double preempt = IBeatmapDifficultyInfo.DifficultyRange(adjustedDifficulty.ApproachRate, CatchHitObject.PREEMPT_MAX, CatchHitObject.PREEMPT_MID, CatchHitObject.PREEMPT_MIN); @@ -280,13 +280,14 @@ namespace osu.Game.Rulesets.Catch return adjustedDifficulty; } - public override IEnumerable GetBeatmapAttributesForDisplay(IBeatmapDifficultyInfo difficulty, IReadOnlyCollection mods) + public override IEnumerable GetBeatmapAttributesForDisplay(IBeatmapInfo beatmapInfo, IReadOnlyCollection mods) { - var adjustedDifficulty = GetAdjustedDisplayDifficulty(difficulty, mods); + var originalDifficulty = beatmapInfo.Difficulty; + var adjustedDifficulty = GetAdjustedDisplayDifficulty(beatmapInfo, mods); - yield return new RulesetBeatmapAttribute(SongSelectStrings.CircleSize, @"CS", difficulty.CircleSize, adjustedDifficulty.CircleSize, 0, 10); - yield return new RulesetBeatmapAttribute(SongSelectStrings.ApproachRate, @"AR", difficulty.ApproachRate, adjustedDifficulty.ApproachRate, 0, 10); - yield return new RulesetBeatmapAttribute(SongSelectStrings.HPDrain, @"HP", difficulty.DrainRate, adjustedDifficulty.DrainRate, 0, 10); + yield return new RulesetBeatmapAttribute(SongSelectStrings.CircleSize, @"CS", originalDifficulty.CircleSize, adjustedDifficulty.CircleSize, 0, 10); + yield return new RulesetBeatmapAttribute(SongSelectStrings.ApproachRate, @"AR", originalDifficulty.ApproachRate, adjustedDifficulty.ApproachRate, 0, 10); + yield return new RulesetBeatmapAttribute(SongSelectStrings.HPDrain, @"HP", originalDifficulty.DrainRate, adjustedDifficulty.DrainRate, 0, 10); } public override bool EditorShowScrollSpeed => false; diff --git a/osu.Game.Rulesets.Mania/Beatmaps/ManiaBeatmapConverter.cs b/osu.Game.Rulesets.Mania/Beatmaps/ManiaBeatmapConverter.cs index 96550618c0..c55465762b 100644 --- a/osu.Game.Rulesets.Mania/Beatmaps/ManiaBeatmapConverter.cs +++ b/osu.Game.Rulesets.Mania/Beatmaps/ManiaBeatmapConverter.cs @@ -99,7 +99,7 @@ namespace osu.Game.Rulesets.Mania.Beatmaps } } - public static int GetColumnCount(LegacyBeatmapConversionDifficultyInfo difficulty, IReadOnlyList? mods = null) + public static int GetColumnCount(LegacyBeatmapConversionDifficultyInfo difficulty, IReadOnlyCollection? mods = null) { var converter = new ManiaBeatmapConverter(null, difficulty, new ManiaRuleset()); diff --git a/osu.Game.Rulesets.Mania/ManiaRuleset.cs b/osu.Game.Rulesets.Mania/ManiaRuleset.cs index da9fba3d7e..8bdfad1800 100644 --- a/osu.Game.Rulesets.Mania/ManiaRuleset.cs +++ b/osu.Game.Rulesets.Mania/ManiaRuleset.cs @@ -416,9 +416,9 @@ namespace osu.Game.Rulesets.Mania }; /// - public override BeatmapDifficulty GetAdjustedDisplayDifficulty(IBeatmapDifficultyInfo difficulty, IReadOnlyCollection mods) + public override BeatmapDifficulty GetAdjustedDisplayDifficulty(IBeatmapInfo beatmapInfo, IReadOnlyCollection mods) { - BeatmapDifficulty adjustedDifficulty = new BeatmapDifficulty(difficulty); + BeatmapDifficulty adjustedDifficulty = base.GetAdjustedDisplayDifficulty(beatmapInfo, mods); // notably, in mania, hit windows are designed to be independent of track playback rate (see `ManiaHitWindows.SpeedMultiplier`). // *however*, to not make matters *too* simple, mania Hard Rock and Easy differ from all other rulesets @@ -437,17 +437,23 @@ namespace osu.Game.Rulesets.Mania perfectHitWindow /= ManiaModEasy.HIT_WINDOW_DIFFICULTY_MULTIPLIER; adjustedDifficulty.OverallDifficulty = (float)IBeatmapDifficultyInfo.InverseDifficultyRange(perfectHitWindow, ManiaHitWindows.PERFECT_WINDOW_RANGE); + adjustedDifficulty.CircleSize = ManiaBeatmapConverter.GetColumnCount(LegacyBeatmapConversionDifficultyInfo.FromBeatmapInfo(beatmapInfo), mods); return adjustedDifficulty; } - public override IEnumerable GetBeatmapAttributesForDisplay(IBeatmapDifficultyInfo difficulty, IReadOnlyCollection mods) + public override IEnumerable GetBeatmapAttributesForDisplay(IBeatmapInfo beatmapInfo, IReadOnlyCollection mods) { - var adjustedDifficulty = GetAdjustedDisplayDifficulty(difficulty, mods); + // a special touch-up of key count is required to the original difficulty, since key conversion mods are not `IApplicableToDifficulty` + var originalDifficulty = new BeatmapDifficulty(beatmapInfo.Difficulty) + { + CircleSize = ManiaBeatmapConverter.GetColumnCount(LegacyBeatmapConversionDifficultyInfo.FromBeatmapInfo(beatmapInfo), []) + }; + var adjustedDifficulty = GetAdjustedDisplayDifficulty(beatmapInfo, mods); - yield return new RulesetBeatmapAttribute(SongSelectStrings.KeyCount, @"KC", difficulty.CircleSize, adjustedDifficulty.CircleSize, 1, 18); - yield return new RulesetBeatmapAttribute(SongSelectStrings.Accuracy, @"OD", difficulty.OverallDifficulty, adjustedDifficulty.OverallDifficulty, 0, 10); - yield return new RulesetBeatmapAttribute(SongSelectStrings.HPDrain, @"HP", difficulty.DrainRate, adjustedDifficulty.DrainRate, 0, 10); + yield return new RulesetBeatmapAttribute(SongSelectStrings.KeyCount, @"KC", originalDifficulty.CircleSize, adjustedDifficulty.CircleSize, 1, 18); + yield return new RulesetBeatmapAttribute(SongSelectStrings.Accuracy, @"OD", originalDifficulty.OverallDifficulty, adjustedDifficulty.OverallDifficulty, 0, 10); + yield return new RulesetBeatmapAttribute(SongSelectStrings.HPDrain, @"HP", originalDifficulty.DrainRate, adjustedDifficulty.DrainRate, 0, 10); } public override IRulesetFilterCriteria CreateRulesetFilterCriteria() diff --git a/osu.Game.Rulesets.Osu.Tests/OsuRateAdjustedDisplayDifficultyTest.cs b/osu.Game.Rulesets.Osu.Tests/OsuRateAdjustedDisplayDifficultyTest.cs index 4108e9388d..fd929dd8f4 100644 --- a/osu.Game.Rulesets.Osu.Tests/OsuRateAdjustedDisplayDifficultyTest.cs +++ b/osu.Game.Rulesets.Osu.Tests/OsuRateAdjustedDisplayDifficultyTest.cs @@ -22,8 +22,9 @@ namespace osu.Game.Rulesets.Osu.Tests { var ruleset = new OsuRuleset(); var difficulty = new BeatmapDifficulty { ApproachRate = originalApproachRate }; + var beatmapInfo = new BeatmapInfo { Difficulty = difficulty }; - var adjustedDifficulty = ruleset.GetAdjustedDisplayDifficulty(difficulty, []); + var adjustedDifficulty = ruleset.GetAdjustedDisplayDifficulty(beatmapInfo, []); Assert.That(adjustedDifficulty.ApproachRate, Is.EqualTo(originalApproachRate)); } @@ -33,8 +34,9 @@ namespace osu.Game.Rulesets.Osu.Tests { var ruleset = new OsuRuleset(); var difficulty = new BeatmapDifficulty { OverallDifficulty = originalOverallDifficulty }; + var beatmapInfo = new BeatmapInfo { Difficulty = difficulty }; - var adjustedDifficulty = ruleset.GetAdjustedDisplayDifficulty(difficulty, []); + var adjustedDifficulty = ruleset.GetAdjustedDisplayDifficulty(beatmapInfo, []); Assert.That(adjustedDifficulty.OverallDifficulty, Is.EqualTo(originalOverallDifficulty)); } @@ -44,8 +46,9 @@ namespace osu.Game.Rulesets.Osu.Tests { var ruleset = new OsuRuleset(); var difficulty = new BeatmapDifficulty(); + var beatmapInfo = new BeatmapInfo { Difficulty = difficulty }; - var adjustedDifficulty = ruleset.GetAdjustedDisplayDifficulty(difficulty, [new OsuModHalfTime()]); + var adjustedDifficulty = ruleset.GetAdjustedDisplayDifficulty(beatmapInfo, [new OsuModHalfTime()]); Assert.That(adjustedDifficulty.ApproachRate, Is.EqualTo(1.67).Within(0.01)); Assert.That(adjustedDifficulty.OverallDifficulty, Is.EqualTo(2.22).Within(0.01)); @@ -56,8 +59,9 @@ namespace osu.Game.Rulesets.Osu.Tests { var ruleset = new OsuRuleset(); var difficulty = new BeatmapDifficulty(); + var beatmapInfo = new BeatmapInfo { Difficulty = difficulty }; - var adjustedDifficulty = ruleset.GetAdjustedDisplayDifficulty(difficulty, [new OsuModDoubleTime()]); + var adjustedDifficulty = ruleset.GetAdjustedDisplayDifficulty(beatmapInfo, [new OsuModDoubleTime()]); Assert.That(adjustedDifficulty.ApproachRate, Is.EqualTo(7.67).Within(0.01)); Assert.That(adjustedDifficulty.OverallDifficulty, Is.EqualTo(7.77).Within(0.01)); diff --git a/osu.Game.Rulesets.Osu/OsuRuleset.cs b/osu.Game.Rulesets.Osu/OsuRuleset.cs index be9f0e276b..8f0974067a 100644 --- a/osu.Game.Rulesets.Osu/OsuRuleset.cs +++ b/osu.Game.Rulesets.Osu/OsuRuleset.cs @@ -366,9 +366,9 @@ namespace osu.Game.Rulesets.Osu /// /// - public override BeatmapDifficulty GetAdjustedDisplayDifficulty(IBeatmapDifficultyInfo difficulty, IReadOnlyCollection mods) + public override BeatmapDifficulty GetAdjustedDisplayDifficulty(IBeatmapInfo difficulty, IReadOnlyCollection mods) { - BeatmapDifficulty adjustedDifficulty = new BeatmapDifficulty(difficulty); + BeatmapDifficulty adjustedDifficulty = base.GetAdjustedDisplayDifficulty(difficulty, mods); double rate = ModUtils.CalculateRateWithMods(mods); double preempt = IBeatmapDifficultyInfo.DifficultyRange(adjustedDifficulty.ApproachRate, OsuHitObject.PREEMPT_MAX, OsuHitObject.PREEMPT_MID, OsuHitObject.PREEMPT_MIN); diff --git a/osu.Game.Rulesets.Taiko.Tests/TaikoRateAdjustedDisplayDifficultyTest.cs b/osu.Game.Rulesets.Taiko.Tests/TaikoRateAdjustedDisplayDifficultyTest.cs index 2a5688ab11..0fb92e0d7d 100644 --- a/osu.Game.Rulesets.Taiko.Tests/TaikoRateAdjustedDisplayDifficultyTest.cs +++ b/osu.Game.Rulesets.Taiko.Tests/TaikoRateAdjustedDisplayDifficultyTest.cs @@ -22,8 +22,9 @@ namespace osu.Game.Rulesets.Taiko.Tests { var ruleset = new TaikoRuleset(); var difficulty = new BeatmapDifficulty { OverallDifficulty = originalOverallDifficulty }; + var beatmapInfo = new BeatmapInfo { Difficulty = difficulty }; - var adjustedDifficulty = ruleset.GetAdjustedDisplayDifficulty(difficulty, []); + var adjustedDifficulty = ruleset.GetAdjustedDisplayDifficulty(beatmapInfo, []); Assert.That(adjustedDifficulty.OverallDifficulty, Is.EqualTo(originalOverallDifficulty)); } @@ -33,8 +34,9 @@ namespace osu.Game.Rulesets.Taiko.Tests { var ruleset = new TaikoRuleset(); var difficulty = new BeatmapDifficulty(); + var beatmapInfo = new BeatmapInfo { Difficulty = difficulty }; - var adjustedDifficulty = ruleset.GetAdjustedDisplayDifficulty(difficulty, [new TaikoModHalfTime()]); + var adjustedDifficulty = ruleset.GetAdjustedDisplayDifficulty(beatmapInfo, [new TaikoModHalfTime()]); Assert.That(adjustedDifficulty.OverallDifficulty, Is.EqualTo(1.11).Within(0.01)); } @@ -44,8 +46,9 @@ namespace osu.Game.Rulesets.Taiko.Tests { var ruleset = new TaikoRuleset(); var difficulty = new BeatmapDifficulty(); + var beatmapInfo = new BeatmapInfo { Difficulty = difficulty }; - var adjustedDifficulty = ruleset.GetAdjustedDisplayDifficulty(difficulty, [new TaikoModDoubleTime()]); + var adjustedDifficulty = ruleset.GetAdjustedDisplayDifficulty(beatmapInfo, [new TaikoModDoubleTime()]); Assert.That(adjustedDifficulty.OverallDifficulty, Is.EqualTo(8.89).Within(0.01)); } diff --git a/osu.Game.Rulesets.Taiko/TaikoRuleset.cs b/osu.Game.Rulesets.Taiko/TaikoRuleset.cs index 792670c904..c6c61a26dc 100644 --- a/osu.Game.Rulesets.Taiko/TaikoRuleset.cs +++ b/osu.Game.Rulesets.Taiko/TaikoRuleset.cs @@ -272,9 +272,9 @@ namespace osu.Game.Rulesets.Taiko } /// - public override BeatmapDifficulty GetAdjustedDisplayDifficulty(IBeatmapDifficultyInfo difficulty, IReadOnlyCollection mods) + public override BeatmapDifficulty GetAdjustedDisplayDifficulty(IBeatmapInfo beatmapInfo, IReadOnlyCollection mods) { - BeatmapDifficulty adjustedDifficulty = new BeatmapDifficulty(difficulty); + BeatmapDifficulty adjustedDifficulty = base.GetAdjustedDisplayDifficulty(beatmapInfo, mods); double rate = ModUtils.CalculateRateWithMods(mods); double greatHitWindow = IBeatmapDifficultyInfo.DifficultyRange(adjustedDifficulty.OverallDifficulty, TaikoHitWindows.GREAT_WINDOW_RANGE); @@ -284,13 +284,14 @@ namespace osu.Game.Rulesets.Taiko return adjustedDifficulty; } - public override IEnumerable GetBeatmapAttributesForDisplay(IBeatmapDifficultyInfo difficulty, IReadOnlyCollection mods) + public override IEnumerable GetBeatmapAttributesForDisplay(IBeatmapInfo beatmapInfo, IReadOnlyCollection mods) { - var adjustedDifficulty = GetAdjustedDisplayDifficulty(difficulty, mods); + var originalDifficulty = beatmapInfo.Difficulty; + var adjustedDifficulty = GetAdjustedDisplayDifficulty(beatmapInfo, mods); - yield return new RulesetBeatmapAttribute(SongSelectStrings.Accuracy, @"OD", difficulty.OverallDifficulty, adjustedDifficulty.OverallDifficulty, 0, 10); - yield return new RulesetBeatmapAttribute(SongSelectStrings.HPDrain, @"HP", difficulty.DrainRate, adjustedDifficulty.DrainRate, 0, 10); - yield return new RulesetBeatmapAttribute(SongSelectStrings.ScrollSpeed, @"SS", 1f, (float)(adjustedDifficulty.SliderMultiplier / difficulty.SliderMultiplier), 0.25f, 4); + yield return new RulesetBeatmapAttribute(SongSelectStrings.Accuracy, @"OD", originalDifficulty.OverallDifficulty, adjustedDifficulty.OverallDifficulty, 0, 10); + yield return new RulesetBeatmapAttribute(SongSelectStrings.HPDrain, @"HP", originalDifficulty.DrainRate, adjustedDifficulty.DrainRate, 0, 10); + yield return new RulesetBeatmapAttribute(SongSelectStrings.ScrollSpeed, @"SS", 1f, (float)(adjustedDifficulty.SliderMultiplier / originalDifficulty.SliderMultiplier), 0.25f, 4); } } } diff --git a/osu.Game/Beatmaps/Drawables/DifficultyIconTooltip.cs b/osu.Game/Beatmaps/Drawables/DifficultyIconTooltip.cs index cc76e28dfe..f4056607a9 100644 --- a/osu.Game/Beatmaps/Drawables/DifficultyIconTooltip.cs +++ b/osu.Game/Beatmaps/Drawables/DifficultyIconTooltip.cs @@ -131,16 +131,8 @@ namespace osu.Game.Beatmaps.Drawables double bpmAdjusted = displayedContent.BeatmapInfo.BPM * rate; - BeatmapDifficulty originalDifficulty = new BeatmapDifficulty(displayedContent.BeatmapInfo.Difficulty); - - if (displayedContent.Mods != null) - { - foreach (var mod in displayedContent.Mods.OfType()) - mod.ApplyToDifficulty(originalDifficulty); - } - Ruleset ruleset = displayedContent.Ruleset.CreateInstance(); - BeatmapDifficulty adjustedDifficulty = ruleset.GetAdjustedDisplayDifficulty(originalDifficulty, displayedContent.Mods ?? []); + BeatmapDifficulty adjustedDifficulty = ruleset.GetAdjustedDisplayDifficulty(displayedContent.BeatmapInfo, displayedContent.Mods ?? []); circleSize.Text = @"CS: " + adjustedDifficulty.CircleSize.ToString(@"0.##"); drainRate.Text = @" HP: " + adjustedDifficulty.DrainRate.ToString(@"0.##"); diff --git a/osu.Game/Overlays/Mods/BeatmapAttributesDisplay.cs b/osu.Game/Overlays/Mods/BeatmapAttributesDisplay.cs index 14c02f5da7..37a7844b6d 100644 --- a/osu.Game/Overlays/Mods/BeatmapAttributesDisplay.cs +++ b/osu.Game/Overlays/Mods/BeatmapAttributesDisplay.cs @@ -2,7 +2,6 @@ // See the LICENCE file in the repository root for full licence text. using System.Collections.Generic; -using System.Linq; using System.Threading; using osu.Framework.Allocation; using osu.Framework.Bindables; @@ -174,13 +173,9 @@ namespace osu.Game.Overlays.Mods bpmDisplay.Current.Value = FormatUtils.RoundBPM(BeatmapInfo.Value.BPM, rate); BeatmapDifficulty originalDifficulty = new BeatmapDifficulty(BeatmapInfo.Value.Difficulty); - BeatmapDifficulty adjustedDifficulty = new BeatmapDifficulty(originalDifficulty); - - foreach (var mod in Mods.Value.OfType()) - mod.ApplyToDifficulty(adjustedDifficulty); Ruleset ruleset = GameRuleset.Value.CreateInstance(); - adjustedDifficulty = ruleset.GetAdjustedDisplayDifficulty(adjustedDifficulty, Mods.Value); + var adjustedDifficulty = ruleset.GetAdjustedDisplayDifficulty(BeatmapInfo.Value, Mods.Value); TooltipContent = new AdjustedAttributesTooltip.Data(originalDifficulty, adjustedDifficulty); diff --git a/osu.Game/Rulesets/Ruleset.cs b/osu.Game/Rulesets/Ruleset.cs index f10287f0a6..968f2bf4c7 100644 --- a/osu.Game/Rulesets/Ruleset.cs +++ b/osu.Game/Rulesets/Ruleset.cs @@ -386,24 +386,33 @@ namespace osu.Game.Rulesets /// /// It is also not always correct, and arguably is never correct depending on your frame of mind. /// - /// >The that will be adjusted. + /// The for which to display the adjusted difficulty. /// The active mods. /// The adjusted difficulty attributes. - public virtual BeatmapDifficulty GetAdjustedDisplayDifficulty(IBeatmapDifficultyInfo difficulty, IReadOnlyCollection mods) => new BeatmapDifficulty(difficulty); + public virtual BeatmapDifficulty GetAdjustedDisplayDifficulty(IBeatmapInfo beatmapInfo, IReadOnlyCollection mods) + { + BeatmapDifficulty adjustedDifficulty = new BeatmapDifficulty(beatmapInfo.Difficulty); + + foreach (var mod in mods.OfType()) + mod.ApplyToDifficulty(adjustedDifficulty); + + return adjustedDifficulty; + } /// /// Returns a list of s to be displayed wherever it is wanted to display a given beatmap's difficulty information. /// The returned data includes both material changes to difficulty from mods, /// as well as "effective" adjustments coming from . /// - public virtual IEnumerable GetBeatmapAttributesForDisplay(IBeatmapDifficultyInfo difficulty, IReadOnlyCollection mods) + public virtual IEnumerable GetBeatmapAttributesForDisplay(IBeatmapInfo beatmapInfo, IReadOnlyCollection mods) { - var adjustedDifficulty = GetAdjustedDisplayDifficulty(difficulty, mods); + var originalDifficulty = beatmapInfo.Difficulty; + var adjustedDifficulty = GetAdjustedDisplayDifficulty(beatmapInfo, mods); - yield return new RulesetBeatmapAttribute(SongSelectStrings.CircleSize, @"CS", difficulty.CircleSize, adjustedDifficulty.CircleSize, 0, 10); - yield return new RulesetBeatmapAttribute(SongSelectStrings.ApproachRate, @"AR", difficulty.ApproachRate, adjustedDifficulty.ApproachRate, 0, 10); - yield return new RulesetBeatmapAttribute(SongSelectStrings.Accuracy, @"OD", difficulty.OverallDifficulty, adjustedDifficulty.OverallDifficulty, 0, 10); - yield return new RulesetBeatmapAttribute(SongSelectStrings.HPDrain, @"HP", difficulty.DrainRate, adjustedDifficulty.DrainRate, 0, 10); + yield return new RulesetBeatmapAttribute(SongSelectStrings.CircleSize, @"CS", originalDifficulty.CircleSize, adjustedDifficulty.CircleSize, 0, 10); + yield return new RulesetBeatmapAttribute(SongSelectStrings.ApproachRate, @"AR", originalDifficulty.ApproachRate, adjustedDifficulty.ApproachRate, 0, 10); + yield return new RulesetBeatmapAttribute(SongSelectStrings.Accuracy, @"OD", originalDifficulty.OverallDifficulty, adjustedDifficulty.OverallDifficulty, 0, 10); + yield return new RulesetBeatmapAttribute(SongSelectStrings.HPDrain, @"HP", originalDifficulty.DrainRate, adjustedDifficulty.DrainRate, 0, 10); } /// diff --git a/osu.Game/Screens/Select/Details/AdvancedStats.cs b/osu.Game/Screens/Select/Details/AdvancedStats.cs index 90a4af48f0..5a86cde090 100644 --- a/osu.Game/Screens/Select/Details/AdvancedStats.cs +++ b/osu.Game/Screens/Select/Details/AdvancedStats.cs @@ -17,7 +17,6 @@ using osu.Game.Beatmaps; using osu.Framework.Bindables; using System.Collections.Generic; using osu.Game.Rulesets.Mods; -using System.Linq; using System.Threading; using System.Threading.Tasks; using osu.Framework.Extensions; @@ -171,24 +170,13 @@ namespace osu.Game.Screens.Select.Details private void updateStatistics() { - IBeatmapDifficultyInfo baseDifficulty = BeatmapInfo?.Difficulty; + var baseDifficulty = BeatmapInfo?.Difficulty != null ? new BeatmapDifficulty(BeatmapInfo.Difficulty) : null; BeatmapDifficulty adjustedDifficulty = null; - if (baseDifficulty != null) + if (baseDifficulty != null && Ruleset.Value != null) { - BeatmapDifficulty originalDifficulty = new BeatmapDifficulty(baseDifficulty); - - foreach (var mod in Mods.Value.OfType()) - mod.ApplyToDifficulty(originalDifficulty); - - adjustedDifficulty = originalDifficulty; - - if (Ruleset.Value != null) - { - adjustedDifficulty = Ruleset.Value.CreateInstance().GetAdjustedDisplayDifficulty(originalDifficulty, Mods.Value); - - TooltipContent = new AdjustedAttributesTooltip.Data(originalDifficulty, adjustedDifficulty); - } + adjustedDifficulty = Ruleset.Value.CreateInstance().GetAdjustedDisplayDifficulty(BeatmapInfo, Mods.Value); + TooltipContent = new AdjustedAttributesTooltip.Data(baseDifficulty, adjustedDifficulty); } switch (Ruleset.Value?.OnlineID) diff --git a/osu.Game/Screens/SelectV2/BeatmapTitleWedge_DifficultyDisplay.cs b/osu.Game/Screens/SelectV2/BeatmapTitleWedge_DifficultyDisplay.cs index c3ff8899ad..f8783c6004 100644 --- a/osu.Game/Screens/SelectV2/BeatmapTitleWedge_DifficultyDisplay.cs +++ b/osu.Game/Screens/SelectV2/BeatmapTitleWedge_DifficultyDisplay.cs @@ -294,17 +294,12 @@ namespace osu.Game.Screens.SelectV2 } BeatmapDifficulty originalDifficulty = beatmap.Value.BeatmapInfo.Difficulty; - BeatmapDifficulty adjustedDifficulty = new BeatmapDifficulty(originalDifficulty); - - foreach (var mod in mods.Value.OfType()) - mod.ApplyToDifficulty(adjustedDifficulty); - Ruleset rulesetInstance = ruleset.Value.CreateInstance(); - adjustedDifficulty = rulesetInstance.GetAdjustedDisplayDifficulty(adjustedDifficulty, mods.Value); + var adjustedDifficulty = rulesetInstance.GetAdjustedDisplayDifficulty(beatmap.Value.BeatmapInfo, mods.Value); difficultyStatisticsDisplay.TooltipContent = new AdjustedAttributesTooltip.Data(originalDifficulty, adjustedDifficulty); - difficultyStatisticsDisplay.Statistics = rulesetInstance.GetBeatmapAttributesForDisplay(originalDifficulty, mods.Value) + difficultyStatisticsDisplay.Statistics = rulesetInstance.GetBeatmapAttributesForDisplay(beatmap.Value.BeatmapInfo, mods.Value) .Select(a => new StatisticDifficulty.Data(a)).ToList(); }); diff --git a/osu.Game/Skinning/Components/BeatmapAttributeText.cs b/osu.Game/Skinning/Components/BeatmapAttributeText.cs index 60a03f4351..3935277dfb 100644 --- a/osu.Game/Skinning/Components/BeatmapAttributeText.cs +++ b/osu.Game/Skinning/Components/BeatmapAttributeText.cs @@ -3,7 +3,6 @@ using System; using System.Collections.Generic; -using System.Linq; using System.Threading; using JetBrains.Annotations; using osu.Framework.Allocation; @@ -237,15 +236,9 @@ namespace osu.Game.Skinning.Components BeatmapDifficulty computeDifficulty() { - BeatmapDifficulty difficulty = new BeatmapDifficulty(beatmap.Value.BeatmapInfo.Difficulty); - - foreach (var mod in mods.Value.OfType()) - mod.ApplyToDifficulty(difficulty); - - if (ruleset.Value is RulesetInfo rulesetInfo) - difficulty = rulesetInfo.CreateInstance().GetAdjustedDisplayDifficulty(difficulty, mods.Value); - - return difficulty; + return ruleset.Value is RulesetInfo rulesetInfo + ? rulesetInfo.CreateInstance().GetAdjustedDisplayDifficulty(beatmap.Value.BeatmapInfo, mods.Value) + : new BeatmapDifficulty(beatmap.Value.BeatmapInfo.Difficulty); } }