Merge 12 upstream ppy/osu commits (ours-priority) - #311
Merged
Conversation
Doesn't make much sense and looks to be stressing the server a bit (results take some time to return). Just a quick fix.
Addresses ppy#37616 partly. <img width="828" height="826" alt="osu! 2026-05-07 at 06 59 23" src="https://github.com/user-attachments/assets/15343112-dc07-4501-b291-b53db870be5a" />
) Intends to close ppy#37395. In the past there have been many discussions about this dual stages wart. Whether it will continue to be "dual stages", or just a single stage with 12/14/16/18K, whether all of the skinning weirdness related to it (ppy#23620) will be supported, etc. This isn't that, I don't want to get into that, and I'm not promising anything. All I want to make sure here is that users cannot get their data lost by editing an existing >10K beatmap, and be understandably upset about it. To that end this mostly apes how stable does things.
…attempting to set negative value (ppy#37667) Closes ppy#37553. You can probably tell by the title that this is going to be a good one. As previously mentioned in ppy#35395, framework-side `TextBox` uses a bunch of `NumberFormat` properties from `CurrentCulture` to contextually allow decimal points or minus signs in a textbox. In some languages, namely (of the ones we support): Finnish, Croatian, Lithuanian, Norsk, Slovenian, and Swedish, `NumberFormat.NegativeSign` is not `U+002D HYPHEN MINUS`, but instead `U+2212 MINUS SIGN`. Therefore, in `FormSliderBar`, when `ToStandardFormattedString()` is attempted to be used to set the textbox value, the hardcoded `U+002D HYPHEN MINUS` is rejected on cultures that expect `U+2212 MINUS SIGN`, and thus due to a feedback loop, all negative values are no longer settable. This applies the obvious fix of applying `NumberFormat.NegativeSign`.
Maybe code-wise it looks a little bit hacky, but it works?
…#37465) https://github.com/user-attachments/assets/e8f67f68-1f36-45ef-a50b-3284a8350ffd This has been a pain point in both lazer and stable, and people usually use external tools for this kind of stuff for stable. --------- Co-authored-by: Bartłomiej Dach <dach.bartlomiej@gmail.com> Co-authored-by: Dean Herbert <pe@ppy.sh>
Can reproduce the failure via something like diff --git a/osu.Game.Rulesets.Mania/Edit/Setup/ManiaDifficultySection.cs b/osu.Game.Rulesets.Mania/Edit/Setup/ManiaDifficultySection.cs index fe5c437..92c58a7bde 100644 --- a/osu.Game.Rulesets.Mania/Edit/Setup/ManiaDifficultySection.cs +++ b/osu.Game.Rulesets.Mania/Edit/Setup/ManiaDifficultySection.cs @@ -187,13 +187,13 @@ private void updateKeyCount(ValueChangedEvent<int> keyCount) { if (!t.GetResultSafely()) { - Schedule(() => + Scheduler.AddDelayed(() => { changeHandler!.RestoreState(-1); Beatmap.Difficulty.CircleSize = keyCount.OldValue; setStateFromActualKeyCount(keyCount.OldValue); updatingKeyCount = false; - }); + }, 1000); } else { so I'm banking on this being just a case of CI fuzzing the test by being slow. If the test fails again on this same assert after this change there are bigger problems at hand. But given the lack of local reproduction I'd rather start with this than spend an hour staring at it.
Not sure if valuable. Came from ppy#37261 but that wants slider ends as well, which is like, weird. 🤷
When editing metadata, it's annoying that the editor returns to compose mode when switching between difficulties. This fixes that fallacy. Supersedes and closes ppy#36724.
…ppy#37581) The "Key Count" metric in mania is very useless since you are already expected to play maps with a specific Key Count when you are queueing. This PR inserts the proportion of LNs (Long Notes) in the place of that metric since it is one of the ways players can gudge their skillsets (This idea comes from reddit) Also improved the test suite for other skillsets by making the architecture more minor ruleset friendly Addresses ppy#37568. --------- Co-authored-by: Dan Balasescu <smoogipoo@smgi.me> Co-authored-by: Dean Herbert <pe@ppy.sh>
Matches stable and significantly improves UX when mapping. In addition, current behavior makes it too easy to place stacked objects which is something we should not encourage. --------- Co-authored-by: Bartłomiej Dach <dach.bartlomiej@gmail.com>
Co-authored-by: winnerspiros <1675249+winnerspiros@users.noreply.github.com>
Copilot created this pull request from a session on behalf of
winnerspiros
May 8, 2026 10:13
View session
Agent-Logs-Url: https://github.com/winnerspiros/osu/sessions/52178ad7-c6a4-4cfb-8ddc-c12e8c094b89 Co-authored-by: winnerspiros <1675249+winnerspiros@users.noreply.github.com>
winnerspiros
approved these changes
May 8, 2026
Agent-Logs-Url: https://github.com/winnerspiros/osu/sessions/33be0873-558f-48cb-bcb8-180d4f35e7e5 Co-authored-by: winnerspiros <1675249+winnerspiros@users.noreply.github.com>
winnerspiros
approved these changes
May 8, 2026
winnerspiros
marked this pull request as ready for review
May 8, 2026 13:06
There was a problem hiding this comment.
Pull request overview
Updates the project to match 12 upstream ppy/osu commits while bumping ppy.osu.Framework (and platform variants) to 2026.508.1, alongside several upstream gameplay/editor/UI tweaks and accompanying test/resource updates.
Changes:
- Bump
ppy.osu.Framework/.Android/.iOSpackage references to2026.508.1. - Add/adjust UI and behaviour across user panels, ranked play, judgement counters, and editor workflows (metadata sync, state restore, placement replacement).
- Update/extend visual tests and test resources to cover new behaviour (ranked play, judgement counter modes, placement replacement, culture formatting).
Reviewed changes
Copilot reviewed 44 out of 44 changed files in this pull request and generated 5 comments.
Show a summary per file
| File | Description |
|---|---|
osu.iOS.props |
Bumps ppy.osu.Framework.iOS to 2026.508.1. |
osu.Android.props |
Bumps ppy.osu.Framework.Android to 2026.508.1. |
osu.Game/osu.Game.csproj |
Bumps ppy.osu.Framework to 2026.508.1. |
osu.Game/Users/UserPanel.cs |
Adds rank display helper + team logo creation to shared user panel base. |
osu.Game/Users/UserListPanel.cs |
Adds team logo + rank into list-style user panel layout. |
osu.Game/Users/UserGridPanel.cs |
Notes TODO for rank placement in grid panel. |
osu.Game/Skinning/Components/ArgonJudgementCounterDisplay.cs |
Aligns display mode enum usage with JudgementCounterDisplay.DisplayMode. |
osu.Game/Screens/Play/HUD/JudgementCounter/JudgementCounterDisplay.cs |
Adds MissesOnly display mode and updates visibility logic + exception detail. |
osu.Game/Localisation/HUD/JudgementCounterDisplayStrings.cs |
Adds localisation for “Misses only” and updates string literal style. |
osu.Game/Screens/OnlinePlay/Matchmaking/RankedPlay/RankedPlayScreen.cs |
Caches RankedPlayChatDisplay for DI and constructs it in the screen tree. |
osu.Game/Screens/OnlinePlay/Matchmaking/RankedPlay/Intro/IntroScreen.cs |
Resolves cached chat display and shows it during intro sequence. |
osu.Game/Screens/OnlinePlay/Matchmaking/RankedPlay/Card/RankedPlayCardContent.AttributeListing.cs |
Uses ranked-play-specific beatmap attributes + supports per-attribute formatting. |
osu.Game/Rulesets/Ruleset.cs |
Adds GetBeatmapAttributesForRankedPlayCard() virtual hook. |
osu.Game/Rulesets/Difficulty/RulesetBeatmapAttribute.cs |
Adds ValueFormat to support custom value formatting for attributes. |
osu.Game.Rulesets.Mania/ManiaRuleset.cs |
Provides ranked-play attribute customization (removes KC, adds HN ratio). |
osu.Game/Extensions/NumberFormattingExtensions.cs |
Uses culture-specific negative sign when formatting. |
osu.Game.Tests/Extensions/NumberFormattingExtensionsTest.cs |
Splits/extends tests to cover culture-specific decimal point and negative sign. |
osu.Game/Overlays/Dashboard/UserSearch/UserSearchDisplay.cs |
Refactors debounce scheduling to always queue delayed search. |
osu.Game/Screens/Edit/SyncMetadataConfirmationDialog.cs |
Adds confirmation dialog for metadata sync operation. |
osu.Game/Screens/Edit/Setup/MetadataSection.cs |
Adds “Sync metadata with all difficulties” action and sync implementation. |
osu.Game/Screens/Edit/EditorState.cs |
Extends editor state to include current editor mode. |
osu.Game/Screens/Edit/Editor.cs |
Persists/restores mode via EditorState; adds SaveAndReload(withDialog) option. |
osu.Game/Rulesets/Edit/HitObjectPlacementBlueprint.cs |
Adds helper to detect when placement should replace an existing object. |
osu.Game/Rulesets/Edit/HitObjectComposer.cs |
Removes replaced objects (same time/column when applicable) during placement commit. |
osu.Game.Tests/Visual/Online/TestSceneOnlineUserPanel.cs |
Extends user panel test data to include rank/team cases. |
osu.Game.Tests/Visual/Navigation/TestSceneBeatmapEditorNavigation.cs |
Adds test ensuring editor mode is restored after reload. |
osu.Game.Tests/Visual/Gameplay/TestSceneJudgementCounter.cs |
Adds test iterating through judgement counter display modes. |
osu.Game.Tests/Visual/Gameplay/TestSceneArgonJudgementCounter.cs |
Updates tests for moved display mode enum. |
osu.Game.Tests/Visual/Editing/TestScenePlacementBlueprint.cs |
Adds tests for replacement-at-same-time and non-replacement on slider body. |
osu.Game.Tests/Visual/Editing/TestSceneBlueprintOrdering.cs |
Adjusts concurrent-duration placement test to add a mid-spinner object. |
osu.Game.Rulesets.Osu.Tests/Editor/TestSceneObjectObjectSnap.cs |
Adjusts snapping test to seek to slider end before placing. |
osu.Game.Rulesets.Mania/Edit/Setup/ManiaDifficultySection.cs |
Reworks key count editing to support dual stages with derived “actual key count”. |
osu.Game.Rulesets.Mania.Tests/Editor/TestSceneObjectPlacement.cs |
Adds test asserting no duplicate notes at same time+column. |
osu.Game.Rulesets.Mania.Tests/Editor/TestSceneManiaEditorSaving.cs |
Updates saving tests for new key count slider type + adds dual stage change test. |
osu.Game.Tests/Visual/RankedPlay/RankedPlayTestScene.cs |
Makes sample beatmaps ruleset-dependent; updates request handler API. |
osu.Game.Tests/Visual/RankedPlay/TestSceneSongPreview.cs |
Updates test setup to provide ruleset info to beatmap request handler. |
osu.Game.Tests/Visual/RankedPlay/TestSceneRankedPlayScreen.cs |
Updates request handler construction to be ruleset-aware. |
osu.Game.Tests/Visual/RankedPlay/TestSceneRankedPlayCard.cs |
Updates ruleset tests to use explicit ruleset infos; updates request handler setup. |
osu.Game.Tests/Visual/RankedPlay/TestScenePickScreen.cs |
Splits pick screen test into explicit osu!/mania tests with ruleset-aware handlers. |
osu.Game.Tests/Visual/RankedPlay/TestSceneOpponentPickScreen.cs |
Updates request handler construction to be ruleset-aware. |
osu.Game.Tests/Visual/RankedPlay/TestSceneDiscardScreen.cs |
Updates request handler construction to be ruleset-aware. |
osu.Game.Tests/Resources/Requests/api-beatmaps-rankedplay-mania4k.json |
Adds mania-specific ranked-play beatmap fixture data. |
osu.Game/Localisation/EditorSetupStrings.cs |
Adds localisation for metadata sync button text + tooltip. |
osu.Game/Localisation/EditorDialogsStrings.cs |
Adds localisation for metadata sync confirmation body text. |
Comments suppressed due to low confidence (1)
osu.Game/osu.Game.csproj:45
- The comment explaining the
ppy.Veldrid.SPIRVpin still referencesppy.osu.Framework 2026.507.1even though the framework reference was bumped to2026.508.1. Please update the version mentioned in the comment (or make it version-agnostic) to avoid confusion during future upgrades.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Comment on lines
+137
to
+145
| protected OsuSpriteText CreateRank() => new OsuSpriteText | ||
| { | ||
| Font = OsuFont.GetFont(size: 16, weight: FontWeight.SemiBold), | ||
| Shadow = false, | ||
| // We can't colour the properly because we don't have the required percentile data. | ||
|
|
||
| Colour = Colours.BlueLighter, | ||
| Text = User.Rank?.Rank?.ToLocalisableString("\\##,##0") ?? string.Empty, | ||
| }; |
Comment on lines
+141
to
+142
| // We can't colour the properly because we don't have the required percentile data. | ||
|
|
Comment on lines
+63
to
+71
| new RoundedButton | ||
| { | ||
| RelativeSizeAxes = Axes.X, | ||
| Text = EditorSetupStrings.SyncMetadataWithAllDifficulties, | ||
| TooltipText = EditorSetupStrings.SyncMetadataWithAllDifficultiesTooltip, | ||
| Margin = new MarginPadding { Top = 10 }, | ||
| Action = () => dialogOverlay?.Push(new SyncMetadataConfirmationDialog(syncMetadataToAllOtherDifficulties)), | ||
| Enabled = { Value = working.Value.BeatmapSetInfo.Beatmaps.Count > 1 } | ||
| } |
| } | ||
|
|
||
| /// <summary> | ||
| /// Overload of <see cref="GetAdjustedDisplayDifficulty"/> for display on Ranked Cards |
Comment on lines
+492
to
+499
| // Key count attribute isn't relevant to ranked play (it's decided by the pool). | ||
| attributes.RemoveAll(a => a.Acronym == "KC"); | ||
|
|
||
| float holdNoteRatio = beatmapInfo.TotalObjectCount == 0 ? 0 : (float)beatmapInfo.EndTimeObjectCount / beatmapInfo.TotalObjectCount; | ||
| attributes.Insert(0, new RulesetBeatmapAttribute("Hold notes", @"HN", holdNoteRatio, holdNoteRatio, 1) | ||
| { | ||
| ValueFormat = "P0" | ||
| }); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
ppy.osu.Framework→2026.508.1inosu.Game/osu.Game.csprojppy.osu.Framework.Android→2026.508.1inosu.Android.propsppy.osu.Framework.iOS→2026.508.1inosu.iOS.props