]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - cl_demo.c
rewrote memory system entirely (hunk, cache, and zone are gone, memory pools replaced...
[xonotic/darkplaces.git] / cl_demo.c
index aaca270442332edf6bc04cfaecbada62f42e039c..780b1f1c9b5355cd3a3170eed4405fba941ab2fd 100644 (file)
--- a/cl_demo.c
+++ b/cl_demo.c
@@ -35,6 +35,38 @@ read from the demo file.
 ==============================================================================
 */
 
+/*
+=====================
+CL_NextDemo
+
+Called to play the next demo in the demo loop
+=====================
+*/
+void CL_NextDemo (void)
+{
+       char    str[1024];
+
+       if (cls.demonum == -1)
+               return;         // don't play demos
+
+//     SCR_BeginLoadingPlaque ();
+
+       if (!cls.demos[cls.demonum][0] || cls.demonum == MAX_DEMOS)
+       {
+               cls.demonum = 0;
+               if (!cls.demos[cls.demonum][0])
+               {
+                       Con_Printf ("No demos listed with startdemos\n");
+                       cls.demonum = -1;
+                       return;
+               }
+       }
+
+       sprintf (str,"playdemo %s\n", cls.demos[cls.demonum]);
+       Cbuf_InsertText (str);
+       cls.demonum++;
+}
+
 /*
 ==============
 CL_StopPlayback
@@ -42,15 +74,15 @@ CL_StopPlayback
 Called when a demo file runs out, or the user starts a game
 ==============
 */
+// LordHavoc: now called only by CL_Disconnect
 void CL_StopPlayback (void)
 {
        if (!cls.demoplayback)
                return;
 
-       fclose (cls.demofile);
+       Qclose (cls.demofile);
        cls.demoplayback = false;
        cls.demofile = NULL;
-       cls.state = ca_disconnected;
 
        if (cls.timedemo)
                CL_FinishTimeDemo ();
@@ -73,14 +105,14 @@ void CL_WriteDemoMessage (void)
                return;
 
        len = LittleLong (net_message.cursize);
-       fwrite (&len, 4, 1, cls.demofile);
+       Qwrite (cls.demofile, &len, 4);
        for (i=0 ; i<3 ; i++)
        {
                f = LittleFloat (cl.viewangles[i]);
-               fwrite (&f, 4, 1, cls.demofile);
+               Qwrite (cls.demofile, &f, 4);
        }
-       fwrite (net_message.data, net_message.cursize, 1, cls.demofile);
-       fflush (cls.demofile);
+       Qwrite (cls.demofile, net_message.data, net_message.cursize);
+       Qflush (cls.demofile);
 }
 
 /*
@@ -101,12 +133,12 @@ int CL_GetMessage (void)
                        return 0;
 
        // decide if it is time to grab the next message                
-               if (cls.signon == SIGNONS)      // allways grab until fully connected
+               if (cls.signon == SIGNONS)      // always grab until fully connected
                {
                        if (cls.timedemo)
                        {
                                if (host_framecount == cls.td_lastframe)
-                                       return 0;               // allready read this frame's message
+                                       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
@@ -120,21 +152,21 @@ int CL_GetMessage (void)
                }
                
        // get the next message
-               fread (&net_message.cursize, 4, 1, cls.demofile);
+               Qread (cls.demofile, &net_message.cursize, 4);
                VectorCopy (cl.mviewangles[0], cl.mviewangles[1]);
                for (i=0 ; i<3 ; i++)
                {
-                       r = fread (&f, 4, 1, cls.demofile);
+                       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)
-                       Sys_Error ("Demo message > MAX_MSGLEN");
-               r = fread (net_message.data, net_message.cursize, 1, cls.demofile);
-               if (r != 1)
+                       Host_Error ("Demo message > MAX_MSGLEN");
+               r = Qread (cls.demofile, net_message.data, net_message.cursize);
+               if (r != net_message.cursize)
                {
-                       CL_StopPlayback ();
+                       CL_Disconnect ();
                        return 0;
                }
        
@@ -186,7 +218,7 @@ void CL_Stop_f (void)
        CL_WriteDemoMessage ();
 
 // finish up
-       fclose (cls.demofile);
+       Qclose (cls.demofile);
        cls.demofile = NULL;
        cls.demorecording = false;
        Con_Printf ("Completed demo\n");
@@ -250,7 +282,7 @@ void CL_Record_f (void)
        COM_DefaultExtension (name, ".dem");
 
        Con_Printf ("recording to %s.\n", name);
-       cls.demofile = fopen (name, "wb");
+       cls.demofile = Qopen (name, "wb");
        if (!cls.demofile)
        {
                Con_Printf ("ERROR: couldn't open.\n");
@@ -258,7 +290,7 @@ void CL_Record_f (void)
        }
 
        cls.forcetrack = track;
-       fprintf (cls.demofile, "%i\n", cls.forcetrack);
+       Qprintf (cls.demofile, "%i\n", cls.forcetrack);
        
        cls.demorecording = true;
 }
@@ -286,6 +318,8 @@ void CL_PlayDemo_f (void)
                return;
        }
 
+//     SCR_BeginLoadingPlaque();
+
 //
 // disconnect from server
 //
@@ -298,7 +332,7 @@ void CL_PlayDemo_f (void)
        COM_DefaultExtension (name, ".dem");
 
        Con_Printf ("Playing demo from %s.\n", name);
-       COM_FOpenFile (name, &cls.demofile, false);
+       COM_FOpenFile (name, &cls.demofile, false, true);
        if (!cls.demofile)
        {
                Con_Printf ("ERROR: couldn't open.\n");
@@ -310,7 +344,7 @@ void CL_PlayDemo_f (void)
        cls.state = ca_connected;
        cls.forcetrack = 0;
 
-       while ((c = getc(cls.demofile)) != '\n')
+       while ((c = Qgetc(cls.demofile)) != '\n')
                if (c == '-')
                        neg = true;
                else
@@ -363,10 +397,15 @@ void CL_TimeDemo_f (void)
        }
 
        CL_PlayDemo_f ();
-       
+
 // cls.td_starttime will be grabbed at the second frame of the demo, so
 // all the loading time doesn't get counted
-       
+
+       // instantly hide console and deactivate it
+       key_dest = key_game;
+       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