1
0
mirror of https://github.com/ppy/osu.git synced 2024-09-22 14:07:25 +08:00
osu-lazer/osu.Game/Rulesets/Scoring/HitResult.cs

180 lines
4.8 KiB
C#
Raw Normal View History

// 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.
2018-04-13 17:19:50 +08:00
using System.ComponentModel;
2020-09-25 19:11:27 +08:00
using osu.Game.Utils;
2018-04-13 17:19:50 +08:00
namespace osu.Game.Rulesets.Scoring
{
2020-09-25 19:11:27 +08:00
[HasOrderedElements]
2018-04-13 17:19:50 +08:00
public enum HitResult
{
/// <summary>
/// Indicates that the object has not been judged yet.
/// </summary>
[Description(@"")]
2020-09-29 13:41:50 +08:00
[Order(14)]
2020-09-29 15:32:02 +08:00
None = 0,
2018-04-13 17:19:50 +08:00
/// <summary>
/// Indicates that the object has been judged as a miss.
/// </summary>
2019-09-06 14:24:00 +08:00
/// <remarks>
/// This miss window should determine how early a hit can be before it is considered for judgement (as opposed to being ignored as
/// "too far in the future). It should also define when a forced miss should be triggered (as a result of no user input in time).
/// </remarks>
2018-04-13 17:19:50 +08:00
[Description(@"Miss")]
2020-09-25 19:11:27 +08:00
[Order(5)]
2020-09-29 15:32:02 +08:00
Miss = 64,
2018-04-13 17:19:50 +08:00
[Description(@"Meh")]
2020-09-25 19:11:27 +08:00
[Order(4)]
2018-04-13 17:19:50 +08:00
Meh,
/// <summary>
/// Optional judgement.
/// </summary>
[Description(@"OK")]
2020-09-25 19:11:27 +08:00
[Order(3)]
2018-04-13 17:19:50 +08:00
Ok,
[Description(@"Good")]
2020-09-25 19:11:27 +08:00
[Order(2)]
2018-04-13 17:19:50 +08:00
Good,
[Description(@"Great")]
2020-09-25 19:11:27 +08:00
[Order(1)]
2018-04-13 17:19:50 +08:00
Great,
/// <summary>
/// Optional judgement.
/// </summary>
[Description(@"Perfect")]
2020-09-25 19:11:27 +08:00
[Order(0)]
2018-04-13 17:19:50 +08:00
Perfect,
2020-05-04 14:55:42 +08:00
/// <summary>
/// Indicates small tick miss.
/// </summary>
2020-09-25 19:11:27 +08:00
[Order(11)]
2020-09-29 15:32:02 +08:00
SmallTickMiss = 128,
2020-05-04 14:55:42 +08:00
/// <summary>
/// Indicates a small tick hit.
/// </summary>
2020-09-25 19:11:27 +08:00
[Description(@"S Tick")]
[Order(7)]
2020-05-04 14:55:42 +08:00
SmallTickHit,
/// <summary>
/// Indicates a large tick miss.
/// </summary>
2020-09-25 19:11:27 +08:00
[Order(10)]
2020-09-29 15:32:02 +08:00
LargeTickMiss = 192,
2020-05-04 14:55:42 +08:00
/// <summary>
/// Indicates a large tick hit.
/// </summary>
2020-09-25 19:11:27 +08:00
[Description(@"L Tick")]
[Order(6)]
LargeTickHit,
/// <summary>
/// Indicates a small bonus.
/// </summary>
[Description("S Bonus")]
[Order(9)]
2020-09-29 15:32:02 +08:00
SmallBonus = 254,
2020-09-25 19:11:27 +08:00
/// <summary>
2020-09-29 15:32:50 +08:00
/// Indicates a large bonus.
2020-09-25 19:11:27 +08:00
/// </summary>
[Description("L Bonus")]
[Order(8)]
2020-09-29 15:32:02 +08:00
LargeBonus = 320,
2020-09-29 13:41:50 +08:00
2020-09-29 15:32:50 +08:00
/// <summary>
/// Indicates a miss that should be ignored for scoring purposes.
/// </summary>
2020-09-29 13:41:50 +08:00
[Order(13)]
2020-09-29 15:32:02 +08:00
IgnoreMiss = 384,
2020-09-29 13:41:50 +08:00
2020-09-29 15:32:50 +08:00
/// <summary>
/// Indicates a hit that should be ignored for scoring purposes.
/// </summary>
2020-09-29 13:41:50 +08:00
[Order(12)]
IgnoreHit,
2020-09-25 19:11:27 +08:00
}
public static class HitResultExtensions
{
/// <summary>
2020-09-25 21:16:14 +08:00
/// Whether a <see cref="HitResult"/> increases/decreases the combo, and affects the combo portion of the score.
2020-09-25 19:11:27 +08:00
/// </summary>
public static bool AffectsCombo(this HitResult result)
{
switch (result)
{
case HitResult.Miss:
case HitResult.Meh:
case HitResult.Ok:
case HitResult.Good:
case HitResult.Great:
case HitResult.Perfect:
case HitResult.LargeTickHit:
case HitResult.LargeTickMiss:
return true;
default:
return false;
}
}
/// <summary>
2020-09-25 21:16:14 +08:00
/// Whether a <see cref="HitResult"/> affects the accuracy portion of the score.
/// </summary>
public static bool AffectsAccuracy(this HitResult result)
=> IsScorable(result) && !IsBonus(result);
/// <summary>
/// Whether a <see cref="HitResult"/> should be counted as bonus score.
2020-09-25 19:11:27 +08:00
/// </summary>
public static bool IsBonus(this HitResult result)
{
switch (result)
{
case HitResult.SmallBonus:
case HitResult.LargeBonus:
return true;
default:
return false;
}
}
/// <summary>
/// Whether a <see cref="HitResult"/> represents a successful hit.
/// </summary>
public static bool IsHit(this HitResult result)
{
switch (result)
{
case HitResult.None:
2020-09-29 13:41:50 +08:00
case HitResult.IgnoreMiss:
2020-09-25 19:11:27 +08:00
case HitResult.Miss:
case HitResult.SmallTickMiss:
case HitResult.LargeTickMiss:
return false;
default:
return true;
}
}
/// <summary>
/// Whether a <see cref="HitResult"/> is scorable.
/// </summary>
2020-09-29 13:41:50 +08:00
public static bool IsScorable(this HitResult result) => result >= HitResult.Miss && result < HitResult.IgnoreMiss;
2018-04-13 17:19:50 +08:00
}
}