/* msg.c (description) Copyright (C) 1996-1997 Id Software, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to: Free Software Foundation, Inc. 59 Temple Place - Suite 330 Boston, MA 02111-1307, USA */ #ifdef HAVE_CONFIG_H # include "config.h" #endif static __attribute__ ((used)) const char rcsid[] = "$Id$"; #ifdef HAVE_STRING_H # include #endif #ifdef HAVE_STRINGS_H # include #endif #include "QF/msg.h" #include "QF/qendian.h" #include "QF/sys.h" #include "qw/msg_ucmd.h" #include "qw/protocol.h" struct usercmd_s nullcmd; void MSG_WriteDeltaUsercmd (sizebuf_t *buf, usercmd_t *from, usercmd_t *cmd) { int bits; // send the movement message bits = 0; if (cmd->angles[0] != from->angles[0]) bits |= CM_ANGLE1; if (cmd->angles[1] != from->angles[1]) bits |= CM_ANGLE2; if (cmd->angles[2] != from->angles[2]) bits |= CM_ANGLE3; if (cmd->forwardmove != from->forwardmove) bits |= CM_FORWARD; if (cmd->sidemove != from->sidemove) bits |= CM_SIDE; if (cmd->upmove != from->upmove) bits |= CM_UP; if (cmd->buttons != from->buttons) bits |= CM_BUTTONS; if (cmd->impulse != from->impulse) bits |= CM_IMPULSE; MSG_WriteByte (buf, bits); if (bits & CM_ANGLE1) MSG_WriteAngle16 (buf, cmd->angles[0]); if (bits & CM_ANGLE2) MSG_WriteAngle16 (buf, cmd->angles[1]); if (bits & CM_ANGLE3) MSG_WriteAngle16 (buf, cmd->angles[2]); if (bits & CM_FORWARD) MSG_WriteShort (buf, cmd->forwardmove); if (bits & CM_SIDE) MSG_WriteShort (buf, cmd->sidemove); if (bits & CM_UP) MSG_WriteShort (buf, cmd->upmove); if (bits & CM_BUTTONS) MSG_WriteByte (buf, cmd->buttons); if (bits & CM_IMPULSE) MSG_WriteByte (buf, cmd->impulse); MSG_WriteByte (buf, cmd->msec); } void MSG_ReadDeltaUsercmd (qmsg_t *msg, usercmd_t *from, usercmd_t *move) { int bits; memcpy (move, from, sizeof (*move)); bits = MSG_ReadByte (msg); // read current angles if (bits & CM_ANGLE1) move->angles[0] = MSG_ReadAngle16 (msg); if (bits & CM_ANGLE2) move->angles[1] = MSG_ReadAngle16 (msg); if (bits & CM_ANGLE3) move->angles[2] = MSG_ReadAngle16 (msg); // read movement if (bits & CM_FORWARD) move->forwardmove = MSG_ReadShort (msg); if (bits & CM_SIDE) move->sidemove = MSG_ReadShort (msg); if (bits & CM_UP) move->upmove = MSG_ReadShort (msg); // read buttons if (bits & CM_BUTTONS) move->buttons = MSG_ReadByte (msg); if (bits & CM_IMPULSE) move->impulse = MSG_ReadByte (msg); // read time to run command move->msec = MSG_ReadByte (msg); }