foxygit / doom Log in
commit 1b4411d96923b16575aeef36c9a4d3c2aea0d64d
Author:     Simon Howard <fraggle@gmail.com>
AuthorDate: Thu Feb 23 19:12:02 2006 +0000
Commit:     Simon Howard <fraggle@gmail.com>
CommitDate: Thu Feb 23 19:12:02 2006 +0000

    Add lowres_turn to indicate whether we generate angleturns which are
    8-bit as opposed to 16-bit. This is used when recording demos without
    -longtics enabled. Sync this option between clients in a netgame, so
    that if one player is recording a Vanilla demo, all clients record
    in lowres.

    Subversion-branch: /trunk/chocolate-doom
    Subversion-revision: 378
---
 src/d_net.c        | 62 +++++++++++++++++++++++++++++++++++-------------------
 src/doomstat.h     | 14 +++++++++++-
 src/g_game.c       | 32 +++++++++++++++++++++++-----
 src/net_client.c   | 23 +++++++++++++++++---
 src/net_server.c   | 52 +++++++++++++++++++++++++++++++++++++--------
 src/net_structrw.c | 13 ++++++++++--
 6 files changed, 154 insertions(+), 42 deletions(-)

diff --git a/src/d_net.c b/src/d_net.c
index 8e6ec48e..c74c6d03 100644
--- a/src/d_net.c
+++ b/src/d_net.c
@@ -1,7 +1,7 @@
 // Emacs style mode select   -*- C++ -*-
 //-----------------------------------------------------------------------------
 //
-// $Id: d_net.c 374 2006-02-19 13:42:27Z fraggle $
+// $Id: d_net.c 378 2006-02-23 19:12:02Z fraggle $
 //
 // Copyright(C) 1993-1996 Id Software, Inc.
 // Copyright(C) 2005 Simon Howard
@@ -22,6 +22,13 @@
 // 02111-1307, USA.
 //
 // $Log$
+// Revision 1.18  2006/02/23 19:12:01  fraggle
+// Add lowres_turn to indicate whether we generate angleturns which are
+// 8-bit as opposed to 16-bit.  This is used when recording demos without
+// -longtics enabled.  Sync this option between clients in a netgame, so
+// that if one player is recording a Vanilla demo, all clients record
+// in lowres.
+//
 // 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.
@@ -97,7 +104,7 @@
 //-----------------------------------------------------------------------------


-static const char rcsid[] = "$Id: d_net.c 374 2006-02-19 13:42:27Z fraggle $";
+static const char rcsid[] = "$Id: d_net.c 378 2006-02-23 19:12:02Z fraggle $";


 #include "d_main.h"
@@ -190,7 +197,7 @@ void NetUpdate (void)

         // Never go more than a second ahead

-        if (maketic - gameticdiv > 35)
+        if (maketic - gameticdiv > 3)
             break;

 	I_StartTic ();
@@ -199,7 +206,7 @@ void NetUpdate (void)
 	//printf ("mk:%i ",maketic);
 	G_BuildTiccmd(&cmd);

-        if (netgame)
+        if (netgame && !demoplayback)
         {
             NET_CL_SendTiccmd(&cmd, maketic);
         }
@@ -230,6 +237,7 @@ void D_CheckNetGame (void)
     consoleplayer = 0;
     netgame = false;
     ticdup = 1;
+    lowres_turn = false;

     for (i=0; i<MAXPLAYERS; i++)
     {
@@ -300,7 +308,31 @@ void D_QuitNetGame (void)
     NET_CL_Disconnect();
 }

+static int GetLowTic(void)
+{
+    int i;
+    int lowtic;

+    if (demoplayback)
+    {
+        lowtic = maketic;
+    }
+    else
+    {
+        lowtic = INT_MAX;
+
+        for (i=0; i<MAXPLAYERS; ++i)
+        {
+            if (playeringame[i])
+            {
+                if (nettics[i] < lowtic)
+                    lowtic = nettics[i];
+            }
+        }
+    }
+
+    return lowtic;
+}

 //
 // TryRunTics
@@ -318,7 +350,6 @@ void TryRunTics (void)
     int		realtics;
     int		availabletics;
     int		counts;
-    int		numplaying;

     // get real tics
     entertic = I_GetTime ()/ticdup;
@@ -328,18 +359,8 @@ void TryRunTics (void)
     // get available tics
     NetUpdate ();

-    lowtic = INT_MAX;
-    numplaying = 0;
+    lowtic = GetLowTic();

-    for (i=0; i<MAXPLAYERS; ++i)
-    {
-        if (playeringame[i])
-        {
-            ++numplaying;
-            if (nettics[i] < lowtic)
-                lowtic = nettics[i];
-        }
-    }
     availabletics = lowtic - gametic/ticdup;

     // decide how many tics to run
@@ -362,15 +383,12 @@ void TryRunTics (void)
     while (lowtic < gametic/ticdup + counts)
     {
 	NetUpdate ();
-	lowtic = INT_MAX;
-
-	for (i=0; i<MAXPLAYERS; ++i)
-            if (playeringame[i] && nettics[i] < lowtic)
-		lowtic = nettics[i];
+
+        lowtic = GetLowTic();

 	if (lowtic < gametic/ticdup)
 	    I_Error ("TryRunTics: lowtic < gametic");
-
+
 	// don't stay in here forever -- give the menu a chance to work
 	if (I_GetTime ()/ticdup - entertic >= 20)
 	{
diff --git a/src/doomstat.h b/src/doomstat.h
index 41925618..969fcd1d 100644
--- a/src/doomstat.h
+++ b/src/doomstat.h
@@ -1,7 +1,7 @@
 // Emacs style mode select   -*- C++ -*-
 //-----------------------------------------------------------------------------
 //
-// $Id: doomstat.h 374 2006-02-19 13:42:27Z fraggle $
+// $Id: doomstat.h 378 2006-02-23 19:12:02Z fraggle $
 //
 // Copyright(C) 1993-1996 Id Software, Inc.
 // Copyright(C) 2005 Simon Howard
@@ -187,6 +187,11 @@ extern  boolean	usergame;
 extern  boolean	demoplayback;
 extern  boolean	demorecording;

+// Round angleturn in ticcmds to the nearest 256.  This is used when
+// recording Vanilla demos in netgames.
+
+extern boolean lowres_turn;
+
 // Quit after playing a demo from cmdline.
 extern  boolean		singledemo;

@@ -296,6 +301,13 @@ extern	int		ticdup;
 //-----------------------------------------------------------------------------
 //
 // $Log$
+// Revision 1.11  2006/02/23 19:12:01  fraggle
+// Add lowres_turn to indicate whether we generate angleturns which are
+// 8-bit as opposed to 16-bit.  This is used when recording demos without
+// -longtics enabled.  Sync this option between clients in a netgame, so
+// that if one player is recording a Vanilla demo, all clients record
+// in lowres.
+//
 // 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.
diff --git a/src/g_game.c b/src/g_game.c
index 647226ab..e929270f 100644
--- a/src/g_game.c
+++ b/src/g_game.c
@@ -1,7 +1,7 @@
 // Emacs style mode select   -*- C++ -*-
 //-----------------------------------------------------------------------------
 //
-// $Id: g_game.c 374 2006-02-19 13:42:27Z fraggle $
+// $Id: g_game.c 378 2006-02-23 19:12:02Z fraggle $
 //
 // Copyright(C) 1993-1996 Id Software, Inc.
 // Copyright(C) 2005 Simon Howard
@@ -22,6 +22,13 @@
 // 02111-1307, USA.
 //
 // $Log$
+// Revision 1.26  2006/02/23 19:12:01  fraggle
+// Add lowres_turn to indicate whether we generate angleturns which are
+// 8-bit as opposed to 16-bit.  This is used when recording demos without
+// -longtics enabled.  Sync this option between clients in a netgame, so
+// that if one player is recording a Vanilla demo, all clients record
+// in lowres.
+//
 // 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.
@@ -127,7 +134,7 @@


 static const char
-rcsid[] = "$Id: g_game.c 374 2006-02-19 13:42:27Z fraggle $";
+rcsid[] = "$Id: g_game.c 378 2006-02-23 19:12:02Z fraggle $";

 #include <string.h>
 #include <stdlib.h>
@@ -234,6 +241,7 @@ int             totalkills, totalitems, totalsecret;    // for intermission
 char            demoname[32];
 boolean         demorecording;
 boolean         longtics;               // cph's doom 1.91 longtics hack
+boolean         lowres_turn;            // low resolution turning for longtics
 boolean         demoplayback;
 boolean		netdemo;
 byte*		demobuffer;
@@ -563,6 +571,16 @@ void G_BuildTiccmd (ticcmd_t* cmd)
 	sendsave = false;
 	cmd->buttons = BT_SPECIAL | BTS_SAVEGAME | (savegameslot<<BTS_SAVESHIFT);
     }
+
+    // low-res turning
+
+    if (lowres_turn)
+    {
+        // round angleturn to the nearest 256 boundary
+        // for recording demos with single byte values for turn
+
+        cmd->angleturn = (cmd->angleturn + 128) & 0xff00;
+    }
 }


@@ -1616,7 +1634,7 @@ void G_ReadDemoTiccmd (ticcmd_t* cmd)
     }
     else
     {
-        cmd->angleturn = ((unsigned char)*demo_p++)<<8;
+        cmd->angleturn = ((unsigned char) *demo_p++)<<8;
     }

     cmd->buttons = (unsigned char)*demo_p++;
@@ -1644,7 +1662,7 @@ void G_WriteDemoTiccmd (ticcmd_t* cmd)
     }
     else
     {
-        *demo_p++ = (cmd->angleturn+128)>>8;
+        *demo_p++ = cmd->angleturn >> 8;
     }

     *demo_p++ = cmd->buttons;
@@ -1693,7 +1711,11 @@ void G_BeginRecording (void)
     // Check for the longtics parameter, to record hires angle
     // turns in demos
     longtics = M_CheckParm("-longtics") != 0;
-
+
+    // If not recording a longtics demo, record in low res
+
+    lowres_turn = !longtics;
+
     demo_p = demobuffer;

     // Save the right version code for this demo
diff --git a/src/net_client.c b/src/net_client.c
index c8b08fb6..6ac95fd7 100644
--- a/src/net_client.c
+++ b/src/net_client.c
@@ -1,7 +1,7 @@
 // Emacs style mode select   -*- C++ -*-
 //-----------------------------------------------------------------------------
 //
-// $Id: net_client.c 377 2006-02-23 18:20:29Z fraggle $
+// $Id: net_client.c 378 2006-02-23 19:12:02Z fraggle $
 //
 // Copyright(C) 2005 Simon Howard
 //
@@ -21,6 +21,13 @@
 // 02111-1307, USA.
 //
 // $Log$
+// Revision 1.29  2006/02/23 19:12:01  fraggle
+// Add lowres_turn to indicate whether we generate angleturns which are
+// 8-bit as opposed to 16-bit.  This is used when recording demos without
+// -longtics enabled.  Sync this option between clients in a netgame, so
+// that if one player is recording a Vanilla demo, all clients record
+// in lowres.
+//
 // Revision 1.28  2006/02/23 18:20:29  fraggle
 // Fix bugs in resend code for server->client data
 //
@@ -135,6 +142,7 @@
 #include "deh_main.h"
 #include "g_game.h"
 #include "i_system.h"
+#include "m_argv.h"
 #include "net_client.h"
 #include "net_common.h"
 #include "net_defs.h"
@@ -408,7 +416,7 @@ static void NET_CL_SendTics(int start, int end)

         NET_WriteInt16(packet, sendobj->time);

-        NET_WriteTiccmdDiff(packet, &sendobj->cmd, false);
+        NET_WriteTiccmdDiff(packet, &sendobj->cmd, lowres_turn);
     }

     // Send the packet
@@ -541,6 +549,7 @@ static void NET_CL_ParseGameStart(net_packet_t *packet)
     startepisode = settings.episode;
     startmap = settings.map;
     startskill = settings.skill;
+    lowres_turn = settings.lowres_turn;

     memset(recvwindow, 0, sizeof(recvwindow));
     recvwindow_start = 0;
@@ -676,7 +685,7 @@ static void NET_CL_ParseGameData(net_packet_t *packet)

         index = seq - recvwindow_start + i;

-        if (!NET_ReadFullTiccmd(packet, &cmd, false))
+        if (!NET_ReadFullTiccmd(packet, &cmd, lowres_turn))
         {
             return;
         }
@@ -896,6 +905,7 @@ static void NET_CL_SendSYN(void)
     NET_WriteInt32(packet, NET_MAGIC_NUMBER);
     NET_WriteInt16(packet, gamemode);
     NET_WriteInt16(packet, gamemission);
+    NET_WriteInt8(packet, lowres_turn);
     NET_WriteString(packet, net_player_name);
     NET_WriteString(packet, PACKAGE_STRING);
     NET_Conn_SendPacket(&client_connection, packet);
@@ -911,6 +921,13 @@ boolean NET_CL_Connect(net_addr_t *addr)

     server_addr = addr;

+    // Are we recording a demo? Possibly set lowres turn mode
+
+    if (M_CheckParm("-record") > 0 && M_CheckParm("-longtics") == 0)
+    {
+        lowres_turn = true;
+    }
+
     // create a new network I/O context and add just the
     // necessary module

diff --git a/src/net_server.c b/src/net_server.c
index aedd5f19..8ee33d93 100644
--- a/src/net_server.c
+++ b/src/net_server.c
@@ -1,7 +1,7 @@
 // Emacs style mode select   -*- C++ -*-
 //-----------------------------------------------------------------------------
 //
-// $Id: net_server.c 377 2006-02-23 18:20:29Z fraggle $
+// $Id: net_server.c 378 2006-02-23 19:12:02Z fraggle $
 //
 // Copyright(C) 2005 Simon Howard
 //
@@ -21,6 +21,13 @@
 // 02111-1307, USA.
 //
 // $Log$
+// Revision 1.31  2006/02/23 19:12:02  fraggle
+// Add lowres_turn to indicate whether we generate angleturns which are
+// 8-bit as opposed to 16-bit.  This is used when recording demos without
+// -longtics enabled.  Sync this option between clients in a netgame, so
+// that if one player is recording a Vanilla demo, all clients record
+// in lowres.
+//
 // Revision 1.30  2006/02/23 18:20:29  fraggle
 // Fix bugs in resend code for server->client data
 //
@@ -176,6 +183,10 @@ typedef struct
     int last_send_time;
     char *name;

+    // recording a demo without -longtics
+
+    boolean recording_lowres;
+
     // time query variables

     int last_time_req_time;
@@ -432,6 +443,7 @@ static void NET_SV_ParseSYN(net_packet_t *packet,
 {
     unsigned int magic;
     unsigned int cl_gamemode, cl_gamemission;
+    unsigned int cl_recording_lowres;
     char *player_name;
     char *client_version;
     int i;
@@ -453,7 +465,8 @@ static void NET_SV_ParseSYN(net_packet_t *packet,
     // read the game mode and mission

     if (!NET_ReadInt16(packet, &cl_gamemode)
-     || !NET_ReadInt16(packet, &cl_gamemission))
+     || !NET_ReadInt16(packet, &cl_gamemission)
+     || !NET_ReadInt8(packet, &cl_recording_lowres))
     {
         return;
     }
@@ -537,6 +550,10 @@ static void NET_SV_ParseSYN(net_packet_t *packet,
             return;
         }

+        // TODO: Add server option to allow rejecting clients which
+        // set lowres_turn.  This is potentially desirable as the
+        // presence of such clients affects turning resolution.
+
         // Adopt the game mode and mission of the first connecting client

         if (num_clients == 0)
@@ -557,6 +574,8 @@ static void NET_SV_ParseSYN(net_packet_t *packet,
         // Activate, initialise connection

         NET_SV_InitNewClient(client, addr, player_name);
+
+        client->recording_lowres = cl_recording_lowres;
     }

     if (client->connection.state == NET_CONN_STATE_WAITING_ACK)
@@ -595,14 +614,24 @@ static void NET_SV_ParseGameStart(net_packet_t *packet, net_client_t *client)
         return;
     }

-    // Change server state
+    // Assign player numbers

-    server_state = SERVER_IN_GAME;
-    sv_settings = settings;
+    NET_SV_AssignPlayers();

-    // Send start packets to each connected node
+    // Check if anyone is recording a demo and set lowres_turn if so.

-    NET_SV_AssignPlayers();
+    settings.lowres_turn = false;
+
+    for (i=0; i<MAXPLAYERS; ++i)
+    {
+        if (sv_players[i]->recording_lowres)
+        {
+            settings.lowres_turn = true;
+            break;
+        }
+    }
+
+    // Send start packets to each connected node

     for (i=0; i<MAXPLAYERS; ++i)
     {
@@ -617,6 +646,11 @@ static void NET_SV_ParseGameStart(net_packet_t *packet, net_client_t *client)
         NET_WriteSettings(startpacket, &settings);
     }

+    // Change server state
+
+    server_state = SERVER_IN_GAME;
+    sv_settings = settings;
+
     memset(recvwindow, 0, sizeof(recvwindow));
     recvwindow_start = 0;
 }
@@ -824,7 +858,7 @@ static void NET_SV_ParseGameData(net_packet_t *packet, net_client_t *client)
         unsigned int time;

         if (!NET_ReadInt16(packet, &time)
-         || !NET_ReadTiccmdDiff(packet, &diff, false))
+         || !NET_ReadTiccmdDiff(packet, &diff, sv_settings.lowres_turn))
         {
             return;
         }
@@ -923,7 +957,7 @@ static void NET_SV_SendTics(net_client_t *client, int start, int end)

         // Add command

-        NET_WriteFullTiccmd(packet, cmd, false);
+        NET_WriteFullTiccmd(packet, cmd, sv_settings.lowres_turn);
     }

     // Send packet
diff --git a/src/net_structrw.c b/src/net_structrw.c
index ec5a61b5..6567c01c 100644
--- a/src/net_structrw.c
+++ b/src/net_structrw.c
@@ -1,7 +1,7 @@
 // Emacs style mode select   -*- C++ -*-
 //-----------------------------------------------------------------------------
 //
-// $Id: net_structrw.c 376 2006-02-23 18:19:05Z fraggle $
+// $Id: net_structrw.c 378 2006-02-23 19:12:02Z fraggle $
 //
 // Copyright(C) 2005 Simon Howard
 //
@@ -21,6 +21,13 @@
 // 02111-1307, USA.
 //
 // $Log$
+// Revision 1.8  2006/02/23 19:12:02  fraggle
+// Add lowres_turn to indicate whether we generate angleturns which are
+// 8-bit as opposed to 16-bit.  This is used when recording demos without
+// -longtics enabled.  Sync this option between clients in a netgame, so
+// that if one player is recording a Vanilla demo, all clients record
+// in lowres.
+//
 // Revision 1.7  2006/02/23 18:19:05  fraggle
 // Add lowres_turn parameter to net_full_ticcmd_t structure r/w functions
 //
@@ -70,6 +77,7 @@ void NET_WriteSettings(net_packet_t *packet, net_gamesettings_t *settings)
     NET_WriteInt8(packet, settings->map);
     NET_WriteInt8(packet, settings->skill);
     NET_WriteInt8(packet, settings->gameversion);
+    NET_WriteInt8(packet, settings->lowres_turn);
 }

 boolean NET_ReadSettings(net_packet_t *packet, net_gamesettings_t *settings)
@@ -80,7 +88,8 @@ boolean NET_ReadSettings(net_packet_t *packet, net_gamesettings_t *settings)
         && NET_ReadInt8(packet, (unsigned int *) &settings->episode)
         && 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->gameversion)
+        && NET_ReadInt8(packet, (unsigned int *) &settings->lowres_turn);
 }

 void NET_WriteTiccmdDiff(net_packet_t *packet, net_ticdiff_t *diff,