diff --git a/qw/include/sv_demo.h b/qw/include/sv_demo.h index b11be4c66..77902eb85 100644 --- a/qw/include/sv_demo.h +++ b/qw/include/sv_demo.h @@ -37,28 +37,9 @@ typedef struct header_s { byte full; int to; int size; - byte data[1]; // gcc doesn't allow [] (?) + byte data[1]; } header_t; -typedef struct demoinfo_s { - vec3_t origin; - vec3_t angles; - int weaponframe; - int skinnum; - int model; - int effects; -} demoinfo_t; - -typedef struct demo_client_s { - demoinfo_t info; - float sec; - int parsecount; - vec3_t angle; - float cmdtime; - int flags; - int frame; -} demo_client_t; - typedef struct demobuf_s { sizebuf_t sz; int bufsize; @@ -66,7 +47,6 @@ typedef struct demobuf_s { } demobuf_t; typedef struct demo_frame_s { - demo_client_t clients[MAX_CLIENTS]; double time; demobuf_t buf; } demo_frame_t; @@ -75,36 +55,23 @@ typedef struct demo_frame_s { #define DEMO_FRAMES_MASK (DEMO_FRAMES - 1) typedef struct demo_s { - QFile *file; - demobuf_t *dbuf; - dbuffer_t dbuffer; - byte buffer[20 * MAX_MSGLEN]; - sizebuf_t datagram; - byte datagram_data[MAX_DATAGRAM]; int lastto; int lasttype; double time, pingtime; - client_t recorder; + delta_t delta; int stats[MAX_CLIENTS][MAX_CL_STATS]; // ouch! - demoinfo_t info[MAX_CLIENTS]; demo_frame_t frames[DEMO_FRAMES]; + int forceFrame; int parsecount; int lastwritten; - int size; - qboolean disk; - void *dest; - byte *mfile; - struct dstring_s *name; - struct dstring_s *text; - - int forceFrame; + int size; // XXX doesn't belong here } demo_t; extern demo_t demo; diff --git a/qw/source/sv_demo.c b/qw/source/sv_demo.c index 022eb87cc..9504c65de 100644 --- a/qw/source/sv_demo.c +++ b/qw/source/sv_demo.c @@ -52,7 +52,15 @@ static __attribute__ ((unused)) const char rcsid[] = #include "sv_demo.h" #include "sv_progs.h" -demo_t demo; +demo_t demo; +static byte demo_buffer[20 * MAX_MSGLEN]; +static byte demo_datagram_data[MAX_DATAGRAM]; +static QFile *demo_file; +static byte *demo_mfile; +static qboolean demo_disk; +static dstring_t *demo_name; // filename of mvd +static dstring_t *demo_text; // filename of description file +static void *demo_dest; #define MIN_DEMO_MEMORY 0x100000 #define USECACHE (sv_demoUseCache->int_val && svs.demomemsize) @@ -105,7 +113,7 @@ SV_WriteDemoMessage (sizebuf_t *msg, int type, int to, float time) msec = 0; c = msec; - demo.size += DWRITE (&c, sizeof (c), demo.dest); + demo.size += DWRITE (&c, sizeof (c), demo_dest); if (demo.lasttype != type || demo.lastto != to) { demo.lasttype = type; @@ -113,19 +121,19 @@ SV_WriteDemoMessage (sizebuf_t *msg, int type, int to, float time) switch (demo.lasttype) { case dem_all: c = dem_all; - demo.size += DWRITE (&c, sizeof (c), demo.dest); + demo.size += DWRITE (&c, sizeof (c), demo_dest); break; case dem_multiple: c = dem_multiple; - demo.size += DWRITE (&c, sizeof (c), demo.dest); + demo.size += DWRITE (&c, sizeof (c), demo_dest); i = LittleLong (demo.lastto); - demo.size += DWRITE (&i, sizeof (i), demo.dest); + demo.size += DWRITE (&i, sizeof (i), demo_dest); break; case dem_single: case dem_stats: c = demo.lasttype + (demo.lastto << 3); - demo.size += DWRITE (&c, sizeof (c), demo.dest); + demo.size += DWRITE (&c, sizeof (c), demo_dest); break; default: SV_Stop (0); @@ -134,21 +142,21 @@ SV_WriteDemoMessage (sizebuf_t *msg, int type, int to, float time) } } else { c = dem_read; - demo.size += DWRITE (&c, sizeof (c), demo.dest); + demo.size += DWRITE (&c, sizeof (c), demo_dest); } len = LittleLong (msg->cursize); - demo.size += DWRITE (&len, 4, demo.dest); - demo.size += DWRITE (msg->data, msg->cursize, demo.dest); + demo.size += DWRITE (&len, 4, demo_dest); + demo.size += DWRITE (msg->data, msg->cursize, demo_dest); - if (demo.disk) - Qflush (demo.file); + if (demo_disk) + Qflush (demo_file); else if (demo.size - demo_size > demo_max_size) { demo_size = demo.size; - demo.mfile -= 0x80000; - Qwrite (demo.file, svs.demomem, 0x80000); - Qflush (demo.file); + demo_mfile -= 0x80000; + Qwrite (demo_file, svs.demomem, 0x80000); + Qflush (demo_file); memmove (svs.demomem, svs.demomem + 0x80000, demo.size - 0x80000); } } @@ -357,13 +365,13 @@ SV_Stop (int reason) if (reason == 2) { // stop and remove - if (demo.disk) - Qclose (demo.file); + if (demo_disk) + Qclose (demo_file); - QFS_Remove (demo.name->str); - QFS_Remove (demo.text->str); + QFS_Remove (demo_name->str); + QFS_Remove (demo_text->str); - demo.file = NULL; + demo_file = NULL; sv.demorecording = false; SV_BroadcastPrintf (PRINT_CHAT, @@ -385,14 +393,14 @@ SV_Stop (int reason) SV_DemoWritePackets (demo.parsecount - demo.lastwritten + 1); // finish up - if (!demo.disk) { - Qwrite (demo.file, svs.demomem, demo.size - demo_size); - Qflush (demo.file); + if (!demo_disk) { + Qwrite (demo_file, svs.demomem, demo.size - demo_size); + Qflush (demo_file); } - Qclose (demo.file); + Qclose (demo_file); - demo.file = NULL; + demo_file = NULL; sv.demorecording = false; if (!reason) SV_BroadcastPrintf (PRINT_CHAT, "Server recording completed\n"); @@ -409,8 +417,8 @@ SV_Stop (int reason) if ((p = strstr (sv_onrecordfinish->string, " ")) != NULL) *p = 0; // strip parameters - strcpy (path, demo.name->str); - strcpy (path + strlen (demo.name->str) - 3, "txt"); + strcpy (path, demo_name->str); + strcpy (path + strlen (demo_name->str) - 3, "txt"); sv_redirected = RD_NONE; // onrecord script is called always // from the console @@ -501,12 +509,12 @@ SV_InitRecord (void) { if (!USECACHE) { dwrite = &Qwrite; - demo.dest = demo.file; - demo.disk = true; + demo_dest = demo_file; + demo_disk = true; } else { dwrite = &memwrite; - demo.mfile = svs.demomem; - demo.dest = &demo.mfile; + demo_mfile = svs.demomem; + demo_dest = &demo_mfile; } demo_size = 0; @@ -527,18 +535,18 @@ SV_WriteRecordDemoMessage (sizebuf_t *msg) byte c; c = 0; - demo.size += DWRITE (&c, sizeof (c), demo.dest); + demo.size += DWRITE (&c, sizeof (c), demo_dest); c = dem_read; - demo.size += DWRITE (&c, sizeof (c), demo.dest); + demo.size += DWRITE (&c, sizeof (c), demo_dest); len = LittleLong (msg->cursize); - demo.size += DWRITE (&len, 4, demo.dest); + demo.size += DWRITE (&len, 4, demo_dest); - demo.size += DWRITE (msg->data, msg->cursize, demo.dest); + demo.size += DWRITE (msg->data, msg->cursize, demo_dest); - if (demo.disk) - Qflush (demo.file); + if (demo_disk) + Qflush (demo_file); } static void @@ -548,19 +556,19 @@ SV_WriteSetDemoMessage (void) byte c; c = 0; - demo.size += DWRITE (&c, sizeof (c), demo.dest); + demo.size += DWRITE (&c, sizeof (c), demo_dest); c = dem_set; - demo.size += DWRITE (&c, sizeof (c), demo.dest); + demo.size += DWRITE (&c, sizeof (c), demo_dest); len = LittleLong (0); - demo.size += DWRITE (&len, 4, demo.dest); + demo.size += DWRITE (&len, 4, demo_dest); len = LittleLong (0); - demo.size += DWRITE (&len, 4, demo.dest); + demo.size += DWRITE (&len, 4, demo_dest); - if (demo.disk) - Qflush (demo.file); + if (demo_disk) + Qflush (demo_file); } static const char * @@ -640,27 +648,22 @@ SV_Record (char *name) client_t *player; const char *gamedir, *s; - { - // save over memset - dstring_t *tn = demo.name, *tt = demo.text; - memset (&demo, 0, sizeof (demo)); - dstring_clearstr (demo.name = tn); - dstring_clearstr (demo.text = tt); - } - demo.recorder.delta.pvs = dt_pvs_fat; + memset (&demo, 0, sizeof (demo)); + + demo.delta.pvs = dt_pvs_fat; for (i = 0; i < UPDATE_BACKUP; i++) { - demo.recorder.delta.frames[i].entities.entities = demo_entities[i]; - demo.recorder.delta.frames[i].players.players = demo_players[i]; + demo.delta.frames[i].entities.entities = demo_entities[i]; + demo.delta.frames[i].players.players = demo_players[i]; } - DemoBuffer_Init (&demo.dbuffer, demo.buffer, sizeof (demo.buffer)); + DemoBuffer_Init (&demo.dbuffer, demo_buffer, sizeof (demo_buffer)); DemoSetMsgBuf (NULL, &demo.frames[0].buf); - demo.datagram.maxsize = sizeof (demo.datagram_data); - demo.datagram.data = demo.datagram_data; + demo.datagram.maxsize = sizeof (demo_datagram_data); + demo.datagram.data = demo_datagram_data; - demo.file = QFS_Open (name, "wb"); - if (!demo.file) { + demo_file = QFS_Open (name, "wb"); + if (!demo_file) { Con_Printf ("ERROR: couldn't open %s\n", name); return; } @@ -670,19 +673,19 @@ SV_Record (char *name) s = name + strlen (name); while (s > name && *s != '/') s--; - dstring_copystr (demo.name, s + (*s == '/')); + dstring_copystr (demo_name, s + (*s == '/')); SV_BroadcastPrintf (PRINT_CHAT, "Server started recording (%s):\n%s\n", - demo.disk ? "disk" : "memory", demo.name->str); - Cvar_Set (serverdemo, demo.name->str); + demo_disk ? "disk" : "memory", demo_name->str); + Cvar_Set (serverdemo, demo_name->str); - dstring_copystr (demo.text, name); - strcpy (demo.text->str + strlen (demo.text->str) - 3, "txt"); + dstring_copystr (demo_text, name); + strcpy (demo_text->str + strlen (demo_text->str) - 3, "txt"); if (sv_demotxt->int_val) { QFile *f; - f = QFS_Open (demo.text->str, "w+t"); + f = QFS_Open (demo_text->str, "w+t"); if (f != NULL) { char date[20]; time_t tim; @@ -697,7 +700,7 @@ SV_Record (char *name) Qclose (f); } } else - QFS_Remove (demo.text->str); + QFS_Remove (demo_text->str); sv.demorecording = true; demo.pingtime = demo.time = sv.time; @@ -1078,8 +1081,8 @@ Demo_Init (void) size = MIN_DEMO_MEMORY; } - demo.name = dstring_newstr (); - demo.text = dstring_newstr (); + demo_name = dstring_newstr (); + demo_text = dstring_newstr (); svs.demomem = Hunk_AllocName (size, "demo"); svs.demomemsize = size; diff --git a/qw/source/sv_send.c b/qw/source/sv_send.c index 3a0f4eb4f..2ba5832a2 100644 --- a/qw/source/sv_send.c +++ b/qw/source/sv_send.c @@ -863,12 +863,11 @@ SV_SendDemoMessage (void) msg.allowoverflow = true; msg.overflowed = false; - if (!demo.recorder.delta.delta_sequence) - demo.recorder.delta.delta_sequence = -1; - demo.recorder.delta.cur_frame = (demo.recorder.delta.delta_sequence + 1) - & UPDATE_MASK; - demo.recorder.delta.out_frame = demo.recorder.delta.cur_frame; - SV_WriteEntitiesToClient (&demo.recorder.delta, &msg); + if (!demo.delta.delta_sequence) + demo.delta.delta_sequence = -1; + demo.delta.cur_frame = (demo.delta.delta_sequence + 1) & UPDATE_MASK; + demo.delta.out_frame = demo.delta.cur_frame; + SV_WriteEntitiesToClient (&demo.delta, &msg); DemoWrite_Begin (dem_all, 0, msg.cursize); SZ_Write (&demo.dbuf->sz, msg.data, msg.cursize); // copy the accumulated multicast datagram @@ -879,9 +878,8 @@ SV_SendDemoMessage (void) SZ_Clear (&demo.datagram); } - demo.recorder.delta.delta_sequence = - demo.recorder.netchan.incoming_sequence & UPDATE_MASK; - demo.recorder.netchan.incoming_sequence++; + demo.delta.delta_sequence++; + demo.delta.delta_sequence &= UPDATE_MASK; demo.frames[demo.parsecount & DEMO_FRAMES_MASK].time = demo.time = sv.time; // that's a backup of 3sec at 20fps, should be enough