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;
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->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) {
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;
switch (o->oBobombBuddyRole) {
case BOBOMB_BUDDY_ROLE_ADVICE:
if (cutscene_object_with_dialog(CUTSCENE_DIALOG, o, o->oBehParams2ndByte)
!= 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->oBobombBuddyHasTalkedToMario = BOBOMB_BUDDY_HAS_TALKED;

View file

@ -946,7 +946,7 @@ s32 bowser_dead_not_bits_end(void) {
bowser_dead_hide();
spawn_triangle_break_particles(20, 116, 1.0f, 0);
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;
}
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
* 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 < -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;
}
}
}
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.
*/
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->oPosX = 1800.0f;

View file

@ -60,6 +60,10 @@ void dorrie_begin_head_raise(s32 liftingMario) {
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) {
if (cur_obj_init_anim_check_frame(2, 35)) {
cur_obj_reverse_animation();
@ -68,7 +72,7 @@ void dorrie_act_lower_head(void) {
if (o->oTimer > 150) {
dorrie_begin_head_raise(FALSE);
} 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);
} else if (o->oDorrieForwardDistToMario > 320.0f) {
o->oTimer = 0;
@ -77,7 +81,7 @@ void dorrie_act_lower_head(void) {
#else
if (gMarioObject->platform == o) {
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);
} else if (o->oDorrieForwardDistToMario > 320.0f) {
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) {
o->collisionData = segmented_to_virtual(dorrie_seg6_collision_0600F644);
if (cur_obj_check_if_near_animation_end()) {
o->oAction = DORRIE_ACT_MOVE;
} 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;
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();
} else {

View file

@ -51,7 +51,7 @@ void bhv_grand_star_loop(void) {
o->oPosY = o->oHomeY + 200.0f;
grand_star_zero_velocity();
gObjCutsceneDone = 1;
set_mario_npc_dialog(&gMarioStates[0], 0);
set_mario_npc_dialog(&gMarioStates[0], 0, NULL);
o->oAction++;
o->oInteractStatus = 0;
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);
}
static u8 hoot_wants_to_talk_continue_dialog(void) {
return (o->oHootAvailability == HOOT_AVAIL_WANTS_TO_TALK && localTalkToHoot == 1);
}
void bhv_hoot_loop(void) {
struct MarioState* marioState = nearest_mario_state_to_object(o);
static u8 forceFlySanity = TRUE;
@ -272,9 +276,9 @@ void bhv_hoot_loop(void) {
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;
set_mario_npc_dialog(&gMarioStates[0], 0);
set_mario_npc_dialog(&gMarioStates[0], 0, NULL);
cur_obj_become_tangible();
o->oHootAvailability = HOOT_AVAIL_READY_TO_FLY;
network_send_object(o);
@ -283,7 +287,7 @@ void bhv_hoot_loop(void) {
case HOOT_AVAIL_READY_TO_FLY:
if (forceFlySanity) {
set_mario_npc_dialog(&gMarioStates[0], 0);
set_mario_npc_dialog(&gMarioStates[0], 0, NULL);
cur_obj_become_tangible();
forceFlySanity = FALSE;
}

View file

@ -536,7 +536,7 @@ s32 obj_begin_race(s32 noTimer) {
}
// 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();
} else if (o->oTimer > 50) {
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.
*/
@ -239,13 +243,13 @@ void bhv_mips_held(void) {
else
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;
if (cutscene_object_with_dialog(CUTSCENE_DIALOG, o, dialogID)) {
o->oInteractionSubtype |= INT_SUBTYPE_DROP_IMMEDIATELY;
o->activeFlags &= ~ACTIVE_FLAG_INITIATED_TIME_STOP;
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) {
s16 sp1E;
@ -132,13 +136,12 @@ void bhv_snowmans_bottom_loop(void) {
switch (o->oAction) {
case 0:
if (distanceToLocal < 400
&& set_mario_npc_dialog(&gMarioStates[0], 1) == 2) {
if (distanceToLocal < 400 && set_mario_npc_dialog(&gMarioStates[0], 1, bhv_snowmans_bottom_loop_continue_dialog) == 2) {
sp1E = cutscene_object_with_dialog(CUTSCENE_DIALOG, o, DIALOG_110);
if (sp1E) {
o->oForwardVel = 10.0f;
o->oAction = 1;
set_mario_npc_dialog(&gMarioStates[0], 0);
set_mario_npc_dialog(&gMarioStates[0], 0, NULL);
network_send_object(o);
}
}
@ -197,13 +200,21 @@ void bhv_snowmans_head_init(void) {
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) {
UNUSED s16 sp1E;
s16 sp1C;
switch (o->oAction) {
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;
break;
@ -227,7 +238,7 @@ void bhv_snowmans_head_loop(void) {
break;
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_default_star(-4700.0f, -1024.0f, 1890.0f);
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.
*/
@ -518,7 +522,7 @@ void cage_ukiki_held_loop(void) {
if (o->oPosY - o->oHomeY > -100.0f) {
switch(o->oUkikiTextState) {
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);
o->oUkikiTextState = UKIKI_TEXT_CAGE_TEXTBOX;
}
@ -526,7 +530,7 @@ void cage_ukiki_held_loop(void) {
case UKIKI_TEXT_CAGE_TEXTBOX:
if (gDialogResponse != 0) {
set_mario_npc_dialog(&gMarioStates[0], 0);
set_mario_npc_dialog(&gMarioStates[0], 0, NULL);
if (gDialogResponse == 1) {
o->oInteractionSubtype |= INT_SUBTYPE_DROP_IMMEDIATELY;
o->oUkikiTextState = UKIKI_TEXT_GO_TO_CAGE;
@ -584,7 +588,7 @@ void hat_ukiki_held_loop(void) {
case UKIKI_TEXT_HAS_HAT:
if (cur_obj_update_dialog(&gMarioStates[0], 2, 18, DIALOG_101, 0, hat_ukiki_held_loop_2)) {
mario_retrieve_cap();
set_mario_npc_dialog(&gMarioStates[0], 0);
set_mario_npc_dialog(&gMarioStates[0], 0, NULL);
o->oUkikiHasHat &= ~UKIKI_HAT_ON;
o->oUkikiTextState = UKIKI_TEXT_GAVE_HAT_BACK;
}

View file

@ -75,7 +75,7 @@ void yoshi_idle_loop(void) {
void yoshi_talk_loop(void) {
if ((s16) o->oMoveAngleYaw == (s16) o->oAngleToMario) {
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;
if (cutscene_object_with_dialog(CUTSCENE_DIALOG, o, DIALOG_161)) {
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);
o->oVelY -= 2.0;
if (o->oPosY < 2100.0f) {
set_mario_npc_dialog(&gMarioStates[0], 0);
set_mario_npc_dialog(&gMarioStates[0], 0, NULL);
gObjCutsceneDone = TRUE;
sYoshiDead = 1;
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 timer = gCutsceneTimer;
// 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;
}
return timer;

View file

@ -354,13 +354,18 @@ s32 mario_ready_to_speak(struct MarioState* m) {
// 0 = not in dialog
// 1 = starting dialog
// 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;
if (m->playerIndex == 0 && actionArg == 0) {
localDialogNPCBehavior = NULL;
continueDialogFunction = NULL;
continueDialogFunctionObject = NULL;
if (m->playerIndex == 0) {
if (actionArg == 0 || inContinueDialogFunction == NULL) {
localDialogNPCBehavior = NULL;
gContinueDialogFunction = NULL;
gContinueDialogFunctionObject = NULL;
} else {
gContinueDialogFunction = inContinueDialogFunction;
gContinueDialogFunctionObject = gCurrentObject;
}
}
// in dialog
@ -400,14 +405,14 @@ s32 act_reading_npc_dialog(struct MarioState *m) {
if (m->playerIndex == 0) {
u8 continueDialogCallback = TRUE;
if (continueDialogFunction != NULL && continueDialogFunctionObject != NULL) {
if (gContinueDialogFunction != NULL && gContinueDialogFunctionObject != NULL) {
struct Object* tmp = gCurrentObject;
gCurrentObject = continueDialogFunctionObject;
continueDialogCallback = continueDialogFunction();
gCurrentObject = gContinueDialogFunctionObject;
continueDialogCallback = gContinueDialogFunction();
gCurrentObject = tmp;
}
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);
s32 geo_switch_peach_eyes(s32 run, struct GraphNode *node, UNUSED s32 a2);
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);
#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.
*/
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;
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;
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);
if (dialogueResponse != 0) {
set_mario_npc_dialog(m, 0);
set_mario_npc_dialog(m, 0, NULL);
*inDialog = 0;
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);
if (dialogResponse == 2) {
set_mario_npc_dialog(m, 0);
set_mario_npc_dialog(m, 0, NULL);
disable_time_stop_including_mario();
}

View file

@ -28,8 +28,8 @@
#include "spawn_sound.h"
#include "pc/network/network.h"
u8 (*continueDialogFunction)(void) = NULL;
struct Object* continueDialogFunctionObject = NULL;
u8 (*gContinueDialogFunction)(void) = NULL;
struct Object* gContinueDialogFunctionObject = NULL;
s8 D_8032F0A0[] = { 0xF8, 0x08, 0xFC, 0x04 };
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++;
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;
if (m->playerIndex != 0) { return 0; }
continueDialogFunctionObject = gCurrentObject;
continueDialogFunction = inContinueDialogFunction;
switch (o->oDialogState) {
#ifdef VERSION_JP
@ -2729,7 +2727,7 @@ s32 cur_obj_update_dialog(struct MarioState* m, s32 actionArg, s32 dialogFlags,
#endif
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++;
}
break;
@ -2779,8 +2777,6 @@ s32 cur_obj_update_dialog_with_cutscene(struct MarioState* m, s32 actionArg, s32
s32 doneTurning = TRUE;
if (m->playerIndex != 0) { return 0; }
continueDialogFunctionObject = gCurrentObject;
continueDialogFunction = inContinueDialogFunction;
switch (o->oDialogState) {
#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->oDialogState++;
} else {
@ -2848,7 +2844,7 @@ s32 cur_obj_update_dialog_with_cutscene(struct MarioState* m, s32 actionArg, s32
dialogResponse = o->oDialogResponse;
o->oDialogState = DIALOG_UNK2_ENABLE_TIME_STOP;
} else {
set_mario_npc_dialog(m, 0);
set_mario_npc_dialog(m, 0, NULL);
}
break;
}

View file

@ -67,8 +67,8 @@ struct SpawnParticlesInfo
/*0x10*/ f32 sizeRange;
};
extern u8 (*continueDialogFunction)(void);
extern struct Object* continueDialogFunctionObject;
extern u8 (*gContinueDialogFunction)(void);
extern struct Object* gContinueDialogFunctionObject;
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);