From 9ad24710440c675223138d4fe6f198500e281578 Mon Sep 17 00:00:00 2001 From: Owlenuff Date: Thu, 3 Oct 2024 13:20:33 +0200 Subject: [PATCH] Document ch Attack Tutorial --- src/SM/ch/attacktutorial.c | 313 ++++++++++++++++++++----------------- src/SM/ch/jumptutorial.c | 3 +- src/SM/ch/smbottles.c | 3 +- 3 files changed, 176 insertions(+), 143 deletions(-) diff --git a/src/SM/ch/attacktutorial.c b/src/SM/ch/attacktutorial.c index e2b18388..2ec217a7 100644 --- a/src/SM/ch/attacktutorial.c +++ b/src/SM/ch/attacktutorial.c @@ -2,224 +2,255 @@ #include "functions.h" #include "variables.h" -/* chAttackTutorial - controls bottle teaching moves in spiral*/ - -//external +/* extern functions */ void timed_exitStaticCamera(f32); void func_8028F918(s32); -//public -void func_80387764(ActorMarker *); -void chAttackTutorial_setState(Actor * this, s32 arg1); +/* public functions */ +void chAttackTutorial_talk(ActorMarker *); +void chAttackTutorial_setState(Actor *this, s32 state); void chAttackTutorial_update(Actor *); - /* .data */ -ActorInfo D_8038AC20 = { MARKER_12B_ATTACK_TUTORIAL, ACTOR_167_ATTACK_TUTORIAL, 0, +enum chAttackTutorial_state_e { + ATTACK_TUTORIAL_STATE_1_UNKNOWN = 1, + ATTACK_TUTORIAL_STATE_2_UNKNOWN, + ATTACK_TUTORIAL_STATE_3_UNKNOWN, + ATTACK_TUTORIAL_STATE_4_UNKNOWN, + ATTACK_TUTORIAL_STATE_5_UNKNOWN +}; + +enum chAttackTutorial_enemy_e { + ATTACK_TUTORIAL_ENEMY_1_TOPPER = 1, + ATTACK_TUTORIAL_ENEMY_2_BAWL, + ATTACK_TUTORIAL_ENEMY_3_COLLY_WOBBLE +}; + +ActorInfo D_8038AC20 = { + MARKER_12B_ATTACK_TUTORIAL, ACTOR_167_ATTACK_TUTORIAL, NULL, 1, NULL, chAttackTutorial_update, actor_update_func_80326224, func_80325340, 0, 0, 0.0f, 0 }; /* .code */ -void __chAttackTutorial_spawnEnemy(ActorMarker *marker, s32 enemy_id){ +void __chAttackTutorial_enemy(ActorMarker *marker, s32 enemy_id) { Actor *actor = marker_getActor(marker); s32 pad; - Actor *other = spawn_child_actor(enemy_id, &actor); + Actor *enemy = spawn_child_actor(enemy_id, &actor); - actor->unk100 = other->marker; - other->unk100 = actor->marker; - if(actor->unk10_12 == 3 && actor->unk38_31 == 1){ - other->unk38_31 = 1; - }else{//L803871D4 - other->unk38_31 = 0; + actor->unk100 = enemy->marker; + enemy->unk100 = actor->marker; + + if (actor->unk10_12 == ATTACK_TUTORIAL_ENEMY_3_COLLY_WOBBLE && actor->unk38_31 == 1) { + enemy->unk38_31 = 1; } - other->unk10_12 = 1; - if(marker); + else {//L803871D4 + enemy->unk38_31 = 0; + } + + enemy->unk10_12 = ATTACK_TUTORIAL_ENEMY_1_TOPPER; + if (marker); } -s32 SM_func_803871FC(Actor *this, s32 arg1){ +s32 __chAttackTutorial_spawnEnemy(Actor *this, enum chAttackTutorial_enemy_e enemy) { volatile s32 sp1C; - s32 tmp_v0; - - sp1C = (arg1 == 1)? ACTOR_166_TOPPER_A : (tmp_v0 = (arg1 == 2)? ACTOR_165_BAWL_A : ACTOR_164_COLLYWOBBLE_A); - __spawnQueue_add_2(__chAttackTutorial_spawnEnemy, this->marker, sp1C); - + + sp1C = enemy == ATTACK_TUTORIAL_ENEMY_1_TOPPER ? ACTOR_166_TOPPER_A : + enemy == ATTACK_TUTORIAL_ENEMY_2_BAWL ? ACTOR_165_BAWL_A : ACTOR_164_COLLYWOBBLE_A; + + __spawnQueue_add_2(__chAttackTutorial_enemy, this->marker, sp1C); } -void func_80387258(ActorMarker *marker, enum asset_e text_id, s32 arg2){ - chAttackTutorial_setState(marker_getActor(marker), 2); +void __chAttackTutorial_learnedTextActions(ActorMarker *marker, enum asset_e text_id, s32 arg2) { + chAttackTutorial_setState(marker_getActor(marker), ATTACK_TUTORIAL_STATE_2_UNKNOWN); } -void func_80387288(ActorMarker *marker, enum asset_e text_id, s32 arg2){ +void __chAttackTutorial_learnedTextCallback(ActorMarker *marker, enum asset_e text_id, s32 arg2) { Actor *actor = marker_getActor(marker); func_8028F918(0); - switch(text_id){ - case 0xe15://L803872C8 + + switch (text_id) { + case ASSET_E15_TEXT_UNKNOWN://L803872C8 ability_unlock(ABILITY_C_ROLL); - chAttackTutorial_setState(actor, 2); + chAttackTutorial_setState(actor, ATTACK_TUTORIAL_STATE_2_UNKNOWN); break; - case 0xe17://L803872E4 + + case ASSET_E17_TEXT_UNKNOWN://L803872E4 ability_unlock(ABILITY_B_RATATAT_RAP); - chAttackTutorial_setState(actor, 2); + chAttackTutorial_setState(actor, ATTACK_TUTORIAL_STATE_2_UNKNOWN); break; }//L803872FC + timed_exitStaticCamera(0.0f); } -void chAttackTutorial_setState(Actor * this, s32 arg1){ - switch (arg1) - { - case 5: - if(this->unk10_12 == 0){ - ability_unlock(ABILITY_4_CLAW_SWIPE); - gcdialog_showText(ASSET_DFF_TEXT_BOTTLES_CLAW_SWIPE_LEARN, 0xE, this->unk1C, this->marker, func_80387288, func_80387258); - } - else{ - gcdialog_showText((this->unk10_12 == 1) ? ASSET_E15_TEXT_UNKNOWN : ASSET_E17_TEXT_UNKNOWN, 0xE, this->unk1C, this->marker, func_80387288, NULL); - } - break; - case 2://L803873E0 - - this->unk38_31 = 0; - SM_func_803871FC(this, ++this->unk10_12); - break; - case 3://L8038742C - mapSpecificFlags_set(SM_SPECIFIC_FLAG_5, TRUE); - mapSpecificFlags_set(SM_SPECIFIC_FLAG_C, TRUE); - marker_despawn(this->marker); - break; - - case 4://L80387454 - mapSpecificFlags_set(SM_SPECIFIC_FLAG_C, TRUE); - if(!honeycombscore_get(HONEYCOMB_17_SM_COLIWOBBLE)){ - this->unk10_12 = 3; - this->unk38_31 = 1; - SM_func_803871FC(this, this->unk10_12); - } - break; - }//L803874A8 - subaddie_set_state(this, arg1); -} - -int func_803874C4(void){ - return ability_isUnlocked(ABILITY_4_CLAW_SWIPE) - && ability_isUnlocked(ABILITY_C_ROLL) - && ability_isUnlocked(ABILITY_B_RATATAT_RAP); -} - -void chAttackTutorial_update(Actor *this){ - f32 sp2C; - Actor *bottles; - - if(!this->initialized){ - //find closest tutorial bottles - bottles = actorArray_findClosestActorFromActorId(this->position, ACTOR_12B_TUTORIAL_BOTTLES, -1, &sp2C); - if(bottles != NULL){ - this->unk1C_x = bottles->position_x; - this->unk1C_y = bottles->position_y; - this->unk1C_z = bottles->position_z; - }else{ - {this->unk1C_x = this->position_x; - this->unk1C_y = this->position_y; - this->unk1C_z = this->position_z;} - } - this->unk10_12 = (ability_isUnlocked(ABILITY_C_ROLL))? 2 : (ability_isUnlocked(ABILITY_4_CLAW_SWIPE)? 1:0); - this->initialized = TRUE; - } - - switch(this->state){ - case 1://L80387610 - if (mapSpecificFlags_get(SM_SPECIFIC_FLAG_4)) { - chAttackTutorial_setState(this, 5); +void chAttackTutorial_setState(Actor *this, s32 state) { + switch (state) { + case ATTACK_TUTORIAL_STATE_5_UNKNOWN: + if (this->unk10_12 == NULL) { + ability_unlock(ABILITY_4_CLAW_SWIPE); + gcdialog_showText(ASSET_DFF_TEXT_BOTTLES_CLAW_SWIPE_LEARN, 0xE, this->unk1C, this->marker, __chAttackTutorial_learnedTextCallback, __chAttackTutorial_learnedTextActions); } - - if (func_803874C4() || volatileFlag_get(VOLATILE_FLAG_C1_IN_FINAL_CHARACTER_PARADE)) { - chAttackTutorial_setState(this, 4); + else { + gcdialog_showText(this->unk10_12 == ATTACK_TUTORIAL_ENEMY_1_TOPPER ? ASSET_E15_TEXT_UNKNOWN : ASSET_E17_TEXT_UNKNOWN, 0xE, this->unk1C, this->marker, __chAttackTutorial_learnedTextCallback, NULL); } break; - case 2://L80387658 + case ATTACK_TUTORIAL_STATE_2_UNKNOWN://L803873E0 + this->unk38_31 = 0; + __chAttackTutorial_spawnEnemy(this, ++this->unk10_12); + break; + + case ATTACK_TUTORIAL_STATE_3_UNKNOWN://L8038742C + mapSpecificFlags_set(SM_SPECIFIC_FLAG_5, TRUE); + mapSpecificFlags_set(SM_SPECIFIC_FLAG_C, TRUE); + marker_despawn(this->marker); + break; + + case ATTACK_TUTORIAL_STATE_4_UNKNOWN://L80387454 + mapSpecificFlags_set(SM_SPECIFIC_FLAG_C, TRUE); + + if (!honeycombscore_get(HONEYCOMB_17_SM_COLIWOBBLE)) { + this->unk10_12 = ATTACK_TUTORIAL_ENEMY_3_COLLY_WOBBLE; + this->unk38_31 = 1; + __chAttackTutorial_spawnEnemy(this, this->unk10_12); + } + break; + }//L803874A8 + + subaddie_set_state(this, state); +} + +int __chAttackTutorial_isEveryAbilitiesUnlocked(void) { + return ability_isUnlocked(ABILITY_4_CLAW_SWIPE) && + ability_isUnlocked(ABILITY_C_ROLL) && + ability_isUnlocked(ABILITY_B_RATATAT_RAP); +} + +void chAttackTutorial_update(Actor *this) { + f32 distance_to_bottles; + Actor *bottles_ptr; + + if (!this->initialized) { + bottles_ptr = actorArray_findClosestActorFromActorId(this->position, ACTOR_12B_TUTORIAL_BOTTLES, -1, &distance_to_bottles); + + if (bottles_ptr != NULL) { + 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->unk10_12 = ability_isUnlocked(ABILITY_C_ROLL) ? ATTACK_TUTORIAL_ENEMY_2_BAWL : + ability_isUnlocked(ABILITY_4_CLAW_SWIPE) ? ATTACK_TUTORIAL_ENEMY_1_TOPPER : NULL; + + this->initialized = TRUE; + } + + switch (this->state) { + case ATTACK_TUTORIAL_STATE_1_UNKNOWN://L80387610 + if (mapSpecificFlags_get(SM_SPECIFIC_FLAG_4)) { + chAttackTutorial_setState(this, ATTACK_TUTORIAL_STATE_5_UNKNOWN); + } + + if (__chAttackTutorial_isEveryAbilitiesUnlocked() || volatileFlag_get(VOLATILE_FLAG_C1_IN_FINAL_CHARACTER_PARADE)) { + chAttackTutorial_setState(this, ATTACK_TUTORIAL_STATE_4_UNKNOWN); + } + break; + + case ATTACK_TUTORIAL_STATE_2_UNKNOWN://L80387658 if (mapSpecificFlags_get(SM_SPECIFIC_FLAG_7)) { - func_80387764(this->marker); + chAttackTutorial_talk(this->marker); mapSpecificFlags_set(SM_SPECIFIC_FLAG_7, FALSE); } break; - case 5://L80387680 + case ATTACK_TUTORIAL_STATE_5_UNKNOWN://L80387680 break; }////L80387680 } -void func_80387690(ActorMarker *marker, enum asset_e text_id, s32 arg2){ +void __chAttackTutorial_attackTextCallback(ActorMarker *marker, enum asset_e text_id, s32 arg2) { Actor *actor = marker_getActor(marker); - switch(text_id){ - case 0xDFF: + + switch (text_id) { + case ASSET_DFF_TEXT_BOTTLES_CLAW_SWIPE_LEARN: func_8028F918(0); break; - case 0xE14: - case 0xE16: - case 0xE18: - SM_func_803871FC(actor, actor->unk10_12); + + case ASSET_E14_TEXT_UNKNOWN: + case ASSET_E16_TEXT_UNKNOWN: + case ASSET_E18_TEXT_UNKNOWN: + __chAttackTutorial_spawnEnemy(actor, actor->unk10_12); break; - case 0xE15: + + case ASSET_E15_TEXT_UNKNOWN: ability_unlock(ABILITY_C_ROLL); - chAttackTutorial_setState(actor, 2); + chAttackTutorial_setState(actor, ATTACK_TUTORIAL_STATE_2_UNKNOWN); break; - case 0xE17: + + case ASSET_E17_TEXT_UNKNOWN: ability_unlock(ABILITY_B_RATATAT_RAP); - chAttackTutorial_setState(actor, 2); + chAttackTutorial_setState(actor, ATTACK_TUTORIAL_STATE_2_UNKNOWN); break; - case 0xE12: - case 0xE19: - chAttackTutorial_setState(actor, 3); + + case ASSET_E12_TEXT_BOTTLES_LEARNED_TUTORIAL_MOVES: + case ASSET_E19_TEXT_UNKNOWN: + chAttackTutorial_setState(actor, ATTACK_TUTORIAL_STATE_3_UNKNOWN); break; } - timed_exitStaticCamera(0.0f); -}//*/ -void func_80387764(ActorMarker * marker){ - s32 sp34; - int temp_a2; - s32 sp2C = 4; - + timed_exitStaticCamera(0.0f); +} + +void chAttackTutorial_talk(ActorMarker *marker) { + s32 text_id; + int try_count; + s32 text_flags = 4; + Actor *actor = marker_getActor(marker); - - temp_a2 = actor->unk38_31 ? 1 : 0 ; - if( temp_a2 ){ - sp2C = 0xE; + try_count = BOOL(actor->unk38_31); + + if (try_count) { + text_flags = 0xE; } switch (actor->unk10_12) { - case 0x1: //L803877D8 - sp34 = temp_a2 ? ASSET_E15_TEXT_UNKNOWN : ASSET_E14_TEXT_UNKNOWN; //dialog enums + case ATTACK_TUTORIAL_ENEMY_1_TOPPER: //L803877D8 + text_id = try_count ? ASSET_E15_TEXT_UNKNOWN : ASSET_E14_TEXT_UNKNOWN; break; - case 0x2: //L803877F4 - sp34 = temp_a2 ? ASSET_E17_TEXT_UNKNOWN : ASSET_E16_TEXT_UNKNOWN; //dialog enums + case ATTACK_TUTORIAL_ENEMY_2_BAWL: //L803877F4 + text_id = try_count ? ASSET_E17_TEXT_UNKNOWN : ASSET_E16_TEXT_UNKNOWN; break; - case 3: //L80387810 - sp34 = temp_a2 ? ASSET_E19_TEXT_UNKNOWN : ASSET_E18_TEXT_UNKNOWN; //dialog enums + case ATTACK_TUTORIAL_ENEMY_3_COLLY_WOBBLE: //L80387810 + text_id = try_count ? ASSET_E19_TEXT_UNKNOWN : ASSET_E18_TEXT_UNKNOWN; break; + default: //sp34 = actor->unk38_31; break; }//L8038782C - if (sp34 == ASSET_E19_TEXT_UNKNOWN) { + if (text_id == ASSET_E19_TEXT_UNKNOWN) { func_8028F94C(2, actor->unk1C); - } - //L80387848 - if (!mapSpecificFlags_get(SM_SPECIFIC_FLAG_3_ALL_SM_ABILITIES_LEARNED) && chmole_learnedAllSpiralMountainAbilities() && temp_a2) { + }//L80387848 + + if (!mapSpecificFlags_get(SM_SPECIFIC_FLAG_3_ALL_SM_ABILITIES_LEARNED) && chmole_learnedAllSpiralMountainAbilities() && try_count) { mapSpecificFlags_set(SM_SPECIFIC_FLAG_3_ALL_SM_ABILITIES_LEARNED, TRUE); - sp34 = ASSET_E12_TEXT_BOTTLES_LEARNED_TUTORIAL_MOVES; + text_id = ASSET_E12_TEXT_BOTTLES_LEARNED_TUTORIAL_MOVES; }//L80387898 - if (temp_a2) { + if (try_count) { timed_setStaticCameraToNode(0.0f, 6); }//L803878B0 - gcdialog_showText(sp34, sp2C, actor->unk1C, actor->marker, func_80387690, NULL); + gcdialog_showText(text_id, text_flags, actor->unk1C, actor->marker, __chAttackTutorial_attackTextCallback, NULL); actor->unk38_31++; } diff --git a/src/SM/ch/jumptutorial.c b/src/SM/ch/jumptutorial.c index be6a1a17..2f276b03 100644 --- a/src/SM/ch/jumptutorial.c +++ b/src/SM/ch/jumptutorial.c @@ -18,7 +18,8 @@ enum chJumpTutorial_state_e { }; ActorInfo D_8038B0B0 = { - MARKER_1ED_JUMP_TUTORIAL, ACTOR_3B9_JUMP_TUTORIAL, NULL, 1, NULL, + MARKER_1ED_JUMP_TUTORIAL, ACTOR_3B9_JUMP_TUTORIAL, NULL, + 1, NULL, chJumpTutorial_update, actor_update_func_80326224, func_80325340, 0, 0, 0.0f, 0 }; diff --git a/src/SM/ch/smbottles.c b/src/SM/ch/smbottles.c index 2b8e0098..48f41e98 100644 --- a/src/SM/ch/smbottles.c +++ b/src/SM/ch/smbottles.c @@ -41,7 +41,8 @@ ActorAnimationInfo chSmBottlesAnimations[6] = { }; ActorInfo chBottles = { - MARKER_B7_TUTORIAL_BOTTLES, ACTOR_12B_TUTORIAL_BOTTLES, ASSET_387_MODEL_BOTTLES, 1, chSmBottlesAnimations, + MARKER_B7_TUTORIAL_BOTTLES, ACTOR_12B_TUTORIAL_BOTTLES, ASSET_387_MODEL_BOTTLES, + 1, chSmBottlesAnimations, chSmBottles_update, actor_update_func_80326224, func_802D94B4, 0, 0, 0.0f, 0 };