From c0ee654df4e01d7507e6b9ca19563e27114fb2bc Mon Sep 17 00:00:00 2001 From: oldcrate <139006122+oldcrate@users.noreply.github.com> Date: Thu, 3 Sep 2026 12:18:04 +0200 Subject: [PATCH 1/4] fix: assign ModsMultiplier correctly --- scripts/game/Attempt.cs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/scripts/game/Attempt.cs b/scripts/game/Attempt.cs index 0f51bcd7..9c7e23bf 100644 --- a/scripts/game/Attempt.cs +++ b/scripts/game/Attempt.cs @@ -82,6 +82,14 @@ public Attempt(Map map, double speed, double startFrom, CameraMode cameraMode, L Objects[typeof(Note)] = [.. map.Notes]; HitsInfo = IsReplay ? Replays[0].Notes : new float[Map.Notes.Length]; + if (Modifiers.Count >= 1) + { + foreach (Modifier modifier in Modifiers) + { + ModsMultiplier += modifier.ScoreMultiplier - 1; + } + } + if (IsReplay) { foreach (var replay in Replays) From 2b2335972166cd8bf4b0c5e2e4bae4ab86d18f4a Mon Sep 17 00:00:00 2001 From: oldcrate <139006122+oldcrate@users.noreply.github.com> Date: Thu, 3 Sep 2026 12:20:06 +0200 Subject: [PATCH 2/4] feat: normalize scoring --- scripts/game/Attempt.cs | 13 ++++++++++++- scripts/game/Runner.cs | 8 ++++---- scripts/game/ui/PanelLeft.cs | 2 +- scripts/scenes/Results.cs | 2 +- 4 files changed, 18 insertions(+), 7 deletions(-) diff --git a/scripts/game/Attempt.cs b/scripts/game/Attempt.cs index 9c7e23bf..0b2aa645 100644 --- a/scripts/game/Attempt.cs +++ b/scripts/game/Attempt.cs @@ -36,7 +36,9 @@ public partial class Attempt : RefCounted public uint Hits = 0; public uint Misses = 0; public uint Sum = 0; - public uint Score = 0; + public double Score = 0; + public double UnitHitScore = 0; + public uint NoteWeight; public uint Combo = 0; public uint ComboMultiplier = 1; public uint ComboMultiplierProgress = 0; @@ -82,6 +84,13 @@ public Attempt(Map map, double speed, double startFrom, CameraMode cameraMode, L Objects[typeof(Note)] = [.. map.Notes]; HitsInfo = IsReplay ? Replays[0].Notes : new float[Map.Notes.Length]; + for (uint i = 1; i <= 7; i++) + { + NoteWeight += ComboMultiplierIncrement * i; + } + + NoteWeight += ((uint)Map.Notes.Length - ComboMultiplierIncrement * 7) * 8; + if (Modifiers.Count >= 1) { foreach (Modifier modifier in Modifiers) @@ -90,6 +99,8 @@ public Attempt(Map map, double speed, double startFrom, CameraMode cameraMode, L } } + UnitHitScore = 1000000f * ModsMultiplier * ((Speed - 1) / 2.5 + 1) / NoteWeight; + if (IsReplay) { foreach (var replay in Replays) diff --git a/scripts/game/Runner.cs b/scripts/game/Runner.cs index 164744df..e55c5f8c 100644 --- a/scripts/game/Runner.cs +++ b/scripts/game/Runner.cs @@ -410,13 +410,13 @@ public void Stop(bool results = true) Leaderboard leaderboard = new(Attempt.Map.Name, $"{Constants.USER_FOLDER}/pbs/{Attempt.Map.Name}"); - leaderboard.Add(new(Attempt.ID, "You", Attempt.Qualifies, Attempt.Score, Attempt.Accuracy, Time.GetUnixTimeFromSystem(), Attempt.Progress, Attempt.Map.Length, Speed, mods)); + leaderboard.Add(new(Attempt.ID, "You", Attempt.Qualifies, (ulong)Math.Round(Attempt.Score), Attempt.Accuracy, Time.GetUnixTimeFromSystem(), Attempt.Progress, Attempt.Map.Length, Speed, mods)); leaderboard.Save(); if (Attempt.Qualifies) { Stats.Instance.Passes++; - Stats.Instance.TotalScore += Attempt.Score; + Stats.Instance.TotalScore += (ulong)Math.Round(Attempt.Score); if (Attempt.Accuracy == 100) { @@ -425,7 +425,7 @@ public void Stop(bool results = true) if (Attempt.Score > Stats.Instance.HighestScore) { - Stats.Instance.HighestScore = Attempt.Score; + Stats.Instance.HighestScore = (ulong)Math.Round(Attempt.Score); } Stats.Instance.AverageAccuracy = (Stats.Instance.AverageAccuracy + Attempt.Accuracy) / Stats.Instance.Passes; @@ -445,7 +445,7 @@ private void onHitResultChanged(int noteIndex, HitResult hitResult) { float lateness = Attempt.IsReplay ? Attempt.HitsInfo[noteIndex] : (float)(((int)Attempt.Progress - Attempt.Map.Notes[noteIndex].Millisecond) / Speed); float factor = 1 - Math.Max(0, lateness - 25) / 150f; - uint hitScore = (uint)(100 * Attempt.ComboMultiplier * Attempt.ModsMultiplier * factor * ((Speed - 1) / 2.5 + 1)); + double hitScore = Attempt.UnitHitScore * Attempt.ComboMultiplier * factor; switch (hitResult) { diff --git a/scripts/game/ui/PanelLeft.cs b/scripts/game/ui/PanelLeft.cs index acdf74af..afe06e77 100644 --- a/scripts/game/ui/PanelLeft.cs +++ b/scripts/game/ui/PanelLeft.cs @@ -56,7 +56,7 @@ public override void _PhysicsProcess(double delta) public void OnStatsUpdated(Attempt attempt) { - score.Text = Util.String.PadMagnitude(attempt.Score.ToString()); + score.Text = Util.String.PadMagnitude(Math.Round(attempt.Score).ToString()); multiplier.Text = $"{attempt.ComboMultiplier}x"; altCombo.Text = $"{attempt.Combo}"; diff --git a/scripts/scenes/Results.cs b/scripts/scenes/Results.cs index 916e4664..03d7df32 100644 --- a/scripts/scenes/Results.cs +++ b/scripts/scenes/Results.cs @@ -35,7 +35,7 @@ public override void _Ready() holder.GetNode