diff --git a/mods/randomizer/src/hooks.cpp b/mods/randomizer/src/hooks.cpp index 314576e114..f6a27bf363 100644 --- a/mods/randomizer/src/hooks.cpp +++ b/mods/randomizer/src/hooks.cpp @@ -14,6 +14,10 @@ #include "d/actor/d_a_alink.h" #include "d/actor/d_a_b_bq.h" #include "d/actor/d_a_door_shutter.h" +#include "d/actor/d_a_e_mk.h" +#include "d/actor/d_a_kytag08.h" +#include "d/actor/d_a_npc4.h" +#include "d/actor/d_a_npc_bans.h" #include "d/actor/d_a_tag_kmsg.h" #include "d/d_door_param2.h" #include "d/d_file_sel_info.h" @@ -22,7 +26,6 @@ #include "d/d_msg_object.h" #include "d/d_save.h" #include "d/d_shop_system.h" -#include "d/actor/d_a_e_mk.h" DEFINE_HOOK(&dFile_select_c::selectDataNameMove, dFile_select_c__selectDataNameMove); DEFINE_HOOK(&dFile_select_c::dataSelect, dFile_select_c__dataSelect); @@ -80,6 +83,14 @@ DEFINE_HOOK_SYMBOL("demo_camera_end", void(e_mk_class*), e_mk_demo_camera_end); DEFINE_HOOK(&dStage_changeScene4Event, changeScene4Event); DEFINE_HOOK_SYMBOL("dStage_playerInit", int(dStage_dt_c*, void*, int, void*), stage_playerInit); +DEFINE_HOOK_SYMBOL("daKytag08_Execute", int(kytag08_class*), Kytag08_Execute); + +DEFINE_HOOK(&daNpcT_chkEvtBit, NpcT_chkEvtBit); +DEFINE_HOOK(&daNpcF_chkEvtBit, NpcF_chkEvtBit); +DEFINE_HOOK(&daNpcF_c::orderEvent, daNpcF_c__orderEvent); + +DEFINE_HOOK(&daNpc_Bans_c::isDelete, daNpc_Bans_c__isDelete); + namespace randomizer::ui { dialogSelectModeState g_dialogSelectModeState = SelectReady; } @@ -1397,6 +1408,84 @@ HookAction hookPreStagePlayerInit(ModContext*, void* args, void* retval, void*) return HOOK_CONTINUE; } +void hookPostKytag08Execute(ModContext*, void* args, void* retval, void*) { + kytag08_class* i_this = mods::arg(args, 0); + + if (i_this->mSizeTimer < 100 || dComIfGs_BossLife_public_Get() == 1) { + dComIfGs_BossLife_public_Set(0); + i_this->mTargetAvoidPos = i_this->current.pos; + i_this->mSizeTimer = 180; + mDoAud_startFogWipeTrigger(&i_this->current.pos); + } +} + +HookAction hookPreNpcTChkEvtBit(ModContext*, void* args, void* retval, void*) { + u32 i_no = mods::arg(args, 0); + + switch (i_no) { + case 0x153: // Checking if the player has Ending Blow + if (getStageID() == Hidden_Skill) { + *static_cast(retval) = TRUE; + return HOOK_SKIP_ORIGINAL; + } + break; + case 0x40: // Checking if the player has completed Goron Mines + if (getStageID() == Kakariko_Village_Interiors) { + // Return true so Barnes will sell bombs no matter what + *static_cast(retval) = TRUE; + return HOOK_SKIP_ORIGINAL; + } + break; + } + + return HOOK_CONTINUE; +} + +HookAction hookPreNpcFChkEvtBit(ModContext*, void* args, void* retval, void*) { + u32 i_no = mods::arg(args, 0); + + switch (i_no) { + case 0x169: // Checking if Raised Mirror in Mirror Chamber + // Only let Auru despawn in randomizer if we already collected his item + if (getStageID() == Lake_Hylia) { + *static_cast(retval) = dComIfGs_isEventBit(GOT_AURUS_MEMO); + return HOOK_SKIP_ORIGINAL; + } + break; + } + + return HOOK_CONTINUE; +} + +HookAction hookPreNpcBansIsDelete(ModContext*, void* args, void* retval, void*) { + daNpc_Bans_c* i_this = mods::arg(args, 0); + + switch (i_this->mType) { + case 3: // MAKING_BOMBS + *static_cast(retval) = TRUE; + return HOOK_SKIP_ORIGINAL; + case 4: // SHOP + *static_cast(retval) = FALSE; + return HOOK_SKIP_ORIGINAL; + } + + return HOOK_CONTINUE; +} + +HookAction hookPreNpcFOrderEvent(ModContext*, void* args, void* retval, void*) { + daNpcF_c* i_this = mods::arg(args, 0); + int& i_forceSpeak = mods::arg_ref(args, 1); + u16 i_priority = mods::arg(args, 4); + + // kinda hacky way to check for the state where Bo is trying to talk after getting Iron Boots + const std::string arcName = i_this->eventInfo.getArchiveName(); + if (arcName == "Bou4" && i_priority == 40) { + i_forceSpeak = FALSE; + } + + return HOOK_CONTINUE; +} + } ModResult initialize() { @@ -1465,6 +1554,14 @@ ModResult initialize() { ADD_HOOK_POST(changeScene4Event, hookPostChangeScene4Event); ADD_HOOK_PRE(stage_playerInit, hookPreStagePlayerInit); + ADD_HOOK_POST(Kytag08_Execute, hookPostKytag08Execute); + + ADD_HOOK_PRE(NpcT_chkEvtBit, hookPreNpcTChkEvtBit); + ADD_HOOK_PRE(NpcF_chkEvtBit, hookPreNpcFChkEvtBit); + ADD_HOOK_PRE(daNpcF_c__orderEvent, hookPreNpcFOrderEvent); + + ADD_HOOK_PRE(daNpc_Bans_c__isDelete, hookPreNpcBansIsDelete); + return MOD_OK; } @@ -1522,6 +1619,14 @@ ModResult uninstall() { mods::hook::uninstall(svc_hook); mods::hook::uninstall(svc_hook); + mods::hook::uninstall(svc_hook); + + mods::hook::uninstall(svc_hook); + mods::hook::uninstall(svc_hook); + mods::hook::uninstall(svc_hook); + + mods::hook::uninstall(svc_hook); + return MOD_OK; } } \ No newline at end of file