diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 495c81d21..4faa19ccc 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -785,6 +785,7 @@ void D_RegisterServerCommands(void) CV_RegisterVar(&cv_recordmultiplayerdemos); CV_RegisterVar(&cv_netdemosyncquality); + CV_RegisterVar(&cv_maxdemosize); } // ========================================================================= diff --git a/src/g_game.c b/src/g_game.c index e778b19cc..93c502d06 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -345,6 +345,10 @@ consvar_t cv_recordmultiplayerdemos = {"netdemo_record", "Manual Save", CV_SAVE, static CV_PossibleValue_t netdemosyncquality_cons_t[] = {{1, "MIN"}, {35, "MAX"}, {0, NULL}}; consvar_t cv_netdemosyncquality = {"netdemo_syncquality", "1", CV_SAVE, netdemosyncquality_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; +// Units are MiB. +static CV_PossibleValue_t maxdemosize_cons_t[] = {{10, "MIN"}, {100, "MAX"}, {0, NULL}}; +consvar_t cv_maxdemosize = {"maxdemosize", "10", CV_SAVE, maxdemosize_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; + static UINT8 *savebuffer; // Analog Control @@ -6743,29 +6747,35 @@ void G_RecordDemo(const char *name) strcpy(demoname, name); strcat(demoname, ".lmp"); - //@TODO make a maxdemosize cvar - maxsize = 1024*1024*2; - if (M_CheckParm("-maxdemo") && M_IsNextParm()) - maxsize = atoi(M_GetNextParm()) * 1024; + maxsize = cv_maxdemosize.value*1024*1024; if (demobuffer) free(demobuffer); demo_p = NULL; + demo.recording = false; demobuffer = malloc(maxsize); demoend = demobuffer + maxsize; - demo.recording = true; + if (demobuffer) + demo.recording = true; + else + CONS_Alert(CONS_ERROR, "Failed to allocate demo buffer\n"); } void G_RecordMetal(void) { INT32 maxsize; - maxsize = 1024*1024; - if (M_CheckParm("-maxdemo") && M_IsNextParm()) - maxsize = atoi(M_GetNextParm()) * 1024; + maxsize = cv_maxdemosize.value*1024*1024; + if (demobuffer) + free(demobuffer); demo_p = NULL; + metalrecording = false; demobuffer = malloc(maxsize); demoend = demobuffer + maxsize; - metalrecording = true; + + if (demobuffer) + metalrecording = true; + else + CONS_Alert(CONS_ERROR, "Failed to allocate demo buffer\n"); } void G_BeginRecording(void) diff --git a/src/g_game.h b/src/g_game.h index 0f55724c0..c99404a35 100644 --- a/src/g_game.h +++ b/src/g_game.h @@ -39,7 +39,7 @@ extern UINT8 *demo_p; // ====================================== // demoplaying back and demo recording -extern consvar_t cv_recordmultiplayerdemos, cv_netdemosyncquality; +extern consvar_t cv_recordmultiplayerdemos, cv_netdemosyncquality, cv_maxdemosize; // Publicly-accessible demo vars struct demovars_s { diff --git a/src/m_menu.c b/src/m_menu.c index f698d611c..5cb6b1ff3 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -562,6 +562,7 @@ static menuitem_t MISC_ReplayOptionsMenu[] = { {IT_CVAR|IT_STRING, NULL, "Record Replays", &cv_recordmultiplayerdemos, 0}, {IT_CVAR|IT_STRING, NULL, "Sync Check Interval", &cv_netdemosyncquality, 10}, + {IT_CVAR|IT_STRING, NULL, "Max demo size (MiB)", &cv_maxdemosize, 20}, }; static tic_t playback_last_menu_interaction_leveltime = 0;