Apparently there was already a function for reseting the frame wait,
used commonly after loading files. So we don't have to use the hacky
method of making the game wait for X number of frames anymore.
If you opened the fast travel or the item menu right before touching a
touch-run event, it would soft-lock you if the event changed niko's
move-route, since niko was unable to move due to his update function
being unreached.
The .app happens to be a tweaked version of the one provided when
grabbing a copy of the game from Steam, as I am unfamiliar with the
process of collecting frameworks into an app bundle, at least with
cmake/qmake. All you need to do is replace the .app in
~/Library/Application Support/Steam/SteamApps/OneShot/ to play on Mac!
This was causing a bug where if you had 4 choices you could access
another page with blank choices? Rather than try to figure out why
that's happening I'm opting to remove the functionality entirely, as
we're short on time and we don't even have any choice dialogues that
have more than 4 choices anyways.
The previously YIQ-based algorithm turned out to be both slow,
and horribly inaccurate.
Another algorithm based on rotating the color value in the
RGB cube along the diagonal axis was also considered, which was
acceptable in terms of accuracy, and very fast.
In the end, I decided on a HSV-based one, because it is by far
the most accurate one, while still being a tad faster than the
YIQ solution.
Algorithm source: gamedev.stackexchange.com/a/59808/24839
A very simple GPU time benchmark when shifting a 2048^2 bitmap:
YIQ rot RGB rot HSV shift
radeon 13.4 ms 2.8 ms 11.4 ms
intel 13.0 ms 6.0 ms 10.5 ms
radeon: HD 3650 mobility
intel: N3540 integrated (Baytrail)
However hue shifting has never shown up as a bottleneck before,
so these are more academic.
The interpreter needs to +1 to the index before saving or else
quit_game_bed will have the game stuck in an infinite loop of quitting
the game when reloading, but we need to -1 immediately after because
otherwise the interpreter will skip a command after this is called.