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>
* Prevent Taiko difficulty crash if a map only contains 0-strains
* Add second check for safety
This is accessing a different array of strains. I'd rather be safe than sorry.
* Add guard in PP too
* Make `MarginOfError` a const
I read through this thinking "why doesn't Previous get assigned to
currentEncoding here? But it's because the initializer runs right after
the ctor and before the "method" returns. So really there's 3 operations
running on one line here - ctor, init, and assignment.