1 /* Emacs style mode select -*- C++ -*- 2 *----------------------------------------------------------------------------- 3 * 4 * 5 * PrBoom: a Doom port merged with LxDoom and LSDLDoom 6 * based on BOOM, a modified and improved DOOM engine 7 * Copyright (C) 1999 by 8 * id Software, Chi Hoang, Lee Killough, Jim Flynn, Rand Phares, Ty Halderman 9 * Copyright (C) 1999-2000 by 10 * Jess Haas, Nicolas Kalkhof, Colin Phipps, Florian Schulze 11 * Copyright 2005, 2006 by 12 * Florian Schulze, Colin Phipps, Neil Stevens, Andrey Budko 13 * 14 * This program is free software; you can redistribute it and/or 15 * modify it under the terms of the GNU General Public License 16 * as published by the Free Software Foundation; either version 2 17 * of the License, or (at your option) any later version. 18 * 19 * This program is distributed in the hope that it will be useful, 20 * but WITHOUT ANY WARRANTY; without even the implied warranty of 21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 22 * GNU General Public License for more details. 23 * 24 * You should have received a copy of the GNU General Public License 25 * along with this program; if not, write to the Free Software 26 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 27 * 02111-1307, USA. 28 * 29 * DESCRIPTION: 30 * Networking stuff. 31 * 32 *-----------------------------------------------------------------------------*/ 33 34 35 #ifndef __D_NET__ 36 #define __D_NET__ 37 38 #include "d_player.h" 39 40 41 #ifdef __GNUG__ 42 #pragma interface 43 #endif 44 45 46 // 47 // Network play related stuff. 48 // There is a data struct that stores network 49 // communication related stuff, and another 50 // one that defines the actual packets to 51 // be transmitted. 52 // 53 54 #define DOOMCOM_ID 0x12345678l 55 56 // Max computers/players in a game. 57 #define MAXNETNODES 8 58 59 60 typedef enum 61 { 62 CMD_SEND = 1, 63 CMD_GET = 2 64 65 } command_t; 66 67 68 // 69 // Network packet data. 70 // 71 typedef struct 72 { 73 // High bit is retransmit request. 74 unsigned checksum; 75 // Only valid if NCMD_RETRANSMIT. 76 byte retransmitfrom; 77 78 byte starttic; 79 byte player; 80 byte numtics; 81 ticcmd_t cmds[BACKUPTICS]; 82 83 } doomdata_t; 84 85 // 86 // Startup packet difference 87 // SG: 4/12/98 88 // Added so we can send more startup data to synch things like 89 // bobbing, recoil, etc. 90 // this is just mapped over the ticcmd_t array when setup packet is sent 91 // 92 // Note: the original code takes care of startskill, deathmatch, nomonsters 93 // respawn, startepisode, startmap 94 // Note: for phase 1 we need to add monsters_remember, variable_friction, 95 // weapon_recoil, allow_pushers, over_under, player_bobbing, 96 // fastparm, demo_insurance, and the rngseed 97 //Stick all options into bytes so we don't need to mess with bitfields 98 //WARNING: make sure this doesn't exceed the size of the ticcmds area! 99 //sizeof(ticcmd_t)*BACKUPTICS 100 //This is the current length of our extra stuff 101 // 102 //killough 5/2/98: this should all be replaced by calls to G_WriteOptions() 103 //and G_ReadOptions(), which were specifically designed to set up packets. 104 //By creating a separate struct and functions to read/write the options, 105 //you now have two functions and data to maintain instead of just one. 106 //If the array in g_game.c which G_WriteOptions()/G_ReadOptions() operates 107 //on, is too large (more than sizeof(ticcmd_t)*BACKUPTICS), it can 108 //either be shortened, or the net code needs to divide it up 109 //automatically into packets. The STARTUPLEN below is non-portable. 110 //There's a portable way to do it without having to know the sizes. 111 112 #define STARTUPLEN 12 113 typedef struct 114 { 115 byte monsters_remember; 116 byte variable_friction; 117 byte weapon_recoil; 118 byte allow_pushers; 119 byte over_under; 120 byte player_bobbing; 121 byte fastparm; 122 byte demo_insurance; 123 unsigned int rngseed; 124 char filler[sizeof(ticcmd_t)*BACKUPTICS-STARTUPLEN]; 125 } startup_t; 126 127 typedef enum { 128 // Leave space, so low values corresponding to normal netgame setup packets can be ignored 129 nm_plcolour = 3, 130 nm_savegamename = 4, 131 } netmisctype_t; 132 133 typedef struct 134 { 135 netmisctype_t type; 136 size_t len; 137 byte value[sizeof(ticcmd_t)*BACKUPTICS - sizeof(netmisctype_t) - sizeof(size_t)]; 138 } netmisc_t; 139 140 typedef struct 141 { 142 // Supposed to be DOOMCOM_ID? 143 long id; 144 145 // DOOM executes an int to execute commands. 146 short intnum; 147 // Communication between DOOM and the driver. 148 // Is CMD_SEND or CMD_GET. 149 short command; 150 // Is dest for send, set by get (-1 = no packet). 151 short remotenode; 152 153 // Number of bytes in doomdata to be sent 154 short datalength; 155 156 // Info common to all nodes. 157 // Console is allways node 0. 158 short numnodes; 159 // Flag: 1 = no duplication, 2-5 = dup for slow nets. 160 short ticdup; 161 // Flag: 1 = send a backup tic in every packet. 162 short extratics; 163 // Flag: 1 = deathmatch. 164 short deathmatch; 165 // Flag: -1 = new game, 0-5 = load savegame 166 short savegame; 167 short episode; // 1-3 168 short map; // 1-9 169 short skill; // 1-5 170 171 // Info specific to this node. 172 short consoleplayer; 173 short numplayers; 174 175 // These are related to the 3-display mode, 176 // in which two drones looking left and right 177 // were used to render two additional views 178 // on two additional computers. 179 // Probably not operational anymore. 180 // 1 = left, 0 = center, -1 = right 181 short angleoffset; 182 // 1 = drone 183 short drone; 184 185 // The packet data to be sent. 186 doomdata_t data; 187 188 } doomcom_t; 189 190 // Create any new ticcmds and broadcast to other players. 191 #ifdef HAVE_NET 192 void NetUpdate (void); 193 #else 194 void D_BuildNewTiccmds(void); 195 #endif 196 197 //? how many ticks to run? 198 void TryRunTics (void); 199 200 // CPhipps - move to header file 201 void D_InitNetGame (void); // This does the setup 202 void D_CheckNetGame(void); // This waits for game start 203 204 // CPhipps - misc info broadcast 205 void D_NetSendMisc(netmisctype_t type, size_t len, void* data); 206 207 // CPhipps - ask server for a wad file we need 208 dboolean D_NetGetWad(const char* name); 209 210 // Netgame stuff (buffers and pointers, i.e. indices). 211 extern doomcom_t *doomcom; 212 extern doomdata_t *netbuffer; // This points inside doomcom. 213 214 #endif 215