Current formula can output drastically different values on simlar
countOk / estimatedSliderBreaks amounts.
For example if countOk is 10, then changing estimatedSliderBreaks from 9
to 10 is gonna change okAdjustment from 0.15 to 0.05, what is a 3 times
lower resulting "estimated sliderbreaks" value.
This PR is fixing that in the most simple way - by increasing the buffer
constants, so very small variables won't skew the result as much.
---------
Co-authored-by: James Wilson <tsunyoku@gmail.com>
Co-authored-by: StanR <hi@stanr.info>
Co-authored-by: StanR <8269193+stanriders@users.noreply.github.com>
When flashlight and reading weren't their own separate skills, pp
bonuses were put into the aim/speed/accuracy values to make them worth
something over nomod. Now that flashlight and hidden are calculated as
their own skills, it doesn't make sense to provide a bonus because
accurate values are calculated in the skills themselves.
The global flashlight skill multiplier was increased to counteract the
slight nerf of removing this bonus.
Co-authored-by: StanR <8269193+stanriders@users.noreply.github.com>
Circles that are spaced from each other can't be doubletapped, therefore
they were excluded from the low OD penalty in speed.
Co-authored-by: StanR <8269193+stanriders@users.noreply.github.com>
## [Reduce rhythm effective ratio for patterns that are speeding
up](https://github.com/ppy/osu/commit/56f66abf82b687d88e6fe83928d6dfa0f657b0a0)
Assuming the same ratio difficulty, speeding up rhythms are a bit easier
to play than slowing down ones
## [Reduce rhythm complexity sum if the final island is
long](https://github.com/ppy/osu/commit/912d81cbfedee286b634c4bcb9c4e286d91a3d88)
Currently due to how the rhythm complexity sum works rhythm difficulty
gets applied to most of the object's island - historical decay isn't
enough to counter difficulty carryover so we end up having non-zero
rhythm difficulty on long consistent rhythm patterns (for example if a
stream starts with an unusual ratio it will have non-zero rhythm
difficulty regardless of its length, even if its hundreds of objects
long). This applies a global difficulty reduction depending on the
current object's island length.
https://www.desmos.com/calculator/kvnpasbpt2
## [Fix islands being initialised incorrectly if the rhythm section is
longer than the historical
cutoff](https://github.com/ppy/osu/commit/ddf0fe758b691ca6e2a157fe335a41c4048e7e9b)
Due to the change above we now have to properly initialise islands at
the start of the rhythm loop - currently if the object we're evaluating
is a part of a >32 object consistent rhythm pattern (say a stream) it
never actually gets its island properly initialised. It doesn't matter
on the current system, but it does matter if we want to reduce
complexity sum using island length as uninitialised island always has
length of 1 so patterns that are >32 objects long stop getting their
complexity reduced after the 32th object
---------
Co-authored-by: James Wilson <tsunyoku@gmail.com>
First part of getting rid of the RatingCalculator. Values changes are
expected, but apart from TD every other mod adjustment is unranked so it
doesn't really matter much
All occurrences of a difficulty variable in an evaluator are now called
evalNameDifficulty, of the raw output of this in a skill are now
referred to as difficulty, and of the strain adjusted versions are
referred to as strain.
Co-authored-by: StanR <8269193+stanriders@users.noreply.github.com>
This change targets patterns which have no spacing variability and
visually are linear. Such patterns don't require additional inputs and
you can walk/dash through them.
In particular, [this
map](https://osu.ppy.sh/beatmapsets/2485027#fruits/5454338) (ab)uses
them to the point it was temporarily unranked.
The curve for the nerf was chosen arbitrarily, it just seems to do the
job.
Co-authored-by: James Wilson <tsunyoku@gmail.com>
It's not really needed anymore and the added benefit is that circular
alt gets slightly buffed
---------
Co-authored-by: James Wilson <tsunyoku@gmail.com>
I'm not sure why they were excluded initially, so creating this PR as a
potential fix
If there's an actual reason for this then this PR is probably
unnecessary
Co-authored-by: James Wilson <tsunyoku@gmail.com>
Co-authored-by: StanR <8269193+stanriders@users.noreply.github.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.
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>
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 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.
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>
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)
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
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.
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>
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>
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>
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>
Seems like it got lost somewhere in the #36902. Great upside is that
flow cs bonus can be reduced as it's supposed to be now since the bonus
is made with d/t^1.65 in mind and flow is d/t. Values-wise it's a small
precision buff
Continuation of https://github.com/ppy/osu-server-spectator/issues/406
Operations in question being:
- (un)locking rooms / `!mp (un)lock` (prevents players from changing
team, will also include slots when slots are implemented)
- rolling / `!roll` (frequently used in coin toss type situations, will
receive nice animation to go with it)
As [per
comment](https://github.com/ppy/osu/pull/36943#issuecomment-4045361755).
Unfortunately I'm not able to reproduce such a big impact of triangles
using linked pr (or at all really). In my case usage was low in the
first place and went from 0.9% to 0.6% with this pr, so outside
benchmarking would be great
Improvement list:
* No more sorted list. Basic list is being used which is sorted once
after all the triangles added.
* Out-of-bounds triangles are reused rather than removed and re-added.
* On `Reset` if `AimCount` stays the same, all triangles are reused
instead of being cleared and re-added.
In `retrievePastVisibleObjects`, the wrong object's `Preempt` is used to
determine the time where the currently assessed object becomes visible.
This PR fixes that issue.
Additionally, the visibility condition in
`retrieveCurrentVisibleObjectDensity` is rearranged to read similarly to
the one in `retrievePastVisibleObjects`.
This does not change current values as none of the mods that can
currently award pp modify an object's `TimePreempt` individually. The
only affected mod is Freeze Frame, which gains buffs across the board as
more objects are calculated to be visible now.
- closes https://github.com/ppy/osu/issues/36942
- fixes https://osu.ppy.sh/community/forums/topics/2187041?n=1
## [Ensure Simplified Rhythm mod does not produce beatmaps with objects
out of
order](https://github.com/ppy/osu/commit/f4807b3a42dbf46ea0e669b0ba658feaef9baca5)
This is a last ditch safety.
This mod has more apparent issues (see below) but this is a first step
of restoring sanity.
Aside than the other fix described below I have not attempted to figure
out further why this is happening because the conversion logic is in
over my head. I just want hard breakage to not be possible. Why this
extra sort is necessary can be investigated by @Hiviexd if he's so
inclined.
## [Fix `GetClosestBeatDivisor()` not working correctly with negative
time
instants](https://github.com/ppy/osu/commit/88dc0d8a73c712a040635af262d7519fe6d772a0)
This was causing the 1/3 -> 1/2 conversion in Simplified Rhythm to
engage on some maps that weren't even mapped in waltz time. Those maps
had the common trait of having a timing point with a negative start
time.
Notably this could feasibly affect other places as well, like mania beat
snap colouring, or the Synesthesia osu! mod.
<details>
<summary>testing</summary>
Tested with Simplified Rhythm engaged, with 1/6 -> 1/4 and 1/3 -> 1/2
conversion enabled
[BULANOVA - NE PLACH'
[oni]](https://osu.ppy.sh/beatmapsets/1740291#taiko/3664995) (1/8 snap):
- No mods: 5.18*
- Simplified Rhythm @ master: 0.00*
- Simplified Rhythm @ f4807b3a: 3.48*
- Simplified Rhythm @ 933de7ab: 5.18*
[BULANOVA - NE PLACH' [inner
oni]](https://osu.ppy.sh/beatmapsets/1740291#taiko/3648625) (1/8 snap):
- No mods: 5.84*
- Simplified Rhythm @ master: 0.00*
- Simplified Rhythm @ f4807b3a: 4.13*
- Simplified Rhythm @ 933de7ab: 5.84*
[BULANOVA - NE PLACH' [don't
cry]](https://osu.ppy.sh/beatmapsets/1740291#taiko/3557681) (1/8 snap):
- No mods: 6.91*
- Simplified Rhythm @ master: 0.00*
- Simplified Rhythm @ f4807b3a: 4.84*
- Simplified Rhythm @ 933de7ab: 6.91*
[Mili - Peach Pit and Cyanide [nik's
Normal]](https://osu.ppy.sh/beatmapsets/2468654#osu/5405909) (1/6 snap):
- No mods: 1.63*
- Simplified Rhythm @ master: 0.00*
- Simplified Rhythm @ f4807b3a: 1.10*
- Simplified Rhythm @ 933de7ab: 1.10*
[Mili - Peach Pit and Cyanide [Ix's
Hard]](https://osu.ppy.sh/beatmapsets/2468654#osu/5405906) (1/3 snap):
- No mods: 2.50*
- Simplified Rhythm @ master: 0.00*
- Simplified Rhythm @ f4807b3a: 1.71*
- Simplified Rhythm @ 933de7ab: 1.71*
[Mili - Peach Pit and Cyanide [nomi's Hidden
Insane]](https://osu.ppy.sh/beatmapsets/2468654#osu/5405910) (1/3 snap):
- No mods: 3.93*
- Simplified Rhythm @ master: 0.00*
- Simplified Rhythm @ f4807b3a: 2.59*
- Simplified Rhythm @ 933de7ab: 2.59*
[Within Temptation - The Unforgiving [Stairway To The
Skies]](https://osu.ppy.sh/beatmapsets/29157#osu/172617) (1/3 snap in
editor):
- No mods: 1.53*
- Simplified Rhythm @ master: 0.00*
- Simplified Rhythm @ f4807b3a: 1.48*
- Simplified Rhythm @ 933de7ab: 1.48*
[Within Temptation - The Unforgiving
[Iron]](https://osu.ppy.sh/beatmapsets/29157#osu/172612) (1/6 snap in
editor):
- No mods: 2.76*
- Simplified Rhythm @ master: 0.00*
- Simplified Rhythm @ f4807b3a: 1.75*
- Simplified Rhythm @ 933de7ab: 1.75*
[Within Temptation - The Unforgiving
[Marathon]](https://osu.ppy.sh/beatmapsets/29157#osu/156352) (1/4 snap
in editor, but has 1/3 / 1/6 sections for sure):
- No mods: 2.96*
- Simplified Rhythm @ master: 0.00*
- Simplified Rhythm @ f4807b3a: 2.75*
- Simplified Rhythm @ 933de7ab: 2.75*
[Halozy - Genryuu Kaiko [Higan
Torrent]](https://osu.ppy.sh/beatmapsets/180138#osu/433005) (1/4 snap):
- No mods: 5.37*
- Simplified Rhythm @ master: 0.00*
- Simplified Rhythm @ f4807b3a: 3.95*
- Simplified Rhythm @ 933de7ab: 5.37*
</details>
As mentioned in https://github.com/ppy/osu/discussions/36883.
This has caught me off-guard a few times.
Was a quick one to make this work like it does on stable. It doesn't fit
as well as stable because we have a lot of elements at the top of the
screen, but I think it's better than nothing, as it lets you know you're
in a replay quick obviously.
I don't think we can easily localise strings with formatting in them
yet. Maybe using a `MarkdownContainer` or something?
There's been [some
feedback](https://discord.com/channels/90072389919997952/1476979671886205060/1477868178775216148)
that there's no timer during some screens. Personally I feel like some
screens shouldn't require it, but I get it.
The results screen is going to be the most controversial one, where I've
decided to shift the content down a bit - it would otherwise overlap
with the progress bar. Another option is to make the progress bar
shorter, but I feel like that makes things inconsistent.
<img width="1922" height="1035" alt="image"
src="https://github.com/user-attachments/assets/ec4ba01e-bb13-45ff-8a1b-b39d7765c1f4"
/>
Regarding implementation, I'm not entirely sure on it being added to
every subscreen via `RankedPlaySubScreen` instead of just a single
component at a top level. I did it this way because the colour scheme
seems annoying to change without recreating the entire component (or
otherwise all of its children) anyway.
The only method inside this class is used in a single place ever since
Speed became a harmonic skill so it doesn't really make sense to keep
around to me. As a result, supersedes #33295.
Also includes a fix to use `DecayWeight` for the consistent top strain,
exactly the same as what we're doing for `CountTopWeightedStrains`.