2023-06-23 00:37:25 +08:00
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
2019-01-24 16:43:03 +08:00
// See the LICENCE file in the repository root for full licence text.
2018-08-02 19:35:54 +08:00
2023-02-09 16:15:37 +08:00
using System ;
2019-09-02 15:28:14 +08:00
using osu.Game.Rulesets.Objects ;
2018-08-06 09:55:38 +08:00
using osu.Game.Rulesets.Objects.Drawables ;
2018-08-02 19:35:54 +08:00
using osu.Game.Rulesets.Scoring ;
namespace osu.Game.Rulesets.Judgements
{
2018-08-06 09:55:38 +08:00
/// <summary>
/// The scoring result of a <see cref="DrawableHitObject"/>.
/// </summary>
2018-08-02 19:35:54 +08:00
public class JudgementResult
{
/// <summary>
/// Whether this <see cref="JudgementResult"/> is the result of a hit or a miss.
/// </summary>
public HitResult Type ;
/// <summary>
2019-09-02 16:14:40 +08:00
/// The <see cref="HitObject"/> which was judged.
2018-08-02 19:35:54 +08:00
/// </summary>
2019-09-02 16:14:40 +08:00
public readonly HitObject HitObject ;
2018-08-02 19:35:54 +08:00
/// <summary>
/// The <see cref="Judgement"/> which this <see cref="JudgementResult"/> applies for.
/// </summary>
public readonly Judgement Judgement ;
/// <summary>
2023-02-09 16:15:37 +08:00
/// The time at which this <see cref="JudgementResult"/> occurred.
2018-08-06 09:55:38 +08:00
/// Populated when this <see cref="JudgementResult"/> is applied via <see cref="DrawableHitObject.ApplyResult"/>.
2018-08-02 19:35:54 +08:00
/// </summary>
2023-02-09 16:15:37 +08:00
/// <remarks>
/// This is used instead of <see cref="TimeAbsolute"/> to check whether this <see cref="JudgementResult"/> should be reverted.
/// </remarks>
internal double? RawTime { get ; set ; }
2018-08-02 19:35:54 +08:00
2020-11-04 15:04:15 +08:00
/// <summary>
2023-02-09 16:15:37 +08:00
/// The offset of <see cref="TimeAbsolute"/> from the end time of <see cref="HitObject"/>, clamped by <see cref="osu.Game.Rulesets.Objects.HitObject.MaximumJudgementOffset"/>.
/// </summary>
public double TimeOffset
{
get = > RawTime ! = null ? Math . Min ( RawTime . Value - HitObject . GetEndTime ( ) , HitObject . MaximumJudgementOffset ) : 0 ;
internal set = > RawTime = HitObject . GetEndTime ( ) + value ;
}
/// <summary>
/// The absolute time at which this <see cref="JudgementResult"/> occurred, clamped by the end time of <see cref="HitObject"/> plus <see cref="osu.Game.Rulesets.Objects.HitObject.MaximumJudgementOffset"/>.
2020-11-04 15:04:15 +08:00
/// </summary>
2023-01-24 14:35:06 +08:00
/// <remarks>
2023-02-09 16:15:37 +08:00
/// The end time of <see cref="HitObject"/> is returned if this result is not populated yet.
2023-01-24 14:35:06 +08:00
/// </remarks>
2023-02-09 16:15:37 +08:00
public double TimeAbsolute = > RawTime ! = null ? Math . Min ( RawTime . Value , HitObject . GetEndTime ( ) + HitObject . MaximumJudgementOffset ) : HitObject . GetEndTime ( ) ;
2020-11-04 15:04:15 +08:00
2023-11-11 11:57:44 +08:00
/// <summary>
/// The gameplay rate at the time this <see cref="JudgementResult"/> occurred.
/// </summary>
2023-11-16 09:00:35 +08:00
public double? GameplayRate { get ; internal set ; }
2023-11-11 11:57:44 +08:00
2018-08-02 19:35:54 +08:00
/// <summary>
2018-08-06 09:55:38 +08:00
/// The combo prior to this <see cref="JudgementResult"/> occurring.
2018-08-02 19:35:54 +08:00
/// </summary>
public int ComboAtJudgement { get ; internal set ; }
2023-05-19 13:09:19 +08:00
/// <summary>
/// The combo after this <see cref="JudgementResult"/> occurred.
/// </summary>
public int ComboAfterJudgement { get ; internal set ; }
2018-08-02 19:35:54 +08:00
/// <summary>
2018-08-06 09:55:38 +08:00
/// The highest combo achieved prior to this <see cref="JudgementResult"/> occurring.
2018-08-02 19:35:54 +08:00
/// </summary>
public int HighestComboAtJudgement { get ; internal set ; }
2019-04-22 16:51:43 +08:00
/// <summary>
/// The health prior to this <see cref="JudgementResult"/> occurring.
/// </summary>
public double HealthAtJudgement { get ; internal set ; }
2019-08-09 11:29:58 +08:00
/// <summary>
/// Whether the user was in a failed state prior to this <see cref="JudgementResult"/> occurring.
/// </summary>
public bool FailedAtJudgement { get ; internal set ; }
2018-08-02 19:35:54 +08:00
/// <summary>
2018-08-06 09:55:38 +08:00
/// Whether a miss or hit occurred.
2018-08-02 19:35:54 +08:00
/// </summary>
public bool HasResult = > Type > HitResult . None ;
/// <summary>
/// Whether a successful hit occurred.
/// </summary>
2020-09-29 14:20:47 +08:00
public bool IsHit = > Type . IsHit ( ) ;
2018-08-02 19:35:54 +08:00
2024-01-16 14:52:05 +08:00
/// <summary>
/// The increase in health resulting from this judgement result.
/// </summary>
public double HealthIncrease = > Judgement . HealthIncreaseFor ( this ) ;
2018-08-06 09:55:38 +08:00
/// <summary>
/// Creates a new <see cref="JudgementResult"/>.
/// </summary>
2019-09-02 16:14:40 +08:00
/// <param name="hitObject">The <see cref="HitObject"/> which was judged.</param>
2018-08-06 09:55:38 +08:00
/// <param name="judgement">The <see cref="Judgement"/> to refer to for scoring information.</param>
2023-06-23 23:59:36 +08:00
public JudgementResult ( HitObject hitObject , Judgement judgement )
2018-08-02 19:35:54 +08:00
{
2019-09-02 16:14:40 +08:00
HitObject = hitObject ;
2018-08-02 19:35:54 +08:00
Judgement = judgement ;
2023-01-24 14:35:06 +08:00
Reset ( ) ;
}
internal void Reset ( )
{
Type = HitResult . None ;
2023-02-09 16:15:37 +08:00
RawTime = null ;
2018-08-02 19:35:54 +08:00
}
2019-02-21 20:22:16 +08:00
2023-12-20 19:23:43 +08:00
public override string ToString ( ) = > $"{Type} ({Judgement})" ;
2018-08-02 19:35:54 +08:00
}
}