Reported at https://osu.ppy.sh/community/forums/topics/2015478?n=1.
Would you believe it that this button that has been there for literal
years never did anything?
Implemented at a per-beatmap level. Also additionally added to context
menu (at @peppy's suggestion), and also copy reworded from "Delete from
unplayed" to "Mark as played" because double negation hurt my tiny
brain.
This also optimises the manager classes to better support `Live` usage
where the managed object is already in a good state (ie. doesn't require
re-fetching).
Because the online info reset (which includes online ID reset) was
happening after encoding,
`TestSceneBeatmapLeaderboard.TestLocalScoresDisplayOnBeatmapEdit()`
started failing, as the hash no longer matched expectations after the
first save of the map.
Fixes#22306.
Changes beatmap saving so that by default it does not transfer
the hashes in collections, and only transfers them when saving the same
difficulty in the editor.
Issue seems to have been introduced in https://github.com/ppy/osu/pull/20641.
In current `master`, the difficulty creation flow would retrieve a
"reference beatmap" to copy metadata and timing points from using
`GetPlayableBeatmap()`. But, importantly, it was calling that method
using *the ruleset of the new difficulty* rather than the ruleset of the
existing one. This would make the difficulty creation flow fail if the
beatmap couldn't be converted between rulesets (like taiko to catch).
Fixing to use the reference beatmap's actual ruleset would be trivial,
but there's no real reason to do all of that work anyway when a
`WorkingBeatmap` is available. Because getting a playable beatmap is not
required to copy across metadata and timing points, remove the
`GetPlayableBeatmap()` step entirely to fix the bug.
Closes#22145.