Hookify DisableKokiriDrawDistance (#6305)

Also update some of Mido's code with latest decomp

Looking at decomp, EnKo doesn't set appearDist to 180.0
This commit is contained in:
Philip Dubé
2026-03-02 02:10:04 +00:00
committed by GitHub
parent 0d41af6978
commit d4c1118d1b
7 changed files with 149 additions and 150 deletions

View File

@@ -0,0 +1,10 @@
#include "soh/Enhancements/game-interactor/GameInteractor.h"
#include "soh/ShipInit.hpp"
void RegisterDisableKokiriDrawDistance() {
COND_VB_SHOULD(VB_FADE_KOKIRI, CVarGetInteger(CVAR_ENHANCEMENT("DisableKokiriDrawDistance"), 0),
{ *should = false; });
}
static RegisterShipInitFunc initFunc(RegisterDisableKokiriDrawDistance,
{ CVAR_ENHANCEMENT("DisableKokiriDrawDistance") });

View File

@@ -594,6 +594,14 @@ typedef enum {
// - `int32_t` (startMode) // - `int32_t` (startMode)
VB_EXECUTE_PLAYER_STARTMODE_FUNC, VB_EXECUTE_PLAYER_STARTMODE_FUNC,
// #### `result`
// ```c
// true
// ```
// #### `args`
// - `*Actor`
VB_FADE_KOKIRI,
// #### `result` // #### `result`
// ```c // ```c
// true // true

View File

@@ -710,7 +710,7 @@ void SohMenu::AddMenuEnhancements() {
}) })
.Options(IntSliderOptions().Min(1).Max(5).DefaultValue(1).Format("%dx").Tooltip( .Options(IntSliderOptions().Min(1).Max(5).DefaultValue(1).Format("%dx").Tooltip(
"Increases the range in which Actors/Objects are drawn.")); "Increases the range in which Actors/Objects are drawn."));
AddWidget(path, "Kokiri Draw Distance", WIDGET_CVAR_CHECKBOX) AddWidget(path, "Disable Kokiri Fade", WIDGET_CVAR_CHECKBOX)
.CVar(CVAR_ENHANCEMENT("DisableKokiriDrawDistance")) .CVar(CVAR_ENHANCEMENT("DisableKokiriDrawDistance"))
.RaceDisable(false) .RaceDisable(false)
.PreFunc( .PreFunc(

View File

@@ -1078,21 +1078,15 @@ void func_80A98DB4(EnKo* this, PlayState* play) {
this->modelAlpha = 255.0f; this->modelAlpha = 255.0f;
return; return;
} }
if (play->csCtx.state != 0 || gDbgCamEnabled != 0) { if ((play->csCtx.state != CS_STATE_IDLE) || gDbgCamEnabled) {
dist = Math_Vec3f_DistXYZ(&this->actor.world.pos, &play->view.eye) * 0.25f; dist = Math_Vec3f_DistXYZ(&this->actor.world.pos, &play->view.eye) * 0.25f;
} else { } else {
dist = this->actor.xzDistToPlayer; dist = this->actor.xzDistToPlayer;
} }
if (CVarGetInteger(CVAR_ENHANCEMENT("DisableKokiriDrawDistance"), 0) != 0) { Math_SmoothStepToF(&this->modelAlpha,
this->appearDist = 32767.0f; GameInteractor_Should(VB_FADE_KOKIRI, this->appearDist < dist, this) ? 0.0f : 255.0f, 0.3f,
Math_SmoothStepToF(&this->modelAlpha, (this->appearDist < dist) ? 0.0f : 255.0f, 0.3f, 40.0f, 1.0f); 40.0f, 1.0f);
f32 test = this->appearDist;
} else {
this->appearDist = 180.0f;
Math_SmoothStepToF(&this->modelAlpha, (this->appearDist < dist) ? 0.0f : 255.0f, 0.3f, 40.0f, 1.0f);
}
if (this->modelAlpha < 10.0f) { if (this->modelAlpha < 10.0f) {
this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED;
} else { } else {

View File

@@ -19,11 +19,11 @@ void EnMd_Destroy(Actor* thisx, PlayState* play);
void EnMd_Update(Actor* thisx, PlayState* play); void EnMd_Update(Actor* thisx, PlayState* play);
void EnMd_Draw(Actor* thisx, PlayState* play); void EnMd_Draw(Actor* thisx, PlayState* play);
void func_80AAB874(EnMd* this, PlayState* play); void EnMd_Idle(EnMd* this, PlayState* play);
void func_80AAB8F8(EnMd* this, PlayState* play); void EnMd_Watch(EnMd* this, PlayState* play);
void func_80AAB948(EnMd* this, PlayState* play); void EnMd_BlockPath(EnMd* this, PlayState* play);
void func_80AABC10(EnMd* this, PlayState* play); void EnMd_ListenToOcarina(EnMd* this, PlayState* play);
void func_80AABD0C(EnMd* this, PlayState* play); void EnMd_Walk(EnMd* this, PlayState* play);
const ActorInit En_Md_InitVars = { const ActorInit En_Md_InitVars = {
ACTOR_EN_MD, ACTOR_EN_MD,
@@ -105,166 +105,166 @@ void func_80AAA250(EnMd* this) {
} }
void func_80AAA274(EnMd* this) { void func_80AAA274(EnMd* this) {
switch (this->unk_20A) { switch (this->animSequenceEntry) {
case 0: case 0:
Animation_ChangeByInfo(&this->skelAnime, sAnimationInfo, ENMD_ANIM_2); Animation_ChangeByInfo(&this->skelAnime, sAnimationInfo, ENMD_ANIM_2);
this->unk_20A++; this->animSequenceEntry++;
case 1: case 1:
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) { if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
Animation_ChangeByInfo(&this->skelAnime, sAnimationInfo, ENMD_ANIM_3); Animation_ChangeByInfo(&this->skelAnime, sAnimationInfo, ENMD_ANIM_3);
this->unk_20A++; this->animSequenceEntry++;
} }
} }
} }
void func_80AAA308(EnMd* this) { void func_80AAA308(EnMd* this) {
switch (this->unk_20A) { switch (this->animSequenceEntry) {
case 0: case 0:
Animation_ChangeByInfo(&this->skelAnime, sAnimationInfo, ENMD_ANIM_4); Animation_ChangeByInfo(&this->skelAnime, sAnimationInfo, ENMD_ANIM_4);
this->unk_20A++; this->animSequenceEntry++;
case 1: case 1:
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) { if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
Animation_ChangeByInfo(&this->skelAnime, sAnimationInfo, ENMD_ANIM_5); Animation_ChangeByInfo(&this->skelAnime, sAnimationInfo, ENMD_ANIM_5);
this->unk_20A++; this->animSequenceEntry++;
} }
} }
} }
void func_80AAA39C(EnMd* this) { void func_80AAA39C(EnMd* this) {
switch (this->unk_20A) { switch (this->animSequenceEntry) {
case 0: case 0:
Animation_ChangeByInfo(&this->skelAnime, sAnimationInfo, ENMD_ANIM_2); Animation_ChangeByInfo(&this->skelAnime, sAnimationInfo, ENMD_ANIM_2);
func_80AAA250(this); func_80AAA250(this);
this->unk_20A++; this->animSequenceEntry++;
case 1: case 1:
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) { if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
Animation_ChangeByInfo(&this->skelAnime, sAnimationInfo, ENMD_ANIM_7); Animation_ChangeByInfo(&this->skelAnime, sAnimationInfo, ENMD_ANIM_7);
this->unk_20A++; this->animSequenceEntry++;
} else { } else {
break; break;
} }
case 2: case 2:
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) { if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
Animation_ChangeByInfo(&this->skelAnime, sAnimationInfo, ENMD_ANIM_8); Animation_ChangeByInfo(&this->skelAnime, sAnimationInfo, ENMD_ANIM_8);
this->unk_20A++; this->animSequenceEntry++;
} }
} }
} }
void func_80AAA474(EnMd* this) { void func_80AAA474(EnMd* this) {
switch (this->unk_20A) { switch (this->animSequenceEntry) {
case 0: case 0:
Animation_ChangeByInfo(&this->skelAnime, sAnimationInfo, ENMD_ANIM_7); Animation_ChangeByInfo(&this->skelAnime, sAnimationInfo, ENMD_ANIM_7);
this->unk_20A++; this->animSequenceEntry++;
case 1: case 1:
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) { if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
Animation_ChangeByInfo(&this->skelAnime, sAnimationInfo, ENMD_ANIM_10); Animation_ChangeByInfo(&this->skelAnime, sAnimationInfo, ENMD_ANIM_10);
this->unk_20A++; this->animSequenceEntry++;
} }
} }
} }
void func_80AAA508(EnMd* this) { void func_80AAA508(EnMd* this) {
switch (this->unk_20A) { switch (this->animSequenceEntry) {
case 0: case 0:
Animation_ChangeByInfo(&this->skelAnime, sAnimationInfo, ENMD_ANIM_2); Animation_ChangeByInfo(&this->skelAnime, sAnimationInfo, ENMD_ANIM_2);
func_80AAA250(this); func_80AAA250(this);
this->unk_20A++; this->animSequenceEntry++;
case 1: case 1:
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) { if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
Animation_ChangeByInfo(&this->skelAnime, sAnimationInfo, ENMD_ANIM_10); Animation_ChangeByInfo(&this->skelAnime, sAnimationInfo, ENMD_ANIM_10);
this->unk_20A++; this->animSequenceEntry++;
} }
} }
} }
void func_80AAA5A4(EnMd* this) { void func_80AAA5A4(EnMd* this) {
switch (this->unk_20A) { switch (this->animSequenceEntry) {
case 0: case 0:
Animation_ChangeByInfo(&this->skelAnime, sAnimationInfo, ENMD_ANIM_9); Animation_ChangeByInfo(&this->skelAnime, sAnimationInfo, ENMD_ANIM_9);
this->unk_20A++; this->animSequenceEntry++;
case 1: case 1:
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) { if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
Animation_ChangeByInfo(&this->skelAnime, sAnimationInfo, ENMD_ANIM_6); Animation_ChangeByInfo(&this->skelAnime, sAnimationInfo, ENMD_ANIM_6);
this->unk_20A++; this->animSequenceEntry++;
} }
} }
} }
void func_80AAA638(EnMd* this) { void func_80AAA638(EnMd* this) {
switch (this->unk_20A) { switch (this->animSequenceEntry) {
case 0: case 0:
Animation_ChangeByInfo(&this->skelAnime, sAnimationInfo, ENMD_ANIM_9); Animation_ChangeByInfo(&this->skelAnime, sAnimationInfo, ENMD_ANIM_9);
func_80AAA250(this); func_80AAA250(this);
this->unk_20A++; this->animSequenceEntry++;
case 1: case 1:
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) { if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
Animation_ChangeByInfo(&this->skelAnime, sAnimationInfo, ENMD_ANIM_10); Animation_ChangeByInfo(&this->skelAnime, sAnimationInfo, ENMD_ANIM_10);
this->unk_20A++; this->animSequenceEntry++;
} }
} }
} }
void func_80AAA6D4(EnMd* this) { void func_80AAA6D4(EnMd* this) {
switch (this->unk_20A) { switch (this->animSequenceEntry) {
case 0: case 0:
Animation_ChangeByInfo(&this->skelAnime, sAnimationInfo, ENMD_ANIM_11); Animation_ChangeByInfo(&this->skelAnime, sAnimationInfo, ENMD_ANIM_11);
this->unk_20A++; this->animSequenceEntry++;
case 1: case 1:
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) { if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
Animation_ChangeByInfo(&this->skelAnime, sAnimationInfo, ENMD_ANIM_6); Animation_ChangeByInfo(&this->skelAnime, sAnimationInfo, ENMD_ANIM_6);
this->unk_20A++; this->animSequenceEntry++;
} }
} }
} }
void func_80AAA768(EnMd* this) { void func_80AAA768(EnMd* this) {
switch (this->unk_20A) { switch (this->animSequenceEntry) {
case 0: case 0:
Animation_ChangeByInfo(&this->skelAnime, sAnimationInfo, ENMD_ANIM_12); Animation_ChangeByInfo(&this->skelAnime, sAnimationInfo, ENMD_ANIM_12);
this->unk_20A++; this->animSequenceEntry++;
case 1: case 1:
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) { if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
Animation_ChangeByInfo(&this->skelAnime, sAnimationInfo, ENMD_ANIM_3); Animation_ChangeByInfo(&this->skelAnime, sAnimationInfo, ENMD_ANIM_3);
this->unk_20A++; this->animSequenceEntry++;
} }
} }
} }
void func_80AAA7FC(EnMd* this) { void func_80AAA7FC(EnMd* this) {
switch (this->unk_20A) { switch (this->animSequenceEntry) {
case 0: case 0:
Animation_ChangeByInfo(&this->skelAnime, sAnimationInfo, ENMD_ANIM_13); Animation_ChangeByInfo(&this->skelAnime, sAnimationInfo, ENMD_ANIM_13);
this->unk_20A++; this->animSequenceEntry++;
case 1: case 1:
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) { if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
Animation_ChangeByInfo(&this->skelAnime, sAnimationInfo, ENMD_ANIM_6); Animation_ChangeByInfo(&this->skelAnime, sAnimationInfo, ENMD_ANIM_6);
this->unk_20A++; this->animSequenceEntry++;
} }
} }
} }
void func_80AAA890(EnMd* this) { void func_80AAA890(EnMd* this) {
switch (this->unk_20A) { switch (this->animSequenceEntry) {
case 0: case 0:
Animation_ChangeByInfo(&this->skelAnime, sAnimationInfo, ENMD_ANIM_7); Animation_ChangeByInfo(&this->skelAnime, sAnimationInfo, ENMD_ANIM_7);
func_80AAA250(this); func_80AAA250(this);
this->unk_20A++; this->animSequenceEntry++;
case 1: case 1:
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) { if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
Animation_ChangeByInfo(&this->skelAnime, sAnimationInfo, ENMD_ANIM_10); Animation_ChangeByInfo(&this->skelAnime, sAnimationInfo, ENMD_ANIM_10);
this->unk_20A++; this->animSequenceEntry++;
} }
} }
} }
void func_80AAA92C(EnMd* this, u8 arg1) { void EnMd_SetAnimSequence(EnMd* this, u8 arg1) {
this->unk_20B = arg1; this->animSequence = arg1;
this->unk_20A = 0; this->animSequenceEntry = 0;
} }
void func_80AAA93C(EnMd* this) { void EnMd_UpdateAnimSequence(EnMd* this) {
switch (this->unk_20B) { switch (this->animSequence) {
case 1: case 1:
func_80AAA274(this); func_80AAA274(this);
break; break;
@@ -300,69 +300,69 @@ void func_80AAA93C(EnMd* this) {
} }
} }
void func_80AAAA24(EnMd* this) { void EnMd_UpdateAnimSequence_WithTalking(EnMd* this) {
if (this->interactInfo.talkState != NPC_TALK_STATE_IDLE) { if (this->interactInfo.talkState != NPC_TALK_STATE_IDLE) {
switch (this->actor.textId) { switch (this->actor.textId) {
case 0x102F: case 0x102F:
if ((this->unk_208 == 0) && (this->unk_20B != 1)) { if ((this->messageEntry == 0) && (this->animSequence != 1)) {
func_80AAA92C(this, 1); EnMd_SetAnimSequence(this, 1);
} }
if ((this->unk_208 == 2) && (this->unk_20B != 2)) { if ((this->messageEntry == 2) && (this->animSequence != 2)) {
func_80AAA92C(this, 2); EnMd_SetAnimSequence(this, 2);
} }
if ((this->unk_208 == 5) && (this->unk_20B != 8)) { if ((this->messageEntry == 5) && (this->animSequence != 8)) {
func_80AAA92C(this, 8); EnMd_SetAnimSequence(this, 8);
} }
if ((this->unk_208 == 11) && (this->unk_20B != 9)) { if ((this->messageEntry == 11) && (this->animSequence != 9)) {
func_80AAA92C(this, 9); EnMd_SetAnimSequence(this, 9);
} }
break; break;
case 0x1033: case 0x1033:
if ((this->unk_208 == 0) && (this->unk_20B != 1)) { if ((this->messageEntry == 0) && (this->animSequence != 1)) {
func_80AAA92C(this, 1); EnMd_SetAnimSequence(this, 1);
} }
if ((this->unk_208 == 1) && (this->unk_20B != 2)) { if ((this->messageEntry == 1) && (this->animSequence != 2)) {
func_80AAA92C(this, 2); EnMd_SetAnimSequence(this, 2);
} }
if ((this->unk_208 == 5) && (this->unk_20B != 10)) { if ((this->messageEntry == 5) && (this->animSequence != 10)) {
func_80AAA92C(this, 10); EnMd_SetAnimSequence(this, 10);
} }
if ((this->unk_208 == 7) && (this->unk_20B != 9)) { if ((this->messageEntry == 7) && (this->animSequence != 9)) {
func_80AAA92C(this, 9); EnMd_SetAnimSequence(this, 9);
} }
break; break;
case 0x1030: case 0x1030:
case 0x1034: case 0x1034:
case 0x1045: case 0x1045:
if ((this->unk_208 == 0) && (this->unk_20B != 1)) { if ((this->messageEntry == 0) && (this->animSequence != 1)) {
func_80AAA92C(this, 1); EnMd_SetAnimSequence(this, 1);
} }
break; break;
case 0x1046: case 0x1046:
if ((this->unk_208 == 0) && (this->unk_20B != 6)) { if ((this->messageEntry == 0) && (this->animSequence != 6)) {
func_80AAA92C(this, 6); EnMd_SetAnimSequence(this, 6);
} }
break; break;
} }
} else if (this->skelAnime.animation != &gMidoHandsOnHipsIdleAnim) { } else if (this->skelAnime.animation != &gMidoHandsOnHipsIdleAnim) {
Animation_ChangeByInfo(&this->skelAnime, sAnimationInfo, ENMD_ANIM_10); Animation_ChangeByInfo(&this->skelAnime, sAnimationInfo, ENMD_ANIM_10);
func_80AAA92C(this, 0); EnMd_SetAnimSequence(this, 0);
} }
func_80AAA93C(this); EnMd_UpdateAnimSequence(this);
} }
s16 func_80AAAC78(EnMd* this, PlayState* play) { s16 func_80AAAC78(EnMd* this, PlayState* play) {
s16 dialogState = Message_GetState(&play->msgCtx); s16 dialogState = Message_GetState(&play->msgCtx);
if ((this->unk_209 == TEXT_STATE_AWAITING_NEXT) || (this->unk_209 == TEXT_STATE_EVENT) || if ((this->messageState == TEXT_STATE_AWAITING_NEXT) || (this->messageState == TEXT_STATE_EVENT) ||
(this->unk_209 == TEXT_STATE_CLOSING) || (this->unk_209 == TEXT_STATE_DONE_HAS_NEXT)) { (this->messageState == TEXT_STATE_CLOSING) || (this->messageState == TEXT_STATE_DONE_HAS_NEXT)) {
if (this->unk_209 != dialogState) { if (this->messageState != dialogState) {
this->unk_208++; this->messageEntry++;
} }
} }
this->unk_209 = dialogState; this->messageState = dialogState;
return dialogState; return dialogState;
} }
@@ -373,8 +373,8 @@ u16 EnMd_GetTextKokiriForest(PlayState* play, EnMd* this) {
return reactionText; return reactionText;
} }
this->unk_208 = 0; this->messageEntry = 0;
this->unk_209 = TEXT_STATE_NONE; this->messageState = TEXT_STATE_NONE;
if (GameInteractor_Should(VB_MIDO_CONSIDER_DEKU_TREE_DEAD, CHECK_QUEST_ITEM(QUEST_KOKIRI_EMERALD), this)) { if (GameInteractor_Should(VB_MIDO_CONSIDER_DEKU_TREE_DEAD, CHECK_QUEST_ITEM(QUEST_KOKIRI_EMERALD), this)) {
return 0x1045; return 0x1045;
@@ -397,8 +397,8 @@ u16 EnMd_GetTextKokiriForest(PlayState* play, EnMd* this) {
} }
u16 EnMd_GetTextKokiriHome(PlayState* play, EnMd* this) { u16 EnMd_GetTextKokiriHome(PlayState* play, EnMd* this) {
this->unk_208 = 0; this->messageEntry = 0;
this->unk_209 = TEXT_STATE_NONE; this->messageState = TEXT_STATE_NONE;
if (Flags_GetEventChkInf(EVENTCHKINF_OBTAINED_ZELDAS_LETTER)) { if (Flags_GetEventChkInf(EVENTCHKINF_OBTAINED_ZELDAS_LETTER)) {
return 0x1028; return 0x1028;
@@ -408,8 +408,8 @@ u16 EnMd_GetTextKokiriHome(PlayState* play, EnMd* this) {
} }
u16 EnMd_GetTextLostWoods(PlayState* play, EnMd* this) { u16 EnMd_GetTextLostWoods(PlayState* play, EnMd* this) {
this->unk_208 = 0; this->messageEntry = 0;
this->unk_209 = TEXT_STATE_NONE; this->messageState = TEXT_STATE_NONE;
if (Flags_GetEventChkInf(EVENTCHKINF_USED_FOREST_TEMPLE_BLUE_WARP)) { if (Flags_GetEventChkInf(EVENTCHKINF_USED_FOREST_TEMPLE_BLUE_WARP)) {
if (Flags_GetInfTable(INFTABLE_19)) { if (Flags_GetInfTable(INFTABLE_19)) {
@@ -519,11 +519,11 @@ void EnMd_UpdateEyes(EnMd* this) {
} }
} }
void func_80AAB158(EnMd* this, PlayState* play) { void EnMd_UpdateTalking(EnMd* this, PlayState* play) {
Player* player = GET_PLAYER(play); Player* player = GET_PLAYER(play);
s16 absYawDiff; s16 absYawDiff;
s16 trackingMode; s16 trackingMode;
s16 temp2; s16 canUpdateTalking;
s16 yawDiff; s16 yawDiff;
if (this->actor.xzDistToPlayer < 170.0f) { if (this->actor.xzDistToPlayer < 170.0f) {
@@ -532,23 +532,23 @@ void func_80AAB158(EnMd* this, PlayState* play) {
trackingMode = trackingMode =
absYawDiff <= Npc_GetTrackingPresetMaxPlayerYaw(2) ? NPC_TRACKING_HEAD_AND_TORSO : NPC_TRACKING_NONE; absYawDiff <= Npc_GetTrackingPresetMaxPlayerYaw(2) ? NPC_TRACKING_HEAD_AND_TORSO : NPC_TRACKING_NONE;
temp2 = 1; canUpdateTalking = true;
} else { } else {
trackingMode = NPC_TRACKING_NONE; trackingMode = NPC_TRACKING_NONE;
temp2 = 0; canUpdateTalking = false;
} }
if (this->interactInfo.talkState != NPC_TALK_STATE_IDLE) { if (this->interactInfo.talkState != NPC_TALK_STATE_IDLE) {
trackingMode = NPC_TRACKING_FULL_BODY; trackingMode = NPC_TRACKING_FULL_BODY;
} }
if (this->actionFunc == func_80AABD0C) { if (this->actionFunc == EnMd_Walk) {
trackingMode = NPC_TRACKING_NONE; trackingMode = NPC_TRACKING_NONE;
temp2 = 0; canUpdateTalking = false;
} }
if (this->actionFunc == func_80AAB8F8) { if (this->actionFunc == EnMd_Watch) {
trackingMode = NPC_TRACKING_FULL_BODY; trackingMode = NPC_TRACKING_FULL_BODY;
temp2 = 1; canUpdateTalking = true;
} }
if ((play->csCtx.state != CS_STATE_IDLE) || gDbgCamEnabled) { if ((play->csCtx.state != CS_STATE_IDLE) || gDbgCamEnabled) {
@@ -561,8 +561,8 @@ void func_80AAB158(EnMd* this, PlayState* play) {
} }
Npc_TrackPoint(&this->actor, &this->interactInfo, 2, trackingMode); Npc_TrackPoint(&this->actor, &this->interactInfo, 2, trackingMode);
if (this->actionFunc != func_80AABC10) { if (this->actionFunc != EnMd_ListenToOcarina) {
if (temp2) { if (canUpdateTalking) {
Npc_UpdateTalking(play, &this->actor, &this->interactInfo.talkState, this->collider.dim.radius + 30.0f, Npc_UpdateTalking(play, &this->actor, &this->interactInfo.talkState, this->collider.dim.radius + 30.0f,
EnMd_GetText, func_80AAAF04); EnMd_GetText, func_80AAAF04);
} }
@@ -617,25 +617,16 @@ u8 EnMd_SetMovedPos(EnMd* this, PlayState* play) {
return 1; return 1;
} }
void func_80AAB5A4(EnMd* this, PlayState* play) { void EnMd_UpdateAlphaByDistance(EnMd* this, PlayState* play) {
f32 temp; f32 radius;
if (play->sceneNum != SCENE_MIDOS_HOUSE) { if (GameInteractor_Should(VB_FADE_KOKIRI, play->sceneNum != SCENE_MIDOS_HOUSE, this)) {
if (CVarGetInteger(CVAR_ENHANCEMENT("DisableKokiriDrawDistance"), 0) != 0) { radius = (GameInteractor_Should(VB_MIDO_CONSIDER_DEKU_TREE_DEAD, CHECK_QUEST_ITEM(QUEST_KOKIRI_EMERALD)) &&
temp = (GameInteractor_Should(VB_MIDO_CONSIDER_DEKU_TREE_DEAD, CHECK_QUEST_ITEM(QUEST_KOKIRI_EMERALD)) && !Flags_GetEventChkInf(EVENTCHKINF_SPOKE_TO_MIDO_AFTER_DEKU_TREES_DEATH) &&
!Flags_GetEventChkInf(EVENTCHKINF_SPOKE_TO_MIDO_AFTER_DEKU_TREES_DEATH) && (play->sceneNum == SCENE_KOKIRI_FOREST))
(play->sceneNum == SCENE_KOKIRI_FOREST)) ? 100.0f
? 100.0f : 400.0f;
: 32767.0f; this->alpha = Actor_UpdateAlphaByDistance(&this->actor, play, this->alpha, radius);
} else {
temp = (GameInteractor_Should(VB_MIDO_CONSIDER_DEKU_TREE_DEAD, CHECK_QUEST_ITEM(QUEST_KOKIRI_EMERALD)) &&
!Flags_GetEventChkInf(EVENTCHKINF_SPOKE_TO_MIDO_AFTER_DEKU_TREES_DEATH) &&
(play->sceneNum == SCENE_KOKIRI_FOREST))
? 100.0f
: 400.0f;
}
this->alpha = Actor_UpdateAlphaByDistance(&this->actor, play, this->alpha, temp);
this->actor.shape.shadowAlpha = this->alpha; this->actor.shape.shadowAlpha = this->alpha;
} else { } else {
this->alpha = 255; this->alpha = 255;
@@ -671,7 +662,7 @@ void EnMd_Init(Actor* thisx, PlayState* play) {
((play->sceneNum == SCENE_LOST_WOODS) && ((play->sceneNum == SCENE_LOST_WOODS) &&
!Flags_GetEventChkInf(EVENTCHKINF_PLAYED_SARIAS_SONG_FOR_MIDO_AS_ADULT))) { !Flags_GetEventChkInf(EVENTCHKINF_PLAYED_SARIAS_SONG_FOR_MIDO_AS_ADULT))) {
this->actor.home.pos = this->actor.world.pos; this->actor.home.pos = this->actor.world.pos;
this->actionFunc = func_80AAB948; this->actionFunc = EnMd_BlockPath;
return; return;
} }
@@ -679,7 +670,7 @@ void EnMd_Init(Actor* thisx, PlayState* play) {
EnMd_SetMovedPos(this, play); EnMd_SetMovedPos(this, play);
} }
this->actionFunc = func_80AAB874; this->actionFunc = EnMd_Idle;
} }
void EnMd_Destroy(Actor* thisx, PlayState* play) { void EnMd_Destroy(Actor* thisx, PlayState* play) {
@@ -689,30 +680,30 @@ void EnMd_Destroy(Actor* thisx, PlayState* play) {
ResourceMgr_UnregisterSkeleton(&this->skelAnime); ResourceMgr_UnregisterSkeleton(&this->skelAnime);
} }
void func_80AAB874(EnMd* this, PlayState* play) { void EnMd_Idle(EnMd* this, PlayState* play) {
if (this->skelAnime.animation == &gMidoHandsOnHipsIdleAnim) { if (this->skelAnime.animation == &gMidoHandsOnHipsIdleAnim) {
func_80034F54(play, this->unk_214, this->unk_236, 17); func_80034F54(play, this->unk_214, this->unk_236, 17);
} else if ((this->interactInfo.talkState == NPC_TALK_STATE_IDLE) && (this->unk_20B != 7)) { } else if ((this->interactInfo.talkState == NPC_TALK_STATE_IDLE) && (this->animSequence != 7)) {
func_80AAA92C(this, 7); EnMd_SetAnimSequence(this, 7);
} }
func_80AAAA24(this); EnMd_UpdateAnimSequence_WithTalking(this);
} }
void func_80AAB8F8(EnMd* this, PlayState* play) { void EnMd_Watch(EnMd* this, PlayState* play) {
if (this->skelAnime.animation == &gMidoHandsOnHipsIdleAnim) { if (this->skelAnime.animation == &gMidoHandsOnHipsIdleAnim) {
func_80034F54(play, this->unk_214, this->unk_236, 17); func_80034F54(play, this->unk_214, this->unk_236, 17);
} }
func_80AAA93C(this); EnMd_UpdateAnimSequence(this);
} }
void func_80AAB948(EnMd* this, PlayState* play) { void EnMd_BlockPath(EnMd* this, PlayState* play) {
Player* player = GET_PLAYER(play); Player* player = GET_PLAYER(play);
f32 temp; f32 temp;
Actor* actorToBlock = &GET_PLAYER(play)->actor; Actor* actorToBlock = &GET_PLAYER(play)->actor;
s16 yaw; s16 yaw;
func_80AAAA24(this); EnMd_UpdateAnimSequence_WithTalking(this);
if (this->interactInfo.talkState == NPC_TALK_STATE_IDLE) { if (this->interactInfo.talkState == NPC_TALK_STATE_IDLE) {
this->actor.world.rot.y = this->actor.yawTowardsPlayer; this->actor.world.rot.y = this->actor.yawTowardsPlayer;
@@ -747,11 +738,11 @@ void func_80AAB948(EnMd* this, PlayState* play) {
Flags_SetEventChkInf(EVENTCHKINF_PLAYED_SARIAS_SONG_FOR_MIDO_AS_ADULT); Flags_SetEventChkInf(EVENTCHKINF_PLAYED_SARIAS_SONG_FOR_MIDO_AS_ADULT);
} }
func_80AAA92C(this, 3); EnMd_SetAnimSequence(this, 3);
func_80AAA93C(this); EnMd_UpdateAnimSequence(this);
this->waypoint = 1; this->waypoint = 1;
this->interactInfo.talkState = NPC_TALK_STATE_IDLE; this->interactInfo.talkState = NPC_TALK_STATE_IDLE;
this->actionFunc = func_80AABD0C; this->actionFunc = EnMd_Walk;
this->actor.speedXZ = 1.5f; this->actor.speedXZ = 1.5f;
return; return;
} }
@@ -765,7 +756,7 @@ void func_80AAB948(EnMd* this, PlayState* play) {
player->stateFlags2 |= PLAYER_STATE2_PLAY_FOR_ACTOR; player->stateFlags2 |= PLAYER_STATE2_PLAY_FOR_ACTOR;
player->unk_6A8 = &this->actor; player->unk_6A8 = &this->actor;
func_8010BD58(play, OCARINA_ACTION_CHECK_SARIA); func_8010BD58(play, OCARINA_ACTION_CHECK_SARIA);
this->actionFunc = func_80AABC10; this->actionFunc = EnMd_ListenToOcarina;
return; return;
} }
@@ -775,11 +766,11 @@ void func_80AAB948(EnMd* this, PlayState* play) {
} }
} }
void func_80AABC10(EnMd* this, PlayState* play) { void EnMd_ListenToOcarina(EnMd* this, PlayState* play) {
Player* player = GET_PLAYER(play); Player* player = GET_PLAYER(play);
if (play->msgCtx.ocarinaMode >= OCARINA_MODE_04) { if (play->msgCtx.ocarinaMode >= OCARINA_MODE_04) {
this->actionFunc = func_80AAB948; this->actionFunc = EnMd_BlockPath;
play->msgCtx.ocarinaMode = OCARINA_MODE_04; play->msgCtx.ocarinaMode = OCARINA_MODE_04;
} else if (play->msgCtx.ocarinaMode == OCARINA_MODE_03) { } else if (play->msgCtx.ocarinaMode == OCARINA_MODE_03) {
Audio_PlaySoundGeneral(NA_SE_SY_CORRECT_CHIME, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, Audio_PlaySoundGeneral(NA_SE_SY_CORRECT_CHIME, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale,
@@ -787,16 +778,16 @@ void func_80AABC10(EnMd* this, PlayState* play) {
this->actor.textId = 0x1067; this->actor.textId = 0x1067;
func_8002F2CC(&this->actor, play, this->collider.dim.radius + 30.0f); func_8002F2CC(&this->actor, play, this->collider.dim.radius + 30.0f);
this->actionFunc = func_80AAB948; this->actionFunc = EnMd_BlockPath;
play->msgCtx.ocarinaMode = OCARINA_MODE_04; play->msgCtx.ocarinaMode = OCARINA_MODE_04;
} else { } else {
player->stateFlags2 |= PLAYER_STATE2_NEAR_OCARINA_ACTOR; player->stateFlags2 |= PLAYER_STATE2_NEAR_OCARINA_ACTOR;
} }
} }
void func_80AABD0C(EnMd* this, PlayState* play) { void EnMd_Walk(EnMd* this, PlayState* play) {
func_80034F54(play, this->unk_214, this->unk_236, 17); func_80034F54(play, this->unk_214, this->unk_236, 17);
func_80AAA93C(this); EnMd_UpdateAnimSequence(this);
if (!(EnMd_FollowPath(this, play)) || (this->waypoint != 0)) { if (!(EnMd_FollowPath(this, play)) || (this->waypoint != 0)) {
this->actor.shape.rot = this->actor.world.rot; this->actor.shape.rot = this->actor.world.rot;
@@ -812,12 +803,12 @@ void func_80AABD0C(EnMd* this, PlayState* play) {
return; return;
} }
func_80AAA92C(this, 11); EnMd_SetAnimSequence(this, 11);
this->skelAnime.playSpeed = 0.0f; this->skelAnime.playSpeed = 0.0f;
this->actor.speedXZ = 0.0f; this->actor.speedXZ = 0.0f;
this->actor.home.pos = this->actor.world.pos; this->actor.home.pos = this->actor.world.pos;
this->actionFunc = func_80AAB8F8; this->actionFunc = EnMd_Watch;
} }
void EnMd_Update(Actor* thisx, PlayState* play) { void EnMd_Update(Actor* thisx, PlayState* play) {
@@ -828,9 +819,9 @@ void EnMd_Update(Actor* thisx, PlayState* play) {
CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base); CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
SkelAnime_Update(&this->skelAnime); SkelAnime_Update(&this->skelAnime);
EnMd_UpdateEyes(this); EnMd_UpdateEyes(this);
func_80AAB5A4(this, play); EnMd_UpdateAlphaByDistance(this, play);
Actor_MoveXZGravity(&this->actor); Actor_MoveXZGravity(&this->actor);
func_80AAB158(this, play); EnMd_UpdateTalking(this, play);
Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, 4); Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, 4);
this->actionFunc(this, play); this->actionFunc(this, play);
} }

View File

@@ -14,10 +14,10 @@ typedef struct EnMd {
/* 0x0190 */ EnMdActionFunc actionFunc; /* 0x0190 */ EnMdActionFunc actionFunc;
/* 0x0194 */ ColliderCylinder collider; /* 0x0194 */ ColliderCylinder collider;
/* 0x01E0 */ NpcInteractInfo interactInfo; /* 0x01E0 */ NpcInteractInfo interactInfo;
/* 0x0208 */ u8 unk_208; /* 0x0208 */ u8 messageEntry; // tracks message state changes, like with `BOX_BREAK` or `TEXTID`
/* 0x0209 */ u8 unk_209; /* 0x0209 */ u8 messageState; // last known result of `Message_GetState`
/* 0x020A */ u8 unk_20A; /* 0x020A */ u8 animSequenceEntry; // each one changes animation info and waits
/* 0x020B */ u8 unk_20B; /* 0x020B */ u8 animSequence;
/* 0x020C */ s16 blinkTimer; /* 0x020C */ s16 blinkTimer;
/* 0x020E */ s16 eyeIdx; /* 0x020E */ s16 eyeIdx;
/* 0x0210 */ s16 alpha; /* 0x0210 */ s16 alpha;

View File

@@ -745,12 +745,8 @@ void EnSa_Update(Actor* thisx, PlayState* play) {
EnSa_ChangeAnim(this, ENSA_ANIM1_6); EnSa_ChangeAnim(this, ENSA_ANIM1_6);
} }
if (this->actionFunc != func_80AF68E4) { if (GameInteractor_Should(VB_FADE_KOKIRI, this->actionFunc != func_80AF68E4, this)) {
if (CVarGetInteger(CVAR_ENHANCEMENT("DisableKokiriDrawDistance"), 0) != 0) { this->alpha = Actor_UpdateAlphaByDistance(&this->actor, play, this->alpha, 400.0f);
this->alpha = Actor_UpdateAlphaByDistance(&this->actor, play, this->alpha, 32767);
} else {
this->alpha = Actor_UpdateAlphaByDistance(&this->actor, play, this->alpha, 400.0f);
}
} else { } else {
this->alpha = 255; this->alpha = 255;
} }