X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=cl_demo.c;h=5f7ad08024e5ecdb189bf3930380475738fcbf65;hb=d4ffce6349c1960f435b8877832d88c7c54e17ba;hp=13fbed5b0ad43a0fcec26737b500c0da129bc92d;hpb=cc63b89849022ef37ef113a7dc9489c2e846bd1b;p=xonotic%2Fdarkplaces.git diff --git a/cl_demo.c b/cl_demo.c index 13fbed5b..5f7ad080 100644 --- 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 -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. @@ -35,6 +35,36 @@ 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 + + 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 +72,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); + FS_Close (cls.demofile); cls.demoplayback = false; cls.demofile = NULL; - cls.state = ca_disconnected; if (cls.timedemo) CL_FinishTimeDemo (); @@ -73,14 +103,14 @@ void CL_WriteDemoMessage (void) return; len = LittleLong (net_message.cursize); - fwrite (&len, 4, 1, cls.demofile); + FS_Write (cls.demofile, &len, 4); for (i=0 ; i<3 ; i++) { f = LittleFloat (cl.viewangles[i]); - fwrite (&f, 4, 1, cls.demofile); + FS_Write (cls.demofile, &f, 4); } - fwrite (net_message.data, net_message.cursize, 1, cls.demofile); - fflush (cls.demofile); + FS_Write (cls.demofile, net_message.data, net_message.cursize); + FS_Flush (cls.demofile); } /* @@ -94,60 +124,60 @@ int CL_GetMessage (void) { int r, i; float f; - + if (cls.demoplayback) { if (cls.demopaused) // LordHavoc: pausedemo return 0; - // decide if it is time to grab the next message - if (cls.signon == SIGNONS) // allways grab until fully connected + // decide if it is time to grab the next message + 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 if (host_framecount == cls.td_startframe + 1) cls.td_starttime = realtime; } - else if ( /* cl.time > 0 && */ cl.time <= cl.mtime[0]) + else if (cl.time <= cl.mtime[0]) { return 0; // don't need another message yet } } - + // get the next message - fread (&net_message.cursize, 4, 1, cls.demofile); + FS_Read (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 = FS_Read (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 = fread (net_message.data, net_message.cursize, 1, cls.demofile); - if (r != 1) + if (net_message.cursize > MAX_DATAGRAM) + Host_Error ("Demo message > MAX_DATAGRAM"); + r = FS_Read (cls.demofile, net_message.data, net_message.cursize); + if (r != net_message.cursize) { - CL_StopPlayback (); + CL_Disconnect (); return 0; } - + return 1; } while (1) { 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"); @@ -157,7 +187,7 @@ int CL_GetMessage (void) if (cls.demorecording) CL_WriteDemoMessage (); - + return r; } @@ -186,7 +216,7 @@ void CL_Stop_f (void) CL_WriteDemoMessage (); // finish up - fclose (cls.demofile); + FS_Close (cls.demofile); cls.demofile = NULL; cls.demorecording = false; Con_Printf ("Completed demo\n"); @@ -201,9 +231,8 @@ record [cd track] */ 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; @@ -227,30 +256,27 @@ void CL_Record_f (void) 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 - 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); - -// -// open the demo file -// - COM_DefaultExtension (name, ".dem"); + // open the demo file Con_Printf ("recording to %s.\n", name); - cls.demofile = fopen (name, "wb"); + cls.demofile = FS_Open (name, "wb", false); if (!cls.demofile) { Con_Printf ("ERROR: couldn't open.\n"); @@ -258,8 +284,8 @@ void CL_Record_f (void) } cls.forcetrack = track; - fprintf (cls.demofile, "%i\n", cls.forcetrack); - + FS_Printf (cls.demofile, "%i\n", cls.forcetrack); + cls.demorecording = true; } @@ -286,19 +312,15 @@ void CL_PlayDemo_f (void) return; } -// -// disconnect from server -// + // disconnect from server CL_Disconnect (); - -// -// open the demo file -// + + // open the demo file strcpy (name, Cmd_Argv(1)); - COM_DefaultExtension (name, ".dem"); + FS_DefaultExtension (name, ".dem"); Con_Printf ("Playing demo from %s.\n", name); - COM_FOpenFile (name, &cls.demofile, false); + cls.demofile = FS_Open (name, "rb", false); if (!cls.demofile) { Con_Printf ("ERROR: couldn't open.\n"); @@ -306,11 +328,13 @@ void CL_PlayDemo_f (void) return; } + SCR_BeginLoadingPlaque (); + cls.demoplayback = true; cls.state = ca_connected; cls.forcetrack = 0; - while ((c = getc(cls.demofile)) != '\n') + while ((c = FS_Getc (cls.demofile)) != '\n') if (c == '-') neg = true; else @@ -318,8 +342,6 @@ void CL_PlayDemo_f (void) if (neg) cls.forcetrack = -cls.forcetrack; -// ZOID, fscanf is evil -// fscanf (cls.demofile, "%i\n", &cls.forcetrack); } /* @@ -332,9 +354,9 @@ void CL_FinishTimeDemo (void) { int frames; double time; // LordHavoc: changed timedemo accuracy to double - + cls.timedemo = false; - + // the first frame didn't count frames = (host_framecount - cls.td_startframe) - 1; time = realtime - cls.td_starttime; @@ -363,10 +385,16 @@ 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; + key_consoleactive = 0; + 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