diff options
Diffstat (limited to 'src/net_structrw.c')
-rw-r--r-- | src/net_structrw.c | 78 |
1 files changed, 77 insertions, 1 deletions
diff --git a/src/net_structrw.c b/src/net_structrw.c index a2662023..f57a9091 100644 --- a/src/net_structrw.c +++ b/src/net_structrw.c @@ -1,7 +1,7 @@ // Emacs style mode select -*- C++ -*- //----------------------------------------------------------------------------- // -// $Id: net_structrw.c 295 2006-01-14 02:06:48Z fraggle $ +// $Id: net_structrw.c 369 2006-02-16 01:12:28Z fraggle $ // // Copyright(C) 2005 Simon Howard // @@ -21,6 +21,12 @@ // 02111-1307, USA. // // $Log$ +// Revision 1.6 2006/02/16 01:12:28 fraggle +// Define a new type net_full_ticcmd_t, a structure containing all ticcmds +// for a given tic. Store received game data in a receive window. Add +// send queues for clients and add data from the receive window to +// generate complete sets of ticcmds. +// // Revision 1.5 2006/01/14 02:06:48 fraggle // Include the game version in the settings structure. // @@ -47,6 +53,8 @@ #include <stdlib.h> #include <string.h> +#include "doomdef.h" + #include "net_packet.h" #include "net_structrw.h" @@ -213,3 +221,71 @@ void NET_TiccmdPatch(ticcmd_t *src, net_ticdiff_t *diff, ticcmd_t *dest) dest->chatchar = 0; } +// +// net_full_ticcmd_t +// + +boolean NET_ReadFullTiccmd(net_packet_t *packet, net_full_ticcmd_t *cmd) +{ + unsigned int bitfield; + int i; + + // Regenerate playeringame from the "header" bitfield + + if (!NET_ReadInt8(packet, &bitfield)) + { + return false; + } + + for (i=0; i<MAXPLAYERS; ++i) + { + cmd->playeringame[i] = (bitfield & (1 << i)) != 0; + } + + // Read cmds + + for (i=0; i<MAXPLAYERS; ++i) + { + if (cmd->playeringame[i]) + { + if (!NET_ReadTiccmdDiff(packet, &cmd->cmds[i], false)) + { + return false; + } + } + } + + return true; +} + +void NET_WriteFullTiccmd(net_packet_t *packet, net_full_ticcmd_t *cmd) +{ + unsigned int bitfield; + int i; + + // Write "header" byte indicating which players are active + // in this ticcmd + + bitfield = 0; + + for (i=0; i<MAXPLAYERS; ++i) + { + if (cmd->playeringame[i]) + { + bitfield |= 1 << i; + } + } + + NET_WriteInt8(packet, bitfield); + + // Write player ticcmds + + for (i=0; i<MAXPLAYERS; ++i) + { + if (cmd->playeringame[i]) + { + NET_WriteTiccmdDiff(packet, &cmd->cmds[i], false); + } + } +} + |