]> git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - cl_demo.c
added a note about another kind of terrain strip and documented code for generating...
[xonotic/darkplaces.git] / cl_demo.c
index c0af97923772c2480c59533da6867907b65911b6..e97648d68c5333053da42a62f18c2c3ebe61b426 100644 (file)
--- a/cl_demo.c
+++ b/cl_demo.c
@@ -8,7 +8,7 @@ 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
 
 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.  
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
 See the GNU General Public License for more details.
 
 
 See the GNU General Public License for more details.
 
@@ -27,8 +27,8 @@ void CL_FinishTimeDemo (void);
 
 DEMO CODE
 
 
 DEMO CODE
 
-When a demo is playing back, all NET_SendMessages are skipped, and
-NET_GetMessages are read from the demo file.
+When a demo is playing back, all outgoing network messages are skipped, and
+incoming messages are read from the demo file.
 
 Whenever cl.time gets past the last received message, another message is
 read from the demo file.
 
 Whenever cl.time gets past the last received message, another message is
 read from the demo file.
@@ -78,7 +78,7 @@ void CL_StopPlayback (void)
        if (!cls.demoplayback)
                return;
 
        if (!cls.demoplayback)
                return;
 
-       Qclose (cls.demofile);
+       FS_Close (cls.demofile);
        cls.demoplayback = false;
        cls.demofile = NULL;
 
        cls.demoplayback = false;
        cls.demofile = NULL;
 
@@ -103,92 +103,85 @@ void CL_WriteDemoMessage (void)
                return;
 
        len = LittleLong (net_message.cursize);
                return;
 
        len = LittleLong (net_message.cursize);
-       Qwrite (cls.demofile, &len, 4);
+       FS_Write (cls.demofile, &len, 4);
        for (i=0 ; i<3 ; i++)
        {
                f = LittleFloat (cl.viewangles[i]);
        for (i=0 ; i<3 ; i++)
        {
                f = LittleFloat (cl.viewangles[i]);
-               Qwrite (cls.demofile, &f, 4);
+               FS_Write (cls.demofile, &f, 4);
        }
        }
-       Qwrite (cls.demofile, net_message.data, net_message.cursize);
-       Qflush (cls.demofile);
+       FS_Write (cls.demofile, net_message.data, net_message.cursize);
+       FS_Flush (cls.demofile);
 }
 
 /*
 ====================
 }
 
 /*
 ====================
-CL_GetMessage
+CL_ReadDemoMessage
 
 
-Handles recording and playback of demos, on top of NET_ code
+Handles playback of demos
 ====================
 */
 ====================
 */
-int CL_GetMessage (void)
+void CL_ReadDemoMessage(void)
 {
 {
-       int             r, i;
-       float   f;
-       
-       if      (cls.demoplayback)
-       {
-               if (cls.demopaused) // LordHavoc: pausedemo
-                       return 0;
+       int r, i;
+       float f;
+
+       if (!cls.demoplayback)
+               return;
 
 
-       // decide if it is time to grab the next message                
-               if (cls.signon == SIGNONS)      // always grab until fully connected
+       // LordHavoc: pausedemo
+       if (cls.demopaused)
+               return;
+
+       // decide if it is time to grab the next message
+       // always grab until fully connected
+       if (cls.signon == SIGNONS)
+       {
+               if (cls.timedemo)
                {
                {
-                       if (cls.timedemo)
+                       if (host_framecount == cls.td_lastframe)
                        {
                        {
-                               if (host_framecount == cls.td_lastframe)
-                                       return 0;               // already read this frame's message
-                               cls.td_lastframe = host_framecount;
-                       // if this is the second frame, grab the real td_starttime
-                       // so the bogus time on the first frame doesn't count
-                               if (host_framecount == cls.td_startframe + 1)
-                                       cls.td_starttime = realtime;
+                               // already read this frame's message
+                               return;
                        }
                        }
-                       else if (cl.time <= cl.mtime[0])
+                       if (cls.td_lastframe == -1)
                        {
                        {
-                                       return 0;               // don't need another message yet
+                               // we start counting on the second frame
+                               // (after parsing connection stuff)
+                               cls.td_startframe = host_framecount + 1;
                        }
                        }
+                       cls.td_lastframe = host_framecount;
+                       // if this is the first official frame we can now grab the real
+                       // td_starttime so the bogus time on the first frame doesn't
+                       // count against the final report
+                       if (host_framecount == cls.td_startframe)
+                               cls.td_starttime = realtime;
                }
                }
-               
-       // get the next message
-               Qread (cls.demofile, &net_message.cursize, 4);
-               VectorCopy (cl.mviewangles[0], cl.mviewangles[1]);
-               for (i=0 ; i<3 ; i++)
-               {
-                       r = Qread (cls.demofile, &f, 4);
-                       cl.mviewangles[0][i] = LittleFloat (f);
-               }
-               
-               net_message.cursize = LittleLong (net_message.cursize);
-               if (net_message.cursize > MAX_MSGLEN)
-                       Host_Error ("Demo message > MAX_MSGLEN");
-               r = Qread (cls.demofile, net_message.data, net_message.cursize);
-               if (r != net_message.cursize)
+               else if (cl.time <= cl.mtime[0])
                {
                {
-                       CL_Disconnect ();
-                       return 0;
+                       // don't need another message yet
+                       return;
                }
                }
-       
-               return 1;
        }
 
        }
 
-       while (1)
+       // get the next message
+       FS_Read(cls.demofile, &net_message.cursize, 4);
+       net_message.cursize = LittleLong(net_message.cursize);
+       VectorCopy(cl.mviewangles[0], cl.mviewangles[1]);
+       for (i = 0;i < 3;i++)
        {
        {
-               r = NET_GetMessage (cls.netcon);
-               
-               if (r != 1 && r != 2)
-                       return r;
-       
-       // discard nop keepalive message
-               if (net_message.cursize == 1 && net_message.data[0] == svc_nop)
-                       Con_Printf ("<-- server to client keepalive\n");
-               else
-                       break;
+               r = FS_Read(cls.demofile, &f, 4);
+               cl.mviewangles[0][i] = LittleFloat(f);
        }
 
        }
 
-       if (cls.demorecording)
-               CL_WriteDemoMessage ();
-       
-       return r;
+       if (net_message.cursize > NET_MAXMESSAGE)
+               Host_Error("Demo message > NET_MAXMESSAGE");
+       if (FS_Read(cls.demofile, net_message.data, net_message.cursize) == (size_t)net_message.cursize)
+       {
+               MSG_BeginReading();
+               CL_ParseServerMessage();
+       }
+       else
+               CL_Disconnect();
 }
 
 
 }
 
 
@@ -216,7 +209,7 @@ void CL_Stop_f (void)
        CL_WriteDemoMessage ();
 
 // finish up
        CL_WriteDemoMessage ();
 
 // finish up
-       Qclose (cls.demofile);
+       FS_Close (cls.demofile);
        cls.demofile = NULL;
        cls.demorecording = false;
        Con_Printf ("Completed demo\n");
        cls.demofile = NULL;
        cls.demorecording = false;
        Con_Printf ("Completed demo\n");
@@ -231,9 +224,8 @@ record <demoname> <map> [cd track]
 */
 void CL_Record_f (void)
 {
 */
 void CL_Record_f (void)
 {
-       int             c;
-       char    name[MAX_OSPATH];
-       int             track;
+       int c, track;
+       char name[MAX_OSPATH];
 
        if (cmd_source != src_command)
                return;
 
        if (cmd_source != src_command)
                return;
@@ -257,30 +249,27 @@ void CL_Record_f (void)
                return;
        }
 
                return;
        }
 
-// write the forced cd track number, or -1
+       // write the forced cd track number, or -1
        if (c == 4)
        {
                track = atoi(Cmd_Argv(3));
                Con_Printf ("Forcing CD track to %i\n", cls.forcetrack);
        }
        else
        if (c == 4)
        {
                track = atoi(Cmd_Argv(3));
                Con_Printf ("Forcing CD track to %i\n", cls.forcetrack);
        }
        else
-               track = -1;     
+               track = -1;
+
+       // get the demo name
+       strncpy (name, Cmd_Argv(1), sizeof (name) - 1);
+       name[sizeof (name) - 1] = '\0';
+       FS_DefaultExtension (name, ".dem");
 
 
-       sprintf (name, "%s/%s", com_gamedir, Cmd_Argv(1));
-       
-//
-// start the map up
-//
+       // start the map up
        if (c > 2)
                Cmd_ExecuteString ( va("map %s", Cmd_Argv(2)), src_command);
        if (c > 2)
                Cmd_ExecuteString ( va("map %s", Cmd_Argv(2)), src_command);
-       
-//
-// open the demo file
-//
-       COM_DefaultExtension (name, ".dem");
 
 
+       // open the demo file
        Con_Printf ("recording to %s.\n", name);
        Con_Printf ("recording to %s.\n", name);
-       cls.demofile = Qopen (name, "wb");
+       cls.demofile = FS_Open (name, "wb", false);
        if (!cls.demofile)
        {
                Con_Printf ("ERROR: couldn't open.\n");
        if (!cls.demofile)
        {
                Con_Printf ("ERROR: couldn't open.\n");
@@ -288,7 +277,7 @@ void CL_Record_f (void)
        }
 
        cls.forcetrack = track;
        }
 
        cls.forcetrack = track;
-       Qprintf (cls.demofile, "%i\n", cls.forcetrack);
+       FS_Printf (cls.demofile, "%i\n", cls.forcetrack);
 
        cls.demorecording = true;
 }
 
        cls.demorecording = true;
 }
@@ -316,19 +305,15 @@ void CL_PlayDemo_f (void)
                return;
        }
 
                return;
        }
 
-//
-// disconnect from server
-//
+       // disconnect from server
        CL_Disconnect ();
 
        CL_Disconnect ();
 
-//
-// open the demo file
-//
+       // open the demo file
        strcpy (name, Cmd_Argv(1));
        strcpy (name, Cmd_Argv(1));
-       COM_DefaultExtension (name, ".dem");
+       FS_DefaultExtension (name, ".dem");
 
        Con_Printf ("Playing demo from %s.\n", name);
 
        Con_Printf ("Playing demo from %s.\n", name);
-       COM_FOpenFile (name, &cls.demofile, false, true);
+       cls.demofile = FS_Open (name, "rb", false);
        if (!cls.demofile)
        {
                Con_Printf ("ERROR: couldn't open.\n");
        if (!cls.demofile)
        {
                Con_Printf ("ERROR: couldn't open.\n");
@@ -342,7 +327,7 @@ void CL_PlayDemo_f (void)
        cls.state = ca_connected;
        cls.forcetrack = 0;
 
        cls.state = ca_connected;
        cls.forcetrack = 0;
 
-       while ((c = Qgetc(cls.demofile)) != '\n')
+       while ((c = FS_Getc (cls.demofile)) != '\n')
                if (c == '-')
                        neg = true;
                else
                if (c == '-')
                        neg = true;
                else
@@ -362,9 +347,9 @@ void CL_FinishTimeDemo (void)
 {
        int             frames;
        double  time; // LordHavoc: changed timedemo accuracy to double
 {
        int             frames;
        double  time; // LordHavoc: changed timedemo accuracy to double
-       
+
        cls.timedemo = false;
        cls.timedemo = false;
-       
+
 // the first frame didn't count
        frames = (host_framecount - cls.td_startframe) - 1;
        time = realtime - cls.td_starttime;
 // the first frame didn't count
        frames = (host_framecount - cls.td_startframe) - 1;
        time = realtime - cls.td_starttime;
@@ -399,12 +384,12 @@ void CL_TimeDemo_f (void)
 
        // instantly hide console and deactivate it
        key_dest = key_game;
 
        // instantly hide console and deactivate it
        key_dest = key_game;
-       key_consoleactive = false;
+       key_consoleactive = 0;
        scr_conlines = 0;
        scr_con_current = 0;
 
        cls.timedemo = true;
        scr_conlines = 0;
        scr_con_current = 0;
 
        cls.timedemo = true;
-       cls.td_startframe = host_framecount;
-       cls.td_lastframe = -1;          // get a new message this frame
+       // get first message this frame
+       cls.td_lastframe = -1;
 }
 
 }