1
0
mirror of https://github.com/ppy/osu.git synced 2024-09-21 12:47:23 +08:00

Cache created judgement in HitObject

This commit is contained in:
Andrei Zavatski 2024-02-09 23:20:31 +03:00
parent 0ebea77392
commit c500264306
41 changed files with 54 additions and 46 deletions

View File

@ -80,7 +80,7 @@ namespace osu.Game.Rulesets.Catch.Tests
{ {
fruit.ApplyDefaults(new ControlPointInfo(), new BeatmapDifficulty()); fruit.ApplyDefaults(new ControlPointInfo(), new BeatmapDifficulty());
var drawableFruit = new DrawableFruit(fruit) { X = x }; var drawableFruit = new DrawableFruit(fruit) { X = x };
var judgement = fruit.CreateJudgement(); var judgement = fruit.Judgement;
catcher.OnNewResult(drawableFruit, new CatchJudgementResult(fruit, judgement) catcher.OnNewResult(drawableFruit, new CatchJudgementResult(fruit, judgement)
{ {
Type = judgement.MaxResult Type = judgement.MaxResult

View File

@ -293,7 +293,7 @@ namespace osu.Game.Rulesets.Catch.Tests
private JudgementResult createResult(CatchHitObject hitObject) private JudgementResult createResult(CatchHitObject hitObject)
{ {
return new CatchJudgementResult(hitObject, hitObject.CreateJudgement()) return new CatchJudgementResult(hitObject, hitObject.Judgement)
{ {
Type = catcher.CanCatch(hitObject) ? HitResult.Great : HitResult.Miss Type = catcher.CanCatch(hitObject) ? HitResult.Great : HitResult.Miss
}; };

View File

@ -20,7 +20,7 @@ namespace osu.Game.Rulesets.Catch.Objects
/// </summary> /// </summary>
public int BananaIndex; public int BananaIndex;
public override Judgement CreateJudgement() => new CatchBananaJudgement(); protected override Judgement CreateJudgement() => new CatchBananaJudgement();
private static readonly IList<HitSampleInfo> default_banana_samples = new List<HitSampleInfo> { new BananaHitSampleInfo() }.AsReadOnly(); private static readonly IList<HitSampleInfo> default_banana_samples = new List<HitSampleInfo> { new BananaHitSampleInfo() }.AsReadOnly();

View File

@ -13,7 +13,7 @@ namespace osu.Game.Rulesets.Catch.Objects
{ {
public override bool LastInCombo => true; public override bool LastInCombo => true;
public override Judgement CreateJudgement() => new IgnoreJudgement(); protected override Judgement CreateJudgement() => new IgnoreJudgement();
protected override void CreateNestedHitObjects(CancellationToken cancellationToken) protected override void CreateNestedHitObjects(CancellationToken cancellationToken)
{ {

View File

@ -8,6 +8,6 @@ namespace osu.Game.Rulesets.Catch.Objects
{ {
public class Droplet : PalpableCatchHitObject public class Droplet : PalpableCatchHitObject
{ {
public override Judgement CreateJudgement() => new CatchDropletJudgement(); protected override Judgement CreateJudgement() => new CatchDropletJudgement();
} }
} }

View File

@ -8,7 +8,7 @@ namespace osu.Game.Rulesets.Catch.Objects
{ {
public class Fruit : PalpableCatchHitObject public class Fruit : PalpableCatchHitObject
{ {
public override Judgement CreateJudgement() => new CatchJudgement(); protected override Judgement CreateJudgement() => new CatchJudgement();
public static FruitVisualRepresentation GetVisualRepresentation(int indexInBeatmap) => (FruitVisualRepresentation)(indexInBeatmap % 4); public static FruitVisualRepresentation GetVisualRepresentation(int indexInBeatmap) => (FruitVisualRepresentation)(indexInBeatmap % 4);
} }

View File

@ -23,7 +23,7 @@ namespace osu.Game.Rulesets.Catch.Objects
/// </summary> /// </summary>
private const float base_scoring_distance = 100; private const float base_scoring_distance = 100;
public override Judgement CreateJudgement() => new IgnoreJudgement(); protected override Judgement CreateJudgement() => new IgnoreJudgement();
public int RepeatCount { get; set; } public int RepeatCount { get; set; }

View File

@ -8,6 +8,6 @@ namespace osu.Game.Rulesets.Catch.Objects
{ {
public class TinyDroplet : Droplet public class TinyDroplet : Droplet
{ {
public override Judgement CreateJudgement() => new CatchTinyDropletJudgement(); protected override Judgement CreateJudgement() => new CatchTinyDropletJudgement();
} }
} }

View File

@ -19,6 +19,6 @@ namespace osu.Game.Rulesets.Mania.Objects
set => major.Value = value; set => major.Value = value;
} }
public override Judgement CreateJudgement() => new IgnoreJudgement(); protected override Judgement CreateJudgement() => new IgnoreJudgement();
} }
} }

View File

@ -112,7 +112,7 @@ namespace osu.Game.Rulesets.Mania.Objects
}); });
} }
public override Judgement CreateJudgement() => new IgnoreJudgement(); protected override Judgement CreateJudgement() => new IgnoreJudgement();
protected override HitWindows CreateHitWindows() => HitWindows.Empty; protected override HitWindows CreateHitWindows() => HitWindows.Empty;

View File

@ -15,7 +15,7 @@ namespace osu.Game.Rulesets.Mania.Objects
/// </summary> /// </summary>
public class HoldNoteBody : ManiaHitObject public class HoldNoteBody : ManiaHitObject
{ {
public override Judgement CreateJudgement() => new HoldNoteBodyJudgement(); protected override Judgement CreateJudgement() => new HoldNoteBodyJudgement();
protected override HitWindows CreateHitWindows() => HitWindows.Empty; protected override HitWindows CreateHitWindows() => HitWindows.Empty;
} }
} }

View File

@ -11,6 +11,6 @@ namespace osu.Game.Rulesets.Mania.Objects
/// </summary> /// </summary>
public class Note : ManiaHitObject public class Note : ManiaHitObject
{ {
public override Judgement CreateJudgement() => new ManiaJudgement(); protected override Judgement CreateJudgement() => new ManiaJudgement();
} }
} }

View File

@ -18,7 +18,7 @@ namespace osu.Game.Rulesets.Mania.Objects
/// </summary> /// </summary>
public const double RELEASE_WINDOW_LENIENCE = 1.5; public const double RELEASE_WINDOW_LENIENCE = 1.5;
public override Judgement CreateJudgement() => new ManiaJudgement(); protected override Judgement CreateJudgement() => new ManiaJudgement();
public override double MaximumJudgementOffset => base.MaximumJudgementOffset * RELEASE_WINDOW_LENIENCE; public override double MaximumJudgementOffset => base.MaximumJudgementOffset * RELEASE_WINDOW_LENIENCE;
} }

View File

@ -134,7 +134,7 @@ namespace osu.Game.Rulesets.Osu.Tests
// multipled by 2 to nullify the score multiplier. (autoplay mod selected) // multipled by 2 to nullify the score multiplier. (autoplay mod selected)
long totalScore = scoreProcessor.TotalScore.Value * 2; long totalScore = scoreProcessor.TotalScore.Value * 2;
return totalScore == (int)(drawableSpinner.Result.TotalRotation / 360) * scoreProcessor.GetBaseScoreForResult(new SpinnerTick().CreateJudgement().MaxResult); return totalScore == (int)(drawableSpinner.Result.TotalRotation / 360) * scoreProcessor.GetBaseScoreForResult(new SpinnerTick().Judgement.MaxResult);
}); });
addSeekStep(0); addSeekStep(0);

View File

@ -79,7 +79,7 @@ namespace osu.Game.Rulesets.Osu.Mods
{ {
} }
public override Judgement CreateJudgement() => new OsuJudgement(); protected override Judgement CreateJudgement() => new OsuJudgement();
} }
private partial class StrictTrackingDrawableSliderTail : DrawableSliderTail private partial class StrictTrackingDrawableSliderTail : DrawableSliderTail

View File

@ -8,6 +8,6 @@ namespace osu.Game.Rulesets.Osu.Objects
{ {
public class HitCircle : OsuHitObject public class HitCircle : OsuHitObject
{ {
public override Judgement CreateJudgement() => new OsuJudgement(); protected override Judgement CreateJudgement() => new OsuJudgement();
} }
} }

View File

@ -275,7 +275,7 @@ namespace osu.Game.Rulesets.Osu.Objects
TailSamples = this.GetNodeSamples(repeatCount + 1); TailSamples = this.GetNodeSamples(repeatCount + 1);
} }
public override Judgement CreateJudgement() => ClassicSliderBehaviour protected override Judgement CreateJudgement() => ClassicSliderBehaviour
// Final combo is provided by the slider itself - see logic in `DrawableSlider.CheckForResult()` // Final combo is provided by the slider itself - see logic in `DrawableSlider.CheckForResult()`
? new OsuJudgement() ? new OsuJudgement()
// Final combo is provided by the tail circle - see `SliderTailCircle` // Final combo is provided by the tail circle - see `SliderTailCircle`

View File

@ -46,7 +46,7 @@ namespace osu.Game.Rulesets.Osu.Objects
protected override HitWindows CreateHitWindows() => HitWindows.Empty; protected override HitWindows CreateHitWindows() => HitWindows.Empty;
public override Judgement CreateJudgement() => new SliderEndJudgement(); protected override Judgement CreateJudgement() => new SliderEndJudgement();
public class SliderEndJudgement : OsuJudgement public class SliderEndJudgement : OsuJudgement
{ {

View File

@ -14,6 +14,6 @@ namespace osu.Game.Rulesets.Osu.Objects
/// </summary> /// </summary>
public bool ClassicSliderBehaviour; public bool ClassicSliderBehaviour;
public override Judgement CreateJudgement() => ClassicSliderBehaviour ? new SliderTickJudgement() : base.CreateJudgement(); protected override Judgement CreateJudgement() => ClassicSliderBehaviour ? new SliderTickJudgement() : base.CreateJudgement();
} }
} }

View File

@ -20,7 +20,7 @@ namespace osu.Game.Rulesets.Osu.Objects
{ {
} }
public override Judgement CreateJudgement() => ClassicSliderBehaviour ? new LegacyTailJudgement() : new TailJudgement(); protected override Judgement CreateJudgement() => ClassicSliderBehaviour ? new LegacyTailJudgement() : new TailJudgement();
public class LegacyTailJudgement : OsuJudgement public class LegacyTailJudgement : OsuJudgement
{ {

View File

@ -32,6 +32,6 @@ namespace osu.Game.Rulesets.Osu.Objects
protected override HitWindows CreateHitWindows() => HitWindows.Empty; protected override HitWindows CreateHitWindows() => HitWindows.Empty;
public override Judgement CreateJudgement() => new SliderTickJudgement(); protected override Judgement CreateJudgement() => new SliderTickJudgement();
} }
} }

View File

@ -95,7 +95,7 @@ namespace osu.Game.Rulesets.Osu.Objects
} }
} }
public override Judgement CreateJudgement() => new OsuJudgement(); protected override Judgement CreateJudgement() => new OsuJudgement();
protected override HitWindows CreateHitWindows() => HitWindows.Empty; protected override HitWindows CreateHitWindows() => HitWindows.Empty;

View File

@ -8,7 +8,7 @@ namespace osu.Game.Rulesets.Osu.Objects
{ {
public class SpinnerBonusTick : SpinnerTick public class SpinnerBonusTick : SpinnerTick
{ {
public override Judgement CreateJudgement() => new OsuSpinnerBonusTickJudgement(); protected override Judgement CreateJudgement() => new OsuSpinnerBonusTickJudgement();
public class OsuSpinnerBonusTickJudgement : OsuSpinnerTickJudgement public class OsuSpinnerBonusTickJudgement : OsuSpinnerTickJudgement
{ {

View File

@ -14,7 +14,7 @@ namespace osu.Game.Rulesets.Osu.Objects
/// </summary> /// </summary>
public double SpinnerDuration { get; set; } public double SpinnerDuration { get; set; }
public override Judgement CreateJudgement() => new OsuSpinnerTickJudgement(); protected override Judgement CreateJudgement() => new OsuSpinnerTickJudgement();
protected override HitWindows CreateHitWindows() => HitWindows.Empty; protected override HitWindows CreateHitWindows() => HitWindows.Empty;

View File

@ -126,11 +126,11 @@ namespace osu.Game.Rulesets.Taiko.Tests
foreach (var nested in beatmap.HitObjects[0].NestedHitObjects) foreach (var nested in beatmap.HitObjects[0].NestedHitObjects)
{ {
var nestedJudgement = nested.CreateJudgement(); var nestedJudgement = nested.Judgement;
healthProcessor.ApplyResult(new JudgementResult(nested, nestedJudgement) { Type = nestedJudgement.MaxResult }); healthProcessor.ApplyResult(new JudgementResult(nested, nestedJudgement) { Type = nestedJudgement.MaxResult });
} }
var judgement = beatmap.HitObjects[0].CreateJudgement(); var judgement = beatmap.HitObjects[0].Judgement;
healthProcessor.ApplyResult(new JudgementResult(beatmap.HitObjects[0], judgement) { Type = judgement.MaxResult }); healthProcessor.ApplyResult(new JudgementResult(beatmap.HitObjects[0], judgement) { Type = judgement.MaxResult });
Assert.Multiple(() => Assert.Multiple(() =>
@ -159,11 +159,11 @@ namespace osu.Game.Rulesets.Taiko.Tests
foreach (var nested in beatmap.HitObjects[0].NestedHitObjects) foreach (var nested in beatmap.HitObjects[0].NestedHitObjects)
{ {
var nestedJudgement = nested.CreateJudgement(); var nestedJudgement = nested.Judgement;
healthProcessor.ApplyResult(new JudgementResult(nested, nestedJudgement) { Type = nestedJudgement.MaxResult }); healthProcessor.ApplyResult(new JudgementResult(nested, nestedJudgement) { Type = nestedJudgement.MaxResult });
} }
var judgement = beatmap.HitObjects[0].CreateJudgement(); var judgement = beatmap.HitObjects[0].Judgement;
healthProcessor.ApplyResult(new JudgementResult(beatmap.HitObjects[0], judgement) { Type = judgement.MaxResult }); healthProcessor.ApplyResult(new JudgementResult(beatmap.HitObjects[0], judgement) { Type = judgement.MaxResult });
Assert.Multiple(() => Assert.Multiple(() =>

View File

@ -19,6 +19,6 @@ namespace osu.Game.Rulesets.Taiko.Objects
set => major.Value = value; set => major.Value = value;
} }
public override Judgement CreateJudgement() => new IgnoreJudgement(); protected override Judgement CreateJudgement() => new IgnoreJudgement();
} }
} }

View File

@ -90,7 +90,7 @@ namespace osu.Game.Rulesets.Taiko.Objects
} }
} }
public override Judgement CreateJudgement() => new IgnoreJudgement(); protected override Judgement CreateJudgement() => new IgnoreJudgement();
protected override HitWindows CreateHitWindows() => HitWindows.Empty; protected override HitWindows CreateHitWindows() => HitWindows.Empty;
@ -103,7 +103,7 @@ namespace osu.Game.Rulesets.Taiko.Objects
public class StrongNestedHit : StrongNestedHitObject public class StrongNestedHit : StrongNestedHitObject
{ {
// The strong hit of the drum roll doesn't actually provide any score. // The strong hit of the drum roll doesn't actually provide any score.
public override Judgement CreateJudgement() => new IgnoreJudgement(); protected override Judgement CreateJudgement() => new IgnoreJudgement();
public StrongNestedHit(TaikoHitObject parent) public StrongNestedHit(TaikoHitObject parent)
: base(parent) : base(parent)

View File

@ -32,7 +32,7 @@ namespace osu.Game.Rulesets.Taiko.Objects
Parent = parent; Parent = parent;
} }
public override Judgement CreateJudgement() => new TaikoDrumRollTickJudgement(); protected override Judgement CreateJudgement() => new TaikoDrumRollTickJudgement();
protected override HitWindows CreateHitWindows() => HitWindows.Empty; protected override HitWindows CreateHitWindows() => HitWindows.Empty;

View File

@ -7,6 +7,6 @@ namespace osu.Game.Rulesets.Taiko.Objects
{ {
public class IgnoreHit : Hit public class IgnoreHit : Hit
{ {
public override Judgement CreateJudgement() => new IgnoreJudgement(); protected override Judgement CreateJudgement() => new IgnoreJudgement();
} }
} }

View File

@ -20,7 +20,7 @@ namespace osu.Game.Rulesets.Taiko.Objects
Parent = parent; Parent = parent;
} }
public override Judgement CreateJudgement() => new TaikoStrongJudgement(); protected override Judgement CreateJudgement() => new TaikoStrongJudgement();
protected override HitWindows CreateHitWindows() => HitWindows.Empty; protected override HitWindows CreateHitWindows() => HitWindows.Empty;
} }

View File

@ -38,7 +38,7 @@ namespace osu.Game.Rulesets.Taiko.Objects
} }
} }
public override Judgement CreateJudgement() => new TaikoSwellJudgement(); protected override Judgement CreateJudgement() => new TaikoSwellJudgement();
protected override HitWindows CreateHitWindows() => HitWindows.Empty; protected override HitWindows CreateHitWindows() => HitWindows.Empty;
} }

View File

@ -8,7 +8,7 @@ namespace osu.Game.Rulesets.Taiko.Objects
{ {
public class SwellTick : TaikoHitObject public class SwellTick : TaikoHitObject
{ {
public override Judgement CreateJudgement() => new IgnoreJudgement(); protected override Judgement CreateJudgement() => new IgnoreJudgement();
protected override HitWindows CreateHitWindows() => HitWindows.Empty; protected override HitWindows CreateHitWindows() => HitWindows.Empty;
} }

View File

@ -16,7 +16,7 @@ namespace osu.Game.Rulesets.Taiko.Objects
/// </summary> /// </summary>
public const float DEFAULT_SIZE = 0.475f; public const float DEFAULT_SIZE = 0.475f;
public override Judgement CreateJudgement() => new TaikoJudgement(); protected override Judgement CreateJudgement() => new TaikoJudgement();
protected override HitWindows CreateHitWindows() => new TaikoHitWindows(); protected override HitWindows CreateHitWindows() => new TaikoHitWindows();
} }

View File

@ -94,7 +94,7 @@ namespace osu.Game.Beatmaps
static void addCombo(HitObject hitObject, ref int combo) static void addCombo(HitObject hitObject, ref int combo)
{ {
if (hitObject.CreateJudgement().MaxResult.AffectsCombo()) if (hitObject.Judgement.MaxResult.AffectsCombo())
combo++; combo++;
foreach (var nested in hitObject.NestedHitObjects) foreach (var nested in hitObject.NestedHitObjects)

View File

@ -655,7 +655,7 @@ namespace osu.Game.Database
{ {
private readonly Judgement judgement; private readonly Judgement judgement;
public override Judgement CreateJudgement() => judgement; protected override Judgement CreateJudgement() => judgement;
public FakeHit(Judgement judgement) public FakeHit(Judgement judgement)
{ {

View File

@ -113,9 +113,9 @@ namespace osu.Game.Rulesets.Difficulty
private IEnumerable<HitResult> getPerfectHitResults(HitObject hitObject) private IEnumerable<HitResult> getPerfectHitResults(HitObject hitObject)
{ {
foreach (HitObject nested in hitObject.NestedHitObjects) foreach (HitObject nested in hitObject.NestedHitObjects)
yield return nested.CreateJudgement().MaxResult; yield return nested.Judgement.MaxResult;
yield return hitObject.CreateJudgement().MaxResult; yield return hitObject.Judgement.MaxResult;
} }
} }
} }

View File

@ -770,7 +770,7 @@ namespace osu.Game.Rulesets.Objects.Drawables
private void ensureEntryHasResult() private void ensureEntryHasResult()
{ {
Debug.Assert(Entry != null); Debug.Assert(Entry != null);
Entry.Result ??= CreateResult(HitObject.CreateJudgement()) Entry.Result ??= CreateResult(HitObject.Judgement)
?? throw new InvalidOperationException($"{GetType().ReadableName()} must provide a {nameof(JudgementResult)} through {nameof(CreateResult)}."); ?? throw new InvalidOperationException($"{GetType().ReadableName()} must provide a {nameof(JudgementResult)} through {nameof(CreateResult)}.");
} }

View File

@ -162,11 +162,19 @@ namespace osu.Game.Rulesets.Objects
protected void AddNested(HitObject hitObject) => nestedHitObjects.Add(hitObject); protected void AddNested(HitObject hitObject) => nestedHitObjects.Add(hitObject);
/// <summary>
/// The <see cref="Judgement"/> that represents the scoring information for this <see cref="HitObject"/>.
/// </summary>
[JsonIgnore]
public Judgement Judgement => judgement ??= CreateJudgement();
private Judgement judgement;
/// <summary> /// <summary>
/// Creates the <see cref="Judgement"/> that represents the scoring information for this <see cref="HitObject"/>. /// Creates the <see cref="Judgement"/> that represents the scoring information for this <see cref="HitObject"/>.
/// </summary> /// </summary>
[NotNull] [NotNull]
public virtual Judgement CreateJudgement() => new Judgement(); protected virtual Judgement CreateJudgement() => new Judgement();
/// <summary> /// <summary>
/// Creates the <see cref="HitWindows"/> for this <see cref="HitObject"/>. /// Creates the <see cref="HitWindows"/> for this <see cref="HitObject"/>.

View File

@ -16,7 +16,7 @@ namespace osu.Game.Rulesets.Objects.Legacy
public int ComboOffset { get; set; } public int ComboOffset { get; set; }
public override Judgement CreateJudgement() => new IgnoreJudgement(); protected override Judgement CreateJudgement() => new IgnoreJudgement();
protected override HitWindows CreateHitWindows() => HitWindows.Empty; protected override HitWindows CreateHitWindows() => HitWindows.Empty;
} }

View File

@ -149,7 +149,7 @@ namespace osu.Game.Rulesets.Scoring
foreach (var obj in EnumerateHitObjects(beatmap)) foreach (var obj in EnumerateHitObjects(beatmap))
{ {
var judgement = obj.CreateJudgement(); var judgement = obj.Judgement;
var result = CreateResult(obj, judgement); var result = CreateResult(obj, judgement);
if (result == null) if (result == null)

View File

@ -141,7 +141,7 @@ namespace osu.Game.Rulesets.Scoring
void increaseHp(HitObject hitObject) void increaseHp(HitObject hitObject)
{ {
double amount = GetHealthIncreaseFor(hitObject, hitObject.CreateJudgement().MaxResult); double amount = GetHealthIncreaseFor(hitObject, hitObject.Judgement.MaxResult);
currentHpUncapped += amount; currentHpUncapped += amount;
currentHp = Math.Max(0, Math.Min(1, currentHp + amount)); currentHp = Math.Max(0, Math.Min(1, currentHp + amount));
} }