Add Easy Butterfly Fairy Cvar (#6833)

This commit is contained in:
Reppan
2026-06-29 21:13:39 +02:00
committed by GitHub
parent 68d4c6049e
commit 55b804a673
4 changed files with 56 additions and 8 deletions
@@ -0,0 +1,26 @@
#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h"
#include "soh/ShipInit.hpp"
#include "soh/Enhancements/randomizer/SeedContext.h"
extern "C" {
#include "src/overlays/actors/ovl_En_Butte/z_en_butte.h"
#include "variables.h"
extern void EnButte_SetupTransformIntoFairy(EnButte* enButte);
}
void EasyButterflyFairies_Register() {
COND_VB_SHOULD(VB_SPAWN_BUTTERFLY_FAIRY_EASY,
CVarGetInteger(CVAR_ENHANCEMENT("EasyButterflyFairies"), 0) ||
(IS_RANDO && RAND_GET_OPTION(RSK_SHUFFLE_BUTTERFLY_FAIRIES)),
{
EnButte* enButte = va_arg(args, EnButte*);
Player* player = GET_PLAYER(gPlayState);
if (player->heldItemAction == PLAYER_IA_DEKU_STICK && enButte->actor.xzDistToPlayer < 60.0f) {
EnButte_SetupTransformIntoFairy(enButte);
*should = false;
}
});
}
static RegisterShipInitFunc initFunc(EasyButterflyFairies_Register,
{ CVAR_ENHANCEMENT("EasyButterflyFairies"), "IS_RANDO" });
@@ -2403,6 +2403,14 @@ typedef enum {
// - `*EnButte`
VB_SPAWN_BUTTERFLY_FAIRY,
// #### `result`
// ```c
// true
// ```
// #### `args`
// - `*EnButte`
VB_SPAWN_BUTTERFLY_FAIRY_EASY,
// #### `result`
// ```c
// INV_CONTENT(ITEM_ARROW_FIRE) == ITEM_NONE
+12
View File
@@ -296,6 +296,18 @@ void SohMenu::AddMenuEnhancements() {
.CVar(CVAR_ENHANCEMENT("BetterOwl"))
.Options(CheckboxOptions().Tooltip(
"The default response to Kaepora Gaebora is always that you understood what he said."));
AddWidget(path, "Easy Butterfly Fairies", WIDGET_CVAR_CHECKBOX)
.CVar(CVAR_ENHANCEMENT("EasyButterflyFairies"))
.PreFunc([](WidgetInfo& info) {
info.options->disabled =
IS_RANDO &&
OTRGlobals::Instance->gRandoContext->GetOption(RSK_SHUFFLE_BUTTERFLY_FAIRIES).Is(RO_GENERIC_ON);
info.options->disabledTooltip = "This setting is forcefully enabled because a randomizer savefile with "
"\"Butterfly Fairies Shuffle\" is loaded.";
})
.Options(CheckboxOptions().Tooltip(
"Butterflies will transform into a fairy as soon as you approach them with a Deku Stick, "
"skipping the need to stand still and let the butterfly land on your stick."));
AddWidget(path, "Convenience", WIDGET_SEPARATOR_TEXT);
AddWidget(path, "Quit Fishing at Door", WIDGET_CVAR_CHECKBOX)
@@ -338,14 +338,16 @@ void EnButte_FollowLink(EnButte* this, PlayState* play) {
distSqFromHome = Math3D_Dist2DSq(this->actor.world.pos.x, this->actor.world.pos.z, this->actor.home.pos.x,
this->actor.home.pos.z);
if (!((player->heldItemAction == PLAYER_IA_DEKU_STICK) && (fabsf(player->actor.speedXZ) < 1.8f) &&
(this->swordDownTimer <= 0) && (distSqFromHome < SQ(320.0f)))) {
EnButte_SetupFlyAround(this);
} else if (distSqFromHome > SQ(240.0f)) {
distSqFromSword = Math3D_Dist2DSq(player->meleeWeaponInfo[0].tip.x, player->meleeWeaponInfo[0].tip.z,
this->actor.world.pos.x, this->actor.world.pos.z);
if (distSqFromSword < SQ(60.0f)) {
EnButte_SetupTransformIntoFairy(this);
if (GameInteractor_Should(VB_SPAWN_BUTTERFLY_FAIRY_EASY, true, this)) {
if (!((player->heldItemAction == PLAYER_IA_DEKU_STICK) && (fabsf(player->actor.speedXZ) < 1.8f) &&
(this->swordDownTimer <= 0) && (distSqFromHome < SQ(320.0f)))) {
EnButte_SetupFlyAround(this);
} else if (distSqFromHome > SQ(240.0f)) {
distSqFromSword = Math3D_Dist2DSq(player->meleeWeaponInfo[0].tip.x, player->meleeWeaponInfo[0].tip.z,
this->actor.world.pos.x, this->actor.world.pos.z);
if (distSqFromSword < SQ(60.0f)) {
EnButte_SetupTransformIntoFairy(this);
}
}
}
}