diff --git a/osu.Game/Rulesets/Scoring/ScoreProcessor.cs b/osu.Game/Rulesets/Scoring/ScoreProcessor.cs
index 9d12daad04..70d7f0fe37 100644
--- a/osu.Game/Rulesets/Scoring/ScoreProcessor.cs
+++ b/osu.Game/Rulesets/Scoring/ScoreProcessor.cs
@@ -56,6 +56,14 @@ public partial class ScoreProcessor : JudgementProcessor
///
public readonly BindableLong TotalScore = new BindableLong { MinValue = 0 };
+ ///
+ /// The total number of points awarded for the score without including mod multipliers.
+ ///
+ ///
+ /// The purpose of this property is to enable future lossless rebalances of mod multipliers.
+ ///
+ public readonly BindableLong TotalScoreWithoutMods = new BindableLong { MinValue = 0 };
+
///
/// The current accuracy.
///
@@ -363,7 +371,8 @@ private void updateScore()
double comboProgress = maximumComboPortion > 0 ? currentComboPortion / maximumComboPortion : 1;
double accuracyProcess = maximumAccuracyJudgementCount > 0 ? (double)currentAccuracyJudgementCount / maximumAccuracyJudgementCount : 1;
- TotalScore.Value = (long)Math.Round(ComputeTotalScore(comboProgress, accuracyProcess, currentBonusPortion) * scoreMultiplier);
+ TotalScoreWithoutMods.Value = (long)Math.Round(ComputeTotalScore(comboProgress, accuracyProcess, currentBonusPortion));
+ TotalScore.Value = (long)Math.Round(TotalScoreWithoutMods.Value * scoreMultiplier);
}
private void updateRank()
@@ -446,6 +455,7 @@ public virtual void PopulateScore(ScoreInfo score)
score.MaximumStatistics[result] = MaximumResultCounts.GetValueOrDefault(result);
// Populate total score after everything else.
+ score.TotalScoreWithoutMods = TotalScoreWithoutMods.Value;
score.TotalScore = TotalScore.Value;
}