Save demos with a delayed file write

This commit is contained in:
Lephenixnoir 2021-10-01 11:59:06 +02:00
parent 073f1ba9b0
commit 84451e463f
Signed by: Lephenixnoir
GPG Key ID: 1BBA026E13FC0495
4 changed files with 28 additions and 16 deletions

View File

@ -131,7 +131,7 @@ const char *CGD_WADFileName = NULL;
const char *CGD_RecordDemoName = NULL;
/* Delayed file accesses */
CGD_DelayedFileWrite CGD_DelayedSaves[6] = { 0 };
CGD_DelayedFileWrite CGD_DelayedSaves[CGD_DELAYEDSAVES_COUNT] = { 0 };
/* Performance counters */
struct CGD_Perf CGD_Perf;
@ -435,7 +435,7 @@ static void DelayedWriteFile(int i)
fc_path[j++] = dfw->filename[i];
fc_path[j++] = 0x0000;
UI_DelayedWrites(CGD_DelayedSaves, 6, i, -1);
UI_DelayedWrites(CGD_DelayedSaves, CGD_DELAYEDSAVES_COUNT, i, -1);
Bfile_DeleteEntry(fc_path);
@ -463,7 +463,8 @@ static void DelayedWriteFile(int i)
source += chunk_size;
size -= chunk_size;
UI_DelayedWrites(CGD_DelayedSaves, 6, i, dfw->size - size);
UI_DelayedWrites(CGD_DelayedSaves, CGD_DELAYEDSAVES_COUNT, i,
dfw->size - size);
}
Bfile_CloseFile_OS(fd);
@ -728,8 +729,7 @@ int main(void)
if(gWADfd >= 0)
Bfile_CloseFile_OS(gWADfd);
int delayed_writes = sizeof(CGD_DelayedSaves) / sizeof(CGD_DelayedSaves[0]);
for(int i = 0; i < delayed_writes; i++) {
for(int i = 0; i < CGD_DELAYEDSAVES_COUNT; i++) {
CGD_DelayedFileWrite *dfw = &CGD_DelayedSaves[i];
if(dfw->data != NULL)
DelayedWriteFile(i);

View File

@ -69,11 +69,18 @@ extern int CGD_TrustUnalignedLumps;
extern int startmap, startepisode;
/* WAD file name (without .wad), used to avoid save file conflicts */
extern const char *CGD_WADFileName;
/* Save Game operations delayed until closing the add-in (one per save) */
extern CGD_DelayedFileWrite CGD_DelayedSaves[6];
/* Name of record demo file */
extern const char *CGD_RecordDemoName;
/* IDs for delayed saves */
enum {
CGD_DELAYEDSAVES_SAVES = 0, /* 6 entries */
CGD_DELAYEDSAVES_DEMO = 6,
CGD_DELAYEDSAVES_COUNT,
};
/* Save Game operations delayed until closing the add-in (one per save) */
extern CGD_DelayedFileWrite CGD_DelayedSaves[CGD_DELAYEDSAVES_COUNT];
// Keyboard interface.

View File

@ -953,9 +953,10 @@ void G_DoLoadGame (void)
gameaction = ga_nothing;
/* Read data from yet-unsaved saves */
if (CGD_DelayedSaves[saveslotnumber].data != NULL) {
savebuffer = (void *)CGD_DelayedSaves[saveslotnumber].data;
length = CGD_DelayedSaves[saveslotnumber].size;
int n = CGD_DELAYEDSAVES_SAVES + saveslotnumber;
if (CGD_DelayedSaves[n].data != NULL) {
savebuffer = (void *)CGD_DelayedSaves[n].data;
length = CGD_DelayedSaves[n].size;
}
else {
sprintf(savename, "%s_%d.dsg", CGD_WADFileName, saveslotnumber);
@ -1001,7 +1002,7 @@ void G_DoLoadGame (void)
I_Error ("Bad savegame");
// done
if (CGD_DelayedSaves[saveslotnumber].data == NULL)
if (CGD_DelayedSaves[n].data == NULL)
Z_Free (savebuffer);
if (setsizeneeded)
@ -1067,7 +1068,8 @@ boolean G_DoSaveGame (void)
save_now = true;
#endif
CGD_DelayedFileWrite *dfw = &CGD_DelayedSaves[savegameslot];
int n = CGD_DELAYEDSAVES_SAVES + savegameslot;
CGD_DelayedFileWrite *dfw = &CGD_DelayedSaves[n];
/* Allocate memory to hold the data while delaying */
if (!save_now) {
@ -1434,8 +1436,10 @@ boolean G_CheckDemoStatus (void)
if (demorecording)
{
*demo_p++ = DEMOMARKER;
M_WriteFile (demoname, demobuffer, demo_p - demobuffer);
Z_Free (demobuffer);
CGD_DelayedFileWrite *dfw = &CGD_DelayedSaves[CGD_DELAYEDSAVES_DEMO];
strcpy(dfw->filename, demoname);
dfw->data = demobuffer;
dfw->size = demo_p - demobuffer;
demorecording = false;
printf ("Demo %s recorded", demoname);
}

View File

@ -468,8 +468,9 @@ void M_ReadSaveStrings(void)
for (i = 0;i < load_end;i++)
{
/* Use the pending file write as a bypass */
if (CGD_DelayedSaves[i].data != NULL) {
memcpy(savegamestrings[i], CGD_DelayedSaves[i].data,
int n = CGD_DELAYEDSAVES_SAVES + i;
if (CGD_DelayedSaves[n].data != NULL) {
memcpy(savegamestrings[i], CGD_DelayedSaves[n].data,
SAVESTRINGSIZE);
LoadMenu[i].status = 1;
continue;