For now, let's fetch on demand.
Note that song select local leaderboard has the same issue. I feel we should be
doing a lot more cached lookups (probaly with persisting across game restarts).
Maybe even replacing the realm user storage. An issue for another day.
This is a very special case where online beatmap/ruleset models are
being ferried via `ScoreInfo` in what appear to `BeatmapDifficultyCache`
as local `BeatmapInfo`/`RulesetInfo` models. Here, BDC will incorrectly
attempt to proceed with calculating true difficulty where it cannot, and
return 0.
This is fixed locally because `ScoreInfo` is a very weird model, and I'm
not sure whether BDC should contain logic to work around this.
It's no longer possible to just assume that using the ambient
`WorkingBeatmap` is gonna work.
Bit dodgy but seems to work and also I'd hope that `WorkingBeatmapCache`
makes this not overly taxing. If there are concerns this can probably be
an async load or something.
Closes https://github.com/ppy/osu/issues/28791.
The reason why nudging was not changing hyperdash state in catch was
that `EditorBeatmap.Update()` was not being called on the objects that
were being modified, therefore postprocessing was not performed,
therefore hyperdash state was not being recomputed.
Looking at the usage sites of `EditorBeatmap.PerformOnSelection()`,
about two-thirds of callers called `Update()` themselves on the objects
they mutated, and the rest didn't. I'd say that's the failure of the
abstraction and it should be `PerformOnSelection()`'s responsibility to
call `Update()` there. Yes in some of the cases here this will cause
extraneous calls that weren't done before, but the method is already
heavily disclaimed as 'expensive', so I'd say usability should come
first.
The previous logic was very wrong, as the check would only occur on each
beat. But that's not how kiai sections work – they can be placed at any
timestamp, even if that doesn't align with a beat.
In addition, the rate limiting has been removed because it didn't exist
on stable and causes some fountains to be missed. Overlap scenarios are
already handled internally by the `StarFountain` class.
Closes https://github.com/ppy/osu/issues/31855.
Closes https://github.com/ppy/osu/issues/31915.
Reproduction of aforementioned issue requires 1280x720 resolution, which
should also be a good way to confirm that this does anything.
To me this is also equal-parts-bugfix, equal-parts-code-quality PR,
because tell me: what on earth was this code ever doing at
`ComposeBlueprintContainer` level? Nudging by one playfield-space-unit
doesn't even *make sense* in something like taiko or mania.