#include <ultra64.h>
#include "functions.h"
#include "variables.h"
Actor *func_802D94B4(ActorMarker *, Gfx **, Mtx **, Vtx **);
void timed_exitStaticCamera(f32);
void chJumpTutorial_update(Actor *this);
void chJumpTutorial_setState(Actor *this, s32 state);
enum chJumpTutorial_state_e {
JUMP_TUTORIAL_STATE_1_IDLE = 1,
JUMP_TUTORIAL_STATE_2_TEACHING,
JUMP_TUTORIAL_STATE_3_DISAPPEARED
};
ActorInfo gChJumpTutorial = {
MARKER_1ED_JUMP_TUTORIAL, ACTOR_3B9_JUMP_TUTORIAL, 0,
1, NULL,
chJumpTutorial_update, actor_update_func_80326224, func_80325340,
0, 0, 0.0f, 0
};
void __chJumpTutorial_setStaticCameraToNode4(Actor *this) {
timed_setStaticCameraToNode(0.0f, 4);
}
void __chJumpTutorial_textCallback(ActorMarker *caller, enum asset_e text_id, s32 arg2) {
Actor *actor = marker_getActor(caller);
if (text_id == ASSET_DF9_DIALOG_BOTTLES_UNKNOWN || text_id == ASSET_E12_DIALOG_BOTTLES_LEARNED_TUTORIAL_MOVES) {
chJumpTutorial_setState(actor, JUMP_TUTORIAL_STATE_3_DISAPPEARED);
}
timed_exitStaticCamera(0.0f);
}
void chJumpTutorial_setState(Actor *this, s32 state) {
switch (state) {
case JUMP_TUTORIAL_STATE_2_TEACHING:
this->sm_4070.dialog_id = 0;
player_getPosition(this->velocity);
func_8028F918(0);
if (ability_isUnlocked(ABILITY_7_FEATHERY_FLAP)) {
mapSpecificFlags_set(SM_SPECIFIC_FLAG_9_ABILITY_FEATHERY_UNLOCKED, true);
}
else if (ability_isUnlocked(ABILITY_A_HOLD_A_JUMP_HIGHER)) {
mapSpecificFlags_set(SM_SPECIFIC_FLAG_8_ABILITY_HOLD_A_JUMP_HIGHER_UNLOCKED, true);
}
else {
__chJumpTutorial_setStaticCameraToNode4(this);
ability_unlock(ABILITY_A_HOLD_A_JUMP_HIGHER);
gcdialog_showDialog(ASSET_DF6_DIALOG_BOTTLES_HIGH_JUMP_LEARN, 0xe, this->unk1C, this->marker, __chJumpTutorial_textCallback, NULL);
this->sm_4070.dialog_id = VER_SELECT(ASSET_E1A_DIALOG_BOTTLES_UNKNOWN, 0xA5C, 0, 0);
mapSpecificFlags_set(SM_SPECIFIC_FLAG_8_ABILITY_HOLD_A_JUMP_HIGHER_UNLOCKED, FALSE);
}
break;
case JUMP_TUTORIAL_STATE_3_DISAPPEARED:
mapSpecificFlags_set(SM_SPECIFIC_FLAG_5, true);
break;
}
subaddie_set_state(this, state);
}
void chJumpTutorial_update(Actor *this) {
f32 plyr_pos[3];
s32 face_buttons[6];
f32 distance_to_bottles;
Actor *bottles_ptr;
s32 dialog_id;
if (!this->initialized) {
bottles_ptr = actorArray_findClosestActorFromActorId(this->position, ACTOR_12B_TUTORIAL_BOTTLES, -1, &distance_to_bottles);
if (bottles_ptr) {
this->unk1C_x = bottles_ptr->position_x;
this->unk1C_y = bottles_ptr->position_y;
this->unk1C_z = bottles_ptr->position_z;
}
else {
this->unk1C_x = this->position_x;
this->unk1C_y = this->position_y;
this->unk1C_z = this->position_z;
}
this->initialized = true;
}
controller_copyFaceButtons(0, face_buttons);
switch (this->state) {
case JUMP_TUTORIAL_STATE_1_IDLE:
if (fileProgressFlag_get(FILEPROG_DB_SKIPPED_TUTORIAL)) {
marker_despawn(this->marker);
}
else if (mapSpecificFlags_get(SM_SPECIFIC_FLAG_E)) {
chJumpTutorial_setState(this, JUMP_TUTORIAL_STATE_2_TEACHING);
}
break;
case JUMP_TUTORIAL_STATE_2_TEACHING:
if (!gcdialog_hasCurrentTextId()) {
if (mapSpecificFlags_get(SM_SPECIFIC_FLAG_8_ABILITY_HOLD_A_JUMP_HIGHER_UNLOCKED)) {
__chJumpTutorial_setStaticCameraToNode4(this);
ability_unlock(ABILITY_7_FEATHERY_FLAP);
gcdialog_showDialog(ASSET_DF7_DIALOG_BOTTLES_FEATHERY_FLAP_LEARN, 0xa, this->unk1C, this->marker, __chJumpTutorial_textCallback, NULL);
this->sm_4070.dialog_id = VER_SELECT(ASSET_E1B_DIALOG_BOTTLES_UNKNOWN, 0xA5D, 0, 0);
mapSpecificFlags_set(SM_SPECIFIC_FLAG_8_ABILITY_HOLD_A_JUMP_HIGHER_UNLOCKED, FALSE);
}
if (mapSpecificFlags_get(SM_SPECIFIC_FLAG_9_ABILITY_FEATHERY_UNLOCKED)) {
__chJumpTutorial_setStaticCameraToNode4(this);
ability_unlock(ABILITY_8_FLAP_FLIP);
gcdialog_showDialog(ASSET_DF8_DIALOG_BOTTLES_FLAP_FLIP_LEARN, 0xa, this->unk1C, this->marker, __chJumpTutorial_textCallback, NULL);
this->sm_4070.dialog_id = VER_SELECT(ASSET_E1C_DIALOG_BOTTLES_UNKNOWN, 0xA5E, 0, 0);
mapSpecificFlags_set(SM_SPECIFIC_FLAG_9_ABILITY_FEATHERY_UNLOCKED, FALSE);
}
if (mapSpecificFlags_get(SM_SPECIFIC_FLAG_A_ABILITY_FLIP_UNLOCKED)) {
__chJumpTutorial_setStaticCameraToNode4(this);
func_8028F94C(2, this->unk1C);
if (!mapSpecificFlags_get(SM_SPECIFIC_FLAG_3_ALL_SM_ABILITIES_LEARNED) && chmole_learnedAllSpiralMountainAbilities()) {
mapSpecificFlags_set(SM_SPECIFIC_FLAG_3_ALL_SM_ABILITIES_LEARNED, true);
dialog_id = ASSET_E12_DIALOG_BOTTLES_LEARNED_TUTORIAL_MOVES;
}
else {
dialog_id = ASSET_DF9_DIALOG_BOTTLES_UNKNOWN;
}
gcdialog_showDialog(dialog_id, 0xe, this->unk1C, this->marker, __chJumpTutorial_textCallback, NULL);
mapSpecificFlags_set(SM_SPECIFIC_FLAG_A_ABILITY_FLIP_UNLOCKED, false);
this->sm_4070.dialog_id = 0;
}
}
player_getPosition(plyr_pos);
plyr_pos[0] = this->velocity_x;
plyr_pos[2] = this->velocity_z;
func_8028FAB0(plyr_pos);
if (func_8028EFC8() && face_buttons[FACE_BUTTON(BUTTON_B)] == TRUE && player_isStableWithExtraSteps()) {
if (this->sm_4070.dialog_id) {
gcdialog_showDialog(dialog_id = this->sm_4070.dialog_id, 0, NULL, NULL, NULL, NULL);
}
}
break;
case JUMP_TUTORIAL_STATE_3_DISAPPEARED:
marker_despawn(this->marker);
break;
}
}