From dfaed908683893bfa8c9a043bd3d0cefa536ba28 Mon Sep 17 00:00:00 2001 From: djevangelia <263709373+djevangelia@users.noreply.github.com> Date: Sat, 18 Jul 2026 20:10:01 +0200 Subject: [PATCH] Savestates, player serialization (#6927) --- soh/soh/Enhancements/savestates.cpp | 4 +++ .../actors/ovl_player_actor/z_player.c | 28 +++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/soh/soh/Enhancements/savestates.cpp b/soh/soh/Enhancements/savestates.cpp index 5a635e323a..46d4da0abc 100644 --- a/soh/soh/Enhancements/savestates.cpp +++ b/soh/soh/Enhancements/savestates.cpp @@ -50,6 +50,7 @@ extern "C" void EnZf_SaveState(SaveStateCtx* ctx); extern "C" void EnZl3_SaveState(SaveStateCtx* ctx); extern "C" void ObjectKankyo_SaveState(SaveStateCtx* ctx); extern "C" void EnHeishi1_SaveState(SaveStateCtx* ctx); +extern "C" void Player_SaveState(SaveStateCtx* ctx); extern "C" void Matrix_SaveState(SaveStateCtx* ctx); extern "C" void Lights_SaveState(SaveStateCtx* ctx); @@ -147,6 +148,7 @@ typedef struct SaveStateInfo { std::unique_ptr enZl3State; std::unique_ptr objectKankyoState; std::unique_ptr enHeishi1State; + std::unique_ptr playerState; u8 transitionActorCount_copy; s16 transitionActorIds_copy[256]; @@ -281,6 +283,7 @@ void SaveState::SaveOverlayStaticData(void) { SaveOverlayState(info->enZl3State, EnZl3_SaveState); SaveOverlayState(info->objectKankyoState, ObjectKankyo_SaveState); SaveOverlayState(info->enHeishi1State, EnHeishi1_SaveState); + SaveOverlayState(info->playerState, Player_SaveState); } void SaveState::LoadOverlayStaticData(void) { @@ -326,6 +329,7 @@ void SaveState::LoadOverlayStaticData(void) { LoadOverlayState(info->enZl3State, EnZl3_SaveState); LoadOverlayState(info->objectKankyoState, ObjectKankyo_SaveState); LoadOverlayState(info->enHeishi1State, EnHeishi1_SaveState); + LoadOverlayState(info->playerState, Player_SaveState); } void SaveState::SaveTransitionActors(void) { diff --git a/soh/src/overlays/actors/ovl_player_actor/z_player.c b/soh/src/overlays/actors/ovl_player_actor/z_player.c index 14366029f8..8b164513de 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -31,6 +31,7 @@ #include "soh/frame_interpolation.h" #include "soh/OTRGlobals.h" #include "soh/ResourceManagerHelpers.h" +#include "soh/Enhancements/savestate_serialize.h" #include #include @@ -16603,3 +16604,30 @@ void Player_StartTalking(PlayState* play, Actor* actor) { Player_SetTurnAroundCamera(play, CAM_ITEM_TYPE_11); } } + +#define PLAYER_SHIP_SAVESTATE_FIELDS(F) \ + F(D_80858AA0) \ + F(sSavedCurrentMask) \ + F(sInteractWallCheckResult) \ + F(sControlInput) \ + F(sNoclipEnabled) \ + F(sControlStickMagnitude) \ + F(sControlStickAngle) \ + F(sControlStickWorldYaw) \ + F(sUpperBodyIsBusy) \ + F(sFloorType) \ + F(sWaterSpeedFactor) \ + F(sInvWaterSpeedFactor) \ + F(sTouchedWallFlags) \ + F(sConveyorSpeed) \ + F(sIsFloorConveyor) \ + F(sConveyorYaw) \ + F(sYDistToFloor) \ + F(sPrevFloorProperty) \ + F(sShapeYawToTouchedWall) \ + F(sWorldYawToTouchedWall) \ + F(sFloorShapePitch) \ + F(sUseHeldItem) \ + F(sHeldItemButtonIsHeldDown) + +SHIP_SAVESTATE_DEFINE(Player, PLAYER_SHIP_SAVESTATE_FIELDS)