https://github.com/user-attachments/assets/2a511e0d-51f8-4abf-a3ab-de0992618b6b
This implements a rather opinionated UX that's designed to be a middle
ground between the previous lazer behaviour of unconditionally
inheriting the last slider's velocity and just a textbox that you'd need
to manually fiddle with every time.
As to what that means, precisely:
- By default, the control follows the last slider's velocity (updates on
seeks as well as changes to existing objects).
- When the slider control in the toolbox is manually adjusted, the
control decouples from the last slider's velocity and instead uses the
last manually-specified value.
- There is a button that allows the user to couple back to the last
slider's velocity if they consider to have made a mistake in adjusting
it.
- Upon successful placement of a slider, the control reverts to
following the last slider's velocity.
Of note, this control *only interacts with and affects the next placed
slider*. It is in no way coupled to any selected objects. This may be
confusing to users but was an intentional choice to limit complexity
(what if there are multiple selected objects with multiple velocities?)
For adjusting existing objects you can use the green pieces on the
timeline, which notably do support changing multiple selected objects at
once.
---
- Closes https://github.com/ppy/osu/issues/36844
- Supersedes / closes https://github.com/ppy/osu/pull/33707
We already [did this for quick
play](https://github.com/ppy/osu/pull/36025) but it was never carried
across. Some of the new UI *could* work with UI scale with more
consideration, but for now, let's disable it globally to fix cases like
the results screen which people completely unusable at higher scales.
---
@ppy/team-client would hope to get this into today's build, if priority
review could be given to it.
Closes https://github.com/ppy/osu/issues/37407.
- Note that this adds a UI scale slider to all `ScreenTestScenes`. In
some testing, this seems to work just fine.
- May be worth reading 6c8dd589f7384d46377620340d300e53aec7eed5 commit
message for one future concern i have.
- Added a small breakdown animation to the results screen.
- Added individual multiplier text to user corner pieces.
- Removed global multiplier text from the stage overlay, since we're
going with individual multipliers.
https://github.com/user-attachments/assets/47cec478-6ad5-49fa-9f69-b6df079ce41c
(This is dev design and I'm focusing on functionality rather than
presentation for now.)
The implementation might be over-engineered a bit, but I'm not sure on
the final structure of things and I want to give a bit of elasticity to
the system, so I've frankensteined a new "damage sources" list inside
`RankedPlayDamageInfo` that the results screen uses to display the
breakdown.
If the server doesn't provide a breakdown (e.g. by client and server
being slightly out-of-date), the results screen will behave as it does
on current `master`. In other words this is forwards/backwards
compatible.
---------
Co-authored-by: Dean Herbert <pe@ppy.sh>
This used to be the case, but recently changed with the introduction of
[pausing when inactive](https://github.com/ppy/osu/pull/37100). The
change was intended to work for local gameplay modes, but it makes less
sense for spectator/replay where you may want to be watching in the
background while doing something else.
Raised via email.
Closes https://github.com/ppy/osu/issues/37715.
The user's database contains several scores in which `ScoreInfo.Ruleset`
is null. How this happened, I'm not sure, it's probably custom rulesets.
The proper way to handle this would be to mark `ScoreInfo.Ruleset` as
nullable and deal with the hundred files of fallout, and also the fact
that `ScoreInfo` is an overloaded mess of a model that is sometimes a
database model and sometimes a post-converted online structure with
things backfilled to fit and I'm just not wanting to waste a week here,
so I'm choosing to look away.
Sidebar: You can't just put a null-propagating operator in the previous
conditional too because analysers will scream that `Ruleset` can't
*possibly* be null! So this uses `RulesetInfo.Equals(RulesetInfo?)`
because that can sorta-kinda handle nulls.
Fixes friend list not showing global rank of the users.
I think #37709 can be closed without any further client-side changes
after `osu-web` is made to return global rank on user searches.
The delayed collection evaluation (making it async) is the main fix, but
the debounce seems like good to have from a sanity angle. Alternative
would be `Scheduler.AddOnce` to avoid multiple input events per frame
being handled.
Closes https://github.com/ppy/osu/issues/37615.
the x axis division was set to a fixed number of steps rather than
picking a neat step size, which created uneven numbers. this pr changes
this so an appropriate factor is determined, the x-axis min/max is
floor'd/ceil'd to that factor and the divisions are created based on
that factor. the cumulative rating line also extends to the new end of
the graph.
in addition, the bars of the bar chart are now aligned using the left
edge of the bar rather than the center. in the after-image, note how the
left edge of the bar for 1600 rating aligns with the division. (this is
based on the assumption that a rating bucket, say "1500", spans the
interval [1500, 1600]. if the bucket spans [1450, 1550] instead, i will
revert the change)
before
<img width="632" height="217" alt="image"
src="https://github.com/user-attachments/assets/b7053d43-99bb-4e5b-87a4-dcec37d56b50"
/>
after
<img width="608" height="230" alt="image"
src="https://github.com/user-attachments/assets/3f9e4284-f1b1-4bcb-8f70-f75f4e242b19"
/>
could optimize the while loop into a single mathematical expression, but
this is easier to read imo. lmk if you'd prefer the expression instead
As far as I can tell this matches stable expectations. As with most
things editor, it doesn't make sense to skin a beatmap and then want to
edit the beatmap without that skin applied, ever.
---
As mentioned in https://github.com/ppy/osu/discussions/37607.
Could probably be implemented in five different ways, this is just the
simplest that came to me. Well aware this is adding even more faff on
top of the config/disable/toggles for this stuff, but feels required for
editor sanity.
---------
Co-authored-by: Bartłomiej Dach <dach.bartlomiej@gmail.com>
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>
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 https://github.com/ppy/osu/discussions/37568.
---------
Co-authored-by: Dan Balasescu <smoogipoo@smgi.me>
Co-authored-by: Dean Herbert <pe@ppy.sh>
Kao Li Chin (Gao Li Jin)
·
2026-05-08 18:04:29 +09:00
When editing metadata, it's annoying that the editor returns to compose
mode when switching between difficulties. This fixes that fallacy.
Supersedes and closes https://github.com/ppy/osu/pull/36724.
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 fe5c437e40..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.
Closes https://github.com/ppy/osu/issues/37553.
You can probably tell by the title that this is going to be a good one.
As previously mentioned in https://github.com/ppy/osu/pull/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`.
Intends to close https://github.com/ppy/osu/issues/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 (https://github.com/ppy/osu/issues/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.