From 0135c3308888e74488f5a1a0ada6e3f9a873adcd Mon Sep 17 00:00:00 2001 From: lilDavid <1337lilDavid@gmail.com> Date: Tue, 2 Aug 2022 11:51:44 -0500 Subject: [PATCH] Add instant boomerang recall --- libultraship/libultraship/ImGuiImpl.cpp | 2 ++ soh/include/z64player.h | 3 ++- soh/src/overlays/actors/ovl_En_Boom/z_en_boom.c | 7 ++++--- .../overlays/actors/ovl_player_actor/z_player.c | 17 +++++++++++------ 4 files changed, 19 insertions(+), 10 deletions(-) diff --git a/libultraship/libultraship/ImGuiImpl.cpp b/libultraship/libultraship/ImGuiImpl.cpp index c3dc8e23fd1..edda1fc1032 100644 --- a/libultraship/libultraship/ImGuiImpl.cpp +++ b/libultraship/libultraship/ImGuiImpl.cpp @@ -1012,6 +1012,8 @@ namespace SohImGui { Tooltip("Allow Link to put items away without having to wait around"); EnhancementCheckbox("Mask Select in Inventory", "gMaskSelect"); Tooltip("After completing the mask trading sub-quest, press A and any direction on the mask slot to change masks"); + EnhancementCheckbox("Instant Boomerang Recall", "gFastBoomerang"); + Tooltip("Instantly return the boomerang to Link by pressing its item button while it's in the air"); ImGui::EndMenu(); } diff --git a/soh/include/z64player.h b/soh/include/z64player.h index 954c36c1428..8581f771005 100644 --- a/soh/include/z64player.h +++ b/soh/include/z64player.h @@ -612,6 +612,7 @@ typedef struct Player { /* 0x0A86 */ s8 unk_A86; /* 0x0A87 */ u8 unk_A87; /* 0x0A88 */ Vec3f unk_A88; // previous body part 0 position -} Player; // size = 0xA94 + /* 0x0A94 */ u8 boomerangQuickRecall; // Has the player pressed the boomerang button while it's in the air still? +} Player; // size = 0xA95 #endif diff --git a/soh/src/overlays/actors/ovl_En_Boom/z_en_boom.c b/soh/src/overlays/actors/ovl_En_Boom/z_en_boom.c index f041d55bd96..e79d141091c 100644 --- a/soh/src/overlays/actors/ovl_En_Boom/z_en_boom.c +++ b/soh/src/overlays/actors/ovl_En_Boom/z_en_boom.c @@ -167,12 +167,12 @@ void EnBoom_Fly(EnBoom* this, GlobalContext* globalCtx) { // Decrement the return timer and check if it's 0. If it is, check if Link can catch it and handle accordingly. // Otherwise handle grabbing and colliding. - if (DECR(this->returnTimer) == 0) { + if (DECR(this->returnTimer) == 0 || player->boomerangQuickRecall) { distFromLink = Math_Vec3f_DistXYZ(&this->actor.world.pos, &player->actor.focus.pos); this->moveTo = &player->actor; // If the boomerang is less than 40 units away from Link, he can catch it. - if (distFromLink < 40.0f) { + if (distFromLink < 40.0f || player->boomerangQuickRecall) { target = this->grabbed; if (target != NULL) { Math_Vec3f_Copy(&target->world.pos, &player->actor.world.pos); @@ -187,7 +187,8 @@ void EnBoom_Fly(EnBoom* this, GlobalContext* globalCtx) { } } // Set player flags and kill the boomerang beacause Link caught it. - player->stateFlags1 &= ~0x02000000; + player->stateFlags1 &= ~PLAYER_STATE1_25; + player->boomerangQuickRecall = false; Actor_Kill(&this->actor); } } else { 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 844e301a903..9b1753b4c40 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -146,10 +146,10 @@ s32 func_808353D8(Player* this, GlobalContext* globalCtx); s32 func_80835588(Player* this, GlobalContext* globalCtx); s32 func_808356E8(Player* this, GlobalContext* globalCtx); s32 func_80835800(Player* this, GlobalContext* globalCtx); -s32 func_80835884(Player* this, GlobalContext* globalCtx); -s32 func_808358F0(Player* this, GlobalContext* globalCtx); -s32 func_808359FC(Player* this, GlobalContext* globalCtx); -s32 func_80835B60(Player* this, GlobalContext* globalCtx); +s32 func_80835884(Player* this, GlobalContext* globalCtx); // Start aiming boomerang +s32 func_808358F0(Player* this, GlobalContext* globalCtx); // Aim boomerang +s32 func_808359FC(Player* this, GlobalContext* globalCtx); // Throw boomerang +s32 func_80835B60(Player* this, GlobalContext* globalCtx); // Boomerang active s32 func_80835C08(Player* this, GlobalContext* globalCtx); void func_80835F44(GlobalContext* globalCtx, Player* this, s32 item); void func_80839F90(Player* this, GlobalContext* globalCtx); @@ -486,8 +486,8 @@ static s32 D_80853604 = 0; static s32 D_80853608 = 0; static s32 D_8085360C = 0; static s16 D_80853610 = 0; -static s32 D_80853614 = 0; -static s32 D_80853618 = 0; +static s32 D_80853614 = 0; // Held item button just pressed? +static s32 D_80853618 = 0; // Held item button currently down? static u16 D_8085361C[] = { NA_SE_VO_LI_SWEAT, @@ -954,6 +954,7 @@ static s8 sItemActionParams[] = { static u8 sMaskMemory; +// Used to map action params to update functions static s32(*D_80853EDC[])(Player* this, GlobalContext* globalCtx) = { func_8083485C, func_8083485C, func_8083485C, func_808349DC, func_808349DC, func_808349DC, func_8083485C, func_8083485C, func_8083501C, func_8083501C, func_8083501C, func_8083501C, func_8083501C, func_8083501C, @@ -2728,6 +2729,10 @@ s32 func_80835B60(Player* this, GlobalContext* globalCtx) { return 1; } + if (D_80853614 && CVar_GetS32("gFastBoomerang", 0)) { + this->boomerangQuickRecall = true; + } + return 0; }