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",),