Hitboxes of circle pieces in osu! have regressed with commit 8592335.
The reason for the regression was that hit detection was moved from
DrawableHitCircle itself to a newly-introduced private HitArea class
(now named HitReceptor).
As HitArea inherited from Drawable, it would return IsHovered == true
over its entire bounding box. This meant that the hit area could wrongly
pick up actions that are not within circle radius and make them into
hits.
To resolve, make HitReceptor a CompositeDrawable and set its corner
radius to match the circle piece. This fixes the invalid hitbox, as
IsHovered takes radius into account.
We've seen multiple cases where DrawableHitObject are stuck in the lifetime management container
due to not implementing a judgement (meaning they are never "hit" or "missed"). To avoid this going forward
CreateJudgement() must be implemented and return a non-null judgement.
This fixes BananaShower and JuiceStreams in osu!catch.
This also makes HitObject abstract and cleans up convert HitObject implementations.
To avoid further floating-point comparison bugs, remove all usages of
Bindable<{float,double}>, replacing them with their
Bindable<Float,Double> counterparts.