From bc1b17cb49537ea3b873caa94b1a99e29607781b Mon Sep 17 00:00:00 2001 From: Demur Rumed Date: Tue, 8 Apr 2025 16:39:41 +0000 Subject: [PATCH 1/2] Faster empty bottle, faster bean skulltula --- .../TimeSavers/FasterBeanSkulltula.cpp | 15 ++++++++++++++ .../TimeSavers/FasterBottleEmpty.cpp | 20 +++++++++++++++++++ .../Enhancements/TimeSavers/TimeSavers.cpp | 2 ++ soh/soh/Enhancements/TimeSavers/TimeSavers.h | 2 ++ .../vanilla-behavior/GIVanillaBehavior.h | 16 +++++++++++++++ soh/soh/SohGui/SohMenuEnhancements.cpp | 7 +++++++ .../ovl_Obj_Makekinsuta/z_obj_makekinsuta.c | 4 +++- .../actors/ovl_player_actor/z_player.c | 2 ++ 8 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 soh/soh/Enhancements/TimeSavers/FasterBeanSkulltula.cpp create mode 100644 soh/soh/Enhancements/TimeSavers/FasterBottleEmpty.cpp diff --git a/soh/soh/Enhancements/TimeSavers/FasterBeanSkulltula.cpp b/soh/soh/Enhancements/TimeSavers/FasterBeanSkulltula.cpp new file mode 100644 index 000000000..1b6fd2a81 --- /dev/null +++ b/soh/soh/Enhancements/TimeSavers/FasterBeanSkulltula.cpp @@ -0,0 +1,15 @@ +#include "soh/Enhancements/game-interactor/GameInteractor.h" +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh/OTRGlobals.h" + +extern "C" { +#include "z64save.h" +} + +void FasterBeanSkulltula_Register() { + REGISTER_VB_SHOULD(VB_SPAWN_BEAN_SKULLTULA, { + if (CVarGetInteger(CVAR_ENHANCEMENT("FasterBeanSkull"), 0)) { + *should = true; + } + }); +} diff --git a/soh/soh/Enhancements/TimeSavers/FasterBottleEmpty.cpp b/soh/soh/Enhancements/TimeSavers/FasterBottleEmpty.cpp new file mode 100644 index 000000000..d01281c36 --- /dev/null +++ b/soh/soh/Enhancements/TimeSavers/FasterBottleEmpty.cpp @@ -0,0 +1,20 @@ +#include "soh/Enhancements/game-interactor/GameInteractor.h" +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh/OTRGlobals.h" + +extern "C" { +#include "z64save.h" +} + +void FasterEmptyBottle_Register() { + REGISTER_VB_SHOULD(VB_EMPTYING_BOTTLE, { + if (CVarGetInteger(CVAR_ENHANCEMENT("FasterBottleEmpty"), 0)) { + Player* player = va_arg(args, Player*); + if (player->skelAnime.curFrame <= 60.0f) { + player->skelAnime.playSpeed = 3.0f; + } else { + player->skelAnime.playSpeed = 1.0f; + } + } + }); +} diff --git a/soh/soh/Enhancements/TimeSavers/TimeSavers.cpp b/soh/soh/Enhancements/TimeSavers/TimeSavers.cpp index a881675d6..283f568f0 100644 --- a/soh/soh/Enhancements/TimeSavers/TimeSavers.cpp +++ b/soh/soh/Enhancements/TimeSavers/TimeSavers.cpp @@ -15,4 +15,6 @@ void TimeSavers_Register() { SkipChildRutoInteractions_Register(); FasterHeavyBlockLift_Register(); FasterRupeeAccumulator_Register(); + FasterEmptyBottle_Register(); + FasterBeanSkulltula_Register(); } diff --git a/soh/soh/Enhancements/TimeSavers/TimeSavers.h b/soh/soh/Enhancements/TimeSavers/TimeSavers.h index 9448260d6..450078cf6 100644 --- a/soh/soh/Enhancements/TimeSavers/TimeSavers.h +++ b/soh/soh/Enhancements/TimeSavers/TimeSavers.h @@ -17,5 +17,7 @@ void MoveMidoInKokiriForest_Register(); void SkipChildRutoInteractions_Register(); void FasterHeavyBlockLift_Register(); void FasterRupeeAccumulator_Register(); +void FasterEmptyBottle_Register(); +void FasterBeanSkulltula_Register(); #endif // TIME_SAVERS_H diff --git a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h index d57d5029a..0713fe858 100644 --- a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h +++ b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h @@ -425,6 +425,14 @@ typedef enum { // - `*int16_t` (item id) VB_DRAW_AMMO_COUNT, + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - Player* + VB_EMPTYING_BOTTLE, + // #### `result` // ```c // (Message_GetState(&play->msgCtx) == TEXT_STATE_EVENT) && Message_ShouldAdvance(play) @@ -1790,6 +1798,14 @@ typedef enum { // - `*ObjBean` VB_SPAWN_BEAN_STALK_FAIRIES, + // #### `result` + // ```c + // this->timer >= 60 + // ``` + // #### `args` + // - `None` + VB_SPAWN_BEAN_SKULLTULA, + // #### `result` // ```c // true diff --git a/soh/soh/SohGui/SohMenuEnhancements.cpp b/soh/soh/SohGui/SohMenuEnhancements.cpp index 0b78892d4..3874f7c86 100644 --- a/soh/soh/SohGui/SohMenuEnhancements.cpp +++ b/soh/soh/SohGui/SohMenuEnhancements.cpp @@ -373,6 +373,9 @@ void SohMenu::AddMenuEnhancements() { .CVar(CVAR_ENHANCEMENT("SkipSwimDeepEndAnim")) .Options(CheckboxOptions().Tooltip("Skips Link's taking breath animation after coming up from water. " "This setting does not interfere with getting items from underwater.")); + AddWidget(path, "Empty Bottles Faster", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("FasterBottleEmpty")) + .Options(CheckboxOptions().Tooltip("Speeds up emptying animation when dumping out the contents of a bottle.")); AddWidget(path, "Vine/Ladder Climb Speed +%d", WIDGET_CVAR_SLIDER_INT) .CVar(CVAR_ENHANCEMENT("ClimbSpeed")) .Options(IntSliderOptions().Min(0).Max(12).DefaultValue(0).Format("+%d")); @@ -425,6 +428,10 @@ void SohMenu::AddMenuEnhancements() { AddWidget(path, "Link as Default File Name", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("LinkDefaultName")) .Options(CheckboxOptions().Tooltip("Allows you to have \"Link\" as a premade file name.")); + AddWidget(path, "Spawn Bean Skulltula Faster", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("FasterBeanSkull")) + .Options(CheckboxOptions().Tooltip( + "Makes Gold Skulltulas come out of bean patches faster after bugs dig into center.")); AddWidget(path, "Biggoron Forge Time: %d days", WIDGET_CVAR_SLIDER_INT) .CVar(CVAR_ENHANCEMENT("ForgeTime")) .Options(IntSliderOptions().Min(0).Max(3).DefaultValue(3).Format("%d days").Tooltip( diff --git a/soh/src/overlays/actors/ovl_Obj_Makekinsuta/z_obj_makekinsuta.c b/soh/src/overlays/actors/ovl_Obj_Makekinsuta/z_obj_makekinsuta.c index 1fb3effc1..c193ede65 100644 --- a/soh/src/overlays/actors/ovl_Obj_Makekinsuta/z_obj_makekinsuta.c +++ b/soh/src/overlays/actors/ovl_Obj_Makekinsuta/z_obj_makekinsuta.c @@ -7,6 +7,8 @@ #include "z_obj_makekinsuta.h" #include "vt.h" +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" + #define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED void ObjMakekinsuta_Init(Actor* thisx, PlayState* play); @@ -47,7 +49,7 @@ void ObjMakekinsuta_Init(Actor* thisx, PlayState* play) { void func_80B98320(ObjMakekinsuta* this, PlayState* play) { if (this->unk_152 != 0) { - if (this->timer >= 60 && !func_8002DEEC(GET_PLAYER(play))) { + if (GameInteractor_Should(VB_SPAWN_BEAN_SKULLTULA, this->timer >= 60) && !func_8002DEEC(GET_PLAYER(play))) { Actor_Spawn(&play->actorCtx, play, ACTOR_EN_SW, this->actor.world.pos.x, this->actor.world.pos.y, this->actor.world.pos.z, 0, this->actor.shape.rot.y, 0, (this->actor.params | 0x8000), true); this->actionFunc = ObjMakekinsuta_DoNothing; 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 6638893f5..b84583dcd 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -14786,6 +14786,8 @@ static AnimSfxEntry D_80854A34[] = { void Player_Action_8084EFC0(Player* this, PlayState* play) { Player_DecelerateToZero(this); + GameInteractor_Should(VB_EMPTYING_BOTTLE, true, this); + if (LinkAnimation_Update(play, &this->skelAnime)) { func_8083C0E8(this, play); func_8005B1A4(Play_GetCamera(play, 0)); From 4bcafa646fbd258462856ee5ee3697d8c90c2624 Mon Sep 17 00:00:00 2001 From: Demur Rumed Date: Thu, 17 Apr 2025 02:32:12 +0000 Subject: [PATCH 2/2] shipinit --- .../TimeSavers/FasterBeanSkulltula.cpp | 14 ++++++------- .../TimeSavers/FasterBottleEmpty.cpp | 21 +++++++++---------- .../Enhancements/TimeSavers/TimeSavers.cpp | 2 -- soh/soh/Enhancements/TimeSavers/TimeSavers.h | 2 -- 4 files changed, 16 insertions(+), 23 deletions(-) diff --git a/soh/soh/Enhancements/TimeSavers/FasterBeanSkulltula.cpp b/soh/soh/Enhancements/TimeSavers/FasterBeanSkulltula.cpp index 1b6fd2a81..20011bba3 100644 --- a/soh/soh/Enhancements/TimeSavers/FasterBeanSkulltula.cpp +++ b/soh/soh/Enhancements/TimeSavers/FasterBeanSkulltula.cpp @@ -1,15 +1,13 @@ #include "soh/Enhancements/game-interactor/GameInteractor.h" -#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#include "soh/OTRGlobals.h" +#include "soh/ShipInit.hpp" extern "C" { #include "z64save.h" } -void FasterBeanSkulltula_Register() { - REGISTER_VB_SHOULD(VB_SPAWN_BEAN_SKULLTULA, { - if (CVarGetInteger(CVAR_ENHANCEMENT("FasterBeanSkull"), 0)) { - *should = true; - } - }); +void RegisterFasterBeanSkulltula() { + COND_VB_SHOULD(VB_SPAWN_BEAN_SKULLTULA, CVarGetInteger(CVAR_ENHANCEMENT("FasterBeanSkull"), 0), + { *should = true; }); } + +static RegisterShipInitFunc initFunc(RegisterFasterBeanSkulltula, { CVAR_ENHANCEMENT("FasterBeanSkull") }); diff --git a/soh/soh/Enhancements/TimeSavers/FasterBottleEmpty.cpp b/soh/soh/Enhancements/TimeSavers/FasterBottleEmpty.cpp index d01281c36..47b6b7461 100644 --- a/soh/soh/Enhancements/TimeSavers/FasterBottleEmpty.cpp +++ b/soh/soh/Enhancements/TimeSavers/FasterBottleEmpty.cpp @@ -1,20 +1,19 @@ #include "soh/Enhancements/game-interactor/GameInteractor.h" -#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#include "soh/OTRGlobals.h" +#include "soh/ShipInit.hpp" extern "C" { #include "z64save.h" } -void FasterEmptyBottle_Register() { - REGISTER_VB_SHOULD(VB_EMPTYING_BOTTLE, { - if (CVarGetInteger(CVAR_ENHANCEMENT("FasterBottleEmpty"), 0)) { - Player* player = va_arg(args, Player*); - if (player->skelAnime.curFrame <= 60.0f) { - player->skelAnime.playSpeed = 3.0f; - } else { - player->skelAnime.playSpeed = 1.0f; - } +void RegisterFasterEmptyBottle() { + COND_VB_SHOULD(VB_EMPTYING_BOTTLE, CVarGetInteger(CVAR_ENHANCEMENT("FasterBottleEmpty"), 0), { + Player* player = va_arg(args, Player*); + if (player->skelAnime.curFrame <= 60.0f) { + player->skelAnime.playSpeed = 3.0f; + } else { + player->skelAnime.playSpeed = 1.0f; } }); } + +static RegisterShipInitFunc initFunc(RegisterFasterEmptyBottle, { CVAR_ENHANCEMENT("FasterBottleEmpty") }); diff --git a/soh/soh/Enhancements/TimeSavers/TimeSavers.cpp b/soh/soh/Enhancements/TimeSavers/TimeSavers.cpp index 283f568f0..a881675d6 100644 --- a/soh/soh/Enhancements/TimeSavers/TimeSavers.cpp +++ b/soh/soh/Enhancements/TimeSavers/TimeSavers.cpp @@ -15,6 +15,4 @@ void TimeSavers_Register() { SkipChildRutoInteractions_Register(); FasterHeavyBlockLift_Register(); FasterRupeeAccumulator_Register(); - FasterEmptyBottle_Register(); - FasterBeanSkulltula_Register(); } diff --git a/soh/soh/Enhancements/TimeSavers/TimeSavers.h b/soh/soh/Enhancements/TimeSavers/TimeSavers.h index 450078cf6..9448260d6 100644 --- a/soh/soh/Enhancements/TimeSavers/TimeSavers.h +++ b/soh/soh/Enhancements/TimeSavers/TimeSavers.h @@ -17,7 +17,5 @@ void MoveMidoInKokiriForest_Register(); void SkipChildRutoInteractions_Register(); void FasterHeavyBlockLift_Register(); void FasterRupeeAccumulator_Register(); -void FasterEmptyBottle_Register(); -void FasterBeanSkulltula_Register(); #endif // TIME_SAVERS_H