ppy / osu

rhythm is just a *click* away!
https://osu.ppy.sh
MIT License
15.33k stars 2.28k forks source link

Rank glitching when clearing for the first time and getting top 50 #23834

Open Kiryonn opened 1 year ago

Kiryonn commented 1 year ago

Type

Game behaviour

Bug description

When clearing a song for the first time, the game will display a different personnal best score rank than the leaderboard rank.

lines of table:

  1. beating already existing highscore that was top50 (no bug)
  2. beating a song for the first time and get top 50 (bug)
  3. beating a song already played that wasn't top 50 yet (no bug)
  4. same as 3. but beating a song that wasn't played in a long time (no bug)

As you can see it only happens when you enter the top50 from beating the song for the first time

Screenshots or videos

before after
image image
image image
image image
image image

Version

2023.605.0-lazer

Logs

updater.log database.log input.log network.log performance.log

Kiryonn commented 1 year ago

More info: After restarting the game, the glitch is still there.

Kiryonn commented 1 year ago
More info: Here is a list of glitched ranking i found (non exhaustive) leaderboard personal best
49 38
21 11
45 19
41 11
40 31
48 2
48 49
22 18
40 22
46 6

I can't see a patern, and while most of the time it's a higher rank on the personal best, it's not always the case

y0rune commented 1 year ago

I was also very confused due to I played the map and got the "S" score but in the leaderboard the highest is the "A" score with more points. So what is the more important value the "S" score or the higher point value.

Version: 2023.610.0-lazer

Screenshot 2023-06-12 at 20 44 02

Kiryonn commented 1 year ago

i believe it is an unrelated issue @y0rune. I'm talking about how a same game score can get you 2 different visual ranks. To answer your question tho, the letter A and S are more about a precision indicator. While it does have an influence over your score, the most important thing is your combo. Your rank is then decided after the score is calculated. So the score is what matters

y0rune commented 1 year ago

All right! I saw that "issue" in your screenshots so I thought I can be related. Thank you!

Kiryonn commented 1 year ago

@y0rune well, in your case you also have a serious issue that a lot of people are mentionning. It's a problem linked to the changing of the calculation of scores. It's called score V2. The problem is that old scores that used V1, have a higher score with less performances, making it hard or even impossible to beat those highscores.

peppy commented 1 year ago

@Kiryonn so i can investigate further, could you please set a score on a fresh beatmap and leave it in the bad state rather than playing a second time?

Can you also link the beatmap and attach a screenshot showing your personal best / leaderboard as above?

I tested to make sure the sorting we're applying at our end is not having an adverse affect on this and it doesn't seem to be. Manual testing against a lot of beatmaps I had locally shows no assertion on this:

diff --git a/osu.Game/Screens/Select/Leaderboards/BeatmapLeaderboard.cs b/osu.Game/Screens/Select/Leaderboards/BeatmapLeaderboard.cs
index 4c41ed3622..d8079145e8 100644
--- a/osu.Game/Screens/Select/Leaderboards/BeatmapLeaderboard.cs
+++ b/osu.Game/Screens/Select/Leaderboards/BeatmapLeaderboard.cs
@@ -6,6 +6,7 @@
 using System.Diagnostics;
 using System.Linq;
 using System.Threading;
+using NUnit.Framework;
 using osu.Framework.Allocation;
 using osu.Framework.Bindables;
 using osu.Game.Beatmaps;
@@ -160,6 +161,14 @@ private void load()
                 if (!newRequest.Equals(scoreRetrievalRequest))
                     return;

+                var originalScores = response.Scores.Select(s => s.ToScoreInfo(rulesets, fetchBeatmapInfo)).OrderByTotalScore().ToArray();
+                var sortedScores = originalScores.OrderByTotalScore().ToArray();
+
+                for (int i = 0; i < originalScores.Length; i++)
+                {
+                    Debug.Assert(originalScores[i].OnlineID == sortedScores[i].OnlineID);
+                }
+
                 SetScores(
                     response.Scores.Select(s => s.ToScoreInfo(rulesets, fetchBeatmapInfo)).OrderByTotalScore(),
                     response.UserScore?.CreateScoreInfo(rulesets, fetchBeatmapInfo)
Kiryonn commented 1 year ago

Pretty sure it's a front end issue. Also i couldn't reproduce the bug 100% of the time even tho the condtitions where the same somehow.

Version

2023.617.0-lazer

Beatmap

https://osu.ppy.sh/beatmapsets/899955#osu/1879805

Screenshot

image

Log

database.log input.log network.log performance.log runtime.log updater.log