From 84468fd0509e77afdc9030dd4ec9a397b79e22fa Mon Sep 17 00:00:00 2001 From: Simon Howard Date: Fri, 14 Apr 2006 15:25:42 +0000 Subject: Add ability to play using the Vanilla player sync code Subversion-branch: /trunk/chocolate-doom Subversion-revision: 470 --- src/d_net.c | 147 ++++++++++++++++++++++++++++++++++++++++++++--------- src/net_client.c | 18 ++++++- src/net_client.h | 3 +- src/net_defs.h | 3 +- src/net_structrw.c | 6 ++- 5 files changed, 147 insertions(+), 30 deletions(-) (limited to 'src') diff --git a/src/d_net.c b/src/d_net.c index 2ba52a5d..1a51c4df 100644 --- a/src/d_net.c +++ b/src/d_net.c @@ -1,7 +1,7 @@ // Emacs style mode select -*- C++ -*- //----------------------------------------------------------------------------- // -// $Id: d_net.c 455 2006-03-30 19:08:37Z fraggle $ +// $Id: d_net.c 470 2006-04-14 15:25:42Z fraggle $ // // Copyright(C) 1993-1996 Id Software, Inc. // Copyright(C) 2005 Simon Howard @@ -117,7 +117,7 @@ //----------------------------------------------------------------------------- -static const char rcsid[] = "$Id: d_net.c 455 2006-03-30 19:08:37Z fraggle $"; +static const char rcsid[] = "$Id: d_net.c 470 2006-04-14 15:25:42Z fraggle $"; #include "doomfeatures.h" @@ -157,6 +157,7 @@ int nettics[MAXPLAYERS]; int maketic; int lastnettic; +int skiptics; int ticdup; int extratics; fixed_t offsetms; @@ -173,7 +174,15 @@ static int GetAdjustedTime(void) { int time_ms; - time_ms = I_GetTimeMS() + (offsetms / FRACUNIT); + time_ms = I_GetTimeMS(); + + if (net_cl_new_sync) + { + // Use the adjustments from net_client.c only if we are + // using the new sync mode. + + time_ms += (offsetms / FRACUNIT); + } return (time_ms * FPS) / 1000; } @@ -187,10 +196,10 @@ int lasttime; void NetUpdate (void) { - int nowtime; - int newtics; - int i; - int gameticdiv; + int nowtime; + int newtics; + int i; + int gameticdiv; // If we are running with singletics (timing a demo), this // is all done separately. @@ -208,12 +217,20 @@ void NetUpdate (void) #endif // check time - nowtime = GetAdjustedTime()/ticdup; + nowtime = GetAdjustedTime() / ticdup; newtics = nowtime - lasttime; lasttime = nowtime; - if (newtics <= 0) // nothing new to update - return; + if (skiptics <= newtics) + { + newtics -= skiptics; + skiptics = 0; + } + else + { + skiptics -= newtics; + newtics = 0; + } // build new ticcmds for console player gameticdiv = gametic/ticdup; @@ -229,16 +246,24 @@ void NetUpdate (void) M_Ticker (); - // If playing single player, do not allow tics to buffer - // up very far + if (net_cl_new_sync) + { + // If playing single player, do not allow tics to buffer + // up very far - if ((!netgame || demoplayback) && maketic - gameticdiv > 2) - break; + if ((!netgame || demoplayback) && maketic - gameticdiv > 2) + break; - // Never go more than ~200ms ahead + // Never go more than ~200ms ahead - if (maketic - gameticdiv > 8) - break; + if (maketic - gameticdiv > 8) + break; + } + else + { + if (maketic - gameticdiv >= 5) + break; + } //printf ("mk:%i ",maketic); G_BuildTiccmd(&cmd); @@ -408,19 +433,27 @@ static int GetLowTic(void) // TryRunTics // int oldnettics; +int frametics[4]; +int frameon; +int frameskip[4]; +int oldnettics; extern boolean advancedemo; void TryRunTics (void) { - int i; - int lowtic; - int entertic; - int availabletics; - int counts; + int i; + int lowtic; + int entertic; + static int oldentertics; + int realtics; + int availabletics; + int counts; // get real tics - entertic = I_GetTime ()/ticdup; + entertic = I_GetTime() / ticdup; + realtics = entertic - oldentertics; + oldentertics = entertic; // get available tics NetUpdate (); @@ -431,7 +464,71 @@ void TryRunTics (void) // decide how many tics to run - counts = availabletics; + if (net_cl_new_sync) + { + counts = availabletics; + } + else + { + // decide how many tics to run + if (realtics < availabletics-1) + counts = realtics+1; + else if (realtics < availabletics) + counts = realtics; + else + counts = availabletics; + + if (counts < 1) + counts = 1; + + frameon++; + + if (!demoplayback) + { + int keyplayer = -1; + + // ideally maketic should be 1 - 3 tics above lowtic + // if we are consistantly slower, speed up time + + for (i=0 ; i nettics[keyplayer]); + oldnettics = maketic; + + if (frameskip[0] && frameskip[1] && frameskip[2] && frameskip[3]) + { + skiptics = 1; + // printf ("+"); + } + } + } + } if (counts < 1) counts = 1; @@ -449,7 +546,7 @@ void TryRunTics (void) // Don't stay in this loop forever. The menu is still running, // so return to update the screen - if (I_GetTime ()/ticdup - entertic > 0) + if (I_GetTime() / ticdup - entertic > 0) { return; } diff --git a/src/net_client.c b/src/net_client.c index 026a9ee1..7aa26f86 100644 --- a/src/net_client.c +++ b/src/net_client.c @@ -1,7 +1,7 @@ // Emacs style mode select -*- C++ -*- //----------------------------------------------------------------------------- // -// $Id: net_client.c 462 2006-04-06 19:31:45Z fraggle $ +// $Id: net_client.c 470 2006-04-14 15:25:42Z fraggle $ // // Copyright(C) 2005 Simon Howard // @@ -269,6 +269,11 @@ static net_server_recv_t recvwindow[BACKUPTICS]; static fixed_t average_latency; +// Use new-style ticcmd sync (fixes indigo lag) + +boolean net_cl_new_sync = true; + + #define NET_CL_ExpandTicNum(b) NET_ExpandTicNum(recvwindow_start, (b)) // Called when a player leaves the game @@ -466,6 +471,11 @@ void NET_CL_StartGame(void) settings.gameversion = gameversion; settings.nomonsters = nomonsters; + if (M_CheckParm("-oldsync") > 0) + settings.new_sync = 0; + else + settings.new_sync = 1; + i = M_CheckParm("-extratics"); if (i > 0) @@ -663,6 +673,12 @@ static void NET_CL_ParseGameStart(net_packet_t *packet) startskill = settings.skill; lowres_turn = settings.lowres_turn; nomonsters = settings.nomonsters; + net_cl_new_sync = settings.new_sync != 0; + + if (net_cl_new_sync == false) + { + printf("Syncing netgames like Vanilla Doom.\n"); + } memset(recvwindow, 0, sizeof(recvwindow)); recvwindow_start = 0; diff --git a/src/net_client.h b/src/net_client.h index 8e870467..7440e4f7 100644 --- a/src/net_client.h +++ b/src/net_client.h @@ -1,7 +1,7 @@ // Emacs style mode select -*- C++ -*- //----------------------------------------------------------------------------- // -// $Id: net_client.h 405 2006-03-02 00:57:25Z fraggle $ +// $Id: net_client.h 470 2006-04-14 15:25:42Z fraggle $ // // Copyright(C) 2005 Simon Howard // @@ -90,6 +90,7 @@ extern char net_player_names[MAXPLAYERS][MAXPLAYERNAME]; extern char net_player_addresses[MAXPLAYERS][MAXPLAYERNAME]; extern int net_player_number; extern char *net_player_name; +extern boolean net_cl_new_sync; #endif /* #ifndef NET_CLIENT_H */ diff --git a/src/net_defs.h b/src/net_defs.h index 055bba7d..db056d77 100644 --- a/src/net_defs.h +++ b/src/net_defs.h @@ -1,7 +1,7 @@ // Emacs style mode select -*- C++ -*- //----------------------------------------------------------------------------- // -// $Id: net_defs.h 464 2006-04-06 20:48:35Z fraggle $ +// $Id: net_defs.h 470 2006-04-14 15:25:42Z fraggle $ // // Copyright(C) 2005 Simon Howard // @@ -178,6 +178,7 @@ typedef struct int skill; int gameversion; int lowres_turn; + int new_sync; } net_gamesettings_t; #define NET_TICDIFF_FORWARD (1 << 0) diff --git a/src/net_structrw.c b/src/net_structrw.c index 03cb16e9..d3e5a2bd 100644 --- a/src/net_structrw.c +++ b/src/net_structrw.c @@ -1,7 +1,7 @@ // Emacs style mode select -*- C++ -*- //----------------------------------------------------------------------------- // -// $Id: net_structrw.c 404 2006-03-02 00:10:23Z fraggle $ +// $Id: net_structrw.c 470 2006-04-14 15:25:42Z fraggle $ // // Copyright(C) 2005 Simon Howard // @@ -79,6 +79,7 @@ void NET_WriteSettings(net_packet_t *packet, net_gamesettings_t *settings) NET_WriteInt8(packet, settings->skill); NET_WriteInt8(packet, settings->gameversion); NET_WriteInt8(packet, settings->lowres_turn); + NET_WriteInt8(packet, settings->new_sync); } boolean NET_ReadSettings(net_packet_t *packet, net_gamesettings_t *settings) @@ -91,7 +92,8 @@ boolean NET_ReadSettings(net_packet_t *packet, net_gamesettings_t *settings) && NET_ReadInt8(packet, (unsigned int *) &settings->map) && NET_ReadInt8(packet, (unsigned int *) &settings->skill) && NET_ReadInt8(packet, (unsigned int *) &settings->gameversion) - && NET_ReadInt8(packet, (unsigned int *) &settings->lowres_turn); + && NET_ReadInt8(packet, (unsigned int *) &settings->lowres_turn) + && NET_ReadInt8(packet, (unsigned int *) &settings->new_sync); } void NET_WriteTiccmdDiff(net_packet_t *packet, net_ticdiff_t *diff, -- cgit v1.2.3