In the osu!taiko ranking criteria, the Muzukashii guidelines specify an alternative substitute for rest moments, which involve using several consecutive smaller rest moments in place of a larger singular rest moment:
Using at least 3 consecutive rest moments that are 1/1 is an acceptable substitute if either the pace of the music makes rest moments counter-intuitive or if the continuously mapped part is overall more forgiving to the player.
The current Taiko mapset verifier plugin does not check for this, and only supports the larger singular 3/2 rest moment.
This pull request adds support for the substitute. It also considers 3 consecutive rest moments that are all larger than 1/1 but smaller than 3/2 also acceptable. The updated logic also now considers spinner and slider duration as continuous mapping.
This includes a pretty large refactor for the RestMomentCheck.cs class overall to make this happen.
Other consecutive substitutes can also easily be added with these changes.
Approach
The previous logic looked at all hit objects in a map and took each adjacent pair, calculated the gap between them, and used that to determine if an object was a "rest moment" or not.
The new logic has several significant logical changes to make the substitute checking work:
Not only does it looks at 2 adjacent objects at a time, but will look at more, up to the number of consecutive instances needed (so for the Muzukashii, it will look at strings of 3 adjacent objects).
This new logic also looks both forward and backward, instead of forward-only. This allows us to not only determine if the object is attached to a "rest moment", but also can tell if it's the beginning, end, or middle of a continuously mapped section, which is necessary for this support
The new logic uses HitObject.GetEndTime() when calculating the gaps between objects. This in turn also adds support for recognizing spinners and sliders as continuous mapping (instead of only taking into consideration the heads of these objects)
Known issues
This change does keep BPM scaling by using OsuUtils.GetNormalizedMsPerBeat(). However the string used in the recommendation what type of rest moment to use shows values for unscaled BPM.
This bug already exists in the current implementation anyway, so this isn't a regression
Doesn't seem like a big deal tbh
Testing
I've tested this new logic, not only for detecting violations of the RC guideline, but by checking the output of all detected continuous mapping (including stuff that obeys the guidelines) in the map according to the update rest moment detection.
If you would like to view this output, enable following debug flag to true and recompile/reinstall the DLL:
Line 27 in this PR diff: private const bool _DEBUG_SEE_ALL_CONTINUOUS_MAPPING = false; -> Change to true
Summary
In the osu!taiko ranking criteria, the Muzukashii guidelines specify an alternative substitute for rest moments, which involve using several consecutive smaller rest moments in place of a larger singular rest moment:
The current Taiko mapset verifier plugin does not check for this, and only supports the larger singular 3/2 rest moment.
This pull request adds support for the substitute. It also considers 3 consecutive rest moments that are all larger than 1/1 but smaller than 3/2 also acceptable. The updated logic also now considers spinner and slider duration as continuous mapping.
This includes a pretty large refactor for the
RestMomentCheck.cs
class overall to make this happen.Other consecutive substitutes can also easily be added with these changes.
Approach
The previous logic looked at all hit objects in a map and took each adjacent pair, calculated the gap between them, and used that to determine if an object was a "rest moment" or not.
The new logic has several significant logical changes to make the substitute checking work:
HitObject.GetEndTime()
when calculating the gaps between objects. This in turn also adds support for recognizing spinners and sliders as continuous mapping (instead of only taking into consideration the heads of these objects)Known issues
OsuUtils.GetNormalizedMsPerBeat()
. However the string used in the recommendation what type of rest moment to use shows values for unscaled BPM.Testing
I've tested this new logic, not only for detecting violations of the RC guideline, but by checking the output of all detected continuous mapping (including stuff that obeys the guidelines) in the map according to the update rest moment detection.
If you would like to view this output, enable following debug flag to
true
and recompile/reinstall the DLL:private const bool _DEBUG_SEE_ALL_CONTINUOUS_MAPPING = false;
-> Change totrue