foxygit / doom Log in
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