- K_PlayerTripwireSpeedThreshold, K_CheckpointCrossAward - repaced with "GTR_CIRCUIT and not K_Cooperative" - excludes Sealed Stars as before, but includes custom Race-based gametypes
- UFO Spawner tracking on minimap - GTR_PAPERITEMS, per how UFOs are handled in k_battle.c
- G_RandMapPerPlayerCount: Check for the absence of GT_SPECIAL when excluding LF_SECTIONRACE, not the presence of GT_RACE
- Little bit of a hack, but right now there's no way to do custom cooperative gametypes, we don't have proper access to gametyperules in this function, and Battle courses aren't going to have this flag anyways
- Move `followerready`'s first set from `K_SetFollowerByNum` (which isn't called if your follower is -1, the exact case Goddess is supposed to help us with) to `G_UpdatePlayerPreferences`, which is always called whenever the follower ID is validated on join
- Cache "Goddess"' followerskin ID by cribbing from `r_skins` and `R_DefaultBotSkin`
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.
- Play intro when exiting goner Playground
- Do not allow using menu to skip driving down that hill in goner Playground
The reason these two are hacks is because a map is considered goner Playground if you use -warp at command line or map in console on title screen to get to a Tutorial course... but these are unimportant edge cases IMO
- 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
A lot of messy, copypasted boilerplate has been bundled together into a single function.
Programmers can now fire up a Match Race, the most basic type of gameplay, from menu code in only four steps (other modes take a little more attention):
- **M_MenuToLevelPreamble(UINT8 - splitscreen players #, boolean - false to extend wipe/true for short wipe)**
- set restoremenu
- D_MapChange(...)
- M_ClearMenus(...)
Includes the following fixes:
- Encore no longer has over-long wipes when started from menu, only standard-length
- "Boss Intro" and Encore start-of-round sounds will always play, even if no Title Card is drawn
- No long wipe when restarting a Time Attack run
- Auto Encore and Auto Gamespeed are no longer accidentially forced if you've manually changed them to Off and Gear 2 before starting netgame
- Built off g_fast_forward to utilise a lot of existing structure
- Only does steps of 5 seconds and therefore isn't precise, but that's better than having to rewatch/fastforward through the entire thing
- No single frame step back or general in-motion rewind preview, but that was all overkill
- Add spectatewait to G_PlayerReborn
- This was making shuffeloser not work
- Testing setup
- `-server -splitscreen 4 +shuffleloser 1 +maxplayers 2 +numlaps 0 +debugstart 0 +inttime 0 +advancemap random`
- Spectate two players, go to map
now that we have spots on the player struct for both gradingfactor and exp, store exp in the exp field after adjusting gradingfactor, and just reference it instead of recalculating every time