2020-11-06 04:51:25 +00:00
|
|
|
// 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.
|
|
|
|
|
2022-06-17 07:37:17 +00:00
|
|
|
#nullable disable
|
|
|
|
|
2020-11-06 04:51:25 +00:00
|
|
|
using JetBrains.Annotations;
|
2022-06-23 10:46:59 +00:00
|
|
|
using osu.Framework.Utils;
|
2020-11-06 04:51:25 +00:00
|
|
|
using osu.Game.Rulesets.Difficulty;
|
|
|
|
|
|
|
|
namespace osu.Game.Beatmaps
|
|
|
|
{
|
|
|
|
public readonly struct StarDifficulty
|
|
|
|
{
|
|
|
|
/// <summary>
|
|
|
|
/// The star difficulty rating for the given beatmap.
|
|
|
|
/// </summary>
|
|
|
|
public readonly double Stars;
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// The maximum combo achievable on the given beatmap.
|
|
|
|
/// </summary>
|
|
|
|
public readonly int MaxCombo;
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// The difficulty attributes computed for the given beatmap.
|
|
|
|
/// Might not be available if the star difficulty is associated with a beatmap that's not locally available.
|
|
|
|
/// </summary>
|
|
|
|
[CanBeNull]
|
|
|
|
public readonly DifficultyAttributes Attributes;
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Creates a <see cref="StarDifficulty"/> structure based on <see cref="DifficultyAttributes"/> computed
|
|
|
|
/// by a <see cref="DifficultyCalculator"/>.
|
|
|
|
/// </summary>
|
|
|
|
public StarDifficulty([NotNull] DifficultyAttributes attributes)
|
|
|
|
{
|
2022-06-29 12:02:23 +00:00
|
|
|
Stars = double.IsFinite(attributes.StarRating) ? attributes.StarRating : 0;
|
2020-11-06 04:51:25 +00:00
|
|
|
MaxCombo = attributes.MaxCombo;
|
|
|
|
Attributes = attributes;
|
|
|
|
// Todo: Add more members (BeatmapInfo.DifficultyRating? Attributes? Etc...)
|
|
|
|
}
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Creates a <see cref="StarDifficulty"/> structure with a pre-populated star difficulty and max combo
|
|
|
|
/// in scenarios where computing <see cref="DifficultyAttributes"/> is not feasible (i.e. when working with online sources).
|
|
|
|
/// </summary>
|
|
|
|
public StarDifficulty(double starDifficulty, int maxCombo)
|
|
|
|
{
|
2022-06-29 12:02:23 +00:00
|
|
|
Stars = double.IsFinite(starDifficulty) ? starDifficulty : 0;
|
2020-11-06 04:51:25 +00:00
|
|
|
MaxCombo = maxCombo;
|
|
|
|
Attributes = null;
|
|
|
|
}
|
|
|
|
|
2022-06-23 10:46:59 +00:00
|
|
|
public DifficultyRating DifficultyRating => GetDifficultyRating(Stars);
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Retrieves the <see cref="DifficultyRating"/> that describes a star rating.
|
|
|
|
/// </summary>
|
|
|
|
/// <remarks>
|
|
|
|
/// For more information, see: https://osu.ppy.sh/help/wiki/Difficulties
|
|
|
|
/// </remarks>
|
|
|
|
/// <param name="starRating">The star rating.</param>
|
|
|
|
/// <returns>The <see cref="DifficultyRating"/> that best describes <paramref name="starRating"/>.</returns>
|
|
|
|
public static DifficultyRating GetDifficultyRating(double starRating)
|
|
|
|
{
|
|
|
|
if (Precision.AlmostBigger(starRating, 6.5, 0.005))
|
|
|
|
return DifficultyRating.ExpertPlus;
|
|
|
|
|
|
|
|
if (Precision.AlmostBigger(starRating, 5.3, 0.005))
|
|
|
|
return DifficultyRating.Expert;
|
|
|
|
|
|
|
|
if (Precision.AlmostBigger(starRating, 4.0, 0.005))
|
|
|
|
return DifficultyRating.Insane;
|
|
|
|
|
|
|
|
if (Precision.AlmostBigger(starRating, 2.7, 0.005))
|
|
|
|
return DifficultyRating.Hard;
|
|
|
|
|
|
|
|
if (Precision.AlmostBigger(starRating, 2.0, 0.005))
|
|
|
|
return DifficultyRating.Normal;
|
|
|
|
|
|
|
|
return DifficultyRating.Easy;
|
|
|
|
}
|
2020-11-06 04:51:25 +00:00
|
|
|
}
|
|
|
|
}
|