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:
parent
b27154ffc4
commit
6f914ac807
6 changed files with 26 additions and 15 deletions
|
@ -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
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue