summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordjevangelia <263709373+djevangelia@users.noreply.github.com>2026-07-22 15:48:10 +0200
committerGitHub <noreply@github.com>2026-07-22 13:48:10 +0000
commitfb657cc5d596ff38e555286c745cba2b4b014eb4 (patch)
tree8821ae81eafe88c1f73181153a3c41fdc99f29dc
parentd62c5879aaf4b64d68f6069cc2413c9d5f2eac92 (diff)
Savestates, more AudioOcarina serialization (#6954)
-rw-r--r--soh/soh/Enhancements/savestates.cpp8
-rw-r--r--soh/src/code/code_800EC960.c149
2 files changed, 116 insertions, 41 deletions
diff --git a/soh/soh/Enhancements/savestates.cpp b/soh/soh/Enhancements/savestates.cpp
index 46d4da0ab..a7c26c626 100644
--- a/soh/soh/Enhancements/savestates.cpp
+++ b/soh/soh/Enhancements/savestates.cpp
@@ -59,7 +59,7 @@ extern "C" void Camera_SaveState(SaveStateCtx* ctx);
extern "C" void OnePointCutscene_SaveState(SaveStateCtx* ctx);
extern "C" void Environment_SaveState(SaveStateCtx* ctx);
extern "C" void MapExp_SaveState(SaveStateCtx* ctx);
-extern "C" void AudioOca_SaveState(SaveStateCtx* ctx);
+extern "C" void AudioOcarina_SaveState(SaveStateCtx* ctx);
extern "C" void MessagePAL_SaveState(SaveStateCtx* ctx);
static void SaveOverlayState(std::unique_ptr<uint8_t[]>& buf, void (*fn)(SaveStateCtx*)) {
@@ -112,7 +112,7 @@ typedef struct SaveStateInfo {
std::unique_ptr<uint8_t[]> onePointCutsceneState;
std::unique_ptr<uint8_t[]> environmentState;
std::unique_ptr<uint8_t[]> mapExpState;
- std::unique_ptr<uint8_t[]> audioOcaState;
+ std::unique_ptr<uint8_t[]> audioOcarinaState;
std::unique_ptr<uint8_t[]> messagePalState;
// Overlay static data
@@ -249,7 +249,7 @@ void SaveState::SaveOverlayStaticData(void) {
SaveOverlayState(info->onePointCutsceneState, OnePointCutscene_SaveState);
SaveOverlayState(info->environmentState, Environment_SaveState);
SaveOverlayState(info->mapExpState, MapExp_SaveState);
- SaveOverlayState(info->audioOcaState, AudioOca_SaveState);
+ SaveOverlayState(info->audioOcarinaState, AudioOcarina_SaveState);
SaveOverlayState(info->messagePalState, MessagePAL_SaveState);
SaveOverlayState(info->bgDdanKdState, BgDdanKd_SaveState);
SaveOverlayState(info->bgDodoagoState, BgDodoago_SaveState);
@@ -295,7 +295,7 @@ void SaveState::LoadOverlayStaticData(void) {
LoadOverlayState(info->onePointCutsceneState, OnePointCutscene_SaveState);
LoadOverlayState(info->environmentState, Environment_SaveState);
LoadOverlayState(info->mapExpState, MapExp_SaveState);
- LoadOverlayState(info->audioOcaState, AudioOca_SaveState);
+ LoadOverlayState(info->audioOcarinaState, AudioOcarina_SaveState);
LoadOverlayState(info->messagePalState, MessagePAL_SaveState);
LoadOverlayState(info->bgDdanKdState, BgDdanKd_SaveState);
LoadOverlayState(info->bgDodoagoState, BgDodoago_SaveState);
diff --git a/soh/src/code/code_800EC960.c b/soh/src/code/code_800EC960.c
index 59a30e379..402e5c822 100644
--- a/soh/src/code/code_800EC960.c
+++ b/soh/src/code/code_800EC960.c
@@ -1313,44 +1313,119 @@ u32 sDebugPadPress; // decomp: debug only
s32 sAudioUpdateTaskStart; // decomp: debug only
s32 sAudioUpdateTaskEnd; // decomp: debug only
-#define AUDIO_OCA_SHIP_SAVESTATE_FIELDS(F) \
- F(sIsOcarinaInputEnabled) \
- F(sOcarinaInstrumentId) \
- F(sCurOcarinaPitch) \
- F(sPrevOcarinaPitch) \
- F(sCurOcarinaButtonIndex) \
- F(sMusicStaffPrevPitch) \
- F(sCurOcarinaBendFreq) \
- F(sRelativeOcarinaVolume) \
- F(sCurOcarinaBendIndex) \
- F(sCurOcarinaVolume) \
- F(sCurOcarinaVibrato) \
- F(sPlaybackState) \
- F(sOcarinaFlags) \
- F(sPlaybackNoteTimer) \
- F(sPlaybackNotePos) \
- F(sPlaybackStaffPos) \
- F(sOcarinaInputButtonCur) \
- F(sOcarinaInputButtonStart) \
- F(sOcarinaInputButtonPrev) \
- F(sOcarinaInputButtonPress) \
- F(D_8016BA1C) \
- F(sCurOcarinaSongWithoutMusicStaff) \
- F(sOcarinaWithoutMusicStaffPos) \
- F(sOcarinaHasStartedSong) \
- F(sFirstOcarinaSongIndex) \
- F(sLastOcarinaSongIndex) \
- F(sAvailOcarinaSongFlags) \
- F(sStaffOcarinaPlayingPos) \
- F(sMusicStaffPos) \
- F(sMusicStaffCurHeldLength) \
- F(sMusicStaffExpectedLength) \
- F(sMusicStaffExpectedPitch) \
- F(sScarecrowsLongSongSecondNote) \
- F(sIsMalonSinging) \
- F(sMalonSingingDist) \
+#define AUDIOOCARINA_SHIP_SAVESTATE_FIELDS(F) \
+ F(sOcarinaSongNotes[OCARINA_SONG_MEMORY_GAME]) \
+ F(sOcarinaSongNotes[OCARINA_SONG_SCARECROW_SPAWN]) \
+ F(sOcaMemoryGameAppendPos) \
+ F(sOcaMemoryGameEndPos) \
+ F(D_801305B0) \
+ F(D_801305B4) \
+ F(D_801305B8) \
+ F(D_801305BC) \
+ F(D_801305C0) \
+ F(sAudioIncreasingTranspose) \
+ F(sPrevChargeLevel) \
+ F(sSfxSwordChargeFreq) \
+ F(sEnterGanonsTowerTimer) \
+ F(D_80130608) \
+ F(sAudioCutsceneFlag) \
+ F(sSpecReverb) \
+ F(sAudioEnvReverb) \
+ F(sAudioCodeReverb) \
+ F(sPrevSeqMode) \
+ F(sAudioEnemyDist) \
+ F(sAudioEnemyVol) \
+ F(sPrevMainBgmSeqId) \
+ F(sSeqResumePoint) \
+ F(sPrevSceneSeqId) \
+ F(sNumFramesStill) \
+ F(sNumFramesMoving) \
+ F(sAudioBaseFilter) \
+ F(sAudioExtraFilter) \
+ F(sAudioBaseFilter2) \
+ F(sAudioExtraFilter2) \
+ F(sSariaBgmPtr) \
+ F(D_80130650) \
+ F(D_8016B7A8) \
+ F(D_8016B7AC) \
+ F(D_8016B7B0) \
+ F(D_8016B7B4) \
+ F(sRiverFreqScaleLerp) \
+ F(sWaterfallFreqScaleLerp) \
+ F(D_8016B7D8) \
+ F(D_8016B7DC) \
+ F(D_8016B7E0) \
+ F(sRiverSoundMainBgmVol) \
+ F(sRiverSoundMainBgmCurrentVol) \
+ F(sRiverSoundMainBgmLower) \
+ F(sRiverSoundMainBgmRestore) \
+ F(sGanonsTowerVol) \
+ F(sSfxChannelState) \
+ F(sMalonSingingTimer) \
+ F(sMalonSingingDisabled) \
+ F(D_8016B9F3) \
+ F(sFanfareStartTimer) \
+ F(sFanfareSeqId) \
+ F(sRecordingState) \
+ F(sRecordSongPos) \
+ F(sOcarinaRecordTaskStart) \
+ F(sRecordOcarinaPitch) \
+ F(sRecordOcarinaVolume) \
+ F(sRecordOcarinaVibrato) \
+ F(sRecordOcarinaBendIndex) \
+ F(sRecordOcarinaButtonIndex) \
+ F(sPlayedOcarinaSongIndexPlusOne) \
+ F(sMusicStaffNumNotesPerTest) \
+ F(sOcarinaDropInputTimer) \
+ F(sPlayingStaff) \
+ F(sPlaybackStaff) \
+ F(sRecordingStaff) \
+ F(sNotePlaybackVolume) \
+ F(sNotePlaybackVibrato) \
+ F(sNotePlaybackBend) \
+ F(sRelativeNotePlaybackBend) \
+ F(sRelativeNotePlaybackVolume) \
+ F(sOcarinaPlaybackTaskStart) \
+ F(sPrevOcarinaWithMusicStaffFlags) \
+ F(sOcarinaUpdateTaskStart) \
+ F(sOcarinaInputStickAdj) \
+ F(sIsOcarinaInputEnabled) \
+ F(sOcarinaInstrumentId) \
+ F(sCurOcarinaPitch) \
+ F(sPrevOcarinaPitch) \
+ F(sCurOcarinaButtonIndex) \
+ F(sMusicStaffPrevPitch) \
+ F(sCurOcarinaBendFreq) \
+ F(sRelativeOcarinaVolume) \
+ F(sCurOcarinaBendIndex) \
+ F(sCurOcarinaVolume) \
+ F(sCurOcarinaVibrato) \
+ F(sPlaybackState) \
+ F(sOcarinaFlags) \
+ F(sPlaybackNoteTimer) \
+ F(sPlaybackNotePos) \
+ F(sPlaybackStaffPos) \
+ F(sOcarinaInputButtonCur) \
+ F(sOcarinaInputButtonStart) \
+ F(sOcarinaInputButtonPrev) \
+ F(sOcarinaInputButtonPress) \
+ F(D_8016BA1C) \
+ F(sCurOcarinaSongWithoutMusicStaff) \
+ F(sOcarinaWithoutMusicStaffPos) \
+ F(sOcarinaHasStartedSong) \
+ F(sFirstOcarinaSongIndex) \
+ F(sLastOcarinaSongIndex) \
+ F(sAvailOcarinaSongFlags) \
+ F(sStaffOcarinaPlayingPos) \
+ F(sMusicStaffPos) \
+ F(sMusicStaffCurHeldLength) \
+ F(sMusicStaffExpectedLength) \
+ F(sMusicStaffExpectedPitch) \
+ F(sScarecrowsLongSongSecondNote) \
+ F(sIsMalonSinging) \
+ F(sMalonSingingDist) \
F(sPlaybackPitch)
-SHIP_SAVESTATE_DEFINE(AudioOca, AUDIO_OCA_SHIP_SAVESTATE_FIELDS)
+SHIP_SAVESTATE_DEFINE(AudioOcarina, AUDIOOCARINA_SHIP_SAVESTATE_FIELDS)
void PadMgr_RequestPadData(PadMgr* padmgr, Input* inputs, s32 mode);