ref: 9d51e5310899f3d0fefdd36c305dfe7a6d9ef3de
parent: 3d6f4785591eced3e4195a342980facd0adcb284
author: Thomas A. Birkel <capnclever@gmail.com>
date: Fri Oct 14 22:05:31 EDT 2016
Add -demoextend parameter to improve Heretic/Hexen demo support Vanilla Heretic and Hexen demo support is limited to one level (quits after level completion) and one life (quits after player respawn). When -demoextend is used, these premature quits are ignored. Additional work on Hexen to conditionally suppress demo-related variable setting whenever loading a map. Partial implementation of #432
--- a/src/heretic/d_main.c
+++ b/src/heretic/d_main.c
@@ -1039,6 +1039,15 @@
longtics = M_CheckParm("-longtics") != 0;
+ //!
+ // @category demo
+ //
+ // Demo records and plays back without automatically quitting
+ // after level exit.
+ //
+
+ demoextend = M_CheckParm("-demoextend");
+
if (W_CheckNumForName(DEH_String("E2M1")) == -1)
{
gamemode = shareware;
--- a/src/heretic/doomdef.h
+++ b/src/heretic/doomdef.h
@@ -531,6 +531,7 @@
// Used when recording Vanilla demos in netgames.
extern boolean longtics; // specifies 16-bit angleturn resolution in demos
extern boolean demoplayback;
+extern boolean demoextend; // allow demos to persist through exit/respawn
extern int skytexture;
extern gamestate_t gamestate;
--- a/src/heretic/g_game.c
+++ b/src/heretic/g_game.c
@@ -114,6 +114,7 @@
boolean lowres_turn;
boolean shortticfix; // properly calculates lowres turns like in doom
boolean demoplayback;
+boolean demoextend;
byte *demobuffer, *demo_p, *demoend;
boolean singledemo; // quit after playing a demo from cmdline
@@ -1322,7 +1323,7 @@
{
int i;
- if (G_CheckDemoStatus())
+ if (!demoextend && G_CheckDemoStatus()) // quit demo unless -demoextend
return;
if (!netgame)
gameaction = ga_loadlevel; // reload the level from scratch
@@ -1391,7 +1392,7 @@
static int afterSecret[5] = { 7, 5, 5, 5, 4 };
gameaction = ga_nothing;
- if (G_CheckDemoStatus())
+ if (!demoextend && G_CheckDemoStatus()) // quit demo unless -demoextend
{
return;
}
--- a/src/hexen/g_game.c
+++ b/src/hexen/g_game.c
@@ -97,6 +97,7 @@
boolean lowres_turn;
boolean shortticfix; // properly calculates lowres turns like in doom
boolean demoplayback;
+boolean demoextend;
byte *demobuffer, *demo_p, *demoend;
boolean singledemo; // quit after playing a demo from cmdline
@@ -1325,7 +1326,7 @@
boolean foundSpot;
int bestWeapon;
- if (G_CheckDemoStatus())
+ if (!demoextend && G_CheckDemoStatus()) // quit demo unless -demoextend
{
return;
}
@@ -1520,7 +1521,7 @@
int i;
gameaction = ga_nothing;
- if (G_CheckDemoStatus())
+ if (!demoextend && G_CheckDemoStatus()) // quit demo unless -demoextend
{
return;
}
@@ -1771,10 +1772,14 @@
}
// Set up a bunch of globals
- usergame = true; // will be set false if a demo
+ if (!demoextend) // this prevents map-loading from stopping the demo
+ { // demoextend is set back to false only if starting a
+ // new game or loading a saved one during playback
+ demorecording = false;
+ demoplayback = false;
+ usergame = true; // will be set false if a demo
+ }
paused = false;
- demorecording = false;
- demoplayback = false;
viewactive = true;
gameepisode = episode;
gamemap = map;
--- a/src/hexen/h2_main.c
+++ b/src/hexen/h2_main.c
@@ -684,6 +684,15 @@
longtics = M_CheckParm("-longtics") != 0;
+ //!
+ // @category demo
+ //
+ // Demo records and plays back without automatically quitting
+ // after level exit.
+ //
+
+ demoextend = M_CheckParm("-demoextend");
+
if (M_ParmExists("-testcontrols"))
{
autostart = true;
--- a/src/hexen/h2def.h
+++ b/src/hexen/h2def.h
@@ -636,6 +636,7 @@
// Used when recording Vanilla demos in netgames.
extern boolean longtics; // specifies 16-bit angleturn resolution in demos
extern boolean demoplayback;
+extern boolean demoextend; // allow demos to persist through exit/respawn
extern int maxzone; // Maximum chunk allocated for zone heap
extern int Sky1Texture;
--- a/src/hexen/mn_menu.c
+++ b/src/hexen/mn_menu.c
@@ -130,6 +130,7 @@
int InfoType;
int messageson = true;
boolean mn_SuicideConsole;
+boolean demoextend; // from h2def.h
// PRIVATE DATA DEFINITIONS ------------------------------------------------
@@ -895,6 +896,10 @@
static void SCLoadGame(int option)
{
+ if (demoplayback)
+ {
+ demoextend = false;
+ }
if (!SlotStatus[option])
{ // Don't try to load from an empty slot
return;
@@ -1003,6 +1008,11 @@
static void SCSkill(int option)
{
+ if (demoplayback)
+ {
+ demoextend = false;
+ }
+
PlayerClass[consoleplayer] = MenuPClass;
G_DeferredNewGame(option);
SB_SetClassData();