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.
Allows you to turn on reducevfx, screenshake, and screen tilting with one confirm input
Shows up every time game boots just in case you get into Sunbeam and it's too much and need to restart
(also dummied out Kickstart Accel option)
- "session" -> "tutorial"
- make it clear that Addons and Online *will* eventually be unlocked in Tails' Way, just not immediately
- Don't allow looping inputs (pressing right when Eggman's Way is selected and vicea versa)
- Selection between Tails' Way (existing Tutorial) and Eggman's Way (Playground)
- Semi-passable UI
- Characterful descriptions
- Add "PlaygroundRoute" condition to Challenges
- Fires if you select Eggman's Way
- 0 Chao Keys unless you go back to Goner for the outro (which Playground skips)
- Only works in Match Race and Online level selects
- Shows in-progress state on Pause and Cup Grid, but no direct influence available on those screens
- Z to queue current highlighted map
- Pending until you press A, then sent to server
- When done online, tries to send one at a time to avoid overloading connection
- C to clear
- Removes one from pending first
- If you're out of pending maps, prompts whether you want to clear server's queue
- All gametypes will be shown in the drawer, as opposed to just Race
- However, don't attempt to add the preview pic for CUPCACHE_SPECIAL (the Sealed Star)
- After inputting an incorrect password on Goner, guarantee the "are you online" line doesn't play
- When using either GDQ password, don't allow re-entry
- Most R_SkinAvailable calls should be returning index into demo.skinlist (same numerical value as when demo was recorded), for demo sync
- A handful of general things permit exception for this
- Expose `replaynumskins` (calculated as `(demo.playback ? demo.numskins : numskins)`) to Lua
- There's *always* more that can be done for this, but this is the minimum spec that can at least be somewhat stable
- Helper functions for eased X/Y
- Don't jump Metal's camera around when doing things rapidly
- Don't have ctrl alt del open mouths when not on the main Goner menu itself
- Imply passage of time when returning from Tutorial to Outro by resetting all the background variables
- Add an additive layer to the Options cogs, so they show up over an extremely dark background
- Metal Sonic will not focus on Tails/Eggman until video is restored
- Don't draw the Miles Electric transparent unless it's completely in its upright position
- Checks for whether a Gamepad is connected
- If yes, says you can use "your Gamepad"
- If no, says you can use "Enter, ESC, and the Arrow Keys"
- Show ENTER and ESC on any Message prompt (instead of A/B/X) if no Gamepad is connected
- Add M_DrawMediocreKeyboardKey, a genericisation of the previous entry in the series' Time Attack HUD
- Force to play when selecting "START GAME" from the Goner Setup
- Make far shorter on the First Boot, obscuring the extended Kart Krew vroom, to prevent it playing identically twice
- Prevent skipping the intro at all if Ring Cup hasn't been unlocked
- Both for the shortened initial startup and the START GAME first encounter
- It already clears dirmenu if relevant, don't do that twice
- Hook into M_PlayMenuJam, to reduce bespoke behaviour
- Use the finalised track string
- Play on the Sound Options menu
Also, use MAIN_Goner as reference for the password field's presence, because I lost like 30 minutes to a related bug
Currently plays _OCEAN for testing, but will be changed to play _GONER when Journey In Modulating Time's short loop is ready.
Explicitly restricts the basic title screen's music from playing, too.
- Clean up handling of goner_levelworking to retry current dialogue if something changes gamedata->gonerlevel
- Create wrapper func for resetting ALL text
- Gamedata-modifying cheats will set to GDGONER_DONE
All backgrounds are now handled by a seperate routine.
This will allow more fine handling without a ton of special cases everywhere.
Creates an absolutely nasty diff because all menu_t have been updated in one blast 🥹
For the things that DO need to draw outside of GS_MENU (M_DrawOptionsCogs, the Wrongwarp), the behaviourflag MBF_DRAWBGWHILEPLAYING has also been added.
- Checkpoint sound for reaching a new option
- Fix header text for Video and Sound menus
- Reset password field access when menu is reset by gamedata wipe
- More dialogue
- Restrict access to your choices based on your progress through the Goner Setup.
- Save progress through the setup to gamedata
- Resets to beginning when Challenges is cleared
- Passwords
- Only permit the password entry in like the first two seconds
- Preemptively disarms potentially annoying people in stream chats
- Make wrongwarp also quit the game on exit instead of returning to the title screen
- Add GDQ cheats
- `savetheanimals`
- `savetheframes`
- Both do practically the same thing, with slightly modified dialogue.
- Skips all of the normal dialogue.
- Performing a social experiment on anyone who might stream this game at a charity event. :)
- 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?)