Create PerformanceAttributes

This commit is contained in:
StanR
2021-12-21 13:08:31 +03:00
parent 2f2006715e
commit cca02a8016
12 changed files with 119 additions and 43 deletions

View File

@ -0,0 +1,11 @@
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
using osu.Game.Rulesets.Difficulty;
namespace osu.Game.Rulesets.Catch.Difficulty
{
public class CatchPerformanceAttributes : PerformanceAttributes
{
}
}

View File

@ -28,7 +28,7 @@ namespace osu.Game.Rulesets.Catch.Difficulty
{ {
} }
public override double Calculate(Dictionary<string, double> categoryDifficulty = null) public override PerformanceAttributes Calculate()
{ {
mods = Score.Mods; mods = Score.Mods;
@ -90,13 +90,10 @@ namespace osu.Game.Rulesets.Catch.Difficulty
if (mods.Any(m => m is ModNoFail)) if (mods.Any(m => m is ModNoFail))
value *= 0.90; value *= 0.90;
if (categoryDifficulty != null) return new CatchPerformanceAttributes
{ {
categoryDifficulty.Add("AR", Attributes.ApproachRate); Total = value
categoryDifficulty.Add("Max Combo", Attributes.MaxCombo); };
}
return value;
} }
private double accuracy() => totalHits() == 0 ? 0 : Math.Clamp((double)totalSuccessfulHits() / totalHits(), 0, 1); private double accuracy() => totalHits() == 0 ? 0 : Math.Clamp((double)totalSuccessfulHits() / totalHits(), 0, 1);

View File

@ -0,0 +1,20 @@
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
using Newtonsoft.Json;
using osu.Game.Rulesets.Difficulty;
namespace osu.Game.Rulesets.Mania.Difficulty
{
public class ManiaPerformanceAttributes : PerformanceAttributes
{
[JsonProperty("difficulty")]
public double Difficulty { get; set; }
[JsonProperty("accuracy")]
public double Accuracy { get; set; }
[JsonProperty("scaled_score")]
public double ScaledScore { get; set; }
}
}

View File

@ -32,7 +32,7 @@ namespace osu.Game.Rulesets.Mania.Difficulty
{ {
} }
public override double Calculate(Dictionary<string, double> categoryDifficulty = null) public override PerformanceAttributes Calculate()
{ {
mods = Score.Mods; mods = Score.Mods;
scaledScore = Score.TotalScore; scaledScore = Score.TotalScore;
@ -69,16 +69,13 @@ namespace osu.Game.Rulesets.Mania.Difficulty
Math.Pow(accValue, 1.1), 1.0 / 1.1 Math.Pow(accValue, 1.1), 1.0 / 1.1
) * multiplier; ) * multiplier;
if (categoryDifficulty != null) return new ManiaPerformanceAttributes
{ {
categoryDifficulty.Add("Difficulty", difficultyValue); Difficulty = difficultyValue,
categoryDifficulty.Add("Accuracy", accValue); Accuracy = accValue,
categoryDifficulty.Add("Scaled Score", scaledScore); ScaledScore = scaledScore,
categoryDifficulty.Add("Great Hit Window", Attributes.GreatHitWindow); Total = totalValue
categoryDifficulty.Add("Max Combo", Attributes.MaxCombo); };
}
return totalValue;
} }
private double computeDifficultyValue() private double computeDifficultyValue()

View File

@ -0,0 +1,26 @@
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
using Newtonsoft.Json;
using osu.Game.Rulesets.Difficulty;
namespace osu.Game.Rulesets.Osu.Difficulty
{
public class OsuPerformanceAttributes : PerformanceAttributes
{
[JsonProperty("aim")]
public double Aim { get; set; }
[JsonProperty("speed")]
public double Speed { get; set; }
[JsonProperty("accuracy")]
public double Accuracy { get; set; }
[JsonProperty("flashlight")]
public double Flashlight { get; set; }
[JsonProperty("effective_miss_count")]
public double EffectiveMissCount { get; set; }
}
}

View File

@ -32,7 +32,7 @@ namespace osu.Game.Rulesets.Osu.Difficulty
{ {
} }
public override double Calculate(Dictionary<string, double> categoryDifficulty = null) public override PerformanceAttributes Calculate()
{ {
mods = Score.Mods; mods = Score.Mods;
accuracy = Score.Accuracy; accuracy = Score.Accuracy;
@ -72,19 +72,15 @@ namespace osu.Game.Rulesets.Osu.Difficulty
Math.Pow(flashlightValue, 1.1), 1.0 / 1.1 Math.Pow(flashlightValue, 1.1), 1.0 / 1.1
) * multiplier; ) * multiplier;
if (categoryDifficulty != null) return new OsuPerformanceAttributes
{ {
categoryDifficulty.Add("Aim", aimValue); Aim = aimValue,
categoryDifficulty.Add("Speed", speedValue); Speed = speedValue,
categoryDifficulty.Add("Accuracy", accuracyValue); Accuracy = accuracyValue,
categoryDifficulty.Add("Flashlight", flashlightValue); Flashlight = flashlightValue,
categoryDifficulty.Add("OD", Attributes.OverallDifficulty); EffectiveMissCount = effectiveMissCount,
categoryDifficulty.Add("AR", Attributes.ApproachRate); Total = totalValue
categoryDifficulty.Add("Max Combo", Attributes.MaxCombo); };
categoryDifficulty.Add("Effective Miss Count", effectiveMissCount);
}
return totalValue;
} }
private double computeAimValue() private double computeAimValue()

View File

@ -0,0 +1,17 @@
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
using Newtonsoft.Json;
using osu.Game.Rulesets.Difficulty;
namespace osu.Game.Rulesets.Taiko.Difficulty
{
public class TaikoPerformanceAttributes : PerformanceAttributes
{
[JsonProperty("difficulty")]
public double Difficulty { get; set; }
[JsonProperty("accuracy")]
public double Accuracy { get; set; }
}
}

View File

@ -27,7 +27,7 @@ namespace osu.Game.Rulesets.Taiko.Difficulty
{ {
} }
public override double Calculate(Dictionary<string, double> categoryDifficulty = null) public override PerformanceAttributes Calculate()
{ {
mods = Score.Mods; mods = Score.Mods;
countGreat = Score.Statistics.GetValueOrDefault(HitResult.Great); countGreat = Score.Statistics.GetValueOrDefault(HitResult.Great);
@ -52,16 +52,12 @@ namespace osu.Game.Rulesets.Taiko.Difficulty
Math.Pow(accuracyValue, 1.1), 1.0 / 1.1 Math.Pow(accuracyValue, 1.1), 1.0 / 1.1
) * multiplier; ) * multiplier;
if (categoryDifficulty != null) return new TaikoPerformanceAttributes
{ {
categoryDifficulty.Add("Difficulty", difficultyValue); Difficulty = difficultyValue,
categoryDifficulty.Add("Accuracy", accuracyValue); Accuracy = accuracyValue,
categoryDifficulty.Add("AR", Attributes.ApproachRate); Total = totalValue
categoryDifficulty.Add("Great Hit Window", Attributes.GreatHitWindow); };
categoryDifficulty.Add("Max Combo", Attributes.MaxCombo);
}
return totalValue;
} }
private double computeDifficultyValue() private double computeDifficultyValue()

View File

@ -0,0 +1,16 @@
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
using Newtonsoft.Json;
namespace osu.Game.Rulesets.Difficulty
{
public class PerformanceAttributes
{
/// <summary>
/// Calculated score performance points.
/// </summary>
[JsonProperty("pp")]
public double Total { get; set; }
}
}

View File

@ -37,6 +37,6 @@ namespace osu.Game.Rulesets.Difficulty
TimeRate = track.Rate; TimeRate = track.Rate;
} }
public abstract double Calculate(Dictionary<string, double> categoryDifficulty = null); public abstract PerformanceAttributes Calculate();
} }
} }

View File

@ -44,7 +44,7 @@ namespace osu.Game.Scoring
var calculator = score.Ruleset.CreateInstance().CreatePerformanceCalculator(attributes.Value.Attributes, score); var calculator = score.Ruleset.CreateInstance().CreatePerformanceCalculator(attributes.Value.Attributes, score);
return calculator?.Calculate(); return calculator?.Calculate().Total;
} }
public readonly struct PerformanceCacheLookup public readonly struct PerformanceCacheLookup

View File

@ -129,7 +129,7 @@ namespace osu.Game.Screens.Play.HUD
var calculator = gameplayState.Ruleset.CreatePerformanceCalculator(attrib, scoreInfo); var calculator = gameplayState.Ruleset.CreatePerformanceCalculator(attrib, scoreInfo);
Current.Value = (int)Math.Round(calculator?.Calculate() ?? 0, MidpointRounding.AwayFromZero); Current.Value = (int)Math.Round(calculator?.Calculate().Total ?? 0, MidpointRounding.AwayFromZero);
IsValid = true; IsValid = true;
} }