164 Commits

Author SHA1 Message Date
d47e26f1ae now reproducible! 2025-09-12 23:44:01 +03:00
b0e5ae1109 some minor very UI changes 2025-09-12 22:39:07 +03:00
47b859ab17 l10n: replace "osu!" with "game" where suitable 2025-09-12 21:59:58 +03:00
5e523eb0b1 bump to 2025.912.0 2025-09-12 18:10:03 +03:00
Dean Herbert
d912f8c3b9 Lazer release 2025-09
For tagging purposes.
2025-09-12 16:30:29 +09:00
Dean Herbert
83c6e57984 Update resources 2025-09-11 15:00:21 +09:00
Dean Herbert
1ea17129cc Adjust debounce again to handle key down state 2025-09-11 13:25:24 +09:00
Bartłomiej Dach
1f4f6ce4fe Merge pull request #34966 from peppy/fix-carousel-thing
Fix beatmap carousel not holding selection after refilter in some cases
2025-09-10 10:31:22 +02:00
Dean Herbert
231b366e5e Merge pull request #34958 from smoogipoo/fix-skin-editor-initial-state
Fix mangled initial undo state on fresh skins
2025-09-10 17:30:30 +09:00
Dan Balasescu
762fee91ed Merge branch 'master' into fix-skin-editor-initial-state 2025-09-10 17:04:51 +09:00
Bartłomiej Dach
4d76c467f8 Merge pull request #34910 from CloneWith/update/drawable-date
Make DrawableDate formatting localizable
2025-09-10 09:54:50 +02:00
Dean Herbert
699892c6a2 Fix beatmap carousel not holding selection after refilter in some cases
Closes https://github.com/ppy/osu/issues/34923.
2025-09-10 16:37:49 +09:00
Dean Herbert
fa6b830a13 Add test coverage showing selection not being held post-filter when difficulties are being split out 2025-09-10 16:37:16 +09:00
Dean Herbert
278b232318 Fix realm not being cached in beatmap carousel tests 2025-09-10 16:37:12 +09:00
Bartłomiej Dach
6660406ee9 Change ToString() override to match pre-existing conventions 2025-09-10 15:34:18 +09:00
Bartłomiej Dach
482b7b6d3f Change class name
I suggested it myself but on revisiting it's a bit of a mouthful.
2025-09-10 15:33:46 +09:00
CloneWith
c8c87089e5 Use LocalisableString interpolation to make strings update properly 2025-09-10 07:49:14 +08:00
CloneWith
b3abd09517 Add HumanisedLocalisableDate for l10n 2025-09-10 07:48:09 +08:00
Dean Herbert
014b55602d Fix one more failing test 2025-09-10 02:41:27 +09:00
Dean Herbert
0cd3894fa6 Fix multiple failing song select tests 2025-09-10 01:31:15 +09:00
Dan Balasescu
a6e42fb0cb Fix mangled initial undo state on fresh skins 2025-09-09 20:26:41 +09:00
Dean Herbert
2bd734918a Adjust song select debounce to be high than repeat_initial_delay
I'm doing this silently to see if any users complain without being told
about the change. Without this, when holding left arrow for short
bursts, precisely *one* beatmap change happens before actual key repeat
kicks in, which feels really weird (updates the leaderboard / background
unexpectedly).

This is the simplest way to resolve the issue, so if users aren't
offended by it I think we should commit to it.

Personally it's still fast enough to not annoy me at all.
2025-09-09 19:11:50 +09:00
Dean Herbert
6362fed097 Update framework 2025-09-09 18:02:02 +09:00
Dean Herbert
16594f2986 Update resources 2025-09-09 18:01:06 +09:00
Dean Herbert
68e7af0c02 Merge pull request #34956 from peppy/bpm-filtering-less-precise
Adjust BPM filtering at song select to be less precise
2025-09-09 17:33:49 +09:00
Dean Herbert
caad065433 Merge pull request #34920 from cl8n/retro-skin
Add "retro" default skin
2025-09-09 15:48:12 +09:00
Dean Herbert
11696a7a3c Merge pull request #34932 from Joehuu/fix-argon-judgement-colored-numbers
Fix `ArgonJudgementCounterDisplay` not showing colored numbers when "Show label" is off
2025-09-09 15:20:49 +09:00
Dean Herbert
f94d5004ea Adjust BPM filtering at song select to be less precise
Closes https://github.com/ppy/osu/issues/34942.
2025-09-09 15:02:57 +09:00
Dean Herbert
335bc6cdf6 Guard against ArgonJudgementCounterDisplay crashing due to fuckery
I can't see how this can happen in a normal flow, so just doing it as a
safety measure. Pointed out in https://github.com/ppy/osu/issues/34940
but likely due to a third party fuck being loaded.
2025-09-09 14:56:21 +09:00
Dean Herbert
eb24e02c38 Merge pull request #34952 from peppy/rank-display-rate-limit-change
Change debounce method in rank display to allow more immediate updates
2025-09-08 17:23:56 +09:00
Dean Herbert
06c1b81c1b Change debounce method in rank display to allow more immediate updates 2025-09-08 15:12:49 +09:00
Dean Herbert
35885a17b4 Merge pull request #34948 from Joehuu/fix-sheared-dropdown-click-sound-area
Fix sheared dropdown click sound area
2025-09-08 13:40:15 +09:00
Joseph Madamba
c2bc67d083 Fix sheared dropdown click sound area 2025-09-07 11:00:26 -07:00
Dean Herbert
645518f5bd Fix external edit filename sanitising unintentionally dropping folder separators (#34945)
* Add failing test coverage showing external edits not working with folders

* Fix external edit filename sanitising unintentionally dropping folder separators

Closes https://github.com/ppy/osu/issues/34929.
2025-09-07 21:47:20 +09:00
Joseph Madamba
18b5c652a3 Fix ArgonJudgementCounterDisplay not showing colored numbers when "Show label" is off 2025-09-05 12:25:40 -07:00
clayton
3c1c537b1b Replace old-skin with retro skin in tests 2025-09-05 21:21:52 +09:00
clayton
6af48975b0 Add "retro" default skin 2025-09-05 21:21:52 +09:00
Dean Herbert
058835440d Update resources 2025-09-05 21:20:12 +09:00
Dean Herbert
ea79422b60 Update resources 2025-09-05 19:16:47 +09:00
Dean Herbert
543d21a0ce Merge pull request #34905 from NiyazBiyaz/update-rank-display
Fix `rank-up` and `rank-down` sounds playing too often in some scenarios
2025-09-05 16:53:55 +09:00
Dean Herbert
ab7985f31e Improve initial state handling 2025-09-05 16:19:55 +09:00
Dean Herbert
52c10a42be Change DefaultRankDisplay to start with no value 2025-09-05 16:10:27 +09:00
Dean Herbert
912c0a39cf Change debounce to be delayed since last actual change to avoid state flickering 2025-09-05 16:10:12 +09:00
Dean Herbert
45ef97c92c Simplify implementation 2025-09-05 16:01:22 +09:00
NiyazBiyaz
54d4b16a01 Fix rank-up and rank-down sounds playing too often in some scenarios 2025-09-05 15:41:04 +09:00
Dean Herbert
54a0c7af23 Merge pull request #34917 from smoogipoo/matchmaking-pool-model
Replace MatchmakingSettings with MatchmakingPool
2025-09-05 15:26:49 +09:00
Dean Herbert
891b717b3d Merge pull request #34914 from bdach/error-on-exiting-editor
Fix errors on exiting from editor if there are no more beatmaps remaining for the ruleset active in song select
2025-09-05 15:24:07 +09:00
Dean Herbert
11e1c2d73f Merge pull request #34903 from peppy/song-select-better-debounce
Fix song select debounce not handling long (stutter) frames well
2025-09-05 15:02:53 +09:00
Dan Balasescu
4475bcafa9 Add GetMatchmakingPools server method 2025-09-05 14:40:58 +09:00
Dan Balasescu
32576ff249 Replace MatchmakingSettings with MatchmakingPool 2025-09-05 14:40:48 +09:00
Bartłomiej Dach
134f854d7b Fix broken reselection logic
d4b357dfa0 contains a sneaky regression.
The previous code read:

    if (CurrentSelection != null && CheckModelEquality(beatmap, CurrentSelection))
	RequestSelection(matchingNewBeatmap);

and the new one reads:

    if (CurrentSelection is GroupedBeatmap currentBeatmapUnderGrouping)
    {
	var candidateSelection = currentBeatmapUnderGrouping with { Beatmap = beatmap };
	if (CheckModelEquality(candidateSelection, CurrentSelection))
	    RequestSelection(candidateSelection);
    }

The point is that we want to reselect `matchingNewBeatmap` here, not the
old selection. The `CheckModelEquality()` check's purpose is to check
whether *the current selection needs updating*.

I'm not sure why tests just wonderfully passed despite this, but my
suspicion is that it was because of accidental copying of realm guids
that obscured this problem.
2025-09-04 13:11:31 +02:00
Bartłomiej Dach
bae288859b Fix test failing because of new realm check 2025-09-04 12:44:36 +02:00
Bartłomiej Dach
6e5bf57fe7 Ensure that matching beatmap still exists when performing replace operation in the carousel 2025-09-04 12:44:18 +02:00
Dean Herbert
0027b9846d Merge pull request #34912 from peppy/matchmaking-model-types
Add matchmaking model types required for server-side deploy
2025-09-04 19:32:07 +09:00
Dean Herbert
1627f67ada Add variant to MatchmakingSettings 2025-09-04 18:43:46 +09:00
CloneWith
ae0f9619b9 Change wrong overwrite type in ScheduleScreen 2025-09-04 17:30:10 +08:00
Dan Balasescu
815bf9c37b Add matchmaking model types required for server-side deploy 2025-09-04 18:26:56 +09:00
Dean Herbert
b0c7b6c700 Fix multiple concerns with new debounce logic
Tried many approaches but this seems simplest to guarantee no test (or
other) regressions..
2025-09-04 18:13:16 +09:00
Dean Herbert
3fcc8d45cb Merge pull request #34911 from bdach/fix-no-report-in-playlists
Fix not being able to report users from playlists chat
2025-09-04 17:08:08 +09:00
Dean Herbert
f1d06f796a Merge pull request #34904 from bdach/local-rank-includes-unproven-scores
Treat guest user scores & scores of unknown users as the local user's
2025-09-04 17:06:51 +09:00
Bartłomiej Dach
be365dfdc5 Fix not being able to report users from playlists chat
Reported internally.
2025-09-04 09:45:32 +02:00
CloneWith
1c608e779d Make DrawableDate formatting localizable 2025-09-04 14:44:40 +08:00
Dean Herbert
b2501ae58f Change debounce consideration to use dynamic FPS moving average rather than fixed 60 fps
This should better account for scenarios where user FPS is below 60 fps.
Previously the debounce would unexpectedly be longer than usual for low
FPS scenarios.
2025-09-04 02:19:28 +09:00
Dean Herbert
23d10ccdeb Merge pull request #32297 from LukynkaCZE/argon-judgement-counter
Add argon style judgement counter
2025-09-03 21:33:07 +09:00
Bartłomiej Dach
98c3437174 Always show the same number of placeholder digits in argon judgement counter when it is vertical 2025-09-03 13:42:17 +02:00
Bartłomiej Dach
a56f81a731 Fix abysmal code quality 2025-09-03 13:23:12 +02:00
Bartłomiej Dach
dac534e22a Merge branch 'master' into argon-judgement-counter 2025-09-03 13:01:57 +02:00
Bartłomiej Dach
1ba403753c Merge branch 'master' into song-select-better-debounce 2025-09-03 12:42:21 +02:00
Bartłomiej Dach
f1a020d2c6 Treat guest user scores & scores of unknown users as the local user's 2025-09-03 12:05:03 +02:00
Bartłomiej Dach
15d73ce07e Add test coverage 2025-09-03 12:05:03 +02:00
Bartłomiej Dach
0bbad3e1cd Extract helper method for retrieving all user local scores 2025-09-03 12:05:02 +02:00
Dean Herbert
4ec620c4a9 Fix song select debounce happening too early during fast iteration if there's a stutter 2025-09-03 18:55:47 +09:00
Dean Herbert
6ce76786ed Better document various debounce constants and split out processing debounce for clarity 2025-09-03 18:55:46 +09:00
Dean Herbert
b97cb65444 Adjust song select debounce upwards slightly
I still think it can probably go higher. Just going to do this in small
increments until people complain / notice.
2025-09-03 18:55:46 +09:00
Dean Herbert
3e8775051e Implement local song select debounce rather than using Scheduler.AddDelayed
This is to allow more custom handling of the debounce timing.
2025-09-03 18:55:46 +09:00
Dean Herbert
0ab3b593e7 Merge pull request #34900 from bdach/invalid-filenames-in-imported-skins
Fix external edit operations failing due to invalid filenames
2025-09-03 18:50:17 +09:00
Dean Herbert
71d0afd4c2 Attempt to fix flaky test TestFilteringRunsAfterReturningFromGameplay
The double escape key press was dodgy from the get-go.
2025-09-03 18:49:21 +09:00
Dean Herbert
19d194476f Merge pull request #34842 from bdach/carousel-multiple-copies-of-beatmap-clean
Allow beatmaps to show up multiple times in the carousel if grouping criteria requires it
2025-09-03 18:47:25 +09:00
Bartłomiej Dach
546113451b Merge pull request #34902 from peppy/update-framework
Update framework
2025-09-03 11:46:24 +02:00
Bartłomiej Dach
4a7ee6fafc Hide object-typed CurrentSelection and expose strongly-typed alternatives instead 2025-09-03 10:24:25 +02:00
Dean Herbert
eb1263aa32 Update framework 2025-09-03 17:23:41 +09:00
Dean Herbert
a840e55977 Check exported filenames for added safety 2025-09-03 17:14:45 +09:00
Bartłomiej Dach
315eea8d9a Simplify beatmap access in carousel panels 2025-09-03 09:52:37 +02:00
Bartłomiej Dach
aa847c5833 Merge pull request #34867 from kptach/mania-multi-key
Add secondary keys for osu!mania
2025-09-03 09:38:33 +02:00
Bartłomiej Dach
5c66998c57 Replace local copy of GetValidFilename() with direct usage
Noticed in passing.
2025-09-03 09:32:43 +02:00
Bartłomiej Dach
51e7593446 Fix external edit operations failing due to invalid filenames 2025-09-03 09:26:06 +02:00
Bartłomiej Dach
6399f7e3db Add failing test case 2025-09-03 09:26:06 +02:00
Dean Herbert
1e50e36a64 Merge pull request #34892 from bdach/shift-click-beatmap-card
Download online beatmap / present local beatmap on shift-clicking beatmap cards
2025-09-03 16:19:48 +09:00
Dean Herbert
48e4844fbb Merge pull request #34891 from bdach/multi-spectator-player-fail
Adjust fail handling in multiplayer spectator player to permit showing F rank
2025-09-03 15:40:20 +09:00
Dean Herbert
566562240e Merge branch 'master' into carousel-multiple-copies-of-beatmap-clean 2025-09-03 15:35:03 +09:00
Dean Herbert
19361666a1 Add menu tip exposing new behaviour 2025-09-03 15:27:29 +09:00
Bartłomiej Dach
dc5794dceb Do not pass a whole bunch of InputKey.None down three levels for no reason 2025-09-03 07:51:52 +02:00
Dean Herbert
f414dd70f5 Merge pull request #34880 from minetoblend/fix/editor-player-crash
Fix crash when trying to test map in the editor
2025-09-03 02:31:42 +09:00
Dean Herbert
69bcef8339 Merge pull request #34893 from bdach/ignore-osu-files-in-subdirs
Ignore `.osu` files not placed at top level of beatmap archive on import
2025-09-03 02:29:20 +09:00
Dean Herbert
c29217240e Merge pull request #34819 from smoogipoo/fix-room-event-loss
Fix potential loss of room events during join
2025-09-03 02:20:43 +09:00
Krystian Ptach-Żurakowski
4a193e96e0 Change deafult keys to none 2025-09-02 17:53:31 +02:00
Bartłomiej Dach
79f7f0ecad Ignore .osu files not placed at top level of beatmap archive on import
Closes https://github.com/ppy/osu/issues/34677.
2025-09-02 14:50:31 +02:00
Bartłomiej Dach
95c7252467 Add failing test case 2025-09-02 14:43:41 +02:00
Dean Herbert
a1105ba16f Make OsuGame dependency optional for sanity 2025-09-02 21:40:52 +09:00
Dean Herbert
bee6c32b83 Change bass workaround fix to use game clock intead of another-audio-clock
paper trail:
https://github.com/ppy/osu/pull/34890#issuecomment-3244549790
2025-09-02 21:39:12 +09:00
Bartłomiej Dach
6c82f543e6 Download online beatmap / present local beatmap on shift-clicking beatmap cards
Closes https://github.com/ppy/osu/issues/34883.
2025-09-02 13:11:18 +02:00
Bartłomiej Dach
4ed72efeae Use better guard (and reword subsequent comment)
Co-authored-by: Dean Herbert <pe@ppy.sh>
2025-09-02 12:42:07 +02:00
Bartłomiej Dach
5c6bbfcc6a Adjust fail handling in multiplayer spectator player to match multiplayer player
Closes https://github.com/ppy/osu/issues/34884.
2025-09-02 12:38:34 +02:00
Bartłomiej Dach
9354547e15 Move solo spectator-specific fail logic to SoloSpectatorPlayer 2025-09-02 12:25:42 +02:00
Bartłomiej Dach
a799720232 Add failing test 2025-09-02 12:23:38 +02:00
Bartłomiej Dach
89aea73495 Merge pull request #34890 from peppy/less-frozen-gameplay
Fix gameplay freezing on stutter frames / long load times
2025-09-02 11:24:24 +02:00
Dan Balasescu
1519084f72 Eagerly clear the request queue on join 2025-09-02 17:57:15 +09:00
Dean Herbert
677beb4251 Fix gameplay freezing on stutter frames / long load times
Closes https://github.com/ppy/osu/issues/34732.

May hotfix for this one.
2025-09-02 17:37:33 +09:00
Dean Herbert
a8ef57ad0a Revert "Adjust bass invalid data threshold"
This reverts commit ddce11fbc8.
2025-09-02 17:36:08 +09:00
Bartłomiej Dach
903d91b697 Use SingleOrDefault() instead of LastOrDefault()
`LastOrDefault()` is arbitrary, and I hope this doesn't matter for
anything, because if it does, then that's utterly *horrifying*.
2025-09-02 08:08:23 +02:00
Bartłomiej Dach
b0dcd06b38 Add one more comment 2025-09-02 08:08:22 +02:00
Dean Herbert
9422fe52d1 Merge pull request #34887 from smoogipoo/fix-editor-leak 2025-09-02 11:31:14 +09:00
Krystian Ptach-Żurakowski
f9e89afe03 Add increase visibility setting for taiko hidden (#34879)
Co-authored-by: Bartłomiej Dach <dach.bartlomiej@gmail.com>
2025-09-02 10:10:58 +09:00
Dan Balasescu
cac136d3c6 Fix editor memory leak 2025-09-02 09:21:31 +09:00
Dean Herbert
63ab11ac16 Merge pull request #34885 from peppy/multiplayer-ui-sizing
Fix multiplayer lobby being unusable on mobile
2025-09-02 00:15:18 +09:00
Bartłomiej Dach
a008a66fb2 Fix test 2025-09-01 13:50:42 +02:00
Bartłomiej Dach
eb392c47e9 Merge pull request #34873 from NiyazBiyaz/fix-scale-and-rotation-popover-crash
Fix rotation & scale popovers crashing on dismissal via keyboard when simultaneously dragging sliders
2025-09-01 13:41:04 +02:00
Marvin Schürz
ffb6ae2066 Move null check after loop over nested hitobjects 2025-09-01 13:13:28 +02:00
Marvin Schürz
385529ec78 Fix mismatch in cutoff time check between preventMissOnPreviousHitObjects and markPreviousObjectsHit 2025-09-01 13:05:22 +02:00
Dean Herbert
cf471066bf Add basic spacing between participants in list 2025-09-01 19:52:29 +09:00
Dean Herbert
659480fa3f Adjust sizing of room panels and other elements to make things fit better on mobile layouts 2025-09-01 19:52:29 +09:00
Dean Herbert
209ba76b21 Reduce size of online play screen's header 2025-09-01 19:40:39 +09:00
Dean Herbert
5079a53cca Add more panel types to TestSceneRoomPanel 2025-09-01 19:37:35 +09:00
Marvin Schürz
060854f23a Revert moving markPreviousObjectsHit into LoadAsyncComplete
Running that there caused a test failure due to modifying drawables' transforms outside the update thread
2025-09-01 12:10:12 +02:00
Bartłomiej Dach
e2d661736e Fix typos 2025-09-01 12:01:36 +02:00
Bartłomiej Dach
82a135af19 Merge pull request #34882 from peppy/fix-excess-requests-song-select
Fix excess requests leading to queueing / delays of updating metadata at song select
2025-09-01 11:49:32 +02:00
Marvin Schürz
689cc27e68 Prevent npr in tests due to drawable ruleset not being available 2025-09-01 11:12:19 +02:00
Marvin Schürz
da7e256302 Move markPreviousObjectsHit into LoadAsyncComplete 2025-09-01 11:11:26 +02:00
Marvin Schürz
9827f9f189 Recursively update hit results for nested drawables 2025-09-01 11:10:30 +02:00
Dean Herbert
9d0043d03b Cancel underlying web request on local cancellation of lookup request 2025-09-01 18:00:52 +09:00
Dean Herbert
0021434a62 Fix cancellation token not actually being used 2025-09-01 18:00:52 +09:00
NiyazBiyaz
677c008b4d Fix movement via slider while popover closes 2025-09-01 13:57:14 +05:00
NiyazBiyaz
12430ce464 Move guard to scale/rotationInfo 2025-09-01 13:55:29 +05:00
Dean Herbert
5de7cc3efb Merge pull request #34764 from bdach/pinned-rooms
Add support for pinning multiplayer rooms
2025-09-01 16:52:05 +09:00
Dean Herbert
4e976cff6a Merge branch 'master' into pinned-rooms 2025-09-01 16:01:50 +09:00
Krystian Ptach-Żurakowski
c7f1210281 Better secondary keybinds for 10K 2025-08-31 21:19:26 +02:00
NiyazBiyaz
b02093505d Add OperationInProgress checking 2025-08-31 17:17:17 +05:00
Krystian Ptach-Żurakowski
08ad27459e Code quality 2025-08-30 20:36:29 +02:00
Krystian Ptach-Żurakowski
2fb481e2ee Add Secondary Keys for Mania 2025-08-30 20:35:51 +02:00
marvin
d6b4c2958d Fix crash when marking previous objects as hit 2025-08-30 19:36:17 +02:00
Bartłomiej Dach
4ffc262073 Fix rewind not working over grouping mode changes 2025-08-29 14:42:32 +02:00
Bartłomiej Dach
a27fef2437 Add failing test for rewind not working over grouping mode changes 2025-08-29 14:06:53 +02:00
Bartłomiej Dach
2b52c1de0b Fix presenting individual beatmaps from main menu breaking
In this case `CurrentSelection` is being set on the song select screen's
`OnEntering()`, at which point grouping is not yet known.
2025-08-29 13:45:27 +02:00
Bartłomiej Dach
89492cbd81 Do not attempt to refresh group in current selection if grouping is not relevant 2025-08-29 13:25:08 +02:00
Bartłomiej Dach
1bb24c923d Fix stale group refresh logic inadvertently losing selection entirely sometimes 2025-08-29 13:25:08 +02:00
Bartłomiej Dach
dfed564bda Allow BeatmapCarousel.CurrentSelection to accept raw BeatmapInfos (and redirect to appropriate grouped beatmap)
This is probably where things get a little controversial.

There are some song select flows wherein song select just wants to
ensure sanity by authoritatively setting the global beatmap. The goal is
to change the beatmap immediately and instantly. Therefore it should
kind of be the carousel's job to figure out its grouping complications.

To that end, `CurrentSelection` is made virtual, and overridden in
`BeatmapCarousel` to perform a sort of reconciliation logic. If an
external component sets `CurrentSelection` to a `BeatmapInfo`, one of
the two following things happen:

- Nothing, if the current `GroupedBeatmap` is already a copy of the
  beatmap that needs to be selected, or

- The carousel looks at its items, finds any first copy which matches
  the beatmap that the external consumer wanted selected, and changes
  selection to that instead.
2025-08-29 13:25:08 +02:00
Bartłomiej Dach
3cf0a9b9c0 Fix standalone beatmap panels not having the correct height 2025-08-29 13:25:08 +02:00
Bartłomiej Dach
107e103825 Fix changing group mode causing CurrentSelection to retain a stale GroupDefinition 2025-08-29 13:25:08 +02:00
Bartłomiej Dach
3f637db391 Fix obvious test failures from using GroupedBeatmap in BeatmapCarousel.CurrentSelection 2025-08-29 13:25:08 +02:00
Bartłomiej Dach
d4b357dfa0 Fix carousel selection not working
Basically, `BeatmapCarousel.CurrentSelection`, which is
magic-object-typed, can no longer use `BeatmapInfo` directly, it now
must also use `GroupedBeatmap`.

This spills out all the way into song select because of beatmap
selection flows that require hookup from song select.
2025-08-29 13:25:01 +02:00
Bartłomiej Dach
e98579d3af Apply most trivial adjustments to tests after beatmap model replacement 2025-08-29 13:22:37 +02:00
Bartłomiej Dach
a84c364e44 Introduce new model for "beatmaps under grouping" & allow beatmaps to appear in multiple groups
This bypasses the immediate first issue of not being able to display
multiple instances of a beatmap on the carousel because of model
equality being baked into the structure. It inevitably poses a bunch of
*other* problems, but it's a start.
2025-08-29 13:12:12 +02:00
Bartłomiej Dach
2ed79d354c Add baseline test exercising desired duplicated display 2025-08-29 13:12:12 +02:00
Bartłomiej Dach
d304a31757 Make grouping by collections and rank achieved testable without involving realm 2025-08-29 13:12:12 +02:00
Dan Balasescu
9ae6e509b7 Configure await calls 2025-08-28 13:47:55 +09:00
Dan Balasescu
b95573f97d Fix potential loss of room events during join 2025-08-28 13:20:02 +09:00
Bartłomiej Dach
03e7e2b0d8 Update tests 2025-08-22 12:44:08 +02:00
Bartłomiej Dach
20b316d32d Add indicator for pinned rooms in upper right of room panel 2025-08-22 10:17:15 +02:00
Bartłomiej Dach
a6f823e5bc Show pinned rooms on top of listing 2025-08-21 14:18:13 +02:00
LukynkaCZE
1e2468d2bb Fix SkinDeserialisationTest failing 2025-03-08 23:02:57 +01:00
LukynkaCZE
cc7e60daab forgot remove initializer vlaue 2025-03-08 21:46:17 +01:00
LukynkaCZE
bb588566e6 fix ToString 2025-03-08 21:38:45 +01:00
LukynkaCZE
cbab183ea1 add test scene 2025-03-08 21:34:27 +01:00
LukynkaCZE
b1e0cf8532 add ArgonJudgementCounterDisplay 2025-03-08 21:07:51 +01:00
251 changed files with 3197 additions and 913 deletions

2
.gitignore vendored
View File

@@ -344,4 +344,4 @@ inspectcode
FodyWeavers.xsd
.idea/.idea.osu.Desktop/.idea/misc.xml
.idea/.idea.osu.Android/.idea/deploymentTargetDropDown.xml
.idea/.idea.osu.Android/.idea/deploymentTargetDropDown.xml

View File

@@ -10,7 +10,7 @@
<EmbedAssembliesIntoApk>true</EmbedAssembliesIntoApk>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="ppy.osu.Framework.Android" Version="2025.829.0" />
<PackageReference Include="ppy.osu.Framework.Android" Version="2025.908.0" />
</ItemGroup>
<PropertyGroup>
<!-- Fody does not handle Android build well, and warns when unchanged.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

View File

@@ -1,2 +0,0 @@
[General]
// no version specified means v1

View File

@@ -79,6 +79,7 @@ namespace osu.Game.Rulesets.Mania
return new ManiaArgonSkinTransformer(skin, beatmap);
case DefaultLegacySkin:
case RetroSkin:
return new ManiaClassicSkinTransformer(skin, beatmap);
case LegacySkin:

View File

@@ -42,13 +42,22 @@ namespace osu.Game.Rulesets.Mania
var bindings = new List<KeyBinding>();
for (int i = LeftKeys.Length - columns / 2; i < LeftKeys.Length; i++)
bindings.Add(new KeyBinding(LeftKeys[i], currentAction++));
{
bindings.Add(new KeyBinding(LeftKeys[i], currentAction));
bindings.Add(new KeyBinding(InputKey.None, currentAction++));
}
if (columns % 2 == 1)
bindings.Add(new KeyBinding(SpecialKey, currentAction++));
{
bindings.Add(new KeyBinding(SpecialKey, currentAction));
bindings.Add(new KeyBinding(InputKey.None, currentAction++));
}
for (int i = 0; i < columns / 2; i++)
bindings.Add(new KeyBinding(RightKeys[i], currentAction++));
{
bindings.Add(new KeyBinding(RightKeys[i], currentAction));
bindings.Add(new KeyBinding(InputKey.None, currentAction++));
}
return bindings;
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 865 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 771 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

View File

@@ -1,6 +0,0 @@
[General]
// no version specified means v1
[Fonts]
HitCircleOverlap: 3
ScoreOverlap: 3

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 162 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

View File

@@ -176,6 +176,11 @@ namespace osu.Game.Rulesets.Osu.Edit
private void applyPosition()
{
// can happen if popover is dismissed by a keyboard key press while dragging UI controls
// it doesn't cause a crash, but it looks wrong
if (!editorBeatmap.TransactionActive)
return;
editorBeatmap.PerformOnSelection(ho =>
{
if (!initialPositions.TryGetValue(ho, out var initialPosition))

View File

@@ -157,6 +157,10 @@ namespace osu.Game.Rulesets.Osu.Edit
rotationInfo.BindValueChanged(rotation =>
{
// can happen if the popover is dismissed by a keyboard key press while dragging UI controls
if (!rotationHandler.OperationInProgress.Value)
return;
rotationHandler.Update(rotation.NewValue.Degrees, getOriginPosition(rotation.NewValue));
});
}

View File

@@ -220,6 +220,10 @@ namespace osu.Game.Rulesets.Osu.Edit
scaleInfo.BindValueChanged(scale =>
{
// can happen if the popover is dismissed by a keyboard key press while dragging UI controls
if (!scaleHandler.OperationInProgress.Value)
return;
var newScale = new Vector2(scale.NewValue.Scale, scale.NewValue.Scale);
scaleHandler.Update(newScale, getOriginPosition(scale.NewValue), getAdjustAxis(scale.NewValue), getRotation(scale.NewValue));
});

View File

@@ -5,10 +5,13 @@ using System;
using System.Collections.Generic;
using System.Linq;
using NUnit.Framework;
using osu.Framework.Testing;
using osu.Game.Beatmaps;
using osu.Game.Beatmaps.ControlPoints;
using osu.Game.Configuration;
using osu.Game.Rulesets.Taiko.Mods;
using osu.Game.Rulesets.Taiko.Objects;
using osu.Game.Rulesets.Taiko.Objects.Drawables;
namespace osu.Game.Rulesets.Taiko.Tests.Mods
{
@@ -69,5 +72,106 @@ namespace osu.Game.Rulesets.Taiko.Tests.Mods
},
});
}
[Test]
public void TestIncreasedVisibilityOnFirstObject()
{
bool firstHitNeverFadedOut = true;
AddStep("enable increased visibility", () => LocalConfig.SetValue(OsuSetting.IncreaseFirstObjectVisibility, true));
CreateModTest(new ModTestData
{
Mod = new TaikoModHidden(),
Autoplay = true,
PassCondition = () =>
{
var firstHit = this.ChildrenOfType<DrawableHit>().FirstOrDefault(h => h.HitObject.StartTime == 100);
if (firstHit?.Alpha < 1 && !firstHit.IsHit)
firstHitNeverFadedOut = false;
return firstHitNeverFadedOut && checkAllMaxResultJudgements(2).Invoke();
},
CreateBeatmap = () =>
{
var beatmap = new Beatmap<TaikoHitObject>
{
HitObjects = new List<TaikoHitObject>
{
new Hit
{
Type = HitType.Rim,
StartTime = 100,
},
new Hit
{
Type = HitType.Centre,
StartTime = 200,
},
},
BeatmapInfo =
{
Difficulty = new BeatmapDifficulty
{
SliderTickRate = 4,
OverallDifficulty = 0,
},
Ruleset = new TaikoRuleset().RulesetInfo
},
};
beatmap.ControlPointInfo.Add(0, new EffectControlPoint { ScrollSpeed = 0.1f });
return beatmap;
},
});
}
[Test]
public void TestNoIncreasedVisibilityOnFirstObject()
{
bool firstHitFadedOut = true;
AddStep("enable increased visibility", () => LocalConfig.SetValue(OsuSetting.IncreaseFirstObjectVisibility, false));
CreateModTest(new ModTestData
{
Mod = new TaikoModHidden(),
Autoplay = true,
PassCondition = () =>
{
var firstHit = this.ChildrenOfType<DrawableHit>().FirstOrDefault(h => h.HitObject.StartTime == 100);
firstHitFadedOut |= firstHit?.IsHit == false && firstHit.Alpha < 1;
return firstHitFadedOut && checkAllMaxResultJudgements(2).Invoke();
},
CreateBeatmap = () =>
{
var beatmap = new Beatmap<TaikoHitObject>
{
HitObjects = new List<TaikoHitObject>
{
new Hit
{
Type = HitType.Rim,
StartTime = 100,
},
new Hit
{
Type = HitType.Centre,
StartTime = 200,
},
},
BeatmapInfo =
{
Difficulty = new BeatmapDifficulty
{
SliderTickRate = 4,
OverallDifficulty = 0,
},
Ruleset = new TaikoRuleset().RulesetInfo
},
};
beatmap.ControlPointInfo.Add(0, new EffectControlPoint { ScrollSpeed = 0.1f });
return beatmap;
},
});
}
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

View File

@@ -1,5 +0,0 @@
[General]
Name: an old skin
Author: an old guy
// no version specified means v1

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 94 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

View File

@@ -40,7 +40,7 @@ namespace osu.Game.Rulesets.Taiko.Mods
protected override void ApplyIncreasedVisibilityState(DrawableHitObject hitObject, ArmedState state)
{
ApplyNormalVisibilityState(hitObject, state);
// intentional no-op
}
protected override void ApplyNormalVisibilityState(DrawableHitObject hitObject, ArmedState state)

View File

@@ -1018,6 +1018,49 @@ namespace osu.Game.Tests.Database
});
}
[Test]
public void TestBeatmapFilesInNestedDirectoriesAreIgnored()
{
RunTestWithRealmAsync(async (realm, storage) =>
{
var importer = new BeatmapImporter(storage, realm);
using var store = new RealmRulesetStore(realm, storage);
string? temp = TestResources.GetTestBeatmapForImport();
string extractedFolder = $"{temp}_extracted";
Directory.CreateDirectory(extractedFolder);
try
{
using (var zip = ZipArchive.Open(temp))
zip.WriteToDirectory(extractedFolder);
var subdirectory = Directory.CreateDirectory(Path.Combine(extractedFolder, "subdir"));
string modifiedCopyPath = Path.Combine(subdirectory.FullName, "duplicate.osu");
File.Copy(Directory.GetFiles(extractedFolder, "*.osu").First(), modifiedCopyPath);
using (var stream = File.OpenWrite(modifiedCopyPath))
using (var textWriter = new StreamWriter(stream))
await textWriter.WriteLineAsync("# adding a comment so that the hashes are different");
using (var zip = ZipArchive.Create())
{
zip.AddAllFromDirectory(extractedFolder);
zip.SaveTo(temp, new ZipWriterOptions(CompressionType.Deflate));
}
await importer.Import(temp);
EnsureLoaded(realm.Realm);
}
finally
{
Directory.Delete(extractedFolder, true);
}
});
}
[Test]
public void TestImportNestedStructure()
{

View File

@@ -178,6 +178,16 @@ namespace osu.Game.Tests.NonVisual.Filtering
[Test]
public void TestApplyBPMQueries()
{
const string query = "bpm=200";
var filterCriteria = new FilterCriteria();
FilterQueryParser.ApplyQueries(filterCriteria, query);
Assert.AreEqual(filterCriteria.BPM.Min, 199.5d);
Assert.AreEqual(filterCriteria.BPM.Max, 200.5d);
}
[Test]
public void TestApplyBPMRangeQueries()
{
const string query = "bpm>:200 gotta go fast";
var filterCriteria = new FilterCriteria();
@@ -185,8 +195,7 @@ namespace osu.Game.Tests.NonVisual.Filtering
Assert.AreEqual("gotta go fast", filterCriteria.SearchText.Trim());
Assert.AreEqual(3, filterCriteria.SearchTerms.Length);
Assert.IsNotNull(filterCriteria.BPM.Min);
Assert.Greater(filterCriteria.BPM.Min, 199.99d);
Assert.Less(filterCriteria.BPM.Min, 200.00d);
Assert.AreEqual(filterCriteria.BPM.Min, 199.5d);
Assert.IsNull(filterCriteria.BPM.Max);
}

Some files were not shown because too many files have changed in this diff Show More