A few facts of life:
- Guest difficulties are at this point a staple of mapping.
- People are very much used to flinging `.osu`s around (because there's
no better alternative).
- Currently there are two ways to get an `.osu` out of lazer. You can:
- Export the beatmap as "compatibility" to an `.osz`, then
transmogrify the `.osz` to a `.zip`, then extract the `.zip`, then
pluck out the `.osu`. This is the "correct" way to make sure stable
works, but is also stupidly arcane.
- Use "edit externally" to mount the beatmap files to disk, then
copy-paste out the `.osu`. This is the *wrong* way to make sure
stable works, because the mounting process exposes the raw "for
editing" format with features stable doesn't support, but it the
actual easy one.
- Reports about guest difficulties exported from lazer "working wrong on
stable" are prevalent. Probably mostly because of the preceding point.
What this PR does is introduce a *third* method to export an `.osu`,
which is designed to be both the easiest one yet *and* correct. I am
hoping this will curb the complaints until support for direct submission
of guest difficulties is added - which I still hope to see, but it will
be a significant effort *client-side* (the server side has been ready
for years now).
And yes, you will notice that much of the code added in
`LegacyBeatmapExporter` related to manipulation of the path is
copy-pasted from `LegacyExporter`. I don't care enough to invent
protected / abstract / whatever else OOP faff for something that may not
survive review and is mostly a weird semi-temporary wart.
* SSV2 : Replace Mark as Played with Remove from Played if already played
* Remove checks of BeatmapInfo.LastPlayed for DateTimeOffset.MinValue
* Make FooterButtonOptions use a RealmLive<BeatmapInfo> and act on review comments
* FIXUP: Detach BeatmapInfo before passing it to FooterButtonOptions.Popover
---------
Co-authored-by: Bartłomiej Dach <dach.bartlomiej@gmail.com>
Alban Cabannes-Michel
·
2025-10-16 14:59:16 +02:00
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.