shithub: choc

Download patch

ref: 4220bb2e7fee9bf5c86abbbf79a396bac7db1766
parent: a03d93810b22294c8c4f2e466bba8795f81b9193
author: Simon Howard <fraggle@soulsphere.org>
date: Sun Jan 20 13:44:04 EST 2019

doom: use separate pointers and buffers for demo recording and playback

This makes no difference for Chocolate Doom but acts as a preparation
for a continue-recording feature that @fragglet proposed for Crispy Doom in

https://github.com/fabiangreffrath/crispy-doom/pull/376

It helps maintaining a reasonably small interdiff between both ports.

--- a/src/doom/d_main.c
+++ b/src/doom/d_main.c
@@ -454,9 +454,6 @@
                " may cause demos and network games to get out of sync.\n");
     }
 
-    if (demorecording)
-	G_BeginRecording ();
-
     main_loop_started = true;
 
     I_SetWindowTitle(gamedescription);
--- a/src/doom/g_game.c
+++ b/src/doom/g_game.c
@@ -134,8 +134,10 @@
 boolean         lowres_turn;            // low resolution turning for longtics
 boolean         demoplayback; 
 boolean		netdemo; 
-byte*		demobuffer;
-byte*		demo_p;
+byte*		demo_in_buffer;
+byte*		demo_out_buffer;
+byte*		demo_in_p;
+byte*		demo_out_p = NULL;
 byte*		demoend; 
 boolean         singledemo;            	// quit after playing a demo from cmdline 
  
@@ -1910,28 +1912,28 @@
 
 void G_ReadDemoTiccmd (ticcmd_t* cmd) 
 { 
-    if (*demo_p == DEMOMARKER) 
+    if (*demo_in_p == DEMOMARKER)
     {
-	// end of demo data stream 
-	G_CheckDemoStatus (); 
-	return; 
-    } 
-    cmd->forwardmove = ((signed char)*demo_p++); 
-    cmd->sidemove = ((signed char)*demo_p++); 
+	// end of demo data stream
+	G_CheckDemoStatus ();
+	return;
+    }
+    cmd->forwardmove = ((signed char)*demo_in_p++);
+    cmd->sidemove = ((signed char)*demo_in_p++);
 
     // If this is a longtics demo, read back in higher resolution
 
     if (longtics)
     {
-        cmd->angleturn = *demo_p++;
-        cmd->angleturn |= (*demo_p++) << 8;
+        cmd->angleturn = *demo_in_p++;
+        cmd->angleturn |= (*demo_in_p++) << 8;
     }
     else
     {
-        cmd->angleturn = ((unsigned char) *demo_p++)<<8; 
+        cmd->angleturn = ((unsigned char) *demo_in_p++)<<8;
     }
 
-    cmd->buttons = (unsigned char)*demo_p++; 
+    cmd->buttons = (unsigned char)*demo_in_p++;
 } 
 
 // Increase the size of the demo buffer to allow unlimited demos
@@ -1945,57 +1947,62 @@
 
     // Find the current size
 
-    current_length = demoend - demobuffer;
+    current_length = demoend - demo_out_buffer;
     
     // Generate a new buffer twice the size
     new_length = current_length * 2;
     
     new_demobuffer = Z_Malloc(new_length, PU_STATIC, 0);
-    new_demop = new_demobuffer + (demo_p - demobuffer);
+    new_demop = new_demobuffer + (demo_out_p - demo_out_buffer);
 
     // Copy over the old data
 
-    memcpy(new_demobuffer, demobuffer, current_length);
+    memcpy(new_demobuffer, demo_out_buffer, current_length);
 
     // Free the old buffer and point the demo pointers at the new buffer.
 
-    Z_Free(demobuffer);
+    Z_Free(demo_out_buffer);
 
-    demobuffer = new_demobuffer;
-    demo_p = new_demop;
-    demoend = demobuffer + new_length;
+    demo_out_buffer = new_demobuffer;
+    demo_out_p = new_demop;
+    demoend = demo_out_buffer + new_length;
 }
 
 void G_WriteDemoTiccmd (ticcmd_t* cmd) 
-{ 
+{
     byte *demo_start;
 
-    if (gamekeydown[key_demo_quit])           // press q to end demo recording 
-	G_CheckDemoStatus (); 
+    if (demo_out_p == NULL)
+    {
+        G_BeginRecording();
+    }
 
-    demo_start = demo_p;
+    if (gamekeydown[key_demo_quit])           // press q to end demo recording
+	G_CheckDemoStatus ();
 
-    *demo_p++ = cmd->forwardmove; 
-    *demo_p++ = cmd->sidemove; 
+    demo_start = demo_out_p;
 
+    *demo_out_p++ = cmd->forwardmove;
+    *demo_out_p++ = cmd->sidemove;
+
     // If this is a longtics demo, record in higher resolution
  
     if (longtics)
     {
-        *demo_p++ = (cmd->angleturn & 0xff);
-        *demo_p++ = (cmd->angleturn >> 8) & 0xff;
+        *demo_out_p++ = (cmd->angleturn & 0xff);
+        *demo_out_p++ = (cmd->angleturn >> 8) & 0xff;
     }
     else
     {
-        *demo_p++ = cmd->angleturn >> 8; 
+        *demo_out_p++ = cmd->angleturn >> 8;
     }
 
-    *demo_p++ = cmd->buttons; 
+    *demo_out_p++ = cmd->buttons;
 
     // reset demo pointer back
-    demo_p = demo_start;
+    demo_out_p = demo_start;
 
-    if (demo_p > demoend - 16)
+    if (demo_out_p > demoend - 16)
     {
         if (vanilla_demo_limit)
         {
@@ -2043,8 +2050,8 @@
     i = M_CheckParmWithArgs("-maxdemo", 1);
     if (i)
 	maxsize = atoi(myargv[i+1])*1024;
-    demobuffer = Z_Malloc (maxsize,PU_STATIC,NULL); 
-    demoend = demobuffer + maxsize;
+    demo_out_buffer = Z_Malloc (maxsize,PU_STATIC,NULL);
+    demoend = demo_out_buffer + maxsize;
 	
     demorecording = true; 
 } 
@@ -2072,7 +2079,7 @@
 { 
     int             i; 
 
-    demo_p = demobuffer;
+    demo_out_p = demo_out_buffer;
 
     //!
     // @category demo
@@ -2088,24 +2095,24 @@
 
     if (longtics)
     {
-        *demo_p++ = DOOM_191_VERSION;
+        *demo_out_p++ = DOOM_191_VERSION;
     }
     else
     {
-        *demo_p++ = G_VanillaVersionCode();
+        *demo_out_p++ = G_VanillaVersionCode();
     }
 
-    *demo_p++ = gameskill; 
-    *demo_p++ = gameepisode; 
-    *demo_p++ = gamemap; 
-    *demo_p++ = deathmatch; 
-    *demo_p++ = respawnparm;
-    *demo_p++ = fastparm;
-    *demo_p++ = nomonsters;
-    *demo_p++ = consoleplayer;
-	 
+    *demo_out_p++ = gameskill;
+    *demo_out_p++ = gameepisode;
+    *demo_out_p++ = gamemap;
+    *demo_out_p++ = deathmatch;
+    *demo_out_p++ = respawnparm;
+    *demo_out_p++ = fastparm;
+    *demo_out_p++ = nomonsters;
+    *demo_out_p++ = consoleplayer;
+
     for (i=0 ; i<MAXPLAYERS ; i++) 
-	*demo_p++ = playeringame[i]; 		 
+	*demo_out_p++ = playeringame[i];
 } 
  
 
@@ -2170,10 +2177,10 @@
 
     lumpnum = W_GetNumForName(defdemoname);
     gameaction = ga_nothing;
-    demobuffer = W_CacheLumpNum(lumpnum, PU_STATIC);
-    demo_p = demobuffer;
+    demo_in_buffer = W_CacheLumpNum(lumpnum, PU_STATIC);
+    demo_in_p = demo_in_buffer;
 
-    demoversion = *demo_p++;
+    demoversion = *demo_in_p++;
 
     longtics = false;
 
@@ -2199,17 +2206,17 @@
                          DemoVersionDescription(demoversion));
     }
 
-    skill = *demo_p++; 
-    episode = *demo_p++; 
-    map = *demo_p++; 
-    deathmatch = *demo_p++;
-    respawnparm = *demo_p++;
-    fastparm = *demo_p++;
-    nomonsters = *demo_p++;
-    consoleplayer = *demo_p++;
+    skill = *demo_in_p++;
+    episode = *demo_in_p++;
+    map = *demo_in_p++;
+    deathmatch = *demo_in_p++;
+    respawnparm = *demo_in_p++;
+    fastparm = *demo_in_p++;
+    nomonsters = *demo_in_p++;
+    consoleplayer = *demo_in_p++;
 	
     for (i=0 ; i<MAXPLAYERS ; i++) 
-	playeringame[i] = *demo_p++; 
+	playeringame[i] = *demo_in_p++;
 
     if (playeringame[1] || M_CheckParm("-solo-net") > 0
                         || M_CheckParm("-netdemo") > 0)
@@ -2304,9 +2311,9 @@
  
     if (demorecording) 
     { 
-	*demo_p++ = DEMOMARKER; 
-	M_WriteFile (demoname, demobuffer, demo_p - demobuffer); 
-	Z_Free (demobuffer); 
+	*demo_out_p++ = DEMOMARKER;
+	M_WriteFile (demoname, demo_out_buffer, demo_out_p - demo_out_buffer);
+	Z_Free (demo_out_buffer);
 	demorecording = false; 
 	I_Error ("Demo %s recorded",demoname); 
     }