mirror of
https://github.com/ppy/osu.git
synced 2025-01-28 05:22:54 +08:00
Restructure of DifficultyCalculator to cleanup mod + attribute handling
This commit is contained in:
parent
1431ee1867
commit
b7a06b9594
19
osu.Game/Rulesets/Difficulty/DifficultyAttributes.cs
Normal file
19
osu.Game/Rulesets/Difficulty/DifficultyAttributes.cs
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
// Copyright (c) 2007-2018 ppy Pty Ltd <contact@ppy.sh>.
|
||||||
|
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
||||||
|
|
||||||
|
using osu.Game.Rulesets.Mods;
|
||||||
|
|
||||||
|
namespace osu.Game.Rulesets.Difficulty
|
||||||
|
{
|
||||||
|
public class DifficultyAttributes
|
||||||
|
{
|
||||||
|
public readonly Mod[] Mods;
|
||||||
|
public readonly double StarRating;
|
||||||
|
|
||||||
|
public DifficultyAttributes(Mod[] mods, double starRating)
|
||||||
|
{
|
||||||
|
Mods = mods;
|
||||||
|
StarRating = starRating;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -13,24 +13,44 @@ namespace osu.Game.Rulesets.Difficulty
|
|||||||
{
|
{
|
||||||
public abstract class DifficultyCalculator
|
public abstract class DifficultyCalculator
|
||||||
{
|
{
|
||||||
protected readonly IBeatmap Beatmap;
|
private readonly Ruleset ruleset;
|
||||||
protected readonly Mod[] Mods;
|
private readonly WorkingBeatmap beatmap;
|
||||||
|
|
||||||
protected double TimeRate { get; private set; } = 1;
|
protected DifficultyCalculator(Ruleset ruleset, WorkingBeatmap beatmap)
|
||||||
|
|
||||||
protected DifficultyCalculator(IBeatmap beatmap, Mod[] mods = null)
|
|
||||||
{
|
{
|
||||||
Beatmap = beatmap;
|
this.ruleset = ruleset;
|
||||||
Mods = mods ?? new Mod[0];
|
this.beatmap = beatmap;
|
||||||
|
|
||||||
ApplyMods(Mods);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected virtual void ApplyMods(Mod[] mods)
|
/// <summary>
|
||||||
|
/// Calculates the difficulty of the beatmap using a specific mod combination.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="mods">The mods that should be applied to the beatmap.</param>
|
||||||
|
/// <returns>A structure describing the difficulty of the beatmap.</returns>
|
||||||
|
public DifficultyAttributes Calculate(params Mod[] mods)
|
||||||
{
|
{
|
||||||
|
beatmap.Mods.Value = mods;
|
||||||
|
IBeatmap playableBeatmap = beatmap.GetPlayableBeatmap(ruleset.RulesetInfo);
|
||||||
|
|
||||||
var clock = new StopwatchClock();
|
var clock = new StopwatchClock();
|
||||||
mods.OfType<IApplicableToClock>().ForEach(m => m.ApplyToClock(clock));
|
mods.OfType<IApplicableToClock>().ForEach(m => m.ApplyToClock(clock));
|
||||||
TimeRate = clock.Rate;
|
|
||||||
|
return Calculate(playableBeatmap, mods, clock.Rate);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Calculates the difficulty of the beatmap using all mod combinations applicable to the beatmap.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>A collection of structures describing the difficulty of the beatmap for each mod combination.</returns>
|
||||||
|
public IEnumerable<DifficultyAttributes> CalculateAll()
|
||||||
|
{
|
||||||
|
foreach (var combination in CreateDifficultyAdjustmentModCombinations())
|
||||||
|
{
|
||||||
|
if (combination is MultiMod multi)
|
||||||
|
yield return Calculate(multi.Mods);
|
||||||
|
else
|
||||||
|
yield return Calculate(combination);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -71,6 +91,13 @@ namespace osu.Game.Rulesets.Difficulty
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
protected virtual Mod[] DifficultyAdjustmentMods => Array.Empty<Mod>();
|
protected virtual Mod[] DifficultyAdjustmentMods => Array.Empty<Mod>();
|
||||||
|
|
||||||
public abstract double Calculate(Dictionary<string, double> categoryDifficulty = null);
|
/// <summary>
|
||||||
|
/// Calculates the difficulty of a <see cref="Beatmap"/> using a specific <see cref="Mod"/> combination.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="beatmap">The <see cref="IBeatmap"/> to compute the difficulty for.</param>
|
||||||
|
/// <param name="mods">The <see cref="Mod"/>s that should be applied.</param>
|
||||||
|
/// <param name="timeRate">The rate of time in <paramref name="beatmap"/>.</param>
|
||||||
|
/// <returns>A structure containing the difficulty attributes.</returns>
|
||||||
|
protected abstract DifficultyAttributes Calculate(IBeatmap beatmap, Mod[] mods, double timeRate);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -61,7 +61,7 @@ namespace osu.Game.Rulesets
|
|||||||
|
|
||||||
public virtual IBeatmapProcessor CreateBeatmapProcessor(IBeatmap beatmap) => null;
|
public virtual IBeatmapProcessor CreateBeatmapProcessor(IBeatmap beatmap) => null;
|
||||||
|
|
||||||
public abstract DifficultyCalculator CreateDifficultyCalculator(IBeatmap beatmap, Mod[] mods = null);
|
public abstract DifficultyCalculator CreateDifficultyCalculator(WorkingBeatmap beatmap);
|
||||||
|
|
||||||
public virtual PerformanceCalculator CreatePerformanceCalculator(IBeatmap beatmap, Score score) => null;
|
public virtual PerformanceCalculator CreatePerformanceCalculator(IBeatmap beatmap, Score score) => null;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user