From d66cbf6dfc7fb124ac6e51272bbfb726374ad094 Mon Sep 17 00:00:00 2001 From: Agent X <44549182+AgentXLP@users.noreply.github.com> Date: Tue, 12 Nov 2024 17:45:06 -0500 Subject: [PATCH] Restore vanilla chain chomp cutscene --- src/game/behaviors/chain_chomp.inc.c | 21 ++++++++++++++++++--- src/game/mario_actions_cutscene.c | 2 +- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/game/behaviors/chain_chomp.inc.c b/src/game/behaviors/chain_chomp.inc.c index f4914c81c..00c1e699c 100644 --- a/src/game/behaviors/chain_chomp.inc.c +++ b/src/game/behaviors/chain_chomp.inc.c @@ -251,6 +251,10 @@ static void chain_chomp_sub_act_lunge(void) { } } +static u8 chain_chomp_released_trigger_cutscene_continue_dialog(void) { + return (o->oChainChompReleaseStatus != CHAIN_CHOMP_RELEASED_END_CUTSCENE); +} + /** * Fall to the ground and interrupt mario into a cutscene action. */ @@ -260,9 +264,20 @@ static void chain_chomp_released_trigger_cutscene(void) { //! Can delay this if we get into a cutscene-unfriendly action after the // last post ground pound and before this - if (o->oMoveFlags & OBJ_MOVE_MASK_ON_GROUND) { - o->oChainChompReleaseStatus = CHAIN_CHOMP_RELEASED_LUNGE_AROUND; - o->oTimer = 0; + // hack: get the nearest wooden post, this will work properly 99% of the time + struct Object* woodenPost = cur_obj_nearest_object_with_behavior(bhvWoodenPost); + struct MarioState* marioState = nearest_mario_state_to_object(woodenPost); + if (&gMarioStates[0] == marioState) { + if (set_mario_npc_dialog(&gMarioStates[0], 2, chain_chomp_released_trigger_cutscene_continue_dialog) == 2 + && (o->oMoveFlags & OBJ_MOVE_MASK_ON_GROUND) && cutscene_object(CUTSCENE_STAR_SPAWN, o) == 1) { + o->oChainChompReleaseStatus = CHAIN_CHOMP_RELEASED_LUNGE_AROUND; + o->oTimer = 0; + } + } else { + if (o->oMoveFlags & OBJ_MOVE_MASK_ON_GROUND) { + o->oChainChompReleaseStatus = CHAIN_CHOMP_RELEASED_LUNGE_AROUND; + o->oTimer = 0; + } } } diff --git a/src/game/mario_actions_cutscene.c b/src/game/mario_actions_cutscene.c index 7db25ecf8..d7394b9b2 100644 --- a/src/game/mario_actions_cutscene.c +++ b/src/game/mario_actions_cutscene.c @@ -389,7 +389,7 @@ u8 should_start_or_continue_dialog(struct MarioState* m, struct Object* object) // 0 = not in dialog // 1 = starting dialog // 2 = speaking -s32 set_mario_npc_dialog(struct MarioState* m, s32 actionArg, UNUSED u8 (*inContinueDialogFunction)(void)) { +s32 set_mario_npc_dialog(struct MarioState* m, s32 actionArg, u8 (*inContinueDialogFunction)(void)) { if (!m) { return 0; } s32 dialogState = 0;