This avoids an issue where the skins array takes up a fixed, but large
amount of memory at runtime. On x86_64 linux, that array is roughly 80
megabytes in memory, most of which is unused when the game is unmodded.
Instead, we treat `skins` as a dynamically resizing array, and it is an
array-of-pointers into separate allocated `skin_t`.
This is based on Lactozilla's skin limit MR for SRB2, but I've rewritten
it because RR has diverged quite a bit.
This was verified to check every access of `skins` by using clangd's
find-all-references function. However, I have only tested plain skins,
not Lua addons, so that could afford some extra checking.
- Use menu font for speaker's name
- Make the Z input in the top left of the box animate if the dialogue can be closed/go to the next page
- Exempt certain sigils from punctuation delay that look awkward ( + and " )
If some dialogue needs to be never-missable, that's the mapper's responsibility - but now they won't get randomly interleaved if multiple are activated just by regular free driving, which was the worst kind of default
- Build list of incoming text
- First pass of very first section of dialogue
- Use srb2::Dialogue::Typewriter class to handle ticking through dialogue
- Store history log as incoming text is processed (possible todo: scrolling?)
Makes the drawer more complicated, but the benefit for most circumstances is significant.
In non-splitscreen contexts, pushes V_SLIDEIN|V_SNAPTOBOTTOM HUD elements upwards when the Dialogue is open.
- Changes the length of dark colour underneath the speaker's name
- Optionally hides the speaker's face if no portrait is provided
- Frosted glass background when player has control
- Only have a long delay between symbols if the current character is std::ispunct() and the NEXT character is std::isspace
- Add native color code support
- Requires string concatenation to actually use it, though, which I don't know how to do in ACS