Merged toaster requested to merge marathonmode into next

Introducing Marathon Run. (I was going to call it Marathon Mode, but NiGHTS Mode being right next to it on the menu looked terrible.)

Basically a dedicated Record Attack-like experience for speedrunning the game as a continuous chunk rather than ILs. Has several quality of life features.

Benefits include:

  • An unambiguous timing bar across the bottom of the screen, always displaying the current time, drawn under the FPS but above everything else, ticking up until you reach the ending.
  • Has realtime and in-game timer options, selected at run start - the latter ignoring loads, lagspikes, and intermissions.
  • "Live Event Backups" - a category of run fit for major events like GDQ, where the ability to recover from crashes or chokes makes for better entertainment. Essentially a modified SP savefile, down to using the same basic functions, but has its own filename and tweaked internal layout.
  • Only the best in "antisplice" technology - providing two contrasty notches in the timing bar that is based on the real time the executable has been open for and isn't restored with the Live Event Backup, making spliced runs basically intractable.
  • Disable the console (pausing is still allowed, but the timer will still increment).
  • Quitting the run if the game is modified midway through, like Record Attack.
  • Hitting "Retry" doesn't require a confirmation, like Record Attack (and if you haven't hit the first checkpoint in the first map, it has no life cost and restarts the timer).
  • Show centiseconds on HUD automagically, like Record Attack.
  • Hidden behind the "Unlock Record Attack" condition to avoid confusing new players... like Record Attack.
  • Automatically skip intermissions as if you're holding down the spin button.
  • "spmarathon_start" MainCfg block parameter and "marathonnext" mapheader parameter, allowing for a customised flow (makes this fit for purpose for an eventual SUGOI port).
  • The global integer bitflag sequence "marathonmode" is available to Lua to read, alongside the properties mentioned above.
  • Disabling inter-level custom cutscenes by default with a menu option to toggle this (won't show up if the mod doesn't have any custom cutscenes), although either way ending cutscenes (vanilla or custom) remain intact since is time is called before them.
  • Won't show up if you have a mod that consists of only one level (determined by spmarathon_start's nextlevel; this won't trip if you manually set its marathonnext).
  • Unconditional gratitude on the evaluation screen, instead of a negging "Try again..." if you didn't get all the emeralds (which you may not have been aiming for).
  • Gorgeous new menu (no new assets required, unless you wanna give it a header later).


Changes which were required for the above but affect other areas of the game include:

  • "useBlackRock" MainCfg block parameter, which can be used to disable the presence of the Black Rock or Egg Rock in both the Evaluation screen and the Marathon Run menu (for total conversions with different stories).
  • Disabling Continues in NiGHTS mode, to match the most common singleplayer experience post 2.2.4's release (is reverted if useContinues is set to true).
  • Hiding the exitmove "powerup" on the Powerup Display HUD outside of multiplayer. (Okay, this isn't really related, I just saw this bug in action a lot while doing test runs and got annoyed enough to fix it here.)
  • The ability to use V_DrawPromptBack (in hardcode only at the moment, but) to draw in terms of pixels rather than rows of text, by providing negative instead of positive inputs).
  • A refactoring of redundant game saves smattered across the ending, credits, and evaluation - in addition to saving the game slightly earlier.
  • Minor m_menu.c touchups and refactorings here and there.

Built using feedback from the official server's #speedruns channel, among other places.

For public consumption and testing, at least until 2.2.5 is a thing (fingers crossed y'alls are happy with this): srb2win_marathonmode.exe (LAST UPDATED: 21:36 GMT 15/05/2020)

Edited by toaster

Merge request reports