ref: bef7af18c671dbe1ff4d822206a15f4bcab56e67
parent: 76d69779c9bcebec6a2188d6b9e2483240e26a8a
author: Simon Howard <[email protected]>
date: Sun Feb 19 08:42:27 EST 2006
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! Subversion-branch: /trunk/chocolate-doom Subversion-revision: 374
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -43,7 +43,6 @@
hu_lib.c hu_lib.h \
hu_stuff.c hu_stuff.h \
i_main.c \
-i_net.c i_net.h \
info.c info.h \
i_sound.c i_sound.h \
i_system.c i_system.h \
--- 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 @@
#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 @@
doomcom_t* doomcom;
-doomdata_t* netbuffer; // points inside doomcom
//
@@ -132,20 +138,12 @@
#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 nettics[MAXPLAYERS];
-int nodeforplayer[MAXPLAYERS];
-
int maketic;
+
int lastnettic;
-int skiptics;
int ticdup;
int maxsend; // BACKUPTICS/(2*ticdup)-1
@@ -154,286 +152,8 @@
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
// Builds ticcmds for console player,
// sends out a packet
@@ -452,180 +172,48 @@
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++;
- }
+ G_BuildTiccmd(&cmd);
+ if (netgame)
+ {
+ NET_CL_SendTiccmd(&cmd, 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");
+ netcmds[consoleplayer][maketic % BACKUPTICS] = cmd;
- 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 ();
+ ++maketic;
+ nettics[consoleplayer] = 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.");
- }
-}
-
-
-//
-// 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;
- }
- }
- }
- 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
// Works out player numbers among the net participants
//
@@ -634,8 +222,23 @@
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
if (M_CheckParm("-server") > 0)
@@ -647,7 +250,7 @@
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 @@
}
}
- 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 @@
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 @@
//
// TryRunTics
//
-int frametics[4];
-int frameon;
-int frameskip[4];
int oldnettics;
extern boolean advancedemo;
@@ -765,14 +330,15 @@
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 @@
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 @@
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)
--- a/src/doomstat.h
+++ b/src/doomstat.h
@@ -1,7 +1,7 @@
// Emacs style mode select -*- C++ -*-
//-----------------------------------------------------------------------------
//
-// $Id: doomstat.h 223 2005-10-24 18:50:39Z fraggle $
+// $Id: doomstat.h 374 2006-02-19 13:42:27Z fraggle $
//
// Copyright(C) 1993-1996 Id Software, Inc.
// Copyright(C) 2005 Simon Howard
@@ -282,11 +282,10 @@
extern doomdata_t* netbuffer;
-extern ticcmd_t localcmds[BACKUPTICS];
extern int rndindex;
extern int maketic;
-extern int nettics[MAXNETNODES];
+extern int nettics[MAXPLAYERS];
extern ticcmd_t netcmds[MAXPLAYERS][BACKUPTICS];
extern int ticdup;
@@ -297,6 +296,14 @@
//-----------------------------------------------------------------------------
//
// $Log$
+// Revision 1.10 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.9 2005/10/24 18:50:39 fraggle
// Allow the game version to emulate to be specified from the command line
// and set compatibility options accordingly.
--- a/src/g_game.c
+++ b/src/g_game.c
@@ -1,7 +1,7 @@
// Emacs style mode select -*- C++ -*-
//-----------------------------------------------------------------------------
//
-// $Id: g_game.c 367 2006-02-15 12:57:58Z fraggle $
+// $Id: g_game.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.25 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.24 2006/02/15 12:57:58 fraggle
// Remove the savegame buffer entirely. Keep the old savegame size limit
// bug add a "vanilla_savegame_limit" config file option which allows
@@ -119,7 +127,7 @@
static const char
-rcsid[] = "$Id: g_game.c 367 2006-02-15 12:57:58Z fraggle $";
+rcsid[] = "$Id: g_game.c 374 2006-02-19 13:42:27Z fraggle $";
#include <string.h>
#include <stdlib.h>
@@ -824,6 +832,7 @@
if (netgame && !netdemo && !(gametic%ticdup) )
{
+ /*
if (gametic > BACKUPTICS
&& consistancy[i][buf] != cmd->consistancy)
{
@@ -830,6 +839,7 @@
I_Error ("consistency failure (%i should be %i)",
cmd->consistancy, consistancy[i][buf]);
}
+ */
if (players[i].mo)
consistancy[i][buf] = players[i].mo->x;
else
--- a/src/i_net.c
+++ /dev/null
@@ -1,364 +1,0 @@
-// Emacs style mode select -*- C++ -*-
-//-----------------------------------------------------------------------------
-//
-// $Id: i_net.c 58 2005-08-30 22:15:11Z fraggle $
-//
-// Copyright(C) 1993-1996 Id Software, Inc.
-// Copyright(C) 2005 Simon Howard
-//
-// 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.
-//
-// $Log$
-// Revision 1.7 2005/08/30 22:15:11 fraggle
-// More Windows fixes
-//
-// Revision 1.6 2005/08/30 22:11:10 fraggle
-// Windows fixes
-//
-// Revision 1.5 2005/08/12 16:54:15 fraggle
-// Port network code to use SDL_net
-//
-// Revision 1.4 2005/08/04 18:42:15 fraggle
-// Silence compiler warnings
-//
-// Revision 1.3 2005/07/23 18:56:07 fraggle
-// Remove unneccessary pragmas
-//
-// Revision 1.2 2005/07/23 16:44:55 fraggle
-// Update copyright to GNU GPL
-//
-// Revision 1.1.1.1 2005/07/23 16:20:32 fraggle
-// Initial import
-//
-//
-// DESCRIPTION:
-//
-//-----------------------------------------------------------------------------
-
-static const char
-rcsid[] = "$Id: i_net.c 58 2005-08-30 22:15:11Z fraggle $";
-
-#include <stdlib.h>
-#include <string.h>
-#include <stdio.h>
-
-#include <SDL_net.h>
-
-#include "i_system.h"
-#include "d_event.h"
-#include "d_net.h"
-#include "m_argv.h"
-
-#include "doomstat.h"
-
-#include "i_net.h"
-
-
-
-
-
-void NetSend (void);
-boolean NetListen (void);
-
-
-//
-// NETWORKING
-//
-
-int DOOMPORT = 8626;
-
-#ifndef NO_SDL_NET
-
-static UDPsocket udpsocket;
-static UDPpacket *packet;
-
-static IPaddress sendaddress[MAXNETNODES];
-
-void (*netget) (void);
-void (*netsend) (void);
-
-
-unsigned short host_to_net16(unsigned int value)
-{
- union
- {
- unsigned short s;
- char b[2];
- } data;
-
- SDLNet_Write16(value, data.b);
-
- return data.s;
-}
-
-unsigned short net_to_host16(unsigned int value)
-{
- unsigned short s = value;
-
- return SDLNet_Read16(&s);
-}
-
-unsigned long host_to_net32(unsigned int value)
-{
- union
- {
- unsigned long l;
- char b[4];
- } data;
-
- SDLNet_Write32(value, data.b);
-
- return data.l;
-}
-
-unsigned long net_to_host32(unsigned int value)
-{
- union
- {
- unsigned long l;
- char b[4];
- } data;
-
- data.l = value;
-
- return SDLNet_Read32(data.b);
-}
-
-
-//
-// PacketSend
-//
-void PacketSend (void)
-{
- int c;
- doomdata_t *sw;
-
- sw = (doomdata_t *) packet->data;
-
- // byte swap
- sw->checksum = host_to_net32(netbuffer->checksum);
- sw->player = netbuffer->player;
- sw->retransmitfrom = netbuffer->retransmitfrom;
- sw->starttic = netbuffer->starttic;
- sw->numtics = netbuffer->numtics;
-
- for (c=0 ; c< netbuffer->numtics ; c++)
- {
- sw->cmds[c].forwardmove = netbuffer->cmds[c].forwardmove;
- sw->cmds[c].sidemove = netbuffer->cmds[c].sidemove;
- sw->cmds[c].angleturn = host_to_net16(netbuffer->cmds[c].angleturn);
- sw->cmds[c].consistancy = host_to_net16(netbuffer->cmds[c].consistancy);
- sw->cmds[c].chatchar = netbuffer->cmds[c].chatchar;
- sw->cmds[c].buttons = netbuffer->cmds[c].buttons;
- }
-
- packet->len = doomcom->datalength;
- packet->address = sendaddress[doomcom->remotenode];
-
- if (!SDLNet_UDP_Send(udpsocket, -1, packet))
- {
- I_Error("Error sending packet: %s", SDLNet_GetError());
- }
-}
-
-
-//
-// PacketGet
-//
-void PacketGet (void)
-{
- int i;
- int c;
- doomdata_t *sw;
- int packets_read;
-
- packets_read = SDLNet_UDP_Recv(udpsocket, packet);
-
- if (packets_read < 0)
- {
- I_Error("Error reading packet: %s\n", SDLNet_GetError());
- }
-
- if (packets_read == 0)
- {
- doomcom->remotenode = -1;
- return;
- }
-
- // find remote node number
- for (i=0 ; i<doomcom->numnodes ; i++)
- if (packet->address.host == sendaddress[i].host
- && packet->address.port == sendaddress[i].port)
- break;
-
- if (i == doomcom->numnodes)
- {
- // packet is not from one of the players (new game broadcast)
- doomcom->remotenode = -1; // no packet
- return;
- }
-
- doomcom->remotenode = i; // good packet from a game player
- doomcom->datalength = packet->len;
-
- sw = (doomdata_t *) packet->data;
-
- // byte swap
- netbuffer->checksum = net_to_host32(sw->checksum);
- netbuffer->player = sw->player;
- netbuffer->retransmitfrom = sw->retransmitfrom;
- netbuffer->starttic = sw->starttic;
- netbuffer->numtics = sw->numtics;
-
- for (c=0 ; c< netbuffer->numtics ; c++)
- {
- netbuffer->cmds[c].forwardmove = sw->cmds[c].forwardmove;
- netbuffer->cmds[c].sidemove = sw->cmds[c].sidemove;
- netbuffer->cmds[c].angleturn = net_to_host16(sw->cmds[c].angleturn);
- netbuffer->cmds[c].consistancy = net_to_host16(sw->cmds[c].consistancy);
- netbuffer->cmds[c].chatchar = sw->cmds[c].chatchar;
- netbuffer->cmds[c].buttons = sw->cmds[c].buttons;
- }
-}
-
-
-//
-// I_InitNetwork
-//
-void I_InitNetwork (void)
-{
- int i;
- int p;
-
- doomcom = malloc (sizeof (*doomcom) );
- memset (doomcom, 0, sizeof(*doomcom) );
-
- // set up for network
- i = M_CheckParm ("-dup");
- if (i && i< myargc-1)
- {
- doomcom->ticdup = myargv[i+1][0]-'0';
- if (doomcom->ticdup < 1)
- doomcom->ticdup = 1;
- if (doomcom->ticdup > 9)
- doomcom->ticdup = 9;
- }
- else
- doomcom-> ticdup = 1;
-
- if (M_CheckParm ("-extratic"))
- doomcom-> extratics = 1;
- else
- doomcom-> extratics = 0;
-
- p = M_CheckParm ("-port");
- if (p && p<myargc-1)
- {
- DOOMPORT = atoi (myargv[p+1]);
- printf ("using alternate port %i\n",DOOMPORT);
- }
-
- // parse network game options,
- // -net <consoleplayer> <host> <host> ...
- i = M_CheckParm ("-net");
- if (!i)
- {
- // single player game
- netgame = false;
- doomcom->id = DOOMCOM_ID;
- doomcom->numplayers = doomcom->numnodes = 1;
- doomcom->deathmatch = false;
- doomcom->consoleplayer = 0;
- return;
- }
-
- netsend = PacketSend;
- netget = PacketGet;
- netgame = true;
-
- // parse player number and host list
- doomcom->consoleplayer = myargv[i+1][0]-'1';
-
- doomcom->numnodes = 1; // this node for sure
-
- SDLNet_Init();
-
- i++;
- while (++i < myargc && myargv[i][0] != '-')
- {
- if (SDLNet_ResolveHost(&sendaddress[doomcom->numnodes],
- myargv[i], DOOMPORT))
- {
- I_Error("Unable to resolve %s", myargv[i]);
- }
-
- doomcom->numnodes++;
- }
-
- doomcom->id = DOOMCOM_ID;
- doomcom->numplayers = doomcom->numnodes;
-
- // build message to receive
-
- udpsocket = SDLNet_UDP_Open(DOOMPORT);
-
- packet = SDLNet_AllocPacket(5000);
-}
-
-
-void I_NetCmd (void)
-{
- if (doomcom->command == CMD_SEND)
- {
- netsend ();
- }
- else if (doomcom->command == CMD_GET)
- {
- netget ();
- }
- else
- I_Error ("Bad net cmd: %i\n",doomcom->command);
-}
-
-#else
-
-void I_NetCmd(void)
-{
-}
-
-
-void I_InitNetwork (void)
-{
- doomcom = malloc (sizeof (*doomcom) );
- memset (doomcom, 0, sizeof(*doomcom) );
-
- doomcom->ticdup = 1;
- doomcom->extratics = 0;
-
-
- // single player game
- netgame = false;
- doomcom->id = DOOMCOM_ID;
- doomcom->numplayers = doomcom->numnodes = 1;
- doomcom->deathmatch = false;
- doomcom->consoleplayer = 0;
- return;
-}
-
-
-#endif /* #ifndef NO_SDL_NET */
-
-
--- a/src/i_net.h
+++ /dev/null
@@ -1,58 +1,0 @@
-// Emacs style mode select -*- C++ -*-
-//-----------------------------------------------------------------------------
-//
-// $Id: i_net.h 18 2005-07-23 18:56:07Z fraggle $
-//
-// Copyright(C) 1993-1996 Id Software, Inc.
-// Copyright(C) 2005 Simon Howard
-//
-// 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.
-//
-// DESCRIPTION:
-// System specific network interface stuff.
-//
-//-----------------------------------------------------------------------------
-
-
-#ifndef __I_NET__
-#define __I_NET__
-
-
-
-
-
-// Called by D_DoomMain.
-
-
-void I_InitNetwork (void);
-void I_NetCmd (void);
-
-
-#endif
-//-----------------------------------------------------------------------------
-//
-// $Log$
-// Revision 1.3 2005/07/23 18:56:07 fraggle
-// Remove unneccessary pragmas
-//
-// Revision 1.2 2005/07/23 16:44:55 fraggle
-// Update copyright to GNU GPL
-//
-// Revision 1.1.1.1 2005/07/23 16:20:32 fraggle
-// Initial import
-//
-//
-//-----------------------------------------------------------------------------
--- a/src/net_client.c
+++ b/src/net_client.c
@@ -1,7 +1,7 @@
// Emacs style mode select -*- C++ -*-
//-----------------------------------------------------------------------------
//
-// $Id: net_client.c 371 2006-02-17 21:40:52Z fraggle $
+// $Id: net_client.c 374 2006-02-19 13:42:27Z fraggle $
//
// Copyright(C) 2005 Simon Howard
//
@@ -21,6 +21,14 @@
// 02111-1307, USA.
//
// $Log$
+// Revision 1.26 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.25 2006/02/17 21:40:52 fraggle
// Full working resends for client->server comms
//
@@ -139,6 +147,24 @@
} net_clientstate_t;
+// Type of structure used in the receive window
+
+typedef struct
+{
+ // Whether this tic has been received yet
+
+ boolean active;
+
+ // Last time we sent a resend request for this tic
+
+ unsigned int resend_time;
+
+ // Tic data from server
+
+ net_full_ticcmd_t cmd;
+
+} net_server_recv_t;
+
static net_connection_t client_connection;
static net_clientstate_t client_state;
static net_addr_t *server_addr;
@@ -181,6 +207,73 @@
static net_ticdiff_t ticcmd_send_queue[NET_TICCMD_QUEUE_SIZE];
+// Receive window
+
+static ticcmd_t recvwindow_cmd_base[MAXPLAYERS];
+static int recvwindow_start;
+static net_server_recv_t recvwindow[BACKUPTICS];
+
+#define NET_CL_ExpandTicNum(b) NET_ExpandTicNum(recvwindow_start, (b))
+
+static void NET_CL_ExpandTiccmds(net_full_ticcmd_t *cmd)
+{
+ int i;
+
+ for (i=0; i<MAXPLAYERS; ++i)
+ {
+ if (i == consoleplayer)
+ {
+ continue;
+ }
+
+ playeringame[i] = cmd->playeringame[i];
+
+ if (playeringame[i])
+ {
+ net_ticdiff_t *diff;
+ ticcmd_t ticcmd;
+
+ diff = &cmd->cmds[i];
+
+ // Use the ticcmd diff to patch the previous ticcmd to
+ // the new ticcmd
+
+ NET_TiccmdPatch(&recvwindow_cmd_base[i], diff, &ticcmd);
+
+ // Save in d_net.c structures
+
+ netcmds[i][nettics[i] % BACKUPTICS] = ticcmd;
+ ++nettics[i];
+
+ // Store a copy for next time
+
+ recvwindow_cmd_base[i] = ticcmd;
+ }
+ }
+}
+
+// Advance the receive window
+
+static void NET_CL_AdvanceWindow(void)
+{
+ while (recvwindow[0].active)
+ {
+ // Expand tic diff data into d_net.c structures
+
+ NET_CL_ExpandTiccmds(&recvwindow[0].cmd);
+
+ // Advance the window
+
+ memcpy(recvwindow, recvwindow + 1,
+ sizeof(net_server_recv_t) * (BACKUPTICS - 1));
+ memset(&recvwindow[BACKUPTICS-1], 0, sizeof(net_server_recv_t));
+
+ ++recvwindow_start;
+
+ //printf("CL: advanced to %i\n", recvwindow_start);
+ }
+}
+
// Shut down the client code, etc. Invoked after a disconnect.
static void NET_CL_Shutdown(void)
@@ -379,10 +472,60 @@
startmap = settings.map;
startskill = settings.skill;
+ memset(recvwindow, 0, sizeof(recvwindow));
+ recvwindow_start = 0;
+ memset(&recvwindow_cmd_base, 0, sizeof(recvwindow_cmd_base));
+
netgame = true;
autostart = true;
}
+static void NET_CL_ParseGameData(net_packet_t *packet)
+{
+ unsigned int seq, num_tics;
+ int i;
+
+ // Read header
+
+ if (!NET_ReadInt8(packet, &seq)
+ || !NET_ReadInt8(packet, &num_tics))
+ {
+ return;
+ }
+
+ // Expand byte value into the full tic number
+
+ seq = NET_CL_ExpandTicNum(seq);
+
+ for (i=0; i<num_tics; ++i)
+ {
+ net_server_recv_t *recvobj;
+ net_full_ticcmd_t cmd;
+ int index;
+
+ index = seq - recvwindow_start + i;
+
+ if (!NET_ReadFullTiccmd(packet, &cmd))
+ {
+ return;
+ }
+
+ if (index < 0 || index >= BACKUPTICS)
+ {
+ // Out of range of the recv window
+
+ continue;
+ }
+
+ // Store in the receive window
+
+ recvobj = &recvwindow[index];
+
+ recvobj->active = true;
+ recvobj->cmd = cmd;
+ }
+}
+
static void NET_CL_ParseTimeRequest(net_packet_t *packet)
{
net_packet_t *reply;
@@ -453,6 +596,7 @@
break;
case NET_PACKET_TYPE_GAMEDATA:
+ NET_CL_ParseGameData(packet);
break;
case NET_PACKET_TYPE_TIME_REQ:
@@ -511,6 +655,13 @@
net_waiting_for_start = client_connection.state == NET_CONN_STATE_CONNECTED
&& client_state == CLIENT_STATE_WAITING_START;
+
+ if (client_state == CLIENT_STATE_IN_GAME)
+ {
+ // Possibly advance the receive window
+
+ NET_CL_AdvanceWindow();
+ }
}
static void NET_CL_SendSYN(void)
--- a/src/net_common.c
+++ b/src/net_common.c
@@ -1,7 +1,7 @@
// Emacs style mode select -*- C++ -*-
//-----------------------------------------------------------------------------
//
-// $Id: net_common.c 279 2006-01-10 19:59:26Z fraggle $
+// $Id: net_common.c 374 2006-02-19 13:42:27Z fraggle $
//
// Copyright(C) 2005 Simon Howard
//
@@ -21,6 +21,14 @@
// 02111-1307, USA.
//
// $Log$
+// Revision 1.5 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.4 2006/01/10 19:59:26 fraggle
// Reliable packet transport mechanism
//
@@ -488,4 +496,26 @@
return packet;
}
+
+// Used to expand the least significant byte of a tic number into
+// the full tic number, from the current tic number
+
+unsigned int NET_ExpandTicNum(unsigned int relative, unsigned int b)
+{
+ unsigned int l, h;
+ unsigned int result;
+
+ h = relative & ~0xff;
+ l = relative & 0xff;
+
+ result = h | b;
+
+ if (l < 0x40 && b > 0xb0)
+ result -= 0x100;
+ if (l > 0xb0 && b < 0x40)
+ result += 0x100;
+
+ return result;
+}
+
--- a/src/net_common.h
+++ b/src/net_common.h
@@ -1,7 +1,7 @@
// Emacs style mode select -*- C++ -*-
//-----------------------------------------------------------------------------
//
-// $Id: net_common.h 279 2006-01-10 19:59:26Z fraggle $
+// $Id: net_common.h 374 2006-02-19 13:42:27Z fraggle $
//
// Copyright(C) 2005 Simon Howard
//
@@ -21,6 +21,14 @@
// 02111-1307, USA.
//
// $Log$
+// Revision 1.4 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.3 2006/01/10 19:59:26 fraggle
// Reliable packet transport mechanism
//
@@ -102,6 +110,8 @@
void NET_Conn_Disconnect(net_connection_t *conn);
void NET_Conn_Run(net_connection_t *conn);
net_packet_t *NET_Conn_NewReliable(net_connection_t *conn, int packet_type);
+
+unsigned int NET_ExpandTicNum(unsigned int relative, unsigned int b);
#endif /* #ifndef NET_COMMON_H */
--- a/src/net_server.c
+++ b/src/net_server.c
@@ -1,7 +1,7 @@
// Emacs style mode select -*- C++ -*-
//-----------------------------------------------------------------------------
//
-// $Id: net_server.c 372 2006-02-17 21:42:13Z fraggle $
+// $Id: net_server.c 374 2006-02-19 13:42:27Z fraggle $
//
// Copyright(C) 2005 Simon Howard
//
@@ -21,6 +21,14 @@
// 02111-1307, USA.
//
// $Log$
+// Revision 1.28 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.27 2006/02/17 21:42:13 fraggle
// Remove debug code
//
@@ -212,24 +220,8 @@
static unsigned int recvwindow_start;
static net_client_recv_t recvwindow[BACKUPTICS][MAXPLAYERS];
-static unsigned int NET_SV_ExpandTicNum(unsigned int i)
-{
- unsigned int l, h;
- unsigned int result;
+#define NET_SV_ExpandTicNum(b) NET_ExpandTicNum(recvwindow_start, (b))
- h = recvwindow_start & ~0xff;
- l = recvwindow_start & 0xff;
-
- result = h | i;
-
- if (l < 0x40 && i > 0xb0)
- result -= 0x100;
- if (l > 0xb0 && i < 0x40)
- result += 0x100;
-
- return result;
-}
-
static void NET_SV_DisconnectClient(net_client_t *client)
{
if (client->active)
@@ -800,6 +792,9 @@
return;
}
+ //if (rand() % 8 == 0)
+ // return;
+
player = client->player_number;
// Read header
@@ -1109,6 +1104,14 @@
for (i=0; i<MAXPLAYERS; ++i)
{
+ if (sv_players[i] == client)
+ {
+ // Not the player we are sending to
+
+ cmd.playeringame[i] = false;
+ continue;
+ }
+
if (sv_players[i] == NULL || !recvwindow[recv_index][i].active)
{
cmd.playeringame[i] = false;