shithub: choc

Download patch

ref: cc29e0fd789e058666110fec345d012cb7741615
parent: 75337e4ed54550f215145991517b0139fe7ce5c1
author: Simon Howard <fraggle@gmail.com>
date: Tue Jan 10 20:37:53 EST 2006

ticcmd diffs: allow compare and patching ticcmds, and reading/writing
ticdiffs to packets.

Subversion-branch: /trunk/chocolate-doom
Subversion-revision: 281

--- a/src/net_defs.h
+++ b/src/net_defs.h
@@ -1,7 +1,7 @@
 // Emacs style mode select   -*- C++ -*- 
 //-----------------------------------------------------------------------------
 //
-// $Id: net_defs.h 279 2006-01-10 19:59:26Z fraggle $
+// $Id: net_defs.h 281 2006-01-11 01:37:53Z fraggle $
 //
 // Copyright(C) 2005 Simon Howard
 //
@@ -21,6 +21,10 @@
 // 02111-1307, USA.
 //
 // $Log$
+// Revision 1.8  2006/01/11 01:37:53  fraggle
+// ticcmd diffs: allow compare and patching ticcmds, and reading/writing
+// ticdiffs to packets.
+//
 // Revision 1.7  2006/01/10 19:59:26  fraggle
 // Reliable packet transport mechanism
 //
@@ -56,6 +60,7 @@
 #define NET_DEFS_H 
 
 #include "doomtype.h"
+#include "d_ticcmd.h"
 
 typedef struct _net_module_s net_module_t;
 typedef struct _net_packet_s net_packet_t;
@@ -144,6 +149,19 @@
     int map;
     int skill;
 } net_gamesettings_t;
+
+#define NET_TICDIFF_FORWARD      (1 << 0)
+#define NET_TICDIFF_SIDE         (1 << 1)
+#define NET_TICDIFF_TURN         (1 << 2)
+#define NET_TICDIFF_BUTTONS      (1 << 3)
+#define NET_TICDIFF_CONSISTANCY  (1 << 4)
+#define NET_TICDIFF_CHATCHAR     (1 << 5)
+
+typedef struct
+{
+    unsigned int diff;
+    ticcmd_t cmd;
+} net_ticdiff_t;
 
 #endif /* #ifndef NET_DEFS_H */
 
--- a/src/net_structrw.c
+++ b/src/net_structrw.c
@@ -1,7 +1,7 @@
 // Emacs style mode select   -*- C++ -*- 
 //-----------------------------------------------------------------------------
 //
-// $Id: net_structrw.c 235 2005-12-30 18:58:22Z fraggle $
+// $Id: net_structrw.c 281 2006-01-11 01:37:53Z fraggle $
 //
 // Copyright(C) 2005 Simon Howard
 //
@@ -21,6 +21,10 @@
 // 02111-1307, USA.
 //
 // $Log$
+// Revision 1.2  2006/01/11 01:37:53  fraggle
+// ticcmd diffs: allow compare and patching ticcmds, and reading/writing
+// ticdiffs to packets.
+//
 // Revision 1.1  2005/12/30 18:58:22  fraggle
 // Fix client code to correctly send reply to server on connection.
 // Add "waiting screen" while waiting for the game to start.
@@ -30,6 +34,9 @@
 // Reading and writing various structures into packets
 //
 
+#include <stdlib.h>
+#include <string.h>
+
 #include "net_packet.h"
 
 void NET_WriteSettings(net_packet_t *packet, net_gamesettings_t *settings)
@@ -50,5 +57,125 @@
         && NET_ReadInt8(packet, (unsigned int *) &settings->episode)
         && NET_ReadInt8(packet, (unsigned int *) &settings->map)
         && NET_ReadInt8(packet, (unsigned int *) &settings->skill);
+}
+
+void NET_WriteTiccmdDiff(net_packet_t *packet, net_ticdiff_t *diff)
+{
+    // Header
+
+    NET_WriteInt8(packet, diff->diff);
+
+    // Write the fields which are enabled:
+
+    if (diff->diff & NET_TICDIFF_FORWARD)
+        NET_WriteInt8(packet, diff->cmd.forwardmove);
+    if (diff->diff & NET_TICDIFF_SIDE)
+        NET_WriteInt8(packet, diff->cmd.sidemove);
+    if (diff->diff & NET_TICDIFF_TURN)
+        NET_WriteInt16(packet, diff->cmd.angleturn);
+    if (diff->diff & NET_TICDIFF_BUTTONS)
+        NET_WriteInt8(packet, diff->cmd.buttons);
+    if (diff->diff & NET_TICDIFF_CONSISTANCY)
+        NET_WriteInt8(packet, diff->cmd.consistancy);
+    if (diff->diff & NET_TICDIFF_CHATCHAR)
+        NET_WriteInt8(packet, diff->cmd.chatchar);
+}
+
+boolean NET_ReadTiccmdDiff(net_packet_t *packet, net_ticdiff_t *diff)
+{
+    unsigned int val;
+
+    // Read header
+
+    if (!NET_ReadInt8(packet, &diff->diff))
+        return false;
+    
+    // Read fields
+
+    if (diff->diff & NET_TICDIFF_FORWARD)
+    {
+        if (!NET_ReadInt8(packet, &val))
+            return false;
+        diff->cmd.forwardmove = val;
+    }
+
+    if (diff->diff & NET_TICDIFF_SIDE)
+    {
+        if (!NET_ReadInt8(packet, &val))
+            return false;
+        diff->cmd.sidemove = val;
+    }
+
+    if (diff->diff & NET_TICDIFF_TURN)
+    {
+        if (!NET_ReadInt16(packet, &val))
+            return false;
+        diff->cmd.angleturn = val;
+    }
+
+    if (diff->diff & NET_TICDIFF_BUTTONS)
+    {
+        if (!NET_ReadInt8(packet, &val))
+            return false;
+        diff->cmd.buttons = val;
+    }
+
+    if (diff->diff & NET_TICDIFF_CONSISTANCY)
+    {
+        if (!NET_ReadInt8(packet, &val))
+            return false;
+        diff->cmd.consistancy = val;
+    }
+
+    if (diff->diff & NET_TICDIFF_CHATCHAR)
+    {
+        if (!NET_ReadInt8(packet, &val))
+            return false;
+        diff->cmd.chatchar = val;
+    }
+
+    return true;
+}
+
+void NET_TiccmdDiff(ticcmd_t *tic1, ticcmd_t *tic2, net_ticdiff_t *diff)
+{
+    diff->diff = 0;
+    diff->cmd = *tic2;
+
+    if (tic1->forwardmove != tic2->forwardmove)
+        diff->diff |= NET_TICDIFF_FORWARD;
+    if (tic1->sidemove != tic2->sidemove)
+        diff->diff |= NET_TICDIFF_SIDE;
+    if (tic1->angleturn != tic2->angleturn)
+        diff->diff |= NET_TICDIFF_TURN;
+    if (tic1->buttons != tic2->buttons)
+        diff->diff |= NET_TICDIFF_BUTTONS;
+    if (tic1->consistancy != tic2->consistancy)
+        diff->diff |= NET_TICDIFF_CONSISTANCY;
+    if (tic2->chatchar != 0)
+        diff->diff |= NET_TICDIFF_CHATCHAR;
+}
+
+void NET_TiccmdPatch(ticcmd_t *src, net_ticdiff_t *diff, ticcmd_t *dest)
+{
+    memcpy(dest, src, sizeof(ticcmd_t));
+
+    // Apply the diff
+
+    if (diff->diff & NET_TICDIFF_FORWARD)
+        dest->forwardmove = diff->cmd.forwardmove;
+    if (diff->diff & NET_TICDIFF_SIDE)
+        dest->sidemove = diff->cmd.sidemove;
+    if (diff->diff & NET_TICDIFF_TURN)
+        dest->angleturn = diff->cmd.angleturn;
+    if (diff->diff & NET_TICDIFF_BUTTONS)
+        dest->buttons = diff->cmd.buttons;
+    if (diff->diff & NET_TICDIFF_CONSISTANCY)
+        dest->consistancy = diff->cmd.consistancy;
+
+    if (diff->diff & NET_TICDIFF_CHATCHAR)
+        dest->chatchar = diff->cmd.chatchar;
+    else
+        dest->chatchar = 0;
 }
 
--- a/src/net_structrw.h
+++ b/src/net_structrw.h
@@ -1,7 +1,7 @@
 // Emacs style mode select   -*- C++ -*- 
 //-----------------------------------------------------------------------------
 //
-// $Id: net_structrw.h 235 2005-12-30 18:58:22Z fraggle $
+// $Id: net_structrw.h 281 2006-01-11 01:37:53Z fraggle $
 //
 // Copyright(C) 2005 Simon Howard
 //
@@ -21,6 +21,10 @@
 // 02111-1307, USA.
 //
 // $Log$
+// Revision 1.2  2006/01/11 01:37:53  fraggle
+// ticcmd diffs: allow compare and patching ticcmds, and reading/writing
+// ticdiffs to packets.
+//
 // Revision 1.1  2005/12/30 18:58:22  fraggle
 // Fix client code to correctly send reply to server on connection.
 // Add "waiting screen" while waiting for the game to start.
@@ -36,6 +40,10 @@
 extern void NET_WriteSettings(net_packet_t *packet, net_gamesettings_t *settings);
 extern boolean NET_ReadSettings(net_packet_t *packet, net_gamesettings_t *settings);
 
+extern void NET_WriteTiccmdDiff(net_packet_t *packet, net_ticdiff_t *diff);
+extern boolean NET_ReadTiccmdDiff(net_packet_t *packet, net_ticdiff_t *diff);
+extern void NET_TiccmdDiff(ticcmd_t *tic1, ticcmd_t *tic2, net_ticdiff_t *diff);
+extern void NET_TiccmdPatch(ticcmd_t *src, net_ticdiff_t *diff, ticcmd_t *dest);
 
 #endif /* #ifndef NET_STRUCTRW_H */