diff --git a/PerformanceCalculator/Difficulty/DifficultyCommand.cs b/PerformanceCalculator/Difficulty/DifficultyCommand.cs index daf8963..0c8c487 100644 --- a/PerformanceCalculator/Difficulty/DifficultyCommand.cs +++ b/PerformanceCalculator/Difficulty/DifficultyCommand.cs @@ -126,7 +126,7 @@ namespace PerformanceCalculator.Difficulty { // Get the ruleset var ruleset = LegacyHelper.GetRulesetFromLegacyID(Ruleset ?? beatmap.BeatmapInfo.Ruleset.OnlineID); - var mods = LegacyHelper.TrimNonDifficultyAdjustmentMods(ruleset, getMods(ruleset).ToArray()); + var mods = LegacyHelper.ConvertToLegacyDifficultyAdjustmentMods(ruleset, getMods(ruleset).ToArray()); var attributes = ruleset.CreateDifficultyCalculator(beatmap).Calculate(mods); return new Result diff --git a/PerformanceCalculator/Leaderboard/LeaderboardCommand.cs b/PerformanceCalculator/Leaderboard/LeaderboardCommand.cs index 3618825..6146c04 100644 --- a/PerformanceCalculator/Leaderboard/LeaderboardCommand.cs +++ b/PerformanceCalculator/Leaderboard/LeaderboardCommand.cs @@ -81,7 +81,7 @@ namespace PerformanceCalculator.Leaderboard var score = new ProcessorScoreDecoder(working).Parse(scoreInfo); var difficultyCalculator = ruleset.CreateDifficultyCalculator(working); - var difficultyAttributes = difficultyCalculator.Calculate(LegacyHelper.TrimNonDifficultyAdjustmentMods(ruleset, scoreInfo.Mods).ToArray()); + var difficultyAttributes = difficultyCalculator.Calculate(LegacyHelper.ConvertToLegacyDifficultyAdjustmentMods(ruleset, scoreInfo.Mods).ToArray()); var performanceCalculator = ruleset.CreatePerformanceCalculator(difficultyAttributes, score.ScoreInfo); plays.Add((performanceCalculator?.Calculate().Total ?? 0, play.pp)); diff --git a/PerformanceCalculator/LegacyHelper.cs b/PerformanceCalculator/LegacyHelper.cs index bd56c62..4399e28 100644 --- a/PerformanceCalculator/LegacyHelper.cs +++ b/PerformanceCalculator/LegacyHelper.cs @@ -2,6 +2,7 @@ // See the LICENCE file in the repository root for full licence text. using System; +using System.Collections.Generic; using System.IO; using System.Linq; using osu.Framework.Audio.Track; @@ -63,10 +64,10 @@ namespace PerformanceCalculator } /// - /// Trims all mods from a given array which do not adjust difficulty. + /// Transforms a given combination into one which is applicable to legacy scores. /// This is used to match osu!stable/osu!web calculations for the time being, until such a point that these mods do get considered. /// - public static Mod[] TrimNonDifficultyAdjustmentMods(Ruleset ruleset, Mod[] mods) + public static Mod[] ConvertToLegacyDifficultyAdjustmentMods(Ruleset ruleset, Mod[] mods) { var beatmap = new EmptyWorkingBeatmap { @@ -77,17 +78,27 @@ namespace PerformanceCalculator } }; - var difficultyAdjustmentMods = ModUtils.FlattenMods( - ruleset.CreateDifficultyCalculator(beatmap).CreateDifficultyAdjustmentModCombinations()) - .Select(m => m.GetType()) - .Distinct() - .ToHashSet(); + var allMods = ruleset.CreateAllMods().ToArray(); - // Special case for DT/NC. + var allowedMods = ModUtils.FlattenMods( + ruleset.CreateDifficultyCalculator(beatmap).CreateDifficultyAdjustmentModCombinations()) + .Select(m => m.GetType()) + .Distinct() + .ToHashSet(); + + // Special case to allow either DT or NC. if (mods.Any(m => m is ModDoubleTime)) - difficultyAdjustmentMods.Add(ruleset.CreateAllMods().Single(m => m is ModNightcore).GetType()); + allowedMods.Add(allMods.Single(m => m is ModNightcore).GetType()); - return mods.Where(m => difficultyAdjustmentMods.Contains(m.GetType())).ToArray(); + var result = new List(); + + var classicMod = allMods.SingleOrDefault(m => m is ModClassic); + if (classicMod != null) + result.Add(classicMod); + + result.AddRange(mods.Where(m => allowedMods.Contains(m.GetType()))); + + return result.ToArray(); } private class EmptyWorkingBeatmap : WorkingBeatmap diff --git a/PerformanceCalculator/Performance/PerformanceCommand.cs b/PerformanceCalculator/Performance/PerformanceCommand.cs index eae7447..828869d 100644 --- a/PerformanceCalculator/Performance/PerformanceCommand.cs +++ b/PerformanceCalculator/Performance/PerformanceCommand.cs @@ -40,7 +40,7 @@ namespace PerformanceCalculator.Performance var ruleset = score.ScoreInfo.Ruleset.CreateInstance(); var difficultyCalculator = ruleset.CreateDifficultyCalculator(workingBeatmap); - var difficultyAttributes = difficultyCalculator.Calculate(LegacyHelper.TrimNonDifficultyAdjustmentMods(ruleset, score.ScoreInfo.Mods).ToArray()); + var difficultyAttributes = difficultyCalculator.Calculate(LegacyHelper.ConvertToLegacyDifficultyAdjustmentMods(ruleset, score.ScoreInfo.Mods).ToArray()); var performanceCalculator = score.ScoreInfo.Ruleset.CreateInstance().CreatePerformanceCalculator(difficultyAttributes, score.ScoreInfo); var ppAttributes = performanceCalculator?.Calculate(); diff --git a/PerformanceCalculator/Profile/ProfileCommand.cs b/PerformanceCalculator/Profile/ProfileCommand.cs index d7f5124..fc6d61e 100644 --- a/PerformanceCalculator/Profile/ProfileCommand.cs +++ b/PerformanceCalculator/Profile/ProfileCommand.cs @@ -73,7 +73,7 @@ namespace PerformanceCalculator.Profile var score = new ProcessorScoreDecoder(working).Parse(scoreInfo); var difficultyCalculator = ruleset.CreateDifficultyCalculator(working); - var difficultyAttributes = difficultyCalculator.Calculate(LegacyHelper.TrimNonDifficultyAdjustmentMods(ruleset, scoreInfo.Mods).ToArray()); + var difficultyAttributes = difficultyCalculator.Calculate(LegacyHelper.ConvertToLegacyDifficultyAdjustmentMods(ruleset, scoreInfo.Mods).ToArray()); var performanceCalculator = ruleset.CreatePerformanceCalculator(difficultyAttributes, score.ScoreInfo); var ppAttributes = performanceCalculator?.Calculate(); diff --git a/PerformanceCalculator/Simulate/SimulateCommand.cs b/PerformanceCalculator/Simulate/SimulateCommand.cs index ffaf320..7232a09 100644 --- a/PerformanceCalculator/Simulate/SimulateCommand.cs +++ b/PerformanceCalculator/Simulate/SimulateCommand.cs @@ -74,7 +74,7 @@ namespace PerformanceCalculator.Simulate var accuracy = GetAccuracy(statistics); var difficultyCalculator = ruleset.CreateDifficultyCalculator(workingBeatmap); - var difficultyAttributes = difficultyCalculator.Calculate(LegacyHelper.TrimNonDifficultyAdjustmentMods(ruleset, mods).ToArray()); + var difficultyAttributes = difficultyCalculator.Calculate(LegacyHelper.ConvertToLegacyDifficultyAdjustmentMods(ruleset, mods).ToArray()); var performanceCalculator = ruleset.CreatePerformanceCalculator(difficultyAttributes, new ScoreInfo(beatmap.BeatmapInfo, ruleset.RulesetInfo) { Accuracy = accuracy,