Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Cap maximum spinner RPM based on OD #24932

Merged
merged 2 commits into from
Sep 27, 2023

Conversation

smoogipoo
Copy link
Contributor

@smoogipoo smoogipoo commented Sep 26, 2023

Addresses / closes #23732

Glossary

  • "Clear": Scoring all non-bonus ticks in a spinner.
  • "Complete": Scoring all ticks (non-bonus and bonus) in a spinner.

Preamble

The RPM required to clear spinners (i.e. minimum RPM) is unchanged from stable and the previous implementation:

OD RPM
0 90
5 150
10 225

With this PR, the RPM required to complete spinners becomes:

OD RPM
0 250
5 380
10 430

https://www.desmos.com/calculator/pblnx0jyve (A represents RPM-to-clear, B represents RPM-to-complete)

I intend to get this out for testing, but these are not necessarily the final values as discussion is still ongoing (#23732). The values that do end up are intended to be backported to osu!stable sometime in the future™.

There are also areas not addressed - peppy & I like the idea of capping the spinning RPM to enforce consistency, and this will be required for lazer's implementation. This will be done as a separate change.

Explanation

To come to these values, I've taken a mix of:

  • Watching players I could find on YouTube, trying to take a healthy mix of all skill levels.
  • My personal experience as what I would consider an "advanced" player but someone that has never cared about getting full score on spinners.
  • Spinning through a remote desktop connection + mouse. This artifically lowers my skill.

I have four skill levels that I categorise spinner gameplay. This is NOT a representation of their overall skill level.

  1. Beginner: Screen-wide or extremely-wide spins. New players tend to do this.
    • "This is the first spinner of my life".
    • Expected difficulty level: Easy/Normal
    • Expected OD range: 0-5 (low-mid)
  2. Intermediate: Wide or un-even spins.
    • "I know I don't need to stress out, it's easier if the cursor doesn't move too much".
    • Expected difficulty level: Hard/Insane
    • Expected OD range: 5-7 (mid)
  3. Advanced: Close, very even or rotationally-consistent spins.
    • "It's easier the less the cursor moves but not too little that I can't spin very fast."
    • "I'm doing the minimum possible to clear spinners without try-harding".
    • Expected difficulty level: Insane/Expert (+HD)
    • Expected OD range: 7-9 (high-mid)
  4. Expert: Extremely close and fast spins.
    • "The closer I spin the better. The more I vibrate my hand, if I can control it, the better.".
    • Expected difficulty level: Insane/Expert (+HR/DT)
    • Expected OD range: 8-11 (max)
Skill level Average RPM Description
1 210 https://youtu.be/YMmDXKtwuA4?t=68
1 220 Me, with remote desktop + mouse (screen-wide)
2 220 https://youtu.be/k4BEdky3mzA?t=1699
2 250 https://youtu.be/qXa9X_8oyac?t=150
1 250 https://youtu.be/GJU-39TUPIc?t=114
3 260 https://youtu.be/zl2JC-91Uss?t=34
1 280 https://youtu.be/_JZJpb3fPKU?t=738
1 280 https://youtu.be/TzxXQg41d3g?t=206
2 280 https://youtu.be/nYqsKN-lv9A?t=276 (ilikerandom)
3 300 Me, with remote desktop + mouse (close spin)
2 300 https://youtu.be/k4BEdky3mzA?t=1478
3 310 https://youtu.be/YMmDXKtwuA4?t=626
3 310 https://youtu.be/o4M8e_yYwR4?t=418
2 320 https://youtu.be/nYqsKN-lv9A?t=276
3 320 https://youtu.be/sNIltpCR_A0?t=1049 (DT, so I've artificially lowered the RPM)
3 320 https://youtu.be/BRItNAUGZr0?t=46
3 320 https://youtu.be/B5TFvU_I3Us?t=236
3 320 https://youtu.be/F0OO002RUwo?t=139
3 350 https://youtu.be/5fTp55Pvm9g?t=90
3 350 https://youtu.be/o4M8e_yYwR4?t=918
3 360 https://youtu.be/dH28XnXqagA?t=99 https://youtu.be/dH28XnXqagA?t=523
3 360 https://youtu.be/CboDdzf2Q4M?t=89
2 370 https://youtu.be/7IoVLCHPmjE?t=415
3 370 https://youtu.be/nhstD908-44?t=144
3 380 https://youtu.be/gkXx_dpCSDE?t=199
3 410 https://youtu.be/jcvrwF9MuSk?t=208
3 410 https://youtu.be/BRItNAUGZr0?t=92
2 460 https://youtu.be/nYqsKN-lv9A?t=276 (jatie)
4 460 https://youtu.be/nYqsKN-lv9A?t=276 (atokymat)
4 470 https://youtu.be/nYqsKN-lv9A?t=276 (olinek)

My (rough, biased, not rooted in absolute fact) observations from this are:

  • New players tend to range around 200-280 RPM.
  • Intermediate players tend to range around 250-320 RPM.
  • Advanced players tend to range around 320-380 RPM.
  • Expert players tend to sit comfortably around 450 RPM.
  • Even top players - those that are considered good at the game, tend to sit in the 300-400 RPM range

Keep in mind, however, that:

  • OD is skewed upwards such that it is more typical for even new players to see ODs >= 4. Those at the advanced level, for example, are usually going to see at least OD >= 7 (~405 RPM) which should still give them a bit of a challenge (at least they'll need to try).
  • Once you reach 6*, which is not considered hard these days, it's rare to see OD < 8.
  • RPM isn't consistent - there's ramp-up time whether caused by acceleration (stable) or by the player realising they need to start spinning.

@smoogipoo smoogipoo marked this pull request as ready for review September 26, 2023 08:11
@smoogipoo smoogipoo force-pushed the spinner-od-based-max-rpm branch from 68561e0 to 859155d Compare September 26, 2023 08:20
@peppy peppy self-requested a review September 26, 2023 08:41
@peppy
Copy link
Member

peppy commented Sep 26, 2023

Doesn't seem to be working 🤔

osu.2023-09-26.at.08.45.08.mp4

Copy link
Member

@peppy peppy left a comment

Choose a reason for hiding this comment

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

As commented. Maybe we need some kind of test coverage?

@pull-request-size pull-request-size bot added size/M and removed size/S labels Sep 26, 2023
Copy link
Member

@peppy peppy left a comment

Choose a reason for hiding this comment

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

Seems like a good start.

@peppy peppy requested a review from bdach September 26, 2023 10:01
@peppy
Copy link
Member

peppy commented Sep 26, 2023

I've tested this in gameplay and think the range here is a good starting point to get more feedback from the community.

@peppy
Copy link
Member

peppy commented Sep 27, 2023

@bdach added you in here just to get your take on this and make sure I haven't missed anything major. In terms of balance, the numbers are intentionally chosen to be something we can deploy and get more feedback on, so don't feel like you need to provide any insight there, beyond maybe playing yourself and seeing if it feels roughly in line with expectations.

Comment on lines +73 to +74
SpinsRequired = (int)(minRps * secondsDuration);
MaximumBonusSpins = Math.Max(0, (int)(maxRps * secondsDuration) - SpinsRequired - bonus_spins_gap);
Copy link
Collaborator

Choose a reason for hiding this comment

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

About the only thing that I would want to highlight here code-wise is that due to the way this is calculated, i.e. due to int truncations being here, the RPM requirements given in the OP are actually upper bounds rather than lower. As in, it's not "you need to spin at least this fast to complete", it's more of a "if you spin this fast, you are guaranteed to clear, but you can get away with spinning slower if you get lucky with rounding".

From the test cases added in this PR:

OD 0:

> (3000ms / 4) to 1/min

  (3000 * millisecond) / 4 = 80 min^-1

> (3000ms / (4 + 2 + 6)) to 1/min

  (3000 * millisecond) / (4 + 2 + 6) = 240 min^-1

OD 5:

> (3000ms / 7) to 1/min

  (3000 * millisecond) / 7 = 140 min^-1

> (3000ms / (7 + 2 + 10)) to 1/min

  (3000 * millisecond) / (7 + 2 + 10) = 380 min^-1

OD 10:

> (3000ms / 11) to 1/min

  (3000 * millisecond) / 11 = 220 min^-1

> (3000ms / (11 + 2 + 8)) to 1/min

  (3000 * millisecond) / (11 + 2 + 8) = 420 min^-1

All values are ever so slightly lower or equal to than the limits given in OP, due to the rounding.

I'm not saying this is actionable, just that I had a different impression of what this was gonna be from the OP - this is still probably okay, though.

Copy link
Member

Choose a reason for hiding this comment

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

We could make the spins requirement a floating point. That will definitely work well when backporting to stable.

Copy link
Member

@peppy peppy Sep 27, 2023

Choose a reason for hiding this comment

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

Jokes aside, I don't think this could easily be resolved, apart from using half spins and getting a bit more precision? Maybe a good pro for switching to half spin judgements.

A conversation for another day, nonetheless.

Copy link
Collaborator

@bdach bdach Sep 27, 2023

Choose a reason for hiding this comment

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

That, or you'd round / ceiling the bonus spin requirement rather than floor. But neither solution gets rid of the issue definitively, final effect will still depend on spinner duration and resulting rounding behaviour anyways.

Which is why I said this probably isn't actionable. Just highlighting for the sake of it I guess.

@bdach
Copy link
Collaborator

bdach commented Sep 27, 2023

Balance-wise I will not attempt to say much except that (a) this appears to do what it says when tested on a set of test spinner maps I made a while back and (b) I can get up to half to 3/4rds of bonus spins even on OD10 despite being an absolute trashcan at the game, so I don't think anybody should complain about the limits being too high. (Too low, maybe.)

@peppy peppy merged commit 0a208a5 into ppy:master Sep 27, 2023
@smoogipoo smoogipoo deleted the spinner-od-based-max-rpm branch October 10, 2023 00:32
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.

Spinner balancing adjustments
3 participants