Add functions to initialize savebuffer_t
g_demo.c is mostly unaltered because it is made of twigs.
This commit is contained in:
parent
ca4602848c
commit
5fee047fe6
7 changed files with 171 additions and 119 deletions
|
|
@ -1158,29 +1158,26 @@ static boolean SV_ResendingSavegameToAnyone(void)
|
|||
static void SV_SendSaveGame(INT32 node, boolean resending)
|
||||
{
|
||||
size_t length, compressedlen;
|
||||
savebuffer_t save;
|
||||
savebuffer_t save = {0};
|
||||
UINT8 *compressedsave;
|
||||
UINT8 *buffertosend;
|
||||
|
||||
// first save it in a malloced buffer
|
||||
save.size = NETSAVEGAMESIZE;
|
||||
save.buffer = (UINT8 *)malloc(save.size);
|
||||
if (!save.buffer)
|
||||
if (P_SaveBufferAlloc(&save, NETSAVEGAMESIZE) == false)
|
||||
{
|
||||
CONS_Alert(CONS_ERROR, M_GetText("No more free memory for savegame\n"));
|
||||
return;
|
||||
}
|
||||
|
||||
// Leave room for the uncompressed length.
|
||||
save.p = save.buffer + sizeof(UINT32);
|
||||
save.end = save.buffer + save.size;
|
||||
save.p += sizeof(UINT32);
|
||||
|
||||
P_SaveNetGame(&save, resending);
|
||||
|
||||
length = save.p - save.buffer;
|
||||
if (length > NETSAVEGAMESIZE)
|
||||
{
|
||||
free(save.buffer);
|
||||
P_SaveBufferFree(&save);
|
||||
I_Error("Savegame buffer overrun");
|
||||
}
|
||||
|
||||
|
|
@ -1197,7 +1194,7 @@ static void SV_SendSaveGame(INT32 node, boolean resending)
|
|||
if ((compressedlen = lzf_compress(save.buffer + sizeof(UINT32), length - sizeof(UINT32), compressedsave + sizeof(UINT32), length - sizeof(UINT32) - 1)))
|
||||
{
|
||||
// Compressing succeeded; send compressed data
|
||||
free(save.buffer);
|
||||
P_SaveBufferFree(&save);
|
||||
|
||||
// State that we're compressed.
|
||||
buffertosend = compressedsave;
|
||||
|
|
@ -1228,7 +1225,7 @@ static consvar_t cv_dumpconsistency = CVAR_INIT ("dumpconsistency", "Off", CV_SA
|
|||
static void SV_SavedGame(void)
|
||||
{
|
||||
size_t length;
|
||||
savebuffer_t save;
|
||||
savebuffer_t save = {0};
|
||||
char tmpsave[256];
|
||||
|
||||
if (!cv_dumpconsistency.value)
|
||||
|
|
@ -1237,22 +1234,18 @@ static void SV_SavedGame(void)
|
|||
sprintf(tmpsave, "%s" PATHSEP TMPSAVENAME, srb2home);
|
||||
|
||||
// first save it in a malloced buffer
|
||||
save.size = NETSAVEGAMESIZE;
|
||||
save.p = save.buffer = (UINT8 *)malloc(save.size);
|
||||
if (!save.p)
|
||||
if (P_SaveBufferAlloc(&save, NETSAVEGAMESIZE) == false)
|
||||
{
|
||||
CONS_Alert(CONS_ERROR, M_GetText("No more free memory for savegame\n"));
|
||||
return;
|
||||
}
|
||||
|
||||
save.end = save.buffer + save.size;
|
||||
|
||||
P_SaveNetGame(&save, false);
|
||||
|
||||
length = save.p - save.buffer;
|
||||
if (length > NETSAVEGAMESIZE)
|
||||
{
|
||||
free(save.buffer);
|
||||
P_SaveBufferFree(&save);
|
||||
I_Error("Savegame buffer overrun");
|
||||
}
|
||||
|
||||
|
|
@ -1260,7 +1253,7 @@ static void SV_SavedGame(void)
|
|||
if (!FIL_WriteFile(tmpsave, save.buffer, length))
|
||||
CONS_Printf(M_GetText("Didn't save %s for netgame"), tmpsave);
|
||||
|
||||
free(save.buffer);
|
||||
P_SaveBufferFree(&save);
|
||||
}
|
||||
|
||||
#undef TMPSAVENAME
|
||||
|
|
@ -1270,37 +1263,31 @@ static void SV_SavedGame(void)
|
|||
|
||||
static void CL_LoadReceivedSavegame(boolean reloading)
|
||||
{
|
||||
savebuffer_t save;
|
||||
savebuffer_t save = {0};
|
||||
size_t length, decompressedlen;
|
||||
char tmpsave[256];
|
||||
|
||||
sprintf(tmpsave, "%s" PATHSEP TMPSAVENAME, srb2home);
|
||||
|
||||
length = FIL_ReadFile(tmpsave, &save.buffer);
|
||||
|
||||
CONS_Printf(M_GetText("Loading savegame length %s\n"), sizeu1(length));
|
||||
if (!length)
|
||||
if (P_SaveBufferFromFile(&save, tmpsave) == false)
|
||||
{
|
||||
I_Error("Can't read savegame sent");
|
||||
return;
|
||||
}
|
||||
|
||||
save.p = save.buffer;
|
||||
save.size = length;
|
||||
save.end = save.buffer + save.size;
|
||||
length = save.size;
|
||||
CONS_Printf(M_GetText("Loading savegame length %s\n"), sizeu1(length));
|
||||
|
||||
// Decompress saved game if necessary.
|
||||
decompressedlen = READUINT32(save.p);
|
||||
if(decompressedlen > 0)
|
||||
if (decompressedlen > 0)
|
||||
{
|
||||
UINT8 *decompressedbuffer = Z_Malloc(decompressedlen, PU_STATIC, NULL);
|
||||
|
||||
lzf_decompress(save.p, length - sizeof(UINT32), decompressedbuffer, decompressedlen);
|
||||
Z_Free(save.buffer);
|
||||
|
||||
save.p = save.buffer = decompressedbuffer;
|
||||
save.size = decompressedlen;
|
||||
save.end = save.buffer + decompressedlen;
|
||||
P_SaveBufferFree(&save);
|
||||
P_SaveBufferFromExisting(&save, decompressedbuffer, decompressedlen);
|
||||
}
|
||||
|
||||
paused = false;
|
||||
|
|
@ -1332,10 +1319,13 @@ static void CL_LoadReceivedSavegame(boolean reloading)
|
|||
}
|
||||
|
||||
// done
|
||||
Z_Free(save.buffer);
|
||||
save.p = NULL;
|
||||
P_SaveBufferFree(&save);
|
||||
|
||||
if (unlink(tmpsave) == -1)
|
||||
{
|
||||
CONS_Alert(CONS_ERROR, M_GetText("Can't delete %s\n"), tmpsave);
|
||||
}
|
||||
|
||||
consistancy[gametic%BACKUPTICS] = Consistancy();
|
||||
CON_ToggleOff();
|
||||
|
||||
|
|
@ -6134,7 +6124,7 @@ void CL_ClearRewinds(void)
|
|||
|
||||
rewind_t *CL_SaveRewindPoint(size_t demopos)
|
||||
{
|
||||
savebuffer_t save;
|
||||
savebuffer_t save = {0};
|
||||
rewind_t *rewind;
|
||||
|
||||
if (rewindhead && rewindhead->leveltime + REWIND_POINT_INTERVAL > leveltime)
|
||||
|
|
@ -6144,10 +6134,7 @@ rewind_t *CL_SaveRewindPoint(size_t demopos)
|
|||
if (!rewind)
|
||||
return NULL;
|
||||
|
||||
save.buffer = save.p = rewind->savebuffer;
|
||||
save.size = NETSAVEGAMESIZE;
|
||||
save.end = save.buffer + save.size;
|
||||
|
||||
P_SaveBufferFromExisting(&save, rewind->savebuffer, NETSAVEGAMESIZE);
|
||||
P_SaveNetGame(&save, false);
|
||||
|
||||
rewind->leveltime = leveltime;
|
||||
|
|
@ -6160,7 +6147,7 @@ rewind_t *CL_SaveRewindPoint(size_t demopos)
|
|||
|
||||
rewind_t *CL_RewindToTime(tic_t time)
|
||||
{
|
||||
savebuffer_t save;
|
||||
savebuffer_t save = {0};
|
||||
rewind_t *rewind;
|
||||
|
||||
while (rewindhead && rewindhead->leveltime > time)
|
||||
|
|
@ -6173,10 +6160,7 @@ rewind_t *CL_RewindToTime(tic_t time)
|
|||
if (!rewindhead)
|
||||
return NULL;
|
||||
|
||||
save.buffer = save.p = rewindhead->savebuffer;
|
||||
save.size = NETSAVEGAMESIZE;
|
||||
save.end = save.buffer + save.size;
|
||||
|
||||
P_SaveBufferFromExisting(&save, rewindhead->savebuffer, NETSAVEGAMESIZE);
|
||||
P_LoadNetGame(&save, false);
|
||||
|
||||
wipegamestate = gamestate; // No fading back in!
|
||||
|
|
|
|||
|
|
@ -5785,7 +5785,7 @@ static void Command_Togglemodified_f(void)
|
|||
|
||||
static void Command_Archivetest_f(void)
|
||||
{
|
||||
savebuffer_t save;
|
||||
savebuffer_t save = {0};
|
||||
UINT32 i, wrote;
|
||||
thinker_t *th;
|
||||
if (gamestate != GS_LEVEL)
|
||||
|
|
@ -5801,9 +5801,11 @@ static void Command_Archivetest_f(void)
|
|||
((mobj_t *)th)->mobjnum = i++;
|
||||
|
||||
// allocate buffer
|
||||
save.size = 1024;
|
||||
save.buffer = save.p = ZZ_Alloc(save.size);
|
||||
save.end = save.buffer + save.size;
|
||||
if (P_SaveBufferAlloc(&save, 1024) == false)
|
||||
{
|
||||
CONS_Printf("Unable to allocate buffer.\n");
|
||||
return;
|
||||
}
|
||||
|
||||
// test archive
|
||||
CONS_Printf("LUA_Archive...\n");
|
||||
|
|
@ -5821,10 +5823,12 @@ static void Command_Archivetest_f(void)
|
|||
LUA_UnArchive(&save, true);
|
||||
i = READUINT8(save.p);
|
||||
if (i != 0x7F || wrote != (UINT32)(save.p - save.buffer))
|
||||
{
|
||||
CONS_Printf("Savegame corrupted. (write %u, read %u)\n", wrote, (UINT32)(save.p - save.buffer));
|
||||
}
|
||||
|
||||
// free buffer
|
||||
Z_Free(save.buffer);
|
||||
P_SaveBufferFree(&save);
|
||||
CONS_Printf("Done. No crash.\n");
|
||||
}
|
||||
#endif
|
||||
|
|
|
|||
38
src/g_demo.c
38
src/g_demo.c
|
|
@ -64,7 +64,7 @@ boolean noblit; // for comparative timing purposes
|
|||
tic_t demostarttime; // for comparative timing purposes
|
||||
|
||||
static char demoname[MAX_WADPATH];
|
||||
static savebuffer_t demobuf;
|
||||
static savebuffer_t demobuf = {0};
|
||||
static UINT8 *demotime_p, *demoinfo_p;
|
||||
static UINT8 demoflags;
|
||||
boolean demosynced = true; // console warning message
|
||||
|
|
@ -2009,10 +2009,8 @@ void G_RecordDemo(const char *name)
|
|||
// if (demobuf.buffer)
|
||||
// P_SaveBufferFree(&demobuf);
|
||||
|
||||
demobuf.size = maxsize;
|
||||
demobuf.buffer = (UINT8 *)malloc(maxsize);
|
||||
P_SaveBufferAlloc(&demobuf, maxsize);
|
||||
demobuf.p = NULL;
|
||||
demobuf.end = demobuf.buffer + demobuf.size;
|
||||
|
||||
demo.recording = true;
|
||||
//demo.buffer = &demobuf;
|
||||
|
|
@ -2039,10 +2037,8 @@ void G_RecordMetal(void)
|
|||
if (M_CheckParm("-maxdemo") && M_IsNextParm())
|
||||
maxsize = atoi(M_GetNextParm()) * 1024;
|
||||
|
||||
demobuf.size = maxsize;
|
||||
demobuf.buffer = (UINT8 *)malloc(maxsize);
|
||||
P_SaveBufferAlloc(&demobuf, maxsize);
|
||||
demobuf.p = NULL;
|
||||
demobuf.end = demobuf.buffer + demobuf.size;
|
||||
|
||||
metalrecording = true;
|
||||
}
|
||||
|
|
@ -2848,7 +2844,7 @@ void G_DoPlayDemo(char *defdemoname)
|
|||
if (FIL_CheckExtension(defdemoname))
|
||||
{
|
||||
//FIL_DefaultExtension(defdemoname, ".lmp");
|
||||
if (!FIL_ReadFile(defdemoname, &demobuf.buffer))
|
||||
if (P_SaveBufferFromFile(&demobuf, defdemoname) == false)
|
||||
{
|
||||
snprintf(msg, 1024, M_GetText("Failed to read file '%s'.\n"), defdemoname);
|
||||
CONS_Alert(CONS_ERROR, "%s", msg);
|
||||
|
|
@ -2856,20 +2852,20 @@ void G_DoPlayDemo(char *defdemoname)
|
|||
M_StartMessage(msg, NULL, MM_NOTHING);
|
||||
return;
|
||||
}
|
||||
demobuf.p = demobuf.buffer;
|
||||
}
|
||||
// load demo resource from WAD
|
||||
else if ((l = W_CheckNumForName(defdemoname)) == LUMPERROR)
|
||||
else
|
||||
{
|
||||
snprintf(msg, 1024, M_GetText("Failed to read lump '%s'.\n"), defdemoname);
|
||||
CONS_Alert(CONS_ERROR, "%s", msg);
|
||||
gameaction = ga_nothing;
|
||||
M_StartMessage(msg, NULL, MM_NOTHING);
|
||||
return;
|
||||
}
|
||||
else // it's an internal demo
|
||||
{
|
||||
demobuf.buffer = demobuf.p = W_CacheLumpNum(l, PU_STATIC);
|
||||
if ((l = W_CheckNumForName(defdemoname)) == LUMPERROR)
|
||||
{
|
||||
snprintf(msg, 1024, M_GetText("Failed to read lump '%s'.\n"), defdemoname);
|
||||
CONS_Alert(CONS_ERROR, "%s", msg);
|
||||
gameaction = ga_nothing;
|
||||
M_StartMessage(msg, NULL, MM_NOTHING);
|
||||
return;
|
||||
}
|
||||
|
||||
P_SaveBufferFromLump(&demobuf, l);
|
||||
#if defined(SKIPERRORS) && !defined(DEVELOP)
|
||||
skiperrors = true; // SRB2Kart: Don't print warnings for staff ghosts, since they'll inevitably happen when we make bugfixes/changes...
|
||||
#endif
|
||||
|
|
@ -3758,7 +3754,7 @@ ATTRNORETURN void FUNCNORETURN G_StopMetalRecording(boolean kill)
|
|||
WriteDemoChecksum();
|
||||
saved = FIL_WriteFile(va("%sMS.LMP", G_BuildMapName(gamemap)), demobuf.buffer, demobuf.p - demobuf.buffer); // finally output the file.
|
||||
}
|
||||
free(demobuf.buffer);
|
||||
Z_Free(demobuf.buffer);
|
||||
metalrecording = false;
|
||||
if (saved)
|
||||
I_Error("Saved to %sMS.LMP", G_BuildMapName(gamemap));
|
||||
|
|
@ -3966,7 +3962,7 @@ void G_SaveDemo(void)
|
|||
|
||||
if (FIL_WriteFile(demoname, demobuf.buffer, demobuf.p - demobuf.buffer)) // finally output the file.
|
||||
demo.savemode = DSM_SAVED;
|
||||
free(demobuf.buffer);
|
||||
Z_Free(demobuf.buffer);
|
||||
demo.recording = false;
|
||||
|
||||
if (!modeattacking)
|
||||
|
|
|
|||
67
src/g_game.c
67
src/g_game.c
|
|
@ -4119,11 +4119,10 @@ void G_LoadGameSettings(void)
|
|||
// Loads the main data file, which stores information such as emblems found, etc.
|
||||
void G_LoadGameData(void)
|
||||
{
|
||||
size_t length;
|
||||
INT32 i, j;
|
||||
UINT8 modded = false;
|
||||
UINT8 rtemp;
|
||||
savebuffer_t save;
|
||||
savebuffer_t save = {0};
|
||||
|
||||
//For records
|
||||
tic_t rectime;
|
||||
|
|
@ -4153,12 +4152,9 @@ void G_LoadGameData(void)
|
|||
|
||||
if (M_CheckParm("-resetdata"))
|
||||
return; // Don't load (essentially, reset).
|
||||
|
||||
length = FIL_ReadFile(va(pandf, srb2home, gamedatafilename), &save.buffer);
|
||||
if (!length) // Aw, no game data. Their loss!
|
||||
return;
|
||||
|
||||
save.p = save.buffer;
|
||||
if (P_SaveBufferFromFile(&save, va(pandf, srb2home, gamedatafilename)) == false)
|
||||
return;
|
||||
|
||||
// Version check
|
||||
if (READUINT32(save.p) != 0xFCAFE211)
|
||||
|
|
@ -4167,9 +4163,8 @@ void G_LoadGameData(void)
|
|||
if (strcmp(srb2home,"."))
|
||||
gdfolder = srb2home;
|
||||
|
||||
Z_Free(save.buffer);
|
||||
save.p = NULL;
|
||||
I_Error("Game data is from another version of SRB2.\nDelete %s(maybe in %s) and try again.", gamedatafilename, gdfolder);
|
||||
P_SaveBufferFree(&save);
|
||||
I_Error("Game data is not for SRB2Kart v2.\nDelete %s(maybe in %s) and try again.", gamedatafilename, gdfolder);
|
||||
}
|
||||
|
||||
totalplaytime = READUINT32(save.p);
|
||||
|
|
@ -4242,8 +4237,7 @@ void G_LoadGameData(void)
|
|||
}
|
||||
|
||||
// done
|
||||
Z_Free(save.buffer);
|
||||
save.p = NULL;
|
||||
P_SaveBufferFree(&save);
|
||||
|
||||
// Silent update unlockables in case they're out of sync with conditions
|
||||
M_SilentUpdateUnlockablesAndEmblems();
|
||||
|
|
@ -4257,8 +4251,7 @@ void G_LoadGameData(void)
|
|||
if (strcmp(srb2home,"."))
|
||||
gdfolder = srb2home;
|
||||
|
||||
Z_Free(save.buffer);
|
||||
save.p = NULL;
|
||||
P_SaveBufferFree(&save);
|
||||
|
||||
I_Error("Corrupt game data file.\nDelete %s(maybe in %s) and try again.", gamedatafilename, gdfolder);
|
||||
}
|
||||
|
|
@ -4271,18 +4264,16 @@ void G_SaveGameData(void)
|
|||
size_t length;
|
||||
INT32 i, j;
|
||||
UINT8 btemp;
|
||||
savebuffer_t save;
|
||||
savebuffer_t save = {0};
|
||||
|
||||
if (!gamedataloaded)
|
||||
return; // If never loaded (-nodata), don't save
|
||||
|
||||
save.p = save.buffer = (UINT8 *)malloc(GAMEDATASIZE);
|
||||
if (!save.p)
|
||||
if (P_SaveBufferAlloc(&save, length) == false)
|
||||
{
|
||||
CONS_Alert(CONS_ERROR, M_GetText("No more free memory for saving game data\n"));
|
||||
return;
|
||||
}
|
||||
save.end = save.buffer + save.size;
|
||||
|
||||
#if 0
|
||||
// SRB2Kart: Let players unlock stuff with addons.
|
||||
|
|
@ -4364,8 +4355,7 @@ void G_SaveGameData(void)
|
|||
length = save.p - save.buffer;
|
||||
|
||||
FIL_WriteFile(va(pandf, srb2home, gamedatafilename), save.buffer, length);
|
||||
free(save.buffer);
|
||||
save.p = save.buffer = NULL;
|
||||
P_SaveBufferFree(&save);
|
||||
}
|
||||
|
||||
#define VERSIONSIZE 16
|
||||
|
|
@ -4376,10 +4366,9 @@ void G_SaveGameData(void)
|
|||
//
|
||||
void G_LoadGame(UINT32 slot, INT16 mapoverride)
|
||||
{
|
||||
size_t length;
|
||||
char vcheck[VERSIONSIZE];
|
||||
char savename[255];
|
||||
savebuffer_t save;
|
||||
savebuffer_t save = {0};
|
||||
|
||||
// memset savedata to all 0, fixes calling perfectly valid saves corrupt because of bots
|
||||
memset(&savedata, 0, sizeof(savedata));
|
||||
|
|
@ -4394,17 +4383,12 @@ void G_LoadGame(UINT32 slot, INT16 mapoverride)
|
|||
else
|
||||
sprintf(savename, savegamename, slot);
|
||||
|
||||
length = FIL_ReadFile(savename, &save.buffer);
|
||||
if (!length)
|
||||
if (P_SaveBufferFromFile(&save, savename) == false)
|
||||
{
|
||||
CONS_Printf(M_GetText("Couldn't read file %s\n"), savename);
|
||||
return;
|
||||
}
|
||||
|
||||
save.p = save.buffer;
|
||||
save.size = length;
|
||||
save.end = save.buffer + save.size;
|
||||
|
||||
memset(vcheck, 0, sizeof (vcheck));
|
||||
sprintf(vcheck, (marathonmode ? "back-up %d" : "version %d"), VERSION);
|
||||
if (strcmp((const char *)save.p, (const char *)vcheck))
|
||||
|
|
@ -4417,7 +4401,7 @@ void G_LoadGame(UINT32 slot, INT16 mapoverride)
|
|||
M_ClearMenus(true); // so ESC backs out to title
|
||||
M_StartMessage(M_GetText("Save game from different version\n\nPress ESC\n"), NULL, MM_NOTHING);
|
||||
Command_ExitGame_f();
|
||||
Z_Free(save.buffer);
|
||||
P_SaveBufferFree(&save);
|
||||
|
||||
// no cheating!
|
||||
memset(&savedata, 0, sizeof(savedata));
|
||||
|
|
@ -4452,7 +4436,7 @@ void G_LoadGame(UINT32 slot, INT16 mapoverride)
|
|||
}
|
||||
|
||||
// done
|
||||
Z_Free(save.buffer);
|
||||
P_SaveBufferFree(&save);
|
||||
|
||||
// gameaction = ga_nothing;
|
||||
// G_SetGamestate(GS_LEVEL);
|
||||
|
|
@ -4478,7 +4462,7 @@ void G_SaveGame(UINT32 slot, INT16 mapnum)
|
|||
boolean saved;
|
||||
char savename[256] = "";
|
||||
const char *backup;
|
||||
savebuffer_t save;
|
||||
savebuffer_t save = {0};
|
||||
|
||||
if (marathonmode)
|
||||
strcpy(savename, liveeventbackup);
|
||||
|
|
@ -4491,14 +4475,11 @@ void G_SaveGame(UINT32 slot, INT16 mapnum)
|
|||
char name[VERSIONSIZE];
|
||||
size_t length;
|
||||
|
||||
save.size = SAVEGAMESIZE;
|
||||
save.p = save.buffer = (UINT8 *)malloc(save.size);
|
||||
if (!save.p)
|
||||
if (P_SaveBufferAlloc(&save, SAVEGAMESIZE) == false)
|
||||
{
|
||||
CONS_Alert(CONS_ERROR, M_GetText("No more free memory for saving game data\n"));
|
||||
return;
|
||||
}
|
||||
save.end = save.buffer + save.size;
|
||||
|
||||
memset(name, 0, sizeof (name));
|
||||
sprintf(name, (marathonmode ? "back-up %d" : "version %d"), VERSION);
|
||||
|
|
@ -4516,7 +4497,7 @@ void G_SaveGame(UINT32 slot, INT16 mapnum)
|
|||
|
||||
length = save.p - save.buffer;
|
||||
saved = FIL_WriteFile(backup, save.buffer, length);
|
||||
free(save.buffer);
|
||||
P_SaveBufferFree(&save);
|
||||
}
|
||||
|
||||
gameaction = ga_nothing;
|
||||
|
|
@ -4536,7 +4517,7 @@ void G_SaveGameOver(UINT32 slot, boolean modifylives)
|
|||
char vcheck[VERSIONSIZE];
|
||||
char savename[255];
|
||||
const char *backup;
|
||||
savebuffer_t save;
|
||||
savebuffer_t save = {0};
|
||||
|
||||
if (marathonmode)
|
||||
strcpy(savename, liveeventbackup);
|
||||
|
|
@ -4544,22 +4525,19 @@ void G_SaveGameOver(UINT32 slot, boolean modifylives)
|
|||
sprintf(savename, savegamename, slot);
|
||||
backup = va("%s",savename);
|
||||
|
||||
length = FIL_ReadFile(savename, &save.buffer);
|
||||
if (!length)
|
||||
if (P_SaveBufferFromFile(&save, savename) == false)
|
||||
{
|
||||
CONS_Printf(M_GetText("Couldn't read file %s\n"), savename);
|
||||
return;
|
||||
}
|
||||
|
||||
length = save.size;
|
||||
|
||||
{
|
||||
char temp[sizeof(timeattackfolder)];
|
||||
UINT8 *lives_p;
|
||||
SINT8 pllives;
|
||||
|
||||
save.p = save.buffer;
|
||||
save.size = length;
|
||||
save.end = save.buffer + save.size;
|
||||
|
||||
// Version check
|
||||
memset(vcheck, 0, sizeof (vcheck));
|
||||
sprintf(vcheck, (marathonmode ? "back-up %d" : "version %d"), VERSION);
|
||||
|
|
@ -4630,9 +4608,8 @@ cleanup:
|
|||
CONS_Printf(M_GetText("Game saved.\n"));
|
||||
else if (!saved)
|
||||
CONS_Alert(CONS_ERROR, M_GetText("Error while writing to %s for save slot %u, base: %s\n"), backup, slot, (marathonmode ? liveeventbackup : savegamename));
|
||||
Z_Free(save.buffer);
|
||||
save.p = save.buffer = NULL;
|
||||
|
||||
P_SaveBufferFree(&save);
|
||||
}
|
||||
#undef CHECKPOS
|
||||
#undef BADSAVE
|
||||
|
|
|
|||
|
|
@ -5389,3 +5389,92 @@ boolean P_LoadNetGame(savebuffer_t *save, boolean reloading)
|
|||
|
||||
return P_UnArchiveLuabanksAndConsistency(save);
|
||||
}
|
||||
|
||||
boolean P_SaveBufferZAlloc(savebuffer_t *save, size_t alloc_size, INT32 tag, void *user)
|
||||
{
|
||||
I_Assert(save->buffer == NULL);
|
||||
save->buffer = (UINT8 *)Z_Malloc(alloc_size, tag, user);
|
||||
|
||||
if (save->buffer == NULL)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
save->size = alloc_size;
|
||||
save->p = save->buffer;
|
||||
save->end = save->buffer + save->size;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
boolean P_SaveBufferFromExisting(savebuffer_t *save, UINT8 *existing_buffer, size_t existing_size)
|
||||
{
|
||||
I_Assert(save->buffer == NULL);
|
||||
|
||||
if (existing_buffer == NULL || existing_size == 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
save->buffer = existing_buffer;
|
||||
save->size = existing_size;
|
||||
|
||||
save->p = save->buffer;
|
||||
save->end = save->buffer + save->size;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
boolean P_SaveBufferFromLump(savebuffer_t *save, lumpnum_t lump)
|
||||
{
|
||||
I_Assert(save->buffer == NULL);
|
||||
|
||||
if (lump == LUMPERROR)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
save->buffer = (UINT8 *)W_CacheLumpNum(lump, PU_STATIC);
|
||||
|
||||
if (save->buffer == NULL)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
save->size = W_LumpLength(lump);
|
||||
|
||||
save->p = save->buffer;
|
||||
save->end = save->buffer + save->size;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
boolean P_SaveBufferFromFile(savebuffer_t *save, char const *name)
|
||||
{
|
||||
size_t len = 0;
|
||||
|
||||
I_Assert(save->buffer == NULL);
|
||||
len = FIL_ReadFile(name, &save->buffer);
|
||||
|
||||
if (len != 0)
|
||||
{
|
||||
save->size = len;
|
||||
|
||||
save->p = save->buffer;
|
||||
save->end = save->buffer + save->size;
|
||||
}
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
static void P_SaveBufferInvalidate(savebuffer_t *save)
|
||||
{
|
||||
save->buffer = save->p = save->end = NULL;
|
||||
save->size = 0;
|
||||
}
|
||||
|
||||
void P_SaveBufferFree(savebuffer_t *save)
|
||||
{
|
||||
Z_Free(save->buffer);
|
||||
P_SaveBufferInvalidate(save);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -53,6 +53,13 @@ struct savebuffer_t
|
|||
size_t size;
|
||||
};
|
||||
|
||||
boolean P_SaveBufferZAlloc(savebuffer_t *save, size_t alloc_size, INT32 tag, void *user);
|
||||
#define P_SaveBufferAlloc(a,b) P_SaveBufferZAlloc(a, b, PU_STATIC, NULL)
|
||||
boolean P_SaveBufferFromExisting(savebuffer_t *save, UINT8 *existing_buffer, size_t existing_size);
|
||||
boolean P_SaveBufferFromLump(savebuffer_t *save, lumpnum_t lump);
|
||||
boolean P_SaveBufferFromFile(savebuffer_t *save, char const *name);
|
||||
void P_SaveBufferFree(savebuffer_t *save);
|
||||
|
||||
#ifdef __cplusplus
|
||||
} // extern "C"
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -991,20 +991,15 @@ void P_WriteThings(void)
|
|||
{
|
||||
size_t i, length;
|
||||
mapthing_t *mt;
|
||||
savebuffer_t save;
|
||||
savebuffer_t save = {0};
|
||||
INT16 temp;
|
||||
|
||||
save.size = nummapthings * sizeof (mapthing_t);
|
||||
save.p = save.buffer = (UINT8 *)malloc(nummapthings * sizeof (mapthing_t));
|
||||
|
||||
if (!save.p)
|
||||
if (P_SaveBufferAlloc(&save, nummapthings * sizeof (mapthing_t)) == false)
|
||||
{
|
||||
CONS_Alert(CONS_ERROR, M_GetText("No more free memory for thing writing!\n"));
|
||||
return;
|
||||
}
|
||||
|
||||
save.end = save.buffer + save.size;
|
||||
|
||||
mt = mapthings;
|
||||
for (i = 0; i < nummapthings; i++, mt++)
|
||||
{
|
||||
|
|
|
|||
Loading…
Reference in a new issue