// DR. ROBOTNIK'S RING RACERS //----------------------------------------------------------------------------- // Copyright (C) 2016 by James Haley, David Hill, et al. (Team Eternity) // Copyright (C) 2022 by Sally "TehRealSalt" Cochenour // Copyright (C) 2022 by Kart Krew // // 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 thread.cpp /// \brief Action Code Script: Thread definition #include "acsvm.hpp" #include "thread.hpp" 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" } using namespace srb2::acs; void Thread::start( ACSVM::Script *script, ACSVM::MapScope *map, const ACSVM::ThreadInfo *infoPtr, const ACSVM::Word *argV, ACSVM::Word argC) { ACSVM::Thread::start(script, map, infoPtr, argV, argC); if (infoPtr != nullptr) { info = *static_cast(infoPtr); } else { info = {}; } result = 1; } 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; }