278 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
65f275106e update license information in various places (and readme) 2025-08-31 22:47:36 +03:00
Krystian Ptach-Żurakowski
c7f1210281 Better secondary keybinds for 10K 2025-08-31 21:19:26 +02:00
6e374762fd synchronize with github 2025-08-31 21:26:21 +03:00
80646a166c add settings toggle to not delete imported archives 2025-08-31 19:39:13 +03:00
NiyazBiyaz
b02093505d Add OperationInProgress checking 2025-08-31 17:17:17 +05:00
8f0510d903 made beatmap anonymization code a bit less awful 2025-08-31 15:06:24 +03:00
02e7000ee4 update editor beatmap anonymization code to update not just first diff 2025-08-30 22:56:01 +03: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
Dean Herbert
c26e669fc5 Merge pull request #34837 from smoogipoo/more-testable-footers
Add footer to `ScreenTestScene`
2025-08-30 21:52:30 +09:00
081355864e add beatmap editor option to remove online data of a map 2025-08-29 20:19:39 +03:00
6435a835d1 fix background category selection (this time for real) 2025-08-29 18:48:13 +03:00
Dean Herbert
e621eed0ba Merge pull request #34841 from peppy/interpolate-more
Adjust interpolation workaround to catch-up slightly smoother
2025-08-29 22:04:20 +09:00
Bartłomiej Dach
4ffc262073 Fix rewind not working over grouping mode changes 2025-08-29 14:42:32 +02:00
Dean Herbert
41b8033ebd Adjust interpolation workaround to catch-up slightly smoother 2025-08-29 21:24:23 +09:00
Dean Herbert
1d9de88aaa Merge pull request #34836 from bdach/online-lookups-on-reenter
Fix song select not performing online lookup on re-enter
2025-08-29 21:21:34 +09: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
Dean Herbert
3ca5e20e70 Merge branch 'master' into online-lookups-on-reenter 2025-08-29 19:03:41 +09:00
Dean Herbert
404044e8d7 Merge pull request #34822 from bdach/carousel-multi-grouping-clean 2025-08-29 19:02:58 +09:00
Dan Balasescu
d5575b4037 Merge pull request #34830 from minetoblend/fix/hitobject-lifetime-delay
Fix hitobject drawables becoming visible 1 frame too late
2025-08-29 18:38:24 +09:00
Dan Balasescu
04ba5aa575 Move footer to ScreenTestScene 2025-08-29 17:49:48 +09:00
Bartłomiej Dach
51ed19cb99 Merge branch 'master' into carousel-multi-grouping-clean 2025-08-29 10:41:46 +02:00
Dean Herbert
0a408a3ac4 Fix tournament test failure due to control change 2025-08-29 17:12:24 +09:00
Dean Herbert
22ba956f25 Merge pull request #34833 from peppy/fix-mod-cosmetics
Fix some mods showing tooltips when settings are default
2025-08-29 17:09:01 +09:00
Bartłomiej Dach
526ee32268 Apply suggested rename 2025-08-29 09:58:56 +02:00
Bartłomiej Dach
df6d6edaca Fix song select not performing online lookup on re-enter
Closes https://github.com/ppy/osu/issues/34825.

Root cause is

	24ec43b3b6/osu.Game/Screens/SelectV2/SongSelect.cs (L345-L356)

not specifying `(..., true)`, therefore the fetch doesn't happen on
enter if song select doesn't change the global beatmap as a side effect
of the enter, which is the case on re-entering.
2025-08-29 09:31:20 +02:00
Bartłomiej Dach
24ec43b3b6 Merge pull request #34834 from peppy/tournament-warmup-better
Use switches for warmup/chat toggles in tournament interface
2025-08-29 09:09:20 +02:00
Dean Herbert
9e77a5b050 Fix obviously incorrect conditional
Co-authored-by: Bartłomiej Dach <dach.bartlomiej@gmail.com>
2025-08-29 16:01:49 +09:00
Dean Herbert
12832e9fef Use switches for warmup/chat toggles in tournament interface
As proposed in https://github.com/ppy/osu/discussions/32515.
2025-08-29 14:35:42 +09:00
Dean Herbert
e83f3d5e77 Fix some mods showing tooltips when settings are default 2025-08-29 14:08:18 +09:00
Dean Herbert
f2f5cf19a2 Return early to avoid creating mod description strings unnecessarily 2025-08-29 14:08:06 +09:00
marvin
bb9f9e4d35 Fix operations in PooledDrawableWithLifetimeContainer.CheckChildrenLife being in wrong order
Previously CompositeDrawable.CheckChildrenLife() would be run before lifetimeManager.Update() which lead to the new drawables being inserted into the container but not being made alive immediately, leading to the drawable not becoming visibile until the next update loop.
2025-08-28 23:36:29 +02:00
Bartłomiej Dach
6e1316241a Merge pull request #34774 from genskyff/feat/long-note-ratio
Add long note percentage filter for mania mode
2025-08-28 14:32:52 +02:00
Bartłomiej Dach
3eaa5314ac Merge pull request #34808 from peppy/fix-difficulty-churn
Fix beatmap carousel triggering full filters more often than it needs to
2025-08-28 14:26:25 +02:00
Bartłomiej Dach
6ba72fa481 Adjust tests to new beatmap set model usage in carousel 2025-08-28 13:09:11 +02:00
Bartłomiej Dach
8dd131f17e Support beatmap sets being split apart by the active group mode in beatmap carousel 2025-08-28 13:09:08 +02:00
Dean Herbert
7e109add96 Ensure filtering also runs after local gameplay LastPlayed changes 2025-08-28 19:10:20 +09:00
Dean Herbert
f953d58922 Merge pull request #34740 from bdach/maximised-player-audio
Always use audio from maximised player if there is one in multiplayer spectator
2025-08-28 18:27:56 +09:00
Bartłomiej Dach
47164c61b4 Add failing test coverage of splitting beatmap sets apart 2025-08-28 11:00:23 +02:00
Bartłomiej Dach
311c75aa53 Adjust test after allowing grouping modes to split beatmap sets apart 2025-08-28 11:00:23 +02:00
Dean Herbert
0b40f1d0db Merge pull request #34818 from smoogipoo/completion-handler-override
Preserve pre-post notification completion target
2025-08-28 14:10:59 +09: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
Dan Balasescu
e831d1b6fa Preserve pre-post notification completion target 2025-08-28 13:07:05 +09:00
Dean Herbert
ed15e1fb88 Merge branch 'master' into fix-difficulty-churn 2025-08-28 02:38:10 +09:00
Dean Herbert
33b99a51b1 Merge pull request #34812 from bdach/failed-at-judgement
Fix `HealthProcessor` potentially incorrectly reverting failed state
2025-08-28 02:37:44 +09:00
Dean Herbert
8a6c857719 Fix hidden beatmap state not being reflected immediately 2025-08-28 02:33:18 +09:00
Dean Herbert
5abd93eda7 Merge pull request #34809 from peppy/fix-star-rating-weird-mod-double-handling
Fix beatmap panels locally handling mod and ruleset changes unnecessarily
2025-08-28 01:27:31 +09:00
Bartłomiej Dach
4030383276 Allow grouping modes that apply max aggregate to split beatmap sets apart 2025-08-27 14:45:20 +02:00
Dean Herbert
f9c1b24df4 Apply in more places 2025-08-27 19:59:44 +09:00
Bartłomiej Dach
197c318180 Fix HealthProcessor potentially incorrectly reverting failed state
This stems from me looking into `TestSceneFailAnimation` failures
(https://github.com/ppy/osu/runs/48663953318). As it turns out, I should
not have been mad by CI, and rather should have been mad at myself for
failing to read.

`FailedAtJudgement` in fact does not mean "this judgement, and only this
judgement, triggered failure". If any further judgements occur
post-fail, they will also have `FailedAtJudgement` set to true. It is
essentially a *dump* of the state of `HealthProcessor.Failed` prior to
applying the judgement.

	ec21685c25/osu.Game/Rulesets/Scoring/HealthProcessor.cs (L49-L57)

Because of this, reverting several judgements which occur post-fail
could lead to failed state reverting earlier than intended, and thus
potentially trigger a second fail, thus tripping the `Player` assertion.
2025-08-27 12:27:11 +02:00
Dean Herbert
fda40d7fd5 Fix beatmap panels locally handling mod changes unnecessarily
The `BeatmapDifficultyCache` handles mod changes, so handling locally is
unnecessary. By handling locally, it creates a visual issue when
adjusting mods often. Test using Ctrl +/- at song select and observing
that without this change, the star rating will flicker back to the
default due to the local re-fetch.
2025-08-27 18:31:50 +09:00
Dean Herbert
be6fb9aa77 Fix beatmap carousel re-filtering when it doesn't need to
Local rules ensure we only handle callbacks when we need to.
2025-08-27 18:21:19 +09:00
Dean Herbert
0e57ee9ba6 Avoid triggering changes when add operations are empty
Only seems to happen in tests. I think.
2025-08-27 18:13:13 +09:00
Dean Herbert
043235fed2 Add test coverage ensuring filtering does not occur on unnecessary updates 2025-08-27 18:13:12 +09:00
Dean Herbert
ec21685c25 Merge pull request #34803 from peppy/update-framework-please-no-clock-breakage
Update framework
2025-08-27 13:23:09 +09:00
628181a883 also update colour on load 2025-08-27 01:11:57 +03:00
835329efd3 synchronize with github 2025-08-27 00:59:45 +03:00
5399943118 update logo colour only when changing setting value 2025-08-27 00:58:26 +03:00
d07f82f6f4 refactor custom seasonal background code
some of it may be trauma-inducing, but I don't know how to make it
better
2025-08-27 00:43:26 +03:00
Dean Herbert
244bad07c7 Update framework 2025-08-26 21:43:09 +09:00
Binwalker
149f18c3f5 test(ManiaFilterCriteriaTest): simplify test case 2025-08-26 21:36:20 +09:00
Binwalker
6a82b7331f refactor(ManiaFilterCriteria): exclude converted beatmaps from long note filter 2025-08-26 21:36:20 +09:00
Binwalker
65253708d8 test(ManiaFilterCriteriaTest): fix some test case for ln filter 2025-08-26 21:36:20 +09:00
Binwalker
556c2469bf fix(ManiaFilterCriteria): converted beatmaps are not included 2025-08-26 21:36:20 +09:00
Binwalker
f7b0e114a9 test(ManiaFilterCriteriaTest): add some testcase 2025-08-26 21:36:20 +09:00
Binwalker
68677200f3 feat(ManiaFilterCriteria): add long note ratio filter for mania 2025-08-26 21:36:19 +09:00
Dean Herbert
2bea59e65f Merge pull request #34802 from bdach/hack-around-carousel-panel-refresh
Work around excessive refreshes of carousel beatmap set panel backgrounds
2025-08-26 21:13:28 +09:00
Bartłomiej Dach
c0fd5637de Work around excessive refreshes of carousel beatmap set panel backgrounds
Closes https://github.com/ppy/osu/issues/34511 I guess.
2025-08-26 13:27:54 +02:00
Bartłomiej Dach
5e7a99c97f Merge pull request #34801 from peppy/replay-player-null
Fix crash on exiting `ReplayPlayer` is beatmap was not loaded successfully
2025-08-26 12:11:27 +02:00
Bartłomiej Dach
8f628d16ae Merge pull request #34800 from peppy/fix-daily-challenge-leaderboard-skip
Fix daily challenge / playlist leaderboard sometimes showing incorrect default state
2025-08-26 12:07:41 +02:00
Dean Herbert
2ccb65aa65 Add test coverage and fix one more fail case 2025-08-26 18:41:14 +09:00
Dean Herbert
4d851f2527 Fix crash on exiting ReplayPlayer is beatmap was not loaded successfully
Closes https://github.com/ppy/osu/issues/34763.
2025-08-26 18:31:42 +09:00
Dean Herbert
4bafbfb9e4 Apply NRT to ReplayPlayer for good measure 2025-08-26 18:30:12 +09:00
Dean Herbert
3f179e3903 Sort scores immediately for good measure 2025-08-26 17:51:14 +09:00
Dean Herbert
196b28115e Fix playlist leaderboard provider potentially inserting local user in wrong order
Due to `Perform` being used from a BDL method in conjunction with
`Success` (which is scheduled to the *update* thread), there was a
chance that the order of execution would be not quite as intended.

To rectify, let's not use `Success` and just continue with synchronous
flow.
2025-08-26 17:51:02 +09:00
Dean Herbert
7660a9ba8e Merge pull request #34794 from bdach/fix-aim-meter
Fix aim error meter applying incorrect scaling constant in normalised mode
2025-08-26 15:16:15 +09:00
Bartłomiej Dach
e908b80359 Fix aim error meter applying incorrect scaling constant in relative mode
Closes https://github.com/ppy/osu/issues/34769

Visible (and easiest to check) in test scene.
2025-08-25 14:20:05 +02:00
Bartłomiej Dach
a2bf8e3988 Fix copy-paste fail in log message 2025-08-25 13:43:03 +02:00
5b186bb740 potentially make logo look less weird (untested)
uh, yeah, I accidentally flipped the colors around in the UpdateColour() method (which I should've probably make private or protected), and it's the reason why the logo overall looked dimmer than it should've

anyhow, this should *probably* look a bit better, don't have any means to test it yet though
2025-08-25 12:46:27 +02:00
Bartłomiej Dach
6e8246b539 Merge pull request #34761 from frenzibyte/fix-flashlight
Fix flashlight not always matching gameplay scaling
2025-08-25 12:03:58 +02:00
6cb99c13c2 added cookie color customization (which shouldn't have been done) 2025-08-24 19:46:36 +03:00
Salman Alshamrani
3cca458c21 Fix xmldoc error and reword 2025-08-24 18:55:45 +03:00
Salman Alshamrani
bc59270f3e Fix flashlight not handling internal playfield sizing changes
Note that this does not handle sizing/scaling changes applied directly
to `Playfield`, but it handles any changes within the layers inside
`PlayfieldAdjustmentContainer`.
2025-08-24 17:51:05 +03:00
96008e06ab added settings toggle for song select v1 2025-08-24 05:42:59 +03:00
590b0a8028 welcome back select v1 2025-08-24 04:55:25 +03:00
70f7f09a83 synchronize with github (ppy/osu) 2025-08-23 18:11:07 +03:00
Dean Herbert
16343fd7d6 Merge pull request #34766 from bdach/remove-double-lookup
Pull up online beatmap set lookup to song select level to avoid two components doing the same fetch independently
2025-08-23 20:50:17 +09:00
Dean Herbert
acafc06bcc Merge pull request #34757 from bdach/new-mod-icons
Update mod icons
2025-08-23 19:55:10 +09:00
Salman Alshamrani
c0c3690908 Remove no longer valid test 2025-08-23 09:28:14 +03:00
490137405f added installer build script, adapted autoupdates (not functional yet) 2025-08-22 22:26:17 +03:00
f3c6f53f70 added version to 'experimental version' banner 2025-08-22 20:19:18 +03:00
8cb5c682b4 make seasonal bg config strings localisable 2025-08-22 19:07:15 +03:00
c3d79295d3 made seasonal background notifications transient 2025-08-22 16:07:28 +03:00
Bartłomiej Dach
5292d4a04e Fix song select favourite button potentially showing stale data from (un)favourite request callback 2025-08-22 14:25:25 +02:00
Bartłomiej Dach
d3ae20dd88 Pull up online beatmap set lookup to song select level to avoid two components doing the same fetch independently 2025-08-22 14:25:21 +02:00
Dean Herbert
c852e5854c Merge pull request #34723 from bdach/status-updates-are-great-arent-they
Refresh realm before performing song select refetches following an online metadata lookup
2025-08-22 20:25:36 +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
Dan Balasescu
0756c45d70 No longer download iOS simulator
https://github.com/actions/runner-images/issues/12862#issuecomment-3209787203
2025-08-22 13:29:46 +09:00
Salman Alshamrani
73624e4e25 Add visual test setup for taiko flashlight 2025-08-21 19:03:43 +03:00
Salman Alshamrani
f374af7ce7 Fix taiko flashlight applying aspect ratio twice 2025-08-21 19:03:43 +03:00
Salman Alshamrani
7530ad1a7b Adjust default flashlight size on osu! & osu!catch
Because the flashlight is made to be scaled by playfield, there are
constant scale factors applied somewhere in the
`PlayfieldAdjustmentContainer` which needs to be reflected in the
flashlight size to keep the size the same.

The factor is specifically 1.6x, computed in {Osu,Catch}PlayfieldAdjustmentContainer.ScalingContainer`.

More generally, I've deduced these factors by logging the difference
between the `flashlightSize` before and after b78abe2f.
2025-08-21 19:03:43 +03:00
Salman Alshamrani
a049f5065d Fix flashlight not correctly scaled to match playfield 2025-08-21 19:03:43 +03:00
Bartłomiej Dach
4627c8a859 Update resources 2025-08-21 14:44:43 +02:00
Bartłomiej Dach
a6f823e5bc Show pinned rooms on top of listing 2025-08-21 14:18:13 +02:00
Dean Herbert
30f7da8f71 Merge pull request #34759 from bdach/BACKGROUND-STUCK-PLEASE-I-BEG-YOU
Fix song select background being stuck in revealed state
2025-08-21 21:01:59 +09:00
Dean Herbert
4b8ff481fd Merge pull request #34752 from bdach/avoid-endless-futile-backpopulation
Fix submission & rank date backpopulation failing every launch for some users
2025-08-21 20:37:03 +09:00
Bartłomiej Dach
a7f1795f98 Fix song select background being stuck in revealed state
Closes https://github.com/ppy/osu/issues/34731.

The failure scenario here is as follows:

- User holds down left mouse button for >200ms to reveal the background.
- User presses down another mouse button and releases it in <200ms.
- User releases left mouse button. Song select does not return.

The timing here is key because what is happening here is that the second
mouse button press is overwriting the `revealingBackground` scheduled
delegate. Releasing that same mouse button within 200ms leads to that
scheduled delegate being cancelled and cleared, and thus the release of
left mouse wrongly decides there is nothing left to do.

One thing I'm not entirely sure about is the release behaviour even with
this change; as things stand, the first release of any mouse button will
bring song select back, even if it was not the button that was initially
held down to reveal the background. That's probably easily fixed if
deemed required, but I'm most interested in fixing the bad breakage.
2025-08-21 11:31:37 +02:00
Bartłomiej Dach
c053cfbf9b Adjust icon sizings in mod display to match new assets 2025-08-21 09:00:48 +02:00
Bartłomiej Dach
e47a60f303 Add test steps to mod icon test scene for exercising all rulesets 2025-08-21 09:00:46 +02:00
Bartłomiej Dach
92016a7d9b Add and use new mod icon assets 2025-08-21 09:00:44 +02:00
Dean Herbert
41885c0fc0 Merge pull request #34643 from frenzibyte/leaderboard-resize
Fix leaderboard not resizing correctly
2025-08-21 13:33:24 +09:00
Dean Herbert
e75a6b4010 Log bass issues for more than one frame 2025-08-21 13:27:14 +09:00
Dean Herbert
ddce11fbc8 Adjust bass invalid data threshold 2025-08-21 13:27:13 +09:00
Bartłomiej Dach
c894969d17 Fix submission & rank date failing every launch for some users
Addresses https://github.com/ppy/osu/discussions/34705, I suppose.

The cagey tone of that statement is because this change merely papers
over the issue. The issue in question for the user that reported this is
that they have a bunch of very old beatmaps, whose md5 hashes do not
match the online hashes, that need updating. The submission/rank date
population was running every single time for these, and failing every
time, because there is really not much useful that the lookup *can* do.

Because mappers have made `OnlineID` essentially useless for determining
the provenance of a beatmap due to reusing them to "fix" beatmap
submission failures, online IDs have been explicitly disallowed from use
in any sort of beatmap lookup flow. The only things that are allowed to
be used are: md5 of the beatmap, and filename as a fallback for very old
beatmaps / beatmap packs.

If the user has local beatmaps with md5 not matching online, chances are
that any metadata lookups are likely to fail or return bogus data. At
that point my personal feeling is that backpopulation flows should leave
such beatmaps well alone and the user should just go update the beatmap
themselves.

I am aware that updating 124 individual beatmap sets would - in the
current state of things - would probably be a ridiculously onerous thing
to do, and that people have been asking multiple times for a facility to
update all local beatmaps at once, but that discussion is out of scope
at this stage.
2025-08-20 09:21:35 +02:00
Bartłomiej Dach
ad6c0c272d Fix leaderboard score text never showing if leaderboard starts collapsed
Only seems to reproduce in gameplay for whatever reason. Can't justify
spending time to chase down why really because the previous code looked
obviously wrong on closer inspection anyway (`rightLayer` has transforms
applied to it on collapse/expand).
2025-08-19 13:32:01 +02:00
Bartłomiej Dach
083365f332 Always use audio from maximised player if there is one in multiplayer spectator 2025-08-19 12:03:35 +02:00
Bartłomiej Dach
62b4999184 Add failing test case 2025-08-19 12:03:12 +02:00
Salman Alshamrani
bb5933ef80 Add test for scores with long score/combo numbers 2025-08-18 13:46:51 +03:00
Salman Alshamrani
62548244bc Hide right-side numbers when not enough space is available 2025-08-18 13:46:08 +03:00
Bartłomiej Dach
a393b3c6b1 Refresh realm before performing song select refetches following an online metadata lookup
Probably closes https://github.com/ppy/osu/issues/34716

Can't see any other cause, can reproduce the issue on master using
manual db modifications via realm studio and it is not a consistent
reproduction, so seems like an open-and-shut lack of refresh.
2025-08-18 09:48:32 +02:00
Salman Alshamrani
a3443f76be Limit leaderboard size to sane minimum values 2025-08-13 12:52:08 +03:00
Salman Alshamrani
d998847271 Fix leaderboard not resizing correctly 2025-08-13 12:51:51 +03:00
Salman Alshamrani
62803af1de Add ability to resize leaderboard in tests 2025-08-13 12:51:09 +03: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
380 changed files with 5539 additions and 1897 deletions

View File

@@ -148,9 +148,7 @@ jobs:
# https://github.com/dotnet/macios/issues/19157
# https://github.com/actions/runner-images/issues/12758
- name: Use Xcode 16.4
run: |
sudo xcode-select -switch /Applications/Xcode_16.4.app
xcodebuild -downloadPlatform iOS
run: sudo xcode-select -switch /Applications/Xcode_16.4.app
- name: Build
run: dotnet build -c Debug osu.iOS.slnf

3
.gitignore vendored
View File

@@ -19,6 +19,7 @@ bld/
[Bb]in/
[Oo]bj/
[Ll]og/
[Pp]ub/
# Visual Studio 2015 cache/options directory
.vs/
@@ -343,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

36
.vscode/launch.json vendored
View File

@@ -7,9 +7,9 @@
"request": "launch",
"program": "dotnet",
"args": [
"${workspaceRoot}/osu.Desktop/bin/Debug/net8.0/osu!.dll"
"${workspaceFolder}/osu.Desktop/bin/Debug/net8.0/osu!.dll"
],
"cwd": "${workspaceRoot}",
"cwd": "${workspaceFolder}",
"preLaunchTask": "Build osu! (Debug)",
"console": "internalConsole"
},
@@ -19,9 +19,9 @@
"request": "launch",
"program": "dotnet",
"args": [
"${workspaceRoot}/osu.Desktop/bin/Release/net8.0/osu!.dll"
"${workspaceFolder}/osu.Desktop/bin/Release/net8.0/osu!.dll"
],
"cwd": "${workspaceRoot}",
"cwd": "${workspaceFolder}",
"preLaunchTask": "Build osu! (Release)",
"console": "internalConsole"
},
@@ -31,9 +31,9 @@
"request": "launch",
"program": "dotnet",
"args": [
"${workspaceRoot}/osu.Game.Tests/bin/Debug/net8.0/osu.Game.Tests.dll"
"${workspaceFolder}/osu.Game.Tests/bin/Debug/net8.0/osu.Game.Tests.dll"
],
"cwd": "${workspaceRoot}",
"cwd": "${workspaceFolder}",
"preLaunchTask": "Build tests (Debug)",
"console": "internalConsole"
},
@@ -43,9 +43,9 @@
"request": "launch",
"program": "dotnet",
"args": [
"${workspaceRoot}/osu.Game.Tests/bin/Release/net8.0/osu.Game.Tests.dll"
"${workspaceFolder}/osu.Game.Tests/bin/Release/net8.0/osu.Game.Tests.dll"
],
"cwd": "${workspaceRoot}",
"cwd": "${workspaceFolder}",
"preLaunchTask": "Build tests (Release)",
"console": "internalConsole"
},
@@ -55,10 +55,10 @@
"request": "launch",
"program": "dotnet",
"args": [
"${workspaceRoot}/osu.Desktop/bin/Debug/net8.0/osu!.dll",
"${workspaceFolder}/osu.Desktop/bin/Debug/net8.0/osu!.dll",
"--tournament"
],
"cwd": "${workspaceRoot}",
"cwd": "${workspaceFolder}",
"preLaunchTask": "Build osu! (Debug)",
"console": "internalConsole"
},
@@ -68,10 +68,10 @@
"request": "launch",
"program": "dotnet",
"args": [
"${workspaceRoot}/osu.Desktop/bin/Release/net8.0/osu!.dll",
"${workspaceFolder}/osu.Desktop/bin/Release/net8.0/osu!.dll",
"--tournament"
],
"cwd": "${workspaceRoot}",
"cwd": "${workspaceFolder}",
"preLaunchTask": "Build osu! (Release)",
"console": "internalConsole"
},
@@ -81,10 +81,10 @@
"request": "launch",
"program": "dotnet",
"args": [
"${workspaceRoot}/osu.Game.Tournament.Tests/bin/Debug/net8.0/osu.Game.Tournament.Tests.dll",
"${workspaceFolder}/osu.Game.Tournament.Tests/bin/Debug/net8.0/osu.Game.Tournament.Tests.dll",
"--tournament"
],
"cwd": "${workspaceRoot}",
"cwd": "${workspaceFolder}",
"preLaunchTask": "Build tournament tests (Debug)",
"console": "internalConsole"
},
@@ -94,10 +94,10 @@
"request": "launch",
"program": "dotnet",
"args": [
"${workspaceRoot}/osu.Game.Tournament.Tests/bin/Debug/net8.0/osu.Game.Tournament.Tests.dll",
"${workspaceFolder}/osu.Game.Tournament.Tests/bin/Debug/net8.0/osu.Game.Tournament.Tests.dll",
"--tournament"
],
"cwd": "${workspaceRoot}",
"cwd": "${workspaceFolder}",
"preLaunchTask": "Build tournament tests (Release)",
"console": "internalConsole"
},
@@ -105,12 +105,12 @@
"name": "Benchmark",
"type": "coreclr",
"request": "launch",
"program": "${workspaceRoot}/osu.Game.Benchmarks/bin/Release/net8.0/osu.Game.Benchmarks.dll",
"program": "${workspaceFolder}/osu.Game.Benchmarks/bin/Release/net8.0/osu.Game.Benchmarks.dll",
"args": [
"--filter",
"*"
],
"cwd": "${workspaceRoot}",
"cwd": "${workspaceFolder}",
"preLaunchTask": "Build benchmarks",
"console": "internalConsole"
}

3
.vscode/settings.json vendored Normal file
View File

@@ -0,0 +1,3 @@
{
"dotnet.defaultSolution": "osu.Desktop.slnf"
}

View File

@@ -49,7 +49,7 @@
<PackageProjectUrl>https://github.com/ppy/osu</PackageProjectUrl>
<RepositoryUrl>https://github.com/ppy/osu</RepositoryUrl>
<PackageReleaseNotes>Automated release.</PackageReleaseNotes>
<Company>ppy Pty Ltd</Company>
<Company>ppy Pty Ltd, jvnkosu! team</Company>
<Copyright>Copyright (c) 2025 ppy Pty Ltd</Copyright>
<PackageTags>osu game</PackageTags>
</PropertyGroup>

19
MakeInstaller.ps1 Normal file
View File

@@ -0,0 +1,19 @@
#!/usr/bin/env powershell
param (
[string]$Version,
[string]$BuildConfig = "Release"
)
if ($Version -eq "") {
Write-Host "Usage: .\MakeInstaller.ps1 <VERSION_NUMBER> [-BuildConfig <BUILD_CONFIG>]"
Write-Host "Example: .\MakeInstaller.ps1 2025.823.0 -BuildConfig Debug"
exit
}
$tmpPub = ".\pub"
if (-not (Test-Path -Path $tmpPub)) {
New-Item -ItemType Directory -path $tmpPub
}
dotnet publish -c $BuildConfig osu.Desktop --self-contained -r win-x64 -o $tmpPub -verbosity:m /p:Version=$Version
vpk pack --packId jvnkosu.Client --packTitle "jvnkosu!lazer" --packVersion $Version --packDir ./pub --mainExe="osu!.exe"

149
README.md
View File

@@ -1,147 +1,40 @@
<p align="center">
<img width="500" alt="osu! logo" src="assets/lazer.png">
</p>
# jvnkosu! client
# osu!
A free-to-win rhythm game based on osu!(lazer). Click is just a *rhythm* away!
[![Build status](https://github.com/ppy/osu/actions/workflows/ci.yml/badge.svg?branch=master&event=push)](https://github.com/ppy/osu/actions/workflows/ci.yml)
[![GitHub release](https://img.shields.io/github/release/ppy/osu.svg)](https://github.com/ppy/osu/releases/latest)
[![CodeFactor](https://www.codefactor.io/repository/github/ppy/osu/badge)](https://www.codefactor.io/repository/github/ppy/osu)
[![dev chat](https://discordapp.com/api/guilds/188630481301012481/widget.png?style=shield)](https://discord.gg/ppy)
[![Crowdin](https://d322cqt584bo4o.cloudfront.net/osu-web/localized.svg)](https://crowdin.com/project/osu-web)
## Disclaimer
A free-to-win rhythm game. Rhythm is just a *click* away!
*osu!* is a registered trademark of ppy Pty Ltd.
jvnkosu! is not affiliated with, or endorsed by ppy Pty Ltd., but makes use of its open-source components and resources.
This is the future and final iteration of the [osu!](https://osu.ppy.sh) game client which marks the beginning of an open era! Currently known by and released under the release codename "*lazer*". As in sharper than cutting-edge.
## License
Client source code is licensed under the MIT license, see the [LICENCE](LICENCE) file in repository root for more info.
## Status
Game assets are included as a NuGet package and licensed under the CC BY-NC 4.0, which prohibits commercial use. See [ppy/osu-resources](https://github.com/ppy/osu-resources) for more info.
This project is under constant development, but we do our best to keep things in a stable state. Players are encouraged to install from a release alongside their stable *osu!* client. This project will continue to evolve until we eventually reach the point where most users prefer it over the previous "osu!stable" release.
Registered trademarks "osu!" and "ppy" are property of ppy Pty Ltd., and protected by trademark law.
A few resources are available as starting points to getting involved and understanding the project:
## Compiling from source
Building jvnkosu! from source is pretty much possible (and welcome here).
- Detailed release changelogs are available on the [official osu! site](https://osu.ppy.sh/home/changelog/lazer).
- You can learn more about our approach to [project management](https://github.com/ppy/osu/wiki/Project-management).
- Track our current efforts [towards improving the game](https://github.com/orgs/ppy/projects/7/views/6).
First, you must have a desktop platform with [.NET Core SDK 8](https://dotnet.microsoft.com/download) installed. Windows, Linux, macOS should work well. You can check if you have the SDK installed by running `dotnet --version` in your command prompt/terminal.
## Running osu!
If you are just looking to give the game a whirl, you can grab the latest release for your platform:
### Latest release:
| [Windows 10+ (x64)](https://github.com/ppy/osu/releases/latest/download/install.exe) | macOS 12+ ([Intel](https://github.com/ppy/osu/releases/latest/download/osu.app.Intel.zip), [Apple Silicon](https://github.com/ppy/osu/releases/latest/download/osu.app.Apple.Silicon.zip)) | [Linux (x64)](https://github.com/ppy/osu/releases/latest/download/osu.AppImage) | [iOS 13.4+](https://osu.ppy.sh/home/testflight) | [Android 5+](https://github.com/ppy/osu/releases/latest/download/sh.ppy.osulazer.apk) |
|--------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| ------------- | ------------- | ------------- |
You can also generally download a version for your current device from the [osu! site](https://osu.ppy.sh/home/download).
If your platform is unsupported or not listed above, there is still a chance you can run the release or manually build it by following the instructions below.
**For iOS/iPadOS users**: The iOS testflight link fills up very fast (Apple has a hard limit of 10,000 users). We reset it occasionally. Please do not ask about this. Check back regularly for link resets or follow [peppy](https://twitter.com/ppy) on twitter for announcements. Our goal is to get the game on mobile app stores very soon so we don't have to live with this limitation.
## Developing a custom ruleset
osu! is designed to allow user-created gameplay variations, called "rulesets". Building one of these allows a developer to harness the power of the osu! beatmap library, game engine, and general UX for a new style of gameplay. To get started working on a ruleset, we have some templates available [here](https://github.com/ppy/osu/tree/master/Templates).
You can see some examples of custom rulesets by visiting the [custom ruleset directory](https://github.com/ppy/osu/discussions/13096).
## Developing osu!
### Prerequisites
Please make sure you have the following prerequisites:
- A desktop platform with the [.NET 8.0 SDK](https://dotnet.microsoft.com/download) installed.
When working with the codebase, we recommend using an IDE with intelligent code completion and syntax highlighting, such as the latest version of [Visual Studio](https://visualstudio.microsoft.com/vs/), [JetBrains Rider](https://www.jetbrains.com/rider/), or [Visual Studio Code](https://code.visualstudio.com/) with the [EditorConfig](https://marketplace.visualstudio.com/items?itemName=EditorConfig.EditorConfig) and [C# Dev Kit](https://marketplace.visualstudio.com/items?itemName=ms-dotnettools.csdevkit) plugin installed.
### Downloading the source code
Clone the repository:
```shell
git clone https://github.com/ppy/osu
cd osu
Then, download the source code. You may download it as an archive and unzip it, but using [Git](https://git-scm.com/) instead is recommended:
```
git clone https://gitea.jvnko.boats/jvnkosu/client
```
To update the source code to the latest commit, run the following command inside the `osu` directory:
```shell
git pull
To **run** the project, switch to project's directory and run the following:
```
### Building
#### From an IDE
You should load the solution via one of the platform-specific `.slnf` files, rather than the main `.sln`. This will reduce dependencies and hide platforms that you don't care about. Valid `.slnf` files are:
- `osu.Desktop.slnf` (most common)
- `osu.Android.slnf`
- `osu.iOS.slnf`
Run configurations for the recommended IDEs (listed above) are included. You should use the provided Build/Run functionality of your IDE to get things going. When testing or building new components, it's highly encouraged you use the `osu! (Tests)` project/configuration. More information on this is provided [below](#contributing).
To build for mobile platforms, you will likely need to run `sudo dotnet workload restore` if you haven't done so previously. This will install Android/iOS tooling required to complete the build.
#### From CLI
You can also build and run *osu!* from the command-line with a single command:
```shell
dotnet run --project osu.Desktop
```
When running locally to do any kind of performance testing, make sure to add `-c Release` to the build command, as the overhead of running with the default `Debug` configuration can be large (especially when testing with local framework modifications as below).
If the build fails, try to restore NuGet packages with `dotnet restore`.
### Testing with resource/framework modifications
Sometimes it may be necessary to cross-test changes in [osu-resources](https://github.com/ppy/osu-resources) or [osu-framework](https://github.com/ppy/osu-framework). This can be quickly achieved using included commands:
Windows:
```ps
UseLocalFramework.ps1
UseLocalResources.ps1
To **compile**:
```
dotnet build osu.Desktop
```
macOS / Linux:
To reduce performance overhead in custom builds, it's recommended to build with the `-c Release` flag, that will use the release profile and remove possibly unneeded debugging code.
```ps
UseLocalFramework.sh
UseLocalResources.sh
```
Note that these commands assume you have the relevant project(s) checked out in adjacent directories:
```
|- osu // this repository
|- osu-framework
|- osu-resources
```
### Code analysis
Before committing your code, please run a code formatter. This can be achieved by running `dotnet format` in the command line, or using the `Format code` command in your IDE.
We have adopted some cross-platform, compiler integrated analyzers. They can provide warnings when you are editing, building inside IDE or from command line, as-if they are provided by the compiler itself.
JetBrains ReSharper InspectCode is also used for wider rule sets. You can run it from PowerShell with `.\InspectCode.ps1`. Alternatively, you can install ReSharper or use Rider to get inline support in your IDE of choice.
## Contributing
When it comes to contributing to the project, the two main things you can do to help out are reporting issues and submitting pull requests. Please refer to the [contributing guidelines](CONTRIBUTING.md) to understand how to help in the most effective way possible.
If you wish to help with localisation efforts, head over to [crowdin](https://crowdin.com/project/osu-web).
We love to reward quality contributions. If you have made a large contribution, or are a regular contributor, you are welcome to [submit an expense via opencollective](https://opencollective.com/ppy/expenses/new). If you have any questions, feel free to [reach out to peppy](mailto:pe@ppy.sh) before doing so.
## Licence
*osu!*'s code and framework are licensed under the [MIT licence](https://opensource.org/licenses/MIT). Please see [the licence file](LICENCE) for more information. [tl;dr](https://tldrlegal.com/license/mit-license) you can do whatever you want as long as you include the original copyright and license notice in any copy of the software/source.
Please note that this *does not cover* the usage of the "osu!" or "ppy" branding in any software, resources, advertising or promotion, as this is protected by trademark law.
Please also note that game resources are covered by a separate licence. Please see the [ppy/osu-resources](https://github.com/ppy/osu-resources) repository for clarifications.
### See the [original readme](README.original.md) for more info.

147
README.original.md Normal file
View File

@@ -0,0 +1,147 @@
<p align="center">
<img width="500" alt="osu! logo" src="assets/lazer.png">
</p>
# osu!
[![Build status](https://github.com/ppy/osu/actions/workflows/ci.yml/badge.svg?branch=master&event=push)](https://github.com/ppy/osu/actions/workflows/ci.yml)
[![GitHub release](https://img.shields.io/github/release/ppy/osu.svg)](https://github.com/ppy/osu/releases/latest)
[![CodeFactor](https://www.codefactor.io/repository/github/ppy/osu/badge)](https://www.codefactor.io/repository/github/ppy/osu)
[![dev chat](https://discordapp.com/api/guilds/188630481301012481/widget.png?style=shield)](https://discord.gg/ppy)
[![Crowdin](https://d322cqt584bo4o.cloudfront.net/osu-web/localized.svg)](https://crowdin.com/project/osu-web)
A free-to-win rhythm game. Rhythm is just a *click* away!
This is the future and final iteration of the [osu!](https://osu.ppy.sh) game client which marks the beginning of an open era! Currently known by and released under the release codename "*lazer*". As in sharper than cutting-edge.
## Status
This project is under constant development, but we do our best to keep things in a stable state. Players are encouraged to install from a release alongside their stable *osu!* client. This project will continue to evolve until we eventually reach the point where most users prefer it over the previous "osu!stable" release.
A few resources are available as starting points to getting involved and understanding the project:
- Detailed release changelogs are available on the [official osu! site](https://osu.ppy.sh/home/changelog/lazer).
- You can learn more about our approach to [project management](https://github.com/ppy/osu/wiki/Project-management).
- Track our current efforts [towards improving the game](https://github.com/orgs/ppy/projects/7/views/6).
## Running osu!
If you are just looking to give the game a whirl, you can grab the latest release for your platform:
### Latest release:
| [Windows 10+ (x64)](https://github.com/ppy/osu/releases/latest/download/install.exe) | macOS 12+ ([Intel](https://github.com/ppy/osu/releases/latest/download/osu.app.Intel.zip), [Apple Silicon](https://github.com/ppy/osu/releases/latest/download/osu.app.Apple.Silicon.zip)) | [Linux (x64)](https://github.com/ppy/osu/releases/latest/download/osu.AppImage) | [iOS 13.4+](https://osu.ppy.sh/home/testflight) | [Android 5+](https://github.com/ppy/osu/releases/latest/download/sh.ppy.osulazer.apk) |
|--------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| ------------- | ------------- | ------------- |
You can also generally download a version for your current device from the [osu! site](https://osu.ppy.sh/home/download).
If your platform is unsupported or not listed above, there is still a chance you can run the release or manually build it by following the instructions below.
**For iOS/iPadOS users**: The iOS testflight link fills up very fast (Apple has a hard limit of 10,000 users). We reset it occasionally. Please do not ask about this. Check back regularly for link resets or follow [peppy](https://twitter.com/ppy) on twitter for announcements. Our goal is to get the game on mobile app stores very soon so we don't have to live with this limitation.
## Developing a custom ruleset
osu! is designed to allow user-created gameplay variations, called "rulesets". Building one of these allows a developer to harness the power of the osu! beatmap library, game engine, and general UX for a new style of gameplay. To get started working on a ruleset, we have some templates available [here](https://github.com/ppy/osu/tree/master/Templates).
You can see some examples of custom rulesets by visiting the [custom ruleset directory](https://github.com/ppy/osu/discussions/13096).
## Developing osu!
### Prerequisites
Please make sure you have the following prerequisites:
- A desktop platform with the [.NET 8.0 SDK](https://dotnet.microsoft.com/download) installed.
When working with the codebase, we recommend using an IDE with intelligent code completion and syntax highlighting, such as the latest version of [Visual Studio](https://visualstudio.microsoft.com/vs/), [JetBrains Rider](https://www.jetbrains.com/rider/), or [Visual Studio Code](https://code.visualstudio.com/) with the [EditorConfig](https://marketplace.visualstudio.com/items?itemName=EditorConfig.EditorConfig) and [C# Dev Kit](https://marketplace.visualstudio.com/items?itemName=ms-dotnettools.csdevkit) plugin installed.
### Downloading the source code
Clone the repository:
```shell
git clone https://github.com/ppy/osu
cd osu
```
To update the source code to the latest commit, run the following command inside the `osu` directory:
```shell
git pull
```
### Building
#### From an IDE
You should load the solution via one of the platform-specific `.slnf` files, rather than the main `.sln`. This will reduce dependencies and hide platforms that you don't care about. Valid `.slnf` files are:
- `osu.Desktop.slnf` (most common)
- `osu.Android.slnf`
- `osu.iOS.slnf`
Run configurations for the recommended IDEs (listed above) are included. You should use the provided Build/Run functionality of your IDE to get things going. When testing or building new components, it's highly encouraged you use the `osu! (Tests)` project/configuration. More information on this is provided [below](#contributing).
To build for mobile platforms, you will likely need to run `sudo dotnet workload restore` if you haven't done so previously. This will install Android/iOS tooling required to complete the build.
#### From CLI
You can also build and run *osu!* from the command-line with a single command:
```shell
dotnet run --project osu.Desktop
```
When running locally to do any kind of performance testing, make sure to add `-c Release` to the build command, as the overhead of running with the default `Debug` configuration can be large (especially when testing with local framework modifications as below).
If the build fails, try to restore NuGet packages with `dotnet restore`.
### Testing with resource/framework modifications
Sometimes it may be necessary to cross-test changes in [osu-resources](https://github.com/ppy/osu-resources) or [osu-framework](https://github.com/ppy/osu-framework). This can be quickly achieved using included commands:
Windows:
```ps
UseLocalFramework.ps1
UseLocalResources.ps1
```
macOS / Linux:
```ps
UseLocalFramework.sh
UseLocalResources.sh
```
Note that these commands assume you have the relevant project(s) checked out in adjacent directories:
```
|- osu // this repository
|- osu-framework
|- osu-resources
```
### Code analysis
Before committing your code, please run a code formatter. This can be achieved by running `dotnet format` in the command line, or using the `Format code` command in your IDE.
We have adopted some cross-platform, compiler integrated analyzers. They can provide warnings when you are editing, building inside IDE or from command line, as-if they are provided by the compiler itself.
JetBrains ReSharper InspectCode is also used for wider rule sets. You can run it from PowerShell with `.\InspectCode.ps1`. Alternatively, you can install ReSharper or use Rider to get inline support in your IDE of choice.
## Contributing
When it comes to contributing to the project, the two main things you can do to help out are reporting issues and submitting pull requests. Please refer to the [contributing guidelines](CONTRIBUTING.md) to understand how to help in the most effective way possible.
If you wish to help with localisation efforts, head over to [crowdin](https://crowdin.com/project/osu-web).
We love to reward quality contributions. If you have made a large contribution, or are a regular contributor, you are welcome to [submit an expense via opencollective](https://opencollective.com/ppy/expenses/new). If you have any questions, feel free to [reach out to peppy](mailto:pe@ppy.sh) before doing so.
## Licence
*osu!*'s code and framework are licensed under the [MIT licence](https://opensource.org/licenses/MIT). Please see [the licence file](LICENCE) for more information. [tl;dr](https://tldrlegal.com/license/mit-license) you can do whatever you want as long as you include the original copyright and license notice in any copy of the software/source.
Please note that this *does not cover* the usage of the "osu!" or "ppy" branding in any software, resources, advertising or promotion, as this is protected by trademark law.
Please also note that game resources are covered by a separate licence. Please see the [ppy/osu-resources](https://github.com/ppy/osu-resources) repository for clarifications.

View File

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

View File

@@ -115,10 +115,12 @@ namespace osu.Desktop
if (IsFirstRun)
LocalConfig.SetValue(OsuSetting.ReleaseStream, ReleaseStream.Lazer);
if (IsPackageManaged)
return new NoActionUpdateManager();
// if (IsPackageManaged)
// return new NoActionUpdateManager();
return new VelopackUpdateManager();
// return new VelopackUpdateManager();
return new NoActionUpdateManager(); // for now, APIs are useless for actually downloading the releases. TODO: adapt UpdateManager for gitea
}
public override bool RestartAppWhenExited()

View File

@@ -3,11 +3,11 @@
<TargetFramework>net8.0</TargetFramework>
<OutputType>WinExe</OutputType>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<Description>A free-to-win rhythm game. Rhythm is just a *click* away!</Description>
<Description>A free-to-win rhythm game based on osu!(lazer). Click is just a *rhythm* away!</Description>
<AssemblyName>osu!</AssemblyName>
<AssemblyTitle>osu!(lazer)</AssemblyTitle>
<Title>osu!</Title>
<Product>osu!(lazer)</Product>
<AssemblyTitle>jvnkosu!</AssemblyTitle>
<Title>jvnkosu!</Title>
<Product>jvnkosu!</Product>
<ApplicationIcon>lazer.ico</ApplicationIcon>
<Version>0.0.0</Version>
<FileVersion>0.0.0</FileVersion>

View File

@@ -3,16 +3,19 @@
<metadata>
<id>osulazer</id>
<version>0.0.0</version>
<title>osu!</title>
<authors>ppy Pty Ltd</authors>
<title>jvnkosu!</title>
<authors>ppy Pty Ltd., jvnkosu! team</authors>
<owners>Dean Herbert</owners>
<projectUrl>https://osu.ppy.sh/</projectUrl>
<projectUrl>https://osu.jvnko.boats/</projectUrl>
<iconUrl>https://github.com/ppy/osu/blob/master/assets/lazer-nuget.png?raw=true</iconUrl>
<icon>icon.png</icon>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>A free-to-win rhythm game. Rhythm is just a *click* away!</description>
<description>A free-to-win rhythm game based on osu!(lazer). Click is just a *rhythm* away!</description>
<releaseNotes>testing</releaseNotes>
<copyright>Copyright (c) 2025 ppy Pty Ltd</copyright>
<copyright>
Copyright (c) 2025 ppy Pty Ltd
Copyright (c) 2025 jvnkosu! team
</copyright>
<language>en-AU</language>
</metadata>
<files>

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

@@ -24,7 +24,7 @@ namespace osu.Game.Rulesets.Catch.Mods
public override BindableBool ComboBasedSize { get; } = new BindableBool(true);
public override float DefaultFlashlightSize => 325;
public override float DefaultFlashlightSize => 203.125f;
protected override Flashlight CreateFlashlight() => new CatchFlashlight(this, playfield);

View File

@@ -3,6 +3,7 @@
using osu.Framework.Graphics.Sprites;
using osu.Framework.Localisation;
using osu.Game.Graphics;
using osu.Game.Rulesets.Catch.Objects;
using osu.Game.Rulesets.Mods;
using osu.Game.Rulesets.UI;
@@ -16,7 +17,7 @@ namespace osu.Game.Rulesets.Catch.Mods
public override string Acronym => "FF";
public override LocalisableString Description => "The fruits are... floating?";
public override double ScoreMultiplier => 1;
public override IconUsage? Icon => FontAwesome.Solid.Cloud;
public override IconUsage? Icon => OsuIcon.ModFloatingFruits;
public void ApplyToDrawableRuleset(DrawableRuleset<CatchHitObject> drawableRuleset)
{

View File

@@ -7,6 +7,7 @@ using osu.Framework.Graphics.Sprites;
using osu.Framework.Input.Bindings;
using osu.Framework.Input.Events;
using osu.Framework.Localisation;
using osu.Game.Graphics;
using osu.Game.Rulesets.Catch.Objects;
using osu.Game.Rulesets.Catch.UI;
using osu.Game.Rulesets.Mods;
@@ -23,7 +24,7 @@ namespace osu.Game.Rulesets.Catch.Mods
public override LocalisableString Description => "Dashing by default, slow down!";
public override ModType Type => ModType.Fun;
public override double ScoreMultiplier => 1;
public override IconUsage? Icon => FontAwesome.Solid.Running;
public override IconUsage? Icon => OsuIcon.ModMovingFast;
public override Type[] IncompatibleMods => new[] { typeof(ModAutoplay), typeof(ModRelax) };
private DrawableCatchRuleset drawableRuleset = null!;

View File

@@ -147,7 +147,7 @@ namespace osu.Game.Rulesets.Mania.Tests
}
[TestCase]
public void TestFilterIntersection()
public void TestKeysFilterIntersection()
{
var criteria = new ManiaFilterCriteria();
criteria.TryParseCustomKeywordCriteria("keys", Operator.Greater, "4");
@@ -175,7 +175,7 @@ namespace osu.Game.Rulesets.Mania.Tests
}
[TestCase]
public void TestInvalidFilters()
public void TestInvalidKeysFilters()
{
var criteria = new ManiaFilterCriteria();
@@ -183,5 +183,132 @@ namespace osu.Game.Rulesets.Mania.Tests
Assert.False(criteria.TryParseCustomKeywordCriteria("keys", Operator.NotEqual, "4,some text"));
Assert.False(criteria.TryParseCustomKeywordCriteria("keys", Operator.GreaterOrEqual, "4,5,6"));
}
[TestCase]
public void TestLnsEqual()
{
var criteria = new ManiaFilterCriteria();
var filterCriteria = new FilterCriteria
{
Ruleset = new ManiaRuleset().RulesetInfo
};
criteria.TryParseCustomKeywordCriteria("lns", Operator.Equal, "0");
BeatmapInfo beatmapInfo1 = new BeatmapInfo(new ManiaRuleset().RulesetInfo)
{
TotalObjectCount = 0,
EndTimeObjectCount = 0
};
Assert.True(criteria.Matches(beatmapInfo1, filterCriteria));
criteria.TryParseCustomKeywordCriteria("lns", Operator.Equal, "0");
BeatmapInfo beatmapInfo2 = new BeatmapInfo(new ManiaRuleset().RulesetInfo)
{
TotalObjectCount = 100,
EndTimeObjectCount = 0
};
Assert.True(criteria.Matches(beatmapInfo2, filterCriteria));
criteria.TryParseCustomKeywordCriteria("lns", Operator.Equal, "100");
BeatmapInfo beatmapInfo3 = new BeatmapInfo(new ManiaRuleset().RulesetInfo)
{
TotalObjectCount = 100,
EndTimeObjectCount = 100
};
Assert.True(criteria.Matches(beatmapInfo3, filterCriteria));
criteria.TryParseCustomKeywordCriteria("lns", Operator.Equal, "1");
BeatmapInfo beatmapInfo4 = new BeatmapInfo(new ManiaRuleset().RulesetInfo)
{
TotalObjectCount = 100,
EndTimeObjectCount = 1
};
Assert.True(criteria.Matches(beatmapInfo4, filterCriteria));
criteria.TryParseCustomKeywordCriteria("lns", Operator.Equal, "0.1");
BeatmapInfo beatmapInfo5 = new BeatmapInfo(new ManiaRuleset().RulesetInfo)
{
TotalObjectCount = 1000,
EndTimeObjectCount = 1
};
Assert.True(criteria.Matches(beatmapInfo5, filterCriteria));
}
[TestCase]
public void TestLnsGreaterOrEqual()
{
var criteria = new ManiaFilterCriteria();
var filterCriteria = new FilterCriteria
{
Ruleset = new ManiaRuleset().RulesetInfo
};
criteria.TryParseCustomKeywordCriteria("lns", Operator.GreaterOrEqual, "0");
BeatmapInfo beatmapInfo1 = new BeatmapInfo(new ManiaRuleset().RulesetInfo)
{
TotalObjectCount = 0,
EndTimeObjectCount = 0
};
Assert.True(criteria.Matches(beatmapInfo1, filterCriteria));
criteria.TryParseCustomKeywordCriteria("lns", Operator.GreaterOrEqual, "0");
BeatmapInfo beatmapInfo2 = new BeatmapInfo(new ManiaRuleset().RulesetInfo)
{
TotalObjectCount = 100,
EndTimeObjectCount = 0
};
Assert.True(criteria.Matches(beatmapInfo2, filterCriteria));
criteria.TryParseCustomKeywordCriteria("lns", Operator.GreaterOrEqual, "100");
BeatmapInfo beatmapInfo3 = new BeatmapInfo(new ManiaRuleset().RulesetInfo)
{
TotalObjectCount = 100,
EndTimeObjectCount = 100
};
Assert.True(criteria.Matches(beatmapInfo3, filterCriteria));
criteria.TryParseCustomKeywordCriteria("lns", Operator.GreaterOrEqual, "1");
BeatmapInfo beatmapInfo4 = new BeatmapInfo(new ManiaRuleset().RulesetInfo)
{
TotalObjectCount = 100,
EndTimeObjectCount = 1
};
Assert.True(criteria.Matches(beatmapInfo4, filterCriteria));
criteria.TryParseCustomKeywordCriteria("lns", Operator.GreaterOrEqual, "0.1");
BeatmapInfo beatmapInfo5 = new BeatmapInfo(new ManiaRuleset().RulesetInfo)
{
TotalObjectCount = 1000,
EndTimeObjectCount = 1
};
Assert.True(criteria.Matches(beatmapInfo5, filterCriteria));
}
[TestCase]
public void TestLnsNotManiaRuleset()
{
var criteria = new ManiaFilterCriteria();
var filterCriteria = new FilterCriteria
{
Ruleset = new ManiaRuleset().RulesetInfo
};
criteria.TryParseCustomKeywordCriteria("lns", Operator.LessOrEqual, "100");
BeatmapInfo beatmapInfo = new BeatmapInfo
{
TotalObjectCount = 100,
EndTimeObjectCount = 50
};
Assert.False(criteria.Matches(beatmapInfo, filterCriteria));
}
[TestCase]
public void TestInvalidLnsFilters()
{
var criteria = new ManiaFilterCriteria();
Assert.False(criteria.TryParseCustomKeywordCriteria("lns", Operator.Equal, "some text"));
Assert.False(criteria.TryParseCustomKeywordCriteria("lns", Operator.GreaterOrEqual, "1some text"));
}
}
}

View File

@@ -1,6 +1,7 @@
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
using System;
using System.Collections.Generic;
using System.Linq;
using osu.Framework.Bindables;
@@ -19,12 +20,16 @@ namespace osu.Game.Rulesets.Mania
public class ManiaFilterCriteria : IRulesetFilterCriteria
{
private readonly HashSet<int> includedKeyCounts = Enumerable.Range(1, LegacyBeatmapDecoder.MAX_MANIA_KEY_COUNT).ToHashSet();
private FilterCriteria.OptionalRange<float> longNotePercentage;
public bool Matches(BeatmapInfo beatmapInfo, FilterCriteria criteria)
{
int keyCount = ManiaBeatmapConverter.GetColumnCount(LegacyBeatmapConversionDifficultyInfo.FromBeatmapInfo(beatmapInfo), criteria.Mods);
return includedKeyCounts.Contains(keyCount);
bool keyCountMatch = includedKeyCounts.Contains(keyCount);
bool longNotePercentageMatch = !longNotePercentage.HasFilter || (!isConvertedBeatmap(beatmapInfo) && longNotePercentage.IsInRange(calculateLongNotePercentage(beatmapInfo)));
return keyCountMatch && longNotePercentageMatch;
}
public bool TryParseCustomKeywordCriteria(string key, Operator op, string strValues)
@@ -84,6 +89,10 @@ namespace osu.Game.Rulesets.Mania
return false;
}
}
case "ln":
case "lns":
return FilterQueryParser.TryUpdateCriteriaRange(ref longNotePercentage, op, strValues);
}
return false;
@@ -103,5 +112,18 @@ namespace osu.Game.Rulesets.Mania
return false;
}
private static bool isConvertedBeatmap(BeatmapInfo beatmapInfo)
{
return !beatmapInfo.Ruleset.Equals(new ManiaRuleset().RulesetInfo);
}
private static float calculateLongNotePercentage(BeatmapInfo beatmapInfo)
{
int holdNotes = beatmapInfo.EndTimeObjectCount;
int totalNotes = Math.Max(1, beatmapInfo.TotalObjectCount);
return holdNotes / (float)totalNotes * 100;
}
}
}

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

@@ -4,6 +4,7 @@
using osu.Framework.Graphics.Sprites;
using osu.Framework.Localisation;
using osu.Game.Configuration;
using osu.Game.Graphics;
using osu.Game.Rulesets.Mania.Objects;
using osu.Game.Rulesets.Mania.UI;
using osu.Game.Rulesets.Mods;
@@ -21,7 +22,7 @@ namespace osu.Game.Rulesets.Mania.Mods
public override LocalisableString Description => "No more tricky speed changes!";
public override IconUsage? Icon => FontAwesome.Solid.Equals;
public override IconUsage? Icon => OsuIcon.ModConstantSpeed;
public override ModType Type => ModType.Conversion;

View File

@@ -4,8 +4,10 @@
using System;
using System.Linq;
using osu.Framework.Bindables;
using osu.Framework.Graphics.Sprites;
using osu.Framework.Localisation;
using osu.Game.Configuration;
using osu.Game.Graphics;
using osu.Game.Rulesets.Mania.UI;
namespace osu.Game.Rulesets.Mania.Mods
@@ -14,6 +16,7 @@ namespace osu.Game.Rulesets.Mania.Mods
{
public override string Name => "Cover";
public override string Acronym => "CO";
public override IconUsage? Icon => OsuIcon.ModCover;
public override LocalisableString Description => @"Decrease the playfield's viewing area.";

View File

@@ -1,8 +1,10 @@
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
using osu.Framework.Graphics.Sprites;
using osu.Framework.Localisation;
using osu.Game.Beatmaps;
using osu.Game.Graphics;
using osu.Game.Rulesets.Mania.Beatmaps;
using osu.Game.Rulesets.Mods;
@@ -13,6 +15,7 @@ namespace osu.Game.Rulesets.Mania.Mods
public override string Name => "Dual Stages";
public override string Acronym => "DS";
public override LocalisableString Description => @"Double the stages, double the fun!";
public override IconUsage? Icon => OsuIcon.ModDualStages;
public override ModType Type => ModType.Conversion;
public override double ScoreMultiplier => 1;

View File

@@ -3,7 +3,9 @@
using System;
using System.Linq;
using osu.Framework.Graphics.Sprites;
using osu.Framework.Localisation;
using osu.Game.Graphics;
using osu.Game.Rulesets.Mania.UI;
namespace osu.Game.Rulesets.Mania.Mods
@@ -12,6 +14,7 @@ namespace osu.Game.Rulesets.Mania.Mods
{
public override string Name => "Fade In";
public override string Acronym => "FI";
public override IconUsage? Icon => OsuIcon.ModFadeIn;
public override LocalisableString Description => @"Keys appear out of nowhere!";
public override double ScoreMultiplier => 1;
public override bool ValidForFreestyleAsRequiredMod => false;

View File

@@ -9,6 +9,7 @@ using osu.Game.Rulesets.Mods;
using osu.Framework.Graphics.Sprites;
using System.Collections.Generic;
using osu.Framework.Localisation;
using osu.Game.Graphics;
using osu.Game.Rulesets.Mania.Beatmaps;
namespace osu.Game.Rulesets.Mania.Mods
@@ -23,7 +24,7 @@ namespace osu.Game.Rulesets.Mania.Mods
public override LocalisableString Description => @"Replaces all hold notes with normal notes.";
public override IconUsage? Icon => FontAwesome.Solid.DotCircle;
public override IconUsage? Icon => OsuIcon.ModHoldOff;
public override ModType Type => ModType.Conversion;

View File

@@ -8,6 +8,7 @@ using osu.Framework.Graphics.Sprites;
using osu.Framework.Localisation;
using osu.Game.Audio;
using osu.Game.Beatmaps;
using osu.Game.Graphics;
using osu.Game.Rulesets.Mania.Beatmaps;
using osu.Game.Rulesets.Mania.Objects;
using osu.Game.Rulesets.Mods;
@@ -23,7 +24,7 @@ namespace osu.Game.Rulesets.Mania.Mods
public override LocalisableString Description => "Hold the keys. To the beat.";
public override IconUsage? Icon => FontAwesome.Solid.YinYang;
public override IconUsage? Icon => OsuIcon.ModInvert;
public override ModType Type => ModType.Conversion;

View File

@@ -1,7 +1,9 @@
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
using osu.Framework.Graphics.Sprites;
using osu.Framework.Localisation;
using osu.Game.Graphics;
namespace osu.Game.Rulesets.Mania.Mods
{
@@ -10,6 +12,7 @@ namespace osu.Game.Rulesets.Mania.Mods
public override int KeyCount => 1;
public override string Name => "One Key";
public override string Acronym => "1K";
public override IconUsage? Icon => OsuIcon.ModOneKey;
public override LocalisableString Description => @"Play with one key.";
public override bool Ranked => false;
}

View File

@@ -1,7 +1,9 @@
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
using osu.Framework.Graphics.Sprites;
using osu.Framework.Localisation;
using osu.Game.Graphics;
namespace osu.Game.Rulesets.Mania.Mods
{
@@ -10,6 +12,7 @@ namespace osu.Game.Rulesets.Mania.Mods
public override int KeyCount => 10;
public override string Name => "Ten Keys";
public override string Acronym => "10K";
public override IconUsage? Icon => OsuIcon.ModTenKeys;
public override LocalisableString Description => @"Play with ten keys.";
public override bool Ranked => false;
}

View File

@@ -1,7 +1,9 @@
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
using osu.Framework.Graphics.Sprites;
using osu.Framework.Localisation;
using osu.Game.Graphics;
namespace osu.Game.Rulesets.Mania.Mods
{
@@ -10,6 +12,7 @@ namespace osu.Game.Rulesets.Mania.Mods
public override int KeyCount => 2;
public override string Name => "Two Keys";
public override string Acronym => "2K";
public override IconUsage? Icon => OsuIcon.ModTwoKeys;
public override LocalisableString Description => @"Play with two keys.";
public override bool Ranked => false;
}

View File

@@ -1,7 +1,9 @@
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
using osu.Framework.Graphics.Sprites;
using osu.Framework.Localisation;
using osu.Game.Graphics;
namespace osu.Game.Rulesets.Mania.Mods
{
@@ -10,6 +12,7 @@ namespace osu.Game.Rulesets.Mania.Mods
public override int KeyCount => 3;
public override string Name => "Three Keys";
public override string Acronym => "3K";
public override IconUsage? Icon => OsuIcon.ModThreeKeys;
public override LocalisableString Description => @"Play with three keys.";
public override bool Ranked => false;
}

View File

@@ -1,7 +1,9 @@
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
using osu.Framework.Graphics.Sprites;
using osu.Framework.Localisation;
using osu.Game.Graphics;
namespace osu.Game.Rulesets.Mania.Mods
{
@@ -10,6 +12,7 @@ namespace osu.Game.Rulesets.Mania.Mods
public override int KeyCount => 4;
public override string Name => "Four Keys";
public override string Acronym => "4K";
public override IconUsage? Icon => OsuIcon.ModFourKeys;
public override LocalisableString Description => @"Play with four keys.";
}
}

View File

@@ -1,7 +1,9 @@
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
using osu.Framework.Graphics.Sprites;
using osu.Framework.Localisation;
using osu.Game.Graphics;
namespace osu.Game.Rulesets.Mania.Mods
{
@@ -10,6 +12,7 @@ namespace osu.Game.Rulesets.Mania.Mods
public override int KeyCount => 5;
public override string Name => "Five Keys";
public override string Acronym => "5K";
public override IconUsage? Icon => OsuIcon.ModFiveKeys;
public override LocalisableString Description => @"Play with five keys.";
}
}

View File

@@ -1,7 +1,9 @@
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
using osu.Framework.Graphics.Sprites;
using osu.Framework.Localisation;
using osu.Game.Graphics;
namespace osu.Game.Rulesets.Mania.Mods
{
@@ -10,6 +12,7 @@ namespace osu.Game.Rulesets.Mania.Mods
public override int KeyCount => 6;
public override string Name => "Six Keys";
public override string Acronym => "6K";
public override IconUsage? Icon => OsuIcon.ModSixKeys;
public override LocalisableString Description => @"Play with six keys.";
}
}

View File

@@ -1,7 +1,9 @@
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
using osu.Framework.Graphics.Sprites;
using osu.Framework.Localisation;
using osu.Game.Graphics;
namespace osu.Game.Rulesets.Mania.Mods
{
@@ -10,6 +12,7 @@ namespace osu.Game.Rulesets.Mania.Mods
public override int KeyCount => 7;
public override string Name => "Seven Keys";
public override string Acronym => "7K";
public override IconUsage? Icon => OsuIcon.ModSevenKeys;
public override LocalisableString Description => @"Play with seven keys.";
}
}

View File

@@ -1,7 +1,9 @@
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
using osu.Framework.Graphics.Sprites;
using osu.Framework.Localisation;
using osu.Game.Graphics;
namespace osu.Game.Rulesets.Mania.Mods
{
@@ -10,6 +12,7 @@ namespace osu.Game.Rulesets.Mania.Mods
public override int KeyCount => 8;
public override string Name => "Eight Keys";
public override string Acronym => "8K";
public override IconUsage? Icon => OsuIcon.ModEightKeys;
public override LocalisableString Description => @"Play with eight keys.";
}
}

View File

@@ -1,7 +1,9 @@
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
using osu.Framework.Graphics.Sprites;
using osu.Framework.Localisation;
using osu.Game.Graphics;
namespace osu.Game.Rulesets.Mania.Mods
{
@@ -10,6 +12,7 @@ namespace osu.Game.Rulesets.Mania.Mods
public override int KeyCount => 9;
public override string Name => "Nine Keys";
public override string Acronym => "9K";
public override IconUsage? Icon => OsuIcon.ModNineKeys;
public override LocalisableString Description => @"Play with nine keys.";
}
}

View File

@@ -4,8 +4,10 @@
using System;
using System.Linq;
using System.Threading;
using osu.Framework.Graphics.Sprites;
using osu.Framework.Localisation;
using osu.Game.Beatmaps;
using osu.Game.Graphics;
using osu.Game.Rulesets.Mania.Beatmaps;
using osu.Game.Rulesets.Mania.Objects;
using osu.Game.Rulesets.Mania.Objects.Drawables;
@@ -26,6 +28,8 @@ namespace osu.Game.Rulesets.Mania.Mods
public override double ScoreMultiplier => 0.9;
public override IconUsage? Icon => OsuIcon.ModNoRelease;
public override ModType Type => ModType.DifficultyReduction;
public override Type[] IncompatibleMods => new[] { typeof(ManiaModHoldOff) };

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;
}

View File

@@ -32,26 +32,6 @@ namespace osu.Game.Rulesets.Osu.Tests.Mods
[Test]
public void TestComboBasedSize([Values] bool comboBasedSize) => CreateModTest(new ModTestData { Mod = new OsuModFlashlight { ComboBasedSize = { Value = comboBasedSize } }, PassCondition = () => true });
[Test]
public void TestPlayfieldBasedSize()
{
OsuModFlashlight flashlight;
CreateModTest(new ModTestData
{
Mods = [flashlight = new OsuModFlashlight(), new OsuModBarrelRoll()],
PassCondition = () =>
{
var flashlightOverlay = Player.DrawableRuleset.Overlays
.ChildrenOfType<ModFlashlight<OsuHitObject>.Flashlight>()
.First();
// the combo check is here because the flashlight radius decreases for the first time at 100 combo
// and hardcoding it here eliminates the need to meddle in flashlight internals further by e.g. exposing `GetComboScaleFor()`
return flashlightOverlay.GetSize() < flashlight.DefaultFlashlightSize && Player.GameplayState.ScoreProcessor.Combo.Value < 100;
}
});
}
[Test]
public void TestSliderDimsOnlyAfterStartTime()
{

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

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