diff --git a/src/d_clisrv.c b/src/d_clisrv.c index 9a013bd63..d6891ae0a 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -1150,28 +1150,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"); } @@ -1185,11 +1185,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; @@ -1203,12 +1203,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; @@ -1222,7 +1222,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) @@ -1231,29 +1231,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 @@ -1263,13 +1263,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) @@ -1278,16 +1278,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; @@ -1297,7 +1297,7 @@ static void CL_LoadReceivedSavegame(boolean reloading) automapactive = false; // load a base level - if (P_LoadNetGame(reloading)) + if (P_LoadNetGame(&save, reloading)) { if (!reloading) { @@ -1319,8 +1319,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(); @@ -5998,6 +5998,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) @@ -6007,8 +6008,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; @@ -6019,6 +6022,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) @@ -6031,8 +6035,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 e7c6dbd73..0e0b4af84 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -5600,10 +5600,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) @@ -5619,28 +5618,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 7a72481fa..2c6434f3c 100644 --- a/src/g_demo.c +++ b/src/g_demo.c @@ -2127,7 +2127,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)); @@ -3108,7 +3108,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 047b10c3b..fabce882b 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 CV_PossibleValue_t joyaxis_cons_t[] = {{0, "None"}, {1, "Left X"}, {2, "Left Y"}, {-1, "Left X-"}, {-2, "Left Y-"}, #if JOYAXISSET > 1 @@ -4088,6 +4086,7 @@ void G_LoadGameData(void) INT32 i, j; UINT8 modded = false; UINT8 rtemp; + savebuffer_t save; //For records tic_t rectime; @@ -4117,37 +4116,32 @@ void G_LoadGameData(void) if (M_CheckParm("-resetdata")) return; // Don't load (essentially, reset). - - length = FIL_ReadFile(va(pandf, srb2home, gamedatafilename), &savebuffer); + + length = FIL_ReadFile(va(pandf, srb2home, gamedatafilename), &save.buffer); if (!length) // Aw, no game data. Their loss! return; - save_p = savebuffer; + save.p = save.buffer; // Version check - if (READUINT32(save_p) != 0xFCAFE211) + if (READUINT32(save.p) != 0xFCAFE211) { const char *gdfolder = "the SRB2Kart folder"; if (strcmp(srb2home,".")) gdfolder = srb2home; - Z_Free(savebuffer); - save_p = NULL; + Z_Free(save.buffer); + save.p = NULL; I_Error("Game data is from another version of SRB2.\nDelete %s(maybe in %s) and try again.", gamedatafilename, gdfolder); } - totalplaytime = READUINT32(save_p); - matchesplayed = READUINT32(save_p); - for (i = 0; i < PWRLV_NUMTYPES; i++) { - vspowerlevel[i] = READUINT16(save_p); + vspowerlevel[i] = READUINT16(save.p); if (vspowerlevel[i] < PWRLVRECORD_MIN || vspowerlevel[i] > PWRLVRECORD_MAX) goto datacorrupt; } - modded = READUINT8(save_p); - // Aha! Someone's been screwing with the save file! if ((modded && !savemoddata)) goto datacorrupt; @@ -4156,46 +4150,46 @@ void G_LoadGameData(void) // TODO put another cipher on these things? meh, I don't care... for (i = 0; i < NUMMAPS; i++) - if ((mapvisited[i] = READUINT8(save_p)) > MV_MAX) + if ((mapvisited[i] = READUINT8(save.p)) > MV_MAX) goto datacorrupt; // 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) emblemlocations[j+i].collected = ((rtemp >> j) & 1); i += j; } for (i = 0; i < MAXEXTRAEMBLEMS;) { - rtemp = READUINT8(save_p); + rtemp = READUINT8(save.p); for (j = 0; j < 8 && j+i < MAXEXTRAEMBLEMS; ++j) extraemblems[j+i].collected = ((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) unlockables[j+i].unlocked = ((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) conditionSets[j+i].achieved = ((rtemp >> j) & 1); i += j; } - timesBeaten = READUINT32(save_p); + timesBeaten = READUINT32(save.p); // Main records for (i = 0; i < NUMMAPS; ++i) { - rectime = (tic_t)READUINT32(save_p); - reclap = (tic_t)READUINT32(save_p); + rectime = (tic_t)READUINT32(save.p); + reclap = (tic_t)READUINT32(save.p); if (rectime || reclap) { @@ -4206,8 +4200,8 @@ void G_LoadGameData(void) } // done - Z_Free(savebuffer); - save_p = NULL; + Z_Free(save.buffer); + save.p = NULL; // Silent update unlockables in case they're out of sync with conditions M_SilentUpdateUnlockablesAndEmblems(); @@ -4221,8 +4215,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); } @@ -4235,12 +4229,13 @@ void G_SaveGameData(void) size_t length; INT32 i, j; UINT8 btemp; + savebuffer_t save; if (!gamedataloaded) return; // If never loaded (-nodata), don't save - save_p = savebuffer = (UINT8 *)malloc(GAMEDATASIZE); - if (!save_p) + save.p = save.buffer = (UINT8 *)malloc(GAMEDATASIZE); + if (!save.p) { CONS_Alert(CONS_ERROR, M_GetText("No more free memory for saving game data\n")); return; @@ -4250,26 +4245,26 @@ void G_SaveGameData(void) // SRB2Kart: Let players unlock stuff with addons. if (modifiedgame && !savemoddata) { - free(savebuffer); - save_p = savebuffer = NULL; + free(save.buffer); + save.p = save.buffer = NULL; return; } #endif // Version test - WRITEUINT32(save_p, 0xFCAFE211); + WRITEUINT32(save.p, 0xFCAFE211); - WRITEUINT32(save_p, totalplaytime); - WRITEUINT32(save_p, matchesplayed); + WRITEUINT32(save.p, totalplaytime); + WRITEUINT32(save.p, matchesplayed); for (i = 0; i < PWRLV_NUMTYPES; i++) - WRITEUINT16(save_p, vspowerlevel[i]); + WRITEUINT16(save.p, vspowerlevel[i]); - WRITEUINT8(save_p, (UINT8)savemoddata); + WRITEUINT8(save.p, (UINT8)savemoddata); // TODO put another cipher on these things? meh, I don't care... for (i = 0; i < NUMMAPS; i++) - WRITEUINT8(save_p, (mapvisited[i] & MV_MAX)); + WRITEUINT8(save.p, (mapvisited[i] & MV_MAX)); // To save space, use one bit per collected/achieved/unlocked flag for (i = 0; i < MAXEMBLEMS;) @@ -4277,7 +4272,7 @@ void G_SaveGameData(void) btemp = 0; for (j = 0; j < 8 && j+i < MAXEMBLEMS; ++j) btemp |= (emblemlocations[j+i].collected << j); - WRITEUINT8(save_p, btemp); + WRITEUINT8(save.p, btemp); i += j; } for (i = 0; i < MAXEXTRAEMBLEMS;) @@ -4285,7 +4280,7 @@ void G_SaveGameData(void) btemp = 0; for (j = 0; j < 8 && j+i < MAXEXTRAEMBLEMS; ++j) btemp |= (extraemblems[j+i].collected << j); - WRITEUINT8(save_p, btemp); + WRITEUINT8(save.p, btemp); i += j; } for (i = 0; i < MAXUNLOCKABLES;) @@ -4293,7 +4288,7 @@ void G_SaveGameData(void) btemp = 0; for (j = 0; j < 8 && j+i < MAXUNLOCKABLES; ++j) btemp |= (unlockables[j+i].unlocked << j); - WRITEUINT8(save_p, btemp); + WRITEUINT8(save.p, btemp); i += j; } for (i = 0; i < MAXCONDITIONSETS;) @@ -4301,33 +4296,33 @@ void G_SaveGameData(void) btemp = 0; for (j = 0; j < 8 && j+i < MAXCONDITIONSETS; ++j) btemp |= (conditionSets[j+i].achieved << j); - WRITEUINT8(save_p, btemp); + WRITEUINT8(save.p, btemp); i += j; } - WRITEUINT32(save_p, timesBeaten); + WRITEUINT32(save.p, timesBeaten); // Main records for (i = 0; i < NUMMAPS; i++) { if (mainrecords[i]) { - WRITEUINT32(save_p, mainrecords[i]->time); - WRITEUINT32(save_p, mainrecords[i]->lap); + WRITEUINT32(save.p, mainrecords[i]->time); + WRITEUINT32(save.p, mainrecords[i]->lap); } else { - WRITEUINT32(save_p, 0); - WRITEUINT32(save_p, 0); + WRITEUINT32(save.p, 0); + WRITEUINT32(save.p, 0); } - WRITEUINT8(save_p, 0); // compat + WRITEUINT8(save.p, 0); // compat } - 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; } #define VERSIONSIZE 16 @@ -4341,6 +4336,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)); @@ -4355,18 +4351,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"), @@ -4376,15 +4372,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(); @@ -4393,13 +4389,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)); @@ -4407,13 +4403,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); @@ -4439,6 +4435,7 @@ void G_SaveGame(UINT32 slot, INT16 mapnum) boolean saved; char savename[256] = ""; const char *backup; + savebuffer_t save; if (marathonmode) strcpy(savename, liveeventbackup); @@ -4451,8 +4448,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; @@ -4460,22 +4457,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; @@ -4487,7 +4484,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; @@ -4495,6 +4492,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); @@ -4502,7 +4500,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); @@ -4511,35 +4509,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]) { @@ -4547,28 +4545,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: @@ -4578,7 +4576,7 @@ void G_SaveGameOver(UINT32 slot, boolean modifylives) } // done - saved = FIL_WriteFile(backup, savebuffer, length); + saved = FIL_WriteFile(backup, save.buffer, length); } cleanup: @@ -4586,8 +4584,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 new file mode 100644 index 000000000..f24d623ab --- /dev/null +++ b/src/k_profiles.c @@ -0,0 +1,554 @@ +// SONIC ROBO BLAST 2 +//----------------------------------------------------------------------------- +// Copyright (C) 1998-2000 by DooM Legacy Team. +// Copyright (C) 1999-2020 by Sonic Team Junior. +// +// This program is free software distributed under the +// terms of the GNU General Public License, version 2. +// See the 'LICENSE' file for more details. +//----------------------------------------------------------------------------- +/// \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" // savebuffer_t +#include "m_misc.h" //FIL_WriteFile() +#include "k_profiles.h" +#include "z_zone.h" +#include "r_skins.h" + +// List of all the profiles. +static profile_t *profilesList[MAXPROFILES+1]; // +1 because we're gonna add a default "GUEST' profile. +static UINT8 numprofiles = 0; // # of loaded profiles + +INT32 PR_GetNumProfiles(void) +{ + return numprofiles; +} + +profile_t* PR_MakeProfile( + const char *prname, + const char *pname, + const char *sname, const UINT16 col, + const char *fname, const UINT16 fcol, + INT32 controlarray[num_gamecontrols][MAXINPUTMAPPING], + boolean guest) +{ + profile_t *new = Z_Malloc(sizeof(profile_t), PU_STATIC, NULL); + UINT8 i; + + new->version = PROFILEVER; + + strcpy(new->profilename, prname); + new->profilename[sizeof new->profilename - 1] = '\0'; + + strcpy(new->skinname, sname); + strcpy(new->playername, pname); + new->color = col; + + strcpy(new->follower, fname); + new->followercolor = fcol; + new->kickstartaccel = false; + + // Copy from gamecontrol directly as we'll be setting controls up directly in the profile. + memcpy(new->controls, controlarray, sizeof(new->controls)); + + // Init both power levels + for (i = 0; i < PWRLV_NUMTYPES; i++) + { + new->powerlevels[i] = (guest ? 0 : PWRLVRECORD_START); + } + + return new; +} + +profile_t* PR_MakeProfileFromPlayer(const char *prname, const char *pname, const char *sname, const UINT16 col, const char *fname, UINT16 fcol, UINT8 pnum) +{ + // Generate profile using the player's gamecontrol, as we set them directly when making profiles from menus. + profile_t *new = PR_MakeProfile(prname, pname, sname, col, fname, fcol, gamecontrol[pnum], false); + + // Player bound cvars: + new->kickstartaccel = cv_kickstartaccel[pnum].value; + + return new; +} + +boolean PR_AddProfile(profile_t *p) +{ + if (numprofiles < MAXPROFILES+1) + { + profilesList[numprofiles] = p; + numprofiles++; + + CONS_Printf("Profile '%s' added\n", p->profilename); + + return true; + } + else + return false; +} + +profile_t* PR_GetProfile(INT32 num) +{ + if (num < numprofiles) + return profilesList[num]; + else + return NULL; +} + +boolean PR_DeleteProfile(INT32 num) +{ + UINT8 i; + profile_t* sacrifice; + + if (num <= 0 || num > numprofiles) + { + return false; + } + + sacrifice = profilesList[num]; + + // If we're deleting inbetween profiles, move everything. + if (num < numprofiles) + { + for (i = num; i < numprofiles-1; i++) + { + profilesList[i] = profilesList[i+1]; + } + + // Make sure to move cv_lastprofile (and title/current profile) values as well! + for (i = 0; i < MAXSPLITSCREENPLAYERS+2; i++) + { + consvar_t *cv; + + if (i < MAXSPLITSCREENPLAYERS) + cv = &cv_lastprofile[i]; + else if (i == MAXSPLITSCREENPLAYERS) + cv = &cv_ttlprofilen; + else + cv = &cv_currprofile; + + if (cv->value < num) + { + // Not affected. + continue; + } + + if (cv->value > num) + { + // Shift our lastprofile number down to match the new order. + CV_StealthSetValue(cv, cv->value-1); + continue; + } + + if (cv != &cv_currprofile) + { + // There's no hope for it. If we were on the deleted profile, default back to guest. + CV_StealthSetValue(cv, PROFILE_GUEST); + continue; + } + + // Oh boy, now we're really in for it. + CV_StealthSetValue(cv, -1); + } + } + + // In any case, delete the last profile as well. + profilesList[numprofiles] = NULL; + numprofiles--; + + PR_SaveProfiles(); + + // Finally, clear up our memory! + Z_Free(sacrifice); + + return true; +} + +void PR_InitNewProfile(void) +{ + char pname[PROFILENAMELEN+1] = "PRF"; + profile_t *dprofile; + UINT8 usenum = numprofiles-1; + UINT8 i; + boolean nameok = false; + + pname[4] = '\0'; + + // When deleting profile, it's possible to do some pretty wacko stuff that would lead a new fresh profile to share the same name as another profile we have never changed the name of. + // This could become an infinite loop if MAXPROFILES >= 26. + while (!nameok) + { + pname[3] = 'A'+usenum; + + for (i = 0; i < numprofiles; i++) + { + profile_t *pr = PR_GetProfile(i); + if (!strcmp(pr->profilename, pname)) + { + usenum++; + if (pname[3] == 'Z') + usenum = 0; + + break; + } + + // if we got here, then it means the name is okay! + if (i == numprofiles-1) + nameok = true; + } + } + + dprofile = PR_MakeProfile( + pname, + PROFILEDEFAULTPNAME, + PROFILEDEFAULTSKIN, PROFILEDEFAULTCOLOR, + PROFILEDEFAULTFOLLOWER, PROFILEDEFAULTFOLLOWERCOLOR, + gamecontroldefault, + false + ); + PR_AddProfile(dprofile); +} + +void PR_SaveProfiles(void) +{ + size_t length = 0; + const size_t headerlen = strlen(PROFILEHEADER); + UINT8 i, j, k; + savebuffer_t save; + + 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); + + for (i = 1; i < numprofiles; i++) + { + // Names. + 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); + + // Follower and colour. + 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]); + } + + // Consvars. + 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]); + } + } + } + + length = save.p - save.buffer; + + if (!FIL_WriteFile(va(pandf, srb2home, PROFILESFILE), save.buffer, length)) + { + free(save.buffer); + 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) +{ + size_t length = 0; + const size_t headerlen = strlen(PROFILEHEADER); + UINT8 i, j, k, version; + profile_t *dprofile = PR_MakeProfile( + PROFILEDEFAULTNAME, + PROFILEDEFAULTPNAME, + PROFILEDEFAULTSKIN, PROFILEDEFAULTCOLOR, + PROFILEDEFAULTFOLLOWER, PROFILEDEFAULTFOLLOWERCOLOR, + gamecontroldefault, + true + ); + savebuffer_t save; + + length = FIL_ReadFile(va(pandf, srb2home, PROFILESFILE), &save.buffer); + if (!length) + { + // 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"; + if (strcmp(srb2home,".")) + gdfolder = srb2home; + + 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; + + version = READUINT8(save.p); + if (version > PROFILEVER) + { + 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); + if (numprofiles > MAXPROFILES) + numprofiles = MAXPROFILES; + + for (i = 1; i < numprofiles; i++) + { + profilesList[i] = Z_Malloc(sizeof(profile_t), PU_STATIC, NULL); + + // Version. (We always update this on successful forward step) + profilesList[i]->version = PROFILEVER; + + // Names. + 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); + + if (profilesList[i]->color == SKINCOLOR_NONE) + { + ; // Valid, even outside the bounds + } + else if (profilesList[i]->color >= numskincolors + || skincolors[profilesList[i]->color].accessible == false) + { + profilesList[i]->color = PROFILEDEFAULTCOLOR; + } + + // Follower and colour. + READSTRINGN(save.p, profilesList[i]->follower, SKINNAMESIZE); + profilesList[i]->followercolor = READUINT16(save.p); + + if (profilesList[i]->followercolor == FOLLOWERCOLOR_MATCH + || profilesList[i]->followercolor == FOLLOWERCOLOR_OPPOSITE) + { + ; // Valid, even outside the bounds + } + else if (profilesList[i]->followercolor >= numskincolors + || profilesList[i]->followercolor == SKINCOLOR_NONE + || skincolors[profilesList[i]->followercolor].accessible == false) + { + profilesList[i]->followercolor = PROFILEDEFAULTFOLLOWERCOLOR; + } + + // PWR. + for (j = 0; j < PWRLV_NUMTYPES; j++) + { + profilesList[i]->powerlevels[j] = READUINT16(save.p); + if (profilesList[i]->powerlevels[j] < PWRLVRECORD_MIN + || profilesList[i]->powerlevels[j] > PWRLVRECORD_MAX) + { + // invalid, reset + profilesList[i]->powerlevels[j] = PWRLVRECORD_START; + } + } + + // Consvars. + profilesList[i]->kickstartaccel = (boolean)READUINT8(save.p); + + // Controls. + for (j = 0; j < num_gamecontrols; j++) + { +#ifdef DEVELOP + // Profile update 1-->2: Add gc_rankings. + if (j == gc_rankings && version < 2) + { + for (k = 0; k < MAXINPUTMAPPING; k++) + { + profilesList[i]->controls[j][k] = gamecontroldefault[j][k]; + } + continue; + } +#endif + + for (k = 0; k < MAXINPUTMAPPING; k++) + { + profilesList[i]->controls[j][k] = READINT32(save.p); + } + } + } + + // Add the the default profile directly to avoid letting anyone tamper with it. + profilesList[PROFILE_GUEST] = dprofile; +} + +skincolornum_t PR_GetProfileColor(profile_t *p) +{ + if (p->color == SKINCOLOR_NONE) + { + // Get skin's prefcolor. + INT32 foundskin = R_SkinAvailable(p->skinname); + if (foundskin == -1) + { + // Return random default value + return SKINCOLOR_RED; + } + + return skins[foundskin].prefcolor; + } + + // Get exact color. + return p->color; +} + +static void PR_ApplyProfile_Appearance(profile_t *p, UINT8 playernum) +{ + CV_StealthSet(&cv_skin[playernum], p->skinname); + CV_StealthSetValue(&cv_playercolor[playernum], PR_GetProfileColor(p)); + CV_StealthSet(&cv_playername[playernum], p->playername); + + // Followers + CV_StealthSet(&cv_follower[playernum], p->follower); + CV_StealthSetValue(&cv_followercolor[playernum], p->followercolor); +} + +static void PR_ApplyProfile_Settings(profile_t *p, UINT8 playernum) +{ + // toggles + CV_StealthSetValue(&cv_kickstartaccel[playernum], p->kickstartaccel); + + // set controls... + memcpy(&gamecontrol[playernum], p->controls, sizeof(gamecontroldefault)); +} + +static void PR_ApplyProfile_Memory(UINT8 profilenum, UINT8 playernum) +{ + // set memory cvar + CV_StealthSetValue(&cv_lastprofile[playernum], profilenum); + + // If we're doing this on P1, also change current profile. + if (playernum == 0) + { + CV_StealthSetValue(&cv_currprofile, profilenum); + } +} + +void PR_ApplyProfile(UINT8 profilenum, UINT8 playernum) +{ + profile_t *p = PR_GetProfile(profilenum); + + // this CAN happen!! + if (dedicated || p == NULL) + { + if (!dedicated) + CONS_Printf("Profile '%d' could not be loaded as it does not exist. Guest Profile will be loaded instead.\n", profilenum); + profilenum = 0; // make sure to set this so that the cvar is set properly. + p = PR_GetProfile(profilenum); + } + + PR_ApplyProfile_Appearance(p, playernum); + PR_ApplyProfile_Settings(p, playernum); + PR_ApplyProfile_Memory(profilenum, playernum); +} + +void PR_ApplyProfileLight(UINT8 profilenum, UINT8 playernum) +{ + profile_t *p = PR_GetProfile(profilenum); + + // this CAN happen!! + if (p == NULL) + { + // no need to be as loud... + profilenum = 0; // make sure to set this so that the cvar is set properly. + p = PR_GetProfile(profilenum); + } + + PR_ApplyProfile_Appearance(p, playernum); +} + +void PR_ApplyProfilePretend(UINT8 profilenum, UINT8 playernum) +{ + profile_t *p = PR_GetProfile(profilenum); + + // this CAN happen!! + if (dedicated || p == NULL) + { + if (!dedicated) + CONS_Printf("Profile '%d' could not be loaded as it does not exist. Guest Profile will be loaded instead.\n", profilenum); + profilenum = 0; // make sure to set this so that the cvar is set properly. + p = PR_GetProfile(profilenum); + } + + PR_ApplyProfile_Memory(profilenum, playernum); +} + +UINT8 PR_GetProfileNum(profile_t *p) +{ + UINT8 i; + for (i = 0; i < MAXPROFILES+1; i++) + { + profile_t *comp = PR_GetProfile(i); + if (comp == p) + return i; + } + return 0; +} + +SINT8 PR_ProfileUsedBy(profile_t *p) +{ + UINT8 i; + UINT8 prn = PR_GetProfileNum(p); + + for (i = 0; i < MAXSPLITSCREENPLAYERS; i++) + { + if (prn == cv_lastprofile[i].value) + return i; + } + + return -1; +} + +profile_t *PR_GetPlayerProfile(player_t *player) +{ + const UINT8 playerNum = (player - players); + UINT8 i; + + if (demo.playback) + { + return NULL; + } + + for (i = 0; i <= splitscreen; i++) + { + if (playerNum == g_localplayers[i]) + { + return PR_GetProfile(cv_lastprofile[i].value); + } + } + + return NULL; +} diff --git a/src/lua_script.c b/src/lua_script.c index fddbcb12b..e12f1baba 100644 --- a/src/lua_script.c +++ b/src/lua_script.c @@ -42,6 +42,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 @@ -1290,10 +1292,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; } @@ -1397,7 +1399,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; } @@ -1562,7 +1564,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); @@ -1613,7 +1615,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; } @@ -1652,7 +1654,7 @@ static void UnArchiveTables(UINT8 **p) lua_rawset(gL, -3); } - metatableid = READUINT16(save_p); + metatableid = READUINT16(*p); if (metatableid) { // setmetatable(table, registry.metatables[metatableid]) @@ -1676,7 +1678,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; @@ -1692,7 +1694,7 @@ void LUA_Archive(UINT8 **p) ArchiveExtVars(p, &players[i], "player"); } - if (p == &save_p) + if (network == true) { if (gamestate == GS_LEVEL) { @@ -1709,6 +1711,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 } @@ -1718,7 +1721,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; @@ -1734,7 +1737,7 @@ void LUA_UnArchive(UINT8 **p) UnArchiveExtVars(p, &players[i]); } - if (p == &save_p) + if (network == true) { do { mobjnum = READUINT32(*p); // read a mobjnum @@ -1748,6 +1751,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 6268407f3..bab4345fd 100644 --- a/src/lua_script.h +++ b/src/lua_script.h @@ -53,8 +53,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 e79244f42..746c90c61 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 @@ -64,7 +63,7 @@ typedef enum FOLLOWER = 0x04, } 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; @@ -72,39 +71,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; @@ -113,87 +112,87 @@ 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]); } - 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); + 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); - WRITEUINT32(save_p, players[i].availabilities); - 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].skincolor); + WRITEINT32(save->p, players[i].skin); + WRITEUINT32(save->p, players[i].availabilities); + 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); - WRITEUINT8(save_p, players[i].lapvalidation); + WRITEINT16(save->p, players[i].totalring); + WRITEUINT32(save->p, players[i].realtime); + WRITEUINT8(save->p, players[i].laps); + WRITEUINT8(save->p, players[i].latestlap); + WRITEUINT8(save->p, players[i].lapvalidation); - WRITEUINT32(save_p, players[i].starposttime); - WRITEINT16(save_p, players[i].starpostx); - WRITEINT16(save_p, players[i].starposty); - WRITEINT16(save_p, players[i].starpostz); - WRITEINT32(save_p, players[i].starpostnum); - WRITEANGLE(save_p, players[i].starpostangle); - WRITEUINT8(save_p, (UINT8)players[i].starpostflip); - WRITEINT32(save_p, players[i].prevcheck); - WRITEINT32(save_p, players[i].nextcheck); + WRITEUINT32(save->p, players[i].starposttime); + WRITEINT16(save->p, players[i].starpostx); + WRITEINT16(save->p, players[i].starposty); + WRITEINT16(save->p, players[i].starpostz); + WRITEINT32(save->p, players[i].starpostnum); + WRITEANGLE(save->p, players[i].starpostangle); + WRITEUINT8(save->p, (UINT8)players[i].starpostflip); + WRITEINT32(save->p, players[i].prevcheck); + WRITEINT32(save->p, players[i].nextcheck); - 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); - WRITEUINT32(save_p, players[i].jointime); - WRITEUINT32(save_p, players[i].spectatorreentry); + WRITEUINT32(save->p, players[i].jointime); + WRITEUINT32(save->p, players[i].spectatorreentry); - WRITEUINT32(save_p, players[i].grieftime); - WRITEUINT8(save_p, players[i].griefstrikes); + WRITEUINT32(save->p, players[i].grieftime); + WRITEUINT8(save->p, players[i].griefstrikes); - WRITEUINT8(save_p, players[i].splitscreenindex); + WRITEUINT8(save->p, players[i].splitscreenindex); if (players[i].awayviewmobj) flags |= AWAYVIEW; @@ -204,201 +203,201 @@ static void P_NetArchivePlayers(void) if (players[i].follower) flags |= FOLLOWER; - WRITEUINT16(save_p, flags); + WRITEUINT16(save->p, flags); 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); - 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); for (j = 0; j < MAXPREDICTTICS; j++) { - WRITEINT16(save_p, players[i].lturn_max[j]); - WRITEINT16(save_p, players[i].rturn_max[j]); + WRITEINT16(save->p, players[i].lturn_max[j]); + WRITEINT16(save->p, players[i].rturn_max[j]); } - 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, players[i].distancetofinishprev); - 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, players[i].distancetofinishprev); + 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); - WRITEINT16(save_p, players[i].squishedtimer); - WRITEUINT8(save_p, players[i].instashield); - WRITEUINT8(save_p, players[i].wipeoutslow); - WRITEUINT8(save_p, players[i].justbumped); + WRITEUINT16(save->p, players[i].flashing); + WRITEUINT16(save->p, players[i].spinouttimer); + WRITEUINT8(save->p, players[i].spinouttype); + WRITEINT16(save->p, players[i].squishedtimer); + WRITEUINT8(save->p, players[i].instashield); + WRITEUINT8(save->p, players[i].wipeoutslow); + WRITEUINT8(save->p, players[i].justbumped); - WRITESINT8(save_p, players[i].drift); - WRITEFIXED(save_p, players[i].driftcharge); - WRITEUINT8(save_p, players[i].driftboost); + WRITESINT8(save->p, players[i].drift); + WRITEFIXED(save->p, players[i].driftcharge); + WRITEUINT8(save->p, players[i].driftboost); - 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); - WRITEUINT8(save_p, players[i].pogospring); - WRITEUINT8(save_p, players[i].brakestop); - WRITEUINT8(save_p, players[i].waterskip); + WRITEFIXED(save->p, players[i].offroad); + WRITEUINT8(save->p, players[i].pogospring); + WRITEUINT8(save->p, players[i].brakestop); + WRITEUINT8(save->p, players[i].waterskip); - WRITEUINT8(save_p, players[i].dashpadcooldown); + WRITEUINT8(save->p, players[i].dashpadcooldown); - WRITEFIXED(save_p, players[i].boostpower); - WRITEFIXED(save_p, players[i].speedboost); - WRITEFIXED(save_p, players[i].accelboost); - WRITEANGLE(save_p, players[i].boostangle); + WRITEFIXED(save->p, players[i].boostpower); + WRITEFIXED(save->p, players[i].speedboost); + WRITEFIXED(save->p, players[i].accelboost); + WRITEANGLE(save->p, players[i].boostangle); - WRITEUINT8(save_p, players[i].tripwireState); - WRITEUINT8(save_p, players[i].tripwirePass); - WRITEUINT16(save_p, players[i].tripwireLeniency); - WRITEUINT8(save_p, players[i].tripwireReboundDelay); + WRITEUINT8(save->p, players[i].tripwireState); + WRITEUINT8(save->p, players[i].tripwirePass); + WRITEUINT16(save->p, players[i].tripwireLeniency); + WRITEUINT8(save->p, players[i].tripwireReboundDelay); - WRITEUINT16(save_p, players[i].itemroulette); - WRITEUINT8(save_p, players[i].roulettetype); + WRITEUINT16(save->p, players[i].itemroulette); + WRITEUINT8(save->p, players[i].roulettetype); - 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); - 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); + 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].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].floorboost); - WRITEUINT8(save_p, players[i].waterrun); + WRITEUINT16(save->p, players[i].sneakertimer); + WRITEUINT8(save->p, players[i].floorboost); + WRITEUINT8(save->p, players[i].waterrun); - WRITEUINT8(save_p, players[i].boostcharge); + WRITEUINT8(save->p, players[i].boostcharge); - WRITEINT16(save_p, players[i].growshrinktimer); - WRITEINT16(save_p, players[i].growcancel); - WRITEUINT16(save_p, players[i].rocketsneakertimer); - WRITEUINT16(save_p, players[i].invincibilitytimer); + WRITEINT16(save->p, players[i].growshrinktimer); + WRITEINT16(save->p, players[i].growcancel); + 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); - WRITEUINT32(save_p, players[i].roundscore); - WRITEUINT8(save_p, players[i].emeralds); - WRITEUINT8(save_p, players[i].bumper); - 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].bumper); + 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); // 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); + 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); - WRITEFIXED(save_p, players[i].outrun); - WRITEUINT8(save_p, players[i].outruntime); + WRITEFIXED(save->p, players[i].outrun); + WRITEUINT8(save->p, players[i].outruntime); // sonicloopsvars_t - WRITEFIXED(save_p, players[i].loop.radius); - WRITEFIXED(save_p, players[i].loop.revolution); - WRITEFIXED(save_p, players[i].loop.min_revolution); - WRITEFIXED(save_p, players[i].loop.max_revolution); - WRITEANGLE(save_p, players[i].loop.yaw); - WRITEFIXED(save_p, players[i].loop.origin.x); - WRITEFIXED(save_p, players[i].loop.origin.y); - WRITEFIXED(save_p, players[i].loop.origin.z); - WRITEFIXED(save_p, players[i].loop.shift.x); - WRITEFIXED(save_p, players[i].loop.shift.y); - WRITEUINT8(save_p, players[i].loop.flip); + WRITEFIXED(save->p, players[i].loop.radius); + WRITEFIXED(save->p, players[i].loop.revolution); + WRITEFIXED(save->p, players[i].loop.min_revolution); + WRITEFIXED(save->p, players[i].loop.max_revolution); + WRITEANGLE(save->p, players[i].loop.yaw); + WRITEFIXED(save->p, players[i].loop.origin.x); + WRITEFIXED(save->p, players[i].loop.origin.y); + WRITEFIXED(save->p, players[i].loop.origin.z); + WRITEFIXED(save->p, players[i].loop.shift.x); + WRITEFIXED(save->p, players[i].loop.shift.y); + WRITEUINT8(save->p, players[i].loop.flip); // sonicloopcamvars_t - WRITEUINT32(save_p, players[i].loop.camera.enter_tic); - WRITEUINT32(save_p, players[i].loop.camera.exit_tic); - WRITEUINT32(save_p, players[i].loop.camera.zoom_in_speed); - WRITEUINT32(save_p, players[i].loop.camera.zoom_out_speed); - WRITEFIXED(save_p, players[i].loop.camera.dist); - WRITEANGLE(save_p, players[i].loop.camera.pan); - WRITEFIXED(save_p, players[i].loop.camera.pan_speed); - WRITEUINT32(save_p, players[i].loop.camera.pan_accel); - WRITEUINT32(save_p, players[i].loop.camera.pan_back); + WRITEUINT32(save->p, players[i].loop.camera.enter_tic); + WRITEUINT32(save->p, players[i].loop.camera.exit_tic); + WRITEUINT32(save->p, players[i].loop.camera.zoom_in_speed); + WRITEUINT32(save->p, players[i].loop.camera.zoom_out_speed); + WRITEFIXED(save->p, players[i].loop.camera.dist); + WRITEANGLE(save->p, players[i].loop.camera.pan); + WRITEFIXED(save->p, players[i].loop.camera.pan_speed); + WRITEUINT32(save->p, players[i].loop.camera.pan_accel); + WRITEUINT32(save->p, players[i].loop.camera.pan_back); } } -static void P_NetUnArchivePlayers(void) +static void P_NetUnArchivePlayers(savebuffer_t *save) { INT32 i, j; UINT16 flags; - 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 @@ -408,264 +407,264 @@ 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].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].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].availabilities = READUINT32(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].skincolor = READUINT8(save->p); + players[i].skin = READINT32(save->p); + players[i].availabilities = READUINT32(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].lapvalidation = READUINT8(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].lapvalidation = READUINT8(save->p); - players[i].starposttime = READUINT32(save_p); - players[i].starpostx = READINT16(save_p); - players[i].starposty = READINT16(save_p); - players[i].starpostz = READINT16(save_p); - players[i].starpostnum = READINT32(save_p); - players[i].starpostangle = READANGLE(save_p); - players[i].starpostflip = (boolean)READUINT8(save_p); - players[i].prevcheck = READINT32(save_p); - players[i].nextcheck = READINT32(save_p); + players[i].starposttime = READUINT32(save->p); + players[i].starpostx = READINT16(save->p); + players[i].starposty = READINT16(save->p); + players[i].starpostz = READINT16(save->p); + players[i].starpostnum = READINT32(save->p); + players[i].starpostangle = READANGLE(save->p); + players[i].starpostflip = (boolean)READUINT8(save->p); + players[i].prevcheck = READINT32(save->p); + players[i].nextcheck = 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].onconveyor = READINT32(save_p); + players[i].onconveyor = READINT32(save->p); - players[i].jointime = READUINT32(save_p); - players[i].spectatorreentry = READUINT32(save_p); + players[i].jointime = READUINT32(save->p); + players[i].spectatorreentry = READUINT32(save->p); - players[i].grieftime = READUINT32(save_p); - players[i].griefstrikes = READUINT8(save_p); + players[i].grieftime = READUINT32(save->p); + players[i].griefstrikes = READUINT8(save->p); - players[i].splitscreenindex = READUINT8(save_p); + players[i].splitscreenindex = READUINT8(save->p); - flags = READUINT16(save_p); + flags = READUINT16(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); - 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); for (j = 0; j < MAXPREDICTTICS; j++) { - players[i].lturn_max[j] = READINT16(save_p); - players[i].rturn_max[j] = READINT16(save_p); + players[i].lturn_max[j] = READINT16(save->p); + players[i].rturn_max[j] = READINT16(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].distancetofinishprev = 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].distancetofinishprev = 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].squishedtimer = READINT16(save_p); - players[i].instashield = READUINT8(save_p); - players[i].wipeoutslow = READUINT8(save_p); - players[i].justbumped = READUINT8(save_p); + players[i].flashing = READUINT16(save->p); + players[i].spinouttimer = READUINT16(save->p); + players[i].spinouttype = READUINT8(save->p); + players[i].squishedtimer = READINT16(save->p); + players[i].instashield = READUINT8(save->p); + players[i].wipeoutslow = READUINT8(save->p); + players[i].justbumped = READUINT8(save->p); - players[i].drift = READSINT8(save_p); - players[i].driftcharge = READFIXED(save_p); - players[i].driftboost = READUINT8(save_p); + players[i].drift = READSINT8(save->p); + players[i].driftcharge = READFIXED(save->p); + players[i].driftboost = 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].pogospring = READUINT8(save_p); - players[i].brakestop = READUINT8(save_p); - players[i].waterskip = READUINT8(save_p); + players[i].offroad = READFIXED(save->p); + players[i].pogospring = READUINT8(save->p); + players[i].brakestop = READUINT8(save->p); + players[i].waterskip = READUINT8(save->p); - players[i].dashpadcooldown = READUINT8(save_p); + players[i].dashpadcooldown = READUINT8(save->p); - players[i].boostpower = READFIXED(save_p); - players[i].speedboost = READFIXED(save_p); - players[i].accelboost = READFIXED(save_p); - players[i].boostangle = READANGLE(save_p); + players[i].boostpower = READFIXED(save->p); + players[i].speedboost = READFIXED(save->p); + players[i].accelboost = READFIXED(save->p); + players[i].boostangle = READANGLE(save->p); - players[i].tripwireState = READUINT8(save_p); - players[i].tripwirePass = READUINT8(save_p); - players[i].tripwireLeniency = READUINT16(save_p); - players[i].tripwireReboundDelay = READUINT8(save_p); + players[i].tripwireState = READUINT8(save->p); + players[i].tripwirePass = READUINT8(save->p); + players[i].tripwireLeniency = READUINT16(save->p); + players[i].tripwireReboundDelay = READUINT8(save->p); - players[i].itemroulette = READUINT16(save_p); - players[i].roulettetype = READUINT8(save_p); + players[i].itemroulette = READUINT16(save->p); + players[i].roulettetype = READUINT8(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].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].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].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].floorboost = READUINT8(save_p); - players[i].waterrun = READUINT8(save_p); + players[i].sneakertimer = READUINT16(save->p); + players[i].floorboost = READUINT8(save->p); + players[i].waterrun = READUINT8(save->p); - players[i].boostcharge = READUINT8(save_p); + players[i].boostcharge = READUINT8(save->p); - players[i].growshrinktimer = READINT16(save_p); - players[i].growcancel = READINT16(save_p); - players[i].rocketsneakertimer = READUINT16(save_p); - players[i].invincibilitytimer = READUINT16(save_p); + players[i].growshrinktimer = READINT16(save->p); + players[i].growcancel = 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].roundscore = READUINT32(save_p); - players[i].emeralds = READUINT8(save_p); - players[i].bumper = 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].bumper = 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); // 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.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].outrun = READFIXED(save_p); - players[i].outruntime = READUINT8(save_p); + players[i].outrun = READFIXED(save->p); + players[i].outruntime = READUINT8(save->p); // sonicloopsvars_t - players[i].loop.radius = READFIXED(save_p); - players[i].loop.revolution = READFIXED(save_p); - players[i].loop.min_revolution = READFIXED(save_p); - players[i].loop.max_revolution = READFIXED(save_p); - players[i].loop.yaw = READANGLE(save_p); - players[i].loop.origin.x = READFIXED(save_p); - players[i].loop.origin.y = READFIXED(save_p); - players[i].loop.origin.z = READFIXED(save_p); - players[i].loop.shift.x = READFIXED(save_p); - players[i].loop.shift.y = READFIXED(save_p); - players[i].loop.flip = READUINT8(save_p); + players[i].loop.radius = READFIXED(save->p); + players[i].loop.revolution = READFIXED(save->p); + players[i].loop.min_revolution = READFIXED(save->p); + players[i].loop.max_revolution = READFIXED(save->p); + players[i].loop.yaw = READANGLE(save->p); + players[i].loop.origin.x = READFIXED(save->p); + players[i].loop.origin.y = READFIXED(save->p); + players[i].loop.origin.z = READFIXED(save->p); + players[i].loop.shift.x = READFIXED(save->p); + players[i].loop.shift.y = READFIXED(save->p); + players[i].loop.flip = READUINT8(save->p); // sonicloopcamvars_t - players[i].loop.camera.enter_tic = READUINT32(save_p); - players[i].loop.camera.exit_tic = READUINT32(save_p); - players[i].loop.camera.zoom_in_speed = READUINT32(save_p); - players[i].loop.camera.zoom_out_speed = READUINT32(save_p); - players[i].loop.camera.dist = READFIXED(save_p); - players[i].loop.camera.pan = READANGLE(save_p); - players[i].loop.camera.pan_speed = READFIXED(save_p); - players[i].loop.camera.pan_accel = READUINT32(save_p); - players[i].loop.camera.pan_back = READUINT32(save_p); + players[i].loop.camera.enter_tic = READUINT32(save->p); + players[i].loop.camera.exit_tic = READUINT32(save->p); + players[i].loop.camera.zoom_in_speed = READUINT32(save->p); + players[i].loop.camera.zoom_out_speed = READUINT32(save->p); + players[i].loop.camera.dist = READFIXED(save->p); + players[i].loop.camera.pan = READANGLE(save->p); + players[i].loop.camera.pan_speed = READFIXED(save->p); + players[i].loop.camera.pan_accel = READUINT32(save->p); + players[i].loop.camera.pan_back = READUINT32(save->p); //players[i].viewheight = P_GetPlayerViewHeight(players[i]); // scale cannot be factored in at this point } @@ -768,12 +767,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) { @@ -782,15 +781,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; @@ -802,7 +801,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, @@ -810,7 +809,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) { @@ -820,15 +819,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]) { @@ -1044,7 +1043,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; @@ -1059,19 +1058,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 @@ -1082,7 +1081,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 @@ -1097,21 +1096,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; @@ -1202,79 +1201,79 @@ 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 (diff4 & SD_ACTION) - WRITEINT16(save_p, ss->action); + WRITEINT16(save->p, ss->action); if (diff4 & SD_ARGS) { for (j = 0; j < NUMSECTORARGS; j++) - WRITEINT32(save_p, ss->args[j]); + WRITEINT32(save->p, ss->args[j]); } if (diff4 & SD_STRINGARGS) { @@ -1284,34 +1283,34 @@ static void ArchiveSectors(void) if (!ss->stringargs[j]) { - WRITEINT32(save_p, 0); + WRITEINT32(save->p, 0); continue; } len = strlen(ss->stringargs[j]); - WRITEINT32(save_p, len); + WRITEINT32(save->p, len); for (k = 0; k < len; k++) - WRITECHAR(save_p, ss->stringargs[j][k]); + WRITECHAR(save->p, ss->stringargs[j][k]); } } if (diff5 & SD_ACTIVATION) - WRITEUINT32(save_p, ss->activation); + WRITEUINT32(save->p, ss->activation); 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, diff5; for (;;) { - i = READUINT16(save_p); + i = READUINT16(save->p); if (i == 0xffff) break; @@ -1319,59 +1318,59 @@ 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 (diff4 & SD_DIFF5) - diff5 = READUINT8(save_p); + diff5 = READUINT8(save->p); else diff5 = 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++) @@ -1385,7 +1384,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++) @@ -1394,47 +1393,47 @@ 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 (diff4 & SD_ACTION) - sectors[i].action = READINT16(save_p); + sectors[i].action = READINT16(save->p); if (diff4 & SD_ARGS) { for (j = 0; j < NUMSECTORARGS; j++) - sectors[i].args[j] = READINT32(save_p); + sectors[i].args[j] = READINT32(save->p); } if (diff4 & SD_STRINGARGS) { for (j = 0; j < NUMLINESTRINGARGS; j++) { - size_t len = READINT32(save_p); + size_t len = READINT32(save->p); size_t k; if (!len) @@ -1446,19 +1445,19 @@ static void UnArchiveSectors(void) sectors[i].stringargs[j] = Z_Realloc(sectors[i].stringargs[j], len + 1, PU_LEVEL, NULL); for (k = 0; k < len; k++) - sectors[i].stringargs[j][k] = READCHAR(save_p); + sectors[i].stringargs[j][k] = READCHAR(save->p); sectors[i].stringargs[j][len] = '\0'; } } if (diff5 & SD_ACTIVATION) - sectors[i].activation = READUINT32(save_p); + sectors[i].activation = READUINT32(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; @@ -1528,43 +1527,43 @@ 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 (diff2 & LD_DIFF3) - WRITEUINT8(save_p, diff3); + WRITEUINT8(save->p, diff3); 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) { @@ -1575,26 +1574,26 @@ 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); if (diff3 & LD_ACTIVATION) - WRITEUINT32(save_p, li->activation); + WRITEUINT32(save->p, li->activation); } } - WRITEUINT16(save_p, 0xffff); + WRITEUINT16(save->p, 0xffff); } -static void UnArchiveLines(void) +static void UnArchiveLines(savebuffer_t *save) { UINT16 i; line_t *li; @@ -1603,64 +1602,64 @@ 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 (diff2 & LD_DIFF3) - diff3 = READUINT8(save_p); + diff3 = READUINT8(save->p); else diff3 = 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) @@ -1672,35 +1671,35 @@ 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); if (diff3 & LD_ACTIVATION) - li->activation = READUINT32(save_p); + li->activation = READUINT32(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 @@ -1714,8 +1713,8 @@ static void P_NetUnArchiveWorld(void) num_ffloors++; } - UnArchiveSectors(); - UnArchiveLines(); + UnArchiveSectors(save); + UnArchiveLines(save); } // @@ -1869,7 +1868,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; @@ -2051,28 +2050,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) @@ -2083,7 +2082,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) @@ -2091,110 +2090,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) { @@ -2208,558 +2207,558 @@ 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_LIGHTLEVEL) { - WRITEINT16(save_p, mobj->lightlevel); + WRITEINT16(save->p, mobj->lightlevel); } 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->sourceline); - WRITEFIXED(save_p, ht->origspeed); - WRITEFIXED(save_p, ht->crushHeight); - WRITEFIXED(save_p, ht->crushSpeed); - WRITEFIXED(save_p, ht->returnHeight); - WRITEFIXED(save_p, ht->returnSpeed); + 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->sourceline); + WRITEFIXED(save->p, ht->origspeed); + WRITEFIXED(save->p, ht->crushHeight); + WRITEFIXED(save->p, ht->crushSpeed); + WRITEFIXED(save->p, ht->returnHeight); + WRITEFIXED(save->p, ht->returnSpeed); } -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); - WRITEFIXED(save_p, ht->crushHeight); - WRITEFIXED(save_p, ht->crushSpeed); - WRITEFIXED(save_p, ht->returnHeight); - WRITEFIXED(save_p, ht->returnSpeed); + 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); + WRITEFIXED(save->p, ht->crushHeight); + WRITEFIXED(save->p, ht->crushSpeed); + WRITEFIXED(save->p, ht->returnHeight); + WRITEFIXED(save->p, ht->returnSpeed); } -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++) { @@ -2773,7 +2772,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 @@ -2781,202 +2780,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 @@ -2987,34 +2986,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) { @@ -3025,7 +3024,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); waypoint->mobj = NULL; if (!P_SetTarget(&waypoint->mobj, P_FindNewPosition(temp))) { CONS_Debug(DBG_GAMELOGIC, "waypoint mobj not found for %d\n", i); @@ -3035,39 +3034,34 @@ static void P_NetUnArchiveWaypoints(void) } } -static void P_NetArchiveTubeWaypoints() +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, SaveMobjnum(tubewaypoints[i][j])); - } + WRITEUINT32(save->p, tubewaypoints[i][j] ? tubewaypoints[i][j]->mobjnum : 0); } } -static void P_NetUnArchiveTubeWaypoints() +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); - tubewaypoints[i][j] = NULL; - if (mobjnum != 0) - P_SetTarget(&tubewaypoints[i][j], P_FindNewPosition(mobjnum)); + mobjnum = READUINT32(save->p); + tubewaypoints[i][j] = (mobjnum == 0) ? NULL : 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 @@ -3128,7 +3122,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; @@ -3138,35 +3132,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 { @@ -3192,7 +3186,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++) @@ -3211,11 +3205,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 { @@ -3227,47 +3221,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; @@ -3276,8 +3270,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 { @@ -3285,135 +3279,135 @@ 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_LIGHTLEVEL) { - mobj->lightlevel = READINT16(save_p); + mobj->lightlevel = READINT16(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 { @@ -3434,7 +3428,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) { @@ -3465,25 +3459,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; @@ -3491,16 +3485,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) { @@ -3511,16 +3505,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) { @@ -3531,29 +3525,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) { @@ -3564,171 +3558,171 @@ 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->sourceline = READFIXED(save_p); - ht->origspeed = READFIXED(save_p); - ht->crushHeight = READFIXED(save_p); - ht->crushSpeed = READFIXED(save_p); - ht->returnHeight = READFIXED(save_p); - ht->returnSpeed = 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->sourceline = READFIXED(save->p); + ht->origspeed = READFIXED(save->p); + ht->crushHeight = READFIXED(save->p); + ht->crushSpeed = READFIXED(save->p); + ht->returnHeight = READFIXED(save->p); + ht->returnSpeed = 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->crushHeight = READFIXED(save_p); - ht->crushSpeed = READFIXED(save_p); - ht->returnHeight = READFIXED(save_p); - ht->returnSpeed = 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); + ht->crushHeight = READFIXED(save->p); + ht->crushSpeed = READFIXED(save->p); + ht->returnHeight = READFIXED(save->p); + ht->returnSpeed = 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) { @@ -3739,21 +3733,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; @@ -3761,123 +3755,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) @@ -3898,176 +3892,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; @@ -4076,7 +4070,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 @@ -4120,7 +4114,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 @@ -4129,167 +4123,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: @@ -4329,29 +4323,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; @@ -4363,19 +4357,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 @@ -4386,33 +4380,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) @@ -4550,11 +4544,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; @@ -4564,53 +4558,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) { @@ -4625,14 +4619,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; @@ -4640,16 +4634,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) { @@ -4670,9 +4664,9 @@ static inline void P_UnArchiveSPGame(INT16 mapoverride) tokenlist = 0; token = 0; - 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)) { @@ -4686,167 +4680,167 @@ 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; - 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); } - WRITEUINT32(save_p, P_GetRandSeed()); + WRITEUINT32(save->p, P_GetRandSeed()); - WRITEUINT32(save_p, tokenlist); + WRITEUINT32(save->p, tokenlist); - WRITEUINT8(save_p, encoremode); - WRITEUINT8(save_p, mapmusrng); + WRITEUINT8(save->p, encoremode); + WRITEUINT8(save->p, mapmusrng); - WRITEUINT32(save_p, leveltime); - WRITEUINT32(save_p, ssspheres); - WRITEINT16(save_p, lastmap); - WRITEUINT16(save_p, bossdisabled); - WRITEUINT8(save_p, ringsdisabled); + WRITEUINT32(save->p, leveltime); + WRITEUINT32(save->p, ssspheres); + WRITEINT16(save->p, lastmap); + WRITEUINT16(save->p, bossdisabled); + WRITEUINT8(save->p, ringsdisabled); 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, token); - WRITEINT32(save_p, sstimer); - WRITEUINT32(save_p, bluescore); - WRITEUINT32(save_p, redscore); + WRITEUINT32(save->p, token); + WRITEINT32(save->p, sstimer); + 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); - WRITEUINT32(save_p, countdowntimer); - WRITEUINT8(save_p, countdowntimeup); + WRITEUINT32(save->p, countdowntimer); + WRITEUINT8(save->p, countdowntimeup); // 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, comeback); + WRITEUINT8(save->p, gamespeed); + WRITEUINT8(save->p, numlaps); + WRITEUINT8(save->p, franticitems); + WRITEUINT8(save->p, comeback); - 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, indirectitemcooldown); - WRITEUINT32(save_p, mapreset); + WRITEUINT32(save->p, wantedcalcdelay); + WRITEUINT32(save->p, indirectitemcooldown); + 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, startedInFreePlay); + WRITEUINT8(save->p, thwompsactive); + WRITEUINT8(save->p, lastLowestLap); + WRITESINT8(save->p, spbplace); + WRITEUINT8(save->p, startedInFreePlay); - WRITEUINT32(save_p, introtime); - WRITEUINT32(save_p, starttime); + WRITEUINT32(save->p, introtime); + WRITEUINT32(save->p, starttime); - 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); // 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); } } -static inline boolean P_NetUnArchiveMisc(boolean reloading) +static inline boolean P_NetUnArchiveMisc(savebuffer_t *save, boolean reloading) { size_t i; size_t numTasks; - 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 @@ -4858,12 +4852,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)); - tokenlist = READUINT32(save_p); + tokenlist = READUINT32(save->p); - encoremode = (boolean)READUINT8(save_p); + encoremode = (boolean)READUINT8(save->p); - mapmusrng = READUINT8(save_p); + mapmusrng = READUINT8(save->p); if (!P_LoadLevel(true, reloading)) { @@ -4886,122 +4880,122 @@ static inline boolean P_NetUnArchiveMisc(boolean reloading) } // get the time - leveltime = READUINT32(save_p); - ssspheres = READUINT32(save_p); - lastmap = READINT16(save_p); - bossdisabled = READUINT16(save_p); - ringsdisabled = READUINT8(save_p); + leveltime = READUINT32(save->p); + ssspheres = READUINT32(save->p); + lastmap = READINT16(save->p); + bossdisabled = READUINT16(save->p); + ringsdisabled = READUINT8(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)); } - token = READUINT32(save_p); - sstimer = READINT32(save_p); - bluescore = READUINT32(save_p); - redscore = READUINT32(save_p); + token = READUINT32(save->p); + sstimer = READINT32(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); - countdowntimer = (tic_t)READUINT32(save_p); - countdowntimeup = (boolean)READUINT8(save_p); + countdowntimer = (tic_t)READUINT32(save->p); + countdowntimeup = (boolean)READUINT8(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); - comeback = (boolean)READUINT8(save_p); + gamespeed = READUINT8(save->p); + numlaps = READUINT8(save->p); + franticitems = (boolean)READUINT8(save->p); + comeback = (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); - indirectitemcooldown = READUINT32(save_p); - mapreset = READUINT32(save_p); + wantedcalcdelay = READUINT32(save->p); + indirectitemcooldown = 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); - startedInFreePlay = READUINT8(save_p); + thwompsactive = (boolean)READUINT8(save->p); + lastLowestLap = READUINT8(save->p); + spbplace = READSINT8(save->p); + startedInFreePlay = READUINT8(save->p); - introtime = READUINT32(save_p); - starttime = READUINT32(save_p); + introtime = READUINT32(save->p); + starttime = READUINT32(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; // 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); } @@ -5009,7 +5003,7 @@ static inline boolean P_NetUnArchiveMisc(boolean reloading) return true; } -static inline void P_ArchiveLuabanksAndConsistency(void) +static inline void P_ArchiveLuabanksAndConsistency(savebuffer_t *save) { UINT8 i, banksinuse = NUM_LUABANKS; @@ -5018,30 +5012,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; @@ -5057,21 +5051,21 @@ static inline boolean P_UnArchiveLuabanksAndConsistency(void) return true; } -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; UINT32 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) @@ -5090,23 +5084,23 @@ 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_ArchiveLuabanksAndConsistency(); + P_ArchiveLuabanksAndConsistency(save); } -boolean P_LoadGame(INT16 mapoverride) +boolean P_LoadGame(savebuffer_t *save, INT16 mapoverride) { if (gamestate == GS_INTERMISSION) Y_EndIntermission(); @@ -5114,10 +5108,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 @@ -5127,25 +5121,25 @@ boolean P_LoadGame(INT16 mapoverride) return true; } -boolean P_LoadNetGame(boolean reloading) +boolean P_LoadNetGame(savebuffer_t *save, boolean reloading) { - CV_LoadNetVars(&save_p); - if (!P_NetUnArchiveMisc(reloading)) + CV_LoadNetVars(&save->p); + 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); // This is stupid and hacky, but maybe it'll work! P_SetRandSeed(P_GetInitSeed()); @@ -5156,5 +5150,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 b7ca6527f..18e343509 100644 --- a/src/p_saveg.h +++ b/src/p_saveg.h @@ -21,10 +21,10 @@ // 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); @@ -38,6 +38,11 @@ struct savedata_t }; extern savedata_t savedata; -extern UINT8 *save_p; + +struct savebuffer_t +{ + UINT8 *buffer; + UINT8 *p; +}; #endif diff --git a/src/p_setup.c b/src/p_setup.c index cbd09092f..8d9431cc1 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -965,12 +965,12 @@ void P_WriteThings(void) { 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; @@ -979,20 +979,20 @@ 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; - FIL_WriteFile(va("newthings%d.lmp", gamemap), savebuffer, length); - free(savebuffer); + FIL_WriteFile(va("newthings%d.lmp", gamemap), save.buffer, length); + free(save.buffer); savebuf_p = NULL; CONS_Printf(M_GetText("newthings%d.lmp saved.\n"), gamemap); diff --git a/src/typedef.h b/src/typedef.h index 2098e5bdb..487006a88 100644 --- a/src/typedef.h +++ b/src/typedef.h @@ -258,6 +258,7 @@ TYPEDEF (polyfadedata_t); // p_saveg.h TYPEDEF (savedata_t); +TYPEDEF (savebuffer_t); // p_setup.h TYPEDEF (levelflat_t);