summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEblo <7004497+Eblo@users.noreply.github.com>2025-04-18 11:07:12 -0400
committerGitHub <noreply@github.com>2025-04-18 11:07:12 -0400
commit1e0102bb7d54d92d4bcd240f550cbcb2d38ffce3 (patch)
tree9b21cffaa8bc881d9c3cc9c3d20575cb404f7431
parente4cdbfdfb129b94c049819486f4b980502103df4 (diff)
Fix FD Bomb Shop softlock, allow FD to open more doors (#1125)
-rw-r--r--mm/2s2h/Enhancements/Masks/FierceDeityAnywhere.cpp9
-rw-r--r--mm/2s2h/GameInteractor/GameInteractor.h1
-rw-r--r--mm/src/overlays/actors/ovl_Door_Shutter/z_door_shutter.c2
-rw-r--r--mm/src/overlays/actors/ovl_En_Door/z_en_door.c7
-rw-r--r--mm/src/overlays/actors/ovl_En_Sob1/z_en_sob1.c2
5 files changed, 18 insertions, 3 deletions
diff --git a/mm/2s2h/Enhancements/Masks/FierceDeityAnywhere.cpp b/mm/2s2h/Enhancements/Masks/FierceDeityAnywhere.cpp
index f5a8b8306..286d670c5 100644
--- a/mm/2s2h/Enhancements/Masks/FierceDeityAnywhere.cpp
+++ b/mm/2s2h/Enhancements/Masks/FierceDeityAnywhere.cpp
@@ -197,6 +197,15 @@ void RegisterFierceDeityAnywhere() {
actor->world.rot.z = 3;
}
});
+
+ // Allow FD to open doors
+ COND_VB_SHOULD(VB_BE_NEAR_DOOR, CVAR, {
+ f32 playerZPosRelToDoor = *va_arg(args, f32*);
+ // Vanilla proximity is 50.0f, but FD cannot get that close to some doors
+ if (GET_PLAYER_FORM == PLAYER_FORM_FIERCE_DEITY && fabsf(playerZPosRelToDoor) < 60.0f) {
+ *should = true;
+ }
+ });
}
static RegisterShipInitFunc initFunc(RegisterFierceDeityAnywhere, { CVAR_NAME });
diff --git a/mm/2s2h/GameInteractor/GameInteractor.h b/mm/2s2h/GameInteractor/GameInteractor.h
index 861b38da9..6437a297d 100644
--- a/mm/2s2h/GameInteractor/GameInteractor.h
+++ b/mm/2s2h/GameInteractor/GameInteractor.h
@@ -237,6 +237,7 @@ typedef enum {
VB_SNOWBALL_SET_FLAG,
VB_START_JUMPSLASH,
VB_SETUP_TRANSITION,
+ VB_BE_NEAR_DOOR,
} GIVanillaBehavior;
typedef enum {
diff --git a/mm/src/overlays/actors/ovl_Door_Shutter/z_door_shutter.c b/mm/src/overlays/actors/ovl_Door_Shutter/z_door_shutter.c
index ce8c7dc53..3ac4c681d 100644
--- a/mm/src/overlays/actors/ovl_Door_Shutter/z_door_shutter.c
+++ b/mm/src/overlays/actors/ovl_Door_Shutter/z_door_shutter.c
@@ -296,7 +296,7 @@ s32 func_808A0E28(DoorShutter* this, PlayState* play) {
ShutterInfo* shutterInfo = &D_808A21B0[this->unk_164];
f32 temp_f0 = func_808A0D90(play, this, 0.0f, shutterInfo->unk_0A, shutterInfo->unk_0B);
- if (fabsf(temp_f0) < 50.0f) {
+ if (GameInteractor_Should(VB_BE_NEAR_DOOR, fabsf(temp_f0) < 50.0f, &temp_f0)) {
s16 temp_v0_2 = BINANG_SUB(player->actor.shape.rot.y, this->slidingDoor.dyna.actor.shape.rot.y);
if (temp_f0 > 0.0f) {
diff --git a/mm/src/overlays/actors/ovl_En_Door/z_en_door.c b/mm/src/overlays/actors/ovl_En_Door/z_en_door.c
index 3ff6c86bc..d6e27af47 100644
--- a/mm/src/overlays/actors/ovl_En_Door/z_en_door.c
+++ b/mm/src/overlays/actors/ovl_En_Door/z_en_door.c
@@ -19,6 +19,8 @@
#include "objects/object_kaizoku_obj/object_kaizoku_obj.h"
#include "objects/gameplay_field_keep/gameplay_field_keep.h"
+#include "2s2h/GameInteractor/GameInteractor.h"
+
#define FLAGS (ACTOR_FLAG_10)
#define THIS ((EnDoor*)thisx)
@@ -525,8 +527,9 @@ void func_80866B20(EnDoor* this, PlayState* play) {
Vec3f playerPosRelToDoor;
Actor_OffsetOfPointInActorCoords(&this->knobDoor.dyna.actor, &playerPosRelToDoor, &player->actor.world.pos);
- if (D_80867BC0 || ((fabsf(playerPosRelToDoor.y) < 20.0f) && (fabsf(playerPosRelToDoor.x) < 20.0f) &&
- (fabsf(playerPosRelToDoor.z) < 50.0f))) {
+ if (D_80867BC0 ||
+ ((fabsf(playerPosRelToDoor.y) < 20.0f) && (fabsf(playerPosRelToDoor.x) < 20.0f) &&
+ GameInteractor_Should(VB_BE_NEAR_DOOR, fabsf(playerPosRelToDoor.z) < 50.0f, &playerPosRelToDoor.z))) {
s16 yawDiff = player->actor.shape.rot.y - this->knobDoor.dyna.actor.shape.rot.y;
if (playerPosRelToDoor.z > 0.0f) {
diff --git a/mm/src/overlays/actors/ovl_En_Sob1/z_en_sob1.c b/mm/src/overlays/actors/ovl_En_Sob1/z_en_sob1.c
index 7e3834fcf..3273334ad 100644
--- a/mm/src/overlays/actors/ovl_En_Sob1/z_en_sob1.c
+++ b/mm/src/overlays/actors/ovl_En_Sob1/z_en_sob1.c
@@ -237,6 +237,8 @@ u16 EnSob1_GetWelcome(EnSob1* this, PlayState* play) {
case PLAYER_MASK_POSTMAN:
return 0x644;
+ // 2SH2 [FD Enhancement] - Treat FD as any other non-human form
+ case PLAYER_MASK_FIERCE_DEITY:
case PLAYER_MASK_GORON:
case PLAYER_MASK_ZORA:
case PLAYER_MASK_DEKU: