From c1a0d0bd2b2e4cede190692e449618c9cfa5d0f8 Mon Sep 17 00:00:00 2001 From: Derek Hensley Date: Fri, 21 Oct 2022 20:12:38 -0700 Subject: [PATCH] EnOsn (Happy Mask Salesman) and object_osn Docs (#1135) * Inital cleanup * Object * Docs * Small things * PR --- assets/xml/objects/gameplay_keep.xml | 4 +- assets/xml/objects/object_osn.xml | 246 ++++--- src/code/z_player_lib.c | 2 +- .../actors/ovl_Dm_Char03/z_dm_char03.c | 4 +- src/overlays/actors/ovl_En_Osn/z_en_osn.c | 690 +++++++++++------- src/overlays/actors/ovl_En_Osn/z_en_osn.h | 29 +- tools/disasm/functions.txt | 30 +- 7 files changed, 581 insertions(+), 424 deletions(-) diff --git a/assets/xml/objects/gameplay_keep.xml b/assets/xml/objects/gameplay_keep.xml index b467c1034f..2e65fb73de 100644 --- a/assets/xml/objects/gameplay_keep.xml +++ b/assets/xml/objects/gameplay_keep.xml @@ -43,7 +43,9 @@ - + + + diff --git a/assets/xml/objects/object_osn.xml b/assets/xml/objects/object_osn.xml index dbcdb84734..d6109c7173 100644 --- a/assets/xml/objects/object_osn.xml +++ b/assets/xml/objects/object_osn.xml @@ -1,117 +1,139 @@  + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/code/z_player_lib.c b/src/code/z_player_lib.c index a6f45dccb6..21753040f7 100644 --- a/src/code/z_player_lib.c +++ b/src/code/z_player_lib.c @@ -1981,7 +1981,7 @@ Gfx* D_801C0B20[] = { gameplay_keep_DL_00B260, gameplay_keep_DL_005A10, gameplay_keep_DL_005360, - gameplay_keep_DL_0056C0, + gDekuMaskDL, object_mask_boy_DL_000900, object_mask_goron_DL_0014A0, object_mask_zora_DL_000DB0, diff --git a/src/overlays/actors/ovl_Dm_Char03/z_dm_char03.c b/src/overlays/actors/ovl_Dm_Char03/z_dm_char03.c index be8ce93f13..714913231b 100644 --- a/src/overlays/actors/ovl_Dm_Char03/z_dm_char03.c +++ b/src/overlays/actors/ovl_Dm_Char03/z_dm_char03.c @@ -32,7 +32,9 @@ ActorInit Dm_Char03_InitVars = { (ActorFunc)DmChar03_Draw, }; -AnimationInfo sAnimationInfo[] = { { &object_osn_Anim_020530, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f } }; +AnimationInfo sAnimationInfo[] = { + { &gDekuMaskFallOverAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, +}; void DmChar03_ChangeAnim(SkelAnime* skelAnime, AnimationInfo* animationInfo, u16 animIndex) { f32 frame; diff --git a/src/overlays/actors/ovl_En_Osn/z_en_osn.c b/src/overlays/actors/ovl_En_Osn/z_en_osn.c index 7098814157..a61c0dc22c 100644 --- a/src/overlays/actors/ovl_En_Osn/z_en_osn.c +++ b/src/overlays/actors/ovl_En_Osn/z_en_osn.c @@ -16,6 +16,68 @@ void EnOsn_Destroy(Actor* thisx, PlayState* play); void EnOsn_Update(Actor* thisx, PlayState* play); void EnOsn_Draw(Actor* thisx, PlayState* play); +void EnOsn_Idle(EnOsn* this, PlayState* play); +void EnOsn_StartCutscene(EnOsn* this, PlayState* play); +void EnOsn_HandleCsAction(EnOsn* this, PlayState* play); +void EnOsn_Talk(EnOsn* this, PlayState* play); + +#define OSN_STATE_SPECIAL_CONVERSTATION (1 << 0) +#define OSN_STATE_MET_HUMAN (1 << 1) +#define OSN_STATE_MET_DEKU (1 << 2) +#define OSN_STATE_MET_GORON (1 << 3) +#define OSN_STATE_MET_ZORA (1 << 4) +#define OSN_STATE_END_CONVERSATION (1 << 5) + +#define OSN_MASK_TEXT_GREAT_FAIRY (1 << 0) +#define OSN_MASK_TEXT_GIBDO (1 << 1) +#define OSN_MASK_TEXT_TRUTH (1 << 2) +#define OSN_MASK_TEXT_GIANT (1 << 3) +#define OSN_MASK_TEXT_KAFEIS (1 << 4) +#define OSN_MASK_TEXT_DON_GERO (1 << 5) +#define OSN_MASK_TEXT_BLAST (1 << 6) +#define OSN_MASK_TEXT_COUPLE (1 << 7) +#define OSN_MASK_TEXT_SCENTS (1 << 8) +#define OSN_MASK_TEXT_KAMARO (1 << 9) +#define OSN_MASK_TEXT_STONE (1 << 10) +#define OSN_MASK_TEXT_POSTMAN (1 << 11) +#define OSN_MASK_TEXT_BUNNY (1 << 12) +#define OSN_MASK_TEXT_CAPTAIN (1 << 13) +#define OSN_MASK_TEXT_BREMEN (1 << 14) +#define OSN_MASK_TEXT_CIRCUS_LEADER (1 << 15) +#define OSN_MASK_TEXT_KEATON (1 << 16) +#define OSN_MASK_TEXT_GARO (1 << 17) +#define OSN_MASK_TEXT_ALL_NIGHT (1 << 18) +#define OSN_MASK_TEXT_ROMANI (1 << 19) + +typedef enum { + /* 0 */ OSN_ANIM_IDLE, + /* 1 */ OSN_ANIM_ARMS_OUT, + /* 2 */ OSN_ANIM_BOWING, + /* 3 */ OSN_ANIM_REMINISCE, + /* 4 */ OSN_ANIM_HANDS_CLASPED, + /* 5 */ OSN_ANIM_BELIEVE, + /* 6 */ OSN_ANIM_THINK, + /* 7 */ OSN_ANIM_SHAKE_HEAD, + /* 8 */ OSN_ANIM_ORGAN_TALK, + /* 9 */ OSN_ANIM_ORGAN_PLAY, + /* 10 */ OSN_ANIM_SHAKE, + /* 11 */ OSN_ANIM_CHOKE, + /* 12 */ OSN_ANIM_DESPAIR, + /* 13 */ OSN_ANIM_FAST_BOWS, + /* 14 */ OSN_ANIM_HAND_OUT, + /* 15 */ OSN_ANIM_LYING_DOWN_FACE_UP, + /* 16 */ OSN_ANIM_LYING_DOWN_FACE_DOWN, + /* 17 */ OSN_ANIM_MASK_LOOK_AT, + /* 18 */ OSN_ANIM_TURN_AROUND_START, + /* 19 */ OSN_ANIM_TURN_AROUND_LOOP, + /* 20 */ OSN_ANIM_WALK_AWAY, + /* 21 */ OSN_ANIM_MASK_LOOK_FROM_START, + /* 22 */ OSN_ANIM_MASK_LOOK_FROM_LOOP, + /* 23 */ OSN_ANIM_HAND_OUT_2, // Exact same as OSN_ANIM_HAND_OUT + /* 24 */ OSN_ANIM_WALK_AWAY_END, // Only the last frame of OSN_ANIM_WALK_AWAY + /* 25 */ OSN_ANIM_MAX +} OsnAnimation; + ActorInit En_Osn_InitVars = { ACTOR_EN_OSN, ACTORCAT_NPC, @@ -29,31 +91,31 @@ ActorInit En_Osn_InitVars = { }; static AnimationInfo sAnimationInfo[] = { - { &object_osn_Anim_0201BC, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, - { &object_osn_Anim_002F74, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, - { &object_osn_Anim_0037C4, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, - { &object_osn_Anim_004320, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, - { &object_osn_Anim_004C8C, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, - { &object_osn_Anim_0094E4, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, - { &object_osn_Anim_009BB8, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, - { &object_osn_Anim_00AC60, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, - { &object_osn_Anim_001614, 1.0f, 1.0f, 39.0f, ANIMMODE_LOOP, 0.0f }, - { &object_osn_Anim_001034, 1.0f, 1.0f, 70.0f, ANIMMODE_LOOP, 0.0f }, - { &object_osn_Anim_00AE9C, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, - { &object_osn_Anim_003A1C, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, - { &object_osn_Anim_0055F8, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, - { &object_osn_Anim_007220, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, - { &object_osn_Anim_00A444, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, - { &object_osn_Anim_0000C4, 0.0f, 0.0f, 0.0f, ANIMMODE_ONCE, 0.0f }, - { &object_osn_Anim_0000C4, 0.0f, 1.0f, 1.0f, ANIMMODE_ONCE, 0.0f }, - { &object_osn_Anim_006D48, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, - { &object_osn_Anim_001D6C, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, 0.0f }, - { &object_osn_Anim_002634, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, - { &object_osn_Anim_008D80, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, 0.0f }, - { &object_osn_Anim_005D78, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, 0.0f }, - { &object_osn_Anim_006564, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, - { &object_osn_Anim_00A444, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, - { &object_osn_Anim_008D80, 0.0f, 77.0f, 0.0f, ANIMMODE_ONCE, 0.0f }, + { &gHappyMaskSalesmanIdleAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, + { &gHappyMaskSalesmanArmsOutAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, + { &gHappyMaskSalesmanBowingAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, + { &gHappyMaskSalesmanReminisceAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, + { &gHappyMaskSalesmanHandsClaspedAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, + { &gHappyMaskSalesmanBelieveAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, + { &gHappyMaskSalesmanThinkAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, + { &gHappyMaskSalesmanShakeHeadAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, + { &gHappyMaskSalesmanOrganTalkAnim, 1.0f, 1.0f, 39.0f, ANIMMODE_LOOP, 0.0f }, + { &gHappyMaskSalesmanOrganPlayAnim, 1.0f, 1.0f, 70.0f, ANIMMODE_LOOP, 0.0f }, + { &gHappyMaskSalesmanShakeAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, + { &gHappyMaskSalesmanChokeAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, + { &gHappyMaskSalesmanDespairAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, + { &gHappyMaskSalesmanFastBowsAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, + { &gHappyMaskSalesmanHandOutAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, + { &gHappyMaskSalesmanLyingDownAnim, 0.0f, 0.0f, 0.0f, ANIMMODE_ONCE, 0.0f }, + { &gHappyMaskSalesmanLyingDownAnim, 0.0f, 1.0f, 1.0f, ANIMMODE_ONCE, 0.0f }, + { &gHappyMaskSalesmanMaskLookAtAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, + { &gHappyMaskSalesmanTurnAroundStartAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, 0.0f }, + { &gHappyMaskSalesmanTurnAroundLoopAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, + { &gHappyMaskSalesmanWalkAwayAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, 0.0f }, + { &gHappyMaskSalesmanMaskLookFromStartAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, 0.0f }, + { &gHappyMaskSalesmanMaskLookFromLoopAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, + { &gHappyMaskSalesmanHandOutAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, + { &gHappyMaskSalesmanWalkAwayAnim, 0.0f, 77.0f, 0.0f, ANIMMODE_ONCE, 0.0f }, }; static ColliderCylinderInit sCylinderInit = { @@ -117,12 +179,7 @@ static InitChainEntry sInitChain[] = { ICHAIN_U8(targetMode, 0, ICHAIN_STOP), }; -void func_80AD1634(EnOsn*, PlayState*); -void func_80AD16A8(EnOsn*, PlayState*); -void func_80AD14C8(EnOsn*, PlayState*); -void func_80AD19A0(EnOsn* this, PlayState* play); - -void func_80AD0830(EnOsn* this, PlayState* play) { +void EnOsn_UpdateCollider(EnOsn* this, PlayState* play) { this->collider.dim.pos.x = this->actor.world.pos.x; this->collider.dim.pos.y = this->actor.world.pos.y; this->collider.dim.pos.z = this->actor.world.pos.z; @@ -130,225 +187,265 @@ void func_80AD0830(EnOsn* this, PlayState* play) { CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base); } -s32 func_80AD08B0(PlayState* play) { +s32 EnOsn_GetMaskText(PlayState* play) { switch (Player_GetMask(play)) { case PLAYER_MASK_GREAT_FAIRY: return 0x1FD6; + case PLAYER_MASK_GIBDO: return 0x1FD8; + case PLAYER_MASK_TRUTH: return 0x1FDA; + case PLAYER_MASK_GIANT: return 0x1FDC; + case PLAYER_MASK_KAFEIS_MASK: return 0x1FDE; + case PLAYER_MASK_DON_GERO: return 0x1FE0; + case PLAYER_MASK_BLAST: return 0x1FE2; + case PLAYER_MASK_COUPLE: return 0x1FE4; + case PLAYER_MASK_SCENTS: return 0x1FE6; + case PLAYER_MASK_KAMARO: return 0x1FE8; + case PLAYER_MASK_STONE: return 0x1FEA; + case PLAYER_MASK_POSTMAN: return 0x1FEC; + case PLAYER_MASK_BUNNY: return 0x1FEE; + case PLAYER_MASK_CAPTAIN: return 0x1FF0; + case PLAYER_MASK_BREMEN: return 0x1FF2; + case PLAYER_MASK_CIRCUS_LEADER: return 0x1FF4; + case PLAYER_MASK_KEATON: return 0x1FF6; + case PLAYER_MASK_GARO: return 0x1FF8; + case PLAYER_MASK_ALL_NIGHT: return 0x1FFA; + case PLAYER_MASK_ROMANI: return 0x1FFC; + default: return 0; } } -void func_80AD0998(EnOsn* this) { +void EnOsn_TurnAround(EnOsn* this) { s16 curFrame = this->skelAnime.curFrame; - s16 lastFrame = Animation_GetLastFrame(sAnimationInfo[this->unk_1EC].animation); + s16 lastFrame = Animation_GetLastFrame(sAnimationInfo[this->animIndex].animation); - if (this->unk_1EC == 0x12 && curFrame == lastFrame) { - this->unk_1EC = 0x13; - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 0x13); + if ((this->animIndex == OSN_ANIM_TURN_AROUND_START) && (curFrame == lastFrame)) { + this->animIndex = OSN_ANIM_TURN_AROUND_LOOP; + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, OSN_ANIM_TURN_AROUND_LOOP); } } -void func_80AD0A24(EnOsn* this) { +void EnOsn_LookFromMask(EnOsn* this) { s16 curFrame = this->skelAnime.curFrame; - s16 lastFrame = Animation_GetLastFrame(sAnimationInfo[this->unk_1EC].animation); + s16 lastFrame = Animation_GetLastFrame(sAnimationInfo[this->animIndex].animation); - if (this->unk_1EC == 0x15 && curFrame == lastFrame) { - this->unk_1EC = 0x16; - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 0x16); + if ((this->animIndex == OSN_ANIM_MASK_LOOK_FROM_START) && (curFrame == lastFrame)) { + this->animIndex = OSN_ANIM_MASK_LOOK_FROM_LOOP; + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, OSN_ANIM_MASK_LOOK_FROM_LOOP); } } -void func_80AD0AB0(EnOsn* this) { +void EnOsn_FadeOut(EnOsn* this) { s16 curFrame = this->skelAnime.curFrame; - s16 lastFrame = Animation_GetLastFrame(sAnimationInfo[this->unk_1EC].animation); + s16 lastFrame = Animation_GetLastFrame(sAnimationInfo[this->animIndex].animation); if (curFrame == lastFrame) { - this->unk_1FA -= 8; - if (this->unk_1FA < 8) { - this->unk_1FA = 0; + this->alpha -= 8; + if (this->alpha < 8) { + this->alpha = 0; Actor_Kill(&this->actor); } } } -s32 func_80AD0B38(EnOsn* this, PlayState* play) { +s32 EnOsn_GetInitialMaskText(EnOsn* this, PlayState* play) { switch (Player_GetMask(play)) { case PLAYER_MASK_GREAT_FAIRY: - if (!(this->unk_1F6 & 1)) { - this->unk_1F6 |= 1; + if (!(this->maskTextFlags & OSN_MASK_TEXT_GREAT_FAIRY)) { + this->maskTextFlags |= OSN_MASK_TEXT_GREAT_FAIRY; return 0x1FD1; } break; + case PLAYER_MASK_GIBDO: - if (!(this->unk_1F6 & 2)) { - this->unk_1F6 |= 2; + if (!(this->maskTextFlags & OSN_MASK_TEXT_GIBDO)) { + this->maskTextFlags |= OSN_MASK_TEXT_GIBDO; return 0x1FD1; } break; + case PLAYER_MASK_TRUTH: - if (!(this->unk_1F6 & 4)) { - this->unk_1F6 |= 4; + if (!(this->maskTextFlags & OSN_MASK_TEXT_TRUTH)) { + this->maskTextFlags |= OSN_MASK_TEXT_TRUTH; return 0x1FD1; } break; + case PLAYER_MASK_GIANT: - if (!(this->unk_1F6 & 8)) { - this->unk_1F6 |= 8; + if (!(this->maskTextFlags & OSN_MASK_TEXT_GIANT)) { + this->maskTextFlags |= OSN_MASK_TEXT_GIANT; return 0x1FD1; } break; + case PLAYER_MASK_KAFEIS_MASK: - if (!(this->unk_1F6 & 0x10)) { - this->unk_1F6 |= 0x10; + if (!(this->maskTextFlags & OSN_MASK_TEXT_KAFEIS)) { + this->maskTextFlags |= OSN_MASK_TEXT_KAFEIS; return 0x1FD1; } break; + case PLAYER_MASK_DON_GERO: - if (!(this->unk_1F6 & 0x20)) { - this->unk_1F6 |= 0x20; + if (!(this->maskTextFlags & OSN_MASK_TEXT_DON_GERO)) { + this->maskTextFlags |= OSN_MASK_TEXT_DON_GERO; return 0x1FD1; } break; + case PLAYER_MASK_BLAST: - if (!(this->unk_1F6 & 0x40)) { - this->unk_1F6 |= 0x40; + if (!(this->maskTextFlags & OSN_MASK_TEXT_BLAST)) { + this->maskTextFlags |= OSN_MASK_TEXT_BLAST; return 0x1FD1; } break; + case PLAYER_MASK_COUPLE: - if (!(this->unk_1F6 & 0x80)) { - this->unk_1F6 |= 0x80; + if (!(this->maskTextFlags & OSN_MASK_TEXT_COUPLE)) { + this->maskTextFlags |= OSN_MASK_TEXT_COUPLE; return 0x1FD1; } break; + case PLAYER_MASK_SCENTS: - if (!(this->unk_1F6 & 0x100)) { - this->unk_1F6 |= 0x100; + if (!(this->maskTextFlags & OSN_MASK_TEXT_SCENTS)) { + this->maskTextFlags |= OSN_MASK_TEXT_SCENTS; return 0x1FD1; } break; + case PLAYER_MASK_KAMARO: - if (!(this->unk_1F6 & 0x200)) { - this->unk_1F6 |= 0x200; + if (!(this->maskTextFlags & OSN_MASK_TEXT_KAMARO)) { + this->maskTextFlags |= OSN_MASK_TEXT_KAMARO; return 0x1FD1; } break; + case PLAYER_MASK_STONE: - if (!(this->unk_1F6 & 0x400)) { - this->unk_1F6 |= 0x400; + if (!(this->maskTextFlags & OSN_MASK_TEXT_STONE)) { + this->maskTextFlags |= OSN_MASK_TEXT_STONE; return 0x1FD1; } break; + case PLAYER_MASK_POSTMAN: - if (!(this->unk_1F6 & 0x800)) { - this->unk_1F6 |= 0x800; + if (!(this->maskTextFlags & OSN_MASK_TEXT_POSTMAN)) { + this->maskTextFlags |= OSN_MASK_TEXT_POSTMAN; return 0x1FD2; } break; + case PLAYER_MASK_BUNNY: - if (!(this->unk_1F6 & 0x1000)) { - this->unk_1F6 |= 0x1000; + if (!(this->maskTextFlags & OSN_MASK_TEXT_BUNNY)) { + this->maskTextFlags |= OSN_MASK_TEXT_BUNNY; return 0x1FD2; } break; + case PLAYER_MASK_CAPTAIN: - if (!(this->unk_1F6 & 0x2000)) { - this->unk_1F6 |= 0x2000; + if (!(this->maskTextFlags & OSN_MASK_TEXT_CAPTAIN)) { + this->maskTextFlags |= OSN_MASK_TEXT_CAPTAIN; return 0x1FD1; } break; + case PLAYER_MASK_BREMEN: - if (!(this->unk_1F6 & 0x4000)) { - this->unk_1F6 |= 0x4000; + if (!(this->maskTextFlags & OSN_MASK_TEXT_BREMEN)) { + this->maskTextFlags |= OSN_MASK_TEXT_BREMEN; return 0x1FD1; } break; + case PLAYER_MASK_CIRCUS_LEADER: - if (!(this->unk_1F6 & 0x8000)) { - this->unk_1F6 |= 0x8000; + if (!(this->maskTextFlags & OSN_MASK_TEXT_CIRCUS_LEADER)) { + this->maskTextFlags |= OSN_MASK_TEXT_CIRCUS_LEADER; return 0x1FD1; } break; + case PLAYER_MASK_KEATON: - if (!(this->unk_1F6 & 0x10000)) { - this->unk_1F6 |= 0x10000; + if (!(this->maskTextFlags & OSN_MASK_TEXT_KEATON)) { + this->maskTextFlags |= OSN_MASK_TEXT_KEATON; return 0x1FD1; } break; + case PLAYER_MASK_GARO: - if (!(this->unk_1F6 & 0x20000)) { - this->unk_1F6 |= 0x20000; + if (!(this->maskTextFlags & OSN_MASK_TEXT_GARO)) { + this->maskTextFlags |= OSN_MASK_TEXT_GARO; return 0x1FD1; } break; + case PLAYER_MASK_ALL_NIGHT: - if (!(this->unk_1F6 & 0x40000)) { - this->unk_1F6 |= 0x40000; + if (!(this->maskTextFlags & OSN_MASK_TEXT_ALL_NIGHT)) { + this->maskTextFlags |= OSN_MASK_TEXT_ALL_NIGHT; return 0x1FD1; } break; + case PLAYER_MASK_ROMANI: - if (!(this->unk_1F6 & 0x80000)) { - this->unk_1F6 |= 0x80000; + if (!(this->maskTextFlags & OSN_MASK_TEXT_ROMANI)) { + this->maskTextFlags |= OSN_MASK_TEXT_ROMANI; return 0x1FD1; } break; + default: break; } - this->unk_1EA |= 0x20; - if (gSaveContext.save.day == 3 && gSaveContext.save.time >= CLOCK_TIME(5, 0) && - gSaveContext.save.time < CLOCK_TIME(6, 0)) { + this->stateFlags |= OSN_STATE_END_CONVERSATION; + if ((gSaveContext.save.day == 3) && (gSaveContext.save.time >= CLOCK_TIME(5, 0)) && + (gSaveContext.save.time < CLOCK_TIME(6, 0))) { return 0x2006; } return 0x1FCD; } -s32 func_80AD0E10(EnOsn* this, PlayState* play) { +s32 EnOsn_GetInitialText(EnOsn* this, PlayState* play) { Player* player = GET_PLAYER(play); if ((gSaveContext.save.inventory.items[SLOT_OCARINA] != ITEM_NONE) && CHECK_QUEST_ITEM(QUEST_SONG_HEALING)) { - if (this->unk_1EA & 1) { - this->unk_1EA |= 0x20; + if (this->stateFlags & OSN_STATE_SPECIAL_CONVERSTATION) { + this->stateFlags |= OSN_STATE_END_CONVERSATION; if ((gSaveContext.save.inventory.items[SLOT_OCARINA] != ITEM_NONE) && (INV_CONTENT(ITEM_MASK_DEKU) == ITEM_MASK_DEKU)) { if ((gSaveContext.save.day == 3) && (gSaveContext.save.time >= CLOCK_TIME(5, 0)) && @@ -361,28 +458,28 @@ s32 func_80AD0E10(EnOsn* this, PlayState* play) { } if (player->transformation == PLAYER_FORM_DEKU) { - if (this->unk_1EA & 4) { - this->unk_1EA |= 0x20; + if (this->stateFlags & OSN_STATE_MET_DEKU) { + this->stateFlags |= OSN_STATE_END_CONVERSATION; if ((gSaveContext.save.day == 3) && (gSaveContext.save.time >= CLOCK_TIME(5, 0)) && (gSaveContext.save.time < CLOCK_TIME(6, 0))) { return 0x2006; } return 0x1FCD; } - this->unk_1EA |= 4; + this->stateFlags |= OSN_STATE_MET_DEKU; return 0x1FC8; } if (player->transformation == PLAYER_FORM_GORON) { - if (this->unk_1EA & 8) { - this->unk_1EA |= 0x20; + if (this->stateFlags & OSN_STATE_MET_GORON) { + this->stateFlags |= OSN_STATE_END_CONVERSATION; if ((gSaveContext.save.day == 3) && (gSaveContext.save.time >= CLOCK_TIME(5, 0)) && (gSaveContext.save.time < CLOCK_TIME(6, 0))) { return 0x2006; } return 0x1FCD; } - this->unk_1EA |= 8; + this->stateFlags |= OSN_STATE_MET_GORON; if (gSaveContext.save.weekEventReg[76] & 0x20) { return 0x1FC8; } @@ -392,15 +489,15 @@ s32 func_80AD0E10(EnOsn* this, PlayState* play) { } if (player->transformation == PLAYER_FORM_ZORA) { - if (this->unk_1EA & 0x10) { - this->unk_1EA |= 0x20; + if (this->stateFlags & OSN_STATE_MET_ZORA) { + this->stateFlags |= OSN_STATE_END_CONVERSATION; if ((gSaveContext.save.day == 3) && (gSaveContext.save.time >= CLOCK_TIME(5, 0)) && (gSaveContext.save.time < CLOCK_TIME(6, 0))) { return 0x2006; } return 0x1FCD; } - this->unk_1EA |= 0x10; + this->stateFlags |= OSN_STATE_MET_ZORA; if (gSaveContext.save.weekEventReg[76] & 0x40) { return 0x1FC8; } @@ -409,22 +506,22 @@ s32 func_80AD0E10(EnOsn* this, PlayState* play) { } if (Player_GetMask(play) == PLAYER_MASK_NONE) { - if (this->unk_1EA & 2) { - this->unk_1EA |= 0x20; + if (this->stateFlags & OSN_STATE_MET_HUMAN) { + this->stateFlags |= OSN_STATE_END_CONVERSATION; if ((gSaveContext.save.day == 3) && (gSaveContext.save.time >= CLOCK_TIME(5, 0)) && (gSaveContext.save.time < CLOCK_TIME(6, 0))) { return 0x2006; } return 0x1FCD; } - this->unk_1EA |= 2; + this->stateFlags |= OSN_STATE_MET_HUMAN; return 0x1FC8; } - return func_80AD0B38(this, play); + return EnOsn_GetInitialMaskText(this, play); } - this->unk_1EA |= 0x20; + this->stateFlags |= OSN_STATE_END_CONVERSATION; if ((gSaveContext.save.day == 3) && (gSaveContext.save.time >= CLOCK_TIME(5, 0)) && (gSaveContext.save.time < CLOCK_TIME(6, 0))) { return 0x2004; @@ -433,123 +530,123 @@ s32 func_80AD0E10(EnOsn* this, PlayState* play) { return 0x1FAE; } -void func_80AD10FC(EnOsn* this, PlayState* play) { - switch (this->unk_1F4) { +void EnOsn_HandleConversation(EnOsn* this, PlayState* play) { + switch (this->textId) { case 0x1FC8: - this->unk_1F4 = 0x1FC9; + this->textId = 0x1FC9; break; case 0x1FC9: - this->unk_1F4 = 0x1FCA; + this->textId = 0x1FCA; break; case 0x1FCA: - if ((gSaveContext.save.day == 3 && gSaveContext.save.time >= CLOCK_TIME(5, 0)) && - gSaveContext.save.time < CLOCK_TIME(6, 0)) { - this->unk_1F4 = 0x2007; + if ((gSaveContext.save.day == 3) && (gSaveContext.save.time >= CLOCK_TIME(5, 0)) && + (gSaveContext.save.time < CLOCK_TIME(6, 0))) { + this->textId = 0x2007; } else { - this->unk_1F4 = 0x1FCB; + this->textId = 0x1FCB; } break; case 0x1FCB: case 0x2007: - this->unk_1F4 = 0x1FCC; - this->unk_1EA |= 0x20; + this->textId = 0x1FCC; + this->stateFlags |= OSN_STATE_END_CONVERSATION; break; case 0x1FCE: case 0x1FD0: - this->unk_1F4 = 0x1FCF; + this->textId = 0x1FCF; break; case 0x1FCF: - this->unk_1F4 = 0x1FCA; + this->textId = 0x1FCA; break; case 0x1FD1: case 0x1FD2: - this->unk_1F4 = func_80AD08B0(play); + this->textId = EnOsn_GetMaskText(play); break; case 0x1FD6: - this->unk_1F4 = 0x1FD7; + this->textId = 0x1FD7; break; case 0x1FD8: - this->unk_1F4 = 0x1FD9; + this->textId = 0x1FD9; break; case 0x1FDA: - this->unk_1F4 = 0x1FDB; + this->textId = 0x1FDB; break; case 0x1FDC: - this->unk_1F4 = 0x1FDD; + this->textId = 0x1FDD; break; case 0x1FDE: - this->unk_1F4 = 0x1FDF; + this->textId = 0x1FDF; break; case 0x1FE0: - this->unk_1F4 = 0x1FE1; + this->textId = 0x1FE1; break; case 0x1FE2: - this->unk_1F4 = 0x1FE3; + this->textId = 0x1FE3; break; case 0x1FE4: - this->unk_1F4 = 0x1FE5; + this->textId = 0x1FE5; break; case 0x1FE6: - this->unk_1F4 = 0x1FE7; + this->textId = 0x1FE7; break; case 0x1FE8: - this->unk_1F4 = 0x1FE9; + this->textId = 0x1FE9; break; case 0x1FEA: - this->unk_1F4 = 0x1FEB; + this->textId = 0x1FEB; break; case 0x1FEC: - this->unk_1F4 = 0x1FED; + this->textId = 0x1FED; break; case 0x1FEE: - this->unk_1F4 = 0x1FEF; + this->textId = 0x1FEF; break; case 0x1FF0: - this->unk_1F4 = 0x1FF1; + this->textId = 0x1FF1; break; case 0x1FF2: - this->unk_1F4 = 0x1FF3; + this->textId = 0x1FF3; break; case 0x1FF4: - this->unk_1F4 = 0x1FF5; + this->textId = 0x1FF5; break; case 0x1FF6: - this->unk_1F4 = 0x1FF7; + this->textId = 0x1FF7; break; case 0x1FF8: - this->unk_1F4 = 0x1FF9; + this->textId = 0x1FF9; break; case 0x1FFA: - this->unk_1F4 = 0x1FFB; + this->textId = 0x1FFB; break; case 0x1FFC: - this->unk_1F4 = 0x1FFD; + this->textId = 0x1FFD; break; case 0x1FD7: @@ -563,7 +660,7 @@ void func_80AD10FC(EnOsn* this, PlayState* play) { case 0x1FF7: case 0x1FF9: case 0x1FFB: - this->unk_1F4 = 0x1FD3; + this->textId = 0x1FD3; break; case 0x1FD9: @@ -574,24 +671,24 @@ void func_80AD10FC(EnOsn* this, PlayState* play) { case 0x1FEF: case 0x1FF5: case 0x1FFD: - this->unk_1F4 = 0x1FD4; + this->textId = 0x1FD4; break; case 0x1FE5: - this->unk_1F4 = 0x1FFE; + this->textId = 0x1FFE; break; case 0x1FD3: case 0x1FD4: case 0x1FFE: - this->unk_1F4 = 0x1FD5; - this->unk_1EA |= 0x20; + this->textId = 0x1FD5; + this->stateFlags |= OSN_STATE_END_CONVERSATION; } - Message_StartTextbox(play, this->unk_1F4, &this->actor); + Message_StartTextbox(play, this->textId, &this->actor); } -void func_80AD1398(EnOsn* this) { +void EnOsn_InitCutscene(EnOsn* this) { this->cutscene = this->actor.cutscene; if ((gSaveContext.save.inventory.items[SLOT_OCARINA] == ITEM_NONE) || (INV_CONTENT(ITEM_MASK_DEKU) == ITEM_MASK_DEKU)) { @@ -604,147 +701,170 @@ void func_80AD1398(EnOsn* this) { } } -void func_80AD144C(EnOsn* this, PlayState* play) { - u32 sp1C = Flags_GetSwitch(play, 0); +void EnOsn_ChooseAction(EnOsn* this, PlayState* play) { + u32 isFlagSet = Flags_GetSwitch(play, 0); + this->cutscene = this->actor.cutscene; - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 0); - if (sp1C == 0) { - this->actionFunc = func_80AD16A8; + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, OSN_ANIM_IDLE); + if (!isFlagSet) { + this->actionFunc = EnOsn_HandleCsAction; } else { - this->actionFunc = func_80AD14C8; + this->actionFunc = EnOsn_Idle; } } -void func_80AD14C8(EnOsn* this, PlayState* play) { - s16 temp_v1 = this->actor.yawTowardsPlayer - this->actor.shape.rot.y; +void EnOsn_Idle(EnOsn* this, PlayState* play) { + s16 yaw = this->actor.yawTowardsPlayer - this->actor.shape.rot.y; - if (gSaveContext.save.inventory.items[SLOT_OCARINA] != ITEM_NONE && !CHECK_QUEST_ITEM(QUEST_SONG_HEALING)) { + if ((gSaveContext.save.inventory.items[SLOT_OCARINA] != ITEM_NONE) && !CHECK_QUEST_ITEM(QUEST_SONG_HEALING)) { if (Actor_ProcessTalkRequest(&this->actor, &play->state)) { - this->actionFunc = func_80AD1634; - } else if ((((this->actor.xzDistToPlayer < 100.0f) || this->actor.isTargeted) && (temp_v1 < 0x4000)) && - (temp_v1 > -0x4000)) { + this->actionFunc = EnOsn_StartCutscene; + } else if (((this->actor.xzDistToPlayer < 100.0f) || this->actor.isTargeted) && (yaw < 0x4000) && + (yaw > -0x4000)) { func_800B863C(&this->actor, play); this->actor.textId = 0xFFFF; } - } else { - if (Actor_ProcessTalkRequest(&this->actor, &play->state)) { - this->unk_1F4 = func_80AD0E10(this, play); - Message_StartTextbox(play, this->unk_1F4, &this->actor); - this->actionFunc = func_80AD19A0; - } else if ((((this->actor.xzDistToPlayer < 100.0f) || this->actor.isTargeted) && (temp_v1 < 0x4000)) && - (temp_v1 > -0x4000)) { - func_800B863C(&this->actor, play); - } + } else if (Actor_ProcessTalkRequest(&this->actor, &play->state)) { + this->textId = EnOsn_GetInitialText(this, play); + Message_StartTextbox(play, this->textId, &this->actor); + this->actionFunc = EnOsn_Talk; + } else if (((this->actor.xzDistToPlayer < 100.0f) || this->actor.isTargeted) && (yaw < 0x4000) && (yaw > -0x4000)) { + func_800B863C(&this->actor, play); } } -void func_80AD1634(EnOsn* this, PlayState* play) { +void EnOsn_StartCutscene(EnOsn* this, PlayState* play) { if (ActorCutscene_GetCanPlayNext(this->cutscene)) { ActorCutscene_Start(this->cutscene, &this->actor); - this->actionFunc = func_80AD16A8; - return; + this->actionFunc = EnOsn_HandleCsAction; + } else { + if (ActorCutscene_GetCurrentIndex() == 0x7C) { + ActorCutscene_Stop(0x7C); + } + ActorCutscene_SetIntentToPlay(this->cutscene); } - if (ActorCutscene_GetCurrentIndex() == 0x7C) { - ActorCutscene_Stop(0x7C); - } - ActorCutscene_SetIntentToPlay(this->cutscene); } -void func_80AD16A8(EnOsn* this, PlayState* play) { +void EnOsn_HandleCsAction(EnOsn* this, PlayState* play) { u8 pad; s32 actionIndex; if (Cutscene_CheckActorAction(play, 130)) { actionIndex = Cutscene_GetActorActionIndex(play, 130); - this->unk_1F0 = 0; - if (this->unk_1ED != play->csCtx.actorActions[actionIndex]->action) { - this->unk_1ED = play->csCtx.actorActions[actionIndex]->action; + this->shouldRotateHead = false; + if (this->csAction != play->csCtx.actorActions[actionIndex]->action) { + this->csAction = play->csCtx.actorActions[actionIndex]->action; switch (play->csCtx.actorActions[actionIndex]->action) { case 1: - this->unk_1EC = 2; + this->animIndex = OSN_ANIM_BOWING; break; + case 2: - this->unk_1EC = 1; + this->animIndex = OSN_ANIM_ARMS_OUT; break; + case 3: - this->unk_1EC = 7; + this->animIndex = OSN_ANIM_SHAKE_HEAD; break; + case 4: - this->unk_1EC = 3; + this->animIndex = OSN_ANIM_REMINISCE; break; + case 5: - this->unk_1EC = 6; + this->animIndex = OSN_ANIM_THINK; break; + case 6: - this->unk_1EC = 5; + this->animIndex = OSN_ANIM_BELIEVE; break; + case 7: - this->unk_1EC = 4; + this->animIndex = OSN_ANIM_HANDS_CLASPED; break; + case 8: - this->unk_1EC = 0; + this->animIndex = OSN_ANIM_IDLE; break; + case 10: - this->unk_1EC = 8; + this->animIndex = OSN_ANIM_ORGAN_TALK; break; + case 11: - this->unk_1EC = 9; + this->animIndex = OSN_ANIM_ORGAN_PLAY; break; + case 13: - this->unk_1EC = 0xA; + this->animIndex = OSN_ANIM_SHAKE; break; + case 15: - this->unk_1EC = 0xB; + this->animIndex = OSN_ANIM_CHOKE; break; + case 16: - this->unk_1EC = 0xC; + this->animIndex = OSN_ANIM_DESPAIR; break; + case 17: - this->unk_1EC = 0xD; + this->animIndex = OSN_ANIM_FAST_BOWS; break; + case 18: - this->unk_1EC = 0xE; + this->animIndex = OSN_ANIM_HAND_OUT; break; + case 19: - this->unk_1EC = 0x11; + this->animIndex = OSN_ANIM_MASK_LOOK_AT; break; + case 20: - this->unk_1EC = 0x12; + this->animIndex = OSN_ANIM_TURN_AROUND_START; break; + case 21: - this->unk_1EC = 0x14; + this->animIndex = OSN_ANIM_WALK_AWAY; break; + case 22: - this->unk_1EC = 0x15; + this->animIndex = OSN_ANIM_MASK_LOOK_FROM_START; break; + case 23: - this->unk_1EC = 0x17; + this->animIndex = OSN_ANIM_HAND_OUT_2; break; + case 24: - this->unk_1EC = 0x18; + this->animIndex = OSN_ANIM_WALK_AWAY_END; break; + default: - this->unk_1EC = 0; + this->animIndex = OSN_ANIM_IDLE; break; } - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, this->unk_1EC); + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, this->animIndex); } - if ((this->unk_1EC == 5) && (play->sceneId == SCENE_SPOT00) && (gSaveContext.sceneLayer == 0xB) && - (play->csCtx.frames == 400)) { + if ((this->animIndex == OSN_ANIM_BELIEVE) && (play->sceneId == SCENE_SPOT00) && + (gSaveContext.sceneLayer == 0xB) && (play->csCtx.frames == 400)) { Actor_PlaySfxAtPos(&this->actor, NA_SE_VO_OMVO00); } - if (this->unk_1EC == 0x12) { - func_80AD0998(this); + + if (this->animIndex == OSN_ANIM_TURN_AROUND_START) { + EnOsn_TurnAround(this); } - if (this->unk_1EC == 0x15) { - func_80AD0A24(this); + + if (this->animIndex == OSN_ANIM_MASK_LOOK_FROM_START) { + EnOsn_LookFromMask(this); } - if (this->unk_1EC == 0x18) { - func_80AD0AB0(this); + + if (this->animIndex == OSN_ANIM_WALK_AWAY_END) { + EnOsn_FadeOut(this); } - if ((this->unk_1EC == 0x14) && + + if ((this->animIndex == OSN_ANIM_WALK_AWAY) && (((Animation_OnFrame(&this->skelAnime, 17.0f))) || (Animation_OnFrame(&this->skelAnime, 27.0f)) || (Animation_OnFrame(&this->skelAnime, 37.0f)) || (Animation_OnFrame(&this->skelAnime, 47.0f)) || (Animation_OnFrame(&this->skelAnime, 57.0f)) || (Animation_OnFrame(&this->skelAnime, 67.0f)))) { @@ -752,28 +872,28 @@ void func_80AD16A8(EnOsn* this, PlayState* play) { } Cutscene_ActorTranslateAndYaw(&this->actor, play, actionIndex); } else { - this->unk_1F0 = 1; - this->unk_1ED = 0x63; - func_80AD144C(this, play); + this->shouldRotateHead = true; + this->csAction = 0x63; + EnOsn_ChooseAction(this, play); } } -void func_80AD19A0(EnOsn* this, PlayState* play) { +void EnOsn_Talk(EnOsn* this, PlayState* play) { u8 talkState = Message_GetState(&play->msgCtx); if (((talkState == TEXT_STATE_DONE) || (talkState == TEXT_STATE_5)) && Message_ShouldAdvance(play)) { - if (this->unk_1EA & 0x20) { - this->unk_1EA &= ~0x20; + if (this->stateFlags & OSN_STATE_END_CONVERSATION) { + this->stateFlags &= ~OSN_STATE_END_CONVERSATION; play->msgCtx.msgMode = 0x43; play->msgCtx.stateTimer = 4; - this->actionFunc = func_80AD14C8; + this->actionFunc = EnOsn_Idle; } else { - func_80AD10FC(this, play); + EnOsn_HandleConversation(this, play); } } } -void EnOsn_Idle(EnOsn* this, PlayState* play) { +void EnOsn_DoNothing(EnOsn* this, PlayState* play) { } void EnOsn_Init(Actor* thisx, PlayState* play) { @@ -782,51 +902,50 @@ void EnOsn_Init(Actor* thisx, PlayState* play) { Actor_ProcessInitChain(&this->actor, sInitChain); ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 20.0f); - SkelAnime_InitFlex(play, &this->skelAnime, &object_osn_Skel_0202F0, &object_osn_Anim_0201BC, NULL, NULL, 0); + SkelAnime_InitFlex(play, &this->skelAnime, &gHappyMaskSalesmanSkel, &gHappyMaskSalesmanIdleAnim, NULL, NULL, 0); Collider_InitCylinder(play, &this->collider); Collider_SetCylinder(play, &this->collider, &this->actor, &sCylinderInit); CollisionCheck_SetInfo2(&this->actor.colChkInfo, &sDamageTable, &sColChkInfoInit); - this->unk_1FA = 255; - switch (ENOSN_GET_3(&this->actor)) { - case 0: + this->alpha = 255; + + switch (ENOSN_GET_TYPE(&this->actor)) { + case OSN_TYPE_CHOOSE: if (((gSaveContext.save.entrance == ENTRANCE(CLOCK_TOWER_INTERIOR, 2)) || (gSaveContext.save.entrance == ENTRANCE(CLOCK_TOWER_INTERIOR, 3))) || (gSaveContext.save.entrance == ENTRANCE(CLOCK_TOWER_INTERIOR, 6))) { - this->unk_1EA |= 1; + this->stateFlags |= OSN_STATE_SPECIAL_CONVERSTATION; } - this->unk_1F0 = 1; + this->shouldRotateHead = true; if (play->sceneId == SCENE_INSIDETOWER) { if ((gSaveContext.save.entrance == ENTRANCE(CLOCK_TOWER_INTERIOR, 2)) || (gSaveContext.save.entrance == ENTRANCE(CLOCK_TOWER_INTERIOR, 6))) { - this->actionFunc = func_80AD16A8; - return; + this->actionFunc = EnOsn_HandleCsAction; + } else if (gSaveContext.save.entrance == ENTRANCE(CLOCK_TOWER_INTERIOR, 3)) { + EnOsn_InitCutscene(this); + this->actionFunc = EnOsn_StartCutscene; + } else { + EnOsn_ChooseAction(this, play); } - if (gSaveContext.save.entrance == ENTRANCE(CLOCK_TOWER_INTERIOR, 3)) { - func_80AD1398(this); - this->actionFunc = func_80AD1634; - return; - } - func_80AD144C(this, play); - return; + } else { + EnOsn_ChooseAction(this, play); } - func_80AD144C(this, play); break; - case 1: - this->unk_1EC = 0xF; - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, this->unk_1EC); - this->actionFunc = EnOsn_Idle; + case OSN_TYPE_LIE_FACE_DOWN: + this->animIndex = OSN_ANIM_LYING_DOWN_FACE_UP; + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, this->animIndex); + this->actionFunc = EnOsn_DoNothing; break; - case 2: - this->unk_1EC = 0x10; - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, this->unk_1EC); - this->actionFunc = EnOsn_Idle; + case OSN_TYPE_LIE_FACE_UP: + this->animIndex = OSN_ANIM_LYING_DOWN_FACE_DOWN; + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, this->animIndex); + this->actionFunc = EnOsn_DoNothing; break; - case 3: + case OSN_TYPE_CUTSCENE: this->actor.flags &= ~ACTOR_FLAG_1; - this->actionFunc = func_80AD16A8; + this->actionFunc = EnOsn_HandleCsAction; break; default: @@ -845,33 +964,35 @@ void EnOsn_Destroy(Actor* thisx, PlayState* play) { void EnOsn_Update(Actor* thisx, PlayState* play) { s32 pad; EnOsn* this = THIS; - u32 sp34; + u32 isFlagSet = Flags_GetSwitch(play, 0); - sp34 = Flags_GetSwitch(play, 0); this->actionFunc(this, play); Actor_MoveWithGravity(&this->actor); SkelAnime_Update(&this->skelAnime); - if (!ENOSN_GET_3(&this->actor)) { - if (sp34 != 0) { + + if (ENOSN_GET_TYPE(&this->actor) == OSN_TYPE_CHOOSE) { + if (isFlagSet) { this->actor.flags |= ACTOR_FLAG_1; - func_80AD0830(this, play); + EnOsn_UpdateCollider(this, play); this->actor.draw = EnOsn_Draw; } else { this->actor.draw = NULL; this->actor.flags &= ~ACTOR_FLAG_1; } } - Actor_TrackPlayer(play, &this->actor, &this->unk_1D8, &this->unk_1DE, this->actor.focus.pos); + + Actor_TrackPlayer(play, &this->actor, &this->headRot, &this->torsoRot, this->actor.focus.pos); } s32 EnOsn_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx, Gfx** gfx) { EnOsn* this = (EnOsn*)thisx; - if (this->unk_1F0 && limbIndex == 11) { - Matrix_RotateXS(this->unk_1D8.y, MTXMODE_APPLY); + if (this->shouldRotateHead && (limbIndex == HAPPY_MASK_SALESMAN_LIMB_HEAD)) { + Matrix_RotateXS(this->headRot.y, MTXMODE_APPLY); } - if ((this->unk_1EC == 9 || this->unk_1EC == 8) && limbIndex == 10) { + if (((this->animIndex == OSN_ANIM_ORGAN_PLAY) || (this->animIndex == OSN_ANIM_ORGAN_TALK)) && + (limbIndex == HAPPY_MASK_SALESMAN_LIMB_BACKPACK)) { *dList = NULL; } return false; @@ -879,48 +1000,51 @@ s32 EnOsn_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* p void EnOsn_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx, Gfx** gfx) { EnOsn* this = (EnOsn*)thisx; - Vec3f sp30 = { 0.0f, 0.0f, 0.0f }; - Vec3s sp28 = { 0x9920, -0x384, -0x320 }; + Vec3f headOffset = { 0.0f, 0.0f, 0.0f }; + Vec3s leftHandRot = { 0x9920, -0x384, -0x320 }; - if (limbIndex == 11) { - Matrix_MultVec3f(&sp30, &thisx->focus.pos); + if (limbIndex == HAPPY_MASK_SALESMAN_LIMB_HEAD) { + Matrix_MultVec3f(&headOffset, &this->actor.focus.pos); } - if (((this->unk_1EC == 17) || (this->unk_1EC == 21) || (this->unk_1EC == 22)) && (limbIndex == 6)) { + if (((this->animIndex == OSN_ANIM_MASK_LOOK_AT) || (this->animIndex == OSN_ANIM_MASK_LOOK_FROM_START) || + (this->animIndex == OSN_ANIM_MASK_LOOK_FROM_LOOP)) && + (limbIndex == HAPPY_MASK_SALESMAN_LIMB_LEFT_HAND)) { Matrix_Push(); Matrix_Translate(-400.0f, 1100.0f, -200.0f, MTXMODE_APPLY); - Matrix_RotateXS(sp28.x, MTXMODE_APPLY); - Matrix_RotateYS(sp28.y, MTXMODE_APPLY); - Matrix_RotateZS(sp28.z, MTXMODE_APPLY); + Matrix_RotateXS(leftHandRot.x, MTXMODE_APPLY); + Matrix_RotateYS(leftHandRot.y, MTXMODE_APPLY); + Matrix_RotateZS(leftHandRot.z, MTXMODE_APPLY); gSPMatrix((*gfx)++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); - gSPDisplayList((*gfx)++, &object_osn_DL_0192A0); + gSPDisplayList((*gfx)++, &gHappyMaskSalesmanMajorasMaskDL); Matrix_Pop(); } } void EnOsn_Draw(Actor* thisx, PlayState* play) { - static TexturePtr D_80AD2588 = object_osn_Tex_0166F8; - static TexturePtr D_80AD258C = object_osn_Tex_016EF8; - static TexturePtr D_80AD2590 = object_osn_Tex_0176F8; - static TexturePtr D_80AD2594 = object_osn_Tex_017EF8; - static TexturePtr D_80AD2598 = object_osn_Tex_0182F8; + static TexturePtr sEyeClosedHappyTex = gHappyMaskSalesmanEyeClosedHappyTex; + static TexturePtr sEyeOpenTex = gHappyMaskSalesmanEyeOpenTex; + static TexturePtr sEyeClosedAngryTex = gHappyMaskSalesmanEyeClosedAngryTex; + static TexturePtr sSmileTex = gHappyMaskSalesmanSmileTex; + static TexturePtr sFrownTex = gHappyMaskSalesmanFrownTex; s32 pad; EnOsn* this = THIS; OPEN_DISPS(play->state.gfxCtx); - if (this->unk_1FA == 0xFF) { + if (this->alpha == 255) { func_8012C28C(play->state.gfxCtx); - if ((this->unk_1EC == 0xB) || (this->unk_1EC == 0xC) || (this->unk_1EC == 0x17) || - (play->msgCtx.currentTextId == 0x1FCA)) { - gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(D_80AD258C)); - gSPSegment(POLY_OPA_DISP++, 0x09, Lib_SegmentedToVirtual(D_80AD2594)); - } else if ((this->unk_1EC == 7) || (this->unk_1EC == 3) || (this->unk_1EC == 0xD)) { - gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(D_80AD2590)); - gSPSegment(POLY_OPA_DISP++, 0x09, Lib_SegmentedToVirtual(D_80AD2598)); + if ((this->animIndex == OSN_ANIM_CHOKE) || (this->animIndex == OSN_ANIM_DESPAIR) || + (this->animIndex == OSN_ANIM_HAND_OUT_2) || (play->msgCtx.currentTextId == 0x1FCA)) { + gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sEyeOpenTex)); + gSPSegment(POLY_OPA_DISP++, 0x09, Lib_SegmentedToVirtual(sSmileTex)); + } else if ((this->animIndex == OSN_ANIM_SHAKE_HEAD) || (this->animIndex == OSN_ANIM_REMINISCE) || + (this->animIndex == OSN_ANIM_FAST_BOWS)) { + gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sEyeClosedAngryTex)); + gSPSegment(POLY_OPA_DISP++, 0x09, Lib_SegmentedToVirtual(sFrownTex)); } else { - gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(D_80AD2588)); - gSPSegment(POLY_OPA_DISP++, 0x09, Lib_SegmentedToVirtual(D_80AD2594)); + gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sEyeClosedHappyTex)); + gSPSegment(POLY_OPA_DISP++, 0x09, Lib_SegmentedToVirtual(sSmileTex)); } gDPSetEnvColor(POLY_OPA_DISP++, 255, 255, 255, 255); Scene_SetRenderModeXlu(play, 0, 1); @@ -929,9 +1053,9 @@ void EnOsn_Draw(Actor* thisx, PlayState* play) { EnOsn_OverrideLimbDraw, EnOsn_PostLimbDraw, &this->actor, POLY_OPA_DISP); } else { func_8012C2DC(play->state.gfxCtx); - gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(D_80AD2588)); - gSPSegment(POLY_XLU_DISP++, 0x09, Lib_SegmentedToVirtual(D_80AD2594)); - gDPSetEnvColor(POLY_XLU_DISP++, 255, 255, 255, this->unk_1FA); + gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(sEyeClosedHappyTex)); + gSPSegment(POLY_XLU_DISP++, 0x09, Lib_SegmentedToVirtual(sSmileTex)); + gDPSetEnvColor(POLY_XLU_DISP++, 255, 255, 255, this->alpha); Scene_SetRenderModeXlu(play, 1, 2); POLY_XLU_DISP = SkelAnime_DrawFlex(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount, diff --git a/src/overlays/actors/ovl_En_Osn/z_en_osn.h b/src/overlays/actors/ovl_En_Osn/z_en_osn.h index 5d9858bd4d..638f31e4e0 100644 --- a/src/overlays/actors/ovl_En_Osn/z_en_osn.h +++ b/src/overlays/actors/ovl_En_Osn/z_en_osn.h @@ -7,25 +7,32 @@ struct EnOsn; typedef void (*EnOsnActionFunc)(struct EnOsn*, PlayState*); +#define ENOSN_GET_TYPE(this) ((thisx)->params & 3) + +typedef enum { + /* 0 */ OSN_TYPE_CHOOSE, // Will choose between Idle and Cutscene + /* 1 */ OSN_TYPE_LIE_FACE_DOWN, + /* 2 */ OSN_TYPE_LIE_FACE_UP, + /* 3 */ OSN_TYPE_CUTSCENE +} OsnType; + typedef struct EnOsn { /* 0x000 */ Actor actor; /* 0x144 */ ColliderCylinder collider; /* 0x190 */ SkelAnime skelAnime; /* 0x1D4 */ EnOsnActionFunc actionFunc; - /* 0x1D8 */ Vec3s unk_1D8; - /* 0x1DE */ Vec3s unk_1DE; + /* 0x1D8 */ Vec3s headRot; + /* 0x1DE */ Vec3s torsoRot; /* 0x1E4 */ UNK_TYPE1 unk_1E4[0x6]; - /* 0x1EA */ u16 unk_1EA; - /* 0x1EC */ u8 unk_1EC; - /* 0x1ED */ u8 unk_1ED; + /* 0x1EA */ u16 stateFlags; + /* 0x1EC */ u8 animIndex; + /* 0x1ED */ u8 csAction; /* 0x1EE */ s16 cutscene; - /* 0x1F0 */ u8 unk_1F0; + /* 0x1F0 */ u8 shouldRotateHead; /* 0x1F1 */ UNK_TYPE1 unk_1F1[0x3]; - /* 0x1F4 */ u16 unk_1F4; - /* 0x1F6 */ s32 unk_1F6; - /* 0x1FA */ u8 unk_1FA; + /* 0x1F4 */ u16 textId; + /* 0x1F6 */ s32 maskTextFlags; + /* 0x1FA */ u8 alpha; } EnOsn; // size = 0x1FB -#define ENOSN_GET_3(this) ((thisx)->params & 3) - #endif // Z_EN_OSN_H diff --git a/tools/disasm/functions.txt b/tools/disasm/functions.txt index a84639222e..7a1f13c3c6 100644 --- a/tools/disasm/functions.txt +++ b/tools/disasm/functions.txt @@ -12135,21 +12135,21 @@ 0x80AD02FC:("EnFuKago_Update",), 0x80AD0340:("func_80AD0340",), 0x80AD04A4:("EnFuKago_Draw",), - 0x80AD0830:("func_80AD0830",), - 0x80AD08B0:("func_80AD08B0",), - 0x80AD0998:("func_80AD0998",), - 0x80AD0A24:("func_80AD0A24",), - 0x80AD0AB0:("func_80AD0AB0",), - 0x80AD0B38:("func_80AD0B38",), - 0x80AD0E10:("func_80AD0E10",), - 0x80AD10FC:("func_80AD10FC",), - 0x80AD1398:("func_80AD1398",), - 0x80AD144C:("func_80AD144C",), - 0x80AD14C8:("func_80AD14C8",), - 0x80AD1634:("func_80AD1634",), - 0x80AD16A8:("func_80AD16A8",), - 0x80AD19A0:("func_80AD19A0",), - 0x80AD1A4C:("EnOsn_Idle",), + 0x80AD0830:("EnOsn_UpdateCollider",), + 0x80AD08B0:("EnOsn_GetMaskText",), + 0x80AD0998:("EnOsn_TurnAround",), + 0x80AD0A24:("EnOsn_LookFromMask",), + 0x80AD0AB0:("EnOsn_FadeOut",), + 0x80AD0B38:("EnOsn_GetInitialMaskText",), + 0x80AD0E10:("EnOsn_GetInitialText",), + 0x80AD10FC:("EnOsn_HandleConversation",), + 0x80AD1398:("EnOsn_InitCutscene",), + 0x80AD144C:("EnOsn_ChooseAction",), + 0x80AD14C8:("EnOsn_Idle",), + 0x80AD1634:("EnOsn_StartCutscene",), + 0x80AD16A8:("EnOsn_HandleCsAction",), + 0x80AD19A0:("EnOsn_Talk",), + 0x80AD1A4C:("EnOsn_DoNothing",), 0x80AD1A5C:("EnOsn_Init",), 0x80AD1C88:("EnOsn_Destroy",), 0x80AD1CC8:("EnOsn_Update",),