commit aa3e8e11e588c35eec44ea58f1a9d06b02e3efe5
Author: Thomas A. Birkel <capnclever@gmail.com>
AuthorDate: Thu Oct 20 18:50:56 2016 -0400
Commit: Thomas A. Birkel <capnclever@gmail.com>
CommitDate: Thu Oct 20 18:50:56 2016 -0400
Add demo support to automatically playback parameters in Heretic/Hexen
-longtics, -respawn, and -nomonsters are stored in the demo via the
player one header byte.
Move longtics into single file: its usage is now limited to only
G_RecordDemo so it can stay local to g_game.c.
Additional implemention for #432
---
src/heretic/d_main.c | 8 --------
src/heretic/doomdef.h | 1 -
src/heretic/g_game.c | 44 ++++++++++++++++++++++++++++++++++++++++++--
src/hexen/g_game.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++----
src/hexen/h2_main.c | 8 --------
src/hexen/h2def.h | 1 -
6 files changed, 88 insertions(+), 24 deletions(-)
diff --git a/src/heretic/d_main.c b/src/heretic/d_main.c
index 75b47fbe..550ae73f 100644
--- a/src/heretic/d_main.c
+++ b/src/heretic/d_main.c
@@ -1031,14 +1031,6 @@ void D_DoomMain(void)
printf("Playing demo %s.\n", file);
}
- //!
- // @category demo
- //
- // Record or playback a demo with high resolution turning.
- //
-
- longtics = M_ParmExists("-longtics");
-
//!
// @category demo
//
diff --git a/src/heretic/doomdef.h b/src/heretic/doomdef.h
index 334a3229..db82a76b 100644
--- a/src/heretic/doomdef.h
+++ b/src/heretic/doomdef.h
@@ -527,7 +527,6 @@ extern boolean DebugSound; // debug flag for displaying sound info
extern int GetWeaponAmmo[NUMWEAPONS];
extern boolean demorecording;
-extern boolean longtics; // specify high resolution turning in demos
extern boolean demoplayback;
extern boolean demoextend; // allow demos to persist through exit/respawn
extern int skytexture;
diff --git a/src/heretic/g_game.c b/src/heretic/g_game.c
index 6d676607..f78da0ed 100644
--- a/src/heretic/g_game.c
+++ b/src/heretic/g_game.c
@@ -110,7 +110,7 @@ int mouseSensitivity;
char demoname[32];
boolean demorecording;
-boolean longtics;
+boolean longtics; // specify high resolution turning in demos
boolean lowres_turn;
boolean shortticfix; // calculate lowres turning like doom
boolean demoplayback;
@@ -1737,6 +1737,14 @@ void G_RecordDemo(skill_t skill, int numplayers, int episode, int map,
int i;
int maxsize;
+ //!
+ // @category demo
+ //
+ // Record or playback a demo with high resolution turning.
+ //
+
+ longtics = M_ParmExists("-longtics");
+
// If not recording a longtics demo, record in low res
lowres_turn = !longtics;
@@ -1746,6 +1754,7 @@ void G_RecordDemo(skill_t skill, int numplayers, int episode, int map,
//
// Smooth out low resolution turning when recording a demo.
//
+
shortticfix = M_ParmExists("-shortticfix");
G_InitNew(skill, episode, map);
@@ -1773,7 +1782,28 @@ void G_RecordDemo(skill_t skill, int numplayers, int episode, int map,
*demo_p++ = episode;
*demo_p++ = map;
- for (i = 0; i < MAXPLAYERS; i++)
+ // Write special parameter bits onto player one byte.
+ // This aligns with vvHeretic demo usage:
+ // 0x20 = -respawn
+ // 0x10 = -longtics
+ // 0x02 = -nomonsters
+
+ *demo_p = 1; // assume player one exists
+ if (respawnparm)
+ {
+ *demo_p += 32;
+ }
+ if (longtics)
+ {
+ *demo_p += 16;
+ }
+ if (nomonsters)
+ {
+ *demo_p += 2;
+ }
+ demo_p++;
+
+ for (i = 1; i < MAXPLAYERS; i++)
*demo_p++ = playeringame[i];
demorecording = true;
@@ -1807,6 +1837,11 @@ void G_DoPlayDemo(void)
episode = *demo_p++;
map = *demo_p++;
+ // Read special parameter bits: see G_RecordDemo() for details.
+ respawnparm = *demo_p & 32;
+ longtics = *demo_p & 16;
+ nomonsters = *demo_p & 2;
+
for (i = 0; i < MAXPLAYERS; i++)
playeringame[i] = *demo_p++;
@@ -1836,6 +1871,11 @@ void G_TimeDemo(char *name)
episode = *demo_p++;
map = *demo_p++;
+ // Read special parameter bits: see G_RecordDemo() for details.
+ respawnparm = *demo_p & 32;
+ longtics = *demo_p & 16;
+ nomonsters = *demo_p & 2;
+
for (i = 0; i < MAXPLAYERS; i++)
{
playeringame[i] = *demo_p++;
diff --git a/src/hexen/g_game.c b/src/hexen/g_game.c
index 575e9a13..ad8539bc 100644
--- a/src/hexen/g_game.c
+++ b/src/hexen/g_game.c
@@ -93,7 +93,7 @@ int levelstarttic; // gametic at level start
char demoname[32];
boolean demorecording;
-boolean longtics;
+boolean longtics; // specify high resolution turning in demos
boolean lowres_turn;
boolean shortticfix; // calculate lowres turning like doom
boolean demoplayback;
@@ -1896,16 +1896,25 @@ void G_RecordDemo(skill_t skill, int numplayers, int episode, int map,
int i;
int maxsize;
+ //!
+ // @category demo
+ //
+ // Record or playback a demo with high resolution turning.
+ //
+
+ longtics = M_ParmExists("-longtics");
+
// If not recording a longtics demo, record in low res
+ lowres_turn = !longtics;
+
//!
// @category demo
//
// Smooth out low resolution turning when recording a demo.
//
- shortticfix = M_ParmExists("-shortticfix");
- lowres_turn = !longtics;
+ shortticfix = M_ParmExists("-shortticfix");
G_InitNew(skill, episode, map);
usergame = false;
@@ -1932,7 +1941,30 @@ void G_RecordDemo(skill_t skill, int numplayers, int episode, int map,
*demo_p++ = episode;
*demo_p++ = map;
- for (i = 0; i < maxplayers; i++)
+ // Write special parameter bits onto player one byte.
+ // This aligns with vvHeretic demo usage. Hexen demo support has no
+ // precedent here so consistency with another game is chosen:
+ // 0x20 = -respawn
+ // 0x10 = -longtics
+ // 0x02 = -nomonsters
+
+ *demo_p = 1; // assume player one exists
+ if (respawnparm)
+ {
+ *demo_p += 32;
+ }
+ if (longtics)
+ {
+ *demo_p += 16;
+ }
+ if (nomonsters)
+ {
+ *demo_p += 2;
+ }
+ demo_p++;
+ *demo_p++ = PlayerClass[0];
+
+ for (i = 1; i < maxplayers; i++)
{
*demo_p++ = playeringame[i];
*demo_p++ = PlayerClass[i];
@@ -1969,6 +2001,11 @@ void G_DoPlayDemo(void)
episode = *demo_p++;
map = *demo_p++;
+ // Read special parameter bits: see G_RecordDemo() for details.
+ respawnparm = *demo_p & 32;
+ longtics = *demo_p & 16;
+ nomonsters = *demo_p & 2;
+
for (i = 0; i < maxplayers; i++)
{
playeringame[i] = *demo_p++;
@@ -2004,6 +2041,11 @@ void G_TimeDemo(char *name)
episode = *demo_p++;
map = *demo_p++;
+ // Read special parameter bits: see G_RecordDemo() for details.
+ respawnparm = *demo_p & 32;
+ longtics = *demo_p & 16;
+ nomonsters = *demo_p & 2;
+
for (i = 0; i < maxplayers; i++)
{
playeringame[i] = *demo_p++;
diff --git a/src/hexen/h2_main.c b/src/hexen/h2_main.c
index cd7a25a5..9f524afc 100644
--- a/src/hexen/h2_main.c
+++ b/src/hexen/h2_main.c
@@ -676,14 +676,6 @@ static void HandleArgs(void)
ST_Message("Playing demo %s.\n", myargv[p+1]);
}
- //!
- // @category demo
- //
- // Record or playback a demo with high resolution turning.
- //
-
- longtics = M_ParmExists("-longtics");
-
//!
// @category demo
//
diff --git a/src/hexen/h2def.h b/src/hexen/h2def.h
index 91f5285c..7ceaeeb6 100644
--- a/src/hexen/h2def.h
+++ b/src/hexen/h2def.h
@@ -632,7 +632,6 @@ extern player_t players[MAXPLAYERS];
extern boolean DebugSound; // debug flag for displaying sound info
-extern boolean longtics; // specify high resolution turning in demos
extern boolean demoplayback;
extern boolean demoextend; // allow demos to persist through exit/respawn
extern int maxzone; // Maximum chunk allocated for zone heap