summaryrefslogtreecommitdiff
path: root/src/d_net.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/d_net.c')
-rw-r--r--src/d_net.c594
1 files changed, 65 insertions, 529 deletions
diff --git a/src/d_net.c b/src/d_net.c
index 7327850d..8e6ec48e 100644
--- a/src/d_net.c
+++ b/src/d_net.c
@@ -1,7 +1,7 @@
// Emacs style mode select -*- C++ -*-
//-----------------------------------------------------------------------------
//
-// $Id: d_net.c 291 2006-01-13 23:56:00Z fraggle $
+// $Id: d_net.c 374 2006-02-19 13:42:27Z fraggle $
//
// Copyright(C) 1993-1996 Id Software, Inc.
// Copyright(C) 2005 Simon Howard
@@ -22,6 +22,14 @@
// 02111-1307, USA.
//
// $Log$
+// Revision 1.17 2006/02/19 13:42:27 fraggle
+// Move tic number expansion code to common code. Parse game data packets
+// received from the server.
+// Strip down d_net.[ch] to work through the new networking code. Remove
+// game sync code.
+// Remove i_net.[ch] as it is no longer needed.
+// Working networking!
+//
// Revision 1.16 2006/01/13 23:56:00 fraggle
// Add text-mode I/O functions.
// Use text-mode screen for the waiting screen.
@@ -89,7 +97,7 @@
//-----------------------------------------------------------------------------
-static const char rcsid[] = "$Id: d_net.c 291 2006-01-13 23:56:00Z fraggle $";
+static const char rcsid[] = "$Id: d_net.c 374 2006-02-19 13:42:27Z fraggle $";
#include "d_main.h"
@@ -97,7 +105,6 @@ static const char rcsid[] = "$Id: d_net.c 291 2006-01-13 23:56:00Z fraggle $";
#include "m_menu.h"
#include "i_system.h"
#include "i_video.h"
-#include "i_net.h"
#include "g_game.h"
#include "doomdef.h"
#include "doomstat.h"
@@ -117,7 +124,6 @@ static const char rcsid[] = "$Id: d_net.c 291 2006-01-13 23:56:00Z fraggle $";
doomcom_t* doomcom;
-doomdata_t* netbuffer; // points inside doomcom
//
@@ -132,20 +138,12 @@ doomdata_t* netbuffer; // points inside doomcom
#define RESENDCOUNT 10
#define PL_DRONE 0x80 // bit flag in doomdata->player
-ticcmd_t localcmds[BACKUPTICS];
-
ticcmd_t netcmds[MAXPLAYERS][BACKUPTICS];
-int nettics[MAXNETNODES];
-boolean nodeingame[MAXNETNODES]; // set false as nodes leave game
-boolean remoteresend[MAXNETNODES]; // set when local needs tics
-int resendto[MAXNETNODES]; // set when remote needs tics
-int resendcount[MAXNETNODES];
-
-int nodeforplayer[MAXPLAYERS];
+int nettics[MAXPLAYERS];
int maketic;
+
int lastnettic;
-int skiptics;
int ticdup;
int maxsend; // BACKUPTICS/(2*ticdup)-1
@@ -154,284 +152,6 @@ void D_ProcessEvents (void);
void G_BuildTiccmd (ticcmd_t *cmd);
void D_DoAdvanceDemo (void);
-boolean reboundpacket;
-doomdata_t reboundstore;
-
-
-
-//
-//
-//
-int NetbufferSize (void)
-{
- doomdata_t *dummy = NULL;
-
- return ((byte *) &dummy->cmds[netbuffer->numtics]) - ((byte *) dummy);
-}
-
-//
-// Checksum
-//
-unsigned NetbufferChecksum (void)
-{
- unsigned c;
- int i,l;
-
- c = 0x1234567;
-
- // FIXME -endianess?
- return 0; // byte order problems
-
- l = (NetbufferSize () - (int)&(((doomdata_t *)0)->retransmitfrom))/4;
- for (i=0 ; i<l ; i++)
- c += ((unsigned *)&netbuffer->retransmitfrom)[i] * (i+1);
-
- return c & NCMD_CHECKSUM;
-}
-
-//
-//
-//
-int ExpandTics (int low)
-{
- int delta;
-
- delta = low - (maketic&0xff);
-
- if (delta >= -64 && delta <= 64)
- return (maketic&~0xff) + low;
- if (delta > 64)
- return (maketic&~0xff) - 256 + low;
- if (delta < -64)
- return (maketic&~0xff) + 256 + low;
-
- I_Error ("ExpandTics: strange value %i at maketic %i",low,maketic);
- return 0;
-}
-
-
-
-//
-// HSendPacket
-//
-void
-HSendPacket
- (int node,
- int flags )
-{
- netbuffer->checksum = NetbufferChecksum () | flags;
-
- if (!node)
- {
- reboundstore = *netbuffer;
- reboundpacket = true;
- return;
- }
-
- if (demoplayback)
- return;
-
- if (!netgame)
- I_Error ("Tried to transmit to another node");
-
- doomcom->command = CMD_SEND;
- doomcom->remotenode = node;
- doomcom->datalength = NetbufferSize ();
-
- if (debugfile)
- {
- int i;
- int realretrans;
- if (netbuffer->checksum & NCMD_RETRANSMIT)
- realretrans = ExpandTics (netbuffer->retransmitfrom);
- else
- realretrans = -1;
-
- fprintf (debugfile,"send (%i + %i, R %i) [%i] ",
- ExpandTics(netbuffer->starttic),
- netbuffer->numtics, realretrans, doomcom->datalength);
-
- for (i=0 ; i<doomcom->datalength ; i++)
- fprintf (debugfile,"%i ",((byte *)netbuffer)[i]);
-
- fprintf (debugfile,"\n");
- }
-
- I_NetCmd ();
-}
-
-//
-// HGetPacket
-// Returns false if no packet is waiting
-//
-boolean HGetPacket (void)
-{
- if (reboundpacket)
- {
- *netbuffer = reboundstore;
- doomcom->remotenode = 0;
- reboundpacket = false;
- return true;
- }
-
- if (!netgame)
- return false;
-
- if (demoplayback)
- return false;
-
- doomcom->command = CMD_GET;
- I_NetCmd ();
-
- if (doomcom->remotenode == -1)
- return false;
-
- if (doomcom->datalength != NetbufferSize ())
- {
- if (debugfile)
- fprintf (debugfile,"bad packet length %i\n",doomcom->datalength);
- return false;
- }
-
- if (NetbufferChecksum () != (netbuffer->checksum&NCMD_CHECKSUM) )
- {
- if (debugfile)
- fprintf (debugfile,"bad packet checksum\n");
- return false;
- }
-
- if (debugfile)
- {
- int realretrans;
- int i;
-
- if (netbuffer->checksum & NCMD_SETUP)
- fprintf (debugfile,"setup packet\n");
- else
- {
- if (netbuffer->checksum & NCMD_RETRANSMIT)
- realretrans = ExpandTics (netbuffer->retransmitfrom);
- else
- realretrans = -1;
-
- fprintf (debugfile,"get %i = (%i + %i, R %i)[%i] ",
- doomcom->remotenode,
- ExpandTics(netbuffer->starttic),
- netbuffer->numtics, realretrans, doomcom->datalength);
-
- for (i=0 ; i<doomcom->datalength ; i++)
- fprintf (debugfile,"%i ",((byte *)netbuffer)[i]);
- fprintf (debugfile,"\n");
- }
- }
- return true;
-}
-
-
-//
-// GetPackets
-//
-char exitmsg[80];
-
-void GetPackets (void)
-{
- int netconsole;
- int netnode;
- ticcmd_t *src, *dest;
- int realend;
- int realstart;
-
- while ( HGetPacket() )
- {
- if (netbuffer->checksum & NCMD_SETUP)
- continue; // extra setup packet
-
- netconsole = netbuffer->player & ~PL_DRONE;
- netnode = doomcom->remotenode;
-
- // to save bytes, only the low byte of tic numbers are sent
- // Figure out what the rest of the bytes are
- realstart = ExpandTics (netbuffer->starttic);
- realend = (realstart+netbuffer->numtics);
-
- // check for exiting the game
- if (netbuffer->checksum & NCMD_EXIT)
- {
- if (!nodeingame[netnode])
- continue;
- nodeingame[netnode] = false;
- playeringame[netconsole] = false;
- strcpy (exitmsg, "Player 1 left the game");
- exitmsg[7] += netconsole;
- players[consoleplayer].message = exitmsg;
- if (demorecording)
- G_CheckDemoStatus ();
- continue;
- }
-
- // check for a remote game kill
- if (netbuffer->checksum & NCMD_KILL)
- I_Error ("Killed by network driver");
-
- nodeforplayer[netconsole] = netnode;
-
- // check for retransmit request
- if ( resendcount[netnode] <= 0
- && (netbuffer->checksum & NCMD_RETRANSMIT) )
- {
- resendto[netnode] = ExpandTics(netbuffer->retransmitfrom);
- if (debugfile)
- fprintf (debugfile,"retransmit from %i\n", resendto[netnode]);
- resendcount[netnode] = RESENDCOUNT;
- }
- else
- resendcount[netnode]--;
-
- // check for out of order / duplicated packet
- if (realend == nettics[netnode])
- continue;
-
- if (realend < nettics[netnode])
- {
- if (debugfile)
- fprintf (debugfile,
- "out of order packet (%i + %i)\n" ,
- realstart,netbuffer->numtics);
- continue;
- }
-
- // check for a missed packet
- if (realstart > nettics[netnode])
- {
- // stop processing until the other system resends the missed tics
- if (debugfile)
- fprintf (debugfile,
- "missed tics from %i (%i - %i)\n",
- netnode, realstart, nettics[netnode]);
- remoteresend[netnode] = true;
- continue;
- }
-
- // update command store from the packet
- {
- int start;
-
- remoteresend[netnode] = false;
-
- start = nettics[netnode] - realstart;
- src = &netbuffer->cmds[start];
-
- while (nettics[netnode] < realend)
- {
- dest = &netcmds[netconsole][nettics[netnode]%BACKUPTICS];
- nettics[netnode]++;
- *dest = *src;
- src++;
- }
- }
- }
-}
-
//
// NetUpdate
@@ -452,178 +172,46 @@ void NetUpdate (void)
NET_CL_Run();
NET_SV_Run();
-
+
// check time
nowtime = I_GetTime ()/ticdup;
newtics = nowtime - gametime;
gametime = nowtime;
-
+
if (newtics <= 0) // nothing new to update
- goto listen;
+ return;
- if (skiptics <= newtics)
- {
- newtics -= skiptics;
- skiptics = 0;
- }
- else
- {
- skiptics -= newtics;
- newtics = 0;
- }
-
-
- netbuffer->player = consoleplayer;
-
// build new ticcmds for console player
gameticdiv = gametic/ticdup;
+
for (i=0 ; i<newtics ; i++)
{
+ ticcmd_t cmd;
+
+ // Never go more than a second ahead
+
+ if (maketic - gameticdiv > 35)
+ break;
+
I_StartTic ();
D_ProcessEvents ();
- if (maketic - gameticdiv >= BACKUPTICS/2-1)
- break; // can't hold any more
//printf ("mk:%i ",maketic);
- G_BuildTiccmd (&localcmds[maketic%BACKUPTICS]);
- maketic++;
- }
-
-
- if (singletics)
- return; // singletic update is syncronous
-
- // send the packet to the other nodes
- for (i=0 ; i<doomcom->numnodes ; i++)
- if (nodeingame[i])
- {
- netbuffer->starttic = realstart = resendto[i];
- netbuffer->numtics = maketic - realstart;
- if (netbuffer->numtics > BACKUPTICS)
- I_Error ("NetUpdate: netbuffer->numtics > BACKUPTICS");
-
- resendto[i] = maketic - doomcom->extratics;
-
- for (j=0 ; j< netbuffer->numtics ; j++)
- netbuffer->cmds[j] =
- localcmds[(realstart+j)%BACKUPTICS];
-
- if (remoteresend[i])
- {
- netbuffer->retransmitfrom = nettics[i];
- HSendPacket (i, NCMD_RETRANSMIT);
- }
- else
- {
- netbuffer->retransmitfrom = 0;
- HSendPacket (i, 0);
- }
- }
-
- // listen for other packets
- listen:
- GetPackets ();
-}
-
+ G_BuildTiccmd(&cmd);
+ if (netgame)
+ {
+ NET_CL_SendTiccmd(&cmd, maketic);
+ }
-//
-// CheckAbort
-//
-void CheckAbort (void)
-{
- event_t *ev;
- int stoptic;
-
- stoptic = I_GetTime () + 2;
- while (I_GetTime() < stoptic)
- I_StartTic ();
-
- I_StartTic ();
-
- while ((ev = D_PopEvent()) != NULL)
- {
- if (ev->type == ev_keydown && ev->data1 == KEY_ESCAPE)
- I_Error ("Network game synchronization aborted.");
- }
-}
-
+ netcmds[consoleplayer][maketic % BACKUPTICS] = cmd;
-//
-// D_ArbitrateNetStart
-//
-void D_ArbitrateNetStart (void)
-{
- int i;
- boolean gotinfo[MAXNETNODES];
-
- autostart = true;
- memset (gotinfo,0,sizeof(gotinfo));
-
- if (doomcom->consoleplayer)
- {
- // listen for setup info from key player
- printf ("listening for network start info...\n");
- while (1)
- {
- CheckAbort ();
- if (!HGetPacket ())
- continue;
- if (netbuffer->checksum & NCMD_SETUP)
- {
- if (netbuffer->player != DOOM_VERSION)
- I_Error ("Different DOOM versions cannot play a net game!");
- startskill = netbuffer->retransmitfrom & 15;
- deathmatch = (netbuffer->retransmitfrom & 0xc0) >> 6;
- nomonsters = (netbuffer->retransmitfrom & 0x20) > 0;
- respawnparm = (netbuffer->retransmitfrom & 0x10) > 0;
- startmap = netbuffer->starttic & 0x3f;
- startepisode = netbuffer->starttic >> 6;
- return;
- }
- }
+ ++maketic;
+ nettics[consoleplayer] = maketic;
}
- else
- {
- // key player, send the setup info
- printf ("sending network start info...\n");
- do
- {
- CheckAbort ();
- for (i=0 ; i<doomcom->numnodes ; i++)
- {
- netbuffer->retransmitfrom = startskill;
- if (deathmatch)
- netbuffer->retransmitfrom |= (deathmatch<<6);
- if (nomonsters)
- netbuffer->retransmitfrom |= 0x20;
- if (respawnparm)
- netbuffer->retransmitfrom |= 0x10;
- netbuffer->starttic = startepisode * 64 + startmap;
- netbuffer->player = DOOM_VERSION;
- netbuffer->numtics = 0;
- HSendPacket (i, NCMD_SETUP);
- }
+}
-#if 1
- for(i = 10 ; i && HGetPacket(); --i)
- {
- if((netbuffer->player&0x7f) < MAXNETNODES)
- gotinfo[netbuffer->player&0x7f] = true;
- }
-#else
- while (HGetPacket ())
- {
- gotinfo[netbuffer->player&0x7f] = true;
- }
-#endif
- for (i=1 ; i<doomcom->numnodes ; i++)
- if (!gotinfo[i])
- break;
- } while (i < doomcom->numnodes);
- }
-}
//
// D_CheckNetGame
@@ -634,7 +222,22 @@ extern int viewangleoffset;
void D_CheckNetGame (void)
{
net_addr_t *addr = NULL;
- int i;
+ int i;
+ int num_players;
+
+ // default values for single player
+
+ consoleplayer = 0;
+ netgame = false;
+ ticdup = 1;
+
+ for (i=0; i<MAXPLAYERS; i++)
+ {
+ playeringame[i] = false;
+ nettics[i] = 0;
+ }
+
+ playeringame[0] = true;
// temporary hack
@@ -647,7 +250,7 @@ void D_CheckNetGame (void)
if (M_CheckParm("-client") > 0)
{
- addr = net_sdl_module.ResolveAddress("127.0.0.1");
+ addr = net_sdl_module.ResolveAddress("localhost");
}
if (addr != NULL)
@@ -664,40 +267,19 @@ void D_CheckNetGame (void)
}
}
- for (i=0 ; i<MAXNETNODES ; i++)
+ num_players = 0;
+
+ for (i=0; i<MAXPLAYERS; ++i)
{
- nodeingame[i] = false;
- nettics[i] = 0;
- remoteresend[i] = false; // set when local needs tics
- resendto[i] = 0; // which tic to start sending
+ if (playeringame[i])
+ ++num_players;
}
-
- // I_InitNetwork sets doomcom and netgame
- I_InitNetwork ();
- if (doomcom->id != DOOMCOM_ID)
- I_Error ("Doomcom buffer invalid!");
-
- netbuffer = &doomcom->data;
- consoleplayer = displayplayer = doomcom->consoleplayer;
- if (netgame)
- D_ArbitrateNetStart ();
printf ("startskill %i deathmatch: %i startmap: %i startepisode: %i\n",
startskill, deathmatch, startmap, startepisode);
- // read values out of doomcom
- ticdup = doomcom->ticdup;
- maxsend = BACKUPTICS/(2*ticdup)-1;
- if (maxsend<1)
- maxsend = 1;
-
- for (i=0 ; i<doomcom->numplayers ; i++)
- playeringame[i] = true;
- for (i=0 ; i<doomcom->numnodes ; i++)
- nodeingame[i] = true;
-
printf ("player %i of %i (%i nodes)\n",
- consoleplayer+1, doomcom->numplayers, doomcom->numnodes);
+ consoleplayer+1, num_players, num_players);
}
@@ -716,20 +298,6 @@ void D_QuitNetGame (void)
NET_SV_Shutdown();
NET_CL_Disconnect();
-
- if (!netgame || !usergame || consoleplayer == -1 || demoplayback)
- return;
-
- // send a bunch of packets for security
- netbuffer->player = consoleplayer;
- netbuffer->numtics = 0;
- for (i=0 ; i<4 ; i++)
- {
- for (j=1 ; j<doomcom->numnodes ; j++)
- if (nodeingame[j])
- HSendPacket (j, NCMD_EXIT);
- I_WaitVBL (1);
- }
}
@@ -737,9 +305,6 @@ void D_QuitNetGame (void)
//
// TryRunTics
//
-int frametics[4];
-int frameon;
-int frameskip[4];
int oldnettics;
extern boolean advancedemo;
@@ -765,14 +330,15 @@ void TryRunTics (void)
lowtic = INT_MAX;
numplaying = 0;
- for (i=0 ; i<doomcom->numnodes ; i++)
+
+ for (i=0; i<MAXPLAYERS; ++i)
{
- if (nodeingame[i])
- {
- numplaying++;
- if (nettics[i] < lowtic)
- lowtic = nettics[i];
- }
+ if (playeringame[i])
+ {
+ ++numplaying;
+ if (nettics[i] < lowtic)
+ lowtic = nettics[i];
+ }
}
availabletics = lowtic - gametic/ticdup;
@@ -787,40 +353,10 @@ void TryRunTics (void)
if (counts < 1)
counts = 1;
- frameon++;
-
if (debugfile)
fprintf (debugfile,
"=======real: %i avail: %i game: %i\n",
realtics, availabletics,counts);
-
- if (!demoplayback)
- {
- // ideally nettics[0] should be 1 - 3 tics above lowtic
- // if we are consistantly slower, speed up time
- for (i=0 ; i<MAXPLAYERS ; i++)
- if (playeringame[i])
- break;
- if (consoleplayer == i)
- {
- // the key player does not adapt
- }
- else
- {
- if (nettics[0] <= nettics[nodeforplayer[i]])
- {
- gametime--;
- // printf ("-");
- }
- frameskip[frameon&3] = (oldnettics > nettics[nodeforplayer[i]]);
- oldnettics = nettics[0];
- if (frameskip[0] && frameskip[1] && frameskip[2] && frameskip[3])
- {
- skiptics = 1;
- // printf ("+");
- }
- }
- }// demoplayback
// wait for new tics if needed
while (lowtic < gametic/ticdup + counts)
@@ -828,8 +364,8 @@ void TryRunTics (void)
NetUpdate ();
lowtic = INT_MAX;
- for (i=0 ; i<doomcom->numnodes ; i++)
- if (nodeingame[i] && nettics[i] < lowtic)
+ for (i=0; i<MAXPLAYERS; ++i)
+ if (playeringame[i] && nettics[i] < lowtic)
lowtic = nettics[i];
if (lowtic < gametic/ticdup)