Changes snap aim scaling to d/t^1.65 and speedflow scaling to d/t^1.9
(roughly). This is as much as we can nudge scaling towards d/t without
breaking everything
Currently, live aim evaluation prioritizes high bpms with lower
distances over low bpms with higher distances, something you may have
heard colloquially called "d/t^2" in here. This creates an inherent DT
advantage / NM & HR disadvantage in the average aim case.
This change makes it so the evaluation is nudged closer to the ideal
distance/time aim evaluation. In practice, higher spacing (distance)
and/or slower jumps should generally see a buff, lower spacing
(distance) and/or faster jumps should generally see a nerf. This
includes some 3-mod scores as HR spacing is underweighted regardless of
bpm.
It also affects streams the same way, where faster high bpm low spacing
streams (speedflow) are nerfed and high spacing low bpm streams are
buffed.
As a disclaimer: this isn't a complete fix, it is moreso a step in the
right direction (hence, a Nudge, per se) towards the ideal d/t world.
This also doesn't change anything angle-related so high-spacing farm
maps will gain pp - this will be addressed separately after this change.
https://pp.huismetbenen.nl/rankings/players/reduce-strain-influence
---------
Co-authored-by: James Wilson <tsunyoku@gmail.com>
This changes how the current/previous velocity is being calculated in
Aim. Currently it's being calculated as an addition of 2 velocities
together which isn't really correct, instead here velocity is being
calculated as a (combined distances) / (combined times). On practice
this buffs underweighted slider maps while overweighted ones stay about
the same
https://pp.huismetbenen.nl/rankings/players/use-proper-slider-velocity
This changes difficulty calculations to use `ClockRate` and `HitWindows`
from `DifficultyHitObjects` instead of providing them manually. It's
main purpose is unifying all the calculations to use the same source of
truth, and also allowing future work on supporting variable clockrates.
---------
Co-authored-by: James Wilson <tsunyoku@gmail.com>
Safety measure to prevent potential major abuse maps.
The alternative is reducing nerf on multiplier (for example 5000 instead
of 2500), but increase nerf if rhythm is the same.
Co-authored-by: StanR <8269193+stanriders@users.noreply.github.com>
Alternative to #36464 and #36487.
Reading and flashlight should be treated much more separately, since the
flashlight skill only accounts for object visibility and repetition, but
reading accounts for overlaps, high/low AR, etc. However, for certain
scores with very high reading (to the point of memorisation), the skill
indeed overlaps with flashlight.
This PR uses the normal strain sum exponent for reading and flashlight
(for player expectations), with an extra factor on flashlight to account
for the ease of adding flashlight to a partially memorised map when
reading is the dominant skill.
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>
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.
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
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)
There was a recent PR (https://github.com/ppy/osu/pull/36464) that was
aimed on accounting for the fact that getting your map partially
memorized with FL makes reading easier, so those bonuses shouldn't
reward full pp to each other.
But in cases where FL pp is significantly lower than reading it have
lead to cases where FL adds practically 0 additional pp.
This PR is adjusting a formula to account for cases like this.
FL reward on this map -
https://osu.ppy.sh/beatmapsets/1487999#osu/3259719 with EZHDHT(FL):
Full bonus: 408pp -> 486pp (+78pp)
Current: 408pp -> 424pp (+16pp)
This PR: 408pp -> 478pp (+70pp)
Co-authored-by: StanR <8269193+stanriders@users.noreply.github.com>
Right now they're summed normally what opens a problem that FL rewards
too much pp when combined with reading map, since you're memorizing FL
anyway.
Co-authored-by: James Wilson <tsunyoku@gmail.com>
This doesn't solve _flow_ aim in any way, but makes it so that `Speed`
doesn't have distance scaling (read as "aim") anymore which fixes some
issues related to that like the length bonus behaving incorrectly, and
in general `Speed` being an aim+tap skill instead of just a tapping
skill
---------
Co-authored-by: James Wilson <tsunyoku@gmail.com>
This PR aims to replace the current bonuses used to award high approach
rates and scores made using the Hidden mod with a Reading skill that
takes into account each note's reading difficulty separately, Important
to note is the fact that as reading difficulty is now a skill the
bonuses are now additive instead of multiplicative, meaning there are
vast changes in deltas on the high and low end of scores. Due to the
nature of adding a new skill new difficulty and performance attributes
need to be added.
Huis page:
[https://pp.huismetbenen.nl/rankings/admin/kwotaq-reading](url)
---------
Co-authored-by: apollo-dw <83023433+apollo-dw@users.noreply.github.com>
Co-authored-by: js1086 <js1086@student.le.ac.uk>
Co-authored-by: tsunyoku <tsunyoku@gmail.com>
Co-authored-by: StanR <hi@stanr.info>
Currently the slider bonus works on the assumption that the travel
velocity of the previous slider is a part of the current object's
difficulty because it is part of the movement from prev to curr.
However, this is contradicted by the fact that `currVelocity` is a
combination of prev->curr + curr slider velocity and is actually
breaking the assumption that slider difficulty is contained in the
slider itself that we take when calculating difficult slider strains.
This makes it so that the slider bonus difficulty is contained in the
slider itself instead of buffing the next object, which makes both the
calculation overall more consistent and the slider factor calculation
actually work as expected.
Aim multiplier got slightly lowered because this change makes most of
the sliders gain a little bit
---------
Co-authored-by: James Wilson <tsunyoku@gmail.com>
## This pr resolves the issue with the angle calculation.
The old system calculated the angle between three objects. If the last
object was a long slider that the player needed to follow, the system
calculated the angle using only the slider’s end point and the previous
object, which caused long sliders to have incorrect angle values.
---------
Co-authored-by: StanR <hi@stanr.info>
Co-authored-by: James Wilson <tsunyoku@gmail.com>
The purpose of this change is to remove the arbitrary note based length
bonus for speed and replace it with a more concrete per note difficulty
aware calculation. As a result of the summation needing to be per-note,
chunking and in consequence peak strain reduction have both been removed
from the skill. ~~The various strain counting functions also heavily
relied on chunking and the way summation worked, so they have also been
changed to match values held before the change as much as possible
(given the different summation some changes in values are bound to
happen).~~ Above was a bug.
Huis page:
[https://pp.huismetbenen.nl/rankings/players/length-bonus](https://pp.huismetbenen.nl/rankings/players/length-bonus)
---------
Co-authored-by: James Wilson <tsunyoku@gmail.com>
This PR moves the influence of d/t^2 from the skill (through strain)
directly into the evaluator level as a bonus applied at the end. This
makes it more clear what d/t^2 is, and the fact that it applies to *all*
bonuses in the evaluator. As well, the peak strain value of a note is
now equal to the evaluator value. This comes with a couple benefits:
1. The BPM weight is now subject to balance, and can be flattened easily
for a more "d/t" like system (previously this required hacky solutions)
2. StrainDecayBase becomes a much more useful variable now that it does
not affect the difficulty of the note itself. When adjusting this in
live, your star rating would double upon changing from 0.15 in aim to
0.3, and now it is intuitive what it does (makes strain take longer to
accumulate). This means that future balancing efforts can use evaluators
to dynamically adjust strainDecayBase (potentially letting large spikes
provide more strain for the same difficulty if they're wide angle, for
example).
3. In the object inspector, you get the actual maximum difficulty value
of a note as seen in the ObjectDifficulties list. This makes it easier
to tell what notes are deemed as harder by the system. For context,
previously, a note of difficulty 1 at 200bpm would cap out at 6 as a
result of strain, and a note of the same difficulty but at 300bpm would
cap out at 8.
The actual implementation is really really simple. I'm willing to move
this to flashlight if wanted (I don't think it's necessary), or even
abstract this away so that (1 - decay) doesn't look like a balancing
constant.
Side note: this is equivalent to live, except for notes with a deltaTime
of less than 25ms (since I am using AdjustedDeltaTime in the aim
evaluator for the bonus to avoid divisions by zero).
It's a common mistake by newer pp dev contributors to increase the
wiggle multiplier not knowing its at its maximum, so I added a comment
to try to avoid more people doing it.
---------
Co-authored-by: StanR <8269193+stanriders@users.noreply.github.com>
Fun correctness bug.
ScoreV1 multiplier uses the **nomod** peppy stars (i.e the beatmap's
"base" HP, OD and CS) in all cases, which was generally the intention
with this code but it passes the wrong beatmap resulting in it using
modded values for this.
Cross referenced with stable and this now results in the expected
multipliers.
Results in some very minor (<3pp from my testing) changes for HR and EZ
scores with combo breaks.
* Implement new portion formula
* Change the formula
* Use base value of 5 sliders
* Make the threshold harsher
---------
Co-authored-by: StanR <8269193+stanriders@users.noreply.github.com>
* Remove unnecessary information from matchmaking beatmap panel
* Move avatar overlay inside card for better layout
* Allow higher jumping when jumping in succession
* Exclude player panel avatars from masking
* Adjust player panel animations a bit further
* Add avatar-only display mode
* Fix round warmup test not working
* Remove dead test scenes
* Fix edge case where users are added to not-yet-loaded card
* Decouple `PlayerPanel` from `UserPanel`
* Fix remaining test failure (and rename test to match new naming)