Code Quality
- Fix broken wiki link on readme (ppy/osu-server-spectator#226 by @Joehuu)
- Remove unused
ScreenBreadcrumbControl
(#27675 by @peppy) - Add extended logging when discarding online metadata lookup results (#27676 by @bdach)
- Make slider path parsing more friendly with spans (#27418 by @huoyaoyuan)
- Fix discord RPC errors in multiplayer (#27728 by @bdach)
- Update localisations (ppy/osu-resources#315 by @peppy)
- Fix NVAPI startup exception on non-Windows platforms (#27733 by @smoogipoo)
- Update action versions in diffcalc workflow (#27748 by @smoogipoo)
- Fix SpectatorClient holding references to Player (#27778 by @smoogipoo)
- Fix SkinEditor binding event to external bindable (#27779 by @smoogipoo)
- Update osu.Framework package (#27788 by @smoogipoo)
- Fix icon render script not negating correctly on newer imagemagick versions (ppy/osu-resources#316 by @bdach)
- Update Sentry to fix iOS build (#27827 by @smoogipoo)
Editor
Improve editor performance when many timeline ticks are present (#27632 by @EVAST9919)
Improve editor performance for maps with many control points (#27630 by @EVAST9919)
Smaller changes
- Fix audio in video check crashing on unexpected failures (#27600 by @bdach)
- Add verify checks to unused audio at the end (#27639 by @64ArthurAraujo)
- Add verify check for too high video resolution (#27708 by @64ArthurAraujo)
- Add verify checks for abnormal difficulty settings (#27683 by @64ArthurAraujo)
- Fix reverse selection not updating new combo location (#27723 by @64ArthurAraujo)
- Update Slider path control points and connections after stacking application (#27761 by @64ArthurAraujo)
- Fix rotate tool button in editor disabled when selecting 1 circle (#26702 by @honguyenminh)
- Fix merging sliders with the same
StartTime
causing a Unhandled Exception (#27768 by @64ArthurAraujo)
Framework
Fix word wrapping not working well with chinese/japanaese/korean languages (ppy/osu-framework#6231 by @bdach)
Smaller changes
- Fix over time degradation of deferred renderer performance (ppy/osu-framework#6210 by @smoogipoo)
- Use a union struct for RenderEvents (ppy/osu-framework#6209 by @smoogipoo)
- Check BASS error codes more diligently when retrieving waveform data (ppy/osu-framework#6213 by @bdach)
- Remove effect prioritisation to fix segfaults (ppy/osu-framework#6214 by @smoogipoo)
- Reduce scope of experimental renderer (ppy/osu-framework#6219 by @smoogipoo)
- Add event handler for user change of
TabControl
tab selection (ppy/osu-framework#6218 by @frenzibyte) - Update SDL2 package + use
SDL_GetWindowSizeInPixels
(ppy/osu-framework#6226 by @smoogipoo) - FFmpeg Linux binaries: Include version in file name (ppy/osu-framework#6153 by @FreezyLemon)
- Update FFmpeg binaries (ppy/osu-framework#6227 by @github-actions[bot])
- FFmpeg: Only load versioned libraries on Linux (ppy/osu-framework#6154 by @FreezyLemon)
- Tweak behavior of cursor movement while text is selected to better match expectations (ppy/osu-framework#6228 by @ggliv)
- Prepare
SDL2ControllerBindings
class for SDL3 (ppy/osu-framework#6232 by @Susko3) - Fix tablet driver log output subscription not unsubscribing after disposing/disabling (ppy/osu-framework#6237 by @Joehuu)
- Update SDL3 (ppy/osu-framework#6240 by @smoogipoo)
Gameplay
Change gameplay disclaimers to show inline and not delay gameplay start (#27616 by @bdach)
Add delayed resume for taiko/catch/mania (#27079 by @smoogipoo)
Fix some maps requiring multiple intro skips that weren't there on stable (#27784 by @bdach)
Add new icons for hit error meter (ppy/osu-resources#317 by @peppy)
Update hit error metre to use new icons (#27787 by @peppy)
Smaller changes
- Fix incorrectly encoded score IsPerfect value (#27668 by @smoogipoo)
- Add sample for gameplay resume countdown (ppy/osu-resources#314 by @nekodex)
- Fix break overlay arrows look ugly on bright backgrounds (#27760 by @EVAST9919)
Gameplay (osu!)
- Fix bulbs on Catmull sliders (#27734 by @smoogipoo)
- Some old maps were showing weird loops in sliders which weren't rendered in stable. Now they don't render here either.
Gameplay (osu!catch)
- Fix catch banana shower judgement causing fail when at 0 HP (#27677 by @smoogipoo)
- Fixes the follow-up issue in #27121
Gameplay (osu!mania)
- Consider keymods in beatmap filtering + panel display (#27747 by @smoogipoo)
Gameplay (osu!taiko)
Fix taiko mascot size not matching expectations (#27758 by @peppy)
Smaller changes
- Fix taiko legacy score simulator not including swell tick score gain into bonus portion (#27729 by @bdach)
Import
- Fix
SkinImporter
not using invariant culture when parsing skins withoutskin.ini
(#27739 by @Susko3) - Avoid reporting an import as successful when all beatmaps failed to import (#27755 by @peppy)
Online
Support Discord game invites in multiplayer lobbies (#27443 by @jvyden)
Smaller changes
- Skip score uploads when nothing was hit in score (ppy/osu-server-spectator#224 by @bdach)
- Fix
EndPlaySession()
not broadcasting play end to other users on unranked beatmap plays (ppy/osu-server-spectator#225 by @bdach) - Add custom message in the case of a
invalid beatmap_hash
(#27783 by @64ArthurAraujo)- Will now show a more friendly "A new version of this beatmapset is available please update. Your score will not be submitted."
- Disable Discord URI registration on macOS for now (#27789 by @smoogipoo)
Platform
- Upgrade to SDL3 (ppy/osu-framework#6234 by @Susko3)
######## Changes
- (SDL3-CS) from
namespace SDL2
&class SDL
tonamespace SDL
&class SDL3
(made more sense as the functions are imported fromSDL3.dll
) - (SDL3-CS) structs and enums now live in the namespace instead of being nested in the
SDL3
class - (SDL3-CS) pointer types are now proper pointers instead of
IntPtr
, which means more "unsafe" code - (SDL3-CS) minor changes to return/struct types, reducing need for casts
- (SDL3-CS) simple function signature changes: from
ref
,in
&out
to pointers (unfortunate, but automatically generating these would be hell) - (SDL3-CS) function that take strings now take
ReadOnlySpan<byte>
, requiringEncoding.UTF8.GetBytes()
calls or UTF-8 string literals - (SDL3-CS) function pointers instead of delegates in native callback functions
- simple renames done via SDL-provided
build-scripits/rename_symbols.py
- migrations from the Migrating to SDL 3.0 guide
- minor update of
SDL3ControllerBindings
logic (basically per SDL3 migration guide) - removal of borderless fullscreen on macOS and Linux (merged into fullscreen with SDL3)
- updated windowing logic to account for
SDL_DisplayID
instead of previously used display index - osu!framework
DisplayMode.RefreshRate
changed fromint
tofloat
- SDL relative mouse mode instead of custom
WindowsMouseHandler
mouse logic
including removal of custom tablet handling logic.SDL_pen.h
would be the replacement for that, but it's currently only supported on Linux - updated
WindowsWindow
to account forSDL_SYSWMEVENT
removal
has caused some minor regressions in IME handling (the new method isn't giving us all the expected messages) - updated
JetBrains.Annotations
to latest version - renamed SDL2 → SDL3
######## Issues
IOpenGLGraphicsSurface.BackbufferFramebuffer
used to return useful information on iOS- waiting un upstream: libsdl-org/SDL#9430
- OpenGL probably won't work on iOS?
- minor IME regressions on windows
- releasing mouse button outside window with relative mouse mode causes next click to be ignored (SDL issue, it seems)
- (possible issue) non-OTD tablet input with relative mouse mode on windows (
WindowsMouseHandler
logic was removed)
######## Future work
- add full support for async raw mouse + keyboard on windows #6235
- look into windows IME regressions (and maybe switch to SDL IME events)
- update my currently open PRs to SDL3 (when I feel like it)
######## Testing
I've tested mouse, keyboard
Reliability
Attempt to disable custom rulesets that can be linked to an unhandled crash (#27698 by @bdach)
After seeing yet another report of this something in me broke and I decided I have had enough of it.
What this does is that when the game is dying, it will hand off the exception to RulesetStore
for a last-ditch inspection. RulesetStore
will walk the call stack, and check if any ruleset has been involved in the trash fire. If it finds one, it banishes it to the blagole by renaming the dll to something that won't match the dll pattern (namely by attaching a .broken
faux-extension suffix to the filename).
On launch, the game checks for .dll.broken
ruleset files in the rulesets directory, and raises a notification for every single one that it finds to let the users know. And yes it will do that on every startup. I don't much care at this point (partially because I don't even know if reviewers will accept the starting premise of this - if they will I am willing to put some more work into this).
Smaller changes
- Warn about not using an official "deployed" build (#27681 by @smoogipoo)
- Some package managers (e.g. the AUR) may choose to build "deployed" game packages from tags, attaching the true game version to the built assembly (e.g.
2024.312.0
). This PR allows an attribute to be attached that indicates whether this is an officially sanctioned build, and displays a notification if not.
- Some package managers (e.g. the AUR) may choose to build "deployed" game packages from tags, attaching the true game version to the built assembly (e.g.
- Fix double binding causing game crash after API enters failing state (#27754 by @peppy)
- Fix possible crash due to race in DiscordRichPresence (#27810 by @smoogipoo)
- Encountered by chance:
As far as I can tell the failure path looks something like this:
OsuGameBase.load()
-> loadsAPIAccess
APIAccess
will begin receivingUpdate()
s immediately upon game'sLoadComplete
OsuGameDesktop.LoadComplete()
-> begins async load ofDiscordRichPresence
DiscordRichPresence.load()
-> binds event withrunOnceImmediately
.- At some point
APIAccess
updates the user object (from the update thread), creating a race condition between it and therunOnceImmediately
above.
Results
Display misses in the hit accuracy heatmap (#27064 by @smoogipoo)
Apply partial fade on pp display on results screen when score will not give pp (#27756 by @bdach)
Skin Editor
Song Select
Use title as tiebreaker when sorting beatmap carousel by artist (#27692 by @bdach)
Support filtering for multiple statuses when searching beatmaps in the map picker (#27635 by @vladfrangu)
This adds the ability to search for something like status=r status=l
and include both.
Smaller changes
- Stop blocking player load when hovering over osu! logo (#26937 by @frenzibyte)
Storyboard
- Revert recent storyboard optimisations (#27797 by @smoogipoo)
- They were causing issues with some edge cases.
UI
Remember login by default (#27587 by @peppy)
Kinda what is expected from a user's perspective
Add ability to schedule and rotate main menu content (#27722 by @peppy)
Smaller changes
- Rearrange rankings overlay tabs to match web (#27595 by @Joehuu)
- Fix first word bold not applying correctly after first language change (#27601 by @bdach)
- Fix noticeable masking artifact of beatmap cards when already downloaded (#27607 by @Joehuu)
- Fix animated UI elements not beat syncing correctly at slower playback rates (#26707 by @peppy)
- Localisation updates (ppy/osu-resources#318 by @peppy)