summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEblo <7004497+Eblo@users.noreply.github.com>2025-03-31 11:45:38 -0400
committerGitHub <noreply@github.com>2025-03-31 10:45:38 -0500
commit05047c859c3eec6cd582017973081264452e1466 (patch)
tree3b28a5d1ae0e3848a042492abedb4482737ba6d4
parent60e7d5d5c31a3a9b4f921df7df35ce2c49010656 (diff)
[Rando] Halt moving objects when obtaining items (#1094)
* Halt bean platform during Get Item state in rando * Also halt if player has freezeTimer * Extend behavior to Deku Butler, moving platforms
-rw-r--r--mm/2s2h/Rando/ActorBehavior/ActorBehavior.cpp1
-rw-r--r--mm/2s2h/Rando/ActorBehavior/ActorBehavior.h1
-rw-r--r--mm/2s2h/Rando/ActorBehavior/ItemGetBehavior.cpp64
3 files changed, 66 insertions, 0 deletions
diff --git a/mm/2s2h/Rando/ActorBehavior/ActorBehavior.cpp b/mm/2s2h/Rando/ActorBehavior/ActorBehavior.cpp
index bfd88079a..738ab71a3 100644
--- a/mm/2s2h/Rando/ActorBehavior/ActorBehavior.cpp
+++ b/mm/2s2h/Rando/ActorBehavior/ActorBehavior.cpp
@@ -129,6 +129,7 @@ void Rando::ActorBehavior::OnFileLoad() {
Rando::ActorBehavior::InitEnZotBehavior();
Rando::ActorBehavior::InitEnZowBehavior();
Rando::ActorBehavior::InitItemBHeartBehavior();
+ Rando::ActorBehavior::InitItemGetBehavior();
Rando::ActorBehavior::InitObjKibakoBehavior();
Rando::ActorBehavior::InitObjMoonStoneBehavior();
Rando::ActorBehavior::InitObjSnowballBehavior();
diff --git a/mm/2s2h/Rando/ActorBehavior/ActorBehavior.h b/mm/2s2h/Rando/ActorBehavior/ActorBehavior.h
index 0bcd25eef..a18fb37ba 100644
--- a/mm/2s2h/Rando/ActorBehavior/ActorBehavior.h
+++ b/mm/2s2h/Rando/ActorBehavior/ActorBehavior.h
@@ -85,6 +85,7 @@ void InitEnZogBehavior();
void InitEnZotBehavior();
void InitEnZowBehavior();
void InitItemBHeartBehavior();
+void InitItemGetBehavior();
void InitObjKibakoBehavior();
void InitObjMoonStoneBehavior();
void InitObjSnowballBehavior();
diff --git a/mm/2s2h/Rando/ActorBehavior/ItemGetBehavior.cpp b/mm/2s2h/Rando/ActorBehavior/ItemGetBehavior.cpp
new file mode 100644
index 000000000..3114691bf
--- /dev/null
+++ b/mm/2s2h/Rando/ActorBehavior/ItemGetBehavior.cpp
@@ -0,0 +1,64 @@
+#include "ActorBehavior.h"
+#include <libultraship/libultraship.h>
+
+extern "C" {
+#include "overlays/actors/ovl_En_Dno/z_en_dno.h"
+#include "overlays/actors/ovl_Obj_Bean/z_obj_bean.h"
+void func_809388A8(ObjBean* objBean, PlayState* play);
+void func_80A730A0(EnDno* enDno, PlayState* play);
+}
+
+#define PLAYER_IN_GET_ITEM_STATE(player) ((player->stateFlags1 & PLAYER_STATE1_400) || player->actor.freezeTimer)
+
+void Rando::ActorBehavior::InitItemGetBehavior() {
+ COND_ID_HOOK(ShouldActorUpdate, ACTOR_OBJ_BEAN, IS_RANDO, [](Actor* actor, bool* should) {
+ ObjBean* objBean = (ObjBean*)actor;
+ // Bean is in moving state, and player is in Get Item state
+ Player* player = GET_PLAYER(gPlayState);
+ if (objBean->actionFunc == func_809388A8 && PLAYER_IN_GET_ITEM_STATE(player)) {
+ *should = false;
+ }
+ });
+
+ // Deku Butler
+ COND_ID_HOOK(ShouldActorUpdate, ACTOR_EN_DNO, IS_RANDO, [](Actor* actor, bool* should) {
+ EnDno* enDno = (EnDno*)actor;
+ // Deku Butler is in race state, and player is in Get Item state
+ Player* player = GET_PLAYER(gPlayState);
+ if (enDno->actionFunc == func_80A730A0 && PLAYER_IN_GET_ITEM_STATE(player)) {
+ *should = false;
+ }
+ });
+
+ // Deku Butler race moving platform
+ COND_ID_HOOK(ShouldActorUpdate, ACTOR_OBJ_DANPEILIFT, IS_RANDO, [](Actor* actor, bool* should) {
+ Player* player = GET_PLAYER(gPlayState);
+ if (PLAYER_IN_GET_ITEM_STATE(player)) {
+ *should = false;
+ }
+ });
+
+ // Deku Butler race door
+ COND_ID_HOOK(ShouldActorUpdate, ACTOR_BG_CRACE_MOVEBG, IS_RANDO, [](Actor* actor, bool* should) {
+ Player* player = GET_PLAYER(gPlayState);
+ if (PLAYER_IN_GET_ITEM_STATE(player)) {
+ *should = false;
+ }
+ });
+
+ // Deku Scrub Playground platform
+ COND_ID_HOOK(ShouldActorUpdate, ACTOR_OBJ_LUPYGAMELIFT, IS_RANDO, [](Actor* actor, bool* should) {
+ Player* player = GET_PLAYER(gPlayState);
+ if (PLAYER_IN_GET_ITEM_STATE(player)) {
+ *should = false;
+ }
+ });
+
+ // Deku Palace moving platform
+ COND_ID_HOOK(ShouldActorUpdate, ACTOR_OBJ_RAILLIFT, IS_RANDO, [](Actor* actor, bool* should) {
+ Player* player = GET_PLAYER(gPlayState);
+ if (PLAYER_IN_GET_ITEM_STATE(player)) {
+ *should = false;
+ }
+ });
+}