Prevented more NPC dialog soft locks

This commit is contained in:
MysterD 2020-09-19 16:09:52 -07:00
parent 09a1390d8d
commit fffad90028
18 changed files with 97 additions and 54 deletions

View file

@ -364,7 +364,7 @@ void bobomb_buddy_cannon_dialog(s16 dialogFirstText, s16 dialogSecondText) {
break; break;
case BOBOMB_BUDDY_CANNON_STOP_TALKING: case BOBOMB_BUDDY_CANNON_STOP_TALKING:
set_mario_npc_dialog(&gMarioStates[0], 0); set_mario_npc_dialog(&gMarioStates[0], 0, NULL);
o->activeFlags &= ~ACTIVE_FLAG_INITIATED_TIME_STOP; o->activeFlags &= ~ACTIVE_FLAG_INITIATED_TIME_STOP;
o->oBobombBuddyHasTalkedToMario = BOBOMB_BUDDY_HAS_TALKED; o->oBobombBuddyHasTalkedToMario = BOBOMB_BUDDY_HAS_TALKED;
@ -376,15 +376,19 @@ void bobomb_buddy_cannon_dialog(s16 dialogFirstText, s16 dialogSecondText) {
} }
} }
static u8 bobomb_buddy_act_talk_continue_dialog(void) {
return (o->oAction == BOBOMB_BUDDY_ACT_TALK);
}
void bobomb_buddy_act_talk(void) { void bobomb_buddy_act_talk(void) {
if (set_mario_npc_dialog(&gMarioStates[0], 1) == 2) { if (set_mario_npc_dialog(&gMarioStates[0], 1, bobomb_buddy_act_talk_continue_dialog) == 2) {
//o->activeFlags |= ACTIVE_FLAG_INITIATED_TIME_STOP; //o->activeFlags |= ACTIVE_FLAG_INITIATED_TIME_STOP;
switch (o->oBobombBuddyRole) { switch (o->oBobombBuddyRole) {
case BOBOMB_BUDDY_ROLE_ADVICE: case BOBOMB_BUDDY_ROLE_ADVICE:
if (cutscene_object_with_dialog(CUTSCENE_DIALOG, o, o->oBehParams2ndByte) if (cutscene_object_with_dialog(CUTSCENE_DIALOG, o, o->oBehParams2ndByte)
!= BOBOMB_BUDDY_BP_STYPE_GENERIC) { != BOBOMB_BUDDY_BP_STYPE_GENERIC) {
set_mario_npc_dialog(&gMarioStates[0], 0); set_mario_npc_dialog(&gMarioStates[0], 0, NULL);
o->activeFlags &= ~ACTIVE_FLAG_INITIATED_TIME_STOP; o->activeFlags &= ~ACTIVE_FLAG_INITIATED_TIME_STOP;
o->oBobombBuddyHasTalkedToMario = BOBOMB_BUDDY_HAS_TALKED; o->oBobombBuddyHasTalkedToMario = BOBOMB_BUDDY_HAS_TALKED;

View file

@ -946,7 +946,7 @@ s32 bowser_dead_not_bits_end(void) {
bowser_dead_hide(); bowser_dead_hide();
spawn_triangle_break_particles(20, 116, 1.0f, 0); spawn_triangle_break_particles(20, 116, 1.0f, 0);
bowser_spawn_grand_star_key(); bowser_spawn_grand_star_key();
if (marioState->playerIndex) { set_mario_npc_dialog(marioState, 0); } if (marioState->playerIndex) { set_mario_npc_dialog(marioState, 0, NULL); }
ret = 1; ret = 1;
} }
return ret; return ret;

View file

@ -21,6 +21,10 @@ void bhv_camera_lakitu_init(void) {
} }
} }
static u8 camera_lakitu_intro_act_trigger_cutscene_continue_dialog(void) {
return (o->oAction == CAMERA_LAKITU_INTRO_ACT_TRIGGER_CUTSCENE);
}
/** /**
* Wait for mario to stand on the bridge, then interrupt his action and enter * Wait for mario to stand on the bridge, then interrupt his action and enter
* the spawn cloud action. * the spawn cloud action.
@ -32,17 +36,20 @@ static void camera_lakitu_intro_act_trigger_cutscene(void) {
&& gMarioObject->oPosZ > -2000.0f && gMarioObject->oPosZ < -177.0f && gMarioObject->oPosZ > -2000.0f && gMarioObject->oPosZ < -177.0f
&& gMarioObject->oPosZ < -177.0f) // always double check your conditions && gMarioObject->oPosZ < -177.0f) // always double check your conditions
{ {
if (set_mario_npc_dialog(&gMarioStates[0], 2) == 1) { if (set_mario_npc_dialog(&gMarioStates[0], 2, camera_lakitu_intro_act_trigger_cutscene_continue_dialog) == 1) {
o->oAction = CAMERA_LAKITU_INTRO_ACT_SPAWN_CLOUD; o->oAction = CAMERA_LAKITU_INTRO_ACT_SPAWN_CLOUD;
} }
} }
} }
static u8 camera_lakitu_intro_act_spawn_cloud_continue_dialog(void) {
return (o->oAction == CAMERA_LAKITU_INTRO_ACT_SPAWN_CLOUD);
}
/** /**
* Warp up into the air and spawn cloud, then enter the TODO action. * Warp up into the air and spawn cloud, then enter the TODO action.
*/ */
static void camera_lakitu_intro_act_spawn_cloud(void) { static void camera_lakitu_intro_act_spawn_cloud(void) {
if (set_mario_npc_dialog(&gMarioStates[0], 2) == 2) { if (set_mario_npc_dialog(&gMarioStates[0], 2, camera_lakitu_intro_act_spawn_cloud_continue_dialog) == 2) {
o->oAction = CAMERA_LAKITU_INTRO_ACT_UNK2; o->oAction = CAMERA_LAKITU_INTRO_ACT_UNK2;
o->oPosX = 1800.0f; o->oPosX = 1800.0f;

View file

@ -60,6 +60,10 @@ void dorrie_begin_head_raise(s32 liftingMario) {
o->oDorrieHeadRaiseSpeed = 0; o->oDorrieHeadRaiseSpeed = 0;
} }
static u8 dorrie_act_lower_head_continue_dialog(void) {
return (o->oAction == DORRIE_ACT_LOWER_HEAD);
}
void dorrie_act_lower_head(void) { void dorrie_act_lower_head(void) {
if (cur_obj_init_anim_check_frame(2, 35)) { if (cur_obj_init_anim_check_frame(2, 35)) {
cur_obj_reverse_animation(); cur_obj_reverse_animation();
@ -68,7 +72,7 @@ void dorrie_act_lower_head(void) {
if (o->oTimer > 150) { if (o->oTimer > 150) {
dorrie_begin_head_raise(FALSE); dorrie_begin_head_raise(FALSE);
} else if (gMarioObject->platform == o) { } else if (gMarioObject->platform == o) {
if (o->oDorrieForwardDistToMario > 830.0f && set_mario_npc_dialog(&gMarioStates[0], 2) == 1) { if (o->oDorrieForwardDistToMario > 830.0f && set_mario_npc_dialog(&gMarioStates[0], 2, dorrie_act_lower_head_continue_dialog) == 1) {
dorrie_begin_head_raise(TRUE); dorrie_begin_head_raise(TRUE);
} else if (o->oDorrieForwardDistToMario > 320.0f) { } else if (o->oDorrieForwardDistToMario > 320.0f) {
o->oTimer = 0; o->oTimer = 0;
@ -77,7 +81,7 @@ void dorrie_act_lower_head(void) {
#else #else
if (gMarioObject->platform == o) { if (gMarioObject->platform == o) {
if (o->oDorrieOffsetY == -17.0f && o->oDorrieForwardDistToMario > 780.0f if (o->oDorrieOffsetY == -17.0f && o->oDorrieForwardDistToMario > 780.0f
&& set_mario_npc_dialog(&gMarioStates[0], 2) == 1) { && set_mario_npc_dialog(&gMarioStates[0], 2, dorrie_act_lower_head_continue_dialog) == 1) {
dorrie_begin_head_raise(TRUE); dorrie_begin_head_raise(TRUE);
} else if (o->oDorrieForwardDistToMario > 320.0f) { } else if (o->oDorrieForwardDistToMario > 320.0f) {
o->oTimer = 0; o->oTimer = 0;
@ -92,15 +96,19 @@ void dorrie_act_lower_head(void) {
} }
} }
static u8 dorrie_act_raise_head_continue_dialog(void) {
return (o->oAction == DORRIE_ACT_RAISE_HEAD);
}
void dorrie_act_raise_head(void) { void dorrie_act_raise_head(void) {
o->collisionData = segmented_to_virtual(dorrie_seg6_collision_0600F644); o->collisionData = segmented_to_virtual(dorrie_seg6_collision_0600F644);
if (cur_obj_check_if_near_animation_end()) { if (cur_obj_check_if_near_animation_end()) {
o->oAction = DORRIE_ACT_MOVE; o->oAction = DORRIE_ACT_MOVE;
} else if (o->oDorrieLiftingMario && o->header.gfx.unk38.animFrame < 74) { } else if (o->oDorrieLiftingMario && o->header.gfx.unk38.animFrame < 74) {
if (set_mario_npc_dialog(&gMarioStates[0], 2) == 2) { if (set_mario_npc_dialog(&gMarioStates[0], 2, dorrie_act_raise_head_continue_dialog) == 2) {
o->oDorrieHeadRaiseSpeed += 0x1CC; o->oDorrieHeadRaiseSpeed += 0x1CC;
if (cur_obj_check_anim_frame(73)) { if (cur_obj_check_anim_frame(73)) {
set_mario_npc_dialog(&gMarioStates[0], 0); set_mario_npc_dialog(&gMarioStates[0], 0, NULL);
} }
dorrie_raise_head(); dorrie_raise_head();
} else { } else {

View file

@ -51,7 +51,7 @@ void bhv_grand_star_loop(void) {
o->oPosY = o->oHomeY + 200.0f; o->oPosY = o->oHomeY + 200.0f;
grand_star_zero_velocity(); grand_star_zero_velocity();
gObjCutsceneDone = 1; gObjCutsceneDone = 1;
set_mario_npc_dialog(&gMarioStates[0], 0); set_mario_npc_dialog(&gMarioStates[0], 0, NULL);
o->oAction++; o->oAction++;
o->oInteractStatus = 0; o->oInteractStatus = 0;
cur_obj_play_sound_2(SOUND_GENERAL_GRAND_STAR_JUMP); cur_obj_play_sound_2(SOUND_GENERAL_GRAND_STAR_JUMP);

View file

@ -252,6 +252,10 @@ void hoot_awake_loop(void) {
set_object_visibility(o, 2000); set_object_visibility(o, 2000);
} }
static u8 hoot_wants_to_talk_continue_dialog(void) {
return (o->oHootAvailability == HOOT_AVAIL_WANTS_TO_TALK && localTalkToHoot == 1);
}
void bhv_hoot_loop(void) { void bhv_hoot_loop(void) {
struct MarioState* marioState = nearest_mario_state_to_object(o); struct MarioState* marioState = nearest_mario_state_to_object(o);
static u8 forceFlySanity = TRUE; static u8 forceFlySanity = TRUE;
@ -272,9 +276,9 @@ void bhv_hoot_loop(void) {
localTalkToHoot = 1; localTalkToHoot = 1;
} }
if (localTalkToHoot == 1 && set_mario_npc_dialog(&gMarioStates[0], 2) == 2 && cutscene_object_with_dialog(CUTSCENE_DIALOG, o, DIALOG_044)) { if (localTalkToHoot == 1 && set_mario_npc_dialog(&gMarioStates[0], 2, hoot_wants_to_talk_continue_dialog) == 2 && cutscene_object_with_dialog(CUTSCENE_DIALOG, o, DIALOG_044)) {
localTalkToHoot = 2; localTalkToHoot = 2;
set_mario_npc_dialog(&gMarioStates[0], 0); set_mario_npc_dialog(&gMarioStates[0], 0, NULL);
cur_obj_become_tangible(); cur_obj_become_tangible();
o->oHootAvailability = HOOT_AVAIL_READY_TO_FLY; o->oHootAvailability = HOOT_AVAIL_READY_TO_FLY;
network_send_object(o); network_send_object(o);
@ -283,7 +287,7 @@ void bhv_hoot_loop(void) {
case HOOT_AVAIL_READY_TO_FLY: case HOOT_AVAIL_READY_TO_FLY:
if (forceFlySanity) { if (forceFlySanity) {
set_mario_npc_dialog(&gMarioStates[0], 0); set_mario_npc_dialog(&gMarioStates[0], 0, NULL);
cur_obj_become_tangible(); cur_obj_become_tangible();
forceFlySanity = FALSE; forceFlySanity = FALSE;
} }

View file

@ -536,7 +536,7 @@ s32 obj_begin_race(s32 noTimer) {
} }
// Unfreeze mario and disable time stop to begin the race // Unfreeze mario and disable time stop to begin the race
set_mario_npc_dialog(&gMarioStates[0], 0); set_mario_npc_dialog(&gMarioStates[0], 0, NULL);
disable_time_stop_including_mario(); disable_time_stop_including_mario();
} else if (o->oTimer > 50) { } else if (o->oTimer > 50) {
return TRUE; return TRUE;

View file

@ -220,6 +220,10 @@ void bhv_mips_free(void) {
} }
} }
static u8 bhv_mips_held_continue_dialog(void) {
return (o->oHeldState == HELD_HELD && o->oMipsStarStatus == MIPS_STAR_STATUS_HAVENT_SPAWNED_STAR);
}
/** /**
* Handles MIPS being held by Mario. * Handles MIPS being held by Mario.
*/ */
@ -239,13 +243,13 @@ void bhv_mips_held(void) {
else else
dialogID = DIALOG_162; dialogID = DIALOG_162;
if (set_mario_npc_dialog(&gMarioStates[0], 1) == 2) { if (set_mario_npc_dialog(&gMarioStates[0], 1, bhv_mips_held_continue_dialog) == 2) {
//o->activeFlags |= ACTIVE_FLAG_INITIATED_TIME_STOP; //o->activeFlags |= ACTIVE_FLAG_INITIATED_TIME_STOP;
if (cutscene_object_with_dialog(CUTSCENE_DIALOG, o, dialogID)) { if (cutscene_object_with_dialog(CUTSCENE_DIALOG, o, dialogID)) {
o->oInteractionSubtype |= INT_SUBTYPE_DROP_IMMEDIATELY; o->oInteractionSubtype |= INT_SUBTYPE_DROP_IMMEDIATELY;
o->activeFlags &= ~ACTIVE_FLAG_INITIATED_TIME_STOP; o->activeFlags &= ~ACTIVE_FLAG_INITIATED_TIME_STOP;
o->oMipsStarStatus = MIPS_STAR_STATUS_SHOULD_SPAWN_STAR; o->oMipsStarStatus = MIPS_STAR_STATUS_SHOULD_SPAWN_STAR;
set_mario_npc_dialog(&gMarioStates[0], 0); set_mario_npc_dialog(&gMarioStates[0], 0, NULL);
} }
} }
} }

View file

@ -125,6 +125,10 @@ void snowmans_bottom_act_3(void) {
} }
} }
static u8 bhv_snowmans_bottom_loop_continue_dialog(void) {
return (o->oAction == 0);
}
void bhv_snowmans_bottom_loop(void) { void bhv_snowmans_bottom_loop(void) {
s16 sp1E; s16 sp1E;
@ -132,13 +136,12 @@ void bhv_snowmans_bottom_loop(void) {
switch (o->oAction) { switch (o->oAction) {
case 0: case 0:
if (distanceToLocal < 400 if (distanceToLocal < 400 && set_mario_npc_dialog(&gMarioStates[0], 1, bhv_snowmans_bottom_loop_continue_dialog) == 2) {
&& set_mario_npc_dialog(&gMarioStates[0], 1) == 2) {
sp1E = cutscene_object_with_dialog(CUTSCENE_DIALOG, o, DIALOG_110); sp1E = cutscene_object_with_dialog(CUTSCENE_DIALOG, o, DIALOG_110);
if (sp1E) { if (sp1E) {
o->oForwardVel = 10.0f; o->oForwardVel = 10.0f;
o->oAction = 1; o->oAction = 1;
set_mario_npc_dialog(&gMarioStates[0], 0); set_mario_npc_dialog(&gMarioStates[0], 0, NULL);
network_send_object(o); network_send_object(o);
} }
} }
@ -197,13 +200,21 @@ void bhv_snowmans_head_init(void) {
network_init_object_field(o, &o->oAction); network_init_object_field(o, &o->oAction);
} }
static u8 bhv_snowmans_head_action_0_continue_dialog(void) {
return (o->oAction == 0);
}
static u8 bhv_snowmans_head_action_4_continue_dialog(void) {
return (o->oAction == 4);
}
void bhv_snowmans_head_loop(void) { void bhv_snowmans_head_loop(void) {
UNUSED s16 sp1E; UNUSED s16 sp1E;
s16 sp1C; s16 sp1C;
switch (o->oAction) { switch (o->oAction) {
case 0: case 0:
if (trigger_obj_dialog_when_facing(&gMarioStates[0], &o->oSnowmansHeadUnkF4, DIALOG_109, 400.0f, 1)) if (trigger_obj_dialog_when_facing(&gMarioStates[0], &o->oSnowmansHeadUnkF4, DIALOG_109, 400.0f, 1, bhv_snowmans_head_action_0_continue_dialog))
o->oAction = 1; o->oAction = 1;
break; break;
@ -227,7 +238,7 @@ void bhv_snowmans_head_loop(void) {
break; break;
case 4: case 4:
if (trigger_obj_dialog_when_facing(&gMarioStates[0], &o->oSnowmansHeadUnkF4, DIALOG_111, 700.0f, 2)) { if (trigger_obj_dialog_when_facing(&gMarioStates[0], &o->oSnowmansHeadUnkF4, DIALOG_111, 700.0f, 2, bhv_snowmans_head_action_4_continue_dialog)) {
spawn_mist_particles(); spawn_mist_particles();
spawn_default_star(-4700.0f, -1024.0f, 1890.0f); spawn_default_star(-4700.0f, -1024.0f, 1890.0f);
o->oAction = 1; o->oAction = 1;

View file

@ -511,6 +511,10 @@ static void ukiki_blink_timer(void) {
} }
} }
static u8 cage_ukiki_held_default_continue_dialog(void) {
return (o->oHeldState == HELD_HELD && o->oUkikiTextState == UKIKI_TEXT_DEFAULT);
}
/** /**
* Called by the main behavior function for the cage ukiki whenever it is held. * Called by the main behavior function for the cage ukiki whenever it is held.
*/ */
@ -518,7 +522,7 @@ void cage_ukiki_held_loop(void) {
if (o->oPosY - o->oHomeY > -100.0f) { if (o->oPosY - o->oHomeY > -100.0f) {
switch(o->oUkikiTextState) { switch(o->oUkikiTextState) {
case UKIKI_TEXT_DEFAULT: case UKIKI_TEXT_DEFAULT:
if (set_mario_npc_dialog(&gMarioStates[0], 2) == 2) { if (set_mario_npc_dialog(&gMarioStates[0], 2, cage_ukiki_held_default_continue_dialog) == 2) {
create_dialog_box_with_response(DIALOG_079); create_dialog_box_with_response(DIALOG_079);
o->oUkikiTextState = UKIKI_TEXT_CAGE_TEXTBOX; o->oUkikiTextState = UKIKI_TEXT_CAGE_TEXTBOX;
} }
@ -526,7 +530,7 @@ void cage_ukiki_held_loop(void) {
case UKIKI_TEXT_CAGE_TEXTBOX: case UKIKI_TEXT_CAGE_TEXTBOX:
if (gDialogResponse != 0) { if (gDialogResponse != 0) {
set_mario_npc_dialog(&gMarioStates[0], 0); set_mario_npc_dialog(&gMarioStates[0], 0, NULL);
if (gDialogResponse == 1) { if (gDialogResponse == 1) {
o->oInteractionSubtype |= INT_SUBTYPE_DROP_IMMEDIATELY; o->oInteractionSubtype |= INT_SUBTYPE_DROP_IMMEDIATELY;
o->oUkikiTextState = UKIKI_TEXT_GO_TO_CAGE; o->oUkikiTextState = UKIKI_TEXT_GO_TO_CAGE;
@ -584,7 +588,7 @@ void hat_ukiki_held_loop(void) {
case UKIKI_TEXT_HAS_HAT: case UKIKI_TEXT_HAS_HAT:
if (cur_obj_update_dialog(&gMarioStates[0], 2, 18, DIALOG_101, 0, hat_ukiki_held_loop_2)) { if (cur_obj_update_dialog(&gMarioStates[0], 2, 18, DIALOG_101, 0, hat_ukiki_held_loop_2)) {
mario_retrieve_cap(); mario_retrieve_cap();
set_mario_npc_dialog(&gMarioStates[0], 0); set_mario_npc_dialog(&gMarioStates[0], 0, NULL);
o->oUkikiHasHat &= ~UKIKI_HAT_ON; o->oUkikiHasHat &= ~UKIKI_HAT_ON;
o->oUkikiTextState = UKIKI_TEXT_GAVE_HAT_BACK; o->oUkikiTextState = UKIKI_TEXT_GAVE_HAT_BACK;
} }

View file

@ -75,7 +75,7 @@ void yoshi_idle_loop(void) {
void yoshi_talk_loop(void) { void yoshi_talk_loop(void) {
if ((s16) o->oMoveAngleYaw == (s16) o->oAngleToMario) { if ((s16) o->oMoveAngleYaw == (s16) o->oAngleToMario) {
cur_obj_init_animation(0); cur_obj_init_animation(0);
if (set_mario_npc_dialog(&gMarioStates[0], 1) == 2) { if (set_mario_npc_dialog(&gMarioStates[0], 1, NULL) == 2) {
//o->activeFlags |= ACTIVE_FLAG_INITIATED_TIME_STOP; //o->activeFlags |= ACTIVE_FLAG_INITIATED_TIME_STOP;
if (cutscene_object_with_dialog(CUTSCENE_DIALOG, o, DIALOG_161)) { if (cutscene_object_with_dialog(CUTSCENE_DIALOG, o, DIALOG_161)) {
o->activeFlags &= ~ACTIVE_FLAG_INITIATED_TIME_STOP; o->activeFlags &= ~ACTIVE_FLAG_INITIATED_TIME_STOP;
@ -122,7 +122,7 @@ void yoshi_finish_jumping_and_despawn_loop(void) {
obj_move_xyz_using_fvel_and_yaw(o); obj_move_xyz_using_fvel_and_yaw(o);
o->oVelY -= 2.0; o->oVelY -= 2.0;
if (o->oPosY < 2100.0f) { if (o->oPosY < 2100.0f) {
set_mario_npc_dialog(&gMarioStates[0], 0); set_mario_npc_dialog(&gMarioStates[0], 0, NULL);
gObjCutsceneDone = TRUE; gObjCutsceneDone = TRUE;
sYoshiDead = 1; sYoshiDead = 1;
o->activeFlags = ACTIVE_FLAG_DEACTIVATED; o->activeFlags = ACTIVE_FLAG_DEACTIVATED;

View file

@ -7066,7 +7066,7 @@ void copy_spline_segment(struct CutsceneSplinePoint dst[], struct CutsceneSpline
s16 cutscene_common_set_dialog_state(s32 state) { s16 cutscene_common_set_dialog_state(s32 state) {
s16 timer = gCutsceneTimer; s16 timer = gCutsceneTimer;
// If the dialog ended, return CUTSCENE_LOOP, which would end the cutscene shot // If the dialog ended, return CUTSCENE_LOOP, which would end the cutscene shot
if (set_mario_npc_dialog(&gMarioStates[0], state) == 2) { if (set_mario_npc_dialog(&gMarioStates[0], state, NULL) == 2) {
timer = CUTSCENE_LOOP; timer = CUTSCENE_LOOP;
} }
return timer; return timer;

View file

@ -354,13 +354,18 @@ s32 mario_ready_to_speak(struct MarioState* m) {
// 0 = not in dialog // 0 = not in dialog
// 1 = starting dialog // 1 = starting dialog
// 2 = speaking // 2 = speaking
s32 set_mario_npc_dialog(struct MarioState* m, s32 actionArg) { s32 set_mario_npc_dialog(struct MarioState* m, s32 actionArg, u8 (*inContinueDialogFunction)(void)) {
s32 dialogState = 0; s32 dialogState = 0;
if (m->playerIndex == 0 && actionArg == 0) { if (m->playerIndex == 0) {
localDialogNPCBehavior = NULL; if (actionArg == 0 || inContinueDialogFunction == NULL) {
continueDialogFunction = NULL; localDialogNPCBehavior = NULL;
continueDialogFunctionObject = NULL; gContinueDialogFunction = NULL;
gContinueDialogFunctionObject = NULL;
} else {
gContinueDialogFunction = inContinueDialogFunction;
gContinueDialogFunctionObject = gCurrentObject;
}
} }
// in dialog // in dialog
@ -400,14 +405,14 @@ s32 act_reading_npc_dialog(struct MarioState *m) {
if (m->playerIndex == 0) { if (m->playerIndex == 0) {
u8 continueDialogCallback = TRUE; u8 continueDialogCallback = TRUE;
if (continueDialogFunction != NULL && continueDialogFunctionObject != NULL) { if (gContinueDialogFunction != NULL && gContinueDialogFunctionObject != NULL) {
struct Object* tmp = gCurrentObject; struct Object* tmp = gCurrentObject;
gCurrentObject = continueDialogFunctionObject; gCurrentObject = gContinueDialogFunctionObject;
continueDialogCallback = continueDialogFunction(); continueDialogCallback = gContinueDialogFunction();
gCurrentObject = tmp; gCurrentObject = tmp;
} }
if (!continueDialogCallback || m->usedObj == NULL || m->usedObj->activeFlags == ACTIVE_FLAG_DEACTIVATED || m->usedObj->behavior != localDialogNPCBehavior) { if (!continueDialogCallback || m->usedObj == NULL || m->usedObj->activeFlags == ACTIVE_FLAG_DEACTIVATED || m->usedObj->behavior != localDialogNPCBehavior) {
set_mario_npc_dialog(m, 0); set_mario_npc_dialog(m, 0, NULL);
} }
} }

View file

@ -11,7 +11,7 @@ void bhv_end_peach_loop(void);
void bhv_end_toad_loop(void); void bhv_end_toad_loop(void);
s32 geo_switch_peach_eyes(s32 run, struct GraphNode *node, UNUSED s32 a2); s32 geo_switch_peach_eyes(s32 run, struct GraphNode *node, UNUSED s32 a2);
s32 mario_ready_to_speak(struct MarioState* m); s32 mario_ready_to_speak(struct MarioState* m);
s32 set_mario_npc_dialog(struct MarioState* m, s32 actionArg); s32 set_mario_npc_dialog(struct MarioState* m, s32 actionArg, u8(*inContinueDialogFunction)(void));
s32 mario_execute_cutscene_action(struct MarioState *m); s32 mario_execute_cutscene_action(struct MarioState *m);
#endif // MARIO_ACTIONS_CUTSCENE_H #endif // MARIO_ACTIONS_CUTSCENE_H

View file

@ -726,7 +726,7 @@ s8 current_mario_room_check(s16 room) {
/** /**
* Triggers dialog when Mario is facing an object and controls it while in the dialog. * Triggers dialog when Mario is facing an object and controls it while in the dialog.
*/ */
s16 trigger_obj_dialog_when_facing(struct MarioState* m, s32 *inDialog, s16 dialogID, f32 dist, s32 actionArg) { s16 trigger_obj_dialog_when_facing(struct MarioState* m, s32 *inDialog, s16 dialogID, f32 dist, s32 actionArg, u8 (*inContinueDialogFunction)(void)) {
s16 dialogueResponse; s16 dialogueResponse;
int angleToPlayer = obj_angle_to_object(o, m->marioObj); int angleToPlayer = obj_angle_to_object(o, m->marioObj);
@ -737,10 +737,10 @@ s16 trigger_obj_dialog_when_facing(struct MarioState* m, s32 *inDialog, s16 dial
|| (*inDialog == 1)) { || (*inDialog == 1)) {
*inDialog = 1; *inDialog = 1;
if (set_mario_npc_dialog(m, actionArg) == 2) { //If Mario is speaking. if (set_mario_npc_dialog(m, actionArg, inContinueDialogFunction) == 2) { //If Mario is speaking.
dialogueResponse = cutscene_object_with_dialog(CUTSCENE_DIALOG, o, dialogID); dialogueResponse = cutscene_object_with_dialog(CUTSCENE_DIALOG, o, dialogID);
if (dialogueResponse != 0) { if (dialogueResponse != 0) {
set_mario_npc_dialog(m, 0); set_mario_npc_dialog(m, 0, NULL);
*inDialog = 0; *inDialog = 0;
return dialogueResponse; return dialogueResponse;
} }

View file

@ -101,7 +101,7 @@ static s32 obj_update_race_proposition_dialog(struct MarioState* m, s16 dialogID
s32 dialogResponse = cur_obj_update_dialog_with_cutscene(m, 2, DIALOG_UNK2_FLAG_0 | DIALOG_UNK2_LEAVE_TIME_STOP_ENABLED, CUTSCENE_RACE_DIALOG, dialogID, inContinueDialogFunction); s32 dialogResponse = cur_obj_update_dialog_with_cutscene(m, 2, DIALOG_UNK2_FLAG_0 | DIALOG_UNK2_LEAVE_TIME_STOP_ENABLED, CUTSCENE_RACE_DIALOG, dialogID, inContinueDialogFunction);
if (dialogResponse == 2) { if (dialogResponse == 2) {
set_mario_npc_dialog(m, 0); set_mario_npc_dialog(m, 0, NULL);
disable_time_stop_including_mario(); disable_time_stop_including_mario();
} }

View file

@ -28,8 +28,8 @@
#include "spawn_sound.h" #include "spawn_sound.h"
#include "pc/network/network.h" #include "pc/network/network.h"
u8 (*continueDialogFunction)(void) = NULL; u8 (*gContinueDialogFunction)(void) = NULL;
struct Object* continueDialogFunctionObject = NULL; struct Object* gContinueDialogFunctionObject = NULL;
s8 D_8032F0A0[] = { 0xF8, 0x08, 0xFC, 0x04 }; s8 D_8032F0A0[] = { 0xF8, 0x08, 0xFC, 0x04 };
s16 D_8032F0A4[] = { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 }; s16 D_8032F0A4[] = { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 };
@ -2689,7 +2689,7 @@ static void cur_obj_end_dialog(struct MarioState* m, s32 dialogFlags, s32 dialog
o->oDialogState++; o->oDialogState++;
if (!(dialogFlags & DIALOG_UNK1_FLAG_4)) { if (!(dialogFlags & DIALOG_UNK1_FLAG_4)) {
set_mario_npc_dialog(m, 0); set_mario_npc_dialog(m, 0, NULL);
} }
} }
@ -2698,8 +2698,6 @@ s32 cur_obj_update_dialog(struct MarioState* m, s32 actionArg, s32 dialogFlags,
UNUSED s32 doneTurning = TRUE; UNUSED s32 doneTurning = TRUE;
if (m->playerIndex != 0) { return 0; } if (m->playerIndex != 0) { return 0; }
continueDialogFunctionObject = gCurrentObject;
continueDialogFunction = inContinueDialogFunction;
switch (o->oDialogState) { switch (o->oDialogState) {
#ifdef VERSION_JP #ifdef VERSION_JP
@ -2729,7 +2727,7 @@ s32 cur_obj_update_dialog(struct MarioState* m, s32 actionArg, s32 dialogFlags,
#endif #endif
case DIALOG_UNK1_INTERRUPT_MARIO_ACTION: case DIALOG_UNK1_INTERRUPT_MARIO_ACTION:
if (set_mario_npc_dialog(m, actionArg) == 2) { if (set_mario_npc_dialog(m, actionArg, inContinueDialogFunction) == 2) {
o->oDialogState++; o->oDialogState++;
} }
break; break;
@ -2779,8 +2777,6 @@ s32 cur_obj_update_dialog_with_cutscene(struct MarioState* m, s32 actionArg, s32
s32 doneTurning = TRUE; s32 doneTurning = TRUE;
if (m->playerIndex != 0) { return 0; } if (m->playerIndex != 0) { return 0; }
continueDialogFunctionObject = gCurrentObject;
continueDialogFunction = inContinueDialogFunction;
switch (o->oDialogState) { switch (o->oDialogState) {
#ifdef VERSION_JP #ifdef VERSION_JP
@ -2818,7 +2814,7 @@ s32 cur_obj_update_dialog_with_cutscene(struct MarioState* m, s32 actionArg, s32
} }
} }
if (set_mario_npc_dialog(m, actionArg) == 2 && doneTurning) { if (set_mario_npc_dialog(m, actionArg, inContinueDialogFunction) == 2 && doneTurning) {
o->oDialogResponse = 0; o->oDialogResponse = 0;
o->oDialogState++; o->oDialogState++;
} else { } else {
@ -2848,7 +2844,7 @@ s32 cur_obj_update_dialog_with_cutscene(struct MarioState* m, s32 actionArg, s32
dialogResponse = o->oDialogResponse; dialogResponse = o->oDialogResponse;
o->oDialogState = DIALOG_UNK2_ENABLE_TIME_STOP; o->oDialogState = DIALOG_UNK2_ENABLE_TIME_STOP;
} else { } else {
set_mario_npc_dialog(m, 0); set_mario_npc_dialog(m, 0, NULL);
} }
break; break;
} }

View file

@ -67,8 +67,8 @@ struct SpawnParticlesInfo
/*0x10*/ f32 sizeRange; /*0x10*/ f32 sizeRange;
}; };
extern u8 (*continueDialogFunction)(void); extern u8 (*gContinueDialogFunction)(void);
extern struct Object* continueDialogFunctionObject; extern struct Object* gContinueDialogFunctionObject;
Gfx *geo_update_projectile_pos_from_parent(s32 callContext, UNUSED struct GraphNode *node, Mat4 mtx); Gfx *geo_update_projectile_pos_from_parent(s32 callContext, UNUSED struct GraphNode *node, Mat4 mtx);
Gfx *geo_update_layer_transparency(s32 callContext, struct GraphNode *node, UNUSED void *context); Gfx *geo_update_layer_transparency(s32 callContext, struct GraphNode *node, UNUSED void *context);