Document EnSa (#2744)

* Document `EnSa`

* Rename INFTABLE entries

* Animation set -> group

* Remove trailing commas

* Rename textState field

* Remove trailing comma

* Rename EVENTCHKINF flag

* Correct frowning/closed swap of enum

* Rename INFTABLE flag
This commit is contained in:
Jordan Longstaff
2026-05-27 14:28:49 -04:00
committed by GitHub
parent 2cefc0e109
commit e560ff093a
5 changed files with 292 additions and 271 deletions
+5 -5
View File
@@ -533,7 +533,7 @@ typedef enum LinkAge {
#define EVENTCHKINF_00_UNUSED 0x00 // flag is set in the debug save, but has no functionality
#define EVENTCHKINF_01_UNUSED 0x01 // flag is set in the debug save, but has no functionality
#define EVENTCHKINF_MIDO_DENIED_DEKU_TREE_ACCESS 0x02
#define EVENTCHKINF_03 0x03
#define EVENTCHKINF_SARIA_WAS_TOLD_ABOUT_MIDO 0x03
#define EVENTCHKINF_04 0x04
#define EVENTCHKINF_05 0x05
#define EVENTCHKINF_07 0x07
@@ -795,10 +795,10 @@ typedef enum LinkAge {
// INFTABLE 0x0-0xF
#define INFTABLE_INDEX_0 0
#define INFTABLE_00 0x00
#define INFTABLE_01 0x01
#define INFTABLE_03 0x03
#define INFTABLE_05 0x05
#define INFTABLE_SARIA_GREETED_LINK 0x00
#define INFTABLE_SARIA_NOTICED_FAIRY 0x01
#define INFTABLE_SARIA_WAS_TOLD_ABOUT_MIDO 0x03
#define INFTABLE_SARIA_SPOKE_IN_HER_HOUSE 0x05
#define INFTABLE_0C 0x0C
#define INFTABLE_0E 0x0E
#define INFTABLE_10 0x10
+10 -10
View File
@@ -4932,21 +4932,21 @@ u32 func_80035BFC(PlayState* play, s16 arg1) {
switch (arg1) {
case 0:
if (Flags_GetEventChkInf(EVENTCHKINF_09)) {
if (Flags_GetInfTable(INFTABLE_05)) {
if (Flags_GetInfTable(INFTABLE_SARIA_SPOKE_IN_HER_HOUSE)) {
retTextId = 0x1048;
} else {
retTextId = 0x1047;
}
} else {
if (Flags_GetEventChkInf(EVENTCHKINF_MIDO_DENIED_DEKU_TREE_ACCESS)) {
if (Flags_GetInfTable(INFTABLE_03)) {
if (Flags_GetInfTable(INFTABLE_SARIA_WAS_TOLD_ABOUT_MIDO)) {
retTextId = 0x1032;
} else {
retTextId = 0x1031;
}
} else {
if (Flags_GetInfTable(INFTABLE_00)) {
if (Flags_GetInfTable(INFTABLE_01)) {
if (Flags_GetInfTable(INFTABLE_SARIA_GREETED_LINK)) {
if (Flags_GetInfTable(INFTABLE_SARIA_NOTICED_FAIRY)) {
retTextId = 0x1003;
} else {
retTextId = 0x1002;
@@ -4966,7 +4966,7 @@ u32 func_80035BFC(PlayState* play, s16 arg1) {
retTextId = 0x1045;
}
} else {
if (Flags_GetEventChkInf(EVENTCHKINF_03)) {
if (Flags_GetEventChkInf(EVENTCHKINF_SARIA_WAS_TOLD_ABOUT_MIDO)) {
if (Flags_GetInfTable(INFTABLE_0E)) {
retTextId = 0x1034;
} else {
@@ -5659,17 +5659,17 @@ void func_80036E50(u16 textId, s16 arg1) {
case 0:
switch (textId) {
case 0x1001:
Flags_SetInfTable(INFTABLE_00);
Flags_SetInfTable(INFTABLE_SARIA_GREETED_LINK);
return;
case 0x1002:
Flags_SetInfTable(INFTABLE_01);
Flags_SetInfTable(INFTABLE_SARIA_NOTICED_FAIRY);
return;
case 0x1031:
Flags_SetEventChkInf(EVENTCHKINF_03);
Flags_SetInfTable(INFTABLE_03);
Flags_SetEventChkInf(EVENTCHKINF_SARIA_WAS_TOLD_ABOUT_MIDO);
Flags_SetInfTable(INFTABLE_SARIA_WAS_TOLD_ABOUT_MIDO);
return;
case 0x1047:
Flags_SetInfTable(INFTABLE_05);
Flags_SetInfTable(INFTABLE_SARIA_SPOKE_IN_HER_HOUSE);
return;
}
return;
+5 -4
View File
@@ -379,14 +379,15 @@ void Sram_InitDebugSave(void) {
gSaveContext.save.info.horseData.pos.y = 72;
gSaveContext.save.info.horseData.pos.z = 5497;
gSaveContext.save.info.horseData.angle = -0x6AD9;
gSaveContext.save.info.infTable[INFTABLE_INDEX_0] |= INFTABLE_MASK(INFTABLE_00) | INFTABLE_MASK(INFTABLE_03) |
gSaveContext.save.info.infTable[INFTABLE_INDEX_0] |= INFTABLE_MASK(INFTABLE_SARIA_GREETED_LINK) |
INFTABLE_MASK(INFTABLE_SARIA_WAS_TOLD_ABOUT_MIDO) |
INFTABLE_MASK(INFTABLE_0C) | INFTABLE_MASK(INFTABLE_0E);
gSaveContext.save.info.eventChkInf[EVENTCHKINF_INDEX_0] |=
EVENTCHKINF_MASK(EVENTCHKINF_00_UNUSED) | EVENTCHKINF_MASK(EVENTCHKINF_01_UNUSED) |
EVENTCHKINF_MASK(EVENTCHKINF_MIDO_DENIED_DEKU_TREE_ACCESS) | EVENTCHKINF_MASK(EVENTCHKINF_03) |
EVENTCHKINF_MASK(EVENTCHKINF_04) | EVENTCHKINF_MASK(EVENTCHKINF_05) | EVENTCHKINF_MASK(EVENTCHKINF_09) |
EVENTCHKINF_MASK(EVENTCHKINF_0C);
EVENTCHKINF_MASK(EVENTCHKINF_MIDO_DENIED_DEKU_TREE_ACCESS) |
EVENTCHKINF_MASK(EVENTCHKINF_SARIA_WAS_TOLD_ABOUT_MIDO) | EVENTCHKINF_MASK(EVENTCHKINF_04) |
EVENTCHKINF_MASK(EVENTCHKINF_05) | EVENTCHKINF_MASK(EVENTCHKINF_09) | EVENTCHKINF_MASK(EVENTCHKINF_0C);
SET_EVENTCHKINF(EVENTCHKINF_80);
SET_EVENTCHKINF(EVENTCHKINF_C4);
+264 -244
View File
@@ -20,16 +20,25 @@
(ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_CULLING_DISABLED | \
ACTOR_FLAG_UPDATE_DURING_OCARINA)
typedef enum SariaType {
/* 0 */ SARIA_TYPE_NONE, // Null; actor killed immediately
/* 1 */ SARIA_TYPE_STANDING, // In her house or outside Link's after greeting him
/* 2 */ SARIA_TYPE_MEADOW_PLAYING, // After teaching Saria's Song
/* 3 */ SARIA_TYPE_UNUSED, // Never returned by type selector function
/* 4 */ SARIA_TYPE_GREETING, // Greeting Link
/* 5 */ SARIA_TYPE_MEADOW_WAITING // In the Sacred Forest Meadow, waiting to teach Saria's Song
} SariaType;
void EnSa_Init(Actor* thisx, PlayState* play);
void EnSa_Destroy(Actor* thisx, PlayState* play);
void EnSa_Update(Actor* thisx, PlayState* play);
void EnSa_Draw(Actor* thisx, PlayState* play);
void func_80AF6448(EnSa* this, PlayState* play);
void func_80AF67D0(EnSa* this, PlayState* play);
void func_80AF683C(EnSa* this, PlayState* play);
void func_80AF68E4(EnSa* this, PlayState* play);
void func_80AF6B20(EnSa* this, PlayState* play);
void EnSa_Idle(EnSa* this, PlayState* play);
void EnSa_TalkInForestMeadow(EnSa* this, PlayState* play);
void EnSa_AwaitTeachingSariasSong(EnSa* this, PlayState* play);
void EnSa_HandleCutscene(EnSa* this, PlayState* play);
void EnSa_BecomeIdle(EnSa* this, PlayState* play);
typedef enum SariaEyes {
/* 0 */ SARIA_EYE_OPEN,
@@ -41,10 +50,10 @@ typedef enum SariaEyes {
typedef enum SariaMouth {
/* 0 */ SARIA_MOUTH_CLOSED2,
/* 1 */ SARIA_MOUTH_SURPRISED,
/* 2 */ SARIA_MOUTH_CLOSED,
/* 3 */ SARIA_MOUTH_SMILING_OPEN,
/* 4 */ SARIA_MOUTH_FROWNING
/* 1 */ SARIA_MOUTH_SMILING_OPEN,
/* 2 */ SARIA_MOUTH_FROWNING,
/* 3 */ SARIA_MOUTH_SURPRISED,
/* 4 */ SARIA_MOUTH_CLOSED
} SariaMouth;
ActorProfile En_Sa_Profile = {
@@ -82,18 +91,18 @@ static ColliderCylinderInit sCylinderInit = {
static CollisionCheckInfoInit2 sColChkInfoInit = { 0, 0, 0, 0, MASS_IMMOVABLE };
typedef enum EnSaAnimation1 {
/* 0 */ ENSA_ANIM1_0,
/* 1 */ ENSA_ANIM1_1,
/* 2 */ ENSA_ANIM1_2,
/* 3 */ ENSA_ANIM1_3,
/* 4 */ ENSA_ANIM1_4,
/* 5 */ ENSA_ANIM1_5,
/* 6 */ ENSA_ANIM1_6,
/* 7 */ ENSA_ANIM1_7,
/* 8 */ ENSA_ANIM1_8,
/* 9 */ ENSA_ANIM1_9,
/* 10 */ ENSA_ANIM1_10,
/* 11 */ ENSA_ANIM1_11
/* 0 */ ENSA_ANIM1_WAIT_ARMS_TO_SIDE,
/* 1 */ ENSA_ANIM1_LOOK_UP_ARMS_EXTENDED,
/* 2 */ ENSA_ANIM1_WAVE,
/* 3 */ ENSA_ANIM1_RUN,
/* 4 */ ENSA_ANIM1_MOVE_ARMS_TO_SIDE,
/* 5 */ ENSA_ANIM1_LOOK_OVER_SHOULDER,
/* 6 */ ENSA_ANIM1_PLAYING_OCARINA,
/* 7 */ ENSA_ANIM1_STOP_PLAYING_OCARINA,
/* 8 */ ENSA_ANIM1_OCARINA_TO_MOUTH,
/* 9 */ ENSA_ANIM1_LINK_LEARNED_SARIAS_SONG,
/* 10 */ ENSA_ANIM1_RETURN_TO_OCARINA,
/* 11 */ ENSA_ANIM1_START_PLAYING_OCARINA
} EnSaAnimation1;
static AnimationFrameCountInfo sAnimationInfo1[] = {
@@ -112,16 +121,16 @@ static AnimationFrameCountInfo sAnimationInfo1[] = {
};
typedef enum EnSaAnimation2 {
/* 0 */ ENSA_ANIM2_0,
/* 1 */ ENSA_ANIM2_1,
/* 2 */ ENSA_ANIM2_2,
/* 3 */ ENSA_ANIM2_3,
/* 4 */ ENSA_ANIM2_4,
/* 5 */ ENSA_ANIM2_5,
/* 6 */ ENSA_ANIM2_6,
/* 7 */ ENSA_ANIM2_7,
/* 8 */ ENSA_ANIM2_8,
/* 9 */ ENSA_ANIM2_9
/* 0 */ ENSA_ANIM2_TRANS_HANDS_SIDE_CHEST_SIDE,
/* 1 */ ENSA_ANIM2_TRANS_HANDS_SIDE_TO_BACK,
/* 2 */ ENSA_ANIM2_RIGHT_ARM_EXTENDED_WAIT,
/* 3 */ ENSA_ANIM2_HANDS_OUT,
/* 4 */ ENSA_ANIM2_STAND_HANDS_ON_HIPS,
/* 5 */ ENSA_ANIM2_EXTEND_RIGHT_ARM,
/* 6 */ ENSA_ANIM2_TRANS_HANDS_SIDE_TO_HIPS,
/* 7 */ ENSA_ANIM2_BEHIND_BACK_WAIT,
/* 8 */ ENSA_ANIM2_HANDS_ON_FACE,
/* 9 */ ENSA_ANIM2_WAIT_ARMS_TO_SIDE
} EnSaAnimation2;
static AnimationInfo sAnimationInfo2[] = {
@@ -137,16 +146,27 @@ static AnimationInfo sAnimationInfo2[] = {
{ &gSariaWaitArmsToSideAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, -8.0f },
};
s16 func_80AF5560(EnSa* this, PlayState* play) {
typedef enum EnSaAnimGroup {
/* 0 */ ENSA_ANIMGROUP_NONE,
/* 1 */ ENSA_ANIMGROUP_EXTEND_RIGHT_HAND,
/* 2 */ ENSA_ANIMGROUP_HANDS_TO_FACE,
/* 3 */ ENSA_ANIMGROUP_HANDS_BEHIND_BACK,
/* 4 */ ENSA_ANIMGROUP_HANDS_OUT_FROM_BEHIND_BACK,
/* 5 */ ENSA_ANIMGROUP_HANDS_ON_HIPS,
/* 6 */ ENSA_ANIMGROUP_HANDS_OFF_HIPS,
/* 7 */ ENSA_ANIMGROUP_HAND_TO_CHEST
} EnSaAnimGroup;
s16 EnSa_UpdateTextState(EnSa* this, PlayState* play) {
s16 textState = Message_GetState(&play->msgCtx);
if (this->unk_209 == TEXT_STATE_AWAITING_NEXT || this->unk_209 == TEXT_STATE_EVENT ||
this->unk_209 == TEXT_STATE_CLOSING || this->unk_209 == TEXT_STATE_DONE_HAS_NEXT) {
if (textState != this->unk_209) {
this->unk_208++;
if (this->prevTextState == TEXT_STATE_AWAITING_NEXT || this->prevTextState == TEXT_STATE_EVENT ||
this->prevTextState == TEXT_STATE_CLOSING || this->prevTextState == TEXT_STATE_DONE_HAS_NEXT) {
if (textState != this->prevTextState) {
this->messageIndex++;
}
}
this->unk_209 = textState;
this->prevTextState = textState;
return textState;
}
@@ -161,27 +181,27 @@ u16 EnSa_GetTextId(PlayState* play, Actor* thisx) {
return 0x10AD;
}
if (CHECK_QUEST_ITEM(QUEST_KOKIRI_EMERALD)) {
this->unk_208 = 0;
this->unk_209 = TEXT_STATE_NONE;
if (GET_INFTABLE(INFTABLE_05)) {
this->messageIndex = 0;
this->prevTextState = TEXT_STATE_NONE;
if (GET_INFTABLE(INFTABLE_SARIA_SPOKE_IN_HER_HOUSE)) {
return 0x1048;
} else {
return 0x1047;
}
}
if (GET_EVENTCHKINF(EVENTCHKINF_MIDO_DENIED_DEKU_TREE_ACCESS)) {
this->unk_208 = 0;
this->unk_209 = TEXT_STATE_NONE;
if (GET_INFTABLE(INFTABLE_03)) {
this->messageIndex = 0;
this->prevTextState = TEXT_STATE_NONE;
if (GET_INFTABLE(INFTABLE_SARIA_WAS_TOLD_ABOUT_MIDO)) {
return 0x1032;
} else {
return 0x1031;
}
}
if (GET_INFTABLE(INFTABLE_00)) {
this->unk_208 = 0;
this->unk_209 = TEXT_STATE_NONE;
if (GET_INFTABLE(INFTABLE_01)) {
if (GET_INFTABLE(INFTABLE_SARIA_GREETED_LINK)) {
this->messageIndex = 0;
this->prevTextState = TEXT_STATE_NONE;
if (GET_INFTABLE(INFTABLE_SARIA_NOTICED_FAIRY)) {
return 0x1003;
} else {
return 0x1002;
@@ -194,20 +214,20 @@ s16 EnSa_UpdateTalkState(PlayState* play, Actor* thisx) {
s16 talkState = NPC_TALK_STATE_TALKING;
EnSa* this = (EnSa*)thisx;
switch (func_80AF5560(this, play)) {
switch (EnSa_UpdateTextState(this, play)) {
case TEXT_STATE_CLOSING:
switch (this->actor.textId) {
case 0x1002:
SET_INFTABLE(INFTABLE_01);
SET_INFTABLE(INFTABLE_SARIA_NOTICED_FAIRY);
talkState = NPC_TALK_STATE_IDLE;
break;
case 0x1031:
SET_EVENTCHKINF(EVENTCHKINF_03);
SET_INFTABLE(INFTABLE_03);
SET_EVENTCHKINF(EVENTCHKINF_SARIA_WAS_TOLD_ABOUT_MIDO);
SET_INFTABLE(INFTABLE_SARIA_WAS_TOLD_ABOUT_MIDO);
talkState = NPC_TALK_STATE_IDLE;
break;
case 0x1047:
SET_INFTABLE(INFTABLE_05);
SET_INFTABLE(INFTABLE_SARIA_SPOKE_IN_HER_HOUSE);
talkState = NPC_TALK_STATE_IDLE;
break;
default:
@@ -228,7 +248,7 @@ s16 EnSa_UpdateTalkState(PlayState* play, Actor* thisx) {
return talkState;
}
void func_80AF57D8(EnSa* this, PlayState* play) {
void EnSa_UpdateTalking(EnSa* this, PlayState* play) {
if (play->sceneId != SCENE_SACRED_FOREST_MEADOW ||
ABS((s16)(this->actor.yawTowardsPlayer - this->actor.shape.rot.y)) < 0x1555 ||
this->interactInfo.talkState != NPC_TALK_STATE_IDLE) {
@@ -237,7 +257,7 @@ void func_80AF57D8(EnSa* this, PlayState* play) {
}
}
f32 func_80AF5894(EnSa* this) {
f32 EnSa_ReverseAnimation(EnSa* this) {
f32 endFrame = this->skelAnime.endFrame;
f32 startFrame = this->skelAnime.startFrame;
@@ -248,140 +268,140 @@ f32 func_80AF5894(EnSa* this) {
return startFrame;
}
void func_80AF58B8(EnSa* this) {
switch (this->unk_20A) {
void EnSa_ExtendRightHand(EnSa* this) {
switch (this->animPhase) {
case 0:
Animation_ChangeByInfo(&this->skelAnime, sAnimationInfo2, ENSA_ANIM2_3);
this->unk_20A++;
Animation_ChangeByInfo(&this->skelAnime, sAnimationInfo2, ENSA_ANIM2_HANDS_OUT);
this->animPhase++;
FALLTHROUGH;
case 1:
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
Animation_ChangeByInfo(&this->skelAnime, sAnimationInfo2, ENSA_ANIM2_2);
this->unk_20A++;
Animation_ChangeByInfo(&this->skelAnime, sAnimationInfo2, ENSA_ANIM2_RIGHT_ARM_EXTENDED_WAIT);
this->animPhase++;
}
break;
}
}
void func_80AF594C(EnSa* this) {
switch (this->unk_20A) {
void EnSa_HandsToFace(EnSa* this) {
switch (this->animPhase) {
case 0:
Animation_ChangeByInfo(&this->skelAnime, sAnimationInfo2, ENSA_ANIM2_8);
this->unk_20A++;
Animation_ChangeByInfo(&this->skelAnime, sAnimationInfo2, ENSA_ANIM2_HANDS_ON_FACE);
this->animPhase++;
FALLTHROUGH;
case 1:
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
Animation_ChangeByInfo(&this->skelAnime, sAnimationInfo2, ENSA_ANIM2_9);
this->unk_20A++;
Animation_ChangeByInfo(&this->skelAnime, sAnimationInfo2, ENSA_ANIM2_WAIT_ARMS_TO_SIDE);
this->animPhase++;
}
break;
}
}
void func_80AF59E0(EnSa* this) {
switch (this->unk_20A) {
void EnSa_HandsBehindBack(EnSa* this) {
switch (this->animPhase) {
case 0:
Animation_ChangeByInfo(&this->skelAnime, sAnimationInfo2, ENSA_ANIM2_1);
this->unk_20A++;
Animation_ChangeByInfo(&this->skelAnime, sAnimationInfo2, ENSA_ANIM2_TRANS_HANDS_SIDE_TO_BACK);
this->animPhase++;
FALLTHROUGH;
case 1:
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
Animation_ChangeByInfo(&this->skelAnime, sAnimationInfo2, ENSA_ANIM2_7);
this->unk_20A++;
Animation_ChangeByInfo(&this->skelAnime, sAnimationInfo2, ENSA_ANIM2_BEHIND_BACK_WAIT);
this->animPhase++;
}
break;
}
}
void func_80AF5A74(EnSa* this) {
switch (this->unk_20A) {
void EnSa_HandsOutFromBehindBack(EnSa* this) {
switch (this->animPhase) {
case 0:
Animation_ChangeByInfo(&this->skelAnime, sAnimationInfo2, ENSA_ANIM2_1);
func_80AF5894(this);
this->unk_20A++;
Animation_ChangeByInfo(&this->skelAnime, sAnimationInfo2, ENSA_ANIM2_TRANS_HANDS_SIDE_TO_BACK);
EnSa_ReverseAnimation(this);
this->animPhase++;
FALLTHROUGH;
case 1:
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
Animation_ChangeByInfo(&this->skelAnime, sAnimationInfo2, ENSA_ANIM2_9);
this->unk_20A++;
Animation_ChangeByInfo(&this->skelAnime, sAnimationInfo2, ENSA_ANIM2_WAIT_ARMS_TO_SIDE);
this->animPhase++;
}
break;
}
}
void func_80AF5B10(EnSa* this) {
switch (this->unk_20A) {
void EnSa_HandsOnHips(EnSa* this) {
switch (this->animPhase) {
case 0:
Animation_ChangeByInfo(&this->skelAnime, sAnimationInfo2, ENSA_ANIM2_6);
this->unk_20A++;
Animation_ChangeByInfo(&this->skelAnime, sAnimationInfo2, ENSA_ANIM2_TRANS_HANDS_SIDE_TO_HIPS);
this->animPhase++;
FALLTHROUGH;
case 1:
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
Animation_ChangeByInfo(&this->skelAnime, sAnimationInfo2, ENSA_ANIM2_4);
this->unk_20A++;
Animation_ChangeByInfo(&this->skelAnime, sAnimationInfo2, ENSA_ANIM2_STAND_HANDS_ON_HIPS);
this->animPhase++;
}
break;
}
}
void func_80AF5BA4(EnSa* this) {
switch (this->unk_20A) {
void EnSa_HandsOffHips(EnSa* this) {
switch (this->animPhase) {
case 0:
Animation_ChangeByInfo(&this->skelAnime, sAnimationInfo2, ENSA_ANIM2_6);
func_80AF5894(this);
this->unk_20A++;
Animation_ChangeByInfo(&this->skelAnime, sAnimationInfo2, ENSA_ANIM2_TRANS_HANDS_SIDE_TO_HIPS);
EnSa_ReverseAnimation(this);
this->animPhase++;
FALLTHROUGH;
case 1:
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
Animation_ChangeByInfo(&this->skelAnime, sAnimationInfo2, ENSA_ANIM2_9);
this->unk_20A++;
Animation_ChangeByInfo(&this->skelAnime, sAnimationInfo2, ENSA_ANIM2_WAIT_ARMS_TO_SIDE);
this->animPhase++;
}
break;
}
}
void func_80AF5C40(EnSa* this) {
switch (this->unk_20A) {
void EnSa_HandToChest(EnSa* this) {
switch (this->animPhase) {
case 0:
Animation_ChangeByInfo(&this->skelAnime, sAnimationInfo2, ENSA_ANIM2_5);
this->unk_20A++;
Animation_ChangeByInfo(&this->skelAnime, sAnimationInfo2, ENSA_ANIM2_EXTEND_RIGHT_ARM);
this->animPhase++;
FALLTHROUGH;
case 1:
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
Animation_ChangeByInfo(&this->skelAnime, sAnimationInfo2, ENSA_ANIM2_0);
this->unk_20A++;
Animation_ChangeByInfo(&this->skelAnime, sAnimationInfo2, ENSA_ANIM2_TRANS_HANDS_SIDE_CHEST_SIDE);
this->animPhase++;
}
break;
}
}
void func_80AF5CD4(EnSa* this, u8 arg1) {
this->unk_20B = arg1;
this->unk_20A = 0;
void EnSa_SetAnimGroup(EnSa* this, u8 animGroup) {
this->animGroup = animGroup;
this->animPhase = 0;
}
void func_80AF5CE4(EnSa* this) {
switch (this->unk_20B) {
case 1:
func_80AF58B8(this);
void EnSa_Animate(EnSa* this) {
switch (this->animGroup) {
case ENSA_ANIMGROUP_EXTEND_RIGHT_HAND:
EnSa_ExtendRightHand(this);
break;
case 2:
func_80AF594C(this);
case ENSA_ANIMGROUP_HANDS_TO_FACE:
EnSa_HandsToFace(this);
break;
case 3:
func_80AF59E0(this);
case ENSA_ANIMGROUP_HANDS_BEHIND_BACK:
EnSa_HandsBehindBack(this);
break;
case 4:
func_80AF5A74(this);
case ENSA_ANIMGROUP_HANDS_OUT_FROM_BEHIND_BACK:
EnSa_HandsOutFromBehindBack(this);
break;
case 5:
func_80AF5B10(this);
case ENSA_ANIMGROUP_HANDS_ON_HIPS:
EnSa_HandsOnHips(this);
break;
case 6:
func_80AF5BA4(this);
case ENSA_ANIMGROUP_HANDS_OFF_HIPS:
EnSa_HandsOffHips(this);
break;
case 7:
func_80AF5C40(this);
case ENSA_ANIMGROUP_HAND_TO_CHEST:
EnSa_HandToChest(this);
break;
}
}
@@ -392,46 +412,46 @@ void EnSa_ChangeAnim(EnSa* this, s32 index) {
sAnimationInfo1[index].morphFrames);
}
s32 func_80AF5DFC(EnSa* this, PlayState* play) {
SariaType EnSa_GetType(EnSa* this, PlayState* play) {
if (gSaveContext.save.cutsceneIndex >= CS_INDEX_0 && gSaveContext.save.cutsceneIndex != CS_INDEX_D) {
if (play->sceneId == SCENE_KOKIRI_FOREST) {
return 4;
return SARIA_TYPE_GREETING;
}
if (play->sceneId == SCENE_SACRED_FOREST_MEADOW) {
return 5;
return SARIA_TYPE_MEADOW_WAITING;
}
}
if (play->sceneId == SCENE_SARIAS_HOUSE && !LINK_IS_ADULT &&
INV_CONTENT(ITEM_OCARINA_FAIRY) == ITEM_OCARINA_FAIRY && !GET_EVENTCHKINF(EVENTCHKINF_40)) {
return 1;
return SARIA_TYPE_STANDING;
}
if (play->sceneId == SCENE_SACRED_FOREST_MEADOW && GET_EVENTCHKINF(EVENTCHKINF_40)) {
return CHECK_QUEST_ITEM(QUEST_SONG_SARIA) ? 2 : 5;
return CHECK_QUEST_ITEM(QUEST_SONG_SARIA) ? SARIA_TYPE_MEADOW_PLAYING : SARIA_TYPE_MEADOW_WAITING;
}
if (play->sceneId == SCENE_KOKIRI_FOREST && !CHECK_QUEST_ITEM(QUEST_KOKIRI_EMERALD)) {
if (GET_INFTABLE(INFTABLE_00)) {
return 1;
if (GET_INFTABLE(INFTABLE_SARIA_GREETED_LINK)) {
return SARIA_TYPE_STANDING;
}
return 4;
return SARIA_TYPE_GREETING;
}
return 0;
return SARIA_TYPE_NONE;
}
void func_80AF5F34(EnSa* this, PlayState* play) {
void EnSa_UpdateTrackingMode(EnSa* this, PlayState* play) {
Player* player = GET_PLAYER(play);
s16 trackingMode = NPC_TRACKING_PLAYER_AUTO_TURN;
if (play->sceneId == SCENE_KOKIRI_FOREST) {
trackingMode = (this->actionFunc == func_80AF68E4) ? NPC_TRACKING_NONE : NPC_TRACKING_FULL_BODY;
trackingMode = (this->actionFunc == EnSa_HandleCutscene) ? NPC_TRACKING_NONE : NPC_TRACKING_FULL_BODY;
}
if (play->sceneId == SCENE_SACRED_FOREST_MEADOW) {
trackingMode = (this->skelAnime.animation == &gSariaPlayingOcarinaAnim) ? NPC_TRACKING_NONE : NPC_TRACKING_HEAD;
}
if (play->sceneId == SCENE_SACRED_FOREST_MEADOW && this->actionFunc == func_80AF6448 &&
if (play->sceneId == SCENE_SACRED_FOREST_MEADOW && this->actionFunc == EnSa_Idle &&
this->skelAnime.animation == &gSariaStopPlayingOcarinaAnim) {
trackingMode = NPC_TRACKING_NONE;
}
if (play->sceneId == SCENE_SACRED_FOREST_MEADOW && this->actionFunc == func_80AF68E4 &&
if (play->sceneId == SCENE_SACRED_FOREST_MEADOW && this->actionFunc == EnSa_HandleCutscene &&
this->skelAnime.animation == &gSariaOcarinaToMouthAnim) {
trackingMode = NPC_TRACKING_NONE;
}
@@ -440,37 +460,37 @@ void func_80AF5F34(EnSa* this, PlayState* play) {
Npc_TrackPoint(&this->actor, &this->interactInfo, 2, trackingMode);
}
s32 func_80AF603C(EnSa* this) {
s32 EnSa_EyesStayClosed(EnSa* this) {
if (this->skelAnime.animation != &gSariaPlayingOcarinaAnim &&
this->skelAnime.animation != &gSariaOcarinaToMouthAnim) {
return 0;
return false;
}
if (this->interactInfo.talkState != NPC_TALK_STATE_IDLE) {
return 0;
return false;
}
this->unk_20E = 0;
this->blinkTimer = 0;
if (this->rightEyeIndex != SARIA_EYE_CLOSED) {
return 0;
return false;
}
return 1;
return true;
}
void func_80AF609C(EnSa* this) {
s16 phi_v1;
void EnSa_Blink(EnSa* this) {
s16 blinkTimer;
if (func_80AF603C(this) == 0) {
if (this->unk_20E == 0) {
phi_v1 = 0;
if (!EnSa_EyesStayClosed(this)) {
if (this->blinkTimer == 0) {
blinkTimer = 0;
} else {
this->unk_20E--;
phi_v1 = this->unk_20E;
this->blinkTimer--;
blinkTimer = this->blinkTimer;
}
if (phi_v1 == 0) {
if (blinkTimer == 0) {
this->rightEyeIndex++;
if (this->rightEyeIndex < SARIA_EYE_SURPRISED) {
this->leftEyeIndex = this->rightEyeIndex;
} else {
this->unk_20E = Rand_S16Offset(30, 30);
this->blinkTimer = Rand_S16Offset(30, 30);
this->leftEyeIndex = SARIA_EYE_OPEN;
this->rightEyeIndex = this->leftEyeIndex;
}
@@ -478,13 +498,13 @@ void func_80AF609C(EnSa* this) {
}
}
void func_80AF6130(CsCmdActorCue* cue, Vec3f* dst) {
void EnSa_CopyCueStartPos(CsCmdActorCue* cue, Vec3f* dst) {
dst->x = cue->startPos.x;
dst->y = cue->startPos.y;
dst->z = cue->startPos.z;
}
void func_80AF6170(CsCmdActorCue* cue, Vec3f* dst) {
void EnSa_CopyCueEndPos(CsCmdActorCue* cue, Vec3f* dst) {
dst->x = cue->endPos.x;
dst->y = cue->endPos.y;
dst->z = cue->endPos.z;
@@ -500,35 +520,35 @@ void EnSa_Init(Actor* thisx, PlayState* play) {
Collider_SetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
CollisionCheck_SetInfo2(&this->actor.colChkInfo, NULL, &sColChkInfoInit);
switch (func_80AF5DFC(this, play)) {
case 2:
EnSa_ChangeAnim(this, ENSA_ANIM1_11);
this->actionFunc = func_80AF6448;
switch (EnSa_GetType(this, play)) {
case SARIA_TYPE_MEADOW_PLAYING:
EnSa_ChangeAnim(this, ENSA_ANIM1_START_PLAYING_OCARINA);
this->actionFunc = EnSa_Idle;
break;
case 5:
EnSa_ChangeAnim(this, ENSA_ANIM1_11);
this->actionFunc = func_80AF683C;
case SARIA_TYPE_MEADOW_WAITING:
EnSa_ChangeAnim(this, ENSA_ANIM1_START_PLAYING_OCARINA);
this->actionFunc = EnSa_AwaitTeachingSariasSong;
break;
case 1:
case SARIA_TYPE_STANDING:
this->actor.gravity = -1.0f;
EnSa_ChangeAnim(this, ENSA_ANIM1_0);
this->actionFunc = func_80AF6448;
EnSa_ChangeAnim(this, ENSA_ANIM1_WAIT_ARMS_TO_SIDE);
this->actionFunc = EnSa_Idle;
break;
case 4:
this->unk_210 = 0;
case SARIA_TYPE_GREETING:
this->cueId = 0;
this->actor.gravity = -1.0f;
play->csCtx.script = SEGMENTED_TO_VIRTUAL(gKokiriForestSariaGreetingCs);
gSaveContext.cutsceneTrigger = 1;
EnSa_ChangeAnim(this, ENSA_ANIM1_4);
this->actionFunc = func_80AF68E4;
EnSa_ChangeAnim(this, ENSA_ANIM1_MOVE_ARMS_TO_SIDE);
this->actionFunc = EnSa_HandleCutscene;
break;
case 3:
this->unk_210 = 0;
case SARIA_TYPE_UNUSED:
this->cueId = 0;
this->actor.gravity = -1.0f;
EnSa_ChangeAnim(this, ENSA_ANIM1_0);
this->actionFunc = func_80AF68E4;
EnSa_ChangeAnim(this, ENSA_ANIM1_WAIT_ARMS_TO_SIDE);
this->actionFunc = EnSa_HandleCutscene;
break;
case 0:
case SARIA_TYPE_NONE:
Actor_Kill(&this->actor);
return;
}
@@ -538,7 +558,7 @@ void EnSa_Init(Actor* thisx, PlayState* play) {
this->actor.attentionRangeType = ATTENTION_RANGE_6;
this->interactInfo.talkState = NPC_TALK_STATE_IDLE;
this->alpha = 255;
this->unk_21A = this->actor.shape.rot;
this->initRot = this->actor.shape.rot;
Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, ACTOR_EN_ELF, this->actor.world.pos.x,
this->actor.world.pos.y, this->actor.world.pos.z, 0, 0, 0, FAIRY_KOKIRI);
@@ -550,163 +570,163 @@ void EnSa_Destroy(Actor* thisx, PlayState* play) {
Collider_DestroyCylinder(play, &this->collider);
}
void func_80AF6448(EnSa* this, PlayState* play) {
void EnSa_Idle(EnSa* this, PlayState* play) {
if (play->sceneId == SCENE_KOKIRI_FOREST) {
if (this->interactInfo.talkState != NPC_TALK_STATE_IDLE) {
switch (this->actor.textId) {
case 0x1002:
if (this->unk_208 == 0 && this->unk_20B != 1) {
func_80AF5CD4(this, 1);
this->mouthIndex = 1;
if (this->messageIndex == 0 && this->animGroup != ENSA_ANIMGROUP_EXTEND_RIGHT_HAND) {
EnSa_SetAnimGroup(this, ENSA_ANIMGROUP_EXTEND_RIGHT_HAND);
this->mouthIndex = SARIA_MOUTH_SMILING_OPEN;
}
if (this->unk_208 == 2 && this->unk_20B != 2) {
func_80AF5CD4(this, 2);
this->mouthIndex = 1;
if (this->messageIndex == 2 && this->animGroup != ENSA_ANIMGROUP_HANDS_TO_FACE) {
EnSa_SetAnimGroup(this, ENSA_ANIMGROUP_HANDS_TO_FACE);
this->mouthIndex = SARIA_MOUTH_SMILING_OPEN;
}
if (this->unk_208 == 5) {
this->mouthIndex = 0;
if (this->messageIndex == 5) {
this->mouthIndex = SARIA_MOUTH_CLOSED2;
}
break;
case 0x1003:
if (this->unk_208 == 0 && this->unk_20B != 4) {
func_80AF5CD4(this, 4);
if (this->messageIndex == 0 && this->animGroup != ENSA_ANIMGROUP_HANDS_OUT_FROM_BEHIND_BACK) {
EnSa_SetAnimGroup(this, ENSA_ANIMGROUP_HANDS_OUT_FROM_BEHIND_BACK);
}
break;
case 0x1031:
if (this->unk_208 == 0 && this->unk_20B != 4 &&
if (this->messageIndex == 0 && this->animGroup != ENSA_ANIMGROUP_HANDS_OUT_FROM_BEHIND_BACK &&
this->skelAnime.animation == &gSariaHandsBehindBackWaitAnim) {
func_80AF5CD4(this, 4);
this->mouthIndex = 3;
EnSa_SetAnimGroup(this, ENSA_ANIMGROUP_HANDS_OUT_FROM_BEHIND_BACK);
this->mouthIndex = SARIA_MOUTH_SURPRISED;
}
if (this->unk_208 == 2 && this->unk_20B != 5) {
func_80AF5CD4(this, 5);
this->mouthIndex = 2;
if (this->messageIndex == 2 && this->animGroup != ENSA_ANIMGROUP_HANDS_ON_HIPS) {
EnSa_SetAnimGroup(this, ENSA_ANIMGROUP_HANDS_ON_HIPS);
this->mouthIndex = SARIA_MOUTH_FROWNING;
}
if (this->unk_208 == 4 && this->unk_20B != 6) {
func_80AF5CD4(this, 6);
this->mouthIndex = 0;
if (this->messageIndex == 4 && this->animGroup != ENSA_ANIMGROUP_HANDS_OFF_HIPS) {
EnSa_SetAnimGroup(this, ENSA_ANIMGROUP_HANDS_OFF_HIPS);
this->mouthIndex = SARIA_MOUTH_CLOSED2;
}
break;
case 0x1032:
if (this->unk_208 == 0 && this->unk_20B != 4 &&
if (this->messageIndex == 0 && this->animGroup != ENSA_ANIMGROUP_HANDS_OUT_FROM_BEHIND_BACK &&
this->skelAnime.animation == &gSariaHandsBehindBackWaitAnim) {
func_80AF5CD4(this, 4);
EnSa_SetAnimGroup(this, ENSA_ANIMGROUP_HANDS_OUT_FROM_BEHIND_BACK);
}
break;
case 0x1047:
if (this->unk_208 == 1 && this->unk_20B != 7) {
func_80AF5CD4(this, 7);
if (this->messageIndex == 1 && this->animGroup != ENSA_ANIMGROUP_HAND_TO_CHEST) {
EnSa_SetAnimGroup(this, ENSA_ANIMGROUP_HAND_TO_CHEST);
}
break;
case 0x1048:
if (this->unk_208 == 0 && this->unk_20B != 7) {
func_80AF5CD4(this, 7);
if (this->messageIndex == 0 && this->animGroup != ENSA_ANIMGROUP_HAND_TO_CHEST) {
EnSa_SetAnimGroup(this, ENSA_ANIMGROUP_HAND_TO_CHEST);
}
break;
}
} else if (!CHECK_QUEST_ITEM(QUEST_KOKIRI_EMERALD) &&
(GET_INFTABLE(INFTABLE_01) || GET_INFTABLE(INFTABLE_03))) {
if (this->unk_20B != 3) {
func_80AF5CD4(this, 3);
(GET_INFTABLE(INFTABLE_SARIA_NOTICED_FAIRY) || GET_INFTABLE(INFTABLE_SARIA_WAS_TOLD_ABOUT_MIDO))) {
if (this->animGroup != ENSA_ANIMGROUP_HANDS_BEHIND_BACK) {
EnSa_SetAnimGroup(this, ENSA_ANIMGROUP_HANDS_BEHIND_BACK);
}
} else {
func_80AF5CD4(this, 0);
EnSa_SetAnimGroup(this, ENSA_ANIMGROUP_NONE);
}
func_80AF5CE4(this);
EnSa_Animate(this);
}
if (this->skelAnime.animation == &gSariaStopPlayingOcarinaAnim) {
this->skelAnime.playSpeed = -1.0f;
if ((s32)this->skelAnime.curFrame == 0) {
EnSa_ChangeAnim(this, ENSA_ANIM1_6);
EnSa_ChangeAnim(this, ENSA_ANIM1_PLAYING_OCARINA);
}
}
if (this->interactInfo.talkState != NPC_TALK_STATE_IDLE && play->sceneId == SCENE_SACRED_FOREST_MEADOW) {
Animation_Change(&this->skelAnime, &gSariaStopPlayingOcarinaAnim, 1.0f, 0.0f, 10.0f, ANIMMODE_ONCE, -10.0f);
this->actionFunc = func_80AF67D0;
this->actionFunc = EnSa_TalkInForestMeadow;
}
}
void func_80AF67D0(EnSa* this, PlayState* play) {
void EnSa_TalkInForestMeadow(EnSa* this, PlayState* play) {
if (this->interactInfo.talkState != NPC_TALK_STATE_IDLE) {
return;
}
Animation_Change(&this->skelAnime, &gSariaStopPlayingOcarinaAnim, 0.0f, 10.0f, 0.0f, ANIMMODE_ONCE, -10.0f);
this->actionFunc = func_80AF6448;
this->actionFunc = EnSa_Idle;
}
void func_80AF683C(EnSa* this, PlayState* play) {
void EnSa_AwaitTeachingSariasSong(EnSa* this, PlayState* play) {
Player* player = GET_PLAYER(play);
if (!(player->actor.world.pos.z >= -2220.0f) && !Play_InCsMode(play)) {
play->csCtx.script = SEGMENTED_TO_VIRTUAL(gMeadowSariasSongCs);
gSaveContext.cutsceneTrigger = 1;
this->actionFunc = func_80AF68E4;
this->actionFunc = EnSa_HandleCutscene;
}
}
void func_80AF68E4(EnSa* this, PlayState* play) {
s16 phi_v0;
void EnSa_HandleCutscene(EnSa* this, PlayState* play) {
s16 stepTimer;
Vec3f startPos;
Vec3f endPos;
Vec3f D_80AF7448 = { 0.0f, 0.0f, 0.0f };
Vec3f zeroVec = { 0.0f, 0.0f, 0.0f };
CsCmdActorCue* cue;
f32 temp_f0;
f32 duration;
f32 gravity;
if (play->csCtx.state == CS_STATE_IDLE) {
this->actionFunc = func_80AF6B20;
this->actionFunc = EnSa_BecomeIdle;
return;
}
cue = play->csCtx.actorCues[1];
if (cue != NULL) {
func_80AF6130(cue, &startPos);
func_80AF6170(cue, &endPos);
EnSa_CopyCueStartPos(cue, &startPos);
EnSa_CopyCueEndPos(cue, &endPos);
if (this->unk_210 == 0) {
if (this->cueId == 0) {
this->actor.world.pos = startPos;
}
if (this->unk_210 != cue->id) {
if (this->cueId != cue->id) {
switch (cue->id) {
case 2:
this->mouthIndex = 1;
this->mouthIndex = SARIA_MOUTH_SMILING_OPEN;
break;
case 9:
this->mouthIndex = 1;
this->mouthIndex = SARIA_MOUTH_SMILING_OPEN;
break;
default:
this->mouthIndex = 0;
this->mouthIndex = SARIA_MOUTH_CLOSED2;
break;
}
EnSa_ChangeAnim(this, cue->id);
this->unk_210 = cue->id;
this->cueId = cue->id;
}
if (phi_v0) {}
if (stepTimer) {}
if (cue->id == 3) {
if (this->unk_20C == 0) {
phi_v0 = 0;
if (this->stepTimer == 0) {
stepTimer = 0;
} else {
this->unk_20C--;
phi_v0 = this->unk_20C;
this->stepTimer--;
stepTimer = this->stepTimer;
}
if (phi_v0 == 0) {
if (stepTimer == 0) {
SFX_PLAY_AT_POS(&this->actor.projectedPos, NA_SE_PL_WALK_GROUND + SURFACE_SFX_OFFSET_DIRT);
this->unk_20C = 8;
this->stepTimer = 8;
}
}
this->actor.shape.rot.x = cue->rot.x;
this->actor.shape.rot.y = cue->rot.y;
this->actor.shape.rot.z = cue->rot.z;
this->actor.velocity = D_80AF7448;
this->actor.velocity = zeroVec;
if (play->csCtx.curFrame < cue->endFrame) {
temp_f0 = cue->endFrame - cue->startFrame;
this->actor.velocity.x = (endPos.x - startPos.x) / temp_f0;
this->actor.velocity.y = (endPos.y - startPos.y) / temp_f0;
duration = cue->endFrame - cue->startFrame;
this->actor.velocity.x = (endPos.x - startPos.x) / duration;
this->actor.velocity.y = (endPos.y - startPos.y) / duration;
gravity = this->actor.gravity;
if (play->sceneId == SCENE_SACRED_FOREST_MEADOW) {
gravity = 0.0f;
@@ -715,26 +735,26 @@ void func_80AF68E4(EnSa* this, PlayState* play) {
if (this->actor.velocity.y < this->actor.minVelocityY) {
this->actor.velocity.y = this->actor.minVelocityY;
}
this->actor.velocity.z = (endPos.z - startPos.z) / temp_f0;
this->actor.velocity.z = (endPos.z - startPos.z) / duration;
}
}
}
void func_80AF6B20(EnSa* this, PlayState* play) {
void EnSa_BecomeIdle(EnSa* this, PlayState* play) {
if (play->sceneId == SCENE_SACRED_FOREST_MEADOW) {
Item_Give(play, ITEM_SONG_SARIA);
EnSa_ChangeAnim(this, ENSA_ANIM1_6);
EnSa_ChangeAnim(this, ENSA_ANIM1_PLAYING_OCARINA);
}
if (play->sceneId == SCENE_KOKIRI_FOREST) {
EnSa_ChangeAnim(this, ENSA_ANIM1_4);
EnSa_ChangeAnim(this, ENSA_ANIM1_MOVE_ARMS_TO_SIDE);
this->actor.world.pos = this->actor.home.pos;
this->actor.world.rot = this->unk_21A;
this->mouthIndex = 0;
SET_INFTABLE(INFTABLE_00);
this->actor.world.rot = this->initRot;
this->mouthIndex = SARIA_MOUTH_CLOSED2;
SET_INFTABLE(INFTABLE_SARIA_GREETED_LINK);
}
this->actionFunc = func_80AF6448;
this->actionFunc = EnSa_Idle;
}
void EnSa_Update(Actor* thisx, PlayState* play) {
@@ -747,10 +767,10 @@ void EnSa_Update(Actor* thisx, PlayState* play) {
if (this->skelAnime.animation == &gSariaOcarinaToMouthAnim &&
this->skelAnime.curFrame >= Animation_GetLastFrame(&gSariaOcarinaToMouthAnim)) {
EnSa_ChangeAnim(this, ENSA_ANIM1_6);
EnSa_ChangeAnim(this, ENSA_ANIM1_PLAYING_OCARINA);
}
if (this->actionFunc != func_80AF68E4) {
if (this->actionFunc != EnSa_HandleCutscene) {
this->alpha = Actor_UpdateAlphaByDistance(&this->actor, play, this->alpha, 400.0f);
} else {
this->alpha = 255;
@@ -758,7 +778,7 @@ void EnSa_Update(Actor* thisx, PlayState* play) {
this->actor.shape.shadowAlpha = this->alpha;
if (this->actionFunc == func_80AF68E4) {
if (this->actionFunc == EnSa_HandleCutscene) {
this->actor.world.pos.x += this->actor.velocity.x;
this->actor.world.pos.y += this->actor.velocity.y;
this->actor.world.pos.z += this->actor.velocity.z;
@@ -770,10 +790,10 @@ void EnSa_Update(Actor* thisx, PlayState* play) {
Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, UPDBGCHECKINFO_FLAG_2);
}
func_80AF609C(this);
EnSa_Blink(this);
this->actionFunc(this, play);
func_80AF57D8(this, play);
func_80AF5F34(this, play);
EnSa_UpdateTalking(this, play);
EnSa_UpdateTrackingMode(this, play);
}
s32 EnSa_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, void* thisx, Gfx** gfx) {
@@ -804,10 +824,10 @@ s32 EnSa_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* po
void EnSa_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, void* thisx, Gfx** gfx) {
EnSa* this = (EnSa*)thisx;
Vec3f D_80AF7454 = { 400.0, 0.0f, 0.0f };
Vec3f focusOffset = { 400.0, 0.0f, 0.0f };
if (limbIndex == 16) {
Matrix_MultVec3f(&D_80AF7454, &this->actor.focus.pos);
Matrix_MultVec3f(&focusOffset, &this->actor.focus.pos);
}
}
+8 -8
View File
@@ -14,18 +14,18 @@ typedef struct EnSa {
/* 0x0190 */ EnSaActionFunc actionFunc;
/* 0x0194 */ ColliderCylinder collider;
/* 0x01E0 */ NpcInteractInfo interactInfo;
/* 0x0208 */ u8 unk_208;
/* 0x0209 */ u8 unk_209;
/* 0x020A */ u8 unk_20A;
/* 0x020B */ u8 unk_20B;
/* 0x020C */ s16 unk_20C;
/* 0x020E */ s16 unk_20E;
/* 0x0210 */ s16 unk_210;
/* 0x0208 */ u8 messageIndex;
/* 0x0209 */ u8 prevTextState;
/* 0x020A */ u8 animPhase;
/* 0x020B */ u8 animGroup;
/* 0x020C */ s16 stepTimer;
/* 0x020E */ s16 blinkTimer;
/* 0x0210 */ s16 cueId;
/* 0x0212 */ s16 rightEyeIndex;
/* 0x0214 */ s16 leftEyeIndex;
/* 0x0216 */ s16 mouthIndex;
/* 0x0218 */ s16 alpha;
/* 0x021A */ Vec3s unk_21A;
/* 0x021A */ Vec3s initRot;
/* 0x0220 */ Vec3s jointTable[17];
/* 0x0286 */ Vec3s morphTable[17];
} EnSa; // size = 0x02EC