Thanks for following along! This is a tagged release (2022.731.1). For more information check out the osu! changelog page and dev blog.
Code Quality
- Log beatmap difficulty retrieval failures during score calculation (#19367 by @smoogipoo)
- Improve log output for too-many-scheduled-tasks (ppy/osu-framework#5322 by @peppy)
- Remove no longer necessary API score models (#19379 by @frenzibyte)
- Remove nullable disable annotation in mods for catch ruleset. (#19249 by @andy840119)
- Move
LegacyComboCounter
toosu.Game.Skinning
(#19426 by @LeNitrous) - Remove nullable disable annotation in mods for mania ruleset. (#19418 by @andy840119)
- Remove nullable disable annotation in mods for taiko ruleset. (#19419 by @andy840119)
- Add more comprehensive xmldoc for beatmap model classes (#19433 by @peppy)
- In an effort to create a terminology glossary for all beatmap-related classes, since we have a lot of them. Check it out on the dev wiki.
- Remove unused
RulesetStore
fromBeatmapManager
constructor (#19435 by @peppy)
Database
Fix multiple issues with beatmap updating (#19378 by @peppy)
With the introduction of updating beatmaps in the last release, some users noticed some edge cases where the update process was not working (or working "too well", and showing the button even after an update was applied). This was largely due to the beatmap metadata being too cached locally, and has been resolved by always requesting the most up-to-date metadata in non-batch import scenarios.
This also fixes some beatmap-related attributes not being transferred, like "date added" and any scores that were attached to a beatmap that was part of an updated set, but not modified itself.
This also changes the process to only leave soft-deleted copies of beatmaps which actually had modifications.
Move beatmap collections to realm (#19430 by @peppy)
This brings collections over to our new client-side database, doing away with the legacy format. Visually this shouldn't be much different, but internally it is a lot more efficient and reliable.
Your existing collections will be automatically migrated on startup from collection.db
, but if anything goes wrong that file will remain.
Add collection transfer logic to beatmap update flow (#19431 by @peppy)
- For beatmap sets where every difficulty was in a collection, any new difficulties will also be added to that collection.
- For beatmap sets where only some difficulties were in a collection, updated versions of those beatmaps will also be added to the same collections.
Editor
Gameplay
Add osu!stable style circular song progress for legacy skins (#19408 by @LeNitrous)
Finally, the "pie" style of progress that many have requested has returned to legacy skins. Note that this is now the default display for legacy skins. If you would like the full display style back, you can add it using the skin layout editor (accessible from settings or via Ctrl
+Shift
+S
).
Input
Add ability to make cursor show even during touch input (#19389 by @peppy)
A long-time request, you can now make the cursor always show, even on touch devices. This can also be used as a workaround for tablets reporting touch inputs, for those that have recently had issues with cursor unexpectedly disappearing on desktop devices.
I completely disagree with this from a UX perspective, but it's come up so often that I figure we should just let users bone themselves.
Mods
Online
Attempt to fix spectator sending too slow for users with high latency (#19451 by @peppy)
In the previous release I made a change which on the surface wasn't really looking to do much (making all requests blocking in the spectator client), but for users with very high latency (500ms+) this could result in the client not being able to send data fast enough to the server. This was noticed especially by users using dodgy VPNs.
Smaller changes
- Fix players potentially disappearing in spectator list after restart (#19363 by @frenzibyte)
- Fix beatmap updater potentially using outdated local metadata (#19440 by @peppy)
Overlays
Fix beatmap overlay stats showing values with current mods incorrectly applied (#19299 by @Cwazywierdo)
Display exclamation icon for online scores with unprocessed PP (#19343 by @frenzibyte)
Performance
Refactor FPSCounter
to not use scheduled tasks (#19374 by @peppy)
Fixes an edge case where the fps counter would add undue overhead while being displayed for a longer period.
Fix calls to GetWorkingBeatmap
invalidating cache too often (#19371 by @peppy)
We found out that song select wasn't caching beatmaps as much as we originaly designed it to due to a recent change. This should grealy improve performance at song select when rapidly changing between beatmaps.
Reliability
- Add error logging for background processing failures (#19324 by @peppy)
- Fix
OsuSliderBar
throwing on negative draw width (#19345 by @frenzibyte) - Avoid potential realm fetch after disposal in
StatisticsPanel
(#19393 by @peppy)
Song Select
Fix star ratings which are still being calculated showing as "-1" at song select (#19373 by @peppy)
Smaller changes
- Maintain sort stability by using carousel item ID as a fallback (#19399 by @frenzibyte)
Testing
- Fix background beatmap processor resetting star ratings in tests (#19312 by @frenzibyte)
- Disable timeline test for now (#19368 by @smoogipoo)
- Fix intermittent timeline zoom test failures (#19377 by @frenzibyte)
- Avoid leaving left-over files after test run completes (#19392 by @peppy)
- Don't show audio playback issue notification if debugger is attached (#19402 by @peppy)
- I've hit this countless times recently when debugging during the startup procedure.
- Fix potential test failure if scores are added to the beatmap which is subsequently removed (#19411 by @peppy)
- Add realm refresh calls to fix intermittent test failures on new update tests (#19432 by @peppy)
- Reduce calls to
LoadTrack
by implicitly running on test/dummy classes (#19441 by @peppy) - Fix intermittent HUD tests (#19443 by @smoogipoo)
- Fix potential test failures due to Setup/SetUpSteps ordering (#19453 by @smoogipoo)
- Move spectator begin/end playing to SubmittingPlayer (#19442 by @smoogipoo)
- Add constrained assertions (ppy/osu-framework#5323 by @smoogipoo)
- Ensure realm is in a good state before asserts in
TestSceneFilterControl
(#19454 by @peppy) - Fix potential nullref in
TestSceneAutoplay
check steps method (#19469 by @frenzibyte)
UI
Implement mod preset panels for mod select overlay (#19287 by @bdach)
This is the start of a series of pulls whose end goal is to add a mod preset column to the mod select overlay, as foreshadowed by the designs on figma.
Not available in game yet, but a taste of what's coming soon.
2022-07-21.23-32-03.mp4
Add ability to copy URLs by right-clicking external link button (#19375 by @novialriptide)
Add Toast notification to when copying a URL (#19410 by @novialriptide)
Smaller changes
- Implement basic appearance of mod preset column (#19349 by @bdach)
- Update more places to support displaying unprocessed PP placeholder (#19372 by @frenzibyte)
- Always allow selecting the top-most button in popups using the select binding (#19400 by @peppy)
- Defaulting to the "OK" type still seems correct, but let's allow selecting the top-most failing that.
UX
Add confirmation dialog when about to discard a playlist (#19455 by @peppy)
The confirmation will only show if items have been added to the playlist.
osu.2022-07-30.at.18.06.33.mp4
Add low battery warning for desktop platforms (#19471 by @Susko3)
Was already present on mobile, but now also shows for desktop users at 25% or lower battery charge.
New Contributors
Full Changelog: 2022.723.0...2022.731.1
Thanks for following along! This is a tagged release (2022.723.0). For more information check out the osu! changelog page and dev blog.
Code Quality
- Use more correct json casing in
APIScoresCollection
(#19226 by @peppy) - Remove nullable disable annotation in the mods. (#19235 by @andy840119)
- Change carousel terminology to not use
Children
/InternalChildren
(#19268 by @peppy) - Cleanup pass on
FPSCounter
(#19279 by @peppy)- This class got a bit messy over multiple iterations. Also rate limits the sprite text updates to reduce any potential performance overhead.
Database
Add background beatmap processing (#19272 by @peppy)
A stepping stone towards better storage/processing of star ratings locally. The focus here is on the invalidation flow when difficulty algorithm changes occur, so I didn't put too much thought into the BeatmapInfo
/ realm storage of the star rating.
This will nuke all local beatmaps' difficulties once. Seems like a good move to get everything in a consistent state. This will also handle legacy issues like "length" not being calculated, for users with very old databases.
I haven't tested with a large database yet, so feedback on how well this works is appreciated! There's no visible progress just yet, so if you notice nothing, that's probably a good thing. Note that it will automatically pause during gameplay.
Editor
Fix editor clap/finish buttons being ordered against expectations (#19236 by @peppy)
Weirdly was not brought to our attention until now!
Fix slider velocity not using previous value if slider is not adjacent (#19239 by @peppy)
Before:
osu.2022-07-19.at.13.55.16.mp4
After:
osu.2022-07-19.at.13.53.27.mp4
Dsplay toasts on beatmap/skin save (#19243 by @LukynkaCZE)
Adds missing visual feedback when saving.
Beatmap.Editor.mp4
Smaller changes
- Fix editor timeline zoom rate being too slow for longer beatmaps (#19278 by @Cwazywierdo)
- Fix timeline
alt
+scroll
zoom not correctly zooming to current mouse position (#19294 by @peppy) - Fix timeline zoom focus point when using zoom buttons (#19296 by @smoogipoo)
Framework
- Update
OpenTabletDriver
to latest version (ppy/osu-framework#5319 by @peppy)
Gameplay
Fix failed replays showing higher score than they should (#19263 by @frenzibyte)
Gameplay (osu!)
Adjust default follow circle animations to feel nicer (#19128 by @peppy)
Before:
osu.Game.Rulesets.Osu.Tests.2022-07-15.at.08.31.17.mp4
After:
osu.Game.Rulesets.Osu.Tests.2022-07-15.at.08.30.44.mp4
Smaller changes
- Remove non-overlapping velocity buff from aim difficulty (#19004 by @apollo-dw)
Gameplay (osu!taiko)
Add basic touch support for osu!taiko (#17200 by @hongaaronc)
This is a first pass implementation of touch support for osu!taiko. Eventually we plan to give the user a lot more control over touch input customisation, but hopefully this will suffice until that point.
Please give it a go and shoot any feedback you have!
FullSizeRender.MOV
Performance point balance changes (#19181 by @Lawtrohux)
Changes included are:
- Nerf the Hidden global multiplier to increase the gap between EZHD and HD only scores.
- Addition of an EZ global multiplier nerf, as well as a difficulty PP nerf.
- Decrease the miss penalty, as combo scaling is not present in taiko.
- Increase the weight Accuracy has on Difficulty PP.
- Lower Accuracy and great hit window scaling, and split out length-bonus to allow for a new slight HDFL bonus to accuracy scaled by length.
- Removal of the NF multiplier to prevent sandbagging against the <50% end-fail mechanic
Replicate osu!(stable)'s hit target position with "Classic" mod (#17622 by @frenzibyte)
Mods
Remove score multiplier on difficulty-increasing mods with customised settings (#19208 by @frenzibyte)
This is a first step in balancing the recently exposed leaderboards. It will allow us to fix cases of users applying DT with a rate of 1.01x and still getting the full multiplier, as one example.
We'll continue to iterate on this (and address other mods like "Relax").
Multiplayer
Fix editing a queued beatmap sometimes opening to the wrong selection (#19234 by @Cwazywierdo)
Smaller changes
- Fix creating multiplayer game during server migration not joining new room correctly (#19189 by @peppy)
Overlays
Highlight perfect slider tick/end values in beatmap info leaderboards (#19244 by @frenzibyte)
Replacing the existing maximum count display and moves that to a tooltip that displays when hovering over the statistic.
CleanShot.2022-07-20.at.00.42.49.mp4
Smaller changes
- Fix wiki overlay not handling path redirection properly (#19246 by @frenzibyte)
- This is noticeable on pages like https://osu.ppy.sh/wiki/en/osu!_File_Formats (copied from main page) which redirect to https://osu.ppy.sh/wiki/en/Client/File_formats. The target path is provided in the
APIWikiPage
structure, making redirection simple to handle.
- This is noticeable on pages like https://osu.ppy.sh/wiki/en/osu!_File_Formats (copied from main page) which redirect to https://osu.ppy.sh/wiki/en/Client/File_formats. The target path is provided in the
Performance
Reduce Bindable
allocations in hitobject classes via lazy initialisation (#19225 by @frenzibyte)
Offers a roughly 50% improvement in performance and memory usage when creating osu! hit objects. Should be most noticeable in batch difficulty calculation.
Platform
- Fix startup crash on Android verison before 8.0 Oreo (ppy/osu-framework#5315 by @Susko3)
- Add mention of "compatibility mode" in windows version check error message (#19228 by @peppy)
Reliability
- Replace culture-sensitive humanizer methods with fixed local reimplementations (#19221 by @bdach)
- Fix bad access to
Waveform.GetPoints()
if waveform changes during regeneration (ppy/osu-framework#5316 by @peppy) - Fix
BeginPlayingInternal
firing actual errors when beatmap not available online (#19227 by @peppy) - Fix unsafe value access in
WaveformGraph
async resampling logic (ppy/osu-framework#5318 by @frenzibyte)
Results
Add additional SFX to the results screen (#19300 by @nekodex)
Adds panel appearance and transition sounds, score rolling/ticking effects and additionally some dynamic panning to make the results screen a bit more interesting.
Dynamic panning also affecting the AccuracyCircle
/ ranking SFX was a side-effect of implementation, but it feels kinda cool so I left it in?
results-screen-2.mov
Song Select
Show update button in beatmap carousel when beatmaps have online changes (#19230 by @peppy)
Comes with a few caveats:
- Currently only shows when there are actual
.osu
file changes (feature parity with stable). Eventually we'd want to show this for any changes (ie. if only the background has changed), but doing so requires a beatmap set level hash. I have a forward plan for making this happen, but it involves having individual file hashes stored and communicated client-server. Note that even with this limitation, it will still update all files in the beatmap (better than stable) because it's performing a full re-download. - Any already imported beatmaps will not have a
LastOnlineUpdate
set, therefore will not show available updates. At some point all beatmaps with a null value will be queried in the background to resolve this. Not a huge deal IMO. - New imports are using the local cached beatmap info, which means in the super rare edge case that a beatmap is unranked and changed, it may be in an incorrect state even though its realm status shows that it's consistent. I've left a note about this in
BeatmapUpdater
but not sure it's worth acting on, for now.
Parallels.Desktop.2022-07-19.at.09.18.36.mp4
Add ability to sort and filter by ranked date (#19233 by @peppy)
For this to work, the game will need to perform some background data fetching. It might take some seconds or minutes depending on the size of your library.
Smaller changes
- Fix sorting mode not filling up to usable area in filter control (#19295 by @frenzibyte)
Testing
- Fix changelog overlay tests failing due to missing
CreatedAt
date (#19265 by @frenzibyte) - Fix
UpdateBeatmapSetButton
intermittent test failure (#19269 by @peppy) - Fix one more case of referencing old mod select overlay in tests (#19298 by @frenzibyte)
UI
Increase responsiveness of osu! logo triangles to the beat (#19264 by @TacoGuyAT)
video pending
Add game-side FPS counter (#19250 by @peppy)
This is a first implementation to build off. Figure it's easier to get this out as a "better than what we had" then build individual pieces into it.
- Frame time is currently displayed similar to stable (actual time between frames, not cpu time). Will probably change this to match the o!f display, but that requires more pieces to be exposed from the framework side.
- Tooltip is very temporary. I plan to replace it with the actual FPS display expanding out to a larger size to reveal more information.
osu.2022-07-20.at.15.11.13.mp4
Smaller changes
- Fix FPS counter not being wide enough to show large fps numbers (#19273 by @peppy)
- Fix draw FPS being inaccurate due to using
ElapsedFrameTime
(#19274 by @peppy) - Avoid using
RollingCounter
in fps counter (#19277 by @peppy)
UX
- Fix
OverlayContainer
no longer blocking mouse move events (ppy/osu-framework#5313 by @frenzibyte) - Fix floating mouse position not running correctly in single thread mode (#19240 by @peppy)
- Add the ability to save in the skin editor using system save hotkey (#19293 by @peppy)
Full Changelog: 2022.719.0...2022.723.0
Thanks for following along! This is a tagged release (2022.719.0). For more information check out the osu! changelog page and dev blog.
This is a bit of a hotfix release after the larger release a few days ago, focusing on reliability and regression fixes.
Code Quality
- Make
SoloScoreInfo.EndedAt
non-null (#19210 by @peppy) - Replace
Country
class with enumeration (#19137 by @frenzibyte) - Remove
countries.json
map in tournament client and replace withCountry
enum (#19138 by @frenzibyte)
Database
Store user country for imported scores (#19139 by @frenzibyte)
Note that this will only apply to newly imported scores from this point forward.
Gameplay
Fix mod settings not showing on leaderboards (#19175 by @frenzibyte)
Smaller changes
- Make "Autoplay" incompatible with "Adaptive Speed" (#19195 by @NotGumballer91)
- Adaptive Speed essentially does nothing with Autoplay so might as well make it incompatible.
- Fix "Perfect" mod not marking "Autopilot" as incompatible (#19200 by @tsunyoku)
- Fix "Cinema" mod not marking "Repel" as incompatible (#19201 by @tsunyoku)
Online
Fix user profiles not showing best plays (#19192 by @tsunyoku)
Regressed with the previous build.
Smaller changes
Reliability
- Don't send ruleset configuration failures to sentry (#19196 by @peppy)
- Fix
Waveform
generation failing when using "no sound" device (ppy/osu-framework#5310 by @peppy) - Fix zero width textbox throwing in
updateImeWindowPosition()
(ppy/osu-framework#5311 by @Susko3) - Fix potential crash when downloading beatmaps while in a multiplayer room (#19211 by @peppy)
Results
Change retry button icon to a more suiting icon (#19169 by @tsunyoku)
The previous icon was a bit misleading to look at, and can be easily mistaken for a "go back" key. The redo icon is a much clearer representation of a retry button.
Smaller changes
- Fix inconsistent casing of statistic names (#19209 by @3stantedja)
Settings
Add Touch input handler settings section (#19151 by @Susko3)
For users experiencing tablet issues (such as the cursor jumping or being hidden unexpectedly), you can now disable touch support in the settings.
Song Select
Fix audio/background not always updating when switching beatmaps (#19212 by @peppy)
UX
- Don't show "missing background" messages to user (#19188 by @peppy)
- Fix "Start Chat" on multiplayer/playlist chat not opening overlay (#19207 by @frenzibyte)
New Contributors
- @NotGumballer91 made their first contribution in #19195
- @3stantedja made their first contribution in #19209
Full Changelog: 2022.716.1...2022.719.0
Thanks for following along! This is a tagged release (2022.716.1). For more information check out the osu! changelog page and dev blog.
Code Quality
- Remove the nullable disable annotation in the benchmark project (#19059 by @andy840119)
- Add log output for custom storage usage (#19096 by @peppy)
Database
- Ensure that multiple
BeatmapSetInfo
with sameOnlineID
don't cause import failures (#19121 by @peppy)
Editor
- Fix editor playing object samples while paused after cancelling exit (#19063 by @Joehuu)
- Fix incorrect audio track playing when switching between newly created beatmaps (#19105 by @peppy)
Gameplay
Add ability to save failed score (#18785 by @cdwcgt)
2022-07-17_03-20-29.mp4
Gameplay (osu!)
Add repel mod to the osu ruleset (#18607 by @ggliv)
repel.mp4
Add "Single Tap" mod for osu! ruleset, abstract Alternate & Single Tap into InputBlockingMod (#19089 by @tsunyoku)
Since #17781 got closed due to recent changes, decided to re-create the mod and make it compatible with the recent changes.
Fix slider follow circle animations not matching expectations on legacy skins (#19090 by @goodtrailer)
This fixes quite a few oversights:
- Scale and fade are faster
- Scale is outwards when tracking is interrupted
- Sizing is fixed to match stable
Some similar changes will be applied to the default skin (probably in the next release) to make it feel better.
Smaller changes
- Fix mod incompatibility between repel and relax (#19084 by @ggliv)
- Fix potential crash in editor from transform time going below zero (#19132 by @peppy)
- Change "single tap" mod acronym to not conflict with "strict tracking" (#19140 by @peppy)
Input
Improve touch input support for desktop platforms (ppy/osu-framework#5299 by @Susko3)
Add support for joysticks/gamepads on Android (ppy/osu-framework#5281 by @Susko3)
Tested on a USB Xbox 360 controller clone, everything except the guide button works (Android doesn't provide a mapping for that). For my specific controller, D-pad inputs where reported exclusively trough OnGenericMotion
→ Axis.HatX
/Axis.HatY
and not in OnKeyDown/Up
.
The same controller reported different Device.MotionRanges
on different devices:
- Realme 6, Android 11: the list was non-null, but was empty
- LG G7 Fit, Android 9: the list was populated with the expected axes (including
Gas
andBrake
)
Localisation
- Update translations (ppy/osu-resources#203 by @peppy)
Online
Fix avatars not showing on local scores after replay import (#19038 by @novialriptide)
Show leaderboard scores from new data source (#19126 by @peppy)
This turns off the display of classic/legacy scores, and begins to show scores from the new "solo_scores
" data source. Currently, this means that all lazer scores from the last few years will be visible, but also means that you will no longer be able to see non-lazer scores. They will eventually return when we are happy with the consistency and performance of the new storage mechanisms.
Do note that there is no guarantee that scores currently visible will remain. They may be deleted at any point. There are several concerns which are not yet addressed.
Smaller changes
- Add and consume
SoloScoreInfo
(#19082 by @peppy)- One of the final steps required to prepare lazer for displaying lazer-first scores.
- Fix login overlay not displaying error message for disabled accounts (#19136 by @frenzibyte)
Performance
Remove flush-to-disk operation on non-Windows platforms for lower overhead (ppy/osu-framework#5305 by @frenzibyte)
Should greatly improve import performance on macOS.
Platform
Show an error message on startup when attempting to run on an unsupported version of windows (#19080 by @peppy)
A lot of sentry error reports are coming from realm / EF failures due to the host operating system being too old. Let's give the user some proper feedback rather than a silent crash and error report hitting our logging.
Prefer ~/Library/Application Support
as default user storage path on macOS (ppy/osu-framework#5304 by @frenzibyte)
Only applies to fresh installs.
Smaller changes
- Fix unsupported OS message stating Windows 8 to be supported (#19087 by @frenzibyte)
- Noticed while reading notifications and looking at #19080. The condition was updated to show on Windows 8 as well, but the message was still stating that Windows 8 is supported.
Reliability
- Fix crash when currently played beatmap finishes download while multiplayer spectating (#19074 by @peppy)
- Fix waveform generation function not freeing bass stream after usage (ppy/osu-framework#5300 by @peppy)
- Also fixes a few other things I noticed along the way.
- Fix potential crash during shutdown sequence if intro playback was aborted (#19079 by @peppy)
- Fix drawable mutation from disposal thread (#19104 by @peppy)
- Fix potential crash when exiting editor test mode (#19110 by @peppy)
Settings
Add joystick settings on Android (#19131 by @Susko3)
Song Select
Add "last played" sort mode to song select (#19098 by @peppy)
Note that this will consider the most recent play of any beatmap in beatmap set groups for now, similar to other sort methods.
osu.2022-07-13.at.07.47.26.mp4
Change clicking source/tags on song select to filter instead of searching online (#19124 by @frenzibyte)
CleanShot.2022-07-15.at.06.45.41.mp4
Smaller changes
- Update mod icon colors (#19039 by @Cwazywierdo)
- They now match the colours on the new mod select.
- Fix clicking search link from song select sometimes not switching search mode to "relevance" (#19129 by @peppy)
Testing
- Fix running Bass tests causing deadlocks on Linux (ppy/osu-framework#5302 by @smoogipoo)
- Free Bass device 0 on Linux (ppy/osu-framework#5303 by @smoogipoo)
- Fix dialog overlay potentially pushing dialog while not loaded (#19114 by @frenzibyte)
Tournament
Add support for a drawings screen video background (#19069 by @peppy)
Fix gameplay screen not updating with changes in various editors (#19101 by @peppy)
Disable tournament client "save changes" button when there's no changes to save (#19100 by @peppy)
osu.2022-07-13.at.08.43.47.mp4
Smaller changes
- Ensure any changes are committed before changing
LadderEditorSettings
's target match (#19102 by @peppy)
UX
Add language selection to first run overlay (#19107 by @peppy)
osu.2022-07-13.at.14.23.56.mp4
Allow adding playlist items to beatmap collections via context menu (#19037 by @frenzibyte)
CleanShot.2022-07-15.at.03.35.56.mp4
Smaller changes
- Fix playlist room creation screen pushing content on opening dropdowns (#19065 by @Ludio235)
- Show basic error message when score submission fails (#19078 by @peppy)
- Feels better to let the user know why it failed.
New Contributors
- @Ludio235 made their first contribution in #19065
- @novialriptide made their first contribution in #19038
- @Cwazywierdo made their first contribution in #19039
- @tsunyoku made their first contribution in #19089
- @cdwcgt made their first contribution in #18785
Full Changelog: 2022.709.1...2022.716.1
Thanks for following along! This is a tagged release (2022.709.1). For more information check out the osu! changelog page and dev blog.
What's Changed
Full Changelog: 2022.709.0...2022.709.1
Thanks for following along! This is a tagged release (2022.709.0). For more information check out the osu! changelog page and dev blog.
Code Quality
- Remove nullable disable annotation in the ruleset filter. (#18990 by @andy840119)
- Full NRT pass on Android (ppy/osu-framework#5286 by @Susko3)
- Includes everything except
AndroidInputHandler
s as those will be covered separately.
- Includes everything except
- Set proper access modifier on
ScheduledDelegate.State
(ppy/osu-framework#5291 by @Susko3) - Remove the nullable disable annotation in the benchmark project (ppy/osu-framework#5292 by @andy840119)
- Fix incorrect case in
CatcherArea
parameter (#19013 by @peppy) - Enable NRT and simplify
LineBufferedReader
(#19014 by @peppy) - Remove class constraint on AsNonNull() (ppy/osu-framework#5296 by @smoogipoo)
- Change AsNonNull to NotNull return (ppy/osu-framework#5298 by @smoogipoo)
- It seems this is better fit for this method for non-NRT contexts. Will resolve inspections such as https://github.com/ppy/osu/runs/7229529245?check_suite_focus=true. Also still seems to work with the new bindable NRT work in ppy/osu-framework#5099.
Database
Fix skins potentially being duplicated on batch import (#19029 by @peppy)
Smaller changes
- Fix realm backup creation failing when run from
RealmAccess
constructor (#18997 by @peppy)- At the point of construction, we are not on the update thread, but it doesn't really matter at this point because there's no other usages. Bit of an ugly regression.
- Fix intermittent realm migration test failures (#19006 by @peppy)
- Add nested transaction handling to realm helper methods (#19027 by @peppy)
Editor
- Fix editor saving not updating
BeatmapSetInfo
's hash (#19034 by @peppy)- This would lead to the audio track not updating correctly when switching between two newly created beatmaps at song select. Note that you will need to save any beatmaps you've created once to fix this issue.
Framework
- Expose async track
Start
/Stop
/Play
/Restart
methods (ppy/osu-framework#5294 by @peppy) - Add support for showing hidden items in DirectorySelectors (ppy/osu-framework#5251 by @ggliv)
- Will be implemented osu!-side soon.
Gameplay
Fix custom rulesets not importing scores at all (#19025 by @peppy)
Gameplay (osu!)
- Fix default spinner's accent colur not resetting after rewind (#19007 by @goodtrailer)
- Rewinding from a point after the spinner's end to a point between the spinner's completion and its end should show a gold color, but instead it's blue, making it look like the spinner hasn't been completed yet.
- Fix random mod generating off-screen sliders (#18596 by @hlysine)
Logging
- Remove noisy MIDI handler log output (ppy/osu-framework#5293 by @peppy)
- MIDI devices generally send traffic such as clock sync data, which we don't care about. For me, if I have my midi controller connected this creates a flow of 2-3 logger messages per second.
Online
Add MetadataClient
to handle online metadata changes (#19009 by @peppy)
This new component will handle real-time flow of updates to beatmap metadata from the server. It's just a first piece of the puzzle and won't trigger updates yet, but we're getting it deployed for further testing. Expect to see more related changes in upcoming releases!
Smaller changes
Performance
Reduce Scheduler
overhead when no tasks are pending (ppy/osu-framework#5295 by @peppy)
Should help overall game performance quite substantially.
Run audio operations aynchronously to reduce game stutters (#19026 by @peppy)
This should decrease visible stutters when doing things like switching beatmaps rapidly.
Fix background loading excessively on startup (#19032 by @peppy)
Noticed that in a normal startup the background can change between three and six times depending on screen scaling, seasonal beatmaps and game settings. This reduces that count to 1-2 times (1 base, 1 on successful seasonal load).
This also resolves the weirdness when using screen scaling modes by forcing all intros to have an opaque background.
Fix BeatSyncedContainer
unintentionally blocking on beatmap load (#19015 by @peppy)
This would cause large stutters at song select while the game waited for the beatmap to load. We generally had it loading in the background, but this component was accidentally waiting on it incorrectly.
Song Select
- Fix personal best score showing delete option on context menu (#18993 by @Joehuu)
- Fix song select placeholder not showing convert hint for custom rulesets (#19023 by @peppy)
Testing
- Change test GC to not force run by default (ppy/osu-framework#5289 by @peppy)
- Improve asserts in
TestSeekPerformsInGameplayTime
to be more descriptive (#19020 by @frenzibyte) - Fix flaky tests not running at all with environment variable set (#19021 by @frenzibyte)
- Fix intermittent MusicController tests (#19041 by @smoogipoo)
Tooling
- Add statistics display for
MemoryCachingComponent
s (#19018 by @peppy) - Fix
DrawVisualiser
blocking positional input while not searching (ppy/osu-framework#5297 by @frenzibyte)
UX
- Allow searching for "skins" to find current skin setting (#19028 by @peppy)
- Allow MIDI and joysticks to trigger the osu! cookie on the initial screen (#19005 by @Susko3)
- Makes sense as all keyboard keys currently trigger it.
Will hopefully aid in visibility that such input methods natively work in osu! (without having to dig into settings).
- Makes sense as all keyboard keys currently trigger it.
- Add forgotten password link to login form (#19010 by @peppy)
- Add local handling of cases where a beatmap's file cannot be found on disk (#19022 by @peppy)
- Better error messaging.
Full Changelog: 2022.704.0...2022.709.0
Thanks for following along! This is a tagged release (2022.704.0). For more information check out the osu! changelog page and dev blog.
Audio
Update SFX for mod select overlay show/hide (#18970 by @nekodex)
Code Quality
- Move joystick-axis-to-button simulation out of
JoystickHandler
(ppy/osu-framework#5278 by @Susko3) - Remove nullable disable annotation in the utils namespace (#18957 by @andy840119)
- Remove nullable disable annotation in the extension namespace (#18958 by @andy840119)
- Separate slider ball and followcircle skinnables into default/legacy classes (#18945 by @goodtrailer)
- Remove nullable disable annotation in the utils namespace (ppy/osu-framework#5282 by @andy840119)
- Remove nullable disable annotation in replays namespace (#18985 by @andy840119)
Database
Update beatmap statistics and difficulty after making changes in the editor (#18835 by @peppy)
Smaller changes
- Fix
PerformWrite
not rolling back transaction on exception (#18951 by @peppy) - Ensure all async writes are completed before realm is disposed (#18874 by @peppy)
- Add more verbose logging to realm blocking process (#18979 by @peppy)
Framework
- Remove iOS build CI workaround (#18967 by @frenzibyte)
- Add code autocomplete blacklist (ppy/osu-framework#5285 by @Susko3)
- Fix some user-provided tournament resources not displaying (ppy/osu-framework#5287 by @frenzibyte)
- Regressed in a recent release.
Gameplay
Fix replays showing incorrect star difficulty on load (#18984 by @frenzibyte)
Send beatmap hash to server on solo score request (#18978 by @peppy)
Right now, the client does nothing to ensure a beatmap is in a valid state before requesting to submit a score. There is further work to be done client-side so it is more aware of this state (already handled for playlists, but not for the solo gameplay loop), but the solution I have in mind for that is a bit more involved.
This is not used server-side yet, but I want to get this sending so we can start using it for some very basic validation.
Smaller changes
- Fix converting "inherited" mods to legacy mods (#18948 by @smoogipoo)
Gameplay (osu!)
- Imitate stable's slider ball fade in/out animation (#18977 by @goodtrailer)
- Though only a minor change which is basically imperceptible for most skins, some skins actually draw the followcircle as part of the ball sprite, resulting in instantly fading followcircles. An example in a relatively popular skin is shigetora's, Seoul v10 (reddit). The effect is slight but noticeable in this case, and doesn't work the same with lazer's current slider ball fade anims.
Localisation
Multiplayer
Add room public/private filter to multiplayer lounge screen (#18821 by @ggliv)
Smaller changes
- Fix slider bar drags not being relative to mouse down position (ppy/osu-framework#5277 by @peppy)
Performance
Reduce overhead of transform processing when no transforms are present in a drawable (ppy/osu-framework#5279 by @peppy)
Should help quite a bit for cases with many things on screen (like multiplayer spectator).
Reliability
- Fix potential crash in
BeatmapLeaderboard
during rapid refresh operations (#18964 by @peppy) - Use null-forgiving operator for
AsNonNull
rather than assertion (ppy/osu-framework#5288 by @frenzibyte)
Song Select
Add difficulty filter reset to song select "no results" suggestions (#18963 by @peppy)
Also now displays multiple suggestions at once.
osu.2022-07-01.at.06.30.26.mp4
Move star difficulty filter to song select (#18962 by @peppy)
A lot of people accidentally set this setting in the global settings then can't see any beatmaps. Moving it to song select is a usability priority, to the point I've taken some shortcuts to get this in sooner (before the full song select redesign). Focus is on usability, not getting the control looking great, but I think it works okay.
osu.2022-07-01.at.06.19.47.mp4
Testing
- Fix crash on visual testing
TestSceneChatOverlay
due to null user (#18939 by @peppy) - Fix flaky song select placeholder test by changing ruleset post-display (#18941 by @peppy)
- Attempt to fix editor navigation test failures again (#18944 by @bdach)
- Attempt to fix flaky TestSceneAutoplay test (#18947 by @smoogipoo)
- Ensure PlaylistItem's beatmap is not null (#18949 by @smoogipoo)
- Fix directory cleanup occurring too early during realm tests (#18953 by @peppy)
- Fix various multiplayer test failures due to not waiting for ongoing operation (#18955 by @peppy)
- Fix test sometimes referencing old ModSelect object (#18966 by @smoogipoo)
- Fix cross-pollution of server- and client-side multiplayer objects in tests (#18969 by @smoogipoo)
- Allow disabling forced GC during test runs (ppy/osu-framework#5284 by @peppy)
- Fix ID clash with announce and PM channels in chat overlay tests (#18982 by @peppy)
- Fix
BeatmapInfoWedge
test potentially failing due to quick initial load (#18981 by @peppy) - Mark, document and silence remaining flaky tests on standard CI runs (#18965 by @peppy)
- Will still continue to be monitored via teamcity (which will have the environment variable set).
UX
Full Changelog: 2022.630.0...2022.704.0
Thanks for following along! This is a tagged release (2022.630.0). For more information check out the osu! changelog page and dev blog.
Hotfix release to stop custom ruleset crashes.
Code Quality
- Change closure elimination to hint (#18925 by @peppy)
- Pretty noisy as a suggestion, and can fire incorrectly quite a lot (aka
Schedule()
).
- Pretty noisy as a suggestion, and can fire incorrectly quite a lot (aka
- Remove the nullable disable annotation in the localisation. (#18921 by @andy840119)
- Remove the nullable disable annotations in the class belongs to the migration namespace. (#18920 by @andy840119)
Gameplay (osu!)
- Remove difficulty spike nerf from the Flashlight skill in osu! (#18791 by @apollo-dw)
- Change speed accuracy scaling to be closer to worst case scenario (#15035 by @emu1337)
Gameplay (osu!mania)
Platform (Android)
- Fix pressing keys on a hardware keyboard showing the software keyboard (ppy/osu-framework#5274 by @Susko3)
- Fix backspace not working properly with hardware keyboards (ppy/osu-framework#5275 by @Susko3)
Reliability
Guard against ruleset icon creation failures to avoid whole game death (#18935 by @peppy)
Smaller changes
- Fix one more case of collection modification during enumeration (#18928 by @peppy)
- Guard against
NaN
star difficulty results (#18936 by @peppy)
UI
Full Changelog: 2022.628.0...2022.630.0
Thanks for following along! This is a tagged release (2022.628.0). For more information check out the osu! changelog page and dev blog.
Audio
Add audio feedback for rearranging list items (ppy/osu-resources#200 by @nekodex)
Smaller changes
Code Quality
- Change always-discarded-parameter inspection to hint (#18806 by @peppy)
- Ban usage of
ManualResetEventSlim.Wait()
without a timeout value (#18816 by @peppy) - Enable NRT on
IHasCustomTooltip
interface (ppy/osu-framework#5260 by @peppy) - Enable NRT and tidy up
BeatmapDifficultyCache
(#18820 by @peppy) - Refactor difficulty icons to not suck (#18819 by @peppy)
- Remove unused bindable retrieval flow in
BeatmapDifficultyCache
(#18832 by @peppy) - Add messages to all
InvalidOperationException
s (#18908 by @peppy)
Database
- Ensure
WorkingBeatmap
is always using a detached instance (#18833 by @peppy) - Fix second case of empty beatmaps being reported to sentry as errors (#18862 by @peppy)
- Also makes logging more relevant on other failures.
Editor
Support undo/redo for control points in the Editor (#18668 by @smoogipoo)
Bit of a temporary solution just to make things work.
Smaller changes
Framework
- Refactor
TextureStore
to improve nesting support (ppy/osu-framework#5240 by @frenzibyte) - Revert making
TextureLoaderStore
ctor internal for now (ppy/osu-framework#5266 by @bdach)
Gameplay (osu!)
Track the full size of the follow circle at all times (#18795 by @smoogipoo)
Localisation
- Disallow usage of
string.To{Upper,Lower}()
without explicit culture (ppy/osu-framework#5261 by @bdach) - Early-return on
GetDescription
/GetLocalisableDescription
if already string type (ppy/osu-framework#5263 by @frenzibyte) - Disallow usage of
string.To{Upper,Lower}()
without explicit culture (#18834 by @bdach) - Allow initial locale mappings to be added in a single call (ppy/osu-framework#5276 by @peppy)
- Mostly as a performance consideration.
Performance
Fix stuttering when adjusting beatmap offset with many beatmaps loaded (#18790 by @peppy)
Fix TripleBuffer
sleeping too long at high frame rates (ppy/osu-framework#5267 by @peppy)
Put simply, this improves cross-thread frame synchronisation between update and draw threads. Primarily this change was to fix draw fps being lower than expected when running at "Basically Unlimited", but it should improve perceived latency across the board, especially at lower frame rates. Note that per-core CPU will be slightly higher than before (~10-20%) but only if there's enough headroom. In other words, if your CPU was already struggling then it won't be any worse with this change.
Initialise OpenTabletDriver asynchronously (ppy/osu-framework#5269 by @peppy)
It takes a long time to start this up. Now it's done on another thread so the game can continue to get ready.
Smaller changes
- Use new static HashData methods for .NET 6+ targets (ppy/osu-framework#5256 by @turbedi)
- Avoid retriving every
CultureInfo
on startup (ppy/osu-framework#5270 by @peppy)
Platform
- Disable ugly green border when using hardware keyboard on Android (ppy/osu-framework#5273 by @Susko3)
Reliability
- Fix collection modified during
BlockAllOperations
if any subscriptions have been established (#18811 by @peppy)- Big oops, easy fix.
- Fix potential exception when calling
FinishTransforms
results in child changes (ppy/osu-framework#5257 by @peppy) - Validate transform values before queuing to drawable (ppy/osu-framework#5264 by @frenzibyte)
- Avoid div-by-zero in waveform resampling code (ppy/osu-framework#5271 by @peppy)
- Fix potential crash on
CloseAllOverlays
due to collection mutation (#18906 by @peppy)
Song Select
Add setting option to toggle between mod overlay hotkey styles (#18796 by @bdach)
Two styles are offered:
Sequential - pretty much what was already in place, i.e. the rows of the keyboard correspond to the first three columns, and each key in the row corresponds to each mod in the column. A small change here is that when the set of available mods changes so do the keybinds, and the keys are now fully index-based (relevant issue thread comment).
Classic - mostly matches stable 1:1 (more on this later). Mods use keybinds that are specific to them, i.e. Hard Rock will always be A no matter what. Notably, this also brings back multi mod cycling in a sense. This addresses #18417.
2022-06-21.15-34-17.mp4
Testing
- Remove room null assertion in
TestMultiplayerClient.ChangeState
to avoid assert (#18815 by @peppy) - Remove remaining
Room != null
checks inTestMultiplayerClient
where possible (#18817 by @peppy) - Add environment variable flag to cause until steps to never timeout (ppy/osu-framework#5262 by @peppy)
- Fix dangerous
File.Copy
causing intermittent realm migration test failures (#18831 by @peppy) - Fix test deadlock due to TPL threadpool saturation (#18849 by @peppy)
- Attempt to fix flaky
PlaylistOverlay
test (#18853 by @peppy)- Final attempt to fix https://github.com/ppy/osu/runs/7059576471?check_suite_focus=true before ignoring or adding a repeat count to it. No idea if it will work, is the only thing I can think of.
- Attempt to fix flaky
EditorNavigation
test (#18854 by @peppy) - Fix chat tests failing 1/10000 runs (#18865 by @peppy)
- Fix
TestStoryboardSkipOutro
occasionally failing due to strict timings (#18866 by @peppy) - Fix occasional failure in realm test proceedings due to incorrect
Debug.Assert
(#18871 by @peppy) - Centralise and harden editor-ready-for-use check (#18864 by @peppy)
- Add logging for various cases of
SongSelect.FinaliseSelection
being aborted (#18875 by @peppy) - Add various logging of global
WorkingBeatmap
state changes (#18872 by @peppy) - Wait for and dismiss notification in editor navigation test (#18910 by @bdach)
- Add logging around current channel changes and join requests (#18913 by @peppy)
- Increase leniences on
TestSceneSpectatorPlayback.TestWithSendFailure
(#18914 by @peppy) - Apply various refactorings to
TestSceneSliderSnaking
(#18915 by @peppy) - Fix more chat test failures (#18916 by @peppy)
Tooling
- Fix typo in auto-import ignore rules (#18826 by @frenzibyte)
- Update c# language version to 9 (ppy/osu-framework#5265 by @peppy)
- Pass online beatmap info into
DifficultyAttributes.FromDatabaseAttributes()
(#18863 by @smoogipoo) - Update translations (ppy/osu-resources#201 by @peppy)
- Update framework (#18917 by @peppy)
UI
Added subheadings to maintenance section in settings (#18802 by @Supersonicboss1)
Previously, the maintenance section was just one big block of buttons, seemingly ordered in no meaningful way.
This separates each 'category' into its own subheading to improve the general feel of that section, even though it's not generally used.
UX
Adjust menu cursor rotation to use a floating centre-point (#18841 by @peppy)
Been bugging me for a while. Adjusted snappiness of animations and fixed centre point being stuck at original mouse down location.
Fix clicks sometimes not being handled due to being caught incorrectly as double-clicks (ppy/osu-framework#5268 by @frenzibyte)
Regression in recent builds.
Smaller changes
- Add back online view container to chat overlay (#18804 by @Joehuu)
- The redesign didn't put back the online view container, causing chat to look like you're online until you try to type something.
Full Changelog: 2022.621.0...2022.628.0
Thanks for following along! This is a tagged release (2022.621.0). For more information check out the osu! changelog page and dev blog.
Code Quality
- More clean-up work on realm/beatmap import flow (#18712 by @peppy)
- More model importer clean-ups (delete
BeatmapModelManager
) (#18733 by @peppy) - Remove
RealmArchiveModelManager
from hierarchy (#18734 by @peppy) - Remove one more
RealmArchiveModelImporter
Import
method (#18776 by @peppy) - Remove null default value in
ImportSkinTest
helper method (#18778 by @bdach) - Remove necessity to provide
BeatmapDifficultyCache
as a function toScoreManager
(#18779 by @peppy) - Rename importer
PostImport
toPresentImport
and add properPostImport
(#18780 by @peppy)
Database
- Fix database migration potentially hard crashing during backup process without informing the user why (#18731 by @peppy)
- Silence exception and provide more log output when import fails due to empty
.osu
files (#18777 by @peppy)
Difficulty Calculation
Rework double-tap detection in osu!'s "Speed" evaluator (#18692 by @apollo-dw)
Addresses pp awarded by maps such as this one being far too high.
Desmos link for the maths: https://www.desmos.com/calculator/vr8nzfqo4b
Rankings for this proposal: https://pp.huismetbenen.nl/rankings/players/apollo2
This proposal rebalances the state of doubletappable doubles, punishing them more accurately for how easily cheesable they are. This is done by calculating the time to press the current and next object, as well as comparing the intervals to the 300 hitwindow.
This takes advantage of the fact we can access the next object to work out the "doubletapness" of the current object, can refer to the code / desmos since it pretty much speaks for itself... also switches strain decay to take in StrainTime
instead of DeltaTime
. Results here appear to be a lot better IMO than the previous iteration on quite a few notable maps with cheesable doubles / 2B.
Editor
Fix new hitobject placements not taking on the existing sample settings (#18754 by @peppy)
Similar to velocity / difficulty points, a user expectation is that volume and sample settings will be transferred to newly placed objects from the most recent one.
Fix adjusting offset via button seeking to timing point's offset unexpectedly (#18762 by @peppy)
This was added with the intention of tracking the offset when already at the start (the most common case when you're using the tap timing wizard), but was also seeking when the user may be much further beyond or before it.
New audio feedback for metronome (#18744 by @nekodex)
Now with a unique tick sound, different for downbeats. Also a nice click when locking into the stopped position.
Smaller changes
- Cancel previous metronome sound playback on pause (#18752 by @frenzibyte)
- There is still mistimed sound playback when pausing/resuming rapidly, but that's pending further discussion.
- Avoid filename issues by using specific names for audio and background files (#18703 by @frenzibyte)
- To avoid issues with unicode text and what not, background and audio tracks now get automatically renamed to
bg.xyz
/audio.xyz
. This also matches stable editor behaviour (for the audio track at least).
- To avoid issues with unicode text and what not, background and audio tracks now get automatically renamed to
- Always use beatmap ruleset in editor gameplay test mode (#18771 by @bdach)
- Fix metronome playing mistimed beat sounds on editor clock resume (#18753 by @frenzibyte)
Input
Fix toolbar music button handling keys while not hovered (#18737 by @frenzibyte)
This was a regression in the last release, causing volume to be adjusted during gameplay when using arrow keys. Sorry about that!
Fix skin editor scene selection buttons not working (#18761 by @frenzibyte)
This was another oops in the last release. All fixed.
Localisation
- Update crowdin strings and pulled localisations (ppy/osu-resources#198 by @peppy)
Multiplayer
- Block multiplayer operations until beatmap selection completes (#18708 by @smoogipoo)
Platform
Fix crash on android when pressing multiple mouse buttons at once (ppy/osu-framework#5252 by @peppy)
Add mouse input settings for android and iOS (#16464 by @Susko3)
Add ability to handle osu://
scheme links via IPC on desktop (#18786 by @bdach)
Worked until now when the game wasn't open, but this also allows clicking external links while the game is already running.
Note that further association work is reuired to make this work on windows still.
Reliability
- Add several protections when creating game-global available mods (#18715 by @bdach)
- Fix unsafe sample playback in
GameplaySampleTriggerSource
(#18728 by @peppy) - Fix
Disclaimer
screen handling user change events after initial display (#18726 by @peppy) - Fix skin editor crash if dragging a selection while exiting (#18747 by @ggliv)
Spectator
Reset spectator speed after the last frame is reached (#18768 by @smoogipoo)
Now if spectator mode is set to playback gameplay at over 1x, it will reset to 1x on catching up to the user's play.
Tooling
- Run template tests on CI (#18723 by @smoogipoo)
- Add templates to compile + inspectcode, deploy templates with framework (ppy/osu-framework#5250 by @smoogipoo)
- Add explicit
Exported = true
toAndroidGameActivity
(ppy/osu-framework#4966 by @Susko3) - Enable NRT by default (#18743 by @smoogipoo)
- Work around macOS agent regression affecting iOS CI builds (ppy/osu-framework#5253 by @frenzibyte)
- Implement search text box within the draw visualizer (ppy/osu-framework#5254 by @naoei)
Tournament
Improve tournament player JSON storage using lightweight model (#18750 by @frenzibyte)
This is a first step towards improving the overall size of brackets JSON file on larger tournaments, as requested in #18681.
On a tournament with only 8 teams in which each team consists of 3 players, this lowers the overall size of the brackets JSON file from 75.4KB down to 8KB, i.e. 90% off.
Improve tournament beatmap JSON storage using lightweight model (#18751 by @frenzibyte)
On a tournament with one round beatmap and one seeding beatmap, this lowers the overall size from 20KB down to 4KB (~80% off).
UI
Replace flag assets with twemoji-derived ones matching web (ppy/osu-resources#197 by @bdach)
Smaller changes
UX
Silence important notifications during first-run setup (#18695 by @frenzibyte)
Previously the first run overlay could be rudely dismissed by a notification arriving. Now notifications will be delayed until it finishes.
Fix "see you next time" getting cut off when restarting for update (#18760 by @peppy)
Now the restart-for-update flow follow a more standard game exit sequence. Note that this means a confirmation is shown. This will only show in the future when required (ie. when a download will be interrupted), rather than on all restarts.
Smaller changes
- Fix mouse cursor not displaying on menu elements while in latency certifier (#18736 by @frenzibyte)
Full Changelog: 2022.615.0...2022.621.0