diff options
| author | Eblo <7004497+Eblo@users.noreply.github.com> | 2025-03-31 11:45:38 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-03-31 10:45:38 -0500 |
| commit | 05047c859c3eec6cd582017973081264452e1466 (patch) | |
| tree | 3b28a5d1ae0e3848a042492abedb4482737ba6d4 | |
| parent | 60e7d5d5c31a3a9b4f921df7df35ce2c49010656 (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.cpp | 1 | ||||
| -rw-r--r-- | mm/2s2h/Rando/ActorBehavior/ActorBehavior.h | 1 | ||||
| -rw-r--r-- | mm/2s2h/Rando/ActorBehavior/ItemGetBehavior.cpp | 64 |
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; + } + }); +} |
