-
-
Notifications
You must be signed in to change notification settings - Fork 2.3k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Object placements with HR do not match stable (osu!catch) #27425
Comments
For the second example and the off-by-one juice streams, osu!stable truncates end time: On lazer, the end time appears perfectly as 1918 (start time = 1843, path distance = 60, velocity = 0.8, therefore end time = 1843 + 60 / 0.8 = 1918). I'm not entirely sure how we can support this, and after sitting down and going through stable code, I cannot find a specific point at which I can emulate stable's behaviour. The closest I have reached is that, with this custom beatmap, specifically a juice stream with p1 = (0, 0) and p2 = (24, -64), stable calculates distance as 59.9999962, meanwhile lazer calculates distance as 60.0000038 and overwrites it by the |
The issue with beatmap example 4 does appear to be fixed by #27456 as well, so thats good. Issues with beatmap example 2 and 3 still occur, but thats not shocking. Either way, one step closer to full compatibility! |
I looked at the remaining cases briefly today but it's a bit grim. I am pretty sure that the reason for the discrepancy in the calculated path length between stable and lazer is caused by catastrophic cancellation. lazer's cumulative path calculation relies on
and across many segments, this gets obviously worse. The obvious thing would be to attempt to simulate this by just mirroring stable, but this is not currently doable because the hitobject conversion process for catch discards half of the information required here (namely, the Y position of the object pre-conversion). And changing that will not only be a whole lot of work, it also feels very stupid to do just for the sake of stable parity. @smoogipoo do you have any thoughts to offer here as someone who's spent some time on these sorts of problems already in #25725 etc.? |
I can't conclusively answer this either way at this time. |
Hi @smoogipoo @bdach, I have taken a look at the sewing machine example once more, and it does seem that this is fixed, here is proof: However the example of Deadly force - Put an end is not resolved. specifically, whatever creates the two additional droplets on this slider in stable still is not resolved in lazer (this means the randomization of all droplets after this point is incorrect, and the spinner is incorrect) Here is proof: |
Type
Game behaviour
Bug description
When playing HR on Lazer, many maps have objects that are in noticeably different spots compared to with Stable. This most likely is due to rounding differences between stable and lazer for JuiceStream velocity calculations seen in pull request 25725. Object randomization relies on the exact tiny droplet patterns generated throughout the map to get the randomization seed, if droplets are not the same, objects will not be in the same spot.
User Crafterdark created a parser version that allows you to generate the same json format for Stable ConversionMappings, but for Lazer. This can be used for quickly checking between the two files for a given timestamp, instead of running the test every time (especially since the test uses a leniency). I will be using that to show how off the objects are from stable. The tool can be found here. For our testing, we set the lenience = 3, because the misplacement grows so large on certain HR maps that it is no longer avoidable or unnoticeable in gameplay. This also means that the difficulty is no longer the same between the two games, as anywhere from a few, to many objects may be on entire different ends of the screen.
At BPM's 75, 150, 300, 600, etc, or close to these, precision loss is even higher than normal. If the map is one of these BPM's then almost every JuiceStream pattern has a high chance to have differences between the two versions of the game. In stable objects read from the .osu will consistently start either 1 ms early, or on time. The pattern of which is determined by the method stable uses to round double and float values. Since droplets can only generate when its been 101ms since a previous tick, this slight drifting of objects can cause droplets to generate or not generate sometimes. Lazer on the other hand does not have this object start time drifting, which is why we are seeing differences.
We are unsure exactly where this precision loss occurs in stable, so proposing fixes to this solution has been very difficult. The only proposed fix we can suggest to do is crosscheck stable, and ensure that the precision losses and the rest of the values are set correctly for object placement. (Call this a legacy generation, since it's full of precision losses that are inaccurate). However, you guys may be able to come up with a better solution!
It does seem that as the star rating increases, the more likely it becomes for maps to have object randomization issues. But it can happen to maps of any star rating, whether it's a map made specifically for CtB, or a map converted from Standard to CtB.
I also want to mention that although not every map has combo increasing notes being displaced (circles, or sliderheads/slidertails) on lazer with HR, the position of tiny droplets are slightly different on lazer for a significant portion of maps in the game.
Lastly, huge shout outs to Crafterdark for helping with this write-up, it wouldn't have been possible without him 💪
1st example: Aru's Cup on Coalamode. - Nanairo Symphony -TV Size-
Beatmap ID: 1041052
Beatmap URL: https://osu.ppy.sh/beatmapsets/488149#fruits/1041052
View of the two versions layered on top of each other, to make the differences more obvious:
In addition to these objects being in the wrong spots, objects also commonly appear -1ms off where they do in stable. You can read the full list of objects that are either off in starting time or position in this file created by Crafterdark's modified ConversationMappings parser
3 objects being off is pretty bad, it means replays set on stable won't work properly on lazer, and replays set on lazer won't work properly on stable. I also wanted to show that this happens to maps of all difficulties. And even if notes are not in the wrong spot, droplets in sliders are wrong on an even higher portion of maps compared to stable. Unfortunately, the this issue gets worse the harder the map is. This next map has 40% of objects being in different spots!
**2nd example: Madness on yak_won - Sewing Machine
Beatmap ID: 988072
Beatmap URL: https://osu.ppy.sh/beatmapsets/461353#fruits/988072
I decided that screenshots were not going to suffice for this example, so here is a short clip with the two versions of osu! overlaid on top of each other.
Sewing.Machine.Lazer.vs.Stable.Short.MP4.mp4
For a full list of objects that are appearing at the wrong time, or the wrong position, you can refer to this zip file created by Crafterdark's parser.
This issue does have more layers, as some maps have incorrect object placements even with NM, so that means with HR they are even more off compared to stable with HR applied, such as our third example
**3rd example: Revolt from the Abyss on Noah - Deadly force - Put an end
Beatmap ID: 3172816
Beatmap URL: https://osu.ppy.sh/beatmapsets/1552869#fruits/3172816
With this map with HR, all patterns are in basically the same spot till we reach the time stamp of 295389.0, where stable generates 3 droplets in between the slider tick, but lazer only generates a single droplet at this time.
Unfortunately, every following droplet ends up in different spots until the map reaches it's end time. In addition, the banana shower at the end (spinner), is also completely different because of it.
Full list of every object in the spinner that is at the wrong position compared to Stable
Video clip of the end of the map. Both versions of the game overlaid on top of each other:
Put.an.end.video.comparison.h264.small.mp4
Here again are the tiny droplets that are not being generated compared to stable. If these were to generate the amount of issues with this map should disappear.
For a full list of objects that are appearing at the wrong time, or the wrong position, you can refer to this zip file for NM and then this zip file for HR created by Crafterdark's parser.
I wanted to show an example of a standard convert having the issue, and also an example where a score exists in lazer. This score is also the reason I began looking into this issue
Score URL: https://osu.ppy.sh/scores/2352883924
Lazer score ID: 2352883924
**4th example: Hard on dj TAKA - Colors -sasakure.UK Futurelogic Remix-
Beatmap ID: 1367640
Beatmap URL: https://osu.ppy.sh/beatmapsets/317439#fruits/1367640
Because of these differences, replays from both versions of the games cannot work correctly between each other. Not only that, but the difficulty, SR, and PP cannot be the same for many maps in this current state.
Also, sliders ending 1ms short happens with the other game modes too most likely.
Screenshots or videos
No response
Version
2024.221.0 and many versions before this
Logs
compressed-logs.zip
The text was updated successfully, but these errors were encountered: