From 38a35b6f78eec1ac42b83418ad9b107bafefcde4 Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Fri, 23 Dec 2022 08:32:01 -0500 Subject: [PATCH 01/13] Make save_p / savebuffers not global This caused some scary issues with P_SaveNetGame the other day, and it's making ACS net sync harder. Let's just cut this off right now. Also fixed some scary mix-ups in some of the Lua archiving code. --- src/d_clisrv.c | 80 +- src/d_netcmd.c | 23 +- src/g_demo.c | 4 +- src/g_game.c | 203 +-- src/k_profiles.c | 83 +- src/lua_script.c | 26 +- src/lua_script.h | 4 +- src/p_saveg.c | 3477 +++++++++++++++++++++++----------------------- src/p_saveg.h | 15 +- src/p_setup.c | 24 +- src/typedef.h | 1 + 11 files changed, 1976 insertions(+), 1964 deletions(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index 27a489916..360bb05b7 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -1143,28 +1143,28 @@ static boolean SV_ResendingSavegameToAnyone(void) static void SV_SendSaveGame(INT32 node, boolean resending) { size_t length, compressedlen; - UINT8 *savebuffer; + savebuffer_t save; UINT8 *compressedsave; UINT8 *buffertosend; // first save it in a malloced buffer - savebuffer = (UINT8 *)malloc(SAVEGAMESIZE); - if (!savebuffer) + save.buffer = (UINT8 *)malloc(SAVEGAMESIZE); + if (!save.buffer) { CONS_Alert(CONS_ERROR, M_GetText("No more free memory for savegame\n")); return; } // Leave room for the uncompressed length. - save_p = savebuffer + sizeof(UINT32); + save.p = save.buffer + sizeof(UINT32); - P_SaveNetGame(resending); + P_SaveNetGame(&save, resending); - length = save_p - savebuffer; + length = save.p - save.buffer; if (length > SAVEGAMESIZE) { - free(savebuffer); - save_p = NULL; + free(save.buffer); + save.p = NULL; I_Error("Savegame buffer overrun"); } @@ -1178,11 +1178,11 @@ static void SV_SendSaveGame(INT32 node, boolean resending) } // Attempt to compress it. - if((compressedlen = lzf_compress(savebuffer + sizeof(UINT32), length - sizeof(UINT32), compressedsave + sizeof(UINT32), length - sizeof(UINT32) - 1))) + if((compressedlen = lzf_compress(save.buffer + sizeof(UINT32), length - sizeof(UINT32), compressedsave + sizeof(UINT32), length - sizeof(UINT32) - 1))) { // Compressing succeeded; send compressed data - free(savebuffer); + free(save.buffer); // State that we're compressed. buffertosend = compressedsave; @@ -1196,12 +1196,12 @@ static void SV_SendSaveGame(INT32 node, boolean resending) free(compressedsave); // State that we're not compressed - buffertosend = savebuffer; - WRITEUINT32(savebuffer, 0); + buffertosend = save.buffer; + WRITEUINT32(save.buffer, 0); } AddRamToSendQueue(node, buffertosend, length, SF_RAM, 0); - save_p = NULL; + save.p = NULL; // Remember when we started sending the savegame so we can handle timeouts sendingsavegame[node] = true; @@ -1215,7 +1215,7 @@ static consvar_t cv_dumpconsistency = CVAR_INIT ("dumpconsistency", "Off", CV_SA static void SV_SavedGame(void) { size_t length; - UINT8 *savebuffer; + savebuffer_t save; char tmpsave[256]; if (!cv_dumpconsistency.value) @@ -1224,29 +1224,29 @@ static void SV_SavedGame(void) sprintf(tmpsave, "%s" PATHSEP TMPSAVENAME, srb2home); // first save it in a malloced buffer - save_p = savebuffer = (UINT8 *)malloc(SAVEGAMESIZE); - if (!save_p) + save.p = save.buffer = (UINT8 *)malloc(SAVEGAMESIZE); + if (!save.p) { CONS_Alert(CONS_ERROR, M_GetText("No more free memory for savegame\n")); return; } - P_SaveNetGame(false); + P_SaveNetGame(&save, false); - length = save_p - savebuffer; + length = save.p - save.buffer; if (length > SAVEGAMESIZE) { - free(savebuffer); - save_p = NULL; + free(save.buffer); + save.p = NULL; I_Error("Savegame buffer overrun"); } // then save it! - if (!FIL_WriteFile(tmpsave, savebuffer, length)) + if (!FIL_WriteFile(tmpsave, save.buffer, length)) CONS_Printf(M_GetText("Didn't save %s for netgame"), tmpsave); - free(savebuffer); - save_p = NULL; + free(save.buffer); + save.p = NULL; } #undef TMPSAVENAME @@ -1256,13 +1256,13 @@ static void SV_SavedGame(void) static void CL_LoadReceivedSavegame(boolean reloading) { - UINT8 *savebuffer = NULL; + savebuffer_t save; size_t length, decompressedlen; char tmpsave[256]; sprintf(tmpsave, "%s" PATHSEP TMPSAVENAME, srb2home); - length = FIL_ReadFile(tmpsave, &savebuffer); + length = FIL_ReadFile(tmpsave, &save.buffer); CONS_Printf(M_GetText("Loading savegame length %s\n"), sizeu1(length)); if (!length) @@ -1271,16 +1271,16 @@ static void CL_LoadReceivedSavegame(boolean reloading) return; } - save_p = savebuffer; + save.p = save.buffer; // Decompress saved game if necessary. - decompressedlen = READUINT32(save_p); + decompressedlen = READUINT32(save.p); if(decompressedlen > 0) { UINT8 *decompressedbuffer = Z_Malloc(decompressedlen, PU_STATIC, NULL); - lzf_decompress(save_p, length - sizeof(UINT32), decompressedbuffer, decompressedlen); - Z_Free(savebuffer); - save_p = savebuffer = decompressedbuffer; + lzf_decompress(save.p, length - sizeof(UINT32), decompressedbuffer, decompressedlen); + Z_Free(save.buffer); + save.p = save.buffer = decompressedbuffer; } paused = false; @@ -1290,7 +1290,7 @@ static void CL_LoadReceivedSavegame(boolean reloading) automapactive = false; // load a base level - if (P_LoadNetGame(reloading)) + if (P_LoadNetGame(&save, reloading)) { if (!reloading) { @@ -1312,8 +1312,8 @@ static void CL_LoadReceivedSavegame(boolean reloading) } // done - Z_Free(savebuffer); - save_p = NULL; + Z_Free(save.buffer); + save.p = NULL; if (unlink(tmpsave) == -1) CONS_Alert(CONS_ERROR, M_GetText("Can't delete %s\n"), tmpsave); consistancy[gametic%BACKUPTICS] = Consistancy(); @@ -6064,6 +6064,7 @@ void CL_ClearRewinds(void) rewind_t *CL_SaveRewindPoint(size_t demopos) { + savebuffer_t save; rewind_t *rewind; if (rewindhead && rewindhead->leveltime + REWIND_POINT_INTERVAL > leveltime) @@ -6073,8 +6074,10 @@ rewind_t *CL_SaveRewindPoint(size_t demopos) if (!rewind) return NULL; - save_p = rewind->savebuffer; - P_SaveNetGame(false); + save.buffer = save.p = rewind->savebuffer; + + P_SaveNetGame(&save, false); + rewind->leveltime = leveltime; rewind->next = rewindhead; rewind->demopos = demopos; @@ -6085,6 +6088,7 @@ rewind_t *CL_SaveRewindPoint(size_t demopos) rewind_t *CL_RewindToTime(tic_t time) { + savebuffer_t save; rewind_t *rewind; while (rewindhead && rewindhead->leveltime > time) @@ -6097,8 +6101,10 @@ rewind_t *CL_RewindToTime(tic_t time) if (!rewindhead) return NULL; - save_p = rewindhead->savebuffer; - P_LoadNetGame(false); + save.buffer = save.p = rewindhead->savebuffer; + + P_LoadNetGame(&save, false); + wipegamestate = gamestate; // No fading back in! timeinmap = leveltime; diff --git a/src/d_netcmd.c b/src/d_netcmd.c index df3b86bcf..6a416cbfd 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -5776,10 +5776,9 @@ static void Command_Togglemodified_f(void) modifiedgame = !modifiedgame; } -extern UINT8 *save_p; static void Command_Archivetest_f(void) { - UINT8 *buf; + savebuffer_t save; UINT32 i, wrote; thinker_t *th; if (gamestate != GS_LEVEL) @@ -5795,28 +5794,28 @@ static void Command_Archivetest_f(void) ((mobj_t *)th)->mobjnum = i++; // allocate buffer - buf = save_p = ZZ_Alloc(1024); + save.buffer = save.p = ZZ_Alloc(1024); // test archive CONS_Printf("LUA_Archive...\n"); - LUA_Archive(&save_p); - WRITEUINT8(save_p, 0x7F); - wrote = (UINT32)(save_p-buf); + LUA_Archive(&save.p, true); + WRITEUINT8(save.p, 0x7F); + wrote = (UINT32)(save.p - save.buffer); // clear Lua state, so we can really see what happens! CONS_Printf("Clearing state!\n"); LUA_ClearExtVars(); // test unarchive - save_p = buf; + save.p = save.buffer; CONS_Printf("LUA_UnArchive...\n"); - LUA_UnArchive(&save_p); - i = READUINT8(save_p); - if (i != 0x7F || wrote != (UINT32)(save_p-buf)) - CONS_Printf("Savegame corrupted. (write %u, read %u)\n", wrote, (UINT32)(save_p-buf)); + LUA_UnArchive(&save.p, 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(buf); + Z_Free(save.buffer); CONS_Printf("Done. No crash.\n"); } #endif diff --git a/src/g_demo.c b/src/g_demo.c index e47d8ba28..298f887e5 100644 --- a/src/g_demo.c +++ b/src/g_demo.c @@ -2502,7 +2502,7 @@ void G_BeginRecording(void) // player lua vars, always saved even if empty if (demoflags & DF_LUAVARS) - LUA_Archive(&demo_p); + LUA_Archive(&demo_p, false); memset(&oldcmd,0,sizeof(oldcmd)); memset(&oldghost,0,sizeof(oldghost)); @@ -3366,7 +3366,7 @@ void G_DoPlayDemo(char *defdemoname) LUA_ClearState(); // No modeattacking check, DF_LUAVARS won't be present here. - LUA_UnArchive(&demo_p); + LUA_UnArchive(&demo_p, false); } splitscreen = 0; diff --git a/src/g_game.c b/src/g_game.c index a79dd5219..60cacbd66 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -345,8 +345,6 @@ boolean precache = true; // if true, load all graphics at start INT16 prevmap, nextmap; -static UINT8 *savebuffer; - static void weaponPrefChange(void); static void weaponPrefChange2(void); static void weaponPrefChange3(void); @@ -4313,6 +4311,7 @@ void G_LoadGameData(void) UINT32 versionID; UINT8 versionMinor; UINT8 rtemp; + savebuffer_t save; //For records UINT32 numgamedatamapheaders; @@ -4341,7 +4340,7 @@ void G_LoadGameData(void) return; } - length = FIL_ReadFile(va(pandf, srb2home, gamedatafilename), &savebuffer); + length = FIL_ReadFile(va(pandf, srb2home, gamedatafilename), &save.buffer); if (!length) { // No gamedata. We can save a new one. @@ -4349,35 +4348,35 @@ void G_LoadGameData(void) return; } - save_p = savebuffer; + save.p = save.buffer; // Version check - versionID = READUINT32(save_p); + versionID = READUINT32(save.p); if (versionID != GD_VERSIONCHECK) { const char *gdfolder = "the Ring Racers folder"; if (strcmp(srb2home,".")) gdfolder = srb2home; - Z_Free(savebuffer); - save_p = NULL; + Z_Free(save.buffer); + save.p = NULL; I_Error("Game data is not for Ring Racers v2.0.\nDelete %s(maybe in %s) and try again.", gamedatafilename, gdfolder); } - versionMinor = READUINT8(save_p); + versionMinor = READUINT8(save.p); if (versionMinor > GD_VERSIONMINOR) { - Z_Free(savebuffer); - save_p = NULL; + Z_Free(save.buffer); + save.p = NULL; I_Error("Game data is from the future! (expected %d, got %d)", GD_VERSIONMINOR, versionMinor); } - gamedata->totalplaytime = READUINT32(save_p); - gamedata->matchesplayed = READUINT32(save_p); + gamedata->totalplaytime = READUINT32(save.p); + gamedata->matchesplayed = READUINT32(save.p); { // Quick & dirty hash for what mod this save file is for. - UINT32 modID = READUINT32(save_p); + UINT32 modID = READUINT32(save.p); UINT32 expectedID = quickncasehash(timeattackfolder, 64); if (modID != expectedID) @@ -4390,34 +4389,34 @@ void G_LoadGameData(void) // To save space, use one bit per collected/achieved/unlocked flag for (i = 0; i < MAXEMBLEMS;) { - rtemp = READUINT8(save_p); + rtemp = READUINT8(save.p); for (j = 0; j < 8 && j+i < MAXEMBLEMS; ++j) gamedata->collected[j+i] = ((rtemp >> j) & 1); i += j; } for (i = 0; i < MAXUNLOCKABLES;) { - rtemp = READUINT8(save_p); + rtemp = READUINT8(save.p); for (j = 0; j < 8 && j+i < MAXUNLOCKABLES; ++j) gamedata->unlocked[j+i] = ((rtemp >> j) & 1); i += j; } for (i = 0; i < MAXUNLOCKABLES;) { - rtemp = READUINT8(save_p); + rtemp = READUINT8(save.p); for (j = 0; j < 8 && j+i < MAXUNLOCKABLES; ++j) gamedata->unlockpending[j+i] = ((rtemp >> j) & 1); i += j; } for (i = 0; i < MAXCONDITIONSETS;) { - rtemp = READUINT8(save_p); + rtemp = READUINT8(save.p); for (j = 0; j < 8 && j+i < MAXCONDITIONSETS; ++j) gamedata->achieved[j+i] = ((rtemp >> j) & 1); i += j; } - gamedata->challengegridwidth = READUINT16(save_p); + gamedata->challengegridwidth = READUINT16(save.p); Z_Free(gamedata->challengegrid); if (gamedata->challengegridwidth) { @@ -4426,7 +4425,7 @@ void G_LoadGameData(void) PU_STATIC, NULL); for (i = 0; i < (gamedata->challengegridwidth * CHALLENGEGRIDHEIGHT); i++) { - gamedata->challengegrid[i] = READUINT8(save_p); + gamedata->challengegrid[i] = READUINT8(save.p); } } else @@ -4434,10 +4433,10 @@ void G_LoadGameData(void) gamedata->challengegrid = NULL; } - gamedata->timesBeaten = READUINT32(save_p); + gamedata->timesBeaten = READUINT32(save.p); // Main records - numgamedatamapheaders = READUINT32(save_p); + numgamedatamapheaders = READUINT32(save.p); if (numgamedatamapheaders >= NEXTMAP_SPECIAL) goto datacorrupt; @@ -4448,12 +4447,12 @@ void G_LoadGameData(void) tic_t rectime; tic_t reclap; - READSTRINGN(save_p, mapname, sizeof(mapname)); + READSTRINGN(save.p, mapname, sizeof(mapname)); mapnum = G_MapNumber(mapname); - rtemp = READUINT8(save_p); - rectime = (tic_t)READUINT32(save_p); - reclap = (tic_t)READUINT32(save_p); + rtemp = READUINT8(save.p); + rectime = (tic_t)READUINT32(save.p); + reclap = (tic_t)READUINT32(save.p); if (mapnum < nummapheaders && mapheaderinfo[mapnum]) { @@ -4479,8 +4478,8 @@ void G_LoadGameData(void) } // done - Z_Free(savebuffer); - save_p = NULL; + Z_Free(save.buffer); + save.p = NULL; // Don't consider loaded until it's a success! // It used to do this much earlier, but this would cause the gamedata to @@ -4500,8 +4499,8 @@ void G_LoadGameData(void) if (strcmp(srb2home,".")) gdfolder = srb2home; - Z_Free(savebuffer); - save_p = NULL; + Z_Free(save.buffer); + save.p = NULL; I_Error("Corrupt game data file.\nDelete %s(maybe in %s) and try again.", gamedatafilename, gdfolder); } @@ -4514,6 +4513,7 @@ void G_SaveGameData(void) size_t length; INT32 i, j; UINT8 btemp; + savebuffer_t save; if (!gamedata->loaded) return; // If never loaded (-nodata), don't save @@ -4533,8 +4533,8 @@ void G_SaveGameData(void) } length += nummapheaders * (MAXMAPLUMPNAME+1+4+4); - save_p = savebuffer = (UINT8 *)malloc(length); - if (!save_p) + save.p = save.buffer = (UINT8 *)malloc(length); + if (!save.p) { CONS_Alert(CONS_ERROR, M_GetText("No more free memory for saving game data\n")); return; @@ -4542,11 +4542,11 @@ void G_SaveGameData(void) // Version test - WRITEUINT32(save_p, GD_VERSIONCHECK); // 4 - WRITEUINT8(save_p, GD_VERSIONMINOR); // 1 - WRITEUINT32(save_p, gamedata->totalplaytime); // 4 - WRITEUINT32(save_p, gamedata->matchesplayed); // 4 - WRITEUINT32(save_p, quickncasehash(timeattackfolder, 64)); + WRITEUINT32(save.p, GD_VERSIONCHECK); // 4 + WRITEUINT8(save.p, GD_VERSIONMINOR); // 1 + WRITEUINT32(save.p, gamedata->totalplaytime); // 4 + WRITEUINT32(save.p, gamedata->matchesplayed); // 4 + WRITEUINT32(save.p, quickncasehash(timeattackfolder, 64)); // To save space, use one bit per collected/achieved/unlocked flag for (i = 0; i < MAXEMBLEMS;) // MAXEMBLEMS * 1; @@ -4554,7 +4554,7 @@ void G_SaveGameData(void) btemp = 0; for (j = 0; j < 8 && j+i < MAXEMBLEMS; ++j) btemp |= (gamedata->collected[j+i] << j); - WRITEUINT8(save_p, btemp); + WRITEUINT8(save.p, btemp); i += j; } @@ -4564,7 +4564,7 @@ void G_SaveGameData(void) btemp = 0; for (j = 0; j < 8 && j+i < MAXUNLOCKABLES; ++j) btemp |= (gamedata->unlocked[j+i] << j); - WRITEUINT8(save_p, btemp); + WRITEUINT8(save.p, btemp); i += j; } for (i = 0; i < MAXUNLOCKABLES;) @@ -4572,7 +4572,7 @@ void G_SaveGameData(void) btemp = 0; for (j = 0; j < 8 && j+i < MAXUNLOCKABLES; ++j) btemp |= (gamedata->unlockpending[j+i] << j); - WRITEUINT8(save_p, btemp); + WRITEUINT8(save.p, btemp); i += j; } @@ -4581,52 +4581,52 @@ void G_SaveGameData(void) btemp = 0; for (j = 0; j < 8 && j+i < MAXCONDITIONSETS; ++j) btemp |= (gamedata->achieved[j+i] << j); - WRITEUINT8(save_p, btemp); + WRITEUINT8(save.p, btemp); i += j; } if (gamedata->challengegrid) // 2 + gamedata->challengegridwidth * CHALLENGEGRIDHEIGHT { - WRITEUINT16(save_p, gamedata->challengegridwidth); + WRITEUINT16(save.p, gamedata->challengegridwidth); for (i = 0; i < (gamedata->challengegridwidth * CHALLENGEGRIDHEIGHT); i++) { - WRITEUINT8(save_p, gamedata->challengegrid[i]); + WRITEUINT8(save.p, gamedata->challengegrid[i]); } } else // 2 { - WRITEUINT16(save_p, 0); + WRITEUINT16(save.p, 0); } - WRITEUINT32(save_p, gamedata->timesBeaten); // 4 + WRITEUINT32(save.p, gamedata->timesBeaten); // 4 // Main records - WRITEUINT32(save_p, nummapheaders); // 4 + WRITEUINT32(save.p, nummapheaders); // 4 for (i = 0; i < nummapheaders; i++) // nummapheaders * (255+1+4+4) { // For figuring out which header to assing it to on load - WRITESTRINGN(save_p, mapheaderinfo[i]->lumpname, MAXMAPLUMPNAME); + WRITESTRINGN(save.p, mapheaderinfo[i]->lumpname, MAXMAPLUMPNAME); - WRITEUINT8(save_p, (mapheaderinfo[i]->mapvisited & MV_MAX)); + WRITEUINT8(save.p, (mapheaderinfo[i]->mapvisited & MV_MAX)); if (mapheaderinfo[i]->mainrecord) { - WRITEUINT32(save_p, mapheaderinfo[i]->mainrecord->time); - WRITEUINT32(save_p, mapheaderinfo[i]->mainrecord->lap); + WRITEUINT32(save.p, mapheaderinfo[i]->mainrecord->time); + WRITEUINT32(save.p, mapheaderinfo[i]->mainrecord->lap); } else { - WRITEUINT32(save_p, 0); - WRITEUINT32(save_p, 0); + WRITEUINT32(save.p, 0); + WRITEUINT32(save.p, 0); } } - length = save_p - savebuffer; + length = save.p - save.buffer; - FIL_WriteFile(va(pandf, srb2home, gamedatafilename), savebuffer, length); - free(savebuffer); - save_p = savebuffer = NULL; + FIL_WriteFile(va(pandf, srb2home, gamedatafilename), save.buffer, length); + free(save.buffer); + save.p = save.buffer = NULL; // Also save profiles here. PR_SaveProfiles(); @@ -4643,6 +4643,7 @@ void G_LoadGame(UINT32 slot, INT16 mapoverride) size_t length; char vcheck[VERSIONSIZE]; char savename[255]; + savebuffer_t save; // memset savedata to all 0, fixes calling perfectly valid saves corrupt because of bots memset(&savedata, 0, sizeof(savedata)); @@ -4657,18 +4658,18 @@ void G_LoadGame(UINT32 slot, INT16 mapoverride) else sprintf(savename, savegamename, slot); - length = FIL_ReadFile(savename, &savebuffer); + length = FIL_ReadFile(savename, &save.buffer); if (!length) { CONS_Printf(M_GetText("Couldn't read file %s\n"), savename); return; } - save_p = savebuffer; + save.p = save.buffer; memset(vcheck, 0, sizeof (vcheck)); sprintf(vcheck, (marathonmode ? "back-up %d" : "version %d"), VERSION); - if (strcmp((const char *)save_p, (const char *)vcheck)) + if (strcmp((const char *)save.p, (const char *)vcheck)) { #ifdef SAVEGAME_OTHERVERSIONS M_StartMessage(M_GetText("Save game from different version.\nYou can load this savegame, but\nsaving afterwards will be disabled.\n\nDo you want to continue anyway?\n\n(Press 'Y' to confirm)\n"), @@ -4678,15 +4679,15 @@ 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(savebuffer); - save_p = savebuffer = NULL; + Z_Free(save.buffer); + save.p = save.buffer = NULL; // no cheating! memset(&savedata, 0, sizeof(savedata)); #endif return; // bad version } - save_p += VERSIONSIZE; + save.p += VERSIONSIZE; if (demo.playback) // reset game engine G_StopDemo(); @@ -4695,13 +4696,13 @@ void G_LoadGame(UINT32 slot, INT16 mapoverride) // automapactive = false; // dearchive all the modifications - if (!P_LoadGame(mapoverride)) + if (!P_LoadGame(&save, mapoverride)) { M_ClearMenus(true); // so ESC backs out to title M_StartMessage(M_GetText("Savegame file corrupted\n\nPress ESC\n"), NULL, MM_NOTHING); Command_ExitGame_f(); - Z_Free(savebuffer); - save_p = savebuffer = NULL; + Z_Free(save.buffer); + save.p = save.buffer = NULL; // no cheating! memset(&savedata, 0, sizeof(savedata)); @@ -4709,13 +4710,13 @@ void G_LoadGame(UINT32 slot, INT16 mapoverride) } if (marathonmode) { - marathontime = READUINT32(save_p); - marathonmode |= READUINT8(save_p); + marathontime = READUINT32(save.p); + marathonmode |= READUINT8(save.p); } // done - Z_Free(savebuffer); - save_p = savebuffer = NULL; + Z_Free(save.buffer); + save.p = save.buffer = NULL; // gameaction = ga_nothing; // G_SetGamestate(GS_LEVEL); @@ -4741,6 +4742,7 @@ void G_SaveGame(UINT32 slot, INT16 mapnum) boolean saved; char savename[256] = ""; const char *backup; + savebuffer_t save; if (marathonmode) strcpy(savename, liveeventbackup); @@ -4753,8 +4755,8 @@ void G_SaveGame(UINT32 slot, INT16 mapnum) char name[VERSIONSIZE]; size_t length; - save_p = savebuffer = (UINT8 *)malloc(SAVEGAMESIZE); - if (!save_p) + save.p = save.buffer = (UINT8 *)malloc(SAVEGAMESIZE); + if (!save.p) { CONS_Alert(CONS_ERROR, M_GetText("No more free memory for saving game data\n")); return; @@ -4762,22 +4764,22 @@ void G_SaveGame(UINT32 slot, INT16 mapnum) memset(name, 0, sizeof (name)); sprintf(name, (marathonmode ? "back-up %d" : "version %d"), VERSION); - WRITEMEM(save_p, name, VERSIONSIZE); + WRITEMEM(save.p, name, VERSIONSIZE); - P_SaveGame(mapnum); + P_SaveGame(&save, mapnum); if (marathonmode) { UINT32 writetime = marathontime; if (!(marathonmode & MA_INGAME)) writetime += TICRATE*5; // live event backup penalty because we don't know how long it takes to get to the next map - WRITEUINT32(save_p, writetime); - WRITEUINT8(save_p, (marathonmode & ~MA_INIT)); + WRITEUINT32(save.p, writetime); + WRITEUINT8(save.p, (marathonmode & ~MA_INIT)); } - length = save_p - savebuffer; - saved = FIL_WriteFile(backup, savebuffer, length); - free(savebuffer); - save_p = savebuffer = NULL; + length = save.p - save.buffer; + saved = FIL_WriteFile(backup, save.buffer, length); + free(save.buffer); + save.p = save.buffer = NULL; } gameaction = ga_nothing; @@ -4789,7 +4791,7 @@ void G_SaveGame(UINT32 slot, INT16 mapnum) } #define BADSAVE goto cleanup; -#define CHECKPOS if (save_p >= end_p) BADSAVE +#define CHECKPOS if (save.p >= end_p) BADSAVE void G_SaveGameOver(UINT32 slot, boolean modifylives) { boolean saved = false; @@ -4797,6 +4799,7 @@ void G_SaveGameOver(UINT32 slot, boolean modifylives) char vcheck[VERSIONSIZE]; char savename[255]; const char *backup; + savebuffer_t save; if (marathonmode) strcpy(savename, liveeventbackup); @@ -4804,7 +4807,7 @@ void G_SaveGameOver(UINT32 slot, boolean modifylives) sprintf(savename, savegamename, slot); backup = va("%s",savename); - length = FIL_ReadFile(savename, &savebuffer); + length = FIL_ReadFile(savename, &save.buffer); if (!length) { CONS_Printf(M_GetText("Couldn't read file %s\n"), savename); @@ -4813,35 +4816,35 @@ void G_SaveGameOver(UINT32 slot, boolean modifylives) { char temp[sizeof(timeattackfolder)]; - UINT8 *end_p = savebuffer + length; + UINT8 *end_p = save.buffer + length; UINT8 *lives_p; SINT8 pllives; - save_p = savebuffer; + save.p = save.buffer; // Version check memset(vcheck, 0, sizeof (vcheck)); sprintf(vcheck, (marathonmode ? "back-up %d" : "version %d"), VERSION); - if (strcmp((const char *)save_p, (const char *)vcheck)) BADSAVE - save_p += VERSIONSIZE; + if (strcmp((const char *)save.p, (const char *)vcheck)) BADSAVE + save.p += VERSIONSIZE; // P_UnArchiveMisc() - (void)READINT16(save_p); + (void)READINT16(save.p); CHECKPOS - (void)READUINT16(save_p); // emeralds + (void)READUINT16(save.p); // emeralds CHECKPOS - READSTRINGN(save_p, temp, sizeof(temp)); // mod it belongs to + READSTRINGN(save.p, temp, sizeof(temp)); // mod it belongs to if (strcmp(temp, timeattackfolder)) BADSAVE // P_UnArchivePlayer() CHECKPOS - (void)READUINT16(save_p); + (void)READUINT16(save.p); CHECKPOS - WRITEUINT8(save_p, numgameovers); + WRITEUINT8(save.p, numgameovers); CHECKPOS - lives_p = save_p; - pllives = READSINT8(save_p); // lives + lives_p = save.p; + pllives = READSINT8(save.p); // lives CHECKPOS if (modifylives && pllives < startinglivesbalance[numgameovers]) { @@ -4849,28 +4852,28 @@ void G_SaveGameOver(UINT32 slot, boolean modifylives) WRITESINT8(lives_p, pllives); } - (void)READINT32(save_p); // Score + (void)READINT32(save.p); // Score CHECKPOS - (void)READINT32(save_p); // continues + (void)READINT32(save.p); // continues // File end marker check CHECKPOS - switch (READUINT8(save_p)) + switch (READUINT8(save.p)) { case 0xb7: { UINT8 i, banksinuse; CHECKPOS - banksinuse = READUINT8(save_p); + banksinuse = READUINT8(save.p); CHECKPOS if (banksinuse > NUM_LUABANKS) BADSAVE for (i = 0; i < banksinuse; i++) { - (void)READINT32(save_p); + (void)READINT32(save.p); CHECKPOS } - if (READUINT8(save_p) != 0x1d) + if (READUINT8(save.p) != 0x1d) BADSAVE } case 0x1d: @@ -4880,7 +4883,7 @@ void G_SaveGameOver(UINT32 slot, boolean modifylives) } // done - saved = FIL_WriteFile(backup, savebuffer, length); + saved = FIL_WriteFile(backup, save.buffer, length); } cleanup: @@ -4888,8 +4891,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(savebuffer); - save_p = savebuffer = NULL; + Z_Free(save.buffer); + save.p = save.buffer = NULL; } #undef CHECKPOS diff --git a/src/k_profiles.c b/src/k_profiles.c index 8b3712ed0..f24d623ab 100644 --- a/src/k_profiles.c +++ b/src/k_profiles.c @@ -10,9 +10,10 @@ /// \file k_profiles.c /// \brief implements methods for profiles etc. +#include "doomtype.h" #include "d_main.h" // pandf #include "byteptr.h" // READ/WRITE macros -#include "p_saveg.h" // save_p +#include "p_saveg.h" // savebuffer_t #include "m_misc.h" //FIL_WriteFile() #include "k_profiles.h" #include "z_zone.h" @@ -211,68 +212,67 @@ void PR_InitNewProfile(void) PR_AddProfile(dprofile); } -static UINT8 *savebuffer; - void PR_SaveProfiles(void) { size_t length = 0; const size_t headerlen = strlen(PROFILEHEADER); UINT8 i, j, k; + savebuffer_t save; - save_p = savebuffer = (UINT8 *)malloc(sizeof(UINT32) + (numprofiles * sizeof(profile_t))); - if (!save_p) + save.p = save.buffer = (UINT8 *)malloc(sizeof(UINT32) + (numprofiles * sizeof(profile_t))); + if (!save.p) { I_Error("No more free memory for saving profiles\n"); return; } // Add header. - WRITESTRINGN(save_p, PROFILEHEADER, headerlen); - WRITEUINT8(save_p, PROFILEVER); - WRITEUINT8(save_p, numprofiles); + WRITESTRINGN(save.p, PROFILEHEADER, headerlen); + WRITEUINT8(save.p, PROFILEVER); + WRITEUINT8(save.p, numprofiles); for (i = 1; i < numprofiles; i++) { // Names. - WRITESTRINGN(save_p, profilesList[i]->profilename, PROFILENAMELEN); - WRITESTRINGN(save_p, profilesList[i]->playername, MAXPLAYERNAME); + WRITESTRINGN(save.p, profilesList[i]->profilename, PROFILENAMELEN); + WRITESTRINGN(save.p, profilesList[i]->playername, MAXPLAYERNAME); // Character and colour. - WRITESTRINGN(save_p, profilesList[i]->skinname, SKINNAMESIZE); - WRITEUINT16(save_p, profilesList[i]->color); + WRITESTRINGN(save.p, profilesList[i]->skinname, SKINNAMESIZE); + WRITEUINT16(save.p, profilesList[i]->color); // Follower and colour. - WRITESTRINGN(save_p, profilesList[i]->follower, SKINNAMESIZE); - WRITEUINT16(save_p, profilesList[i]->followercolor); + WRITESTRINGN(save.p, profilesList[i]->follower, SKINNAMESIZE); + WRITEUINT16(save.p, profilesList[i]->followercolor); // PWR. for (j = 0; j < PWRLV_NUMTYPES; j++) { - WRITEUINT16(save_p, profilesList[i]->powerlevels[j]); + WRITEUINT16(save.p, profilesList[i]->powerlevels[j]); } // Consvars. - WRITEUINT8(save_p, profilesList[i]->kickstartaccel); + WRITEUINT8(save.p, profilesList[i]->kickstartaccel); // Controls. for (j = 0; j < num_gamecontrols; j++) { for (k = 0; k < MAXINPUTMAPPING; k++) { - WRITEINT32(save_p, profilesList[i]->controls[j][k]); + WRITEINT32(save.p, profilesList[i]->controls[j][k]); } } } - length = save_p - savebuffer; + length = save.p - save.buffer; - if (!FIL_WriteFile(va(pandf, srb2home, PROFILESFILE), savebuffer, length)) + if (!FIL_WriteFile(va(pandf, srb2home, PROFILESFILE), save.buffer, length)) { - free(savebuffer); + free(save.buffer); I_Error("Couldn't save profiles. Are you out of Disk space / playing in a protected folder?"); } - free(savebuffer); - save_p = savebuffer = NULL; + free(save.buffer); + save.p = save.buffer = NULL; } void PR_LoadProfiles(void) @@ -288,8 +288,9 @@ void PR_LoadProfiles(void) gamecontroldefault, true ); + savebuffer_t save; - length = FIL_ReadFile(va(pandf, srb2home, PROFILESFILE), &savebuffer); + length = FIL_ReadFile(va(pandf, srb2home, PROFILESFILE), &save.buffer); if (!length) { // No profiles. Add the default one. @@ -297,29 +298,29 @@ void PR_LoadProfiles(void) return; } - save_p = savebuffer; + save.p = save.buffer; - if (strncmp(PROFILEHEADER, (const char *)savebuffer, headerlen)) + if (strncmp(PROFILEHEADER, (const char *)save.buffer, headerlen)) { const char *gdfolder = "the Ring Racers folder"; if (strcmp(srb2home,".")) gdfolder = srb2home; - Z_Free(savebuffer); - save_p = NULL; + Z_Free(save.buffer); + save.p = NULL; I_Error("Not a valid Profile file.\nDelete %s (maybe in %s) and try again.", PROFILESFILE, gdfolder); } - save_p += headerlen; + save.p += headerlen; - version = READUINT8(save_p); + version = READUINT8(save.p); if (version > PROFILEVER) { - Z_Free(savebuffer); - save_p = NULL; + Z_Free(save.buffer); + save.p = NULL; I_Error("Existing %s is from the future! (expected %d, got %d)", PROFILESFILE, PROFILEVER, version); } - numprofiles = READUINT8(save_p); + numprofiles = READUINT8(save.p); if (numprofiles > MAXPROFILES) numprofiles = MAXPROFILES; @@ -331,12 +332,12 @@ void PR_LoadProfiles(void) profilesList[i]->version = PROFILEVER; // Names. - READSTRINGN(save_p, profilesList[i]->profilename, PROFILENAMELEN); - READSTRINGN(save_p, profilesList[i]->playername, MAXPLAYERNAME); + READSTRINGN(save.p, profilesList[i]->profilename, PROFILENAMELEN); + READSTRINGN(save.p, profilesList[i]->playername, MAXPLAYERNAME); // Character and colour. - READSTRINGN(save_p, profilesList[i]->skinname, SKINNAMESIZE); - profilesList[i]->color = READUINT16(save_p); + READSTRINGN(save.p, profilesList[i]->skinname, SKINNAMESIZE); + profilesList[i]->color = READUINT16(save.p); if (profilesList[i]->color == SKINCOLOR_NONE) { @@ -349,8 +350,8 @@ void PR_LoadProfiles(void) } // Follower and colour. - READSTRINGN(save_p, profilesList[i]->follower, SKINNAMESIZE); - profilesList[i]->followercolor = READUINT16(save_p); + READSTRINGN(save.p, profilesList[i]->follower, SKINNAMESIZE); + profilesList[i]->followercolor = READUINT16(save.p); if (profilesList[i]->followercolor == FOLLOWERCOLOR_MATCH || profilesList[i]->followercolor == FOLLOWERCOLOR_OPPOSITE) @@ -367,7 +368,7 @@ void PR_LoadProfiles(void) // PWR. for (j = 0; j < PWRLV_NUMTYPES; j++) { - profilesList[i]->powerlevels[j] = READUINT16(save_p); + profilesList[i]->powerlevels[j] = READUINT16(save.p); if (profilesList[i]->powerlevels[j] < PWRLVRECORD_MIN || profilesList[i]->powerlevels[j] > PWRLVRECORD_MAX) { @@ -377,7 +378,7 @@ void PR_LoadProfiles(void) } // Consvars. - profilesList[i]->kickstartaccel = (boolean)READUINT8(save_p); + profilesList[i]->kickstartaccel = (boolean)READUINT8(save.p); // Controls. for (j = 0; j < num_gamecontrols; j++) @@ -396,7 +397,7 @@ void PR_LoadProfiles(void) for (k = 0; k < MAXINPUTMAPPING; k++) { - profilesList[i]->controls[j][k] = READINT32(save_p); + profilesList[i]->controls[j][k] = READINT32(save.p); } } } diff --git a/src/lua_script.c b/src/lua_script.c index 4f9eab969..5f12ab416 100644 --- a/src/lua_script.c +++ b/src/lua_script.c @@ -41,6 +41,8 @@ lua_State *gL = NULL; int hook_defrosting; +static UINT8 **lua_save_p = NULL; // FIXME: Remove this horrible hack + // List of internal libraries to load from SRB2 static lua_CFunction liblist[] = { LUA_EnumLib, // global metatable for enums @@ -1248,10 +1250,10 @@ static UINT8 ArchiveValue(UINT8 **p, int TABLESINDEX, int myindex) { polyobj_t *polyobj = *((polyobj_t **)lua_touserdata(gL, myindex)); if (!polyobj) - WRITEUINT8(save_p, ARCH_NULL); + WRITEUINT8(*p, ARCH_NULL); else { - WRITEUINT8(save_p, ARCH_POLYOBJ); - WRITEUINT16(save_p, polyobj-PolyObjects); + WRITEUINT8(*p, ARCH_POLYOBJ); + WRITEUINT16(*p, polyobj-PolyObjects); } break; } @@ -1355,7 +1357,7 @@ static int NetArchive(lua_State *L) int TABLESINDEX = lua_upvalueindex(1); int i, n = lua_gettop(L); for (i = 1; i <= n; i++) - ArchiveValue(&save_p, TABLESINDEX, i); + ArchiveValue(lua_save_p, TABLESINDEX, i); return n; } @@ -1517,7 +1519,7 @@ static UINT8 UnArchiveValue(UINT8 **p, int TABLESINDEX) break; } case ARCH_POLYOBJ: - LUA_PushUserdata(gL, &PolyObjects[READUINT16(save_p)], META_POLYOBJ); + LUA_PushUserdata(gL, &PolyObjects[READUINT16(*p)], META_POLYOBJ); break; case ARCH_SLOPE: LUA_PushUserdata(gL, P_SlopeById(READUINT16(*p)), META_SLOPE); @@ -1568,7 +1570,7 @@ static int NetUnArchive(lua_State *L) int TABLESINDEX = lua_upvalueindex(1); int i, n = lua_gettop(L); for (i = 1; i <= n; i++) - UnArchiveValue(&save_p, TABLESINDEX); + UnArchiveValue(lua_save_p, TABLESINDEX); return n; } @@ -1602,7 +1604,7 @@ static void UnArchiveTables(UINT8 **p) lua_rawset(gL, -3); } - metatableid = READUINT16(save_p); + metatableid = READUINT16(*p); if (metatableid) { // setmetatable(table, registry.metatables[metatableid]) @@ -1626,7 +1628,7 @@ void LUA_Step(void) lua_gc(gL, LUA_GCSTEP, 1); } -void LUA_Archive(UINT8 **p) +void LUA_Archive(UINT8 **p, boolean network) { INT32 i; thinker_t *th; @@ -1642,7 +1644,7 @@ void LUA_Archive(UINT8 **p) ArchiveExtVars(p, &players[i], "player"); } - if (p == &save_p) + if (network == true) { if (gamestate == GS_LEVEL) { @@ -1659,6 +1661,7 @@ void LUA_Archive(UINT8 **p) WRITEUINT32(*p, UINT32_MAX); // end of mobjs marker, replaces mobjnum. + lua_save_p = p; LUA_HookNetArchive(NetArchive); // call the NetArchive hook in archive mode } @@ -1668,7 +1671,7 @@ void LUA_Archive(UINT8 **p) lua_pop(gL, 1); // pop tables } -void LUA_UnArchive(UINT8 **p) +void LUA_UnArchive(UINT8 **p, boolean network) { UINT32 mobjnum; INT32 i; @@ -1684,7 +1687,7 @@ void LUA_UnArchive(UINT8 **p) UnArchiveExtVars(p, &players[i]); } - if (p == &save_p) + if (network == true) { do { mobjnum = READUINT32(*p); // read a mobjnum @@ -1698,6 +1701,7 @@ void LUA_UnArchive(UINT8 **p) } } while(mobjnum != UINT32_MAX); // repeat until end of mobjs marker. + lua_save_p = p; LUA_HookNetArchive(NetUnArchive); // call the NetArchive hook in unarchive mode } diff --git a/src/lua_script.h b/src/lua_script.h index 632a1da3d..51a9af85e 100644 --- a/src/lua_script.h +++ b/src/lua_script.h @@ -57,8 +57,8 @@ void LUA_DumpFile(const char *filename); #endif fixed_t LUA_EvalMath(const char *word); void LUA_Step(void); -void LUA_Archive(UINT8 **p); -void LUA_UnArchive(UINT8 **p); +void LUA_Archive(UINT8 **p, boolean network); +void LUA_UnArchive(UINT8 **p, boolean network); int LUA_PushGlobals(lua_State *L, const char *word); int LUA_WriteGlobals(lua_State *L, const char *word); diff --git a/src/p_saveg.c b/src/p_saveg.c index 118706d4a..ed009c189 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -43,7 +43,6 @@ #include "k_terrain.h" savedata_t savedata; -UINT8 *save_p; // Block UINT32s to attempt to ensure that the correct data is // being sent and received @@ -69,7 +68,7 @@ typedef enum STUMBLE = 0x40, } player_saveflags; -static inline void P_ArchivePlayer(void) +static inline void P_ArchivePlayer(savebuffer_t *save) { const player_t *player = &players[consoleplayer]; INT16 skininfo = player->skin; @@ -77,39 +76,39 @@ static inline void P_ArchivePlayer(void) if (pllives < startinglivesbalance[numgameovers]) // Bump up to 3 lives if the player pllives = startinglivesbalance[numgameovers]; // has less than that. - WRITEUINT16(save_p, skininfo); - WRITEUINT8(save_p, numgameovers); - WRITESINT8(save_p, pllives); - WRITEUINT32(save_p, player->score); + WRITEUINT16(save->p, skininfo); + WRITEUINT8(save->p, numgameovers); + WRITESINT8(save->p, pllives); + WRITEUINT32(save->p, player->score); } -static inline void P_UnArchivePlayer(void) +static inline void P_UnArchivePlayer(savebuffer_t *save) { - INT16 skininfo = READUINT16(save_p); + INT16 skininfo = READUINT16(save->p); savedata.skin = skininfo; - savedata.numgameovers = READUINT8(save_p); - savedata.lives = READSINT8(save_p); - savedata.score = READUINT32(save_p); + savedata.numgameovers = READUINT8(save->p); + savedata.lives = READSINT8(save->p); + savedata.score = READUINT32(save->p); } -static void P_NetArchivePlayers(void) +static void P_NetArchivePlayers(savebuffer_t *save) { INT32 i, j; UINT16 flags; size_t q; - WRITEUINT32(save_p, ARCHIVEBLOCK_PLAYERS); + WRITEUINT32(save->p, ARCHIVEBLOCK_PLAYERS); for (i = 0; i < MAXPLAYERS; i++) { - WRITESINT8(save_p, (SINT8)adminplayers[i]); + WRITESINT8(save->p, (SINT8)adminplayers[i]); for (j = 0; j < PWRLV_NUMTYPES; j++) { - WRITEINT16(save_p, clientpowerlevels[i][j]); + WRITEINT16(save->p, clientpowerlevels[i][j]); } - WRITEINT16(save_p, clientPowerAdd[i]); + WRITEINT16(save->p, clientPowerAdd[i]); if (!playeringame[i]) continue; @@ -118,84 +117,84 @@ static void P_NetArchivePlayers(void) // no longer send ticcmds - WRITESTRINGN(save_p, player_names[i], MAXPLAYERNAME); + WRITESTRINGN(save->p, player_names[i], MAXPLAYERNAME); - WRITEUINT8(save_p, playerconsole[i]); - WRITEINT32(save_p, splitscreen_invitations[i]); - WRITEINT32(save_p, splitscreen_party_size[i]); - WRITEINT32(save_p, splitscreen_original_party_size[i]); + WRITEUINT8(save->p, playerconsole[i]); + WRITEINT32(save->p, splitscreen_invitations[i]); + WRITEINT32(save->p, splitscreen_party_size[i]); + WRITEINT32(save->p, splitscreen_original_party_size[i]); for (j = 0; j < MAXSPLITSCREENPLAYERS; ++j) { - WRITEINT32(save_p, splitscreen_party[i][j]); - WRITEINT32(save_p, splitscreen_original_party[i][j]); + WRITEINT32(save->p, splitscreen_party[i][j]); + WRITEINT32(save->p, splitscreen_original_party[i][j]); } - WRITEINT16(save_p, players[i].steering); - WRITEANGLE(save_p, players[i].angleturn); - WRITEANGLE(save_p, players[i].aiming); - WRITEANGLE(save_p, players[i].drawangle); - WRITEANGLE(save_p, players[i].viewrollangle); - WRITEANGLE(save_p, players[i].tilt); - WRITEANGLE(save_p, players[i].awayviewaiming); - WRITEINT32(save_p, players[i].awayviewtics); + WRITEINT16(save->p, players[i].steering); + WRITEANGLE(save->p, players[i].angleturn); + WRITEANGLE(save->p, players[i].aiming); + WRITEANGLE(save->p, players[i].drawangle); + WRITEANGLE(save->p, players[i].viewrollangle); + WRITEANGLE(save->p, players[i].tilt); + WRITEANGLE(save->p, players[i].awayviewaiming); + WRITEINT32(save->p, players[i].awayviewtics); - WRITEUINT8(save_p, players[i].playerstate); - WRITEUINT32(save_p, players[i].pflags); - WRITEUINT8(save_p, players[i].panim); - WRITEUINT8(save_p, players[i].spectator); - WRITEUINT32(save_p, players[i].spectatewait); + WRITEUINT8(save->p, players[i].playerstate); + WRITEUINT32(save->p, players[i].pflags); + WRITEUINT8(save->p, players[i].panim); + WRITEUINT8(save->p, players[i].spectator); + WRITEUINT32(save->p, players[i].spectatewait); - WRITEUINT16(save_p, players[i].flashpal); - WRITEUINT16(save_p, players[i].flashcount); + WRITEUINT16(save->p, players[i].flashpal); + WRITEUINT16(save->p, players[i].flashcount); - WRITEUINT8(save_p, players[i].skincolor); - WRITEINT32(save_p, players[i].skin); + WRITEUINT8(save->p, players[i].skincolor); + WRITEINT32(save->p, players[i].skin); for (j = 0; j < MAXAVAILABILITY; j++) { - WRITEUINT8(save_p, players[i].availabilities[j]); + WRITEUINT8(save->p, players[i].availabilities[j]); } - WRITEUINT8(save_p, players[i].fakeskin); - WRITEUINT8(save_p, players[i].lastfakeskin); - WRITEUINT32(save_p, players[i].score); - WRITESINT8(save_p, players[i].lives); - WRITESINT8(save_p, players[i].xtralife); - WRITEFIXED(save_p, players[i].speed); - WRITEFIXED(save_p, players[i].lastspeed); - WRITEINT32(save_p, players[i].deadtimer); - WRITEUINT32(save_p, players[i].exiting); + WRITEUINT8(save->p, players[i].fakeskin); + WRITEUINT8(save->p, players[i].lastfakeskin); + WRITEUINT32(save->p, players[i].score); + WRITESINT8(save->p, players[i].lives); + WRITESINT8(save->p, players[i].xtralife); + WRITEFIXED(save->p, players[i].speed); + WRITEFIXED(save->p, players[i].lastspeed); + WRITEINT32(save->p, players[i].deadtimer); + WRITEUINT32(save->p, players[i].exiting); //////////////////////////// // Conveyor Belt Movement // //////////////////////////// - WRITEFIXED(save_p, players[i].cmomx); // Conveyor momx - WRITEFIXED(save_p, players[i].cmomy); // Conveyor momy - WRITEFIXED(save_p, players[i].rmomx); // "Real" momx (momx - cmomx) - WRITEFIXED(save_p, players[i].rmomy); // "Real" momy (momy - cmomy) + WRITEFIXED(save->p, players[i].cmomx); // Conveyor momx + WRITEFIXED(save->p, players[i].cmomy); // Conveyor momy + WRITEFIXED(save->p, players[i].rmomx); // "Real" momx (momx - cmomx) + WRITEFIXED(save->p, players[i].rmomy); // "Real" momy (momy - cmomy) - WRITEINT16(save_p, players[i].totalring); - WRITEUINT32(save_p, players[i].realtime); - WRITEUINT8(save_p, players[i].laps); - WRITEUINT8(save_p, players[i].latestlap); - WRITEINT32(save_p, players[i].starpostnum); + WRITEINT16(save->p, players[i].totalring); + WRITEUINT32(save->p, players[i].realtime); + WRITEUINT8(save->p, players[i].laps); + WRITEUINT8(save->p, players[i].latestlap); + WRITEINT32(save->p, players[i].starpostnum); - WRITEUINT8(save_p, players[i].ctfteam); + WRITEUINT8(save->p, players[i].ctfteam); - WRITEUINT8(save_p, players[i].checkskip); + WRITEUINT8(save->p, players[i].checkskip); - WRITEINT16(save_p, players[i].lastsidehit); - WRITEINT16(save_p, players[i].lastlinehit); + WRITEINT16(save->p, players[i].lastsidehit); + WRITEINT16(save->p, players[i].lastlinehit); - WRITEINT32(save_p, players[i].onconveyor); + WRITEINT32(save->p, players[i].onconveyor); - WRITEUINT8(save_p, players[i].timeshit); - WRITEUINT8(save_p, players[i].timeshitprev); + WRITEUINT8(save->p, players[i].timeshit); + WRITEUINT8(save->p, players[i].timeshitprev); - WRITEUINT32(save_p, players[i].jointime); + WRITEUINT32(save->p, players[i].jointime); - WRITEUINT8(save_p, players[i].splitscreenindex); + WRITEUINT8(save->p, players[i].splitscreenindex); if (players[i].awayviewmobj) flags |= AWAYVIEW; @@ -218,270 +217,270 @@ static void P_NetArchivePlayers(void) if (players[i].stumbleIndicator) flags |= STUMBLE; - WRITEUINT16(save_p, flags); + WRITEUINT16(save->p, flags); if (flags & SKYBOXVIEW) - WRITEUINT32(save_p, players[i].skybox.viewpoint->mobjnum); + WRITEUINT32(save->p, players[i].skybox.viewpoint->mobjnum); if (flags & SKYBOXCENTER) - WRITEUINT32(save_p, players[i].skybox.centerpoint->mobjnum); + WRITEUINT32(save->p, players[i].skybox.centerpoint->mobjnum); if (flags & AWAYVIEW) - WRITEUINT32(save_p, players[i].awayviewmobj->mobjnum); + WRITEUINT32(save->p, players[i].awayviewmobj->mobjnum); if (flags & FOLLOWITEM) - WRITEUINT32(save_p, players[i].followmobj->mobjnum); + WRITEUINT32(save->p, players[i].followmobj->mobjnum); if (flags & HOVERHYUDORO) - WRITEUINT32(save_p, players[i].hoverhyudoro->mobjnum); + WRITEUINT32(save->p, players[i].hoverhyudoro->mobjnum); if (flags & STUMBLE) - WRITEUINT32(save_p, players[i].stumbleIndicator->mobjnum); + WRITEUINT32(save->p, players[i].stumbleIndicator->mobjnum); - WRITEUINT32(save_p, (UINT32)players[i].followitem); + WRITEUINT32(save->p, (UINT32)players[i].followitem); - WRITEUINT32(save_p, players[i].charflags); + WRITEUINT32(save->p, players[i].charflags); // SRB2kart - WRITEUINT8(save_p, players[i].kartspeed); - WRITEUINT8(save_p, players[i].kartweight); + WRITEUINT8(save->p, players[i].kartspeed); + WRITEUINT8(save->p, players[i].kartweight); - WRITEUINT8(save_p, players[i].followerskin); - WRITEUINT8(save_p, players[i].followerready); // booleans are really just numbers eh?? - WRITEUINT16(save_p, players[i].followercolor); + WRITEUINT8(save->p, players[i].followerskin); + WRITEUINT8(save->p, players[i].followerready); // booleans are really just numbers eh?? + WRITEUINT16(save->p, players[i].followercolor); if (flags & FOLLOWER) - WRITEUINT32(save_p, players[i].follower->mobjnum); + WRITEUINT32(save->p, players[i].follower->mobjnum); - WRITEUINT16(save_p, players[i].nocontrol); - WRITEUINT8(save_p, players[i].carry); - WRITEUINT16(save_p, players[i].dye); + WRITEUINT16(save->p, players[i].nocontrol); + WRITEUINT8(save->p, players[i].carry); + WRITEUINT16(save->p, players[i].dye); - WRITEUINT8(save_p, players[i].position); - WRITEUINT8(save_p, players[i].oldposition); - WRITEUINT8(save_p, players[i].positiondelay); - WRITEUINT32(save_p, players[i].distancetofinish); - WRITEUINT32(save_p, K_GetWaypointHeapIndex(players[i].currentwaypoint)); - WRITEUINT32(save_p, K_GetWaypointHeapIndex(players[i].nextwaypoint)); - WRITEUINT32(save_p, players[i].airtime); - WRITEUINT8(save_p, players[i].startboost); + WRITEUINT8(save->p, players[i].position); + WRITEUINT8(save->p, players[i].oldposition); + WRITEUINT8(save->p, players[i].positiondelay); + WRITEUINT32(save->p, players[i].distancetofinish); + WRITEUINT32(save->p, K_GetWaypointHeapIndex(players[i].currentwaypoint)); + WRITEUINT32(save->p, K_GetWaypointHeapIndex(players[i].nextwaypoint)); + WRITEUINT32(save->p, players[i].airtime); + WRITEUINT8(save->p, players[i].startboost); - WRITEUINT16(save_p, players[i].flashing); - WRITEUINT16(save_p, players[i].spinouttimer); - WRITEUINT8(save_p, players[i].spinouttype); - WRITEUINT8(save_p, players[i].instashield); - WRITEINT32(save_p, players[i].invulnhitlag); - WRITEUINT8(save_p, players[i].wipeoutslow); - WRITEUINT8(save_p, players[i].justbumped); - WRITEUINT8(save_p, players[i].tumbleBounces); - WRITEUINT16(save_p, players[i].tumbleHeight); + WRITEUINT16(save->p, players[i].flashing); + WRITEUINT16(save->p, players[i].spinouttimer); + WRITEUINT8(save->p, players[i].spinouttype); + WRITEUINT8(save->p, players[i].instashield); + WRITEINT32(save->p, players[i].invulnhitlag); + WRITEUINT8(save->p, players[i].wipeoutslow); + WRITEUINT8(save->p, players[i].justbumped); + WRITEUINT8(save->p, players[i].tumbleBounces); + WRITEUINT16(save->p, players[i].tumbleHeight); - WRITEUINT8(save_p, players[i].justDI); - WRITEUINT8(save_p, players[i].flipDI); + WRITEUINT8(save->p, players[i].justDI); + WRITEUINT8(save->p, players[i].flipDI); - WRITESINT8(save_p, players[i].drift); - WRITEFIXED(save_p, players[i].driftcharge); - WRITEUINT8(save_p, players[i].driftboost); - WRITEUINT8(save_p, players[i].strongdriftboost); + WRITESINT8(save->p, players[i].drift); + WRITEFIXED(save->p, players[i].driftcharge); + WRITEUINT8(save->p, players[i].driftboost); + WRITEUINT8(save->p, players[i].strongdriftboost); - WRITEUINT16(save_p, players[i].gateBoost); - WRITEUINT8(save_p, players[i].gateSound); + WRITEUINT16(save->p, players[i].gateBoost); + WRITEUINT8(save->p, players[i].gateSound); - WRITESINT8(save_p, players[i].aizdriftstrat); - WRITEINT32(save_p, players[i].aizdrifttilt); - WRITEINT32(save_p, players[i].aizdriftturn); + WRITESINT8(save->p, players[i].aizdriftstrat); + WRITEINT32(save->p, players[i].aizdrifttilt); + WRITEINT32(save->p, players[i].aizdriftturn); - WRITEINT32(save_p, players[i].underwatertilt); + WRITEINT32(save->p, players[i].underwatertilt); - WRITEFIXED(save_p, players[i].offroad); + WRITEFIXED(save->p, players[i].offroad); - WRITEUINT16(save_p, players[i].tiregrease); - WRITEUINT16(save_p, players[i].springstars); - WRITEUINT16(save_p, players[i].springcolor); - WRITEUINT8(save_p, players[i].dashpadcooldown); + WRITEUINT16(save->p, players[i].tiregrease); + WRITEUINT16(save->p, players[i].springstars); + WRITEUINT16(save->p, players[i].springcolor); + WRITEUINT8(save->p, players[i].dashpadcooldown); - WRITEUINT16(save_p, players[i].spindash); - WRITEFIXED(save_p, players[i].spindashspeed); - WRITEUINT8(save_p, players[i].spindashboost); + WRITEUINT16(save->p, players[i].spindash); + WRITEFIXED(save->p, players[i].spindashspeed); + WRITEUINT8(save->p, players[i].spindashboost); - WRITEFIXED(save_p, players[i].fastfall); + WRITEFIXED(save->p, players[i].fastfall); - WRITEUINT8(save_p, players[i].numboosts); - WRITEFIXED(save_p, players[i].boostpower); - WRITEFIXED(save_p, players[i].speedboost); - WRITEFIXED(save_p, players[i].accelboost); - WRITEFIXED(save_p, players[i].handleboost); - WRITEANGLE(save_p, players[i].boostangle); + WRITEUINT8(save->p, players[i].numboosts); + WRITEFIXED(save->p, players[i].boostpower); + WRITEFIXED(save->p, players[i].speedboost); + WRITEFIXED(save->p, players[i].accelboost); + WRITEFIXED(save->p, players[i].handleboost); + WRITEANGLE(save->p, players[i].boostangle); - WRITEFIXED(save_p, players[i].draftpower); - WRITEUINT16(save_p, players[i].draftleeway); - WRITESINT8(save_p, players[i].lastdraft); + WRITEFIXED(save->p, players[i].draftpower); + WRITEUINT16(save->p, players[i].draftleeway); + WRITESINT8(save->p, players[i].lastdraft); - WRITEUINT8(save_p, players[i].tripwireState); - WRITEUINT8(save_p, players[i].tripwirePass); - WRITEUINT16(save_p, players[i].tripwireLeniency); + WRITEUINT8(save->p, players[i].tripwireState); + WRITEUINT8(save->p, players[i].tripwirePass); + WRITEUINT16(save->p, players[i].tripwireLeniency); - WRITESINT8(save_p, players[i].itemtype); - WRITEUINT8(save_p, players[i].itemamount); - WRITESINT8(save_p, players[i].throwdir); + WRITESINT8(save->p, players[i].itemtype); + WRITEUINT8(save->p, players[i].itemamount); + WRITESINT8(save->p, players[i].throwdir); - WRITEUINT8(save_p, players[i].sadtimer); + WRITEUINT8(save->p, players[i].sadtimer); - WRITESINT8(save_p, players[i].rings); - WRITEUINT8(save_p, players[i].pickuprings); - WRITEUINT8(save_p, players[i].ringdelay); - WRITEUINT16(save_p, players[i].ringboost); - WRITEUINT8(save_p, players[i].sparkleanim); - WRITEUINT16(save_p, players[i].superring); + WRITESINT8(save->p, players[i].rings); + WRITEUINT8(save->p, players[i].pickuprings); + WRITEUINT8(save->p, players[i].ringdelay); + WRITEUINT16(save->p, players[i].ringboost); + WRITEUINT8(save->p, players[i].sparkleanim); + WRITEUINT16(save->p, players[i].superring); - WRITEUINT8(save_p, players[i].curshield); - WRITEUINT8(save_p, players[i].bubblecool); - WRITEUINT8(save_p, players[i].bubbleblowup); - WRITEUINT16(save_p, players[i].flamedash); - WRITEUINT16(save_p, players[i].flamemeter); - WRITEUINT8(save_p, players[i].flamelength); + WRITEUINT8(save->p, players[i].curshield); + WRITEUINT8(save->p, players[i].bubblecool); + WRITEUINT8(save->p, players[i].bubbleblowup); + WRITEUINT16(save->p, players[i].flamedash); + WRITEUINT16(save->p, players[i].flamemeter); + WRITEUINT8(save->p, players[i].flamelength); - WRITEUINT16(save_p, players[i].ballhogcharge); + WRITEUINT16(save->p, players[i].ballhogcharge); - WRITEUINT16(save_p, players[i].hyudorotimer); - WRITESINT8(save_p, players[i].stealingtimer); + WRITEUINT16(save->p, players[i].hyudorotimer); + WRITESINT8(save->p, players[i].stealingtimer); - WRITEUINT16(save_p, players[i].sneakertimer); - WRITEUINT8(save_p, players[i].numsneakers); - WRITEUINT8(save_p, players[i].floorboost); + WRITEUINT16(save->p, players[i].sneakertimer); + WRITEUINT8(save->p, players[i].numsneakers); + WRITEUINT8(save->p, players[i].floorboost); - WRITEINT16(save_p, players[i].growshrinktimer); - WRITEUINT16(save_p, players[i].rocketsneakertimer); - WRITEUINT16(save_p, players[i].invincibilitytimer); + WRITEINT16(save->p, players[i].growshrinktimer); + WRITEUINT16(save->p, players[i].rocketsneakertimer); + WRITEUINT16(save->p, players[i].invincibilitytimer); - WRITEUINT8(save_p, players[i].eggmanexplode); - WRITESINT8(save_p, players[i].eggmanblame); + WRITEUINT8(save->p, players[i].eggmanexplode); + WRITESINT8(save->p, players[i].eggmanblame); - WRITEUINT8(save_p, players[i].bananadrag); + WRITEUINT8(save->p, players[i].bananadrag); - WRITESINT8(save_p, players[i].lastjawztarget); - WRITEUINT8(save_p, players[i].jawztargetdelay); + WRITESINT8(save->p, players[i].lastjawztarget); + WRITEUINT8(save->p, players[i].jawztargetdelay); - WRITEUINT8(save_p, players[i].confirmVictim); - WRITEUINT8(save_p, players[i].confirmVictimDelay); + WRITEUINT8(save->p, players[i].confirmVictim); + WRITEUINT8(save->p, players[i].confirmVictimDelay); - WRITEUINT8(save_p, players[i].trickpanel); - WRITEUINT8(save_p, players[i].tricktime); - WRITEUINT32(save_p, players[i].trickboostpower); - WRITEUINT8(save_p, players[i].trickboostdecay); - WRITEUINT8(save_p, players[i].trickboost); + WRITEUINT8(save->p, players[i].trickpanel); + WRITEUINT8(save->p, players[i].tricktime); + WRITEUINT32(save->p, players[i].trickboostpower); + WRITEUINT8(save->p, players[i].trickboostdecay); + WRITEUINT8(save->p, players[i].trickboost); - WRITEUINT32(save_p, players[i].ebrakefor); + WRITEUINT32(save->p, players[i].ebrakefor); - WRITEUINT32(save_p, players[i].roundscore); - WRITEUINT8(save_p, players[i].emeralds); - WRITEUINT8(save_p, players[i].bumpers); - WRITEINT16(save_p, players[i].karmadelay); - WRITEUINT32(save_p, players[i].overtimekarma); - WRITEINT16(save_p, players[i].spheres); - WRITEUINT32(save_p, players[i].spheredigestion); + WRITEUINT32(save->p, players[i].roundscore); + WRITEUINT8(save->p, players[i].emeralds); + WRITEUINT8(save->p, players[i].bumpers); + WRITEINT16(save->p, players[i].karmadelay); + WRITEUINT32(save->p, players[i].overtimekarma); + WRITEINT16(save->p, players[i].spheres); + WRITEUINT32(save->p, players[i].spheredigestion); - WRITESINT8(save_p, players[i].glanceDir); + WRITESINT8(save->p, players[i].glanceDir); - WRITEUINT8(save_p, players[i].typing_timer); - WRITEUINT8(save_p, players[i].typing_duration); + WRITEUINT8(save->p, players[i].typing_timer); + WRITEUINT8(save->p, players[i].typing_duration); - WRITEUINT8(save_p, players[i].kickstartaccel); + WRITEUINT8(save->p, players[i].kickstartaccel); - WRITEUINT8(save_p, players[i].stairjank); - WRITEUINT8(save_p, players[i].topdriftheld); - WRITEUINT8(save_p, players[i].topinfirst); + WRITEUINT8(save->p, players[i].stairjank); + WRITEUINT8(save->p, players[i].topdriftheld); + WRITEUINT8(save->p, players[i].topinfirst); - WRITEUINT8(save_p, players[i].shrinkLaserDelay); + WRITEUINT8(save->p, players[i].shrinkLaserDelay); // respawnvars_t - WRITEUINT8(save_p, players[i].respawn.state); - WRITEUINT32(save_p, K_GetWaypointHeapIndex(players[i].respawn.wp)); - WRITEFIXED(save_p, players[i].respawn.pointx); - WRITEFIXED(save_p, players[i].respawn.pointy); - WRITEFIXED(save_p, players[i].respawn.pointz); - WRITEUINT8(save_p, players[i].respawn.flip); - WRITEUINT32(save_p, players[i].respawn.timer); - WRITEUINT32(save_p, players[i].respawn.airtimer); - WRITEUINT32(save_p, players[i].respawn.distanceleft); - WRITEUINT32(save_p, players[i].respawn.dropdash); - WRITEUINT8(save_p, players[i].respawn.truedeath); - WRITEUINT8(save_p, players[i].respawn.manual); + WRITEUINT8(save->p, players[i].respawn.state); + WRITEUINT32(save->p, K_GetWaypointHeapIndex(players[i].respawn.wp)); + WRITEFIXED(save->p, players[i].respawn.pointx); + WRITEFIXED(save->p, players[i].respawn.pointy); + WRITEFIXED(save->p, players[i].respawn.pointz); + WRITEUINT8(save->p, players[i].respawn.flip); + WRITEUINT32(save->p, players[i].respawn.timer); + WRITEUINT32(save->p, players[i].respawn.airtimer); + WRITEUINT32(save->p, players[i].respawn.distanceleft); + WRITEUINT32(save->p, players[i].respawn.dropdash); + WRITEUINT8(save->p, players[i].respawn.truedeath); + WRITEUINT8(save->p, players[i].respawn.manual); // botvars_t - WRITEUINT8(save_p, players[i].botvars.difficulty); - WRITEUINT8(save_p, players[i].botvars.diffincrease); - WRITEUINT8(save_p, players[i].botvars.rival); - WRITEFIXED(save_p, players[i].botvars.rubberband); - WRITEUINT16(save_p, players[i].botvars.controller); - WRITEUINT32(save_p, players[i].botvars.itemdelay); - WRITEUINT32(save_p, players[i].botvars.itemconfirm); - WRITESINT8(save_p, players[i].botvars.turnconfirm); - WRITEUINT32(save_p, players[i].botvars.spindashconfirm); + WRITEUINT8(save->p, players[i].botvars.difficulty); + WRITEUINT8(save->p, players[i].botvars.diffincrease); + WRITEUINT8(save->p, players[i].botvars.rival); + WRITEFIXED(save->p, players[i].botvars.rubberband); + WRITEUINT16(save->p, players[i].botvars.controller); + WRITEUINT32(save->p, players[i].botvars.itemdelay); + WRITEUINT32(save->p, players[i].botvars.itemconfirm); + WRITESINT8(save->p, players[i].botvars.turnconfirm); + WRITEUINT32(save->p, players[i].botvars.spindashconfirm); // itemroulette_t - WRITEUINT8(save_p, players[i].itemRoulette.active); + WRITEUINT8(save->p, players[i].itemRoulette.active); #ifdef ITEM_LIST_SIZE - WRITEUINT32(save_p, players[i].itemRoulette.itemListLen); + WRITEUINT32(save->p, players[i].itemRoulette.itemListLen); for (q = 0; q < ITEM_LIST_SIZE; q++) { if (q >= players[i].itemRoulette.itemListLen) { - WRITESINT8(save_p, KITEM_NONE); + WRITESINT8(save->p, KITEM_NONE); } else { - WRITESINT8(save_p, players[i].itemRoulette.itemList[q]); + WRITESINT8(save->p, players[i].itemRoulette.itemList[q]); } } #else if (players[i].itemRoulette.itemList == NULL) { - WRITEUINT32(save_p, 0); - WRITEUINT32(save_p, 0); + WRITEUINT32(save->p, 0); + WRITEUINT32(save->p, 0); } else { - WRITEUINT32(save_p, players[i].itemRoulette.itemListCap); - WRITEUINT32(save_p, players[i].itemRoulette.itemListLen); + WRITEUINT32(save->p, players[i].itemRoulette.itemListCap); + WRITEUINT32(save->p, players[i].itemRoulette.itemListLen); for (q = 0; q < players[i].itemRoulette.itemListLen; q++) { - WRITESINT8(save_p, players[i].itemRoulette.itemList[q]); + WRITESINT8(save->p, players[i].itemRoulette.itemList[q]); } } #endif - WRITEUINT8(save_p, players[i].itemRoulette.useOdds); - WRITEUINT32(save_p, players[i].itemRoulette.dist); - WRITEUINT32(save_p, players[i].itemRoulette.index); - WRITEUINT8(save_p, players[i].itemRoulette.sound); - WRITEUINT32(save_p, players[i].itemRoulette.speed); - WRITEUINT32(save_p, players[i].itemRoulette.tics); - WRITEUINT32(save_p, players[i].itemRoulette.elapsed); - WRITEUINT8(save_p, players[i].itemRoulette.eggman); + WRITEUINT8(save->p, players[i].itemRoulette.useOdds); + WRITEUINT32(save->p, players[i].itemRoulette.dist); + WRITEUINT32(save->p, players[i].itemRoulette.index); + WRITEUINT8(save->p, players[i].itemRoulette.sound); + WRITEUINT32(save->p, players[i].itemRoulette.speed); + WRITEUINT32(save->p, players[i].itemRoulette.tics); + WRITEUINT32(save->p, players[i].itemRoulette.elapsed); + WRITEUINT8(save->p, players[i].itemRoulette.eggman); } } -static void P_NetUnArchivePlayers(void) +static void P_NetUnArchivePlayers(savebuffer_t *save) { INT32 i, j; UINT16 flags; size_t q; - if (READUINT32(save_p) != ARCHIVEBLOCK_PLAYERS) + if (READUINT32(save->p) != ARCHIVEBLOCK_PLAYERS) I_Error("Bad $$$.sav at archive block Players"); for (i = 0; i < MAXPLAYERS; i++) { - adminplayers[i] = (INT32)READSINT8(save_p); + adminplayers[i] = (INT32)READSINT8(save->p); for (j = 0; j < PWRLV_NUMTYPES; j++) { - clientpowerlevels[i][j] = READINT16(save_p); + clientpowerlevels[i][j] = READINT16(save->p); } - clientPowerAdd[i] = READINT16(save_p); + clientPowerAdd[i] = READINT16(save->p); // Do NOT memset player struct to 0 // other areas may initialize data elsewhere @@ -491,299 +490,299 @@ static void P_NetUnArchivePlayers(void) // NOTE: sending tics should (hopefully) no longer be necessary - READSTRINGN(save_p, player_names[i], MAXPLAYERNAME); + READSTRINGN(save->p, player_names[i], MAXPLAYERNAME); - playerconsole[i] = READUINT8(save_p); - splitscreen_invitations[i] = READINT32(save_p); - splitscreen_party_size[i] = READINT32(save_p); - splitscreen_original_party_size[i] = READINT32(save_p); + playerconsole[i] = READUINT8(save->p); + splitscreen_invitations[i] = READINT32(save->p); + splitscreen_party_size[i] = READINT32(save->p); + splitscreen_original_party_size[i] = READINT32(save->p); for (j = 0; j < MAXSPLITSCREENPLAYERS; ++j) { - splitscreen_party[i][j] = READINT32(save_p); - splitscreen_original_party[i][j] = READINT32(save_p); + splitscreen_party[i][j] = READINT32(save->p); + splitscreen_original_party[i][j] = READINT32(save->p); } - players[i].steering = READINT16(save_p); - players[i].angleturn = READANGLE(save_p); - players[i].aiming = READANGLE(save_p); - players[i].drawangle = players[i].old_drawangle = READANGLE(save_p); - players[i].viewrollangle = READANGLE(save_p); - players[i].tilt = READANGLE(save_p); - players[i].awayviewaiming = READANGLE(save_p); - players[i].awayviewtics = READINT32(save_p); + players[i].steering = READINT16(save->p); + players[i].angleturn = READANGLE(save->p); + players[i].aiming = READANGLE(save->p); + players[i].drawangle = players[i].old_drawangle = READANGLE(save->p); + players[i].viewrollangle = READANGLE(save->p); + players[i].tilt = READANGLE(save->p); + players[i].awayviewaiming = READANGLE(save->p); + players[i].awayviewtics = READINT32(save->p); - players[i].playerstate = READUINT8(save_p); - players[i].pflags = READUINT32(save_p); - players[i].panim = READUINT8(save_p); - players[i].spectator = READUINT8(save_p); - players[i].spectatewait = READUINT32(save_p); + players[i].playerstate = READUINT8(save->p); + players[i].pflags = READUINT32(save->p); + players[i].panim = READUINT8(save->p); + players[i].spectator = READUINT8(save->p); + players[i].spectatewait = READUINT32(save->p); - players[i].flashpal = READUINT16(save_p); - players[i].flashcount = READUINT16(save_p); + players[i].flashpal = READUINT16(save->p); + players[i].flashcount = READUINT16(save->p); - players[i].skincolor = READUINT8(save_p); - players[i].skin = READINT32(save_p); + players[i].skincolor = READUINT8(save->p); + players[i].skin = READINT32(save->p); for (j = 0; j < MAXAVAILABILITY; j++) { - players[i].availabilities[j] = READUINT8(save_p); + players[i].availabilities[j] = READUINT8(save->p); } - players[i].fakeskin = READUINT8(save_p); - players[i].lastfakeskin = READUINT8(save_p); - players[i].score = READUINT32(save_p); - players[i].lives = READSINT8(save_p); - players[i].xtralife = READSINT8(save_p); // Ring Extra Life counter - players[i].speed = READFIXED(save_p); // Player's speed (distance formula of MOMX and MOMY values) - players[i].lastspeed = READFIXED(save_p); - players[i].deadtimer = READINT32(save_p); // End game if game over lasts too long - players[i].exiting = READUINT32(save_p); // Exitlevel timer + players[i].fakeskin = READUINT8(save->p); + players[i].lastfakeskin = READUINT8(save->p); + players[i].score = READUINT32(save->p); + players[i].lives = READSINT8(save->p); + players[i].xtralife = READSINT8(save->p); // Ring Extra Life counter + players[i].speed = READFIXED(save->p); // Player's speed (distance formula of MOMX and MOMY values) + players[i].lastspeed = READFIXED(save->p); + players[i].deadtimer = READINT32(save->p); // End game if game over lasts too long + players[i].exiting = READUINT32(save->p); // Exitlevel timer //////////////////////////// // Conveyor Belt Movement // //////////////////////////// - players[i].cmomx = READFIXED(save_p); // Conveyor momx - players[i].cmomy = READFIXED(save_p); // Conveyor momy - players[i].rmomx = READFIXED(save_p); // "Real" momx (momx - cmomx) - players[i].rmomy = READFIXED(save_p); // "Real" momy (momy - cmomy) + players[i].cmomx = READFIXED(save->p); // Conveyor momx + players[i].cmomy = READFIXED(save->p); // Conveyor momy + players[i].rmomx = READFIXED(save->p); // "Real" momx (momx - cmomx) + players[i].rmomy = READFIXED(save->p); // "Real" momy (momy - cmomy) - players[i].totalring = READINT16(save_p); // Total number of rings obtained for GP - players[i].realtime = READUINT32(save_p); // integer replacement for leveltime - players[i].laps = READUINT8(save_p); // Number of laps (optional) - players[i].latestlap = READUINT8(save_p); - players[i].starpostnum = READINT32(save_p); + players[i].totalring = READINT16(save->p); // Total number of rings obtained for GP + players[i].realtime = READUINT32(save->p); // integer replacement for leveltime + players[i].laps = READUINT8(save->p); // Number of laps (optional) + players[i].latestlap = READUINT8(save->p); + players[i].starpostnum = READINT32(save->p); - players[i].ctfteam = READUINT8(save_p); // 1 == Red, 2 == Blue + players[i].ctfteam = READUINT8(save->p); // 1 == Red, 2 == Blue - players[i].checkskip = READUINT8(save_p); + players[i].checkskip = READUINT8(save->p); - players[i].lastsidehit = READINT16(save_p); - players[i].lastlinehit = READINT16(save_p); + players[i].lastsidehit = READINT16(save->p); + players[i].lastlinehit = READINT16(save->p); - players[i].timeshit = READUINT8(save_p); - players[i].timeshitprev = READUINT8(save_p); + players[i].timeshit = READUINT8(save->p); + players[i].timeshitprev = READUINT8(save->p); - players[i].onconveyor = READINT32(save_p); + players[i].onconveyor = READINT32(save->p); - players[i].jointime = READUINT32(save_p); + players[i].jointime = READUINT32(save->p); - players[i].splitscreenindex = READUINT8(save_p); + players[i].splitscreenindex = READUINT8(save->p); - flags = READUINT16(save_p); + flags = READUINT16(save->p); if (flags & SKYBOXVIEW) - players[i].skybox.viewpoint = (mobj_t *)(size_t)READUINT32(save_p); + players[i].skybox.viewpoint = (mobj_t *)(size_t)READUINT32(save->p); if (flags & SKYBOXCENTER) - players[i].skybox.centerpoint = (mobj_t *)(size_t)READUINT32(save_p); + players[i].skybox.centerpoint = (mobj_t *)(size_t)READUINT32(save->p); if (flags & AWAYVIEW) - players[i].awayviewmobj = (mobj_t *)(size_t)READUINT32(save_p); + players[i].awayviewmobj = (mobj_t *)(size_t)READUINT32(save->p); if (flags & FOLLOWITEM) - players[i].followmobj = (mobj_t *)(size_t)READUINT32(save_p); + players[i].followmobj = (mobj_t *)(size_t)READUINT32(save->p); if (flags & HOVERHYUDORO) - players[i].hoverhyudoro = (mobj_t *)(size_t)READUINT32(save_p); + players[i].hoverhyudoro = (mobj_t *)(size_t)READUINT32(save->p); if (flags & STUMBLE) - players[i].stumbleIndicator = (mobj_t *)(size_t)READUINT32(save_p); + players[i].stumbleIndicator = (mobj_t *)(size_t)READUINT32(save->p); - players[i].followitem = (mobjtype_t)READUINT32(save_p); + players[i].followitem = (mobjtype_t)READUINT32(save->p); //SetPlayerSkinByNum(i, players[i].skin); - players[i].charflags = READUINT32(save_p); + players[i].charflags = READUINT32(save->p); // SRB2kart - players[i].kartspeed = READUINT8(save_p); - players[i].kartweight = READUINT8(save_p); + players[i].kartspeed = READUINT8(save->p); + players[i].kartweight = READUINT8(save->p); - players[i].followerskin = READUINT8(save_p); - players[i].followerready = READUINT8(save_p); - players[i].followercolor = READUINT16(save_p); + players[i].followerskin = READUINT8(save->p); + players[i].followerready = READUINT8(save->p); + players[i].followercolor = READUINT16(save->p); if (flags & FOLLOWER) - players[i].follower = (mobj_t *)(size_t)READUINT32(save_p); + players[i].follower = (mobj_t *)(size_t)READUINT32(save->p); - players[i].nocontrol = READUINT16(save_p); - players[i].carry = READUINT8(save_p); - players[i].dye = READUINT16(save_p); + players[i].nocontrol = READUINT16(save->p); + players[i].carry = READUINT8(save->p); + players[i].dye = READUINT16(save->p); - players[i].position = READUINT8(save_p); - players[i].oldposition = READUINT8(save_p); - players[i].positiondelay = READUINT8(save_p); - players[i].distancetofinish = READUINT32(save_p); - players[i].currentwaypoint = (waypoint_t *)(size_t)READUINT32(save_p); - players[i].nextwaypoint = (waypoint_t *)(size_t)READUINT32(save_p); - players[i].airtime = READUINT32(save_p); - players[i].startboost = READUINT8(save_p); + players[i].position = READUINT8(save->p); + players[i].oldposition = READUINT8(save->p); + players[i].positiondelay = READUINT8(save->p); + players[i].distancetofinish = READUINT32(save->p); + players[i].currentwaypoint = (waypoint_t *)(size_t)READUINT32(save->p); + players[i].nextwaypoint = (waypoint_t *)(size_t)READUINT32(save->p); + players[i].airtime = READUINT32(save->p); + players[i].startboost = READUINT8(save->p); - players[i].flashing = READUINT16(save_p); - players[i].spinouttimer = READUINT16(save_p); - players[i].spinouttype = READUINT8(save_p); - players[i].instashield = READUINT8(save_p); - players[i].invulnhitlag = READINT32(save_p); - players[i].wipeoutslow = READUINT8(save_p); - players[i].justbumped = READUINT8(save_p); - players[i].tumbleBounces = READUINT8(save_p); - players[i].tumbleHeight = READUINT16(save_p); + players[i].flashing = READUINT16(save->p); + players[i].spinouttimer = READUINT16(save->p); + players[i].spinouttype = READUINT8(save->p); + players[i].instashield = READUINT8(save->p); + players[i].invulnhitlag = READINT32(save->p); + players[i].wipeoutslow = READUINT8(save->p); + players[i].justbumped = READUINT8(save->p); + players[i].tumbleBounces = READUINT8(save->p); + players[i].tumbleHeight = READUINT16(save->p); - players[i].justDI = READUINT8(save_p); - players[i].flipDI = (boolean)READUINT8(save_p); + players[i].justDI = READUINT8(save->p); + players[i].flipDI = (boolean)READUINT8(save->p); - players[i].drift = READSINT8(save_p); - players[i].driftcharge = READFIXED(save_p); - players[i].driftboost = READUINT8(save_p); - players[i].strongdriftboost = READUINT8(save_p); + players[i].drift = READSINT8(save->p); + players[i].driftcharge = READFIXED(save->p); + players[i].driftboost = READUINT8(save->p); + players[i].strongdriftboost = READUINT8(save->p); - players[i].gateBoost = READUINT16(save_p); - players[i].gateSound = READUINT8(save_p); + players[i].gateBoost = READUINT16(save->p); + players[i].gateSound = READUINT8(save->p); - players[i].aizdriftstrat = READSINT8(save_p); - players[i].aizdrifttilt = READINT32(save_p); - players[i].aizdriftturn = READINT32(save_p); + players[i].aizdriftstrat = READSINT8(save->p); + players[i].aizdrifttilt = READINT32(save->p); + players[i].aizdriftturn = READINT32(save->p); - players[i].underwatertilt = READINT32(save_p); + players[i].underwatertilt = READINT32(save->p); - players[i].offroad = READFIXED(save_p); + players[i].offroad = READFIXED(save->p); - players[i].tiregrease = READUINT16(save_p); - players[i].springstars = READUINT16(save_p); - players[i].springcolor = READUINT16(save_p); - players[i].dashpadcooldown = READUINT8(save_p); + players[i].tiregrease = READUINT16(save->p); + players[i].springstars = READUINT16(save->p); + players[i].springcolor = READUINT16(save->p); + players[i].dashpadcooldown = READUINT8(save->p); - players[i].spindash = READUINT16(save_p); - players[i].spindashspeed = READFIXED(save_p); - players[i].spindashboost = READUINT8(save_p); + players[i].spindash = READUINT16(save->p); + players[i].spindashspeed = READFIXED(save->p); + players[i].spindashboost = READUINT8(save->p); - players[i].fastfall = READFIXED(save_p); + players[i].fastfall = READFIXED(save->p); - players[i].numboosts = READUINT8(save_p); - players[i].boostpower = READFIXED(save_p); - players[i].speedboost = READFIXED(save_p); - players[i].accelboost = READFIXED(save_p); - players[i].handleboost = READFIXED(save_p); - players[i].boostangle = READANGLE(save_p); + players[i].numboosts = READUINT8(save->p); + players[i].boostpower = READFIXED(save->p); + players[i].speedboost = READFIXED(save->p); + players[i].accelboost = READFIXED(save->p); + players[i].handleboost = READFIXED(save->p); + players[i].boostangle = READANGLE(save->p); - players[i].draftpower = READFIXED(save_p); - players[i].draftleeway = READUINT16(save_p); - players[i].lastdraft = READSINT8(save_p); + players[i].draftpower = READFIXED(save->p); + players[i].draftleeway = READUINT16(save->p); + players[i].lastdraft = READSINT8(save->p); - players[i].tripwireState = READUINT8(save_p); - players[i].tripwirePass = READUINT8(save_p); - players[i].tripwireLeniency = READUINT16(save_p); + players[i].tripwireState = READUINT8(save->p); + players[i].tripwirePass = READUINT8(save->p); + players[i].tripwireLeniency = READUINT16(save->p); - players[i].itemtype = READSINT8(save_p); - players[i].itemamount = READUINT8(save_p); - players[i].throwdir = READSINT8(save_p); + players[i].itemtype = READSINT8(save->p); + players[i].itemamount = READUINT8(save->p); + players[i].throwdir = READSINT8(save->p); - players[i].sadtimer = READUINT8(save_p); + players[i].sadtimer = READUINT8(save->p); - players[i].rings = READSINT8(save_p); - players[i].pickuprings = READUINT8(save_p); - players[i].ringdelay = READUINT8(save_p); - players[i].ringboost = READUINT16(save_p); - players[i].sparkleanim = READUINT8(save_p); - players[i].superring = READUINT16(save_p); + players[i].rings = READSINT8(save->p); + players[i].pickuprings = READUINT8(save->p); + players[i].ringdelay = READUINT8(save->p); + players[i].ringboost = READUINT16(save->p); + players[i].sparkleanim = READUINT8(save->p); + players[i].superring = READUINT16(save->p); - players[i].curshield = READUINT8(save_p); - players[i].bubblecool = READUINT8(save_p); - players[i].bubbleblowup = READUINT8(save_p); - players[i].flamedash = READUINT16(save_p); - players[i].flamemeter = READUINT16(save_p); - players[i].flamelength = READUINT8(save_p); + players[i].curshield = READUINT8(save->p); + players[i].bubblecool = READUINT8(save->p); + players[i].bubbleblowup = READUINT8(save->p); + players[i].flamedash = READUINT16(save->p); + players[i].flamemeter = READUINT16(save->p); + players[i].flamelength = READUINT8(save->p); - players[i].ballhogcharge = READUINT16(save_p); + players[i].ballhogcharge = READUINT16(save->p); - players[i].hyudorotimer = READUINT16(save_p); - players[i].stealingtimer = READSINT8(save_p); + players[i].hyudorotimer = READUINT16(save->p); + players[i].stealingtimer = READSINT8(save->p); - players[i].sneakertimer = READUINT16(save_p); - players[i].numsneakers = READUINT8(save_p); - players[i].floorboost = READUINT8(save_p); + players[i].sneakertimer = READUINT16(save->p); + players[i].numsneakers = READUINT8(save->p); + players[i].floorboost = READUINT8(save->p); - players[i].growshrinktimer = READINT16(save_p); - players[i].rocketsneakertimer = READUINT16(save_p); - players[i].invincibilitytimer = READUINT16(save_p); + players[i].growshrinktimer = READINT16(save->p); + players[i].rocketsneakertimer = READUINT16(save->p); + players[i].invincibilitytimer = READUINT16(save->p); - players[i].eggmanexplode = READUINT8(save_p); - players[i].eggmanblame = READSINT8(save_p); + players[i].eggmanexplode = READUINT8(save->p); + players[i].eggmanblame = READSINT8(save->p); - players[i].bananadrag = READUINT8(save_p); + players[i].bananadrag = READUINT8(save->p); - players[i].lastjawztarget = READSINT8(save_p); - players[i].jawztargetdelay = READUINT8(save_p); + players[i].lastjawztarget = READSINT8(save->p); + players[i].jawztargetdelay = READUINT8(save->p); - players[i].confirmVictim = READUINT8(save_p); - players[i].confirmVictimDelay = READUINT8(save_p); + players[i].confirmVictim = READUINT8(save->p); + players[i].confirmVictimDelay = READUINT8(save->p); - players[i].trickpanel = READUINT8(save_p); - players[i].tricktime = READUINT8(save_p); - players[i].trickboostpower = READUINT32(save_p); - players[i].trickboostdecay = READUINT8(save_p); - players[i].trickboost = READUINT8(save_p); + players[i].trickpanel = READUINT8(save->p); + players[i].tricktime = READUINT8(save->p); + players[i].trickboostpower = READUINT32(save->p); + players[i].trickboostdecay = READUINT8(save->p); + players[i].trickboost = READUINT8(save->p); - players[i].ebrakefor = READUINT32(save_p); + players[i].ebrakefor = READUINT32(save->p); - players[i].roundscore = READUINT32(save_p); - players[i].emeralds = READUINT8(save_p); - players[i].bumpers = READUINT8(save_p); - players[i].karmadelay = READINT16(save_p); - players[i].overtimekarma = READUINT32(save_p); - players[i].spheres = READINT16(save_p); - players[i].spheredigestion = READUINT32(save_p); + players[i].roundscore = READUINT32(save->p); + players[i].emeralds = READUINT8(save->p); + players[i].bumpers = READUINT8(save->p); + players[i].karmadelay = READINT16(save->p); + players[i].overtimekarma = READUINT32(save->p); + players[i].spheres = READINT16(save->p); + players[i].spheredigestion = READUINT32(save->p); - players[i].glanceDir = READSINT8(save_p); + players[i].glanceDir = READSINT8(save->p); - players[i].typing_timer = READUINT8(save_p); - players[i].typing_duration = READUINT8(save_p); + players[i].typing_timer = READUINT8(save->p); + players[i].typing_duration = READUINT8(save->p); - players[i].kickstartaccel = READUINT8(save_p); + players[i].kickstartaccel = READUINT8(save->p); - players[i].stairjank = READUINT8(save_p); - players[i].topdriftheld = READUINT8(save_p); - players[i].topinfirst = READUINT8(save_p); + players[i].stairjank = READUINT8(save->p); + players[i].topdriftheld = READUINT8(save->p); + players[i].topinfirst = READUINT8(save->p); - players[i].shrinkLaserDelay = READUINT8(save_p); + players[i].shrinkLaserDelay = READUINT8(save->p); // respawnvars_t - players[i].respawn.state = READUINT8(save_p); - players[i].respawn.wp = (waypoint_t *)(size_t)READUINT32(save_p); - players[i].respawn.pointx = READFIXED(save_p); - players[i].respawn.pointy = READFIXED(save_p); - players[i].respawn.pointz = READFIXED(save_p); - players[i].respawn.flip = (boolean)READUINT8(save_p); - players[i].respawn.timer = READUINT32(save_p); - players[i].respawn.airtimer = READUINT32(save_p); - players[i].respawn.distanceleft = READUINT32(save_p); - players[i].respawn.dropdash = READUINT32(save_p); - players[i].respawn.truedeath = READUINT8(save_p); - players[i].respawn.manual = READUINT8(save_p); + players[i].respawn.state = READUINT8(save->p); + players[i].respawn.wp = (waypoint_t *)(size_t)READUINT32(save->p); + players[i].respawn.pointx = READFIXED(save->p); + players[i].respawn.pointy = READFIXED(save->p); + players[i].respawn.pointz = READFIXED(save->p); + players[i].respawn.flip = (boolean)READUINT8(save->p); + players[i].respawn.timer = READUINT32(save->p); + players[i].respawn.airtimer = READUINT32(save->p); + players[i].respawn.distanceleft = READUINT32(save->p); + players[i].respawn.dropdash = READUINT32(save->p); + players[i].respawn.truedeath = READUINT8(save->p); + players[i].respawn.manual = READUINT8(save->p); // botvars_t - players[i].botvars.difficulty = READUINT8(save_p); - players[i].botvars.diffincrease = READUINT8(save_p); - players[i].botvars.rival = (boolean)READUINT8(save_p); - players[i].botvars.rubberband = READFIXED(save_p); - players[i].botvars.controller = READUINT16(save_p); - players[i].botvars.itemdelay = READUINT32(save_p); - players[i].botvars.itemconfirm = READUINT32(save_p); - players[i].botvars.turnconfirm = READSINT8(save_p); - players[i].botvars.spindashconfirm = READUINT32(save_p); + players[i].botvars.difficulty = READUINT8(save->p); + players[i].botvars.diffincrease = READUINT8(save->p); + players[i].botvars.rival = (boolean)READUINT8(save->p); + players[i].botvars.rubberband = READFIXED(save->p); + players[i].botvars.controller = READUINT16(save->p); + players[i].botvars.itemdelay = READUINT32(save->p); + players[i].botvars.itemconfirm = READUINT32(save->p); + players[i].botvars.turnconfirm = READSINT8(save->p); + players[i].botvars.spindashconfirm = READUINT32(save->p); // itemroulette_t - players[i].itemRoulette.active = (boolean)READUINT8(save_p); + players[i].itemRoulette.active = (boolean)READUINT8(save->p); #ifdef ITEM_LIST_SIZE - players[i].itemRoulette.itemListLen = (size_t)READUINT32(save_p); + players[i].itemRoulette.itemListLen = (size_t)READUINT32(save->p); for (q = 0; q < ITEM_LIST_SIZE; q++) { - players[i].itemRoulette.itemList[q] = READSINT8(save_p); + players[i].itemRoulette.itemList[q] = READSINT8(save->p); } #else - players[i].itemRoulette.itemListCap = (size_t)READUINT32(save_p); - players[i].itemRoulette.itemListLen = (size_t)READUINT32(save_p); + players[i].itemRoulette.itemListCap = (size_t)READUINT32(save->p); + players[i].itemRoulette.itemListLen = (size_t)READUINT32(save->p); if (players[i].itemRoulette.itemListCap > 0) { @@ -812,19 +811,19 @@ static void P_NetUnArchivePlayers(void) for (q = 0; q < players[i].itemRoulette.itemListLen; q++) { - players[i].itemRoulette.itemList[q] = READSINT8(save_p); + players[i].itemRoulette.itemList[q] = READSINT8(save->p); } } #endif - players[i].itemRoulette.useOdds = READUINT8(save_p); - players[i].itemRoulette.dist = READUINT32(save_p); - players[i].itemRoulette.index = (size_t)READUINT32(save_p); - players[i].itemRoulette.sound = READUINT8(save_p); - players[i].itemRoulette.speed = (tic_t)READUINT32(save_p); - players[i].itemRoulette.tics = (tic_t)READUINT32(save_p); - players[i].itemRoulette.elapsed = (tic_t)READUINT32(save_p); - players[i].itemRoulette.eggman = (boolean)READUINT8(save_p); + players[i].itemRoulette.useOdds = READUINT8(save->p); + players[i].itemRoulette.dist = READUINT32(save->p); + players[i].itemRoulette.index = (size_t)READUINT32(save->p); + players[i].itemRoulette.sound = READUINT8(save->p); + players[i].itemRoulette.speed = (tic_t)READUINT32(save->p); + players[i].itemRoulette.tics = (tic_t)READUINT32(save->p); + players[i].itemRoulette.elapsed = (tic_t)READUINT32(save->p); + players[i].itemRoulette.eggman = (boolean)READUINT8(save->p); //players[i].viewheight = P_GetPlayerViewHeight(players[i]); // scale cannot be factored in at this point } @@ -927,12 +926,12 @@ static void ClearNetColormaps(void) net_colormaps = NULL; } -static void P_NetArchiveColormaps(void) +static void P_NetArchiveColormaps(savebuffer_t *save) { // We save and then we clean up our colormap mess extracolormap_t *exc, *exc_next; UINT32 i = 0; - WRITEUINT32(save_p, num_net_colormaps); // save for safety + WRITEUINT32(save->p, num_net_colormaps); // save for safety for (exc = net_colormaps; i < num_net_colormaps; i++, exc = exc_next) { @@ -941,15 +940,15 @@ static void P_NetArchiveColormaps(void) if (!exc) exc = R_CreateDefaultColormap(false); - WRITEUINT8(save_p, exc->fadestart); - WRITEUINT8(save_p, exc->fadeend); - WRITEUINT8(save_p, exc->flags); + WRITEUINT8(save->p, exc->fadestart); + WRITEUINT8(save->p, exc->fadeend); + WRITEUINT8(save->p, exc->flags); - WRITEINT32(save_p, exc->rgba); - WRITEINT32(save_p, exc->fadergba); + WRITEINT32(save->p, exc->rgba); + WRITEINT32(save->p, exc->fadergba); #ifdef EXTRACOLORMAPLUMPS - WRITESTRINGN(save_p, exc->lumpname, 9); + WRITESTRINGN(save->p, exc->lumpname, 9); #endif exc_next = exc->next; @@ -961,7 +960,7 @@ static void P_NetArchiveColormaps(void) net_colormaps = NULL; } -static void P_NetUnArchiveColormaps(void) +static void P_NetUnArchiveColormaps(savebuffer_t *save) { // When we reach this point, we already populated our list with // dummy colormaps. Now that we are loading the color data, @@ -969,7 +968,7 @@ static void P_NetUnArchiveColormaps(void) extracolormap_t *exc, *existing_exc, *exc_next = NULL; UINT32 i = 0; - num_net_colormaps = READUINT32(save_p); + num_net_colormaps = READUINT32(save->p); for (exc = net_colormaps; i < num_net_colormaps; i++, exc = exc_next) { @@ -979,15 +978,15 @@ static void P_NetUnArchiveColormaps(void) char lumpname[9]; #endif - fadestart = READUINT8(save_p); - fadeend = READUINT8(save_p); - flags = READUINT8(save_p); + fadestart = READUINT8(save->p); + fadeend = READUINT8(save->p); + flags = READUINT8(save->p); - rgba = READINT32(save_p); - fadergba = READINT32(save_p); + rgba = READINT32(save->p); + fadergba = READINT32(save->p); #ifdef EXTRACOLORMAPLUMPS - READSTRINGN(save_p, lumpname, 9); + READSTRINGN(save->p, lumpname, 9); if (lumpname[0]) { @@ -1063,29 +1062,29 @@ static void P_NetUnArchiveColormaps(void) net_colormaps = NULL; } -static void P_NetArchiveTubeWaypoints(void) +static void P_NetArchiveTubeWaypoints(savebuffer_t *save) { INT32 i, j; for (i = 0; i < NUMTUBEWAYPOINTSEQUENCES; i++) { - WRITEUINT16(save_p, numtubewaypoints[i]); + WRITEUINT16(save->p, numtubewaypoints[i]); for (j = 0; j < numtubewaypoints[i]; j++) - WRITEUINT32(save_p, tubewaypoints[i][j] ? tubewaypoints[i][j]->mobjnum : 0); + WRITEUINT32(save->p, tubewaypoints[i][j] ? tubewaypoints[i][j]->mobjnum : 0); } } -static void P_NetUnArchiveTubeWaypoints(void) +static void P_NetUnArchiveTubeWaypoints(savebuffer_t *save) { INT32 i, j; UINT32 mobjnum; for (i = 0; i < NUMTUBEWAYPOINTSEQUENCES; i++) { - numtubewaypoints[i] = READUINT16(save_p); + numtubewaypoints[i] = READUINT16(save->p); for (j = 0; j < numtubewaypoints[i]; j++) { - mobjnum = READUINT32(save_p); + mobjnum = READUINT32(save->p); tubewaypoints[i][j] = (mobjnum == 0) ? NULL : P_FindNewPosition(mobjnum); } } @@ -1195,7 +1194,7 @@ static boolean CheckFFloorDiff(const sector_t *ss) // Special case: save the stats of all modified ffloors along with their ffloor "number"s // we don't bother with ffloors that haven't changed, that would just add to savegame even more than is really needed -static void ArchiveFFloors(const sector_t *ss) +static void ArchiveFFloors(savebuffer_t *save, const sector_t *ss) { size_t j = 0; // ss->ffloors is saved as ffloor #0, ss->ffloors->next is #1, etc ffloor_t *rover; @@ -1210,19 +1209,19 @@ static void ArchiveFFloors(const sector_t *ss) if (fflr_diff) { - WRITEUINT16(save_p, j); // save ffloor "number" - WRITEUINT8(save_p, fflr_diff); + WRITEUINT16(save->p, j); // save ffloor "number" + WRITEUINT8(save->p, fflr_diff); if (fflr_diff & FD_FLAGS) - WRITEUINT32(save_p, rover->fofflags); + WRITEUINT32(save->p, rover->fofflags); if (fflr_diff & FD_ALPHA) - WRITEINT16(save_p, rover->alpha); + WRITEINT16(save->p, rover->alpha); } j++; } - WRITEUINT16(save_p, 0xffff); + WRITEUINT16(save->p, 0xffff); } -static void UnArchiveFFloors(const sector_t *ss) +static void UnArchiveFFloors(savebuffer_t *save, const sector_t *ss) { UINT16 j = 0; // number of current ffloor in loop UINT16 fflr_i; // saved ffloor "number" of next modified ffloor @@ -1233,7 +1232,7 @@ static void UnArchiveFFloors(const sector_t *ss) if (!rover) // it is assumed sectors[i].ffloors actually exists, but just in case... I_Error("Sector does not have any ffloors!"); - fflr_i = READUINT16(save_p); // get first modified ffloor's number ready + fflr_i = READUINT16(save->p); // get first modified ffloor's number ready for (;;) // for some reason the usual for (rover = x; ...) thing doesn't work here? { if (fflr_i == 0xffff) // end of modified ffloors list, let's stop already @@ -1248,21 +1247,21 @@ static void UnArchiveFFloors(const sector_t *ss) continue; } - fflr_diff = READUINT8(save_p); + fflr_diff = READUINT8(save->p); if (fflr_diff & FD_FLAGS) - rover->fofflags = READUINT32(save_p); + rover->fofflags = READUINT32(save->p); if (fflr_diff & FD_ALPHA) - rover->alpha = READINT16(save_p); + rover->alpha = READINT16(save->p); - fflr_i = READUINT16(save_p); // get next ffloor "number" ready + fflr_i = READUINT16(save->p); // get next ffloor "number" ready j++; rover = rover->next; } } -static void ArchiveSectors(void) +static void ArchiveSectors(savebuffer_t *save) { size_t i, j; const sector_t *ss = sectors; @@ -1341,87 +1340,87 @@ static void ArchiveSectors(void) if (diff) { - WRITEUINT16(save_p, i); - WRITEUINT8(save_p, diff); + WRITEUINT16(save->p, i); + WRITEUINT8(save->p, diff); if (diff & SD_DIFF2) - WRITEUINT8(save_p, diff2); + WRITEUINT8(save->p, diff2); if (diff2 & SD_DIFF3) - WRITEUINT8(save_p, diff3); + WRITEUINT8(save->p, diff3); if (diff3 & SD_DIFF4) - WRITEUINT8(save_p, diff4); + WRITEUINT8(save->p, diff4); if (diff & SD_FLOORHT) - WRITEFIXED(save_p, ss->floorheight); + WRITEFIXED(save->p, ss->floorheight); if (diff & SD_CEILHT) - WRITEFIXED(save_p, ss->ceilingheight); + WRITEFIXED(save->p, ss->ceilingheight); if (diff & SD_FLOORPIC) - WRITEMEM(save_p, levelflats[ss->floorpic].name, 8); + WRITEMEM(save->p, levelflats[ss->floorpic].name, 8); if (diff & SD_CEILPIC) - WRITEMEM(save_p, levelflats[ss->ceilingpic].name, 8); + WRITEMEM(save->p, levelflats[ss->ceilingpic].name, 8); if (diff & SD_LIGHT) - WRITEINT16(save_p, ss->lightlevel); + WRITEINT16(save->p, ss->lightlevel); if (diff & SD_SPECIAL) - WRITEINT16(save_p, ss->special); + WRITEINT16(save->p, ss->special); if (diff2 & SD_FXOFFS) - WRITEFIXED(save_p, ss->floor_xoffs); + WRITEFIXED(save->p, ss->floor_xoffs); if (diff2 & SD_FYOFFS) - WRITEFIXED(save_p, ss->floor_yoffs); + WRITEFIXED(save->p, ss->floor_yoffs); if (diff2 & SD_CXOFFS) - WRITEFIXED(save_p, ss->ceiling_xoffs); + WRITEFIXED(save->p, ss->ceiling_xoffs); if (diff2 & SD_CYOFFS) - WRITEFIXED(save_p, ss->ceiling_yoffs); + WRITEFIXED(save->p, ss->ceiling_yoffs); if (diff2 & SD_FLOORANG) - WRITEANGLE(save_p, ss->floorpic_angle); + WRITEANGLE(save->p, ss->floorpic_angle); if (diff2 & SD_CEILANG) - WRITEANGLE(save_p, ss->ceilingpic_angle); + WRITEANGLE(save->p, ss->ceilingpic_angle); if (diff2 & SD_TAG) { - WRITEUINT32(save_p, ss->tags.count); + WRITEUINT32(save->p, ss->tags.count); for (j = 0; j < ss->tags.count; j++) - WRITEINT16(save_p, ss->tags.tags[j]); + WRITEINT16(save->p, ss->tags.tags[j]); } if (diff3 & SD_COLORMAP) - WRITEUINT32(save_p, CheckAddNetColormapToList(ss->extra_colormap)); + WRITEUINT32(save->p, CheckAddNetColormapToList(ss->extra_colormap)); // returns existing index if already added, or appends to net_colormaps and returns new index if (diff3 & SD_CRUMBLESTATE) - WRITEINT32(save_p, ss->crumblestate); + WRITEINT32(save->p, ss->crumblestate); if (diff3 & SD_FLOORLIGHT) { - WRITEINT16(save_p, ss->floorlightlevel); - WRITEUINT8(save_p, ss->floorlightabsolute); + WRITEINT16(save->p, ss->floorlightlevel); + WRITEUINT8(save->p, ss->floorlightabsolute); } if (diff3 & SD_CEILLIGHT) { - WRITEINT16(save_p, ss->ceilinglightlevel); - WRITEUINT8(save_p, ss->ceilinglightabsolute); + WRITEINT16(save->p, ss->ceilinglightlevel); + WRITEUINT8(save->p, ss->ceilinglightabsolute); } if (diff3 & SD_FLAG) - WRITEUINT32(save_p, ss->flags); + WRITEUINT32(save->p, ss->flags); if (diff3 & SD_SPECIALFLAG) - WRITEUINT32(save_p, ss->specialflags); + WRITEUINT32(save->p, ss->specialflags); if (diff4 & SD_DAMAGETYPE) - WRITEUINT8(save_p, ss->damagetype); + WRITEUINT8(save->p, ss->damagetype); if (diff4 & SD_TRIGGERTAG) - WRITEINT16(save_p, ss->triggertag); + WRITEINT16(save->p, ss->triggertag); if (diff4 & SD_TRIGGERER) - WRITEUINT8(save_p, ss->triggerer); + WRITEUINT8(save->p, ss->triggerer); if (diff4 & SD_GRAVITY) - WRITEFIXED(save_p, ss->gravity); + WRITEFIXED(save->p, ss->gravity); if (diff & SD_FFLOORS) - ArchiveFFloors(ss); + ArchiveFFloors(save, ss); } } - WRITEUINT16(save_p, 0xffff); + WRITEUINT16(save->p, 0xffff); } -static void UnArchiveSectors(void) +static void UnArchiveSectors(savebuffer_t *save) { UINT16 i, j; UINT8 diff, diff2, diff3, diff4; for (;;) { - i = READUINT16(save_p); + i = READUINT16(save->p); if (i == 0xffff) break; @@ -1429,54 +1428,54 @@ static void UnArchiveSectors(void) if (i > numsectors) I_Error("Invalid sector number %u from server (expected end at %s)", i, sizeu1(numsectors)); - diff = READUINT8(save_p); + diff = READUINT8(save->p); if (diff & SD_DIFF2) - diff2 = READUINT8(save_p); + diff2 = READUINT8(save->p); else diff2 = 0; if (diff2 & SD_DIFF3) - diff3 = READUINT8(save_p); + diff3 = READUINT8(save->p); else diff3 = 0; if (diff3 & SD_DIFF4) - diff4 = READUINT8(save_p); + diff4 = READUINT8(save->p); else diff4 = 0; if (diff & SD_FLOORHT) - sectors[i].floorheight = READFIXED(save_p); + sectors[i].floorheight = READFIXED(save->p); if (diff & SD_CEILHT) - sectors[i].ceilingheight = READFIXED(save_p); + sectors[i].ceilingheight = READFIXED(save->p); if (diff & SD_FLOORPIC) { - sectors[i].floorpic = P_AddLevelFlatRuntime((char *)save_p); - save_p += 8; + sectors[i].floorpic = P_AddLevelFlatRuntime((char *)save->p); + save->p += 8; } if (diff & SD_CEILPIC) { - sectors[i].ceilingpic = P_AddLevelFlatRuntime((char *)save_p); - save_p += 8; + sectors[i].ceilingpic = P_AddLevelFlatRuntime((char *)save->p); + save->p += 8; } if (diff & SD_LIGHT) - sectors[i].lightlevel = READINT16(save_p); + sectors[i].lightlevel = READINT16(save->p); if (diff & SD_SPECIAL) - sectors[i].special = READINT16(save_p); + sectors[i].special = READINT16(save->p); if (diff2 & SD_FXOFFS) - sectors[i].floor_xoffs = READFIXED(save_p); + sectors[i].floor_xoffs = READFIXED(save->p); if (diff2 & SD_FYOFFS) - sectors[i].floor_yoffs = READFIXED(save_p); + sectors[i].floor_yoffs = READFIXED(save->p); if (diff2 & SD_CXOFFS) - sectors[i].ceiling_xoffs = READFIXED(save_p); + sectors[i].ceiling_xoffs = READFIXED(save->p); if (diff2 & SD_CYOFFS) - sectors[i].ceiling_yoffs = READFIXED(save_p); + sectors[i].ceiling_yoffs = READFIXED(save->p); if (diff2 & SD_FLOORANG) - sectors[i].floorpic_angle = READANGLE(save_p); + sectors[i].floorpic_angle = READANGLE(save->p); if (diff2 & SD_CEILANG) - sectors[i].ceilingpic_angle = READANGLE(save_p); + sectors[i].ceilingpic_angle = READANGLE(save->p); if (diff2 & SD_TAG) { - size_t ncount = READUINT32(save_p); + size_t ncount = READUINT32(save->p); // Remove entries from global lists. for (j = 0; j < sectors[i].tags.count; j++) @@ -1490,7 +1489,7 @@ static void UnArchiveSectors(void) } for (j = 0; j < ncount; j++) - sectors[i].tags.tags[j] = READINT16(save_p); + sectors[i].tags.tags[j] = READINT16(save->p); // Add new entries. for (j = 0; j < sectors[i].tags.count; j++) @@ -1499,41 +1498,41 @@ static void UnArchiveSectors(void) if (diff3 & SD_COLORMAP) - sectors[i].extra_colormap = GetNetColormapFromList(READUINT32(save_p)); + sectors[i].extra_colormap = GetNetColormapFromList(READUINT32(save->p)); if (diff3 & SD_CRUMBLESTATE) - sectors[i].crumblestate = READINT32(save_p); + sectors[i].crumblestate = READINT32(save->p); if (diff3 & SD_FLOORLIGHT) { - sectors[i].floorlightlevel = READINT16(save_p); - sectors[i].floorlightabsolute = READUINT8(save_p); + sectors[i].floorlightlevel = READINT16(save->p); + sectors[i].floorlightabsolute = READUINT8(save->p); } if (diff3 & SD_CEILLIGHT) { - sectors[i].ceilinglightlevel = READINT16(save_p); - sectors[i].ceilinglightabsolute = READUINT8(save_p); + sectors[i].ceilinglightlevel = READINT16(save->p); + sectors[i].ceilinglightabsolute = READUINT8(save->p); } if (diff3 & SD_FLAG) { - sectors[i].flags = READUINT32(save_p); + sectors[i].flags = READUINT32(save->p); CheckForReverseGravity |= (sectors[i].flags & MSF_GRAVITYFLIP); } if (diff3 & SD_SPECIALFLAG) - sectors[i].specialflags = READUINT32(save_p); + sectors[i].specialflags = READUINT32(save->p); if (diff4 & SD_DAMAGETYPE) - sectors[i].damagetype = READUINT8(save_p); + sectors[i].damagetype = READUINT8(save->p); if (diff4 & SD_TRIGGERTAG) - sectors[i].triggertag = READINT16(save_p); + sectors[i].triggertag = READINT16(save->p); if (diff4 & SD_TRIGGERER) - sectors[i].triggerer = READUINT8(save_p); + sectors[i].triggerer = READUINT8(save->p); if (diff4 & SD_GRAVITY) - sectors[i].gravity = READFIXED(save_p); + sectors[i].gravity = READFIXED(save->p); if (diff & SD_FFLOORS) - UnArchiveFFloors(§ors[i]); + UnArchiveFFloors(save, §ors[i]); } } -static void ArchiveLines(void) +static void ArchiveLines(savebuffer_t *save) { size_t i; const line_t *li = lines; @@ -1594,41 +1593,41 @@ static void ArchiveLines(void) if (diff) { - WRITEINT16(save_p, i); - WRITEUINT8(save_p, diff); + WRITEINT16(save->p, i); + WRITEUINT8(save->p, diff); if (diff & LD_DIFF2) - WRITEUINT8(save_p, diff2); + WRITEUINT8(save->p, diff2); if (diff & LD_FLAG) - WRITEUINT32(save_p, li->flags); + WRITEUINT32(save->p, li->flags); if (diff & LD_SPECIAL) - WRITEINT16(save_p, li->special); + WRITEINT16(save->p, li->special); if (diff & LD_CLLCOUNT) - WRITEINT16(save_p, li->callcount); + WRITEINT16(save->p, li->callcount); si = &sides[li->sidenum[0]]; if (diff & LD_S1TEXOFF) - WRITEFIXED(save_p, si->textureoffset); + WRITEFIXED(save->p, si->textureoffset); if (diff & LD_S1TOPTEX) - WRITEINT32(save_p, si->toptexture); + WRITEINT32(save->p, si->toptexture); if (diff & LD_S1BOTTEX) - WRITEINT32(save_p, si->bottomtexture); + WRITEINT32(save->p, si->bottomtexture); if (diff & LD_S1MIDTEX) - WRITEINT32(save_p, si->midtexture); + WRITEINT32(save->p, si->midtexture); si = &sides[li->sidenum[1]]; if (diff2 & LD_S2TEXOFF) - WRITEFIXED(save_p, si->textureoffset); + WRITEFIXED(save->p, si->textureoffset); if (diff2 & LD_S2TOPTEX) - WRITEINT32(save_p, si->toptexture); + WRITEINT32(save->p, si->toptexture); if (diff2 & LD_S2BOTTEX) - WRITEINT32(save_p, si->bottomtexture); + WRITEINT32(save->p, si->bottomtexture); if (diff2 & LD_S2MIDTEX) - WRITEINT32(save_p, si->midtexture); + WRITEINT32(save->p, si->midtexture); if (diff2 & LD_ARGS) { UINT8 j; for (j = 0; j < NUMLINEARGS; j++) - WRITEINT32(save_p, li->args[j]); + WRITEINT32(save->p, li->args[j]); } if (diff2 & LD_STRINGARGS) { @@ -1639,24 +1638,24 @@ static void ArchiveLines(void) if (!li->stringargs[j]) { - WRITEINT32(save_p, 0); + WRITEINT32(save->p, 0); continue; } len = strlen(li->stringargs[j]); - WRITEINT32(save_p, len); + WRITEINT32(save->p, len); for (k = 0; k < len; k++) - WRITECHAR(save_p, li->stringargs[j][k]); + WRITECHAR(save->p, li->stringargs[j][k]); } } if (diff2 & LD_EXECUTORDELAY) - WRITEINT32(save_p, li->executordelay); + WRITEINT32(save->p, li->executordelay); } } - WRITEUINT16(save_p, 0xffff); + WRITEUINT16(save->p, 0xffff); } -static void UnArchiveLines(void) +static void UnArchiveLines(savebuffer_t *save) { UINT16 i; line_t *li; @@ -1665,59 +1664,59 @@ static void UnArchiveLines(void) for (;;) { - i = READUINT16(save_p); + i = READUINT16(save->p); if (i == 0xffff) break; if (i > numlines) I_Error("Invalid line number %u from server", i); - diff = READUINT8(save_p); + diff = READUINT8(save->p); li = &lines[i]; if (diff & LD_DIFF2) - diff2 = READUINT8(save_p); + diff2 = READUINT8(save->p); else diff2 = 0; if (diff & LD_FLAG) - li->flags = READUINT32(save_p); + li->flags = READUINT32(save->p); if (diff & LD_SPECIAL) - li->special = READINT16(save_p); + li->special = READINT16(save->p); if (diff & LD_CLLCOUNT) - li->callcount = READINT16(save_p); + li->callcount = READINT16(save->p); si = &sides[li->sidenum[0]]; if (diff & LD_S1TEXOFF) - si->textureoffset = READFIXED(save_p); + si->textureoffset = READFIXED(save->p); if (diff & LD_S1TOPTEX) - si->toptexture = READINT32(save_p); + si->toptexture = READINT32(save->p); if (diff & LD_S1BOTTEX) - si->bottomtexture = READINT32(save_p); + si->bottomtexture = READINT32(save->p); if (diff & LD_S1MIDTEX) - si->midtexture = READINT32(save_p); + si->midtexture = READINT32(save->p); si = &sides[li->sidenum[1]]; if (diff2 & LD_S2TEXOFF) - si->textureoffset = READFIXED(save_p); + si->textureoffset = READFIXED(save->p); if (diff2 & LD_S2TOPTEX) - si->toptexture = READINT32(save_p); + si->toptexture = READINT32(save->p); if (diff2 & LD_S2BOTTEX) - si->bottomtexture = READINT32(save_p); + si->bottomtexture = READINT32(save->p); if (diff2 & LD_S2MIDTEX) - si->midtexture = READINT32(save_p); + si->midtexture = READINT32(save->p); if (diff2 & LD_ARGS) { UINT8 j; for (j = 0; j < NUMLINEARGS; j++) - li->args[j] = READINT32(save_p); + li->args[j] = READINT32(save->p); } if (diff2 & LD_STRINGARGS) { UINT8 j; for (j = 0; j < NUMLINESTRINGARGS; j++) { - size_t len = READINT32(save_p); + size_t len = READINT32(save->p); size_t k; if (!len) @@ -1729,33 +1728,33 @@ static void UnArchiveLines(void) li->stringargs[j] = Z_Realloc(li->stringargs[j], len + 1, PU_LEVEL, NULL); for (k = 0; k < len; k++) - li->stringargs[j][k] = READCHAR(save_p); + li->stringargs[j][k] = READCHAR(save->p); li->stringargs[j][len] = '\0'; } } if (diff2 & LD_EXECUTORDELAY) - li->executordelay = READINT32(save_p); + li->executordelay = READINT32(save->p); } } -static void P_NetArchiveWorld(void) +static void P_NetArchiveWorld(savebuffer_t *save) { // initialize colormap vars because paranoia ClearNetColormaps(); - WRITEUINT32(save_p, ARCHIVEBLOCK_WORLD); + WRITEUINT32(save->p, ARCHIVEBLOCK_WORLD); - ArchiveSectors(); - ArchiveLines(); + ArchiveSectors(save); + ArchiveLines(save); R_ClearTextureNumCache(false); } -static void P_NetUnArchiveWorld(void) +static void P_NetUnArchiveWorld(savebuffer_t *save) { UINT16 i; - if (READUINT32(save_p) != ARCHIVEBLOCK_WORLD) + if (READUINT32(save->p) != ARCHIVEBLOCK_WORLD) I_Error("Bad $$$.sav at archive block World"); // initialize colormap vars because paranoia @@ -1769,8 +1768,8 @@ static void P_NetUnArchiveWorld(void) num_ffloors++; } - UnArchiveSectors(); - UnArchiveLines(); + UnArchiveSectors(save); + UnArchiveLines(save); } // @@ -1924,7 +1923,7 @@ static UINT32 SaveSlope(const pslope_t *slope) return 0xFFFFFFFF; } -static void SaveMobjThinker(const thinker_t *th, const UINT8 type) +static void SaveMobjThinker(savebuffer_t *save, const thinker_t *th, const UINT8 type) { const mobj_t *mobj = (const mobj_t *)th; UINT32 diff; @@ -2102,28 +2101,28 @@ static void SaveMobjThinker(const thinker_t *th, const UINT8 type) if (mobj->type == MT_HOOPCENTER) diff = MD_SPAWNPOINT; - WRITEUINT8(save_p, type); - WRITEUINT32(save_p, diff); + WRITEUINT8(save->p, type); + WRITEUINT32(save->p, diff); if (diff & MD_MORE) - WRITEUINT32(save_p, diff2); + WRITEUINT32(save->p, diff2); // save pointer, at load time we will search this pointer to reinitilize pointers - WRITEUINT32(save_p, (size_t)mobj); + WRITEUINT32(save->p, (size_t)mobj); - WRITEFIXED(save_p, mobj->z); // Force this so 3dfloor problems don't arise. - WRITEFIXED(save_p, mobj->floorz); - WRITEFIXED(save_p, mobj->ceilingz); + WRITEFIXED(save->p, mobj->z); // Force this so 3dfloor problems don't arise. + WRITEFIXED(save->p, mobj->floorz); + WRITEFIXED(save->p, mobj->ceilingz); if (diff2 & MD2_FLOORROVER) { - WRITEUINT32(save_p, SaveSector(mobj->floorrover->target)); - WRITEUINT16(save_p, P_GetFFloorID(mobj->floorrover)); + WRITEUINT32(save->p, SaveSector(mobj->floorrover->target)); + WRITEUINT16(save->p, P_GetFFloorID(mobj->floorrover)); } if (diff2 & MD2_CEILINGROVER) { - WRITEUINT32(save_p, SaveSector(mobj->ceilingrover->target)); - WRITEUINT16(save_p, P_GetFFloorID(mobj->ceilingrover)); + WRITEUINT32(save->p, SaveSector(mobj->ceilingrover->target)); + WRITEUINT16(save->p, P_GetFFloorID(mobj->ceilingrover)); } if (diff & MD_SPAWNPOINT) @@ -2134,7 +2133,7 @@ static void SaveMobjThinker(const thinker_t *th, const UINT8 type) { if (&mapthings[z] != mobj->spawnpoint) continue; - WRITEUINT16(save_p, z); + WRITEUINT16(save->p, z); break; } if (mobj->type == MT_HOOPCENTER) @@ -2142,110 +2141,110 @@ static void SaveMobjThinker(const thinker_t *th, const UINT8 type) } if (diff & MD_TYPE) - WRITEUINT32(save_p, mobj->type); + WRITEUINT32(save->p, mobj->type); if (diff & MD_POS) { - WRITEFIXED(save_p, mobj->x); - WRITEFIXED(save_p, mobj->y); - WRITEANGLE(save_p, mobj->angle); - WRITEANGLE(save_p, mobj->pitch); - WRITEANGLE(save_p, mobj->roll); + WRITEFIXED(save->p, mobj->x); + WRITEFIXED(save->p, mobj->y); + WRITEANGLE(save->p, mobj->angle); + WRITEANGLE(save->p, mobj->pitch); + WRITEANGLE(save->p, mobj->roll); } if (diff & MD_MOM) { - WRITEFIXED(save_p, mobj->momx); - WRITEFIXED(save_p, mobj->momy); - WRITEFIXED(save_p, mobj->momz); - WRITEFIXED(save_p, mobj->pmomz); + WRITEFIXED(save->p, mobj->momx); + WRITEFIXED(save->p, mobj->momy); + WRITEFIXED(save->p, mobj->momz); + WRITEFIXED(save->p, mobj->pmomz); } if (diff & MD_RADIUS) - WRITEFIXED(save_p, mobj->radius); + WRITEFIXED(save->p, mobj->radius); if (diff & MD_HEIGHT) - WRITEFIXED(save_p, mobj->height); + WRITEFIXED(save->p, mobj->height); if (diff & MD_FLAGS) - WRITEUINT32(save_p, mobj->flags); + WRITEUINT32(save->p, mobj->flags); if (diff & MD_FLAGS2) - WRITEUINT32(save_p, mobj->flags2); + WRITEUINT32(save->p, mobj->flags2); if (diff & MD_HEALTH) - WRITEINT32(save_p, mobj->health); + WRITEINT32(save->p, mobj->health); if (diff & MD_RTIME) - WRITEINT32(save_p, mobj->reactiontime); + WRITEINT32(save->p, mobj->reactiontime); if (diff & MD_STATE) - WRITEUINT16(save_p, mobj->state-states); + WRITEUINT16(save->p, mobj->state-states); if (diff & MD_TICS) - WRITEINT32(save_p, mobj->tics); + WRITEINT32(save->p, mobj->tics); if (diff & MD_SPRITE) { - WRITEUINT16(save_p, mobj->sprite); + WRITEUINT16(save->p, mobj->sprite); if (mobj->sprite == SPR_PLAY) - WRITEUINT8(save_p, mobj->sprite2); + WRITEUINT8(save->p, mobj->sprite2); } if (diff & MD_FRAME) { - WRITEUINT32(save_p, mobj->frame); - WRITEUINT16(save_p, mobj->anim_duration); + WRITEUINT32(save->p, mobj->frame); + WRITEUINT16(save->p, mobj->anim_duration); } if (diff & MD_EFLAGS) - WRITEUINT16(save_p, mobj->eflags); + WRITEUINT16(save->p, mobj->eflags); if (diff & MD_PLAYER) - WRITEUINT8(save_p, mobj->player-players); + WRITEUINT8(save->p, mobj->player-players); if (diff & MD_MOVEDIR) - WRITEANGLE(save_p, mobj->movedir); + WRITEANGLE(save->p, mobj->movedir); if (diff & MD_MOVECOUNT) - WRITEINT32(save_p, mobj->movecount); + WRITEINT32(save->p, mobj->movecount); if (diff & MD_THRESHOLD) - WRITEINT32(save_p, mobj->threshold); + WRITEINT32(save->p, mobj->threshold); if (diff & MD_LASTLOOK) - WRITEINT32(save_p, mobj->lastlook); + WRITEINT32(save->p, mobj->lastlook); if (diff & MD_TARGET) - WRITEUINT32(save_p, mobj->target->mobjnum); + WRITEUINT32(save->p, mobj->target->mobjnum); if (diff & MD_TRACER) - WRITEUINT32(save_p, mobj->tracer->mobjnum); + WRITEUINT32(save->p, mobj->tracer->mobjnum); if (diff & MD_FRICTION) - WRITEFIXED(save_p, mobj->friction); + WRITEFIXED(save->p, mobj->friction); if (diff & MD_MOVEFACTOR) - WRITEFIXED(save_p, mobj->movefactor); + WRITEFIXED(save->p, mobj->movefactor); if (diff & MD_FUSE) - WRITEINT32(save_p, mobj->fuse); + WRITEINT32(save->p, mobj->fuse); if (diff & MD_WATERTOP) - WRITEFIXED(save_p, mobj->watertop); + WRITEFIXED(save->p, mobj->watertop); if (diff & MD_WATERBOTTOM) - WRITEFIXED(save_p, mobj->waterbottom); + WRITEFIXED(save->p, mobj->waterbottom); if (diff & MD_SCALE) - WRITEFIXED(save_p, mobj->scale); + WRITEFIXED(save->p, mobj->scale); if (diff & MD_DSCALE) - WRITEFIXED(save_p, mobj->destscale); + WRITEFIXED(save->p, mobj->destscale); if (diff2 & MD2_SCALESPEED) - WRITEFIXED(save_p, mobj->scalespeed); + WRITEFIXED(save->p, mobj->scalespeed); if (diff2 & MD2_CUSVAL) - WRITEINT32(save_p, mobj->cusval); + WRITEINT32(save->p, mobj->cusval); if (diff2 & MD2_CVMEM) - WRITEINT32(save_p, mobj->cvmem); + WRITEINT32(save->p, mobj->cvmem); if (diff2 & MD2_SKIN) - WRITEUINT8(save_p, (UINT8)((skin_t *)mobj->skin - skins)); + WRITEUINT8(save->p, (UINT8)((skin_t *)mobj->skin - skins)); if (diff2 & MD2_COLOR) - WRITEUINT16(save_p, mobj->color); + WRITEUINT16(save->p, mobj->color); if (diff2 & MD2_EXTVAL1) - WRITEINT32(save_p, mobj->extravalue1); + WRITEINT32(save->p, mobj->extravalue1); if (diff2 & MD2_EXTVAL2) - WRITEINT32(save_p, mobj->extravalue2); + WRITEINT32(save->p, mobj->extravalue2); if (diff2 & MD2_HNEXT) - WRITEUINT32(save_p, mobj->hnext->mobjnum); + WRITEUINT32(save->p, mobj->hnext->mobjnum); if (diff2 & MD2_HPREV) - WRITEUINT32(save_p, mobj->hprev->mobjnum); + WRITEUINT32(save->p, mobj->hprev->mobjnum); if (diff2 & MD2_ITNEXT) - WRITEUINT32(save_p, mobj->itnext->mobjnum); + WRITEUINT32(save->p, mobj->itnext->mobjnum); if (diff2 & MD2_SLOPE) - WRITEUINT16(save_p, mobj->standingslope->id); + WRITEUINT16(save->p, mobj->standingslope->id); if (diff2 & MD2_COLORIZED) - WRITEUINT8(save_p, mobj->colorized); + WRITEUINT8(save->p, mobj->colorized); if (diff2 & MD2_MIRRORED) - WRITEUINT8(save_p, mobj->mirrored); + WRITEUINT8(save->p, mobj->mirrored); if (diff2 & MD2_ROLLANGLE) - WRITEANGLE(save_p, mobj->rollangle); + WRITEANGLE(save->p, mobj->rollangle); if (diff2 & MD2_SHADOWSCALE) { - WRITEFIXED(save_p, mobj->shadowscale); - WRITEUINT8(save_p, mobj->whiteshadow); + WRITEFIXED(save->p, mobj->shadowscale); + WRITEUINT8(save->p, mobj->whiteshadow); } if (diff2 & MD2_RENDERFLAGS) { @@ -2259,553 +2258,553 @@ static void SaveMobjThinker(const thinker_t *th, const UINT8 type) && q != (RF_DONTDRAWP4|RF_DONTDRAWP2|RF_DONTDRAWP3)) rf &= ~q; - WRITEUINT32(save_p, rf); + WRITEUINT32(save->p, rf); } if (diff2 & MD2_SPRITEXSCALE) - WRITEFIXED(save_p, mobj->spritexscale); + WRITEFIXED(save->p, mobj->spritexscale); if (diff2 & MD2_SPRITEYSCALE) - WRITEFIXED(save_p, mobj->spriteyscale); + WRITEFIXED(save->p, mobj->spriteyscale); if (diff2 & MD2_SPRITEXOFFSET) - WRITEFIXED(save_p, mobj->spritexoffset); + WRITEFIXED(save->p, mobj->spritexoffset); if (diff2 & MD2_SPRITEYOFFSET) - WRITEFIXED(save_p, mobj->spriteyoffset); + WRITEFIXED(save->p, mobj->spriteyoffset); if (diff2 & MD2_FLOORSPRITESLOPE) { pslope_t *slope = mobj->floorspriteslope; - WRITEFIXED(save_p, slope->zdelta); - WRITEANGLE(save_p, slope->zangle); - WRITEANGLE(save_p, slope->xydirection); + WRITEFIXED(save->p, slope->zdelta); + WRITEANGLE(save->p, slope->zangle); + WRITEANGLE(save->p, slope->xydirection); - WRITEFIXED(save_p, slope->o.x); - WRITEFIXED(save_p, slope->o.y); - WRITEFIXED(save_p, slope->o.z); + WRITEFIXED(save->p, slope->o.x); + WRITEFIXED(save->p, slope->o.y); + WRITEFIXED(save->p, slope->o.z); - WRITEFIXED(save_p, slope->d.x); - WRITEFIXED(save_p, slope->d.y); + WRITEFIXED(save->p, slope->d.x); + WRITEFIXED(save->p, slope->d.y); - WRITEFIXED(save_p, slope->normal.x); - WRITEFIXED(save_p, slope->normal.y); - WRITEFIXED(save_p, slope->normal.z); + WRITEFIXED(save->p, slope->normal.x); + WRITEFIXED(save->p, slope->normal.y); + WRITEFIXED(save->p, slope->normal.z); } if (diff2 & MD2_HITLAG) { - WRITEINT32(save_p, mobj->hitlag); + WRITEINT32(save->p, mobj->hitlag); } if (diff2 & MD2_WATERSKIP) { - WRITEUINT8(save_p, mobj->waterskip); + WRITEUINT8(save->p, mobj->waterskip); } if (diff2 & MD2_DISPOFFSET) { - WRITEINT32(save_p, mobj->dispoffset); + WRITEINT32(save->p, mobj->dispoffset); } if (diff2 & MD2_LASTMOMZ) { - WRITEINT32(save_p, mobj->lastmomz); + WRITEINT32(save->p, mobj->lastmomz); } if (diff2 & MD2_TERRAIN) { - WRITEUINT32(save_p, K_GetTerrainHeapIndex(mobj->terrain)); - WRITEUINT32(save_p, SaveMobjnum(mobj->terrainOverlay)); + WRITEUINT32(save->p, K_GetTerrainHeapIndex(mobj->terrain)); + WRITEUINT32(save->p, SaveMobjnum(mobj->terrainOverlay)); } - WRITEUINT32(save_p, mobj->mobjnum); + WRITEUINT32(save->p, mobj->mobjnum); } -static void SaveNoEnemiesThinker(const thinker_t *th, const UINT8 type) +static void SaveNoEnemiesThinker(savebuffer_t *save, const thinker_t *th, const UINT8 type) { const noenemies_t *ht = (const void *)th; - WRITEUINT8(save_p, type); - WRITEUINT32(save_p, SaveLine(ht->sourceline)); + WRITEUINT8(save->p, type); + WRITEUINT32(save->p, SaveLine(ht->sourceline)); } -static void SaveBounceCheeseThinker(const thinker_t *th, const UINT8 type) +static void SaveBounceCheeseThinker(savebuffer_t *save, const thinker_t *th, const UINT8 type) { const bouncecheese_t *ht = (const void *)th; - WRITEUINT8(save_p, type); - WRITEUINT32(save_p, SaveLine(ht->sourceline)); - WRITEUINT32(save_p, SaveSector(ht->sector)); - WRITEFIXED(save_p, ht->speed); - WRITEFIXED(save_p, ht->distance); - WRITEFIXED(save_p, ht->floorwasheight); - WRITEFIXED(save_p, ht->ceilingwasheight); - WRITECHAR(save_p, ht->low); + WRITEUINT8(save->p, type); + WRITEUINT32(save->p, SaveLine(ht->sourceline)); + WRITEUINT32(save->p, SaveSector(ht->sector)); + WRITEFIXED(save->p, ht->speed); + WRITEFIXED(save->p, ht->distance); + WRITEFIXED(save->p, ht->floorwasheight); + WRITEFIXED(save->p, ht->ceilingwasheight); + WRITECHAR(save->p, ht->low); } -static void SaveContinuousFallThinker(const thinker_t *th, const UINT8 type) +static void SaveContinuousFallThinker(savebuffer_t *save, const thinker_t *th, const UINT8 type) { const continuousfall_t *ht = (const void *)th; - WRITEUINT8(save_p, type); - WRITEUINT32(save_p, SaveSector(ht->sector)); - WRITEFIXED(save_p, ht->speed); - WRITEINT32(save_p, ht->direction); - WRITEFIXED(save_p, ht->floorstartheight); - WRITEFIXED(save_p, ht->ceilingstartheight); - WRITEFIXED(save_p, ht->destheight); + WRITEUINT8(save->p, type); + WRITEUINT32(save->p, SaveSector(ht->sector)); + WRITEFIXED(save->p, ht->speed); + WRITEINT32(save->p, ht->direction); + WRITEFIXED(save->p, ht->floorstartheight); + WRITEFIXED(save->p, ht->ceilingstartheight); + WRITEFIXED(save->p, ht->destheight); } -static void SaveMarioBlockThinker(const thinker_t *th, const UINT8 type) +static void SaveMarioBlockThinker(savebuffer_t *save, const thinker_t *th, const UINT8 type) { const mariothink_t *ht = (const void *)th; - WRITEUINT8(save_p, type); - WRITEUINT32(save_p, SaveSector(ht->sector)); - WRITEFIXED(save_p, ht->speed); - WRITEINT32(save_p, ht->direction); - WRITEFIXED(save_p, ht->floorstartheight); - WRITEFIXED(save_p, ht->ceilingstartheight); - WRITEINT16(save_p, ht->tag); + WRITEUINT8(save->p, type); + WRITEUINT32(save->p, SaveSector(ht->sector)); + WRITEFIXED(save->p, ht->speed); + WRITEINT32(save->p, ht->direction); + WRITEFIXED(save->p, ht->floorstartheight); + WRITEFIXED(save->p, ht->ceilingstartheight); + WRITEINT16(save->p, ht->tag); } -static void SaveMarioCheckThinker(const thinker_t *th, const UINT8 type) +static void SaveMarioCheckThinker(savebuffer_t *save, const thinker_t *th, const UINT8 type) { const mariocheck_t *ht = (const void *)th; - WRITEUINT8(save_p, type); - WRITEUINT32(save_p, SaveLine(ht->sourceline)); - WRITEUINT32(save_p, SaveSector(ht->sector)); + WRITEUINT8(save->p, type); + WRITEUINT32(save->p, SaveLine(ht->sourceline)); + WRITEUINT32(save->p, SaveSector(ht->sector)); } -static void SaveThwompThinker(const thinker_t *th, const UINT8 type) +static void SaveThwompThinker(savebuffer_t *save, const thinker_t *th, const UINT8 type) { const thwomp_t *ht = (const void *)th; - WRITEUINT8(save_p, type); - WRITEUINT32(save_p, SaveLine(ht->sourceline)); - WRITEUINT32(save_p, SaveSector(ht->sector)); - WRITEFIXED(save_p, ht->crushspeed); - WRITEFIXED(save_p, ht->retractspeed); - WRITEINT32(save_p, ht->direction); - WRITEFIXED(save_p, ht->floorstartheight); - WRITEFIXED(save_p, ht->ceilingstartheight); - WRITEINT32(save_p, ht->delay); - WRITEINT16(save_p, ht->tag); - WRITEUINT16(save_p, ht->sound); - WRITEINT32(save_p, ht->initDelay); + WRITEUINT8(save->p, type); + WRITEUINT32(save->p, SaveLine(ht->sourceline)); + WRITEUINT32(save->p, SaveSector(ht->sector)); + WRITEFIXED(save->p, ht->crushspeed); + WRITEFIXED(save->p, ht->retractspeed); + WRITEINT32(save->p, ht->direction); + WRITEFIXED(save->p, ht->floorstartheight); + WRITEFIXED(save->p, ht->ceilingstartheight); + WRITEINT32(save->p, ht->delay); + WRITEINT16(save->p, ht->tag); + WRITEUINT16(save->p, ht->sound); + WRITEINT32(save->p, ht->initDelay); } -static void SaveFloatThinker(const thinker_t *th, const UINT8 type) +static void SaveFloatThinker(savebuffer_t *save, const thinker_t *th, const UINT8 type) { const floatthink_t *ht = (const void *)th; - WRITEUINT8(save_p, type); - WRITEUINT32(save_p, SaveLine(ht->sourceline)); - WRITEUINT32(save_p, SaveSector(ht->sector)); - WRITEINT16(save_p, ht->tag); + WRITEUINT8(save->p, type); + WRITEUINT32(save->p, SaveLine(ht->sourceline)); + WRITEUINT32(save->p, SaveSector(ht->sector)); + WRITEINT16(save->p, ht->tag); } -static void SaveEachTimeThinker(const thinker_t *th, const UINT8 type) +static void SaveEachTimeThinker(savebuffer_t *save, const thinker_t *th, const UINT8 type) { const eachtime_t *ht = (const void *)th; size_t i; - WRITEUINT8(save_p, type); - WRITEUINT32(save_p, SaveLine(ht->sourceline)); + WRITEUINT8(save->p, type); + WRITEUINT32(save->p, SaveLine(ht->sourceline)); for (i = 0; i < MAXPLAYERS; i++) { - WRITECHAR(save_p, ht->playersInArea[i]); + WRITECHAR(save->p, ht->playersInArea[i]); } - WRITECHAR(save_p, ht->triggerOnExit); + WRITECHAR(save->p, ht->triggerOnExit); } -static void SaveRaiseThinker(const thinker_t *th, const UINT8 type) +static void SaveRaiseThinker(savebuffer_t *save, const thinker_t *th, const UINT8 type) { const raise_t *ht = (const void *)th; - WRITEUINT8(save_p, type); - WRITEINT16(save_p, ht->tag); - WRITEUINT32(save_p, SaveSector(ht->sector)); - WRITEFIXED(save_p, ht->ceilingbottom); - WRITEFIXED(save_p, ht->ceilingtop); - WRITEFIXED(save_p, ht->basespeed); - WRITEFIXED(save_p, ht->extraspeed); - WRITEUINT8(save_p, ht->shaketimer); - WRITEUINT8(save_p, ht->flags); + WRITEUINT8(save->p, type); + WRITEINT16(save->p, ht->tag); + WRITEUINT32(save->p, SaveSector(ht->sector)); + WRITEFIXED(save->p, ht->ceilingbottom); + WRITEFIXED(save->p, ht->ceilingtop); + WRITEFIXED(save->p, ht->basespeed); + WRITEFIXED(save->p, ht->extraspeed); + WRITEUINT8(save->p, ht->shaketimer); + WRITEUINT8(save->p, ht->flags); } -static void SaveCeilingThinker(const thinker_t *th, const UINT8 type) +static void SaveCeilingThinker(savebuffer_t *save, const thinker_t *th, const UINT8 type) { const ceiling_t *ht = (const void *)th; - WRITEUINT8(save_p, type); - WRITEUINT8(save_p, ht->type); - WRITEUINT32(save_p, SaveSector(ht->sector)); - WRITEFIXED(save_p, ht->bottomheight); - WRITEFIXED(save_p, ht->topheight); - WRITEFIXED(save_p, ht->speed); - WRITEFIXED(save_p, ht->delay); - WRITEFIXED(save_p, ht->delaytimer); - WRITEUINT8(save_p, ht->crush); - WRITEINT32(save_p, ht->texture); - WRITEINT32(save_p, ht->direction); - WRITEINT16(save_p, ht->tag); - WRITEFIXED(save_p, ht->origspeed); - WRITEFIXED(save_p, ht->sourceline); + WRITEUINT8(save->p, type); + WRITEUINT8(save->p, ht->type); + WRITEUINT32(save->p, SaveSector(ht->sector)); + WRITEFIXED(save->p, ht->bottomheight); + WRITEFIXED(save->p, ht->topheight); + WRITEFIXED(save->p, ht->speed); + WRITEFIXED(save->p, ht->delay); + WRITEFIXED(save->p, ht->delaytimer); + WRITEUINT8(save->p, ht->crush); + WRITEINT32(save->p, ht->texture); + WRITEINT32(save->p, ht->direction); + WRITEINT16(save->p, ht->tag); + WRITEFIXED(save->p, ht->origspeed); + WRITEFIXED(save->p, ht->sourceline); } -static void SaveFloormoveThinker(const thinker_t *th, const UINT8 type) +static void SaveFloormoveThinker(savebuffer_t *save, const thinker_t *th, const UINT8 type) { const floormove_t *ht = (const void *)th; - WRITEUINT8(save_p, type); - WRITEUINT8(save_p, ht->type); - WRITEUINT8(save_p, ht->crush); - WRITEUINT32(save_p, SaveSector(ht->sector)); - WRITEINT32(save_p, ht->direction); - WRITEINT32(save_p, ht->texture); - WRITEFIXED(save_p, ht->floordestheight); - WRITEFIXED(save_p, ht->speed); - WRITEFIXED(save_p, ht->origspeed); - WRITEFIXED(save_p, ht->delay); - WRITEFIXED(save_p, ht->delaytimer); - WRITEINT16(save_p, ht->tag); - WRITEFIXED(save_p, ht->sourceline); + WRITEUINT8(save->p, type); + WRITEUINT8(save->p, ht->type); + WRITEUINT8(save->p, ht->crush); + WRITEUINT32(save->p, SaveSector(ht->sector)); + WRITEINT32(save->p, ht->direction); + WRITEINT32(save->p, ht->texture); + WRITEFIXED(save->p, ht->floordestheight); + WRITEFIXED(save->p, ht->speed); + WRITEFIXED(save->p, ht->origspeed); + WRITEFIXED(save->p, ht->delay); + WRITEFIXED(save->p, ht->delaytimer); + WRITEINT16(save->p, ht->tag); + WRITEFIXED(save->p, ht->sourceline); } -static void SaveLightflashThinker(const thinker_t *th, const UINT8 type) +static void SaveLightflashThinker(savebuffer_t *save, const thinker_t *th, const UINT8 type) { const lightflash_t *ht = (const void *)th; - WRITEUINT8(save_p, type); - WRITEUINT32(save_p, SaveSector(ht->sector)); - WRITEINT32(save_p, ht->maxlight); - WRITEINT32(save_p, ht->minlight); + WRITEUINT8(save->p, type); + WRITEUINT32(save->p, SaveSector(ht->sector)); + WRITEINT32(save->p, ht->maxlight); + WRITEINT32(save->p, ht->minlight); } -static void SaveStrobeThinker(const thinker_t *th, const UINT8 type) +static void SaveStrobeThinker(savebuffer_t *save, const thinker_t *th, const UINT8 type) { const strobe_t *ht = (const void *)th; - WRITEUINT8(save_p, type); - WRITEUINT32(save_p, SaveSector(ht->sector)); - WRITEINT32(save_p, ht->count); - WRITEINT16(save_p, ht->minlight); - WRITEINT16(save_p, ht->maxlight); - WRITEINT32(save_p, ht->darktime); - WRITEINT32(save_p, ht->brighttime); + WRITEUINT8(save->p, type); + WRITEUINT32(save->p, SaveSector(ht->sector)); + WRITEINT32(save->p, ht->count); + WRITEINT16(save->p, ht->minlight); + WRITEINT16(save->p, ht->maxlight); + WRITEINT32(save->p, ht->darktime); + WRITEINT32(save->p, ht->brighttime); } -static void SaveGlowThinker(const thinker_t *th, const UINT8 type) +static void SaveGlowThinker(savebuffer_t *save, const thinker_t *th, const UINT8 type) { const glow_t *ht = (const void *)th; - WRITEUINT8(save_p, type); - WRITEUINT32(save_p, SaveSector(ht->sector)); - WRITEINT16(save_p, ht->minlight); - WRITEINT16(save_p, ht->maxlight); - WRITEINT16(save_p, ht->direction); - WRITEINT16(save_p, ht->speed); + WRITEUINT8(save->p, type); + WRITEUINT32(save->p, SaveSector(ht->sector)); + WRITEINT16(save->p, ht->minlight); + WRITEINT16(save->p, ht->maxlight); + WRITEINT16(save->p, ht->direction); + WRITEINT16(save->p, ht->speed); } -static inline void SaveFireflickerThinker(const thinker_t *th, const UINT8 type) +static inline void SaveFireflickerThinker(savebuffer_t *save, const thinker_t *th, const UINT8 type) { const fireflicker_t *ht = (const void *)th; - WRITEUINT8(save_p, type); - WRITEUINT32(save_p, SaveSector(ht->sector)); - WRITEINT32(save_p, ht->count); - WRITEINT32(save_p, ht->resetcount); - WRITEINT16(save_p, ht->maxlight); - WRITEINT16(save_p, ht->minlight); + WRITEUINT8(save->p, type); + WRITEUINT32(save->p, SaveSector(ht->sector)); + WRITEINT32(save->p, ht->count); + WRITEINT32(save->p, ht->resetcount); + WRITEINT16(save->p, ht->maxlight); + WRITEINT16(save->p, ht->minlight); } -static void SaveElevatorThinker(const thinker_t *th, const UINT8 type) +static void SaveElevatorThinker(savebuffer_t *save, const thinker_t *th, const UINT8 type) { const elevator_t *ht = (const void *)th; - WRITEUINT8(save_p, type); - WRITEUINT8(save_p, ht->type); - WRITEUINT32(save_p, SaveSector(ht->sector)); - WRITEUINT32(save_p, SaveSector(ht->actionsector)); - WRITEINT32(save_p, ht->direction); - WRITEFIXED(save_p, ht->floordestheight); - WRITEFIXED(save_p, ht->ceilingdestheight); - WRITEFIXED(save_p, ht->speed); - WRITEFIXED(save_p, ht->origspeed); - WRITEFIXED(save_p, ht->low); - WRITEFIXED(save_p, ht->high); - WRITEFIXED(save_p, ht->distance); - WRITEFIXED(save_p, ht->delay); - WRITEFIXED(save_p, ht->delaytimer); - WRITEFIXED(save_p, ht->floorwasheight); - WRITEFIXED(save_p, ht->ceilingwasheight); - WRITEUINT32(save_p, SaveLine(ht->sourceline)); + WRITEUINT8(save->p, type); + WRITEUINT8(save->p, ht->type); + WRITEUINT32(save->p, SaveSector(ht->sector)); + WRITEUINT32(save->p, SaveSector(ht->actionsector)); + WRITEINT32(save->p, ht->direction); + WRITEFIXED(save->p, ht->floordestheight); + WRITEFIXED(save->p, ht->ceilingdestheight); + WRITEFIXED(save->p, ht->speed); + WRITEFIXED(save->p, ht->origspeed); + WRITEFIXED(save->p, ht->low); + WRITEFIXED(save->p, ht->high); + WRITEFIXED(save->p, ht->distance); + WRITEFIXED(save->p, ht->delay); + WRITEFIXED(save->p, ht->delaytimer); + WRITEFIXED(save->p, ht->floorwasheight); + WRITEFIXED(save->p, ht->ceilingwasheight); + WRITEUINT32(save->p, SaveLine(ht->sourceline)); } -static void SaveCrumbleThinker(const thinker_t *th, const UINT8 type) +static void SaveCrumbleThinker(savebuffer_t *save, const thinker_t *th, const UINT8 type) { const crumble_t *ht = (const void *)th; - WRITEUINT8(save_p, type); - WRITEUINT32(save_p, SaveLine(ht->sourceline)); - WRITEUINT32(save_p, SaveSector(ht->sector)); - WRITEUINT32(save_p, SaveSector(ht->actionsector)); - WRITEUINT32(save_p, SavePlayer(ht->player)); // was dummy - WRITEINT32(save_p, ht->direction); - WRITEINT32(save_p, ht->origalpha); - WRITEINT32(save_p, ht->timer); - WRITEFIXED(save_p, ht->speed); - WRITEFIXED(save_p, ht->floorwasheight); - WRITEFIXED(save_p, ht->ceilingwasheight); - WRITEUINT8(save_p, ht->flags); + WRITEUINT8(save->p, type); + WRITEUINT32(save->p, SaveLine(ht->sourceline)); + WRITEUINT32(save->p, SaveSector(ht->sector)); + WRITEUINT32(save->p, SaveSector(ht->actionsector)); + WRITEUINT32(save->p, SavePlayer(ht->player)); // was dummy + WRITEINT32(save->p, ht->direction); + WRITEINT32(save->p, ht->origalpha); + WRITEINT32(save->p, ht->timer); + WRITEFIXED(save->p, ht->speed); + WRITEFIXED(save->p, ht->floorwasheight); + WRITEFIXED(save->p, ht->ceilingwasheight); + WRITEUINT8(save->p, ht->flags); } -static inline void SaveScrollThinker(const thinker_t *th, const UINT8 type) +static inline void SaveScrollThinker(savebuffer_t *save, const thinker_t *th, const UINT8 type) { const scroll_t *ht = (const void *)th; - WRITEUINT8(save_p, type); - WRITEFIXED(save_p, ht->dx); - WRITEFIXED(save_p, ht->dy); - WRITEINT32(save_p, ht->affectee); - WRITEINT32(save_p, ht->control); - WRITEFIXED(save_p, ht->last_height); - WRITEFIXED(save_p, ht->vdx); - WRITEFIXED(save_p, ht->vdy); - WRITEINT32(save_p, ht->accel); - WRITEINT32(save_p, ht->exclusive); - WRITEUINT8(save_p, ht->type); + WRITEUINT8(save->p, type); + WRITEFIXED(save->p, ht->dx); + WRITEFIXED(save->p, ht->dy); + WRITEINT32(save->p, ht->affectee); + WRITEINT32(save->p, ht->control); + WRITEFIXED(save->p, ht->last_height); + WRITEFIXED(save->p, ht->vdx); + WRITEFIXED(save->p, ht->vdy); + WRITEINT32(save->p, ht->accel); + WRITEINT32(save->p, ht->exclusive); + WRITEUINT8(save->p, ht->type); } -static inline void SaveFrictionThinker(const thinker_t *th, const UINT8 type) +static inline void SaveFrictionThinker(savebuffer_t *save, const thinker_t *th, const UINT8 type) { const friction_t *ht = (const void *)th; - WRITEUINT8(save_p, type); - WRITEINT32(save_p, ht->friction); - WRITEINT32(save_p, ht->movefactor); - WRITEINT32(save_p, ht->affectee); - WRITEINT32(save_p, ht->referrer); - WRITEUINT8(save_p, ht->roverfriction); + WRITEUINT8(save->p, type); + WRITEINT32(save->p, ht->friction); + WRITEINT32(save->p, ht->movefactor); + WRITEINT32(save->p, ht->affectee); + WRITEINT32(save->p, ht->referrer); + WRITEUINT8(save->p, ht->roverfriction); } -static inline void SavePusherThinker(const thinker_t *th, const UINT8 type) +static inline void SavePusherThinker(savebuffer_t *save, const thinker_t *th, const UINT8 type) { const pusher_t *ht = (const void *)th; - WRITEUINT8(save_p, type); - WRITEUINT8(save_p, ht->type); - WRITEFIXED(save_p, ht->x_mag); - WRITEFIXED(save_p, ht->y_mag); - WRITEFIXED(save_p, ht->z_mag); - WRITEINT32(save_p, ht->affectee); - WRITEUINT8(save_p, ht->roverpusher); - WRITEINT32(save_p, ht->referrer); - WRITEINT32(save_p, ht->exclusive); - WRITEINT32(save_p, ht->slider); + WRITEUINT8(save->p, type); + WRITEUINT8(save->p, ht->type); + WRITEFIXED(save->p, ht->x_mag); + WRITEFIXED(save->p, ht->y_mag); + WRITEFIXED(save->p, ht->z_mag); + WRITEINT32(save->p, ht->affectee); + WRITEUINT8(save->p, ht->roverpusher); + WRITEINT32(save->p, ht->referrer); + WRITEINT32(save->p, ht->exclusive); + WRITEINT32(save->p, ht->slider); } -static void SaveLaserThinker(const thinker_t *th, const UINT8 type) +static void SaveLaserThinker(savebuffer_t *save, const thinker_t *th, const UINT8 type) { const laserthink_t *ht = (const void *)th; - WRITEUINT8(save_p, type); - WRITEINT16(save_p, ht->tag); - WRITEUINT32(save_p, SaveLine(ht->sourceline)); - WRITEUINT8(save_p, ht->nobosses); + WRITEUINT8(save->p, type); + WRITEINT16(save->p, ht->tag); + WRITEUINT32(save->p, SaveLine(ht->sourceline)); + WRITEUINT8(save->p, ht->nobosses); } -static void SaveLightlevelThinker(const thinker_t *th, const UINT8 type) +static void SaveLightlevelThinker(savebuffer_t *save, const thinker_t *th, const UINT8 type) { const lightlevel_t *ht = (const void *)th; - WRITEUINT8(save_p, type); - WRITEUINT32(save_p, SaveSector(ht->sector)); - WRITEINT16(save_p, ht->sourcelevel); - WRITEINT16(save_p, ht->destlevel); - WRITEFIXED(save_p, ht->fixedcurlevel); - WRITEFIXED(save_p, ht->fixedpertic); - WRITEINT32(save_p, ht->timer); + WRITEUINT8(save->p, type); + WRITEUINT32(save->p, SaveSector(ht->sector)); + WRITEINT16(save->p, ht->sourcelevel); + WRITEINT16(save->p, ht->destlevel); + WRITEFIXED(save->p, ht->fixedcurlevel); + WRITEFIXED(save->p, ht->fixedpertic); + WRITEINT32(save->p, ht->timer); } -static void SaveExecutorThinker(const thinker_t *th, const UINT8 type) +static void SaveExecutorThinker(savebuffer_t *save, const thinker_t *th, const UINT8 type) { const executor_t *ht = (const void *)th; - WRITEUINT8(save_p, type); - WRITEUINT32(save_p, SaveLine(ht->line)); - WRITEUINT32(save_p, SaveMobjnum(ht->caller)); - WRITEUINT32(save_p, SaveSector(ht->sector)); - WRITEINT32(save_p, ht->timer); + WRITEUINT8(save->p, type); + WRITEUINT32(save->p, SaveLine(ht->line)); + WRITEUINT32(save->p, SaveMobjnum(ht->caller)); + WRITEUINT32(save->p, SaveSector(ht->sector)); + WRITEINT32(save->p, ht->timer); } -static void SaveDisappearThinker(const thinker_t *th, const UINT8 type) +static void SaveDisappearThinker(savebuffer_t *save, const thinker_t *th, const UINT8 type) { const disappear_t *ht = (const void *)th; - WRITEUINT8(save_p, type); - WRITEUINT32(save_p, ht->appeartime); - WRITEUINT32(save_p, ht->disappeartime); - WRITEUINT32(save_p, ht->offset); - WRITEUINT32(save_p, ht->timer); - WRITEINT32(save_p, ht->affectee); - WRITEINT32(save_p, ht->sourceline); - WRITEINT32(save_p, ht->exists); + WRITEUINT8(save->p, type); + WRITEUINT32(save->p, ht->appeartime); + WRITEUINT32(save->p, ht->disappeartime); + WRITEUINT32(save->p, ht->offset); + WRITEUINT32(save->p, ht->timer); + WRITEINT32(save->p, ht->affectee); + WRITEINT32(save->p, ht->sourceline); + WRITEINT32(save->p, ht->exists); } -static void SaveFadeThinker(const thinker_t *th, const UINT8 type) +static void SaveFadeThinker(savebuffer_t *save, const thinker_t *th, const UINT8 type) { const fade_t *ht = (const void *)th; - WRITEUINT8(save_p, type); - WRITEUINT32(save_p, CheckAddNetColormapToList(ht->dest_exc)); - WRITEUINT32(save_p, ht->sectornum); - WRITEUINT32(save_p, ht->ffloornum); - WRITEINT32(save_p, ht->alpha); - WRITEINT16(save_p, ht->sourcevalue); - WRITEINT16(save_p, ht->destvalue); - WRITEINT16(save_p, ht->destlightlevel); - WRITEINT16(save_p, ht->speed); - WRITEUINT8(save_p, (UINT8)ht->ticbased); - WRITEINT32(save_p, ht->timer); - WRITEUINT8(save_p, ht->doexists); - WRITEUINT8(save_p, ht->dotranslucent); - WRITEUINT8(save_p, ht->dolighting); - WRITEUINT8(save_p, ht->docolormap); - WRITEUINT8(save_p, ht->docollision); - WRITEUINT8(save_p, ht->doghostfade); - WRITEUINT8(save_p, ht->exactalpha); + WRITEUINT8(save->p, type); + WRITEUINT32(save->p, CheckAddNetColormapToList(ht->dest_exc)); + WRITEUINT32(save->p, ht->sectornum); + WRITEUINT32(save->p, ht->ffloornum); + WRITEINT32(save->p, ht->alpha); + WRITEINT16(save->p, ht->sourcevalue); + WRITEINT16(save->p, ht->destvalue); + WRITEINT16(save->p, ht->destlightlevel); + WRITEINT16(save->p, ht->speed); + WRITEUINT8(save->p, (UINT8)ht->ticbased); + WRITEINT32(save->p, ht->timer); + WRITEUINT8(save->p, ht->doexists); + WRITEUINT8(save->p, ht->dotranslucent); + WRITEUINT8(save->p, ht->dolighting); + WRITEUINT8(save->p, ht->docolormap); + WRITEUINT8(save->p, ht->docollision); + WRITEUINT8(save->p, ht->doghostfade); + WRITEUINT8(save->p, ht->exactalpha); } -static void SaveFadeColormapThinker(const thinker_t *th, const UINT8 type) +static void SaveFadeColormapThinker(savebuffer_t *save, const thinker_t *th, const UINT8 type) { const fadecolormap_t *ht = (const void *)th; - WRITEUINT8(save_p, type); - WRITEUINT32(save_p, SaveSector(ht->sector)); - WRITEUINT32(save_p, CheckAddNetColormapToList(ht->source_exc)); - WRITEUINT32(save_p, CheckAddNetColormapToList(ht->dest_exc)); - WRITEUINT8(save_p, (UINT8)ht->ticbased); - WRITEINT32(save_p, ht->duration); - WRITEINT32(save_p, ht->timer); + WRITEUINT8(save->p, type); + WRITEUINT32(save->p, SaveSector(ht->sector)); + WRITEUINT32(save->p, CheckAddNetColormapToList(ht->source_exc)); + WRITEUINT32(save->p, CheckAddNetColormapToList(ht->dest_exc)); + WRITEUINT8(save->p, (UINT8)ht->ticbased); + WRITEINT32(save->p, ht->duration); + WRITEINT32(save->p, ht->timer); } -static void SavePlaneDisplaceThinker(const thinker_t *th, const UINT8 type) +static void SavePlaneDisplaceThinker(savebuffer_t *save, const thinker_t *th, const UINT8 type) { const planedisplace_t *ht = (const void *)th; - WRITEUINT8(save_p, type); - WRITEINT32(save_p, ht->affectee); - WRITEINT32(save_p, ht->control); - WRITEFIXED(save_p, ht->last_height); - WRITEFIXED(save_p, ht->speed); - WRITEUINT8(save_p, ht->type); + WRITEUINT8(save->p, type); + WRITEINT32(save->p, ht->affectee); + WRITEINT32(save->p, ht->control); + WRITEFIXED(save->p, ht->last_height); + WRITEFIXED(save->p, ht->speed); + WRITEUINT8(save->p, ht->type); } -static inline void SaveDynamicLineSlopeThinker(const thinker_t *th, const UINT8 type) +static inline void SaveDynamicLineSlopeThinker(savebuffer_t *save, const thinker_t *th, const UINT8 type) { const dynlineplanethink_t* ht = (const void*)th; - WRITEUINT8(save_p, type); - WRITEUINT8(save_p, ht->type); - WRITEUINT32(save_p, SaveSlope(ht->slope)); - WRITEUINT32(save_p, SaveLine(ht->sourceline)); - WRITEFIXED(save_p, ht->extent); + WRITEUINT8(save->p, type); + WRITEUINT8(save->p, ht->type); + WRITEUINT32(save->p, SaveSlope(ht->slope)); + WRITEUINT32(save->p, SaveLine(ht->sourceline)); + WRITEFIXED(save->p, ht->extent); } -static inline void SaveDynamicVertexSlopeThinker(const thinker_t *th, const UINT8 type) +static inline void SaveDynamicVertexSlopeThinker(savebuffer_t *save, const thinker_t *th, const UINT8 type) { size_t i; const dynvertexplanethink_t* ht = (const void*)th; - WRITEUINT8(save_p, type); - WRITEUINT32(save_p, SaveSlope(ht->slope)); + WRITEUINT8(save->p, type); + WRITEUINT32(save->p, SaveSlope(ht->slope)); for (i = 0; i < 3; i++) - WRITEUINT32(save_p, SaveSector(ht->secs[i])); - WRITEMEM(save_p, ht->vex, sizeof(ht->vex)); - WRITEMEM(save_p, ht->origsecheights, sizeof(ht->origsecheights)); - WRITEMEM(save_p, ht->origvecheights, sizeof(ht->origvecheights)); - WRITEUINT8(save_p, ht->relative); + WRITEUINT32(save->p, SaveSector(ht->secs[i])); + WRITEMEM(save->p, ht->vex, sizeof(ht->vex)); + WRITEMEM(save->p, ht->origsecheights, sizeof(ht->origsecheights)); + WRITEMEM(save->p, ht->origvecheights, sizeof(ht->origvecheights)); + WRITEUINT8(save->p, ht->relative); } -static inline void SavePolyrotatetThinker(const thinker_t *th, const UINT8 type) +static inline void SavePolyrotatetThinker(savebuffer_t *save, const thinker_t *th, const UINT8 type) { const polyrotate_t *ht = (const void *)th; - WRITEUINT8(save_p, type); - WRITEINT32(save_p, ht->polyObjNum); - WRITEINT32(save_p, ht->speed); - WRITEINT32(save_p, ht->distance); - WRITEUINT8(save_p, ht->turnobjs); + WRITEUINT8(save->p, type); + WRITEINT32(save->p, ht->polyObjNum); + WRITEINT32(save->p, ht->speed); + WRITEINT32(save->p, ht->distance); + WRITEUINT8(save->p, ht->turnobjs); } -static void SavePolymoveThinker(const thinker_t *th, const UINT8 type) +static void SavePolymoveThinker(savebuffer_t *save, const thinker_t *th, const UINT8 type) { const polymove_t *ht = (const void *)th; - WRITEUINT8(save_p, type); - WRITEINT32(save_p, ht->polyObjNum); - WRITEINT32(save_p, ht->speed); - WRITEFIXED(save_p, ht->momx); - WRITEFIXED(save_p, ht->momy); - WRITEINT32(save_p, ht->distance); - WRITEANGLE(save_p, ht->angle); + WRITEUINT8(save->p, type); + WRITEINT32(save->p, ht->polyObjNum); + WRITEINT32(save->p, ht->speed); + WRITEFIXED(save->p, ht->momx); + WRITEFIXED(save->p, ht->momy); + WRITEINT32(save->p, ht->distance); + WRITEANGLE(save->p, ht->angle); } -static void SavePolywaypointThinker(const thinker_t *th, UINT8 type) +static void SavePolywaypointThinker(savebuffer_t *save, const thinker_t *th, UINT8 type) { const polywaypoint_t *ht = (const void *)th; - WRITEUINT8(save_p, type); - WRITEINT32(save_p, ht->polyObjNum); - WRITEINT32(save_p, ht->speed); - WRITEINT32(save_p, ht->sequence); - WRITEINT32(save_p, ht->pointnum); - WRITEINT32(save_p, ht->direction); - WRITEUINT8(save_p, ht->returnbehavior); - WRITEUINT8(save_p, ht->continuous); - WRITEUINT8(save_p, ht->stophere); + WRITEUINT8(save->p, type); + WRITEINT32(save->p, ht->polyObjNum); + WRITEINT32(save->p, ht->speed); + WRITEINT32(save->p, ht->sequence); + WRITEINT32(save->p, ht->pointnum); + WRITEINT32(save->p, ht->direction); + WRITEUINT8(save->p, ht->returnbehavior); + WRITEUINT8(save->p, ht->continuous); + WRITEUINT8(save->p, ht->stophere); } -static void SavePolyslidedoorThinker(const thinker_t *th, const UINT8 type) +static void SavePolyslidedoorThinker(savebuffer_t *save, const thinker_t *th, const UINT8 type) { const polyslidedoor_t *ht = (const void *)th; - WRITEUINT8(save_p, type); - WRITEINT32(save_p, ht->polyObjNum); - WRITEINT32(save_p, ht->delay); - WRITEINT32(save_p, ht->delayCount); - WRITEINT32(save_p, ht->initSpeed); - WRITEINT32(save_p, ht->speed); - WRITEINT32(save_p, ht->initDistance); - WRITEINT32(save_p, ht->distance); - WRITEUINT32(save_p, ht->initAngle); - WRITEUINT32(save_p, ht->angle); - WRITEUINT32(save_p, ht->revAngle); - WRITEFIXED(save_p, ht->momx); - WRITEFIXED(save_p, ht->momy); - WRITEUINT8(save_p, ht->closing); + WRITEUINT8(save->p, type); + WRITEINT32(save->p, ht->polyObjNum); + WRITEINT32(save->p, ht->delay); + WRITEINT32(save->p, ht->delayCount); + WRITEINT32(save->p, ht->initSpeed); + WRITEINT32(save->p, ht->speed); + WRITEINT32(save->p, ht->initDistance); + WRITEINT32(save->p, ht->distance); + WRITEUINT32(save->p, ht->initAngle); + WRITEUINT32(save->p, ht->angle); + WRITEUINT32(save->p, ht->revAngle); + WRITEFIXED(save->p, ht->momx); + WRITEFIXED(save->p, ht->momy); + WRITEUINT8(save->p, ht->closing); } -static void SavePolyswingdoorThinker(const thinker_t *th, const UINT8 type) +static void SavePolyswingdoorThinker(savebuffer_t *save, const thinker_t *th, const UINT8 type) { const polyswingdoor_t *ht = (const void *)th; - WRITEUINT8(save_p, type); - WRITEINT32(save_p, ht->polyObjNum); - WRITEINT32(save_p, ht->delay); - WRITEINT32(save_p, ht->delayCount); - WRITEINT32(save_p, ht->initSpeed); - WRITEINT32(save_p, ht->speed); - WRITEINT32(save_p, ht->initDistance); - WRITEINT32(save_p, ht->distance); - WRITEUINT8(save_p, ht->closing); + WRITEUINT8(save->p, type); + WRITEINT32(save->p, ht->polyObjNum); + WRITEINT32(save->p, ht->delay); + WRITEINT32(save->p, ht->delayCount); + WRITEINT32(save->p, ht->initSpeed); + WRITEINT32(save->p, ht->speed); + WRITEINT32(save->p, ht->initDistance); + WRITEINT32(save->p, ht->distance); + WRITEUINT8(save->p, ht->closing); } -static void SavePolydisplaceThinker(const thinker_t *th, const UINT8 type) +static void SavePolydisplaceThinker(savebuffer_t *save, const thinker_t *th, const UINT8 type) { const polydisplace_t *ht = (const void *)th; - WRITEUINT8(save_p, type); - WRITEINT32(save_p, ht->polyObjNum); - WRITEUINT32(save_p, SaveSector(ht->controlSector)); - WRITEFIXED(save_p, ht->dx); - WRITEFIXED(save_p, ht->dy); - WRITEFIXED(save_p, ht->oldHeights); + WRITEUINT8(save->p, type); + WRITEINT32(save->p, ht->polyObjNum); + WRITEUINT32(save->p, SaveSector(ht->controlSector)); + WRITEFIXED(save->p, ht->dx); + WRITEFIXED(save->p, ht->dy); + WRITEFIXED(save->p, ht->oldHeights); } -static void SavePolyrotdisplaceThinker(const thinker_t *th, const UINT8 type) +static void SavePolyrotdisplaceThinker(savebuffer_t *save, const thinker_t *th, const UINT8 type) { const polyrotdisplace_t *ht = (const void *)th; - WRITEUINT8(save_p, type); - WRITEINT32(save_p, ht->polyObjNum); - WRITEUINT32(save_p, SaveSector(ht->controlSector)); - WRITEFIXED(save_p, ht->rotscale); - WRITEUINT8(save_p, ht->turnobjs); - WRITEFIXED(save_p, ht->oldHeights); + WRITEUINT8(save->p, type); + WRITEINT32(save->p, ht->polyObjNum); + WRITEUINT32(save->p, SaveSector(ht->controlSector)); + WRITEFIXED(save->p, ht->rotscale); + WRITEUINT8(save->p, ht->turnobjs); + WRITEFIXED(save->p, ht->oldHeights); } -static void SavePolyfadeThinker(const thinker_t *th, const UINT8 type) +static void SavePolyfadeThinker(savebuffer_t *save, const thinker_t *th, const UINT8 type) { const polyfade_t *ht = (const void *)th; - WRITEUINT8(save_p, type); - WRITEINT32(save_p, ht->polyObjNum); - WRITEINT32(save_p, ht->sourcevalue); - WRITEINT32(save_p, ht->destvalue); - WRITEUINT8(save_p, (UINT8)ht->docollision); - WRITEUINT8(save_p, (UINT8)ht->doghostfade); - WRITEUINT8(save_p, (UINT8)ht->ticbased); - WRITEINT32(save_p, ht->duration); - WRITEINT32(save_p, ht->timer); + WRITEUINT8(save->p, type); + WRITEINT32(save->p, ht->polyObjNum); + WRITEINT32(save->p, ht->sourcevalue); + WRITEINT32(save->p, ht->destvalue); + WRITEUINT8(save->p, (UINT8)ht->docollision); + WRITEUINT8(save->p, (UINT8)ht->doghostfade); + WRITEUINT8(save->p, (UINT8)ht->ticbased); + WRITEINT32(save->p, ht->duration); + WRITEINT32(save->p, ht->timer); } -static void P_NetArchiveThinkers(void) +static void P_NetArchiveThinkers(savebuffer_t *save) { const thinker_t *th; UINT32 i; - WRITEUINT32(save_p, ARCHIVEBLOCK_THINKERS); + WRITEUINT32(save->p, ARCHIVEBLOCK_THINKERS); for (i = 0; i < NUM_THINKERLISTS; i++) { @@ -2819,7 +2818,7 @@ static void P_NetArchiveThinkers(void) if (th->function.acp1 == (actionf_p1)P_MobjThinker) { - SaveMobjThinker(th, tc_mobj); + SaveMobjThinker(save, th, tc_mobj); continue; } #ifdef PARANOIA @@ -2827,202 +2826,202 @@ static void P_NetArchiveThinkers(void) #endif else if (th->function.acp1 == (actionf_p1)T_MoveCeiling) { - SaveCeilingThinker(th, tc_ceiling); + SaveCeilingThinker(save, th, tc_ceiling); continue; } else if (th->function.acp1 == (actionf_p1)T_CrushCeiling) { - SaveCeilingThinker(th, tc_crushceiling); + SaveCeilingThinker(save, th, tc_crushceiling); continue; } else if (th->function.acp1 == (actionf_p1)T_MoveFloor) { - SaveFloormoveThinker(th, tc_floor); + SaveFloormoveThinker(save, th, tc_floor); continue; } else if (th->function.acp1 == (actionf_p1)T_LightningFlash) { - SaveLightflashThinker(th, tc_flash); + SaveLightflashThinker(save, th, tc_flash); continue; } else if (th->function.acp1 == (actionf_p1)T_StrobeFlash) { - SaveStrobeThinker(th, tc_strobe); + SaveStrobeThinker(save, th, tc_strobe); continue; } else if (th->function.acp1 == (actionf_p1)T_Glow) { - SaveGlowThinker(th, tc_glow); + SaveGlowThinker(save, th, tc_glow); continue; } else if (th->function.acp1 == (actionf_p1)T_FireFlicker) { - SaveFireflickerThinker(th, tc_fireflicker); + SaveFireflickerThinker(save, th, tc_fireflicker); continue; } else if (th->function.acp1 == (actionf_p1)T_MoveElevator) { - SaveElevatorThinker(th, tc_elevator); + SaveElevatorThinker(save, th, tc_elevator); continue; } else if (th->function.acp1 == (actionf_p1)T_ContinuousFalling) { - SaveContinuousFallThinker(th, tc_continuousfalling); + SaveContinuousFallThinker(save, th, tc_continuousfalling); continue; } else if (th->function.acp1 == (actionf_p1)T_ThwompSector) { - SaveThwompThinker(th, tc_thwomp); + SaveThwompThinker(save, th, tc_thwomp); continue; } else if (th->function.acp1 == (actionf_p1)T_NoEnemiesSector) { - SaveNoEnemiesThinker(th, tc_noenemies); + SaveNoEnemiesThinker(save, th, tc_noenemies); continue; } else if (th->function.acp1 == (actionf_p1)T_EachTimeThinker) { - SaveEachTimeThinker(th, tc_eachtime); + SaveEachTimeThinker(save, th, tc_eachtime); continue; } else if (th->function.acp1 == (actionf_p1)T_RaiseSector) { - SaveRaiseThinker(th, tc_raisesector); + SaveRaiseThinker(save, th, tc_raisesector); continue; } else if (th->function.acp1 == (actionf_p1)T_CameraScanner) { - SaveElevatorThinker(th, tc_camerascanner); + SaveElevatorThinker(save, th, tc_camerascanner); continue; } else if (th->function.acp1 == (actionf_p1)T_Scroll) { - SaveScrollThinker(th, tc_scroll); + SaveScrollThinker(save, th, tc_scroll); continue; } else if (th->function.acp1 == (actionf_p1)T_Friction) { - SaveFrictionThinker(th, tc_friction); + SaveFrictionThinker(save, th, tc_friction); continue; } else if (th->function.acp1 == (actionf_p1)T_Pusher) { - SavePusherThinker(th, tc_pusher); + SavePusherThinker(save, th, tc_pusher); continue; } else if (th->function.acp1 == (actionf_p1)T_BounceCheese) { - SaveBounceCheeseThinker(th, tc_bouncecheese); + SaveBounceCheeseThinker(save, th, tc_bouncecheese); continue; } else if (th->function.acp1 == (actionf_p1)T_StartCrumble) { - SaveCrumbleThinker(th, tc_startcrumble); + SaveCrumbleThinker(save, th, tc_startcrumble); continue; } else if (th->function.acp1 == (actionf_p1)T_MarioBlock) { - SaveMarioBlockThinker(th, tc_marioblock); + SaveMarioBlockThinker(save, th, tc_marioblock); continue; } else if (th->function.acp1 == (actionf_p1)T_MarioBlockChecker) { - SaveMarioCheckThinker(th, tc_marioblockchecker); + SaveMarioCheckThinker(save, th, tc_marioblockchecker); continue; } else if (th->function.acp1 == (actionf_p1)T_FloatSector) { - SaveFloatThinker(th, tc_floatsector); + SaveFloatThinker(save, th, tc_floatsector); continue; } else if (th->function.acp1 == (actionf_p1)T_LaserFlash) { - SaveLaserThinker(th, tc_laserflash); + SaveLaserThinker(save, th, tc_laserflash); continue; } else if (th->function.acp1 == (actionf_p1)T_LightFade) { - SaveLightlevelThinker(th, tc_lightfade); + SaveLightlevelThinker(save, th, tc_lightfade); continue; } else if (th->function.acp1 == (actionf_p1)T_ExecutorDelay) { - SaveExecutorThinker(th, tc_executor); + SaveExecutorThinker(save, th, tc_executor); continue; } else if (th->function.acp1 == (actionf_p1)T_Disappear) { - SaveDisappearThinker(th, tc_disappear); + SaveDisappearThinker(save, th, tc_disappear); continue; } else if (th->function.acp1 == (actionf_p1)T_Fade) { - SaveFadeThinker(th, tc_fade); + SaveFadeThinker(save, th, tc_fade); continue; } else if (th->function.acp1 == (actionf_p1)T_FadeColormap) { - SaveFadeColormapThinker(th, tc_fadecolormap); + SaveFadeColormapThinker(save, th, tc_fadecolormap); continue; } else if (th->function.acp1 == (actionf_p1)T_PlaneDisplace) { - SavePlaneDisplaceThinker(th, tc_planedisplace); + SavePlaneDisplaceThinker(save, th, tc_planedisplace); continue; } else if (th->function.acp1 == (actionf_p1)T_PolyObjRotate) { - SavePolyrotatetThinker(th, tc_polyrotate); + SavePolyrotatetThinker(save, th, tc_polyrotate); continue; } else if (th->function.acp1 == (actionf_p1)T_PolyObjMove) { - SavePolymoveThinker(th, tc_polymove); + SavePolymoveThinker(save, th, tc_polymove); continue; } else if (th->function.acp1 == (actionf_p1)T_PolyObjWaypoint) { - SavePolywaypointThinker(th, tc_polywaypoint); + SavePolywaypointThinker(save, th, tc_polywaypoint); continue; } else if (th->function.acp1 == (actionf_p1)T_PolyDoorSlide) { - SavePolyslidedoorThinker(th, tc_polyslidedoor); + SavePolyslidedoorThinker(save, th, tc_polyslidedoor); continue; } else if (th->function.acp1 == (actionf_p1)T_PolyDoorSwing) { - SavePolyswingdoorThinker(th, tc_polyswingdoor); + SavePolyswingdoorThinker(save, th, tc_polyswingdoor); continue; } else if (th->function.acp1 == (actionf_p1)T_PolyObjFlag) { - SavePolymoveThinker(th, tc_polyflag); + SavePolymoveThinker(save, th, tc_polyflag); continue; } else if (th->function.acp1 == (actionf_p1)T_PolyObjDisplace) { - SavePolydisplaceThinker(th, tc_polydisplace); + SavePolydisplaceThinker(save, th, tc_polydisplace); continue; } else if (th->function.acp1 == (actionf_p1)T_PolyObjRotDisplace) { - SavePolyrotdisplaceThinker(th, tc_polyrotdisplace); + SavePolyrotdisplaceThinker(save, th, tc_polyrotdisplace); continue; } else if (th->function.acp1 == (actionf_p1)T_PolyObjFade) { - SavePolyfadeThinker(th, tc_polyfade); + SavePolyfadeThinker(save, th, tc_polyfade); continue; } else if (th->function.acp1 == (actionf_p1)T_DynamicSlopeLine) { - SaveDynamicLineSlopeThinker(th, tc_dynslopeline); + SaveDynamicLineSlopeThinker(save, th, tc_dynslopeline); continue; } else if (th->function.acp1 == (actionf_p1)T_DynamicSlopeVert) { - SaveDynamicVertexSlopeThinker(th, tc_dynslopevert); + SaveDynamicVertexSlopeThinker(save, th, tc_dynslopevert); continue; } #ifdef PARANOIA @@ -3033,34 +3032,34 @@ static void P_NetArchiveThinkers(void) CONS_Debug(DBG_NETPLAY, "%u thinkers saved in list %d\n", numsaved, i); - WRITEUINT8(save_p, tc_end); + WRITEUINT8(save->p, tc_end); } } -static void P_NetArchiveWaypoints(void) +static void P_NetArchiveWaypoints(savebuffer_t *save) { waypoint_t *waypoint; size_t i; size_t numWaypoints = K_GetNumWaypoints(); - WRITEUINT32(save_p, ARCHIVEBLOCK_WAYPOINTS); - WRITEUINT32(save_p, numWaypoints); + WRITEUINT32(save->p, ARCHIVEBLOCK_WAYPOINTS); + WRITEUINT32(save->p, numWaypoints); for (i = 0U; i < numWaypoints; i++) { waypoint = K_GetWaypointFromIndex(i); // The only thing we save for each waypoint is the mobj. // Waypoints should NEVER be completely created or destroyed mid-race as a result of this - WRITEUINT32(save_p, waypoint->mobj->mobjnum); + WRITEUINT32(save->p, waypoint->mobj->mobjnum); } } -static void P_NetUnArchiveWaypoints(void) +static void P_NetUnArchiveWaypoints(savebuffer_t *save) { - if (READUINT32(save_p) != ARCHIVEBLOCK_WAYPOINTS) + if (READUINT32(save->p) != ARCHIVEBLOCK_WAYPOINTS) I_Error("Bad $$$.sav at archive block Waypoints!"); else { - UINT32 numArchiveWaypoints = READUINT32(save_p); + UINT32 numArchiveWaypoints = READUINT32(save->p); size_t numSpawnedWaypoints = K_GetNumWaypoints(); if (numArchiveWaypoints != numSpawnedWaypoints) { @@ -3071,7 +3070,7 @@ static void P_NetUnArchiveWaypoints(void) UINT32 temp; for (i = 0U; i < numArchiveWaypoints; i++) { waypoint = K_GetWaypointFromIndex(i); - temp = READUINT32(save_p); + temp = READUINT32(save->p); if (!P_SetTarget(&waypoint->mobj, P_FindNewPosition(temp))) { CONS_Debug(DBG_GAMELOGIC, "waypoint mobj not found for %d\n", i); } @@ -3140,7 +3139,7 @@ static inline pslope_t *LoadSlope(UINT32 slopeid) return NULL; } -static thinker_t* LoadMobjThinker(actionf_p1 thinker) +static thinker_t* LoadMobjThinker(savebuffer_t *save, actionf_p1 thinker) { thinker_t *next; mobj_t *mobj; @@ -3150,35 +3149,35 @@ static thinker_t* LoadMobjThinker(actionf_p1 thinker) fixed_t z, floorz, ceilingz; ffloor_t *floorrover = NULL, *ceilingrover = NULL; - diff = READUINT32(save_p); + diff = READUINT32(save->p); if (diff & MD_MORE) - diff2 = READUINT32(save_p); + diff2 = READUINT32(save->p); else diff2 = 0; - next = (void *)(size_t)READUINT32(save_p); + next = (void *)(size_t)READUINT32(save->p); - z = READFIXED(save_p); // Force this so 3dfloor problems don't arise. - floorz = READFIXED(save_p); - ceilingz = READFIXED(save_p); + z = READFIXED(save->p); // Force this so 3dfloor problems don't arise. + floorz = READFIXED(save->p); + ceilingz = READFIXED(save->p); if (diff2 & MD2_FLOORROVER) { - sector_t *sec = LoadSector(READUINT32(save_p)); - UINT16 id = READUINT16(save_p); + sector_t *sec = LoadSector(READUINT32(save->p)); + UINT16 id = READUINT16(save->p); floorrover = P_GetFFloorByID(sec, id); } if (diff2 & MD2_CEILINGROVER) { - sector_t *sec = LoadSector(READUINT32(save_p)); - UINT16 id = READUINT16(save_p); + sector_t *sec = LoadSector(READUINT32(save->p)); + UINT16 id = READUINT16(save->p); ceilingrover = P_GetFFloorByID(sec, id); } if (diff & MD_SPAWNPOINT) { - UINT16 spawnpointnum = READUINT16(save_p); + UINT16 spawnpointnum = READUINT16(save->p); if (mapthings[spawnpointnum].type == 1713) // NiGHTS Hoop special case { @@ -3204,7 +3203,7 @@ static thinker_t* LoadMobjThinker(actionf_p1 thinker) mobj->ceilingrover = ceilingrover; if (diff & MD_TYPE) - mobj->type = READUINT32(save_p); + mobj->type = READUINT32(save->p); else { for (i = 0; i < NUMMOBJTYPES; i++) @@ -3223,11 +3222,11 @@ static thinker_t* LoadMobjThinker(actionf_p1 thinker) mobj->info = &mobjinfo[mobj->type]; if (diff & MD_POS) { - mobj->x = mobj->old_x = READFIXED(save_p); - mobj->y = mobj->old_y = READFIXED(save_p); - mobj->angle = mobj->old_angle = READANGLE(save_p); - mobj->pitch = mobj->old_pitch = READANGLE(save_p); - mobj->roll = mobj->old_roll = READANGLE(save_p); + mobj->x = mobj->old_x = READFIXED(save->p); + mobj->y = mobj->old_y = READFIXED(save->p); + mobj->angle = mobj->old_angle = READANGLE(save->p); + mobj->pitch = mobj->old_pitch = READANGLE(save->p); + mobj->roll = mobj->old_roll = READANGLE(save->p); } else { @@ -3239,47 +3238,47 @@ static thinker_t* LoadMobjThinker(actionf_p1 thinker) } if (diff & MD_MOM) { - mobj->momx = READFIXED(save_p); - mobj->momy = READFIXED(save_p); - mobj->momz = READFIXED(save_p); - mobj->pmomz = READFIXED(save_p); + mobj->momx = READFIXED(save->p); + mobj->momy = READFIXED(save->p); + mobj->momz = READFIXED(save->p); + mobj->pmomz = READFIXED(save->p); } // otherwise they're zero, and the memset took care of it if (diff & MD_RADIUS) - mobj->radius = READFIXED(save_p); + mobj->radius = READFIXED(save->p); else mobj->radius = mobj->info->radius; if (diff & MD_HEIGHT) - mobj->height = READFIXED(save_p); + mobj->height = READFIXED(save->p); else mobj->height = mobj->info->height; if (diff & MD_FLAGS) - mobj->flags = READUINT32(save_p); + mobj->flags = READUINT32(save->p); else mobj->flags = mobj->info->flags; if (diff & MD_FLAGS2) - mobj->flags2 = READUINT32(save_p); + mobj->flags2 = READUINT32(save->p); if (diff & MD_HEALTH) - mobj->health = READINT32(save_p); + mobj->health = READINT32(save->p); else mobj->health = mobj->info->spawnhealth; if (diff & MD_RTIME) - mobj->reactiontime = READINT32(save_p); + mobj->reactiontime = READINT32(save->p); else mobj->reactiontime = mobj->info->reactiontime; if (diff & MD_STATE) - mobj->state = &states[READUINT16(save_p)]; + mobj->state = &states[READUINT16(save->p)]; else mobj->state = &states[mobj->info->spawnstate]; if (diff & MD_TICS) - mobj->tics = READINT32(save_p); + mobj->tics = READINT32(save->p); else mobj->tics = mobj->state->tics; if (diff & MD_SPRITE) { - mobj->sprite = READUINT16(save_p); + mobj->sprite = READUINT16(save->p); if (mobj->sprite == SPR_PLAY) - mobj->sprite2 = READUINT8(save_p); + mobj->sprite2 = READUINT8(save->p); } else { mobj->sprite = mobj->state->sprite; @@ -3288,8 +3287,8 @@ static thinker_t* LoadMobjThinker(actionf_p1 thinker) } if (diff & MD_FRAME) { - mobj->frame = READUINT32(save_p); - mobj->anim_duration = READUINT16(save_p); + mobj->frame = READUINT32(save->p); + mobj->anim_duration = READUINT16(save->p); } else { @@ -3297,139 +3296,139 @@ static thinker_t* LoadMobjThinker(actionf_p1 thinker) mobj->anim_duration = (UINT16)mobj->state->var2; } if (diff & MD_EFLAGS) - mobj->eflags = READUINT16(save_p); + mobj->eflags = READUINT16(save->p); if (diff & MD_PLAYER) { - i = READUINT8(save_p); + i = READUINT8(save->p); mobj->player = &players[i]; mobj->player->mo = mobj; } if (diff & MD_MOVEDIR) - mobj->movedir = READANGLE(save_p); + mobj->movedir = READANGLE(save->p); if (diff & MD_MOVECOUNT) - mobj->movecount = READINT32(save_p); + mobj->movecount = READINT32(save->p); if (diff & MD_THRESHOLD) - mobj->threshold = READINT32(save_p); + mobj->threshold = READINT32(save->p); if (diff & MD_LASTLOOK) - mobj->lastlook = READINT32(save_p); + mobj->lastlook = READINT32(save->p); else mobj->lastlook = -1; if (diff & MD_TARGET) - mobj->target = (mobj_t *)(size_t)READUINT32(save_p); + mobj->target = (mobj_t *)(size_t)READUINT32(save->p); if (diff & MD_TRACER) - mobj->tracer = (mobj_t *)(size_t)READUINT32(save_p); + mobj->tracer = (mobj_t *)(size_t)READUINT32(save->p); if (diff & MD_FRICTION) - mobj->friction = READFIXED(save_p); + mobj->friction = READFIXED(save->p); else mobj->friction = ORIG_FRICTION; if (diff & MD_MOVEFACTOR) - mobj->movefactor = READFIXED(save_p); + mobj->movefactor = READFIXED(save->p); else mobj->movefactor = FRACUNIT; if (diff & MD_FUSE) - mobj->fuse = READINT32(save_p); + mobj->fuse = READINT32(save->p); if (diff & MD_WATERTOP) - mobj->watertop = READFIXED(save_p); + mobj->watertop = READFIXED(save->p); if (diff & MD_WATERBOTTOM) - mobj->waterbottom = READFIXED(save_p); + mobj->waterbottom = READFIXED(save->p); if (diff & MD_SCALE) - mobj->scale = READFIXED(save_p); + mobj->scale = READFIXED(save->p); else mobj->scale = FRACUNIT; if (diff & MD_DSCALE) - mobj->destscale = READFIXED(save_p); + mobj->destscale = READFIXED(save->p); else mobj->destscale = mobj->scale; if (diff2 & MD2_SCALESPEED) - mobj->scalespeed = READFIXED(save_p); + mobj->scalespeed = READFIXED(save->p); else mobj->scalespeed = mapobjectscale/12; if (diff2 & MD2_CUSVAL) - mobj->cusval = READINT32(save_p); + mobj->cusval = READINT32(save->p); if (diff2 & MD2_CVMEM) - mobj->cvmem = READINT32(save_p); + mobj->cvmem = READINT32(save->p); if (diff2 & MD2_SKIN) - mobj->skin = &skins[READUINT8(save_p)]; + mobj->skin = &skins[READUINT8(save->p)]; if (diff2 & MD2_COLOR) - mobj->color = READUINT16(save_p); + mobj->color = READUINT16(save->p); if (diff2 & MD2_EXTVAL1) - mobj->extravalue1 = READINT32(save_p); + mobj->extravalue1 = READINT32(save->p); if (diff2 & MD2_EXTVAL2) - mobj->extravalue2 = READINT32(save_p); + mobj->extravalue2 = READINT32(save->p); if (diff2 & MD2_HNEXT) - mobj->hnext = (mobj_t *)(size_t)READUINT32(save_p); + mobj->hnext = (mobj_t *)(size_t)READUINT32(save->p); if (diff2 & MD2_HPREV) - mobj->hprev = (mobj_t *)(size_t)READUINT32(save_p); + mobj->hprev = (mobj_t *)(size_t)READUINT32(save->p); if (diff2 & MD2_ITNEXT) - mobj->itnext = (mobj_t *)(size_t)READUINT32(save_p); + mobj->itnext = (mobj_t *)(size_t)READUINT32(save->p); if (diff2 & MD2_SLOPE) - mobj->standingslope = P_SlopeById(READUINT16(save_p)); + mobj->standingslope = P_SlopeById(READUINT16(save->p)); if (diff2 & MD2_COLORIZED) - mobj->colorized = READUINT8(save_p); + mobj->colorized = READUINT8(save->p); if (diff2 & MD2_MIRRORED) - mobj->mirrored = READUINT8(save_p); + mobj->mirrored = READUINT8(save->p); if (diff2 & MD2_ROLLANGLE) - mobj->rollangle = READANGLE(save_p); + mobj->rollangle = READANGLE(save->p); if (diff2 & MD2_SHADOWSCALE) { - mobj->shadowscale = READFIXED(save_p); - mobj->whiteshadow = READUINT8(save_p); + mobj->shadowscale = READFIXED(save->p); + mobj->whiteshadow = READUINT8(save->p); } if (diff2 & MD2_RENDERFLAGS) - mobj->renderflags = READUINT32(save_p); + mobj->renderflags = READUINT32(save->p); if (diff2 & MD2_SPRITEXSCALE) - mobj->spritexscale = READFIXED(save_p); + mobj->spritexscale = READFIXED(save->p); else mobj->spritexscale = FRACUNIT; if (diff2 & MD2_SPRITEYSCALE) - mobj->spriteyscale = READFIXED(save_p); + mobj->spriteyscale = READFIXED(save->p); else mobj->spriteyscale = FRACUNIT; if (diff2 & MD2_SPRITEXOFFSET) - mobj->spritexoffset = READFIXED(save_p); + mobj->spritexoffset = READFIXED(save->p); if (diff2 & MD2_SPRITEYOFFSET) - mobj->spriteyoffset = READFIXED(save_p); + mobj->spriteyoffset = READFIXED(save->p); if (diff2 & MD2_FLOORSPRITESLOPE) { pslope_t *slope = (pslope_t *)P_CreateFloorSpriteSlope(mobj); - slope->zdelta = READFIXED(save_p); - slope->zangle = READANGLE(save_p); - slope->xydirection = READANGLE(save_p); + slope->zdelta = READFIXED(save->p); + slope->zangle = READANGLE(save->p); + slope->xydirection = READANGLE(save->p); - slope->o.x = READFIXED(save_p); - slope->o.y = READFIXED(save_p); - slope->o.z = READFIXED(save_p); + slope->o.x = READFIXED(save->p); + slope->o.y = READFIXED(save->p); + slope->o.z = READFIXED(save->p); - slope->d.x = READFIXED(save_p); - slope->d.y = READFIXED(save_p); + slope->d.x = READFIXED(save->p); + slope->d.y = READFIXED(save->p); - slope->normal.x = READFIXED(save_p); - slope->normal.y = READFIXED(save_p); - slope->normal.z = READFIXED(save_p); + slope->normal.x = READFIXED(save->p); + slope->normal.y = READFIXED(save->p); + slope->normal.z = READFIXED(save->p); P_UpdateSlopeLightOffset(slope); } if (diff2 & MD2_HITLAG) { - mobj->hitlag = READINT32(save_p); + mobj->hitlag = READINT32(save->p); } if (diff2 & MD2_WATERSKIP) { - mobj->waterskip = READUINT8(save_p); + mobj->waterskip = READUINT8(save->p); } if (diff2 & MD2_DISPOFFSET) { - mobj->dispoffset = READINT32(save_p); + mobj->dispoffset = READINT32(save->p); } if (diff2 & MD2_LASTMOMZ) { - mobj->lastmomz = READINT32(save_p); + mobj->lastmomz = READINT32(save->p); } if (diff2 & MD2_TERRAIN) { - mobj->terrain = (terrain_t *)(size_t)READUINT32(save_p); - mobj->terrainOverlay = (mobj_t *)(size_t)READUINT32(save_p); + mobj->terrain = (terrain_t *)(size_t)READUINT32(save->p); + mobj->terrainOverlay = (mobj_t *)(size_t)READUINT32(save->p); } else { @@ -3450,7 +3449,7 @@ static thinker_t* LoadMobjThinker(actionf_p1 thinker) // set sprev, snext, bprev, bnext, subsector P_SetThingPosition(mobj); - mobj->mobjnum = READUINT32(save_p); + mobj->mobjnum = READUINT32(save->p); if (mobj->player) { @@ -3486,25 +3485,25 @@ static thinker_t* LoadMobjThinker(actionf_p1 thinker) return &mobj->thinker; } -static thinker_t* LoadNoEnemiesThinker(actionf_p1 thinker) +static thinker_t* LoadNoEnemiesThinker(savebuffer_t *save, actionf_p1 thinker) { noenemies_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL); ht->thinker.function.acp1 = thinker; - ht->sourceline = LoadLine(READUINT32(save_p)); + ht->sourceline = LoadLine(READUINT32(save->p)); return &ht->thinker; } -static thinker_t* LoadBounceCheeseThinker(actionf_p1 thinker) +static thinker_t* LoadBounceCheeseThinker(savebuffer_t *save, actionf_p1 thinker) { bouncecheese_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL); ht->thinker.function.acp1 = thinker; - ht->sourceline = LoadLine(READUINT32(save_p)); - ht->sector = LoadSector(READUINT32(save_p)); - ht->speed = READFIXED(save_p); - ht->distance = READFIXED(save_p); - ht->floorwasheight = READFIXED(save_p); - ht->ceilingwasheight = READFIXED(save_p); - ht->low = READCHAR(save_p); + ht->sourceline = LoadLine(READUINT32(save->p)); + ht->sector = LoadSector(READUINT32(save->p)); + ht->speed = READFIXED(save->p); + ht->distance = READFIXED(save->p); + ht->floorwasheight = READFIXED(save->p); + ht->ceilingwasheight = READFIXED(save->p); + ht->low = READCHAR(save->p); if (ht->sector) ht->sector->ceilingdata = ht; @@ -3512,16 +3511,16 @@ static thinker_t* LoadBounceCheeseThinker(actionf_p1 thinker) return &ht->thinker; } -static thinker_t* LoadContinuousFallThinker(actionf_p1 thinker) +static thinker_t* LoadContinuousFallThinker(savebuffer_t *save, actionf_p1 thinker) { continuousfall_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL); ht->thinker.function.acp1 = thinker; - ht->sector = LoadSector(READUINT32(save_p)); - ht->speed = READFIXED(save_p); - ht->direction = READINT32(save_p); - ht->floorstartheight = READFIXED(save_p); - ht->ceilingstartheight = READFIXED(save_p); - ht->destheight = READFIXED(save_p); + ht->sector = LoadSector(READUINT32(save->p)); + ht->speed = READFIXED(save->p); + ht->direction = READINT32(save->p); + ht->floorstartheight = READFIXED(save->p); + ht->ceilingstartheight = READFIXED(save->p); + ht->destheight = READFIXED(save->p); if (ht->sector) { @@ -3532,16 +3531,16 @@ static thinker_t* LoadContinuousFallThinker(actionf_p1 thinker) return &ht->thinker; } -static thinker_t* LoadMarioBlockThinker(actionf_p1 thinker) +static thinker_t* LoadMarioBlockThinker(savebuffer_t *save, actionf_p1 thinker) { mariothink_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL); ht->thinker.function.acp1 = thinker; - ht->sector = LoadSector(READUINT32(save_p)); - ht->speed = READFIXED(save_p); - ht->direction = READINT32(save_p); - ht->floorstartheight = READFIXED(save_p); - ht->ceilingstartheight = READFIXED(save_p); - ht->tag = READINT16(save_p); + ht->sector = LoadSector(READUINT32(save->p)); + ht->speed = READFIXED(save->p); + ht->direction = READINT32(save->p); + ht->floorstartheight = READFIXED(save->p); + ht->ceilingstartheight = READFIXED(save->p); + ht->tag = READINT16(save->p); if (ht->sector) { @@ -3552,29 +3551,29 @@ static thinker_t* LoadMarioBlockThinker(actionf_p1 thinker) return &ht->thinker; } -static thinker_t* LoadMarioCheckThinker(actionf_p1 thinker) +static thinker_t* LoadMarioCheckThinker(savebuffer_t *save, actionf_p1 thinker) { mariocheck_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL); ht->thinker.function.acp1 = thinker; - ht->sourceline = LoadLine(READUINT32(save_p)); - ht->sector = LoadSector(READUINT32(save_p)); + ht->sourceline = LoadLine(READUINT32(save->p)); + ht->sector = LoadSector(READUINT32(save->p)); return &ht->thinker; } -static thinker_t* LoadThwompThinker(actionf_p1 thinker) +static thinker_t* LoadThwompThinker(savebuffer_t *save, actionf_p1 thinker) { thwomp_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL); ht->thinker.function.acp1 = thinker; - ht->sourceline = LoadLine(READUINT32(save_p)); - ht->sector = LoadSector(READUINT32(save_p)); - ht->crushspeed = READFIXED(save_p); - ht->retractspeed = READFIXED(save_p); - ht->direction = READINT32(save_p); - ht->floorstartheight = READFIXED(save_p); - ht->ceilingstartheight = READFIXED(save_p); - ht->delay = READINT32(save_p); - ht->tag = READINT16(save_p); - ht->sound = READUINT16(save_p); + ht->sourceline = LoadLine(READUINT32(save->p)); + ht->sector = LoadSector(READUINT32(save->p)); + ht->crushspeed = READFIXED(save->p); + ht->retractspeed = READFIXED(save->p); + ht->direction = READINT32(save->p); + ht->floorstartheight = READFIXED(save->p); + ht->ceilingstartheight = READFIXED(save->p); + ht->delay = READINT32(save->p); + ht->tag = READINT16(save->p); + ht->sound = READUINT16(save->p); if (ht->sector) { @@ -3585,163 +3584,163 @@ static thinker_t* LoadThwompThinker(actionf_p1 thinker) return &ht->thinker; } -static thinker_t* LoadFloatThinker(actionf_p1 thinker) +static thinker_t* LoadFloatThinker(savebuffer_t *save, actionf_p1 thinker) { floatthink_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL); ht->thinker.function.acp1 = thinker; - ht->sourceline = LoadLine(READUINT32(save_p)); - ht->sector = LoadSector(READUINT32(save_p)); - ht->tag = READINT16(save_p); + ht->sourceline = LoadLine(READUINT32(save->p)); + ht->sector = LoadSector(READUINT32(save->p)); + ht->tag = READINT16(save->p); return &ht->thinker; } -static thinker_t* LoadEachTimeThinker(actionf_p1 thinker) +static thinker_t* LoadEachTimeThinker(savebuffer_t *save, actionf_p1 thinker) { size_t i; eachtime_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL); ht->thinker.function.acp1 = thinker; - ht->sourceline = LoadLine(READUINT32(save_p)); + ht->sourceline = LoadLine(READUINT32(save->p)); for (i = 0; i < MAXPLAYERS; i++) { - ht->playersInArea[i] = READCHAR(save_p); + ht->playersInArea[i] = READCHAR(save->p); } - ht->triggerOnExit = READCHAR(save_p); + ht->triggerOnExit = READCHAR(save->p); return &ht->thinker; } -static thinker_t* LoadRaiseThinker(actionf_p1 thinker) +static thinker_t* LoadRaiseThinker(savebuffer_t *save, actionf_p1 thinker) { raise_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL); ht->thinker.function.acp1 = thinker; - ht->tag = READINT16(save_p); - ht->sector = LoadSector(READUINT32(save_p)); - ht->ceilingbottom = READFIXED(save_p); - ht->ceilingtop = READFIXED(save_p); - ht->basespeed = READFIXED(save_p); - ht->extraspeed = READFIXED(save_p); - ht->shaketimer = READUINT8(save_p); - ht->flags = READUINT8(save_p); + ht->tag = READINT16(save->p); + ht->sector = LoadSector(READUINT32(save->p)); + ht->ceilingbottom = READFIXED(save->p); + ht->ceilingtop = READFIXED(save->p); + ht->basespeed = READFIXED(save->p); + ht->extraspeed = READFIXED(save->p); + ht->shaketimer = READUINT8(save->p); + ht->flags = READUINT8(save->p); return &ht->thinker; } -static thinker_t* LoadCeilingThinker(actionf_p1 thinker) +static thinker_t* LoadCeilingThinker(savebuffer_t *save, actionf_p1 thinker) { ceiling_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL); ht->thinker.function.acp1 = thinker; - ht->type = READUINT8(save_p); - ht->sector = LoadSector(READUINT32(save_p)); - ht->bottomheight = READFIXED(save_p); - ht->topheight = READFIXED(save_p); - ht->speed = READFIXED(save_p); - ht->delay = READFIXED(save_p); - ht->delaytimer = READFIXED(save_p); - ht->crush = READUINT8(save_p); - ht->texture = READINT32(save_p); - ht->direction = READINT32(save_p); - ht->tag = READINT16(save_p); - ht->origspeed = READFIXED(save_p); - ht->sourceline = READFIXED(save_p); + ht->type = READUINT8(save->p); + ht->sector = LoadSector(READUINT32(save->p)); + ht->bottomheight = READFIXED(save->p); + ht->topheight = READFIXED(save->p); + ht->speed = READFIXED(save->p); + ht->delay = READFIXED(save->p); + ht->delaytimer = READFIXED(save->p); + ht->crush = READUINT8(save->p); + ht->texture = READINT32(save->p); + ht->direction = READINT32(save->p); + ht->tag = READINT16(save->p); + ht->origspeed = READFIXED(save->p); + ht->sourceline = READFIXED(save->p); if (ht->sector) ht->sector->ceilingdata = ht; return &ht->thinker; } -static thinker_t* LoadFloormoveThinker(actionf_p1 thinker) +static thinker_t* LoadFloormoveThinker(savebuffer_t *save, actionf_p1 thinker) { floormove_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL); ht->thinker.function.acp1 = thinker; - ht->type = READUINT8(save_p); - ht->crush = READUINT8(save_p); - ht->sector = LoadSector(READUINT32(save_p)); - ht->direction = READINT32(save_p); - ht->texture = READINT32(save_p); - ht->floordestheight = READFIXED(save_p); - ht->speed = READFIXED(save_p); - ht->origspeed = READFIXED(save_p); - ht->delay = READFIXED(save_p); - ht->delaytimer = READFIXED(save_p); - ht->tag = READINT16(save_p); - ht->sourceline = READFIXED(save_p); + ht->type = READUINT8(save->p); + ht->crush = READUINT8(save->p); + ht->sector = LoadSector(READUINT32(save->p)); + ht->direction = READINT32(save->p); + ht->texture = READINT32(save->p); + ht->floordestheight = READFIXED(save->p); + ht->speed = READFIXED(save->p); + ht->origspeed = READFIXED(save->p); + ht->delay = READFIXED(save->p); + ht->delaytimer = READFIXED(save->p); + ht->tag = READINT16(save->p); + ht->sourceline = READFIXED(save->p); if (ht->sector) ht->sector->floordata = ht; return &ht->thinker; } -static thinker_t* LoadLightflashThinker(actionf_p1 thinker) +static thinker_t* LoadLightflashThinker(savebuffer_t *save, actionf_p1 thinker) { lightflash_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL); ht->thinker.function.acp1 = thinker; - ht->sector = LoadSector(READUINT32(save_p)); - ht->maxlight = READINT32(save_p); - ht->minlight = READINT32(save_p); + ht->sector = LoadSector(READUINT32(save->p)); + ht->maxlight = READINT32(save->p); + ht->minlight = READINT32(save->p); if (ht->sector) ht->sector->lightingdata = ht; return &ht->thinker; } -static thinker_t* LoadStrobeThinker(actionf_p1 thinker) +static thinker_t* LoadStrobeThinker(savebuffer_t *save, actionf_p1 thinker) { strobe_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL); ht->thinker.function.acp1 = thinker; - ht->sector = LoadSector(READUINT32(save_p)); - ht->count = READINT32(save_p); - ht->minlight = READINT16(save_p); - ht->maxlight = READINT16(save_p); - ht->darktime = READINT32(save_p); - ht->brighttime = READINT32(save_p); + ht->sector = LoadSector(READUINT32(save->p)); + ht->count = READINT32(save->p); + ht->minlight = READINT16(save->p); + ht->maxlight = READINT16(save->p); + ht->darktime = READINT32(save->p); + ht->brighttime = READINT32(save->p); if (ht->sector) ht->sector->lightingdata = ht; return &ht->thinker; } -static thinker_t* LoadGlowThinker(actionf_p1 thinker) +static thinker_t* LoadGlowThinker(savebuffer_t *save, actionf_p1 thinker) { glow_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL); ht->thinker.function.acp1 = thinker; - ht->sector = LoadSector(READUINT32(save_p)); - ht->minlight = READINT16(save_p); - ht->maxlight = READINT16(save_p); - ht->direction = READINT16(save_p); - ht->speed = READINT16(save_p); + ht->sector = LoadSector(READUINT32(save->p)); + ht->minlight = READINT16(save->p); + ht->maxlight = READINT16(save->p); + ht->direction = READINT16(save->p); + ht->speed = READINT16(save->p); if (ht->sector) ht->sector->lightingdata = ht; return &ht->thinker; } -static thinker_t* LoadFireflickerThinker(actionf_p1 thinker) +static thinker_t* LoadFireflickerThinker(savebuffer_t *save, actionf_p1 thinker) { fireflicker_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL); ht->thinker.function.acp1 = thinker; - ht->sector = LoadSector(READUINT32(save_p)); - ht->count = READINT32(save_p); - ht->resetcount = READINT32(save_p); - ht->maxlight = READINT16(save_p); - ht->minlight = READINT16(save_p); + ht->sector = LoadSector(READUINT32(save->p)); + ht->count = READINT32(save->p); + ht->resetcount = READINT32(save->p); + ht->maxlight = READINT16(save->p); + ht->minlight = READINT16(save->p); if (ht->sector) ht->sector->lightingdata = ht; return &ht->thinker; } -static thinker_t* LoadElevatorThinker(actionf_p1 thinker, boolean setplanedata) +static thinker_t* LoadElevatorThinker(savebuffer_t *save, actionf_p1 thinker, boolean setplanedata) { elevator_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL); ht->thinker.function.acp1 = thinker; - ht->type = READUINT8(save_p); - ht->sector = LoadSector(READUINT32(save_p)); - ht->actionsector = LoadSector(READUINT32(save_p)); - ht->direction = READINT32(save_p); - ht->floordestheight = READFIXED(save_p); - ht->ceilingdestheight = READFIXED(save_p); - ht->speed = READFIXED(save_p); - ht->origspeed = READFIXED(save_p); - ht->low = READFIXED(save_p); - ht->high = READFIXED(save_p); - ht->distance = READFIXED(save_p); - ht->delay = READFIXED(save_p); - ht->delaytimer = READFIXED(save_p); - ht->floorwasheight = READFIXED(save_p); - ht->ceilingwasheight = READFIXED(save_p); - ht->sourceline = LoadLine(READUINT32(save_p)); + ht->type = READUINT8(save->p); + ht->sector = LoadSector(READUINT32(save->p)); + ht->actionsector = LoadSector(READUINT32(save->p)); + ht->direction = READINT32(save->p); + ht->floordestheight = READFIXED(save->p); + ht->ceilingdestheight = READFIXED(save->p); + ht->speed = READFIXED(save->p); + ht->origspeed = READFIXED(save->p); + ht->low = READFIXED(save->p); + ht->high = READFIXED(save->p); + ht->distance = READFIXED(save->p); + ht->delay = READFIXED(save->p); + ht->delaytimer = READFIXED(save->p); + ht->floorwasheight = READFIXED(save->p); + ht->ceilingwasheight = READFIXED(save->p); + ht->sourceline = LoadLine(READUINT32(save->p)); if (ht->sector && setplanedata) { @@ -3752,21 +3751,21 @@ static thinker_t* LoadElevatorThinker(actionf_p1 thinker, boolean setplanedata) return &ht->thinker; } -static thinker_t* LoadCrumbleThinker(actionf_p1 thinker) +static thinker_t* LoadCrumbleThinker(savebuffer_t *save, actionf_p1 thinker) { crumble_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL); ht->thinker.function.acp1 = thinker; - ht->sourceline = LoadLine(READUINT32(save_p)); - ht->sector = LoadSector(READUINT32(save_p)); - ht->actionsector = LoadSector(READUINT32(save_p)); - ht->player = LoadPlayer(READUINT32(save_p)); - ht->direction = READINT32(save_p); - ht->origalpha = READINT32(save_p); - ht->timer = READINT32(save_p); - ht->speed = READFIXED(save_p); - ht->floorwasheight = READFIXED(save_p); - ht->ceilingwasheight = READFIXED(save_p); - ht->flags = READUINT8(save_p); + ht->sourceline = LoadLine(READUINT32(save->p)); + ht->sector = LoadSector(READUINT32(save->p)); + ht->actionsector = LoadSector(READUINT32(save->p)); + ht->player = LoadPlayer(READUINT32(save->p)); + ht->direction = READINT32(save->p); + ht->origalpha = READINT32(save->p); + ht->timer = READINT32(save->p); + ht->speed = READFIXED(save->p); + ht->floorwasheight = READFIXED(save->p); + ht->ceilingwasheight = READFIXED(save->p); + ht->flags = READUINT8(save->p); if (ht->sector) ht->sector->floordata = ht; @@ -3774,123 +3773,123 @@ static thinker_t* LoadCrumbleThinker(actionf_p1 thinker) return &ht->thinker; } -static thinker_t* LoadScrollThinker(actionf_p1 thinker) +static thinker_t* LoadScrollThinker(savebuffer_t *save, actionf_p1 thinker) { scroll_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL); ht->thinker.function.acp1 = thinker; - ht->dx = READFIXED(save_p); - ht->dy = READFIXED(save_p); - ht->affectee = READINT32(save_p); - ht->control = READINT32(save_p); - ht->last_height = READFIXED(save_p); - ht->vdx = READFIXED(save_p); - ht->vdy = READFIXED(save_p); - ht->accel = READINT32(save_p); - ht->exclusive = READINT32(save_p); - ht->type = READUINT8(save_p); + ht->dx = READFIXED(save->p); + ht->dy = READFIXED(save->p); + ht->affectee = READINT32(save->p); + ht->control = READINT32(save->p); + ht->last_height = READFIXED(save->p); + ht->vdx = READFIXED(save->p); + ht->vdy = READFIXED(save->p); + ht->accel = READINT32(save->p); + ht->exclusive = READINT32(save->p); + ht->type = READUINT8(save->p); return &ht->thinker; } -static inline thinker_t* LoadFrictionThinker(actionf_p1 thinker) +static inline thinker_t* LoadFrictionThinker(savebuffer_t *save, actionf_p1 thinker) { friction_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL); ht->thinker.function.acp1 = thinker; - ht->friction = READINT32(save_p); - ht->movefactor = READINT32(save_p); - ht->affectee = READINT32(save_p); - ht->referrer = READINT32(save_p); - ht->roverfriction = READUINT8(save_p); + ht->friction = READINT32(save->p); + ht->movefactor = READINT32(save->p); + ht->affectee = READINT32(save->p); + ht->referrer = READINT32(save->p); + ht->roverfriction = READUINT8(save->p); return &ht->thinker; } -static thinker_t* LoadPusherThinker(actionf_p1 thinker) +static thinker_t* LoadPusherThinker(savebuffer_t *save, actionf_p1 thinker) { pusher_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL); ht->thinker.function.acp1 = thinker; - ht->type = READUINT8(save_p); - ht->x_mag = READFIXED(save_p); - ht->y_mag = READFIXED(save_p); - ht->z_mag = READFIXED(save_p); - ht->affectee = READINT32(save_p); - ht->roverpusher = READUINT8(save_p); - ht->referrer = READINT32(save_p); - ht->exclusive = READINT32(save_p); - ht->slider = READINT32(save_p); + ht->type = READUINT8(save->p); + ht->x_mag = READFIXED(save->p); + ht->y_mag = READFIXED(save->p); + ht->z_mag = READFIXED(save->p); + ht->affectee = READINT32(save->p); + ht->roverpusher = READUINT8(save->p); + ht->referrer = READINT32(save->p); + ht->exclusive = READINT32(save->p); + ht->slider = READINT32(save->p); return &ht->thinker; } -static inline thinker_t* LoadLaserThinker(actionf_p1 thinker) +static inline thinker_t* LoadLaserThinker(savebuffer_t *save, actionf_p1 thinker) { laserthink_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL); ht->thinker.function.acp1 = thinker; - ht->tag = READINT16(save_p); - ht->sourceline = LoadLine(READUINT32(save_p)); - ht->nobosses = READUINT8(save_p); + ht->tag = READINT16(save->p); + ht->sourceline = LoadLine(READUINT32(save->p)); + ht->nobosses = READUINT8(save->p); return &ht->thinker; } -static inline thinker_t* LoadLightlevelThinker(actionf_p1 thinker) +static inline thinker_t* LoadLightlevelThinker(savebuffer_t *save, actionf_p1 thinker) { lightlevel_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL); ht->thinker.function.acp1 = thinker; - ht->sector = LoadSector(READUINT32(save_p)); - ht->sourcelevel = READINT16(save_p); - ht->destlevel = READINT16(save_p); - ht->fixedcurlevel = READFIXED(save_p); - ht->fixedpertic = READFIXED(save_p); - ht->timer = READINT32(save_p); + ht->sector = LoadSector(READUINT32(save->p)); + ht->sourcelevel = READINT16(save->p); + ht->destlevel = READINT16(save->p); + ht->fixedcurlevel = READFIXED(save->p); + ht->fixedpertic = READFIXED(save->p); + ht->timer = READINT32(save->p); if (ht->sector) ht->sector->lightingdata = ht; return &ht->thinker; } -static inline thinker_t* LoadExecutorThinker(actionf_p1 thinker) +static inline thinker_t* LoadExecutorThinker(savebuffer_t *save, actionf_p1 thinker) { executor_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL); ht->thinker.function.acp1 = thinker; - ht->line = LoadLine(READUINT32(save_p)); - ht->caller = LoadMobj(READUINT32(save_p)); - ht->sector = LoadSector(READUINT32(save_p)); - ht->timer = READINT32(save_p); + ht->line = LoadLine(READUINT32(save->p)); + ht->caller = LoadMobj(READUINT32(save->p)); + ht->sector = LoadSector(READUINT32(save->p)); + ht->timer = READINT32(save->p); return &ht->thinker; } -static inline thinker_t* LoadDisappearThinker(actionf_p1 thinker) +static inline thinker_t* LoadDisappearThinker(savebuffer_t *save, actionf_p1 thinker) { disappear_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL); ht->thinker.function.acp1 = thinker; - ht->appeartime = READUINT32(save_p); - ht->disappeartime = READUINT32(save_p); - ht->offset = READUINT32(save_p); - ht->timer = READUINT32(save_p); - ht->affectee = READINT32(save_p); - ht->sourceline = READINT32(save_p); - ht->exists = READINT32(save_p); + ht->appeartime = READUINT32(save->p); + ht->disappeartime = READUINT32(save->p); + ht->offset = READUINT32(save->p); + ht->timer = READUINT32(save->p); + ht->affectee = READINT32(save->p); + ht->sourceline = READINT32(save->p); + ht->exists = READINT32(save->p); return &ht->thinker; } -static inline thinker_t* LoadFadeThinker(actionf_p1 thinker) +static inline thinker_t* LoadFadeThinker(savebuffer_t *save, actionf_p1 thinker) { sector_t *ss; fade_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL); ht->thinker.function.acp1 = thinker; - ht->dest_exc = GetNetColormapFromList(READUINT32(save_p)); - ht->sectornum = READUINT32(save_p); - ht->ffloornum = READUINT32(save_p); - ht->alpha = READINT32(save_p); - ht->sourcevalue = READINT16(save_p); - ht->destvalue = READINT16(save_p); - ht->destlightlevel = READINT16(save_p); - ht->speed = READINT16(save_p); - ht->ticbased = (boolean)READUINT8(save_p); - ht->timer = READINT32(save_p); - ht->doexists = READUINT8(save_p); - ht->dotranslucent = READUINT8(save_p); - ht->dolighting = READUINT8(save_p); - ht->docolormap = READUINT8(save_p); - ht->docollision = READUINT8(save_p); - ht->doghostfade = READUINT8(save_p); - ht->exactalpha = READUINT8(save_p); + ht->dest_exc = GetNetColormapFromList(READUINT32(save->p)); + ht->sectornum = READUINT32(save->p); + ht->ffloornum = READUINT32(save->p); + ht->alpha = READINT32(save->p); + ht->sourcevalue = READINT16(save->p); + ht->destvalue = READINT16(save->p); + ht->destlightlevel = READINT16(save->p); + ht->speed = READINT16(save->p); + ht->ticbased = (boolean)READUINT8(save->p); + ht->timer = READINT32(save->p); + ht->doexists = READUINT8(save->p); + ht->dotranslucent = READUINT8(save->p); + ht->dolighting = READUINT8(save->p); + ht->docolormap = READUINT8(save->p); + ht->docollision = READUINT8(save->p); + ht->doghostfade = READUINT8(save->p); + ht->exactalpha = READUINT8(save->p); ss = LoadSector(ht->sectornum); if (ss) @@ -3911,176 +3910,176 @@ static inline thinker_t* LoadFadeThinker(actionf_p1 thinker) return &ht->thinker; } -static inline thinker_t* LoadFadeColormapThinker(actionf_p1 thinker) +static inline thinker_t* LoadFadeColormapThinker(savebuffer_t *save, actionf_p1 thinker) { fadecolormap_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL); ht->thinker.function.acp1 = thinker; - ht->sector = LoadSector(READUINT32(save_p)); - ht->source_exc = GetNetColormapFromList(READUINT32(save_p)); - ht->dest_exc = GetNetColormapFromList(READUINT32(save_p)); - ht->ticbased = (boolean)READUINT8(save_p); - ht->duration = READINT32(save_p); - ht->timer = READINT32(save_p); + ht->sector = LoadSector(READUINT32(save->p)); + ht->source_exc = GetNetColormapFromList(READUINT32(save->p)); + ht->dest_exc = GetNetColormapFromList(READUINT32(save->p)); + ht->ticbased = (boolean)READUINT8(save->p); + ht->duration = READINT32(save->p); + ht->timer = READINT32(save->p); if (ht->sector) ht->sector->fadecolormapdata = ht; return &ht->thinker; } -static inline thinker_t* LoadPlaneDisplaceThinker(actionf_p1 thinker) +static inline thinker_t* LoadPlaneDisplaceThinker(savebuffer_t *save, actionf_p1 thinker) { planedisplace_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL); ht->thinker.function.acp1 = thinker; - ht->affectee = READINT32(save_p); - ht->control = READINT32(save_p); - ht->last_height = READFIXED(save_p); - ht->speed = READFIXED(save_p); - ht->type = READUINT8(save_p); + ht->affectee = READINT32(save->p); + ht->control = READINT32(save->p); + ht->last_height = READFIXED(save->p); + ht->speed = READFIXED(save->p); + ht->type = READUINT8(save->p); return &ht->thinker; } -static inline thinker_t* LoadDynamicLineSlopeThinker(actionf_p1 thinker) +static inline thinker_t* LoadDynamicLineSlopeThinker(savebuffer_t *save, actionf_p1 thinker) { dynlineplanethink_t* ht = Z_Malloc(sizeof(*ht), PU_LEVSPEC, NULL); ht->thinker.function.acp1 = thinker; - ht->type = READUINT8(save_p); - ht->slope = LoadSlope(READUINT32(save_p)); - ht->sourceline = LoadLine(READUINT32(save_p)); - ht->extent = READFIXED(save_p); + ht->type = READUINT8(save->p); + ht->slope = LoadSlope(READUINT32(save->p)); + ht->sourceline = LoadLine(READUINT32(save->p)); + ht->extent = READFIXED(save->p); return &ht->thinker; } -static inline thinker_t* LoadDynamicVertexSlopeThinker(actionf_p1 thinker) +static inline thinker_t* LoadDynamicVertexSlopeThinker(savebuffer_t *save, actionf_p1 thinker) { size_t i; dynvertexplanethink_t* ht = Z_Malloc(sizeof(*ht), PU_LEVSPEC, NULL); ht->thinker.function.acp1 = thinker; - ht->slope = LoadSlope(READUINT32(save_p)); + ht->slope = LoadSlope(READUINT32(save->p)); for (i = 0; i < 3; i++) - ht->secs[i] = LoadSector(READUINT32(save_p)); - READMEM(save_p, ht->vex, sizeof(ht->vex)); - READMEM(save_p, ht->origsecheights, sizeof(ht->origsecheights)); - READMEM(save_p, ht->origvecheights, sizeof(ht->origvecheights)); - ht->relative = READUINT8(save_p); + ht->secs[i] = LoadSector(READUINT32(save->p)); + READMEM(save->p, ht->vex, sizeof(ht->vex)); + READMEM(save->p, ht->origsecheights, sizeof(ht->origsecheights)); + READMEM(save->p, ht->origvecheights, sizeof(ht->origvecheights)); + ht->relative = READUINT8(save->p); return &ht->thinker; } -static inline thinker_t* LoadPolyrotatetThinker(actionf_p1 thinker) +static inline thinker_t* LoadPolyrotatetThinker(savebuffer_t *save, actionf_p1 thinker) { polyrotate_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL); ht->thinker.function.acp1 = thinker; - ht->polyObjNum = READINT32(save_p); - ht->speed = READINT32(save_p); - ht->distance = READINT32(save_p); - ht->turnobjs = READUINT8(save_p); + ht->polyObjNum = READINT32(save->p); + ht->speed = READINT32(save->p); + ht->distance = READINT32(save->p); + ht->turnobjs = READUINT8(save->p); return &ht->thinker; } -static thinker_t* LoadPolymoveThinker(actionf_p1 thinker) +static thinker_t* LoadPolymoveThinker(savebuffer_t *save, actionf_p1 thinker) { polymove_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL); ht->thinker.function.acp1 = thinker; - ht->polyObjNum = READINT32(save_p); - ht->speed = READINT32(save_p); - ht->momx = READFIXED(save_p); - ht->momy = READFIXED(save_p); - ht->distance = READINT32(save_p); - ht->angle = READANGLE(save_p); + ht->polyObjNum = READINT32(save->p); + ht->speed = READINT32(save->p); + ht->momx = READFIXED(save->p); + ht->momy = READFIXED(save->p); + ht->distance = READINT32(save->p); + ht->angle = READANGLE(save->p); return &ht->thinker; } -static inline thinker_t* LoadPolywaypointThinker(actionf_p1 thinker) +static inline thinker_t* LoadPolywaypointThinker(savebuffer_t *save, actionf_p1 thinker) { polywaypoint_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL); ht->thinker.function.acp1 = thinker; - ht->polyObjNum = READINT32(save_p); - ht->speed = READINT32(save_p); - ht->sequence = READINT32(save_p); - ht->pointnum = READINT32(save_p); - ht->direction = READINT32(save_p); - ht->returnbehavior = READUINT8(save_p); - ht->continuous = READUINT8(save_p); - ht->stophere = READUINT8(save_p); + ht->polyObjNum = READINT32(save->p); + ht->speed = READINT32(save->p); + ht->sequence = READINT32(save->p); + ht->pointnum = READINT32(save->p); + ht->direction = READINT32(save->p); + ht->returnbehavior = READUINT8(save->p); + ht->continuous = READUINT8(save->p); + ht->stophere = READUINT8(save->p); return &ht->thinker; } -static inline thinker_t* LoadPolyslidedoorThinker(actionf_p1 thinker) +static inline thinker_t* LoadPolyslidedoorThinker(savebuffer_t *save, actionf_p1 thinker) { polyslidedoor_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL); ht->thinker.function.acp1 = thinker; - ht->polyObjNum = READINT32(save_p); - ht->delay = READINT32(save_p); - ht->delayCount = READINT32(save_p); - ht->initSpeed = READINT32(save_p); - ht->speed = READINT32(save_p); - ht->initDistance = READINT32(save_p); - ht->distance = READINT32(save_p); - ht->initAngle = READUINT32(save_p); - ht->angle = READUINT32(save_p); - ht->revAngle = READUINT32(save_p); - ht->momx = READFIXED(save_p); - ht->momy = READFIXED(save_p); - ht->closing = READUINT8(save_p); + ht->polyObjNum = READINT32(save->p); + ht->delay = READINT32(save->p); + ht->delayCount = READINT32(save->p); + ht->initSpeed = READINT32(save->p); + ht->speed = READINT32(save->p); + ht->initDistance = READINT32(save->p); + ht->distance = READINT32(save->p); + ht->initAngle = READUINT32(save->p); + ht->angle = READUINT32(save->p); + ht->revAngle = READUINT32(save->p); + ht->momx = READFIXED(save->p); + ht->momy = READFIXED(save->p); + ht->closing = READUINT8(save->p); return &ht->thinker; } -static inline thinker_t* LoadPolyswingdoorThinker(actionf_p1 thinker) +static inline thinker_t* LoadPolyswingdoorThinker(savebuffer_t *save, actionf_p1 thinker) { polyswingdoor_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL); ht->thinker.function.acp1 = thinker; - ht->polyObjNum = READINT32(save_p); - ht->delay = READINT32(save_p); - ht->delayCount = READINT32(save_p); - ht->initSpeed = READINT32(save_p); - ht->speed = READINT32(save_p); - ht->initDistance = READINT32(save_p); - ht->distance = READINT32(save_p); - ht->closing = READUINT8(save_p); + ht->polyObjNum = READINT32(save->p); + ht->delay = READINT32(save->p); + ht->delayCount = READINT32(save->p); + ht->initSpeed = READINT32(save->p); + ht->speed = READINT32(save->p); + ht->initDistance = READINT32(save->p); + ht->distance = READINT32(save->p); + ht->closing = READUINT8(save->p); return &ht->thinker; } -static inline thinker_t* LoadPolydisplaceThinker(actionf_p1 thinker) +static inline thinker_t* LoadPolydisplaceThinker(savebuffer_t *save, actionf_p1 thinker) { polydisplace_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL); ht->thinker.function.acp1 = thinker; - ht->polyObjNum = READINT32(save_p); - ht->controlSector = LoadSector(READUINT32(save_p)); - ht->dx = READFIXED(save_p); - ht->dy = READFIXED(save_p); - ht->oldHeights = READFIXED(save_p); + ht->polyObjNum = READINT32(save->p); + ht->controlSector = LoadSector(READUINT32(save->p)); + ht->dx = READFIXED(save->p); + ht->dy = READFIXED(save->p); + ht->oldHeights = READFIXED(save->p); return &ht->thinker; } -static inline thinker_t* LoadPolyrotdisplaceThinker(actionf_p1 thinker) +static inline thinker_t* LoadPolyrotdisplaceThinker(savebuffer_t *save, actionf_p1 thinker) { polyrotdisplace_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL); ht->thinker.function.acp1 = thinker; - ht->polyObjNum = READINT32(save_p); - ht->controlSector = LoadSector(READUINT32(save_p)); - ht->rotscale = READFIXED(save_p); - ht->turnobjs = READUINT8(save_p); - ht->oldHeights = READFIXED(save_p); + ht->polyObjNum = READINT32(save->p); + ht->controlSector = LoadSector(READUINT32(save->p)); + ht->rotscale = READFIXED(save->p); + ht->turnobjs = READUINT8(save->p); + ht->oldHeights = READFIXED(save->p); return &ht->thinker; } -static thinker_t* LoadPolyfadeThinker(actionf_p1 thinker) +static thinker_t* LoadPolyfadeThinker(savebuffer_t *save, actionf_p1 thinker) { polyfade_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL); ht->thinker.function.acp1 = thinker; - ht->polyObjNum = READINT32(save_p); - ht->sourcevalue = READINT32(save_p); - ht->destvalue = READINT32(save_p); - ht->docollision = (boolean)READUINT8(save_p); - ht->doghostfade = (boolean)READUINT8(save_p); - ht->ticbased = (boolean)READUINT8(save_p); - ht->duration = READINT32(save_p); - ht->timer = READINT32(save_p); + ht->polyObjNum = READINT32(save->p); + ht->sourcevalue = READINT32(save->p); + ht->destvalue = READINT32(save->p); + ht->docollision = (boolean)READUINT8(save->p); + ht->doghostfade = (boolean)READUINT8(save->p); + ht->ticbased = (boolean)READUINT8(save->p); + ht->duration = READINT32(save->p); + ht->timer = READINT32(save->p); return &ht->thinker; } -static void P_NetUnArchiveThinkers(void) +static void P_NetUnArchiveThinkers(savebuffer_t *save) { thinker_t *currentthinker; thinker_t *next; @@ -4089,7 +4088,7 @@ static void P_NetUnArchiveThinkers(void) UINT32 i; UINT32 numloaded = 0; - if (READUINT32(save_p) != ARCHIVEBLOCK_THINKERS) + if (READUINT32(save->p) != ARCHIVEBLOCK_THINKERS) I_Error("Bad $$$.sav at archive block Thinkers"); // remove all the current thinkers @@ -4127,7 +4126,7 @@ static void P_NetUnArchiveThinkers(void) for (;;) { thinker_t* th = NULL; - tclass = READUINT8(save_p); + tclass = READUINT8(save->p); if (tclass == tc_end) break; // leave the saved thinker reading loop @@ -4136,167 +4135,167 @@ static void P_NetUnArchiveThinkers(void) switch (tclass) { case tc_mobj: - th = LoadMobjThinker((actionf_p1)P_MobjThinker); + th = LoadMobjThinker(save, (actionf_p1)P_MobjThinker); break; case tc_ceiling: - th = LoadCeilingThinker((actionf_p1)T_MoveCeiling); + th = LoadCeilingThinker(save, (actionf_p1)T_MoveCeiling); break; case tc_crushceiling: - th = LoadCeilingThinker((actionf_p1)T_CrushCeiling); + th = LoadCeilingThinker(save, (actionf_p1)T_CrushCeiling); break; case tc_floor: - th = LoadFloormoveThinker((actionf_p1)T_MoveFloor); + th = LoadFloormoveThinker(save, (actionf_p1)T_MoveFloor); break; case tc_flash: - th = LoadLightflashThinker((actionf_p1)T_LightningFlash); + th = LoadLightflashThinker(save, (actionf_p1)T_LightningFlash); break; case tc_strobe: - th = LoadStrobeThinker((actionf_p1)T_StrobeFlash); + th = LoadStrobeThinker(save, (actionf_p1)T_StrobeFlash); break; case tc_glow: - th = LoadGlowThinker((actionf_p1)T_Glow); + th = LoadGlowThinker(save, (actionf_p1)T_Glow); break; case tc_fireflicker: - th = LoadFireflickerThinker((actionf_p1)T_FireFlicker); + th = LoadFireflickerThinker(save, (actionf_p1)T_FireFlicker); break; case tc_elevator: - th = LoadElevatorThinker((actionf_p1)T_MoveElevator, true); + th = LoadElevatorThinker(save, (actionf_p1)T_MoveElevator, true); break; case tc_continuousfalling: - th = LoadContinuousFallThinker((actionf_p1)T_ContinuousFalling); + th = LoadContinuousFallThinker(save, (actionf_p1)T_ContinuousFalling); break; case tc_thwomp: - th = LoadThwompThinker((actionf_p1)T_ThwompSector); + th = LoadThwompThinker(save, (actionf_p1)T_ThwompSector); break; case tc_noenemies: - th = LoadNoEnemiesThinker((actionf_p1)T_NoEnemiesSector); + th = LoadNoEnemiesThinker(save, (actionf_p1)T_NoEnemiesSector); break; case tc_eachtime: - th = LoadEachTimeThinker((actionf_p1)T_EachTimeThinker); + th = LoadEachTimeThinker(save, (actionf_p1)T_EachTimeThinker); break; case tc_raisesector: - th = LoadRaiseThinker((actionf_p1)T_RaiseSector); + th = LoadRaiseThinker(save, (actionf_p1)T_RaiseSector); break; case tc_camerascanner: - th = LoadElevatorThinker((actionf_p1)T_CameraScanner, false); + th = LoadElevatorThinker(save, (actionf_p1)T_CameraScanner, false); break; case tc_bouncecheese: - th = LoadBounceCheeseThinker((actionf_p1)T_BounceCheese); + th = LoadBounceCheeseThinker(save, (actionf_p1)T_BounceCheese); break; case tc_startcrumble: - th = LoadCrumbleThinker((actionf_p1)T_StartCrumble); + th = LoadCrumbleThinker(save, (actionf_p1)T_StartCrumble); break; case tc_marioblock: - th = LoadMarioBlockThinker((actionf_p1)T_MarioBlock); + th = LoadMarioBlockThinker(save, (actionf_p1)T_MarioBlock); break; case tc_marioblockchecker: - th = LoadMarioCheckThinker((actionf_p1)T_MarioBlockChecker); + th = LoadMarioCheckThinker(save, (actionf_p1)T_MarioBlockChecker); break; case tc_floatsector: - th = LoadFloatThinker((actionf_p1)T_FloatSector); + th = LoadFloatThinker(save, (actionf_p1)T_FloatSector); break; case tc_laserflash: - th = LoadLaserThinker((actionf_p1)T_LaserFlash); + th = LoadLaserThinker(save, (actionf_p1)T_LaserFlash); break; case tc_lightfade: - th = LoadLightlevelThinker((actionf_p1)T_LightFade); + th = LoadLightlevelThinker(save, (actionf_p1)T_LightFade); break; case tc_executor: - th = LoadExecutorThinker((actionf_p1)T_ExecutorDelay); + th = LoadExecutorThinker(save, (actionf_p1)T_ExecutorDelay); restoreNum = true; break; case tc_disappear: - th = LoadDisappearThinker((actionf_p1)T_Disappear); + th = LoadDisappearThinker(save, (actionf_p1)T_Disappear); break; case tc_fade: - th = LoadFadeThinker((actionf_p1)T_Fade); + th = LoadFadeThinker(save, (actionf_p1)T_Fade); break; case tc_fadecolormap: - th = LoadFadeColormapThinker((actionf_p1)T_FadeColormap); + th = LoadFadeColormapThinker(save, (actionf_p1)T_FadeColormap); break; case tc_planedisplace: - th = LoadPlaneDisplaceThinker((actionf_p1)T_PlaneDisplace); + th = LoadPlaneDisplaceThinker(save, (actionf_p1)T_PlaneDisplace); break; case tc_polyrotate: - th = LoadPolyrotatetThinker((actionf_p1)T_PolyObjRotate); + th = LoadPolyrotatetThinker(save, (actionf_p1)T_PolyObjRotate); break; case tc_polymove: - th = LoadPolymoveThinker((actionf_p1)T_PolyObjMove); + th = LoadPolymoveThinker(save, (actionf_p1)T_PolyObjMove); break; case tc_polywaypoint: - th = LoadPolywaypointThinker((actionf_p1)T_PolyObjWaypoint); + th = LoadPolywaypointThinker(save, (actionf_p1)T_PolyObjWaypoint); break; case tc_polyslidedoor: - th = LoadPolyslidedoorThinker((actionf_p1)T_PolyDoorSlide); + th = LoadPolyslidedoorThinker(save, (actionf_p1)T_PolyDoorSlide); break; case tc_polyswingdoor: - th = LoadPolyswingdoorThinker((actionf_p1)T_PolyDoorSwing); + th = LoadPolyswingdoorThinker(save, (actionf_p1)T_PolyDoorSwing); break; case tc_polyflag: - th = LoadPolymoveThinker((actionf_p1)T_PolyObjFlag); + th = LoadPolymoveThinker(save, (actionf_p1)T_PolyObjFlag); break; case tc_polydisplace: - th = LoadPolydisplaceThinker((actionf_p1)T_PolyObjDisplace); + th = LoadPolydisplaceThinker(save, (actionf_p1)T_PolyObjDisplace); break; case tc_polyrotdisplace: - th = LoadPolyrotdisplaceThinker((actionf_p1)T_PolyObjRotDisplace); + th = LoadPolyrotdisplaceThinker(save, (actionf_p1)T_PolyObjRotDisplace); break; case tc_polyfade: - th = LoadPolyfadeThinker((actionf_p1)T_PolyObjFade); + th = LoadPolyfadeThinker(save, (actionf_p1)T_PolyObjFade); break; case tc_dynslopeline: - th = LoadDynamicLineSlopeThinker((actionf_p1)T_DynamicSlopeLine); + th = LoadDynamicLineSlopeThinker(save, (actionf_p1)T_DynamicSlopeLine); break; case tc_dynslopevert: - th = LoadDynamicVertexSlopeThinker((actionf_p1)T_DynamicSlopeVert); + th = LoadDynamicVertexSlopeThinker(save, (actionf_p1)T_DynamicSlopeVert); break; case tc_scroll: - th = LoadScrollThinker((actionf_p1)T_Scroll); + th = LoadScrollThinker(save, (actionf_p1)T_Scroll); break; case tc_friction: - th = LoadFrictionThinker((actionf_p1)T_Friction); + th = LoadFrictionThinker(save, (actionf_p1)T_Friction); break; case tc_pusher: - th = LoadPusherThinker((actionf_p1)T_Pusher); + th = LoadPusherThinker(save, (actionf_p1)T_Pusher); break; default: @@ -4332,29 +4331,29 @@ static void P_NetUnArchiveThinkers(void) #define PD_FLAGS 0x01 #define PD_TRANS 0x02 -static inline void P_ArchivePolyObj(polyobj_t *po) +static inline void P_ArchivePolyObj(savebuffer_t *save, polyobj_t *po) { UINT8 diff = 0; - WRITEINT32(save_p, po->id); - WRITEANGLE(save_p, po->angle); + WRITEINT32(save->p, po->id); + WRITEANGLE(save->p, po->angle); - WRITEFIXED(save_p, po->spawnSpot.x); - WRITEFIXED(save_p, po->spawnSpot.y); + WRITEFIXED(save->p, po->spawnSpot.x); + WRITEFIXED(save->p, po->spawnSpot.y); if (po->flags != po->spawnflags) diff |= PD_FLAGS; if (po->translucency != po->spawntrans) diff |= PD_TRANS; - WRITEUINT8(save_p, diff); + WRITEUINT8(save->p, diff); if (diff & PD_FLAGS) - WRITEINT32(save_p, po->flags); + WRITEINT32(save->p, po->flags); if (diff & PD_TRANS) - WRITEINT32(save_p, po->translucency); + WRITEINT32(save->p, po->translucency); } -static inline void P_UnArchivePolyObj(polyobj_t *po) +static inline void P_UnArchivePolyObj(savebuffer_t *save, polyobj_t *po) { INT32 id; UINT32 angle; @@ -4366,19 +4365,19 @@ static inline void P_UnArchivePolyObj(polyobj_t *po) // when they first start to run. po->thinker = NULL; - id = READINT32(save_p); + id = READINT32(save->p); - angle = READANGLE(save_p); + angle = READANGLE(save->p); - x = READFIXED(save_p); - y = READFIXED(save_p); + x = READFIXED(save->p); + y = READFIXED(save->p); - diff = READUINT8(save_p); + diff = READUINT8(save->p); if (diff & PD_FLAGS) - po->flags = READINT32(save_p); + po->flags = READINT32(save->p); if (diff & PD_TRANS) - po->translucency = READINT32(save_p); + po->translucency = READINT32(save->p); // if the object is bad or isn't in the id hash, we can do nothing more // with it, so return now @@ -4389,33 +4388,33 @@ static inline void P_UnArchivePolyObj(polyobj_t *po) Polyobj_MoveOnLoad(po, angle, x, y); } -static inline void P_ArchivePolyObjects(void) +static inline void P_ArchivePolyObjects(savebuffer_t *save) { INT32 i; - WRITEUINT32(save_p, ARCHIVEBLOCK_POBJS); + WRITEUINT32(save->p, ARCHIVEBLOCK_POBJS); // save number of polyobjects - WRITEINT32(save_p, numPolyObjects); + WRITEINT32(save->p, numPolyObjects); for (i = 0; i < numPolyObjects; ++i) - P_ArchivePolyObj(&PolyObjects[i]); + P_ArchivePolyObj(save, &PolyObjects[i]); } -static inline void P_UnArchivePolyObjects(void) +static inline void P_UnArchivePolyObjects(savebuffer_t *save) { INT32 i, numSavedPolys; - if (READUINT32(save_p) != ARCHIVEBLOCK_POBJS) + if (READUINT32(save->p) != ARCHIVEBLOCK_POBJS) I_Error("Bad $$$.sav at archive block Pobjs"); - numSavedPolys = READINT32(save_p); + numSavedPolys = READINT32(save->p); if (numSavedPolys != numPolyObjects) I_Error("P_UnArchivePolyObjects: polyobj count inconsistency\n"); for (i = 0; i < numSavedPolys; ++i) - P_UnArchivePolyObj(&PolyObjects[i]); + P_UnArchivePolyObj(save, &PolyObjects[i]); } static inline void P_FinishMobjs(void) @@ -4586,11 +4585,11 @@ static void P_RelinkPointers(void) } } -static inline void P_NetArchiveSpecials(void) +static inline void P_NetArchiveSpecials(savebuffer_t *save) { size_t i, z; - WRITEUINT32(save_p, ARCHIVEBLOCK_SPECIALS); + WRITEUINT32(save->p, ARCHIVEBLOCK_SPECIALS); // itemrespawn queue for deathmatch i = iquetail; @@ -4600,53 +4599,53 @@ static inline void P_NetArchiveSpecials(void) { if (&mapthings[z] == itemrespawnque[i]) { - WRITEUINT32(save_p, z); + WRITEUINT32(save->p, z); break; } } - WRITEUINT32(save_p, itemrespawntime[i]); + WRITEUINT32(save->p, itemrespawntime[i]); i = (i + 1) & (ITEMQUESIZE-1); } // end delimiter - WRITEUINT32(save_p, 0xffffffff); + WRITEUINT32(save->p, 0xffffffff); // Sky number - WRITESTRINGN(save_p, globallevelskytexture, 9); + WRITESTRINGN(save->p, globallevelskytexture, 9); // Current global weather type - WRITEUINT8(save_p, globalweather); + WRITEUINT8(save->p, globalweather); if (metalplayback) // Is metal sonic running? { - WRITEUINT8(save_p, 0x01); - G_SaveMetal(&save_p); + WRITEUINT8(save->p, 0x01); + G_SaveMetal(&save->p); } else - WRITEUINT8(save_p, 0x00); + WRITEUINT8(save->p, 0x00); } -static void P_NetUnArchiveSpecials(void) +static void P_NetUnArchiveSpecials(savebuffer_t *save) { char skytex[9]; size_t i; - if (READUINT32(save_p) != ARCHIVEBLOCK_SPECIALS) + if (READUINT32(save->p) != ARCHIVEBLOCK_SPECIALS) I_Error("Bad $$$.sav at archive block Specials"); // BP: added save itemrespawn queue for deathmatch iquetail = iquehead = 0; - while ((i = READUINT32(save_p)) != 0xffffffff) + while ((i = READUINT32(save->p)) != 0xffffffff) { itemrespawnque[iquehead] = &mapthings[i]; - itemrespawntime[iquehead++] = READINT32(save_p); + itemrespawntime[iquehead++] = READINT32(save->p); } - READSTRINGN(save_p, skytex, sizeof(skytex)); + READSTRINGN(save->p, skytex, sizeof(skytex)); if (strcmp(skytex, globallevelskytexture)) P_SetupLevelSky(skytex, true); - globalweather = READUINT8(save_p); + globalweather = READUINT8(save->p); if (globalweather) { @@ -4661,14 +4660,14 @@ static void P_NetUnArchiveSpecials(void) P_SwitchWeather(globalweather); } - if (READUINT8(save_p) == 0x01) // metal sonic - G_LoadMetal(&save_p); + if (READUINT8(save->p) == 0x01) // metal sonic + G_LoadMetal(&save->p); } // ======================================================================= // Misc // ======================================================================= -static inline void P_ArchiveMisc(INT16 mapnum) +static inline void P_ArchiveMisc(savebuffer_t *save, INT16 mapnum) { //lastmapsaved = mapnum; lastmaploaded = mapnum; @@ -4676,16 +4675,16 @@ static inline void P_ArchiveMisc(INT16 mapnum) if (gamecomplete) mapnum |= 8192; - WRITEINT16(save_p, mapnum); - WRITEUINT16(save_p, emeralds+357); - WRITESTRINGN(save_p, timeattackfolder, sizeof(timeattackfolder)); + WRITEINT16(save->p, mapnum); + WRITEUINT16(save->p, emeralds+357); + WRITESTRINGN(save->p, timeattackfolder, sizeof(timeattackfolder)); } -static inline void P_UnArchiveSPGame(INT16 mapoverride) +static inline void P_UnArchiveSPGame(savebuffer_t *save, INT16 mapoverride) { char testname[sizeof(timeattackfolder)]; - gamemap = READINT16(save_p); + gamemap = READINT16(save->p); if (mapoverride != 0) { @@ -4703,9 +4702,9 @@ static inline void P_UnArchiveSPGame(INT16 mapoverride) //lastmapsaved = gamemap; lastmaploaded = gamemap; - savedata.emeralds = READUINT16(save_p)-357; + savedata.emeralds = READUINT16(save->p)-357; - READSTRINGN(save_p, testname, sizeof(testname)); + READSTRINGN(save->p, testname, sizeof(testname)); if (strcmp(testname, timeattackfolder)) { @@ -4719,27 +4718,27 @@ static inline void P_UnArchiveSPGame(INT16 mapoverride) playeringame[consoleplayer] = true; } -static void P_NetArchiveMisc(boolean resending) +static void P_NetArchiveMisc(savebuffer_t *save, boolean resending) { size_t i, j; - WRITEUINT32(save_p, ARCHIVEBLOCK_MISC); + WRITEUINT32(save->p, ARCHIVEBLOCK_MISC); if (resending) - WRITEUINT32(save_p, gametic); - WRITEINT16(save_p, gamemap); + WRITEUINT32(save->p, gametic); + WRITEINT16(save->p, gamemap); if (gamestate != GS_LEVEL) - WRITEINT16(save_p, GS_WAITINGPLAYERS); // nice hack to put people back into waitingplayers + WRITEINT16(save->p, GS_WAITINGPLAYERS); // nice hack to put people back into waitingplayers else - WRITEINT16(save_p, gamestate); - WRITEINT16(save_p, gametype); + WRITEINT16(save->p, gamestate); + WRITEINT16(save->p, gametype); { UINT32 pig = 0; for (i = 0; i < MAXPLAYERS; i++) pig |= (playeringame[i] != 0)<p, pig); } for (i = 0; i < MAXUNLOCKABLES;) @@ -4747,143 +4746,142 @@ static void P_NetArchiveMisc(boolean resending) UINT8 btemp = 0; for (j = 0; j < 8 && j+i < MAXUNLOCKABLES; ++j) btemp |= (netUnlocked[j+i] << j); - WRITEUINT8(save_p, btemp); + WRITEUINT8(save->p, btemp); i += j; } - WRITEUINT8(save_p, encoremode); + WRITEUINT8(save->p, encoremode); - WRITEUINT32(save_p, leveltime); - WRITEINT16(save_p, lastmap); - WRITEUINT16(save_p, bossdisabled); + WRITEUINT32(save->p, leveltime); + WRITEINT16(save->p, lastmap); + WRITEUINT16(save->p, bossdisabled); for (i = 0; i < 4; i++) { - WRITEINT16(save_p, votelevels[i][0]); - WRITEINT16(save_p, votelevels[i][1]); + WRITEINT16(save->p, votelevels[i][0]); + WRITEINT16(save->p, votelevels[i][1]); } for (i = 0; i < MAXPLAYERS; i++) - WRITESINT8(save_p, votes[i]); + WRITESINT8(save->p, votes[i]); - WRITESINT8(save_p, pickedvote); + WRITESINT8(save->p, pickedvote); - WRITEUINT16(save_p, emeralds); + WRITEUINT16(save->p, emeralds); { UINT8 globools = 0; if (stagefailed) globools |= 1; if (stoppedclock) globools |= (1<<1); - WRITEUINT8(save_p, globools); + WRITEUINT8(save->p, globools); } - WRITEUINT32(save_p, bluescore); - WRITEUINT32(save_p, redscore); + WRITEUINT32(save->p, bluescore); + WRITEUINT32(save->p, redscore); - WRITEUINT16(save_p, skincolor_redteam); - WRITEUINT16(save_p, skincolor_blueteam); - WRITEUINT16(save_p, skincolor_redring); - WRITEUINT16(save_p, skincolor_bluering); + WRITEUINT16(save->p, skincolor_redteam); + WRITEUINT16(save->p, skincolor_blueteam); + WRITEUINT16(save->p, skincolor_redring); + WRITEUINT16(save->p, skincolor_bluering); - WRITEINT32(save_p, modulothing); + WRITEINT32(save->p, modulothing); - WRITEINT16(save_p, autobalance); - WRITEINT16(save_p, teamscramble); + WRITEINT16(save->p, autobalance); + WRITEINT16(save->p, teamscramble); for (i = 0; i < MAXPLAYERS; i++) - WRITEINT16(save_p, scrambleplayers[i]); + WRITEINT16(save->p, scrambleplayers[i]); for (i = 0; i < MAXPLAYERS; i++) - WRITEINT16(save_p, scrambleteams[i]); + WRITEINT16(save->p, scrambleteams[i]); - WRITEINT16(save_p, scrambletotal); - WRITEINT16(save_p, scramblecount); + WRITEINT16(save->p, scrambletotal); + WRITEINT16(save->p, scramblecount); - WRITEUINT32(save_p, racecountdown); - WRITEUINT32(save_p, exitcountdown); + WRITEUINT32(save->p, racecountdown); + WRITEUINT32(save->p, exitcountdown); - WRITEFIXED(save_p, gravity); - WRITEFIXED(save_p, mapobjectscale); + WRITEFIXED(save->p, gravity); + WRITEFIXED(save->p, mapobjectscale); // SRB2kart - WRITEINT32(save_p, numgotboxes); - WRITEUINT8(save_p, numtargets); - WRITEUINT8(save_p, battlecapsules); + WRITEINT32(save->p, numgotboxes); + WRITEUINT8(save->p, numtargets); + WRITEUINT8(save->p, battlecapsules); - WRITEUINT8(save_p, gamespeed); - WRITEUINT8(save_p, numlaps); - WRITEUINT8(save_p, franticitems); + WRITEUINT8(save->p, gamespeed); + WRITEUINT8(save->p, numlaps); + WRITEUINT8(save->p, franticitems); - WRITESINT8(save_p, speedscramble); - WRITESINT8(save_p, encorescramble); + WRITESINT8(save->p, speedscramble); + WRITESINT8(save->p, encorescramble); for (i = 0; i < 4; i++) - WRITESINT8(save_p, battlewanted[i]); + WRITESINT8(save->p, battlewanted[i]); // battleovertime_t - WRITEUINT16(save_p, battleovertime.enabled); - WRITEFIXED(save_p, battleovertime.radius); - WRITEFIXED(save_p, battleovertime.x); - WRITEFIXED(save_p, battleovertime.y); - WRITEFIXED(save_p, battleovertime.z); + WRITEUINT16(save->p, battleovertime.enabled); + WRITEFIXED(save->p, battleovertime.radius); + WRITEFIXED(save->p, battleovertime.x); + WRITEFIXED(save->p, battleovertime.y); + WRITEFIXED(save->p, battleovertime.z); - WRITEUINT32(save_p, wantedcalcdelay); + WRITEUINT32(save->p, wantedcalcdelay); for (i = 0; i < NUMKARTITEMS-1; i++) - WRITEUINT32(save_p, itemCooldowns[i]); - WRITEUINT32(save_p, mapreset); + WRITEUINT32(save->p, itemCooldowns[i]); + WRITEUINT32(save->p, mapreset); - WRITEUINT8(save_p, spectateGriefed); + WRITEUINT8(save->p, spectateGriefed); - WRITEUINT8(save_p, thwompsactive); - WRITEUINT8(save_p, lastLowestLap); - WRITESINT8(save_p, spbplace); - WRITEUINT8(save_p, rainbowstartavailable); - WRITEUINT8(save_p, inDuel); + WRITEUINT8(save->p, thwompsactive); + WRITEUINT8(save->p, lastLowestLap); + WRITESINT8(save->p, spbplace); + WRITEUINT8(save->p, rainbowstartavailable); + WRITEUINT8(save->p, inDuel); - WRITEUINT32(save_p, introtime); - WRITEUINT32(save_p, starttime); - WRITEUINT8(save_p, numbulbs); + WRITEUINT32(save->p, introtime); + WRITEUINT32(save->p, starttime); + WRITEUINT8(save->p, numbulbs); - WRITEUINT32(save_p, timelimitintics); - WRITEUINT32(save_p, extratimeintics); - WRITEUINT32(save_p, secretextratime); + WRITEUINT32(save->p, timelimitintics); + WRITEUINT32(save->p, extratimeintics); + WRITEUINT32(save->p, secretextratime); // Is it paused? if (paused) - WRITEUINT8(save_p, 0x2f); + WRITEUINT8(save->p, 0x2f); else - WRITEUINT8(save_p, 0x2e); + WRITEUINT8(save->p, 0x2e); - WRITEUINT32(save_p, livestudioaudience_timer); + WRITEUINT32(save->p, livestudioaudience_timer); // Only the server uses this, but it // needs synched for remote admins anyway. - WRITEUINT32(save_p, schedule_len); + WRITEUINT32(save->p, schedule_len); for (i = 0; i < schedule_len; i++) { scheduleTask_t *task = schedule[i]; - WRITEINT16(save_p, task->basetime); - WRITEINT16(save_p, task->timer); - WRITESTRING(save_p, task->command); + WRITEINT16(save->p, task->basetime); + WRITEINT16(save->p, task->timer); + WRITESTRING(save->p, task->command); } - WRITEUINT32(save_p, cht_debug); + WRITEUINT32(save->p, cht_debug); } -static inline boolean P_NetUnArchiveMisc(boolean reloading) +static inline boolean P_NetUnArchiveMisc(savebuffer_t *save, boolean reloading) { size_t i, j; size_t numTasks; - UINT8 *old_save_p; - if (READUINT32(save_p) != ARCHIVEBLOCK_MISC) + if (READUINT32(save->p) != ARCHIVEBLOCK_MISC) I_Error("Bad $$$.sav at archive block Misc"); if (reloading) - gametic = READUINT32(save_p); + gametic = READUINT32(save->p); - gamemap = READINT16(save_p); + gamemap = READINT16(save->p); // gamemap changed; we assume that its map header is always valid, // so make it so @@ -4895,12 +4893,12 @@ static inline boolean P_NetUnArchiveMisc(boolean reloading) if (!reloading) mapmusflags |= MUSIC_RELOADRESET; - G_SetGamestate(READINT16(save_p)); + G_SetGamestate(READINT16(save->p)); - gametype = READINT16(save_p); + gametype = READINT16(save->p); { - UINT32 pig = READUINT32(save_p); + UINT32 pig = READUINT32(save->p); for (i = 0; i < MAXPLAYERS; i++) { playeringame[i] = (pig & (1<p); for (j = 0; j < 8 && j+i < MAXUNLOCKABLES; ++j) netUnlocked[j+i] = ((rtemp >> j) & 1); i += j; } - encoremode = (boolean)READUINT8(save_p); - - // FIXME: save_p should not be global!!! - old_save_p = save_p; + encoremode = (boolean)READUINT8(save->p); if (!P_LoadLevel(true, reloading)) { @@ -4927,132 +4922,130 @@ static inline boolean P_NetUnArchiveMisc(boolean reloading) return false; } - save_p = old_save_p; - // get the time - leveltime = READUINT32(save_p); - lastmap = READINT16(save_p); - bossdisabled = READUINT16(save_p); + leveltime = READUINT32(save->p); + lastmap = READINT16(save->p); + bossdisabled = READUINT16(save->p); for (i = 0; i < 4; i++) { - votelevels[i][0] = READINT16(save_p); - votelevels[i][1] = READINT16(save_p); + votelevels[i][0] = READINT16(save->p); + votelevels[i][1] = READINT16(save->p); } for (i = 0; i < MAXPLAYERS; i++) - votes[i] = READSINT8(save_p); + votes[i] = READSINT8(save->p); - pickedvote = READSINT8(save_p); + pickedvote = READSINT8(save->p); - emeralds = READUINT16(save_p); + emeralds = READUINT16(save->p); { - UINT8 globools = READUINT8(save_p); + UINT8 globools = READUINT8(save->p); stagefailed = !!(globools & 1); stoppedclock = !!(globools & (1<<1)); } - bluescore = READUINT32(save_p); - redscore = READUINT32(save_p); + bluescore = READUINT32(save->p); + redscore = READUINT32(save->p); - skincolor_redteam = READUINT16(save_p); - skincolor_blueteam = READUINT16(save_p); - skincolor_redring = READUINT16(save_p); - skincolor_bluering = READUINT16(save_p); + skincolor_redteam = READUINT16(save->p); + skincolor_blueteam = READUINT16(save->p); + skincolor_redring = READUINT16(save->p); + skincolor_bluering = READUINT16(save->p); - modulothing = READINT32(save_p); + modulothing = READINT32(save->p); - autobalance = READINT16(save_p); - teamscramble = READINT16(save_p); + autobalance = READINT16(save->p); + teamscramble = READINT16(save->p); for (i = 0; i < MAXPLAYERS; i++) - scrambleplayers[i] = READINT16(save_p); + scrambleplayers[i] = READINT16(save->p); for (i = 0; i < MAXPLAYERS; i++) - scrambleteams[i] = READINT16(save_p); + scrambleteams[i] = READINT16(save->p); - scrambletotal = READINT16(save_p); - scramblecount = READINT16(save_p); + scrambletotal = READINT16(save->p); + scramblecount = READINT16(save->p); - racecountdown = READUINT32(save_p); - exitcountdown = READUINT32(save_p); + racecountdown = READUINT32(save->p); + exitcountdown = READUINT32(save->p); - gravity = READFIXED(save_p); - mapobjectscale = READFIXED(save_p); + gravity = READFIXED(save->p); + mapobjectscale = READFIXED(save->p); // SRB2kart - numgotboxes = READINT32(save_p); - numtargets = READUINT8(save_p); - battlecapsules = (boolean)READUINT8(save_p); + numgotboxes = READINT32(save->p); + numtargets = READUINT8(save->p); + battlecapsules = (boolean)READUINT8(save->p); - gamespeed = READUINT8(save_p); - numlaps = READUINT8(save_p); - franticitems = (boolean)READUINT8(save_p); + gamespeed = READUINT8(save->p); + numlaps = READUINT8(save->p); + franticitems = (boolean)READUINT8(save->p); - speedscramble = READSINT8(save_p); - encorescramble = READSINT8(save_p); + speedscramble = READSINT8(save->p); + encorescramble = READSINT8(save->p); for (i = 0; i < 4; i++) - battlewanted[i] = READSINT8(save_p); + battlewanted[i] = READSINT8(save->p); // battleovertime_t - battleovertime.enabled = READUINT16(save_p); - battleovertime.radius = READFIXED(save_p); - battleovertime.x = READFIXED(save_p); - battleovertime.y = READFIXED(save_p); - battleovertime.z = READFIXED(save_p); + battleovertime.enabled = READUINT16(save->p); + battleovertime.radius = READFIXED(save->p); + battleovertime.x = READFIXED(save->p); + battleovertime.y = READFIXED(save->p); + battleovertime.z = READFIXED(save->p); - wantedcalcdelay = READUINT32(save_p); + wantedcalcdelay = READUINT32(save->p); for (i = 0; i < NUMKARTITEMS-1; i++) - itemCooldowns[i] = READUINT32(save_p); - mapreset = READUINT32(save_p); + itemCooldowns[i] = READUINT32(save->p); + mapreset = READUINT32(save->p); - spectateGriefed = READUINT8(save_p); + spectateGriefed = READUINT8(save->p); - thwompsactive = (boolean)READUINT8(save_p); - lastLowestLap = READUINT8(save_p); - spbplace = READSINT8(save_p); - rainbowstartavailable = (boolean)READUINT8(save_p); - inDuel = (boolean)READUINT8(save_p); + thwompsactive = (boolean)READUINT8(save->p); + lastLowestLap = READUINT8(save->p); + spbplace = READSINT8(save->p); + rainbowstartavailable = (boolean)READUINT8(save->p); + inDuel = (boolean)READUINT8(save->p); - introtime = READUINT32(save_p); - starttime = READUINT32(save_p); - numbulbs = READUINT8(save_p); + introtime = READUINT32(save->p); + starttime = READUINT32(save->p); + numbulbs = READUINT8(save->p); - timelimitintics = READUINT32(save_p); - extratimeintics = READUINT32(save_p); - secretextratime = READUINT32(save_p); + timelimitintics = READUINT32(save->p); + extratimeintics = READUINT32(save->p); + secretextratime = READUINT32(save->p); // Is it paused? - if (READUINT8(save_p) == 0x2f) + if (READUINT8(save->p) == 0x2f) paused = true; - livestudioaudience_timer = READUINT32(save_p); + livestudioaudience_timer = READUINT32(save->p); // Only the server uses this, but it // needs synched for remote admins anyway. Schedule_Clear(); - numTasks = READUINT32(save_p); + numTasks = READUINT32(save->p); for (i = 0; i < numTasks; i++) { INT16 basetime; INT16 timer; char command[MAXTEXTCMD]; - basetime = READINT16(save_p); - timer = READINT16(save_p); - READSTRING(save_p, command); + basetime = READINT16(save->p); + timer = READINT16(save->p); + READSTRING(save->p, command); Schedule_Add(basetime, timer, command); } - cht_debug = READUINT32(save_p); + cht_debug = READUINT32(save->p); return true; } -static inline void P_ArchiveLuabanksAndConsistency(void) +static inline void P_ArchiveLuabanksAndConsistency(savebuffer_t *save) { UINT8 i, banksinuse = NUM_LUABANKS; @@ -5061,30 +5054,30 @@ static inline void P_ArchiveLuabanksAndConsistency(void) if (banksinuse) { - WRITEUINT8(save_p, 0xb7); // luabanks marker - WRITEUINT8(save_p, banksinuse); + WRITEUINT8(save->p, 0xb7); // luabanks marker + WRITEUINT8(save->p, banksinuse); for (i = 0; i < banksinuse; i++) - WRITEINT32(save_p, luabanks[i]); + WRITEINT32(save->p, luabanks[i]); } - WRITEUINT8(save_p, 0x1d); // consistency marker + WRITEUINT8(save->p, 0x1d); // consistency marker } -static inline boolean P_UnArchiveLuabanksAndConsistency(void) +static inline boolean P_UnArchiveLuabanksAndConsistency(savebuffer_t *save) { - switch (READUINT8(save_p)) + switch (READUINT8(save->p)) { case 0xb7: // luabanks marker { - UINT8 i, banksinuse = READUINT8(save_p); + UINT8 i, banksinuse = READUINT8(save->p); if (banksinuse > NUM_LUABANKS) { CONS_Alert(CONS_ERROR, M_GetText("Corrupt Luabanks! (Too many banks in use)\n")); return false; } for (i = 0; i < banksinuse; i++) - luabanks[i] = READINT32(save_p); - if (READUINT8(save_p) != 0x1d) // consistency marker + luabanks[i] = READINT32(save->p); + if (READUINT8(save->p) != 0x1d) // consistency marker { CONS_Alert(CONS_ERROR, M_GetText("Corrupt Luabanks! (Failed consistency check)\n")); return false; @@ -5100,50 +5093,50 @@ static inline boolean P_UnArchiveLuabanksAndConsistency(void) return true; } -static void P_NetArchiveRNG(void) +static void P_NetArchiveRNG(savebuffer_t *save) { size_t i; - WRITEUINT32(save_p, ARCHIVEBLOCK_RNG); + WRITEUINT32(save->p, ARCHIVEBLOCK_RNG); for (i = 0; i < PRNUMCLASS; i++) { - WRITEUINT32(save_p, P_GetInitSeed(i)); - WRITEUINT32(save_p, P_GetRandSeed(i)); + WRITEUINT32(save->p, P_GetInitSeed(i)); + WRITEUINT32(save->p, P_GetRandSeed(i)); } } -static inline void P_NetUnArchiveRNG(void) +static inline void P_NetUnArchiveRNG(savebuffer_t *save) { size_t i; - if (READUINT32(save_p) != ARCHIVEBLOCK_RNG) + if (READUINT32(save->p) != ARCHIVEBLOCK_RNG) I_Error("Bad $$$.sav at archive block RNG"); for (i = 0; i < PRNUMCLASS; i++) { - UINT32 init = READUINT32(save_p); - UINT32 seed = READUINT32(save_p); + UINT32 init = READUINT32(save->p); + UINT32 seed = READUINT32(save->p); P_SetRandSeedNet(i, init, seed); } } -void P_SaveGame(INT16 mapnum) +void P_SaveGame(savebuffer_t *save, INT16 mapnum) { - P_ArchiveMisc(mapnum); - P_ArchivePlayer(); - P_ArchiveLuabanksAndConsistency(); + P_ArchiveMisc(save, mapnum); + P_ArchivePlayer(save); + P_ArchiveLuabanksAndConsistency(save); } -void P_SaveNetGame(boolean resending) +void P_SaveNetGame(savebuffer_t *save, boolean resending) { thinker_t *th; mobj_t *mobj; INT32 i = 1; // don't start from 0, it'd be confused with a blank pointer otherwise - CV_SaveNetVars(&save_p); - P_NetArchiveMisc(resending); + CV_SaveNetVars(&save->p); + P_NetArchiveMisc(save, resending); // Assign the mobjnumber for pointer tracking if (gamestate == GS_LEVEL) @@ -5160,25 +5153,25 @@ void P_SaveNetGame(boolean resending) } } - P_NetArchivePlayers(); + P_NetArchivePlayers(save); if (gamestate == GS_LEVEL) { - P_NetArchiveWorld(); - P_ArchivePolyObjects(); - P_NetArchiveThinkers(); - P_NetArchiveSpecials(); - P_NetArchiveColormaps(); - P_NetArchiveTubeWaypoints(); - P_NetArchiveWaypoints(); + P_NetArchiveWorld(save); + P_ArchivePolyObjects(save); + P_NetArchiveThinkers(save); + P_NetArchiveSpecials(save); + P_NetArchiveColormaps(save); + P_NetArchiveTubeWaypoints(save); + P_NetArchiveWaypoints(save); } - LUA_Archive(&save_p); + LUA_Archive(&save->p, true); - P_NetArchiveRNG(); + P_NetArchiveRNG(save); - P_ArchiveLuabanksAndConsistency(); + P_ArchiveLuabanksAndConsistency(save); } -boolean P_LoadGame(INT16 mapoverride) +boolean P_LoadGame(savebuffer_t *save, INT16 mapoverride) { if (gamestate == GS_INTERMISSION) Y_EndIntermission(); @@ -5186,10 +5179,10 @@ boolean P_LoadGame(INT16 mapoverride) Y_EndVote(); G_SetGamestate(GS_NULL); // should be changed in P_UnArchiveMisc - P_UnArchiveSPGame(mapoverride); - P_UnArchivePlayer(); + P_UnArchiveSPGame(save, mapoverride); + P_UnArchivePlayer(save); - if (!P_UnArchiveLuabanksAndConsistency()) + if (!P_UnArchiveLuabanksAndConsistency(save)) return false; // Only do this after confirming savegame is ok @@ -5199,31 +5192,31 @@ boolean P_LoadGame(INT16 mapoverride) return true; } -boolean P_LoadNetGame(boolean reloading) +boolean P_LoadNetGame(savebuffer_t *save, boolean reloading) { - CV_LoadNetVars(&save_p); + CV_LoadNetVars(&save->p); - if (!P_NetUnArchiveMisc(reloading)) + if (!P_NetUnArchiveMisc(save, reloading)) return false; - P_NetUnArchivePlayers(); + P_NetUnArchivePlayers(save); if (gamestate == GS_LEVEL) { - P_NetUnArchiveWorld(); - P_UnArchivePolyObjects(); - P_NetUnArchiveThinkers(); - P_NetUnArchiveSpecials(); - P_NetUnArchiveColormaps(); - P_NetUnArchiveTubeWaypoints(); - P_NetUnArchiveWaypoints(); + P_NetUnArchiveWorld(save); + P_UnArchivePolyObjects(save); + P_NetUnArchiveThinkers(save); + P_NetUnArchiveSpecials(save); + P_NetUnArchiveColormaps(save); + P_NetUnArchiveTubeWaypoints(save); + P_NetUnArchiveWaypoints(save); P_RelinkPointers(); P_FinishMobjs(); } - LUA_UnArchive(&save_p); + LUA_UnArchive(&save->p, true); - P_NetUnArchiveRNG(); + P_NetUnArchiveRNG(save); // The precipitation would normally be spawned in P_SetupLevel, which is called by // P_NetUnArchiveMisc above. However, that would place it up before P_NetUnArchiveThinkers, @@ -5231,5 +5224,5 @@ boolean P_LoadNetGame(boolean reloading) // precipitation when loading a netgame save. Instead, precip has to be spawned here. // This is done in P_NetUnArchiveSpecials now. - return P_UnArchiveLuabanksAndConsistency(); + return P_UnArchiveLuabanksAndConsistency(save); } diff --git a/src/p_saveg.h b/src/p_saveg.h index a8acbe693..538febcf9 100644 --- a/src/p_saveg.h +++ b/src/p_saveg.h @@ -25,10 +25,10 @@ extern "C" { // Persistent storage/archiving. // These are the load / save game routines. -void P_SaveGame(INT16 mapnum); -void P_SaveNetGame(boolean resending); -boolean P_LoadGame(INT16 mapoverride); -boolean P_LoadNetGame(boolean reloading); +void P_SaveGame(savebuffer_t *save, INT16 mapnum); +void P_SaveNetGame(savebuffer_t *save, boolean resending); +boolean P_LoadGame(savebuffer_t *save, INT16 mapoverride); +boolean P_LoadNetGame(savebuffer_t *save, boolean reloading); mobj_t *P_FindNewPosition(UINT32 oldposition); @@ -42,7 +42,12 @@ struct savedata_t }; extern savedata_t savedata; -extern UINT8 *save_p; + +struct savebuffer_t +{ + UINT8 *buffer; + UINT8 *p; +}; #ifdef __cplusplus } // extern "C" diff --git a/src/p_setup.c b/src/p_setup.c index 61c2a9ec3..b32c5126c 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -722,12 +722,12 @@ void P_WriteThings(void) const char * filename; size_t i, length; mapthing_t *mt; - UINT8 *savebuffer, *savebuf_p; + savebuffer_t save; INT16 temp; - savebuf_p = savebuffer = (UINT8 *)malloc(nummapthings * sizeof (mapthing_t)); + save.p = save.buffer = (UINT8 *)malloc(nummapthings * sizeof (mapthing_t)); - if (!savebuf_p) + if (!save.p) { CONS_Alert(CONS_ERROR, M_GetText("No more free memory for thing writing!\n")); return; @@ -736,23 +736,23 @@ void P_WriteThings(void) mt = mapthings; for (i = 0; i < nummapthings; i++, mt++) { - WRITEINT16(savebuf_p, mt->x); - WRITEINT16(savebuf_p, mt->y); + WRITEINT16(save.p, mt->x); + WRITEINT16(save.p, mt->y); - WRITEINT16(savebuf_p, mt->angle); + WRITEINT16(save.p, mt->angle); temp = (INT16)(mt->type + ((INT16)mt->extrainfo << 12)); - WRITEINT16(savebuf_p, temp); - WRITEUINT16(savebuf_p, mt->options); + WRITEINT16(save.p, temp); + WRITEUINT16(save.p, mt->options); } - length = savebuf_p - savebuffer; + length = save.p - save.buffer; filename = va("newthings-%s.lmp", G_BuildMapName(gamemap)); - FIL_WriteFile(filename, savebuffer, length); - free(savebuffer); - savebuf_p = NULL; + FIL_WriteFile(filename, save.buffer, length); + free(save.buffer); + save.p = NULL; CONS_Printf(M_GetText("%s saved.\n"), filename); } diff --git a/src/typedef.h b/src/typedef.h index 81ba62c31..57958b34e 100644 --- a/src/typedef.h +++ b/src/typedef.h @@ -265,6 +265,7 @@ TYPEDEF (polyfadedata_t); // p_saveg.h TYPEDEF (savedata_t); +TYPEDEF (savebuffer_t); // p_setup.h TYPEDEF (levelflat_t); From 061f8b058768314553c3af9bd9a0e0e3557e9c8e Mon Sep 17 00:00:00 2001 From: James R Date: Sun, 25 Dec 2022 13:49:55 -0800 Subject: [PATCH 02/13] g_demo.c: use savebuffer_t --- src/g_demo.c | 656 +++++++++++++++++++++++++-------------------------- src/g_demo.h | 2 - 2 files changed, 328 insertions(+), 330 deletions(-) diff --git a/src/g_demo.c b/src/g_demo.c index 298f887e5..57dfdc9fa 100644 --- a/src/g_demo.c +++ b/src/g_demo.c @@ -39,6 +39,7 @@ #include "v_video.h" #include "lua_hook.h" #include "md5.h" // demo checksums +#include "p_saveg.h" // savebuffer_t // SRB2Kart #include "d_netfil.h" // nameonly @@ -69,9 +70,8 @@ boolean noblit; // for comparative timing purposes tic_t demostarttime; // for comparative timing purposes static char demoname[MAX_WADPATH]; -static UINT8 *demobuffer = NULL; +static savebuffer_t demobuf; static UINT8 *demotime_p, *demoinfo_p; -UINT8 *demo_p; static UINT8 *demoend; static UINT8 demoflags; boolean demosynced = true; // console warning message @@ -219,7 +219,7 @@ void G_ReadDemoExtraData(void) if (leveltime > starttime) { - rewind_t *rewind = CL_SaveRewindPoint(demo_p - demobuffer); + rewind_t *rewind = CL_SaveRewindPoint(demobuf.p - demobuf.buffer); if (rewind) { memcpy(rewind->oldcmd, oldcmd, sizeof (oldcmd)); @@ -229,11 +229,11 @@ void G_ReadDemoExtraData(void) memset(name, '\0', 17); - p = READUINT8(demo_p); + p = READUINT8(demobuf.p); while (p < DW_EXTRASTUFF) { - extradata = READUINT8(demo_p); + extradata = READUINT8(demobuf.p); if (extradata & DXD_JOINDATA) { @@ -247,20 +247,20 @@ void G_ReadDemoExtraData(void) for (i = 0; i < MAXAVAILABILITY; i++) { - players[p].availabilities[i] = READUINT8(demo_p); + players[p].availabilities[i] = READUINT8(demobuf.p); } - players[p].bot = !!(READUINT8(demo_p)); + players[p].bot = !!(READUINT8(demobuf.p)); if (players[p].bot) { - players[p].botvars.difficulty = READUINT8(demo_p); - players[p].botvars.diffincrease = READUINT8(demo_p); // needed to avoid having to duplicate logic - players[p].botvars.rival = (boolean)READUINT8(demo_p); + players[p].botvars.difficulty = READUINT8(demobuf.p); + players[p].botvars.diffincrease = READUINT8(demobuf.p); // needed to avoid having to duplicate logic + players[p].botvars.rival = (boolean)READUINT8(demobuf.p); } } if (extradata & DXD_PLAYSTATE) { - i = READUINT8(demo_p); + i = READUINT8(demobuf.p); switch (i) { case DXD_PST_PLAYING: @@ -305,7 +305,7 @@ void G_ReadDemoExtraData(void) // Skin - skinid = READUINT8(demo_p); + skinid = READUINT8(demobuf.p); if (skinid >= demo.numskins) skinid = 0; SetPlayerSkinByNum(p, demo.skinlist[skinid].mapping); @@ -318,8 +318,8 @@ void G_ReadDemoExtraData(void) if (extradata & DXD_COLOR) { // Color - M_Memcpy(name, demo_p, 16); - demo_p += 16; + M_Memcpy(name, demobuf.p, 16); + demobuf.p += 16; for (i = 0; i < numskincolors; i++) if (!stricmp(skincolors[i].name, name)) // SRB2kart { @@ -332,19 +332,19 @@ void G_ReadDemoExtraData(void) if (extradata & DXD_NAME) { // Name - M_Memcpy(player_names[p],demo_p,16); - demo_p += 16; + M_Memcpy(player_names[p],demobuf.p,16); + demobuf.p += 16; } if (extradata & DXD_FOLLOWER) { // Set our follower - M_Memcpy(name, demo_p, 16); - demo_p += 16; + M_Memcpy(name, demobuf.p, 16); + demobuf.p += 16; K_SetFollowerByName(p, name); // Follower's color - M_Memcpy(name, demo_p, 16); - demo_p += 16; + M_Memcpy(name, demobuf.p, 16); + demobuf.p += 16; for (i = 0; i < numskincolors +2; i++) // +2 because of Match and Opposite { if (!stricmp(Followercolor_cons_t[i].strvalue, name)) @@ -364,12 +364,12 @@ void G_ReadDemoExtraData(void) } if (extradata & DXD_WEAPONPREF) { - WeaponPref_Parse(&demo_p, p); + WeaponPref_Parse(&demobuf.p, p); //CONS_Printf("weaponpref is %d for player %d\n", i, p); } - p = READUINT8(demo_p); + p = READUINT8(demobuf.p); } while (p != DW_END) @@ -382,7 +382,7 @@ void G_ReadDemoExtraData(void) case DW_RNG: for (i = 0; i < PRNUMCLASS; i++) { - rng = READUINT32(demo_p); + rng = READUINT32(demobuf.p); if (P_GetRandSeed(i) != rng) { @@ -396,10 +396,10 @@ void G_ReadDemoExtraData(void) demosynced = storesynced; } - p = READUINT8(demo_p); + p = READUINT8(demobuf.p); } - if (!(demoflags & DF_GHOST) && *demo_p == DEMOMARKER) + if (!(demoflags & DF_GHOST) && *demobuf.p == DEMOMARKER) { // end of demo data stream G_CheckDemoStatus(); @@ -416,22 +416,22 @@ void G_WriteDemoExtraData(void) { if (demo_extradata[i]) { - WRITEUINT8(demo_p, i); - WRITEUINT8(demo_p, demo_extradata[i]); + WRITEUINT8(demobuf.p, i); + WRITEUINT8(demobuf.p, demo_extradata[i]); if (demo_extradata[i] & DXD_JOINDATA) { for (j = 0; j < MAXAVAILABILITY; j++) { - WRITEUINT8(demo_p, players[i].availabilities[i]); + WRITEUINT8(demobuf.p, players[i].availabilities[i]); } - WRITEUINT8(demo_p, (UINT8)players[i].bot); + WRITEUINT8(demobuf.p, (UINT8)players[i].bot); if (players[i].bot) { - WRITEUINT8(demo_p, players[i].botvars.difficulty); - WRITEUINT8(demo_p, players[i].botvars.diffincrease); // needed to avoid having to duplicate logic - WRITEUINT8(demo_p, (UINT8)players[i].botvars.rival); + WRITEUINT8(demobuf.p, players[i].botvars.difficulty); + WRITEUINT8(demobuf.p, players[i].botvars.diffincrease); // needed to avoid having to duplicate logic + WRITEUINT8(demobuf.p, (UINT8)players[i].botvars.rival); } } if (demo_extradata[i] & DXD_PLAYSTATE) @@ -452,29 +452,29 @@ void G_WriteDemoExtraData(void) pst = DXD_PST_SPECTATING; } - WRITEUINT8(demo_p, pst); + WRITEUINT8(demobuf.p, pst); } //if (demo_extradata[i] & DXD_RESPAWN) has no extra data if (demo_extradata[i] & DXD_SKIN) { // Skin - WRITEUINT8(demo_p, players[i].skin); + WRITEUINT8(demobuf.p, players[i].skin); } if (demo_extradata[i] & DXD_COLOR) { // Color memset(name, 0, 16); strncpy(name, skincolors[players[i].skincolor].name, 16); - M_Memcpy(demo_p,name,16); - demo_p += 16; + M_Memcpy(demobuf.p,name,16); + demobuf.p += 16; } if (demo_extradata[i] & DXD_NAME) { // Name memset(name, 0, 16); strncpy(name, player_names[i], 16); - M_Memcpy(demo_p,name,16); - demo_p += 16; + M_Memcpy(demobuf.p,name,16); + demobuf.p += 16; } if (demo_extradata[i] & DXD_FOLLOWER) { @@ -484,8 +484,8 @@ void G_WriteDemoExtraData(void) strncpy(name, "None", 16); else strncpy(name, followers[players[i].followerskin].name, 16); - M_Memcpy(demo_p, name, 16); - demo_p += 16; + M_Memcpy(demobuf.p, name, 16); + demobuf.p += 16; // write follower color memset(name, 0, 16); @@ -495,13 +495,13 @@ void G_WriteDemoExtraData(void) break; } strncpy(name, Followercolor_cons_t[j].strvalue, 16); // Not KartColor_Names because followercolor has extra values such as "Match" - M_Memcpy(demo_p,name,16); - demo_p += 16; + M_Memcpy(demobuf.p,name,16); + demobuf.p += 16; } if (demo_extradata[i] & DXD_WEAPONPREF) { - WeaponPref_Save(&demo_p, i); + WeaponPref_Save(&demobuf.p, i); } } @@ -521,45 +521,45 @@ void G_WriteDemoExtraData(void) { demo_writerng = 0; timeout = 16; - WRITEUINT8(demo_p, DW_RNG); + WRITEUINT8(demobuf.p, DW_RNG); for (i = 0; i < PRNUMCLASS; i++) { - WRITEUINT32(demo_p, P_GetRandSeed(i)); + WRITEUINT32(demobuf.p, P_GetRandSeed(i)); } } } - WRITEUINT8(demo_p, DW_END); + WRITEUINT8(demobuf.p, DW_END); } void G_ReadDemoTiccmd(ticcmd_t *cmd, INT32 playernum) { UINT8 ziptic; - if (!demo_p || !demo.deferstart) + if (!demobuf.p || !demo.deferstart) return; - ziptic = READUINT8(demo_p); + ziptic = READUINT8(demobuf.p); if (ziptic & ZT_FWD) - oldcmd[playernum].forwardmove = READSINT8(demo_p); + oldcmd[playernum].forwardmove = READSINT8(demobuf.p); if (ziptic & ZT_TURNING) - oldcmd[playernum].turning = READINT16(demo_p); + oldcmd[playernum].turning = READINT16(demobuf.p); if (ziptic & ZT_THROWDIR) - oldcmd[playernum].throwdir = READINT16(demo_p); + oldcmd[playernum].throwdir = READINT16(demobuf.p); if (ziptic & ZT_BUTTONS) - oldcmd[playernum].buttons = READUINT16(demo_p); + oldcmd[playernum].buttons = READUINT16(demobuf.p); if (ziptic & ZT_AIMING) - oldcmd[playernum].aiming = READINT16(demo_p); + oldcmd[playernum].aiming = READINT16(demobuf.p); if (ziptic & ZT_LATENCY) - oldcmd[playernum].latency = READUINT8(demo_p); + oldcmd[playernum].latency = READUINT8(demobuf.p); if (ziptic & ZT_FLAGS) - oldcmd[playernum].flags = READUINT8(demo_p); + oldcmd[playernum].flags = READUINT8(demobuf.p); G_CopyTiccmd(cmd, &oldcmd[playernum], 1); - if (!(demoflags & DF_GHOST) && *demo_p == DEMOMARKER) + if (!(demoflags & DF_GHOST) && *demobuf.p == DEMOMARKER) { // end of demo data stream G_CheckDemoStatus(); @@ -573,55 +573,55 @@ void G_WriteDemoTiccmd(ticcmd_t *cmd, INT32 playernum) UINT8 *ziptic_p; (void)playernum; - if (!demo_p) + if (!demobuf.p) return; - ziptic_p = demo_p++; // the ziptic, written at the end of this function + ziptic_p = demobuf.p++; // the ziptic, written at the end of this function if (cmd->forwardmove != oldcmd[playernum].forwardmove) { - WRITESINT8(demo_p,cmd->forwardmove); + WRITESINT8(demobuf.p,cmd->forwardmove); oldcmd[playernum].forwardmove = cmd->forwardmove; ziptic |= ZT_FWD; } if (cmd->turning != oldcmd[playernum].turning) { - WRITEINT16(demo_p,cmd->turning); + WRITEINT16(demobuf.p,cmd->turning); oldcmd[playernum].turning = cmd->turning; ziptic |= ZT_TURNING; } if (cmd->throwdir != oldcmd[playernum].throwdir) { - WRITEINT16(demo_p,cmd->throwdir); + WRITEINT16(demobuf.p,cmd->throwdir); oldcmd[playernum].throwdir = cmd->throwdir; ziptic |= ZT_THROWDIR; } if (cmd->buttons != oldcmd[playernum].buttons) { - WRITEUINT16(demo_p,cmd->buttons); + WRITEUINT16(demobuf.p,cmd->buttons); oldcmd[playernum].buttons = cmd->buttons; ziptic |= ZT_BUTTONS; } if (cmd->aiming != oldcmd[playernum].aiming) { - WRITEINT16(demo_p,cmd->aiming); + WRITEINT16(demobuf.p,cmd->aiming); oldcmd[playernum].aiming = cmd->aiming; ziptic |= ZT_AIMING; } if (cmd->latency != oldcmd[playernum].latency) { - WRITEUINT8(demo_p,cmd->latency); + WRITEUINT8(demobuf.p,cmd->latency); oldcmd[playernum].latency = cmd->latency; ziptic |= ZT_LATENCY; } if (cmd->flags != oldcmd[playernum].flags) { - WRITEUINT8(demo_p,cmd->flags); + WRITEUINT8(demobuf.p,cmd->flags); oldcmd[playernum].flags = cmd->flags; ziptic |= ZT_FLAGS; } @@ -696,14 +696,14 @@ void G_WriteAllGhostTics(void) if (multiplayer && ((counter % cv_netdemosyncquality.value) != 0)) // Only write 1 in this many ghost datas per tic to cut down on multiplayer replay size. continue; - WRITEUINT8(demo_p, i); + WRITEUINT8(demobuf.p, i); G_WriteGhostTic(players[i].mo, i); } - WRITEUINT8(demo_p, 0xFF); + WRITEUINT8(demobuf.p, 0xFF); // attention here for the ticcmd size! // latest demos with mouse aiming byte in ticcmd - if (demo_p >= demoend - (13 + 9 + 9)) + if (demobuf.p >= demoend - (13 + 9 + 9)) { G_CheckDemoStatus(); // no more space return; @@ -716,12 +716,12 @@ void G_WriteGhostTic(mobj_t *ghost, INT32 playernum) UINT8 *ziptic_p; UINT32 i; - if (!demo_p) + if (!demobuf.p) return; if (!(demoflags & DF_GHOST)) return; // No ghost data to write. - ziptic_p = demo_p++; // the ziptic, written at the end of this function + ziptic_p = demobuf.p++; // the ziptic, written at the end of this function #define MAXMOM (0xFFFF<<8) @@ -735,9 +735,9 @@ void G_WriteGhostTic(mobj_t *ghost, INT32 playernum) oldghost[playernum].y = ghost->y; oldghost[playernum].z = ghost->z; ziptic |= GZT_XYZ; - WRITEFIXED(demo_p,oldghost[playernum].x); - WRITEFIXED(demo_p,oldghost[playernum].y); - WRITEFIXED(demo_p,oldghost[playernum].z); + WRITEFIXED(demobuf.p,oldghost[playernum].x); + WRITEFIXED(demobuf.p,oldghost[playernum].y); + WRITEFIXED(demobuf.p,oldghost[playernum].z); } else { @@ -751,8 +751,8 @@ void G_WriteGhostTic(mobj_t *ghost, INT32 playernum) oldghost[playernum].momx = momx; oldghost[playernum].momy = momy; ziptic |= GZT_MOMXY; - WRITEFIXED(demo_p,momx); - WRITEFIXED(demo_p,momy); + WRITEFIXED(demobuf.p,momx); + WRITEFIXED(demobuf.p,momy); } momx = ghost->z-oldghost[playernum].z; @@ -760,7 +760,7 @@ void G_WriteGhostTic(mobj_t *ghost, INT32 playernum) { oldghost[playernum].momz = momx; ziptic |= GZT_MOMZ; - WRITEFIXED(demo_p,momx); + WRITEFIXED(demobuf.p,momx); } // This SHOULD set oldghost.x/y/z to match ghost->x/y/z @@ -778,7 +778,7 @@ void G_WriteGhostTic(mobj_t *ghost, INT32 playernum) { oldghost[playernum].angle = ghost->player->drawangle>>24; ziptic |= GZT_ANGLE; - WRITEUINT8(demo_p,oldghost[playernum].angle); + WRITEUINT8(demobuf.p,oldghost[playernum].angle); } // Store the sprite frame. @@ -786,7 +786,7 @@ void G_WriteGhostTic(mobj_t *ghost, INT32 playernum) { oldghost[playernum].frame = (ghost->frame & FF_FRAMEMASK); ziptic |= GZT_FRAME; - WRITEUINT8(demo_p,oldghost[playernum].frame); + WRITEUINT8(demobuf.p,oldghost[playernum].frame); } if (ghost->sprite == SPR_PLAY @@ -794,7 +794,7 @@ void G_WriteGhostTic(mobj_t *ghost, INT32 playernum) { oldghost[playernum].sprite2 = ghost->sprite2; ziptic |= GZT_SPR2; - WRITEUINT8(demo_p,oldghost[playernum].sprite2); + WRITEUINT8(demobuf.p,oldghost[playernum].sprite2); } // Check for sprite set changes @@ -839,30 +839,30 @@ void G_WriteGhostTic(mobj_t *ghost, INT32 playernum) if (ghostext[playernum].scale == ghostext[playernum].lastscale) ghostext[playernum].flags &= ~EZT_SCALE; - WRITEUINT8(demo_p,ghostext[playernum].flags); + WRITEUINT8(demobuf.p,ghostext[playernum].flags); if (ghostext[playernum].flags & EZT_COLOR) { - WRITEUINT16(demo_p,ghostext[playernum].color); + WRITEUINT16(demobuf.p,ghostext[playernum].color); ghostext[playernum].lastcolor = ghostext[playernum].color; } if (ghostext[playernum].flags & EZT_SCALE) { - WRITEFIXED(demo_p,ghostext[playernum].scale); + WRITEFIXED(demobuf.p,ghostext[playernum].scale); ghostext[playernum].lastscale = ghostext[playernum].scale; } if (ghostext[playernum].flags & EZT_HIT) { - WRITEUINT16(demo_p,ghostext[playernum].hits); + WRITEUINT16(demobuf.p,ghostext[playernum].hits); for (i = 0; i < ghostext[playernum].hits; i++) { mobj_t *mo = ghostext[playernum].hitlist[i]; - //WRITEUINT32(demo_p,UINT32_MAX); // reserved for some method of determining exactly which mobj this is. (mobjnum doesn't work here.) - WRITEUINT32(demo_p,mo->type); - WRITEUINT16(demo_p,(UINT16)mo->health); - WRITEFIXED(demo_p,mo->x); - WRITEFIXED(demo_p,mo->y); - WRITEFIXED(demo_p,mo->z); - WRITEANGLE(demo_p,mo->angle); + //WRITEUINT32(demobuf.p,UINT32_MAX); // reserved for some method of determining exactly which mobj this is. (mobjnum doesn't work here.) + WRITEUINT32(demobuf.p,mo->type); + WRITEUINT16(demobuf.p,(UINT16)mo->health); + WRITEFIXED(demobuf.p,mo->x); + WRITEFIXED(demobuf.p,mo->y); + WRITEFIXED(demobuf.p,mo->z); + WRITEANGLE(demobuf.p,mo->angle); P_SetTarget(ghostext[playernum].hitlist+i, NULL); } Z_Free(ghostext[playernum].hitlist); @@ -870,19 +870,19 @@ void G_WriteGhostTic(mobj_t *ghost, INT32 playernum) ghostext[playernum].hitlist = NULL; } if (ghostext[playernum].flags & EZT_SPRITE) - WRITEUINT16(demo_p,oldghost[playernum].sprite); + WRITEUINT16(demobuf.p,oldghost[playernum].sprite); if (ghostext[playernum].flags & EZT_ITEMDATA) { - WRITESINT8(demo_p, ghostext[playernum].itemtype); - WRITEUINT8(demo_p, ghostext[playernum].itemamount); - WRITEUINT8(demo_p, ghostext[playernum].bumpers); + WRITESINT8(demobuf.p, ghostext[playernum].itemtype); + WRITEUINT8(demobuf.p, ghostext[playernum].itemamount); + WRITEUINT8(demobuf.p, ghostext[playernum].bumpers); } if (ghostext[playernum].flags & EZT_STATDATA) { - WRITEUINT8(demo_p,ghostext[playernum].skinid); - WRITEUINT8(demo_p,ghostext[playernum].kartspeed); - WRITEUINT8(demo_p,ghostext[playernum].kartweight); - WRITEUINT32(demo_p, ghostext[playernum].charflags); + WRITEUINT8(demobuf.p,ghostext[playernum].skinid); + WRITEUINT8(demobuf.p,ghostext[playernum].kartspeed); + WRITEUINT8(demobuf.p,ghostext[playernum].kartweight); + WRITEUINT32(demobuf.p, ghostext[playernum].charflags); } ghostext[playernum].flags = 0; @@ -891,7 +891,7 @@ void G_WriteGhostTic(mobj_t *ghost, INT32 playernum) if (ghost->player && ghost->player->followmobj&& !(ghost->player->followmobj->sprite == SPR_NULL || (ghost->player->followmobj->renderflags & RF_DONTDRAW) == RF_DONTDRAW)) // bloats tails runs but what can ya do { fixed_t temp; - UINT8 *followtic_p = demo_p++; + UINT8 *followtic_p = demobuf.p++; UINT8 followtic = 0; ziptic |= GZT_FOLLOW; @@ -902,33 +902,33 @@ void G_WriteGhostTic(mobj_t *ghost, INT32 playernum) if (!(oldghost[playernum].flags2 & MF2_AMBUSH)) { followtic |= FZT_SPAWNED; - WRITEINT16(demo_p,ghost->player->followmobj->info->height>>FRACBITS); + WRITEINT16(demobuf.p,ghost->player->followmobj->info->height>>FRACBITS); if (ghost->player->followmobj->flags2 & MF2_LINKDRAW) followtic |= FZT_LINKDRAW; if (ghost->player->followmobj->colorized) followtic |= FZT_COLORIZED; if (followtic & FZT_SKIN) - WRITEUINT8(demo_p,(UINT8)(((skin_t *)(ghost->player->followmobj->skin))-skins)); + WRITEUINT8(demobuf.p,(UINT8)(((skin_t *)(ghost->player->followmobj->skin))-skins)); oldghost[playernum].flags2 |= MF2_AMBUSH; } if (ghost->player->followmobj->scale != ghost->scale) { followtic |= FZT_SCALE; - WRITEFIXED(demo_p,ghost->player->followmobj->scale); + WRITEFIXED(demobuf.p,ghost->player->followmobj->scale); } temp = ghost->player->followmobj->x-ghost->x; - WRITEFIXED(demo_p,temp); + WRITEFIXED(demobuf.p,temp); temp = ghost->player->followmobj->y-ghost->y; - WRITEFIXED(demo_p,temp); + WRITEFIXED(demobuf.p,temp); temp = ghost->player->followmobj->z-ghost->z; - WRITEFIXED(demo_p,temp); + WRITEFIXED(demobuf.p,temp); if (followtic & FZT_SKIN) - WRITEUINT8(demo_p,ghost->player->followmobj->sprite2); - WRITEUINT16(demo_p,ghost->player->followmobj->sprite); - WRITEUINT8(demo_p,(ghost->player->followmobj->frame & FF_FRAMEMASK)); - WRITEUINT16(demo_p,ghost->player->followmobj->color); + WRITEUINT8(demobuf.p,ghost->player->followmobj->sprite2); + WRITEUINT16(demobuf.p,ghost->player->followmobj->sprite); + WRITEUINT8(demobuf.p,(ghost->player->followmobj->frame & FF_FRAMEMASK)); + WRITEUINT16(demobuf.p,ghost->player->followmobj->color); *followtic_p = followtic; } @@ -942,18 +942,18 @@ void G_ConsAllGhostTics(void) { UINT8 p; - if (!demo_p || !demo.deferstart) + if (!demobuf.p || !demo.deferstart) return; - p = READUINT8(demo_p); + p = READUINT8(demobuf.p); while (p != 0xFF) { G_ConsGhostTic(p); - p = READUINT8(demo_p); + p = READUINT8(demobuf.p); } - if (*demo_p == DEMOMARKER) + if (*demobuf.p == DEMOMARKER) { // end of demo data stream G_CheckDemoStatus(); @@ -976,45 +976,45 @@ void G_ConsGhostTic(INT32 playernum) testmo = players[playernum].mo; // Grab ghost data. - ziptic = READUINT8(demo_p); + ziptic = READUINT8(demobuf.p); if (ziptic & GZT_XYZ) { - oldghost[playernum].x = READFIXED(demo_p); - oldghost[playernum].y = READFIXED(demo_p); - oldghost[playernum].z = READFIXED(demo_p); + oldghost[playernum].x = READFIXED(demobuf.p); + oldghost[playernum].y = READFIXED(demobuf.p); + oldghost[playernum].z = READFIXED(demobuf.p); syncleeway = 0; } else { if (ziptic & GZT_MOMXY) { - oldghost[playernum].momx = READFIXED(demo_p); - oldghost[playernum].momy = READFIXED(demo_p); + oldghost[playernum].momx = READFIXED(demobuf.p); + oldghost[playernum].momy = READFIXED(demobuf.p); } if (ziptic & GZT_MOMZ) - oldghost[playernum].momz = READFIXED(demo_p); + oldghost[playernum].momz = READFIXED(demobuf.p); oldghost[playernum].x += oldghost[playernum].momx; oldghost[playernum].y += oldghost[playernum].momy; oldghost[playernum].z += oldghost[playernum].momz; syncleeway = FRACUNIT; } if (ziptic & GZT_ANGLE) - demo_p++; + demobuf.p++; if (ziptic & GZT_FRAME) - demo_p++; + demobuf.p++; if (ziptic & GZT_SPR2) - demo_p++; + demobuf.p++; if (ziptic & GZT_EXTRA) { // But wait, there's more! - UINT8 xziptic = READUINT8(demo_p); + UINT8 xziptic = READUINT8(demobuf.p); if (xziptic & EZT_COLOR) - demo_p += sizeof(UINT16); + demobuf.p += sizeof(UINT16); if (xziptic & EZT_SCALE) - demo_p += sizeof(fixed_t); + demobuf.p += sizeof(fixed_t); if (xziptic & EZT_HIT) { // Resync mob damage. - UINT16 i, count = READUINT16(demo_p); + UINT16 i, count = READUINT16(demobuf.p); thinker_t *th; mobj_t *mobj; @@ -1026,13 +1026,13 @@ void G_ConsGhostTic(INT32 playernum) for (i = 0; i < count; i++) { - //demo_p += 4; // reserved. - type = READUINT32(demo_p); - health = READUINT16(demo_p); - x = READFIXED(demo_p); - y = READFIXED(demo_p); - z = READFIXED(demo_p); - demo_p += sizeof(angle_t); // angle, unnecessary for cons. + //demobuf.p += 4; // reserved. + type = READUINT32(demobuf.p); + health = READUINT16(demobuf.p); + x = READFIXED(demobuf.p); + y = READFIXED(demobuf.p); + z = READFIXED(demobuf.p); + demobuf.p += sizeof(angle_t); // angle, unnecessary for cons. mobj = NULL; for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next) @@ -1053,42 +1053,42 @@ void G_ConsGhostTic(INT32 playernum) } } if (xziptic & EZT_SPRITE) - demo_p += sizeof(UINT16); + demobuf.p += sizeof(UINT16); if (xziptic & EZT_ITEMDATA) { - ghostext[playernum].itemtype = READSINT8(demo_p); - ghostext[playernum].itemamount = READUINT8(demo_p); - ghostext[playernum].bumpers = READUINT8(demo_p); + ghostext[playernum].itemtype = READSINT8(demobuf.p); + ghostext[playernum].itemamount = READUINT8(demobuf.p); + ghostext[playernum].bumpers = READUINT8(demobuf.p); } if (xziptic & EZT_STATDATA) { - ghostext[playernum].skinid = READUINT8(demo_p); + ghostext[playernum].skinid = READUINT8(demobuf.p); if (ghostext[playernum].skinid >= demo.numskins) ghostext[playernum].skinid = 0; - ghostext[playernum].kartspeed = READUINT8(demo_p); - ghostext[playernum].kartweight = READUINT8(demo_p); - ghostext[playernum].charflags = READUINT32(demo_p); + ghostext[playernum].kartspeed = READUINT8(demobuf.p); + ghostext[playernum].kartweight = READUINT8(demobuf.p); + ghostext[playernum].charflags = READUINT32(demobuf.p); } } if (ziptic & GZT_FOLLOW) { // Even more... - UINT8 followtic = READUINT8(demo_p); + UINT8 followtic = READUINT8(demobuf.p); if (followtic & FZT_SPAWNED) { - demo_p += sizeof(INT16); + demobuf.p += sizeof(INT16); if (followtic & FZT_SKIN) - demo_p++; + demobuf.p++; } if (followtic & FZT_SCALE) - demo_p += sizeof(fixed_t); + demobuf.p += sizeof(fixed_t); // momx, momy and momz - demo_p += sizeof(fixed_t) * 3; + demobuf.p += sizeof(fixed_t) * 3; if (followtic & FZT_SKIN) - demo_p++; - demo_p += sizeof(UINT16); - demo_p++; - demo_p += sizeof(UINT16); + demobuf.p++; + demobuf.p += sizeof(UINT16); + demobuf.p++; + demobuf.p += sizeof(UINT16); } if (testmo) @@ -1164,7 +1164,7 @@ void G_ConsGhostTic(INT32 playernum) } } - if (*demo_p == DEMOMARKER) + if (*demobuf.p == DEMOMARKER) { // end of demo data stream G_CheckDemoStatus(); @@ -1632,7 +1632,7 @@ void G_ConfirmRewind(tic_t rewindtime) if (rewind) { - demo_p = demobuffer + rewind->demopos; + demobuf.p = demobuf.buffer + rewind->demopos; memcpy(oldcmd, rewind->oldcmd, sizeof (oldcmd)); memcpy(oldghost, rewind->oldghost, sizeof (oldghost)); paused = false; @@ -1841,11 +1841,11 @@ void G_WriteMetalTic(mobj_t *metal) UINT8 ziptic = 0; UINT8 *ziptic_p; - if (!demo_p) // demo_p will be NULL until the race start linedef executor is activated! + if (!demobuf.p) // demobuf.p will be NULL until the race start linedef executor is activated! return; - WRITEUINT8(demo_p, METALSNICE); - ziptic_p = demo_p++; // the ziptic, written at the end of this function + WRITEUINT8(demobuf.p, METALSNICE); + ziptic_p = demobuf.p++; // the ziptic, written at the end of this function #define MAXMOM (0xFFFF<<8) @@ -1858,9 +1858,9 @@ void G_WriteMetalTic(mobj_t *metal) oldmetal.y = metal->y; oldmetal.z = metal->z; ziptic |= GZT_XYZ; - WRITEFIXED(demo_p,oldmetal.x); - WRITEFIXED(demo_p,oldmetal.y); - WRITEFIXED(demo_p,oldmetal.z); + WRITEFIXED(demobuf.p,oldmetal.x); + WRITEFIXED(demobuf.p,oldmetal.y); + WRITEFIXED(demobuf.p,oldmetal.z); } else { @@ -1874,15 +1874,15 @@ void G_WriteMetalTic(mobj_t *metal) oldmetal.momx = momx; oldmetal.momy = momy; ziptic |= GZT_MOMXY; - WRITEFIXED(demo_p,momx); - WRITEFIXED(demo_p,momy); + WRITEFIXED(demobuf.p,momx); + WRITEFIXED(demobuf.p,momy); } momx = metal->z-oldmetal.z; if (momx != oldmetal.momz) { oldmetal.momz = momx; ziptic |= GZT_MOMZ; - WRITEFIXED(demo_p,momx); + WRITEFIXED(demobuf.p,momx); } // This SHOULD set oldmetal.x/y/z to match metal->x/y/z @@ -1900,7 +1900,7 @@ void G_WriteMetalTic(mobj_t *metal) { oldmetal.angle = metal->player->drawangle>>24; ziptic |= GZT_ANGLE; - WRITEUINT8(demo_p,oldmetal.angle); + WRITEUINT8(demobuf.p,oldmetal.angle); } // Store the sprite frame. @@ -1908,7 +1908,7 @@ void G_WriteMetalTic(mobj_t *metal) { oldmetal.frame = metal->frame; // NOT & FF_FRAMEMASK here, so 32 bits ziptic |= GZT_FRAME; - WRITEUINT32(demo_p,oldmetal.frame); + WRITEUINT32(demobuf.p,oldmetal.frame); } if (metal->sprite == SPR_PLAY @@ -1916,7 +1916,7 @@ void G_WriteMetalTic(mobj_t *metal) { oldmetal.sprite2 = metal->sprite2; ziptic |= GZT_SPR2; - WRITEUINT8(demo_p,oldmetal.sprite2); + WRITEUINT8(demobuf.p,oldmetal.sprite2); } // Check for sprite set changes @@ -1933,21 +1933,21 @@ void G_WriteMetalTic(mobj_t *metal) if (ghostext[0].scale == ghostext[0].lastscale) ghostext[0].flags &= ~EZT_SCALE; - WRITEUINT8(demo_p,ghostext[0].flags); + WRITEUINT8(demobuf.p,ghostext[0].flags); if (ghostext[0].flags & EZT_SCALE) { - WRITEFIXED(demo_p,ghostext[0].scale); + WRITEFIXED(demobuf.p,ghostext[0].scale); ghostext[0].lastscale = ghostext[0].scale; } if (ghostext[0].flags & EZT_SPRITE) - WRITEUINT16(demo_p,oldmetal.sprite); + WRITEUINT16(demobuf.p,oldmetal.sprite); ghostext[0].flags = 0; } if (metal->player && metal->player->followmobj && !(metal->player->followmobj->sprite == SPR_NULL || (metal->player->followmobj->renderflags & RF_DONTDRAW) == RF_DONTDRAW)) { fixed_t temp; - UINT8 *followtic_p = demo_p++; + UINT8 *followtic_p = demobuf.p++; UINT8 followtic = 0; ziptic |= GZT_FOLLOW; @@ -1958,33 +1958,33 @@ void G_WriteMetalTic(mobj_t *metal) if (!(oldmetal.flags2 & MF2_AMBUSH)) { followtic |= FZT_SPAWNED; - WRITEINT16(demo_p,metal->player->followmobj->info->height>>FRACBITS); + WRITEINT16(demobuf.p,metal->player->followmobj->info->height>>FRACBITS); if (metal->player->followmobj->flags2 & MF2_LINKDRAW) followtic |= FZT_LINKDRAW; if (metal->player->followmobj->colorized) followtic |= FZT_COLORIZED; if (followtic & FZT_SKIN) - WRITEUINT8(demo_p,(UINT8)(((skin_t *)(metal->player->followmobj->skin))-skins)); + WRITEUINT8(demobuf.p,(UINT8)(((skin_t *)(metal->player->followmobj->skin))-skins)); oldmetal.flags2 |= MF2_AMBUSH; } if (metal->player->followmobj->scale != metal->scale) { followtic |= FZT_SCALE; - WRITEFIXED(demo_p,metal->player->followmobj->scale); + WRITEFIXED(demobuf.p,metal->player->followmobj->scale); } temp = metal->player->followmobj->x-metal->x; - WRITEFIXED(demo_p,temp); + WRITEFIXED(demobuf.p,temp); temp = metal->player->followmobj->y-metal->y; - WRITEFIXED(demo_p,temp); + WRITEFIXED(demobuf.p,temp); temp = metal->player->followmobj->z-metal->z; - WRITEFIXED(demo_p,temp); + WRITEFIXED(demobuf.p,temp); if (followtic & FZT_SKIN) - WRITEUINT8(demo_p,metal->player->followmobj->sprite2); - WRITEUINT16(demo_p,metal->player->followmobj->sprite); - WRITEUINT32(demo_p,metal->player->followmobj->frame); // NOT & FF_FRAMEMASK here, so 32 bits - WRITEUINT16(demo_p,metal->player->followmobj->color); + WRITEUINT8(demobuf.p,metal->player->followmobj->sprite2); + WRITEUINT16(demobuf.p,metal->player->followmobj->sprite); + WRITEUINT32(demobuf.p,metal->player->followmobj->frame); // NOT & FF_FRAMEMASK here, so 32 bits + WRITEUINT16(demobuf.p,metal->player->followmobj->color); *followtic_p = followtic; } @@ -1995,7 +1995,7 @@ void G_WriteMetalTic(mobj_t *metal) // attention here for the ticcmd size! // latest demos with mouse aiming byte in ticcmd - if (demo_p >= demoend - 32) + if (demobuf.p >= demoend - 32) { G_StopMetalRecording(false); // no more space return; @@ -2015,11 +2015,11 @@ void G_RecordDemo(const char *name) maxsize = 1024*1024*2; if (M_CheckParm("-maxdemo") && M_IsNextParm()) maxsize = atoi(M_GetNextParm()) * 1024; -// if (demobuffer) -// free(demobuffer); - demo_p = NULL; - demobuffer = malloc(maxsize); - demoend = demobuffer + maxsize; +// if (demobuf.buffer) +// free(demobuf.buffer); + demobuf.p = NULL; + demobuf.buffer = malloc(maxsize); + demoend = demobuf.buffer + maxsize; demo.recording = true; } @@ -2030,9 +2030,9 @@ void G_RecordMetal(void) maxsize = 1024*1024; if (M_CheckParm("-maxdemo") && M_IsNextParm()) maxsize = atoi(M_GetNextParm()) * 1024; - demo_p = NULL; - demobuffer = malloc(maxsize); - demoend = demobuffer + maxsize; + demobuf.p = NULL; + demobuf.buffer = malloc(maxsize); + demoend = demobuf.buffer + maxsize; metalrecording = true; } @@ -2334,11 +2334,11 @@ void G_BeginRecording(void) char name[MAXCOLORNAME+1]; player_t *player = &players[consoleplayer]; - if (demo_p) + if (demobuf.p) return; memset(name,0,sizeof(name)); - demo_p = demobuffer; + demobuf.p = demobuf.buffer; demoflags = DF_GHOST|(multiplayer ? DF_MULTIPLAYER : (modeattacking<lumpname, MAXMAPLUMPNAME); - M_Memcpy(demo_p, mapmd5, 16); demo_p += 16; + M_Memcpy(demobuf.p, "PLAY", 4); demobuf.p += 4; + WRITESTRINGN(demobuf.p, mapheaderinfo[gamemap-1]->lumpname, MAXMAPLUMPNAME); + M_Memcpy(demobuf.p, mapmd5, 16); demobuf.p += 16; - WRITEUINT8(demo_p, demoflags); - WRITEUINT8(demo_p, gametype & 0xFF); - WRITEUINT8(demo_p, numlaps); + WRITEUINT8(demobuf.p, demoflags); + WRITEUINT8(demobuf.p, gametype & 0xFF); + WRITEUINT8(demobuf.p, numlaps); // file list - G_SaveDemoExtraFiles(&demo_p); + G_SaveDemoExtraFiles(&demobuf.p); // character list - G_SaveDemoSkins(&demo_p); + G_SaveDemoSkins(&demobuf.p); switch ((demoflags & DF_ATTACKMASK)>>DF_ATTACKSHIFT) { case ATTACKING_NONE: // 0 break; case ATTACKING_TIME: // 1 - demotime_p = demo_p; - WRITEUINT32(demo_p,UINT32_MAX); // time - WRITEUINT32(demo_p,UINT32_MAX); // lap + demotime_p = demobuf.p; + WRITEUINT32(demobuf.p,UINT32_MAX); // time + WRITEUINT32(demobuf.p,UINT32_MAX); // lap break; case ATTACKING_CAPSULES: // 2 - demotime_p = demo_p; - WRITEUINT32(demo_p,UINT32_MAX); // time + demotime_p = demobuf.p; + WRITEUINT32(demobuf.p,UINT32_MAX); // time break; default: // 3 break; @@ -2401,15 +2401,15 @@ void G_BeginRecording(void) for (i = 0; i < PRNUMCLASS; i++) { - WRITEUINT32(demo_p, P_GetInitSeed(i)); + WRITEUINT32(demobuf.p, P_GetInitSeed(i)); } // Reserved for extrainfo location from start of file - demoinfo_p = demo_p; - WRITEUINT32(demo_p, 0); + demoinfo_p = demobuf.p; + WRITEUINT32(demobuf.p, 0); // Save netvar data - CV_SaveDemoVars(&demo_p); + CV_SaveDemoVars(&demobuf.p); // Now store some info for each in-game player @@ -2421,7 +2421,7 @@ void G_BeginRecording(void) for (p = 0; p < MAXPLAYERS; p++) { if (playeringame[p]) { player = &players[p]; - WRITEUINT8(demo_p, p); + WRITEUINT8(demobuf.p, p); i = 0; if (player->spectator == true) @@ -2432,35 +2432,35 @@ void G_BeginRecording(void) i |= DEMO_SHRINKME; if (player->bot == true) i |= DEMO_BOT; - WRITEUINT8(demo_p, i); + WRITEUINT8(demobuf.p, i); if (i & DEMO_BOT) { - WRITEUINT8(demo_p, player->botvars.difficulty); - WRITEUINT8(demo_p, player->botvars.diffincrease); // needed to avoid having to duplicate logic - WRITEUINT8(demo_p, (UINT8)player->botvars.rival); + WRITEUINT8(demobuf.p, player->botvars.difficulty); + WRITEUINT8(demobuf.p, player->botvars.diffincrease); // needed to avoid having to duplicate logic + WRITEUINT8(demobuf.p, (UINT8)player->botvars.rival); } // Name memset(name, 0, 16); strncpy(name, player_names[p], 16); - M_Memcpy(demo_p,name,16); - demo_p += 16; + M_Memcpy(demobuf.p,name,16); + demobuf.p += 16; for (j = 0; j < MAXAVAILABILITY; j++) { - WRITEUINT8(demo_p, player->availabilities[j]); + WRITEUINT8(demobuf.p, player->availabilities[j]); } // Skin (now index into demo.skinlist) - WRITEUINT8(demo_p, player->skin); - WRITEUINT8(demo_p, player->lastfakeskin); + WRITEUINT8(demobuf.p, player->skin); + WRITEUINT8(demobuf.p, player->lastfakeskin); // Color memset(name, 0, 16); strncpy(name, skincolors[player->skincolor].name, 16); - M_Memcpy(demo_p,name,16); - demo_p += 16; + M_Memcpy(demobuf.p,name,16); + demobuf.p += 16; // Save follower's skin name // PS: We must check for 'follower' to determine if the followerskin is valid. It's going to be 0 if we don't have a follower, but 0 is also absolutely a valid follower! @@ -2472,8 +2472,8 @@ void G_BeginRecording(void) else strncpy(name, "None", 16); // Say we don't have one, then. - M_Memcpy(demo_p,name,16); - demo_p += 16; + M_Memcpy(demobuf.p,name,16); + demobuf.p += 16; // Save follower's colour memset(name, 0, 16); @@ -2483,26 +2483,26 @@ void G_BeginRecording(void) break; } strncpy(name, Followercolor_cons_t[j].strvalue, 16); // Not KartColor_Names because followercolor has extra values such as "Match" - M_Memcpy(demo_p, name, 16); - demo_p += 16; + M_Memcpy(demobuf.p, name, 16); + demobuf.p += 16; // Score, since Kart uses this to determine where you start on the map - WRITEUINT32(demo_p, player->score); + WRITEUINT32(demobuf.p, player->score); // Power Levels j = gametype == GT_BATTLE ? PWRLV_BATTLE : PWRLV_RACE; - WRITEUINT16(demo_p, clientpowerlevels[p][j]); + WRITEUINT16(demobuf.p, clientpowerlevels[p][j]); // And mobjtype_t is best with UINT32 too... - WRITEUINT32(demo_p, player->followitem); + WRITEUINT32(demobuf.p, player->followitem); } } - WRITEUINT8(demo_p, 0xFF); // Denote the end of the player listing + WRITEUINT8(demobuf.p, 0xFF); // Denote the end of the player listing // player lua vars, always saved even if empty if (demoflags & DF_LUAVARS) - LUA_Archive(&demo_p, false); + LUA_Archive(&demobuf.p, false); memset(&oldcmd,0,sizeof(oldcmd)); memset(&oldghost,0,sizeof(oldghost)); @@ -2536,22 +2536,22 @@ void G_BeginMetal(void) mobj_t *mo = players[consoleplayer].mo; #if 0 - if (demo_p) + if (demobuf.p) return; #endif - demo_p = demobuffer; + demobuf.p = demobuf.buffer; // Write header. - M_Memcpy(demo_p, DEMOHEADER, 12); demo_p += 12; - WRITEUINT8(demo_p,VERSION); - WRITEUINT8(demo_p,SUBVERSION); - WRITEUINT16(demo_p,DEMOVERSION); + M_Memcpy(demobuf.p, DEMOHEADER, 12); demobuf.p += 12; + WRITEUINT8(demobuf.p,VERSION); + WRITEUINT8(demobuf.p,SUBVERSION); + WRITEUINT16(demobuf.p,DEMOVERSION); // demo checksum - demo_p += 16; + demobuf.p += 16; - M_Memcpy(demo_p, "METL", 4); demo_p += 4; + M_Memcpy(demobuf.p, "METL", 4); demobuf.p += 4; memset(&ghostext,0,sizeof(ghostext)); ghostext[0].lastscale = ghostext[0].scale = FRACUNIT; @@ -2570,30 +2570,30 @@ void G_WriteStanding(UINT8 ranking, char *name, INT32 skinnum, UINT16 color, UIN if (demoinfo_p && *(UINT32 *)demoinfo_p == 0) { - WRITEUINT8(demo_p, DEMOMARKER); // add the demo end marker - *(UINT32 *)demoinfo_p = demo_p - demobuffer; + WRITEUINT8(demobuf.p, DEMOMARKER); // add the demo end marker + *(UINT32 *)demoinfo_p = demobuf.p - demobuf.buffer; } - WRITEUINT8(demo_p, DW_STANDING); - WRITEUINT8(demo_p, ranking); + WRITEUINT8(demobuf.p, DW_STANDING); + WRITEUINT8(demobuf.p, ranking); // Name memset(temp, 0, 16); strncpy(temp, name, 16); - M_Memcpy(demo_p,temp,16); - demo_p += 16; + M_Memcpy(demobuf.p,temp,16); + demobuf.p += 16; // Skin - WRITEUINT8(demo_p, skinnum); + WRITEUINT8(demobuf.p, skinnum); // Color memset(temp, 0, 16); strncpy(temp, skincolors[color].name, 16); - M_Memcpy(demo_p,temp,16); - demo_p += 16; + M_Memcpy(demobuf.p,temp,16); + demobuf.p += 16; // Score/time/whatever - WRITEUINT32(demo_p, val); + WRITEUINT32(demobuf.p, val); } void G_SetDemoTime(UINT32 ptime, UINT32 plap) @@ -2957,7 +2957,7 @@ void G_DoPlayDemo(char *defdemoname) // No demo name means we're restarting the current demo if (defdemoname == NULL) { - demo_p = demobuffer; + demobuf.p = demobuf.buffer; pdemoname = ZZ_Alloc(1); // Easier than adding checks for this everywhere it's freed } else @@ -2976,7 +2976,7 @@ void G_DoPlayDemo(char *defdemoname) if (FIL_CheckExtension(defdemoname)) { //FIL_DefaultExtension(defdemoname, ".lmp"); - if (!FIL_ReadFile(defdemoname, &demobuffer)) + if (!FIL_ReadFile(defdemoname, &demobuf.buffer)) { snprintf(msg, 1024, M_GetText("Failed to read file '%s'.\n"), defdemoname); CONS_Alert(CONS_ERROR, "%s", msg); @@ -2984,7 +2984,7 @@ void G_DoPlayDemo(char *defdemoname) M_StartMessage(msg, NULL, MM_NOTHING); return; } - demo_p = demobuffer; + demobuf.p = demobuf.buffer; } // load demo resource from WAD else if ((l = W_CheckNumForName(defdemoname)) == LUMPERROR) @@ -2997,7 +2997,7 @@ void G_DoPlayDemo(char *defdemoname) } else // it's an internal demo { - demobuffer = demo_p = W_CacheLumpNum(l, PU_STATIC); + demobuf.buffer = demobuf.p = W_CacheLumpNum(l, PU_STATIC); #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 @@ -3007,22 +3007,22 @@ void G_DoPlayDemo(char *defdemoname) // read demo header gameaction = ga_nothing; demo.playback = true; - if (memcmp(demo_p, DEMOHEADER, 12)) + if (memcmp(demobuf.p, DEMOHEADER, 12)) { snprintf(msg, 1024, M_GetText("%s is not a Ring Racers replay file.\n"), pdemoname); CONS_Alert(CONS_ERROR, "%s", msg); M_StartMessage(msg, NULL, MM_NOTHING); Z_Free(pdemoname); - Z_Free(demobuffer); + Z_Free(demobuf.buffer); demo.playback = false; demo.title = false; return; } - demo_p += 12; // DEMOHEADER + demobuf.p += 12; // DEMOHEADER - version = READUINT8(demo_p); - subversion = READUINT8(demo_p); - demo.version = READUINT16(demo_p); + version = READUINT8(demobuf.p); + subversion = READUINT8(demobuf.p); + demo.version = READUINT16(demobuf.p); switch(demo.version) { case DEMOVERSION: // latest always supported @@ -3033,48 +3033,48 @@ void G_DoPlayDemo(char *defdemoname) CONS_Alert(CONS_ERROR, "%s", msg); M_StartMessage(msg, NULL, MM_NOTHING); Z_Free(pdemoname); - Z_Free(demobuffer); + Z_Free(demobuf.buffer); demo.playback = false; demo.title = false; return; } // demo title - M_Memcpy(demo.titlename, demo_p, 64); - demo_p += 64; + M_Memcpy(demo.titlename, demobuf.p, 64); + demobuf.p += 64; - demo_p += 16; // demo checksum + demobuf.p += 16; // demo checksum - if (memcmp(demo_p, "PLAY", 4)) + if (memcmp(demobuf.p, "PLAY", 4)) { snprintf(msg, 1024, M_GetText("%s is the wrong type of recording and cannot be played.\n"), pdemoname); CONS_Alert(CONS_ERROR, "%s", msg); M_StartMessage(msg, NULL, MM_NOTHING); Z_Free(pdemoname); - Z_Free(demobuffer); + Z_Free(demobuf.buffer); demo.playback = false; demo.title = false; return; } - demo_p += 4; // "PLAY" - READSTRINGN(demo_p, mapname, sizeof(mapname)); // gamemap + demobuf.p += 4; // "PLAY" + READSTRINGN(demobuf.p, mapname, sizeof(mapname)); // gamemap gamemap = G_MapNumber(mapname)+1; - demo_p += 16; // mapmd5 + demobuf.p += 16; // mapmd5 - demoflags = READUINT8(demo_p); - gametype = READUINT8(demo_p); + demoflags = READUINT8(demobuf.p); + gametype = READUINT8(demobuf.p); G_SetGametype(gametype); - numlaps = READUINT8(demo_p); + numlaps = READUINT8(demobuf.p); if (demo.title) // Titledemos should always play and ought to always be compatible with whatever wadlist is running. - G_SkipDemoExtraFiles(&demo_p); + G_SkipDemoExtraFiles(&demobuf.p); else if (demo.loadfiles) - G_LoadDemoExtraFiles(&demo_p); + G_LoadDemoExtraFiles(&demobuf.p); else if (demo.ignorefiles) - G_SkipDemoExtraFiles(&demo_p); + G_SkipDemoExtraFiles(&demobuf.p); else { - UINT8 error = G_CheckDemoExtraFiles(&demo_p, false); + UINT8 error = G_CheckDemoExtraFiles(&demobuf.p, false); if (error) { @@ -3115,7 +3115,7 @@ void G_DoPlayDemo(char *defdemoname) if (!CON_Ready()) // In the console they'll just see the notice there! No point pulling them out. M_StartMessage(msg, NULL, MM_NOTHING); Z_Free(pdemoname); - Z_Free(demobuffer); + Z_Free(demobuf.buffer); demo.playback = false; demo.title = false; return; @@ -3123,14 +3123,14 @@ void G_DoPlayDemo(char *defdemoname) } // character list - demo.skinlist = G_LoadDemoSkins(&demo_p, &demo.numskins, true); + demo.skinlist = G_LoadDemoSkins(&demobuf.p, &demo.numskins, true); if (!demo.skinlist) { snprintf(msg, 1024, M_GetText("%s has an invalid skin list and cannot be played.\n"), pdemoname); CONS_Alert(CONS_ERROR, "%s", msg); M_StartMessage(msg, NULL, MM_NOTHING); Z_Free(pdemoname); - Z_Free(demobuffer); + Z_Free(demobuf.buffer); demo.playback = false; demo.title = false; return; @@ -3149,11 +3149,11 @@ void G_DoPlayDemo(char *defdemoname) case ATTACKING_NONE: // 0 break; case ATTACKING_TIME: // 1 - hu_demotime = READUINT32(demo_p); - hu_demolap = READUINT32(demo_p); + hu_demotime = READUINT32(demobuf.p); + hu_demolap = READUINT32(demobuf.p); break; case ATTACKING_CAPSULES: // 2 - hu_demotime = READUINT32(demo_p); + hu_demotime = READUINT32(demobuf.p); break; default: // 3 modeattacking = ATTACKING_NONE; @@ -3163,10 +3163,10 @@ void G_DoPlayDemo(char *defdemoname) // Random seed for (i = 0; i < PRNUMCLASS; i++) { - randseed[i] = READUINT32(demo_p); + randseed[i] = READUINT32(demobuf.p); } - demo_p += 4; // Extrainfo location + demobuf.p += 4; // Extrainfo location // ...*map* not loaded? if (!gamemap || (gamemap > nummapheaders) || !mapheaderinfo[gamemap-1] || mapheaderinfo[gamemap-1]->lumpnum == LUMPERROR) @@ -3177,17 +3177,17 @@ void G_DoPlayDemo(char *defdemoname) Z_Free(demo.skinlist); demo.skinlist = NULL; Z_Free(pdemoname); - Z_Free(demobuffer); + Z_Free(demobuf.buffer); demo.playback = false; demo.title = false; return; } // net var data - CV_LoadDemoVars(&demo_p); + CV_LoadDemoVars(&demobuf.p); // Sigh ... it's an empty demo. - if (*demo_p == DEMOMARKER) + if (*demobuf.p == DEMOMARKER) { snprintf(msg, 1024, M_GetText("%s contains no data to be played.\n"), pdemoname); CONS_Alert(CONS_ERROR, "%s", msg); @@ -3195,7 +3195,7 @@ void G_DoPlayDemo(char *defdemoname) Z_Free(demo.skinlist); demo.skinlist = NULL; Z_Free(pdemoname); - Z_Free(demobuffer); + Z_Free(demobuf.buffer); demo.playback = false; demo.title = false; return; @@ -3228,14 +3228,14 @@ void G_DoPlayDemo(char *defdemoname) memset(playeringame,0,sizeof(playeringame)); // Load players that were in-game when the map started - p = READUINT8(demo_p); + p = READUINT8(demobuf.p); for (i = 1; i < MAXSPLITSCREENPLAYERS; i++) displayplayers[i] = INT32_MAX; while (p != 0xFF) { - UINT8 flags = READUINT8(demo_p); + UINT8 flags = READUINT8(demobuf.p); spectator = !!(flags & DEMO_SPECTATOR); bot = !!(flags & DEMO_BOT); @@ -3250,7 +3250,7 @@ void G_DoPlayDemo(char *defdemoname) Z_Free(demo.skinlist); demo.skinlist = NULL; Z_Free(pdemoname); - Z_Free(demobuffer); + Z_Free(demobuf.buffer); demo.playback = false; demo.title = false; return; @@ -3268,7 +3268,7 @@ void G_DoPlayDemo(char *defdemoname) Z_Free(demo.skinlist); demo.skinlist = NULL; Z_Free(pdemoname); - Z_Free(demobuffer); + Z_Free(demobuf.buffer); demo.playback = false; demo.title = false; return; @@ -3292,35 +3292,35 @@ void G_DoPlayDemo(char *defdemoname) if ((players[p].bot = bot) == true) { - players[p].botvars.difficulty = READUINT8(demo_p); - players[p].botvars.diffincrease = READUINT8(demo_p); // needed to avoid having to duplicate logic - players[p].botvars.rival = (boolean)READUINT8(demo_p); + players[p].botvars.difficulty = READUINT8(demobuf.p); + players[p].botvars.diffincrease = READUINT8(demobuf.p); // needed to avoid having to duplicate logic + players[p].botvars.rival = (boolean)READUINT8(demobuf.p); } K_UpdateShrinkCheat(&players[p]); // Name - M_Memcpy(player_names[p],demo_p,16); - demo_p += 16; + M_Memcpy(player_names[p],demobuf.p,16); + demobuf.p += 16; for (i = 0; i < MAXAVAILABILITY; i++) { - availabilities[p][i] = READUINT8(demo_p); + availabilities[p][i] = READUINT8(demobuf.p); } // Skin - i = READUINT8(demo_p); + i = READUINT8(demobuf.p); if (i >= demo.numskins) i = 0; SetPlayerSkinByNum(p, demo.skinlist[i].mapping); demo.currentskinid[p] = ghostext[p].skinid = i; - lastfakeskin[p] = READUINT8(demo_p); + lastfakeskin[p] = READUINT8(demobuf.p); // Color - M_Memcpy(color,demo_p,16); - demo_p += 16; + M_Memcpy(color,demobuf.p,16); + demobuf.p += 16; for (i = 0; i < numskincolors; i++) if (!stricmp(skincolors[i].name,color)) // SRB2kart { @@ -3329,13 +3329,13 @@ void G_DoPlayDemo(char *defdemoname) } // Follower - M_Memcpy(follower, demo_p, 16); - demo_p += 16; + M_Memcpy(follower, demobuf.p, 16); + demobuf.p += 16; K_SetFollowerByName(p, follower); // Follower colour - M_Memcpy(color, demo_p, 16); - demo_p += 16; + M_Memcpy(color, demobuf.p, 16); + demobuf.p += 16; for (i = 0; i < numskincolors +2; i++) // +2 because of Match and Opposite { if (!stricmp(Followercolor_cons_t[i].strvalue, color)) @@ -3346,16 +3346,16 @@ void G_DoPlayDemo(char *defdemoname) } // Score, since Kart uses this to determine where you start on the map - players[p].score = READUINT32(demo_p); + players[p].score = READUINT32(demobuf.p); // Power Levels - clientpowerlevels[p][gametype == GT_BATTLE ? PWRLV_BATTLE : PWRLV_RACE] = READUINT16(demo_p); + clientpowerlevels[p][gametype == GT_BATTLE ? PWRLV_BATTLE : PWRLV_RACE] = READUINT16(demobuf.p); // Followitem - players[p].followitem = READUINT32(demo_p); + players[p].followitem = READUINT32(demobuf.p); // Look for the next player - p = READUINT8(demo_p); + p = READUINT8(demobuf.p); } // end of player read (the 0xFF marker) @@ -3366,7 +3366,7 @@ void G_DoPlayDemo(char *defdemoname) LUA_ClearState(); // No modeattacking check, DF_LUAVARS won't be present here. - LUA_UnArchive(&demo_p, false); + LUA_UnArchive(&demobuf.p, false); } splitscreen = 0; @@ -3909,13 +3909,13 @@ void G_DoneLevelLoad(void) // Writes the demo's checksum, or just random garbage if you can't do that for some reason. static void WriteDemoChecksum(void) { - UINT8 *p = demobuffer+16; // checksum position + UINT8 *p = demobuf.buffer+16; // checksum position #ifdef NOMD5 UINT8 i; for (i = 0; i < 16; i++, p++) *p = P_RandomByte(PR_UNDEFINED); // This MD5 was chosen by fair dice roll and most likely < 50% correct. #else - md5_buffer((char *)p+16, demo_p - (p+16), p); // make a checksum of everything after the checksum in the file. + md5_buffer((char *)p+16, demobuf.p - (p+16), p); // make a checksum of everything after the checksum in the file. #endif } @@ -3933,13 +3933,13 @@ void G_StopMetalDemo(void) ATTRNORETURN void FUNCNORETURN G_StopMetalRecording(boolean kill) { boolean saved = false; - if (demo_p) + if (demobuf.p) { - WRITEUINT8(demo_p, (kill) ? METALDEATH : DEMOMARKER); // add the demo end (or metal death) marker + WRITEUINT8(demobuf.p, (kill) ? METALDEATH : DEMOMARKER); // add the demo end (or metal death) marker WriteDemoChecksum(); - saved = FIL_WriteFile(va("%sMS.LMP", G_BuildMapName(gamemap)), demobuffer, demo_p - demobuffer); // finally output the file. + saved = FIL_WriteFile(va("%sMS.LMP", G_BuildMapName(gamemap)), demobuf.buffer, demobuf.p - demobuf.buffer); // finally output the file. } - free(demobuffer); + free(demobuf.buffer); metalrecording = false; if (saved) I_Error("Saved to %sMS.LMP", G_BuildMapName(gamemap)); @@ -4011,8 +4011,8 @@ static void G_StopTimingDemo(void) // called from stopdemo command, map command, and g_checkdemoStatus. void G_StopDemo(void) { - Z_Free(demobuffer); - demobuffer = NULL; + Z_Free(demobuf.buffer); + demobuf.buffer = NULL; demo.playback = false; if (demo.title) modeattacking = false; @@ -4089,7 +4089,7 @@ boolean G_CheckDemoStatus(void) void G_SaveDemo(void) { - UINT8 *p = demobuffer+16; // after version + UINT8 *p = demobuf.buffer+16; // after version UINT32 length; #ifdef NOMD5 UINT8 i; @@ -4098,10 +4098,10 @@ void G_SaveDemo(void) // Ensure extrainfo pointer is always available, even if no info is present. if (demoinfo_p && *(UINT32 *)demoinfo_p == 0) { - WRITEUINT8(demo_p, DEMOMARKER); // add the demo end marker - *(UINT32 *)demoinfo_p = demo_p - demobuffer; + WRITEUINT8(demobuf.p, DEMOMARKER); // add the demo end marker + *(UINT32 *)demoinfo_p = demobuf.p - demobuf.buffer; } - WRITEUINT8(demo_p, DW_END); // Mark end of demo extra data. + WRITEUINT8(demobuf.p, DW_END); // Mark end of demo extra data. M_Memcpy(p, demo.titlename, 64); // Write demo title here p += 64; @@ -4154,12 +4154,12 @@ void G_SaveDemo(void) *p = M_RandomByte(); // This MD5 was chosen by fair dice roll and most likely < 50% correct. #else // Make a checksum of everything after the checksum in the file up to the end of the standard data. Extrainfo is freely modifiable. - md5_buffer((char *)p+16, (demobuffer + length) - (p+16), p); + md5_buffer((char *)p+16, (demobuf.buffer + length) - (p+16), p); #endif - if (FIL_WriteFile(demoname, demobuffer, demo_p - demobuffer)) // finally output the file. + if (FIL_WriteFile(demoname, demobuf.buffer, demobuf.p - demobuf.buffer)) // finally output the file. demo.savemode = DSM_SAVED; - free(demobuffer); + free(demobuf.buffer); demo.recording = false; if (!modeattacking) diff --git a/src/g_demo.h b/src/g_demo.h index e9e5be0a9..d24ed3bbb 100644 --- a/src/g_demo.h +++ b/src/g_demo.h @@ -22,8 +22,6 @@ extern "C" { #endif -extern UINT8 *demo_p; - // ====================================== // DEMO playback/recording related stuff. // ====================================== From 77d54a09fec93aa285fc579cdfd1f6d8e5cb858b Mon Sep 17 00:00:00 2001 From: James R Date: Sun, 25 Dec 2022 14:11:38 -0800 Subject: [PATCH 03/13] Remove global lua_save_p and use savebuffer_t for LUA_Archive / LUA_UnArchive --- src/d_netcmd.c | 4 ++-- src/g_demo.c | 4 ++-- src/lua_hooklib.c | 7 ++++--- src/lua_script.c | 34 ++++++++++++++++------------------ src/lua_script.h | 6 +++--- src/p_saveg.c | 4 ++-- 6 files changed, 29 insertions(+), 30 deletions(-) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 6a416cbfd..5d749a72e 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -5798,7 +5798,7 @@ static void Command_Archivetest_f(void) // test archive CONS_Printf("LUA_Archive...\n"); - LUA_Archive(&save.p, true); + LUA_Archive(&save, true); WRITEUINT8(save.p, 0x7F); wrote = (UINT32)(save.p - save.buffer); @@ -5809,7 +5809,7 @@ static void Command_Archivetest_f(void) // test unarchive save.p = save.buffer; CONS_Printf("LUA_UnArchive...\n"); - LUA_UnArchive(&save.p, true); + 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)); diff --git a/src/g_demo.c b/src/g_demo.c index 57dfdc9fa..95353790e 100644 --- a/src/g_demo.c +++ b/src/g_demo.c @@ -2502,7 +2502,7 @@ void G_BeginRecording(void) // player lua vars, always saved even if empty if (demoflags & DF_LUAVARS) - LUA_Archive(&demobuf.p, false); + LUA_Archive(&demobuf, false); memset(&oldcmd,0,sizeof(oldcmd)); memset(&oldghost,0,sizeof(oldghost)); @@ -3366,7 +3366,7 @@ void G_DoPlayDemo(char *defdemoname) LUA_ClearState(); // No modeattacking check, DF_LUAVARS won't be present here. - LUA_UnArchive(&demobuf.p, false); + LUA_UnArchive(&demobuf, false); } splitscreen = 0; diff --git a/src/lua_hooklib.c b/src/lua_hooklib.c index 142d01490..fd222cdd1 100644 --- a/src/lua_hooklib.c +++ b/src/lua_hooklib.c @@ -834,7 +834,7 @@ int LUA_HookHurtMsg(player_t *player, mobj_t *inflictor, mobj_t *source, UINT8 d return hook.status; } -void LUA_HookNetArchive(lua_CFunction archFunc) +void LUA_HookNetArchive(lua_CFunction archFunc, savebuffer_t *save) { const hook_t * map = &hookIds[HOOK(NetVars)]; Hook_State hook; @@ -852,8 +852,9 @@ void LUA_HookNetArchive(lua_CFunction archFunc) // tables becomes an upvalue of archFunc lua_pushvalue(gL, -1); - lua_pushcclosure(gL, archFunc, 1); - // stack: tables, archFunc + lua_pushlightuserdata(gL, save); + lua_pushcclosure(gL, archFunc, 2); + // stack: tables, savebuffer_t, archFunc init_hook_call(&hook, 0, res_none); call_mapped(&hook, map); diff --git a/src/lua_script.c b/src/lua_script.c index 5f12ab416..3a6d53c98 100644 --- a/src/lua_script.c +++ b/src/lua_script.c @@ -41,8 +41,6 @@ lua_State *gL = NULL; int hook_defrosting; -static UINT8 **lua_save_p = NULL; // FIXME: Remove this horrible hack - // List of internal libraries to load from SRB2 static lua_CFunction liblist[] = { LUA_EnumLib, // global metatable for enums @@ -1355,9 +1353,10 @@ static void ArchiveExtVars(UINT8 **p, void *pointer, const char *ptype) static int NetArchive(lua_State *L) { int TABLESINDEX = lua_upvalueindex(1); + savebuffer_t *save = lua_touserdata(L, lua_upvalueindex(2)); int i, n = lua_gettop(L); for (i = 1; i <= n; i++) - ArchiveValue(lua_save_p, TABLESINDEX, i); + ArchiveValue(&save->p, TABLESINDEX, i); return n; } @@ -1568,9 +1567,10 @@ static void UnArchiveExtVars(UINT8 **p, void *pointer) static int NetUnArchive(lua_State *L) { int TABLESINDEX = lua_upvalueindex(1); + savebuffer_t *save = lua_touserdata(L, lua_upvalueindex(2)); int i, n = lua_gettop(L); for (i = 1; i <= n; i++) - UnArchiveValue(lua_save_p, TABLESINDEX); + UnArchiveValue(&save->p, TABLESINDEX); return n; } @@ -1628,7 +1628,7 @@ void LUA_Step(void) lua_gc(gL, LUA_GCSTEP, 1); } -void LUA_Archive(UINT8 **p, boolean network) +void LUA_Archive(savebuffer_t *save, boolean network) { INT32 i; thinker_t *th; @@ -1641,7 +1641,7 @@ void LUA_Archive(UINT8 **p, boolean network) if (!playeringame[i] && i > 0) // NEVER skip player 0, this is for dedi servs. continue; // all players in game will be archived, even if they just add a 0. - ArchiveExtVars(p, &players[i], "player"); + ArchiveExtVars(&save->p, &players[i], "player"); } if (network == true) @@ -1655,23 +1655,22 @@ void LUA_Archive(UINT8 **p, boolean network) // archive function will determine when to skip mobjs, // and write mobjnum in otherwise. - ArchiveExtVars(p, th, "mobj"); + ArchiveExtVars(&save->p, th, "mobj"); } } - WRITEUINT32(*p, UINT32_MAX); // end of mobjs marker, replaces mobjnum. + WRITEUINT32(save->p, UINT32_MAX); // end of mobjs marker, replaces mobjnum. - lua_save_p = p; - LUA_HookNetArchive(NetArchive); // call the NetArchive hook in archive mode + LUA_HookNetArchive(NetArchive, save); // call the NetArchive hook in archive mode } - ArchiveTables(p); + ArchiveTables(&save->p); if (gL) lua_pop(gL, 1); // pop tables } -void LUA_UnArchive(UINT8 **p, boolean network) +void LUA_UnArchive(savebuffer_t *save, boolean network) { UINT32 mobjnum; INT32 i; @@ -1684,28 +1683,27 @@ void LUA_UnArchive(UINT8 **p, boolean network) { if (!playeringame[i] && i > 0) // same here, this is to synch dediservs properly. continue; - UnArchiveExtVars(p, &players[i]); + UnArchiveExtVars(&save->p, &players[i]); } if (network == true) { do { - mobjnum = READUINT32(*p); // read a mobjnum + mobjnum = READUINT32(save->p); // read a mobjnum for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next) { if (th->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed) continue; if (((mobj_t *)th)->mobjnum != mobjnum) // find matching mobj continue; - UnArchiveExtVars(p, th); // apply variables + UnArchiveExtVars(&save->p, th); // apply variables } } while(mobjnum != UINT32_MAX); // repeat until end of mobjs marker. - lua_save_p = p; - LUA_HookNetArchive(NetUnArchive); // call the NetArchive hook in unarchive mode + LUA_HookNetArchive(NetUnArchive, save); // call the NetArchive hook in unarchive mode } - UnArchiveTables(p); + UnArchiveTables(&save->p); if (gL) lua_pop(gL, 1); // pop tables diff --git a/src/lua_script.h b/src/lua_script.h index 51a9af85e..9bfddc875 100644 --- a/src/lua_script.h +++ b/src/lua_script.h @@ -57,8 +57,8 @@ void LUA_DumpFile(const char *filename); #endif fixed_t LUA_EvalMath(const char *word); void LUA_Step(void); -void LUA_Archive(UINT8 **p, boolean network); -void LUA_UnArchive(UINT8 **p, boolean network); +void LUA_Archive(savebuffer_t *save, boolean network); +void LUA_UnArchive(savebuffer_t *save, boolean network); int LUA_PushGlobals(lua_State *L, const char *word); int LUA_WriteGlobals(lua_State *L, const char *word); @@ -67,7 +67,7 @@ void Got_Luacmd(UINT8 **cp, INT32 playernum); // lua_consolelib.c void LUA_CVarChanged(void *cvar); // lua_consolelib.c int Lua_optoption(lua_State *L, int narg, const char *def, const char *const lst[]); -void LUA_HookNetArchive(lua_CFunction archFunc); +void LUA_HookNetArchive(lua_CFunction archFunc, savebuffer_t *save); void LUA_PushTaggableObjectArray ( lua_State *L, diff --git a/src/p_saveg.c b/src/p_saveg.c index ed009c189..562616b63 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -5164,7 +5164,7 @@ void P_SaveNetGame(savebuffer_t *save, boolean resending) P_NetArchiveTubeWaypoints(save); P_NetArchiveWaypoints(save); } - LUA_Archive(&save->p, true); + LUA_Archive(save, true); P_NetArchiveRNG(save); @@ -5214,7 +5214,7 @@ boolean P_LoadNetGame(savebuffer_t *save, boolean reloading) P_FinishMobjs(); } - LUA_UnArchive(&save->p, true); + LUA_UnArchive(save, true); P_NetUnArchiveRNG(save); From 761be01dbbd10bc54ed2c5412de328a2264fd14e Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Mon, 26 Dec 2022 17:45:25 -0500 Subject: [PATCH 04/13] Contain end & size into savebuffer_t I would've liked to make it use a single allocate function to do this very cleanly, but these cases were very clearly not meant to be standardized and use wildly different methods to allocate & free... --- src/d_clisrv.c | 33 ++++++++++++++++++++------------- src/d_clisrv.h | 3 ++- src/d_netcmd.c | 4 +++- src/g_demo.c | 26 ++++++++++++++++---------- src/g_game.c | 23 ++++++++++++----------- src/k_profiles.c | 5 +++-- src/p_saveg.h | 8 ++++++++ src/p_setup.c | 3 +++ 8 files changed, 67 insertions(+), 38 deletions(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index 360bb05b7..07c756d53 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -1128,8 +1128,6 @@ static boolean SV_SendServerConfig(INT32 node) return waspacketsent; } -#define SAVEGAMESIZE (768*1024) - static boolean SV_ResendingSavegameToAnyone(void) { INT32 i; @@ -1148,7 +1146,8 @@ static void SV_SendSaveGame(INT32 node, boolean resending) UINT8 *buffertosend; // first save it in a malloced buffer - save.buffer = (UINT8 *)malloc(SAVEGAMESIZE); + save.size = NETSAVEGAMESIZE; + save.buffer = (UINT8 *)malloc(save.size); if (!save.buffer) { CONS_Alert(CONS_ERROR, M_GetText("No more free memory for savegame\n")); @@ -1157,14 +1156,14 @@ static void SV_SendSaveGame(INT32 node, boolean resending) // Leave room for the uncompressed length. save.p = save.buffer + sizeof(UINT32); + save.end = save.buffer + save.size; P_SaveNetGame(&save, resending); length = save.p - save.buffer; - if (length > SAVEGAMESIZE) + if (length > NETSAVEGAMESIZE) { free(save.buffer); - save.p = NULL; I_Error("Savegame buffer overrun"); } @@ -1178,10 +1177,9 @@ static void SV_SendSaveGame(INT32 node, boolean resending) } // Attempt to compress it. - if((compressedlen = lzf_compress(save.buffer + sizeof(UINT32), length - sizeof(UINT32), compressedsave + sizeof(UINT32), length - sizeof(UINT32) - 1))) + 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); // State that we're compressed. @@ -1192,7 +1190,6 @@ static void SV_SendSaveGame(INT32 node, boolean resending) else { // Compression failed to make it smaller; send original - free(compressedsave); // State that we're not compressed @@ -1201,7 +1198,6 @@ static void SV_SendSaveGame(INT32 node, boolean resending) } AddRamToSendQueue(node, buffertosend, length, SF_RAM, 0); - save.p = NULL; // Remember when we started sending the savegame so we can handle timeouts sendingsavegame[node] = true; @@ -1224,20 +1220,22 @@ static void SV_SavedGame(void) sprintf(tmpsave, "%s" PATHSEP TMPSAVENAME, srb2home); // first save it in a malloced buffer - save.p = save.buffer = (UINT8 *)malloc(SAVEGAMESIZE); + save.size = NETSAVEGAMESIZE; + save.p = save.buffer = (UINT8 *)malloc(save.size); if (!save.p) { 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 > SAVEGAMESIZE) + if (length > NETSAVEGAMESIZE) { free(save.buffer); - save.p = NULL; I_Error("Savegame buffer overrun"); } @@ -1246,7 +1244,6 @@ static void SV_SavedGame(void) CONS_Printf(M_GetText("Didn't save %s for netgame"), tmpsave); free(save.buffer); - save.p = NULL; } #undef TMPSAVENAME @@ -1272,15 +1269,21 @@ static void CL_LoadReceivedSavegame(boolean reloading) } save.p = save.buffer; + save.size = length; + save.end = save.buffer + save.size; // Decompress saved game if necessary. decompressedlen = READUINT32(save.p); 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; } paused = false; @@ -6075,6 +6078,8 @@ rewind_t *CL_SaveRewindPoint(size_t demopos) return NULL; save.buffer = save.p = rewind->savebuffer; + save.size = NETSAVEGAMESIZE; + save.end = save.buffer + save.size; P_SaveNetGame(&save, false); @@ -6102,6 +6107,8 @@ rewind_t *CL_RewindToTime(tic_t time) return NULL; save.buffer = save.p = rewindhead->savebuffer; + save.size = NETSAVEGAMESIZE; + save.end = save.buffer + save.size; P_LoadNetGame(&save, false); diff --git a/src/d_clisrv.h b/src/d_clisrv.h index e2e49ee2d..a648b07ae 100644 --- a/src/d_clisrv.h +++ b/src/d_clisrv.h @@ -22,6 +22,7 @@ #include "mserv.h" #include "k_pwrlv.h" // PWRLV_NUMTYPES +#include "p_saveg.h" // NETSAVEGAMESIZE #ifdef __cplusplus extern "C" { @@ -534,7 +535,7 @@ extern boolean hu_stopped; // struct rewind_t { - UINT8 savebuffer[(768*1024)]; + UINT8 savebuffer[NETSAVEGAMESIZE]; tic_t leveltime; size_t demopos; diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 5d749a72e..975c165ad 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -5794,7 +5794,9 @@ static void Command_Archivetest_f(void) ((mobj_t *)th)->mobjnum = i++; // allocate buffer - save.buffer = save.p = ZZ_Alloc(1024); + save.size = 1024; + save.buffer = save.p = ZZ_Alloc(save.size); + save.end = save.buffer + save.size; // test archive CONS_Printf("LUA_Archive...\n"); diff --git a/src/g_demo.c b/src/g_demo.c index 95353790e..579d786f5 100644 --- a/src/g_demo.c +++ b/src/g_demo.c @@ -72,7 +72,6 @@ tic_t demostarttime; // for comparative timing purposes static char demoname[MAX_WADPATH]; static savebuffer_t demobuf; static UINT8 *demotime_p, *demoinfo_p; -static UINT8 *demoend; static UINT8 demoflags; boolean demosynced = true; // console warning message @@ -151,7 +150,7 @@ demoghost *ghosts = NULL; #define ZT_FLAGS 0x80 // OUT OF ZIPTICS... -#define DEMOMARKER 0x80 // demoend +#define DEMOMARKER 0x80 // demobuf.end UINT8 demo_extradata[MAXPLAYERS]; UINT8 demo_writerng; // 0=no, 1=yes, 2=yes but on a timeout @@ -630,7 +629,7 @@ void G_WriteDemoTiccmd(ticcmd_t *cmd, INT32 playernum) // attention here for the ticcmd size! // latest demos with mouse aiming byte in ticcmd - if (!(demoflags & DF_GHOST) && ziptic_p > demoend - 9) + if (!(demoflags & DF_GHOST) && ziptic_p > demobuf.end - 9) { G_CheckDemoStatus(); // no more space return; @@ -703,7 +702,7 @@ void G_WriteAllGhostTics(void) // attention here for the ticcmd size! // latest demos with mouse aiming byte in ticcmd - if (demobuf.p >= demoend - (13 + 9 + 9)) + if (demobuf.p >= demobuf.end - (13 + 9 + 9)) { G_CheckDemoStatus(); // no more space return; @@ -1995,7 +1994,7 @@ void G_WriteMetalTic(mobj_t *metal) // attention here for the ticcmd size! // latest demos with mouse aiming byte in ticcmd - if (demobuf.p >= demoend - 32) + if (demobuf.p >= demobuf.end - 32) { G_StopMetalRecording(false); // no more space return; @@ -2013,13 +2012,17 @@ void G_RecordDemo(const char *name) strcat(demoname, ".lmp"); //@TODO make a maxdemosize cvar maxsize = 1024*1024*2; + if (M_CheckParm("-maxdemo") && M_IsNextParm()) maxsize = atoi(M_GetNextParm()) * 1024; + // if (demobuf.buffer) -// free(demobuf.buffer); +// P_SaveBufferFree(&demobuf); + + demobuf.size = maxsize; + demobuf.buffer = (UINT8 *)malloc(maxsize); demobuf.p = NULL; - demobuf.buffer = malloc(maxsize); - demoend = demobuf.buffer + maxsize; + demobuf.end = demobuf.buffer + demobuf.size; demo.recording = true; } @@ -2030,9 +2033,12 @@ void G_RecordMetal(void) maxsize = 1024*1024; if (M_CheckParm("-maxdemo") && M_IsNextParm()) maxsize = atoi(M_GetNextParm()) * 1024; + + demobuf.size = maxsize; + demobuf.buffer = (UINT8 *)malloc(maxsize); demobuf.p = NULL; - demobuf.buffer = malloc(maxsize); - demoend = demobuf.buffer + maxsize; + demobuf.end = demobuf.buffer + demobuf.size; + metalrecording = true; } diff --git a/src/g_game.c b/src/g_game.c index 60cacbd66..da3a58986 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -72,9 +72,6 @@ UINT8 ultimatemode = false; JoyType_t Joystick[MAXSPLITSCREENPLAYERS]; -// 1024 bytes is plenty for a savegame -#define SAVEGAMESIZE (1024) - // SRB2kart char gamedatafilename[64] = #if defined (TESTERS) || defined (HOSTTESTERS) @@ -4533,12 +4530,14 @@ void G_SaveGameData(void) } length += nummapheaders * (MAXMAPLUMPNAME+1+4+4); - save.p = save.buffer = (UINT8 *)malloc(length); + save.size = length; + save.p = save.buffer = (UINT8 *)malloc(save.size); if (!save.p) { CONS_Alert(CONS_ERROR, M_GetText("No more free memory for saving game data\n")); return; } + save.end = save.buffer + save.size; // Version test @@ -4626,7 +4625,6 @@ void G_SaveGameData(void) FIL_WriteFile(va(pandf, srb2home, gamedatafilename), save.buffer, length); free(save.buffer); - save.p = save.buffer = NULL; // Also save profiles here. PR_SaveProfiles(); @@ -4666,6 +4664,8 @@ void G_LoadGame(UINT32 slot, INT16 mapoverride) } 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); @@ -4680,7 +4680,6 @@ void G_LoadGame(UINT32 slot, INT16 mapoverride) M_StartMessage(M_GetText("Save game from different version\n\nPress ESC\n"), NULL, MM_NOTHING); Command_ExitGame_f(); Z_Free(save.buffer); - save.p = save.buffer = NULL; // no cheating! memset(&savedata, 0, sizeof(savedata)); @@ -4716,7 +4715,6 @@ void G_LoadGame(UINT32 slot, INT16 mapoverride) // done Z_Free(save.buffer); - save.p = save.buffer = NULL; // gameaction = ga_nothing; // G_SetGamestate(GS_LEVEL); @@ -4755,12 +4753,14 @@ void G_SaveGame(UINT32 slot, INT16 mapnum) char name[VERSIONSIZE]; size_t length; - save.p = save.buffer = (UINT8 *)malloc(SAVEGAMESIZE); + save.size = SAVEGAMESIZE; + save.p = save.buffer = (UINT8 *)malloc(save.size); if (!save.p) { 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); @@ -4779,7 +4779,6 @@ void G_SaveGame(UINT32 slot, INT16 mapnum) length = save.p - save.buffer; saved = FIL_WriteFile(backup, save.buffer, length); free(save.buffer); - save.p = save.buffer = NULL; } gameaction = ga_nothing; @@ -4791,7 +4790,7 @@ void G_SaveGame(UINT32 slot, INT16 mapnum) } #define BADSAVE goto cleanup; -#define CHECKPOS if (save.p >= end_p) BADSAVE +#define CHECKPOS if (save.p >= save.end) BADSAVE void G_SaveGameOver(UINT32 slot, boolean modifylives) { boolean saved = false; @@ -4816,11 +4815,13 @@ void G_SaveGameOver(UINT32 slot, boolean modifylives) { char temp[sizeof(timeattackfolder)]; - UINT8 *end_p = save.buffer + length; 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); diff --git a/src/k_profiles.c b/src/k_profiles.c index f24d623ab..1163b1f8d 100644 --- a/src/k_profiles.c +++ b/src/k_profiles.c @@ -219,12 +219,14 @@ void PR_SaveProfiles(void) UINT8 i, j, k; savebuffer_t save; - save.p = save.buffer = (UINT8 *)malloc(sizeof(UINT32) + (numprofiles * sizeof(profile_t))); + save.size = sizeof(UINT32) + (numprofiles * sizeof(profile_t)); + save.p = save.buffer = (UINT8 *)malloc(save.size); if (!save.p) { I_Error("No more free memory for saving profiles\n"); return; } + save.end = save.buffer + save.size; // Add header. WRITESTRINGN(save.p, PROFILEHEADER, headerlen); @@ -272,7 +274,6 @@ void PR_SaveProfiles(void) I_Error("Couldn't save profiles. Are you out of Disk space / playing in a protected folder?"); } free(save.buffer); - save.p = save.buffer = NULL; } void PR_LoadProfiles(void) diff --git a/src/p_saveg.h b/src/p_saveg.h index 538febcf9..a0b0f8587 100644 --- a/src/p_saveg.h +++ b/src/p_saveg.h @@ -22,6 +22,12 @@ extern "C" { #pragma interface #endif +// 1024 bytes is plenty for a savegame +#define SAVEGAMESIZE (1024) + +// For netgames +#define NETSAVEGAMESIZE (768*1024) + // Persistent storage/archiving. // These are the load / save game routines. @@ -47,6 +53,8 @@ struct savebuffer_t { UINT8 *buffer; UINT8 *p; + UINT8 *end; + size_t size; }; #ifdef __cplusplus diff --git a/src/p_setup.c b/src/p_setup.c index b32c5126c..e2e11a613 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -725,6 +725,7 @@ void P_WriteThings(void) savebuffer_t save; INT16 temp; + save.size = nummapthings * sizeof (mapthing_t); save.p = save.buffer = (UINT8 *)malloc(nummapthings * sizeof (mapthing_t)); if (!save.p) @@ -733,6 +734,8 @@ void P_WriteThings(void) return; } + save.end = save.buffer + save.size; + mt = mapthings; for (i = 0; i < nummapthings; i++, mt++) { From aa4fd8ab139777dca79e65176e2fe3c14761036b Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Mon, 2 Jan 2023 19:47:59 -0500 Subject: [PATCH 05/13] Add functions to initialize savebuffer_t g_demo.c is mostly unaltered because it is made of twigs. --- src/d_clisrv.c | 66 ++++++++++++++--------------------- src/d_netcmd.c | 14 +++++--- src/g_demo.c | 38 +++++++++------------ src/g_game.c | 66 ++++++++++++----------------------- src/k_profiles.c | 15 +++----- src/p_saveg.c | 89 ++++++++++++++++++++++++++++++++++++++++++++++++ src/p_saveg.h | 7 ++++ src/p_setup.c | 9 ++--- 8 files changed, 174 insertions(+), 130 deletions(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index 07c756d53..7efe8cf6f 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -1141,29 +1141,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"); } @@ -1180,7 +1177,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; @@ -1211,7 +1208,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) @@ -1220,22 +1217,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"); } @@ -1243,7 +1236,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 @@ -1253,37 +1246,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; @@ -1315,10 +1302,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(); @@ -6067,7 +6057,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) @@ -6077,10 +6067,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; @@ -6093,7 +6080,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) @@ -6106,10 +6093,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! diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 975c165ad..61b737ce9 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -5778,7 +5778,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) @@ -5794,9 +5794,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"); @@ -5814,10 +5816,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 diff --git a/src/g_demo.c b/src/g_demo.c index 579d786f5..5e39d83fc 100644 --- a/src/g_demo.c +++ b/src/g_demo.c @@ -70,7 +70,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 @@ -2019,10 +2019,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; } @@ -2034,10 +2032,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; } @@ -2982,7 +2978,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); @@ -2990,20 +2986,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 @@ -3945,7 +3941,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)); @@ -4165,7 +4161,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) diff --git a/src/g_game.c b/src/g_game.c index da3a58986..3c11de495 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -4303,12 +4303,11 @@ void G_LoadGameSettings(void) // Loads the main data file, which stores information such as emblems found, etc. void G_LoadGameData(void) { - size_t length; UINT32 i, j; UINT32 versionID; UINT8 versionMinor; UINT8 rtemp; - savebuffer_t save; + savebuffer_t save = {0}; //For records UINT32 numgamedatamapheaders; @@ -4337,16 +4336,13 @@ void G_LoadGameData(void) return; } - length = FIL_ReadFile(va(pandf, srb2home, gamedatafilename), &save.buffer); - if (!length) + if (P_SaveBufferFromFile(&save, va(pandf, srb2home, gamedatafilename)) == false) { // No gamedata. We can save a new one. gamedata->loaded = true; return; } - save.p = save.buffer; - // Version check versionID = READUINT32(save.p); if (versionID != GD_VERSIONCHECK) @@ -4355,16 +4351,14 @@ void G_LoadGameData(void) if (strcmp(srb2home,".")) gdfolder = srb2home; - Z_Free(save.buffer); - save.p = NULL; + P_SaveBufferFree(&save); I_Error("Game data is not for Ring Racers v2.0.\nDelete %s(maybe in %s) and try again.", gamedatafilename, gdfolder); } versionMinor = READUINT8(save.p); if (versionMinor > GD_VERSIONMINOR) { - Z_Free(save.buffer); - save.p = NULL; + P_SaveBufferFree(&save); I_Error("Game data is from the future! (expected %d, got %d)", GD_VERSIONMINOR, versionMinor); } @@ -4475,8 +4469,7 @@ void G_LoadGameData(void) } // done - Z_Free(save.buffer); - save.p = NULL; + P_SaveBufferFree(&save); // Don't consider loaded until it's a success! // It used to do this much earlier, but this would cause the gamedata to @@ -4496,8 +4489,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); } @@ -4510,7 +4502,7 @@ void G_SaveGameData(void) size_t length; INT32 i, j; UINT8 btemp; - savebuffer_t save; + savebuffer_t save = {0}; if (!gamedata->loaded) return; // If never loaded (-nodata), don't save @@ -4530,14 +4522,11 @@ void G_SaveGameData(void) } length += nummapheaders * (MAXMAPLUMPNAME+1+4+4); - save.size = length; - save.p = save.buffer = (UINT8 *)malloc(save.size); - 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; // Version test @@ -4624,7 +4613,7 @@ void G_SaveGameData(void) length = save.p - save.buffer; FIL_WriteFile(va(pandf, srb2home, gamedatafilename), save.buffer, length); - free(save.buffer); + P_SaveBufferFree(&save); // Also save profiles here. PR_SaveProfiles(); @@ -4638,10 +4627,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)); @@ -4656,17 +4644,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)) @@ -4679,7 +4662,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)); @@ -4714,7 +4697,7 @@ void G_LoadGame(UINT32 slot, INT16 mapoverride) } // done - Z_Free(save.buffer); + P_SaveBufferFree(&save); // gameaction = ga_nothing; // G_SetGamestate(GS_LEVEL); @@ -4740,7 +4723,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); @@ -4753,14 +4736,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); @@ -4778,7 +4758,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; @@ -4798,7 +4778,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); @@ -4806,22 +4786,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); @@ -4892,9 +4869,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 diff --git a/src/k_profiles.c b/src/k_profiles.c index 1163b1f8d..313dc84f8 100644 --- a/src/k_profiles.c +++ b/src/k_profiles.c @@ -217,16 +217,13 @@ void PR_SaveProfiles(void) size_t length = 0; const size_t headerlen = strlen(PROFILEHEADER); UINT8 i, j, k; - savebuffer_t save; + savebuffer_t save = {0}; - save.size = sizeof(UINT32) + (numprofiles * sizeof(profile_t)); - save.p = save.buffer = (UINT8 *)malloc(save.size); - if (!save.p) + if (P_SaveBufferAlloc(&save, sizeof(UINT32) + (numprofiles * sizeof(profile_t))) == false) { I_Error("No more free memory for saving profiles\n"); return; } - save.end = save.buffer + save.size; // Add header. WRITESTRINGN(save.p, PROFILEHEADER, headerlen); @@ -278,7 +275,6 @@ void PR_SaveProfiles(void) void PR_LoadProfiles(void) { - size_t length = 0; const size_t headerlen = strlen(PROFILEHEADER); UINT8 i, j, k, version; profile_t *dprofile = PR_MakeProfile( @@ -289,18 +285,15 @@ void PR_LoadProfiles(void) gamecontroldefault, true ); - savebuffer_t save; + savebuffer_t save = {0}; - length = FIL_ReadFile(va(pandf, srb2home, PROFILESFILE), &save.buffer); - if (!length) + if (P_SaveBufferFromFile(&save, va(pandf, srb2home, PROFILESFILE)) == false) { // No profiles. Add the default one. PR_AddProfile(dprofile); return; } - save.p = save.buffer; - if (strncmp(PROFILEHEADER, (const char *)save.buffer, headerlen)) { const char *gdfolder = "the Ring Racers folder"; diff --git a/src/p_saveg.c b/src/p_saveg.c index 562616b63..946e77faa 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -5226,3 +5226,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); +} diff --git a/src/p_saveg.h b/src/p_saveg.h index a0b0f8587..66ba58b00 100644 --- a/src/p_saveg.h +++ b/src/p_saveg.h @@ -57,6 +57,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 diff --git a/src/p_setup.c b/src/p_setup.c index e2e11a613..407f9f42f 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -722,20 +722,15 @@ void P_WriteThings(void) const char * filename; 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++) { From 9336e39350ce0b2fcf3bc4cf0005923900b2fd7f Mon Sep 17 00:00:00 2001 From: toaster Date: Tue, 3 Jan 2023 16:03:47 +0000 Subject: [PATCH 06/13] Use Zone memory functions for sending compressed saves Fixes an issue where `SF_RAM` meant `free()` was being called on Zone memory produced by `P_SaveBufferAlloc` --- src/d_clisrv.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index 7efe8cf6f..00cff178e 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -1166,7 +1166,7 @@ static void SV_SendSaveGame(INT32 node, boolean resending) // Allocate space for compressed save: one byte fewer than for the // uncompressed data to ensure that the compression is worthwhile. - compressedsave = malloc(length - 1); + compressedsave = Z_Malloc(length - 1, PU_STATIC, NULL); if (!compressedsave) { CONS_Alert(CONS_ERROR, M_GetText("No more free memory for savegame\n")); @@ -1187,14 +1187,14 @@ static void SV_SendSaveGame(INT32 node, boolean resending) else { // Compression failed to make it smaller; send original - free(compressedsave); + Z_Free(compressedsave); // State that we're not compressed buffertosend = save.buffer; WRITEUINT32(save.buffer, 0); } - AddRamToSendQueue(node, buffertosend, length, SF_RAM, 0); + AddRamToSendQueue(node, buffertosend, length, SF_Z_RAM, 0); // Remember when we started sending the savegame so we can handle timeouts sendingsavegame[node] = true; From b573b6efbc9ad639f031e5299511185c5951e303 Mon Sep 17 00:00:00 2001 From: toaster Date: Tue, 3 Jan 2023 19:31:03 +0000 Subject: [PATCH 07/13] Don't tie restoring mobj/waypoint pointers on player struct to existence of player object --- src/p_saveg.c | 149 +++++++++++++++++++++++++------------------------- 1 file changed, 76 insertions(+), 73 deletions(-) diff --git a/src/p_saveg.c b/src/p_saveg.c index 946e77faa..7696ed964 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -4094,7 +4094,6 @@ static void P_NetUnArchiveThinkers(savebuffer_t *save) // remove all the current thinkers for (i = 0; i < NUM_THINKERLISTS; i++) { - currentthinker = thlist[i].next; for (currentthinker = thlist[i].next; currentthinker != &thlist[i]; currentthinker = next) { next = currentthinker->next; @@ -4438,7 +4437,7 @@ static void P_RelinkPointers(void) { thinker_t *currentthinker; mobj_t *mobj; - UINT32 temp; + UINT32 temp, i; // use info field (value = oldposition) to relink mobjs for (currentthinker = thlist[THINK_MOBJ].next; currentthinker != &thlist[THINK_MOBJ]; @@ -4503,85 +4502,89 @@ static void P_RelinkPointers(void) if (!P_SetTarget(&mobj->terrainOverlay, P_FindNewPosition(temp))) CONS_Debug(DBG_GAMELOGIC, "terrainOverlay not found on %d\n", mobj->type); } - if (mobj->player) + } + + for (i = 0; i < MAXPLAYERS; i++) + { + if (!playeringame[i]) + continue; + + if (players[i].skybox.viewpoint) { - if ( mobj->player->skybox.viewpoint) + temp = (UINT32)(size_t)players[i].skybox.viewpoint; + players[i].skybox.viewpoint = NULL; + if (!P_SetTarget(&players[i].skybox.viewpoint, P_FindNewPosition(temp))) + CONS_Debug(DBG_GAMELOGIC, "skybox.viewpoint not found on player %d\n", i); + } + if (players[i].skybox.centerpoint) + { + temp = (UINT32)(size_t)players[i].skybox.centerpoint; + players[i].skybox.centerpoint = NULL; + if (!P_SetTarget(&players[i].skybox.centerpoint, P_FindNewPosition(temp))) + CONS_Debug(DBG_GAMELOGIC, "skybox.centerpoint not found on player %d\n", i); + } + if (players[i].awayviewmobj) + { + temp = (UINT32)(size_t)players[i].awayviewmobj; + players[i].awayviewmobj = NULL; + if (!P_SetTarget(&players[i].awayviewmobj, P_FindNewPosition(temp))) + CONS_Debug(DBG_GAMELOGIC, "awayviewmobj not found on player %d\n", i); + } + if (players[i].followmobj) + { + temp = (UINT32)(size_t)players[i].followmobj; + players[i].followmobj = NULL; + if (!P_SetTarget(&players[i].followmobj, P_FindNewPosition(temp))) + CONS_Debug(DBG_GAMELOGIC, "followmobj not found on player %d\n", i); + } + if (players[i].follower) + { + temp = (UINT32)(size_t)players[i].follower; + players[i].follower = NULL; + if (!P_SetTarget(&players[i].follower, P_FindNewPosition(temp))) + CONS_Debug(DBG_GAMELOGIC, "follower not found on player %d\n", i); + } + if (players[i].currentwaypoint) + { + temp = (UINT32)(size_t)players[i].currentwaypoint; + players[i].currentwaypoint = K_GetWaypointFromIndex(temp); + if (players[i].currentwaypoint == NULL) { - temp = (UINT32)(size_t)mobj->player->skybox.viewpoint; - mobj->player->skybox.viewpoint = NULL; - if (!P_SetTarget(&mobj->player->skybox.viewpoint, P_FindNewPosition(temp))) - CONS_Debug(DBG_GAMELOGIC, "skybox.viewpoint not found on %d\n", mobj->type); + CONS_Debug(DBG_GAMELOGIC, "currentwaypoint not found on player %d\n", i); } - if ( mobj->player->skybox.centerpoint) + } + if (players[i].nextwaypoint) + { + temp = (UINT32)(size_t)players[i].nextwaypoint; + players[i].nextwaypoint = K_GetWaypointFromIndex(temp); + if (players[i].nextwaypoint == NULL) { - temp = (UINT32)(size_t)mobj->player->skybox.centerpoint; - mobj->player->skybox.centerpoint = NULL; - if (!P_SetTarget(&mobj->player->skybox.centerpoint, P_FindNewPosition(temp))) - CONS_Debug(DBG_GAMELOGIC, "skybox.centerpoint not found on %d\n", mobj->type); + CONS_Debug(DBG_GAMELOGIC, "nextwaypoint not found on player %d\n", i); } - if ( mobj->player->awayviewmobj) + } + if (players[i].respawn.wp) + { + temp = (UINT32)(size_t)players[i].respawn.wp; + players[i].respawn.wp = K_GetWaypointFromIndex(temp); + if (players[i].respawn.wp == NULL) { - temp = (UINT32)(size_t)mobj->player->awayviewmobj; - mobj->player->awayviewmobj = NULL; - if (!P_SetTarget(&mobj->player->awayviewmobj, P_FindNewPosition(temp))) - CONS_Debug(DBG_GAMELOGIC, "awayviewmobj not found on %d\n", mobj->type); - } - if (mobj->player->followmobj) - { - temp = (UINT32)(size_t)mobj->player->followmobj; - mobj->player->followmobj = NULL; - if (!P_SetTarget(&mobj->player->followmobj, P_FindNewPosition(temp))) - CONS_Debug(DBG_GAMELOGIC, "followmobj not found on %d\n", mobj->type); - } - if (mobj->player->follower) - { - temp = (UINT32)(size_t)mobj->player->follower; - mobj->player->follower = NULL; - if (!P_SetTarget(&mobj->player->follower, P_FindNewPosition(temp))) - CONS_Debug(DBG_GAMELOGIC, "follower not found on %d\n", mobj->type); - } - if (mobj->player->currentwaypoint) - { - temp = (UINT32)(size_t)mobj->player->currentwaypoint; - mobj->player->currentwaypoint = K_GetWaypointFromIndex(temp); - if (mobj->player->currentwaypoint == NULL) - { - CONS_Debug(DBG_GAMELOGIC, "currentwaypoint not found on %d\n", mobj->type); - } - } - if (mobj->player->nextwaypoint) - { - temp = (UINT32)(size_t)mobj->player->nextwaypoint; - mobj->player->nextwaypoint = K_GetWaypointFromIndex(temp); - if (mobj->player->nextwaypoint == NULL) - { - CONS_Debug(DBG_GAMELOGIC, "nextwaypoint not found on %d\n", mobj->type); - } - } - if (mobj->player->respawn.wp) - { - temp = (UINT32)(size_t)mobj->player->respawn.wp; - mobj->player->respawn.wp = K_GetWaypointFromIndex(temp); - if (mobj->player->respawn.wp == NULL) - { - CONS_Debug(DBG_GAMELOGIC, "respawn.wp not found on %d\n", mobj->type); - } - } - if (mobj->player->hoverhyudoro) - { - temp = (UINT32)(size_t)mobj->player->hoverhyudoro; - mobj->player->hoverhyudoro = NULL; - if (!P_SetTarget(&mobj->player->hoverhyudoro, P_FindNewPosition(temp))) - CONS_Debug(DBG_GAMELOGIC, "hoverhyudoro not found on %d\n", mobj->type); - } - if (mobj->player->stumbleIndicator) - { - temp = (UINT32)(size_t)mobj->player->stumbleIndicator; - mobj->player->stumbleIndicator = NULL; - if (!P_SetTarget(&mobj->player->stumbleIndicator, P_FindNewPosition(temp))) - CONS_Debug(DBG_GAMELOGIC, "stumbleIndicator not found on %d\n", mobj->type); + CONS_Debug(DBG_GAMELOGIC, "respawn.wp not found on player %d\n", i); } } + if (players[i].hoverhyudoro) + { + temp = (UINT32)(size_t)players[i].hoverhyudoro; + players[i].hoverhyudoro = NULL; + if (!P_SetTarget(&players[i].hoverhyudoro, P_FindNewPosition(temp))) + CONS_Debug(DBG_GAMELOGIC, "hoverhyudoro not found on player %d\n", i); + } + if (players[i].stumbleIndicator) + { + temp = (UINT32)(size_t)players[i].stumbleIndicator; + players[i].stumbleIndicator = NULL; + if (!P_SetTarget(&players[i].stumbleIndicator, P_FindNewPosition(temp))) + CONS_Debug(DBG_GAMELOGIC, "stumbleIndicator not found on player %d\n", i); + } } } From 11b4fcdc1cda4fa4166cfb4cb5b55f6765a01588 Mon Sep 17 00:00:00 2001 From: toaster Date: Tue, 3 Jan 2023 20:20:22 +0000 Subject: [PATCH 08/13] Remove heinous pointer-sent-over-the-network hack remnants This used to be used for `P_RelinkPointers()`, but was superseded by the far saner mobjnum. HOWEVER, its lingering effect was to leave `mobj->info` in an invalid state until a later `P_FinishMobjs()` was called. This is memory unsafety :D After removing the last remnants of this ancient hack, it is now once again possible to connect to a server without crashing immediately. However, I did get a crash after a few seconds, so there is definitely still *something* nasty going on under the hood. --- src/p_saveg.c | 26 -------------------------- 1 file changed, 26 deletions(-) diff --git a/src/p_saveg.c b/src/p_saveg.c index 7696ed964..1fd515a1f 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -2106,9 +2106,6 @@ static void SaveMobjThinker(savebuffer_t *save, const thinker_t *th, const UINT8 if (diff & MD_MORE) WRITEUINT32(save->p, diff2); - // save pointer, at load time we will search this pointer to reinitilize pointers - WRITEUINT32(save->p, (size_t)mobj); - WRITEFIXED(save->p, mobj->z); // Force this so 3dfloor problems don't arise. WRITEFIXED(save->p, mobj->floorz); WRITEFIXED(save->p, mobj->ceilingz); @@ -3141,7 +3138,6 @@ static inline pslope_t *LoadSlope(UINT32 slopeid) static thinker_t* LoadMobjThinker(savebuffer_t *save, actionf_p1 thinker) { - thinker_t *next; mobj_t *mobj; UINT32 diff; UINT32 diff2; @@ -3155,8 +3151,6 @@ static thinker_t* LoadMobjThinker(savebuffer_t *save, actionf_p1 thinker) else diff2 = 0; - next = (void *)(size_t)READUINT32(save->p); - z = READFIXED(save->p); // Force this so 3dfloor problems don't arise. floorz = READFIXED(save->p); ceilingz = READFIXED(save->p); @@ -3478,8 +3472,6 @@ static thinker_t* LoadMobjThinker(savebuffer_t *save, actionf_p1 thinker) if (diff2 & MD2_KITEMCAP) P_SetTarget(&kitemcap, mobj); - mobj->info = (mobjinfo_t *)next; // temporarily, set when leave this function - R_AddMobjInterpolator(mobj); return &mobj->thinker; @@ -4416,23 +4408,6 @@ static inline void P_UnArchivePolyObjects(savebuffer_t *save) P_UnArchivePolyObj(save, &PolyObjects[i]); } -static inline void P_FinishMobjs(void) -{ - thinker_t *currentthinker; - mobj_t *mobj; - - // put info field there real value - for (currentthinker = thlist[THINK_MOBJ].next; currentthinker != &thlist[THINK_MOBJ]; - currentthinker = currentthinker->next) - { - if (currentthinker->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed) - continue; - - mobj = (mobj_t *)currentthinker; - mobj->info = &mobjinfo[mobj->type]; - } -} - static void P_RelinkPointers(void) { thinker_t *currentthinker; @@ -5214,7 +5189,6 @@ boolean P_LoadNetGame(savebuffer_t *save, boolean reloading) P_NetUnArchiveTubeWaypoints(save); P_NetUnArchiveWaypoints(save); P_RelinkPointers(); - P_FinishMobjs(); } LUA_UnArchive(save, true); From 5c51ad77f6cc060e37ebec7733d3c52eafaded72 Mon Sep 17 00:00:00 2001 From: James R Date: Tue, 3 Jan 2023 23:14:29 -0800 Subject: [PATCH 09/13] Use P_SaveBufferFree everywhere - Fixes PR_SaveProfiles calling stdlib free on zone memory. - Also touched g_demo.c --- src/g_demo.c | 26 +++++++++++++------------- src/k_profiles.c | 4 ++-- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/g_demo.c b/src/g_demo.c index 6ef1a9ebb..a0d8fd2fb 100644 --- a/src/g_demo.c +++ b/src/g_demo.c @@ -3020,7 +3020,7 @@ void G_DoPlayDemo(char *defdemoname) CONS_Alert(CONS_ERROR, "%s", msg); M_StartMessage(msg, NULL, MM_NOTHING); Z_Free(pdemoname); - Z_Free(demobuf.buffer); + P_SaveBufferFree(&demobuf); demo.playback = false; demo.title = false; return; @@ -3040,7 +3040,7 @@ void G_DoPlayDemo(char *defdemoname) CONS_Alert(CONS_ERROR, "%s", msg); M_StartMessage(msg, NULL, MM_NOTHING); Z_Free(pdemoname); - Z_Free(demobuf.buffer); + P_SaveBufferFree(&demobuf); demo.playback = false; demo.title = false; return; @@ -3058,7 +3058,7 @@ void G_DoPlayDemo(char *defdemoname) CONS_Alert(CONS_ERROR, "%s", msg); M_StartMessage(msg, NULL, MM_NOTHING); Z_Free(pdemoname); - Z_Free(demobuf.buffer); + P_SaveBufferFree(&demobuf); demo.playback = false; demo.title = false; return; @@ -3078,7 +3078,7 @@ void G_DoPlayDemo(char *defdemoname) CONS_Alert(CONS_ERROR, "%s", msg); M_StartMessage(msg, NULL, MM_NOTHING); Z_Free(pdemoname); - Z_Free(demobuf.buffer); + P_SaveBufferFree(&demobuf); demo.playback = false; demo.title = false; return; @@ -3136,7 +3136,7 @@ void G_DoPlayDemo(char *defdemoname) if (!CON_Ready()) // In the console they'll just see the notice there! No point pulling them out. M_StartMessage(msg, NULL, MM_NOTHING); Z_Free(pdemoname); - Z_Free(demobuf.buffer); + P_SaveBufferFree(&demobuf); demo.playback = false; demo.title = false; return; @@ -3151,7 +3151,7 @@ void G_DoPlayDemo(char *defdemoname) CONS_Alert(CONS_ERROR, "%s", msg); M_StartMessage(msg, NULL, MM_NOTHING); Z_Free(pdemoname); - Z_Free(demobuf.buffer); + P_SaveBufferFree(&demobuf); demo.playback = false; demo.title = false; return; @@ -3187,7 +3187,7 @@ void G_DoPlayDemo(char *defdemoname) Z_Free(demo.skinlist); demo.skinlist = NULL; Z_Free(pdemoname); - Z_Free(demobuf.buffer); + P_SaveBufferFree(&demobuf); demo.playback = false; demo.title = false; return; @@ -3205,7 +3205,7 @@ void G_DoPlayDemo(char *defdemoname) Z_Free(demo.skinlist); demo.skinlist = NULL; Z_Free(pdemoname); - Z_Free(demobuf.buffer); + P_SaveBufferFree(&demobuf); demo.playback = false; demo.title = false; return; @@ -3260,7 +3260,7 @@ void G_DoPlayDemo(char *defdemoname) Z_Free(demo.skinlist); demo.skinlist = NULL; Z_Free(pdemoname); - Z_Free(demobuf.buffer); + P_SaveBufferFree(&demobuf); demo.playback = false; demo.title = false; return; @@ -3278,7 +3278,7 @@ void G_DoPlayDemo(char *defdemoname) Z_Free(demo.skinlist); demo.skinlist = NULL; Z_Free(pdemoname); - Z_Free(demobuf.buffer); + P_SaveBufferFree(&demobuf); demo.playback = false; demo.title = false; return; @@ -3934,7 +3934,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. } - Z_Free(demobuf.buffer); + P_SaveBufferFree(&demobuf); metalrecording = false; if (saved) I_Error("Saved to %sMS.LMP", G_BuildMapName(gamemap)); @@ -4006,7 +4006,7 @@ static void G_StopTimingDemo(void) // called from stopdemo command, map command, and g_checkdemoStatus. void G_StopDemo(void) { - Z_Free(demobuf.buffer); + P_SaveBufferFree(&demobuf); demobuf.buffer = NULL; demo.playback = false; if (demo.title) @@ -4154,7 +4154,7 @@ void G_SaveDemo(void) if (FIL_WriteFile(demoname, demobuf.buffer, demobuf.p - demobuf.buffer)) // finally output the file. demo.savemode = DSM_SAVED; - Z_Free(demobuf.buffer); + P_SaveBufferFree(&demobuf); demo.recording = false; if (!modeattacking) diff --git a/src/k_profiles.c b/src/k_profiles.c index 313dc84f8..62f561587 100644 --- a/src/k_profiles.c +++ b/src/k_profiles.c @@ -267,10 +267,10 @@ void PR_SaveProfiles(void) if (!FIL_WriteFile(va(pandf, srb2home, PROFILESFILE), save.buffer, length)) { - free(save.buffer); + P_SaveBufferFree(&save); I_Error("Couldn't save profiles. Are you out of Disk space / playing in a protected folder?"); } - free(save.buffer); + P_SaveBufferFree(&save); } void PR_LoadProfiles(void) From 2786c2095e5d19f718d51d4a6ed5d6b88707e45a Mon Sep 17 00:00:00 2001 From: toaster Date: Wed, 4 Jan 2023 14:21:10 +0000 Subject: [PATCH 10/13] More incorrect/inconsistent frees --- src/k_profiles.c | 6 ++---- src/p_setup.c | 3 +-- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/src/k_profiles.c b/src/k_profiles.c index 62f561587..5a9ddd75a 100644 --- a/src/k_profiles.c +++ b/src/k_profiles.c @@ -300,8 +300,7 @@ void PR_LoadProfiles(void) if (strcmp(srb2home,".")) gdfolder = srb2home; - Z_Free(save.buffer); - save.p = NULL; + P_SaveBufferFree(&save); I_Error("Not a valid Profile file.\nDelete %s (maybe in %s) and try again.", PROFILESFILE, gdfolder); } save.p += headerlen; @@ -309,8 +308,7 @@ void PR_LoadProfiles(void) version = READUINT8(save.p); if (version > PROFILEVER) { - Z_Free(save.buffer); - save.p = NULL; + P_SaveBufferFree(&save); I_Error("Existing %s is from the future! (expected %d, got %d)", PROFILESFILE, PROFILEVER, version); } diff --git a/src/p_setup.c b/src/p_setup.c index 37ca56328..42ff2f33d 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -749,8 +749,7 @@ void P_WriteThings(void) filename = va("newthings-%s.lmp", G_BuildMapName(gamemap)); FIL_WriteFile(filename, save.buffer, length); - free(save.buffer); - save.p = NULL; + P_SaveBufferFree(&save); CONS_Printf(M_GetText("%s saved.\n"), filename); } From 724c9b774ec0c5ffa3756b15921f80106aed50d4 Mon Sep 17 00:00:00 2001 From: toaster Date: Thu, 5 Jan 2023 23:32:12 +0000 Subject: [PATCH 11/13] Cleaner reference handling for the following extern-scope netsynced `mobj_t*`. - `skyboxcenterpnts` and `skyboxviewpnts` - P_InitSkyboxPoint`, which calls `P_SetTarget` - `waypoint->mobj` - Make sure NULL before using `P_SetTarget` on - `tubewaypoints` - Use `P_SetTarget` - Use `UINT32_MAX` for the invalid mobjnum, since 0 is a valid one. - `waypointcap` and `kitemcap` - NULL before reset Our international nightmare is over. --- src/k_waypoint.c | 1 + src/p_mobj.c | 27 ++++++++++++++++----------- src/p_saveg.c | 31 +++++++++++++++++++------------ src/p_setup.c | 2 +- src/p_spec.h | 2 ++ 5 files changed, 39 insertions(+), 24 deletions(-) diff --git a/src/k_waypoint.c b/src/k_waypoint.c index d53a4bbd3..cf70c1dcd 100644 --- a/src/k_waypoint.c +++ b/src/k_waypoint.c @@ -1949,6 +1949,7 @@ static waypoint_t *K_MakeWaypoint(mobj_t *const mobj) madewaypoint = &waypointheap[numwaypoints]; numwaypoints++; + madewaypoint->mobj = NULL; P_SetTarget(&madewaypoint->mobj, mobj); // Don't allow a waypoint that has its next ID set to itself to work diff --git a/src/p_mobj.c b/src/p_mobj.c index 230454a6c..e8fb3c30e 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -12557,6 +12557,21 @@ static mobj_t *P_MakeSoftwareCorona(mobj_t *mo, INT32 height) return corona; } +void P_InitSkyboxPoint(mobj_t *mobj, mapthing_t *mthing) +{ + mtag_t tag = Tag_FGet(&mthing->tags); + if (tag < 0 || tag > 15) + { + CONS_Debug(DBG_GAMELOGIC, "P_InitSkyboxPoint: Skybox ID %d of mapthing %s is not between 0 and 15!\n", tag, sizeu1((size_t)(mthing - mapthings))); + return; + } + + if (mthing->args[0]) + P_SetTarget(&skyboxcenterpnts[tag], mobj); + else + P_SetTarget(&skyboxviewpnts[tag], mobj); +} + static boolean P_MapAlreadyHasStarPost(mobj_t *mobj) { thinker_t *th; @@ -12602,17 +12617,7 @@ static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj, boolean } case MT_SKYBOX: { - mtag_t tag = Tag_FGet(&mthing->tags); - if (tag < 0 || tag > 15) - { - CONS_Debug(DBG_GAMELOGIC, "P_SetupSpawnedMapThing: Skybox ID %d of mapthing %s is not between 0 and 15!\n", tag, sizeu1((size_t)(mthing - mapthings))); - break; - } - - if (mthing->args[0]) - skyboxcenterpnts[tag] = mobj; - else - skyboxviewpnts[tag] = mobj; + P_InitSkyboxPoint(mobj, mthing); break; } case MT_EGGSTATUE: diff --git a/src/p_saveg.c b/src/p_saveg.c index 1fd515a1f..8accfa309 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -1070,7 +1070,12 @@ static void P_NetArchiveTubeWaypoints(savebuffer_t *save) { WRITEUINT16(save->p, numtubewaypoints[i]); for (j = 0; j < numtubewaypoints[i]; j++) - WRITEUINT32(save->p, tubewaypoints[i][j] ? tubewaypoints[i][j]->mobjnum : 0); + { + if (tubewaypoints[i][j]) + WRITEUINT32(save->p, tubewaypoints[i][j]->mobjnum); + else + WRITEUINT32(save->p, UINT32_MAX); + } } } @@ -1085,7 +1090,9 @@ static void P_NetUnArchiveTubeWaypoints(savebuffer_t *save) for (j = 0; j < numtubewaypoints[i]; j++) { mobjnum = READUINT32(save->p); - tubewaypoints[i][j] = (mobjnum == 0) ? NULL : P_FindNewPosition(mobjnum); + tubewaypoints[i][j] = NULL; + if (mobjnum != UINT32_MAX) + P_SetTarget(&tubewaypoints[i][j], P_FindNewPosition(mobjnum)); } } } @@ -3068,6 +3075,7 @@ static void P_NetUnArchiveWaypoints(savebuffer_t *save) for (i = 0U; i < numArchiveWaypoints; i++) { waypoint = K_GetWaypointFromIndex(i); temp = READUINT32(save->p); + waypoint->mobj = NULL; if (!P_SetTarget(&waypoint->mobj, P_FindNewPosition(temp))) { CONS_Debug(DBG_GAMELOGIC, "waypoint mobj not found for %d\n", i); } @@ -3453,17 +3461,9 @@ static thinker_t* LoadMobjThinker(savebuffer_t *save, actionf_p1 thinker) mobj->player->viewz = mobj->player->mo->z + mobj->player->viewheight; } - if (mobj->type == MT_SKYBOX) + if (mobj->type == MT_SKYBOX && mobj->spawnpoint) { - mtag_t tag = mobj->movedir; - if (tag < 0 || tag > 15) - { - CONS_Debug(DBG_GAMELOGIC, "LoadMobjThinker: Skybox ID %d of netloaded object is not between 0 and 15!\n", tag); - } - else if (mobj->flags2 & MF2_AMBUSH) - skyboxcenterpnts[tag] = mobj; - else - skyboxviewpnts[tag] = mobj; + P_InitSkyboxPoint(mobj, mobj->spawnpoint); } if (diff2 & MD2_WAYPOINTCAP) @@ -4105,6 +4105,13 @@ static void P_NetUnArchiveThinkers(savebuffer_t *save) iquetail = iquehead = 0; P_InitThinkers(); + // Oh my god don't blast random memory with our reference counts. + waypointcap = kitemcap = NULL; + for (i = 0; i <= 15; i++) + { + skyboxcenterpnts[i] = skyboxviewpnts[i] = NULL; + } + // clear sector thinker pointers so they don't point to non-existant thinkers for all of eternity for (i = 0; i < numsectors; i++) { diff --git a/src/p_setup.c b/src/p_setup.c index 42ff2f33d..d77a27971 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -184,7 +184,7 @@ UINT16 numtubewaypoints[NUMTUBEWAYPOINTSEQUENCES]; void P_AddTubeWaypoint(UINT8 sequence, UINT8 id, mobj_t *waypoint) { - tubewaypoints[sequence][id] = waypoint; + P_SetTarget(&tubewaypoints[sequence][id], waypoint); if (id >= numtubewaypoints[sequence]) numtubewaypoints[sequence] = id + 1; } diff --git a/src/p_spec.h b/src/p_spec.h index 1982892d0..6f4d36f87 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -24,6 +24,8 @@ extern "C" { extern mobj_t *skyboxviewpnts[16]; // array of MT_SKYBOX viewpoint mobjs extern mobj_t *skyboxcenterpnts[16]; // array of MT_SKYBOX centerpoint mobjs +void P_InitSkyboxPoint(mobj_t *mobj, mapthing_t *mthing); + // Amount (dx, dy) vector linedef is shifted right to get scroll amount #define SCROLL_SHIFT 5 From ede0f568191388a6a41a0c974d125772ac8b3e70 Mon Sep 17 00:00:00 2001 From: toaster Date: Thu, 5 Jan 2023 23:44:40 +0000 Subject: [PATCH 12/13] Revert all instances of P_SaveBufferFree(&demobuf) for now g_demo.c is officially No Man's Land --- src/g_demo.c | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/g_demo.c b/src/g_demo.c index a0d8fd2fb..a90771e48 100644 --- a/src/g_demo.c +++ b/src/g_demo.c @@ -2013,7 +2013,7 @@ void G_RecordDemo(const char *name) maxsize = atoi(M_GetNextParm()) * 1024; // if (demobuf.buffer) -// P_SaveBufferFree(&demobuf); +// Z_Free(demobuf.buffer); P_SaveBufferAlloc(&demobuf, maxsize); demobuf.p = NULL; @@ -3020,7 +3020,7 @@ void G_DoPlayDemo(char *defdemoname) CONS_Alert(CONS_ERROR, "%s", msg); M_StartMessage(msg, NULL, MM_NOTHING); Z_Free(pdemoname); - P_SaveBufferFree(&demobuf); + Z_Free(demobuf.buffer); demo.playback = false; demo.title = false; return; @@ -3040,7 +3040,7 @@ void G_DoPlayDemo(char *defdemoname) CONS_Alert(CONS_ERROR, "%s", msg); M_StartMessage(msg, NULL, MM_NOTHING); Z_Free(pdemoname); - P_SaveBufferFree(&demobuf); + Z_Free(demobuf.buffer); demo.playback = false; demo.title = false; return; @@ -3058,7 +3058,7 @@ void G_DoPlayDemo(char *defdemoname) CONS_Alert(CONS_ERROR, "%s", msg); M_StartMessage(msg, NULL, MM_NOTHING); Z_Free(pdemoname); - P_SaveBufferFree(&demobuf); + Z_Free(demobuf.buffer); demo.playback = false; demo.title = false; return; @@ -3078,7 +3078,7 @@ void G_DoPlayDemo(char *defdemoname) CONS_Alert(CONS_ERROR, "%s", msg); M_StartMessage(msg, NULL, MM_NOTHING); Z_Free(pdemoname); - P_SaveBufferFree(&demobuf); + Z_Free(demobuf.buffer); demo.playback = false; demo.title = false; return; @@ -3136,7 +3136,7 @@ void G_DoPlayDemo(char *defdemoname) if (!CON_Ready()) // In the console they'll just see the notice there! No point pulling them out. M_StartMessage(msg, NULL, MM_NOTHING); Z_Free(pdemoname); - P_SaveBufferFree(&demobuf); + Z_Free(demobuf.buffer); demo.playback = false; demo.title = false; return; @@ -3151,7 +3151,7 @@ void G_DoPlayDemo(char *defdemoname) CONS_Alert(CONS_ERROR, "%s", msg); M_StartMessage(msg, NULL, MM_NOTHING); Z_Free(pdemoname); - P_SaveBufferFree(&demobuf); + Z_Free(demobuf.buffer); demo.playback = false; demo.title = false; return; @@ -3187,7 +3187,7 @@ void G_DoPlayDemo(char *defdemoname) Z_Free(demo.skinlist); demo.skinlist = NULL; Z_Free(pdemoname); - P_SaveBufferFree(&demobuf); + Z_Free(demobuf.buffer); demo.playback = false; demo.title = false; return; @@ -3205,7 +3205,7 @@ void G_DoPlayDemo(char *defdemoname) Z_Free(demo.skinlist); demo.skinlist = NULL; Z_Free(pdemoname); - P_SaveBufferFree(&demobuf); + Z_Free(demobuf.buffer); demo.playback = false; demo.title = false; return; @@ -3260,7 +3260,7 @@ void G_DoPlayDemo(char *defdemoname) Z_Free(demo.skinlist); demo.skinlist = NULL; Z_Free(pdemoname); - P_SaveBufferFree(&demobuf); + Z_Free(demobuf.buffer); demo.playback = false; demo.title = false; return; @@ -3278,7 +3278,7 @@ void G_DoPlayDemo(char *defdemoname) Z_Free(demo.skinlist); demo.skinlist = NULL; Z_Free(pdemoname); - P_SaveBufferFree(&demobuf); + Z_Free(demobuf.buffer); demo.playback = false; demo.title = false; return; @@ -3934,7 +3934,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. } - P_SaveBufferFree(&demobuf); + Z_Free(demobuf.buffer); metalrecording = false; if (saved) I_Error("Saved to %sMS.LMP", G_BuildMapName(gamemap)); @@ -4006,7 +4006,7 @@ static void G_StopTimingDemo(void) // called from stopdemo command, map command, and g_checkdemoStatus. void G_StopDemo(void) { - P_SaveBufferFree(&demobuf); + Z_Free(demobuf.buffer); demobuf.buffer = NULL; demo.playback = false; if (demo.title) @@ -4154,7 +4154,7 @@ void G_SaveDemo(void) if (FIL_WriteFile(demoname, demobuf.buffer, demobuf.p - demobuf.buffer)) // finally output the file. demo.savemode = DSM_SAVED; - P_SaveBufferFree(&demobuf); + Z_Free(demobuf.buffer); demo.recording = false; if (!modeattacking) From 22b87e0f198f320feb8d0c96f51d7151782cc078 Mon Sep 17 00:00:00 2001 From: toaster Date: Fri, 6 Jan 2023 00:01:58 +0000 Subject: [PATCH 13/13] Consistency for mobjnum 0 meaning NULL Moves `P_Net(Un)ArchiveTubeWaypoints` down the file to take advantage of `SaveMobjnum` inline. --- src/p_saveg.c | 71 ++++++++++++++++++++++++--------------------------- 1 file changed, 34 insertions(+), 37 deletions(-) diff --git a/src/p_saveg.c b/src/p_saveg.c index 8accfa309..2fc6e3783 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -1062,41 +1062,6 @@ static void P_NetUnArchiveColormaps(savebuffer_t *save) net_colormaps = NULL; } -static void P_NetArchiveTubeWaypoints(savebuffer_t *save) -{ - INT32 i, j; - - for (i = 0; i < NUMTUBEWAYPOINTSEQUENCES; i++) - { - WRITEUINT16(save->p, numtubewaypoints[i]); - for (j = 0; j < numtubewaypoints[i]; j++) - { - if (tubewaypoints[i][j]) - WRITEUINT32(save->p, tubewaypoints[i][j]->mobjnum); - else - WRITEUINT32(save->p, UINT32_MAX); - } - } -} - -static void P_NetUnArchiveTubeWaypoints(savebuffer_t *save) -{ - INT32 i, j; - UINT32 mobjnum; - - for (i = 0; i < NUMTUBEWAYPOINTSEQUENCES; i++) - { - numtubewaypoints[i] = READUINT16(save->p); - for (j = 0; j < numtubewaypoints[i]; j++) - { - mobjnum = READUINT32(save->p); - tubewaypoints[i][j] = NULL; - if (mobjnum != UINT32_MAX) - P_SetTarget(&tubewaypoints[i][j], P_FindNewPosition(mobjnum)); - } - } -} - /// /// World Archiving /// @@ -3084,6 +3049,38 @@ static void P_NetUnArchiveWaypoints(savebuffer_t *save) } } +static void P_NetArchiveTubeWaypoints(savebuffer_t *save) +{ + INT32 i, j; + + for (i = 0; i < NUMTUBEWAYPOINTSEQUENCES; i++) + { + WRITEUINT16(save->p, numtubewaypoints[i]); + for (j = 0; j < numtubewaypoints[i]; j++) + { + WRITEUINT32(save->p, SaveMobjnum(tubewaypoints[i][j])); + } + } +} + +static void P_NetUnArchiveTubeWaypoints(savebuffer_t *save) +{ + INT32 i, j; + UINT32 mobjnum; + + for (i = 0; i < NUMTUBEWAYPOINTSEQUENCES; i++) + { + numtubewaypoints[i] = READUINT16(save->p); + for (j = 0; j < numtubewaypoints[i]; j++) + { + mobjnum = READUINT32(save->p); + tubewaypoints[i][j] = NULL; + if (mobjnum != 0) + P_SetTarget(&tubewaypoints[i][j], P_FindNewPosition(mobjnum)); + } + } +} + // Now save the pointers, tracer and target, but at load time we must // relink to this; the savegame contains the old position in the pointer // field copyed in the info field temporarily, but finally we just search @@ -3104,7 +3101,7 @@ mobj_t *P_FindNewPosition(UINT32 oldposition) return mobj; } - CONS_Debug(DBG_GAMELOGIC, "mobj not found\n"); + CONS_Debug(DBG_GAMELOGIC, "mobj %d not found\n", oldposition); return NULL; } @@ -5118,7 +5115,7 @@ void P_SaveNetGame(savebuffer_t *save, boolean resending) { thinker_t *th; mobj_t *mobj; - INT32 i = 1; // don't start from 0, it'd be confused with a blank pointer otherwise + UINT32 i = 1; // don't start from 0, it'd be confused with a blank pointer otherwise CV_SaveNetVars(&save->p); P_NetArchiveMisc(save, resending);