2006-02-24 04:48:15 +00:00
|
|
|
/*
|
|
|
|
** d_protocol.h
|
|
|
|
**
|
|
|
|
**---------------------------------------------------------------------------
|
2006-06-11 01:37:00 +00:00
|
|
|
** Copyright 1998-2006 Randy Heit
|
2006-02-24 04:48:15 +00:00
|
|
|
** All rights reserved.
|
|
|
|
**
|
|
|
|
** Redistribution and use in source and binary forms, with or without
|
|
|
|
** modification, are permitted provided that the following conditions
|
|
|
|
** are met:
|
|
|
|
**
|
|
|
|
** 1. Redistributions of source code must retain the above copyright
|
|
|
|
** notice, this list of conditions and the following disclaimer.
|
|
|
|
** 2. Redistributions in binary form must reproduce the above copyright
|
|
|
|
** notice, this list of conditions and the following disclaimer in the
|
|
|
|
** documentation and/or other materials provided with the distribution.
|
|
|
|
** 3. The name of the author may not be used to endorse or promote products
|
|
|
|
** derived from this software without specific prior written permission.
|
|
|
|
**
|
|
|
|
** THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
|
|
** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
|
|
|
** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
|
|
|
** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
|
|
** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
|
|
** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
|
|
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
|
|
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
|
|
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
|
|
** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
|
**---------------------------------------------------------------------------
|
|
|
|
**
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef __D_PROTOCOL_H__
|
|
|
|
#define __D_PROTOCOL_H__
|
|
|
|
|
|
|
|
#include "doomstat.h"
|
|
|
|
#include "doomtype.h"
|
|
|
|
#include "doomdef.h"
|
|
|
|
#include "m_fixed.h"
|
|
|
|
#include "farchive.h"
|
|
|
|
|
|
|
|
// The IFF routines here all work with big-endian IDs, even if the host
|
|
|
|
// system is little-endian.
|
|
|
|
#define BIGE_ID(a,b,c,d) ((d)|((c)<<8)|((b)<<16)|((a)<<24))
|
|
|
|
|
|
|
|
#define FORM_ID BIGE_ID('F','O','R','M')
|
|
|
|
#define ZDEM_ID BIGE_ID('Z','D','E','M')
|
|
|
|
#define ZDHD_ID BIGE_ID('Z','D','H','D')
|
|
|
|
#define VARS_ID BIGE_ID('V','A','R','S')
|
|
|
|
#define UINF_ID BIGE_ID('U','I','N','F')
|
|
|
|
#define COMP_ID BIGE_ID('C','O','M','P')
|
|
|
|
#define BODY_ID BIGE_ID('B','O','D','Y')
|
2006-09-20 02:00:19 +00:00
|
|
|
#define NETD_ID BIGE_ID('N','E','T','D')
|
2006-02-24 04:48:15 +00:00
|
|
|
|
|
|
|
#define ANGLE2SHORT(x) ((((x)/360) & 65535)
|
|
|
|
#define SHORT2ANGLE(x) ((x)*360)
|
|
|
|
|
|
|
|
|
|
|
|
struct zdemoheader_s {
|
2006-09-14 00:02:31 +00:00
|
|
|
BYTE demovermajor;
|
|
|
|
BYTE demoverminor;
|
|
|
|
BYTE minvermajor;
|
|
|
|
BYTE minverminor;
|
|
|
|
BYTE map[8];
|
2006-02-24 04:48:15 +00:00
|
|
|
unsigned int rngseed;
|
2006-09-14 00:02:31 +00:00
|
|
|
BYTE consoleplayer;
|
2006-02-24 04:48:15 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
struct usercmd_s
|
|
|
|
{
|
2006-09-14 00:02:31 +00:00
|
|
|
BYTE buttons;
|
|
|
|
BYTE pad;
|
2006-02-24 04:48:15 +00:00
|
|
|
short pitch; // up/down
|
|
|
|
short yaw; // left/right // If you haven't guessed, I just
|
|
|
|
short roll; // tilt // ripped these from Quake2's usercmd.
|
|
|
|
short forwardmove;
|
|
|
|
short sidemove;
|
|
|
|
short upmove;
|
|
|
|
};
|
|
|
|
typedef struct usercmd_s usercmd_t;
|
|
|
|
|
|
|
|
FArchive &operator<< (FArchive &arc, usercmd_t &cmd);
|
|
|
|
|
|
|
|
// When transmitted, the above message is preceded by a byte
|
|
|
|
// indicating which fields are actually present in the message.
|
|
|
|
enum
|
|
|
|
{
|
|
|
|
UCMDF_BUTTONS = 0x01,
|
|
|
|
UCMDF_PITCH = 0x02,
|
|
|
|
UCMDF_YAW = 0x04,
|
|
|
|
UCMDF_FORWARDMOVE = 0x08,
|
|
|
|
UCMDF_SIDEMOVE = 0x10,
|
|
|
|
UCMDF_UPMOVE = 0x20,
|
|
|
|
UCMDF_ROLL = 0x40
|
|
|
|
};
|
|
|
|
|
|
|
|
// When changing the following enum, be sure to update Net_SkipCommand()
|
|
|
|
// and Net_DoCommand() in d_net.cpp.
|
|
|
|
enum EDemoCommand
|
|
|
|
{
|
|
|
|
DEM_BAD, // 0 Bad command
|
|
|
|
DEM_USERCMD, // 1 Player movement
|
|
|
|
DEM_EMPTYUSERCMD, // 2 Equivalent to [DEM_USERCMD, 0]
|
|
|
|
DEM_UNDONE2, // 3
|
|
|
|
DEM_MUSICCHANGE, // 4 Followed by name of new music
|
|
|
|
DEM_PRINT, // 5 Print string to console
|
|
|
|
DEM_CENTERPRINT, // 6 Print string to middle of screen
|
|
|
|
DEM_STOP, // 7 End of demo
|
|
|
|
DEM_UINFCHANGED, // 8 User info changed
|
|
|
|
DEM_SINFCHANGED, // 9 Server/Host info changed
|
|
|
|
DEM_GENERICCHEAT, // 10 Next byte is cheat to apply (see next enum)
|
2006-04-21 05:44:21 +00:00
|
|
|
DEM_GIVECHEAT, // 11 String: item to give, Word: quantity
|
2006-02-24 04:48:15 +00:00
|
|
|
DEM_SAY, // 12 Byte: who to talk to, String: message to display
|
|
|
|
DEM_DROPPLAYER, // 13 Not implemented, takes a byte
|
|
|
|
DEM_CHANGEMAP, // 14 Name of map to change to
|
|
|
|
DEM_SUICIDE, // 15 Player wants to die
|
|
|
|
DEM_ADDBOT, // 16 Byte: player#, String: userinfo for bot
|
|
|
|
DEM_KILLBOTS, // 17 Remove all bots from the world
|
|
|
|
DEM_INVUSEALL, // 18 Use every item (panic!)
|
|
|
|
DEM_INVUSE, // 19 4 bytes: ID of item to use
|
|
|
|
DEM_PAUSE, // 20 Pause game
|
|
|
|
DEM_SAVEGAME, // 21 String: Filename, String: Description
|
|
|
|
DEM_UNDONE3, // 22
|
|
|
|
DEM_UNDONE4, // 23
|
|
|
|
DEM_UNDONE5, // 24
|
|
|
|
DEM_UNDONE6, // 25
|
|
|
|
DEM_SUMMON, // 26 String: Thing to fabricate
|
|
|
|
DEM_FOV, // 27 Byte: New FOV for all players
|
|
|
|
DEM_MYFOV, // 28 Byte: New FOV for this player
|
|
|
|
DEM_CHANGEMAP2, // 29 Byte: Position in new map, String: name of new map
|
|
|
|
DEM_UNDONE7, // 30
|
|
|
|
DEM_UNDONE8, // 31
|
|
|
|
DEM_RUNSCRIPT, // 32 Word: Script#, Byte: # of args; each arg is a 4-byte int
|
|
|
|
DEM_SINFCHANGEDXOR, // 33 Like DEM_SINFCHANGED, but data is a byte indicating how to set a bit
|
|
|
|
DEM_INVDROP, // 34 4 bytes: ID of item to drop
|
|
|
|
DEM_WARPCHEAT, // 35 4 bytes: 2 for x, 2 for y
|
|
|
|
DEM_CENTERVIEW, // 36
|
|
|
|
DEM_SUMMONFRIEND, // 37 String: Thing to fabricate
|
2006-04-21 05:44:21 +00:00
|
|
|
DEM_SPRAY, // 38 String: The decal to spray
|
2006-05-14 14:30:13 +00:00
|
|
|
DEM_CROUCH, // 39
|
2006-10-19 20:20:56 +00:00
|
|
|
DEM_RUNSCRIPT2, // 40 Same as DEM_RUNSCRIPT, but always executes
|
|
|
|
DEM_CHECKAUTOSAVE, // 41 Check if the user has autosaves enabled. Ignored for demoplayback.
|
|
|
|
DEM_DOAUTOSAVE, // 42 An autosave should be made
|
2006-10-27 03:03:34 +00:00
|
|
|
DEM_MORPHEX, // 43 String: The class to morph to.
|
2007-01-16 03:04:00 +00:00
|
|
|
DEM_SUMMONFOE, // 44 String: Thing to fabricate
|
2007-02-15 00:01:21 +00:00
|
|
|
DEM_WIPEON, // 45 Player started a screen wipe
|
|
|
|
DEM_WIPEOFF, // 46 Player finished a screen wipe
|
2007-12-23 14:23:52 +00:00
|
|
|
DEM_TAKECHEAT, // 47 String: item to take, Word: quantity
|
2006-02-24 04:48:15 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
// The following are implemented by cht_DoCheat in m_cheat.cpp
|
|
|
|
enum ECheatCommand
|
|
|
|
{
|
|
|
|
CHT_GOD,
|
|
|
|
CHT_NOCLIP,
|
|
|
|
CHT_NOTARGET,
|
|
|
|
CHT_CHAINSAW,
|
|
|
|
CHT_IDKFA,
|
|
|
|
CHT_IDFA,
|
|
|
|
CHT_BEHOLDV,
|
|
|
|
CHT_BEHOLDS,
|
|
|
|
CHT_BEHOLDI,
|
|
|
|
CHT_BEHOLDR,
|
|
|
|
CHT_BEHOLDA,
|
|
|
|
CHT_BEHOLDL,
|
|
|
|
CHT_PUMPUPI,
|
|
|
|
CHT_PUMPUPM,
|
|
|
|
CHT_PUMPUPT,
|
|
|
|
CHT_PUMPUPH,
|
|
|
|
CHT_PUMPUPP,
|
|
|
|
CHT_PUMPUPS,
|
|
|
|
CHT_IDDQD, // Same as CHT_GOD, but sets health
|
|
|
|
CHT_MASSACRE,
|
|
|
|
CHT_CHASECAM,
|
|
|
|
CHT_FLY,
|
|
|
|
CHT_MORPH,
|
|
|
|
CHT_POWER,
|
|
|
|
CHT_HEALTH,
|
|
|
|
CHT_KEYS,
|
|
|
|
CHT_TAKEWEAPS,
|
|
|
|
CHT_NOWUDIE,
|
|
|
|
CHT_ALLARTI,
|
|
|
|
CHT_PUZZLE,
|
|
|
|
CHT_MDK, // Kill actor player is aiming at
|
|
|
|
CHT_ANUBIS,
|
|
|
|
CHT_NOMOMENTUM,
|
|
|
|
CHT_DONNYTRUMP,
|
|
|
|
CHT_LEGO,
|
|
|
|
CHT_RESSURECT, // [GRB]
|
2006-10-24 02:32:12 +00:00
|
|
|
CHT_CLEARFROZENPROPS,
|
2007-10-29 20:27:40 +00:00
|
|
|
CHT_FREEZE,
|
2006-02-24 04:48:15 +00:00
|
|
|
};
|
|
|
|
|
2006-09-14 00:02:31 +00:00
|
|
|
void StartChunk (int id, BYTE **stream);
|
|
|
|
void FinishChunk (BYTE **stream);
|
|
|
|
void SkipChunk (BYTE **stream);
|
2006-02-24 04:48:15 +00:00
|
|
|
|
2006-09-14 00:02:31 +00:00
|
|
|
int UnpackUserCmd (usercmd_t *ucmd, const usercmd_t *basis, BYTE **stream);
|
|
|
|
int PackUserCmd (const usercmd_t *ucmd, const usercmd_t *basis, BYTE **stream);
|
|
|
|
int WriteUserCmdMessage (usercmd_t *ucmd, const usercmd_t *basis, BYTE **stream);
|
2006-02-24 04:48:15 +00:00
|
|
|
|
|
|
|
struct ticcmd_t;
|
|
|
|
|
2006-09-14 00:02:31 +00:00
|
|
|
int SkipTicCmd (BYTE **stream, int count);
|
|
|
|
void ReadTicCmd (BYTE **stream, int player, int tic);
|
2006-02-24 04:48:15 +00:00
|
|
|
void RunNetSpecs (int player, int buf);
|
|
|
|
|
2006-09-14 00:02:31 +00:00
|
|
|
int ReadByte (BYTE **stream);
|
|
|
|
int ReadWord (BYTE **stream);
|
|
|
|
int ReadLong (BYTE **stream);
|
|
|
|
float ReadFloat (BYTE **stream);
|
|
|
|
char *ReadString (BYTE **stream);
|
|
|
|
void WriteByte (BYTE val, BYTE **stream);
|
|
|
|
void WriteWord (short val, BYTE **stream);
|
|
|
|
void WriteLong (int val, BYTE **stream);
|
|
|
|
void WriteFloat (float val, BYTE **stream);
|
|
|
|
void WriteString (const char *string, BYTE **stream);
|
2006-02-24 04:48:15 +00:00
|
|
|
|
|
|
|
#endif //__D_PROTOCOL_H__
|