Save demos with a delayed file write
This commit is contained in:
parent
073f1ba9b0
commit
84451e463f
|
@ -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);
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue