Skip to content

MERGE - #30

Closed
kwotaq wants to merge 1050 commits into
TextAdventurer12:masterfrom
kwotaq:fc-time-limit
Closed

MERGE#30
kwotaq wants to merge 1050 commits into
TextAdventurer12:masterfrom
kwotaq:fc-time-limit

Conversation

@kwotaq

@kwotaq kwotaq commented Apr 17, 2026

Copy link
Copy Markdown

this is ur pp dev sir

peppy and others added 30 commits January 30, 2026 15:37
- Closes ppy#35743

Matches playlists. Multiplayer seems to not have it, but I think that's
expected (i.e. there's no past scores, so having the initial position be
"-" and no initial green color seems right).

| Before | After |
| --- | --- |
| ![Kapture 2026-01-27 at 15 49
29](https://github.com/user-attachments/assets/39ad2cda-87e4-49e4-a872-4588ec07cae1)
| ![Kapture 2026-01-27 at 15 47
30](https://github.com/user-attachments/assets/1b8f1e42-5468-4634-8397-ba455c453761)
|
| ![Kapture 2026-01-27 at 15 51
57](https://github.com/user-attachments/assets/29b0a4b9-551a-4ac0-9b83-c8eb853422ae)
| ![Kapture 2026-01-27 at 15 52
45](https://github.com/user-attachments/assets/7b4b4c9b-4353-4845-9be1-8467326d3f6b)
|
Fix unobserved timeouts still showing to user
Add skin cycling with shortcuts for next and previous skin
This should buff raw speed plays like Ivaxa Violation, at the same time
undoing part of the buff on the lower end scores like Save Me NM
Moved part of the multiplier out of the Pow to be more intuitive (it
multiplies the 20 by Pow(difficulty/4), so it's more clear that it would
be equal to 1 on difficulty = 4)
The scaling itself was adjusted to be more similar to live (so
buffs/nerfs on 98% acc remains +- the same through the difficulty curve)
- Exiting while queueing will now background the search.
- The "queue in background" button changed to "stop queueing".

Exiting while in the "pending accept"/"waiting for players" states will
exit from the queue. There is also a small period during the in-room
state (where the matchmaking screen hasn't been pushed yet but "good
luck" is displaying) where the user cannot exit from the screen. I've
removed the exit confirmation dialogs to streamline the process and
align with this.


https://github.com/user-attachments/assets/8c172502-0624-42cd-ae0c-bb710068267c
This should be a pretty simple fix for doubles being systemically broken
in aim. Doubles get essentially zero bonus from the aim eval itself -
wide & acute bonuses are zero due to the lack of distance, and velocity
is close to zero _again_ because of the lack of distance. However, the
delta times of these notes mean that `highBpmBonus` is very kind and
will buff the strain quite significantly.

This change means that the 2nd note of a double should get next to no
aim strain, which feels like correct behaviour. From testing, streams,
stacks etc. are essentially unchanged by this due to the fact its using
radius rather than diameter.

https://pp.huismetbenen.nl/rankings/players/doubles-strain
Fixes ppy#36562 

Currently there exists a bug where the mod preset hotkeys will wrap
outside of the intended bounds.

Fix is making sure the preset index is < 10

Before:
<img width="486" height="358" alt="image"
src="https://github.com/user-attachments/assets/77f1ca9e-4fd0-4b29-b9f5-f53e652db42d"
/>

After:
<img width="1007" height="1295" alt="image"
src="https://github.com/user-attachments/assets/ca81cc39-2f86-462c-a26b-002aceed77f4"
/>
It removes unnecessary function `DurationSpentInvisible` function that
just rescaled preempt.
Now it's just using preempt directly.
I've made multiplier to be very close to the current one, so pp deltas
should be minimal.
Fix revert to default button not resizing correctly after changing languages
…33649)

- Adds sorting and display styles.
- Saves sort/display modes to the config.
- Improves performance, especially on the 2nd+ time opening the overlay.


https://github.com/user-attachments/assets/e32b50d0-58a1-4eef-b18c-988fb497e545

---

Coming off some recent feedback in
ppy#33426 (comment),
I decided to take a bit of a detour and get a little bit more
functionality in.

Sorting by rank, although it should technically work, doesn't work right
now. This is because the osu!web API doesn't return user rank on
`/user/` lookups - it's only returned for the friends request. I'm
leaving this open as a discussion topic.
- We can make osu!web return the rank and osu! will require no further
changes to work correctly, or
- We can try to implement additional paths through
`osu-server-spectator` which would blow this PR out of proportion and is
best left for a task of its own.

For simplicity, I've re-implemented this display mostly as its own
component for now, lifting code from `FriendDisplay` which was recently
overhauled. These implementations should eventually be combined somehow
but that's dependent on:
1. Figuring out the styling - friends can display offline users for
which it makes no sense to display the "spectate" button.
2. Figuring out how to handle the different users/presence pathways.
It's mostly a code complexity issue.

---------

Co-authored-by: Dean Herbert <pe@ppy.sh>
Co-authored-by: Bartłomiej Dach <dach.bartlomiej@gmail.com>
…SINGLE_SPACING_THRESHOLD` (ppy#36573)

Slightly reducing aim/speedaim doubledipping, but mostly just done for
consistency and ease of understanding of existing relation between both
This does a couple of things:

- Adds slider->circle effective ratio adjustment
- Removes same polarity nerf for single delta count islands (which are
pretty much THE most unpredictable)
- Makes polarity nerf check actual deltas and not just the count
- Excludes spinners from ratio calculation

https://pp.huismetbenen.nl/rankings/players/minor-rhythm-improvements

---------

Co-authored-by: James Wilson <tsunyoku@gmail.com>
…ly (ppy#36564)

my attempt at ppy#36452: changes difficulty range slider in song select V2
to use the new star difficulty text gradient colors from ppy#36292.

closes ppy#36405


https://github.com/user-attachments/assets/134ace54-a8f8-4024-a32e-f1604c868232

to match star rating more closely for sr <= 7.5 (where i don't think the
colors are so intense that they break harmony with the rest of the
design), i removed the Lighten by 0.4f on color update

also improved the transition from 7.9 to 8.0 which is quite abrupt in
the current version

ppy#33425 (comment) is
relevant here
# Conflicts:
#	osu.Game.Rulesets.Osu/Difficulty/OsuDifficultyCalculator.cs
#	osu.Game.Rulesets.Osu/Difficulty/OsuPerformanceCalculator.cs
#	osu.Game.Rulesets.Osu/Difficulty/Skills/Aim.cs
#	osu.Game.Rulesets.Osu/Difficulty/Skills/Speed.cs
…coefficients, and fix minor bug with miss penalty
)

Grouped notifications for more than 1 person were added in
ppy#36180 but it looks like they forgot to
add the Transient and IsImportant flags, which means the grouped
notifications would still stay in the notification list/flash the
taskbar.

Before:


https://github.com/user-attachments/assets/8a34bbc0-2b5c-4086-b2ee-1daa6d1e6e10



After:


https://github.com/user-attachments/assets/03c25ba6-7c8e-464c-bbb1-688ab9da6bb6
…y#36616)

- Closes ppy#35389

Same as:

https://github.com/ppy/osu/blob/2efe0c95e63817f312f5fb12cc60dd56bee0023b/osu.Game/Screens/Edit/Editor.cs#L1173-L1180

There's also seeking hit objects and sample points, but the seeks are
relatively close to each other and probably useless when playing(?). If
we want to make those cases not stuck at the same point in time, I
believe the leniency should be lower than 1000 ms.

With the above, that is why I just copy-pasted the code, as we may want
to have different leniencies.

Edit: forgot the automated label thing, will not label next time
peppy and others added 28 commits March 17, 2026 03:58
It's been a while.

Notes:

- `SharpCompress` usages changed a bit. Manually adjusted these, mostly
just renames or adjusted parameters.
- nUnit 3 -> 4 migrated using
https://gist.github.com/peppy/07994386d793a117350cb5f24b156585. there's
a mode in this script to update to the newer `Assert.That` syntax but it
requires fixes and couldn't really be bothered.
- DeepEqual nuked as the only usage was on a disabled test. The reason
it's disabled has been merged upstream, but it's failing for other
(realm) reasons which I don't think is worthwhile to investigate for
now.
- This bumps Moq. I think the author is back in a sensible headspace and
the new version has the stupid shit removed, so probably okay? Nice to
be on a level playing field with packages for once in a long time.
- Automapper is silly, but we've discussed this elsewhere.
- `TestRealmKeyBindingStore` failures are a wildcard, but fixed by using
a more standardised testing method. Dunno why, don't care.

---------

Co-authored-by: Bartłomiej Dach <dach.bartlomiej@gmail.com>
Contains:

- A small bug fix from initial separation merge. Snap aim only applies
this bonus when slider travel distance is passed, so it should be the
same for flow. Cannot find any cases where values are affected, but in
theory the only difference this can make is slider factor calculations.
- Apply overlapping note factor to the acute bonus, so that direction
changes that overlap are awarded less. A small speed multiplier increase
is included to offset this
- Move angular velocity calculation out of ODHO into the flow evaluator,
and fix it referencing the wrong angle (2 objects back instead of the
previous object)
- 2 tiny code refactors

---------

Co-authored-by: StanR <8269193+stanriders@users.noreply.github.com>
…py#36806)

It barely affects values at this point

---------

Co-authored-by: James Wilson <tsunyoku@gmail.com>
Generally deflationary on the top end and roughly the same at low end.
Likely needs a more comprehensive solution, but this at least ensures
that even if we don't do it the values will be sane.

Co-authored-by: James Wilson <tsunyoku@gmail.com>
This change removes `clockRate` precalculation from
`DifficultyCalculator`.

The idea is that clock rate should be calculated in-place (ideally for
every object) since we store and access it using DHOs. This also
prevents anyone from accidentally passing clock rate to skills

Unfortunately osu uses clock rate to calculate OD for the whole map in
`CreateDifficultyAttributes` so we can't make it completely DHO-based,
but I think one single in-place call to `ModUtils.CalculateRateWithMods`
in `CreateDifficultyAttributes` is fine

---------

Co-authored-by: James Wilson <tsunyoku@gmail.com>
This slightly buffs aim on above ~7.5 stars maps and slightly nerfs it
below that

---------

Co-authored-by: James Wilson <tsunyoku@gmail.com>
# Conflicts:
#	osu.Game.Rulesets.Osu/Difficulty/OsuDifficultyCalculator.cs
#	osu.Game.Rulesets.Osu/Difficulty/OsuPerformanceCalculator.cs
#	osu.Game.Rulesets.Osu/Difficulty/Skills/Aim.cs
https://www.desmos.com/calculator/naggvbcz0a

This change makes first ~3 misses have harsher miss penalty, while 9+
misses get lighter penalty. 4-9 misscounts stay close to unchanged.
# Conflicts:
#	osu.Game.Rulesets.Osu/Difficulty/OsuPerformanceCalculator.cs
Now that agility isn't "speedaim" that covers both snap and flow we can
restore it back into it's original scaling. Arguably it should be _more_
than d/t^2 but that's a thing to explore separately
At this point maybe having a shared small circle bonus in ODHO isn't
even worth it since we have different d/t scalings in all evaluators.
Bonus was made for snap (~d/t^1.65), here it's adjusted to be higher on
agility (~d/t^2) and lower on flow (~d/t). Practically affects like [1
map](https://osu.ppy.sh/beatmapsets/2191876#osu/5192354)
This buffs longer jump sections and slightly nerfs short jump spikes.
Mostly a way to slightly restore non-aimslop DT aim maps since they got
hit with all the nerfs a bit too hard

---------

Co-authored-by: James Wilson <tsunyoku@gmail.com>
This rework target is C-type nerf, as this map gets absurd amount of
reading pp, because angles are considered very unrepetitive. What
results in this score being worth absurd 1.4k pp.

This PR is up to heavy discussion because it can be made much more
general, touching more maps. So I wait on pp committee opinion on what
of the parts can be removed.

Current checks for angle to be nerfed:
- The smaller angle has to be very sharp: <20 degrees, full power on <5
degrees
- The larger angle has to be wide: >60 degrees, full power on >120
degrees

If pattern meets all the criteria - it would be considered repetitive.
For now practically no map meets this criteria to significant amount
except C-type.
- Closes ppy#25254

Solves chunking-related issues by starting a new chunk for every object,
and allowing chunks to be different lengths. This is retrofitted to
existing calculations, and doesn't have other ramifications in the way
something like tr3s's continuous strains do.

The effect of this can be seen in the video below. In live pp, the map
would lose sr when increasing the rate at certain points, but in the
video, the sr rises consistently as expected.


https://github.com/user-attachments/assets/2d58946a-9e0c-4f6b-912a-71dfe75c0f8a

A multiplier has been added inside `DifficultyValue()` to account for SR
being slightly lower from more granular summation.

When testing this rework in PerformanceCalculatorGUI, I recommend using
[this
fork](https://github.com/Finadoggie/osu-tools/tree/variable-length-strains).
I can't guarantee that the visuals it shows are correct, but they are
definitely more correct than not.

Edit: Use [this
fork](https://github.com/Finadoggie/osu-tools/tree/unsynced-variable-length-strains)
for testing now. Old one is now for testing
SynchronizedVariableLengthStrainSkill

---------

Co-authored-by: tsunyoku <tsunyoku@gmail.com>
Co-authored-by: StanR <8269193+stanriders@users.noreply.github.com>
This doesn't affect values as per the original refactor.

Co-authored-by: StanR <8269193+stanriders@users.noreply.github.com>
…calculation (ppy#37184)

Adjusting difficulty before we calculate the flow probability is
technically wrong. This makes flow adjustment on RX actually work as it
should instead of trying to lower the snap to achieve similar results.
TD flow buff was removed because here it actually made some maps _very_
buffed. Values are mostly the same otherwise
This PR moves the addition of the bonuses closer to their declaration
and also renames some variables and functions to more closely resemble
the way they're used. The names can be discussed for I'm not sold on
them either.

---------

Co-authored-by: James Wilson <tsunyoku@gmail.com>
Currently all low spaced (<radius) aim is evaluated as low difficulty
snap. After we separated snap, flow and agility we don't actually need
snap aim to be reduced for low distance - this is something that flow
aim should cover instead as low spacing is guaranteed to be either
flowed or not aimed at all. By extension this fixes the need for the
flow velocity bonus to be extremely high as it no longer clashes with
snap when the changes happen between low and high spacing.
# Conflicts:
#	osu.Game.Rulesets.Osu/Difficulty/Skills/Aim.cs
@kwotaq kwotaq closed this Apr 17, 2026
@kwotaq
kwotaq deleted the fc-time-limit branch April 17, 2026 12:55
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.