From 38d3267cca5bb79a00da0450f022f9432cf86878 Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Tue, 27 Dec 2022 00:19:53 -0500 Subject: [PATCH] Save+load SRB2 vars on ACS threads --- src/acs/thread.cpp | 47 ++++++++++++++++++++++++++++++++++++++++++++++ src/acs/thread.hpp | 4 ++++ 2 files changed, 51 insertions(+) diff --git a/src/acs/thread.cpp b/src/acs/thread.cpp index cbaec5dca..fe9906a90 100644 --- a/src/acs/thread.cpp +++ b/src/acs/thread.cpp @@ -17,6 +17,13 @@ extern "C" { #include "../doomtype.h" #include "../doomdef.h" #include "../doomstat.h" + +#include "../p_saveg.h" +#include "../p_tick.h" +#include "../p_local.h" +#include "../r_defs.h" +#include "../r_state.h" +#include "../p_polyobj.h" } #include @@ -28,6 +35,7 @@ extern "C" { #include #include #include +#include #include using namespace srb2::acs; @@ -55,3 +63,42 @@ void Thread::stop() ACSVM::Thread::stop(); info = {}; } + +void Thread::saveState(ACSVM::Serial &serial) const +{ + ACSVM::Thread::saveState(serial); + + ACSVM::WriteVLN(serial, (info.mo != nullptr && P_MobjWasRemoved(info.mo) == false) ? (info.mo->mobjnum) : 0); + ACSVM::WriteVLN(serial, (info.line != nullptr) ? ((info.line - lines) + 1) : 0); + ACSVM::WriteVLN(serial, info.side); + ACSVM::WriteVLN(serial, (info.sector != nullptr) ? ((info.sector - sectors) + 1) : 0); + ACSVM::WriteVLN(serial, (info.po != nullptr) ? ((info.po - PolyObjects) + 1) : 0); +} + +void Thread::loadState(ACSVM::Serial &serial) +{ + ACSVM::Thread::loadState(serial); + + UINT32 temp = static_cast(ACSVM::ReadVLN(serial)); + + if (temp != 0) + { + info.mo = nullptr; + + if (P_SetTarget(&info.mo, P_FindNewPosition(temp)) == nullptr) + { + CONS_Debug(DBG_GAMELOGIC, "info.mo not found for ACS thread\n"); // todo: identify which thread + } + } + + size_t lineIndex = ACSVM::ReadVLN(serial); + info.line = (lineIndex != 0) ? (&lines[lineIndex - 1]) : nullptr; + + info.side = static_cast(ACSVM::ReadVLN(serial)); + + size_t sectorIndex = ACSVM::ReadVLN(serial); + info.sector = (sectorIndex != 0) ? (§ors[sectorIndex - 1]) : nullptr; + + size_t polyIndex = ACSVM::ReadVLN(serial); + info.po = (polyIndex != 0) ? (&PolyObjects[polyIndex - 1]) : nullptr; +} diff --git a/src/acs/thread.hpp b/src/acs/thread.hpp index 853b088f9..0658f8eed 100644 --- a/src/acs/thread.hpp +++ b/src/acs/thread.hpp @@ -118,6 +118,10 @@ public: ); virtual void stop(); + + virtual void loadState(ACSVM::Serial &serial); + + virtual void saveState(ACSVM::Serial &serial) const; }; }