summaryrefslogtreecommitdiff
path: root/src/net_structrw.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/net_structrw.c')
-rw-r--r--src/net_structrw.c129
1 files changed, 128 insertions, 1 deletions
diff --git a/src/net_structrw.c b/src/net_structrw.c
index 070da747..5c77d102 100644
--- 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)
@@ -52,3 +59,123 @@ boolean NET_ReadSettings(net_packet_t *packet, net_gamesettings_t *settings)
&& 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;
+}
+