Skip to content

Merge 12 upstream ppy/osu commits (ours-priority) - #311

Merged
winnerspiros merged 15 commits into
masterfrom
copilot/merge-ppy-fork-prioritize-our-fork
May 8, 2026
Merged

Merge 12 upstream ppy/osu commits (ours-priority)#311
winnerspiros merged 15 commits into
masterfrom
copilot/merge-ppy-fork-prioritize-our-fork

Conversation

Copilot AI commented May 8, 2026

Copy link
Copy Markdown
  • Bump ppy.osu.Framework2026.508.1 in osu.Game/osu.Game.csproj
  • Bump ppy.osu.Framework.Android2026.508.1 in osu.Android.props
  • Bump ppy.osu.Framework.iOS2026.508.1 in osu.iOS.props

peppy and others added 13 commits May 8, 2026 08:20
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>
@gitar-bot

gitar-bot Bot commented May 8, 2026

Copy link
Copy Markdown

Gitar is working

Gitar

Copilot AI requested a review from winnerspiros May 8, 2026 10:22
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
winnerspiros marked this pull request as ready for review May 8, 2026 13:06
Copilot AI review requested due to automatic review settings May 8, 2026 13:06
@winnerspiros
winnerspiros merged commit 41ac049 into master May 8, 2026
20 of 21 checks passed

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 / .iOS package references to 2026.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.SPIRV pin still references ppy.osu.Framework 2026.507.1 even though the framework reference was bumped to 2026.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"
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants