diff --git a/osu.Game/Rulesets/Scoring/ScoreProcessor.cs b/osu.Game/Rulesets/Scoring/ScoreProcessor.cs index 5712d9c94a..26a32ab1a0 100644 --- a/osu.Game/Rulesets/Scoring/ScoreProcessor.cs +++ b/osu.Game/Rulesets/Scoring/ScoreProcessor.cs @@ -168,43 +168,20 @@ namespace osu.Game.Rulesets.Scoring scoreResultCounts[result.Type] = scoreResultCounts.GetValueOrDefault(result.Type) + 1; + // Always update the maximum scoring values. + applyResult(result.Judgement.MaxResult, ref currentMaximumScoringValues); + currentMaximumScoringValues.MaxCombo += result.Judgement.MaxResult.IncreasesCombo() ? 1 : 0; + if (!result.Type.IsScorable()) - { - // The inverse of non-scorable (ignore) judgements may be bonus judgements. - if (result.Judgement.MaxResult.IsBonus()) - currentMaximumScoringValues.BonusScore += result.Judgement.MaxNumericResult; - return; - } - // Update rolling combo. if (result.Type.IncreasesCombo()) Combo.Value++; else if (result.Type.BreaksCombo()) Combo.Value = 0; - // Update maximum combo. + applyResult(result.Type, ref currentScoringValues); currentScoringValues.MaxCombo = HighestCombo.Value; - currentMaximumScoringValues.MaxCombo += result.Judgement.MaxResult.AffectsCombo() ? 1 : 0; - - // Update base/bonus score. - if (result.Type.IsBonus()) - { - currentScoringValues.BonusScore += result.Type.IsHit() ? result.Judgement.NumericResultFor(result) : 0; - currentMaximumScoringValues.BonusScore += result.Judgement.MaxNumericResult; - } - else - { - currentScoringValues.BaseScore += result.Type.IsHit() ? result.Judgement.NumericResultFor(result) : 0; - currentMaximumScoringValues.BaseScore += result.Judgement.MaxNumericResult; - } - - // Update hitobject count. - if (result.Type.IsBasic()) - { - currentScoringValues.HitObjects++; - currentMaximumScoringValues.HitObjects++; - } hitEvents.Add(CreateHitEvent(result)); lastHitObject = result.HitObject; @@ -212,6 +189,20 @@ namespace osu.Game.Rulesets.Scoring updateScore(); } + private static void applyResult(HitResult result, ref ScoringValues scoringValues) + { + if (!result.IsScorable()) + return; + + if (result.IsBonus()) + scoringValues.BonusScore += result.IsHit() ? Judgement.ToNumericResult(result) : 0; + else + scoringValues.BaseScore += result.IsHit() ? Judgement.ToNumericResult(result) : 0; + + if (result.IsBasic()) + scoringValues.HitObjects++; + } + /// /// Creates the that describes a . /// @@ -230,37 +221,15 @@ namespace osu.Game.Rulesets.Scoring scoreResultCounts[result.Type] = scoreResultCounts.GetValueOrDefault(result.Type) - 1; + // Always update the maximum scoring values. + revertResult(result.Judgement.MaxResult, ref currentMaximumScoringValues); + currentMaximumScoringValues.MaxCombo -= result.Judgement.MaxResult.IncreasesCombo() ? 1 : 0; + if (!result.Type.IsScorable()) - { - // The inverse of non-scorable (ignore) judgements may be bonus judgements. - if (result.Judgement.MaxResult.IsBonus()) - currentMaximumScoringValues.BonusScore -= result.Judgement.MaxNumericResult; - return; - } - // Update maximum combo. + revertResult(result.Type, ref currentScoringValues); currentScoringValues.MaxCombo = HighestCombo.Value; - currentMaximumScoringValues.MaxCombo -= result.Judgement.MaxResult.AffectsCombo() ? 1 : 0; - - // Update base/bonus score. - if (result.Type.IsBonus()) - { - currentScoringValues.BonusScore -= result.Type.IsHit() ? result.Judgement.NumericResultFor(result) : 0; - currentMaximumScoringValues.BonusScore -= result.Judgement.MaxNumericResult; - } - else - { - currentScoringValues.BaseScore -= result.Type.IsHit() ? result.Judgement.NumericResultFor(result) : 0; - currentMaximumScoringValues.BaseScore -= result.Judgement.MaxNumericResult; - } - - // Update hitobject count. - if (result.Type.IsBasic()) - { - currentScoringValues.HitObjects--; - currentMaximumScoringValues.HitObjects--; - } Debug.Assert(hitEvents.Count > 0); lastHitObject = hitEvents[^1].LastHitObject; @@ -269,6 +238,20 @@ namespace osu.Game.Rulesets.Scoring updateScore(); } + private static void revertResult(HitResult result, ref ScoringValues scoringValues) + { + if (!result.IsScorable()) + return; + + if (result.IsBonus()) + scoringValues.BonusScore -= result.IsHit() ? Judgement.ToNumericResult(result) : 0; + else + scoringValues.BaseScore -= result.IsHit() ? Judgement.ToNumericResult(result) : 0; + + if (result.IsBasic()) + scoringValues.HitObjects--; + } + private void updateScore() { Accuracy.Value = currentMaximumScoringValues.BaseScore > 0 ? currentScoringValues.BaseScore / currentMaximumScoringValues.BaseScore : 1;