Now that TA wipes are their intended length, holding Respawn during Time Attack for more than a single frame repeatedly restarts the run. This is not ideal, and frankly wasteful of CPU. Here is the specified replacement for this case:
- Holding gc_respawn will hold on a black(/white) screen before mapload.
- Allows for taking a conscious breather (or opportunity to curse) in the middle of long Time Attack sessions.
- Ticcmdbuilder will not interpret gc_respawn into BT_ constants in Time Attack contexts at all.
- Fixes the occasionally visible E-Brake when coming out of this breather state.
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
A chunk of P_LoadLevel, extracted.
Calling it in D_ClearState should clear up some of the straggling pointers that might cause Laz' reported issue.
With any luck, it should also significantly reduce the amount of memory the menu uses.
- 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
- Demos/Ghosts that end before ticking once are now correctly ignored. (ResolvesKartKrew/RingRacers#168)
- There was code for discovering it on read! It was just placed slightly too early, probably due to the conversion for netreplays! I'm very mad!
- As a preventative measure, demos *recorded* before ticking will simply not save in the first place.
- This was also a frustratingly easy fix for the amount of headache it's caused us.
- Reduced the amount of copypasted boilerplate by simplifying the places where DEMOMARKER can be written (and therefore read).
- Previously, like half the write functions tried to guess their own output size and potentially end the demo at any point.
- At best, this will grant us a few tics of reprireve for large netgames and MAYBE a handful of seconds for time attack, The Mode In Which The Aim Is To Go Fast.
- Instead, double the size of the deadspace buffer extension and just check to see if we've crossed into that territory.
In cases where state/property set can cause instant deletion, definitely interrupts FindMobjFromTID iteration after one step and potentially uses after free
Also adds comment warnings to this effect near ways to find P_FindMobjFromTID, and updates P_ProcessSpecial even though we could probably stand to rip it out now
- Test
- debugwaypoints - very easily observable, all labels
are the same without this fix
- ACS text would sometimes be reversed without this fix,
not as easily observable