From d2015f504d7b07c999a7f408c1651fef19a25ef2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Andr=C3=A9asson?= Date: Tue, 7 Jan 2025 11:50:13 +0100 Subject: [PATCH 1/6] * fixes softlock when talking to Mido without Kokiri Emerald after killing Gohma --- soh/soh/Enhancements/game-interactor/GameInteractor.h | 1 + soh/soh/Enhancements/randomizer/hook_handlers.cpp | 4 ++++ soh/src/overlays/actors/ovl_En_Md/z_en_md.c | 6 ++++-- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor.h b/soh/soh/Enhancements/game-interactor/GameInteractor.h index ea9c6191400..91f5a82b402 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor.h +++ b/soh/soh/Enhancements/game-interactor/GameInteractor.h @@ -492,6 +492,7 @@ typedef enum { /*** Fixes ***/ // Vanilla condition: false VB_FIX_SAW_SOFTLOCK, + VB_FIX_MIDO_EMERALD_SOFTLOCK, /*** Cheats? ***/ VB_DEKU_STICK_BE_ON_FIRE, diff --git a/soh/soh/Enhancements/randomizer/hook_handlers.cpp b/soh/soh/Enhancements/randomizer/hook_handlers.cpp index 6e88a249f22..ccbb4190975 100644 --- a/soh/soh/Enhancements/randomizer/hook_handlers.cpp +++ b/soh/soh/Enhancements/randomizer/hook_handlers.cpp @@ -1616,6 +1616,10 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l } break; } + case VB_FIX_MIDO_EMERALD_SOFTLOCK: { + *should = Flags_GetEventChkInf(EVENTCHKINF_USED_DEKU_TREE_BLUE_WARP); + break; + } case VB_FREEZE_ON_SKULL_TOKEN: case VB_TRADE_TIMER_ODD_MUSHROOM: case VB_TRADE_TIMER_FROG: diff --git a/soh/src/overlays/actors/ovl_En_Md/z_en_md.c b/soh/src/overlays/actors/ovl_En_Md/z_en_md.c index eaa8d9b2d94..64e6f54897d 100644 --- a/soh/src/overlays/actors/ovl_En_Md/z_en_md.c +++ b/soh/src/overlays/actors/ovl_En_Md/z_en_md.c @@ -794,8 +794,10 @@ void func_80AABD0C(EnMd* this, PlayState* play) { return; } - if (CHECK_QUEST_ITEM(QUEST_KOKIRI_EMERALD) && !Flags_GetEventChkInf(EVENTCHKINF_SPOKE_TO_MIDO_AFTER_DEKU_TREES_DEATH) && - (play->sceneNum == SCENE_KOKIRI_FOREST)) { + if ((GameInteractor_Should(VB_FIX_MIDO_EMERALD_SOFTLOCK, false, this) && play->sceneNum == SCENE_KOKIRI_FOREST) || + (CHECK_QUEST_ITEM(QUEST_KOKIRI_EMERALD) && !Flags_GetEventChkInf(EVENTCHKINF_SPOKE_TO_MIDO_AFTER_DEKU_TREES_DEATH) && + (play->sceneNum == SCENE_KOKIRI_FOREST))) + { Message_CloseTextbox(play); Flags_SetEventChkInf(EVENTCHKINF_SPOKE_TO_MIDO_AFTER_DEKU_TREES_DEATH); Actor_Kill(&this->actor); From ef1a75a5dd3423ae60075cdc9e4bb0dde7a8f16e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Andr=C3=A9asson?= Date: Tue, 7 Jan 2025 14:34:31 +0100 Subject: [PATCH 2/6] * moved scene check to hook * moved vanilla conditioon into GameInteractor_Should --- soh/soh/Enhancements/randomizer/hook_handlers.cpp | 2 +- soh/src/overlays/actors/ovl_En_Md/z_en_md.c | 11 +++++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/hook_handlers.cpp b/soh/soh/Enhancements/randomizer/hook_handlers.cpp index ccbb4190975..8f9cdf2746b 100644 --- a/soh/soh/Enhancements/randomizer/hook_handlers.cpp +++ b/soh/soh/Enhancements/randomizer/hook_handlers.cpp @@ -1617,7 +1617,7 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l break; } case VB_FIX_MIDO_EMERALD_SOFTLOCK: { - *should = Flags_GetEventChkInf(EVENTCHKINF_USED_DEKU_TREE_BLUE_WARP); + *should = Flags_GetEventChkInf(EVENTCHKINF_USED_DEKU_TREE_BLUE_WARP) && gPlayState->sceneNum == SCENE_KOKIRI_FOREST; break; } case VB_FREEZE_ON_SKULL_TOKEN: diff --git a/soh/src/overlays/actors/ovl_En_Md/z_en_md.c b/soh/src/overlays/actors/ovl_En_Md/z_en_md.c index 64e6f54897d..be38059cd71 100644 --- a/soh/src/overlays/actors/ovl_En_Md/z_en_md.c +++ b/soh/src/overlays/actors/ovl_En_Md/z_en_md.c @@ -794,10 +794,13 @@ void func_80AABD0C(EnMd* this, PlayState* play) { return; } - if ((GameInteractor_Should(VB_FIX_MIDO_EMERALD_SOFTLOCK, false, this) && play->sceneNum == SCENE_KOKIRI_FOREST) || - (CHECK_QUEST_ITEM(QUEST_KOKIRI_EMERALD) && !Flags_GetEventChkInf(EVENTCHKINF_SPOKE_TO_MIDO_AFTER_DEKU_TREES_DEATH) && - (play->sceneNum == SCENE_KOKIRI_FOREST))) - { + if ( + GameInteractor_Should( + VB_FIX_MIDO_EMERALD_SOFTLOCK, + CHECK_QUEST_ITEM(QUEST_KOKIRI_EMERALD) && !Flags_GetEventChkInf(EVENTCHKINF_SPOKE_TO_MIDO_AFTER_DEKU_TREES_DEATH) && + (play->sceneNum == SCENE_KOKIRI_FOREST), + this) + ) { Message_CloseTextbox(play); Flags_SetEventChkInf(EVENTCHKINF_SPOKE_TO_MIDO_AFTER_DEKU_TREES_DEATH); Actor_Kill(&this->actor); From 281b2ee34cc098f4ddff970d370196933e668965 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Andr=C3=A9asson?= Date: Tue, 7 Jan 2025 15:40:52 +0100 Subject: [PATCH 3/6] * corrected hook condition * removed 'this' --- soh/soh/Enhancements/randomizer/hook_handlers.cpp | 2 +- soh/src/overlays/actors/ovl_En_Md/z_en_md.c | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/hook_handlers.cpp b/soh/soh/Enhancements/randomizer/hook_handlers.cpp index 8f9cdf2746b..c3cff6a1edb 100644 --- a/soh/soh/Enhancements/randomizer/hook_handlers.cpp +++ b/soh/soh/Enhancements/randomizer/hook_handlers.cpp @@ -1617,7 +1617,7 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l break; } case VB_FIX_MIDO_EMERALD_SOFTLOCK: { - *should = Flags_GetEventChkInf(EVENTCHKINF_USED_DEKU_TREE_BLUE_WARP) && gPlayState->sceneNum == SCENE_KOKIRI_FOREST; + *should = *should || Flags_GetEventChkInf(EVENTCHKINF_USED_DEKU_TREE_BLUE_WARP) && gPlayState->sceneNum == SCENE_KOKIRI_FOREST; break; } case VB_FREEZE_ON_SKULL_TOKEN: diff --git a/soh/src/overlays/actors/ovl_En_Md/z_en_md.c b/soh/src/overlays/actors/ovl_En_Md/z_en_md.c index be38059cd71..41965422c23 100644 --- a/soh/src/overlays/actors/ovl_En_Md/z_en_md.c +++ b/soh/src/overlays/actors/ovl_En_Md/z_en_md.c @@ -798,8 +798,7 @@ void func_80AABD0C(EnMd* this, PlayState* play) { GameInteractor_Should( VB_FIX_MIDO_EMERALD_SOFTLOCK, CHECK_QUEST_ITEM(QUEST_KOKIRI_EMERALD) && !Flags_GetEventChkInf(EVENTCHKINF_SPOKE_TO_MIDO_AFTER_DEKU_TREES_DEATH) && - (play->sceneNum == SCENE_KOKIRI_FOREST), - this) + (play->sceneNum == SCENE_KOKIRI_FOREST)) ) { Message_CloseTextbox(play); Flags_SetEventChkInf(EVENTCHKINF_SPOKE_TO_MIDO_AFTER_DEKU_TREES_DEATH); From 9339478eabe8cfac1a1875d07482cdd659b839ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Andr=C3=A9asson?= Date: Tue, 7 Jan 2025 23:33:16 +0100 Subject: [PATCH 4/6] * reverted GameInteractor and hook_handlers * changed actor to use existing hook --- soh/soh/Enhancements/game-interactor/GameInteractor.h | 1 - soh/soh/Enhancements/randomizer/hook_handlers.cpp | 4 ---- soh/src/overlays/actors/ovl_En_Md/z_en_md.c | 2 +- 3 files changed, 1 insertion(+), 6 deletions(-) diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor.h b/soh/soh/Enhancements/game-interactor/GameInteractor.h index 91f5a82b402..ea9c6191400 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor.h +++ b/soh/soh/Enhancements/game-interactor/GameInteractor.h @@ -492,7 +492,6 @@ typedef enum { /*** Fixes ***/ // Vanilla condition: false VB_FIX_SAW_SOFTLOCK, - VB_FIX_MIDO_EMERALD_SOFTLOCK, /*** Cheats? ***/ VB_DEKU_STICK_BE_ON_FIRE, diff --git a/soh/soh/Enhancements/randomizer/hook_handlers.cpp b/soh/soh/Enhancements/randomizer/hook_handlers.cpp index c3cff6a1edb..6e88a249f22 100644 --- a/soh/soh/Enhancements/randomizer/hook_handlers.cpp +++ b/soh/soh/Enhancements/randomizer/hook_handlers.cpp @@ -1616,10 +1616,6 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l } break; } - case VB_FIX_MIDO_EMERALD_SOFTLOCK: { - *should = *should || Flags_GetEventChkInf(EVENTCHKINF_USED_DEKU_TREE_BLUE_WARP) && gPlayState->sceneNum == SCENE_KOKIRI_FOREST; - break; - } case VB_FREEZE_ON_SKULL_TOKEN: case VB_TRADE_TIMER_ODD_MUSHROOM: case VB_TRADE_TIMER_FROG: diff --git a/soh/src/overlays/actors/ovl_En_Md/z_en_md.c b/soh/src/overlays/actors/ovl_En_Md/z_en_md.c index 41965422c23..bf636707a4e 100644 --- a/soh/src/overlays/actors/ovl_En_Md/z_en_md.c +++ b/soh/src/overlays/actors/ovl_En_Md/z_en_md.c @@ -796,7 +796,7 @@ void func_80AABD0C(EnMd* this, PlayState* play) { if ( GameInteractor_Should( - VB_FIX_MIDO_EMERALD_SOFTLOCK, + VB_MIDO_CONSIDER_DEKU_TREE_DEAD, CHECK_QUEST_ITEM(QUEST_KOKIRI_EMERALD) && !Flags_GetEventChkInf(EVENTCHKINF_SPOKE_TO_MIDO_AFTER_DEKU_TREES_DEATH) && (play->sceneNum == SCENE_KOKIRI_FOREST)) ) { From b6a2272675d18c4f5060af5cc88aeaec2df7b416 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Andr=C3=A9asson?= Date: Wed, 8 Jan 2025 08:06:57 +0100 Subject: [PATCH 5/6] * updated kokiri emerald conditions --- soh/src/overlays/actors/ovl_En_Md/z_en_md.c | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/soh/src/overlays/actors/ovl_En_Md/z_en_md.c b/soh/src/overlays/actors/ovl_En_Md/z_en_md.c index bf636707a4e..f394f96d7b7 100644 --- a/soh/src/overlays/actors/ovl_En_Md/z_en_md.c +++ b/soh/src/overlays/actors/ovl_En_Md/z_en_md.c @@ -618,13 +618,13 @@ void func_80AAB5A4(EnMd* this, PlayState* play) { if (play->sceneNum != SCENE_MIDOS_HOUSE) { if (CVarGetInteger(CVAR_ENHANCEMENT("DisableKokiriDrawDistance"), 0) != 0) { - temp = (CHECK_QUEST_ITEM(QUEST_KOKIRI_EMERALD) && !Flags_GetEventChkInf(EVENTCHKINF_SPOKE_TO_MIDO_AFTER_DEKU_TREES_DEATH) && - (play->sceneNum == SCENE_KOKIRI_FOREST)) + temp = GameInteractor_Should(VB_MIDO_CONSIDER_DEKU_TREE_DEAD, CHECK_QUEST_ITEM(QUEST_KOKIRI_EMERALD) && + !Flags_GetEventChkInf(EVENTCHKINF_SPOKE_TO_MIDO_AFTER_DEKU_TREES_DEATH) && (play->sceneNum == SCENE_KOKIRI_FOREST)) ? 100.0f : 32767.0f; } else { - temp = (CHECK_QUEST_ITEM(QUEST_KOKIRI_EMERALD) && !Flags_GetEventChkInf(EVENTCHKINF_SPOKE_TO_MIDO_AFTER_DEKU_TREES_DEATH) && - (play->sceneNum == SCENE_KOKIRI_FOREST)) + temp = GameInteractor_Should(VB_MIDO_CONSIDER_DEKU_TREE_DEAD, CHECK_QUEST_ITEM(QUEST_KOKIRI_EMERALD) && + !Flags_GetEventChkInf(EVENTCHKINF_SPOKE_TO_MIDO_AFTER_DEKU_TREES_DEATH) && (play->sceneNum == SCENE_KOKIRI_FOREST)) ? 100.0f : 400.0f; } @@ -661,7 +661,7 @@ void EnMd_Init(Actor* thisx, PlayState* play) { if (((play->sceneNum == SCENE_KOKIRI_FOREST) && !Flags_GetEventChkInf(EVENTCHKINF_SHOWED_MIDO_SWORD_SHIELD)) || ((play->sceneNum == SCENE_KOKIRI_FOREST) && Flags_GetEventChkInf(EVENTCHKINF_SHOWED_MIDO_SWORD_SHIELD) && - CHECK_QUEST_ITEM(QUEST_KOKIRI_EMERALD)) || + GameInteractor_Should(VB_MIDO_CONSIDER_DEKU_TREE_DEAD, CHECK_QUEST_ITEM(QUEST_KOKIRI_EMERALD))) || ((play->sceneNum == SCENE_LOST_WOODS) && !Flags_GetEventChkInf(EVENTCHKINF_PLAYED_SARIAS_SONG_FOR_MIDO_AS_ADULT))) { this->actor.home.pos = this->actor.world.pos; this->actionFunc = func_80AAB948; @@ -727,8 +727,8 @@ void func_80AAB948(EnMd* this, PlayState* play) { (GameInteractor_Should(VB_MOVE_MIDO_IN_KOKIRI_FOREST, this->interactInfo.talkState == NPC_TALK_STATE_ACTION, this) && play->sceneNum == SCENE_KOKIRI_FOREST) || this->interactInfo.talkState == NPC_TALK_STATE_ACTION ) { - if (CHECK_QUEST_ITEM(QUEST_KOKIRI_EMERALD) && !Flags_GetEventChkInf(EVENTCHKINF_SPOKE_TO_MIDO_AFTER_DEKU_TREES_DEATH) && - (play->sceneNum == SCENE_KOKIRI_FOREST)) { + if (GameInteractor_Should(VB_MIDO_CONSIDER_DEKU_TREE_DEAD, CHECK_QUEST_ITEM(QUEST_KOKIRI_EMERALD)) && + !Flags_GetEventChkInf(EVENTCHKINF_SPOKE_TO_MIDO_AFTER_DEKU_TREES_DEATH) && (play->sceneNum == SCENE_KOKIRI_FOREST)) { play->msgCtx.msgMode = MSGMODE_PAUSED; } @@ -795,10 +795,8 @@ void func_80AABD0C(EnMd* this, PlayState* play) { } if ( - GameInteractor_Should( - VB_MIDO_CONSIDER_DEKU_TREE_DEAD, - CHECK_QUEST_ITEM(QUEST_KOKIRI_EMERALD) && !Flags_GetEventChkInf(EVENTCHKINF_SPOKE_TO_MIDO_AFTER_DEKU_TREES_DEATH) && - (play->sceneNum == SCENE_KOKIRI_FOREST)) + GameInteractor_Should(VB_MIDO_CONSIDER_DEKU_TREE_DEAD, CHECK_QUEST_ITEM(QUEST_KOKIRI_EMERALD)) && + !Flags_GetEventChkInf(EVENTCHKINF_SPOKE_TO_MIDO_AFTER_DEKU_TREES_DEATH) && (play->sceneNum == SCENE_KOKIRI_FOREST) ) { Message_CloseTextbox(play); Flags_SetEventChkInf(EVENTCHKINF_SPOKE_TO_MIDO_AFTER_DEKU_TREES_DEATH); From f73fb75aafdd78faeccf18cc5fb65c541cd6a9d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Andr=C3=A9asson?= Date: Wed, 8 Jan 2025 18:24:53 +0100 Subject: [PATCH 6/6] * missed parentheses --- soh/src/overlays/actors/ovl_En_Md/z_en_md.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/soh/src/overlays/actors/ovl_En_Md/z_en_md.c b/soh/src/overlays/actors/ovl_En_Md/z_en_md.c index f394f96d7b7..27e8fcdf219 100644 --- a/soh/src/overlays/actors/ovl_En_Md/z_en_md.c +++ b/soh/src/overlays/actors/ovl_En_Md/z_en_md.c @@ -618,12 +618,12 @@ void func_80AAB5A4(EnMd* this, PlayState* play) { if (play->sceneNum != SCENE_MIDOS_HOUSE) { if (CVarGetInteger(CVAR_ENHANCEMENT("DisableKokiriDrawDistance"), 0) != 0) { - temp = GameInteractor_Should(VB_MIDO_CONSIDER_DEKU_TREE_DEAD, CHECK_QUEST_ITEM(QUEST_KOKIRI_EMERALD) && + temp = (GameInteractor_Should(VB_MIDO_CONSIDER_DEKU_TREE_DEAD, CHECK_QUEST_ITEM(QUEST_KOKIRI_EMERALD)) && !Flags_GetEventChkInf(EVENTCHKINF_SPOKE_TO_MIDO_AFTER_DEKU_TREES_DEATH) && (play->sceneNum == SCENE_KOKIRI_FOREST)) ? 100.0f : 32767.0f; } else { - temp = GameInteractor_Should(VB_MIDO_CONSIDER_DEKU_TREE_DEAD, CHECK_QUEST_ITEM(QUEST_KOKIRI_EMERALD) && + temp = (GameInteractor_Should(VB_MIDO_CONSIDER_DEKU_TREE_DEAD, CHECK_QUEST_ITEM(QUEST_KOKIRI_EMERALD)) && !Flags_GetEventChkInf(EVENTCHKINF_SPOKE_TO_MIDO_AFTER_DEKU_TREES_DEATH) && (play->sceneNum == SCENE_KOKIRI_FOREST)) ? 100.0f : 400.0f;