365 lines
7.6 KiB
C
365 lines
7.6 KiB
C
/*
|
|
Copyright (C) 1994-1995 Apogee Software, Ltd.
|
|
|
|
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 the Free Software
|
|
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
|
|
*/
|
|
|
|
//***************************************************************************
|
|
//
|
|
// RT_NET.H - Network stuff
|
|
//
|
|
//***************************************************************************
|
|
|
|
#ifndef _rt_net_public
|
|
#define _rt_net_public
|
|
|
|
#include "rottnet.h"
|
|
|
|
#define MAXCMDS 256
|
|
|
|
#define COM_DELTA 1
|
|
#define COM_REQUEST 2
|
|
#define COM_FIXUP 3
|
|
#define COM_TEXT 4
|
|
#define COM_PAUSE 5
|
|
#define COM_QUIT 6
|
|
#define COM_SYNC 7
|
|
#define COM_REMRID 8
|
|
#define COM_RESPAWN 10
|
|
#define COM_UNPAUSE 11
|
|
#define COM_SERVER 12
|
|
#define COM_START 13
|
|
#define COM_GAMEDESC 15
|
|
#define COM_GAMEPLAY 16
|
|
#define COM_GAMEMASTER 17
|
|
#define COM_GAMEACK 18
|
|
#define COM_ENDGAME 19
|
|
#define COM_SYNCTIME 20
|
|
#if (SYNCCHECK==1)
|
|
#define COM_SYNCCHECK 21
|
|
#endif
|
|
#define COM_SOUNDANDDELTA 22
|
|
#define COM_EXIT 23
|
|
#define COM_GAMEEND 24
|
|
#define COM_DELTANULL 25
|
|
|
|
#define COM_MAXTEXTSTRINGLENGTH 33
|
|
|
|
// Sound defines for Remote ridicule
|
|
|
|
#define COM_SOUND_START_TRANSMISSION (0xff)
|
|
#define COM_SOUND_END_TRANSMISSION (0xfe)
|
|
#define COM_SOUND_NORMAL_TRANSMISSION (0xfd)
|
|
#define COM_SOUND_BUFFERSIZE 256
|
|
|
|
// Demo Delta Structure
|
|
typedef struct DemoType {
|
|
int time;
|
|
short momx;
|
|
short momy;
|
|
word dangle;
|
|
word buttons;
|
|
} DemoType;
|
|
|
|
// Demo Header Structure
|
|
typedef struct DemoHeaderType {
|
|
gametype demostate;
|
|
} DemoHeaderType;
|
|
|
|
// Movement Queue Structure
|
|
typedef struct MoveType {
|
|
byte type;
|
|
int time;
|
|
short momx;
|
|
short momy;
|
|
word dangle;
|
|
word buttons;
|
|
char Sounddata[];
|
|
} MoveType;
|
|
|
|
typedef struct NullMoveType {
|
|
byte type;
|
|
int time;
|
|
} NullMoveType;
|
|
|
|
typedef struct {
|
|
|
|
void * Commands[MAXCMDS];
|
|
|
|
} CommandType;
|
|
|
|
typedef struct {
|
|
|
|
byte CommandStates[MAXCMDS];
|
|
|
|
} CommandStatusType;
|
|
|
|
typedef MoveType COM_SoundAndDeltaType;
|
|
|
|
typedef struct {
|
|
byte type;
|
|
byte data[COM_SOUND_BUFFERSIZE];
|
|
} COM_SoundType;
|
|
|
|
typedef struct {
|
|
byte type;
|
|
int synctime;
|
|
} COM_SyncType;
|
|
|
|
typedef struct {
|
|
byte type;
|
|
int time;
|
|
int synctime;
|
|
int x;
|
|
int y;
|
|
int z;
|
|
word angle;
|
|
word randomindex;
|
|
} COM_CheckSyncType;
|
|
|
|
typedef struct {
|
|
byte type;
|
|
int time;
|
|
byte numpackets;
|
|
byte data;
|
|
} COM_ServerHeaderType;
|
|
|
|
typedef struct {
|
|
byte type;
|
|
int time;
|
|
byte numpackets;
|
|
} COM_RequestType;
|
|
|
|
typedef struct {
|
|
byte type;
|
|
int time;
|
|
byte towho;
|
|
char string[COM_MAXTEXTSTRINGLENGTH];
|
|
} COM_TextType;
|
|
|
|
#define MSG_DIRECTED_TO_ALL 255
|
|
#define MSG_DIRECTED_TO_TEAM 254
|
|
|
|
typedef struct {
|
|
byte type;
|
|
int time;
|
|
byte player;
|
|
byte num;
|
|
byte towho;
|
|
} COM_RemoteRidiculeType;
|
|
|
|
typedef struct {
|
|
byte type;
|
|
int time;
|
|
byte numpackets;
|
|
byte data;
|
|
} COM_FixupType;
|
|
|
|
typedef struct {
|
|
byte type;
|
|
int time;
|
|
} COM_QuitType;
|
|
|
|
typedef struct {
|
|
byte type;
|
|
int time;
|
|
} COM_ExitType;
|
|
|
|
typedef struct {
|
|
byte type;
|
|
int time;
|
|
} COM_GameEndType;
|
|
|
|
typedef struct {
|
|
byte character; // which character
|
|
byte uniformcolor; // which color
|
|
char codename[MAXCODENAMELENGTH]; // codename
|
|
} COM_PlayerDescriptionType;
|
|
|
|
typedef struct {
|
|
byte type;
|
|
byte player; // which player
|
|
byte violence;
|
|
byte Product;
|
|
unsigned Version;
|
|
|
|
COM_PlayerDescriptionType playerdescription;
|
|
} COM_GamePlayerType;
|
|
|
|
typedef struct {
|
|
byte type;
|
|
byte level;
|
|
word mapcrc;
|
|
byte violence;
|
|
byte Product;
|
|
byte mode;
|
|
unsigned Version;
|
|
boolean teamplay;
|
|
specials SpecialsTimes;
|
|
battle_type options;
|
|
char battlefilename[20];
|
|
int randomseed;
|
|
boolean ludicrousgibs;
|
|
COM_PlayerDescriptionType players[MAXPLAYERS];
|
|
} COM_GameMasterType;
|
|
|
|
typedef struct {
|
|
byte type;
|
|
byte player; // which player
|
|
} COM_GameAckType;
|
|
|
|
typedef struct {
|
|
byte type;
|
|
int time;
|
|
} COM_EndGameType;
|
|
|
|
typedef struct {
|
|
byte type;
|
|
int time;
|
|
} COM_RespawnType;
|
|
|
|
typedef struct {
|
|
byte type;
|
|
int time;
|
|
} COM_PauseType;
|
|
|
|
typedef struct {
|
|
byte type;
|
|
int time;
|
|
} COM_UnPauseType;
|
|
|
|
#endif
|
|
|
|
|
|
//
|
|
// RT_NET.C packet size stuff
|
|
//
|
|
|
|
//****************************************************************************
|
|
//
|
|
// GetPacketSize ()
|
|
//
|
|
//****************************************************************************
|
|
|
|
int GetPacketSize (void * pkt)
|
|
{
|
|
int size;
|
|
|
|
switch (((MoveType *)pkt)->type)
|
|
{
|
|
case COM_DELTA:
|
|
size=sizeof(MoveType);
|
|
break;
|
|
case COM_DELTANULL:
|
|
size=sizeof(NullMoveType);
|
|
break;
|
|
case COM_REQUEST:
|
|
size=sizeof(COM_RequestType);
|
|
break;
|
|
case COM_FIXUP:
|
|
size=sizeof(COM_FixupType);
|
|
break;
|
|
case COM_TEXT:
|
|
size=sizeof(COM_TextType);
|
|
break;
|
|
case COM_PAUSE:
|
|
size=sizeof(COM_PauseType);
|
|
break;
|
|
case COM_QUIT:
|
|
size=sizeof(COM_QuitType);
|
|
break;
|
|
case COM_EXIT:
|
|
size=sizeof(COM_ExitType);
|
|
break;
|
|
case COM_REMRID:
|
|
size=sizeof(COM_RemoteRidiculeType);
|
|
break;
|
|
case COM_RESPAWN:
|
|
size=sizeof(COM_RespawnType);
|
|
break;
|
|
case COM_UNPAUSE:
|
|
size=sizeof(COM_UnPauseType);
|
|
break;
|
|
case COM_SERVER:
|
|
size=sizeof(COM_ServerHeaderType);
|
|
size-=sizeof(byte);
|
|
break;
|
|
case COM_GAMEDESC:
|
|
size=sizeof(COM_GamePlayerType);
|
|
break;
|
|
case COM_GAMEEND:
|
|
size=sizeof(COM_GameEndType);
|
|
break;
|
|
case COM_GAMEPLAY:
|
|
size=DUMMYPACKETSIZE;
|
|
break;
|
|
case COM_GAMEACK:
|
|
size=sizeof(COM_GameAckType);
|
|
break;
|
|
case COM_GAMEMASTER:
|
|
size=sizeof(COM_GameMasterType);
|
|
break;
|
|
case COM_ENDGAME:
|
|
size=sizeof(COM_EndGameType);
|
|
break;
|
|
case COM_SYNCTIME:
|
|
size=sizeof(COM_SyncType);
|
|
break;
|
|
#if (SYNCCHECK == 1)
|
|
case COM_SYNCCHECK:
|
|
size=sizeof(COM_CheckSyncType);
|
|
break;
|
|
#endif
|
|
case COM_SOUNDANDDELTA:
|
|
size=sizeof(MoveType)+sizeof(COM_SoundType);
|
|
break;
|
|
default:
|
|
Error("Unhandled packet type in GetPacketSize type=%ld",((MoveType *)pkt)->type);
|
|
break;
|
|
}
|
|
|
|
return size;
|
|
}
|
|
|
|
//****************************************************************************
|
|
//
|
|
// GetServerPacketSize ()
|
|
//
|
|
//****************************************************************************
|
|
|
|
int GetServerPacketSize (void * pkt)
|
|
{
|
|
int i;
|
|
byte * ptr;
|
|
COM_ServerHeaderType * serverpkt;
|
|
|
|
serverpkt=(COM_ServerHeaderType *)pkt;
|
|
if (serverpkt->type==COM_SERVER)
|
|
{
|
|
ptr=&serverpkt->data;
|
|
|
|
for (i=0;i<serverpkt->numpackets;i++)
|
|
{
|
|
ptr+=GetPacketSize(ptr);
|
|
}
|
|
return (ptr-pkt);
|
|
}
|
|
else
|
|
return GetPacketSize(pkt);
|
|
}
|
|
|