mirror of
https://github.com/ZDoom/qzdoom.git
synced 2024-11-14 16:41:07 +00:00
96d328de9b
For some files that had the Doom Source license attached but saw heavy external contributions over the years I added a special note to license all original ZDoom code under BSD.
186 lines
5.3 KiB
C++
186 lines
5.3 KiB
C++
//-----------------------------------------------------------------------------
|
|
//
|
|
// Copyright 1993-1996 id Software
|
|
// Copyright 1999-2016 Randy Heit
|
|
// Copyright 2002-2016 Christoph Oelckers
|
|
//
|
|
// 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 3 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, see http://www.gnu.org/licenses/
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
//
|
|
// DESCRIPTION:
|
|
// Networking stuff.
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
|
#ifndef __D_NET__
|
|
#define __D_NET__
|
|
|
|
#include "doomtype.h"
|
|
#include "doomdef.h"
|
|
#include "d_protocol.h"
|
|
|
|
|
|
//
|
|
// Network play related stuff.
|
|
// There is a data struct that stores network
|
|
// communication related stuff, and another
|
|
// one that defines the actual packets to
|
|
// be transmitted.
|
|
//
|
|
|
|
#define DOOMCOM_ID 0x12345678l
|
|
#define MAXNETNODES 8 // max computers in a game
|
|
#define BACKUPTICS 36 // number of tics to remember
|
|
#define MAXTICDUP 5
|
|
#define LOCALCMDTICS (BACKUPTICS*MAXTICDUP)
|
|
|
|
|
|
#ifdef DJGPP
|
|
// The DOS drivers provide a pretty skimpy buffer.
|
|
// Probably not enough.
|
|
#define MAX_MSGLEN (BACKUPTICS*10)
|
|
#else
|
|
#define MAX_MSGLEN 14000
|
|
#endif
|
|
|
|
#define CMD_SEND 1
|
|
#define CMD_GET 2
|
|
|
|
//
|
|
// Network packet data.
|
|
//
|
|
struct doomcom_t
|
|
{
|
|
uint32_t id; // should be DOOMCOM_ID
|
|
int16_t intnum; // DOOM executes an int to execute commands
|
|
|
|
// communication between DOOM and the driver
|
|
int16_t command; // CMD_SEND or CMD_GET
|
|
int16_t remotenode; // dest for send, set by get (-1 = no packet).
|
|
int16_t datalength; // bytes in doomdata to be sent
|
|
|
|
// info common to all nodes
|
|
int16_t numnodes; // console is always node 0.
|
|
int16_t ticdup; // 1 = no duplication, 2-5 = dup for slow nets
|
|
#ifdef DJGPP
|
|
int16_t pad[5]; // keep things aligned for DOS drivers
|
|
#endif
|
|
|
|
// info specific to this node
|
|
int16_t consoleplayer;
|
|
int16_t numplayers;
|
|
#ifdef DJGPP
|
|
int16_t angleoffset; // does not work, but needed to preserve
|
|
int16_t drone; // alignment for DOS drivers
|
|
#endif
|
|
|
|
// packet data to be sent
|
|
uint8_t data[MAX_MSGLEN];
|
|
|
|
};
|
|
|
|
|
|
class FDynamicBuffer
|
|
{
|
|
public:
|
|
FDynamicBuffer ();
|
|
~FDynamicBuffer ();
|
|
|
|
void SetData (const uint8_t *data, int len);
|
|
uint8_t *GetData (int *len = NULL);
|
|
|
|
private:
|
|
uint8_t *m_Data;
|
|
int m_Len, m_BufferLen;
|
|
};
|
|
|
|
extern FDynamicBuffer NetSpecs[MAXPLAYERS][BACKUPTICS];
|
|
|
|
// Create any new ticcmds and broadcast to other players.
|
|
void NetUpdate (void);
|
|
|
|
// Broadcasts special packets to other players
|
|
// to notify of game exit
|
|
void D_QuitNetGame (void);
|
|
|
|
//? how many ticks to run?
|
|
void TryRunTics (void);
|
|
|
|
//Use for checking to see if the netgame has stalled
|
|
void Net_CheckLastReceived(int);
|
|
|
|
// [RH] Functions for making and using special "ticcmds"
|
|
void Net_NewMakeTic ();
|
|
void Net_WriteByte (uint8_t);
|
|
void Net_WriteWord (short);
|
|
void Net_WriteLong (int);
|
|
void Net_WriteFloat (float);
|
|
void Net_WriteString (const char *);
|
|
void Net_WriteBytes (const uint8_t *, int len);
|
|
|
|
void Net_DoCommand (int type, uint8_t **stream, int player);
|
|
void Net_SkipCommand (int type, uint8_t **stream);
|
|
|
|
void Net_ClearBuffers ();
|
|
|
|
|
|
// Netgame stuff (buffers and pointers, i.e. indices).
|
|
|
|
// This is the interface to the packet driver, a separate program
|
|
// in DOS, but just an abstraction here.
|
|
extern doomcom_t doomcom;
|
|
|
|
extern struct ticcmd_t localcmds[LOCALCMDTICS];
|
|
|
|
extern int maketic;
|
|
extern int nettics[MAXNETNODES];
|
|
extern int netdelay[MAXNETNODES][BACKUPTICS];
|
|
extern int nodeforplayer[MAXPLAYERS];
|
|
|
|
extern ticcmd_t netcmds[MAXPLAYERS][BACKUPTICS];
|
|
extern int ticdup;
|
|
|
|
// [RH]
|
|
// New generic packet structure:
|
|
//
|
|
// Header:
|
|
// One byte with following flags.
|
|
// One byte with starttic
|
|
// One byte with master's maketic (master -> slave only!)
|
|
// If NCMD_RETRANSMIT set, one byte with retransmitfrom
|
|
// If NCMD_XTICS set, one byte with number of tics (minus 3, so theoretically up to 258 tics in one packet)
|
|
// If NCMD_QUITTERS, one byte with number of players followed by one byte with each player's consolenum
|
|
// If NCMD_MULTI, one byte with number of players followed by one byte with each player's consolenum
|
|
// - The first player's consolenum is not included in this list, because it always matches the sender
|
|
//
|
|
// For each tic:
|
|
// Two bytes with consistancy check, followed by tic data
|
|
//
|
|
// Setup packets are different, and are described just before D_ArbitrateNetStart().
|
|
|
|
#define NCMD_EXIT 0x80
|
|
#define NCMD_RETRANSMIT 0x40
|
|
#define NCMD_SETUP 0x20
|
|
#define NCMD_MULTI 0x10 // multiple players in this packet
|
|
#define NCMD_QUITTERS 0x08 // one or more players just quit (packet server only)
|
|
#define NCMD_COMPRESSED 0x04 // remainder of packet is compressed
|
|
|
|
#define NCMD_XTICS 0x03 // packet contains >2 tics
|
|
#define NCMD_2TICS 0x02 // packet contains 2 tics
|
|
#define NCMD_1TICS 0x01 // packet contains 1 tic
|
|
#define NCMD_0TICS 0x00 // packet contains 0 tics
|
|
|
|
#endif
|