1
0
mirror of https://github.com/ppy/osu.git synced 2025-01-12 15:22:55 +08:00

Merge pull request #27114 from EVAST9919/judgements-rework

Cache created judgement in `HitObject`
This commit is contained in:
Dean Herbert 2024-02-18 18:07:58 +08:00 committed by GitHub
commit 4d4d69521f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
12 changed files with 37 additions and 29 deletions

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

@ -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

@ -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

@ -175,7 +175,7 @@ namespace osu.Game.Tests.Gameplay
var hitObject = new HitObject { StartTime = Time.Current }; var hitObject = new HitObject { StartTime = Time.Current };
lifetimeEntry = new HitObjectLifetimeEntry(hitObject) lifetimeEntry = new HitObjectLifetimeEntry(hitObject)
{ {
Result = new JudgementResult(hitObject, hitObject.CreateJudgement()) Result = new JudgementResult(hitObject, hitObject.Judgement)
{ {
Type = HitResult.Great Type = HitResult.Great
} }

View File

@ -129,10 +129,10 @@ namespace osu.Game.Tests.Gameplay
var scoreProcessor = new ScoreProcessor(new OsuRuleset()); var scoreProcessor = new ScoreProcessor(new OsuRuleset());
scoreProcessor.ApplyBeatmap(beatmap); scoreProcessor.ApplyBeatmap(beatmap);
scoreProcessor.ApplyResult(new JudgementResult(beatmap.HitObjects[0], beatmap.HitObjects[0].CreateJudgement()) { Type = HitResult.Ok }); scoreProcessor.ApplyResult(new JudgementResult(beatmap.HitObjects[0], beatmap.HitObjects[0].Judgement) { Type = HitResult.Ok });
scoreProcessor.ApplyResult(new JudgementResult(beatmap.HitObjects[1], beatmap.HitObjects[1].CreateJudgement()) { Type = HitResult.LargeTickHit }); scoreProcessor.ApplyResult(new JudgementResult(beatmap.HitObjects[1], beatmap.HitObjects[1].Judgement) { Type = HitResult.LargeTickHit });
scoreProcessor.ApplyResult(new JudgementResult(beatmap.HitObjects[2], beatmap.HitObjects[2].CreateJudgement()) { Type = HitResult.SmallTickMiss }); scoreProcessor.ApplyResult(new JudgementResult(beatmap.HitObjects[2], beatmap.HitObjects[2].Judgement) { Type = HitResult.SmallTickMiss });
scoreProcessor.ApplyResult(new JudgementResult(beatmap.HitObjects[3], beatmap.HitObjects[3].CreateJudgement()) { Type = HitResult.SmallBonus }); scoreProcessor.ApplyResult(new JudgementResult(beatmap.HitObjects[3], beatmap.HitObjects[3].Judgement) { Type = HitResult.SmallBonus });
var score = new ScoreInfo { Ruleset = new OsuRuleset().RulesetInfo }; var score = new ScoreInfo { Ruleset = new OsuRuleset().RulesetInfo };
scoreProcessor.FailScore(score); scoreProcessor.FailScore(score);
@ -169,8 +169,8 @@ namespace osu.Game.Tests.Gameplay
Assert.That(scoreProcessor.MinimumAccuracy.Value, Is.EqualTo(0)); Assert.That(scoreProcessor.MinimumAccuracy.Value, Is.EqualTo(0));
Assert.That(scoreProcessor.MaximumAccuracy.Value, Is.EqualTo(1)); Assert.That(scoreProcessor.MaximumAccuracy.Value, Is.EqualTo(1));
scoreProcessor.ApplyResult(new JudgementResult(beatmap.HitObjects[0], beatmap.HitObjects[0].CreateJudgement()) { Type = HitResult.Ok }); scoreProcessor.ApplyResult(new JudgementResult(beatmap.HitObjects[0], beatmap.HitObjects[0].Judgement) { Type = HitResult.Ok });
scoreProcessor.ApplyResult(new JudgementResult(beatmap.HitObjects[1], beatmap.HitObjects[1].CreateJudgement()) { Type = HitResult.Great }); scoreProcessor.ApplyResult(new JudgementResult(beatmap.HitObjects[1], beatmap.HitObjects[1].Judgement) { Type = HitResult.Great });
Assert.That(scoreProcessor.Accuracy.Value, Is.EqualTo((double)(100 + 300) / (2 * 300)).Within(Precision.DOUBLE_EPSILON)); Assert.That(scoreProcessor.Accuracy.Value, Is.EqualTo((double)(100 + 300) / (2 * 300)).Within(Precision.DOUBLE_EPSILON));
Assert.That(scoreProcessor.MinimumAccuracy.Value, Is.EqualTo((double)(100 + 300) / (4 * 300)).Within(Precision.DOUBLE_EPSILON)); Assert.That(scoreProcessor.MinimumAccuracy.Value, Is.EqualTo((double)(100 + 300) / (4 * 300)).Within(Precision.DOUBLE_EPSILON));

View File

@ -112,7 +112,7 @@ namespace osu.Game.Tests.Rulesets.Scoring
for (int i = 0; i < 4; i++) for (int i = 0; i < 4; i++)
{ {
var judgementResult = new JudgementResult(fourObjectBeatmap.HitObjects[i], fourObjectBeatmap.HitObjects[i].CreateJudgement()) var judgementResult = new JudgementResult(fourObjectBeatmap.HitObjects[i], fourObjectBeatmap.HitObjects[i].Judgement)
{ {
Type = i == 2 ? minResult : hitResult Type = i == 2 ? minResult : hitResult
}; };
@ -141,7 +141,7 @@ namespace osu.Game.Tests.Rulesets.Scoring
for (int i = 0; i < object_count; ++i) for (int i = 0; i < object_count; ++i)
{ {
var judgementResult = new JudgementResult(largeBeatmap.HitObjects[i], largeBeatmap.HitObjects[i].CreateJudgement()) var judgementResult = new JudgementResult(largeBeatmap.HitObjects[i], largeBeatmap.HitObjects[i].Judgement)
{ {
Type = HitResult.Great Type = HitResult.Great
}; };
@ -325,11 +325,11 @@ namespace osu.Game.Tests.Rulesets.Scoring
scoreProcessor = new TestScoreProcessor(); scoreProcessor = new TestScoreProcessor();
scoreProcessor.ApplyBeatmap(beatmap); scoreProcessor.ApplyBeatmap(beatmap);
scoreProcessor.ApplyResult(new JudgementResult(beatmap.HitObjects[0], beatmap.HitObjects[0].CreateJudgement()) { Type = HitResult.Great }); scoreProcessor.ApplyResult(new JudgementResult(beatmap.HitObjects[0], beatmap.HitObjects[0].Judgement) { Type = HitResult.Great });
Assert.That(scoreProcessor.Combo.Value, Is.EqualTo(1)); Assert.That(scoreProcessor.Combo.Value, Is.EqualTo(1));
Assert.That(scoreProcessor.Accuracy.Value, Is.EqualTo(1)); Assert.That(scoreProcessor.Accuracy.Value, Is.EqualTo(1));
scoreProcessor.ApplyResult(new JudgementResult(beatmap.HitObjects[1], beatmap.HitObjects[1].CreateJudgement()) { Type = HitResult.ComboBreak }); scoreProcessor.ApplyResult(new JudgementResult(beatmap.HitObjects[1], beatmap.HitObjects[1].Judgement) { Type = HitResult.ComboBreak });
Assert.That(scoreProcessor.Combo.Value, Is.EqualTo(0)); Assert.That(scoreProcessor.Combo.Value, Is.EqualTo(0));
Assert.That(scoreProcessor.Accuracy.Value, Is.EqualTo(1)); Assert.That(scoreProcessor.Accuracy.Value, Is.EqualTo(1));
} }
@ -350,7 +350,7 @@ namespace osu.Game.Tests.Rulesets.Scoring
for (int i = 0; i < beatmap.HitObjects.Count; i++) for (int i = 0; i < beatmap.HitObjects.Count; i++)
{ {
scoreProcessor.ApplyResult(new JudgementResult(beatmap.HitObjects[i], beatmap.HitObjects[i].CreateJudgement()) scoreProcessor.ApplyResult(new JudgementResult(beatmap.HitObjects[i], beatmap.HitObjects[i].Judgement)
{ {
Type = i == 0 ? HitResult.Miss : HitResult.Great Type = i == 0 ? HitResult.Miss : HitResult.Great
}); });
@ -441,10 +441,7 @@ namespace osu.Game.Tests.Rulesets.Scoring
private readonly HitResult maxResult; private readonly HitResult maxResult;
private readonly HitResult? minResult; private readonly HitResult? minResult;
public override Judgement CreateJudgement() public override Judgement CreateJudgement() => new TestJudgement(maxResult, minResult);
{
return new TestJudgement(maxResult, minResult);
}
public TestHitObject(HitResult maxResult, HitResult? minResult = null) public TestHitObject(HitResult maxResult, HitResult? minResult = null)
{ {

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

@ -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

@ -163,8 +163,19 @@ namespace osu.Game.Rulesets.Objects
protected void AddNested(HitObject hitObject) => nestedHitObjects.Add(hitObject); protected void AddNested(HitObject hitObject) => nestedHitObjects.Add(hitObject);
/// <summary> /// <summary>
/// Creates the <see cref="Judgement"/> that represents the scoring information for this <see cref="HitObject"/>. /// The <see cref="Judgement"/> that represents the scoring information for this <see cref="HitObject"/>.
/// </summary> /// </summary>
[JsonIgnore]
public Judgement Judgement => judgement ??= CreateJudgement();
private Judgement judgement;
/// <summary>
/// Should be overridden to create a <see cref="Judgement"/> that represents the scoring information for this <see cref="HitObject"/>.
/// </summary>
/// <remarks>
/// For read access, use <see cref="Judgement"/> to avoid unnecessary allocations.
/// </remarks>
[NotNull] [NotNull]
public virtual Judgement CreateJudgement() => new Judgement(); public virtual Judgement CreateJudgement() => new Judgement();

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));
} }