Closes https://github.com/ppy/osu/issues/25263.
In some circumstances, stable allows skipping twice if a particularly
long storyboarded intro is being displayed:
https://github.com/peppy/osu-stable-reference/blob/master/osu!/GameModes/Play/Player.cs#L1728-L1736
`AllowDoubleSkip` is calculated thus:
3ea48705eb/osu!/GameModes/Play/Player.cs#L1761-L1770
and `leadInTime` is calculated thus:
3ea48705eb/osu!/GameModes/Play/Player.cs#L1342-L1351
The key to watch out for here is `{first,last}EventTime`. `EventManager`
will calculate it on-the-fly as it adds storyboard elements:
3ea48705eb/osu!/GameplayElements/Events/EventManager.cs#L253-L256
However, this pathway is only used for sprite, animation, sample,
and break events. Video and background events use the following pathway:
https://github.com/peppy/osu-stable-reference/blob/master/osu!/GameplayElements/Events/EventManager.cs#L368
Note that this particular overload does not mutate either bound.
Which means that for the purposes of determining where a storyboard
starts and ends temporally, a video event's start time is essentially
ignored.
To reflect that, add a clause that excludes video events from
calculations of `{Earliest,Latest}EventTime`.
Reasoning is explained in the inline comment (basically, stable doesn't
care what the user specifies as the frame count when falling back to
skin resources).
This change also removes on to two layers of drawables, which should be
a win in heavy storyboards.
In the case where the background image of individual difficulties is
different, querying the beatmap *set*'s metadata as we were will cause
issues.
I haven't added test coverage for this but can if required. Can be
manually tested using https://osu.ppy.sh/beatmapsets/1595773#osu/3377474
(specifically the highest difficulty).
Closes https://github.com/ppy/osu/discussions/16873.
Reuses SkipOverlay by calculating the endtime of the storyboard and using that as a "start point". Upon skipping the outro the score is instantly shown.
When the end of the storyboard is reached the score screen automatically shows up. If the player holds ESC (pause) during the outro, the score is displayed
The storyboard endtime is calculated by getting the latest endtime of the storyboard's elements, or simply returning 0 if there is no storyboard.
Co-Authored-By: Marlina José <marlina@umich.edu>