1
0
Fork 0
mirror of https://github.com/ppy/osu-tools.git synced 2025-06-10 01:50:46 +09:00

Add classic mod when calculating legacy scores

This commit is contained in:
Dan Balasescu 2022-02-22 18:44:24 +09:00
parent b27154ffc4
commit 6f914ac807
6 changed files with 26 additions and 15 deletions

View file

@ -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

View file

@ -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));

View file

@ -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
}
/// <summary>
/// Trims all mods from a given <see cref="Mod"/> array which do not adjust difficulty.
/// Transforms a given <see cref="Mod"/> 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.
/// </summary>
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<Mod>();
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

View file

@ -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();

View file

@ -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();

View file

@ -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,