rhythm is just a *click* away!
Full Changelog: https://github.com/ppy/osu/compare/2024.412.0...2024.412.1
ScreenBreadcrumbControl
(ppy/osu#27675 by @peppy)StartTime
causing a Unhandled Exception (ppy/osu#27768 by @64ArthurAraujo)TabControl
tab selection (ppy/osu-framework#6218 by @frenzibyte)SDL_GetWindowSizeInPixels
(ppy/osu-framework#6226 by @smoogipoo)SDL2ControllerBindings
class for SDL3 (ppy/osu-framework#6232 by @Susko3)SkinImporter
not using invariant culture when parsing skins without skin.ini
(ppy/osu#27739 by @Susko3)EndPlaySession()
not broadcasting play end to other users on unranked beatmap plays (ppy/osu-server-spectator#225 by @bdach)invalid beatmap_hash
(ppy/osu#27783 by @64ArthurAraujo)
######## Changes
namespace SDL2
& class SDL
to namespace SDL
& class SDL3
(made more sense as the functions are imported from SDL3.dll
)SDL3
classIntPtr
, which means more "unsafe" coderef
, in
& out
to pointers (unfortunate, but automatically generating these would be hell)ReadOnlySpan<byte>
, requiring Encoding.UTF8.GetBytes()
calls or UTF-8 string literals
build-scripits/rename_symbols.py
SDL3ControllerBindings
logic (basically per SDL3 migration guide)SDL_DisplayID
instead of previously used display indexDisplayMode.RefreshRate
changed from int
to float
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 LinuxWindowsWindow
to account for SDL_SYSWMEVENT
removal
has caused some minor regressions in IME handling (the new method isn't giving us all the expected messages)JetBrains.Annotations
to latest version######## Issues
IOpenGLGraphicsSurface.BackbufferFramebuffer
used to return useful information on iOSWindowsMouseHandler
logic was removed)######## Future work
######## Testing
I've tested mouse, keyboard
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).
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.As far as I can tell the failure path looks something like this:
OsuGameBase.load()
-> loads APIAccess
APIAccess
will begin receiving Update()
s immediately upon game's LoadComplete
OsuGameDesktop.LoadComplete()
-> begins async load of DiscordRichPresence
DiscordRichPresence.load()
-> binds event with runOnceImmediately
.APIAccess
updates the user object (from the update thread), creating a race condition between it and the runOnceImmediately
above.
This adds the ability to search for something like status=r status=l
and include both.
Kinda what is expected from a user's perspective
Running osu! with data stored on an ExFAT drive stopped working with the last release. This will be fixed in this release. If your data is missing, please open your osu! data folder and rename the client_xxx_corrupted.realm
file to client.realm
(deleting the new one created with a smaller filesize) after completing the update.
Full Changelog: https://github.com/ppy/osu/compare/2024.312.0...2024.312.1
Logger.NewEntry
handlers when flushing (ppy/osu-framework#6191 by @Susko3)cycleLogs
failing due to directory not existing (ppy/osu-framework#6200 by @peppy)ColourHitErrorMeter
(ppy/osu#27441 by @cdwcgt)DebugUtils.IsDebugBuild
not working on Android (ppy/osu-framework#5617 by @Susko3)VeldridDevice
and pipelines (ppy/osu-framework#6187 by @smoogipoo)GlobalStatistics
when exporting logs from settings (ppy/osu#27242 by @Susko3)TestSceneSkinnableSound
failing (ppy/osu#27558 by @EVAST9919)KeyCombination
struct (ppy/osu-framework#6208 by @frenzibyte)master | pr |
---|---|
When the playfield is shrunk with mods such as BarrelRoll, flashlight does not account for this, making it significantly easier to play. This makes it scale along with the playfield Scale
.
Should fix the underlying issue causing the backwards seeks during gameplay.
My primary goal with this sampleset is to offer a fresh, modern take on stable/legacy's hitsounds that would work as a drop-in replacement for beatmaps that were created with stable/legacy's sampleset in mind.
I've used reverb and increased stereo width to make the hitsounds less 'in your face' than the stable/legacy ones, making them more pleasant to the ear IMO. To compensate for potential audibility loss, I've used increased transients (punchyness), greater frequency range (with distortion/saturation/etc) and in some cases a volume bump to get them sounding equally legible.
I also decided to shorten the samples (relative to stable/legacy) in response to modern beatmaps being of increased difficulty/hitobject-density compared to maps from back when peppy created the stable/legacy sampleset.
In theory this allows for new players to progress further through harder maps before feeling the need to find an alternative skin/sampleset to hear what they're doing accurately - at which point, there's now conveniently also argon pro.
The sampleset does diverge a bit in some aspects (i.e. spinner sounds, fail sound, etc) to lean into lazer's aesthetic, but otherwise I hope the hitsounds should still be recognizable as some facsimile of their stable/legacy counterparts and hopefully still feel and play just as good (if not better) than stable/legacy did.
Argon
and Triangles
spinner freeze at low replay speed (ppy/osu#27359 by @EVAST9919)DrawableSliderRepeat
usage causing incorrect rotation (ppy/osu#27529 by @peppy)You can now use:
L L L
to get to playlistsM M M
to get to multiplayerS
to get to settings E E
to get to the beatmap editorScenarios include:
Let's use world.execute(me) as a storyboard example, since it has a lot of objects, which makes all the values exaggerated and easier to see the difference.
SliderInputManager.updateTracking
(ppy/osu#27230 by @EVAST9919)TimelineBlueprintContainer
(ppy/osu#27297 by @EVAST9919)AccuracyCircle
to not use BufferedContainer
s (ppy/osu#26769 by @EVAST9919)SmokeSegment
(ppy/osu#27357 by @EVAST9919)PerformanceOverlay
while in expanded state (ppy/osu-framework#6197 by @EVAST9919)AggregateBindable
(ppy/osu-framework#6198 by @smoogipoo)ModSelectOverlay
is visible (ppy/osu#27366 by @EVAST9919)CircularProgress
(ppy/osu-framework#6199 by @EVAST9919)EffectPointVisualisation
(ppy/osu#27432 by @EVAST9919)WikiPanelContainer
causing allocations and poor performance (ppy/osu#27543 by @EVAST9919)DrawableFlag
(ppy/osu#27551 by @EVAST9919)CursorEffectContainer
and TooltipContainer
(ppy/osu-framework#6207 by @EVAST9919)Full Changelog: https://github.com/ppy/osu/compare/2024.221.0...2024.312.0
Can only realistically affect beatmaps with difficultyPeppyStars = 0
, of which there are known 2:
Full Changelog: https://github.com/ppy/osu/compare/2024.221.0...2024.302.1
In triangles and argon, we expanded hitcircles to take up the full 128 px which are clickable, but still use the old approach circle sprite. To make it feel correct (ie. disappear as it collides with the hitcircle, not when it overlaps the border) we need to expand it slightly.
Note that this fix only affects classic/legacy skins.
Before | After |
---|---|
GridContainer
s directly where possible (ppy/osu#27278 by @EVAST9919)SliderInputManager.updateTracking
(ppy/osu#27230 by @EVAST9919)Spurred by people using this renderer, likely because "legacy" has a bad connotation associated with it (e.g. https://discord.com/channels/188630481301012481/1097318920991559880/1209220240383418438).
This forces GLRenderer
("legacy") to be used even when the OpenGL
renderer type is selected.
Broke in yesterday's release, oops.
SliderTailHit
, remove override (ppy/osu#26877 by @smoogipoo)UserPanel
s to reduce container nesting (ppy/osu#26924 by @EVAST9919)FireAndForget
(ppy/osu#27077 by @peppy)net8.0
folders (ppy/osu#27186 by @FamousPig)net8.0
folders (ppy/osu-framework#6179 by @FamousPig)[RequireStaticDelegate]
annotations (ppy/osu-framework#6174 by @Susko3)Will no longer add control points if the selection has 2 or more objects.
Performance improvements across the board. Over 50% in some cases (song select is apparently much nicer now).
Move
events (ppy/osu-framework#6165 by @Feodor0090)List
instead of IEnumerable
in InputResampler
(ppy/osu-framework#6173 by @EVAST9919)The following mods and settings are now allowing PP gains:
WorkingBeatmapCache
caching beatmap in wrong state leading to crash (ppy/osu#27239 by @peppy)osu!stable does not record key presses onto replays with Relax, so attempting to watch them back in lazer didn't work historically.
This restores progressive coverage that HD and FI had in osu!stable, and adds a new mod ManiaModCover
/ CO
which allows setting a custom cover.
PersistentEndpointClientConnector
(ppy/osu#27067 by @bdach)TotalScoreInfo
when converting SoloScoreInfo
to ScoreInfo
(ppy/osu#27069 by @bdach)Playfield
(ppy/osu#26940 by @EVAST9919)DrawableManiaRuleset
performing skin lookup every frame (ppy/osu#26938 by @EVAST9919)UnstableRateCounter
(ppy/osu#26976 by @EVAST9919)ScrollingHitObjectContainer
(ppy/osu#26863 by @EVAST9919)Previous
and Next
on DifficultyHitObject
with more direct computation (ppy/osu#27117 by @tsunyoku)GridContainer
only on DrawSize change (ppy/osu-framework#6180 by @EVAST9919)DrawableLinkCompiler
allocations (ppy/osu#27199 by @EVAST9919)HitObject
(ppy/osu#27114 by @EVAST9919)SlimReadOnlyListWrapper
for KeyBindingContainer.PressedActions
(ppy/osu-framework#6185 by @EVAST9919)We've had few releases lately where mobile isn't working / is crashing, so the mobile release was pulled. Unfortunately, the game would still send an update notification, leading to many people opening issues about the update not being available for their platform.
This fixes that.
In mod select and in song select footer.
You can now search for played<30
for beatmaps played in the last 30 days.
Before | After |
---|---|
Before | After |
---|---|
Before | After |
---|---|
This was especially visible at the main menu when running in single thread mode.
Before | After |
---|---|
Just some fine-tuning based on feedback.
Full Changelog: https://github.com/ppy/osu/compare/2024.130.2...2024.131.0
Statistics
bindable to IAPIProvider
and update it from SoloStatisticsWatcher
(ppy/osu#26356 by @stanriders)Before:
https://github.com/ppy/osu/assets/17460441/89480d18-2d5e-4eaf-9d04-d396ce0b70b0
After:
https://github.com/ppy/osu/assets/17460441/135b1715-26f9-45b9-a6cc-92b72099e11d
DrawablePool
without being added to hierarchy (ppy/osu-framework#6136 by @peppy)HostOptions
(ppy/osu-framework#6129 by @tsunyoku)CanSeekForwardOnInterpolationFail
as flaky (ppy/osu-framework#6140 by @frenzibyte)TemplateGameTestScene
showing up in test browser (ppy/osu-framework#6146 by @Joehuu)[Solo]
attribute (ppy/osu-framework#6137 by @peppy)Padding
property in GridContainer
(ppy/osu-framework#6145 by @EVAST9919)This removes the frequency ramp on pausing. This was something I was personally behind implementing and working to keep around, but nuking in favour of simplifying the process for now. In discussing with nekodex we both agree there is a better way forward than this.
This lays groundwork for doing other things, like allowing seeking during replay pause, and changing the way offsets work without worrying about the weird application considerations from the pause ramp effect.
This is a change for osu!/osu!taiko to match stable. It's not final. We're just giving people what they are used to for now. If you're about to comment about how you disagree with this, then please make sure to search first and contribute to an existing conversation.
ArgonHealthDisplay
(ppy/osu-resources#302 by @EVAST9919)There's still a lot of feedback that these are noisy and get in the way. As a recap, you can already skin these out using sliderendmiss
and sliderendtick
, but adding these in a classic skin is a bit of a pain in the ass, so I want to make the defaults usable for most users.
We'll continue to iterate based on feedback!
More subtle, less noisy, but still should describe the misses quite well.
I toyed with bringing across the stable behaviour of ticks not fading out but people preferred this direction, so let's stick with it.
Up until now, the input drum width was variable per skin, which results in the overall gameplay width changing based on skin. This has been discussed to be quite bad and must not be the case (see discord).
The constant width for the input drum has been defined to be 180px, visually matching osu!stable on classic skin. Default skins have been altered slightly to respect that width (basically set its height with respect to width rather than the opposite).
triangles | argon |
---|---|
This fixes some beatmaps using very precise slider velocities to create a speed ramp from looking too "jumpy".
This finally brings osu!taiko in line with scroll speed on stable, even when "classic" mod is not applied.
Did you know you could do this in stable? Well you can in lazer too now.
Starting/stopping the firing process was done very weirdly, causing the underlying class to get confused.
Say hello to your new osu! logo. And don't trip on the dot.
Brand new menu backgrounds to match the fresh logo.
Credit to spaceman_atlas / nanaya for the API side of this implementation.
StartChatRequest
in websocket chat client (ppy/osu#26780 by @bdach)Reduces potential stutters when loading initial textures, plus should decrease gameplay overhead quite considerably (until now, each time a pool was requested for a different judgement type it would have to reinitialise the judgement's internal drawables).
ArgonHealthDisplay
to use shaders (ppy/osu#26479 by @EVAST9919)Hugely improves the performance of this component.
master | pr |
---|---|
OsuPlayfield
being retained indefinitely after gameplay (ppy/osu#26770 by @peppy)Ouch.
ColourHitErrorMeter
not loading pooled drawables ahead of time (ppy/osu#26549 by @bdach)ConstrainedIconContainer
always using masking without a reason (ppy/osu#26603 by @EVAST9919)Triangles
backgrounds where possible (ppy/osu#26647 by @EVAST9919)BeatmapCarousel
(ppy/osu#26660 by @EVAST9919)TabFillFlowContainer
when it can't fit all the items (ppy/osu-framework#6148 by @EVAST9919)FillFlow
overhead of argon counters (ppy/osu#26649 by @peppy)FollowPointConnection
pool filling up when follow points are hidden (ppy/osu#26648 by @peppy)Triangles
backgrounds (ppy/osu#26677 by @EVAST9919)GameplayLeaderboard
(ppy/osu#26674 by @peppy)ScoreCounter
(ppy/osu#26695 by @EVAST9919)HUDOverlay
(ppy/osu#26711 by @EVAST9919)SliderInputManager.updateTracking
(ppy/osu#26721 by @EVAST9919)IBindableList.GetEnumerator()
boxing and allocating (ppy/osu-framework#6155 by @smoogipoo)IRequireHighFrequencyMousePosition
are present (ppy/osu-framework#6147 by @peppy)DrawableSlider
(ppy/osu#26698 by @EVAST9919)ColumnFlow
(ppy/osu#26790 by @EVAST9919)ScrollingHitObjectContainer
(ppy/osu#26788 by @EVAST9919)Originally interaction was limited to fix clicking title/creator links when trying to select the panel. But this also meant that buttons became unresponsive, which is quite anti-user.
This also:
It now scales with your hardware, and in most cases it should be imperceptible on short seeks.
In the case a user gets an SS, accuracy never changes from the initial value, so the bindable flow was not being triggered.
LegacyScoreDecoder.PopulateMaximumStatistics()
public (ppy/osu#26785 by @bdach)Also adjusts the text on beatmap offset. Because every time I see "beatmap offset" I want to change the directionality of adjustment to match. This next text should also help users understand that both the global and per beatmap offset are in the same direction.
This mimics stable behavior when taking screenshots with letterboxing enabled. Only applicable when Screen scaling is set to "Everything".
spinner-top
and spinner-middle2
spin at different speeds to match stable (ppy/osu#26562 by @kyubxy)@2x
textures (to match stable) (ppy/osu#26594 by @frenzibyte)
@2x
suffix does not mean anything and the texture is returned normally with no adjustment to scale.LegacySkin
(ppy/osu#26598 by @frenzibyte)
SB/k/[email protected]
). When stable looks up the element, it will not match it with any texture file in the user's skin, due to the user's skin not having any texture file with the path explicitly being SB/k/[email protected]
for example.However, in lazer, GetTexture
strips out the directory name and looks up for a texture that matches only the file name, leading to the hitcircles requested from the storyboard to be incorrectly sourced from the user's selected skin when beatmap skin is turned off, rather than the beatmap's textures.
Before | After |
---|---|
This also shows an empty beatmap instead of nothing when no beatmap is selected.
Full Changelog: https://github.com/ppy/osu/compare/2024.114.0...2024.130.2
KeyCombination
throwing when duplicates are fed in (ppy/osu-framework#6130 by @peppy)Full Changelog: https://github.com/ppy/osu/compare/2024.113.0...2024.114.0