ppy / osu

rhythm is just a *click* away!
https://osu.ppy.sh
MIT License
14.64k stars 2.16k forks source link

Overlapping timing windows in osu!mania #2854

Closed voxlz closed 3 years ago

voxlz commented 6 years ago

Hello, long time mania player here.

An issue a lot of more experienced players run into is overlapping timing windows, were simply not playing a single note could make you lose a map. This issue arises when a lot of notes are very close to each other.

overlapping timingwindows

Sorry for the ugly picture. I have tried to "show" the score you get depending on when you hit the note. The colors match the color of the score you would get. Orange is rainbow 300.

Now please take a look at this. Let's say you play a hard map and get distracted and don't play note 1 in the picture. Usually, the timing window disappears after pressing the note. But notice that if I don't press the note, the timing window will extend into the next note. If the speed is high enough, it will end up like in the picture. This means that if you miss note one and hit note 2 and 3 perfectly, you will still get 3 misses. (Notice how the orange is almost completely gone and replaced with red now) If this is a trill or extended stream this means you will die within a second, if you don't purposely skip a note. This is extremely hard and unrealistic though.

I think this is an issue worth looking at. There is no worse feeling then dying because if this when you know you would survive otherwise.

Updated I'm proposing that in the situation of two very close notes and overlapping timingwindows, as soon as the hit window of the second note reaches the first 300 (non-rainbow) point window, the first note should be regarded as a miss. This would make the game feel better and more accurate to the rhythm.

Adrriii commented 6 years ago

What would be a good threshold for deciding which note will be counted as played when you press your key in an interval ?

Also, having this red part doesn't seem realistic to me. I would agree to it being removed !

voxlz commented 6 years ago

It feels like there is a red part. Not sure if there actually is. Threshold needs to be pretty high, as to not acidentally giving more points. But i think if you hit a note perfectly you should never get a miss.

LastExceed commented 6 years ago

This problem isn't osu!mania only.

In osu!std, when you skip the first note of a stream and do perfectly accurate inputs for the rest of the stream, you get lots of 50's (or 100's or even misses depending on speed and spacing) instead of 1miss and a bunch of 300's because each input is judged for the previous note (and therefore considered "too late").

In theory the problem should also occur in osu!taiko, but I haven't experienced it there yet (probably because hitwindows are much stricter there). Definitely not osu!catch though as ctb doesn't have timing windows.

Now how do we deal with this? the big problem here is that there is no way to tell which note your input was for during playtime, but we need that information immediately so we can display the right judgement (and prolly a bunch of other reasons). Just going by "which note is closer" is also a bad idea because of the following scenario:

Imagine 2 notes very close to each other (and in the same column in case of osu!mania), let's say at 100ms and 200ms. Your inputs are at 170ms and 270ms. How do we want the game to judge this? 50 50 or miss 300 and an empty input? Currently the former happens, and for the sake of keeping combo it would probably be better.

Now let's take the same situation again but with more notes, say at 100ms, 200ms, 300ms, 400ms, 500ms, 600ms and again all our inputs are 70ms too late / 30ms too early. how do we judge it now? accept a combobreak and give 300s for all other notes or keep the combo and give lots of 50s ? And where do we draw the line? What if the user did only one input, how do we know which one he was aiming for? just pick whatever is in his favor in terms of score?

I've thought about this for quite some time a few months ago and couldn't come up with a solution.

Adrriii commented 6 years ago

I would be in favor of the "combo breaking" one tho, as in a rhythmic point of view, it makes more sense for a band to skip one beat and continue playing, than trying to make up for their lateness (speeding up).

Code wise, I don't know how it is handled and maybe the notes are stored in a heap (for each column in mania), if so then it would be better having a simple array (hoping it doesn't cause performance issues).

LastExceed commented 6 years ago

With that reasoning we would have to rethink scoring as it would significantly drop the value of combo. In mania combo isn't that important, but in osu!std it's a major component of the formula, and if we suddenly start judging in favor of acc instead of combo then we'll have to make up for that in the score system as players would break combo more often.

Adrriii commented 6 years ago

I should have mentionned that I'm talking about mania only ^^ Maybe in std another approach should be favored.

voxlz commented 6 years ago

I totally agree with Adrriii's post, a hit should always be counted as one, and I rather take a miss for better accuracy and potentially not failing a map. LastExceed is correct in that standard might need some recalculating if this is implemented, but mania should be able to convert to this without change. Most people would never even notice it. (That's a good thing because you only notice flaws)

After some thinking, I realized that if you press the key between 2 close notes, you expect the first one to get a score. But if you press the key during or after the second note you expect the first one to be a miss.

What I'm proposing is therefore that as soon as the hit window of the following note reaches the first 300 (non-rainbow) point window, the previous note should be regarded as a miss. This would make the game feel better and more accurate to the rhythm.

Adrriii commented 6 years ago

What I'm proposing is therefore that as soon as the hit window of the following note reaches the first 300 (non-rainbow) point window, the previous note should be regarded as a miss. This would make the game feel better and more accurate to the rhythm.

That's seems like the most fair thing to me ! And if one coud argue that by spamming we'd get a lot of 300s, we'd also get a lot of misses which renders the 300s useless. But even if in theory it looks good, it should still be tested because it's not just a "bug", it's a change in the gameplay's mechanic.

LastExceed commented 6 years ago

This mechanic would cause problems with low OD. For the sake of the example, lets go to the extreme and say we have a OD 0 map with a note at 100ms and another one at 200ms (in the same column). the users inputs are at 140ms and 210ms. In the current system, this would result in a 300 and a 300r, i.e. 100% acc. With the proposed mechanic, this would turn the first one into a miss and degrade the second one to a 300 (instead of 300r) and the second input would become an empty hit, potentially even triggering notelock for the next note in that column.

Now one could argue that increasing OD will fix this and a map this hard shouldn't be OD 0 in the first place, but what's for sure is that decreasing OD should always make a map easier, not harder.

abraker95 commented 6 years ago

Decreasing OD allows better notelocking, because under higher OD there is a smaller miss window. This causes higher OD to be easier until you get too high and it becomes a game of luck to hit within the tiny window.

Can making the miss window same under all OD and have the the hit windows for scores change with various OD solve this?

LastExceed commented 6 years ago

No, as notelock is only half of the problem. The other half (300, 300r turning into miss, 300) persists.

Rekkonnect commented 6 years ago

As for LastExceed's example, I think since the first note is already counted as a miss and the second one is judged it means the game is expecting a third input, therefore not locking the input or counting useless misses.

In my opinion it would be best to prioritize notes with the closest time they should be hit. In regards to the aforementioned example, this would result in both notes being judged, as 140ms is closer to 100ms and 210ms is closer to 200ms, both the hit objects not having been judged yet.

When it comes to more complex rhythm patterns, it would be optimal to emphasize on the start of the bar/beat rather than focus on the off-beat leading note. It is commonplace that speedy jacks are used for the lead to a new beat, with pretty small windows. Should the player ignore/miss the pattern and begin late, they expect to only hit one of the two jacked notes on the start of the new beat to get back on track easier, therefore, despite the late hit potentially even being slightly closer to the leading note, the notes that are priotitized are the ones that are in the new beat.

The proposed change should also affect control point changes, yet it could lead to uncomfortable results. To balance it out there could be a 60/40 share of the windows between the off-beat and the on-beat notes.

voxlz commented 6 years ago

@LastExceed ‘s example is a fair problem. But what if this mechanic only affects OD 5 and higher? Most maps with this jack speed should be at least 4 star, which requirers OD 7 to be rankable I think.

@AlFasGD i don’t really understand your post. Could you try simplifying further?

Rekkonnect commented 6 years ago

To further explain what I had in mind, allow me to provide an example.

Let's say there are two notes in the same column, one being on the beat and the other being 1/8 of the beat earlier. Should the BPM be 180 and the base note be placed at the 3rd beat, that means the notes are at 1000ms and 958ms respectively (I am aware the times at which the notes are cannot have decimal points, but for demonstration purposes I am using that).

Let's assume the player misses the one at 958ms and realizes it too late that they partially lose concentration. In order to get back on the rhythm they hit the 1000ms note at 987ms without caring about the previous note at 958ms. Normally, with low enough OD this would lead to a 200 and a miss respectively, whereas with my suggestion it would count as a miss and a MAX (300r) respectively.

(I do understand that the 60/40 share I mentioned does not apply here, it could be potentially ignored.)

Generally, when there are two notes, e.g. at 150ms and 200ms, and the player hits at 180ms, the game should count the first (the 150ms) note as a miss and then give a 300 for the 200ms note. Depending on context, however this might end up being unfair for the player as a 30ms late hit should not be that punished. Rejudging input could work as a solution, yet I don't believe it would be a good one.

Overall, primarily the windows should be adjusted accordingly so that both consecutive notes share an equal amount of the overlapping hit windows. Regarding the jacks that have a pretty small distance between them where one is on the beat, it could be taken into account if problems are encountered with the original proposal.

voxlz commented 6 years ago

As I wrote earlier:

”After some thinking, I realized that if you press the key between 2 close notes, you expect the first one to get a score. But if you press the key during or after the second note you expect the first one to be a miss.”

We should not punish for hitting late unless the next note has already passed according to me.

FullTablet commented 5 years ago

In the current stable build of the game, there are no timing windows for "Late 50" and "Late Miss", only timing windows for "Early 50" and "Early Miss".

A modified picture that shows the situation better: stable timing windows

As such, in 3 notes that are in a fast succession, if you ignore the first note and press the other 2 notes perfectly, it is not possible to get 3 misses. At worst, you get 2 100s (on the first 2 notes), and 1 miss (on the last note), if the "Late 100" timing window of a previous note overlaps the "Rainbow" timing window of the current note.

The proposed solution of making "Late 200" and "Late 100" timing windows not overlap 300 or Rainbows of subsequent notes would turn the 3 notes from 100-100-Miss to Miss-Rainbow-Rainbow in the previously mentioned case. The problem is, in a fast sequence of 3 notes, ignoring the first note and playing the following 2 notes is not a common situation at all, it is more common to either press all 3 notes late (the solution could turn the judgments from 200-200-200 to Miss-300-300 or similar, which would be more punishing for score), or pressing the first note correctly and the other 2 notes late (the solution would make not missing the 2nd note harder).

WinterIsPretty commented 3 years ago

I think the timing window before note 'a' should override the timing window after note 'b' if the timing window of hitting note 'a' (missing, getting a 50, 100... etc.) is possible.

smoogipoo commented 3 years ago

@WinterIsPretty That's essentially what "no notelock" is, or what stable and lazer's initial implementation of mania was before the above PR. Is that what you're suggesting?

@peppy deprioritising this one again since the OP has basically already been implemented. I'm awaiting feedback on how it currently works after the above PR and there's nothing to fix immediately.