Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Conversation

@tsunyoku
Copy link
Member

@tsunyoku tsunyoku commented Sep 15, 2025

osu, taiko and catch receive difficulty & performance changes. mania has difficulty refactors but no actual changes to difficulty or performance.

  • 5 new databased difficulty attributes for osu ruleset. These are being used for improved slider break estimations. In the future, we could explore removing some of these by using the osu_beatmap_scoring_attribs table
  • 2 new databased difficulty attributes for taiko ruleset, the rest are NOT being databased
  • Hidden is now a difficulty-affecting mod for the osu ruleset

Newspost: ppy/osu-wiki#13708

stanriders and others added 30 commits March 23, 2025 21:08
* Use `normalized_hitobject_radius` during osu!catch buzz slider detection

Currently the algorithm considers some buzz sliders as standstills when
in reality they require movement. This happens because `HalfCatcherWidth`
isn't normalized while `exactDistanceMoved` is, leading to an inaccurate
comparison.

`normalized_hitobject_radius` is the normalized value of `HalfCatcherWidth`
and replacing one with the other fixes the problem.

* Rename `normalized_hitobject_radius` to `normalized_half_catcher_width`

The current name is confusing because hit objects have no radius in the
context of osu!catch difficulty calculation. The new name conveys the
actual purpose of the value.

* Only set `normalized_half_catcher_width` in `CatchDifficultyHitObject`

Prevents potential bugs if the value were to be changed in one of the
classes but not in both.

* Use `CatchDifficultyHitObject.NORMALIZED_HALF_CATCHER_WIDTH` directly

Requested during code review.

---------

Co-authored-by: James Wilson <[email protected]>
…Object` (#32410)

* Move difficulty calculation fields from `Slider` to `OsuDifficultyHitObject`

* Remove redundant check

* Use `LastObject` where possible

* Update tests

* Make `LazyTravelDistance` `double`

---------

Co-authored-by: James Wilson <[email protected]>
* Move osu!catch movement state into `CatchDifficultyHitObject`

In order to port `Movement` to an evaluator, the state has to be either
moved elsewhere or calculated inside the evaluator. The latter requires
backtracking for every hit object, which in the worst case is continued
until the beginning of the map is reached. Limiting backtracking can
lead to difficulty value changes.

Thus, the first option was chosen for its simplicity.

* Move osu!catch movement difficulty calculation to an evaluator

Makes the code more in line with the other game modes.

* Add documentation for `CatchDifficultyHitObject` fields

---------

Co-authored-by: James Wilson <[email protected]>
* basis refactor to allow for more complex SR calculations

* move all possible bonuses into star rating

* decrease star rating scaling to account for overall gains

* add extra FL guard for safety

* move star rating multiplier into a constant

* Reorganise some things

* Add HD and SO to difficulty adjustment mods

* Move non-legacy mod multipliers back to PP

* Some merge fixes

* Fix application of flashlight rating multiplier

* Fix Hidden bonuses being applied when Blinds mod is in use

* Move part of speed OD scaling into difficulty

* Move length bonus back to PP

* Remove blinds special case

* Revert star rating multiplier decrease

* More balancing

---------

Co-authored-by: StanR <[email protected]>
* Add diffcalc considerations for Magnetised mod

* Make speed reduction scale with power too
…n classic accuracy scores (#31234)

* scale misscount by proportion of difficult sliders

* cap sliderbreak count at count100 + count50

* use countMiss instead of effectiveMissCount as the base for sliderbreaks

* make code inspector happy + cleanup

* refactor to remove unnecesary calculation and need for new tuple

* scale sliderbreaks with combo

* use aimNoSliders for sliderbreak factor

* code cleanup

* make inspect code happy

* use diffcalcutils

* fix errors (oops)

* scaling changes

* fix div by zeros

* Fix compilation error

* Add online attributes for new difficulty attributes

* Formatting

* Rebase fixes

* Make `CountTopWeightedSliders` to remove weird protected `SliderStrains` list

* Prevent top weighted slider factor from being Infinity

---------

Co-authored-by: tsunyoku <[email protected]>
…he same time (#33066)

* implement stuff

* fix basic issues

* rework calculations

* sanity check

* don't use score based misscount if no scorev1 present

* Update OsuPerformanceCalculator.cs

* update misscount diff attribute names

* add raw score misscount attribute

* introduce more reasonable high bound for misscount

* code quality changes

* Fix osu!catch SR buzz slider detection (#32412)

* Use `normalized_hitobject_radius` during osu!catch buzz slider detection

Currently the algorithm considers some buzz sliders as standstills when
in reality they require movement. This happens because `HalfCatcherWidth`
isn't normalized while `exactDistanceMoved` is, leading to an inaccurate
comparison.

`normalized_hitobject_radius` is the normalized value of `HalfCatcherWidth`
and replacing one with the other fixes the problem.

* Rename `normalized_hitobject_radius` to `normalized_half_catcher_width`

The current name is confusing because hit objects have no radius in the
context of osu!catch difficulty calculation. The new name conveys the
actual purpose of the value.

* Only set `normalized_half_catcher_width` in `CatchDifficultyHitObject`

Prevents potential bugs if the value were to be changed in one of the
classes but not in both.

* Use `CatchDifficultyHitObject.NORMALIZED_HALF_CATCHER_WIDTH` directly

Requested during code review.

---------

Co-authored-by: James Wilson <[email protected]>

* Move osu!catch movement diffcalc to an evaluator (#32655)

* Move osu!catch movement state into `CatchDifficultyHitObject`

In order to port `Movement` to an evaluator, the state has to be either
moved elsewhere or calculated inside the evaluator. The latter requires
backtracking for every hit object, which in the worst case is continued
until the beginning of the map is reached. Limiting backtracking can
lead to difficulty value changes.

Thus, the first option was chosen for its simplicity.

* Move osu!catch movement difficulty calculation to an evaluator

Makes the code more in line with the other game modes.

* Add documentation for `CatchDifficultyHitObject` fields

---------

Co-authored-by: James Wilson <[email protected]>

* Move all score-independent bonuses into star rating (#31351)

* basis refactor to allow for more complex SR calculations

* move all possible bonuses into star rating

* decrease star rating scaling to account for overall gains

* add extra FL guard for safety

* move star rating multiplier into a constant

* Reorganise some things

* Add HD and SO to difficulty adjustment mods

* Move non-legacy mod multipliers back to PP

* Some merge fixes

* Fix application of flashlight rating multiplier

* Fix Hidden bonuses being applied when Blinds mod is in use

* Move part of speed OD scaling into difficulty

* Move length bonus back to PP

* Remove blinds special case

* Revert star rating multiplier decrease

* More balancing

---------

Co-authored-by: StanR <[email protected]>

* Add diffcalc considerations for Magnetised mod (#33004)

* Add diffcalc considerations for Magnetised mod

* Make speed reduction scale with power too

* cleaning up

* Update OsuPerformanceCalculator.cs

* Update OsuPerformanceCalculator.cs

* add new check to avoid overestimation

* fix code style

* fix nvicka

* add database attributes

* Refactor

* Rename `Working` to `WorkingBeatmap`

* Remove redundant condition

* Remove useless variable

* Remove `get` wording

* Rename `calculateScoreAtCombo`

* Remove redundant operator

* Add comments to explain how score-based miss count derivations work

* Remove redundant `decimal` calculations

* use static method to improve performance

* move stuff around for readability

* move logic into helper class

* fix the bug

* Delete OsuLegacyScoreProcessor.cs

* Delete ILegacyScoreProcessor.cs

* revert static method for multiplier

* use only basic combo score attribute

* Clean-up

* Remove unused param

* Update osu.Game.Rulesets.Osu/Difficulty/OsuPerformanceCalculator.cs

Co-authored-by: StanR <[email protected]>

* rename variables

* Add `LegacyScoreUtils`

* Add fail safe

* Move `countMiss`

* Better explain `CalculateRelevantScoreComboPerObject`

* Add `OsuLegacyScoreMissCalculator`

* Move `CalculateScoreAtCombo` and `CalculateRelevantScoreComboPerObject`

* Remove unused variables

* Move `GetLegacyScoreMultiplier`

* Add `estimated` wording

---------

Co-authored-by: wulpine <[email protected]>
Co-authored-by: James Wilson <[email protected]>
Co-authored-by: StanR <[email protected]>
Co-authored-by: StanR <[email protected]>
* Buff precision difficulty rating in osu!

* Fix position repetition calculation

* Fix aim evaluator crashing, move small circle bonus calculation, adjust the curve slightly

* Refactor

* Fix code quality

* Semicolon

* Apply small circle bonus to speed too

* Fix formatting

---------

Co-authored-by: James Wilson <[email protected]>
* add spinner support

* Make `CalculateSpinnerScore` private & clarify comments

---------

Co-authored-by: James Wilson <[email protected]>
* add consistency attribute

* write attributes to json for serialisation

* comment change

* fix json, add mechanical difficulty

* write new attributes to database

---------

Co-authored-by: James Wilson <[email protected]>
* initial commit

* changed HD curve

* removed AR variable

* update for new rework

* nerf HD acc bonus for AR>10

* add another HD nerf for AR>10

* Update OsuDifficultyCalculator.cs

* fix speed part being missing

* Update OsuDifficultyCalculator.cs

* rework to difficulty-based high AR nerf

* move TC back to perfcalc

* fix nvicka

* fix comment

* use utils function instead of manual one

* Clean up

* Use "visibility" term instead

* Store `mechanicalDifficultyRating` field

* Rename `isFullyHidden` to `isAlwaysPartiallyVisible` and clarify intent

* Remove redundant comment

* Add `calculateDifficultyRating` method

---------

Co-authored-by: James Wilson <[email protected]>
* fix incorrect clamp

* Add inline comment to explain `possibleBreaks` calculation

* move limit to aim and speed functions

* fix negative okMehAdjustment

* fix cases where lazer effective misscount gets reduced

* Simplify scope of changes

* Correct variable name

---------

Co-authored-by: James Wilson <[email protected]>
* Reduce combo scaling for osu!catch

This is a conservative reduction, a middle point between the current
scaling and the CSR proposals.

* Reduce osu!catch combo scaling further

0.45 makes little difference so let's reduce it a bit more.

---------

Co-authored-by: James Wilson <[email protected]>
#33500)

* Change pp summing and adjust multipliers

* Add back convert consideration for hidden

* And the other one whoops

---------

Co-authored-by: StanR <[email protected]>
* Refactor

* Fix typo

* Prevent double.PositiveInfinity from occuring

* Fix leftover code branch

* Fix some idiot putting Math.Max instead of Math.Min

* Address NaN values

---------

Co-authored-by: James Wilson <[email protected]>
* New formulas for effective miss count and penalty

* More elaborate comments

* More comment stuff
* Decouple velocity change bonus from wide angle bonus

* Replace sin with smoothstep

* Set multiplier back to 0.75

---------

Co-authored-by: James Wilson <[email protected]>
tsunyoku and others added 8 commits August 31, 2025 12:32
This isn't a super common mod compared to every other one on the list, it's probably not worth the storage (and memory in case of stable) implications. We can look at revisiting this once we have actual spinner difficulty considerations
* Prevent Taiko difficulty crash if a map only contains 0-strains

* Add second check for safety

This is accessing a different array of strains. I'd rather be safe than sorry.

* Add guard in PP too

* Make `MarginOfError` a const
* Reduce rhythm difficulty if current object is doubletappable

* Buff rhythm multiplier
* Change maximum UR estimation + buff rhythm

* Penalty for classic ezhd

* Buff mono bonus to counterbalance logic fix

* New miss penalty + slightly nerf length bonus

* Adjust rhythm values

* Adjust penalty and buff high SR acc

* Exclude HDFL from hidden reading penalties

* Make comment a lil nicer

---------

Co-authored-by: James Wilson <[email protected]>
…ttributes (#35028)

* Remove databasing of `MechanicalDifficulty` and `ReadingDifficulty` attributes

* Update attribute IDs
@tsunyoku
Copy link
Member Author

@tsunyoku
Copy link
Member Author

!diffcalc
RULESET=taiko
OSU_A=https://github.com/ppy/osu/tree/master
OSU_B=#35029

@tsunyoku
Copy link
Member Author

!diffcalc
RULESET=catch
OSU_A=https://github.com/ppy/osu/tree/master
OSU_B=#35029

@github-actions

This comment was marked as outdated.

@github-actions
Copy link

@github-actions
Copy link

* Update RhythmEvaluator.cs

* Rename `StrainTime` into `AdjustedDeltaTime`

---------

Co-authored-by: StanR <[email protected]>
@stanriders
Copy link
Member

@github-actions
Copy link

smoogipoo
smoogipoo previously approved these changes Sep 23, 2025
Copy link
Contributor

@smoogipoo smoogipoo left a comment

Choose a reason for hiding this comment

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

I've done a very basic pass and all looks good to me.

@peppy peppy self-requested a review October 7, 2025 07:12
@peppy peppy merged commit a08f732 into master Oct 7, 2025
16 checks passed
bdach added a commit to bdach/osu that referenced this pull request Oct 20, 2025
To trigger client-side recalculations of star ratings.

Should have been done in ppy#35029.

Probably closes ppy#35357.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.