- same change for RedNukem front end.

This commit is contained in:
Christoph Oelckers 2019-11-08 01:04:27 +01:00
parent 47227fc90f
commit a40be954f1
8 changed files with 106 additions and 137 deletions

View file

@ -157,9 +157,9 @@ void D_AddWildFile (TArray<FString> &wadfiles, const char *value)
{ {
return; return;
} }
const char *wadfile = BaseFileSearch (value, ".wad", false); FString wadfile = BaseFileSearch (value, ".wad", false);
if (wadfile != NULL) if (wadfile.Len() != 0)
{ {
D_AddFile (wadfiles, wadfile); D_AddFile (wadfiles, wadfile);
} }

View file

@ -65,7 +65,6 @@ static void Demo_RestoreModes(int32_t menu)
g_player[myconnectindex].ps->gm |= MODE_DEMO; g_player[myconnectindex].ps->gm |= MODE_DEMO;
} }
// This is utterly gross. Global configuration should not be manipulated like this.
void Demo_PrepareWarp(void) void Demo_PrepareWarp(void)
{ {
if (!g_demo_paused) if (!g_demo_paused)
@ -279,9 +278,6 @@ void G_CloseDemoWrite(void)
g_demo_filePtr->Write("EnD!", 4); g_demo_filePtr->Write("EnD!", 4);
// lastly, we need to write the number of written recsyncs to the demo file // lastly, we need to write the number of written recsyncs to the demo file
if (g_demo_filePtr->Write(g_demo_filePtr, offsetof(savehead_t, reccnt)))
Printf("G_CloseDemoWrite: final fseek\n");
else
g_demo_filePtr->Write(&g_demo_cnt, sizeof(g_demo_cnt)); g_demo_filePtr->Write(&g_demo_cnt, sizeof(g_demo_cnt));
ud.recstat = ud.m_recstat = 0; ud.recstat = ud.m_recstat = 0;
@ -418,7 +414,8 @@ static void Demo_FinishProfile(void)
dn, gms, (gms*1000.0)/nt); dn, gms, (gms*1000.0)/nt);
} }
if (nf > 0) { if (nf > 0)
{
OSD_Printf("== demo %d: %d frames (%d frames/gametic)\n", dn, nf, g_demo_profile-1); OSD_Printf("== demo %d: %d frames (%d frames/gametic)\n", dn, nf, g_demo_profile-1);
OSD_Printf("== demo %d drawrooms times: %.03f s (%.03f ms/frame)\n", OSD_Printf("== demo %d drawrooms times: %.03f s (%.03f ms/frame)\n",
dn, dms1/1000.0, dms1/nf); dn, dms1/1000.0, dms1/nf);

View file

@ -206,7 +206,7 @@ static void ReadSaveGameHeaders_CACHE1D(TArray<FString> &saves)
static void ReadSaveGameHeaders_Internal(void) static void ReadSaveGameHeaders_Internal(void)
{ {
FString pattern = M_GetSavegamesPath() + "*.esv"; FString pattern = M_GetSavegamesPath() + "*.bsv";
TArray<FString> saves; TArray<FString> saves;
D_AddWildFile(saves, pattern); D_AddWildFile(saves, pattern);
// potentially overallocating but programmatically simple // potentially overallocating but programmatically simple
@ -750,7 +750,7 @@ int32_t G_SavePlayer(savebrief_t & sv, bool isAutoSave)
} }
else else
{ {
static char const SaveName[] = "save0000.svz"; static char const SaveName[] = "save0000.bsv";
fn.Format("%s%s", M_GetSavegamesPath().GetChars(), SaveName); fn.Format("%s%s", M_GetSavegamesPath().GetChars(), SaveName);
auto fnp = fn.LockBuffer(); auto fnp = fn.LockBuffer();
@ -1002,7 +1002,7 @@ static int32_t readspecdata(const dataspec_t *spec, FileReader *fil, uint8_t **d
if (!ptr || !cnt) if (!ptr || !cnt)
continue; continue;
if (fil != nullptr) if (fil != nullptr && fil->isOpen())
{ {
auto const mem = (dump && (spec->flags & DS_NOCHK) == 0) ? dump : (uint8_t *)ptr; auto const mem = (dump && (spec->flags & DS_NOCHK) == 0) ? dump : (uint8_t *)ptr;
int const siz = cnt * spec->size; int const siz = cnt * spec->size;
@ -1376,11 +1376,6 @@ static const dataspec_t svgm_udnetw[] =
{ 0, connectpoint2, sizeof(connectpoint2), 1 }, { 0, connectpoint2, sizeof(connectpoint2), 1 },
{ 0, &randomseed, sizeof(randomseed), 1 }, { 0, &randomseed, sizeof(randomseed), 1 },
{ 0, &g_globalRandom, sizeof(g_globalRandom), 1 }, { 0, &g_globalRandom, sizeof(g_globalRandom), 1 },
#ifdef LUNATIC
// Save game tic count for Lunatic because it is exposed to userland. See
// test/helixspawner.lua for an example.
{ 0, &g_moveThingsCount, sizeof(g_moveThingsCount), 1 },
#endif
// { 0, &lockclock_dummy, sizeof(lockclock), 1 }, // { 0, &lockclock_dummy, sizeof(lockclock), 1 },
{ DS_END, 0, 0, 0 } { DS_END, 0, 0, 0 }
}; };
@ -1695,7 +1690,7 @@ int32_t sv_saveandmakesnapshot(FileWriter &fil, char const *name, int8_t spot, i
} }
else else
{ {
int v = 64000; int v = 0;
fil.Write(&v, 4); fil.Write(&v, 4);
} }
@ -1810,7 +1805,7 @@ int32_t sv_loadsnapshot(FileReader &fil, int32_t spot, savehead_t *h)
} }
if (i > 0) if (i > 0)
{ {
if (fil.Seek(i, FileReader::SeekSet) != i) if (fil.Seek(i, FileReader::SeekCur) < 0)
{ {
OSD_Printf("sv_snapshot: failed skipping over the screenshot.\n"); OSD_Printf("sv_snapshot: failed skipping over the screenshot.\n");
return 8; return 8;
@ -2185,13 +2180,6 @@ static int32_t doloadplayer2(FileReader &fil, uint8_t **memptr)
PRINTSIZE("ud"); PRINTSIZE("ud");
if (readspecdata(svgm_secwsp, &fil, &mem)) return -4; if (readspecdata(svgm_secwsp, &fil, &mem)) return -4;
PRINTSIZE("sws"); PRINTSIZE("sws");
#ifdef LUNATIC
{
int32_t ret = El_ReadSaveCode(fil);
if (ret < 0)
return ret;
}
#endif
if (readspecdata(svgm_script, &fil, &mem)) return -5; if (readspecdata(svgm_script, &fil, &mem)) return -5;
PRINTSIZE("script"); PRINTSIZE("script");
if (readspecdata(svgm_anmisc, &fil, &mem)) return -6; if (readspecdata(svgm_anmisc, &fil, &mem)) return -6;

View file

@ -37,8 +37,8 @@ BEGIN_RR_NS
char g_firstDemoFile[BMAX_PATH]; char g_firstDemoFile[BMAX_PATH];
buildvfs_FILE g_demo_filePtr{}; // write FileWriter *g_demo_filePtr{}; // write
FileReader g_demo_recFilePtr; FileReader g_demo_recFilePtr; // read
int32_t g_demo_cnt; int32_t g_demo_cnt;
int32_t g_demo_goalCnt=0; int32_t g_demo_goalCnt=0;
@ -156,7 +156,7 @@ void G_OpenDemoWrite(void)
if (demonum == MAXDEMOS) if (demonum == MAXDEMOS)
return; return;
if (snprintf(demofn, sizeof(demofn), "%s" DEMOFN_FMT, M_GetSavegamesPath().GetChars(), demonum)) if (snprintf(demofn, sizeof(demofn), "%s" DEMOFN_FMT, M_GetDemoPath().GetChars(), demonum))
{ {
initprintf("Couldn't start demo writing: INTERNAL ERROR: file name too long\n"); initprintf("Couldn't start demo writing: INTERNAL ERROR: file name too long\n");
goto error_wopen_demo; goto error_wopen_demo;
@ -164,25 +164,26 @@ void G_OpenDemoWrite(void)
demonum++; demonum++;
g_demo_filePtr = buildvfs_fopen_read(demofn); g_demo_filePtr = FileWriter::Open(demofn);
if (g_demo_filePtr == NULL) if (g_demo_filePtr == NULL)
break; break;
MAYBE_FCLOSE_AND_NULL(g_demo_filePtr); delete g_demo_filePtr;
} }
while (1); while (1);
g_demo_filePtr = buildvfs_fopen_write(demofn); g_demo_filePtr = FileWriter::Open(demofn);
if (g_demo_filePtr == NULL) if (g_demo_filePtr == NULL)
return; return;
i=sv_saveandmakesnapshot(g_demo_filePtr, nullptr, -1, demorec_diffs_cvar, demorec_diffcompress_cvar, i=sv_saveandmakesnapshot(*g_demo_filePtr, nullptr, -1, demorec_diffs_cvar, demorec_diffcompress_cvar,
(demorec_seeds_cvar<<1)); (demorec_seeds_cvar<<1));
if (i) if (i)
{ {
MAYBE_FCLOSE_AND_NULL(g_demo_filePtr); delete g_demo_filePtr;
g_demo_filePtr = nullptr;
error_wopen_demo: error_wopen_demo:
Bstrcpy(apStrings[QUOTE_RESERVED4], "FAILED STARTING DEMO RECORDING. SEE OSD FOR DETAILS."); Bstrcpy(apStrings[QUOTE_RESERVED4], "FAILED STARTING DEMO RECORDING. SEE CONSOLE FOR DETAILS.");
P_DoQuote(QUOTE_RESERVED4, g_player[myconnectindex].ps); P_DoQuote(QUOTE_RESERVED4, g_player[myconnectindex].ps);
ud.recstat = ud.m_recstat = 0; ud.recstat = ud.m_recstat = 0;
return; return;
@ -233,13 +234,13 @@ static void Demo_WriteSync()
{ {
int16_t tmpreccnt; int16_t tmpreccnt;
buildvfs_fwrite("sYnC", 4, 1, g_demo_filePtr); g_demo_filePtr->Write("sYnC", 4);
tmpreccnt = (int16_t)ud.reccnt; tmpreccnt = (int16_t)ud.reccnt;
buildvfs_fwrite(&tmpreccnt, sizeof(int16_t), 1, g_demo_filePtr); g_demo_filePtr->Write(&tmpreccnt, sizeof(int16_t));
if (demorec_seeds) if (demorec_seeds)
buildvfs_fwrite(g_demo_seedbuf, 1, ud.reccnt, g_demo_filePtr); g_demo_filePtr->Write(g_demo_seedbuf, ud.reccnt);
buildvfs_fwrite(recsync, sizeof(input_t), ud.reccnt, g_demo_filePtr); g_demo_filePtr->Write(recsync, sizeof(input_t)* ud.reccnt);
ud.reccnt = 0; ud.reccnt = 0;
} }
@ -276,16 +277,14 @@ void G_CloseDemoWrite(void)
if (ud.reccnt > 0) if (ud.reccnt > 0)
Demo_WriteSync(); Demo_WriteSync();
buildvfs_fwrite("EnD!", 4, 1, g_demo_filePtr); g_demo_filePtr->Write("EnD!", 4);
// lastly, we need to write the number of written recsyncs to the demo file // lastly, we need to write the number of written recsyncs to the demo file
if (buildvfs_fseek_abs(g_demo_filePtr, offsetof(savehead_t, reccnt))) g_demo_filePtr->Write(&g_demo_cnt, sizeof(g_demo_cnt));
perror("G_CloseDemoWrite: final fseek");
else
buildvfs_fwrite(&g_demo_cnt, sizeof(g_demo_cnt), 1, g_demo_filePtr);
ud.recstat = ud.m_recstat = 0; ud.recstat = ud.m_recstat = 0;
MAYBE_FCLOSE_AND_NULL(g_demo_filePtr); delete g_demo_filePtr;
g_demo_filePtr = nullptr;
sv_freemem(); sv_freemem();

View file

@ -33,7 +33,7 @@ BEGIN_RR_NS
#define LDEMOFN_FMT "demo%d.dmo" #define LDEMOFN_FMT "demo%d.dmo"
#define MAXDEMOS 1000 #define MAXDEMOS 1000
extern FILE *g_demo_filePtr; extern FileWriter * g_demo_filePtr;
extern char g_firstDemoFile[BMAX_PATH]; extern char g_firstDemoFile[BMAX_PATH];
extern int32_t g_demo_cnt; extern int32_t g_demo_cnt;

View file

@ -362,7 +362,10 @@ void G_GameExit(const char *msg)
if (ud.recstat == 1) if (ud.recstat == 1)
G_CloseDemoWrite(); G_CloseDemoWrite();
else if (ud.recstat == 2) else if (ud.recstat == 2)
MAYBE_FCLOSE_AND_NULL(g_demo_filePtr); {
delete g_demo_filePtr;
g_demo_filePtr = nullptr;
}
// JBF: fixes crash on demo playback // JBF: fixes crash on demo playback
// PK: modified from original // PK: modified from original

View file

@ -186,7 +186,7 @@ static void ReadSaveGameHeaders_CACHE1D(TArray<FString>& saves)
static void ReadSaveGameHeaders_Internal(void) static void ReadSaveGameHeaders_Internal(void)
{ {
FString pattern = M_GetSavegamesPath() + "*.esv"; FString pattern = M_GetSavegamesPath() + "*.bsv";
TArray<FString> saves; TArray<FString> saves;
D_AddWildFile(saves, pattern); D_AddWildFile(saves, pattern);
@ -480,55 +480,52 @@ int32_t G_SavePlayer(savebrief_t & sv, bool isAutoSave)
Net_WaitForEverybody(); Net_WaitForEverybody();
ready2send = 0; ready2send = 0;
char temp[BMAX_PATH]; FString fn;
errno = 0; errno = 0;
FILE *fil; buildvfs_FILE fil;
if (sv.isValid()) if (sv.isValid())
{ {
if (snprintf(temp, sizeof(temp), "%s%s", M_GetSavegamesPath().GetChars(), sv.path)) fn.Format("%s%s", M_GetSavegamesPath().GetChars(), sv.path);
{ fil = fopen(fn, "wb");
OSD_Printf("G_SavePlayer: file name \"%s\" too long\n", sv.path);
goto saveproblem;
}
fil = fopen(temp, "wb");
} }
else else
{ {
static char const SaveName[] = "save0000.esv"; static char const SaveName[] = "save0000.bsv";
int const len = snprintf(temp, ARRAY_SIZE(temp), "%s%s", M_GetSavegamesPath().GetChars(), SaveName); fn.Format("%s%s", M_GetSavegamesPath().GetChars(), SaveName);
if (len >= ARRAY_SSIZE(temp)-1)
{ auto fnp = fn.LockBuffer();
OSD_Printf("G_SavePlayer: could not form automatic save path\n"); char* zeros = fnp + (fn.Len() - 8);
goto saveproblem; fil = savecounter.opennextfile(fnp, zeros);
} fn.UnlockBuffer();
char * zeros = temp + (len-8);
fil = savecounter.opennextfile(temp, zeros);
savecounter.count++; savecounter.count++;
// don't copy the mod dir into sv.path // don't copy the mod dir into sv.path
Bstrcpy(sv.path, temp + (len-(ARRAY_SIZE(SaveName)-1))); Bstrcpy(sv.path, fn + (fn.Len() - (ARRAY_SIZE(SaveName) - 1)));
} }
FileWriter fw(fil);
if (!fil) if (!fil)
{ {
OSD_Printf("G_SavePlayer: failed opening \"%s\" for writing: %s\n", OSD_Printf("G_SavePlayer: failed opening \"%s\" for writing: %s\n",
temp, strerror(errno)); fn, strerror(errno));
goto saveproblem; ready2send = 1;
} Net_WaitForEverybody();
G_RestoreTimers();
ototalclock = totalclock;
return -1;
}
else
{
// temporary hack // temporary hack
ud.user_map = G_HaveUserMap(); ud.user_map = G_HaveUserMap();
#ifdef POLYMER
if (videoGetRenderMode() == REND_POLYMER)
polymer_resetlights();
#endif
// SAVE! // SAVE!
sv_saveandmakesnapshot(fil, sv.name, 0, 0, 0, 0, isAutoSave); sv_saveandmakesnapshot(fw, sv.name, 0, 0, 0, 0, isAutoSave);
fclose(fil); fw.Close();
if (!g_netServer && ud.multimode < 2) if (!g_netServer && ud.multimode < 2)
{ {
@ -543,15 +540,7 @@ int32_t G_SavePlayer(savebrief_t & sv, bool isAutoSave)
ototalclock = totalclock; ototalclock = totalclock;
return 0; return 0;
}
saveproblem:
ready2send = 1;
Net_WaitForEverybody();
G_RestoreTimers();
ototalclock = totalclock;
return -1;
} }
int32_t G_LoadPlayerMaybeMulti(savebrief_t & sv) int32_t G_LoadPlayerMaybeMulti(savebrief_t & sv)
@ -637,7 +626,7 @@ static inline void ds_get(const dataspec_t *spec, void **ptr, int32_t *cnt)
} }
// write state to file and/or to dump // write state to file and/or to dump
static uint8_t *writespecdata(const dataspec_t *spec, FILE *fil, uint8_t *dump) static uint8_t *writespecdata(const dataspec_t *spec, FileWriter *fil, uint8_t *dump)
{ {
for (; spec->flags != DS_END; spec++) for (; spec->flags != DS_END; spec++)
{ {
@ -652,7 +641,7 @@ static uint8_t *writespecdata(const dataspec_t *spec, FILE *fil, uint8_t *dump)
continue; continue;
else if (spec->flags & DS_STRING) else if (spec->flags & DS_STRING)
{ {
fwrite(spec->ptr, Bstrlen((const char *)spec->ptr), 1, fil); // not null-terminated! fil->Write(spec->ptr, Bstrlen((const char *)spec->ptr)); // not null-terminated!
continue; continue;
} }
@ -672,7 +661,7 @@ static uint8_t *writespecdata(const dataspec_t *spec, FILE *fil, uint8_t *dump)
if (fil) if (fil)
{ {
fwrite(ptr, spec->size, cnt, fil); fil->Write(ptr, spec->size * cnt);
} }
if (dump && (spec->flags & (DS_NOCHK|DS_CMP)) == 0) if (dump && (spec->flags & (DS_NOCHK|DS_CMP)) == 0)
@ -739,7 +728,7 @@ static int32_t readspecdata(const dataspec_t *spec, FileReader *fil, uint8_t **d
if (!ptr || !cnt) if (!ptr || !cnt)
continue; continue;
if (fil->isOpen()) if (fil != nullptr && fil->isOpen())
{ {
auto const mem = (dump && (spec->flags & DS_NOCHK) == 0) ? dump : (uint8_t *)ptr; auto const mem = (dump && (spec->flags & DS_NOCHK) == 0) ? dump : (uint8_t *)ptr;
int const siz = cnt * spec->size; int const siz = cnt * spec->size;
@ -1267,7 +1256,7 @@ static const dataspec_t svgm_anmisc[] =
{ DS_END, 0, 0, 0 } { DS_END, 0, 0, 0 }
}; };
static uint8_t *dosaveplayer2(FILE *fil, uint8_t *mem); static uint8_t *dosaveplayer2(FileWriter *fil, uint8_t *mem);
static int32_t doloadplayer2(FileReader &fil, uint8_t **memptr); static int32_t doloadplayer2(FileReader &fil, uint8_t **memptr);
static void postloadplayer(int32_t savegamep); static void postloadplayer(int32_t savegamep);
@ -1299,7 +1288,7 @@ static void SV_AllocSnap(int32_t allocinit)
} }
// make snapshot only if spot < 0 (demo) // make snapshot only if spot < 0 (demo)
int32_t sv_saveandmakesnapshot(FILE *fil, char const *name, int8_t spot, int8_t recdiffsp, int8_t diffcompress, int8_t synccompress, bool isAutoSave) int32_t sv_saveandmakesnapshot(FileWriter &fil, char const *name, int8_t spot, int8_t recdiffsp, int8_t diffcompress, int8_t synccompress, bool isAutoSave)
{ {
savehead_t h; savehead_t h;
@ -1347,10 +1336,6 @@ int32_t sv_saveandmakesnapshot(FILE *fil, char const *name, int8_t spot, int8_t
{ {
// savegame // savegame
Bstrncpyz(h.savename, name, sizeof(h.savename)); Bstrncpyz(h.savename, name, sizeof(h.savename));
#ifdef __ANDROID__
Bstrncpyz(h.volname, g_volumeNames[ud.volume_number], sizeof(h.volname));
Bstrncpyz(h.skillname, g_skillNames[ud.player_skill], sizeof(h.skillname));
#endif
} }
else else
{ {
@ -1367,40 +1352,37 @@ int32_t sv_saveandmakesnapshot(FILE *fil, char const *name, int8_t spot, int8_t
// write header // write header
fwrite(&h, sizeof(savehead_t), 1, fil); fil.Write(&h, sizeof(savehead_t));
// for savegames, the file offset after the screenshot goes here; // for savegames, the file offset after the screenshot goes here;
// for demos, we keep it 0 to signify that we didn't save one // for demos, we keep it 0 to signify that we didn't save one
fwrite("\0\0\0\0", 4, 1, fil);
if (spot >= 0 && tileData(TILE_SAVESHOT)) if (spot >= 0 && tileData(TILE_SAVESHOT))
{ {
int32_t ofs;
int v = 64000;
fil.Write(&v, 4);
// write the screenshot compressed // write the screenshot compressed
fwrite(tileData(TILE_SAVESHOT), 320, 200, fil); fil.Write(tileData(TILE_SAVESHOT), 320*200);
// write the current file offset right after the header }
ofs = ftell(fil); else
fseek(fil, sizeof(savehead_t), SEEK_SET); {
fwrite(&ofs, 4, 1, fil); int v = 0;
fseek(fil, ofs, SEEK_SET); fil.Write(&v, 4);
} }
#ifdef DEBUGGINGAIDS
OSD_Printf("sv_saveandmakesnapshot: snapshot size: %d bytes.\n", svsnapsiz);
#endif
if (spot >= 0) if (spot >= 0)
{ {
// savegame // savegame
dosaveplayer2(fil, NULL); dosaveplayer2(&fil, NULL);
} }
else else
{ {
// demo // demo
SV_AllocSnap(0); SV_AllocSnap(0);
uint8_t * const p = dosaveplayer2(fil, svsnapshot); uint8_t * const p = dosaveplayer2(&fil, svsnapshot);
if (p != svsnapshot+svsnapsiz) if (p != svsnapshot+svsnapsiz)
{ {
@ -1441,7 +1423,7 @@ int32_t sv_loadheader(FileReader &fil, int32_t spot, savehead_t *h)
#ifndef DEBUGGINGAIDS #ifndef DEBUGGINGAIDS
if (havedemo) if (havedemo)
#endif #endif
OSD_Printf("Incompatible file version. Expected %d.%d.%d.%d.%0x, found %d.%d.%d.%d.%0x\n", SV_MAJOR_VER, SV_MINOR_VER, BYTEVERSION, OSD_Printf("Incompatible savegame. Expected version %d.%d.%d.%d.%0x, found %d.%d.%d.%d.%0x\n", SV_MAJOR_VER, SV_MINOR_VER, BYTEVERSION,
ud.userbytever, g_scriptcrc, h->majorver, h->minorver, h->bytever, h->userbytever, h->scriptcrc); ud.userbytever, g_scriptcrc, h->majorver, h->minorver, h->bytever, h->userbytever, h->scriptcrc);
if (h->majorver == SV_MAJOR_VER && h->minorver == SV_MINOR_VER) if (h->majorver == SV_MAJOR_VER && h->minorver == SV_MINOR_VER)
@ -1500,7 +1482,7 @@ int32_t sv_loadsnapshot(FileReader &fil, int32_t spot, savehead_t *h)
} }
if (i > 0) if (i > 0)
{ {
if (fil.Seek(i, FileReader::SeekSet) != i) if (fil.Seek(i, FileReader::SeekCur) < 0)
{ {
OSD_Printf("sv_snapshot: failed skipping over the screenshot.\n"); OSD_Printf("sv_snapshot: failed skipping over the screenshot.\n");
return 8; return 8;
@ -1554,7 +1536,7 @@ int32_t sv_loadsnapshot(FileReader &fil, int32_t spot, savehead_t *h)
} }
uint32_t sv_writediff(FILE *fil) uint32_t sv_writediff(FileWriter *fil)
{ {
uint8_t *p = svsnapshot; uint8_t *p = svsnapshot;
uint8_t *d = svdiff; uint8_t *d = svdiff;
@ -1569,10 +1551,10 @@ uint32_t sv_writediff(FILE *fil)
uint32_t const diffsiz = d - svdiff; uint32_t const diffsiz = d - svdiff;
fwrite("dIfF",4,1,fil); fil->Write("dIfF",4);
fwrite(&diffsiz, sizeof(diffsiz), 1, fil); fil->Write(&diffsiz, sizeof(diffsiz));
fwrite(svdiff, 1, diffsiz, fil); fil->Write(svdiff, diffsiz);
return diffsiz; return diffsiz;
} }
@ -1746,7 +1728,7 @@ static void sv_restload()
# define PRINTSIZE(name) do { } while (0) # define PRINTSIZE(name) do { } while (0)
#endif #endif
static uint8_t *dosaveplayer2(FILE *fil, uint8_t *mem) static uint8_t *dosaveplayer2(FileWriter *fil, uint8_t *mem)
{ {
#ifdef DEBUGGINGAIDS #ifdef DEBUGGINGAIDS
uint8_t *tmem = mem; uint8_t *tmem = mem;

View file

@ -112,10 +112,10 @@ extern uint16_t g_nummenusaves;
int32_t sv_updatestate(int32_t frominit); int32_t sv_updatestate(int32_t frominit);
int32_t sv_readdiff(FileReader& fil); int32_t sv_readdiff(FileReader& fil);
uint32_t sv_writediff(FILE *fil); uint32_t sv_writediff(FileWriter *fil);
int32_t sv_loadheader(FileReader &fil, int32_t spot, savehead_t *h); int32_t sv_loadheader(FileReader &fil, int32_t spot, savehead_t *h);
int32_t sv_loadsnapshot(FileReader &fil, int32_t spot, savehead_t *h); int32_t sv_loadsnapshot(FileReader &fil, int32_t spot, savehead_t *h);
int32_t sv_saveandmakesnapshot(FILE *fil, char const *name, int8_t spot, int8_t recdiffsp, int8_t diffcompress, int8_t synccompress, bool isAutoSave = false); int32_t sv_saveandmakesnapshot(FileWriter &fil, char const *name, int8_t spot, int8_t recdiffsp, int8_t diffcompress, int8_t synccompress, bool isAutoSave = false);
void sv_freemem(); void sv_freemem();
void G_DeleteSave(savebrief_t const & sv); void G_DeleteSave(savebrief_t const & sv);
void G_DeleteOldSaves(void); void G_DeleteOldSaves(void);