As indicated in the inline comment this is very best effort, just to
make the HP bar not very obviously stuck in a very obviously incorrect
state after the replay is rewound from a failure. There's likely to be a
bunch of replay accuracy issues related to this, but I'm just making the
minimum effort to get this to work semi-acceptably for now.
This indicator allows the player to either rewind to an earlier part of
the replay, or to proceed to results. It also plays a shortened variant
of the failure animation SFX.
Before this commit, there was `AllowFailAnimation` (used by multiplayer)
and `OnFail()` (used by score submitting implementations of player to
ensure a failed play submits).
The former is replaced by `PerformFail()` which allows for arbitrary
operations on failure, which replay player shall leverage in subsequent
commits. The latter would ideally be replaced by nothing, but it's
placed in a very awkward place behind a schedule, so by force of
necessity to avoid code duplication it's replaced by
`ConcludeFailedScore()` which is overridden to submit the score in all
submitting players --- except for multiplayer, which is never supposed
to be calling it, so in that case it just throws an exception.
This always confuses me since stable used this for the main storage
location of the icon. We don't reference this anywhere so it's just
weird to still keep this around.
Of note, this has a lazer icon from many years ago still inside it.
This was not fatal but with this change it should recover in a slightly
better way.
Also incidentally fixes the cache refetch potentially being attempted
twice by each of the two background population tasks that use it.
`EqualityComparer<object>.Default()` will be slow, will fall back to
`object.Equals()` which may do the right thing, the wrong thing, or be
useless due to using reference equality semantics.
In practice in this call site it likely doesn't matter anyway but I'd
rather be future-proof than not.