From 775501b28bcac057c9054cba70e28ecbb8f48d5e Mon Sep 17 00:00:00 2001 From: engineer124 <47598039+engineer124@users.noreply.github.com> Date: Wed, 27 Sep 2023 07:24:12 +1000 Subject: [PATCH 01/16] Animation Cleanup: En_G* (#1395) * wip * more cleanup * more cleanup * one more thing * one more default case * missed brackets * PR Review --- src/overlays/actors/ovl_En_Gb2/z_en_gb2.c | 65 +++-- src/overlays/actors/ovl_En_Gb2/z_en_gb2.h | 5 +- src/overlays/actors/ovl_En_Ge1/z_en_ge1.c | 11 +- src/overlays/actors/ovl_En_Ge2/z_en_ge2.c | 41 +-- src/overlays/actors/ovl_En_Ge3/z_en_ge3.c | 6 +- src/overlays/actors/ovl_En_Geg/z_en_geg.c | 151 ++++++---- src/overlays/actors/ovl_En_Geg/z_en_geg.h | 7 +- src/overlays/actors/ovl_En_Gg/z_en_gg.c | 192 ++++++++----- src/overlays/actors/ovl_En_Gg/z_en_gg.h | 11 +- src/overlays/actors/ovl_En_Gg2/z_en_gg2.c | 110 ++++--- src/overlays/actors/ovl_En_Gg2/z_en_gg2.h | 7 +- src/overlays/actors/ovl_En_Giant/z_en_giant.c | 147 +++++----- .../actors/ovl_En_Ginko_Man/z_en_ginko_man.c | 26 +- .../actors/ovl_En_Ginko_Man/z_en_ginko_man.h | 5 +- src/overlays/actors/ovl_En_Gk/z_en_gk.c | 271 +++++++++++------- src/overlays/actors/ovl_En_Gk/z_en_gk.h | 9 +- src/overlays/actors/ovl_En_Gm/z_en_gm.c | 211 ++++++++------ src/overlays/actors/ovl_En_Gm/z_en_gm.h | 9 +- src/overlays/actors/ovl_En_Go/z_en_go.c | 86 +++--- src/overlays/actors/ovl_En_Go/z_en_go.h | 4 +- .../actors/ovl_En_Goroiwa/z_en_goroiwa.c | 8 +- .../ovl_En_Grasshopper/z_en_grasshopper.c | 24 +- .../ovl_En_Grasshopper/z_en_grasshopper.h | 2 +- src/overlays/actors/ovl_En_Gs/z_en_gs.c | 41 ++- .../ovl_En_Guard_Nuts/z_en_guard_nuts.c | 69 +++-- .../ovl_En_Guard_Nuts/z_en_guard_nuts.h | 2 +- .../actors/ovl_En_Guruguru/z_en_guruguru.c | 35 ++- .../actors/ovl_En_Guruguru/z_en_guruguru.h | 7 +- src/overlays/actors/ovl_En_Jg/z_en_jg.c | 29 +- src/overlays/actors/ovl_En_Jg/z_en_jg.h | 2 +- src/overlays/actors/ovl_En_Kgy/z_en_kgy.c | 6 +- src/overlays/actors/ovl_En_Mnk/z_en_mnk.c | 18 +- .../actors/ovl_En_Railgibud/z_en_railgibud.c | 21 +- .../actors/ovl_En_Railgibud/z_en_railgibud.h | 2 +- tools/disasm/functions.txt | 10 +- tools/disasm/variables.txt | 2 +- 36 files changed, 976 insertions(+), 676 deletions(-) diff --git a/src/overlays/actors/ovl_En_Gb2/z_en_gb2.c b/src/overlays/actors/ovl_En_Gb2/z_en_gb2.c index 9b96771be..36e18e350 100644 --- a/src/overlays/actors/ovl_En_Gb2/z_en_gb2.c +++ b/src/overlays/actors/ovl_En_Gb2/z_en_gb2.c @@ -5,7 +5,6 @@ */ #include "z_en_gb2.h" -#include "objects/object_ps/object_ps.h" #define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10 | ACTOR_FLAG_20) @@ -163,7 +162,7 @@ u16 func_80B0F7FC(EnGb2* this) { return 0x14E4; } - if (gSaveContext.save.saveInfo.playerData.health > 48) { + if (gSaveContext.save.saveInfo.playerData.health > 0x30) { return 0x14D2; } @@ -171,7 +170,7 @@ u16 func_80B0F7FC(EnGb2* this) { return 0x14D3; case 0x14E4: - if (gSaveContext.save.saveInfo.playerData.health > 48) { + if (gSaveContext.save.saveInfo.playerData.health > 0x30) { return 0x14D2; } @@ -193,8 +192,10 @@ u16 func_80B0F7FC(EnGb2* this) { case 0x14D9: return 0x14DA; + + default: + return 0; } - return 0; } u16 func_80B0F8F8(EnGb2* this) { @@ -213,8 +214,10 @@ u16 func_80B0F8F8(EnGb2* this) { case 0x14E1: return 0x14E2; + + default: + return 0; } - return 0; } u16 func_80B0F97C(EnGb2* this) { @@ -236,8 +239,10 @@ u16 func_80B0F97C(EnGb2* this) { case 0x14FA: this->unk_26C |= 2; return 0x14FB; + + default: + return 0; } - return 0; } void func_80B0FA04(EnGb2* this) { @@ -262,17 +267,19 @@ s32 func_80B0FA48(EnGb2* this, PlayState* play) { if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_80_40)) { this->unk_26E = 0x14EB; return false; + } else { + this->unk_26E = 0x14EE; + return true; } - this->unk_26E = 0x14EE; - return true; - } - if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_80_20)) { - this->unk_26E = 0x14EF; - return false; - } else { - this->unk_26E = 0x14F4; - return true; + default: + if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_80_20)) { + this->unk_26E = 0x14EF; + return false; + } else { + this->unk_26E = 0x14F4; + return true; + } } } @@ -314,12 +321,14 @@ u16 func_80B0FB24(EnGb2* this) { case 0x14F2: this->unk_26C |= 2; return 0x14F3; + + default: + return 0; } - return 0; } void func_80B0FBF0(EnGb2* this, PlayState* play) { - Vec3f sp90[4] = { + Vec3f sp90[] = { { 120.0f, 0.0f, 800.0f }, { -120.0f, 0.0f, 750.0f }, { 60.0f, 0.0f, 750.0f }, @@ -425,6 +434,9 @@ void func_80B0FFA8(EnGb2* this, PlayState* play) { this->unk_26C |= 2; Message_StartTextbox(play, this->unk_26E, &this->actor); break; + + default: + break; } } else if (this->unk_26E == 0x14DA) { switch (play->msgCtx.choiceIndex) { @@ -443,6 +455,9 @@ void func_80B0FFA8(EnGb2* this, PlayState* play) { this->unk_26C |= 2; Message_StartTextbox(play, this->unk_26E, &this->actor); break; + + default: + break; } } } @@ -505,7 +520,7 @@ void func_80B10344(EnGb2* this, PlayState* play) { } } - if (gSaveContext.save.saveInfo.playerData.health < 49) { + if (gSaveContext.save.saveInfo.playerData.health <= 0x30) { gSaveContext.timerStates[TIMER_ID_MINIGAME_1] = TIMER_STATE_STOP; SET_EVENTINF(EVENTINF_46); SET_EVENTINF(EVENTINF_45); @@ -596,6 +611,9 @@ void func_80B10634(EnGb2* this, PlayState* play) { this->unk_26C |= 2; Message_StartTextbox(play, this->unk_26E, &this->actor); break; + + default: + break; } } } @@ -673,6 +691,9 @@ void func_80B10A48(EnGb2* this, PlayState* play) { this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; this->actionFunc = func_80B111AC; break; + + default: + break; } } } @@ -877,7 +898,7 @@ void EnGb2_Init(Actor* thisx, PlayState* play) { this->actor.room = -1; Actor_ProcessInitChain(&this->actor, sInitChain); SkelAnime_InitFlex(play, &this->skelAnime, &object_ps_Skel_007230, &object_ps_Anim_00049C, this->jointTable, - this->morphTable, 12); + this->morphTable, OBJECT_PS_LIMB_MAX); ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 35.0f); Collider_InitCylinder(play, &this->collider); Collider_SetCylinderType1(play, &this->collider, &this->actor, &sCylinderInit); @@ -981,11 +1002,11 @@ s32 EnGb2_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* p Gfx** gfx) { EnGb2* this = THIS; - if (limbIndex == 7) { + if (limbIndex == OBJECT_PS_LIMB_07) { Matrix_RotateYS(this->unk_270.y, MTXMODE_APPLY); } - if (limbIndex == 1) { + if (limbIndex == OBJECT_PS_LIMB_01) { *dList = NULL; } @@ -996,7 +1017,7 @@ void EnGb2_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, EnGb2* this = THIS; Vec3f sp18 = { 2400.0f, 0.0f, 0.0f }; - if (limbIndex == 7) { + if (limbIndex == OBJECT_PS_LIMB_07) { Matrix_MultVec3f(&sp18, &this->actor.focus.pos); } } diff --git a/src/overlays/actors/ovl_En_Gb2/z_en_gb2.h b/src/overlays/actors/ovl_En_Gb2/z_en_gb2.h index a257ab3d4..fa500f15c 100644 --- a/src/overlays/actors/ovl_En_Gb2/z_en_gb2.h +++ b/src/overlays/actors/ovl_En_Gb2/z_en_gb2.h @@ -2,6 +2,7 @@ #define Z_EN_GB2_H #include "global.h" +#include "objects/object_ps/object_ps.h" struct EnGb2; @@ -19,8 +20,8 @@ typedef enum { typedef struct EnGb2 { /* 0x0000 */ Actor actor; /* 0x144 */ SkelAnime skelAnime; - /* 0x188 */ Vec3s jointTable[12]; - /* 0x1D0 */ Vec3s morphTable[12]; + /* 0x188 */ Vec3s jointTable[OBJECT_PS_LIMB_MAX]; + /* 0x1D0 */ Vec3s morphTable[OBJECT_PS_LIMB_MAX]; /* 0x218 */ EnGb2ActionFunc actionFunc; /* 0x21C */ ColliderCylinder collider; /* 0x268 */ Actor* unk_268; diff --git a/src/overlays/actors/ovl_En_Ge1/z_en_ge1.c b/src/overlays/actors/ovl_En_Ge1/z_en_ge1.c index 25556fdf7..c83305a8c 100644 --- a/src/overlays/actors/ovl_En_Ge1/z_en_ge1.c +++ b/src/overlays/actors/ovl_En_Ge1/z_en_ge1.c @@ -69,10 +69,11 @@ typedef enum { /* 6 */ GERUDO_WHITE_ANIM_EXCITED_CLAPPING, /* 7 */ GERUDO_WHITE_ANIM_SALUTE, /* 8 */ GERUDO_WHITE_ANIM_LEADING_BOAT, - /* 9 */ GERUDO_WHITE_ANIM_BLOWN_AWAY + /* 9 */ GERUDO_WHITE_ANIM_BLOWN_AWAY, + /* 10 */ GERUDO_WHITE_ANIM_MAX } GerudoWhiteAnimation; -void EnGe1_ChangeAnim(EnGe1* this, s16 animIndex, u8 mode, f32 morphFrames); +void EnGe1_ChangeAnim(EnGe1* this, s16 animIndex, u8 animMode, f32 morphFrames); void EnGe1_ShadowDraw(Actor* thisx, Lights* lights, PlayState* play); void EnGe1_Wait(EnGe1* this, PlayState* play); void EnGe1_PerformCutsceneActions(EnGe1* this, PlayState* play); @@ -127,8 +128,8 @@ void EnGe1_Destroy(Actor* thisx, PlayState* play) { Collider_DestroyCylinder(play, &this->collider); } -void EnGe1_ChangeAnim(EnGe1* this, s16 animIndex, u8 mode, f32 morphFrames) { - static AnimationHeader* sAnimations[] = { +void EnGe1_ChangeAnim(EnGe1* this, s16 animIndex, u8 animMode, f32 morphFrames) { + static AnimationHeader* sAnimations[GERUDO_WHITE_ANIM_MAX] = { &gGerudoWhiteArmsFoldedAnim, // GERUDO_WHITE_ANIM_ARMS_FOLDED, &gGerudoWhiteUnfoldingArmsAnim, // GERUDO_WHITE_ANIM_UNFOLDING_ARMS &gGerudoWhiteStandingHeadBowedAnim, // GERUDO_WHITE_ANIM_STANDING_HEAD_BOWED, @@ -154,7 +155,7 @@ void EnGe1_ChangeAnim(EnGe1* this, s16 animIndex, u8 mode, f32 morphFrames) { default: Animation_Change(&this->skelAnime, sAnimations[animIndex], 1.0f, 0.0f, - Animation_GetLastFrame(sAnimations[animIndex]), mode, morphFrames); + Animation_GetLastFrame(sAnimations[animIndex]), animMode, morphFrames); break; } diff --git a/src/overlays/actors/ovl_En_Ge2/z_en_ge2.c b/src/overlays/actors/ovl_En_Ge2/z_en_ge2.c index eeacf00a5..45d304aaf 100644 --- a/src/overlays/actors/ovl_En_Ge2/z_en_ge2.c +++ b/src/overlays/actors/ovl_En_Ge2/z_en_ge2.c @@ -119,7 +119,7 @@ void EnGe2_Init(Actor* thisx, PlayState* play) { switch (GERUDO_PURPLE_GET_TYPE(&this->picto.actor)) { case GERUDO_PURPLE_TYPE_BOAT_SENTRY: Animation_Change(&this->skelAnime, &gGerudoPurpleLookingAboutAnim, 1.0f, 0.0f, - Animation_GetLastFrame(&gGerudoPurpleLookingAboutAnim), 0, 0.0f); + Animation_GetLastFrame(&gGerudoPurpleLookingAboutAnim), ANIMMODE_LOOP, 0.0f); this->actionFunc = EnGe2_GuardStationary; this->picto.actor.speed = 0.0f; this->picto.actor.uncullZoneForward = 4000.0f; @@ -343,18 +343,18 @@ s32 EnGe2_FollowPathWithoutGravity(EnGe2* this) { /* Action and helper functions */ void EnGe2_SpawnEffects(EnGe2* this, PlayState* play) { - static Vec3f effectVelocity = { 0.0f, -0.05f, 0.0f }; - static Vec3f effectAccel = { 0.0f, -0.025f, 0.0f }; - static Color_RGBA8 effectPrimColor = { 255, 255, 255, 0 }; - static Color_RGBA8 effectEnvColor = { 255, 150, 0, 0 }; + static Vec3f sEffectVelocity = { 0.0f, -0.05f, 0.0f }; + static Vec3f sEffectAccel = { 0.0f, -0.025f, 0.0f }; + static Color_RGBA8 sEffectPrimColor = { 255, 255, 255, 0 }; + static Color_RGBA8 sEffectEnvColor = { 255, 150, 0, 0 }; s16 effectAngle = play->state.frames * 0x2800; Vec3f effectPos; effectPos.x = (Math_CosS(effectAngle) * 5.0f) + this->picto.actor.focus.pos.x; effectPos.y = this->picto.actor.focus.pos.y + 10.0f; effectPos.z = (Math_SinS(effectAngle) * 5.0f) + this->picto.actor.focus.pos.z; - EffectSsKirakira_SpawnDispersed(play, &effectPos, &effectVelocity, &effectAccel, &effectPrimColor, &effectEnvColor, - 1000, 16); + EffectSsKirakira_SpawnDispersed(play, &effectPos, &sEffectVelocity, &sEffectAccel, &sEffectPrimColor, + &sEffectEnvColor, 1000, 16); } void EnGe2_Scream(EnGe2* this) { @@ -396,7 +396,7 @@ void EnGe2_SetupCapturePlayer(EnGe2* this) { this->picto.actor.speed = 0.0f; this->actionFunc = EnGe2_CapturePlayer; Animation_Change(&this->skelAnime, &gGerudoPurpleLookingAboutAnim, 1.0f, 0.0f, - Animation_GetLastFrame(&gGerudoPurpleLookingAboutAnim), 0, -8.0f); + Animation_GetLastFrame(&gGerudoPurpleLookingAboutAnim), ANIMMODE_LOOP, -8.0f); } void EnGe2_Charge(EnGe2* this, PlayState* play) { @@ -429,7 +429,7 @@ void EnGe2_SetupCharge(EnGe2* this, PlayState* play) { if (this->picto.actor.shape.rot.y == this->picto.actor.yawTowardsPlayer) { Animation_Change(&this->skelAnime, &gGerudoPurpleChargingAnim, 1.0f, 0.0f, - Animation_GetLastFrame(&gGerudoPurpleChargingAnim), 0, -8.0f); + Animation_GetLastFrame(&gGerudoPurpleChargingAnim), ANIMMODE_LOOP, -8.0f); this->timer = 50; this->picto.actor.speed = 4.0f; this->actionFunc = EnGe2_Charge; @@ -438,7 +438,7 @@ void EnGe2_SetupCharge(EnGe2* this, PlayState* play) { void EnGe2_SetupLookAround(EnGe2* this) { Animation_Change(&this->skelAnime, &gGerudoPurpleLookingAboutAnim, 1.0f, 0.0f, - Animation_GetLastFrame(&gGerudoPurpleLookingAboutAnim), 0, -8.0f); + Animation_GetLastFrame(&gGerudoPurpleLookingAboutAnim), ANIMMODE_LOOP, -8.0f); this->timer = 60; this->picto.actor.speed = 0.0f; this->actionFunc = EnGe2_LookAround; @@ -483,13 +483,13 @@ void EnGe2_PatrolDuties(EnGe2* this, PlayState* play) { this->picto.actor.speed = 0.0f; this->actionFunc = EnGe2_SetupCharge; Animation_Change(&this->skelAnime, &gGerudoPurpleLookingAboutAnim, 1.0f, 0.0f, - Animation_GetLastFrame(&gGerudoPurpleLookingAboutAnim), 0, -8.0f); + Animation_GetLastFrame(&gGerudoPurpleLookingAboutAnim), ANIMMODE_LOOP, -8.0f); this->stateFlags |= GERUDO_PURPLE_STATE_CAPTURING; } else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_80_08)) { this->picto.actor.speed = 0.0f; this->actionFunc = EnGe2_TurnToPlayerFast; Animation_Change(&this->skelAnime, &gGerudoPurpleLookingAboutAnim, 1.0f, 0.0f, - Animation_GetLastFrame(&gGerudoPurpleLookingAboutAnim), 0, -8.0f); + Animation_GetLastFrame(&gGerudoPurpleLookingAboutAnim), ANIMMODE_LOOP, -8.0f); } else if (EnGe2_LookForPlayer(play, &this->picto.actor, &this->picto.actor.focus.pos, this->picto.actor.shape.rot.y, 0x1800, visionRange, this->verticalDetectRange)) { if ((GERUDO_PURPLE_GET_EXIT(&this->picto.actor) != GERUDO_PURPLE_EXIT_NONE) && !Play_InCsMode(play)) { @@ -499,7 +499,7 @@ void EnGe2_PatrolDuties(EnGe2* this, PlayState* play) { Message_StartTextbox(play, 0x1194, &this->picto.actor); this->actionFunc = EnGe2_SetupCharge; Animation_Change(&this->skelAnime, &gGerudoPurpleLookingAboutAnim, 1.0f, 0.0f, - Animation_GetLastFrame(&gGerudoPurpleLookingAboutAnim), 0, -8.0f); + Animation_GetLastFrame(&gGerudoPurpleLookingAboutAnim), ANIMMODE_LOOP, -8.0f); } } else if (this->collider.base.acFlags & AC_HIT) { if ((this->collider.info.acHitInfo != NULL) && @@ -510,7 +510,7 @@ void EnGe2_PatrolDuties(EnGe2* this, PlayState* play) { this->stateFlags |= GERUDO_PURPLE_STATE_STUNNED; } else { Animation_Change(&this->skelAnime, &gGerudoPurpleFallingToGroundAnim, 1.0f, 0.0f, - Animation_GetLastFrame(&gGerudoPurpleFallingToGroundAnim), 2, -8.0f); + Animation_GetLastFrame(&gGerudoPurpleFallingToGroundAnim), ANIMMODE_ONCE, -8.0f); this->timer = 200; this->picto.actor.speed = 0.0f; this->actionFunc = EnGe2_KnockedOut; @@ -543,7 +543,7 @@ void EnGe2_LookAround(EnGe2* this, PlayState* play) { } else { this->actionFunc = EnGe2_Walk; Animation_Change(&this->skelAnime, &gGerudoPurpleWalkingAnim, 1.0f, 0.0f, - Animation_GetLastFrame(&gGerudoPurpleWalkingAnim), 0, -8.0f); + Animation_GetLastFrame(&gGerudoPurpleWalkingAnim), ANIMMODE_LOOP, -8.0f); this->headRot.y = 0; this->detectedStatus = GERUDO_PURPLE_DETECTION_UNDETECTED; } @@ -602,13 +602,14 @@ void EnGe2_PerformCutsceneActions(EnGe2* this, PlayState* play) { switch (cueId) { case ENGE2_CUEID_BEEHIVE_PATROL: Animation_Change(&this->skelAnime, &gGerudoPurpleLookingAboutAnim, 1.0f, 0.0f, - Animation_GetLastFrame(&gGerudoPurpleLookingAboutAnim), 0, -8.0f); + Animation_GetLastFrame(&gGerudoPurpleLookingAboutAnim), ANIMMODE_LOOP, -8.0f); EnGe2_GetNextPath(this, play); break; case ENGE2_CUEID_BEEHIVE_RUN_AWAY: Animation_Change(&this->skelAnime, &gGerudoPurpleRunningAwayCutsceneAnim, 1.0f, 0.0f, - Animation_GetLastFrame(&gGerudoPurpleRunningAwayCutsceneAnim), 0, -5.0f); + Animation_GetLastFrame(&gGerudoPurpleRunningAwayCutsceneAnim), ANIMMODE_LOOP, + -5.0f); this->screamTimer = (s32)(Rand_ZeroFloat(10.0f) + 20.0f); break; @@ -617,11 +618,13 @@ void EnGe2_PerformCutsceneActions(EnGe2* this, PlayState* play) { break; case ENGE2_CUEID_GBT_ENTR_STAND_STILL: - Animation_Change(&this->skelAnime, &gGerudoPurpleGreatBayCutsceneAnim, 0.0f, 0.0f, 0.0f, 2, 0.0f); + Animation_Change(&this->skelAnime, &gGerudoPurpleGreatBayCutsceneAnim, 0.0f, 0.0f, 0.0f, + ANIMMODE_ONCE, 0.0f); break; case ENGE2_CUEID_GBT_ENTR_BLOWN_AWAY: - Animation_Change(&this->skelAnime, &gGerudoPurpleGreatBayCutsceneAnim, 0.0f, 1.0f, 1.0f, 2, 0.0f); + Animation_Change(&this->skelAnime, &gGerudoPurpleGreatBayCutsceneAnim, 0.0f, 1.0f, 1.0f, + ANIMMODE_ONCE, 0.0f); EnGe2_SetupBlownAwayPath(this, play); this->stateFlags |= GERUDO_PURPLE_STATE_DISABLE_MOVEMENT; this->screamTimer = (s32)(Rand_ZeroFloat(10.0f) + 20.0f); diff --git a/src/overlays/actors/ovl_En_Ge3/z_en_ge3.c b/src/overlays/actors/ovl_En_Ge3/z_en_ge3.c index e55d0746e..21f207e7c 100644 --- a/src/overlays/actors/ovl_En_Ge3/z_en_ge3.c +++ b/src/overlays/actors/ovl_En_Ge3/z_en_ge3.c @@ -15,7 +15,7 @@ void EnGe3_Destroy(Actor* thisx, PlayState* play); void EnGe3_Update(Actor* thisx, PlayState* play); void EnGe3_Draw(Actor* thisx, PlayState* play); -void EnGe3_ChangeAnim(EnGe3* this, s16 animIndex, u8 mode, f32 morphFrames); +void EnGe3_ChangeAnim(EnGe3* this, s16 animIndex, u8 animMode, f32 morphFrames); void EnGe3_SetupPath(EnGe3* this, PlayState* play); void EnGe3_Idle(EnGe3* this, PlayState* play); void EnGe3_AveilsChamberIdle(EnGe3* this, PlayState* play); @@ -111,7 +111,7 @@ void EnGe3_Destroy(Actor* thisx, PlayState* play) { Collider_DestroyCylinder(play, &this->collider); } -void EnGe3_ChangeAnim(EnGe3* this, s16 animIndex, u8 mode, f32 morphFrames) { +void EnGe3_ChangeAnim(EnGe3* this, s16 animIndex, u8 animMode, f32 morphFrames) { static AnimationHeader* sAnimations[GERUDO_AVEIL_ANIM_MAX] = { &gGerudoRedStandAnim, // GERUDO_AVEIL_ANIM_STAND &gGerudoRedWalkAnim, // GERUDO_AVEIL_ANIM_WALK @@ -125,7 +125,7 @@ void EnGe3_ChangeAnim(EnGe3* this, s16 animIndex, u8 mode, f32 morphFrames) { }; Animation_Change(&this->skelAnime, sAnimations[animIndex], 1.0f, 0.0f, - Animation_GetLastFrame(sAnimations[animIndex]), mode, morphFrames); + Animation_GetLastFrame(sAnimations[animIndex]), animMode, morphFrames); this->animIndex = animIndex; } diff --git a/src/overlays/actors/ovl_En_Geg/z_en_geg.c b/src/overlays/actors/ovl_En_Geg/z_en_geg.c index a01bfbd19..9183856ab 100644 --- a/src/overlays/actors/ovl_En_Geg/z_en_geg.c +++ b/src/overlays/actors/ovl_En_Geg/z_en_geg.c @@ -7,7 +7,6 @@ #include "z_en_geg.h" #include "overlays/actors/ovl_En_Bom/z_en_bom.h" #include "overlays/effects/ovl_Effect_Ss_Hahen/z_eff_ss_hahen.h" -#include "objects/object_oF1d_map/object_oF1d_map.h" #include "objects/object_taisou/object_taisou.h" #include "objects/object_hakugin_demo/object_hakugin_demo.h" #include "objects/gameplay_keep/gameplay_keep.h" @@ -126,68 +125,112 @@ static DamageTable sDamageTable = { /* Powder Keg */ DMG_ENTRY(1, 0x0), }; -static AnimationInfoS sAnimationInfo[] = { - { &gGoronLyingDownIdleAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, - { &gGoronLyingDownIdleAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, - { &gGoronUnrollAnim, 2.0f, 0, -1, ANIMMODE_ONCE, 0 }, - { &gGoronUnrollAnim, 2.0f, 0, -1, ANIMMODE_ONCE, -4 }, - { &gGoronUnrollAnim, -2.0f, 0, -1, ANIMMODE_ONCE, -4 }, - { &gGoronShiverAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, - { &gGoronShiverAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, - { &gGoronDropKegAnim, 1.0f, 0, -1, ANIMMODE_ONCE, -4 }, - { &gGoronAthleticsSquatSideToSideAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, - { &gGoronAthleticsDoubleArmSideBendAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, - { &gGoronAthleticsShakeLimbsAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, - { &gGoronAthleticsSingleArmSideBendAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, - { &gGoronAthleticsHamstringStretchSittingAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, - { &gGoronAthleticsCheerAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, - { &gGoronAthleticsShoutAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, - { &gGoronAthleticsHamstringStretchStandingAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, - { &gGoronCoverEarsAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, - { &gGoronSpringLookAroundAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, - { &gGoronSpringLookAroundLoopAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, - { &gGoronShiveringSurprisedAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, - { &gGoronStandingIdleAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, +typedef enum { + /* -1 */ ENGEG_ANIM_NONE = -1, + /* 0x00 */ ENGEG_ANIM_0, + /* 0x01 */ ENGEG_ANIM_1, + /* 0x02 */ ENGEG_ANIM_2, + /* 0x03 */ ENGEG_ANIM_3, + /* 0x04 */ ENGEG_ANIM_4, + /* 0x05 */ ENGEG_ANIM_5, + /* 0x06 */ ENGEG_ANIM_6, + /* 0x07 */ ENGEG_ANIM_7, + /* 0x08 */ ENGEG_ANIM_8, + /* 0x09 */ ENGEG_ANIM_9, + /* 0x0A */ ENGEG_ANIM_10, + /* 0x0B */ ENGEG_ANIM_11, + /* 0x0C */ ENGEG_ANIM_12, + /* 0x0D */ ENGEG_ANIM_13, + /* 0x0E */ ENGEG_ANIM_14, + /* 0x0F */ ENGEG_ANIM_15, + /* 0x10 */ ENGEG_ANIM_16, + /* 0x11 */ ENGEG_ANIM_17, + /* 0x12 */ ENGEG_ANIM_18, + /* 0x13 */ ENGEG_ANIM_19, + /* 0x14 */ ENGEG_ANIM_20, + /* 0x15 */ ENGEG_ANIM_MAX +} EnGegAnimation; + +static AnimationInfoS sAnimationInfo[ENGEG_ANIM_MAX] = { + { &gGoronLyingDownIdleAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENGEG_ANIM_0 + { &gGoronLyingDownIdleAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // ENGEG_ANIM_1 + { &gGoronUnrollAnim, 2.0f, 0, -1, ANIMMODE_ONCE, 0 }, // ENGEG_ANIM_2 + { &gGoronUnrollAnim, 2.0f, 0, -1, ANIMMODE_ONCE, -4 }, // ENGEG_ANIM_3 + { &gGoronUnrollAnim, -2.0f, 0, -1, ANIMMODE_ONCE, -4 }, // ENGEG_ANIM_4 + { &gGoronShiverAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENGEG_ANIM_5 + { &gGoronShiverAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // ENGEG_ANIM_6 + { &gGoronDropKegAnim, 1.0f, 0, -1, ANIMMODE_ONCE, -4 }, // ENGEG_ANIM_7 + { &gGoronAthleticsSquatSideToSideAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENGEG_ANIM_8 + { &gGoronAthleticsDoubleArmSideBendAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENGEG_ANIM_9 + { &gGoronAthleticsShakeLimbsAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENGEG_ANIM_10 + { &gGoronAthleticsSingleArmSideBendAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENGEG_ANIM_11 + { &gGoronAthleticsHamstringStretchSittingAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENGEG_ANIM_12 + { &gGoronAthleticsCheerAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENGEG_ANIM_13 + { &gGoronAthleticsShoutAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENGEG_ANIM_14 + { &gGoronAthleticsHamstringStretchStandingAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENGEG_ANIM_15 + { &gGoronCoverEarsAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENGEG_ANIM_16 + { &gGoronSpringLookAroundAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // ENGEG_ANIM_17 + { &gGoronSpringLookAroundLoopAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // ENGEG_ANIM_18 + { &gGoronShiveringSurprisedAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // ENGEG_ANIM_19 + { &gGoronStandingIdleAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENGEG_ANIM_20 }; u16 func_80BB16D0(EnGeg* this) { switch (this->unk_496) { case 0xD5E: return 0xD5F; + case 0xD5F: return 0xD60; + case 0xD60: return 0xD61; + case 0xD62: return 0xD63; + case 0xD64: return 0xD65; + case 0xD66: return 0xD67; + case 0xD67: return 0xD68; + case 0xD68: return 0xD69; + case 0xD6A: return 0xD6B; + case 0xD6B: return 0xD6C; + case 0xD6C: return 0xD6D; + case 0xD6E: return 0xD6F; + case 0xD70: return 0xD71; + case 0xD71: return 0xD72; + case 0xD73: return 0xD74; + case 0xD74: return 0xD75; + case 0xD89: return 0xD8A; + + default: + return 0; } - return 0; } void func_80BB178C(EnGeg* this, PlayState* play) { @@ -372,14 +415,14 @@ s32 func_80BB1D64(EnGeg* this, PlayState* play) { return true; } -void func_80BB1FCC(EnGeg* this, PlayState* play) { +void EnGeg_UpdateSkelAnime(EnGeg* this, PlayState* play) { gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[this->unk_248].segment); SkelAnime_Update(&this->skelAnime); } -void func_80BB2020(EnGeg* this, PlayState* play) { +void EnGeg_ChangeAnim(EnGeg* this, PlayState* play) { gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[this->unk_248].segment); - SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, this->unk_4AC); + SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, this->animIndex); } s32 func_80BB2088(EnGeg* this, PlayState* play) { @@ -393,7 +436,7 @@ s32 func_80BB2088(EnGeg* this, PlayState* play) { } if (Actor_IsFacingAndNearPlayer(&this->actor, 300.0f, 0x7FF8) && - ((this->unk_4AC == 5) || ((this->unk_4AC == 13) && (this->unk_496 == 0xD69)))) { + ((this->animIndex == ENGEG_ANIM_5) || ((this->animIndex == ENGEG_ANIM_13) && (this->unk_496 == 0xD69)))) { this->unk_230 |= 2; func_80BB1D64(this, play); } else { @@ -412,8 +455,8 @@ s32 func_80BB2088(EnGeg* this, PlayState* play) { void func_80BB217C(EnGeg* this, PlayState* play) { if (Object_IsLoaded(&play->objectCtx, this->unk_248)) { - this->unk_4AC = 5; - func_80BB2020(this, play); + this->animIndex = ENGEG_ANIM_5; + EnGeg_ChangeAnim(this, play); Actor_SetScale(&this->actor, 0.01f); this->unk_230 = 0; this->actor.shape.shadowScale = 20.0f; @@ -509,8 +552,8 @@ void func_80BB2520(EnGeg* this, PlayState* play) { case 0xD66: this->unk_248 = Object_GetIndex(&play->objectCtx, OBJECT_OF1D_MAP); if (this->unk_248 >= 0) { - this->unk_4AC = 19; - func_80BB2020(this, play); + this->animIndex = ENGEG_ANIM_19; + EnGeg_ChangeAnim(this, play); } this->unk_230 |= 0x20; this->actionFunc = func_80BB2944; @@ -527,11 +570,14 @@ void func_80BB2520(EnGeg* this, PlayState* play) { case 0xD8B: this->unk_248 = Object_GetIndex(&play->objectCtx, OBJECT_OF1D_MAP); if (this->unk_248 >= 0) { - this->unk_4AC = 4; - func_80BB2020(this, play); + this->animIndex = ENGEG_ANIM_4; + EnGeg_ChangeAnim(this, play); } this->actionFunc = func_80BB2E00; break; + + default: + break; } } else { if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) { @@ -557,6 +603,9 @@ void func_80BB26EC(EnGeg* this, PlayState* play) { this->unk_230 &= ~0x10; this->actionFunc = func_80BB221C; return; + + default: + break; } this->unk_496 = func_80BB16D0(this); @@ -609,12 +658,12 @@ void func_80BB27D4(EnGeg* this, PlayState* play) { void func_80BB2944(EnGeg* this, PlayState* play) { u8 talkState = Message_GetState(&play->msgCtx); s16 curFrame = this->skelAnime.curFrame; - s16 lastFrame = Animation_GetLastFrame(sAnimationInfo[this->unk_4AC].animation); + s16 endFrame = Animation_GetLastFrame(sAnimationInfo[this->animIndex].animation); - if (this->unk_4AC == 19) { - if (curFrame == lastFrame) { - this->unk_4AC = 6; - func_80BB2020(this, play); + if (this->animIndex == ENGEG_ANIM_19) { + if (curFrame == endFrame) { + this->animIndex = ENGEG_ANIM_6; + EnGeg_ChangeAnim(this, play); } } else if ((talkState == TEXT_STATE_5) && Message_ShouldAdvance(play)) { if (this->unk_496 == 0xD67) { @@ -666,8 +715,8 @@ void func_80BB2B1C(EnGeg* this, PlayState* play) { Message_ContinueTextbox(play, this->unk_496); this->unk_248 = Object_GetIndex(&play->objectCtx, OBJECT_TAISOU); if (this->unk_248 >= 0) { - this->unk_4AC = 13; - func_80BB2020(this, play); + this->animIndex = ENGEG_ANIM_13; + EnGeg_ChangeAnim(this, play); } this->actionFunc = func_80BB27D4; } else { @@ -704,21 +753,21 @@ void func_80BB2B1C(EnGeg* this, PlayState* play) { } void func_80BB2E00(EnGeg* this, PlayState* play) { - s16 sp2E = this->skelAnime.curFrame; - s16 sp2C = Animation_GetLastFrame(sAnimationInfo[this->unk_4AC].animation); + s16 curFrame = this->skelAnime.curFrame; + s16 endFrame = Animation_GetLastFrame(sAnimationInfo[this->animIndex].animation); - if (this->unk_4AC == 2) { + if (this->animIndex == ENGEG_ANIM_2) { Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 5, 0x1000, 0x100); this->actor.world.rot.y = this->actor.shape.rot.y; - if (sp2E == sp2C) { + if (curFrame == endFrame) { CutsceneManager_Stop(this->csId); - this->unk_4AC = 20; - func_80BB2020(this, play); + this->animIndex = ENGEG_ANIM_20; + EnGeg_ChangeAnim(this, play); this->actionFunc = func_80BB30B4; } else if (Animation_OnFrame(&this->skelAnime, 24.0f)) { Actor_PlaySfx(&this->actor, NA_SE_EN_GOLON_STAND_IMT); } - } else if (this->unk_4AC == 4) { + } else if (this->animIndex == ENGEG_ANIM_4) { if (Animation_OnFrame(&this->skelAnime, 0.0f)) { this->unk_230 |= 1; this->actor.shape.yOffset = 14.0f; @@ -740,11 +789,11 @@ void func_80BB2F7C(EnGeg* this, PlayState* play) { if ((this->actor.xzDistToPlayer < 150.0f) && (fabsf(this->actor.playerHeightRel) < 10.0f) && (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) { - this->unk_4AC = 2; + this->animIndex = ENGEG_ANIM_2; this->actor.speed = 0.0f; this->unk_230 &= ~1; this->actor.shape.yOffset = 0.0f; - func_80BB2020(this, play); + EnGeg_ChangeAnim(this, play); this->actionFunc = func_80BB2E00; } else { this->actor.speed = 5.0f; @@ -902,7 +951,7 @@ void EnGeg_Update(Actor* thisx, PlayState* play) { EnGeg* this = THIS; this->actionFunc(this, play); - func_80BB1FCC(this, play); + EnGeg_UpdateSkelAnime(this, play); func_80BB2088(this, play); func_80BB1C8C(this); SubS_UpdateFidgetTables(play, this->fidgetTableY, this->fidgetTableZ, ENGEG_FIDGET_TABLE_LEN); diff --git a/src/overlays/actors/ovl_En_Geg/z_en_geg.h b/src/overlays/actors/ovl_En_Geg/z_en_geg.h index 522312fc2..980ada9fd 100644 --- a/src/overlays/actors/ovl_En_Geg/z_en_geg.h +++ b/src/overlays/actors/ovl_En_Geg/z_en_geg.h @@ -2,6 +2,7 @@ #define Z_EN_GEG_H #include "global.h" +#include "objects/object_oF1d_map/object_oF1d_map.h" struct EnGeg; @@ -23,8 +24,8 @@ typedef struct EnGeg { /* 0x242 */ s16 unk_242; /* 0x244 */ s16 unk_244; /* 0x248 */ s32 unk_248; - /* 0x24C */ Vec3s jointTable[18]; - /* 0x2B8 */ Vec3s morphTable[18]; + /* 0x24C */ Vec3s jointTable[GORON_LIMB_MAX]; + /* 0x2B8 */ Vec3s morphTable[GORON_LIMB_MAX]; /* 0x324 */ UNK_TYPE1 unk324[0x144]; /* 0x468 */ s16 unk_468; /* 0x46A */ s16 unk_46A; @@ -38,7 +39,7 @@ typedef struct EnGeg { /* 0x498 */ s16 csId; /* 0x49A */ s16 nextCsId; /* 0x49C */ s16 csIdList[8]; - /* 0x4AC */ s32 unk_4AC; + /* 0x4AC */ s32 animIndex; /* 0x4B0 */ s16 unk_4B0; /* 0x4B4 */ Vec3f unk_4B4; /* 0x4C0 */ Vec3f unk_4C0[2]; diff --git a/src/overlays/actors/ovl_En_Gg/z_en_gg.c b/src/overlays/actors/ovl_En_Gg/z_en_gg.c index ab1f8b539..1d59139a4 100644 --- a/src/overlays/actors/ovl_En_Gg/z_en_gg.c +++ b/src/overlays/actors/ovl_En_Gg/z_en_gg.c @@ -6,7 +6,6 @@ #include "z_en_gg.h" #include "objects/gameplay_keep/gameplay_keep.h" -#include "objects/object_gg/object_gg.h" #define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_REACT_TO_LENS) @@ -95,15 +94,44 @@ static DamageTable sDamageTable = { /* Powder Keg */ DMG_ENTRY(0, 0x0), }; -static AnimationInfo sAnimationInfo[] = { - { &object_gg_Anim_00F578, 1.0f, 0.0f, 0.0f, 0, -10.0f }, { &object_gg_Anim_00D528, 1.0f, 0.0f, 0.0f, 2, -10.0f }, - { &object_gg_Anim_00D174, 1.0f, 0.0f, 0.0f, 2, -10.0f }, { &object_gg_Anim_00ECC0, 1.0f, 0.0f, 0.0f, 2, -10.0f }, - { &object_gg_Anim_00BAF0, 1.0f, 0.0f, 0.0f, 0, -10.0f }, { &object_gg_Anim_00AF40, 1.0f, 0.0f, 0.0f, 0, -10.0f }, - { &object_gg_Anim_00F578, 1.0f, 0.0f, 0.0f, 0, -10.0f }, { &object_gg_Anim_00AF40, 1.0f, 0.0f, 0.0f, 0, -10.0f }, - { &object_gg_Anim_00F578, 1.0f, 0.0f, 0.0f, 0, -10.0f }, { &object_gg_Anim_0100C8, 1.0f, 0.0f, 0.0f, 0, 0.0f }, - { &object_gg_Anim_00CDA0, 1.0f, 0.0f, 0.0f, 0, 0.0f }, { &object_gg_Anim_00B560, 1.0f, 0.0f, 0.0f, 0, 0.0f }, - { &object_gg_Anim_00A4B4, 1.0f, 0.0f, 0.0f, 2, 0.0f }, { &object_gg_Anim_00E86C, 1.0f, 0.0f, 0.0f, 2, 0.0f }, - { &object_gg_Anim_00D99C, 1.0f, 0.0f, 0.0f, 2, 0.0f }, { &object_gg_Anim_00E2A4, 1.0f, 0.0f, 0.0f, 0, 0.0f }, +typedef enum { + /* -1 */ ENGG_ANIM_NONE = -1, + /* 0x00 */ ENGG_ANIM_0, + /* 0x01 */ ENGG_ANIM_1, + /* 0x02 */ ENGG_ANIM_2, + /* 0x03 */ ENGG_ANIM_3, + /* 0x04 */ ENGG_ANIM_4, + /* 0x05 */ ENGG_ANIM_5, + /* 0x06 */ ENGG_ANIM_6, + /* 0x07 */ ENGG_ANIM_7, + /* 0x08 */ ENGG_ANIM_8, + /* 0x09 */ ENGG_ANIM_9, + /* 0x0A */ ENGG_ANIM_10, + /* 0x0B */ ENGG_ANIM_11, + /* 0x0C */ ENGG_ANIM_12, + /* 0x0D */ ENGG_ANIM_13, + /* 0x0E */ ENGG_ANIM_14, + /* 0x0F */ ENGG_ANIM_15, + /* 0x10 */ ENGG_ANIM_MAX +} EnGgAnimation; + +static AnimationInfo sAnimationInfo[ENGG_ANIM_MAX] = { + { &object_gg_Anim_00F578, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -10.0f }, // ENGG_ANIM_0 + { &object_gg_Anim_00D528, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -10.0f }, // ENGG_ANIM_1 + { &object_gg_Anim_00D174, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -10.0f }, // ENGG_ANIM_2 + { &object_gg_Anim_00ECC0, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -10.0f }, // ENGG_ANIM_3 + { &object_gg_Anim_00BAF0, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -10.0f }, // ENGG_ANIM_4 + { &object_gg_Anim_00AF40, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -10.0f }, // ENGG_ANIM_5 + { &object_gg_Anim_00F578, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -10.0f }, // ENGG_ANIM_6 + { &object_gg_Anim_00AF40, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -10.0f }, // ENGG_ANIM_7 + { &object_gg_Anim_00F578, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -10.0f }, // ENGG_ANIM_8 + { &object_gg_Anim_0100C8, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, // ENGG_ANIM_9 + { &object_gg_Anim_00CDA0, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, // ENGG_ANIM_10 + { &object_gg_Anim_00B560, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, // ENGG_ANIM_11 + { &object_gg_Anim_00A4B4, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, 0.0f }, // ENGG_ANIM_12 + { &object_gg_Anim_00E86C, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, 0.0f }, // ENGG_ANIM_13 + { &object_gg_Anim_00D99C, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, 0.0f }, // ENGG_ANIM_14 + { &object_gg_Anim_00E2A4, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, // ENGG_ANIM_15 }; void func_80B34F70(EnGg* this) { @@ -149,7 +177,7 @@ void func_80B35108(EnGg* this, PlayState* play) { } void func_80B351A4(EnGg* this) { - if ((this->unk_2E6 == 2) || (this->unk_2E6 == 3)) { + if ((this->animIndex == ENGG_ANIM_2) || (this->animIndex == ENGG_ANIM_3)) { this->unk_2E2 = 3; } else { s16 temp = this->unk_2E4 - 1; @@ -170,57 +198,57 @@ void func_80B351A4(EnGg* this) { void func_80B35250(EnGg* this) { this->unk_2E4 = 20; this->unk_2E2 = 0; - this->unk_2E6 = 0; - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 0); + this->animIndex = ENGG_ANIM_0; + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENGG_ANIM_0); this->actionFunc = func_80B35450; } void func_80B352A4(EnGg* this, PlayState* play) { - s16 sp26 = this->skelAnime.curFrame; - s16 lastFrame = Animation_GetLastFrame(sAnimationInfo[this->unk_2E6].animation); + s16 curFrame = this->skelAnime.curFrame; + s16 endFrame = Animation_GetLastFrame(sAnimationInfo[this->animIndex].animation); - if (sp26 == lastFrame) { + if (curFrame == endFrame) { switch (this->actor.textId) { case 0xCE5: - this->unk_2E6 = 1; - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 1); + this->animIndex = ENGG_ANIM_1; + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENGG_ANIM_1); break; case 0xCE6: case 0xCEC: - this->unk_2E6 = 0; - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 0); + this->animIndex = ENGG_ANIM_0; + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENGG_ANIM_0); break; case 0xCE8: - this->unk_2E6 = 2; - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 2); + this->animIndex = ENGG_ANIM_2; + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENGG_ANIM_2); break; case 0xCE9: - this->unk_2E6 = 3; - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 3); + this->animIndex = ENGG_ANIM_3; + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENGG_ANIM_3); break; case 0xCED: case 0xCEE: - this->unk_2E6 = 4; - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 4); + this->animIndex = ENGG_ANIM_4; + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENGG_ANIM_4); break; default: - this->unk_2E6 = 0; - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 0); + this->animIndex = ENGG_ANIM_0; + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENGG_ANIM_0); break; } SET_WEEKEVENTREG(WEEKEVENTREG_19_80); this->actionFunc = func_80B3556C; - } else if ((this->unk_2E6 == 0) && ((this->actor.textId == 0xCED) || (this->actor.textId == 0xCEE))) { - if (sp26 < (lastFrame - 1)) { + } else if ((this->animIndex == ENGG_ANIM_0) && ((this->actor.textId == 0xCED) || (this->actor.textId == 0xCEE))) { + if (curFrame < (endFrame - 1)) { this->skelAnime.playSpeed = 2.0f; } else { - this->unk_2E6 = 4; - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 4); + this->animIndex = ENGG_ANIM_4; + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENGG_ANIM_4); } } } @@ -249,7 +277,7 @@ void func_80B35450(EnGg* this, PlayState* play) { void func_80B3556C(EnGg* this, PlayState* play) { if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) { - if (this->unk_2E6 == 4) { + if (this->animIndex == ENGG_ANIM_4) { play->msgCtx.msgMode = 0x43; play->msgCtx.stateTimer = 4; this->unk_308 = 0; @@ -275,47 +303,43 @@ void func_80B35634(EnGg* this, PlayState* play) { switch (play->csCtx.actorCues[cueChannel]->id) { case 1: - this->unk_2DA = 0; - this->unk_2E6 = 0; + this->csAnimIndex = ENGG_ANIM_0; + this->animIndex = ENGG_ANIM_0; break; case 2: - this->unk_2DA = 9; - this->unk_2E6 = 9; + this->csAnimIndex = ENGG_ANIM_9; + this->animIndex = ENGG_ANIM_9; break; case 3: - this->unk_2DA = 10; - this->unk_2E6 = 10; + this->csAnimIndex = ENGG_ANIM_10; + this->animIndex = ENGG_ANIM_10; break; case 4: - do { - this->unk_344.unk_30 = this->unk_2DA = 11; - } while (0); - this->unk_2E6 = 11; + this->unk_344.animIndex = this->csAnimIndex = ENGG_ANIM_11; + this->animIndex = ENGG_ANIM_11; func_80B364D4(&this->unk_344, play); break; case 5: - do { - this->unk_344.unk_30 = this->unk_2DA = 12; - } while (0); - this->unk_2E6 = 12; + this->unk_344.animIndex = this->csAnimIndex = ENGG_ANIM_12; + //! FAKE: + if (1) {} + this->animIndex = ENGG_ANIM_12; break; case 6: - do { - this->unk_344.unk_30 = this->unk_2DA = 13; - } while (0); - this->unk_2E6 = 13; + this->unk_344.animIndex = this->csAnimIndex = ENGG_ANIM_13; + //! FAKE: + if (1) {} + this->animIndex = ENGG_ANIM_13; break; case 7: - do { - this->unk_344.unk_30 = this->unk_2DA = 14; - } while (0); - this->unk_2E6 = 14; + this->unk_344.animIndex = this->csAnimIndex = ENGG_ANIM_14; + this->animIndex = ENGG_ANIM_14; func_80B364D4(&this->unk_344, play); break; @@ -324,13 +348,13 @@ void func_80B35634(EnGg* this, PlayState* play) { return; default: - this->unk_2DA = 0; + this->csAnimIndex = ENGG_ANIM_0; break; } - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, this->unk_2DA); + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, this->csAnimIndex); } - if (this->unk_2DA == 14) { + if (this->csAnimIndex == ENGG_ANIM_14) { func_80B358D8(this, play); } @@ -345,16 +369,22 @@ u16 func_80B357F0(EnGg* this) { switch (this->actor.textId) { case 0xCE5: return 0xCE6; + case 0xCE6: return 0xCE8; + case 0xCE8: return 0xCE9; + case 0xCE9: return 0xCEC; + case 0xCEC: return 0xCED; + + default: + return 0; } - return 0; } void func_80B3584C(EnGg* this) { @@ -366,12 +396,12 @@ void func_80B3584C(EnGg* this) { } void func_80B358D8(EnGg* this, PlayState* play) { - s16 sp1E = this->skelAnime.curFrame; - s16 lastFrame = Animation_GetLastFrame(sAnimationInfo[this->unk_2DA].animation); + s16 curFrame = this->skelAnime.curFrame; + s16 endFrame = Animation_GetLastFrame(sAnimationInfo[this->csAnimIndex].animation); - if ((this->unk_2E6 == 14) && (sp1E == lastFrame)) { - this->unk_2E6 = 15; - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 15); + if ((this->animIndex == ENGG_ANIM_14) && (curFrame == endFrame)) { + this->animIndex = ENGG_ANIM_15; + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENGG_ANIM_15); } } @@ -379,8 +409,8 @@ void func_80B35968(EnGg* this, PlayState* play) { if (this->unk_344.unk_34 != NULL) { this->unk_344.unk_34(&this->unk_344, play); } else { - if ((this->unk_2DA == 11) || (this->unk_2DA == 14)) { - this->unk_344.unk_30 = this->unk_2DA; + if ((this->csAnimIndex == ENGG_ANIM_11) || (this->csAnimIndex == ENGG_ANIM_14)) { + this->unk_344.animIndex = this->csAnimIndex; } func_80B363E8(&this->unk_344, play, &this->unk_320, &this->unk_32C, &this->unk_338); } @@ -433,7 +463,7 @@ void func_80B35B24(EnGgStruct* ptr, PlayState* play) { } void func_80B35B44(EnGgStruct* ptr, PlayState* play) { - if (ptr->unk_30 == 0xE) { + if (ptr->animIndex == ENGG_ANIM_14) { ptr->unk_40++; if (ptr->unk_40 > 0x46) { ptr->unk_48 = 1; @@ -455,13 +485,13 @@ void func_80B35B44(EnGgStruct* ptr, PlayState* play) { ptr->unk_44 = 0x37; } } - } else if ((ptr->unk_30 == 11) || (ptr->unk_30 == 12)) { + } else if ((ptr->animIndex == ENGG_ANIM_11) || (ptr->animIndex == ENGG_ANIM_12)) { ptr->unk_40++; if (ptr->unk_40 > 0x46) { ptr->unk_48 = 1; ptr->unk_40 = 0; } - } else if (ptr->unk_30 == 0xD) { + } else if (ptr->animIndex == ENGG_ANIM_13) { ptr->unk_48 = 0; ptr->unk_40++; if (ptr->unk_40 > 0x46) { @@ -496,7 +526,7 @@ void func_80B35C84(EnGgStruct* ptr, PlayState* play) { sp74 = ptr->unk_40 % temp; ptr->unk_40 = sp74; phi_s7 = 0x46; - } else if (ptr->unk_30 == 0xD) { + } else if (ptr->animIndex == ENGG_ANIM_13) { sp74 = ptr->unk_40; phi_s7 = 0x46; } else { @@ -519,6 +549,7 @@ void func_80B35C84(EnGgStruct* ptr, PlayState* play) { temp_f26 = ptr->unk_00.z + (ptr->unk_18.z * temp_f20) + (0.5f * ptr->unk_24.z * temp_f20 * temp_f20); temp_f20 = Rand_ZeroOne() * 0.003f; + //! FAKE: if (1) {} Matrix_Translate(temp_f22, temp_f24, temp_f26, MTXMODE_NEW); @@ -630,9 +661,9 @@ void func_80B363E8(EnGgStruct* ptr, PlayState* play, Vec3f* arg1, Vec3f* arg2, V ptr->unk_00.x += -4.0f; ptr->unk_0C.x += 4.0f; - if ((ptr->unk_30 == 11) || (ptr->unk_30 == 12) || (ptr->unk_30 == 13)) { + if ((ptr->animIndex == ENGG_ANIM_11) || (ptr->animIndex == ENGG_ANIM_12) || (ptr->animIndex == ENGG_ANIM_13)) { ptr->unk_38 = func_80B35C84; - } else if (ptr->unk_30 == 14) { + } else if (ptr->animIndex == ENGG_ANIM_14) { ptr->unk_38 = func_80B3610C; } } @@ -655,7 +686,7 @@ void EnGg_Init(Actor* thisx, PlayState* play) { ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 30.0f); this->actor.bgCheckFlags |= BGCHECKFLAG_PLAYER_400; SkelAnime_InitFlex(play, &this->skelAnime, &object_gg_Skel_00F6C0, &object_gg_Anim_00F578, this->jointTable, - this->morphTable, 20); + this->morphTable, OBJECT_GG_LIMB_MAX); Collider_InitCylinder(play, &this->collider); Collider_SetCylinder(play, &this->collider, &this->actor, &sCylinderInit); @@ -700,11 +731,13 @@ void EnGg_Update(Actor* thisx, PlayState* play) { } if ((play->csCtx.state == CS_STATE_IDLE) && - ((this->unk_2DA != 14) && (this->unk_2DA != 11) && (this->unk_2DA != 12) && (this->unk_2DA != 13))) { + ((this->csAnimIndex != ENGG_ANIM_14) && (this->csAnimIndex != ENGG_ANIM_11) && + (this->csAnimIndex != ENGG_ANIM_12) && (this->csAnimIndex != ENGG_ANIM_13))) { func_80B364D4(&this->unk_344, play); } - if (((this->unk_2DA == 14) || (this->unk_2DA == 11) || (this->unk_2DA == 12) || (this->unk_2DA == 13)) && + if (((this->csAnimIndex == ENGG_ANIM_14) || (this->csAnimIndex == ENGG_ANIM_11) || + (this->csAnimIndex == ENGG_ANIM_12) || (this->csAnimIndex == ENGG_ANIM_13)) && (this->unk_309 == 1)) { func_80B35968(this, play); } @@ -738,7 +771,7 @@ s32 EnGg_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* po Gfx** gfx) { EnGg* this = THIS; - if (limbIndex == 2) { + if (limbIndex == OBJECT_GG_LIMB_02) { Matrix_RotateZS(this->unk_2E8, MTXMODE_APPLY); } return false; @@ -750,12 +783,13 @@ void EnGg_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Vec3f sp30 = { 0.0f, 0.0f, 0.0f }; Vec3f sp24 = { 0.0f, 0.0f, 0.0f }; - if (this->unk_2DA == 14) { + if (this->csAnimIndex == ENGG_ANIM_14) { sp30.y = 3.0f; sp30.z = -1.0f; sp24.y = -0.07f; this->unk_309 = 1; - } else if ((this->unk_2DA == 11) || (this->unk_2DA == 12) || (this->unk_2DA == 13)) { + } else if ((this->csAnimIndex == ENGG_ANIM_11) || (this->csAnimIndex == ENGG_ANIM_12) || + (this->csAnimIndex == ENGG_ANIM_13)) { sp30.x = 3.0f; sp24.x = 0.5f; this->unk_309 = 1; @@ -763,7 +797,7 @@ void EnGg_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, this->unk_309 = 0; } - if (limbIndex == 4) { + if (limbIndex == OBJECT_GG_LIMB_04) { Matrix_MultVec3f(&D_80B36DF0, &this->unk_320); Matrix_Push(); Matrix_RotateYS(this->actor.shape.rot.y, MTXMODE_NEW); diff --git a/src/overlays/actors/ovl_En_Gg/z_en_gg.h b/src/overlays/actors/ovl_En_Gg/z_en_gg.h index 802024897..436d5a4ab 100644 --- a/src/overlays/actors/ovl_En_Gg/z_en_gg.h +++ b/src/overlays/actors/ovl_En_Gg/z_en_gg.h @@ -2,6 +2,7 @@ #define Z_EN_GG_H #include "global.h" +#include "objects/object_gg/object_gg.h" struct EnGg; struct EnGgStruct; @@ -14,7 +15,7 @@ typedef struct EnGgStruct { /* 0x0C */ Vec3f unk_0C; /* 0x18 */ Vec3f unk_18; /* 0x24 */ Vec3f unk_24; - /* 0x30 */ u8 unk_30; + /* 0x30 */ u8 animIndex; /* 0x34 */ EnGgUnkFunc unk_34; /* 0x38 */ EnGgUnkFunc unk_38; /* 0x3C */ s32 unk_3C; @@ -30,16 +31,16 @@ typedef struct EnGg { /* 0x1D4 */ EnGgActionFunc actionFunc; /* 0x1D8 */ Vec3s unk_1D8; /* 0x1DE */ Vec3s unk_1DE; - /* 0x1E4 */ Vec3s jointTable[20]; - /* 0x25C */ Vec3s morphTable[20]; + /* 0x1E4 */ Vec3s jointTable[OBJECT_GG_LIMB_MAX]; + /* 0x25C */ Vec3s morphTable[OBJECT_GG_LIMB_MAX]; /* 0x2D4 */ UNK_TYPE1 unk_2D4[0x6]; - /* 0x2DA */ u8 unk_2DA; + /* 0x2DA */ u8 csAnimIndex; /* 0x2DB */ u8 cueId; /* 0x2DC */ s16 csId; /* 0x2DE */ UNK_TYPE1 unk2DE[4]; /* 0x2E2 */ s16 unk_2E2; /* 0x2E4 */ s16 unk_2E4; - /* 0x2E6 */ s16 unk_2E6; + /* 0x2E6 */ s16 animIndex; /* 0x2E8 */ s16 unk_2E8; /* 0x2EA */ UNK_TYPE1 unk2EA[0x1A]; /* 0x304 */ s16 unk_304; diff --git a/src/overlays/actors/ovl_En_Gg2/z_en_gg2.c b/src/overlays/actors/ovl_En_Gg2/z_en_gg2.c index abb80780d..e106c8f88 100644 --- a/src/overlays/actors/ovl_En_Gg2/z_en_gg2.c +++ b/src/overlays/actors/ovl_En_Gg2/z_en_gg2.c @@ -5,7 +5,6 @@ */ #include "z_en_gg2.h" -#include "objects/object_gg/object_gg.h" #define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_REACT_TO_LENS) @@ -39,15 +38,44 @@ ActorInit En_Gg2_InitVars = { (ActorFunc)EnGg2_Draw, }; -AnimationInfo D_80B3BF00[] = { - { &object_gg_Anim_00F578, 1.0f, 0.0f, 0.0f, 0, -10.0f }, { &object_gg_Anim_00D528, 1.0f, 0.0f, 0.0f, 2, -10.0f }, - { &object_gg_Anim_00D174, 1.0f, 0.0f, 0.0f, 2, -10.0f }, { &object_gg_Anim_00ECC0, 1.0f, 0.0f, 0.0f, 2, -10.0f }, - { &object_gg_Anim_00BAF0, 1.0f, 0.0f, 0.0f, 0, -10.0f }, { &object_gg_Anim_00AF40, 1.0f, 0.0f, 0.0f, 0, -10.0f }, - { &object_gg_Anim_00F578, 1.0f, 0.0f, 0.0f, 0, -10.0f }, { &object_gg_Anim_00AF40, 1.0f, 0.0f, 0.0f, 0, -10.0f }, - { &object_gg_Anim_00F578, 1.0f, 0.0f, 0.0f, 0, -10.0f }, { &object_gg_Anim_0100C8, 1.0f, 0.0f, 0.0f, 0, 0.0f }, - { &object_gg_Anim_00CDA0, 1.0f, 0.0f, 0.0f, 0, 0.0f }, { &object_gg_Anim_00B560, 1.0f, 0.0f, 0.0f, 0, 0.0f }, - { &object_gg_Anim_00A4B4, 1.0f, 0.0f, 0.0f, 2, 0.0f }, { &object_gg_Anim_00E86C, 1.0f, 0.0f, 0.0f, 2, 0.0f }, - { &object_gg_Anim_00D99C, 1.0f, 0.0f, 0.0f, 2, 0.0f }, { &object_gg_Anim_00E2A4, 1.0f, 0.0f, 0.0f, 0, 0.0f }, +typedef enum { + /* -1 */ ENGG2_ANIM_NONE = -1, + /* 0x00 */ ENGG2_ANIM_0, + /* 0x01 */ ENGG2_ANIM_1, + /* 0x02 */ ENGG2_ANIM_2, + /* 0x03 */ ENGG2_ANIM_3, + /* 0x04 */ ENGG2_ANIM_4, + /* 0x05 */ ENGG2_ANIM_5, + /* 0x06 */ ENGG2_ANIM_6, + /* 0x07 */ ENGG2_ANIM_7, + /* 0x08 */ ENGG2_ANIM_8, + /* 0x09 */ ENGG2_ANIM_9, + /* 0x0A */ ENGG2_ANIM_10, + /* 0x0B */ ENGG2_ANIM_11, + /* 0x0C */ ENGG2_ANIM_12, + /* 0x0D */ ENGG2_ANIM_13, + /* 0x0E */ ENGG2_ANIM_14, + /* 0x0F */ ENGG2_ANIM_15, + /* 0x10 */ ENGG2_ANIM_MAX +} EnGg2Animation; + +static AnimationInfo sAnimationInfo[ENGG2_ANIM_MAX] = { + { &object_gg_Anim_00F578, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -10.0f }, // ENGG2_ANIM_0 + { &object_gg_Anim_00D528, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -10.0f }, // ENGG2_ANIM_1 + { &object_gg_Anim_00D174, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -10.0f }, // ENGG2_ANIM_2 + { &object_gg_Anim_00ECC0, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -10.0f }, // ENGG2_ANIM_3 + { &object_gg_Anim_00BAF0, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -10.0f }, // ENGG2_ANIM_4 + { &object_gg_Anim_00AF40, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -10.0f }, // ENGG2_ANIM_5 + { &object_gg_Anim_00F578, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -10.0f }, // ENGG2_ANIM_6 + { &object_gg_Anim_00AF40, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -10.0f }, // ENGG2_ANIM_7 + { &object_gg_Anim_00F578, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -10.0f }, // ENGG2_ANIM_8 + { &object_gg_Anim_0100C8, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, // ENGG2_ANIM_9 + { &object_gg_Anim_00CDA0, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, // ENGG2_ANIM_10 + { &object_gg_Anim_00B560, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, // ENGG2_ANIM_11 + { &object_gg_Anim_00A4B4, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, 0.0f }, // ENGG2_ANIM_12 + { &object_gg_Anim_00E86C, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, 0.0f }, // ENGG2_ANIM_13 + { &object_gg_Anim_00D99C, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, 0.0f }, // ENGG2_ANIM_14 + { &object_gg_Anim_00E2A4, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, // ENGG2_ANIM_15 }; Color_RGBA8 D_80B3C080 = { 255, 255, 255, 255 }; @@ -116,38 +144,38 @@ void func_80B3ADD8(EnGg2* this) { void func_80B3AE60(EnGg2* this, PlayState* play) { s16 curFrame = this->skelAnime.curFrame; - s16 lastFrame = Animation_GetLastFrame(D_80B3BF00[this->unk_2EE].animation); + s16 endFrame = Animation_GetLastFrame(sAnimationInfo[this->animIndex].animation); - if (curFrame == lastFrame) { - switch (this->unk_2EE) { - case 0: - this->unk_2EE = 1; - Actor_ChangeAnimationByInfo(&this->skelAnime, D_80B3BF00, 1); + if (curFrame == endFrame) { + switch (this->animIndex) { + case ENGG2_ANIM_0: + this->animIndex = ENGG2_ANIM_1; + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENGG2_ANIM_1); this->actionFunc = func_80B3B0A0; break; - case 1: - case 8: - this->unk_2EE = 5; + case ENGG2_ANIM_1: + case ENGG2_ANIM_8: + this->animIndex = ENGG2_ANIM_5; this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; - Actor_ChangeAnimationByInfo(&this->skelAnime, D_80B3BF00, 5); + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENGG2_ANIM_5); this->actionFunc = func_80B3B120; break; - case 5: - this->unk_2EE = 6; - Actor_ChangeAnimationByInfo(&this->skelAnime, D_80B3BF00, 0); + case ENGG2_ANIM_5: + this->animIndex = ENGG2_ANIM_6; + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENGG2_ANIM_0); this->actionFunc = func_80B3B21C; break; - case 6: - this->unk_2EE = 7; - Actor_ChangeAnimationByInfo(&this->skelAnime, D_80B3BF00, 5); + case ENGG2_ANIM_6: + this->animIndex = ENGG2_ANIM_7; + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENGG2_ANIM_5); this->actionFunc = func_80B3B294; break; default: - Actor_ChangeAnimationByInfo(&this->skelAnime, D_80B3BF00, 0); + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENGG2_ANIM_0); this->actionFunc = func_80B3AFB0; break; } @@ -338,7 +366,7 @@ f32 func_80B3B7E4(Path* path, s32 arg1, Vec3f* arg2, Vec3s* arg3) { void func_80B3B8A4(EnGg2* this) { f32 sp1C; - if ((this->unk_2EE != 5) && (this->unk_2EE != 7)) { + if ((this->animIndex != ENGG2_ANIM_5) && (this->animIndex != ENGG2_ANIM_7)) { this->unk_2F2 += 0x62C; sp1C = 1100.0f; } else { @@ -368,7 +396,7 @@ void EnGg2_Init(Actor* thisx, PlayState* play2) { ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 30.0f); this->actor.bgCheckFlags |= BGCHECKFLAG_PLAYER_400; SkelAnime_InitFlex(play, &this->skelAnime, &object_gg_Skel_00F6C0, &object_gg_Anim_00F578, this->jointTable, - this->morphTable, 20); + this->morphTable, OBJECT_GG_LIMB_MAX); this->path = SubS_GetPathByIndex(play, ENGG2_GET_PATH_INDEX(&this->actor), ENGG2_PATH_INDEX_NONE); this->actor.flags &= ~ACTOR_FLAG_REACT_TO_LENS; this->unk_2F0 = 0; @@ -384,15 +412,15 @@ void EnGg2_Init(Actor* thisx, PlayState* play2) { CLEAR_WEEKEVENTREG(WEEKEVENTREG_20_04); CLEAR_WEEKEVENTREG(WEEKEVENTREG_20_08); CLEAR_WEEKEVENTREG(WEEKEVENTREG_20_10); - this->unk_2EE = 0; - Actor_ChangeAnimationByInfo(&this->skelAnime, D_80B3BF00, 0); + this->animIndex = ENGG2_ANIM_0; + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENGG2_ANIM_0); this->actionFunc = func_80B3AFB0; } else if (play->sceneId == SCENE_17SETUGEN) { if (CHECK_WEEKEVENTREG(WEEKEVENTREG_20_04) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_20_08) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_20_10)) { CLEAR_WEEKEVENTREG(WEEKEVENTREG_20_04); - this->unk_2EE = 8; - Actor_ChangeAnimationByInfo(&this->skelAnime, D_80B3BF00, 0); + this->animIndex = ENGG2_ANIM_8; + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENGG2_ANIM_0); this->actionFunc = func_80B3B05C; } else { Actor_Kill(&this->actor); @@ -401,8 +429,8 @@ void EnGg2_Init(Actor* thisx, PlayState* play2) { if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_20_04) && CHECK_WEEKEVENTREG(WEEKEVENTREG_20_08) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_20_10)) { CLEAR_WEEKEVENTREG(WEEKEVENTREG_20_08); - this->unk_2EE = 8; - Actor_ChangeAnimationByInfo(&this->skelAnime, D_80B3BF00, 0); + this->animIndex = ENGG2_ANIM_8; + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENGG2_ANIM_0); this->actionFunc = func_80B3B05C; } else { Actor_Kill(&this->actor); @@ -424,7 +452,7 @@ void EnGg2_Update(Actor* thisx, PlayState* play) { if (play->actorCtx.lensMaskSize == LENS_MASK_ACTIVE_SIZE) { this->actor.flags |= ACTOR_FLAG_REACT_TO_LENS; this->actor.flags |= ACTOR_FLAG_TARGETABLE; - if ((this->unk_2EE == 5) && (this->unk_2EE == 7)) { + if ((this->animIndex == ENGG2_ANIM_5) && (this->animIndex == ENGG2_ANIM_7)) { this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; } } else { @@ -441,7 +469,7 @@ void EnGg2_Update(Actor* thisx, PlayState* play) { func_80B3B8A4(this); Actor_TrackPlayer(play, &this->actor, &this->unk_1E0, &this->unk_1E6, this->actor.focus.pos); - if ((this->unk_2EE == 5) || (this->unk_2EE == 7)) { + if ((this->animIndex == ENGG2_ANIM_5) || (this->animIndex == ENGG2_ANIM_7)) { Actor_PlaySfx_Flagged(&this->actor, NA_SE_EN_SHARP_FLOAT - SFX_FLAG); if ((play->actorCtx.lensMaskSize == LENS_MASK_ACTIVE_SIZE) && ((play->state.frames % 4) == 0)) { func_80B3B4B0(this, play); @@ -454,12 +482,12 @@ void EnGg2_Update(Actor* thisx, PlayState* play) { s32 func_80B3BD44(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx, Gfx** gfx) { EnGg2* this = THIS; - if ((this->unk_2EE != 5) && (this->unk_2EE != 7)) { - if (limbIndex == 1) { + if ((this->animIndex != ENGG2_ANIM_5) && (this->animIndex != ENGG2_ANIM_7)) { + if (limbIndex == OBJECT_GG_LIMB_01) { Matrix_RotateYS(this->unk_2F6, MTXMODE_APPLY); } - if (limbIndex == 2) { + if (limbIndex == OBJECT_GG_LIMB_02) { Matrix_RotateZS(this->unk_2F4, MTXMODE_APPLY); } } @@ -469,7 +497,7 @@ s32 func_80B3BD44(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s void func_80B3BDC0(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx, Gfx** gfx) { EnGg2* this = THIS; - if (limbIndex == 4) { + if (limbIndex == OBJECT_GG_LIMB_04) { Matrix_MultVec3f(&D_80B3C0A0, &this->unk_304); } } diff --git a/src/overlays/actors/ovl_En_Gg2/z_en_gg2.h b/src/overlays/actors/ovl_En_Gg2/z_en_gg2.h index 83b4bad42..dd68c20b1 100644 --- a/src/overlays/actors/ovl_En_Gg2/z_en_gg2.h +++ b/src/overlays/actors/ovl_En_Gg2/z_en_gg2.h @@ -2,6 +2,7 @@ #define Z_EN_GG2_H #include "global.h" +#include "objects/object_gg/object_gg.h" struct EnGg2; @@ -20,14 +21,14 @@ typedef struct EnGg2 { /* 0x1DC */ s32 unk_1DC; /* 0x1E0 */ Vec3s unk_1E0; /* 0x1E6 */ Vec3s unk_1E6; - /* 0x1EC */ Vec3s jointTable[20]; - /* 0x264 */ Vec3s morphTable[20]; + /* 0x1EC */ Vec3s jointTable[OBJECT_GG_LIMB_MAX]; + /* 0x264 */ Vec3s morphTable[OBJECT_GG_LIMB_MAX]; /* 0x2DC */ UNK_TYPE1 unk2DC[0x8]; /* 0x2E4 */ s16 csId; /* 0x2E6 */ UNK_TYPE1 unk2E6[4]; /* 0x2EA */ s16 unk_2EA; /* 0x2EC */ s16 unk_2EC; - /* 0x2EE */ s16 unk_2EE; + /* 0x2EE */ s16 animIndex; /* 0x2F0 */ u8 unk_2F0; /* 0x2F1 */ u8 unk_2F1; /* 0x2F2 */ s16 unk_2F2; diff --git a/src/overlays/actors/ovl_En_Giant/z_en_giant.c b/src/overlays/actors/ovl_En_Giant/z_en_giant.c index 8d244c09c..d68e6902f 100644 --- a/src/overlays/actors/ovl_En_Giant/z_en_giant.c +++ b/src/overlays/actors/ovl_En_Giant/z_en_giant.c @@ -28,10 +28,45 @@ void EnGiant_PerformCutsceneActions(EnGiant* this, PlayState* play); #define GIANT_TYPE_IS_CLOCK_TOWER_FAILURE(type) \ (type >= GIANT_TYPE_MOUNTAIN_CLOCK_TOWER_FAILURE && type <= GIANT_TYPE_OCEAN_CLOCK_TOWER_FAILURE) +/** + * Used as values for cueId. The UNKNOWN ones are never used in-game. + */ +typedef enum { + /* 0 */ GIANT_CUEID_NONE, + /* 1 */ GIANT_CUEID_IDLE, + /* 2 */ GIANT_CUEID_WALKING, + /* 3 */ GIANT_CUEID_LOOKING_UP, + /* 4 */ GIANT_CUEID_RAISING_ARMS, + /* 5 */ GIANT_CUEID_STRUGGLING, + /* 6 */ GIANT_CUEID_FALLING_OVER, + /* 7 */ GIANT_CUEID_IDLE_FADE_IN, + /* 8 */ GIANT_CUEID_TALKING, + /* 9 */ GIANT_CUEID_DONE_TALKING, + /* 10 */ GIANT_CUEID_TEACHING_OATH_TO_ORDER, + /* 11 */ GIANT_CUEID_PLAYER_LEARNED_OATH_TO_ORDER, + /* 12 */ GIANT_CUEID_UNKNOWN_12, + /* 13 */ GIANT_CUEID_UNKNOWN_13, + /* 14 */ GIANT_CUEID_UNKNOWN_14, + /* 15 */ GIANT_CUEID_HOLDING_UP_MOON_IN_CLOCK_TOWER +} GiantCueId; + +ActorInit En_Giant_InitVars = { + ACTOR_EN_GIANT, + ACTORCAT_NPC, + FLAGS, + OBJECT_GIANT, + sizeof(EnGiant), + (ActorFunc)EnGiant_Init, + (ActorFunc)EnGiant_Destroy, + (ActorFunc)EnGiant_Update, + (ActorFunc)EnGiant_Draw, +}; + /** * These values are used to index into sAnimations to pick the appropriate animation. */ typedef enum { + /* -1 */ GIANT_ANIM_NONE = -1, /* 0 */ GIANT_ANIM_LOOK_UP_START, /* 1 */ GIANT_ANIM_LOOK_UP_LOOP, /* 2 */ GIANT_ANIM_FALLING_OVER, @@ -50,49 +85,26 @@ typedef enum { /* 15 */ GIANT_ANIM_MAX } GiantAnimation; -/** - * Used as values for cueId. The UNKNOWN ones are never used in-game. - */ -typedef enum { - /* 0 */ GIANT_CUE_ID_NONE, - /* 1 */ GIANT_CUE_ID_IDLE, - /* 2 */ GIANT_CUE_ID_WALKING, - /* 3 */ GIANT_CUE_ID_LOOKING_UP, - /* 4 */ GIANT_CUE_ID_RAISING_ARMS, - /* 5 */ GIANT_CUE_ID_STRUGGLING, - /* 6 */ GIANT_CUE_ID_FALLING_OVER, - /* 7 */ GIANT_CUE_ID_IDLE_FADE_IN, - /* 8 */ GIANT_CUE_ID_TALKING, - /* 9 */ GIANT_CUE_ID_DONE_TALKING, - /* 10 */ GIANT_CUE_ID_TEACHING_OATH_TO_ORDER, - /* 11 */ GIANT_CUE_ID_PLAYER_LEARNED_OATH_TO_ORDER, - /* 12 */ GIANT_CUE_ID_UNKNOWN_12, - /* 13 */ GIANT_CUE_ID_UNKNOWN_13, - /* 14 */ GIANT_CUE_ID_UNKNOWN_14, - /* 15 */ GIANT_CUE_ID_HOLDING_UP_MOON_IN_CLOCK_TOWER -} GiantCueId; - -ActorInit En_Giant_InitVars = { - ACTOR_EN_GIANT, - ACTORCAT_NPC, - FLAGS, - OBJECT_GIANT, - sizeof(EnGiant), - (ActorFunc)EnGiant_Init, - (ActorFunc)EnGiant_Destroy, - (ActorFunc)EnGiant_Update, - (ActorFunc)EnGiant_Draw, -}; - -static AnimationHeader* sAnimations[] = { - &gGiantLookUpStartAnim, &gGiantLookUpLoopAnim, &gGiantFallingOverAnim, &gGiantRaisedArmsStartAnim, - &gGiantRaisedArmsLoopAnim, &gGiantStruggleStartAnim, &gGiantStruggleLoopAnim, &gGiantIdleAnim, - &gGiantWalkingAnim, &gGiantBigCallStartAnim, &gGiantBigCallLoopAnim, &gGiantBigCallEndAnim, - &gGiantSmallCallStartAnim, &gGiantSmallCallLoopAnim, &gGiantSmallCallEndAnim, +static AnimationHeader* sAnimations[GIANT_ANIM_MAX] = { + &gGiantLookUpStartAnim, // GIANT_ANIM_LOOK_UP_START + &gGiantLookUpLoopAnim, // GIANT_ANIM_LOOK_UP_LOOP + &gGiantFallingOverAnim, // GIANT_ANIM_FALLING_OVER + &gGiantRaisedArmsStartAnim, // GIANT_ANIM_RAISED_ARMS_START + &gGiantRaisedArmsLoopAnim, // GIANT_ANIM_RAISED_ARMS_LOOP + &gGiantStruggleStartAnim, // GIANT_ANIM_STRUGGLE_START + &gGiantStruggleLoopAnim, // GIANT_ANIM_STRUGGLE_LOOP + &gGiantIdleAnim, // GIANT_ANIM_IDLE_LOOP + &gGiantWalkingAnim, // GIANT_ANIM_WALKING_LOOP + &gGiantBigCallStartAnim, // GIANT_ANIM_BIG_CALL_START + &gGiantBigCallLoopAnim, // GIANT_ANIM_BIG_CALL_LOOP + &gGiantBigCallEndAnim, // GIANT_ANIM_BIG_CALL_END + &gGiantSmallCallStartAnim, // GIANT_ANIM_SMALL_CALL_START + &gGiantSmallCallLoopAnim, // GIANT_ANIM_SMALL_CALL_LOOP + &gGiantSmallCallEndAnim, // GIANT_ANIM_SMALL_CALL_END }; void EnGiant_ChangeAnim(EnGiant* this, s16 animIndex) { - if (animIndex >= GIANT_ANIM_LOOK_UP_START && animIndex < GIANT_ANIM_MAX) { + if ((animIndex >= GIANT_ANIM_LOOK_UP_START) && (animIndex < GIANT_ANIM_MAX)) { if (((this->animIndex == GIANT_ANIM_WALKING_LOOP) && (animIndex != GIANT_ANIM_WALKING_LOOP)) || ((animIndex == GIANT_ANIM_WALKING_LOOP) && (this->animIndex != GIANT_ANIM_WALKING_LOOP))) { Animation_Change(&this->skelAnime, sAnimations[animIndex], 1.0f, 0.0f, @@ -160,7 +172,7 @@ void EnGiant_Init(Actor* thisx, PlayState* play) { SkelAnime_InitFlex(play, &this->skelAnime, &gGiantSkel, &gGiantLargeStrideAnim, this->jointTable, this->morphTable, GIANT_LIMB_MAX); EnGiant_ChangeAnim(this, GIANT_ANIM_IDLE_LOOP); - this->cueId = GIANT_CUE_ID_NONE; + this->cueId = GIANT_CUEID_NONE; this->actionFunc = EnGiant_PerformCutsceneActions; this->actor.draw = NULL; this->alpha = 0; @@ -275,58 +287,58 @@ void EnGiant_ChangeToStartOrLoopAnimation(EnGiant* this, s16 requestedAnimIndex) */ void EnGiant_ChangeAnimBasedOnCueId(EnGiant* this) { switch (this->cueId) { - case GIANT_CUE_ID_IDLE: + case GIANT_CUEID_IDLE: EnGiant_ChangeAnim(this, GIANT_ANIM_IDLE_LOOP); break; - case GIANT_CUE_ID_WALKING: + case GIANT_CUEID_WALKING: EnGiant_ChangeAnim(this, GIANT_ANIM_WALKING_LOOP); break; - case GIANT_CUE_ID_STRUGGLING: + case GIANT_CUEID_STRUGGLING: EnGiant_ChangeAnim(this, GIANT_ANIM_STRUGGLE_START); break; - case GIANT_CUE_ID_FALLING_OVER: + case GIANT_CUEID_FALLING_OVER: EnGiant_ChangeAnim(this, GIANT_ANIM_FALLING_OVER); break; - case GIANT_CUE_ID_IDLE_FADE_IN: + case GIANT_CUEID_IDLE_FADE_IN: EnGiant_ChangeAnim(this, GIANT_ANIM_IDLE_LOOP); this->alpha = 0; break; - case GIANT_CUE_ID_TALKING: + case GIANT_CUEID_TALKING: EnGiant_ChangeAnim(this, GIANT_ANIM_BIG_CALL_START); break; - case GIANT_CUE_ID_DONE_TALKING: + case GIANT_CUEID_DONE_TALKING: EnGiant_ChangeAnim(this, GIANT_ANIM_BIG_CALL_END); break; - case GIANT_CUE_ID_TEACHING_OATH_TO_ORDER: + case GIANT_CUEID_TEACHING_OATH_TO_ORDER: EnGiant_ChangeAnim(this, GIANT_ANIM_SMALL_CALL_START); break; - case GIANT_CUE_ID_PLAYER_LEARNED_OATH_TO_ORDER: + case GIANT_CUEID_PLAYER_LEARNED_OATH_TO_ORDER: EnGiant_ChangeAnim(this, GIANT_ANIM_SMALL_CALL_END); break; - case GIANT_CUE_ID_UNKNOWN_12: + case GIANT_CUEID_UNKNOWN_12: EnGiant_ChangeAnim(this, GIANT_ANIM_IDLE_LOOP); break; - case GIANT_CUE_ID_UNKNOWN_13: + case GIANT_CUEID_UNKNOWN_13: EnGiant_ChangeAnim(this, GIANT_ANIM_WALKING_LOOP); break; - case GIANT_CUE_ID_UNKNOWN_14: + case GIANT_CUEID_UNKNOWN_14: if (this->animIndex != GIANT_ANIM_WALKING_LOOP) { EnGiant_ChangeAnim(this, GIANT_ANIM_WALKING_LOOP); } break; - case GIANT_CUE_ID_HOLDING_UP_MOON_IN_CLOCK_TOWER: + case GIANT_CUEID_HOLDING_UP_MOON_IN_CLOCK_TOWER: Animation_Change(&this->skelAnime, &gGiantRaisedArmsStartAnim, 0.0f, Animation_GetLastFrame(&gGiantRaisedArmsStartAnim) - 1.0f, Animation_GetLastFrame(&gGiantRaisedArmsStartAnim), ANIMMODE_ONCE, 0.0f); @@ -339,14 +351,16 @@ void EnGiant_ChangeAnimBasedOnCueId(EnGiant* this) { void EnGiant_UpdateAlpha(EnGiant* this) { switch (this->cueId) { - case GIANT_CUE_ID_FALLING_OVER: + case GIANT_CUEID_FALLING_OVER: if (this->skelAnime.curFrame >= 90.0f && this->alpha > 0) { this->alpha -= 12; } break; - case GIANT_CUE_ID_UNKNOWN_14: + + case GIANT_CUEID_UNKNOWN_14: this->alpha -= 12; break; + default: if (this->alpha < 255) { this->alpha += 8; @@ -363,36 +377,37 @@ void EnGiant_UpdateAlpha(EnGiant* this) { */ void EnGiant_PlayAndUpdateAnimation(EnGiant* this) { if (SkelAnime_Update(&this->skelAnime) && - (this->animIndex != GIANT_ANIM_FALLING_OVER || this->cueId != GIANT_CUE_ID_FALLING_OVER)) { + ((this->animIndex != GIANT_ANIM_FALLING_OVER) || (this->cueId != GIANT_CUEID_FALLING_OVER))) { EnGiant_ChangeAnim(this, this->animIndex); + switch (this->cueId) { - case GIANT_CUE_ID_LOOKING_UP: + case GIANT_CUEID_LOOKING_UP: EnGiant_ChangeToStartOrLoopAnimation(this, GIANT_ANIM_LOOK_UP_START); break; - case GIANT_CUE_ID_RAISING_ARMS: + case GIANT_CUEID_RAISING_ARMS: EnGiant_ChangeToStartOrLoopAnimation(this, GIANT_ANIM_RAISED_ARMS_START); break; - case GIANT_CUE_ID_STRUGGLING: + case GIANT_CUEID_STRUGGLING: EnGiant_ChangeToStartOrLoopAnimation(this, GIANT_ANIM_STRUGGLE_START); break; - case GIANT_CUE_ID_FALLING_OVER: + case GIANT_CUEID_FALLING_OVER: // Unused EnGiant_ChangeToStartOrLoopAnimation(this, GIANT_ANIM_FALLING_OVER); break; - case GIANT_CUE_ID_TALKING: + case GIANT_CUEID_TALKING: EnGiant_ChangeAnim(this, GIANT_ANIM_BIG_CALL_LOOP); break; - case GIANT_CUE_ID_DONE_TALKING: - case GIANT_CUE_ID_PLAYER_LEARNED_OATH_TO_ORDER: + case GIANT_CUEID_DONE_TALKING: + case GIANT_CUEID_PLAYER_LEARNED_OATH_TO_ORDER: EnGiant_ChangeAnim(this, GIANT_ANIM_IDLE_LOOP); break; - case GIANT_CUE_ID_TEACHING_OATH_TO_ORDER: + case GIANT_CUEID_TEACHING_OATH_TO_ORDER: EnGiant_ChangeAnim(this, GIANT_ANIM_SMALL_CALL_LOOP); break; @@ -445,7 +460,7 @@ void EnGiant_PerformClockTowerSuccessActions(EnGiant* this, PlayState* play) { } EnGiant_PlaySound(this); - if (this->cueId == GIANT_CUE_ID_STRUGGLING) { + if (this->cueId == GIANT_CUEID_STRUGGLING) { Actor_PlaySfx_Flagged(&this->actor, NA_SE_IT_KYOJIN_BEARING - SFX_FLAG); } EnGiant_PlayAndUpdateAnimation(this); diff --git a/src/overlays/actors/ovl_En_Ginko_Man/z_en_ginko_man.c b/src/overlays/actors/ovl_En_Ginko_Man/z_en_ginko_man.c index ea3f9fea2..566f35ba0 100644 --- a/src/overlays/actors/ovl_En_Ginko_Man/z_en_ginko_man.c +++ b/src/overlays/actors/ovl_En_Ginko_Man/z_en_ginko_man.c @@ -5,7 +5,6 @@ */ #include "z_en_ginko_man.h" -#include "objects/object_boj/object_boj.h" #define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY) @@ -47,15 +46,16 @@ typedef enum { /* 1 */ GINKO_ANIM_SITTING, /* 2 */ GINKO_ANIM_REACHING, /* 3 */ GINKO_ANIM_AMAZED, - /* 4 */ GINKO_ANIM_ADVERTISING + /* 4 */ GINKO_ANIM_ADVERTISING, // looking around for customers + /* 5 */ GINKO_ANIM_MAX } GinkoAnimation; -static AnimationInfo sAnimationInfo[] = { - { &object_boj_Anim_0008C0, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -4.0f }, - { &object_boj_Anim_0043F0, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -4.0f }, - { &object_boj_Anim_004F40, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -4.0f }, - { &object_boj_Anim_000AC4, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -4.0f }, // looking around for customers - { &object_boj_Anim_004A7C, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -4.0f }, +static AnimationInfo sAnimationInfo[GINKO_ANIM_MAX] = { + { &object_boj_Anim_0008C0, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -4.0f }, // GINKO_ANIM_LEGSMACKING + { &object_boj_Anim_0043F0, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -4.0f }, // GINKO_ANIM_SITTING + { &object_boj_Anim_004F40, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -4.0f }, // GINKO_ANIM_REACHING + { &object_boj_Anim_000AC4, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -4.0f }, // GINKO_ANIM_AMAZED + { &object_boj_Anim_004A7C, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -4.0f }, // GINKO_ANIM_ADVERTISING }; void EnGinkoMan_Init(Actor* thisx, PlayState* play) { @@ -71,7 +71,7 @@ void EnGinkoMan_Init(Actor* thisx, PlayState* play) { this->choiceDepositWithdrawl = GINKOMAN_CHOICE_RESET; this->serviceFee = 0; SkelAnime_InitFlex(play, &this->skelAnime, &object_boj_Skel_00C240, &object_boj_Anim_0043F0, this->jointTable, - this->morphTable, 16); + this->morphTable, OBJECT_BOJ_LIMB_MAX); EnGinkoMan_SetupIdle(this); } @@ -172,7 +172,7 @@ void EnGinkoMan_DepositDialogue(EnGinkoMan* this, PlayState* play) { SET_WEEKEVENTREG(WEEKEVENTREG_59_40); Message_StartTextbox(play, 0x45B, &this->actor); this->curTextId = 0x45B; - } else if ((HS_GET_BANK_RUPEES() >= 1000) && ((this->previousBankValue) < 1000) && + } else if ((HS_GET_BANK_RUPEES() >= 1000) && (this->previousBankValue < 1000) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_59_80)) { SET_WEEKEVENTREG(WEEKEVENTREG_59_80); Message_StartTextbox(play, 0x45C, &this->actor); @@ -664,16 +664,16 @@ void EnGinkoMan_Update(Actor* thisx, PlayState* play) { s32 EnGinkoMan_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) { EnGinkoMan* this = THIS; - if (limbIndex == 15) { + if (limbIndex == OBJECT_BOJ_LIMB_0F) { *dList = object_boj_DL_00B1D8; } - if (limbIndex == 15) { + if (limbIndex == OBJECT_BOJ_LIMB_0F) { Matrix_Translate(1500.0f, 0.0f, 0.0f, MTXMODE_APPLY); Matrix_RotateXS(this->limb15Rot.y, MTXMODE_APPLY); Matrix_RotateZS(this->limb15Rot.x, MTXMODE_APPLY); Matrix_Translate(-1500.0f, 0.0f, 0.0f, MTXMODE_APPLY); - } else if (limbIndex == 8) { + } else if (limbIndex == OBJECT_BOJ_LIMB_08) { Matrix_RotateXS(-this->limb8Rot.y, MTXMODE_APPLY); Matrix_RotateZS(-this->limb8Rot.x, MTXMODE_APPLY); } diff --git a/src/overlays/actors/ovl_En_Ginko_Man/z_en_ginko_man.h b/src/overlays/actors/ovl_En_Ginko_Man/z_en_ginko_man.h index b8a19d0f3..48ef4bdb1 100644 --- a/src/overlays/actors/ovl_En_Ginko_Man/z_en_ginko_man.h +++ b/src/overlays/actors/ovl_En_Ginko_Man/z_en_ginko_man.h @@ -2,6 +2,7 @@ #define Z_EN_GINKO_MAN_H #include "global.h" +#include "objects/object_boj/object_boj.h" struct EnGinkoMan; @@ -11,8 +12,8 @@ typedef struct EnGinkoMan { /* 0x000 */ Actor actor; /* 0x144 */ SkelAnime skelAnime; /* 0x188 */ EnGinkoManActionFunc actionFunc; - /* 0x18C */ Vec3s jointTable[0x10]; - /* 0x1EC */ Vec3s morphTable[0x10]; + /* 0x18C */ Vec3s jointTable[OBJECT_BOJ_LIMB_MAX]; + /* 0x1EC */ Vec3s morphTable[OBJECT_BOJ_LIMB_MAX]; /* 0x24C */ Vec3s limb15Rot; /* 0x252 */ Vec3s limb8Rot; /* 0x258 */ s16 curTextId; diff --git a/src/overlays/actors/ovl_En_Gk/z_en_gk.c b/src/overlays/actors/ovl_En_Gk/z_en_gk.c index dd87be400..ad5bc484f 100644 --- a/src/overlays/actors/ovl_En_Gk/z_en_gk.c +++ b/src/overlays/actors/ovl_En_Gk/z_en_gk.c @@ -5,7 +5,6 @@ */ #include "z_en_gk.h" -#include "objects/object_gk/object_gk.h" #define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY) @@ -102,14 +101,38 @@ static DamageTable sDamageTable = { /* Powder Keg */ DMG_ENTRY(0, 0x0), }; -static AnimationInfo sAnimationInfo[] = { - { &object_gk_Anim_00787C, 1.0f, 0.0f, 0.0f, 0, 0.0f }, { &object_gk_Anim_007DC4, 1.0f, 0.0f, 0.0f, 2, 0.0f }, - { &object_gk_Anim_0092C0, 1.0f, 0.0f, 0.0f, 0, 0.0f }, { &object_gk_Anim_005EDC, 1.0f, 0.0f, 0.0f, 0, 0.0f }, - { &object_gk_Anim_009638, 1.0f, 0.0f, 0.0f, 0, 0.0f }, { &object_gk_Anim_008774, 1.0f, 0.0f, 0.0f, 0, 0.0f }, - { &object_gk_Anim_00AE34, 1.0f, 0.0f, 0.0f, 0, 0.0f }, { &object_gk_Anim_00BD90, 1.0f, 0.0f, 0.0f, 2, 0.0f }, - { &object_gk_Anim_00C308, 1.0f, 0.0f, 0.0f, 0, 0.0f }, { &object_gk_Anim_009858, 1.0f, 0.0f, 0.0f, 2, 0.0f }, - { &object_gk_Anim_009D88, 1.0f, 0.0f, 0.0f, 0, 0.0f }, { &object_gk_Anim_00A21C, 1.0f, 0.0f, 0.0f, 2, 0.0f }, - { &object_gk_Anim_00AAEC, 1.0f, 0.0f, 0.0f, 0, 0.0f }, +typedef enum { + /* -1 */ ENGK_ANIM_NONE = -1, + /* 0x0 */ ENGK_ANIM_0, + /* 0x1 */ ENGK_ANIM_1, + /* 0x2 */ ENGK_ANIM_2, + /* 0x3 */ ENGK_ANIM_3, + /* 0x4 */ ENGK_ANIM_4, + /* 0x5 */ ENGK_ANIM_5, + /* 0x6 */ ENGK_ANIM_6, + /* 0x7 */ ENGK_ANIM_7, + /* 0x8 */ ENGK_ANIM_8, + /* 0x9 */ ENGK_ANIM_9, + /* 0xA */ ENGK_ANIM_10, + /* 0xB */ ENGK_ANIM_11, + /* 0xC */ ENGK_ANIM_12, + /* 0xD */ ENGK_ANIM_MAX +} EnGkAnimation; + +static AnimationInfo sAnimationInfo[ENGK_ANIM_MAX] = { + { &object_gk_Anim_00787C, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, // ENGK_ANIM_0 + { &object_gk_Anim_007DC4, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, 0.0f }, // ENGK_ANIM_1 + { &object_gk_Anim_0092C0, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, // ENGK_ANIM_2 + { &object_gk_Anim_005EDC, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, // ENGK_ANIM_3 + { &object_gk_Anim_009638, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, // ENGK_ANIM_4 + { &object_gk_Anim_008774, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, // ENGK_ANIM_5 + { &object_gk_Anim_00AE34, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, // ENGK_ANIM_6 + { &object_gk_Anim_00BD90, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, 0.0f }, // ENGK_ANIM_7 + { &object_gk_Anim_00C308, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, // ENGK_ANIM_8 + { &object_gk_Anim_009858, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, 0.0f }, // ENGK_ANIM_9 + { &object_gk_Anim_009D88, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, // ENGK_ANIM_10 + { &object_gk_Anim_00A21C, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, 0.0f }, // ENGK_ANIM_11 + { &object_gk_Anim_00AAEC, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, // ENGK_ANIM_12 }; Color_RGBA8 D_80B533A0 = { 255, 255, 255, 255 }; @@ -124,18 +147,24 @@ u16 func_80B50410(EnGk* this, PlayState* play) { switch (this->unk_31C) { case 0xE7A: return 0xE7B; + case 0xE7B: return 0xE7C; + case 0xE7C: return 0xE7D; + case 0xE7D: return 0xE7E; + case 0xE7E: return 0xE7F; + case 0xE7F: SET_WEEKEVENTREG(WEEKEVENTREG_40_80); this->unk_1E4 |= 1; return 0xE80; + default: return 0xE7A; } @@ -147,16 +176,21 @@ u16 func_80B50410(EnGk* this, PlayState* play) { switch (this->unk_31C) { case 0xE82: return 0xE83; + case 0xE83: return 0xE7D; + case 0xE7D: return 0xE7E; + case 0xE7E: return 0xE7F; + case 0xE7F: SET_WEEKEVENTREG(WEEKEVENTREG_41_01); this->unk_1E4 |= 1; return 0xE80; + default: return 0xE82; } @@ -197,10 +231,12 @@ u16 func_80B50410(EnGk* this, PlayState* play) { switch (this->unk_31C) { case 0xE85: return 0xE86; + case 0xE86: SET_WEEKEVENTREG(WEEKEVENTREG_41_02); this->unk_1E4 |= 1; return 0xE87; + default: return 0xE85; } @@ -208,9 +244,9 @@ u16 func_80B50410(EnGk* this, PlayState* play) { this->unk_1E4 |= 1; return 0xE87; } - } else { - return 0; } + + return 0; } u16 func_80B50710(EnGk* this) { @@ -229,8 +265,10 @@ u16 func_80B50710(EnGk* this) { this->unk_1E4 |= 0x10; this->unk_1E4 |= 1; return 0xE8C; + + default: + return 0; } - return 0; } void func_80B507A0(EnGk* this, PlayState* play) { @@ -259,8 +297,8 @@ s32 func_80B50854(EnGk* this, PlayState* play) { if ((player->transformation == PLAYER_FORM_GORON) && (play->msgCtx.ocarinaMode == 3) && (play->msgCtx.lastPlayedSong == OCARINA_SONG_GORON_LULLABY)) { Flags_SetSwitch(play, ENGK_GET_3F00(&this->actor)); - this->unk_2E4 = 3; - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 3); + this->animIndex = ENGK_ANIM_3; + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENGK_ANIM_3); this->actionFunc = func_80B521E8; return true; } @@ -285,12 +323,13 @@ void func_80B509A8(EnGk* this, PlayState* play) { this->unk_30C.y += Rand_ZeroOne(); this->unk_30C.z += 2.0f * Rand_Centered(); - if (this->unk_2E4 == 0) { + if (this->animIndex == ENGK_ANIM_0) { sp4C.x = 0.0f; sp4C.z = 0.0f; sp4C.y = -1.2f; phi_s1 = 25; - } else if ((this->unk_2E4 == 2) || (this->unk_2E4 == 9) || (this->unk_2E4 == 10) || (this->unk_2E4 == 11)) { + } else if ((this->animIndex == ENGK_ANIM_2) || (this->animIndex == ENGK_ANIM_9) || + (this->animIndex == ENGK_ANIM_10) || (this->animIndex == ENGK_ANIM_11)) { sp4C.x = 0.0f; sp4C.z = 0.0f; sp4C.y = -0.5f; @@ -307,28 +346,28 @@ void func_80B50B38(EnGk* this, PlayState* play) { s16 i; s16 temp; - switch (this->unk_2E4) { - case 0: + switch (this->animIndex) { + case ENGK_ANIM_0: this->unk_2E0 = 3; for (i = 0; i < 2; i++) { func_80B509A8(this, play); } break; - case 2: + case ENGK_ANIM_2: this->unk_2E0 = 3; func_80B509A8(this, play); break; - case 1: - case 3: - case 12: + case ENGK_ANIM_1: + case ENGK_ANIM_3: + case ENGK_ANIM_12: this->unk_2E0 = 2; break; - case 9: - case 10: - case 11: + case ENGK_ANIM_9: + case ENGK_ANIM_10: + case ENGK_ANIM_11: this->unk_2E0 = 3; func_80B509A8(this, play); break; @@ -483,22 +522,22 @@ s32 func_80B5123C(EnGk* this, PlayState* play) { } void func_80B51308(EnGk* this, PlayState* play) { - s16 sp1E = this->skelAnime.curFrame; - s16 lastFrame = Animation_GetLastFrame(sAnimationInfo[this->unk_31A].animation); + s16 curFrame = this->skelAnime.curFrame; + s16 endFrame = Animation_GetLastFrame(sAnimationInfo[this->csAnimIndex].animation); - if ((this->unk_2E4 == 7) && (sp1E == lastFrame)) { - this->unk_2E4 = 8; - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 8); + if ((this->animIndex == ENGK_ANIM_7) && (curFrame == endFrame)) { + this->animIndex = ENGK_ANIM_8; + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENGK_ANIM_8); } } void func_80B51398(EnGk* this, PlayState* play) { - s16 sp1E = this->skelAnime.curFrame; - s16 lastFrame = Animation_GetLastFrame(sAnimationInfo[9].animation); + s16 curFrame = this->skelAnime.curFrame; + s16 endFrame = Animation_GetLastFrame(sAnimationInfo[9].animation); - if ((this->unk_2E4 == 9) && (sp1E == lastFrame)) { - this->unk_2E4 = 10; - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 10); + if ((this->animIndex == ENGK_ANIM_9) && (curFrame == endFrame)) { + this->animIndex = ENGK_ANIM_10; + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENGK_ANIM_10); } } @@ -541,35 +580,35 @@ void func_80B51510(EnGk* this, PlayState* play) { this->cueId = play->csCtx.actorCues[cueChannel]->id; switch (play->csCtx.actorCues[cueChannel]->id) { case 1: - this->unk_31A = 0; - this->unk_2E4 = 0; + this->csAnimIndex = ENGK_ANIM_0; + this->animIndex = ENGK_ANIM_0; break; case 2: - this->unk_31A = 2; - this->unk_2E4 = 2; + this->csAnimIndex = ENGK_ANIM_2; + this->animIndex = ENGK_ANIM_2; break; case 3: - this->unk_31A = 7; - this->unk_2E4 = 7; + this->csAnimIndex = ENGK_ANIM_7; + this->animIndex = ENGK_ANIM_7; break; case 4: - this->unk_31A = 3; - this->unk_2E4 = 3; + this->csAnimIndex = ENGK_ANIM_3; + this->animIndex = ENGK_ANIM_3; break; case 5: - this->unk_31A = 1; - this->unk_2E4 = 1; + this->csAnimIndex = ENGK_ANIM_1; + this->animIndex = ENGK_ANIM_1; this->unk_1E4 |= 0x80; this->actionFunc = func_80B5227C; break; case 6: - this->unk_31A = 12; - this->unk_2E4 = 12; + this->csAnimIndex = ENGK_ANIM_12; + this->animIndex = ENGK_ANIM_12; break; case 7: @@ -579,10 +618,10 @@ void func_80B51510(EnGk* this, PlayState* play) { default: break; } - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, this->unk_31A); + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, this->csAnimIndex); } - if (this->unk_31A == 7) { + if (this->csAnimIndex == ENGK_ANIM_7) { func_80B51308(this, play); } @@ -594,41 +633,44 @@ void func_80B51510(EnGk* this, PlayState* play) { } void func_80B51698(EnGk* this, PlayState* play) { - s16 sp26 = this->skelAnime.curFrame; - s16 lastFrame = Animation_GetLastFrame(sAnimationInfo[this->unk_2E4].animation); + s16 curFrame = this->skelAnime.curFrame; + s16 endFrame = Animation_GetLastFrame(sAnimationInfo[this->animIndex].animation); - if (sp26 == lastFrame) { - switch (this->unk_2E4) { - case 0: - this->unk_2E4 = 2; - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 2); + if (curFrame == endFrame) { + switch (this->animIndex) { + case ENGK_ANIM_0: + this->animIndex = ENGK_ANIM_2; + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENGK_ANIM_2); this->actionFunc = func_80B5216C; break; - case 2: - this->unk_2E4 = 0; - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 0); + case ENGK_ANIM_2: + this->animIndex = ENGK_ANIM_0; + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENGK_ANIM_0); this->actionFunc = func_80B5202C; break; + + default: + break; } } } void func_80B51760(EnGk* this, PlayState* play) { - s16 sp2E = this->skelAnime.curFrame; - s16 lastFrame; + s16 curFrame = this->skelAnime.curFrame; + s16 endFrame; - if (this->unk_2E4 == 11) { - lastFrame = Animation_GetLastFrame(sAnimationInfo[this->unk_2E4].animation); - if (sp2E == lastFrame) { - this->unk_2E4 = 5; - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, this->unk_2E4); + if (this->animIndex == ENGK_ANIM_11) { + endFrame = Animation_GetLastFrame(sAnimationInfo[this->animIndex].animation); + if (curFrame == endFrame) { + this->animIndex = ENGK_ANIM_5; + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, this->animIndex); } - } else if (this->unk_2E4 == 10) { - lastFrame = Animation_GetLastFrame(sAnimationInfo[this->unk_2E4].animation); - if (sp2E == lastFrame) { - this->unk_2E4 = 11; - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, this->unk_2E4); + } else if (this->animIndex == ENGK_ANIM_10) { + endFrame = Animation_GetLastFrame(sAnimationInfo[this->animIndex].animation); + if (curFrame == endFrame) { + this->animIndex = ENGK_ANIM_11; + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, this->animIndex); } } else { if (Flags_GetSwitch(play, ENGK_GET_3F00(&this->actor))) { @@ -643,7 +685,7 @@ void func_80B51760(EnGk* this, PlayState* play) { Message_StartTextbox(play, this->unk_31C, &this->actor); this->actionFunc = func_80B51970; if (this->unk_31C == 0xE81) { - this->unk_2E4 = 0; + this->animIndex = ENGK_ANIM_0; this->unk_1E4 |= 2; } } else if (((this->actor.xzDistToPlayer < 100.0f) || this->actor.isLockedOn) && @@ -673,7 +715,7 @@ void func_80B51970(EnGk* this, PlayState* play) { if (this->unk_1E4 & 1) { this->unk_1E4 &= ~1; this->unk_1E4 &= ~4; - if (this->unk_2E4 == 10) { + if (this->animIndex == ENGK_ANIM_10) { this->unk_1E4 &= ~2; } this->actionFunc = func_80B51760; @@ -691,10 +733,10 @@ void func_80B51970(EnGk* this, PlayState* play) { if (this->unk_1E4 & 2) { Audio_PlaySfx_AtFixedPos(&this->actor.projectedPos, NA_SE_EN_GOLON_KID_CRY - SFX_FLAG); - if (this->unk_2E4 != 10) { - if (this->unk_2E4 != 9) { - this->unk_2E4 = 9; - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 9); + if (this->animIndex != ENGK_ANIM_10) { + if (this->animIndex != ENGK_ANIM_9) { + this->animIndex = ENGK_ANIM_9; + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENGK_ANIM_9); } else { func_80B51398(this, play); } @@ -703,7 +745,7 @@ void func_80B51970(EnGk* this, PlayState* play) { Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 5, 0x1000, 0x100); this->actor.world.rot.y = this->actor.shape.rot.y; - if (this->unk_2E4 == 6) { + if (this->animIndex == ENGK_ANIM_6) { func_80B50954(this); } } @@ -717,7 +759,7 @@ void func_80B51B40(EnGk* this, PlayState* play) { this->unk_1E4 &= ~1; this->unk_1E4 &= ~4; - if (this->unk_2E4 == 10) { + if (this->animIndex == ENGK_ANIM_10) { this->unk_1E4 &= ~2; } @@ -752,15 +794,18 @@ void func_80B51B40(EnGk* this, PlayState* play) { this->unk_31C = 0xE8A; Message_StartTextbox(play, this->unk_31C, &this->actor); break; + + default: + break; } } if (this->unk_1E4 & 2) { Audio_PlaySfx_AtFixedPos(&this->actor.projectedPos, NA_SE_EN_GOLON_KID_CRY - SFX_FLAG); - if (this->unk_2E4 != 10) { - if (this->unk_2E4 != 9) { - this->unk_2E4 = 9; - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 9); + if (this->animIndex != ENGK_ANIM_10) { + if (this->animIndex != ENGK_ANIM_9) { + this->animIndex = ENGK_ANIM_9; + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENGK_ANIM_9); } else { func_80B51398(this, play); } @@ -778,8 +823,8 @@ void func_80B51D9C(EnGk* this, PlayState* play) { CutsceneManager_StartWithPlayerCsAndSetFlag(this->csId, &this->actor); if (this->unk_1E4 & 4) { this->unk_1E4 &= ~4; - this->unk_2E4 = 6; - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 6); + this->animIndex = ENGK_ANIM_6; + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENGK_ANIM_6); this->actionFunc = func_80B51EA4; } else { this->unk_1E4 |= 4; @@ -880,21 +925,21 @@ void func_80B5216C(EnGk* this, PlayState* play) { } void func_80B521E8(EnGk* this, PlayState* play) { - s16 sp1E = this->skelAnime.curFrame; - s16 lastFrame = Animation_GetLastFrame(sAnimationInfo[this->unk_2E4].animation); + s16 curFrame = this->skelAnime.curFrame; + s16 endFrame = Animation_GetLastFrame(sAnimationInfo[this->animIndex].animation); - if (sp1E == lastFrame) { - this->unk_2E4 = 1; - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 1); + if (curFrame == endFrame) { + this->animIndex = ENGK_ANIM_1; + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENGK_ANIM_1); this->actionFunc = func_80B5227C; } } void func_80B5227C(EnGk* this, PlayState* play) { - s16 sp26 = this->skelAnime.curFrame; - s16 lastFrame = Animation_GetLastFrame(sAnimationInfo[this->unk_2E4].animation); + s16 curFrame = this->skelAnime.curFrame; + s16 endFrame = Animation_GetLastFrame(sAnimationInfo[this->animIndex].animation); - if ((sp26 + 1) == lastFrame) { + if (curFrame == (endFrame - 1)) { func_800B14D4(play, 20.0f, &this->actor.home.pos); this->unk_350 = 60; if (!(this->unk_1E4 & 0x80)) { @@ -948,6 +993,9 @@ void func_80B52430(EnGk* this, PlayState* play) { this->unk_1E4 &= ~4; this->actionFunc = func_80B51760; return; + + default: + break; } } @@ -1005,7 +1053,7 @@ void EnGk_Init(Actor* thisx, PlayState* play) { EnGk* this = THIS; SkelAnime_InitFlex(play, &this->skelAnime, &object_gk_Skel_0079C0, &object_gk_Anim_00787C, this->jointTable, - this->morphTable, 20); + this->morphTable, OBJECT_GK_LIMB_MAX); Collider_InitCylinder(play, &this->collider); Collider_SetCylinder(play, &this->collider, &this->actor, &sCylinderInit); @@ -1019,16 +1067,16 @@ void EnGk_Init(Actor* thisx, PlayState* play) { this->actor.gravity = -1.0f; if (ENGK_GET_F(&this->actor) == ENGK_F_1) { - this->unk_2E4 = 5; - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 5); + this->animIndex = ENGK_ANIM_5; + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENGK_ANIM_5); if (play->sceneId == SCENE_17SETUGEN2) { if (Flags_GetSwitch(play, ENGK_GET_3F00(&this->actor))) { Actor_Kill(&this->actor); - } else { - this->csId = this->actor.csId; - this->path = SubS_GetPathByIndex(play, ENGK_GET_PATH_INDEX(&this->actor), ENGK_PATH_INDEX_NONE); - this->actionFunc = func_80B51760; + return; } + this->csId = this->actor.csId; + this->path = SubS_GetPathByIndex(play, ENGK_GET_PATH_INDEX(&this->actor), ENGK_PATH_INDEX_NONE); + this->actionFunc = func_80B51760; } else if (play->sceneId == SCENE_GORONRACE) { if (CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_SNOWHEAD_TEMPLE)) { if (gSaveContext.save.entrance == ENTRANCE(GORON_RACETRACK, 1)) { @@ -1054,11 +1102,11 @@ void EnGk_Init(Actor* thisx, PlayState* play) { Actor_Kill(&this->actor); } } else if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_CALMED_GORON_ELDERS_SON)) { - this->unk_2E4 = 0; + this->animIndex = ENGK_ANIM_0; this->csId = this->actor.csId; this->actor.flags |= ACTOR_FLAG_10; this->actor.flags |= ACTOR_FLAG_2000000; - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 0); + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENGK_ANIM_0); this->actionFunc = func_80B5202C; } else { this->actionFunc = func_80B52654; @@ -1111,7 +1159,7 @@ void EnGk_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, sp28.x = 1100.0f; sp28.z = -500.0f; - if (this->unk_2E4 == 0) { + if (this->animIndex == ENGK_ANIM_0) { sp34.y = -100.0f; sp28.y = -100.0f; @@ -1121,7 +1169,8 @@ void EnGk_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, sp4C = sp40; sp4C.x *= -1.0f; - } else if ((this->unk_2E4 == 2) || (this->unk_2E4 == 9) || (this->unk_2E4 == 10) || (this->unk_2E4 == 11)) { + } else if ((this->animIndex == ENGK_ANIM_2) || (this->animIndex == ENGK_ANIM_9) || + (this->animIndex == ENGK_ANIM_10) || (this->animIndex == ENGK_ANIM_11)) { sp34.y = 400.0f; sp28.y = 400.0f; @@ -1133,7 +1182,7 @@ void EnGk_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, sp4C.x *= -1.0f; } - if (limbIndex == 17) { + if (limbIndex == OBJECT_GK_LIMB_11) { if (ENGK_GET_F(&this->actor) == ENGK_F_1) { phi_f0 = 100.0f; } else { @@ -1164,7 +1213,7 @@ void EnGk_TransformLimbDraw(PlayState* play, s32 limbIndex, Actor* thisx) { s32 phi_v1; switch (limbIndex) { - case 18: + case OBJECT_GK_LIMB_12: if (this->unk_1E4 & 8) { phi_v1 = true; } else { @@ -1191,7 +1240,7 @@ void EnGk_TransformLimbDraw(PlayState* play, s32 limbIndex, Actor* thisx) { Matrix_Push(); break; - case 9: + case OBJECT_GK_LIMB_09: if (this->unk_1E4 & 8) { phi_v1 = true; } else { @@ -1216,6 +1265,9 @@ void EnGk_TransformLimbDraw(PlayState* play, s32 limbIndex, Actor* thisx) { Matrix_Push(); break; + + default: + break; } } @@ -1260,8 +1312,9 @@ void EnGk_Draw(Actor* thisx, PlayState* play) { if (ENGK_GET_F(&this->actor) != ENGK_F_2) { Gfx_SetupDL25_Xlu(play->state.gfxCtx); - if ((this->unk_2E4 == 0) || (this->unk_2E4 == 1) || (this->unk_2E4 == 2) || (this->unk_2E4 == 3) || - (this->unk_2E4 == 4)) { + if ((this->animIndex == ENGK_ANIM_0) || (this->animIndex == ENGK_ANIM_1) || + (this->animIndex == ENGK_ANIM_2) || (this->animIndex == ENGK_ANIM_3) || + (this->animIndex == ENGK_ANIM_4)) { pos.x = this->actor.world.pos.x - 15.0f; pos.y = this->actor.world.pos.y; pos.z = this->actor.world.pos.z; diff --git a/src/overlays/actors/ovl_En_Gk/z_en_gk.h b/src/overlays/actors/ovl_En_Gk/z_en_gk.h index 130b97675..6bd28ad94 100644 --- a/src/overlays/actors/ovl_En_Gk/z_en_gk.h +++ b/src/overlays/actors/ovl_En_Gk/z_en_gk.h @@ -2,6 +2,7 @@ #define Z_EN_GK_H #include "global.h" +#include "objects/object_gk/object_gk.h" struct EnGk; @@ -32,17 +33,17 @@ typedef struct EnGk { /* 0x1E4 */ u16 unk_1E4; /* 0x1E8 */ Path* path; /* 0x1EC */ s32 unk_1EC; - /* 0x1F0 */ Vec3s jointTable[20]; - /* 0x1F0 */ Vec3s morphTable[20]; + /* 0x1F0 */ Vec3s jointTable[OBJECT_GK_LIMB_MAX]; + /* 0x1F0 */ Vec3s morphTable[OBJECT_GK_LIMB_MAX]; /* 0x2E0 */ s16 unk_2E0; /* 0x2E2 */ s16 unk_2E2; - /* 0x2E4 */ s16 unk_2E4; + /* 0x2E4 */ s16 animIndex; /* 0x2E8 */ Vec3f unk_2E8; /* 0x2F4 */ Vec3f unk_2F4; /* 0x300 */ Vec3f unk_300; /* 0x30C */ Vec3f unk_30C; /* 0x318 */ s16 csId; - /* 0x31A */ u8 unk_31A; + /* 0x31A */ u8 csAnimIndex; /* 0x31B */ u8 cueId; /* 0x31C */ u16 unk_31C; /* 0x31E */ s16 unk_31E; diff --git a/src/overlays/actors/ovl_En_Gm/z_en_gm.c b/src/overlays/actors/ovl_En_Gm/z_en_gm.c index 787ce43b9..39b705649 100644 --- a/src/overlays/actors/ovl_En_Gm/z_en_gm.c +++ b/src/overlays/actors/ovl_En_Gm/z_en_gm.c @@ -6,7 +6,6 @@ #include "z_en_gm.h" #include "overlays/actors/ovl_En_Door/z_en_door.h" -#include "objects/object_in2/object_in2.h" #define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10) @@ -209,20 +208,38 @@ static ColliderSphereInit sSphereInit = { static CollisionCheckInfoInit2 sColChkInfoInit = { 0, 0, 0, 0, MASS_IMMOVABLE }; -static AnimationInfoS sAnimationInfo[] = { - { &object_in2_Anim_009CDC, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, - { &object_in2_Anim_009CDC, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, - { &object_in2_Anim_00A5E0, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, - { &object_in2_Anim_00A70C, 1.0f, 0, 1, ANIMMODE_LOOP, 0 }, - { &object_in2_Anim_008090, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, - { &object_in2_Anim_00898C, 1.0f, 0, -1, ANIMMODE_ONCE, -4 }, - { &object_in2_Anim_009450, 1.0f, 0, -1, ANIMMODE_ONCE, -4 }, - { &object_in2_Anim_00AD18, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, - { &object_in2_Anim_00AD18, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, - { &object_in2_Anim_00B8B0, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, - { &object_in2_Anim_00BA80, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, - { &object_in2_Anim_00C03C, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, - { &object_in2_Anim_00B990, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, +typedef enum { + /* -1 */ ENGM_ANIM_NONE = -1, + /* 0x0 */ ENGM_ANIM_0, + /* 0x1 */ ENGM_ANIM_1, + /* 0x2 */ ENGM_ANIM_2, + /* 0x3 */ ENGM_ANIM_3, + /* 0x4 */ ENGM_ANIM_4, + /* 0x5 */ ENGM_ANIM_5, + /* 0x6 */ ENGM_ANIM_6, + /* 0x7 */ ENGM_ANIM_7, + /* 0x8 */ ENGM_ANIM_8, + /* 0x9 */ ENGM_ANIM_9, + /* 0xA */ ENGM_ANIM_10, + /* 0xB */ ENGM_ANIM_11, + /* 0xC */ ENGM_ANIM_12, + /* 0xD */ ENGM_ANIM_MAX +} EnGmAnimation; + +static AnimationInfoS sAnimationInfo[ENGM_ANIM_MAX] = { + { &object_in2_Anim_009CDC, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENGM_ANIM_0 + { &object_in2_Anim_009CDC, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // ENGM_ANIM_1 + { &object_in2_Anim_00A5E0, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENGM_ANIM_2 + { &object_in2_Anim_00A70C, 1.0f, 0, 1, ANIMMODE_LOOP, 0 }, // ENGM_ANIM_3 + { &object_in2_Anim_008090, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENGM_ANIM_4 + { &object_in2_Anim_00898C, 1.0f, 0, -1, ANIMMODE_ONCE, -4 }, // ENGM_ANIM_5 + { &object_in2_Anim_009450, 1.0f, 0, -1, ANIMMODE_ONCE, -4 }, // ENGM_ANIM_6 + { &object_in2_Anim_00AD18, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENGM_ANIM_7 + { &object_in2_Anim_00AD18, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // ENGM_ANIM_8 + { &object_in2_Anim_00B8B0, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // ENGM_ANIM_9 + { &object_in2_Anim_00BA80, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // ENGM_ANIM_10 + { &object_in2_Anim_00C03C, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // ENGM_ANIM_11 + { &object_in2_Anim_00B990, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // ENGM_ANIM_12 }; Actor* func_8094DEE0(EnGm* this, PlayState* play, u8 arg2, s16 arg3) { @@ -286,43 +303,43 @@ EnDoor* func_8094DF90(PlayState* play, s32 arg1) { return SubS_FindDoor(play, phi_a1); } -s32 func_8094DFF8(EnGm* this, PlayState* play) { - s32 ret = false; +s32 EnGm_UpdateSkelAnime(EnGm* this, PlayState* play) { + s32 isAnimFinished = false; if (this->unk_262 < 0) { return false; } if (this->unk_262 >= 0) { - this->skelAnime.playSpeed = this->unk_3A8; - ret = SkelAnime_Update(&this->skelAnime); + this->skelAnime.playSpeed = this->animPlaySpeed; + isAnimFinished = SkelAnime_Update(&this->skelAnime); } - return ret; + return isAnimFinished; } -s32 func_8094E054(EnGm* this, PlayState* play, s32 arg2) { +s32 EnGm_ChangeAnim(EnGm* this, PlayState* play, s32 animIndex) { s8 tmp = this->unk_262; - s32 phi_v1 = false; - s32 ret = false; + s32 changeAnim = false; + s32 didAnimChange = false; - if ((arg2 == 0) || (arg2 == 1)) { - if ((this->unk_3E8 != 0) && (this->unk_3E8 != 1)) { - phi_v1 = true; + if ((animIndex == ENGM_ANIM_0) || (animIndex == ENGM_ANIM_1)) { + if ((this->animIndex != ENGM_ANIM_0) && (this->animIndex != ENGM_ANIM_1)) { + changeAnim = true; } - } else if (arg2 != this->unk_3E8) { - phi_v1 = true; + } else if (this->animIndex != animIndex) { + changeAnim = true; } - if (phi_v1) { + if (changeAnim) { if (tmp >= 0) { - this->unk_3E8 = arg2; - ret = SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, arg2); - this->unk_3A8 = this->skelAnime.playSpeed; + this->animIndex = animIndex; + didAnimChange = SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, animIndex); + this->animPlaySpeed = this->skelAnime.playSpeed; } } - return ret; + return didAnimChange; } s32 func_8094E0F8(EnGm* this, PlayState* play) { @@ -486,6 +503,9 @@ s32 func_8094E52C(EnGm* this, PlayState* play) { this->unk_3E0++; ret = true; break; + + default: + break; } return ret; @@ -502,7 +522,7 @@ s32 func_8094E69C(EnGm* this, PlayState* play) { switch (this->unk_3E0) { case 0: Actor_PlaySfx(&this->actor, NA_SE_EV_CHAIR_ROLL); - func_8094E054(this, play, 2); + EnGm_ChangeAnim(this, play, ENGM_ANIM_2); this->unk_3E2 = 0; this->unk_3E0++; break; @@ -558,6 +578,7 @@ s32 func_8094E69C(EnGm* this, PlayState* play) { this->unk_3E2 = 0; this->unk_3E0++; break; + case 9: sp48 = this->actor.world.rot.y; this->unk_3E2++; @@ -565,13 +586,16 @@ s32 func_8094E69C(EnGm* this, PlayState* play) { Math_ApproachS(&this->actor.shape.rot.y, sp48, 3, 0x2AA8); this->unk_3A4 &= ~0x20; } else { - func_8094E054(this, play, 1); + EnGm_ChangeAnim(this, play, ENGM_ANIM_1); this->actor.shape.rot.y = sp48; this->unk_3E0++; this->unk_3E2 = 0; ret = true; } break; + + default: + break; } return ret; } @@ -639,7 +663,7 @@ s32 func_8094EB1C(EnGm* this, PlayState* play) { break; } Actor_PlaySfx(&this->actor, NA_SE_EV_CHAIR_ROLL); - func_8094E054(this, play, 2); + EnGm_ChangeAnim(this, play, ENGM_ANIM_2); this->unk_3E2 = 0; this->unk_3E0++; @@ -669,7 +693,7 @@ s32 func_8094EB1C(EnGm* this, PlayState* play) { Math_ApproachS(&this->actor.shape.rot.y, oldYaw, 3, 0x2AA8); this->unk_3A4 &= ~0x20; } else { - func_8094E054(this, play, 1); + EnGm_ChangeAnim(this, play, ENGM_ANIM_1); this->actor.shape.rot.y = oldYaw; this->unk_3E2 = 0; this->unk_3E0++; @@ -763,7 +787,7 @@ s32 func_8094EFC4(EnGm* this, PlayState* play) { if (play->csCtx.state != CS_STATE_IDLE) { if (this->unk_3F8 == 0) { if ((play->sceneId == SCENE_MILK_BAR) && (gSaveContext.sceneLayer == 2)) { - func_8094E054(this, play, 0); + EnGm_ChangeAnim(this, play, ENGM_ANIM_0); this->unk_258 = 255; } this->cueId = 255; @@ -879,9 +903,9 @@ void func_8094F3D0(EnGm* this, PlayState* play) { } s32 func_8094F4EC(EnGm* this, PlayState* play) { - if ((this->unk_258 != 6) && (this->unk_3E8 == 12)) { + if ((this->unk_258 != 6) && (this->animIndex == ENGM_ANIM_12)) { this->unk_3A4 &= ~0x2000; - func_8094E054(this, play, 8); + EnGm_ChangeAnim(this, play, ENGM_ANIM_8); } return true; } @@ -897,30 +921,30 @@ s32 func_8094F53C(EnGm* this, PlayState* play) { if (this->unk_3A6 != sp32) { switch (sp32) { case 0x2B13: - func_8094E054(this, play, 2); + EnGm_ChangeAnim(this, play, ENGM_ANIM_2); break; case 0x2B14: case 0x2B18: - func_8094E054(this, play, 0); + EnGm_ChangeAnim(this, play, ENGM_ANIM_0); break; case 0x2B16: - func_8094E054(this, play, 1); + EnGm_ChangeAnim(this, play, ENGM_ANIM_1); break; case 0x2B15: - func_8094E054(this, play, 5); + EnGm_ChangeAnim(this, play, ENGM_ANIM_5); break; case 0x2B17: - func_8094E054(this, play, 6); + EnGm_ChangeAnim(this, play, ENGM_ANIM_6); break; default: - if ((this->unk_3E8 == 7) || (this->unk_3E8 == 8)) { + if ((this->animIndex == ENGM_ANIM_7) || (this->animIndex == ENGM_ANIM_8)) { this->unk_3A4 |= 0x2000; - func_8094E054(this, play, 12); + EnGm_ChangeAnim(this, play, ENGM_ANIM_12); } break; } @@ -941,6 +965,9 @@ s32 func_8094F53C(EnGm* this, PlayState* play) { this->unk_268 = toto; } break; + + default: + break; } if (sp32 == 0x2AA8) { @@ -963,7 +990,7 @@ s32 func_8094F53C(EnGm* this, PlayState* play) { this->unk_18C(this, play); } - if ((this->unk_3E8 == 6) && !(play->actorCtx.flags & ACTORCTX_FLAG_5) && + if ((this->animIndex == ENGM_ANIM_6) && !(play->actorCtx.flags & ACTORCTX_FLAG_5) && Animation_OnFrame(&this->skelAnime, 20.0f)) { Actor_PlaySfx(&this->actor, NA_SE_EV_HANKO); } @@ -1039,7 +1066,7 @@ s32 func_8094F904(EnGm* this, PlayState* play, ScheduleOutput* scheduleOutput) { this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; this->unk_3A4 |= 0x100; this->unk_3A4 |= 0x200; - func_8094E054(this, play, 7); + EnGm_ChangeAnim(this, play, ENGM_ANIM_7); this->actor.gravity = 0.0f; ret = true; } @@ -1087,7 +1114,7 @@ s32 func_8094FAC4(EnGm* this, PlayState* play, ScheduleOutput* scheduleOutput) { SubS_SetOfferMode(&this->unk_3A4, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK); this->unk_3A4 |= 0x100; this->unk_3A4 |= 0x200; - func_8094E054(this, play, 7); + EnGm_ChangeAnim(this, play, ENGM_ANIM_7); this->actor.gravity = -1.0f; ret = true; } @@ -1102,9 +1129,9 @@ s32 func_8094FCC4(EnGm* this, PlayState* play, ScheduleOutput* scheduleOutput) { if (this->unk_258 == 0) { Math_Vec3f_Copy(&this->actor.world.pos, &D_80951D90); SubS_SetOfferMode(&this->unk_3A4, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK); - func_8094E054(this, play, 0); + EnGm_ChangeAnim(this, play, ENGM_ANIM_0); } else { - func_8094E054(this, play, 9); + EnGm_ChangeAnim(this, play, ENGM_ANIM_9); this->skelAnime.moveFlags = ANIM_FLAG_NOMOVE; } this->unk_3A4 |= 0x100; @@ -1118,7 +1145,7 @@ s32 func_8094FD88(EnGm* this, PlayState* play, ScheduleOutput* scheduleOutput) { s32 ret = false; if (func_8094F7D0(this, play, scheduleOutput, ACTORCAT_NPC, ACTOR_EN_RECEPGIRL)) { - func_8094E054(this, play, 11); + EnGm_ChangeAnim(this, play, ENGM_ANIM_11); SubS_SetOfferMode(&this->unk_3A4, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK); this->unk_3A4 |= 0x100; this->unk_3A4 |= 0x200; @@ -1134,7 +1161,7 @@ s32 func_8094FE10(EnGm* this, PlayState* play, ScheduleOutput* scheduleOutput) { al = func_8094DEE0(this, play, ACTORCAT_NPC, ACTOR_EN_AL); if (func_8094F7D0(this, play, scheduleOutput, ACTORCAT_NPC, ACTOR_EN_TOTO) && (al != NULL) && (al->update != NULL)) { - func_8094E054(this, play, 11); + EnGm_ChangeAnim(this, play, ENGM_ANIM_11); SubS_SetOfferMode(&this->unk_3A4, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK); this->unk_268 = al; if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_86_20)) { @@ -1176,11 +1203,11 @@ s32 func_8094FF04(EnGm* this, PlayState* play, ScheduleOutput* scheduleOutput) { this->unk_3C8 = 4; this->unk_3CA = 4; this->unk_3CC = 8; - func_8094E054(this, play, 0); + EnGm_ChangeAnim(this, play, ENGM_ANIM_0); func_8094E278(play); } else { Math_Vec3f_Copy(&this->actor.world.pos, &sp30); - func_8094E054(this, play, 9); + EnGm_ChangeAnim(this, play, ENGM_ANIM_9); this->skelAnime.moveFlags = ANIM_FLAG_NOMOVE; } this->unk_400 = 0; @@ -1202,7 +1229,7 @@ s32 func_80950088(EnGm* this, PlayState* play, ScheduleOutput* scheduleOutput) { SubS_SetOfferMode(&this->unk_3A4, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK); this->unk_3A4 |= (0x2000 | 0x100); this->unk_3A4 |= 0x200; - func_8094E054(this, play, 12); + EnGm_ChangeAnim(this, play, ENGM_ANIM_12); return true; } @@ -1217,7 +1244,7 @@ s32 func_80950120(EnGm* this, PlayState* play, ScheduleOutput* scheduleOutput) { SubS_SetOfferMode(&this->unk_3A4, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK); this->unk_3A4 |= (0x800 | 0x100); this->unk_3A4 |= 0x200; - func_8094E054(this, play, 4); + EnGm_ChangeAnim(this, play, ENGM_ANIM_4); return true; } @@ -1238,7 +1265,7 @@ s32 func_809501B8(EnGm* this, PlayState* play, ScheduleOutput* scheduleOutput) { this->unk_3CC = 8; this->actor.targetMode = TARGET_MODE_6; this->unk_3B4 = 60.0f; - func_8094E054(this, play, 10); + EnGm_ChangeAnim(this, play, ENGM_ANIM_10); return true; } @@ -1334,11 +1361,11 @@ s32 func_80950388(EnGm* this, PlayState* play) { s32 func_809503F8(EnGm* this, PlayState* play) { s32 pad; - if (this->unk_3E8 == 9) { + if (this->animIndex == ENGM_ANIM_9) { if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) { this->actor.shape.shadowDraw = ActorShadow_DrawCircle; SubS_SetOfferMode(&this->unk_3A4, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK); - func_8094E054(this, play, 0); + EnGm_ChangeAnim(this, play, ENGM_ANIM_0); } else { AnimationContext_SetMoveActor(play, &this->actor, &this->skelAnime, 1.0f); } @@ -1348,7 +1375,8 @@ s32 func_809503F8(EnGm* this, PlayState* play) { s32 func_80950490(EnGm* this, PlayState* play) { static s32 D_80951DE4[] = { - 1, 5, 5, 1, 6, 5, 1, 5, 6, 1, 5, 6, + ENGM_ANIM_1, ENGM_ANIM_5, ENGM_ANIM_5, ENGM_ANIM_1, ENGM_ANIM_6, ENGM_ANIM_5, + ENGM_ANIM_1, ENGM_ANIM_5, ENGM_ANIM_6, ENGM_ANIM_1, ENGM_ANIM_5, ENGM_ANIM_6, }; s32 pad; @@ -1358,32 +1386,32 @@ s32 func_80950490(EnGm* this, PlayState* play) { this->unk_3CA = 1; this->unk_3CC = 8; this->unk_400 = 1; - func_8094E054(this, play, 3); + EnGm_ChangeAnim(this, play, ENGM_ANIM_3); } return false; } this->unk_400 = 0; - switch (this->unk_3E8) { - case 9: + switch (this->animIndex) { + case ENGM_ANIM_9: if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) { this->actor.shape.shadowDraw = ActorShadow_DrawCircle; SubS_SetOfferMode(&this->unk_3A4, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK); this->unk_3C8 = 4; this->unk_3CA = 4; this->unk_3CC = 8; - func_8094E054(this, play, 0); + EnGm_ChangeAnim(this, play, ENGM_ANIM_0); func_8094E278(play); } else { AnimationContext_SetMoveActor(play, &this->actor, &this->skelAnime, 1.0f); } break; - case 5: - case 6: + case ENGM_ANIM_5: + case ENGM_ANIM_6: if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) { - func_8094E054(this, play, D_80951DE4[this->unk_3F4]); + EnGm_ChangeAnim(this, play, D_80951DE4[this->unk_3F4]); this->unk_3F4++; this->unk_3F4 %= 12; this->unk_3DE = Rand_S16Offset(30, 30); @@ -1392,7 +1420,7 @@ s32 func_80950490(EnGm* this, PlayState* play) { default: if (DECR(this->unk_3DE) == 0) { - func_8094E054(this, play, D_80951DE4[this->unk_3F4]); + EnGm_ChangeAnim(this, play, D_80951DE4[this->unk_3F4]); this->unk_3F4++; this->unk_3F4 %= 12; this->unk_3DE = Rand_S16Offset(30, 30); @@ -1433,6 +1461,7 @@ s32 func_80950690(EnGm* this, PlayState* play) { break; case 8: + default: break; } @@ -1574,6 +1603,9 @@ void func_80950C24(EnGm* this, PlayState* play) { case 30: func_8095097C(this, play); break; + + default: + break; } Math_ApproachS(&this->actor.shape.rot.y, this->actor.world.rot.y, 3, 0x2AA8); @@ -1629,7 +1661,7 @@ void func_80950DB8(EnGm* this, PlayState* play) { } void func_80950F2C(EnGm* this, PlayState* play) { - s32 sp50[] = { 0, 0, 3, 2 }; + s32 csAnimIndex[] = { ENGM_ANIM_0, ENGM_ANIM_0, ENGM_ANIM_3, ENGM_ANIM_2 }; Player* player = GET_PLAYER(play); s32 pad; Vec3f sp3C; @@ -1644,7 +1676,7 @@ void func_80950F2C(EnGm* this, PlayState* play) { Actor_PlaySfx(&this->actor, NA_SE_EV_CHAIR_ROLL); } this->cueId = cueId; - func_8094E054(this, play, sp50[cueId]); + EnGm_ChangeAnim(this, play, csAnimIndex[cueId]); } if ((this->cueId == 3) && (this->unk_268 != NULL) && (this->unk_268->update != NULL)) { @@ -1670,9 +1702,10 @@ void EnGm_Init(Actor* thisx, PlayState* play) { } ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 22.0f); - SkelAnime_InitFlex(play, &this->skelAnime, &object_in2_Skel_0078B0, NULL, this->jointTable, this->morphTable, 20); - this->unk_3E8 = -1; - func_8094E054(this, play, 0); + SkelAnime_InitFlex(play, &this->skelAnime, &object_in2_Skel_0078B0, NULL, this->jointTable, this->morphTable, + OBJECT_IN2_LIMB_MAX); + this->animIndex = ENGM_ANIM_NONE; + EnGm_ChangeAnim(this, play, ENGM_ANIM_0); Collider_InitAndSetCylinder(play, &this->colliderCylinder, &this->actor, &sCylinderInit); Collider_InitAndSetSphere(play, &this->colliderSphere, &this->actor, &sSphereInit); CollisionCheck_SetInfo2(&this->actor.colChkInfo, DamageTable_Get(0x16), &sColChkInfoInit); @@ -1698,7 +1731,7 @@ void EnGm_Update(Actor* thisx, PlayState* play) { if (!func_8094E0F8(this, play)) { if (!func_8094EE84(this, play) && func_8094EFC4(this, play)) { func_80950F2C(this, play); - func_8094DFF8(this, play); + EnGm_UpdateSkelAnime(this, play); func_8094E2D0(this); return; } @@ -1708,7 +1741,7 @@ void EnGm_Update(Actor* thisx, PlayState* play) { func_8094F53C(this, play); if (this->unk_258 != 0) { - func_8094DFF8(this, play); + EnGm_UpdateSkelAnime(this, play); func_8094E2D0(this); func_8094F2E8(this); SubS_Offer(&this->actor, play, this->unk_3B4, 30.0f, PLAYER_IA_NONE, this->unk_3A4 & SUBS_OFFER_MODE_MASK); @@ -1726,20 +1759,20 @@ s32 EnGm_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* po EnGm* this = THIS; s32 fidgetIndex; - if (limbIndex == 16) { + if (limbIndex == OBJECT_IN2_LIMB_10) { func_8094F3D0(this, play); } switch (limbIndex) { - case 9: + case OBJECT_IN2_LIMB_09: fidgetIndex = 0; break; - case 10: + case OBJECT_IN2_LIMB_0A: fidgetIndex = 1; break; - case 13: + case OBJECT_IN2_LIMB_0D: fidgetIndex = 2; break; @@ -1763,20 +1796,20 @@ void EnGm_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Vec3f sp30; s32 pad2; - if ((CutsceneManager_GetCurrentCsId() == CS_ID_NONE) && (limbIndex == 16)) { + if ((CutsceneManager_GetCurrentCsId() == CS_ID_NONE) && (limbIndex == OBJECT_IN2_LIMB_10)) { Matrix_MultVec3f(&D_80951E24, &this->actor.focus.pos); Math_Vec3s_Copy(&this->actor.focus.rot, &this->actor.world.rot); } OPEN_DISPS(play->state.gfxCtx); - if ((limbIndex == 15) && (this->unk_3A4 & 0x800)) { + if ((limbIndex == OBJECT_IN2_LIMB_0F) && (this->unk_3A4 & 0x800)) { gSPDisplayList(POLY_OPA_DISP++, object_in2_DL_007528); } CLOSE_DISPS(play->state.gfxCtx); - if (limbIndex == 9) { + if (limbIndex == OBJECT_IN2_LIMB_09) { Matrix_MultVec3f(&gZeroVec3f, &sp30); Math_Vec3f_ToVec3s(&this->colliderSphere.dim.worldSphere.center, &sp30); } @@ -1799,7 +1832,7 @@ void EnGm_TransformLimbDraw(PlayState* play, s32 limbIndex, Actor* thisx) { overrideRot = false; } - if (limbIndex == 16) { + if (limbIndex == OBJECT_IN2_LIMB_10) { SubS_UpdateLimb(BINANG_ADD(this->unk_3BC + this->unk_3C0, 0x4000), BINANG_ADD(this->unk_3BE + this->unk_3C2 + this->actor.shape.rot.y, 0x4000), &this->unk_290, &this->unk_2A8, stepRot, overrideRot); @@ -1810,7 +1843,7 @@ void EnGm_TransformLimbDraw(PlayState* play, s32 limbIndex, Actor* thisx) { Matrix_RotateXS(this->unk_2A8.x, MTXMODE_APPLY); Matrix_RotateZS(this->unk_2A8.z, MTXMODE_APPLY); Matrix_Push(); - } else if (limbIndex == 9) { + } else if (limbIndex == OBJECT_IN2_LIMB_09) { SubS_UpdateLimb(BINANG_ADD(this->unk_3C0, 0x4000), BINANG_ADD(this->unk_3C2 + this->actor.shape.rot.y, 0x4000), &this->unk_29C, &this->unk_2AE, stepRot, overrideRot); Matrix_Pop(); @@ -1824,8 +1857,10 @@ void EnGm_TransformLimbDraw(PlayState* play, s32 limbIndex, Actor* thisx) { } void EnGm_Draw(Actor* thisx, PlayState* play) { - static TexturePtr D_80951E30[] = { object_in2_Tex_0054A8, object_in2_Tex_005028, object_in2_Tex_006828, - object_in2_Tex_005028, object_in2_Tex_005CE8, object_in2_Tex_006C68 }; + static TexturePtr D_80951E30[] = { + object_in2_Tex_0054A8, object_in2_Tex_005028, object_in2_Tex_006828, + object_in2_Tex_005028, object_in2_Tex_005CE8, object_in2_Tex_006C68, + }; EnGm* this = THIS; if ((this->unk_258 != 0) && (this->unk_262 >= 0)) { diff --git a/src/overlays/actors/ovl_En_Gm/z_en_gm.h b/src/overlays/actors/ovl_En_Gm/z_en_gm.h index 572fa322f..968d6dd07 100644 --- a/src/overlays/actors/ovl_En_Gm/z_en_gm.h +++ b/src/overlays/actors/ovl_En_Gm/z_en_gm.h @@ -2,6 +2,7 @@ #define Z_EN_GM_H #include "global.h" +#include "objects/object_in2/object_in2.h" struct EnGm; @@ -42,11 +43,11 @@ typedef struct EnGm { /* 0x29C */ Vec3f unk_29C; /* 0x2A8 */ Vec3s unk_2A8; /* 0x2AE */ Vec3s unk_2AE; - /* 0x2B4 */ Vec3s jointTable[20]; - /* 0x32C */ Vec3s morphTable[20]; + /* 0x2B4 */ Vec3s jointTable[OBJECT_IN2_LIMB_MAX]; + /* 0x32C */ Vec3s morphTable[OBJECT_IN2_LIMB_MAX]; /* 0x3A4 */ u16 unk_3A4; /* 0x3A6 */ u16 unk_3A6; - /* 0x3A8 */ f32 unk_3A8; + /* 0x3A8 */ f32 animPlaySpeed; /* 0x3AC */ f32 unk_3AC; /* 0x3B0 */ f32 unk_3B0; /* 0x3B4 */ f32 unk_3B4; @@ -69,7 +70,7 @@ typedef struct EnGm { /* 0x3E0 */ s16 unk_3E0; /* 0x3E2 */ s16 unk_3E2; /* 0x3E4 */ EnGmUnkFunc unk_3E4; - /* 0x3E8 */ s32 unk_3E8; + /* 0x3E8 */ s32 animIndex; /* 0x3EC */ UNK_TYPE1 unk3EC[0x4]; /* 0x3F0 */ s32 prevTalkState; /* 0x3F4 */ s32 unk_3F4; diff --git a/src/overlays/actors/ovl_En_Go/z_en_go.c b/src/overlays/actors/ovl_En_Go/z_en_go.c index 10dda353c..f5678eedd 100644 --- a/src/overlays/actors/ovl_En_Go/z_en_go.c +++ b/src/overlays/actors/ovl_En_Go/z_en_go.c @@ -82,8 +82,8 @@ typedef enum EnGoEffectType { /* 7 */ ENGO_EFFECT_STEAM = ENGO_EFFECT_STEAM_MIN } EnGoEffectType; -typedef enum EnGoAnimationIndex { - /* -1 */ ENGO_ANIM_INVALID = -1, +typedef enum EnGoAnimation { + /* -1 */ ENGO_ANIM_NONE = -1, /* 0 */ ENGO_ANIM_GORON_MIN, /* 0 */ ENGO_ANIM_LYINGDOWNIDLE = ENGO_ANIM_GORON_MIN, /* 1 */ ENGO_ANIM_LYINGDOWNIDLE_IMM, @@ -95,21 +95,21 @@ typedef enum EnGoAnimationIndex { /* 7 */ ENGO_ANIM_DROPKEG, /* 8 */ ENGO_ANIM_COVEREARS, /* 9 */ ENGO_ANIM_SHIVERINGSURPRISED, - /* 10 */ ENGO_ANIM_ATHLETICS_MIN, - /* 10 */ ENGO_ANIM_DOUBLE_ARM_SIDEBEND = ENGO_ANIM_ATHLETICS_MIN, - /* 11 */ ENGO_ANIM_SQUAT_SIDE_TO_SIDE, - /* 12 */ ENGO_ANIM_SHAKE_LIMBS, - /* 13 */ ENGO_ANIM_SINGLE_ARM_SIDEBEND, - /* 14 */ ENGO_ANIM_SITTING_STRETCH, - /* 15 */ ENGO_ANIM_CHEER, - /* 16 */ ENGO_ANIM_SHOUT, - /* 17 */ ENGO_ANIM_HELP_SITTING_STRETCH, - /* 18 */ ENGO_ANIM_SPRING_MIN, - /* 18 */ ENGO_ANIM_SHOW = ENGO_ANIM_SPRING_MIN, - /* 19 */ ENGO_ANIM_SHOW_LOOPED, - /* 20 */ ENGO_ANIM_LOOK_AROUND, - /* 21 */ ENGO_ANIM_LOOK_AROUND_LOOPED -} EnGoAnimationIndex; + /* 10 */ ENGO_ANIM_ATHLETICS_MIN, + /* 10 */ ENGO_ANIM_DOUBLE_ARM_SIDEBEND = ENGO_ANIM_ATHLETICS_MIN, + /* 11 */ ENGO_ANIM_SQUAT_SIDE_TO_SIDE, + /* 12 */ ENGO_ANIM_SHAKE_LIMBS, + /* 13 */ ENGO_ANIM_SINGLE_ARM_SIDEBEND, + /* 14 */ ENGO_ANIM_SITTING_STRETCH, + /* 15 */ ENGO_ANIM_CHEER, + /* 16 */ ENGO_ANIM_SHOUT, + /* 17 */ ENGO_ANIM_HELP_SITTING_STRETCH, + /* 18 */ ENGO_ANIM_SPRING_MIN, + /* 18 */ ENGO_ANIM_SHOW = ENGO_ANIM_SPRING_MIN, + /* 19 */ ENGO_ANIM_SHOW_LOOPED, + /* 20 */ ENGO_ANIM_LOOK_AROUND, + /* 21 */ ENGO_ANIM_LOOK_AROUND_LOOPED +} EnGoAnimation; void EnGo_Idle(EnGo* this, PlayState* play); void EnGo_Sleep(EnGo* this, PlayState* play); @@ -309,7 +309,7 @@ static DamageTable sDamageTable = { /** * Animations used in the actor. * - * @see EnGoAnimationIndex + * @see EnGoAnimation */ static AnimationInfoS sAnimationInfo[] = { @@ -530,7 +530,7 @@ void EnGo_DrawDust(EnGoEffect effect[ENGO_EFFECT_COUNT], PlayState* play2) { * @param pos Position around which the effects appear */ void EnGo_InitSnow(EnGoEffect effect[ENGO_SNOW_EFFECT_COUNT], Vec3f pos) { - static u8 effectIndexToSnowEffectTable[ENGO_SNOW_EFFECT_COUNT] = { + static u8 sEffectIndexToSnowEffectTable[ENGO_SNOW_EFFECT_COUNT] = { ENGO_EFFECT_SNOW3, ENGO_EFFECT_SNOW1, ENGO_EFFECT_SNOW1, ENGO_EFFECT_SNOW2, ENGO_EFFECT_SNOW3, ENGO_EFFECT_SNOW1, ENGO_EFFECT_SNOW1, ENGO_EFFECT_SNOW2, ENGO_EFFECT_SNOW3, ENGO_EFFECT_SNOW1, ENGO_EFFECT_SNOW1, ENGO_EFFECT_SNOW2, @@ -570,7 +570,7 @@ void EnGo_InitSnow(EnGoEffect effect[ENGO_SNOW_EFFECT_COUNT], Vec3f pos) { effect->alphaDenom = effect->alphaNumer = 1; // Assign a snow effect value of 'ENGO_EFFECT_SNOW1'/'2'/'3' - effect->type = effectIndexToSnowEffectTable[i]; + effect->type = sEffectIndexToSnowEffectTable[i]; // Initialize the parameters for the paired element randRelativeToWorldPos.x = ((Rand_ZeroOne() - 0.5f) * 80.0f) + effect->pos.x; @@ -977,27 +977,27 @@ s32 EnGo_UpdateSpringArrivalCutscene(EnGo* this, PlayState* play) { * * @return True if non-repeating animation has finished */ -s32 EnGo_UpdateAnimationToCurrent(EnGo* this, PlayState* play) { +s32 EnGo_UpdateSkelAnime(EnGo* this, PlayState* play) { s8 objIndex = this->actor.objBankIndex; s8 extraObjIndex = -1; - s32 ret = false; + s32 isAnimFinished = false; - if ((this->curAnimIndex >= ENGO_ANIM_SPRING_MIN) && (this->hakuginDemoObjIndex >= 0)) { + if ((this->animIndex >= ENGO_ANIM_SPRING_MIN) && (this->hakuginDemoObjIndex >= 0)) { extraObjIndex = this->hakuginDemoObjIndex; - } else if ((this->curAnimIndex >= ENGO_ANIM_ATHLETICS_MIN) && (this->taisouObjIndex >= 0)) { + } else if ((this->animIndex >= ENGO_ANIM_ATHLETICS_MIN) && (this->taisouObjIndex >= 0)) { extraObjIndex = this->taisouObjIndex; - } else if (this->curAnimIndex < ENGO_ANIM_ATHLETICS_MIN) { + } else if (this->animIndex < ENGO_ANIM_ATHLETICS_MIN) { extraObjIndex = this->actor.objBankIndex; } if (extraObjIndex >= 0) { gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[extraObjIndex].segment); - this->skelAnime.playSpeed = this->curAnimPlaySpeed; - ret = SkelAnime_Update(&this->skelAnime); + this->skelAnime.playSpeed = this->animPlaySpeed; + isAnimFinished = SkelAnime_Update(&this->skelAnime); gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[objIndex].segment); } - return ret; + return isAnimFinished; } /** @@ -1005,7 +1005,7 @@ s32 EnGo_UpdateAnimationToCurrent(EnGo* this, PlayState* play) { */ s32 EnGo_UpdateSfx(EnGo* this, PlayState* play) { if (play->csCtx.state == CS_STATE_IDLE) { - if (this->curAnimIndex == ENGO_ANIM_ROLL) { + if (this->animIndex == ENGO_ANIM_ROLL) { if (Animation_OnFrame(&this->skelAnime, 2.0f)) { Actor_PlaySfx(&this->actor, NA_SE_EN_GOLON_CIRCLE); } @@ -1013,7 +1013,7 @@ s32 EnGo_UpdateSfx(EnGo* this, PlayState* play) { if (Animation_OnFrame(&this->skelAnime, 22.0f)) { Actor_PlaySfx(&this->actor, NA_SE_EN_GOLON_SIT_IMT); } - } else if ((this->curAnimIndex == ENGO_ANIM_UNROLL) || (this->curAnimIndex == ENGO_ANIM_UNROLL_IMM)) { + } else if ((this->animIndex == ENGO_ANIM_UNROLL) || (this->animIndex == ENGO_ANIM_UNROLL_IMM)) { if (Animation_OnFrame(&this->skelAnime, 2.0f)) { Actor_PlaySfx(&this->actor, NA_SE_EN_GOLON_CIRCLE_OFF); } @@ -1037,10 +1037,10 @@ s32 EnGo_UpdateSfx(EnGo* this, PlayState* play) { * * @return True if animation was changed */ -s32 EnGo_ChangeAnim(EnGo* this, PlayState* play, EnGoAnimationIndex animIndex) { +s32 EnGo_ChangeAnim(EnGo* this, PlayState* play, EnGoAnimation animIndex) { s8 objIndex = this->actor.objBankIndex; s8 extraObjIndex = -1; - s32 ret = false; + s32 didAnimChange = false; if ((animIndex >= ENGO_ANIM_SPRING_MIN) && (this->hakuginDemoObjIndex >= 0)) { extraObjIndex = this->hakuginDemoObjIndex; @@ -1052,13 +1052,13 @@ s32 EnGo_ChangeAnim(EnGo* this, PlayState* play, EnGoAnimationIndex animIndex) { if (extraObjIndex >= 0) { gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[extraObjIndex].segment); - this->curAnimIndex = animIndex; - ret = SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, animIndex); - this->curAnimPlaySpeed = this->skelAnime.playSpeed; + this->animIndex = animIndex; + didAnimChange = SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, animIndex); + this->animPlaySpeed = this->skelAnime.playSpeed; gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[objIndex].segment); } - return ret; + return didAnimChange; } /** @@ -1651,7 +1651,7 @@ void EnGo_ChangeToStretchingAnimation(EnGo* this, PlayState* play) { EnGo_ChangeAnim(this, play, sSubtypeToAnimIndex[subtypeLookup]); // Move the sitting Goron forward, since their spawn location is the same as their standing counterpart. - if (this->curAnimIndex == ENGO_ANIM_SITTING_STRETCH) { + if (this->animIndex == ENGO_ANIM_SITTING_STRETCH) { Lib_Vec3f_TranslateAndRotateY(&this->actor.world.pos, this->actor.shape.rot.y, &sStretchingGoronOffset, &newSittingStretcherPos); @@ -1701,7 +1701,7 @@ void EnGo_ChangeToSpectatingAnimation(EnGo* this, PlayState* play) { void EnGo_ChangeToFrozenAnimation(EnGo* this, PlayState* play) { Collider_InitAndSetCylinder(play, &this->colliderCylinder, &this->actor, &sCylinderInitFrozen); CollisionCheck_SetInfo2(&this->actor.colChkInfo, &sDamageTable, &sColChkInfoInit); - this->curAnimIndex = -1; + this->animIndex = ENGO_ANIM_NONE; EnGo_ChangeAnim(this, play, ENGO_ANIM_SHIVER); this->sleepState = ENGO_AWAKE; this->iceBlockScale = (this->scaleFactor / 0.01f) * 0.9f; @@ -1899,7 +1899,7 @@ void EnGo_SetupInitialAction(EnGo* this, PlayState* play) { SkelAnime_InitFlex(play, &this->skelAnime, &gGoronSkel, NULL, this->jointTable, this->morphTable, GORON_LIMB_MAX); - this->curAnimIndex = ENGO_ANIM_INVALID; + this->animIndex = ENGO_ANIM_NONE; EnGo_ChangeAnim(this, play, ENGO_ANIM_UNROLL); this->actor.draw = EnGo_Draw; @@ -2168,14 +2168,14 @@ void EnGo_HandleSpringArrivalCutscene(EnGo* this, PlayState* play) { switch (this->springArrivalCueId) { case 3: if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame) && - (this->curAnimIndex == ENGO_ANIM_LOOK_AROUND)) { + (this->animIndex == ENGO_ANIM_LOOK_AROUND)) { EnGo_ChangeAnim(this, play, ENGO_ANIM_LOOK_AROUND_LOOPED); } break; case 4: if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame) && - (this->curAnimIndex == ENGO_ANIM_SHOW)) { + (this->animIndex == ENGO_ANIM_SHOW)) { EnGo_ChangeAnim(this, play, ENGO_ANIM_SHOW_LOOPED); } break; @@ -2439,7 +2439,7 @@ void EnGo_Update(Actor* thisx, PlayState* play) { if (!(this->actionFlags & ENGO_FLAG_FROZEN)) { EnGo_UpdateEyes(this); - EnGo_UpdateAnimationToCurrent(this, play); + EnGo_UpdateSkelAnime(this, play); EnGo_UpdateAttentionTargetAndReactions(this, play); EnGo_UpdateSfx(this, play); } @@ -2599,7 +2599,7 @@ void EnGo_Draw(Actor* thisx, PlayState* play) { gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sEyeTextures[this->eyeTexIndex])); - if (this->curAnimIndex == ENGO_ANIM_SITTING_STRETCH) { + if (this->animIndex == ENGO_ANIM_SITTING_STRETCH) { Matrix_Translate(0.0f, 0.0f, -4000.0f, MTXMODE_APPLY); } SkelAnime_DrawTransformFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, diff --git a/src/overlays/actors/ovl_En_Go/z_en_go.h b/src/overlays/actors/ovl_En_Go/z_en_go.h index 0ada7fe1e..97959a03e 100644 --- a/src/overlays/actors/ovl_En_Go/z_en_go.h +++ b/src/overlays/actors/ovl_En_Go/z_en_go.h @@ -106,7 +106,7 @@ typedef struct EnGo { /* 0x390 */ u16 actionFlags; /* 0x392 */ u16 lastTextId; /* 0x394 */ u8 springArrivalCueId; - /* 0x398 */ f32 curAnimPlaySpeed; + /* 0x398 */ f32 animPlaySpeed; /* 0x39C */ f32 iceBlockScale; /* 0x3A0 */ f32 iceBlockAlpha; /* 0x3A4 */ f32 scaleFactor; @@ -132,7 +132,7 @@ typedef struct EnGo { /* 0x3CE */ s16 fidgetTableY[ENGO_FIDGET_TABLE_LEN]; /* 0x3D4 */ s16 surprisePhase; /* 0x3D8 */ MsgEventFunc msgEventFunc; - /* 0x3DC */ s32 curAnimIndex; + /* 0x3DC */ s32 animIndex; /* 0x3E0 */ UNK_TYPE1 unk3E0[0x4]; /* 0x3E4 */ s32 indexPathPoint; /* 0x3E8 */ s32 indexEffect; diff --git a/src/overlays/actors/ovl_En_Goroiwa/z_en_goroiwa.c b/src/overlays/actors/ovl_En_Goroiwa/z_en_goroiwa.c index 148b2d116..aa6eb041f 100644 --- a/src/overlays/actors/ovl_En_Goroiwa/z_en_goroiwa.c +++ b/src/overlays/actors/ovl_En_Goroiwa/z_en_goroiwa.c @@ -674,6 +674,7 @@ void func_80940090(EnGoroiwa* this, PlayState* play) { sp10C.x = this->actor.world.pos.x; sp10C.y = this->actor.world.pos.y + this->unk_1DC; sp10C.z = this->actor.world.pos.z; + //! FAKE: if (1) {} spD8 = spEC * 150.0f; spA8 = 0x10000 / spD8; @@ -1117,8 +1118,8 @@ void func_809419D0(EnGoroiwa* this) { void func_80941A10(EnGoroiwa* this, PlayState* play) { static EnGoroiwaUnkFunc D_80942E94[] = { - &func_8093F498, - &func_8093F34C, + func_8093F498, + func_8093F34C, }; static u16 D_80942E9C[][2] = { { NA_SE_EV_BIGBALL_ROLL - SFX_FLAG, NA_SE_EV_BIGBALL_ROLL_SR - SFX_FLAG }, @@ -1507,6 +1508,9 @@ void EnGoroiwa_Update(Actor* thisx, PlayState* play) { this->actor.floorBgId = 50; } break; + + default: + break; } func_8093FAA4(this, play); diff --git a/src/overlays/actors/ovl_En_Grasshopper/z_en_grasshopper.c b/src/overlays/actors/ovl_En_Grasshopper/z_en_grasshopper.c index 3c0d97d20..90b39f860 100644 --- a/src/overlays/actors/ovl_En_Grasshopper/z_en_grasshopper.c +++ b/src/overlays/actors/ovl_En_Grasshopper/z_en_grasshopper.c @@ -75,8 +75,9 @@ typedef enum { /* 4 */ DRAGONFLY_ANIM_HOVER, /* 5 */ DRAGONFLY_ANIM_DAMAGE, /* 6 */ DRAGONFLY_ANIM_DEAD, - /* 7 */ DRAGONFLY_ANIM_FALL -} EnGrasshopperAnim; + /* 7 */ DRAGONFLY_ANIM_FALL, + /* 8 */ DRAGONFLY_ANIM_MAX +} DragonflyAnimation; static s32 sOccupiedIndices[] = { false, false, false, false, false, @@ -333,7 +334,7 @@ void EnGrasshopper_Destroy(Actor* thisx, PlayState* play) { sOccupiedIndices[this->index] = false; } -static AnimationHeader* sAnimations[] = { +static AnimationHeader* sAnimations[DRAGONFLY_ANIM_MAX] = { &gDragonflyRaiseTailAnim, // DRAGONFLY_ANIM_RAISE_TAIL &gDragonflyLowerTailAnim, // DRAGONFLY_ANIM_LOWER_TAIL &gDragonflyFlyAnim, // DRAGONFLY_ANIM_FLY @@ -344,7 +345,7 @@ static AnimationHeader* sAnimations[] = { &gDragonflyFallAnim, // DRAGONFLY_ANIM_FALL }; -static u8 sAnimationModes[] = { +static u8 sAnimationModes[DRAGONFLY_ANIM_MAX] = { ANIMMODE_ONCE, // DRAGONFLY_ANIM_RAISE_TAIL ANIMMODE_ONCE, // DRAGONFLY_ANIM_LOWER_TAIL ANIMMODE_LOOP, // DRAGONFLY_ANIM_FLY @@ -358,15 +359,15 @@ static u8 sAnimationModes[] = { void EnGrasshopper_ChangeAnim(EnGrasshopper* this, s32 animIndex) { f32 morphFrames; - this->endFrame = Animation_GetLastFrame(sAnimations[animIndex]); + this->animEndFrame = Animation_GetLastFrame(sAnimations[animIndex]); morphFrames = 0.0f; if ((animIndex == DRAGONFLY_ANIM_ATTACK) || (animIndex == DRAGONFLY_ANIM_HOVER) || (animIndex == DRAGONFLY_ANIM_DAMAGE)) { morphFrames = -3.0f; } - Animation_Change(&this->skelAnime, sAnimations[animIndex], 1.0f, 0.0f, this->endFrame, sAnimationModes[animIndex], - morphFrames); + Animation_Change(&this->skelAnime, sAnimations[animIndex], 1.0f, 0.0f, this->animEndFrame, + sAnimationModes[animIndex], morphFrames); } void EnGrasshopper_RaiseTail(EnGrasshopper* this) { @@ -389,7 +390,7 @@ void EnGrasshopper_LowerTail(EnGrasshopper* this) { void EnGrasshopper_DecideAction(EnGrasshopper* this, PlayState* play) { f32 curFrame = this->skelAnime.curFrame; - if (curFrame >= this->endFrame) { + if (curFrame >= this->animEndFrame) { if (this->decision == DRAGONFLY_DECISION_ATTACK) { EnGrasshopper_SetupAttack(this); } else { @@ -580,6 +581,9 @@ void EnGrasshopper_Bank(EnGrasshopper* this, PlayState* play) { this->actionFunc = EnGrasshopper_RoamInCircles; } break; + + default: + break; } } @@ -735,7 +739,7 @@ void EnGrasshopper_Attack(EnGrasshopper* this, PlayState* play) { Math_ApproachF(&this->actor.world.pos.y, this->targetApproachPos.y, 0.1f, this->approachSpeed); Math_ApproachF(&this->approachSpeed, 10.0f, 0.1f, 1.0f); Math_SmoothStepToS(&this->actor.world.rot.y, this->actor.yawTowardsPlayer, 0xA, 0xFA0, 0xA); - if (curFrame >= this->endFrame) { + if (curFrame >= this->animEndFrame) { EnGrasshopper_SetupWaitAfterAttack(this); } } @@ -831,7 +835,7 @@ void EnGrasshopper_Dead(EnGrasshopper* this, PlayState* play) { this->drawDmgEffType = ACTOR_DRAW_DMGEFF_FIRE; } - if (curFrame >= this->endFrame) { + if (curFrame >= this->animEndFrame) { this->actor.flags &= ~ACTOR_FLAG_10; EnGrasshopper_SetupFall(this); } diff --git a/src/overlays/actors/ovl_En_Grasshopper/z_en_grasshopper.h b/src/overlays/actors/ovl_En_Grasshopper/z_en_grasshopper.h index cf0e50cbe..a07091dd8 100644 --- a/src/overlays/actors/ovl_En_Grasshopper/z_en_grasshopper.h +++ b/src/overlays/actors/ovl_En_Grasshopper/z_en_grasshopper.h @@ -91,7 +91,7 @@ typedef struct EnGrasshopper { /* 0x035E */ s16 type; /* 0x0360 */ f32 dragonflyScale; /* 0x0364 */ f32 angularVelocity; - /* 0x0368 */ f32 endFrame; + /* 0x0368 */ f32 animEndFrame; /* 0x036C */ f32 approachSpeed; /* 0x0370 */ f32 baseFlyHeight; /* 0x0374 */ f32 targetPosY; diff --git a/src/overlays/actors/ovl_En_Gs/z_en_gs.c b/src/overlays/actors/ovl_En_Gs/z_en_gs.c index e3ddfee6a..55bd83106 100644 --- a/src/overlays/actors/ovl_En_Gs/z_en_gs.c +++ b/src/overlays/actors/ovl_En_Gs/z_en_gs.c @@ -250,6 +250,9 @@ void func_80997E4C(EnGs* this, PlayState* play) { case ENGS_2: this->unk_210 = this->unk_195 + 0x20F7; break; + + default: + break; } Message_ContinueTextbox(play, this->unk_210); break; @@ -260,6 +263,9 @@ void func_80997E4C(EnGs* this, PlayState* play) { } } break; + + default: + break; } } @@ -329,6 +335,9 @@ void func_8099807C(EnGs* this, PlayState* play) { func_809984F4(this, play); } break; + + default: + break; } break; @@ -339,6 +348,9 @@ void func_8099807C(EnGs* this, PlayState* play) { case 26: func_80997D14(this, play); break; + + default: + break; } } @@ -444,6 +456,9 @@ void func_8099874C(EnGs* this, PlayState* play) { case 4: phi_v0 = func_809995A4(this, play); break; + + default: + break; } if (phi_v0 == 0) { @@ -483,6 +498,9 @@ void func_8099874C(EnGs* this, PlayState* play) { SET_WEEKEVENTREG(WEEKEVENTREG_77_20); } break; + + default: + break; } if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_90_10)) { @@ -754,16 +772,16 @@ void func_80999584(Color_RGB8* arg0, Color_RGB8* arg1) { } s32 func_809995A4(EnGs* this, PlayState* play) { - static Color_RGB8 flashColours[] = { + static Color_RGB8 sFlashColours[] = { { 255, 50, 50 }, { 50, 50, 255 }, { 255, 255, 255 }, }; - static Vec3f dustAccel = { 0.0f, -0.3f, 0.0f }; - static Color_RGBA8 dustPrim = { 200, 200, 200, 128 }; - static Color_RGBA8 dustEnv = { 100, 100, 100, 0 }; - static Vec3f bomb2Velocity = { 0.0f, 0.0f, 0.0f }; - static Vec3f bomb2Accel = { 0.0f, 0.0f, 0.0f }; + static Vec3f sDustAccel = { 0.0f, -0.3f, 0.0f }; + static Color_RGBA8 sDustPrimColor = { 200, 200, 200, 128 }; + static Color_RGBA8 sDustEnvColor = { 100, 100, 100, 0 }; + static Vec3f sBomb2Velocity = { 0.0f, 0.0f, 0.0f }; + static Vec3f sBomb2Accel = { 0.0f, 0.0f, 0.0f }; s32 sp7C = -1; if (this->unk_19D == 0) { @@ -784,18 +802,18 @@ s32 func_809995A4(EnGs* this, PlayState* play) { u8 pad; this->unk_1D4--; - func_80999584(&this->unk_1FA, &flashColours[2]); + func_80999584(&this->unk_1FA, &sFlashColours[2]); if (this->unk_1D4 < 80) { if ((this->unk_1D4 % 20) < 8) { if (this->unk_1D4 < 20) { if ((this->unk_1D4 % 20) == 7) { - func_80999584(&this->unk_1FA, &flashColours[0]); + func_80999584(&this->unk_1FA, &sFlashColours[0]); this->unk_1F4 = this->unk_1FA; Audio_PlaySfx(NA_SE_SY_WARNING_COUNT_E); this->unk_200 = 0.0f; } } else if ((this->unk_1D4 % 20) == 7) { - func_80999584(&this->unk_1FA, &flashColours[1]); + func_80999584(&this->unk_1FA, &sFlashColours[1]); this->unk_1F4 = this->unk_1FA; Audio_PlaySfx(NA_SE_SY_WARNING_COUNT_N); this->unk_200 = 0.0f; @@ -826,7 +844,8 @@ s32 func_809995A4(EnGs* this, PlayState* play) { sp6C.y = this->actor.world.pos.y + 7.0f; sp6C.z = this->actor.world.pos.z + (2.0f * sp60.z); - func_800B0EB0(play, &sp6C, &sp60, &dustAccel, &dustPrim, &dustEnv, Rand_ZeroFloat(50.0f) + 200.0f, 40, 15); + func_800B0EB0(play, &sp6C, &sp60, &sDustAccel, &sDustPrimColor, &sDustEnvColor, + Rand_ZeroFloat(50.0f) + 200.0f, 40, 15); } Actor_PlaySfx_Flagged(&this->actor, NA_SE_EV_FIRE_PILLAR - SFX_FLAG); @@ -856,7 +875,7 @@ s32 func_809995A4(EnGs* this, PlayState* play) { sp54.y = this->actor.world.pos.y; sp54.z = this->actor.world.pos.z; Actor_PlaySfx(&this->actor, NA_SE_IT_BOMB_EXPLOSION); - EffectSsBomb2_SpawnLayered(play, &sp54, &bomb2Velocity, &bomb2Accel, 100, 20); + EffectSsBomb2_SpawnLayered(play, &sp54, &sBomb2Velocity, &sBomb2Accel, 100, 20); this->unk_1D4 = 10; this->unk_19A |= 8; this->unk_216 = 0; diff --git a/src/overlays/actors/ovl_En_Guard_Nuts/z_en_guard_nuts.c b/src/overlays/actors/ovl_En_Guard_Nuts/z_en_guard_nuts.c index d51cf7703..7fcf32bf4 100644 --- a/src/overlays/actors/ovl_En_Guard_Nuts/z_en_guard_nuts.c +++ b/src/overlays/actors/ovl_En_Guard_Nuts/z_en_guard_nuts.c @@ -61,18 +61,32 @@ s32 sGuardCount = 0; s32 D_80ABBE20 = 0; -static u16 sTextIDs[] = { 0x0824, 0x0825, 0x0826, 0x082D, 0x0827, 0x0828, 0x0829, 0x082A, 0x082B, 0x082C }; +static u16 sTextIds[] = { 0x0824, 0x0825, 0x0826, 0x082D, 0x0827, 0x0828, 0x0829, 0x082A, 0x082B, 0x082C }; s16 D_80ABBE38[] = { 0x0000, 0x0000, 0x0002, 0x0001, 0x0000, 0x0000, 0x0002, 0x0000, 0x0000, 0x0002 }; -static AnimationHeader* sAnimations[] = { - &gDekuPalaceGuardWaitAnim, - &gDekuPalaceGuardWalkAnim, - &gDekuPalaceGuardDigAnim, - &gDekuPalaceGuardWalkAnim, +typedef enum { + /* -1 */ GUARD_NUTS_ANIM_NONE = -1, + /* 0 */ GUARD_NUTS_ANIM_WAIT_HEAD_TILT, + /* 1 */ GUARD_NUTS_ANIM_WALK, + /* 2 */ GUARD_NUTS_ANIM_DIG, + /* 3 */ GUARD_NUTS_ANIM_WALK_2, + /* 4 */ GUARD_NUTS_ANIM_MAX +} EnGuardNutsAnimation; + +static AnimationHeader* sAnimations[GUARD_NUTS_ANIM_MAX] = { + &gDekuPalaceGuardWaitAnim, // GUARD_NUTS_ANIM_WAIT_HEAD_TILT + &gDekuPalaceGuardWalkAnim, // GUARD_NUTS_ANIM_WALK + &gDekuPalaceGuardDigAnim, // GUARD_NUTS_ANIM_DIG + &gDekuPalaceGuardWalkAnim, // GUARD_NUTS_ANIM_WALK_2 }; -static u8 sAnimationModes[] = { ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_ONCE, ANIMMODE_ONCE }; +static u8 sAnimationModes[GUARD_NUTS_ANIM_MAX] = { + ANIMMODE_LOOP, // GUARD_NUTS_ANIM_WAIT_HEAD_TILT + ANIMMODE_LOOP, // GUARD_NUTS_ANIM_WALK + ANIMMODE_ONCE, // GUARD_NUTS_ANIM_DIG + ANIMMODE_ONCE, // GUARD_NUTS_ANIM_WALK_2 +}; static TexturePtr sEyeTextures[] = { gDekuPalaceGuardEyeOpenTex, @@ -80,13 +94,6 @@ static TexturePtr sEyeTextures[] = { gDekuPalaceGuardEyeClosedTex, }; -typedef enum { - /* 0 */ WAIT_HEAD_TILT_ANIM, - /* 1 */ WALK_ANIM, - /* 2 */ DIG_ANIM, - /* 3 */ WALK_ANIM_2 -} EnGuardNutsAnim; - typedef enum { /* 0 */ GUARD_NUTS_WAIT_STATE, /* 1 */ GUARD_NUTS_TALKING_STATE, @@ -123,20 +130,20 @@ void EnGuardNuts_Destroy(Actor* thisx, PlayState* play) { } /** - * @brief Changes the animation to the provided index. Updates animIndex and animFrameCount for the animation. + * @brief Changes the animation to the provided index. Updates animIndex and animEndFrame for the animation. * * @param this * @param animIndex the index of sAnimations to change to */ void EnGuardNuts_ChangeAnim(EnGuardNuts* this, s32 animIndex) { this->animIndex = animIndex; - this->animFrameCount = Animation_GetLastFrame(sAnimations[this->animIndex]); - Animation_Change(&this->skelAnime, sAnimations[this->animIndex], 1.0f, 0.0f, this->animFrameCount, + this->animEndFrame = Animation_GetLastFrame(sAnimations[this->animIndex]); + Animation_Change(&this->skelAnime, sAnimations[this->animIndex], 1.0f, 0.0f, this->animEndFrame, sAnimationModes[this->animIndex], -2.0f); } void EnGuardNuts_SetupWait(EnGuardNuts* this) { - EnGuardNuts_ChangeAnim(this, WAIT_HEAD_TILT_ANIM); + EnGuardNuts_ChangeAnim(this, GUARD_NUTS_ANIM_WAIT_HEAD_TILT); this->state = GUARD_NUTS_WAIT_STATE; this->actionFunc = EnGuardNuts_Wait; } @@ -169,22 +176,22 @@ void EnGuardNuts_Wait(EnGuardNuts* this, PlayState* play) { // No place for an outsider this->guardTextIndex = 3; } - this->actor.textId = sTextIDs[this->guardTextIndex]; + this->actor.textId = sTextIds[this->guardTextIndex]; phi_a1 = this->actor.world.rot.y; if (D_80ABBE20 == 2) { EnGuardNuts_Burrow(this, play); return; } if (D_80ABBE20 == 1) { - if (this->animIndex != WALK_ANIM) { - EnGuardNuts_ChangeAnim(this, WALK_ANIM); + if (this->animIndex != GUARD_NUTS_ANIM_WALK) { + EnGuardNuts_ChangeAnim(this, GUARD_NUTS_ANIM_WALK); } phi_a1 = (this->actor.home.rot.y + 0x8000); } if (fabsf((f32)(this->actor.shape.rot.y - phi_a1)) < 100.0f) { this->actor.shape.rot.y = phi_a1; - if ((D_80ABBE20 == 1) && (this->animIndex != WALK_ANIM_2)) { - EnGuardNuts_ChangeAnim(this, WALK_ANIM_2); + if ((D_80ABBE20 == 1) && (this->animIndex != GUARD_NUTS_ANIM_WALK_2)) { + EnGuardNuts_ChangeAnim(this, GUARD_NUTS_ANIM_WALK_2); } } else { Math_SmoothStepToS(&this->actor.shape.rot.y, phi_a1, 1, 0xBB8, 0); @@ -199,7 +206,7 @@ void EnGuardNuts_Wait(EnGuardNuts* this, PlayState* play) { } void func_80ABB540(EnGuardNuts* this) { - EnGuardNuts_ChangeAnim(this, WALK_ANIM); + EnGuardNuts_ChangeAnim(this, GUARD_NUTS_ANIM_WALK); this->targetHeadPos.x = this->targetHeadPos.y = 0; this->timer = 16; this->state = GUARD_NUTS_TALKING_STATE; @@ -216,7 +223,7 @@ void func_80ABB590(EnGuardNuts* this, PlayState* play) { if (fabsf((this->actor.shape.rot.y - yaw)) < 100.0f) { this->actor.shape.rot.y = yaw; curFrame = this->skelAnime.curFrame; - if ((curFrame < this->animFrameCount) || (this->guardTextIndex >= 7)) { + if ((curFrame < this->animEndFrame) || (this->guardTextIndex >= 7)) { SkelAnime_Update(&this->skelAnime); } } else { @@ -226,8 +233,8 @@ void func_80ABB590(EnGuardNuts* this, PlayState* play) { if (Message_GetState(&play->msgCtx) == TEXT_STATE_5) { this->targetHeadPos.y = 0; this->targetHeadPos.x = 0; - if ((this->guardTextIndex == 3) && (this->animIndex == WAIT_HEAD_TILT_ANIM)) { - EnGuardNuts_ChangeAnim(this, WAIT_HEAD_TILT_ANIM); + if ((this->guardTextIndex == 3) && (this->animIndex == GUARD_NUTS_ANIM_WAIT_HEAD_TILT)) { + EnGuardNuts_ChangeAnim(this, GUARD_NUTS_ANIM_WAIT_HEAD_TILT); } if (Message_ShouldAdvance(play)) { if (D_80ABBE38[this->guardTextIndex] != 1) { @@ -238,7 +245,7 @@ void func_80ABB590(EnGuardNuts* this, PlayState* play) { EnGuardNuts_Burrow(this, play); } else { this->guardTextIndex++; - Message_StartTextbox(play, sTextIDs[this->guardTextIndex], &this->actor); + Message_StartTextbox(play, sTextIds[this->guardTextIndex], &this->actor); if (D_80ABBE38[this->guardTextIndex] == 2) { D_80ABBE20 = 1; } @@ -271,7 +278,7 @@ void func_80ABB590(EnGuardNuts* this, PlayState* play) { void EnGuardNuts_Burrow(EnGuardNuts* this, PlayState* play) { Vec3f digPos; - EnGuardNuts_ChangeAnim(this, DIG_ANIM); + EnGuardNuts_ChangeAnim(this, GUARD_NUTS_ANIM_DIG); Math_Vec3f_Copy(&digPos, &this->actor.world.pos); digPos.y = this->actor.floorHeight; EffectSsHahen_SpawnBurst(play, &digPos, 4.0f, 0, 10, 3, 15, HAHEN_OBJECT_DEFAULT, 10, NULL); @@ -287,7 +294,7 @@ void EnGuardNuts_SetupUnburrow(EnGuardNuts* this, PlayState* play) { f32 curFrame = this->skelAnime.curFrame; SkelAnime_Update(&this->skelAnime); - if (this->animFrameCount <= curFrame) { + if (curFrame >= this->animEndFrame) { this->state = GUARD_NUTS_BURROWED_STATE; this->actionFunc = EnGuardNuts_Unburrow; this->actor.world.rot.y = this->actor.home.rot.y; @@ -327,7 +334,7 @@ void EnGuardNuts_Update(Actor* thisx, PlayState* play) { this->blinkTimer = (s16)Rand_ZeroFloat(60.0f) + 20; } } - if ((this->animIndex == WALK_ANIM) && + if ((this->animIndex == GUARD_NUTS_ANIM_WALK) && (Animation_OnFrame(&this->skelAnime, 1.0f) || Animation_OnFrame(&this->skelAnime, 5.0f))) { Actor_PlaySfx(&this->actor, NA_SE_EN_NUTS_WALK); } diff --git a/src/overlays/actors/ovl_En_Guard_Nuts/z_en_guard_nuts.h b/src/overlays/actors/ovl_En_Guard_Nuts/z_en_guard_nuts.h index 8cbe26f03..e07e70eaf 100644 --- a/src/overlays/actors/ovl_En_Guard_Nuts/z_en_guard_nuts.h +++ b/src/overlays/actors/ovl_En_Guard_Nuts/z_en_guard_nuts.h @@ -25,7 +25,7 @@ typedef struct EnGuardNuts { /* 0x228 */ Vec3f guardPos; /* 0x234 */ Vec3s headRot; /* 0x23A */ Vec3s targetHeadPos; - /* 0x240 */ f32 animFrameCount; + /* 0x240 */ f32 animEndFrame; /* 0x244 */ ColliderCylinder collider; } EnGuardNuts; // size = 0x290 diff --git a/src/overlays/actors/ovl_En_Guruguru/z_en_guruguru.c b/src/overlays/actors/ovl_En_Guruguru/z_en_guruguru.c index 28b37cc91..92afb3083 100644 --- a/src/overlays/actors/ovl_En_Guruguru/z_en_guruguru.c +++ b/src/overlays/actors/ovl_En_Guruguru/z_en_guruguru.c @@ -5,7 +5,6 @@ */ #include "z_en_guruguru.h" -#include "objects/object_fu/object_fu.h" #define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10) @@ -62,9 +61,27 @@ static ColliderCylinderInit sCylinderInit = { { 15, 20, 0, { 0, 0, 0 } }, }; -static AnimationHeader* sAnimations[] = { &gGuruGuruPlayStillAnim, &gGuruGuruPlayAndMoveHeadAnim }; -static u8 sAnimationModes[] = { ANIMMODE_LOOP, ANIMMODE_LOOP }; -static f32 sPlaySpeeds[] = { 1.0f, 1.0f }; +typedef enum { + /* 0 */ GURU_GURU_ANIM_PLAY_STILL, + /* 1 */ GURU_GURU_ANIM_PLAY_MOVE_HEAD, + /* 2 */ GURU_GURU_ANIM_MAX +} GuruGuruAnimation; + +static AnimationHeader* sAnimations[GURU_GURU_ANIM_MAX] = { + &gGuruGuruPlayStillAnim, // GURU_GURU_ANIM_PLAY_STILL + &gGuruGuruPlayAndMoveHeadAnim, // GURU_GURU_ANIM_PLAY_MOVE_HEAD +}; + +static u8 sAnimationModes[GURU_GURU_ANIM_MAX] = { + ANIMMODE_LOOP, // GURU_GURU_ANIM_PLAY_STILL + ANIMMODE_LOOP, // GURU_GURU_ANIM_PLAY_MOVE_HEAD +}; + +static f32 sPlaySpeeds[GURU_GURU_ANIM_MAX] = { + 1.0f, // GURU_GURU_ANIM_PLAY_STILL + 1.0f, // GURU_GURU_ANIM_PLAY_MOVE_HEAD +}; + static TexturePtr sEyeTextures[] = { gGuruGuruEyeClosedTex, gGuruGuruEyeAngryTex }; static TexturePtr sMouthTextures[] = { gGuruGuruMouthOpenTex, gGuruGuruMouthAngryTex }; @@ -74,7 +91,7 @@ void EnGuruguru_Init(Actor* thisx, PlayState* play) { this->actor.colChkInfo.mass = MASS_IMMOVABLE; ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 19.0f); SkelAnime_InitFlex(play, &this->skelAnime, &gGuruGuruSkel, &gGuruGuruPlayStillAnim, this->jointTable, - this->morphTable, 16); + this->morphTable, GURU_GURU_LIMB_MAX); this->actor.targetMode = TARGET_MODE_0; if (this->actor.params != 2) { Collider_InitAndSetCylinder(play, &this->collider, &this->actor, &sCylinderInit); @@ -106,8 +123,8 @@ void EnGuruguru_Destroy(Actor* thisx, PlayState* play) { } void EnGuruguru_ChangeAnim(EnGuruguru* this, s32 animIndex) { - this->frameCount = Animation_GetLastFrame(sAnimations[animIndex]); - Animation_Change(&this->skelAnime, sAnimations[animIndex], sPlaySpeeds[animIndex], 0.0f, this->frameCount, + this->animEndFrame = Animation_GetLastFrame(sAnimations[animIndex]); + Animation_Change(&this->skelAnime, sAnimations[animIndex], sPlaySpeeds[animIndex], 0.0f, this->animEndFrame, sAnimationModes[animIndex], -4.0f); } @@ -115,7 +132,7 @@ void EnGuruguru_DoNothing(EnGuruguru* this, PlayState* play) { } void func_80BC6E10(EnGuruguru* this) { - EnGuruguru_ChangeAnim(this, 0); + EnGuruguru_ChangeAnim(this, GURU_GURU_ANIM_PLAY_STILL); this->textIdIndex = 0; this->unk270 = 0; if (this->actor.params == 0) { @@ -373,7 +390,7 @@ void EnGuruguru_Update(Actor* thisx, PlayState* play) { s32 EnGuruguru_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) { EnGuruguru* this = THIS; - if (limbIndex == 14) { + if (limbIndex == GURU_GURU_LIMB_HEAD) { rot->x += this->headXRot; rot->z += this->headZRot; } diff --git a/src/overlays/actors/ovl_En_Guruguru/z_en_guruguru.h b/src/overlays/actors/ovl_En_Guruguru/z_en_guruguru.h index 0158e3ddc..4913d4124 100644 --- a/src/overlays/actors/ovl_En_Guruguru/z_en_guruguru.h +++ b/src/overlays/actors/ovl_En_Guruguru/z_en_guruguru.h @@ -2,6 +2,7 @@ #define Z_EN_GURUGURU_H #include "global.h" +#include "objects/object_fu/object_fu.h" struct EnGuruguru; @@ -10,8 +11,8 @@ typedef void (*EnGuruguruActionFunc)(struct EnGuruguru*, PlayState*); typedef struct EnGuruguru { /* 0x000 */ Actor actor; /* 0x144 */ SkelAnime skelAnime; - /* 0x188 */ Vec3s jointTable[16]; - /* 0x1E8 */ Vec3s morphTable[16]; + /* 0x188 */ Vec3s jointTable[GURU_GURU_LIMB_MAX]; + /* 0x1E8 */ Vec3s morphTable[GURU_GURU_LIMB_MAX]; /* 0x248 */ EnGuruguruActionFunc actionFunc; /* 0x24C */ s16 headZRot; /* 0x24E */ s16 headXRot; @@ -22,7 +23,7 @@ typedef struct EnGuruguru { /* 0x264 */ s16 unusedTimer; // set to 6 and decremented, but never has any effect /* 0x266 */ s16 unk266; /* 0x268 */ s16 unk268; - /* 0x26C */ f32 frameCount; + /* 0x26C */ f32 animEndFrame; /* 0x270 */ u8 unk270; /* 0x272 */ s16 unk272; // set, but never used /* 0x274 */ s16 textIdIndex; diff --git a/src/overlays/actors/ovl_En_Jg/z_en_jg.c b/src/overlays/actors/ovl_En_Jg/z_en_jg.c index 20be1b6c8..7e30676e2 100644 --- a/src/overlays/actors/ovl_En_Jg/z_en_jg.c +++ b/src/overlays/actors/ovl_En_Jg/z_en_jg.c @@ -631,7 +631,7 @@ void EnJg_LullabyIntroCutsceneAction(EnJg* this, PlayState* play) { switch (play->csCtx.actorCues[cueChannel]->id) { case 1: - this->cutsceneAnimIndex = EN_JG_ANIM_CUTSCENE_IDLE; + this->csAnimIndex = EN_JG_ANIM_CUTSCENE_IDLE; if (this->drum != NULL) { Actor_Kill(this->drum); this->drum = NULL; @@ -639,50 +639,49 @@ void EnJg_LullabyIntroCutsceneAction(EnJg* this, PlayState* play) { break; case 2: - this->cutsceneAnimIndex = EN_JG_ANIM_TAKING_OUT_DRUM; + this->csAnimIndex = EN_JG_ANIM_TAKING_OUT_DRUM; break; case 3: - this->cutsceneAnimIndex = EN_JG_ANIM_DRUM_IDLE; + this->csAnimIndex = EN_JG_ANIM_DRUM_IDLE; break; case 4: - this->cutsceneAnimIndex = EN_JG_ANIM_PLAYING_DRUM; + this->csAnimIndex = EN_JG_ANIM_PLAYING_DRUM; break; case 5: - this->cutsceneAnimIndex = EN_JG_ANIM_THINKING; + this->csAnimIndex = EN_JG_ANIM_THINKING; break; case 6: - this->cutsceneAnimIndex = EN_JG_ANIM_REMEMBERING; + this->csAnimIndex = EN_JG_ANIM_REMEMBERING; break; case 7: - this->cutsceneAnimIndex = EN_JG_ANIM_STRONG_REMEMBERING; + this->csAnimIndex = EN_JG_ANIM_STRONG_REMEMBERING; break; case 8: - this->cutsceneAnimIndex = EN_JG_ANIM_DEPRESSED; + this->csAnimIndex = EN_JG_ANIM_DEPRESSED; break; case 9: - this->cutsceneAnimIndex = EN_JG_ANIM_CRADLE; + this->csAnimIndex = EN_JG_ANIM_CRADLE; break; default: - this->cutsceneAnimIndex = EN_JG_ANIM_IDLE; + this->csAnimIndex = EN_JG_ANIM_IDLE; break; } - SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, this->cutsceneAnimIndex); + SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, this->csAnimIndex); } if (!(this->flags & FLAG_DRUM_SPAWNED) && - (((this->cutsceneAnimIndex == EN_JG_ANIM_TAKING_OUT_DRUM) && Animation_OnFrame(&this->skelAnime, 14.0f) && + (((this->csAnimIndex == EN_JG_ANIM_TAKING_OUT_DRUM) && Animation_OnFrame(&this->skelAnime, 14.0f) && (this->action != EN_JG_ACTION_LULLABY_INTRO_CS)) || - (((this->cutsceneAnimIndex == EN_JG_ANIM_DRUM_IDLE) || - (this->cutsceneAnimIndex == EN_JG_ANIM_PLAYING_DRUM)) && + (((this->csAnimIndex == EN_JG_ANIM_DRUM_IDLE) || (this->csAnimIndex == EN_JG_ANIM_PLAYING_DRUM)) && (this->action == EN_JG_ACTION_LULLABY_INTRO_CS)))) { this->flags |= FLAG_DRUM_SPAWNED; this->drum = Actor_SpawnAsChildAndCutscene( @@ -691,7 +690,7 @@ void EnJg_LullabyIntroCutsceneAction(EnJg* this, PlayState* play) { this->actor.params, this->actor.csId, this->actor.halfDaysBits, NULL); } - if (this->cutsceneAnimIndex == EN_JG_ANIM_TAKING_OUT_DRUM) { + if (this->csAnimIndex == EN_JG_ANIM_TAKING_OUT_DRUM) { if (Animation_OnFrame(&this->skelAnime, 23.0f)) { Audio_PlaySfx_AtPos(&sSfxPos, NA_SE_EV_WOOD_BOUND_S); } else if (Animation_OnFrame(&this->skelAnime, 38.0f)) { diff --git a/src/overlays/actors/ovl_En_Jg/z_en_jg.h b/src/overlays/actors/ovl_En_Jg/z_en_jg.h index b63f34dce..30c84973c 100644 --- a/src/overlays/actors/ovl_En_Jg/z_en_jg.h +++ b/src/overlays/actors/ovl_En_Jg/z_en_jg.h @@ -35,7 +35,7 @@ typedef struct EnJg { /* 0x3B0 */ Vec3f breathVelocity; /* 0x3BC */ Vec3f breathAccel; /* 0x3C8 */ s16 csId; - /* 0x3CA */ u8 cutsceneAnimIndex; + /* 0x3CA */ u8 csAnimIndex; /* 0x3CB */ u8 cueId; /* 0x3CC */ u16 flags; /* 0x3CE */ u16 textId; diff --git a/src/overlays/actors/ovl_En_Kgy/z_en_kgy.c b/src/overlays/actors/ovl_En_Kgy/z_en_kgy.c index 694b9271d..b5819e333 100644 --- a/src/overlays/actors/ovl_En_Kgy/z_en_kgy.c +++ b/src/overlays/actors/ovl_En_Kgy/z_en_kgy.c @@ -17,7 +17,7 @@ void EnKgy_Destroy(Actor* thisx, PlayState* play); void EnKgy_Update(Actor* thisx, PlayState* play); void EnKgy_Draw(Actor* thisx, PlayState* play); -void EnKgy_ChangeAnim(EnKgy* this, s16 animIndex, u8 mode, f32 morphFrames); +void EnKgy_ChangeAnim(EnKgy* this, s16 animIndex, u8 animMode, f32 morphFrames); EnKbt* EnKgy_FindZubora(PlayState* play); ObjIcePoly* EnKgy_FindIceBlock(PlayState* play); void func_80B40D30(PlayState* play); @@ -109,7 +109,7 @@ void EnKgy_Destroy(Actor* thisx, PlayState* play) { LightContext_RemoveLight(play, &play->lightCtx, this->lightNode); } -void EnKgy_ChangeAnim(EnKgy* this, s16 animIndex, u8 mode, f32 morphFrames) { +void EnKgy_ChangeAnim(EnKgy* this, s16 animIndex, u8 animMode, f32 morphFrames) { static AnimationHeader* sAnimations[] = { &object_kgy_Anim_004B98, &object_kgy_Anim_0008FC, &object_kgy_Anim_00292C, &object_kgy_Anim_0042E4, &object_kgy_Anim_0101F0, &object_kgy_Anim_001764, &object_kgy_Anim_003334, &object_kgy_Anim_010B84, @@ -117,7 +117,7 @@ void EnKgy_ChangeAnim(EnKgy* this, s16 animIndex, u8 mode, f32 morphFrames) { }; Animation_Change(&this->skelAnime, sAnimations[animIndex], 1.0f, 0.0f, - Animation_GetLastFrame(sAnimations[animIndex]), mode, morphFrames); + Animation_GetLastFrame(sAnimations[animIndex]), animMode, morphFrames); this->unk_2D2 = animIndex; } diff --git a/src/overlays/actors/ovl_En_Mnk/z_en_mnk.c b/src/overlays/actors/ovl_En_Mnk/z_en_mnk.c index 04b5b73b8..8113526f2 100644 --- a/src/overlays/actors/ovl_En_Mnk/z_en_mnk.c +++ b/src/overlays/actors/ovl_En_Mnk/z_en_mnk.c @@ -147,11 +147,11 @@ TexturePtr sMonkeyFaceTextures[] = { object_mnk_Tex_017120, object_mnk_Tex_017920, object_mnk_Tex_018120, }; -void EnMnk_MonkeyTiedUp_ChangeAnim(EnMnk* this, s32 animIndex, u8 mode, f32 morphFrames) { +void EnMnk_MonkeyTiedUp_ChangeAnim(EnMnk* this, s32 animIndex, u8 animMode, f32 morphFrames) { Animation_Change(&this->skelAnime, sMonkeyTiedUpAnimations[animIndex], 1.0f, 0.0f, - Animation_GetLastFrame(&sMonkeyTiedUpAnimations[animIndex]->common), mode, morphFrames); + Animation_GetLastFrame(&sMonkeyTiedUpAnimations[animIndex]->common), animMode, morphFrames); Animation_Change(&this->propSkelAnime, sMonkeyTiedUpPoleAnimations[animIndex], 1.0f, 0.0f, - Animation_GetLastFrame(&sMonkeyTiedUpPoleAnimations[animIndex]->common), mode, morphFrames); + Animation_GetLastFrame(&sMonkeyTiedUpPoleAnimations[animIndex]->common), animMode, morphFrames); switch (animIndex) { case MONKEY_TIEDUP_ANIM_KICKAROUND: @@ -184,11 +184,11 @@ void EnMnk_MonkeyTiedUp_SetNewAnim(EnMnk* this, s32 animIndex) { } } -void EnMnk_MonkeyHanging_ChangeAnim(EnMnk* this, s32 animIndex, u8 mode, f32 morphFrames) { +void EnMnk_MonkeyHanging_ChangeAnim(EnMnk* this, s32 animIndex, u8 animMode, f32 morphFrames) { Animation_Change(&this->skelAnime, sMonkeyHangingAnimations[animIndex], 1.0f, 0.0f, - Animation_GetLastFrame(&sMonkeyHangingAnimations[animIndex]->common), mode, morphFrames); + Animation_GetLastFrame(&sMonkeyHangingAnimations[animIndex]->common), animMode, morphFrames); Animation_Change(&this->propSkelAnime, sMonkeyHangingRopeAnimations[animIndex], 1.0f, 0.0f, - Animation_GetLastFrame(&sMonkeyHangingRopeAnimations[animIndex]->common), mode, morphFrames); + Animation_GetLastFrame(&sMonkeyHangingRopeAnimations[animIndex]->common), animMode, morphFrames); this->animIndex = animIndex; } @@ -196,7 +196,7 @@ void EnMnk_MonkeyHanging_SetAnim(EnMnk* this, s32 animIndex) { EnMnk_MonkeyHanging_ChangeAnim(this, animIndex, ANIMMODE_LOOP, -5.0f); } -void EnMnk_Monkey_ChangeAnim(EnMnk* this, s32 animIndex, u8 mode, f32 morphFrames) { +void EnMnk_Monkey_ChangeAnim(EnMnk* this, s32 animIndex, u8 animMode, f32 morphFrames) { s32 pad; if (animIndex == 100) { @@ -204,10 +204,10 @@ void EnMnk_Monkey_ChangeAnim(EnMnk* this, s32 animIndex, u8 mode, f32 morphFrame } if ((animIndex == 4) || (animIndex == 6)) { Animation_Change(&this->skelAnime, sMonkeyAnimations[animIndex], -1.0f, - Animation_GetLastFrame(&sMonkeyAnimations[animIndex]->common), 0.0f, mode, morphFrames); + Animation_GetLastFrame(&sMonkeyAnimations[animIndex]->common), 0.0f, animMode, morphFrames); } else { Animation_Change(&this->skelAnime, sMonkeyAnimations[animIndex], 1.0f, 0.0f, - Animation_GetLastFrame(&sMonkeyAnimations[animIndex]->common), mode, morphFrames); + Animation_GetLastFrame(&sMonkeyAnimations[animIndex]->common), animMode, morphFrames); } this->unk_3E0 = 0; this->animIndex = animIndex; diff --git a/src/overlays/actors/ovl_En_Railgibud/z_en_railgibud.c b/src/overlays/actors/ovl_En_Railgibud/z_en_railgibud.c index ad20b3d07..9aa218e2f 100644 --- a/src/overlays/actors/ovl_En_Railgibud/z_en_railgibud.c +++ b/src/overlays/actors/ovl_En_Railgibud/z_en_railgibud.c @@ -1182,37 +1182,40 @@ s32 EnRailgibud_PerformCutsceneActions(EnRailgibud* this, PlayState* play) { this->cueId = play->csCtx.actorCues[cueChannel]->id; switch (play->csCtx.actorCues[cueChannel]->id) { case 1: - this->cutsceneAnimIndex = EN_RAILGIBUD_ANIM_IDLE; + this->csAnimIndex = EN_RAILGIBUD_ANIM_IDLE; Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, EN_RAILGIBUD_ANIM_IDLE); break; case 2: - this->cutsceneAnimIndex = EN_RAILGIBUD_ANIM_SLUMP_START; + this->csAnimIndex = EN_RAILGIBUD_ANIM_SLUMP_START; Actor_PlaySfx(&this->actor, NA_SE_EN_REDEAD_WEAKENED2); Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, EN_RAILGIBUD_ANIM_SLUMP_START); break; case 3: - this->cutsceneAnimIndex = EN_RAILGIBUD_ANIM_CONVULSION; + this->csAnimIndex = EN_RAILGIBUD_ANIM_CONVULSION; Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, EN_RAILGIBUD_ANIM_CONVULSION); break; case 4: - this->cutsceneAnimIndex = EN_RAILGIBUD_ANIM_ARMS_UP_START; + this->csAnimIndex = EN_RAILGIBUD_ANIM_ARMS_UP_START; Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, EN_RAILGIBUD_ANIM_ARMS_UP_START); break; case 5: - this->cutsceneAnimIndex = EN_RAILGIBUD_ANIM_WALK; + this->csAnimIndex = EN_RAILGIBUD_ANIM_WALK; Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, EN_RAILGIBUD_ANIM_WALK); break; + + default: + break; } } else if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) { - if (this->cutsceneAnimIndex == EN_RAILGIBUD_ANIM_SLUMP_START) { - this->cutsceneAnimIndex = EN_RAILGIBUD_ANIM_SLUMP_LOOP; + if (this->csAnimIndex == EN_RAILGIBUD_ANIM_SLUMP_START) { + this->csAnimIndex = EN_RAILGIBUD_ANIM_SLUMP_LOOP; Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, EN_RAILGIBUD_ANIM_SLUMP_LOOP); - } else if (this->cutsceneAnimIndex == EN_RAILGIBUD_ANIM_ARMS_UP_START) { - this->cutsceneAnimIndex = EN_RAILGIBUD_ANIM_ARMS_UP_LOOP; + } else if (this->csAnimIndex == EN_RAILGIBUD_ANIM_ARMS_UP_START) { + this->csAnimIndex = EN_RAILGIBUD_ANIM_ARMS_UP_LOOP; Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, EN_RAILGIBUD_ANIM_ARMS_UP_LOOP); EnRailgibud_SetupSinkIntoGround(this); } diff --git a/src/overlays/actors/ovl_En_Railgibud/z_en_railgibud.h b/src/overlays/actors/ovl_En_Railgibud/z_en_railgibud.h index 42b41ed8a..c9536d235 100644 --- a/src/overlays/actors/ovl_En_Railgibud/z_en_railgibud.h +++ b/src/overlays/actors/ovl_En_Railgibud/z_en_railgibud.h @@ -52,7 +52,7 @@ typedef struct EnRailgibud { /* 0x3EE */ s16 shouldWalkForwardNextFrame; // Only used by the "main" Gibdo /* 0x3F0 */ union { s16 grabState; - s16 cutsceneAnimIndex; + s16 csAnimIndex; }; /* 0x3F2 */ union { s16 playerStunWaitTimer; // Cannot stun the player if this is non-zero diff --git a/tools/disasm/functions.txt b/tools/disasm/functions.txt index c8330232d..d54b83753 100644 --- a/tools/disasm/functions.txt +++ b/tools/disasm/functions.txt @@ -7580,8 +7580,8 @@ 0x80949BD4:("EnClearTag_DrawEffects",), 0x8094DEE0:("func_8094DEE0",), 0x8094DF90:("func_8094DF90",), - 0x8094DFF8:("func_8094DFF8",), - 0x8094E054:("func_8094E054",), + 0x8094DFF8:("EnGm_UpdateSkelAnime",), + 0x8094E054:("EnGm_ChangeAnim",), 0x8094E0F8:("func_8094E0F8",), 0x8094E1DC:("func_8094E1DC",), 0x8094E278:("func_8094E278",), @@ -9696,7 +9696,7 @@ 0x80A12774:("EnGo_UpdateTalking",), 0x80A12868:("EnGo_DetectCollisions",), 0x80A12954:("EnGo_UpdateSpringArrivalCutscene",), - 0x80A12A64:("EnGo_UpdateAnimationToCurrent",), + 0x80A12A64:("EnGo_UpdateSkelAnime",), 0x80A12B78:("EnGo_UpdateSfx",), 0x80A12C48:("EnGo_ChangeAnim",), 0x80A12D6C:("EnGo_UpdateEyes",), @@ -15302,8 +15302,8 @@ 0x80BB1C8C:("func_80BB1C8C",), 0x80BB1D04:("func_80BB1D04",), 0x80BB1D64:("func_80BB1D64",), - 0x80BB1FCC:("func_80BB1FCC",), - 0x80BB2020:("func_80BB2020",), + 0x80BB1FCC:("EnGeg_UpdateSkelAnime",), + 0x80BB2020:("EnGeg_ChangeAnim",), 0x80BB2088:("func_80BB2088",), 0x80BB217C:("func_80BB217C",), 0x80BB221C:("func_80BB221C",), diff --git a/tools/disasm/variables.txt b/tools/disasm/variables.txt index 4b224cf3f..90edb9bf5 100644 --- a/tools/disasm/variables.txt +++ b/tools/disasm/variables.txt @@ -14139,7 +14139,7 @@ 0x80B3A9E4:("D_80B3A9E4","f32","",0x4), 0x80B3A9E8:("D_80B3A9E8","f32","",0x4), 0x80B3BEE0:("En_Gg2_InitVars","UNK_TYPE1","",0x1), - 0x80B3BF00:("D_80B3BF00","UNK_TYPE4","",0x4), + 0x80B3BF00:("sAnimationInfo","UNK_TYPE4","",0x4), 0x80B3C080:("D_80B3C080","UNK_TYPE4","",0x4), 0x80B3C084:("D_80B3C084","UNK_TYPE4","",0x4), 0x80B3C088:("D_80B3C088","UNK_TYPE1","",0x1), From d4c41f02633ca059d93122fe750d77062984b099 Mon Sep 17 00:00:00 2001 From: Derek Hensley Date: Tue, 26 Sep 2023 21:24:52 -0700 Subject: [PATCH 02/16] z_message_nes (1 NON_MATCHING) (#1394) * Bring over progress * Some docs * scratch urls + format * Fixes * Match Message_DrawTextNES * String macros * color structs --- include/functions.h | 21 +- include/macros.h | 1 + include/variables.h | 10 +- include/z64save.h | 17 +- spec | 1 - src/code/z_message.c | 8 +- src/code/z_message_nes.c | 1728 ++++++++++++++++++++++++++++++-- tools/disasm/functions.txt | 10 +- tools/disasm/variables.txt | 13 +- tools/sizes/code_functions.csv | 6 +- 10 files changed, 1707 insertions(+), 108 deletions(-) diff --git a/include/functions.h b/include/functions.h index c24ab583d..88d8468e9 100644 --- a/include/functions.h +++ b/include/functions.h @@ -1009,14 +1009,14 @@ void func_80148B98(PlayState* play, u8 arg1); void Message_DrawTextChar(PlayState* play, TexturePtr texture, Gfx** gfxP); void func_80149C18(PlayState* play); // void Message_FindMessage(void); -void func_80149F74(PlayState* play, u32** ppuParm2); +void Message_DrawItemIcon(PlayState* play, Gfx** gfxP); void Message_HandleOcarina(PlayState* play); void func_8014ADBC(PlayState* play, UNK_PTR puParm2); void Message_LoadItemIcon(PlayState* play, u16 itemId, s16 arg2); -void Message_LoadChar(PlayState* play, u16 codePointIndex, s32* offset, f32* arg3, s16 decodedBufPos); +void Message_SetupLoadItemIcon(PlayState* play); // void func_8014CCB4(void); // void func_8014CDF0(void); -// void func_8014CFDC(void); +// void Message_SetupLoadItemIcon(void); void func_8014D304(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5); // void func_8014D62C(void); // void func_8014D7B4(void); @@ -1046,19 +1046,12 @@ void Message_Update(PlayState* play); void func_801586A4(PlayState* play); void Message_Init(PlayState* play); void Message_FindMessageNES(PlayState* play, u16 textId); -// void Message_LoadCharNES(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE2 param_5); -// void Message_LoadPluralRupeesNES(void); -// void Message_LoadLocalizedRupeesNES(void); -// void Message_LoadRupeesNES(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE2 param_5); -// void Message_LoadTimeNES(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5); -// void Message_LoadOwlWarpTextNES(void); -// void func_80159438(void); -void func_8015966C(PlayState* play, UNK_PTR puParm2, UNK_TYPE arg3); -// void func_8015A144(void); -void func_8015B198(PlayState* play); +void Message_DrawTextNES(PlayState* play, Gfx** gfxP, u16 textDrawPos); +void Message_DecodeNES(PlayState* play); +void Message_FindCreditsMessage(PlayState* play, u16 textId); void Message_FindCreditsMessage(PlayState* play, u16 textId); void Message_DrawTextCredits(PlayState* play, Gfx** gfxP); -// void func_8015F8A8(UNK_TYPE4 ctxt); +void Message_DecodeCredits(PlayState* play); uintptr_t KaleidoManager_FaultAddrConv(uintptr_t address, void* param); void KaleidoManager_LoadOvl(KaleidoMgrOverlay* ovl); diff --git a/include/macros.h b/include/macros.h index 46932a0a6..bc7439394 100644 --- a/include/macros.h +++ b/include/macros.h @@ -38,6 +38,7 @@ #define DAY_LENGTH (CLOCK_TIME(24, 0)) #define TIME_TO_HOURS_F(time) ((time) * (24.0f / 0x10000)) +#define TIME_TO_HOURS_F_ALT(time) (TIME_TO_MINUTES_F(time) / 60.0f) #define TIME_TO_MINUTES_F(time) ((time) * ((24.0f * 60.0f) / 0x10000)) // 0.021972656f #define TIME_TO_MINUTES_ALT_F(time) ((time) / (0x10000 / (24.0f * 60.0f))) #define TIME_TO_SECONDS_F(time) ((time) * ((24.0f * 60.0f * 60.0f) / 0x10000)) diff --git a/include/variables.h b/include/variables.h index e071b2036..83427f55f 100644 --- a/include/variables.h +++ b/include/variables.h @@ -334,9 +334,9 @@ extern char D_801D039C[]; // extern UNK_TYPE1 D_801D045A; // extern UNK_TYPE1 D_801D0462; //extern UNK_TYPE1 D_801D0468; -// extern UNK_TYPE1 D_801D0470; -// extern char D_801D06F0[]; -// extern UNK_TYPE1 D_801D0710; +// extern UNK_TYPE1 sNESFontWidths; +// extern char sRupeesTextLocalization[]; +// extern UNK_TYPE1 sRupeesTextLength; // extern char D_801D0714[]; // extern UNK_TYPE1 D_801D07C4; // extern UNK_TYPE1 D_801D07DC; @@ -348,8 +348,8 @@ extern char D_801D039C[]; // extern UNK_TYPE1 D_801D08CC; // extern UNK_TYPE1 D_801D08D8; // extern UNK_TYPE1 D_801D08E4; -// extern UNK_TYPE1 D_801D08E8; -// extern UNK_TYPE1 D_801D0900; +// extern UNK_TYPE1 sMaskCodeTextENG; +// extern UNK_TYPE1 sMaskCodeTextLengthENG; extern KaleidoMgrOverlay gKaleidoMgrOverlayTable[2]; // extern UNK_TYPE1 D_801D0B8C; extern KaleidoMgrOverlay* gKaleidoMgrCurOvl; diff --git a/include/z64save.h b/include/z64save.h index c8075d9ec..1db5a566d 100644 --- a/include/z64save.h +++ b/include/z64save.h @@ -154,12 +154,22 @@ typedef enum { /* 52 */ HUD_VISIBILITY_NONE_INSTANT = 52 } HudVisibility; +// Based on sRupeesTextLocalization +typedef enum Language { + /* 0 */ LANGUAGE_JPN, + /* 1 */ LANGUAGE_ENG, + /* 2 */ LANGUAGE_GER, + /* 3 */ LANGUAGE_FRE, + /* 4 */ LANGUAGE_SPA, + /* 5 */ LANGUAGE_MAX +} Language; + typedef enum HighScore { /* 0 */ HS_BANK_RUPEES, /* 1 */ HS_UNK_1, /* 2 */ HS_FISHING, // Fishing flags /* 3 */ HS_BOAT_ARCHERY, - /* 4 */ HS_HOSRE_BACK_BALLOON, + /* 4 */ HS_HORSE_BACK_BALLOON, /* 5 */ HS_LOTTERY_GUESS, // Lottery code chosen by player (only uses lower three hex digits) /* 6 */ HS_SHOOTING_GALLERY, // High scores for both shooting galleries. Town uses lower 16 bits, Swamp uses higher 16 bits. /* 7 */ HS_MAX @@ -520,6 +530,7 @@ typedef enum { (gSaveContext.save.saveInfo.stolenItems = (gSaveContext.save.saveInfo.stolenItems & ~0x00FF0000) | ((itemId & 0xFF) << 0x10)) #define HIGH_SCORE(type) (gSaveContext.save.saveInfo.highScores[(type)]) +#define GET_HIGH_SCORE(type) ((void)0, gSaveContext.save.saveInfo.highScores[(type)]) #define HS_GET_BANK_RUPEES() (HIGH_SCORE(HS_BANK_RUPEES) & 0xFFFF) #define HS_SET_BANK_RUPEES(rupees) (HIGH_SCORE(HS_BANK_RUPEES) = ((HIGH_SCORE(HS_BANK_RUPEES) & 0xFFFF0000) | (rupees))) @@ -529,8 +540,8 @@ typedef enum { #define HS_GET_BOAT_ARCHERY_HIGH_SCORE() ((HIGH_SCORE(HS_BOAT_ARCHERY) & 0xFFFF0000) >> 0x10) #define HS_SET_BOAT_ARCHERY_HIGH_SCORE(score) (HIGH_SCORE(HS_BOAT_ARCHERY) = ((HIGH_SCORE(HS_BOAT_ARCHERY) & 0xFFFF) | ((u16)(score) << 0x10))) -#define HS_GET_HORSE_BACK_BALLOON_TIME() ((s32)HIGH_SCORE(HS_HOSRE_BACK_BALLOON)) -#define HS_SET_HORSE_BACK_BALLOON_TIME(time) (HIGH_SCORE(HS_HOSRE_BACK_BALLOON) = (time)) +#define HS_GET_HORSE_BACK_BALLOON_TIME() ((s32)HIGH_SCORE(HS_HORSE_BACK_BALLOON)) +#define HS_SET_HORSE_BACK_BALLOON_TIME(time) (HIGH_SCORE(HS_HORSE_BACK_BALLOON) = (time)) #define HS_GET_LOTTERY_CODE_GUESS() (HIGH_SCORE(HS_LOTTERY_GUESS) & 0xFFFF) #define HS_SET_LOTTERY_CODE_GUESS(guess) (HIGH_SCORE(HS_LOTTERY_GUESS) = ((HIGH_SCORE(HS_LOTTERY_GUESS) & 0xFFFF0000) | ((guess) & 0xFFFF))) diff --git a/spec b/spec index ae8d89485..2e2878c69 100644 --- a/spec +++ b/spec @@ -531,7 +531,6 @@ beginseg include "build/data/code/z_message.data.o" include "build/data/code/z_message.bss.o" include "build/src/code/z_message_nes.o" - include "build/data/code/z_message_nes.data.o" include "build/src/code/z_message_staff.o" include "build/src/code/z_player_call.o" include "build/src/code/z_shrink_window.o" diff --git a/src/code/z_message.c b/src/code/z_message.c index 37e392aec..a922f237b 100644 --- a/src/code/z_message.c +++ b/src/code/z_message.c @@ -223,7 +223,7 @@ void Message_FindMessage(PlayState* play, u16 textId) { font->messageEnd = nextSegment - foundSegment; } -#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/func_80149F74.s") +#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/Message_DrawItemIcon.s") #pragma GLOBAL_ASM("asm/non_matchings/code/z_message/Message_HandleOcarina.s") @@ -272,7 +272,7 @@ void func_8014CCB4(PlayState* play, s16* decodedBufPos, s32* offset, f32* arg3) #pragma GLOBAL_ASM("asm/non_matchings/code/z_message/func_8014CDF0.s") -#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/func_8014CFDC.s") +#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/Message_SetupLoadItemIcon.s") #pragma GLOBAL_ASM("asm/non_matchings/code/z_message/func_8014D304.s") @@ -363,7 +363,7 @@ void func_80151A68(PlayState* play, u16 textId) { msgCtx->msgLength = 0; func_80150D08(play, textId); func_80150A84(play); - func_8015B198(play); + Message_DecodeNES(play); msgCtx->msgMode = 0x45; msgCtx->textDelayTimer = 0; msgCtx->textboxColorAlphaCurrent = msgCtx->textboxColorAlphaTarget = msgCtx->textColorAlpha = 0; @@ -548,7 +548,7 @@ void func_80153E7C(PlayState* play, Gfx** gfxP) { } else if (play->msgCtx.textIsCredits) { Message_DrawTextCredits(play, gfxP); } else { - func_8015966C(play, gfxP, 0); + Message_DrawTextNES(play, gfxP, 0); } } diff --git a/src/code/z_message_nes.c b/src/code/z_message_nes.c index 1dcb16474..6ace9acc1 100644 --- a/src/code/z_message_nes.c +++ b/src/code/z_message_nes.c @@ -2,59 +2,20 @@ #include "message_data_static.h" #include "overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope.h" -#if 0 - -//fontWidth -extern f32 D_801D0470[159]; - -//rupeesTextLocalization -u8 D_801D06F0[4][8] = { { "rupee(s)" }, //EN - { "rubin(e)" }, //DE - { "rubis" }, //FR - { "rupia(s)" } //SPA - }; - -// rupeesTextLength -u8 D_801D0710[4] = {8,8,5,8}; - -// sOwlWarpText -char D_801D0714[OWL_WARP_MAX][16] = { - "Great Bay Coast", // OWL_WARP_GREAT_BAY_COAST - "Zora Cape", // OWL_WARP_ZORA_CAPE - "Snowhead", // OWL_WARP_SNOWHEAD - "Mountain Village", // OWL_WARP_MOUNTAIN_VILLAGE - "Clock Town", // OWL_WARP_CLOCK_TOWN - "Milk Road", // OWL_WARP_MILK_ROAD - "Woodfall", // OWL_WARP_WOODFALL - "Southern Swamp", // OWL_WARP_SOUTHERN_SWAMP - "Ikana Canyon", // OWL_WARP_IKANA_CANYON - "Stone Tower", // OWL_WARP_STONE_TOWER - "Entrance", // OWL_WARP_ENTRANCE +// fontWidth +f32 sNESFontWidths[160] = { + 8.0f, 8.0f, 6.0f, 9.0f, 9.0f, 14.0f, 12.0f, 3.0f, 7.0f, 7.0f, 7.0f, 9.0f, 4.0f, 6.0f, 4.0f, 9.0f, + 10.0f, 5.0f, 9.0f, 9.0f, 10.0f, 9.0f, 9.0f, 9.0f, 9.0f, 9.0f, 6.0f, 6.0f, 9.0f, 11.0f, 9.0f, 11.0f, + 13.0f, 12.0f, 9.0f, 11.0f, 11.0f, 8.0f, 8.0f, 12.0f, 10.0f, 4.0f, 8.0f, 10.0f, 8.0f, 13.0f, 11.0f, 13.0f, + 9.0f, 13.0f, 10.0f, 10.0f, 9.0f, 10.0f, 11.0f, 15.0f, 11.0f, 10.0f, 10.0f, 7.0f, 10.0f, 7.0f, 10.0f, 9.0f, + 5.0f, 8.0f, 9.0f, 8.0f, 9.0f, 9.0f, 6.0f, 9.0f, 8.0f, 4.0f, 6.0f, 8.0f, 4.0f, 12.0f, 9.0f, 9.0f, + 9.0f, 9.0f, 7.0f, 8.0f, 7.0f, 8.0f, 9.0f, 12.0f, 8.0f, 9.0f, 8.0f, 7.0f, 5.0f, 7.0f, 10.0f, 6.0f, + 12.0f, 12.0f, 12.0f, 12.0f, 11.0f, 8.0f, 8.0f, 8.0f, 8.0f, 6.0f, 6.0f, 6.0f, 6.0f, 10.0f, 13.0f, 13.0f, + 13.0f, 13.0f, 10.0f, 10.0f, 10.0f, 10.0f, 9.0f, 8.0f, 8.0f, 8.0f, 8.0f, 8.0f, 9.0f, 9.0f, 9.0f, 9.0f, + 4.0f, 4.0f, 4.0f, 4.0f, 8.0f, 9.0f, 9.0f, 9.0f, 9.0f, 8.0f, 8.0f, 8.0f, 8.0f, 8.0f, 11.0f, 6.0f, + 14.0f, 14.0f, 14.0f, 14.0f, 14.0f, 14.0f, 14.0f, 14.0f, 14.0f, 14.0f, 14.0f, 14.0f, 14.0f, 14.0f, 14.0f, 14.0f, }; -// sOwlWarpTextLength -s16 D_801D07C4[OWL_WARP_MAX] = { - 15, // OWL_WARP_GREAT_BAY_COAST - 9, // OWL_WARP_ZORA_CAPE - 8, // OWL_WARP_SNOWHEAD - 16, // OWL_WARP_MOUNTAIN_VILLAGE - 10, // OWL_WARP_CLOCK_TOWN - 9, // OWL_WARP_MILK_ROAD - 8, // OWL_WARP_WOODFALL - 14, // OWL_WARP_SOUTHERN_SWAMP - 12, // OWL_WARP_IKANA_CANYON - 11, // OWL_WARP_STONE_TOWER - 8, // OWL_WARP_ENTRANCE -}; - -#endif - -extern f32 D_801D0470[159]; -extern u8 D_801D06F0[4][8]; -extern u8 D_801D0710[4]; -extern u8 D_801D0714[OWL_WARP_MAX][16]; -extern s16 D_801D07C4[OWL_WARP_MAX]; - void Message_FindMessageNES(PlayState* play, u16 textId) { MessageContext* msgCtx = &play->msgCtx; Font* font = &msgCtx->font; @@ -102,7 +63,7 @@ void Message_LoadPluralRupeesNES(PlayState* play, s16* decodedBufPos, s32* offse s32 o = *offset; f32 f = *arg3; - msgCtx->decodedBuffer.schar[p] = 0x20; + msgCtx->decodedBuffer.schar[p] = ' '; p++; Font_LoadCharNES(play, 'R', o); o += FONT_CHAR_TEX_SIZE; @@ -134,6 +95,25 @@ void Message_LoadPluralRupeesNES(PlayState* play, s16* decodedBufPos, s32* offse *arg3 = f; } +#define RUPEES_STR_EN "Rupee(s)" +#define RUPEES_STR_DE "Rubin(e)" +#define RUPEES_STR_FR "Rubis" +#define RUPEES_STR_SPA "Rupia(s)" + +char sRupeesTextLocalization[LANGUAGE_MAX - 1][8] = { + RUPEES_STR_EN, // EN + RUPEES_STR_DE, // DE + RUPEES_STR_FR, // FR + RUPEES_STR_SPA, // SPA +}; + +u8 sRupeesTextLength[LANGUAGE_MAX - 1] = { + sizeof(RUPEES_STR_EN) - 1, + sizeof(RUPEES_STR_DE) - 1, + sizeof(RUPEES_STR_FR) - 1, + sizeof(RUPEES_STR_SPA) - 1, +}; + void Message_LoadLocalizedRupeesNES(PlayState* play, s16* decodedBufPos, s32* offset, f32* arg3) { MessageContext* msgCtx = &play->msgCtx; s16 p = *decodedBufPos; @@ -144,15 +124,15 @@ void Message_LoadLocalizedRupeesNES(PlayState* play, s16* decodedBufPos, s32* of msgCtx->decodedBuffer.schar[p] = ' '; p++; - for (j = 0; j < D_801D0710[gSaveContext.options.language - 1]; j++) { - Font_LoadCharNES(play, D_801D06F0[gSaveContext.options.language - 1][j], o); - msgCtx->decodedBuffer.schar[p] = D_801D06F0[gSaveContext.options.language - 1][j]; + for (j = 0; j < sRupeesTextLength[gSaveContext.options.language - 1]; j++) { + Font_LoadCharNES(play, sRupeesTextLocalization[gSaveContext.options.language - 1][j], o); + msgCtx->decodedBuffer.schar[p] = sRupeesTextLocalization[gSaveContext.options.language - 1][j]; o += FONT_CHAR_TEX_SIZE; p++; } p--; - f += 16.0f * msgCtx->textCharScale * (D_801D0710[gSaveContext.options.language - 1] + 1); + f += 16.0f * msgCtx->textCharScale * (sRupeesTextLength[gSaveContext.options.language - 1] + 1); *decodedBufPos = p; *offset = o; *arg3 = f; @@ -201,7 +181,7 @@ void Message_LoadRupeesNES(PlayState* play, s16* decodedBufPos, s32* offset, f32 *arg3 = f; } -void Message_LoadTimeNES(PlayState* play, u8 arg1, s32* offset, f32* arg3, s16* decodedBufPos) { +void Message_LoadTimeNES(PlayState* play, u8 curChar, s32* offset, f32* arg3, s16* decodedBufPos) { MessageContext* msgCtx = &play->msgCtx; s16 p = *decodedBufPos; s32 o = *offset; @@ -211,12 +191,11 @@ void Message_LoadTimeNES(PlayState* play, u8 arg1, s32* offset, f32* arg3, s16* f32 timeLeftInMinutes; s16 i; - if (arg1 == 0xCF) { + if (curChar == 0xCF) { timeLeft = TIME_UNTIL_MOON_CRASH; } else { timeLeft = TIME_UNTIL_NEW_DAY; } - timeLeftInMinutes = TIME_TO_MINUTES_F(timeLeft); digits[0] = 0; @@ -252,6 +231,46 @@ void Message_LoadTimeNES(PlayState* play, u8 arg1, s32* offset, f32* arg3, s16* *arg3 = f; } +#define GREAT_BAY_COAST_STR "Great Bay Coast" +#define ZORA_CAPE_STR "Zora Cape" +#define SNOWHEAD_STR "Snowhead" +#define MOUNTAIN_VILLAGE_STR "Mountain Village" +#define CLOCK_TOWN_STR "Clock Town" +#define MILK_ROAD_STR "Milk Road" +#define WOODFALL_STR "Woodfall" +#define SOUTHERN_SWAMP_STR "Southern Swamp" +#define IKANA_CANYON_STR "Ikana Canyon" +#define STONE_TOWER_STR "Stone Tower" +#define ENTRANCE_STR "Entrance" + +char sOwlWarpTextENG[OWL_WARP_MAX][16] = { + GREAT_BAY_COAST_STR, // OWL_WARP_GREAT_BAY_COAST + ZORA_CAPE_STR, // OWL_WARP_ZORA_CAPE + SNOWHEAD_STR, // OWL_WARP_SNOWHEAD + MOUNTAIN_VILLAGE_STR, // OWL_WARP_MOUNTAIN_VILLAGE + CLOCK_TOWN_STR, // OWL_WARP_CLOCK_TOWN + MILK_ROAD_STR, // OWL_WARP_MILK_ROAD + WOODFALL_STR, // OWL_WARP_WOODFALL + SOUTHERN_SWAMP_STR, // OWL_WARP_SOUTHERN_SWAMP + IKANA_CANYON_STR, // OWL_WARP_IKANA_CANYON + STONE_TOWER_STR, // OWL_WARP_STONE_TOWER + ENTRANCE_STR, // OWL_WARP_ENTRANCE +}; + +s16 sOwlWarpTextLengthENG[OWL_WARP_MAX] = { + sizeof(GREAT_BAY_COAST_STR) - 1, // OWL_WARP_GREAT_BAY_COAST + sizeof(ZORA_CAPE_STR) - 1, // OWL_WARP_ZORA_CAPE + sizeof(SNOWHEAD_STR) - 1, // OWL_WARP_SNOWHEAD + sizeof(MOUNTAIN_VILLAGE_STR) - 1, // OWL_WARP_MOUNTAIN_VILLAGE + sizeof(CLOCK_TOWN_STR) - 1, // OWL_WARP_CLOCK_TOWN + sizeof(MILK_ROAD_STR) - 1, // OWL_WARP_MILK_ROAD + sizeof(WOODFALL_STR) - 1, // OWL_WARP_WOODFALL + sizeof(SOUTHERN_SWAMP_STR) - 1, // OWL_WARP_SOUTHERN_SWAMP + sizeof(IKANA_CANYON_STR) - 1, // OWL_WARP_IKANA_CANYON + sizeof(STONE_TOWER_STR) - 1, // OWL_WARP_STONE_TOWER + sizeof(ENTRANCE_STR) - 1, // OWL_WARP_ENTRANCE +}; + void Message_LoadOwlWarpTextNES(PlayState* play, s32* offset, f32* arg2, s16* decodedBufPos) { MessageContext* msgCtx = &play->msgCtx; s16 p = *decodedBufPos; @@ -267,18 +286,18 @@ void Message_LoadOwlWarpTextNES(PlayState* play, s32* offset, f32* arg2, s16* de } else { owlWarpId = play->pauseCtx.cursorPoint[PAUSE_WORLD_MAP]; } - stringLimit = D_801D07C4[owlWarpId]; + stringLimit = sOwlWarpTextLengthENG[owlWarpId]; for (i = 0; i < stringLimit; i++) { - msgCtx->decodedBuffer.schar[p] = D_801D0714[owlWarpId][i]; + msgCtx->decodedBuffer.schar[p] = sOwlWarpTextENG[owlWarpId][i]; currentChar = msgCtx->decodedBuffer.schar[p]; if (currentChar != ' ') { - Font_LoadCharNES(play, D_801D0714[owlWarpId][i], o); + Font_LoadCharNES(play, sOwlWarpTextENG[owlWarpId][i], o); o += FONT_CHAR_TEX_SIZE; } currentChar = msgCtx->decodedBuffer.schar[p]; p++; - f += (D_801D0470[currentChar - ' '] * msgCtx->textCharScale); + f += (sNESFontWidths[currentChar - ' '] * msgCtx->textCharScale); } p--; @@ -288,8 +307,1585 @@ void Message_LoadOwlWarpTextNES(PlayState* play, s32* offset, f32* arg2, s16* de *arg2 = f; } -#pragma GLOBAL_ASM("asm/non_matchings/code/z_message_nes/func_80159438.s") +void Message_GetTimerDigitsNES(OSTime time, s16* digits) { + OSTime t = time; -#pragma GLOBAL_ASM("asm/non_matchings/code/z_message_nes/func_8015966C.s") + // 6 minutes + digits[0] = t / SECONDS_TO_TIMER(360); + t -= (digits[0] * SECONDS_TO_TIMER(360)); -#pragma GLOBAL_ASM("asm/non_matchings/code/z_message_nes/func_8015B198.s") + // minutes + digits[1] = t / SECONDS_TO_TIMER(60); + t -= (digits[1] * SECONDS_TO_TIMER(60)); + + digits[2] = '\''; + + // 10 seconds + digits[3] = t / SECONDS_TO_TIMER(10); + t -= digits[3] * SECONDS_TO_TIMER(10); + + // seconds + digits[4] = t / SECONDS_TO_TIMER(1); + t -= digits[4] * SECONDS_TO_TIMER(1); + + digits[5] = '"'; + + // 100 milliseconds + digits[6] = t / SECONDS_TO_TIMER_PRECISE(0, 10); + t -= digits[6] * SECONDS_TO_TIMER_PRECISE(0, 10); + + // 10 milliseconds + digits[7] = t; + + digits[0] += '0'; + digits[1] += '0'; + digits[3] += '0'; + digits[4] += '0'; + digits[6] += '0'; + digits[7] += '0'; +} + +Color_RGB16 D_801D07DC[] = { + { 255, 120, 0 }, { 70, 255, 80 }, { 80, 110, 255 }, { 255, 255, 30 }, + { 90, 180, 255 }, { 210, 100, 255 }, { 170, 170, 170 }, { 255, 130, 30 }, +}; + +Color_RGB16 D_801D080C[] = { + { 255, 60, 60 }, { 70, 255, 80 }, { 80, 90, 255 }, { 255, 255, 50 }, + { 80, 150, 255 }, { 255, 150, 180 }, { 170, 170, 170 }, { 255, 130, 30 }, +}; + +Color_RGB16 D_801D083C[] = { + { 255, 60, 60 }, { 70, 255, 80 }, { 80, 90, 255 }, { 255, 255, 50 }, + { 80, 150, 255 }, { 255, 150, 180 }, { 180, 180, 200 }, { 255, 130, 30 }, +}; + +Color_RGB16 D_801D086C[] = { + { 195, 0, 0 }, { 70, 255, 80 }, { 80, 90, 255 }, { 255, 255, 50 }, + { 80, 150, 255 }, { 255, 150, 180 }, { 170, 170, 170 }, { 255, 130, 30 }, +}; + +Color_RGB16 D_801D089C[] = { + { 255, 60, 60 }, { 110, 170, 255 }, { 80, 90, 255 }, { 255, 255, 50 }, + { 80, 150, 255 }, { 255, 150, 180 }, { 170, 170, 170 }, { 255, 130, 30 }, +}; + +u8 D_801D08CC[] = { + 0x02, 0x01, 0x03, 0x06, 0x06, 0x06, 0x03, 0x03, 0x03, 0x03, 0x01, 0x06, +}; + +void Message_DrawTextNES(PlayState* play, Gfx** gfxP, u16 textDrawPos) { + MessageContext* msgCtx = &play->msgCtx; + u16 i; + u16 j; + Font* font = &msgCtx->font; + u16 charTexIndex; + u16 stateTimerHi; + Gfx* gfx = *gfxP; + u16 character; + s16 sp130; + s16 sp12E; + s16 sp12C; + s16 sp12A; + + msgCtx->textPosX = msgCtx->unk11F1A[0] + msgCtx->unk11FF8; + msgCtx->textPosY = msgCtx->unk11FFA; + + sp130 = 0; + if (!msgCtx->textIsCredits) { + msgCtx->textPosY = msgCtx->unk11FFA; + } else { + msgCtx->textPosY = 48; + } + + if (msgCtx->itemId != 0xFE) { + Message_DrawItemIcon(play, &gfx); + } + + msgCtx->textColorR = msgCtx->unk120C8; + msgCtx->textColorG = msgCtx->unk120CA; + msgCtx->textColorB = msgCtx->unk120CC; + + charTexIndex = 0; + + for (i = textDrawPos; i < msgCtx->textDrawPos; i++) { + character = msgCtx->decodedBuffer.schar[i]; + + switch (character) { + case 0x0: + if (play->pauseCtx.bombersNotebookOpen || (msgCtx->textBoxType == TEXTBOX_TYPE_D)) { + msgCtx->textColorR = msgCtx->textColorG = msgCtx->textColorB = 0; + } else if (msgCtx->textBoxType == TEXTBOX_TYPE_5) { + msgCtx->textColorR = msgCtx->textColorG = msgCtx->textColorB = 0; + } else { + msgCtx->textColorR = msgCtx->textColorG = msgCtx->textColorB = 255; + } + + if ((i + 1) == msgCtx->textDrawPos) { + msgCtx->textDrawPos++; + } + break; + + case 0x1: + case 0x2: + case 0x3: + case 0x4: + case 0x5: + case 0x6: + case 0x7: + case 0x8: + if ((msgCtx->msgMode >= MSGMODE_NEW_CYCLE_0) && (msgCtx->msgMode <= MSGMODE_OWL_SAVE_2) && + (character == 0x2)) { + msgCtx->textDrawPos = msgCtx->decodedTextLen; + if (msgCtx->unk120D6) { + msgCtx->unk120D4 += 25; + if (msgCtx->unk120D4 >= 100) { + msgCtx->unk120D6 = false; + } + } else { + msgCtx->unk120D4 -= 25; + if (msgCtx->unk120D4 <= -100) { + msgCtx->unk120D6 = true; + } + } + + if (D_801D07DC[(s16)(character - 1)].r + msgCtx->unk120D4 < 0) { + msgCtx->textColorR = 0; + } else { + msgCtx->textColorR = D_801D07DC[(s16)(character - 1)].r + msgCtx->unk120D4; + } + + if (D_801D07DC[(s16)(character - 1)].g + msgCtx->unk120D4 >= 255) { + msgCtx->textColorG = D_801D07DC[(s16)(character - 1)].g; + } else { + msgCtx->textColorG = D_801D07DC[(s16)(character - 1)].g + msgCtx->unk120D4; + } + + if (D_801D07DC[(s16)(character - 1)].b + msgCtx->unk120D4 < 0) { + msgCtx->textColorB = 0; + } else { + msgCtx->textColorB = D_801D07DC[(s16)(character - 1)].b + msgCtx->unk120D4; + } + + } else if (play->pauseCtx.bombersNotebookOpen) { + msgCtx->textColorR = D_801D089C[(s16)(character - 1)].r; + msgCtx->textColorG = D_801D089C[(s16)(character - 1)].g; + msgCtx->textColorB = D_801D089C[(s16)(character - 1)].b; + } else if (msgCtx->textBoxType == TEXTBOX_TYPE_1) { + msgCtx->textColorR = D_801D07DC[(s16)(character - 1)].r; + msgCtx->textColorG = D_801D07DC[(s16)(character - 1)].g; + msgCtx->textColorB = D_801D07DC[(s16)(character - 1)].b; + } else if (msgCtx->textBoxType == TEXTBOX_TYPE_D) { + msgCtx->textColorR = D_801D086C[(s16)(character - 1)].r; + msgCtx->textColorG = D_801D086C[(s16)(character - 1)].g; + msgCtx->textColorB = D_801D086C[(s16)(character - 1)].b; + } else { + msgCtx->textColorR = D_801D080C[(s16)(character - 1)].r; + msgCtx->textColorG = D_801D080C[(s16)(character - 1)].g; + msgCtx->textColorB = D_801D080C[(s16)(character - 1)].b; + } + + if ((i + 1) == msgCtx->textDrawPos) { + msgCtx->textDrawPos++; + } + break; + + case 0x20: // ` ` + msgCtx->textPosX += 6; + break; + + case 0x11: + msgCtx->textPosY += msgCtx->unk11FFC; + // fallthrough + case 0x13: + sp130++; + + msgCtx->textPosX = msgCtx->unk11F1A[sp130] + msgCtx->unk11FF8; + if (msgCtx->choiceNum == 1) { + if (!play->pauseCtx.bombersNotebookOpen) { + msgCtx->textPosX += 16; + } else { + msgCtx->textPosX += 50; + } + } else if (msgCtx->choiceNum == 2) { + if (msgCtx->unk120D8 != 3) { + if (!play->pauseCtx.bombersNotebookOpen) { + msgCtx->textPosX += 10; + } else { + msgCtx->textPosX += 57; + } + } else if (sp130 >= 2) { + if (!play->pauseCtx.bombersNotebookOpen) { + msgCtx->textPosX += 10; + } else { + msgCtx->textPosX += 57; + } + } + } + continue; + + case 0x10: + case 0x12: + if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) { + if (!msgCtx->textboxSkipped) { + Audio_PlaySfx(NA_SE_NONE); + msgCtx->msgMode = MSGMODE_TEXT_AWAIT_NEXT; + Font_LoadMessageBoxEndIcon(font, 0); + } else { + msgCtx->msgMode = MSGMODE_TEXT_NEXT_MSG; + msgCtx->textUnskippable = false; + msgCtx->msgBufPos++; + } + msgCtx->unk120CE = msgCtx->textColorR; + msgCtx->unk120D0 = msgCtx->textColorG; + msgCtx->unk120D2 = msgCtx->textColorB; + } + *gfxP = gfx; + return; + + case 0x17: // MESSAGE_QUICKTEXT_ENABLE + if ((i + 1) == msgCtx->textDrawPos) { + j = i; + if ((msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) || + ((msgCtx->msgMode >= MSGMODE_OCARINA_STARTING) && (msgCtx->msgMode <= MSGMODE_26))) { + //! FAKE: + dummy:; + while (true) { + if ((msgCtx->decodedBuffer.schar[j] != 0x18) && (msgCtx->decodedBuffer.schar[j] != 0x1A) && + (msgCtx->decodedBuffer.schar[j] != 0x19) && (msgCtx->decodedBuffer.schar[j] != 0xE0) && + (msgCtx->decodedBuffer.schar[j] != 0x10) && (msgCtx->decodedBuffer.schar[j] != 0x12)) { + j++; + continue; + } + break; + } + i = j - 1; + msgCtx->textDrawPos = i + 1; + } + } + break; + + case 0x18: // MESSAGE_QUICKTEXT_DISABLE + break; + + case 0x1B: // MESSAGE_BOX_BREAK_DELAYED + if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) { + stateTimerHi = msgCtx->decodedBuffer.schar[++i] << 8; + stateTimerHi |= msgCtx->decodedBuffer.schar[++i]; + msgCtx->stateTimer = stateTimerHi; + msgCtx->msgMode = MSGMODE_TEXT_DELAYED_BREAK; + } + *gfxP = gfx; + return; + + case 0x1C: + if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) { + msgCtx->msgMode = MSGMODE_TEXT_DONE; + if (msgCtx->unk11F0C == 3) { + msgCtx->textboxEndType = 0x55; + } else { + msgCtx->textboxEndType = 0x50; + } + stateTimerHi = msgCtx->decodedBuffer.schar[++i] << 8; + stateTimerHi |= msgCtx->decodedBuffer.schar[++i]; + msgCtx->stateTimer = stateTimerHi; + Font_LoadMessageBoxEndIcon(font, 1); + if (play->csCtx.state == CS_STATE_IDLE) { + func_8011552C(play, DO_ACTION_RETURN); + } + } + *gfxP = gfx; + return; + + case 0x1D: + if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) { + msgCtx->msgMode = MSGMODE_TEXT_DONE; + msgCtx->textboxEndType = 0x52; + stateTimerHi = msgCtx->decodedBuffer.schar[++i] << 8; + stateTimerHi |= msgCtx->decodedBuffer.schar[++i]; + msgCtx->stateTimer = stateTimerHi; + Font_LoadMessageBoxEndIcon(font, 1); + if (play->csCtx.state == CS_STATE_IDLE) { + func_8011552C(play, DO_ACTION_RETURN); + } + } + *gfxP = gfx; + return; + + case 0x1E: // MESSAGE_SFX + if (((i + 1) == msgCtx->textDrawPos) && (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING)) { + stateTimerHi = msgCtx->decodedBuffer.schar[i + 1] << 8; + stateTimerHi |= msgCtx->decodedBuffer.schar[i + 2]; + Audio_PlaySfx(stateTimerHi); + } + if ((i + 1) == msgCtx->textDrawPos) { + msgCtx->textDrawPos += 2; + } + i += 2; + break; + + case 0x1F: + if (((i + 1) == msgCtx->textDrawPos) && (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING)) { + msgCtx->msgMode = MSGMODE_9; + stateTimerHi = msgCtx->decodedBuffer.schar[i + 1] << 8; + stateTimerHi |= msgCtx->decodedBuffer.schar[i + 2]; + msgCtx->textDelayTimer = stateTimerHi; + } + i += 2; + break; + + case 0xA: + i++; + character = msgCtx->decodedBuffer.schar[i]; + switch (character) { + case 0x0: + case 0x1: + case 0x2: + case 0x3: + case 0x4: + case 0x5: + case 0x6: + msgCtx->textDelay = character - 0x0; + if ((i + 1) == msgCtx->textDrawPos) { + msgCtx->textDrawPos++; + } + break; + } + break; + + case 0xC1: // MESSAGE_BACKGROUND + msgCtx->textPosX = 0x2D; + + if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) { + Audio_PlaySfx(NA_SE_NONE); + } + + gDPPipeSync(gfx++); + gDPSetCombineMode(gfx++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM); + gDPSetPrimColor(gfx++, 0, 0, 0, 0, 0, msgCtx->textColorAlpha); + gDPLoadTextureBlock_4b(gfx++, msgCtx->textboxSegment + 0x1000, G_IM_FMT_I, 96, 48, 0, + G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, + G_TX_NOLOD, G_TX_NOLOD); + gSPTextureRectangle(gfx++, msgCtx->textPosX << 2, (msgCtx->unk12012 + 1) << 2, + (msgCtx->textPosX + 0x60) << 2, (msgCtx->unk12012 + 0x31) << 2, G_TX_RENDERTILE, 0, + 0, 1 << 10, 1 << 10); + gDPLoadTextureBlock_4b(gfx++, msgCtx->textboxSegment + 0x1900, G_IM_FMT_I, 96, 48, 0, + G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, + G_TX_NOLOD, G_TX_NOLOD); + gSPTextureRectangle(gfx++, (msgCtx->textPosX + 0x60) << 2, (msgCtx->unk12012 + 1) << 2, + (msgCtx->textPosX + 0xC1) << 2, (msgCtx->unk12012 + 0x31) << 2, G_TX_RENDERTILE, 0, + 0, 1 << 10, 1 << 10); + + gDPPipeSync(gfx++); + gDPSetPrimColor(gfx++, 0, 0, 255, 60, 0, msgCtx->textColorAlpha); + gDPLoadTextureBlock_4b(gfx++, msgCtx->textboxSegment + 0x1000, G_IM_FMT_I, 96, 48, 0, + G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, + G_TX_NOLOD, G_TX_NOLOD); + gSPTextureRectangle(gfx++, msgCtx->textPosX << 2, msgCtx->unk12012 << 2, (msgCtx->textPosX + 0x60) << 2, + (msgCtx->unk12012 + 0x30) << 2, G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10); + gDPLoadTextureBlock_4b(gfx++, msgCtx->textboxSegment + 0x1900, G_IM_FMT_I, 96, 48, 0, + G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, + G_TX_NOLOD, G_TX_NOLOD); + gSPTextureRectangle(gfx++, (msgCtx->textPosX + 0x60) << 2, msgCtx->unk12012 << 2, + (msgCtx->textPosX + 0xC0) << 2, (msgCtx->unk12012 + 0x30) << 2, G_TX_RENDERTILE, 0, + 0, 1 << 10, 1 << 10); + + gDPPipeSync(gfx++); + gDPSetCombineLERP(gfx++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE, TEXEL0, 0, + PRIMITIVE, 0); + + msgCtx->textPosX += 32; + break; + + case 0xC2: + msgCtx->textboxEndType = 0x10; + + if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) { + msgCtx->choiceTextId = msgCtx->currentTextId; + msgCtx->stateTimer = 4; + Font_LoadMessageBoxEndIcon(font, 2); + if (msgCtx->unk120D8 != 3) { + msgCtx->unk11FFE[0] = (s16)(msgCtx->textboxYTarget + 0xE); + msgCtx->unk11FFE[1] = (s16)(msgCtx->textboxYTarget + 0x1A); + msgCtx->unk11FFE[2] = (s16)(msgCtx->textboxYTarget + 0x26); + } + } + break; + + case 0xC3: + msgCtx->textboxEndType = 0x11; + + if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) { + msgCtx->choiceTextId = msgCtx->currentTextId; + msgCtx->stateTimer = 4; + Font_LoadMessageBoxEndIcon(font, 2); + if (msgCtx->unk120D8 != 3) { + msgCtx->unk11FFE[0] = (s16)(msgCtx->textboxYTarget + 0xE); + msgCtx->unk11FFE[1] = (s16)(msgCtx->textboxYTarget + 0x1A); + msgCtx->unk11FFE[2] = (s16)(msgCtx->textboxYTarget + 0x26); + } + } + break; + + case 0xCC: + msgCtx->textboxEndType = 0x60; + + if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) { + Font_LoadMessageBoxEndIcon(font, 1); + } + break; + + case 0xD0: + msgCtx->textboxEndType = 0x61; + + if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) { + Font_LoadMessageBoxEndIcon(font, 1); + } + break; + + case 0xD1: + msgCtx->textboxEndType = 0x62; + + if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) { + Font_LoadMessageBoxEndIcon(font, 1); + } + break; + + case 0xD2: + if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) { + msgCtx->msgMode = MSGMODE_TEXT_DONE; + msgCtx->textboxEndType = 0x41; + Font_LoadMessageBoxEndIcon(font, 0); + Audio_PlaySfx(NA_SE_SY_MESSAGE_END); + } + break; + + case 0xD5: + msgCtx->textboxEndType = 0x63; + + if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) { + Font_LoadMessageBoxEndIcon(font, 1); + } + break; + + case 0x15: + case 0xBF: + if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) { + if (msgCtx->textBoxType == TEXTBOX_TYPE_3) { + Message_HandleOcarina(play); + *gfxP = gfx; + return; + } + + msgCtx->msgMode = MSGMODE_TEXT_DONE; + if (msgCtx->textboxEndType == 0) { + Audio_PlaySfx(NA_SE_SY_MESSAGE_END); + if (character == 0xBF) { + Font_LoadMessageBoxEndIcon(font, 1); + } else { + Font_LoadMessageBoxEndIcon(font, 0); + } + if (play->csCtx.state == CS_STATE_IDLE) { + func_8011552C(play, DO_ACTION_RETURN); + } + } else { + Audio_PlaySfx(NA_SE_NONE); + } + } + *gfxP = gfx; + return; + + case 0x1A: + if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) { + Audio_PlaySfx(NA_SE_NONE); + msgCtx->msgMode = MSGMODE_TEXT_DONE; + msgCtx->textboxEndType = 0x30; + } + *gfxP = gfx; + return; + + case 0x19: + if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) { + msgCtx->msgMode = MSGMODE_TEXT_DONE; + msgCtx->textboxEndType = 0x40; + Font_LoadMessageBoxEndIcon(font, 0); + Audio_PlaySfx(NA_SE_SY_MESSAGE_END); + } + *gfxP = gfx; + return; + + case 0xE0: + if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) { + msgCtx->msgMode = MSGMODE_TEXT_DONE; + msgCtx->textboxEndType = 0x42; + Font_LoadMessageBoxEndIcon(font, 1); + Audio_PlaySfx(NA_SE_SY_MESSAGE_END); + } + *gfxP = gfx; + return; + + default: + switch (character) { + case 0x8169: + case 0x8175: + msgCtx->textPosX -= (s16)(6.0f * msgCtx->textCharScale); + break; + + case 0x8145: + msgCtx->textPosX -= (s16)(3.0f * msgCtx->textCharScale); + break; + + case 0x8148: + case 0x8149: + msgCtx->textPosX -= (s16)(2.0f * msgCtx->textCharScale); + break; + + default: + break; + } + if ((msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) && ((i + 1) == msgCtx->textDrawPos)) { + Audio_PlaySfx(NA_SE_NONE); + } + if ((character >= 0xB0) && (character <= 0xBB)) { + sp12E = msgCtx->textColorR; + sp12C = msgCtx->textColorG; + sp12A = msgCtx->textColorB; + msgCtx->textColorR = D_801D083C[(s16)D_801D08CC[character - 0xB0]].r; + msgCtx->textColorG = D_801D083C[(s16)D_801D08CC[character - 0xB0]].g; + msgCtx->textColorB = D_801D083C[(s16)D_801D08CC[character - 0xB0]].b; + Message_DrawTextChar(play, &font->charBuf[font->unk_11D88][charTexIndex], &gfx); + msgCtx->textColorR = sp12E; + msgCtx->textColorG = sp12C; + msgCtx->textColorB = sp12A; + } else if (msgCtx->msgMode >= MSGMODE_OWL_SAVE_0) { + if ((i < (msgCtx->decodedTextLen - 6)) || (i >= (msgCtx->decodedTextLen - 4))) { + Message_DrawTextChar(play, &font->charBuf[font->unk_11D88][charTexIndex], &gfx); + } + } else { + Message_DrawTextChar(play, &font->charBuf[font->unk_11D88][charTexIndex], &gfx); + } + charTexIndex += FONT_CHAR_TEX_SIZE; + + //! @TODO: u8 character but > 0x255 cases + switch (character) { + case 0x8144: + msgCtx->textPosX += (s16)(8.0f * msgCtx->textCharScale); + break; + + case 0x816A: + case 0x8176: + msgCtx->textPosX += (s16)(10.0f * msgCtx->textCharScale); + break; + + case 0x8141: + case 0x8142: + case 0x8168: + msgCtx->textPosX += (s16)(12.0f * msgCtx->textCharScale); + break; + + case 0x8194: + msgCtx->textPosX += (s16)(14.0f * msgCtx->textCharScale); + break; + + case 0x8145: + msgCtx->textPosX += (s16)(15.0f * msgCtx->textCharScale); + break; + + default: + if (((msgCtx->textboxEndType == 0x62) && (i >= msgCtx->unk120C0) && + ((msgCtx->unk120C0 + 4) >= i)) || + ((msgCtx->textboxEndType == 0x63) && (i >= msgCtx->unk120C0) && + ((msgCtx->unk120C0 + 2) >= i)) || + ((msgCtx->textboxEndType == 0x60) && (i >= msgCtx->unk120C0) && + ((msgCtx->unk120C0 + 2) >= i)) || + ((msgCtx->textboxEndType == 0x61) && (i >= msgCtx->unk120C0) && + ((msgCtx->unk120C0 + 1) >= i))) { + msgCtx->textPosX += (s32)(16.0f * msgCtx->textCharScale); + } else { + msgCtx->textPosX += (s32)(sNESFontWidths[character - ' '] * msgCtx->textCharScale); + } + break; + } + break; + } + } + + if (msgCtx->textDelayTimer == 0) { + msgCtx->textDrawPos = i + 1; + msgCtx->textDelayTimer = 0; + if (msgCtx->msgMode == MSGMODE_9) { + msgCtx->msgMode = MSGMODE_TEXT_DISPLAYING; + } + } else { + msgCtx->textDelayTimer--; + } + + *gfxP = gfx; +} + +char D_801D08D8[][4] = { + "Fast", + "----", + "Slow", +}; + +u8 D_801D08E4[] = { + 0x01, + 0x03, + 0x04, + 0x02, +}; + +#define RED_STR "RED" +#define BLUE_STR "BLUE" +#define YELLOW_STR "YELLOW" +#define GREEN_STR "GREEN" + +char sMaskCodeTextENG[][6] = { + RED_STR, + BLUE_STR, + YELLOW_STR, + GREEN_STR, +}; + +u8 sMaskCodeTextLengthENG[] = { + sizeof(RED_STR) - 1, + sizeof(BLUE_STR) - 1, + sizeof(YELLOW_STR) - 1, + sizeof(GREEN_STR) - 1, +}; + +#ifdef NON_MATCHING +// https://decomp.me/scratch/w2ckG +void Message_DecodeNES(PlayState* play) { + f32 var_fs0; + MessageContext* msgCtx = &play->msgCtx; + u8* ptr; + Font* font = &msgCtx->font; // spE0 + Player* player; // spDC + s16 decodedBufPos; // spDA + s16 value; + u32 timeToMoonCrash; + s16 i; // s1 + s16 spD0; // numLines + s16 digits[4]; // spC8/CA/CC/CE + s16 spC6; + f32 timeInSeconds; + s32 charTexIdx; // spBC + s16 loadChar; + s16 spA8[8]; + f32 spA4; + s16 playerNameLen; // s0 + s16 var_v1_3; + u8 curChar; // sp78 + s8 charOffset; + s16 temp_s2_2; + s16 var_s2_9; + + player = GET_PLAYER(play); + decodedBufPos = 0; + spC6 = 0; + charTexIdx = 0; + spD0 = 0; + msgCtx->textDelayTimer = 0; + msgCtx->textDelay = msgCtx->textDelayTimer; + msgCtx->textFade = 0; + spA4 = 0.0f; + font->unk_11D88 = (font->unk_11D88 ^ 1) & 1; + Message_SetupLoadItemIcon(play); + + while (true) { + curChar = font->msgBuf.schar[msgCtx->msgBufPos]; + msgCtx->decodedBuffer.schar[decodedBufPos] = font->msgBuf.schar[msgCtx->msgBufPos]; + + if ((curChar == 0x10) || (curChar == 0x12) || (curChar == 0x1B) || (curChar == 0x1C) || (curChar == 0x1D) || + (curChar == 0x19) || (curChar == 0xE0) || (curChar == 0xBF) || (curChar == 0x15) || (curChar == 0x1A)) { + msgCtx->msgMode = MSGMODE_TEXT_DISPLAYING; + msgCtx->textDrawPos = 1; + if (msgCtx->textBoxType == TEXTBOX_TYPE_3) { + msgCtx->unk11FFA = msgCtx->textboxY + 2; + } else { + msgCtx->unk11FFA = msgCtx->textboxY + 8; + } + msgCtx->unk11F1A[spC6] = 0; + if (msgCtx->unk11F18 != 0) { + msgCtx->unk11F1A[spC6] = (s16)((msgCtx->textCharScale * 16.0f * 16.0f) - spA4) / 2; + } + spA4 = 0.0f; + if (curChar == 0x12) { + if ((msgCtx->textBoxType != TEXTBOX_TYPE_3) && (msgCtx->textBoxType != TEXTBOX_TYPE_4)) { + if (spD0 < 2) { + msgCtx->unk11FFA = msgCtx->textboxY + XREG(10); + } else if (spD0 == 2) { + msgCtx->unk11FFA = msgCtx->textboxY + XREG(11); + } else if (spD0 == 3) { + msgCtx->unk11FFA = msgCtx->textboxY + XREG(12); + } + } + } else { + if ((msgCtx->textBoxType != TEXTBOX_TYPE_3) && (msgCtx->textBoxType != TEXTBOX_TYPE_4)) { + if (spD0 == 0) { + msgCtx->unk11FFA = msgCtx->textboxY + XREG(13) + XREG(10); + } else if (spD0 == 1) { + msgCtx->unk11FFA = msgCtx->textboxY + XREG(13) + XREG(11); + } else if (spD0 == 2) { + msgCtx->unk11FFA = msgCtx->textboxY + XREG(13) + XREG(12); + } + } + } + + //! FAKE: Perhaps a locally required temp for scoping + dummy:; + if ((curChar == 0x1B) || (curChar == 0x1C) || (curChar == 0x1D)) { + //! FAKE: & 0xFFFF to fix regalloc + msgCtx->decodedBuffer.schar[++decodedBufPos] = font->msgBuf.schar[msgCtx->msgBufPos + 1] & 0xFFFF; + msgCtx->decodedBuffer.schar[++decodedBufPos] = font->msgBuf.schar[msgCtx->msgBufPos + 2]; + msgCtx->msgBufPos += 3; + } + msgCtx->decodedTextLen = decodedBufPos; + msgCtx->unk120D8 = spD0; + if (msgCtx->textboxSkipped || (msgCtx->textBoxType == TEXTBOX_TYPE_1) || + (msgCtx->textBoxType == TEXTBOX_TYPE_3) || (msgCtx->textBoxType == TEXTBOX_TYPE_6) || + (msgCtx->textBoxType == TEXTBOX_TYPE_8) || (msgCtx->textBoxType == TEXTBOX_TYPE_9) || + (msgCtx->textBoxType == TEXTBOX_TYPE_B) || (msgCtx->unk11F0C == 3)) { + msgCtx->textDrawPos = msgCtx->decodedTextLen; + } + msgCtx->unk120C8 = msgCtx->unk120CE; + msgCtx->unk120CA = msgCtx->unk120D0; + msgCtx->unk120CC = msgCtx->unk120D2; + break; + } else if (curChar == 0x16) { + // Substitute the player name control character for the file's player name. + for (playerNameLen = ARRAY_COUNT(gSaveContext.save.saveInfo.playerData.playerName); playerNameLen > 0; + playerNameLen--) { + if (gSaveContext.save.saveInfo.playerData.playerName[playerNameLen - 1] != 0x3E) { + break; + } + } + + for (i = 0; i < playerNameLen; i++) { + curChar = gSaveContext.save.saveInfo.playerData.playerName[i]; + if (curChar == 0x3E) { + curChar = ' '; + } else if (curChar == 0x40) { + curChar = '.'; + } else if (curChar == 0x3F) { + curChar = '-'; + } else if (curChar < 0xA) { + charOffset = curChar; + curChar = '0' + charOffset; + } else if (curChar < 0x24) { + charOffset = curChar; + curChar = 'A' - 10 + charOffset; + } else if (curChar < 0x3E) { + charOffset = curChar; + curChar = 'a' - 36 + charOffset; + } + if (curChar != ' ') { + Font_LoadCharNES(play, curChar, charTexIdx); + charTexIdx += FONT_CHAR_TEX_SIZE; + } + msgCtx->decodedBuffer.schar[decodedBufPos] = curChar; + decodedBufPos++; + } + decodedBufPos--; + } else if (curChar == 0xC1) { + //! TODO: + 0x900 on the first one? + DmaMgr_SendRequest0(msgCtx->textboxSegment + 0x1000, SEGMENT_ROM_START(message_texture_static), 0x900); + DmaMgr_SendRequest0(msgCtx->textboxSegment + 0x1900, + (uintptr_t)SEGMENT_ROM_START(message_texture_static) + 0x900, 0x900); + spD0 = 2; + spC6 = 2; + msgCtx->unk12012 = msgCtx->textboxY + 8; + msgCtx->unk11F18 = 1; + msgCtx->unk12010 = XREG(47); + } else if (curChar == 0xC2) { + msgCtx->unk11F18 = 0; + msgCtx->choiceNum = 2; + } else if (curChar == 0xC3) { + msgCtx->unk11F18 = 0; + msgCtx->choiceNum = 3; + msgCtx->unk11FF8 = msgCtx->unk11FF8 + 0x16; + } else if (curChar == 0xC4) { + Message_GetTimerDigitsNES(((void)0, gSaveContext.timerCurTimes[curChar - 0xC4]), spA8); + + loadChar = false; + for (i = 0; i < 5; i++) { + if ((i == 1) || (spA8[i + 3] != '0')) { + loadChar = true; + } + if (loadChar) { + Message_LoadCharNES(play, spA8[i + 3], &charTexIdx, &spA4, decodedBufPos); + decodedBufPos++; + } + } + decodedBufPos--; + } else if ((curChar == 0xC5) || (curChar == 0xC6) || (curChar == 0xC7) || (curChar == 0xC8) || + (curChar == 0xC9)) { + Message_GetTimerDigitsNES(((void)0, gSaveContext.timerCurTimes[curChar - 0xC4]), spA8); + + loadChar = false; + for (i = 0; i < 8; i++) { + if ((i == 4) || ((i != 2) && (i != 5) && (spA8[i] != '0'))) { + loadChar = true; + } + if (loadChar) { + Message_LoadCharNES(play, spA8[i], &charTexIdx, &spA4, decodedBufPos); + decodedBufPos++; + } + } + decodedBufPos--; + } else if (curChar == 0xCA) { + digits[0] = 0; + timeInSeconds = TIME_TO_MINUTES_F(gSaveContext.save.time); + + digits[1] = timeInSeconds / 60.0f; + while (digits[1] >= 10) { + digits[0]++; + digits[1] -= 10; + } + + digits[2] = 0; + digits[3] = (s32)timeInSeconds % 60; + while (digits[3] >= 10) { + digits[2]++; + digits[3] -= 10; + } + + for (i = 0; i < 4; i++) { + Font_LoadCharNES(play, digits[i] + '0', charTexIdx); + charTexIdx += FONT_CHAR_TEX_SIZE; + msgCtx->decodedBuffer.schar[decodedBufPos] = digits[i] + '0'; + decodedBufPos++; + if (i == 1) { + Font_LoadCharNES(play, '"', charTexIdx); + charTexIdx += FONT_CHAR_TEX_SIZE; + msgCtx->decodedBuffer.schar[decodedBufPos] = 0x22; + decodedBufPos++; + } else if (i == 3) { + Font_LoadCharNES(play, 0x27, charTexIdx); + charTexIdx += FONT_CHAR_TEX_SIZE; + msgCtx->decodedBuffer.schar[decodedBufPos] = 0x27; + } + } + spA4 += 6 * (16.0f * msgCtx->textCharScale); + } else if (curChar == 0xCB) { + digits[0] = digits[1] = digits[2] = 0; + digits[3] = Flags_GetAllTreasure(play); + + while (digits[3] >= 1000) { + digits[0]++; + digits[3] -= 1000; + } + while (digits[3] >= 100) { + digits[1]++; + digits[3] -= 100; + } + while (digits[3] >= 10) { + digits[2]++; + digits[3] -= 10; + } + + loadChar = false; + for (i = 0; i < 4; i++) { + if ((i == 3) || (digits[i] != 0)) { + loadChar = true; + } + if (loadChar) { + Font_LoadCharNES(play, digits[i] + '0', charTexIdx); + charTexIdx += FONT_CHAR_TEX_SIZE; + msgCtx->decodedBuffer.schar[decodedBufPos] = digits[i] + '0'; + decodedBufPos++; + spA4 += 16.0f * msgCtx->textCharScale; + } + } + decodedBufPos--; + } else if (curChar == 0xCC) { + decodedBufPos++; + msgCtx->unk120BE = spC6; + msgCtx->unk120C0 = decodedBufPos; + msgCtx->unk120C2 = 2; + msgCtx->bankRupeesSelected = 0; + msgCtx->unk120C4 = charTexIdx; + digits[0] = digits[1] = digits[2] = 0; + + for (i = 0; i < 3; i++) { + Message_LoadCharNES(play, digits[i] + '0', &charTexIdx, &spA4, decodedBufPos); + decodedBufPos++; + } + Message_LoadLocalizedRupeesNES(play, &decodedBufPos, &charTexIdx, &spA4); + } else if (curChar == 0xCD) { + digits[0] = digits[1] = 0; + digits[2] = msgCtx->bankRupeesSelected; + + while (digits[2] >= 100) { + digits[0]++; + digits[2] -= 100; + } + + while (digits[2] >= 10) { + digits[1]++; + digits[2] -= 10; + } + + loadChar = false; + for (i = 0; i < 3; i++) { + if ((i == 2) || (digits[i] != 0)) { + loadChar = true; + } + if (loadChar) { + Message_LoadCharNES(play, digits[i] + '0', &charTexIdx, &spA4, decodedBufPos); + decodedBufPos++; + } + } + Message_LoadRupeesNES(play, &decodedBufPos, &charTexIdx, &spA4, msgCtx->bankRupeesSelected); + } else if (curChar == 0xCE) { + digits[0] = digits[1] = digits[2] = 0; + digits[3] = msgCtx->bankRupees; + + while (digits[3] >= 1000) { + digits[0]++; + digits[3] -= 1000; + } + while (digits[3] >= 100) { + digits[1]++; + digits[3] -= 100; + } + while (digits[3] >= 10) { + digits[2]++; + digits[3] -= 10; + } + + loadChar = false; + for (i = 0; i < 4; i++) { + if ((i == 3) || (digits[i] != 0)) { + loadChar = true; + } + if (loadChar) { + Message_LoadCharNES(play, digits[i] + '0', &charTexIdx, &spA4, decodedBufPos); + decodedBufPos++; + } + } + Message_LoadRupeesNES(play, &decodedBufPos, &charTexIdx, &spA4, msgCtx->bankRupees); + } else if (curChar == 0xCF) { + Message_LoadTimeNES(play, curChar, &charTexIdx, &spA4, &decodedBufPos); + } else if (curChar == 0xC) { + digits[0] = digits[1] = 0; + digits[2] = gSaveContext.save.saveInfo.inventory.strayFairies[(void)0, gSaveContext.dungeonIndex]; + + while (digits[2] >= 100) { + digits[0]++; + digits[2] -= 100; + } + while (digits[2] >= 10) { + digits[1]++; + digits[2] -= 10; + } + + loadChar = false; + for (i = 0; i < 3; i++) { + if ((i == 2) || (digits[i] != 0)) { + loadChar = true; + } + if (loadChar) { + Message_LoadCharNES(play, digits[i] + '0', &charTexIdx, &spA4, decodedBufPos); + decodedBufPos++; + } + } + + if ((gSaveContext.save.saveInfo.inventory.strayFairies[(void)0, gSaveContext.dungeonIndex] == 1) || + (gSaveContext.save.saveInfo.inventory.strayFairies[(void)0, gSaveContext.dungeonIndex] == 21)) { + Message_LoadCharNES(play, 's', &charTexIdx, &spA4, decodedBufPos); + decodedBufPos++; + Message_LoadCharNES(play, 't', &charTexIdx, &spA4, decodedBufPos); + } else if ((gSaveContext.save.saveInfo.inventory.strayFairies[(void)0, gSaveContext.dungeonIndex] == 2) || + (gSaveContext.save.saveInfo.inventory.strayFairies[(void)0, gSaveContext.dungeonIndex] == 22)) { + Message_LoadCharNES(play, 'n', &charTexIdx, &spA4, decodedBufPos); + decodedBufPos++; + Message_LoadCharNES(play, 'd', &charTexIdx, &spA4, decodedBufPos); + } else if ((gSaveContext.save.saveInfo.inventory.strayFairies[(void)0, gSaveContext.dungeonIndex] == 3) || + (gSaveContext.save.saveInfo.inventory.strayFairies[(void)0, gSaveContext.dungeonIndex] == 23)) { + Message_LoadCharNES(play, 'r', &charTexIdx, &spA4, decodedBufPos); + decodedBufPos++; + Message_LoadCharNES(play, 'd', &charTexIdx, &spA4, decodedBufPos); + } else { + Message_LoadCharNES(play, 't', &charTexIdx, &spA4, decodedBufPos); + decodedBufPos++; + Message_LoadCharNES(play, 'h', &charTexIdx, &spA4, decodedBufPos); + } + } else if (curChar == 0xD) { + digits[0] = digits[1] = 0; + digits[2] = Inventory_GetSkullTokenCount(play->sceneId); + + while (digits[2] >= 100) { + digits[0]++; + digits[2] -= 100; + } + while (digits[2] >= 10) { + digits[1]++; + digits[2] -= 10; + } + + loadChar = false; + for (i = 0; i < 3; i++) { + if ((i == 2) || (digits[i] != 0)) { + loadChar = true; + } + if (loadChar) { + Message_LoadCharNES(play, digits[i] + '0', &charTexIdx, &spA4, decodedBufPos); + decodedBufPos++; + } + } + + if ((Inventory_GetSkullTokenCount(play->sceneId) == 1) || + (Inventory_GetSkullTokenCount(play->sceneId) == 21)) { + Message_LoadCharNES(play, 's', &charTexIdx, &spA4, decodedBufPos); + decodedBufPos++; + Message_LoadCharNES(play, 't', &charTexIdx, &spA4, decodedBufPos); + } else if ((Inventory_GetSkullTokenCount(play->sceneId) == 2) || + (Inventory_GetSkullTokenCount(play->sceneId) == 22)) { + Message_LoadCharNES(play, 'n', &charTexIdx, &spA4, decodedBufPos); + decodedBufPos++; + Message_LoadCharNES(play, 'd', &charTexIdx, &spA4, decodedBufPos); + } else if ((Inventory_GetSkullTokenCount(play->sceneId) == 3) || + (Inventory_GetSkullTokenCount(play->sceneId) == 23)) { + Message_LoadCharNES(play, 'r', &charTexIdx, &spA4, decodedBufPos); + decodedBufPos++; + Message_LoadCharNES(play, 'd', &charTexIdx, &spA4, decodedBufPos); + } else { + Message_LoadCharNES(play, 't', &charTexIdx, &spA4, decodedBufPos); + decodedBufPos++; + Message_LoadCharNES(play, 'h', &charTexIdx, &spA4, decodedBufPos); + } + } else if (curChar == 0xE) { + digits[0] = 0; + digits[1] = gSaveContext.minigameScore; + + while (digits[1] >= 10) { + digits[0]++; + digits[1] -= 10; + } + + for (i = 0; i < 2; i++) { + if ((i == 1) || (digits[i] != 0)) { + Message_LoadCharNES(play, digits[i] + '0', &charTexIdx, &spA4, decodedBufPos); + decodedBufPos++; + } + } + + decodedBufPos--; + } else if (curChar == 0xF) { + digits[0] = digits[1] = digits[2] = 0; + digits[3] = gSaveContext.minigameScore; + + while (digits[3] >= 1000) { + digits[0]++; + digits[3] -= 1000; + } + while (digits[3] >= 100) { + digits[1]++; + digits[3] -= 100; + } + while (digits[3] >= 10) { + digits[2]++; + digits[3] -= 10; + } + + loadChar = false; + for (i = 0; i < 4; i++) { + if ((i == 3) || (digits[i] != 0)) { + loadChar = true; + } + if (loadChar) { + Message_LoadCharNES(play, digits[i] + '0', &charTexIdx, &spA4, decodedBufPos); + decodedBufPos++; + } + } + decodedBufPos--; + } else if (curChar == 0xD0) { + decodedBufPos++; + msgCtx->unk120BE = spC6; + msgCtx->unk120C0 = decodedBufPos; + msgCtx->unk120C2 = 0; + msgCtx->bankRupeesSelected = 0; + msgCtx->unk120C4 = charTexIdx; + digits[0] = digits[1] = digits[2] = 0; + for (i = 0; i < 2; i++) { + Message_LoadCharNES(play, digits[i] + '0', &charTexIdx, &spA4, decodedBufPos); + decodedBufPos++; + } + Message_LoadPluralRupeesNES(play, &decodedBufPos, &charTexIdx, &spA4); + } else if (curChar == 0xD1) { + decodedBufPos++; + msgCtx->unk120BE = spC6; + msgCtx->unk120C0 = decodedBufPos; + msgCtx->unk120C2 = 0; + msgCtx->bankRupeesSelected = 0; + msgCtx->unk120C4 = charTexIdx; + + for (i = 0; i < 5; i++) { + msgCtx->unk12054[i] = 1; + Message_LoadCharNES(play, '1', &charTexIdx, &spA4, decodedBufPos); + decodedBufPos++; + } + decodedBufPos--; + } else if (curChar == 0xD3) { + if (gSaveContext.save.timeSpeedOffset == 18) { + var_s2_9 = 0; + } else if (gSaveContext.save.timeSpeedOffset == 0) { + var_s2_9 = 1; + } else { + var_s2_9 = 2; + } + + for (i = 0; i < 4; i++) { + msgCtx->decodedBuffer.schar[decodedBufPos] = D_801D08D8[var_s2_9][i]; + Font_LoadCharNES(play, D_801D08D8[var_s2_9][i], charTexIdx); + decodedBufPos++; + charTexIdx += FONT_CHAR_TEX_SIZE; + } + decodedBufPos--; + spA4 += 3.0f * (16.0f * msgCtx->textCharScale); + msgCtx->choiceIndex = var_s2_9; + } else if (curChar == 0xD4) { + Message_LoadOwlWarpTextNES(play, &charTexIdx, &spA4, &decodedBufPos); + } else if (curChar == 0xD5) { + decodedBufPos++; + msgCtx->unk120BE = spC6; + msgCtx->unk120C0 = decodedBufPos; + msgCtx->unk120C2 = 0; + msgCtx->bankRupeesSelected = 0; + msgCtx->unk120C4 = charTexIdx; + + for (i = 0; i < 3; i++) { + msgCtx->unk12054[i] = 1; + Font_LoadCharNES(play, '1', charTexIdx); + charTexIdx += FONT_CHAR_TEX_SIZE; + msgCtx->decodedBuffer.schar[decodedBufPos] = '1'; + spA4 += 16.0f * msgCtx->textCharScale; + decodedBufPos++; + } + decodedBufPos--; + } else if (curChar == 0xD6) { + for (i = 0; i < 6; i++) { + msgCtx->decodedBuffer.schar[decodedBufPos] = + (s8)D_801D08E4[((void)0, gSaveContext.save.saveInfo.spiderHouseMaskOrder[i])]; + decodedBufPos++; + Message_LoadCharNES(play, i + '1', &charTexIdx, &spA4, decodedBufPos); + decodedBufPos++; + } + msgCtx->decodedBuffer.schar[decodedBufPos] = 0; + } else if ((curChar >= 0xD7) && (curChar < 0xDB)) { + digits[0] = digits[1] = 0; + digits[2] = 15 - gSaveContext.save.saveInfo.inventory.strayFairies[curChar - 0xD7]; + + while (digits[2] >= 100) { + digits[0]++; + digits[2] -= 100; + } + while (digits[2] >= 10) { + digits[1]++; + digits[2] -= 10; + } + + loadChar = false; + for (i = 0; i < 3; i++) { + if ((i == 2) || (digits[i] != 0)) { + loadChar = true; + } + if (loadChar) { + Font_LoadCharNES(play, digits[i] + '0', charTexIdx); + charTexIdx += FONT_CHAR_TEX_SIZE; + msgCtx->decodedBuffer.schar[decodedBufPos] = digits[i] + '0'; + decodedBufPos++; + spA4 += 16.0f * msgCtx->textCharScale; + } + } + } else if (curChar == 0xDB) { + digits[0] = digits[1] = digits[2] = 0; + digits[3] = gSaveContext.minigameScore; + + while (digits[3] >= 1000) { + digits[0]++; + digits[3] -= 1000; + } + while (digits[3] >= 100) { + digits[1]++; + digits[3] -= 100; + } + while (digits[3] >= 10) { + digits[2]++; + digits[3] -= 10; + } + + loadChar = false; + for (i = 0; i < 4; i++) { + if ((i == 3) || (digits[i] != 0)) { + loadChar = true; + } + if (loadChar) { + Font_LoadCharNES(play, digits[i] + '0', charTexIdx); + charTexIdx += FONT_CHAR_TEX_SIZE; + msgCtx->decodedBuffer.schar[decodedBufPos] = digits[i] + '0'; + decodedBufPos++; + spA4 += 16.0f * msgCtx->textCharScale; + } + } + decodedBufPos--; + } else if ((curChar == 0xDC) || (curChar == 0xDD)) { + if (curChar == 0xDC) { + digits[0] = gSaveContext.save.saveInfo.lotteryCodes[CURRENT_DAY - 1][0]; + digits[1] = gSaveContext.save.saveInfo.lotteryCodes[CURRENT_DAY - 1][1]; + digits[2] = gSaveContext.save.saveInfo.lotteryCodes[CURRENT_DAY - 1][2]; + } else { + digits[0] = (HS_GET_LOTTERY_CODE_GUESS() & 0xF00) >> 8; + digits[1] = (HS_GET_LOTTERY_CODE_GUESS() & 0xF0) >> 4; + digits[2] = HS_GET_LOTTERY_CODE_GUESS() & 0xF; + } + + for (i = 0; i < 3; i++) { + Font_LoadCharNES(play, digits[i] + '0', charTexIdx); + charTexIdx += FONT_CHAR_TEX_SIZE; + msgCtx->decodedBuffer.schar[decodedBufPos] = digits[i] + '0'; + decodedBufPos++; + spA4 += 16.0f * msgCtx->textCharScale; + } + decodedBufPos--; + } else if (curChar == 0xDE) { + digits[0] = digits[1] = digits[2] = 0; + digits[3] = gItemPrices[GET_CUR_FORM_BTN_ITEM(player->heldItemButton)]; + + while (digits[3] >= 1000) { + digits[0]++; + digits[3] -= 1000; + } + while (digits[3] >= 100) { + digits[1]++; + digits[3] -= 100; + } + while (digits[3] >= 10) { + digits[2]++; + digits[3] -= 10; + } + + loadChar = false; + for (i = 0; i < 4; i++) { + if ((i == 3) || (digits[i] != 0)) { + loadChar = true; + } + if (loadChar) { + Font_LoadCharNES(play, digits[i] + '0', charTexIdx); + charTexIdx += FONT_CHAR_TEX_SIZE; + msgCtx->decodedBuffer.schar[decodedBufPos] = digits[i] + '0'; + decodedBufPos++; + spA4 += 16.0f * msgCtx->textCharScale; + } + } + Message_LoadPluralRupeesNES(play, &decodedBufPos, &charTexIdx, &spA4); + } else if (curChar == 0xDF) { + for (i = 0; i < 5; i++) { + digits[i] = gSaveContext.save.saveInfo.bomberCode[i]; + Font_LoadCharNES(play, digits[i] + '0', charTexIdx); + charTexIdx += FONT_CHAR_TEX_SIZE; + msgCtx->decodedBuffer.schar[decodedBufPos] = digits[i] + '0'; + decodedBufPos++; + spA4 += 16.0f * msgCtx->textCharScale; + } + decodedBufPos--; + } else if ((curChar >= 0xE1) && (curChar < 0xE7)) { + msgCtx->decodedBuffer.schar[decodedBufPos] = + D_801D08E4[((void)0, gSaveContext.save.saveInfo.spiderHouseMaskOrder[(s16)(curChar - 0xE1)])]; + temp_s2_2 = sMaskCodeTextLengthENG[( + (void)0, gSaveContext.save.saveInfo.spiderHouseMaskOrder[(s16)(curChar - 0xE1)])]; + decodedBufPos++; + + for (i = 0; i < temp_s2_2; i++) { + Message_LoadCharNES( + play, + sMaskCodeTextENG[((void)0, gSaveContext.save.saveInfo.spiderHouseMaskOrder[(s16)(curChar - 0xE1)])] + [i], + &charTexIdx, &spA4, decodedBufPos); + decodedBufPos++; + } + + msgCtx->decodedBuffer.schar[decodedBufPos] = 0; + } else if (curChar == 0xE7) { + timeToMoonCrash = TIME_UNTIL_MOON_CRASH; + digits[0] = 0; + digits[1] = TIME_TO_HOURS_F_ALT(timeToMoonCrash); + + while (digits[1] >= 10) { + digits[0]++; + digits[1] -= 10; + } + + loadChar = false; + for (i = 0; i < 2; i++) { + if ((i == 1) || (digits[i] != 0)) { + loadChar = true; + } + if (loadChar) { + Message_LoadCharNES(play, digits[i] + '0', &charTexIdx, &spA4, decodedBufPos); + decodedBufPos++; + } + } + msgCtx->decodedBuffer.schar[decodedBufPos] = ' '; + decodedBufPos++; + Message_LoadCharNES(play, 'h', &charTexIdx, &spA4, decodedBufPos); + decodedBufPos++; + Message_LoadCharNES(play, 'o', &charTexIdx, &spA4, decodedBufPos); + decodedBufPos++; + Message_LoadCharNES(play, 'u', &charTexIdx, &spA4, decodedBufPos); + decodedBufPos++; + Message_LoadCharNES(play, 'r', &charTexIdx, &spA4, decodedBufPos); + if ((digits[0] != 0) || (digits[1] != 1)) { + decodedBufPos++; + Message_LoadCharNES(play, 's', &charTexIdx, &spA4, decodedBufPos); + } + } else if (curChar == 0xE8) { + Message_LoadTimeNES(play, curChar, &charTexIdx, &spA4, &decodedBufPos); + + } else if ((curChar == 0xF0) || (curChar == 0xF1) || (curChar == 0xF2) || (curChar == 0xF8)) { + if (curChar == 0xF8) { + value = (s32)HS_GET_HIGH_SCORE_3_LOWER(); + } else { + value = HIGH_SCORE(curChar - 0xF0); + } + if (curChar == 0xF2) { + if (LINK_AGE_IN_YEARS == YEARS_CHILD) { + value &= 0x7F; + } else { + value = (s16)((HIGH_SCORE((u8)font->msgBuf.schar[msgCtx->msgBufPos]) & 0xFF000000) >> 0x18) & 0x7F; + } + } + digits[3] = value; + digits[0] = digits[1] = digits[2] = 0; + + while (digits[3] >= 1000) { + digits[0]++; + digits[3] -= 1000; + } + while (digits[3] >= 100) { + digits[1]++; + digits[3] -= 100; + } + while (digits[3] >= 10) { + digits[2]++; + digits[3] -= 10; + } + + loadChar = false; + for (i = 0; i < 4; i++) { + if ((i == 3) || (digits[i] != 0)) { + loadChar = true; + } + if (loadChar) { + Font_LoadCharNES(play, digits[i] + '0', charTexIdx); + charTexIdx += FONT_CHAR_TEX_SIZE; + msgCtx->decodedBuffer.schar[decodedBufPos] = digits[i] + '0'; + decodedBufPos++; + spA4 += 16.0f * msgCtx->textCharScale; + } + } + decodedBufPos--; + } else if ((curChar == 0xF7) || (curChar == 0xF9) || (curChar == 0xFA) || (curChar == 0xFB) || + (curChar == 0xFC)) { + var_fs0 = 8.0f; + if (curChar == 0xF7) { + Message_GetTimerDigitsNES(GET_HIGH_SCORE(HS_UNK_1), spA8); + } else if (curChar == 0xF9) { + Message_GetTimerDigitsNES(GET_HIGH_SCORE(HS_HORSE_BACK_BALLOON), spA8); + } else { + Message_GetTimerDigitsNES( + ((void)0, gSaveContext.save.saveInfo.dekuPlaygroundHighScores[curChar - 0xFA]), spA8); + } + + loadChar = false; + for (i = 0; i < 8; i++) { + if ((i == 4) || ((i != 2) && (i != 5) && (spA8[i] != '\0'))) { + loadChar = true; + } + if (loadChar) { + Font_LoadCharNES(play, spA8[i], charTexIdx); + charTexIdx += FONT_CHAR_TEX_SIZE; + msgCtx->decodedBuffer.schar[decodedBufPos] = spA8[i]; + decodedBufPos++; + } else { + var_fs0 -= 1.0f; + } + } + spA4 += var_fs0 * (16.0f * msgCtx->textCharScale); + decodedBufPos--; + } else if ((curChar == 0xF3) || (curChar == 0xF4) || (curChar == 0xF5)) { + value = HIGH_SCORE(curChar - 0xF3 + HS_BOAT_ARCHERY); + digits[0] = digits[1] = digits[2] = 0; + digits[3] = value; + + while (digits[3] >= 60) { + digits[1]++; + if (digits[1] >= 10) { + digits[0]++; + digits[1] -= 10; + } + digits[3] -= 60; + } + while (digits[3] >= 10) { + digits[2]++; + digits[3] -= 10; + } + + for (i = 0; i < 4; i++) { + Font_LoadCharNES(play, digits[i] + '0', charTexIdx); + charTexIdx += FONT_CHAR_TEX_SIZE; + msgCtx->decodedBuffer.schar[decodedBufPos] = digits[i] + '0'; + decodedBufPos++; + if (i == 1) { + Font_LoadCharNES(play, '"', charTexIdx); + charTexIdx += FONT_CHAR_TEX_SIZE; + msgCtx->decodedBuffer.schar[decodedBufPos] = '"'; + decodedBufPos++; + } else if (i == 3) { + Font_LoadCharNES(play, 0x27, charTexIdx); + charTexIdx += FONT_CHAR_TEX_SIZE; + msgCtx->decodedBuffer.schar[decodedBufPos] = 0x27; + } + } + spA4 += 4.0f * (16.0f * msgCtx->textCharScale); + } else if (curChar == 0xF6) { + digits[0] = digits[1] = digits[2] = 0; + digits[3] = HS_GET_TOWN_SHOOTING_GALLERY_HIGH_SCORE(); + + while (digits[3] >= 1000) { + digits[0]++; + digits[3] -= 1000; + } + while (digits[3] >= 100) { + digits[1]++; + digits[3] -= 100; + } + while (digits[3] >= 10) { + digits[2]++; + digits[3] -= 10; + } + + loadChar = false; + for (i = 0; i < 4; i++) { + if ((i == 3) || (digits[i] != 0)) { + loadChar = true; + } + if (loadChar) { + Font_LoadCharNES(play, digits[i] + '0', charTexIdx); + charTexIdx += FONT_CHAR_TEX_SIZE; + msgCtx->decodedBuffer.schar[decodedBufPos] = digits[i] + '0'; + decodedBufPos++; + spA4 += 16.0f * msgCtx->textCharScale; + } + } + decodedBufPos--; + } else if ((curChar == 0xFD) || (curChar == 0xFE) || (curChar == 0xFF)) { + for (playerNameLen = 8; playerNameLen > 0; playerNameLen--) { + if (gSaveContext.save.saveInfo.inventory + .dekuPlaygroundPlayerName[(s16)(curChar - 0xFD)][playerNameLen - 1] != 0x3E) { + break; + } + } + + for (i = 0; i < playerNameLen; i++) { + ptr = &font->fontBuf[((void)0, gSaveContext.save.saveInfo.inventory + .dekuPlaygroundPlayerName[(s16)(curChar - 0xFD)][i]) * + FONT_CHAR_TEX_SIZE]; + msgCtx->decodedBuffer.schar[decodedBufPos + i] = 0xFD; + + for (var_v1_3 = 0; var_v1_3 < FONT_CHAR_TEX_SIZE; var_v1_3 += 4) { + font->charBuf[font->unk_11D88][charTexIdx + var_v1_3 + 0] = ptr[var_v1_3 + 0]; + font->charBuf[font->unk_11D88][charTexIdx + var_v1_3 + 1] = ptr[var_v1_3 + 1]; + font->charBuf[font->unk_11D88][charTexIdx + var_v1_3 + 2] = ptr[var_v1_3 + 2]; + font->charBuf[font->unk_11D88][charTexIdx + var_v1_3 + 3] = ptr[var_v1_3 + 3]; + } + charTexIdx += FONT_CHAR_TEX_SIZE; + } + decodedBufPos += playerNameLen - 1; + spA4 += playerNameLen * (16.0f * msgCtx->textCharScale); + } else if (curChar == 0xB) { + digits[0] = digits[1] = digits[2] = 0; + digits[3] = HS_GET_BOAT_ARCHERY_HIGH_SCORE(); + + while (digits[3] >= 1000) { + digits[0]++; + digits[3] -= 1000; + } + while (digits[3] >= 100) { + digits[1]++; + digits[3] -= 100; + } + while (digits[3] >= 10) { + digits[2]++; + digits[3] -= 10; + } + + loadChar = false; + for (i = 0; i < 4; i++) { + if ((i == 3) || (digits[i] != 0)) { + loadChar = true; + } + if (loadChar) { + Font_LoadCharNES(play, digits[i] + '0', charTexIdx); + charTexIdx += FONT_CHAR_TEX_SIZE; + msgCtx->decodedBuffer.schar[decodedBufPos] = digits[i] + '0'; + decodedBufPos++; + spA4 += 16.0f * msgCtx->textCharScale; + } + } + decodedBufPos--; + } else if (curChar == 0x14) { + decodedBufPos--; + for (i = 0; i < font->msgBuf.schar[msgCtx->msgBufPos + 1]; i++) { + msgCtx->decodedBuffer.schar[++decodedBufPos] = ' '; + spA4 += 6.0f; + } + msgCtx->msgBufPos++; + } else if ((curChar == 0x13) || (curChar == 0x11)) { + msgCtx->unk11F1A[spC6] = 0; + if (msgCtx->unk11F18 != 0) { + msgCtx->unk11F1A[spC6] = ((msgCtx->textCharScale * 16.0f * 16.0f) - spA4) * 0.5f; + } + spC6++; + spA4 = 0.0f; + if (curChar == 0x11) { + spD0++; + } + } else if ((curChar == 0x17) || (curChar == 0x18) || (curChar == 0x1A)) { + // pass + } else if (curChar == 0xA) { + decodedBufPos++; + } else if (curChar == 0x1C) { + msgCtx->textFade = true; + msgCtx->decodedBuffer.schar[++decodedBufPos] = font->msgBuf.schar[++msgCtx->msgBufPos]; + msgCtx->decodedBuffer.schar[++decodedBufPos] = font->msgBuf.schar[++msgCtx->msgBufPos]; + } else if (curChar == 0x1E) { + msgCtx->decodedBuffer.schar[++decodedBufPos] = font->msgBuf.schar[++msgCtx->msgBufPos]; + msgCtx->decodedBuffer.schar[++decodedBufPos] = font->msgBuf.schar[++msgCtx->msgBufPos]; + if (msgCtx->textboxSkipped || (msgCtx->textBoxType == TEXTBOX_TYPE_1) || + (msgCtx->textBoxType == TEXTBOX_TYPE_3) || (msgCtx->textBoxType == TEXTBOX_TYPE_6) || + (msgCtx->textBoxType == TEXTBOX_TYPE_8) || (msgCtx->textBoxType == TEXTBOX_TYPE_9) || + (msgCtx->textBoxType == TEXTBOX_TYPE_B) || (msgCtx->unk11F0C == 3)) { + Audio_PlaySfx((msgCtx->decodedBuffer.schar[decodedBufPos - 1] << 8) | + msgCtx->decodedBuffer.schar[decodedBufPos]); + } + } else if (curChar == 0x1F) { + msgCtx->decodedBuffer.schar[++decodedBufPos] = font->msgBuf.schar[++msgCtx->msgBufPos]; + msgCtx->decodedBuffer.schar[++decodedBufPos] = font->msgBuf.schar[++msgCtx->msgBufPos]; + } else if ((curChar != 0x20) && (curChar >= 9)) { + Font_LoadCharNES(play, curChar, charTexIdx); + charTexIdx += FONT_CHAR_TEX_SIZE; + spA4 += sNESFontWidths[curChar - ' '] * msgCtx->textCharScale; + } else if (curChar == 0x20) { + spA4 += 6.0f; + } + decodedBufPos++; + msgCtx->msgBufPos++; + } +} +#else +#pragma GLOBAL_ASM("asm/non_matchings/code/z_message_nes/Message_DecodeNES.s") +#endif diff --git a/tools/disasm/functions.txt b/tools/disasm/functions.txt index d54b83753..d7350076d 100644 --- a/tools/disasm/functions.txt +++ b/tools/disasm/functions.txt @@ -2838,14 +2838,14 @@ 0x8014995C:("Message_DrawTextChar",), 0x80149C18:("func_80149C18",), 0x80149EBC:("Message_FindMessage",), - 0x80149F74:("func_80149F74",), + 0x80149F74:("Message_DrawItemIcon",), 0x8014AAD0:("Message_HandleOcarina",), 0x8014ADBC:("func_8014ADBC",), 0x8014C70C:("Message_LoadItemIcon",), 0x8014CC14:("Message_LoadChar",), 0x8014CCB4:("func_8014CCB4",), 0x8014CDF0:("func_8014CDF0",), - 0x8014CFDC:("func_8014CFDC",), + 0x8014CFDC:("Message_SetupLoadItemIcon",), 0x8014D304:("func_8014D304",), 0x8014D62C:("func_8014D62C",), 0x8014D7B4:("func_8014D7B4",), @@ -2881,9 +2881,9 @@ 0x80158D98:("Message_LoadRupeesNES",), 0x80158FB0:("Message_LoadTimeNES",), 0x8015926C:("Message_LoadOwlWarpTextNES",), - 0x80159438:("func_80159438",), - 0x8015966C:("func_8015966C",), - 0x8015B198:("func_8015B198",), + 0x80159438:("Message_GetTimerDigitsNES",), + 0x8015966C:("Message_DrawTextNES",), + 0x8015B198:("Message_DecodeNES",), 0x8015E750:("Message_FindCreditsMessage",), 0x8015E7EC:("Message_DrawTextCredits",), 0x8015F8A8:("Message_DecodeCredits",), diff --git a/tools/disasm/variables.txt b/tools/disasm/variables.txt index 90edb9bf5..f5905b769 100644 --- a/tools/disasm/variables.txt +++ b/tools/disasm/variables.txt @@ -2058,10 +2058,10 @@ 0x801D045A:("D_801D045A","UNK_TYPE1","",0x1), 0x801D0462:("D_801D0462","UNK_TYPE1","",0x1), 0x801D0468:("D_801D0468","UNK_TYPE1","",0x1), - 0x801D0470:("D_801D0470","UNK_TYPE1","",0x1), - 0x801D06F0:("D_801D06F0","char","[]",0x18), + 0x801D0470:("sNESFontWidths","UNK_TYPE1","",0x1), + 0x801D06F0:("sRupeesTextLocalization","char","[]",0x18), 0x801D0708:("D_801D0708","char","[]",1), - 0x801D0710:("D_801D0710","UNK_TYPE1","",0x1), + 0x801D0710:("sRupeesTextLength","UNK_TYPE1","",0x1), 0x801D0714:("D_801D0714","char","[]",0x1), 0x801D0724:("D_801D0724","char","[]",0x1), 0x801D0730:("D_801D0730","char","[]",0x1), @@ -2083,14 +2083,13 @@ 0x801D07DC:("D_801D07DC","UNK_TYPE1","",0x1), 0x801D080C:("D_801D080C","UNK_TYPE1","",0x1), 0x801D083C:("D_801D083C","UNK_TYPE1","",0x1), - 0x801D086C:("D_801D086C","UNK_TYPE1","",0x1), - 0x801D0890:("D_801D0890","UNK_TYPE1","",0x1), + 0x801D086C:("D_801D086C","UNK_TYPE1","",0x30), 0x801D089C:("D_801D089C","UNK_TYPE1","",0x1), 0x801D08CC:("D_801D08CC","UNK_TYPE1","",0x1), 0x801D08D8:("D_801D08D8","UNK_TYPE1","",0x1), 0x801D08E4:("D_801D08E4","UNK_TYPE1","",0x1), - 0x801D08E8:("D_801D08E8","UNK_TYPE1","",0x1), - 0x801D0900:("D_801D0900","UNK_TYPE1","",0x1), + 0x801D08E8:("sMaskCodeTextENG","UNK_TYPE1","",0x1), + 0x801D0900:("sMaskCodeTextLengthENG","UNK_TYPE1","",0x1), 0x801D0B50:("Player_InitVars","ActorInit","",0x20), 0x801D0B70:("gKaleidoMgrOverlayTable","KaleidoMgrOverlay","",0x38), 0x801D0BA8:("sKaleidoAreaPtr","void*","",0x4), diff --git a/tools/sizes/code_functions.csv b/tools/sizes/code_functions.csv index 767d81514..caaa33d73 100644 --- a/tools/sizes/code_functions.csv +++ b/tools/sizes/code_functions.csv @@ -2350,16 +2350,16 @@ asm/non_matchings/code/z_message/func_801491DC.s,func_801491DC,0x801491DC,0x9E asm/non_matchings/code/z_message/func_80149454.s,func_80149454,0x80149454,0x9D asm/non_matchings/code/z_message/func_801496C8.s,func_801496C8,0x801496C8,0xA5 asm/non_matchings/code/z_message/func_8014995C.s,func_8014995C,0x8014995C,0xAF -asm/non_matchings/code/z_message/func_80149C18.s,func_80149C18,0x80149C18,0xA9 +asm/non_matchings/code/z_message/Message_DrawItemIcon.s,Message_DrawItemIcon,0x80149C18,0xA9 asm/non_matchings/code/z_message/Message_FindMessage.s,Message_FindMessage,0x80149EBC,0x2E -asm/non_matchings/code/z_message/func_80149F74.s,func_80149F74,0x80149F74,0x2D7 +asm/non_matchings/code/z_message/Message_DrawItemIcon.s,Message_DrawItemIcon,0x80149F74,0x2D7 asm/non_matchings/code/z_message/func_8014AAD0.s,func_8014AAD0,0x8014AAD0,0xBB asm/non_matchings/code/z_message/func_8014ADBC.s,func_8014ADBC,0x8014ADBC,0x654 asm/non_matchings/code/z_message/func_8014C70C.s,func_8014C70C,0x8014C70C,0x142 asm/non_matchings/code/z_message/Message_LoadChar.s,Message_LoadChar,0x8014CC14,0x28 asm/non_matchings/code/z_message/func_8014CCB4.s,func_8014CCB4,0x8014CCB4,0x4F asm/non_matchings/code/z_message/func_8014CDF0.s,func_8014CDF0,0x8014CDF0,0x7B -asm/non_matchings/code/z_message/func_8014CFDC.s,func_8014CFDC,0x8014CFDC,0xCA +asm/non_matchings/code/z_message/Message_SetupLoadItemIcon.s,Message_SetupLoadItemIcon,0x8014CFDC,0xCA asm/non_matchings/code/z_message/func_8014D304.s,func_8014D304,0x8014D304,0xCA asm/non_matchings/code/z_message/func_8014D62C.s,func_8014D62C,0x8014D62C,0x62 asm/non_matchings/code/z_message/func_8014D7B4.s,func_8014D7B4,0x8014D7B4,0xCB4 From 0fdd63a350c47b5da87a58f00855bc95b6a32b47 Mon Sep 17 00:00:00 2001 From: Zach North Date: Wed, 27 Sep 2023 23:19:28 -0400 Subject: [PATCH 03/16] Document object_mk (#1389) * Updated object_mk animation, limb, and skeleton names * Updated object_mk texture and DList names * Added comment to object_mk.xml * Remove "ing" from Anim names Co-authored-by: engineer124 <47598039+engineer124@users.noreply.github.com> * Update z_en_mk.c to not use "ing" in names * Running formatter --------- Co-authored-by: engineer124 <47598039+engineer124@users.noreply.github.com> --- assets/xml/objects/object_mk.xml | 83 +++++++++++++------------ src/overlays/actors/ovl_En_Mk/z_en_mk.c | 12 ++-- src/overlays/actors/ovl_En_Mk/z_en_mk.h | 4 +- 3 files changed, 50 insertions(+), 49 deletions(-) diff --git a/assets/xml/objects/object_mk.xml b/assets/xml/objects/object_mk.xml index 087fcc9e0..457eadf28 100644 --- a/assets/xml/objects/object_mk.xml +++ b/assets/xml/objects/object_mk.xml @@ -1,45 +1,46 @@  + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/overlays/actors/ovl_En_Mk/z_en_mk.c b/src/overlays/actors/ovl_En_Mk/z_en_mk.c index ac816517c..43f9a3d99 100644 --- a/src/overlays/actors/ovl_En_Mk/z_en_mk.c +++ b/src/overlays/actors/ovl_En_Mk/z_en_mk.c @@ -57,8 +57,8 @@ static ColliderCylinderInit sCylinderInit = { s32 func_809592E0(EnMk* this, s16 index) { AnimationHeader* sAnimations[] = { - &object_mk_Anim_001C38, &object_mk_Anim_000438, &object_mk_Anim_0007D8, - &object_mk_Anim_0010F4, &object_mk_Anim_001964, + &gMarineResearcherIdleAnim, &gMarineResearcherHeadWaggleAnim, &gMarineResearcherYellAnim, + &gMarineResearcherShakeInFearAnim, &gMarineResearcherStrokeChinAnim, }; if (index == this->unk_27C) { @@ -82,8 +82,8 @@ void EnMk_Init(Actor* thisx, PlayState* play) { this->actor.terminalVelocity = -4.0f; this->actor.gravity = -1.0f; ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 36.0f); - SkelAnime_InitFlex(play, &this->skelAnime, &object_mk_Skel_006CA0, &object_mk_Anim_001C38, this->jointTable, - this->morphTable, OBJECT_MK_LIMB_MAX); + SkelAnime_InitFlex(play, &this->skelAnime, &gMarineResearcherSkel, &gMarineResearcherIdleAnim, this->jointTable, + this->morphTable, MARINE_RESEARCHER_LIMB_MAX); this->unk_27C = -1; func_809592E0(this, 0); @@ -463,7 +463,7 @@ void EnMk_Update(Actor* thisx, PlayState* play) { s32 EnMk_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) { EnMk* this = THIS; - if (limbIndex == OBJECT_MK_LIMB_0B) { + if (limbIndex == MARINE_RESEARCHER_LIMB_HEAD) { rot->y -= this->unk_270.y; rot->z += this->unk_270.x; } @@ -475,7 +475,7 @@ Vec3f D_8095A2A0 = { 1000.0f, -100.0f, 0.0f }; void EnMk_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) { EnMk* this = THIS; - if (limbIndex == OBJECT_MK_LIMB_0B) { + if (limbIndex == MARINE_RESEARCHER_LIMB_HEAD) { Matrix_MultVec3f(&D_8095A2A0, &this->actor.focus.pos); } } diff --git a/src/overlays/actors/ovl_En_Mk/z_en_mk.h b/src/overlays/actors/ovl_En_Mk/z_en_mk.h index 518b0406d..9d32e9374 100644 --- a/src/overlays/actors/ovl_En_Mk/z_en_mk.h +++ b/src/overlays/actors/ovl_En_Mk/z_en_mk.h @@ -12,8 +12,8 @@ typedef struct EnMk { /* 0x000 */ Actor actor; /* 0x144 */ ColliderCylinder collider; /* 0x190 */ SkelAnime skelAnime; - /* 0x1D4 */ Vec3s jointTable[OBJECT_MK_LIMB_MAX]; - /* 0x222 */ Vec3s morphTable[OBJECT_MK_LIMB_MAX]; + /* 0x1D4 */ Vec3s jointTable[MARINE_RESEARCHER_LIMB_MAX]; + /* 0x222 */ Vec3s morphTable[MARINE_RESEARCHER_LIMB_MAX]; /* 0x270 */ Vec3s unk_270; /* 0x276 */ s16 csIdList[2]; /* 0x27A */ u16 unk_27A; From 408a1bba5d879dd43ba40c279c0277c9d5bf78ac Mon Sep 17 00:00:00 2001 From: engineer124 <47598039+engineer124@users.noreply.github.com> Date: Fri, 29 Sep 2023 12:58:00 +1000 Subject: [PATCH 04/16] Player Docs: Initial framework for "Action Change Lists" (#1397) * copy fig docs * adjust wording * another fix * fix bool * PR Suggestion --- .../actors/ovl_player_actor/z_player.c | 408 +++++++++++++----- tools/disasm/functions.txt | 32 +- tools/disasm/variables.txt | 26 +- 3 files changed, 318 insertions(+), 148 deletions(-) diff --git a/src/overlays/actors/ovl_player_actor/z_player.c b/src/overlays/actors/ovl_player_actor/z_player.c index 22fca02c8..8c1de93e5 100644 --- a/src/overlays/actors/ovl_player_actor/z_player.c +++ b/src/overlays/actors/ovl_player_actor/z_player.c @@ -233,21 +233,21 @@ void Player_InitItemAction_SpawnExplosive(PlayState* play, Player* this); void Player_InitItemAction_SpawnHookshot(PlayState* play, Player* this); void Player_InitItemAction_5(PlayState* play, Player* this); -s32 func_80839518(Player* this, PlayState* play); -s32 func_808365DC(Player* this, PlayState* play); -s32 func_8083D23C(Player* this, PlayState* play); -s32 func_8083CCB4(Player* this, PlayState* play); -s32 func_808391D8(Player* this, PlayState* play); -s32 func_8083DFC4(Player* this, PlayState* play); -s32 func_8083A114(Player* this, PlayState* play); -s32 func_80848570(Player* this, PlayState* play); -s32 func_8083A580(Player* this, PlayState* play); -s32 func_8083D78C(Player* this, PlayState* play); -s32 func_80839B18(Player* this, PlayState* play); -s32 func_8083A274(Player* this, PlayState* play); -s32 func_80834DFC(Player* this, PlayState* play); -s32 func_80838A90(Player* this, PlayState* play); -s32 func_8083A0CC(Player* this, PlayState* play); +s32 Player_ActionChange_0(Player* this, PlayState* play); +s32 Player_ActionChange_1(Player* this, PlayState* play); +s32 Player_ActionChange_2(Player* this, PlayState* play); +s32 Player_ActionChange_3(Player* this, PlayState* play); +s32 Player_ActionChange_4(Player* this, PlayState* play); +s32 Player_ActionChange_5(Player* this, PlayState* play); +s32 Player_ActionChange_6(Player* this, PlayState* play); +s32 Player_ActionChange_7(Player* this, PlayState* play); +s32 Player_ActionChange_8(Player* this, PlayState* play); +s32 Player_ActionChange_9(Player* this, PlayState* play); +s32 Player_ActionChange_10(Player* this, PlayState* play); +s32 Player_ActionChange_11(Player* this, PlayState* play); +s32 Player_ActionChange_12(Player* this, PlayState* play); +s32 Player_ActionChange_13(Player* this, PlayState* play); +s32 Player_ActionChange_14(Player* this, PlayState* play); /* Init Mode functions */ void Player_InitMode_0(PlayState* play, Player* this); @@ -4817,37 +4817,203 @@ s32 Player_GetMovementSpeedAndYaw(Player* this, f32* outSpeedTarget, s16* outYaw return false; } - *outYawTarget += Camera_GetInputDirYaw(play->cameraPtrs[play->activeCamId]); + *outYawTarget += Camera_GetInputDirYaw(GET_ACTIVE_CAM(play)); return true; } +typedef enum ActionChangeIndex { + /* 0x0 */ PLAYER_ACTION_CHG_0, + /* 0x1 */ PLAYER_ACTION_CHG_1, + /* 0x2 */ PLAYER_ACTION_CHG_2, + /* 0x3 */ PLAYER_ACTION_CHG_3, + /* 0x4 */ PLAYER_ACTION_CHG_4, + /* 0x5 */ PLAYER_ACTION_CHG_5, + /* 0x6 */ PLAYER_ACTION_CHG_6, + /* 0x7 */ PLAYER_ACTION_CHG_7, + /* 0x8 */ PLAYER_ACTION_CHG_8, + /* 0x9 */ PLAYER_ACTION_CHG_9, + /* 0xA */ PLAYER_ACTION_CHG_10, + /* 0xB */ PLAYER_ACTION_CHG_11, + /* 0xC */ PLAYER_ACTION_CHG_12, + /* 0xD */ PLAYER_ACTION_CHG_13, + /* 0xE */ PLAYER_ACTION_CHG_14, + /* 0xF */ PLAYER_ACTION_CHG_MAX +} ActionChangeIndex; + /** - * The values of following arrays are used as indices for the `D_8085D054` array. + * The values of following arrays are used as indices for the `sPlayerActionChangeFuncs` array. * Each index correspond to a function which will be called sequentially until any of them return `true`. * Negative marks the end of the array. */ -s8 D_8085CFE4[] = { 13, 2, 4, 9, 10, 11, 8, -7 }; -s8 D_8085CFEC[] = { 13, 1, 2, 5, 3, 4, 9, 10, 11, 7, 8, -6 }; -s8 D_8085CFF8[] = { 13, 1, 2, 3, 4, 9, 10, 11, 8, 7, -6 }; -s8 D_8085D004[] = { 13, 2, 4, 9, 10, 11, 8, -7 }; -s8 D_8085D00C[] = { 13, 2, 4, 9, 10, 11, 12, 8, -7 }; -s8 D_8085D018[] = { -7 }; -s8 D_8085D01C[] = { 0, 11, 1, 2, 3, 5, 4, 9, 8, 7, -6 }; -s8 D_8085D028[] = { 0, 11, 1, 2, 3, 12, 5, 4, 9, 8, 7, -6 }; -s8 D_8085D034[] = { 13, 1, 2, 3, 12, 5, 4, 9, 10, 11, 8, 7, -6 }; -s8 D_8085D044[] = { 10, 8, -7 }; -s8 D_8085D048[] = { 0, 12, 5, 4, -14 }; -s8 D_8085D050[] = { 13, 2, -4 }; - -s32 (*D_8085D054[])(Player*, PlayState*) = { - func_80839518, func_808365DC, func_8083D23C, func_8083CCB4, func_808391D8, - func_8083DFC4, func_8083A114, func_80848570, func_8083A580, func_8083D78C, - func_80839B18, func_8083A274, func_80834DFC, func_80838A90, func_8083A0CC, +s8 sPlayerActionChangeList1[] = { + /* 0 */ PLAYER_ACTION_CHG_13, + /* 1 */ PLAYER_ACTION_CHG_2, + /* 2 */ PLAYER_ACTION_CHG_4, + /* 3 */ PLAYER_ACTION_CHG_9, + /* 4 */ PLAYER_ACTION_CHG_10, + /* 5 */ PLAYER_ACTION_CHG_11, + /* 6 */ PLAYER_ACTION_CHG_8, + /* 7 */ -PLAYER_ACTION_CHG_7, }; -s32 func_80833058(PlayState* play, Player* this, s8* arg2, s32 arg3) { +s8 sPlayerActionChangeList2[] = { + /* 0 */ PLAYER_ACTION_CHG_13, + /* 1 */ PLAYER_ACTION_CHG_1, + /* 2 */ PLAYER_ACTION_CHG_2, + /* 3 */ PLAYER_ACTION_CHG_5, + /* 4 */ PLAYER_ACTION_CHG_3, + /* 5 */ PLAYER_ACTION_CHG_4, + /* 6 */ PLAYER_ACTION_CHG_9, + /* 7 */ PLAYER_ACTION_CHG_10, + /* 8 */ PLAYER_ACTION_CHG_11, + /* 9 */ PLAYER_ACTION_CHG_7, + /* 10 */ PLAYER_ACTION_CHG_8, + /* 11 */ -PLAYER_ACTION_CHG_6, +}; + +s8 sPlayerActionChangeList3[] = { + /* 0 */ PLAYER_ACTION_CHG_13, + /* 1 */ PLAYER_ACTION_CHG_1, + /* 2 */ PLAYER_ACTION_CHG_2, + /* 3 */ PLAYER_ACTION_CHG_3, + /* 4 */ PLAYER_ACTION_CHG_4, + /* 5 */ PLAYER_ACTION_CHG_9, + /* 6 */ PLAYER_ACTION_CHG_10, + /* 7 */ PLAYER_ACTION_CHG_11, + /* 8 */ PLAYER_ACTION_CHG_8, + /* 9 */ PLAYER_ACTION_CHG_7, + /* 10 */ -PLAYER_ACTION_CHG_6, +}; + +s8 sPlayerActionChangeList4[] = { + /* 0 */ PLAYER_ACTION_CHG_13, + /* 1 */ PLAYER_ACTION_CHG_2, + /* 2 */ PLAYER_ACTION_CHG_4, + /* 3 */ PLAYER_ACTION_CHG_9, + /* 4 */ PLAYER_ACTION_CHG_10, + /* 5 */ PLAYER_ACTION_CHG_11, + /* 6 */ PLAYER_ACTION_CHG_8, + /* 7 */ -PLAYER_ACTION_CHG_7, +}; + +s8 sPlayerActionChangeList5[] = { + /* 0 */ PLAYER_ACTION_CHG_13, + /* 1 */ PLAYER_ACTION_CHG_2, + /* 2 */ PLAYER_ACTION_CHG_4, + /* 3 */ PLAYER_ACTION_CHG_9, + /* 4 */ PLAYER_ACTION_CHG_10, + /* 5 */ PLAYER_ACTION_CHG_11, + /* 6 */ PLAYER_ACTION_CHG_12, + /* 7 */ PLAYER_ACTION_CHG_8, + /* 8 */ -PLAYER_ACTION_CHG_7, +}; + +s8 sPlayerActionChangeList6[] = { + /* 0 */ -PLAYER_ACTION_CHG_7, +}; + +s8 sPlayerActionChangeList7[] = { + /* 0 */ PLAYER_ACTION_CHG_0, + /* 1 */ PLAYER_ACTION_CHG_11, + /* 2 */ PLAYER_ACTION_CHG_1, + /* 3 */ PLAYER_ACTION_CHG_2, + /* 4 */ PLAYER_ACTION_CHG_3, + /* 5 */ PLAYER_ACTION_CHG_5, + /* 6 */ PLAYER_ACTION_CHG_4, + /* 7 */ PLAYER_ACTION_CHG_9, + /* 8 */ PLAYER_ACTION_CHG_8, + /* 9 */ PLAYER_ACTION_CHG_7, + /* 10 */ -PLAYER_ACTION_CHG_6, +}; + +s8 sPlayerActionChangeList8[] = { + /* 0 */ PLAYER_ACTION_CHG_0, + /* 1 */ PLAYER_ACTION_CHG_11, + /* 2 */ PLAYER_ACTION_CHG_1, + /* 3 */ PLAYER_ACTION_CHG_2, + /* 4 */ PLAYER_ACTION_CHG_3, + /* 5 */ PLAYER_ACTION_CHG_12, + /* 6 */ PLAYER_ACTION_CHG_5, + /* 7 */ PLAYER_ACTION_CHG_4, + /* 8 */ PLAYER_ACTION_CHG_9, + /* 9 */ PLAYER_ACTION_CHG_8, + /* 10 */ PLAYER_ACTION_CHG_7, + /* 11 */ -PLAYER_ACTION_CHG_6, +}; + +s8 sPlayerActionChangeList9[] = { + /* 0 */ PLAYER_ACTION_CHG_13, + /* 1 */ PLAYER_ACTION_CHG_1, + /* 2 */ PLAYER_ACTION_CHG_2, + /* 3 */ PLAYER_ACTION_CHG_3, + /* 4 */ PLAYER_ACTION_CHG_12, + /* 5 */ PLAYER_ACTION_CHG_5, + /* 6 */ PLAYER_ACTION_CHG_4, + /* 7 */ PLAYER_ACTION_CHG_9, + /* 8 */ PLAYER_ACTION_CHG_10, + /* 9 */ PLAYER_ACTION_CHG_11, + /* 10 */ PLAYER_ACTION_CHG_8, + /* 11 */ PLAYER_ACTION_CHG_7, + /* 12 */ -PLAYER_ACTION_CHG_6, +}; + +s8 sPlayerActionChangeList10[] = { + /* 0 */ PLAYER_ACTION_CHG_10, + /* 1 */ PLAYER_ACTION_CHG_8, + /* 2 */ -PLAYER_ACTION_CHG_7, +}; + +s8 sPlayerActionChangeList11[] = { + /* 0 */ PLAYER_ACTION_CHG_0, + /* 1 */ PLAYER_ACTION_CHG_12, + /* 2 */ PLAYER_ACTION_CHG_5, + /* 3 */ PLAYER_ACTION_CHG_4, + /* 4 */ -PLAYER_ACTION_CHG_14, +}; + +s8 sPlayerActionChangeList12[] = { + /* 0 */ PLAYER_ACTION_CHG_13, + /* 1 */ PLAYER_ACTION_CHG_2, + /* 2 */ -PLAYER_ACTION_CHG_4, +}; + +s32 (*sPlayerActionChangeFuncs[PLAYER_ACTION_CHG_MAX])(Player*, PlayState*) = { + Player_ActionChange_0, // PLAYER_ACTION_CHG_0 + Player_ActionChange_1, // PLAYER_ACTION_CHG_1 + Player_ActionChange_2, // PLAYER_ACTION_CHG_2 + Player_ActionChange_3, // PLAYER_ACTION_CHG_3 + Player_ActionChange_4, // PLAYER_ACTION_CHG_4 + Player_ActionChange_5, // PLAYER_ACTION_CHG_5 + Player_ActionChange_6, // PLAYER_ACTION_CHG_6 + Player_ActionChange_7, // PLAYER_ACTION_CHG_7 + Player_ActionChange_8, // PLAYER_ACTION_CHG_8 + Player_ActionChange_9, // PLAYER_ACTION_CHG_9 + Player_ActionChange_10, // PLAYER_ACTION_CHG_10 + Player_ActionChange_11, // PLAYER_ACTION_CHG_11 + Player_ActionChange_12, // PLAYER_ACTION_CHG_12 + Player_ActionChange_13, // PLAYER_ACTION_CHG_13 + Player_ActionChange_14, // PLAYER_ACTION_CHG_14 +}; + +/** + * This function processes "Action Change Lists", which run various functions that + * check if it is appropriate to change to a new action. + * + * Action Change Lists are a list of indices for the `sPlayerActionChangeFuncs` array. + * The functions are ran in order until one of them returns true, or the end of the list is reached. + * An Action Change index having a negative value indicates that it is the last member in the list. + * + * Because these lists are processed sequentially, the order of the indices in the list determines its priority. + * + * If the `updateUpperBody` argument is true, Player's upper body will update before the Action Change List + * is processed. This allows for Upper Action functions to run. + * + * @return true if a new action has been chosen + * + */ +s32 Player_TryActionChangeList(PlayState* play, Player* this, s8* actionChangeList, s32 updateUpperBody) { if (!(this->stateFlags1 & (PLAYER_STATE1_1 | PLAYER_STATE1_80 | PLAYER_STATE1_20000000)) && !func_8082DA90(play)) { - if (arg3) { + if (updateUpperBody) { D_80862B04 = func_8083216C(this, play); if (Player_Action_64 == this->actionFunc) { return true; @@ -4860,14 +5026,16 @@ s32 func_80833058(PlayState* play, Player* this, s8* arg2, s32 arg3) { } if (!(this->stateFlags3 & PLAYER_STATE3_40000000) && (Player_UpperAction_2 != this->upperActionFunc)) { - while (*arg2 >= 0) { - if (D_8085D054[*arg2](this, play)) { + // Process all entries in the Action Change List with a positive index + while (*actionChangeList >= 0) { + if (sPlayerActionChangeFuncs[*actionChangeList](this, play)) { return true; } - arg2++; + actionChangeList++; } - if (D_8085D054[-*arg2](this, play)) { + // Try the last entry in the list. Negate the index to make it positive again. + if (sPlayerActionChangeFuncs[-*actionChangeList](this, play)) { return true; } } @@ -4887,7 +5055,7 @@ s32 func_808331FC(PlayState* play, Player* this, SkelAnime* skelAnime, f32 frame f32 speedTarget; s16 yawTarget; - if (func_80833058(play, this, D_8085D01C, 1)) { + if (Player_TryActionChangeList(play, this, sPlayerActionChangeList7, true)) { return 0; } @@ -5637,7 +5805,7 @@ void func_80834DB8(Player* this, PlayerAnimationHeader* anim, f32 speed, PlaySta func_80834D50(play, this, anim, speed, NA_SE_VO_LI_SWORD_N); } -s32 func_80834DFC(Player* this, PlayState* play) { +s32 Player_ActionChange_12(Player* this, PlayState* play) { if ((this->transformation != PLAYER_FORM_GORON) && ((this->transformation != PLAYER_FORM_DEKU) || func_801242B4(this) || (this->ledgeClimbType <= PLAYER_LEDGE_CLIMB_3)) && @@ -6229,7 +6397,7 @@ void Player_Door_Knob(PlayState* play, Player* this, Actor* door) { } // door stuff -s32 func_808365DC(Player* this, PlayState* play) { +s32 Player_ActionChange_1(Player* this, PlayState* play) { if ((gSaveContext.save.saveInfo.playerData.health != 0) && (this->doorType != PLAYER_DOORTYPE_NONE)) { if ((this->actor.category != ACTORCAT_PLAYER) || ((((this->doorType <= PLAYER_DOORTYPE_TALKING) && CutsceneManager_IsNext(CS_ID_GLOBAL_TALK)) || @@ -7205,7 +7373,7 @@ PlayerAnimationHeader* D_8085D1F8[] = { &gPlayerAnim_link_normal_take_out, // Hold up cutscene item; "this item doesn't work here" }; -s32 func_80838A90(Player* this, PlayState* play) { +s32 Player_ActionChange_13(Player* this, PlayState* play) { PlayerBottle bottleAction; if (this->unk_AA5 != PLAYER_UNKAA5_0) { @@ -7382,7 +7550,7 @@ s32 func_80838A90(Player* this, PlayState* play) { return false; } -s32 func_808391D8(Player* this, PlayState* play) { +s32 Player_ActionChange_4(Player* this, PlayState* play) { if (gSaveContext.save.saveInfo.playerData.health != 0) { Actor* talkActor = this->talkActor; Actor* lockOnActor = this->lockOnActor; @@ -7468,9 +7636,9 @@ s32 func_808391D8(Player* this, PlayState* play) { return false; } -s32 func_80839518(Player* this, PlayState* play) { +s32 Player_ActionChange_0(Player* this, PlayState* play) { if (this->unk_AA5 != PLAYER_UNKAA5_0) { - func_80838A90(this, play); + Player_ActionChange_13(this, play); return true; } else if ((this->lockOnActor != NULL) && (CHECK_FLAG_ALL(this->lockOnActor->flags, ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_40000) || @@ -7599,7 +7767,7 @@ s32 func_80839A84(PlayState* play, Player* this) { return true; } -s32 func_80839B18(Player* this, PlayState* play) { +s32 Player_ActionChange_10(Player* this, PlayState* play) { if (CHECK_BTN_ALL(sPlayerControlInput->press.button, BTN_A) && (play->roomCtx.curRoom.behaviorType1 != ROOM_BEHAVIOR_TYPE1_2) && (sPlayerFloorType != FLOOR_TYPE_7) && (sPlayerFloorEffect != FLOOR_EFFECT_1)) { @@ -7719,14 +7887,14 @@ void func_8083A04C(Player* this) { } } -s32 func_8083A0CC(Player* this, PlayState* play) { +s32 Player_ActionChange_14(Player* this, PlayState* play) { if (!D_80862B04 && (this->transformation == PLAYER_FORM_ZORA)) { func_8083A04C(this); } return false; } -s32 func_8083A114(Player* this, PlayState* play) { +s32 Player_ActionChange_6(Player* this, PlayState* play) { if (!D_80862B04 && !(this->stateFlags1 & PLAYER_STATE1_800000) && !func_8082FB68(this)) { if ((this->transformation == PLAYER_FORM_ZORA) && (this->stateFlags1 & PLAYER_STATE1_8000000)) { func_8083A04C(this); @@ -7751,7 +7919,7 @@ s32 func_8083A114(Player* this, PlayState* play) { return false; } -s32 func_8083A274(Player* this, PlayState* play) { +s32 Player_ActionChange_11(Player* this, PlayState* play) { if (CHECK_BTN_ALL(sPlayerControlInput->cur.button, BTN_R) && (this->unk_AA5 == PLAYER_UNKAA5_0) && (play->unk_1887C == 0)) { if (Player_IsGoronOrDeku(this) || @@ -7821,7 +7989,7 @@ void func_8083A548(Player* this) { } } -s32 func_8083A580(Player* this, PlayState* play) { +s32 Player_ActionChange_8(Player* this, PlayState* play) { if (CHECK_BTN_ALL(sPlayerControlInput->cur.button, BTN_B)) { if (!(this->stateFlags1 & PLAYER_STATE1_400000) && (Player_GetMeleeWeaponHeld(this) != PLAYER_MELEEWEAPON_NONE)) { @@ -8656,7 +8824,7 @@ u16 D_8085D25C[] = { }; // Player_MountHorse -s32 func_8083CCB4(Player* this, PlayState* play) { +s32 Player_ActionChange_3(Player* this, PlayState* play) { EnHorse* rideActor = (EnHorse*)this->rideActor; if (rideActor != NULL) { @@ -8797,7 +8965,7 @@ void func_8083D168(PlayState* play, Player* this, GetItemEntry* giEntry) { Audio_PlaySfx((this->getItemId < GI_NONE) ? NA_SE_SY_GET_BOXITEM : NA_SE_SY_GET_ITEM); } -s32 func_8083D23C(Player* this, PlayState* play) { +s32 Player_ActionChange_2(Player* this, PlayState* play) { if (gSaveContext.save.saveInfo.playerData.health != 0) { Actor* interactRangeActor = this->interactRangeActor; @@ -8923,7 +9091,7 @@ s32 func_8083D738(Player* this, Actor* heldActor) { return true; } -s32 func_8083D78C(Player* this, PlayState* play) { +s32 Player_ActionChange_9(Player* this, PlayState* play) { if (this->stateFlags1 & PLAYER_STATE1_800) { if ((this->heldActor != NULL) && CHECK_BTN_ANY(sPlayerControlInput->press.button, BTN_CRIGHT | BTN_CLEFT | BTN_CDOWN | BTN_B | BTN_A)) { @@ -9120,7 +9288,7 @@ void func_8083DF38(Player* this, PlayerAnimationHeader* anim, PlayState* play) { this->actor.shape.rot.y = this->currentYaw = this->actor.wallYaw + 0x8000; } -s32 func_8083DFC4(Player* this, PlayState* play) { +s32 Player_ActionChange_5(Player* this, PlayState* play) { if (!(this->stateFlags1 & PLAYER_STATE1_800) && (this->actor.bgCheckFlags & BGCHECKFLAG_PLAYER_WALL_INTERACT) && (sPlayerShapeYawToTouchedWall < 0x3000)) { if ((this->linearVelocity > 0.0f) && func_8083D860(this, play)) { @@ -9290,7 +9458,7 @@ s32 func_8083E7F8(Player* this, f32* arg1, s16* arg2, PlayState* play) { func_8083C6E8(this, play); if ((*arg1 != 0.0f) || (ABS_ALT(this->unk_B4C) > 0x190)) { - s16 temp_a0 = *arg2 - (u16)Camera_GetInputDirYaw(play->cameraPtrs[play->activeCamId]); + s16 temp_a0 = *arg2 - (u16)Camera_GetInputDirYaw(GET_ACTIVE_CAM(play)); u16 temp; temp = (ABS_ALT(temp_a0) - 0x2000); @@ -9730,7 +9898,7 @@ s32 func_8083FD80(Player* this, PlayState* play) { } s32 func_8083FE38(Player* this, PlayState* play) { - return func_80838A90(this, play) || func_808391D8(this, play) || func_8083D23C(this, play); + return Player_ActionChange_13(this, play) || Player_ActionChange_4(this, play) || Player_ActionChange_2(this, play); } void Player_RequestQuakeAndRumble(PlayState* play, Player* this, u16 sfxId) { @@ -12662,7 +12830,7 @@ s32 func_80847994(PlayState* play, Player* this) { this->stateFlags3 &= ~PLAYER_STATE3_20; this->itemAction = PLAYER_IA_OCARINA; this->unk_AA5 = PLAYER_UNKAA5_5; - func_80838A90(this, play); + Player_ActionChange_13(this, play); return true; } return false; @@ -12966,7 +13134,7 @@ void func_808484F0(Player* this) { } } -s32 func_80848570(Player* this, PlayState* play) { +s32 Player_ActionChange_7(Player* this, PlayState* play) { if (!func_8083A6C0(play, this)) { if (func_808396B8(play, this)) { PlayerMeleeWeaponAnimation meleeWeaponAnim = func_808335F4(this); @@ -13498,7 +13666,7 @@ void Player_Action_2(Player* this, PlayState* play) { } func_80832F24(this); - if (func_80833058(play, this, D_8085CFE4, 1)) { + if (Player_TryActionChangeList(play, this, sPlayerActionChangeList1, true)) { return; } @@ -13553,7 +13721,7 @@ void Player_Action_3(Player* this, PlayState* play) { } func_80832F24(this); - if (func_80833058(play, this, D_8085CFEC, 1)) { + if (Player_TryActionChangeList(play, this, sPlayerActionChangeList2, true)) { return; } @@ -13622,7 +13790,8 @@ void Player_Action_4(Player* this, PlayState* play) { } func_80832F24(this); - if ((this->actionVar2 == 0) && !func_80847880(play, this) && !func_80833058(play, this, D_8085D01C, 1)) { + if ((this->actionVar2 == 0) && !func_80847880(play, this) && + !Player_TryActionChangeList(play, this, sPlayerActionChangeList7, true)) { if (func_8082FB68(this)) { func_8083B23C(this, play); return; @@ -13689,7 +13858,7 @@ void Player_Action_5(Player* this, PlayState* play) { Player_AnimSfx_PlayFloorWalk(this, this->linearVelocity); } - if (func_80833058(play, this, D_8085CFF8, 1)) { + if (Player_TryActionChangeList(play, this, sPlayerActionChangeList3, true)) { return; } @@ -13741,7 +13910,7 @@ void Player_Action_6(Player* this, PlayState* play) { s32 sp2C; func_8083EE60(this, play); - if (func_80833058(play, this, D_8085D004, 1)) { + if (Player_TryActionChangeList(play, this, sPlayerActionChangeList4, true)) { return; } @@ -13781,7 +13950,7 @@ void Player_Action_7(Player* this, PlayState* play) { func_80832F24(this); - if (func_80833058(play, this, D_8085D004, 1)) { + if (Player_TryActionChangeList(play, this, sPlayerActionChangeList4, true)) { return; } @@ -13802,7 +13971,7 @@ void Player_Action_7(Player* this, PlayState* play) { void Player_Action_8(Player* this, PlayState* play) { s32 animFinished = PlayerAnimation_Update(play, &this->skelAnime); - if (func_80833058(play, this, D_8085D004, 1)) { + if (Player_TryActionChangeList(play, this, sPlayerActionChangeList4, true)) { return; } @@ -13817,7 +13986,7 @@ void Player_Action_9(Player* this, PlayState* play) { s32 var_v0; func_8083F27C(play, this); - if (func_80833058(play, this, D_8085D00C, 1)) { + if (Player_TryActionChangeList(play, this, sPlayerActionChangeList5, true)) { return; } @@ -13887,7 +14056,7 @@ void Player_Action_10(Player* this, PlayState* play) { yawTarget = this->actor.home.rot.y; } - if (func_80833058(play, this, D_8085D018, 1)) { + if (Player_TryActionChangeList(play, this, sPlayerActionChangeList6, true)) { return; } @@ -13910,8 +14079,8 @@ void Player_Action_11(Player* this, PlayState* play) { } PlayerAnimation_Update(play, &this->skelAnime); - if (!func_80847880(play, this) && - (!func_80833058(play, this, D_8085D01C, 1) || (Player_Action_11 == this->actionFunc))) { + if (!func_80847880(play, this) && (!Player_TryActionChangeList(play, this, sPlayerActionChangeList7, true) || + (Player_Action_11 == this->actionFunc))) { f32 speedTarget; f32 temp_fv0; f32 temp_fv1; @@ -13951,7 +14120,8 @@ void Player_Action_12(Player* this, PlayState* play) { PlayerAnimation_Update(play, &this->skelAnime); func_80832F24(this); if (!func_80847880(play, this)) { - if (!func_80833058(play, this, D_8085D01C, 0) || (Player_Action_12 == this->actionFunc)) { + if (!Player_TryActionChangeList(play, this, sPlayerActionChangeList7, false) || + (Player_Action_12 == this->actionFunc)) { if (!CHECK_BTN_ALL(sPlayerControlInput->cur.button, BTN_B)) { func_80839E74(this, play); } @@ -13965,7 +14135,7 @@ void Player_Action_13(Player* this, PlayState* play) { this->stateFlags2 |= PLAYER_STATE2_20; func_8083F57C(this, play); - if (func_80833058(play, this, D_8085D028, 1)) { + if (Player_TryActionChangeList(play, this, sPlayerActionChangeList8, true)) { return; } @@ -13996,7 +14166,7 @@ void Player_Action_14(Player* this, PlayState* play) { this->stateFlags2 |= PLAYER_STATE2_20; func_8083F57C(this, play); - if (func_80833058(play, this, D_8085D034, 1)) { + if (Player_TryActionChangeList(play, this, sPlayerActionChangeList9, true)) { return; } @@ -14026,7 +14196,7 @@ void Player_Action_15(Player* this, PlayState* play) { f32 speedTarget; s16 yawTarget; - if (func_80833058(play, this, D_8085D00C, 1)) { + if (Player_TryActionChangeList(play, this, sPlayerActionChangeList5, true)) { return; } @@ -14053,7 +14223,7 @@ void Player_Action_16(Player* this, PlayState* play) { s16 yawTarget; func_80832F24(this); - if (func_80833058(play, this, D_8085D044, 1)) { + if (Player_TryActionChangeList(play, this, sPlayerActionChangeList10, true)) { return; } @@ -14080,7 +14250,7 @@ void Player_Action_17(Player* this, PlayState* play) { } if (DECR(this->actionVar2) == 0) { - if (!func_80838A90(this, play)) { + if (!Player_ActionChange_13(this, play)) { func_80836A98(this, D_8085BE84[PLAYER_ANIMGROUP_33][this->modelAnimType], play); } this->actor.flags &= ~ACTOR_FLAG_TALK_REQUESTED; @@ -14096,7 +14266,7 @@ void Player_Action_18(Player* this, PlayState* play) { SkelAnime_Update(&this->unk_2C8); if (!func_8083FE38(this, play)) { - if (!func_8083A274(this, play)) { + if (!Player_ActionChange_11(this, play)) { this->stateFlags1 &= ~PLAYER_STATE1_400000; if (this->itemAction <= PLAYER_IA_MINUS1) { @@ -14134,7 +14304,7 @@ void Player_Action_18(Player* this, PlayState* play) { if (this->actionVar2 != 0) { f32 yStick = sPlayerControlInput->rel.stick_y * 180; f32 xStick = sPlayerControlInput->rel.stick_x * -120; - s16 temp_a0 = this->actor.shape.rot.y - Camera_GetInputDirYaw(play->cameraPtrs[play->activeCamId]); + s16 temp_a0 = this->actor.shape.rot.y - Camera_GetInputDirYaw(GET_ACTIVE_CAM(play)); s16 var_a1; s16 temp_ft5; s16 var_a2; @@ -14164,7 +14334,7 @@ void Player_Action_18(Player* this, PlayState* play) { this->actionVar1 = 0; } } else if (!func_8083FE38(this, play)) { - if (func_8083A274(this, play)) { + if (Player_ActionChange_11(this, play)) { func_8083FD80(this, play); } else { this->stateFlags1 &= ~PLAYER_STATE1_400000; @@ -14464,7 +14634,7 @@ void Player_Action_25(Player* this, PlayState* play) { func_8083216C(this, play); } - func_80838A90(this, play); + Player_ActionChange_13(this, play); } // sPlayerRollingAnimSfx @@ -14510,7 +14680,7 @@ void Player_Action_26(Player* this, PlayState* play) { } } } else if (!func_80840A30(play, this, &this->linearVelocity, 6.0f)) { - if ((this->skelAnime.curFrame < 15.0f) || !func_80848570(this, play)) { + if ((this->skelAnime.curFrame < 15.0f) || !Player_ActionChange_7(this, play)) { f32 speedTarget; s16 yawTarget; @@ -14851,7 +15021,7 @@ void Player_Action_34(Player* this, PlayState* play) { } void Player_Action_35(Player* this, PlayState* play) { - if (func_80838A90(this, play) == 0) { + if (!Player_ActionChange_13(this, play)) { if ((this->stateFlags3 & PLAYER_STATE3_10) && !(this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) { func_80833AA0(this, play); this->stateFlags1 |= PLAYER_STATE1_20000000; @@ -15005,7 +15175,7 @@ void Player_Action_35(Player* this, PlayState* play) { if (play->sceneId == SCENE_20SICHITAI) { play->unk_1887C = 0; } - } else if (!func_808391D8(this, play)) { + } else if (!Player_ActionChange_4(this, play)) { func_8083B2E4(this, play); } } @@ -15206,7 +15376,7 @@ void Player_Action_43(Player* this, PlayState* play) { ((this->unk_AA5 == PLAYER_UNKAA5_1) && CHECK_BTN_ANY(sPlayerControlInput->press.button, BTN_CRIGHT | BTN_CLEFT | BTN_CDOWN | BTN_CUP | BTN_R | BTN_B | BTN_A))) || - func_808391D8(this, play)))) { + Player_ActionChange_4(this, play)))) { func_80839ED0(this, play); Audio_PlaySfx(NA_SE_SY_CAMERA_ZOOM_UP); } else if ((DECR(this->actionVar2) == 0) || (this->unk_AA5 != PLAYER_UNKAA5_3)) { @@ -15239,7 +15409,7 @@ void Player_Action_44(Player* this, PlayState* play) { func_80837BD0(play, this); this->actionVar2 = sp44; } else if (!func_80847994(play, this) && !func_80847880(play, this) && !func_808387A0(play, this) && - ((this->talkActor != this->interactRangeActor) || !func_8083D23C(this, play))) { + ((this->talkActor != this->interactRangeActor) || !Player_ActionChange_2(this, play))) { if (func_801242B4(this)) { func_808353DC(play, this); } else { @@ -15893,8 +16063,8 @@ void Player_Action_52(Player* this, PlayState* play) { func_8084FD7C(play, this, &rideActor->actor); } } else if ((this->csMode != PLAYER_CSMODE_NONE) || - (!func_8082DAFC(play) && ((rideActor->actor.speed != 0.0f) || !func_808391D8(this, play)) && - !func_80847BF0(this, play) && !func_80838A90(this, play))) { + (!func_8082DAFC(play) && ((rideActor->actor.speed != 0.0f) || !Player_ActionChange_4(this, play)) && + !func_80847BF0(this, play) && !Player_ActionChange_13(this, play))) { if (this->lockOnActor != NULL) { if (func_800B7128(this)) { this->upperLimbRot.y = func_8083C62C(this, true) - this->actor.shape.rot.y; @@ -16007,7 +16177,7 @@ void Player_Action_54(Player* this, PlayState* play) { this->actionVar2 = 0; } - if (!func_8082DAFC(play) && !func_80833058(play, this, D_8085D048, 1) && + if (!func_8082DAFC(play) && !Player_TryActionChangeList(play, this, sPlayerActionChangeList11, true) && !func_8083B3B4(play, this, sPlayerControlInput) && ((this->actionVar2 != 0) || !func_80850734(play, this))) { speedTarget = 0.0f; yawTarget = this->actor.shape.rot.y; @@ -16044,7 +16214,7 @@ void Player_Action_54(Player* this, PlayState* play) { } void Player_Action_55(Player* this, PlayState* play) { - if (!func_80838A90(this, play)) { + if (!Player_ActionChange_13(this, play)) { this->stateFlags2 |= PLAYER_STATE2_20; func_808477D0(play, this, NULL, this->linearVelocity); func_808475B4(this); @@ -16090,7 +16260,7 @@ void Player_Action_56(Player* this, PlayState* play) { func_808475B4(this); func_8082F164(this, BTN_R); - if (func_80833058(play, this, D_8085D048, false)) { + if (Player_TryActionChangeList(play, this, sPlayerActionChangeList11, false)) { return; } @@ -16217,8 +16387,8 @@ void Player_Action_57(Player* this, PlayState* play) { this->stateFlags2 |= PLAYER_STATE2_20; func_808475B4(this); func_8082F164(this, BTN_R); - if (!func_80833058(play, this, D_8085D048, 1) && !func_8083B3B4(play, this, sPlayerControlInput) && - !func_80850854(play, this)) { + if (!Player_TryActionChangeList(play, this, sPlayerActionChangeList11, true) && + !func_8083B3B4(play, this, sPlayerControlInput) && !func_80850854(play, this)) { func_808477D0(play, this, sPlayerControlInput, this->linearVelocity); if (func_8082DA90(play)) { speedTarget = this->linearVelocity; @@ -16249,7 +16419,8 @@ void Player_Action_58(Player* this, PlayState* play) { func_808475B4(this); func_8082F164(this, BTN_R); - if (!func_80833058(play, this, D_8085D048, 1) && !func_8083B3B4(play, this, sPlayerControlInput)) { + if (!Player_TryActionChangeList(play, this, sPlayerActionChangeList11, true) && + !func_8083B3B4(play, this, sPlayerControlInput)) { Player_GetMovementSpeedAndYaw(this, &speedTarget, &yawTarget, SPEED_MODE_LINEAR, play); if (speedTarget == 0.0f) { @@ -16271,7 +16442,7 @@ void Player_Action_59(Player* this, PlayState* play) { func_8083216C(this, play); func_8082F164(this, BTN_R); - if (func_80838A90(this, play)) { + if (Player_ActionChange_13(this, play)) { return; } @@ -16292,7 +16463,7 @@ void Player_Action_59(Player* this, PlayState* play) { func_808477D0(play, this, sPlayerControlInput, this->actor.velocity.y); this->unk_AAA = 0x3E80; - if (CHECK_BTN_ALL(sPlayerControlInput->cur.button, BTN_A) && !func_8083D23C(this, play) && + if (CHECK_BTN_ALL(sPlayerControlInput->cur.button, BTN_A) && !Player_ActionChange_2(this, play) && !(this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) && (this->actor.depthInWater < 120.0f)) { func_808481CC(play, this, -2.0f); } else { @@ -16596,7 +16767,7 @@ void Player_Action_63(Player* this, PlayState* play) { this->talkActor = this->tatlActor; this->tatlActor->textId = -this->tatlTextId; Player_TalkWithPlayer(play, this->talkActor); - } else if (!func_80838A90(this, play)) { + } else if (!Player_ActionChange_13(this, play)) { func_80836A5C(this, play); Player_AnimationPlayOnceReverse(play, this, D_8085D17C[this->transformation]); } @@ -16775,8 +16946,8 @@ void Player_Action_65(Player* this, PlayState* play) { } else { if ((this->skelAnime.animation == &gPlayerAnim_link_demo_get_itemB) || (this->skelAnime.animation == &gPlayerAnim_pn_getB)) { - Math_ScaledStepToS(&this->actor.shape.rot.y, - BINANG_ADD(Camera_GetCamDirYaw(play->cameraPtrs[play->activeCamId]), 0x8000), 0xFA0); + Math_ScaledStepToS(&this->actor.shape.rot.y, BINANG_ADD(Camera_GetCamDirYaw(GET_ACTIVE_CAM(play)), 0x8000), + 0xFA0); } else if ((this->skelAnime.animation == &gPlayerAnim_pn_getA) && PlayerAnimation_OnFrame(&this->skelAnime, 10.0f)) { Player_AnimSfx_PlayFloorLand(this); @@ -17090,7 +17261,7 @@ void Player_Action_70(Player* this, PlayState* play) { if (PlayerAnimation_Update(play, &this->skelAnime)) { Player_StopCutscene(this); - if (!func_80838A90(this, play)) { + if (!Player_ActionChange_13(this, play)) { func_80839E74(this, play); } } else if (PlayerAnimation_OnFrame(&this->skelAnime, 76.0f)) { @@ -17198,11 +17369,11 @@ void Player_Action_73(Player* this, PlayState* play) { Audio_PlaySfx_AtPosWithSyncedFreqAndVolume( &this->actor.projectedPos, Player_GetFloorSfx(this, NA_SE_PL_SLIP_LEVEL - SFX_FLAG), this->actor.speed); - if (func_80838A90(this, play)) { + if (Player_ActionChange_13(this, play)) { return; } - if ((this->transformation == PLAYER_FORM_GORON) && func_8083A114(this, play)) { + if ((this->transformation == PLAYER_FORM_GORON) && Player_ActionChange_6(this, play)) { return; } @@ -17326,7 +17497,7 @@ void Player_Action_77(Player* this, PlayState* play) { } void Player_Action_78(Player* this, PlayState* play) { - func_808365DC(this, play); + Player_ActionChange_1(this, play); } void Player_Action_79(Player* this, PlayState* play) { @@ -17482,7 +17653,7 @@ void Player_Action_84(Player* this, PlayState* play) { func_808333CC(this))) { D_80862B48 = this->actionVar2; - if (!func_80848570(this, play)) { + if (!Player_ActionChange_7(this, play)) { PlayerAnimationHeader* anim = func_80123420(this) ? attackInfoEntry->unk_8 : attackInfoEntry->unk_4; func_8082DC38(this); @@ -17494,7 +17665,7 @@ void Player_Action_84(Player* this, PlayState* play) { u8 moveFlags = this->skelAnime.moveFlags; if (this->transformation == PLAYER_FORM_ZORA) { - if (func_8083A580(this, play)) { + if (Player_ActionChange_8(this, play)) { anim = this->unk_284.animation; } this->unk_ADC = 0; @@ -17737,10 +17908,10 @@ void Player_Action_86(Player* this, PlayState* play) { func_808323C0(this, play->playerCsIds[PLAYER_CS_ID_MASK_TRANSFORMATION]); sPlayerControlInput = play->state.input; - Camera_ChangeMode(play->cameraPtrs[play->activeCamId], + Camera_ChangeMode(GET_ACTIVE_CAM(play), (this->transformation == PLAYER_FORM_HUMAN) ? CAM_MODE_NORMAL : CAM_MODE_JUMP); this->stateFlags2 |= PLAYER_STATE2_40; - this->actor.shape.rot.y = Camera_GetCamDirYaw(play->cameraPtrs[play->activeCamId]) + 0x8000; + this->actor.shape.rot.y = Camera_GetCamDirYaw(GET_ACTIVE_CAM(play)) + 0x8000; func_80855218(play, this, &sp4C); @@ -17814,8 +17985,7 @@ void Player_Action_86(Player* this, PlayState* play) { } void Player_Action_87(Player* this, PlayState* play) { - Camera_ChangeMode(play->cameraPtrs[play->activeCamId], - (this->prevMask == PLAYER_MASK_NONE) ? CAM_MODE_NORMAL : CAM_MODE_JUMP); + Camera_ChangeMode(GET_ACTIVE_CAM(play), (this->prevMask == PLAYER_MASK_NONE) ? CAM_MODE_NORMAL : CAM_MODE_JUMP); if (R_PLAY_FILL_SCREEN_ON != 0) { R_PLAY_FILL_SCREEN_ALPHA -= R_PLAY_FILL_SCREEN_ON; @@ -18027,7 +18197,7 @@ void Player_Action_93(Player* this, PlayState* play) { PlayerAnimation_Update(play, &this->skelAnime); - if (func_80838A90(this, play)) { + if (Player_ActionChange_13(this, play)) { return; } @@ -18048,7 +18218,7 @@ void Player_Action_93(Player* this, PlayState* play) { if (this->unk_ABC < -3900.0f) { this->unk_ABC = -3900.0f; this->actionVar1 = 2; - this->actor.shape.rot.y = Camera_GetInputDirYaw(play->cameraPtrs[play->activeCamId]); + this->actor.shape.rot.y = Camera_GetInputDirYaw(GET_ACTIVE_CAM(play)); this->actor.scale.y = 0.01f; this->currentYaw = this->actor.world.rot.y = this->actor.shape.rot.y; } else { @@ -18211,7 +18381,7 @@ void Player_Action_94(Player* this, PlayState* play) { this->boomerangActor = NULL; } - if (func_80838A90(this, play)) { + if (Player_ActionChange_13(this, play)) { return; } @@ -18404,7 +18574,7 @@ void Player_Action_95(Player* this, PlayState* play) { PlayerAnimation_Update(play, &this->skelAnime); Player_SetCylinderForAttack(this, DMG_DEKU_SPIN, 1, 30); - if (!func_80838A90(this, play)) { + if (!Player_ActionChange_13(this, play)) { s16 prevYaw = this->currentYaw; f32 speedTarget; s16 yawTarget; @@ -18554,7 +18724,7 @@ void func_80857AEC(PlayState* play, Player* this) { // Goron rolling related void Player_Action_96(Player* this, PlayState* play) { - if (func_80833058(play, this, D_8085D050, 0)) { + if (Player_TryActionChangeList(play, this, sPlayerActionChangeList12, false)) { return; } @@ -19502,7 +19672,7 @@ void Player_CsAction_0(PlayState* play, Player* this, CsCmdActorCue* cue) { if (func_801240DC(this) || (this->stateFlags1 & PLAYER_STATE1_800)) { func_8083216C(this, play); } else if ((this->interactRangeActor != NULL) && (this->interactRangeActor->textId == 0xFFFF)) { - func_8083D23C(this, play); + Player_ActionChange_2(this, play); } } } @@ -19920,7 +20090,7 @@ void Player_CsAction_38(PlayState* play, Player* this, CsCmdActorCue* cue) { void Player_CsAction_39(PlayState* play, Player* this, CsCmdActorCue* cue) { Player_CsAnim_11(play, this, cue); - if (func_8083D23C(this, play)) { + if (Player_ActionChange_2(this, play)) { play->csCtx.state = CS_STATE_STOP; CutsceneManager_Stop(CutsceneManager_GetCurrentCsId()); } @@ -20010,8 +20180,8 @@ void Player_CsAction_End(PlayState* play, Player* this, CsCmdActorCue* cue) { func_8082DC64(play, this); } else { func_80839ED0(this, play); - if (!func_808391D8(this, play)) { - func_8083D23C(this, play); + if (!Player_ActionChange_4(this, play)) { + Player_ActionChange_2(this, play); } } @@ -20079,7 +20249,7 @@ void Player_CsAction_48(PlayState* play, Player* this, CsCmdActorCue* cue) { if ((sPlayerCsModes[this->cueId] == PLAYER_CSMODE_68) && (play->sceneId == SCENE_OKUJOU)) { this->unk_AA5 = PLAYER_UNKAA5_5; - if (func_80838A90(this, play)) { + if (Player_ActionChange_13(this, play)) { this->csMode = PLAYER_CSMODE_NONE; } return; diff --git a/tools/disasm/functions.txt b/tools/disasm/functions.txt index d7350076d..7ecc8c4e3 100644 --- a/tools/disasm/functions.txt +++ b/tools/disasm/functions.txt @@ -4383,7 +4383,7 @@ 0x80832CAC:("Player_CalcSpeedAndYawFromControlStick",), 0x80832F24:("func_80832F24",), 0x80832F78:("Player_GetMovementSpeedAndYaw",), - 0x80833058:("func_80833058",), + 0x80833058:("Player_TryActionChangeList",), 0x808331FC:("func_808331FC",), 0x808332A0:("func_808332A0",), 0x808333CC:("func_808333CC",), @@ -4413,7 +4413,7 @@ 0x80834CD0:("func_80834CD0",), 0x80834D50:("func_80834D50",), 0x80834DB8:("func_80834DB8",), - 0x80834DFC:("func_80834DFC",), + 0x80834DFC:("Player_ActionChange_12",), 0x80835324:("func_80835324",), 0x808353DC:("func_808353DC",), 0x80835428:("func_80835428",), @@ -4430,7 +4430,7 @@ 0x80835EAC:("Player_Door_Staircase",), 0x8083604C:("Player_Door_Sliding",), 0x80836258:("Player_Door_Knob",), - 0x808365DC:("func_808365DC",), + 0x808365DC:("Player_ActionChange_1",), 0x80836888:("func_80836888",), 0x8083692C:("func_8083692C",), 0x80836988:("func_80836988",), @@ -4470,9 +4470,9 @@ 0x808388B8:("func_808388B8",), 0x808389BC:("func_808389BC",), 0x80838A20:("func_80838A20",), - 0x80838A90:("func_80838A90",), - 0x808391D8:("func_808391D8",), - 0x80839518:("func_80839518",), + 0x80838A90:("Player_ActionChange_13",), + 0x808391D8:("Player_ActionChange_4",), + 0x80839518:("Player_ActionChange_0",), 0x808395F0:("func_808395F0",), 0x808396B8:("func_808396B8",), 0x80839770:("func_80839770",), @@ -4481,19 +4481,19 @@ 0x80839978:("func_80839978",), 0x80839A10:("func_80839A10",), 0x80839A84:("func_80839A84",), - 0x80839B18:("func_80839B18",), + 0x80839B18:("Player_ActionChange_10",), 0x80839CD8:("func_80839CD8",), 0x80839E3C:("func_80839E3C",), 0x80839E74:("func_80839E74",), 0x80839ED0:("func_80839ED0",), 0x80839F98:("func_80839F98",), 0x8083A04C:("func_8083A04C",), - 0x8083A0CC:("func_8083A0CC",), - 0x8083A114:("func_8083A114",), - 0x8083A274:("func_8083A274",), + 0x8083A0CC:("Player_ActionChange_14",), + 0x8083A114:("Player_ActionChange_6",), + 0x8083A274:("Player_ActionChange_11",), 0x8083A4A4:("func_8083A4A4",), 0x8083A548:("func_8083A548",), - 0x8083A580:("func_8083A580",), + 0x8083A580:("Player_ActionChange_8",), 0x8083A658:("func_8083A658",), 0x8083A6C0:("func_8083A6C0",), 0x8083A794:("func_8083A794",), @@ -4531,19 +4531,19 @@ 0x8083CB04:("func_8083CB04",), 0x8083CB58:("func_8083CB58",), 0x8083CBC4:("func_8083CBC4",), - 0x8083CCB4:("func_8083CCB4",), + 0x8083CCB4:("Player_ActionChange_3",), 0x8083CF68:("Player_HandleSlopes",), 0x8083D168:("func_8083D168",), - 0x8083D23C:("func_8083D23C",), + 0x8083D23C:("Player_ActionChange_2",), 0x8083D6DC:("func_8083D6DC",), 0x8083D738:("func_8083D738",), - 0x8083D78C:("func_8083D78C",), + 0x8083D78C:("Player_ActionChange_9",), 0x8083D860:("func_8083D860",), 0x8083DCC4:("func_8083DCC4",), 0x8083DD1C:("func_8083DD1C",), 0x8083DEE4:("func_8083DEE4",), 0x8083DF38:("func_8083DF38",), - 0x8083DFC4:("func_8083DFC4",), + 0x8083DFC4:("Player_ActionChange_5",), 0x8083E14C:("func_8083E14C",), 0x8083E234:("func_8083E234",), 0x8083E28C:("func_8083E28C",), @@ -4642,7 +4642,7 @@ 0x808482E0:("func_808482E0",), 0x808484CC:("func_808484CC",), 0x808484F0:("func_808484F0",), - 0x80848570:("func_80848570",), + 0x80848570:("Player_ActionChange_7",), 0x80848640:("func_80848640",), 0x80848780:("Player_UpperAction_0",), 0x808487B8:("Player_UpperAction_1",), diff --git a/tools/disasm/variables.txt b/tools/disasm/variables.txt index f5905b769..01a46d7d1 100644 --- a/tools/disasm/variables.txt +++ b/tools/disasm/variables.txt @@ -4967,19 +4967,19 @@ 0x8085CFCC:("D_8085CFCC","UNK_TYPE1","",0x1), 0x8085CFD4:("D_8085CFD4","UNK_TYPE1","",0x1), 0x8085CFDC:("D_8085CFDC","UNK_TYPE1","",0x1), - 0x8085CFE4:("D_8085CFE4","UNK_TYPE1","",0x1), - 0x8085CFEC:("D_8085CFEC","UNK_TYPE1","",0x1), - 0x8085CFF8:("D_8085CFF8","UNK_TYPE1","",0x1), - 0x8085D004:("D_8085D004","UNK_TYPE1","",0x1), - 0x8085D00C:("D_8085D00C","UNK_TYPE1","",0x1), - 0x8085D018:("D_8085D018","UNK_TYPE1","",0x1), - 0x8085D01C:("D_8085D01C","UNK_TYPE1","",0x1), - 0x8085D028:("D_8085D028","UNK_TYPE1","",0x1), - 0x8085D034:("D_8085D034","UNK_TYPE1","",0x1), - 0x8085D044:("D_8085D044","UNK_TYPE1","",0x1), - 0x8085D048:("D_8085D048","UNK_TYPE1","",0x1), - 0x8085D050:("D_8085D050","UNK_TYPE1","",0x1), - 0x8085D054:("D_8085D054","UNK_PTR","",0x4), + 0x8085CFE4:("sPlayerActionChangeList1","UNK_TYPE1","",0x1), + 0x8085CFEC:("sPlayerActionChangeList2","UNK_TYPE1","",0x1), + 0x8085CFF8:("sPlayerActionChangeList3","UNK_TYPE1","",0x1), + 0x8085D004:("sPlayerActionChangeList4","UNK_TYPE1","",0x1), + 0x8085D00C:("sPlayerActionChangeList5","UNK_TYPE1","",0x1), + 0x8085D018:("sPlayerActionChangeList6","UNK_TYPE1","",0x1), + 0x8085D01C:("sPlayerActionChangeList7","UNK_TYPE1","",0x1), + 0x8085D028:("sPlayerActionChangeList8","UNK_TYPE1","",0x1), + 0x8085D034:("sPlayerActionChangeList9","UNK_TYPE1","",0x1), + 0x8085D044:("sPlayerActionChangeList10","UNK_TYPE1","",0x1), + 0x8085D048:("sPlayerActionChangeList11","UNK_TYPE1","",0x1), + 0x8085D050:("sPlayerActionChangeList12","UNK_TYPE1","",0x1), + 0x8085D054:("sPlayerActionChangeFuncs","UNK_PTR","",0x4), 0x8085D090:("D_8085D090","UNK_TYPE1","",0x1), 0x8085D094:("D_8085D094","UNK_TYPE1","",0x6), 0x8085D09C:("D_8085D09C","UNK_TYPE4","",0x4), From 64b1fafd33bd7092c9cd2e703c3ccc41751c01a4 Mon Sep 17 00:00:00 2001 From: engineer124 <47598039+engineer124@users.noreply.github.com> Date: Fri, 29 Sep 2023 13:39:25 +1000 Subject: [PATCH 05/16] Animation Cleanup: En_H* (#1399) * begin H * more cleanup --- src/overlays/actors/ovl_Boss_04/z_boss_04.c | 2 +- src/overlays/actors/ovl_Boss_04/z_boss_04.h | 2 +- .../actors/ovl_En_Bombers/z_en_bombers.c | 2 +- .../actors/ovl_En_Bombers/z_en_bombers.h | 2 +- src/overlays/actors/ovl_En_Egol/z_en_egol.c | 2 +- .../actors/ovl_En_Hanabi/z_en_hanabi.c | 1 + .../actors/ovl_En_Heishi/z_en_heishi.c | 45 +++--- .../actors/ovl_En_Heishi/z_en_heishi.h | 2 +- src/overlays/actors/ovl_En_Hg/z_en_hg.c | 55 ++++--- src/overlays/actors/ovl_En_Hgo/z_en_hgo.c | 68 +++++---- .../ovl_En_Hidden_Nuts/z_en_hidden_nuts.c | 107 ++++++++----- .../ovl_En_Hidden_Nuts/z_en_hidden_nuts.h | 9 +- .../actors/ovl_En_Hint_Skb/z_en_hint_skb.c | 113 ++++++++------ .../actors/ovl_En_Hint_Skb/z_en_hint_skb.h | 5 +- src/overlays/actors/ovl_En_Horse/z_en_horse.c | 140 ++++++++++-------- src/overlays/actors/ovl_En_Horse/z_en_horse.h | 6 +- .../z_en_horse_link_child.c | 92 ++++++------ src/overlays/actors/ovl_En_Hs/z_en_hs.c | 13 +- src/overlays/actors/ovl_En_Jg/z_en_jg.c | 16 +- src/overlays/actors/ovl_En_Pr2/z_en_pr2.c | 2 +- src/overlays/actors/ovl_En_Pr2/z_en_pr2.h | 2 +- src/overlays/actors/ovl_En_Ssh/z_en_ssh.c | 2 +- src/overlays/actors/ovl_En_Ssh/z_en_ssh.h | 2 +- tools/disasm/functions.txt | 2 +- tools/disasm/variables.txt | 4 +- 25 files changed, 406 insertions(+), 290 deletions(-) diff --git a/src/overlays/actors/ovl_Boss_04/z_boss_04.c b/src/overlays/actors/ovl_Boss_04/z_boss_04.c index 82495ea1e..c35e6e9b1 100644 --- a/src/overlays/actors/ovl_Boss_04/z_boss_04.c +++ b/src/overlays/actors/ovl_Boss_04/z_boss_04.c @@ -173,7 +173,7 @@ void Boss04_Init(Actor* thisx, PlayState* play2) { this->unk_6F8 = 1.0f; Collider_InitAndSetJntSph(play, &this->collider1, &this->actor, &sJntSphInit1, this->collider1Elements); Collider_InitAndSetJntSph(play, &this->collider2, &this->actor, &sJntSphInit2, this->collider2Elements); - SkelAnime_InitFlex(play, &this->skelAnime, &gWartSkel, &gWartIdleAnim, this->jointTable, this->morphtable, + SkelAnime_InitFlex(play, &this->skelAnime, &gWartSkel, &gWartIdleAnim, this->jointTable, this->morphTable, WART_LIMB_MAX); spA8.y = this->actor.world.pos.y + 200.0f; diff --git a/src/overlays/actors/ovl_Boss_04/z_boss_04.h b/src/overlays/actors/ovl_Boss_04/z_boss_04.h index 6aa153597..97c296b84 100644 --- a/src/overlays/actors/ovl_Boss_04/z_boss_04.h +++ b/src/overlays/actors/ovl_Boss_04/z_boss_04.h @@ -12,7 +12,7 @@ typedef struct Boss04 { /* 0x000 */ Actor actor; /* 0x144 */ SkelAnime skelAnime; /* 0x188 */ Vec3s jointTable[WART_LIMB_MAX]; - /* 0x1BE */ Vec3s morphtable[WART_LIMB_MAX]; + /* 0x1BE */ Vec3s morphTable[WART_LIMB_MAX]; /* 0x1F4 */ s16 unk_1F4; /* 0x1F6 */ u8 unk_1F6; /* 0x1F7 */ u8 unk_1F7; diff --git a/src/overlays/actors/ovl_En_Bombers/z_en_bombers.c b/src/overlays/actors/ovl_En_Bombers/z_en_bombers.c index 21d8bf309..4f4b15545 100644 --- a/src/overlays/actors/ovl_En_Bombers/z_en_bombers.c +++ b/src/overlays/actors/ovl_En_Bombers/z_en_bombers.c @@ -142,7 +142,7 @@ void EnBombers_Init(Actor* thisx, PlayState* play) { ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 19.0f); this->actor.gravity = -1.0f; SkelAnime_InitFlex(play, &this->skelAnime, &object_cs_Skel_00F82C, &gBomberIdleAnim, this->jointTable, - this->morphtable, OBJECT_CS_LIMB_MAX); + this->morphTable, OBJECT_CS_LIMB_MAX); Collider_InitAndSetCylinder(play, &this->collider, &this->actor, &sCylinderInit); this->actor.targetMode = TARGET_MODE_0; Actor_SetScale(&this->actor, 0.01f); diff --git a/src/overlays/actors/ovl_En_Bombers/z_en_bombers.h b/src/overlays/actors/ovl_En_Bombers/z_en_bombers.h index 76013781b..500fff573 100644 --- a/src/overlays/actors/ovl_En_Bombers/z_en_bombers.h +++ b/src/overlays/actors/ovl_En_Bombers/z_en_bombers.h @@ -25,7 +25,7 @@ typedef struct EnBombers { /* 0x000 */ Actor actor; /* 0x144 */ SkelAnime skelAnime; /* 0x188 */ Vec3s jointTable[OBJECT_CS_LIMB_MAX]; - /* 0x206 */ Vec3s morphtable[OBJECT_CS_LIMB_MAX]; + /* 0x206 */ Vec3s morphTable[OBJECT_CS_LIMB_MAX]; /* 0x284 */ EnBombersActionFunc actionFunc; /* 0x288 */ s16 unk_288; /* 0x28A */ s16 unk_28A; diff --git a/src/overlays/actors/ovl_En_Egol/z_en_egol.c b/src/overlays/actors/ovl_En_Egol/z_en_egol.c index 30dc3de26..89ee2e5fd 100644 --- a/src/overlays/actors/ovl_En_Egol/z_en_egol.c +++ b/src/overlays/actors/ovl_En_Egol/z_en_egol.c @@ -933,7 +933,7 @@ void EnEgol_Slam(EnEgol* this, PlayState* play) { } EnEgol_DestroyBlocks(this, play, this->rightHandPos, this->leftHandPos); } - if (this->animEndFrame <= curFrame) { + if (curFrame >= this->animEndFrame) { EnEgol_SetupSlamWait(this); } else if ((this->skelAnime.curFrame <= 17.0f) && (this->skelAnime.curFrame >= 10.0f)) { CollisionCheck_SetAT(play, &play->colChkCtx, &this->bodyCollider.base); diff --git a/src/overlays/actors/ovl_En_Hanabi/z_en_hanabi.c b/src/overlays/actors/ovl_En_Hanabi/z_en_hanabi.c index 841e6f539..85000e5cb 100644 --- a/src/overlays/actors/ovl_En_Hanabi/z_en_hanabi.c +++ b/src/overlays/actors/ovl_En_Hanabi/z_en_hanabi.c @@ -194,6 +194,7 @@ void EnHanabi_Init(Actor* thisx, PlayState* play2) { EnHanabi* this = THIS; s32 i; + //! FAKE: if (1) {} Actor_SetScale(thisx, 1.0f); diff --git a/src/overlays/actors/ovl_En_Heishi/z_en_heishi.c b/src/overlays/actors/ovl_En_Heishi/z_en_heishi.c index 83973d9e9..19c2a34a8 100644 --- a/src/overlays/actors/ovl_En_Heishi/z_en_heishi.c +++ b/src/overlays/actors/ovl_En_Heishi/z_en_heishi.c @@ -20,14 +20,6 @@ void EnHeishi_SetHeadRotation(EnHeishi* this); void EnHeishi_SetupIdle(EnHeishi* this); void EnHeishi_Idle(EnHeishi* this, PlayState* play); -typedef enum { - /* 0 */ HEISHI_ANIM_STAND_HAND_ON_HIP, - /* 1 */ HEISHI_ANIM_CHEER_WITH_SPEAR, - /* 2 */ HEISHI_ANIM_WAVE, - /* 3 */ HEISHI_ANIM_SIT_AND_REACH, - /* 4 */ HEISHI_ANIM_STAND_UP -} EnHeishiAnimation; - ActorInit En_Heishi_InitVars = { ACTOR_EN_HEISHI, ACTORCAT_NPC, @@ -97,19 +89,36 @@ void EnHeishi_Destroy(Actor* thisx, PlayState* play) { Collider_DestroyCylinder(play, &this->colliderCylinder); } +typedef enum EnHeishiAnimation { + /* 0 */ HEISHI_ANIM_STAND_HAND_ON_HIP, + /* 1 */ HEISHI_ANIM_CHEER_WITH_SPEAR, + /* 2 */ HEISHI_ANIM_WAVE, + /* 3 */ HEISHI_ANIM_SIT_AND_REACH, + /* 4 */ HEISHI_ANIM_STAND_UP, + /* 5 */ HEISHI_ANIM_MAX +} EnHeishiAnimation; + +static AnimationHeader* sAnimations[HEISHI_ANIM_MAX] = { + &gSoldierStandHandOnHip, // HEISHI_ANIM_STAND_HAND_ON_HIP + &gSoldierCheerWithSpear, // HEISHI_ANIM_CHEER_WITH_SPEAR + &gSoldierWave, // HEISHI_ANIM_WAVE + &gSoldierSitAndReach, // HEISHI_ANIM_SIT_AND_REACH + &gSoldierStandUp, // HEISHI_ANIM_STAND_UP +}; + +static u8 sAnimationModes[HEISHI_ANIM_MAX] = { + ANIMMODE_LOOP, // HEISHI_ANIM_STAND_HAND_ON_HIP + ANIMMODE_LOOP, // HEISHI_ANIM_CHEER_WITH_SPEAR + ANIMMODE_LOOP, // HEISHI_ANIM_WAVE + ANIMMODE_LOOP, // HEISHI_ANIM_SIT_AND_REACH + ANIMMODE_ONCE, // HEISHI_ANIM_STAND_UP +}; + void EnHeishi_ChangeAnim(EnHeishi* this, s32 animIndex) { - static AnimationHeader* sAnimations[] = { - &gSoldierStandHandOnHip, &gSoldierCheerWithSpear, &gSoldierWave, &gSoldierSitAndReach, &gSoldierStandUp, - }; - static u8 sAnimationModes[] = { - ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_ONCE, ANIMMODE_LOOP, - ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_LOOP, - ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_LOOP, - }; this->animIndex = animIndex; - this->frameCount = Animation_GetLastFrame(sAnimations[this->animIndex]); - Animation_Change(&this->skelAnime, sAnimations[this->animIndex], 1.0f, 0.0f, this->frameCount, + this->animEndFrame = Animation_GetLastFrame(sAnimations[this->animIndex]); + Animation_Change(&this->skelAnime, sAnimations[this->animIndex], 1.0f, 0.0f, this->animEndFrame, sAnimationModes[this->animIndex], -10.0f); } diff --git a/src/overlays/actors/ovl_En_Heishi/z_en_heishi.h b/src/overlays/actors/ovl_En_Heishi/z_en_heishi.h index 1758ceae6..4d886cb3c 100644 --- a/src/overlays/actors/ovl_En_Heishi/z_en_heishi.h +++ b/src/overlays/actors/ovl_En_Heishi/z_en_heishi.h @@ -25,7 +25,7 @@ typedef struct EnHeishi { /* 0x26C */ s32 shouldSetHeadRotation; /* 0x270 */ s16 timer; /* 0x272 */ s16 yawTowardsPlayer; - /* 0x274 */ f32 frameCount; + /* 0x274 */ f32 animEndFrame; /* 0x278 */ s16 unk278; // set and not used /* 0x27C */ UNK_TYPE1 unk_27C[0x8]; /* 0x284 */ ColliderCylinder colliderCylinder; diff --git a/src/overlays/actors/ovl_En_Hg/z_en_hg.c b/src/overlays/actors/ovl_En_Hg/z_en_hg.c index 2c652f11c..ded070de4 100644 --- a/src/overlays/actors/ovl_En_Hg/z_en_hg.c +++ b/src/overlays/actors/ovl_En_Hg/z_en_hg.c @@ -29,17 +29,6 @@ void EnHg_HandleCsAction(EnHg* this, PlayState* play); s32 EnHg_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx); void EnHg_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx); -typedef enum { - /* 0 */ HG_ANIM_IDLE, - /* 1 */ HG_ANIM_LURCH_FORWARD, - /* 2 */ HG_ANIM_RECOIL, - /* 3 */ HG_ANIM_LEAN_FORWARD, - /* 4 */ HG_ANIM_REACH_FORWARD, - /* 5 */ HG_ANIM_CURL_UP, - /* 6 */ HG_ANIM_CROUCHED_PANIC, - /* 7 */ HG_ANIM_PANIC -} HgAnimation; - typedef enum { /* 0 */ HG_CS_FIRST_ENCOUNTER, /* 1 */ HG_CS_GET_MASK, @@ -118,15 +107,27 @@ static CollisionCheckInfoInit2 sColChkInfoInit2 = { 0, 0, 0, 0, 0x80, }; -static AnimationInfo sAnimationInfo[] = { - { &gPamelasFatherIdleAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -4.0f }, - { &gPamelasFatherLurchForwardAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -4.0f }, - { &gPamelasFatherRecoilFromHitAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -4.0f }, - { &gPamelasFatherLeanForwardAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, 0.0f }, - { &gPamelasFatherReachForwardAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, - { &gPamelasFatherCurlUpAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, 0.0f }, - { &gPamelasFatherCrouchedPanicAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, - { &gPamelasFatherPanicAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, +typedef enum { + /* 0 */ HG_ANIM_IDLE, + /* 1 */ HG_ANIM_LURCH_FORWARD, + /* 2 */ HG_ANIM_RECOIL, + /* 3 */ HG_ANIM_LEAN_FORWARD, + /* 4 */ HG_ANIM_REACH_FORWARD, + /* 5 */ HG_ANIM_CURL_UP, + /* 6 */ HG_ANIM_CROUCHED_PANIC, + /* 7 */ HG_ANIM_PANIC, + /* 8 */ HG_ANIM_MAX +} HgAnimation; + +static AnimationInfo sAnimationInfo[HG_ANIM_MAX] = { + { &gPamelasFatherIdleAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -4.0f }, // HG_ANIM_IDLE + { &gPamelasFatherLurchForwardAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -4.0f }, // HG_ANIM_LURCH_FORWARD + { &gPamelasFatherRecoilFromHitAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -4.0f }, // HG_ANIM_RECOIL + { &gPamelasFatherLeanForwardAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, 0.0f }, // HG_ANIM_LEAN_FORWARD + { &gPamelasFatherReachForwardAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, // HG_ANIM_REACH_FORWARD + { &gPamelasFatherCurlUpAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, 0.0f }, // HG_ANIM_CURL_UP + { &gPamelasFatherCrouchedPanicAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, // HG_ANIM_CROUCHED_PANIC + { &gPamelasFatherPanicAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, // HG_ANIM_PANIC }; static u32 sHasSoundPlayed = false; @@ -192,7 +193,7 @@ void EnHg_ChasePlayer(EnHg* this, PlayState* play) { s32 pad; this->actor.speed = 1.6f; - if (!(player->stateFlags2 & PLAYER_STATE2_8000000) && Message_GetState(&play->msgCtx) == TEXT_STATE_NONE) { + if (!(player->stateFlags2 & PLAYER_STATE2_8000000) && (Message_GetState(&play->msgCtx) == TEXT_STATE_NONE)) { if (((this->skelAnime.curFrame > 9.0f) && (this->skelAnime.curFrame < 16.0f)) || ((this->skelAnime.curFrame > 44.0f) && (this->skelAnime.curFrame < 51.0f))) { Actor_MoveWithGravity(&this->actor); @@ -233,7 +234,6 @@ void EnHg_ReactToHit(EnHg* this, PlayState* play) { void EnHg_HandleTatlDialog(EnHg* this, PlayState* play) { if (Message_GetState(&play->msgCtx) == TEXT_STATE_NONE) { if (Actor_ProcessTalkRequest(&this->actor, &play->state)) { - // "...Sort of looks different..." Message_StartTextbox(play, 0x24F, &this->actor); } else { Actor_OfferTalk(&this->actor, play, 80.0f); @@ -295,7 +295,7 @@ void EnHg_HandleCsAction(EnHg* this, PlayState* play) { this->csIdList[3] = play->csCtx.actorCues[cueChannel]->id; switch (play->csCtx.actorCues[cueChannel]->id) { case 1: - this->animIndex = 0; + this->animIndex = HG_ANIM_IDLE; Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, HG_ANIM_IDLE); break; @@ -329,6 +329,9 @@ void EnHg_HandleCsAction(EnHg* this, PlayState* play) { SET_WEEKEVENTREG(WEEKEVENTREG_75_20); Actor_Kill(&this->actor); break; + + default: + break; } } else if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) { switch (this->animIndex) { @@ -341,6 +344,9 @@ void EnHg_HandleCsAction(EnHg* this, PlayState* play) { this->animIndex = HG_ANIM_CROUCHED_PANIC; Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, HG_ANIM_CROUCHED_PANIC); break; + + default: + break; } } @@ -360,6 +366,9 @@ void EnHg_HandleCsAction(EnHg* this, PlayState* play) { Actor_PlaySfx_Flagged(&this->actor, NA_SE_EN_HALF_REDEAD_SCREAME - SFX_FLAG); } break; + + default: + break; } Cutscene_ActorTranslateAndYaw(&this->actor, play, cueChannel); diff --git a/src/overlays/actors/ovl_En_Hgo/z_en_hgo.c b/src/overlays/actors/ovl_En_Hgo/z_en_hgo.c index 15bfd598b..c4d9c0371 100644 --- a/src/overlays/actors/ovl_En_Hgo/z_en_hgo.c +++ b/src/overlays/actors/ovl_En_Hgo/z_en_hgo.c @@ -38,16 +38,6 @@ typedef enum { /* 2 */ HGO_EYE_CLOSED } EyeState; -typedef enum { - /* 0 */ HGO_ANIM_ARMS_FOLDED, - /* 1 */ HGO_ANIM_ASTONISHED, - /* 2 */ HGO_ANIM_KNEEL_DOWN_AND_HUG, - /* 3 */ HGO_ANIM_CONSOLE, - /* 4 */ HGO_ANIM_CONSOLE_HEAD_UP, - /* 5 */ HGO_ANIM_REACH_DOWN_TO_LIFT, - /* 6 */ HGO_ANIM_TOSS -} HgoAnimation; - ActorInit En_Hgo_InitVars = { ACTOR_EN_HGO, ACTORCAT_NPC, @@ -60,14 +50,25 @@ ActorInit En_Hgo_InitVars = { (ActorFunc)EnHgo_Draw, }; -static AnimationInfo sAnimationInfo[] = { - { &gPamelasFatherArmsFoldedAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -4.0f }, - { &gPamelasFatherAstonishedAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, - { &gPamelasFatherKneelDownAndHugAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, 0.0f }, - { &gPamelasFatherConsoleAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, - { &gPamelasFatherConsoleHeadUpAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, - { &gPamelasFatherReachDownToLiftAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, 0.0f }, - { &gPamelasFatherTossAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, +typedef enum { + /* 0 */ HGO_ANIM_ARMS_FOLDED, + /* 1 */ HGO_ANIM_ASTONISHED, + /* 2 */ HGO_ANIM_KNEEL_DOWN_AND_HUG, + /* 3 */ HGO_ANIM_CONSOLE, + /* 4 */ HGO_ANIM_CONSOLE_HEAD_UP, + /* 5 */ HGO_ANIM_REACH_DOWN_TO_LIFT, + /* 6 */ HGO_ANIM_TOSS, + /* 7 */ HGO_ANIM_MAX +} HgoAnimation; + +static AnimationInfo sAnimationInfo[HGO_ANIM_MAX] = { + { &gPamelasFatherArmsFoldedAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -4.0f }, // HGO_ANIM_ARMS_FOLDED + { &gPamelasFatherAstonishedAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, // HGO_ANIM_ASTONISHED + { &gPamelasFatherKneelDownAndHugAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, 0.0f }, // HGO_ANIM_KNEEL_DOWN_AND_HUG + { &gPamelasFatherConsoleAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, // HGO_ANIM_CONSOLE + { &gPamelasFatherConsoleHeadUpAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, // HGO_ANIM_CONSOLE_HEAD_UP + { &gPamelasFatherReachDownToLiftAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, 0.0f }, // HGO_ANIM_REACH_DOWN_TO_LIFT + { &gPamelasFatherTossAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, // HGO_ANIM_TOSS }; static ColliderCylinderInit sCylinderInit = { @@ -109,6 +110,7 @@ void EnHgo_Init(Actor* thisx, PlayState* play) { this->textId = 0; this->talkFlags = TALK_FLAG_NONE; this->isInCutscene = false; + if (CHECK_WEEKEVENTREG(WEEKEVENTREG_75_20) || CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_STONE_TOWER_TEMPLE)) { EnHgo_SetupTalk(this); } else { @@ -143,7 +145,7 @@ void EnHgo_UpdateCollision(EnHgo* this, PlayState* play) { } void EnHgo_SetupTalk(EnHgo* this) { - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 0); + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, HGO_ANIM_ARMS_FOLDED); this->actionFunc = EnHgo_Talk; } @@ -206,6 +208,9 @@ void EnHgo_DefaultDialogueHandler(EnHgo* this, PlayState* play) { EnHgo_SetupTalk(this); } break; + + default: + break; } Math_SmoothStepToS(&this->actor.world.rot.y, this->actor.yawTowardsPlayer, 0xA, 0x71C, 0xB6); @@ -271,6 +276,9 @@ void EnHgo_HandlePlayerChoice(EnHgo* this, PlayState* play) { Message_CloseTextbox(play); EnHgo_SetupTalk(this); break; + + default: + break; } } } @@ -285,33 +293,36 @@ s32 EnHgo_HandleCsAction(EnHgo* this, PlayState* play) { switch (play->csCtx.actorCues[cueChannel]->id) { case 1: this->animIndex = HGO_ANIM_ARMS_FOLDED; - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 0); + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, HGO_ANIM_ARMS_FOLDED); break; case 2: this->actor.draw = EnHgo_Draw; this->animIndex = HGO_ANIM_ASTONISHED; - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 1); + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, HGO_ANIM_ASTONISHED); break; case 3: this->animIndex = HGO_ANIM_KNEEL_DOWN_AND_HUG; - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 2); + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, HGO_ANIM_KNEEL_DOWN_AND_HUG); break; case 4: this->animIndex = HGO_ANIM_CONSOLE; - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 3); + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, HGO_ANIM_CONSOLE); break; case 5: this->animIndex = HGO_ANIM_CONSOLE_HEAD_UP; - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 4); + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, HGO_ANIM_CONSOLE_HEAD_UP); break; case 6: this->animIndex = HGO_ANIM_REACH_DOWN_TO_LIFT; - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 5); + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, HGO_ANIM_REACH_DOWN_TO_LIFT); + break; + + default: break; } } else if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) { @@ -328,12 +339,15 @@ s32 EnHgo_HandleCsAction(EnHgo* this, PlayState* play) { case HGO_ANIM_KNEEL_DOWN_AND_HUG: this->animIndex = HGO_ANIM_CONSOLE; - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 3); + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, HGO_ANIM_CONSOLE); break; case HGO_ANIM_REACH_DOWN_TO_LIFT: this->animIndex = HGO_ANIM_TOSS; - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 6); + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, HGO_ANIM_TOSS); + + default: + break; } } diff --git a/src/overlays/actors/ovl_En_Hidden_Nuts/z_en_hidden_nuts.c b/src/overlays/actors/ovl_En_Hidden_Nuts/z_en_hidden_nuts.c index e07dfb8a9..5d1e0ee24 100644 --- a/src/overlays/actors/ovl_En_Hidden_Nuts/z_en_hidden_nuts.c +++ b/src/overlays/actors/ovl_En_Hidden_Nuts/z_en_hidden_nuts.c @@ -6,7 +6,6 @@ #include "z_en_hidden_nuts.h" #include "overlays/effects/ovl_Effect_Ss_Hahen/z_eff_ss_hahen.h" -#include "objects/object_hintnuts/object_hintnuts.h" #define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_2000000) @@ -63,15 +62,41 @@ static ColliderCylinderInit sCylinderInit = { { 30, 20, 0, { 0, 0, 0 } }, }; -static AnimationHeader* D_80BDC0FC[] = { - &object_hintnuts_Anim_000168, &object_hintnuts_Anim_0024CC, &object_hintnuts_Anim_0026C4, - &object_hintnuts_Anim_002894, &object_hintnuts_Anim_002B90, &object_hintnuts_Anim_002F7C, - &object_hintnuts_Anim_003128, &object_hintnuts_Anim_0029BC, &object_hintnuts_Anim_0024CC, +typedef enum EnHiddenNutsAnimation { + /* 0 */ ENHIDDENNUTS_ANIM_0, + /* 1 */ ENHIDDENNUTS_ANIM_1, + /* 2 */ ENHIDDENNUTS_ANIM_2, + /* 3 */ ENHIDDENNUTS_ANIM_3, + /* 4 */ ENHIDDENNUTS_ANIM_4, + /* 5 */ ENHIDDENNUTS_ANIM_5, + /* 6 */ ENHIDDENNUTS_ANIM_6, + /* 7 */ ENHIDDENNUTS_ANIM_7, + /* 8 */ ENHIDDENNUTS_ANIM_8, + /* 9 */ ENHIDDENNUTS_ANIM_MAX +} EnHiddenNutsAnimation; + +static AnimationHeader* sAnimations[ENHIDDENNUTS_ANIM_MAX] = { + &object_hintnuts_Anim_000168, // ENHIDDENNUTS_ANIM_0 + &object_hintnuts_Anim_0024CC, // ENHIDDENNUTS_ANIM_1 + &object_hintnuts_Anim_0026C4, // ENHIDDENNUTS_ANIM_2 + &object_hintnuts_Anim_002894, // ENHIDDENNUTS_ANIM_3 + &object_hintnuts_Anim_002B90, // ENHIDDENNUTS_ANIM_4 + &object_hintnuts_Anim_002F7C, // ENHIDDENNUTS_ANIM_5 + &object_hintnuts_Anim_003128, // ENHIDDENNUTS_ANIM_6 + &object_hintnuts_Anim_0029BC, // ENHIDDENNUTS_ANIM_7 + &object_hintnuts_Anim_0024CC, // ENHIDDENNUTS_ANIM_8 }; -u8 D_80BDC120[] = { - ANIMMODE_ONCE, ANIMMODE_ONCE, ANIMMODE_ONCE, ANIMMODE_LOOP, ANIMMODE_ONCE, - ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_ONCE, ANIMMODE_ONCE, ANIMMODE_LOOP, +static u8 sAnimationModes[ENHIDDENNUTS_ANIM_MAX] = { + ANIMMODE_ONCE, // ENHIDDENNUTS_ANIM_0 + ANIMMODE_ONCE, // ENHIDDENNUTS_ANIM_1 + ANIMMODE_ONCE, // ENHIDDENNUTS_ANIM_2 + ANIMMODE_LOOP, // ENHIDDENNUTS_ANIM_3 + ANIMMODE_ONCE, // ENHIDDENNUTS_ANIM_4 + ANIMMODE_LOOP, // ENHIDDENNUTS_ANIM_5 + ANIMMODE_LOOP, // ENHIDDENNUTS_ANIM_6 + ANIMMODE_ONCE, // ENHIDDENNUTS_ANIM_7 + ANIMMODE_ONCE, // ENHIDDENNUTS_ANIM_8 }; void EnHiddenNuts_Init(Actor* thisx, PlayState* play) { @@ -79,7 +104,7 @@ void EnHiddenNuts_Init(Actor* thisx, PlayState* play) { ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 20.0f); SkelAnime_Init(play, &this->skelAnime, &object_hintnuts_Skel_0023B8.sh, &object_hintnuts_Anim_0024CC, - this->jointTable, this->morphTable, 10); + this->jointTable, this->morphTable, OBJECT_HINTNUTS_LIMB_MAX); Actor_SetScale(&this->actor, 0.01f); this->actor.colChkInfo.mass = MASS_IMMOVABLE; @@ -116,27 +141,29 @@ void EnHiddenNuts_Destroy(Actor* thisx, PlayState* play) { Collider_DestroyCylinder(play, &this->collider); } -void func_80BDB1B4(EnHiddenNuts* this, s32 arg1) { - f32 sp34; - f32 sp30; +void EnHiddenNuts_ChangeAnim(EnHiddenNuts* this, s32 animIndex) { + f32 startFrame; + f32 morphFrames; - this->unk_220 = arg1; - sp34 = 0.0f; - sp30 = -4.0f; - this->unk_22C = Animation_GetLastFrame(D_80BDC0FC[arg1]); - if (this->unk_220 == 1) { - sp34 = this->unk_22C; - sp30 = 0.0f; + this->animIndex = animIndex; + startFrame = 0.0f; + morphFrames = -4.0f; + this->animEndFrame = Animation_GetLastFrame(sAnimations[animIndex]); + + if (this->animIndex == ENHIDDENNUTS_ANIM_1) { + startFrame = this->animEndFrame; + morphFrames = 0.0f; } - Animation_Change(&this->skelAnime, D_80BDC0FC[this->unk_220], 1.0f, sp34, this->unk_22C, D_80BDC120[this->unk_220], - sp30); + + Animation_Change(&this->skelAnime, sAnimations[this->animIndex], 1.0f, startFrame, this->animEndFrame, + sAnimationModes[this->animIndex], morphFrames); } void func_80BDB268(EnHiddenNuts* this) { this->actor.textId = 0x234; this->unk_228 = 1600.0f; this->actor.shape.yOffset = 1600.0f; - func_80BDB1B4(this, 1); + EnHiddenNuts_ChangeAnim(this, ENHIDDENNUTS_ANIM_1); this->unk_21A = 0; this->actionFunc = func_80BDB2B8; } @@ -148,12 +175,12 @@ void func_80BDB2B8(EnHiddenNuts* this, PlayState* play) { Actor_PlaySfx(&this->actor, NA_SE_EN_NEMURI_SLEEP - SFX_FLAG); if (player->stateFlags2 & PLAYER_STATE2_8000000) { - if (this->unk_20A == 0) { + if (!this->unk_20A) { Audio_PlaySfx(NA_SE_SY_TRE_BOX_APPEAR); - this->unk_20A = 1; + this->unk_20A = true; } } else { - this->unk_20A = 0; + this->unk_20A = false; } if (Actor_ProcessTalkRequest(&this->actor, &play->state)) { @@ -263,20 +290,20 @@ void func_80BDB7E8(EnHiddenNuts* this, PlayState* play) { EffectSsHahen_SpawnBurst(play, &sp3C, 4.0f, 0, 10, 3, 15, HAHEN_OBJECT_DEFAULT, 10, NULL); Actor_PlaySfx(&this->actor, NA_SE_EN_NUTS_UP); - func_80BDB1B4(this, 7); + EnHiddenNuts_ChangeAnim(this, ENHIDDENNUTS_ANIM_7); this->actionFunc = func_80BDB8F4; } void func_80BDB8F4(EnHiddenNuts* this, PlayState* play) { f32 curFrame = this->skelAnime.curFrame; - if (this->unk_22C <= curFrame) { + if (curFrame >= this->animEndFrame) { func_80BDB930(this); } } void func_80BDB930(EnHiddenNuts* this) { - func_80BDB1B4(this, 3); + EnHiddenNuts_ChangeAnim(this, ENHIDDENNUTS_ANIM_3); this->unk_21A = 3; this->unk_228 = 500.0f; this->actionFunc = func_80BDB978; @@ -290,7 +317,7 @@ void func_80BDB978(EnHiddenNuts* this, PlayState* play) { Actor_PlaySfx(&this->actor, NA_SE_EN_NUT_FAINT); } - if (this->unk_22C <= curFrame) { + if (curFrame >= this->animEndFrame) { this->unk_224++; if (this->unk_224 >= 2) { func_80BDBA28(this, play); @@ -301,7 +328,7 @@ void func_80BDB978(EnHiddenNuts* this, PlayState* play) { void func_80BDBA28(EnHiddenNuts* this, PlayState* play) { Vec3f sp44; - func_80BDB1B4(this, 2); + EnHiddenNuts_ChangeAnim(this, ENHIDDENNUTS_ANIM_2); this->unk_228 = 0.0f; Math_Vec3f_Copy(&sp44, &this->actor.world.pos); @@ -326,10 +353,10 @@ void func_80BDBA28(EnHiddenNuts* this, PlayState* play) { void func_80BDBB48(EnHiddenNuts* this, PlayState* play) { s32 pad[3]; - f32 sp58 = this->skelAnime.curFrame; + f32 curFrame = this->skelAnime.curFrame; WaterBox* sp54; f32 sp50; - s16 sp4E = 0; + s16 sp4E = false; Vec3f sp40; if (WaterBox_GetSurface1(play, &play->colCtx, this->actor.world.pos.x, this->actor.world.pos.z, &sp50, &sp54) && @@ -346,23 +373,23 @@ void func_80BDBB48(EnHiddenNuts* this, PlayState* play) { if (Animation_OnFrame(&this->skelAnime, 0.0f) || Animation_OnFrame(&this->skelAnime, 5.0f) || Animation_OnFrame(&this->skelAnime, 10.0f)) { Actor_PlaySfx(&this->actor, NA_SE_EV_WALK_WATER); - sp4E = 1; + sp4E = true; } } - if ((sp4E != 0) && (Animation_OnFrame(&this->skelAnime, 0.0f) || Animation_OnFrame(&this->skelAnime, 5.0f) || - Animation_OnFrame(&this->skelAnime, 10.0f))) { + if (sp4E && (Animation_OnFrame(&this->skelAnime, 0.0f) || Animation_OnFrame(&this->skelAnime, 5.0f) || + Animation_OnFrame(&this->skelAnime, 10.0f))) { Actor_PlaySfx(&this->actor, NA_SE_EN_NUTS_WALK); } Math_SmoothStepToS(&this->actor.world.rot.y, Math_Vec3f_Yaw(&this->actor.world.pos, &this->unk_20C), 1, 0x1388, 0); Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.world.rot.y, 1, 0x3E8, 0); - if (this->unk_220 == 2) { - if (this->unk_22C <= sp58) { + if (this->animIndex == ENHIDDENNUTS_ANIM_2) { + if (curFrame >= this->animEndFrame) { this->actor.speed = 0.0f; this->actor.velocity.y = 0.0f; - func_80BDB1B4(this, 6); + EnHiddenNuts_ChangeAnim(this, ENHIDDENNUTS_ANIM_6); } } else { Math_ApproachF(&this->actor.world.pos.x, this->unk_20C.x, 0.5f, @@ -387,7 +414,7 @@ void func_80BDBE70(EnHiddenNuts* this, PlayState* play) { if (this->switchFlag >= 0) { Flags_SetSwitch(play, this->switchFlag); } - func_80BDB1B4(this, 8); + EnHiddenNuts_ChangeAnim(this, ENHIDDENNUTS_ANIM_8); this->unk_21A = 5; this->actionFunc = func_80BDBED4; } @@ -396,7 +423,7 @@ void func_80BDBED4(EnHiddenNuts* this, PlayState* play) { f32 curFrame = this->skelAnime.curFrame; Vec3f sp38; - if (this->unk_22C <= curFrame) { + if (curFrame >= this->animEndFrame) { Math_Vec3f_Copy(&sp38, &this->actor.world.pos); sp38.y = this->actor.floorHeight; diff --git a/src/overlays/actors/ovl_En_Hidden_Nuts/z_en_hidden_nuts.h b/src/overlays/actors/ovl_En_Hidden_Nuts/z_en_hidden_nuts.h index 03a0a52b7..df8275aa4 100644 --- a/src/overlays/actors/ovl_En_Hidden_Nuts/z_en_hidden_nuts.h +++ b/src/overlays/actors/ovl_En_Hidden_Nuts/z_en_hidden_nuts.h @@ -2,6 +2,7 @@ #define Z_EN_HIDDEN_NUTS_H #include "global.h" +#include "objects/object_hintnuts/object_hintnuts.h" struct EnHiddenNuts; @@ -16,8 +17,8 @@ typedef void (*EnHiddenNutsActionFunc)(struct EnHiddenNuts*, PlayState*); typedef struct EnHiddenNuts { /* 0x000 */ Actor actor; /* 0x144 */ SkelAnime skelAnime; - /* 0x188 */ Vec3s jointTable[10]; - /* 0x1C4 */ Vec3s morphTable[10]; + /* 0x188 */ Vec3s jointTable[OBJECT_HINTNUTS_LIMB_MAX]; + /* 0x1C4 */ Vec3s morphTable[OBJECT_HINTNUTS_LIMB_MAX]; /* 0x200 */ EnHiddenNutsActionFunc actionFunc; /* 0x204 */ Path* path; /* 0x208 */ s16 unk_208; @@ -27,11 +28,11 @@ typedef struct EnHiddenNuts { /* 0x21A */ s16 unk_21A; /* 0x21C */ s16 switchFlag; /* 0x21E */ s16 pathIndex; - /* 0x220 */ s32 unk_220; + /* 0x220 */ s32 animIndex; /* 0x224 */ s16 unk_224; /* 0x226 */ s16 csId; /* 0x228 */ f32 unk_228; - /* 0x22C */ f32 unk_22C; + /* 0x22C */ f32 animEndFrame; /* 0x230 */ UNK_TYPE1 unk230[4]; /* 0x234 */ ColliderCylinder collider; } EnHiddenNuts; // size = 0x280 diff --git a/src/overlays/actors/ovl_En_Hint_Skb/z_en_hint_skb.c b/src/overlays/actors/ovl_En_Hint_Skb/z_en_hint_skb.c index 5ad3e9dcf..f9e51b55c 100644 --- a/src/overlays/actors/ovl_En_Hint_Skb/z_en_hint_skb.c +++ b/src/overlays/actors/ovl_En_Hint_Skb/z_en_hint_skb.c @@ -6,7 +6,6 @@ #include "z_en_hint_skb.h" #include "overlays/effects/ovl_Effect_Ss_Hahen/z_eff_ss_hahen.h" -#include "objects/object_skb/object_skb.h" #define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10) @@ -126,20 +125,37 @@ static DamageTable sDamageTable = { /* Powder Keg */ DMG_ENTRY(1, 0xF), }; -static AnimationInfo sAnimationInfo[] = { - { &object_skb_Anim_0064E0, 0.96f, 0.0f, 0.0f, ANIMMODE_LOOP, -4.0f }, - { &object_skb_Anim_003584, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -1.0f }, - { &object_skb_Anim_002190, 0.6f, 0.0f, 0.0f, ANIMMODE_ONCE_INTERP, 4.0f }, - { &object_skb_Anim_002AC8, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -4.0f }, - { &object_skb_Anim_00270C, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -4.0f }, - { &object_skb_Anim_00697C, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -4.0f }, - { &object_skb_Anim_006D90, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -4.0f }, - { &object_skb_Anim_001D1C, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -4.0f }, - { &object_skb_Anim_003584, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -8.0f }, - { &object_skb_Anim_003584, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -16.0f }, - { &object_skb_Anim_002AC8, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -8.0f }, - { &object_skb_Anim_0015EC, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -8.0f }, - { &object_skb_Anim_0009E4, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -8.0f }, +typedef enum EnHinkSkbAnimation { + /* 0 */ ENHINTSKB_ANIM_0, + /* 1 */ ENHINTSKB_ANIM_1, + /* 2 */ ENHINTSKB_ANIM_2, + /* 3 */ ENHINTSKB_ANIM_3, + /* 4 */ ENHINTSKB_ANIM_4, + /* 5 */ ENHINTSKB_ANIM_5, + /* 6 */ ENHINTSKB_ANIM_6, + /* 7 */ ENHINTSKB_ANIM_7, + /* 8 */ ENHINTSKB_ANIM_8, + /* 9 */ ENHINTSKB_ANIM_9, + /* 10 */ ENHINTSKB_ANIM_10, + /* 11 */ ENHINTSKB_ANIM_11, + /* 12 */ ENHINTSKB_ANIM_12, + /* 13 */ ENHINTSKB_ANIM_MAX +} EnHinkSkbAnimation; + +static AnimationInfo sAnimationInfo[ENHINTSKB_ANIM_MAX] = { + { &object_skb_Anim_0064E0, 0.96f, 0.0f, 0.0f, ANIMMODE_LOOP, -4.0f }, // ENHINTSKB_ANIM_0 + { &object_skb_Anim_003584, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -1.0f }, // ENHINTSKB_ANIM_1 + { &object_skb_Anim_002190, 0.6f, 0.0f, 0.0f, ANIMMODE_ONCE_INTERP, 4.0f }, // ENHINTSKB_ANIM_2 + { &object_skb_Anim_002AC8, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -4.0f }, // ENHINTSKB_ANIM_3 + { &object_skb_Anim_00270C, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -4.0f }, // ENHINTSKB_ANIM_4 + { &object_skb_Anim_00697C, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -4.0f }, // ENHINTSKB_ANIM_5 + { &object_skb_Anim_006D90, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -4.0f }, // ENHINTSKB_ANIM_6 + { &object_skb_Anim_001D1C, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -4.0f }, // ENHINTSKB_ANIM_7 + { &object_skb_Anim_003584, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -8.0f }, // ENHINTSKB_ANIM_8 + { &object_skb_Anim_003584, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -16.0f }, // ENHINTSKB_ANIM_9 + { &object_skb_Anim_002AC8, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -8.0f }, // ENHINTSKB_ANIM_10 + { &object_skb_Anim_0015EC, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -8.0f }, // ENHINTSKB_ANIM_11 + { &object_skb_Anim_0009E4, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -8.0f }, // ENHINTSKB_ANIM_12 }; static InitChainEntry sInitChain[] = { @@ -153,7 +169,7 @@ void EnHintSkb_Init(Actor* thisx, PlayState* play) { ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 36.0f); SkelAnime_Init(play, &this->skelAnime, &object_skb_Skel_005EF8, &object_skb_Anim_00697C, this->jointTable, - this->morphtable, 20); + this->morphTable, OBJECT_SKB_LIMB_MAX); Collider_InitJntSph(play, &this->collider); Collider_SetJntSph(play, &this->collider, &this->actor, &sJntSphInit, this->colliderElement); CollisionCheck_SetInfo2(&this->actor.colChkInfo, &sDamageTable, &sColChkInfoInit); @@ -181,7 +197,7 @@ void func_80C1FE20(EnHintSkb* this, PlayState* play) { } void func_80C1FE30(EnHintSkb* this) { - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 0); + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENHINTSKB_ANIM_0); this->actor.speed = 1.6f; this->actionFunc = func_80C1FE80; } @@ -200,7 +216,7 @@ void func_80C1FE80(EnHintSkb* this, PlayState* play) { void func_80C1FF30(EnHintSkb* this) { this->collider.base.atFlags &= ~AT_BOUNCED; this->actor.speed = 0.0f; - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 2); + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENHINTSKB_ANIM_2); this->actionFunc = func_80C1FF88; } @@ -274,12 +290,12 @@ void func_80C2016C(EnHintSkb* this, PlayState* play) { void func_80C20274(EnHintSkb* this) { if (this->skelAnime.animation == &object_skb_Anim_00697C) { this->actor.world.rot.y = this->actor.yawTowardsPlayer; - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 8); + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENHINTSKB_ANIM_8); this->actor.gravity = -1.0f; this->actor.speed = 1.0f; } else { this->actor.world.rot.y = this->actor.yawTowardsPlayer; - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 3); + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENHINTSKB_ANIM_3); if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) { this->actor.speed = -4.0f; } @@ -317,7 +333,7 @@ void func_80C20334(EnHintSkb* this, PlayState* play) { } void func_80C20484(EnHintSkb* this) { - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 4); + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENHINTSKB_ANIM_4); this->unk_3E8 |= 4; if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) { this->actor.speed = -6.0f; @@ -349,7 +365,7 @@ void func_80C20590(EnHintSkb* this, PlayState* play) { this->drawDmgEffAlpha = 0.0f; if (this->actor.colChkInfo.health != 0) { Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 8); - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 3); + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENHINTSKB_ANIM_3); Actor_PlaySfx(&this->actor, NA_SE_EN_STALKID_DAMAGE); this->unk_3E8 |= 1; func_80C20274(this); @@ -376,7 +392,7 @@ void func_80C2069C(EnHintSkb* this, PlayState* play) { this->drawDmgEffAlpha = 0.0f; if (this->actor.colChkInfo.health != 0) { Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 8); - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 3); + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENHINTSKB_ANIM_3); Actor_PlaySfx(&this->actor, NA_SE_EN_STALKID_DAMAGE); this->unk_3E8 |= 1; func_80C20274(this); @@ -405,10 +421,10 @@ void func_80C2077C(EnHintSkb* this, PlayState* play) { this->actor.speed = 2.4f; this->actor.gravity = -1.0f; this->actor.velocity.y = 3.0f; - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 8); + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENHINTSKB_ANIM_8); } } else { - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 11); + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENHINTSKB_ANIM_11); Message_StartTextbox(play, 0x1148, &this->actor); this->unk_3E6 = 0x1148; } @@ -449,6 +465,7 @@ void func_80C208D0(EnHintSkb* this, PlayState* play) { case TEXT_STATE_NONE: case TEXT_STATE_1: case TEXT_STATE_CLOSING: + default: break; } @@ -467,7 +484,7 @@ void func_80C208D0(EnHintSkb* this, PlayState* play) { Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) { Message_StartTextbox(play, 0x1147, &this->actor); this->unk_3E6 = 0x1147; - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 0); + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENHINTSKB_ANIM_0); } } @@ -542,7 +559,7 @@ void func_80C20C24(EnHintSkb* this, PlayState* play) { case 0x1147: Message_StartTextbox(play, 0x1148, &this->actor); this->unk_3E6 = 0x1148; - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 11); + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENHINTSKB_ANIM_11); break; case 0x1148: @@ -578,6 +595,9 @@ void func_80C20C24(EnHintSkb* this, PlayState* play) { func_80C2075C(this); } break; + + default: + break; } } @@ -591,7 +611,7 @@ void func_80C20D64(EnHintSkb* this, PlayState* play) { this->actor.hintId = TATL_HINT_ID_NONE; this->actor.textId = 0; if (this->actionFunc == func_80C1FE80) { - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 12); + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENHINTSKB_ANIM_12); } func_80C2075C(this); } @@ -682,6 +702,7 @@ void func_80C20E90(EnHintSkb* this, PlayState* play) { this->unk_3E8 |= 1; func_80C20274(this); break; + case 3: if (this->actor.colChkInfo.health != 0) { Actor_PlaySfx(&this->actor, NA_SE_EN_STALKID_DAMAGE); @@ -695,6 +716,7 @@ void func_80C20E90(EnHintSkb* this, PlayState* play) { Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 8); func_80C20540(this); break; + case 4: this->drawDmgEffTimer = 40; this->drawDmgEffType = ACTOR_DRAW_DMGEFF_LIGHT_ORBS; @@ -702,14 +724,14 @@ void func_80C20E90(EnHintSkb* this, PlayState* play) { this->drawDmgEffScale = 0.5f; Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 8); Actor_PlaySfx(&this->actor, NA_SE_EN_STALKID_DAMAGE); - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 3); + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENHINTSKB_ANIM_3); func_80C2066C(this); break; case 12: case 14: this->unk_3E8 |= 1; - + // fallthrough case 15: if ((player->meleeWeaponAnimation == PLAYER_MWA_RIGHT_SLASH_1H) || (player->meleeWeaponAnimation == PLAYER_MWA_LEFT_COMBO_2H) || @@ -717,11 +739,11 @@ void func_80C20E90(EnHintSkb* this, PlayState* play) { (player->meleeWeaponAnimation == PLAYER_MWA_BACKSLASH_LEFT)) { this->unk_3E8 |= 1; } - + // fallthrough case 13: Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 8); Actor_PlaySfx(&this->actor, NA_SE_EN_STALKID_DAMAGE); - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 3); + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENHINTSKB_ANIM_3); func_80C20274(this); break; @@ -731,6 +753,7 @@ void func_80C20E90(EnHintSkb* this, PlayState* play) { case 8: case 9: case 10: + default: break; } } @@ -850,7 +873,7 @@ s32 EnHintSkb_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3 EnHintSkb* this = THIS; f32 temp_f10; - if (limbIndex == 11) { + if (limbIndex == OBJECT_SKB_LIMB_0B) { OPEN_DISPS(play->state.gfxCtx); temp_f10 = fabsf(Math_SinS(play->state.frames * 6000) * 95.0f) + 160.0f; @@ -859,13 +882,13 @@ s32 EnHintSkb_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3 gDPSetEnvColor(POLY_OPA_DISP++, (s16)temp_f10, (s16)temp_f10, (s16)temp_f10, 255); CLOSE_DISPS(play->state.gfxCtx); - } else if (limbIndex == 10) { + } else if (limbIndex == OBJECT_SKB_LIMB_0A) { Matrix_MultZero(&this->actor.focus.pos); - } else if ((limbIndex == 12) && (this->unk_3DE == 1)) { + } else if ((limbIndex == OBJECT_SKB_LIMB_0C) && (this->unk_3DE == 1)) { Matrix_RotateZS(0x71C, MTXMODE_APPLY); } - if (((limbIndex == 11) || (limbIndex == 12)) && (this->unk_3E8 & 2)) { + if (((limbIndex == OBJECT_SKB_LIMB_0B) || (limbIndex == OBJECT_SKB_LIMB_0C)) && (this->unk_3E8 & 2)) { *dList = NULL; } @@ -879,21 +902,25 @@ void EnHintSkb_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* if (!(this->unk_3E8 & 8)) { Collider_UpdateSpheres(limbIndex, &this->collider); - if ((limbIndex == 11) && (this->unk_3E8 & 1) && !(this->unk_3E8 & 2)) { + if ((limbIndex == OBJECT_SKB_LIMB_0B) && (this->unk_3E8 & 1) && !(this->unk_3E8 & 2)) { Actor_SpawnBodyParts(&this->actor, play, 1, dList); this->unk_3E8 |= 2; - } else if ((this->unk_3E8 & 4) && !(this->unk_3E8 & 8) && ((limbIndex != 11) || !(this->unk_3E8 & 1)) && - (limbIndex != 12)) { + } else if ((this->unk_3E8 & 4) && !(this->unk_3E8 & 8) && + ((limbIndex != OBJECT_SKB_LIMB_0B) || !(this->unk_3E8 & 1)) && (limbIndex != OBJECT_SKB_LIMB_0C)) { Actor_SpawnBodyParts(&this->actor, play, 1, dList); } if (this->drawDmgEffTimer != 0) { - if ((limbIndex == 2) || (limbIndex == 4) || (limbIndex == 5) || (limbIndex == 6) || (limbIndex == 7) || - (limbIndex == 8) || (limbIndex == 9) || (limbIndex == 13) || (limbIndex == 14) || (limbIndex == 15) || - (limbIndex == 16) || (limbIndex == 17) || (limbIndex == 18)) { + if ((limbIndex == OBJECT_SKB_LIMB_02) || (limbIndex == OBJECT_SKB_LIMB_04) || + (limbIndex == OBJECT_SKB_LIMB_05) || (limbIndex == OBJECT_SKB_LIMB_06) || + (limbIndex == OBJECT_SKB_LIMB_07) || (limbIndex == OBJECT_SKB_LIMB_08) || + (limbIndex == OBJECT_SKB_LIMB_09) || (limbIndex == OBJECT_SKB_LIMB_0D) || + (limbIndex == OBJECT_SKB_LIMB_0E) || (limbIndex == OBJECT_SKB_LIMB_0F) || + (limbIndex == OBJECT_SKB_LIMB_10) || (limbIndex == OBJECT_SKB_LIMB_11) || + (limbIndex == OBJECT_SKB_LIMB_12)) { Matrix_MultZero(&this->bodyPartsPos[this->bodyPartsCount]); this->bodyPartsCount++; - } else if ((limbIndex == 11) && !(this->unk_3E8 & 2)) { + } else if ((limbIndex == OBJECT_SKB_LIMB_0B) && !(this->unk_3E8 & 2)) { Matrix_MultVec3f(&D_80C21E70, &this->bodyPartsPos[this->bodyPartsCount]); this->bodyPartsCount++; } diff --git a/src/overlays/actors/ovl_En_Hint_Skb/z_en_hint_skb.h b/src/overlays/actors/ovl_En_Hint_Skb/z_en_hint_skb.h index e263b9de0..95576210d 100644 --- a/src/overlays/actors/ovl_En_Hint_Skb/z_en_hint_skb.h +++ b/src/overlays/actors/ovl_En_Hint_Skb/z_en_hint_skb.h @@ -2,6 +2,7 @@ #define Z_EN_HINT_SKB_H #include "global.h" +#include "objects/object_skb/object_skb.h" struct EnHintSkb; @@ -37,8 +38,8 @@ typedef struct EnHintSkb { /* 0x2D4 */ f32 drawDmgEffAlpha; /* 0x2D8 */ f32 drawDmgEffScale; /* 0x2DC */ s32 bodyPartsCount; - /* 0x2E0 */ Vec3s jointTable[20]; - /* 0x358 */ Vec3s morphtable[20]; + /* 0x2E0 */ Vec3s jointTable[OBJECT_SKB_LIMB_MAX]; + /* 0x358 */ Vec3s morphTable[OBJECT_SKB_LIMB_MAX]; /* 0x3D0 */ UNK_TYPE1 unk3D0[0xC]; /* 0x3DC */ s16 unk_3DC; /* 0x3DE */ s16 unk_3DE; diff --git a/src/overlays/actors/ovl_En_Horse/z_en_horse.c b/src/overlays/actors/ovl_En_Horse/z_en_horse.c index 00a5fd3b1..fe386b2ff 100644 --- a/src/overlays/actors/ovl_En_Horse/z_en_horse.c +++ b/src/overlays/actors/ovl_En_Horse/z_en_horse.c @@ -40,10 +40,10 @@ void EnHorse_StartReversing(EnHorse* this); void EnHorse_StartLowJump(EnHorse* this, PlayState* play); void EnHorse_StartHighJump(EnHorse* this, PlayState* play); void EnHorse_InitInactive(EnHorse* this); -void EnHorse_ChangeIdleAnimation(EnHorse* this, s32 anim, f32 morphFrames); +void EnHorse_ChangeIdleAnimation(EnHorse* this, s32 animIndex, f32 morphFrames); void EnHorse_ResetIdleAnimation(EnHorse* this); void EnHorse_StartIdleRidable(EnHorse* this); -void EnHorse_StartMovingAnimation(EnHorse* this, s32 anim, f32 morphFrames, f32 startFrames); +void EnHorse_StartMovingAnimation(EnHorse* this, s32 animIndex, f32 morphFrames, f32 startFrames); void EnHorse_SetFollowAnimation(EnHorse* this, PlayState* play); void EnHorse_InitIngoHorse(EnHorse* this); void EnHorse_UpdateIngoHorseAnim(EnHorse* this); @@ -109,33 +109,56 @@ typedef struct { /* 0x4 */ RaceWaypoint* waypoints; } RaceInfo; // size = 0x8 -static AnimationHeader* sEponaAnimations[] = { - &gEponaIdleAnim, - &gEponaWhinnyAnim, - &object_horse_link_child_Anim_005F64, - &object_horse_link_child_Anim_004DE8, - &gEponaWalkAnim, - &gEponaTrotAnim, - &gEponaGallopAnim, - &object_horse_link_child_Anim_0035B0, - &object_horse_link_child_Anim_003D38, +static AnimationHeader* sEponaAnimations[ENHORSE_ANIM_MAX] = { + &gEponaIdleAnim, // ENHORSE_ANIM_IDLE + &gEponaWhinnyAnim, // ENHORSE_ANIM_WHINNY + &object_horse_link_child_Anim_005F64, // ENHORSE_ANIM_STOPPING + &object_horse_link_child_Anim_004DE8, // ENHORSE_ANIM_REARING + &gEponaWalkAnim, // ENHORSE_ANIM_WALK + &gEponaTrotAnim, // ENHORSE_ANIM_TROT + &gEponaGallopAnim, // ENHORSE_ANIM_GALLOP + &object_horse_link_child_Anim_0035B0, // ENHORSE_ANIM_LOW_JUMP + &object_horse_link_child_Anim_003D38, // ENHORSE_ANIM_HIGH_JUMP }; -static AnimationHeader* sHniAnimations[] = { - &gHorseIdleAnim, &gHorseShakeHeadAnim, &gHorseStopAnim, &gHorseWhinnyAnim, &gHorseWalkAnim, - &gHorseTrotAnim, &gHorseGallopAnim, &gHorseJumpLowAnim, &gHorseJumpHighAnim, +static AnimationHeader* sHniAnimations[ENHORSE_ANIM_MAX] = { + &gHorseIdleAnim, // ENHORSE_ANIM_IDLE + &gHorseShakeHeadAnim, // ENHORSE_ANIM_WHINNY + &gHorseStopAnim, // ENHORSE_ANIM_STOPPING + &gHorseWhinnyAnim, // ENHORSE_ANIM_REARING @TODO: Does not line up + &gHorseWalkAnim, // ENHORSE_ANIM_WALK + &gHorseTrotAnim, // ENHORSE_ANIM_TROT + &gHorseGallopAnim, // ENHORSE_ANIM_GALLOP + &gHorseJumpLowAnim, // ENHORSE_ANIM_LOW_JUMP + &gHorseJumpHighAnim, // ENHORSE_ANIM_HIGH_JUMP }; -static AnimationHeader** sAnimationHeaders[] = { - NULL, NULL, sEponaAnimations, sHniAnimations, sHniAnimations, +static AnimationHeader** sAnimationHeaders[HORSE_TYPE_MAX] = { + NULL, // HORSE_TYPE_EPONA + NULL, // HORSE_TYPE_HNI + sEponaAnimations, // HORSE_TYPE_2 + sHniAnimations, // HORSE_TYPE_BANDIT + sHniAnimations, // HORSE_TYPE_DONKEY }; -static f32 sPlaybackSpeeds[] = { - 2.0f / 3.0f, 2.0f / 3.0f, 3.0f / 3.0f, 3.0f / 3.0f, 3.0f / 3.0f, 3.0f / 3.0f, 3.0f / 3.0f, 2.0f / 3.0f, 2.0f / 3.0f, +static f32 sPlaybackSpeeds[ENHORSE_ANIM_MAX] = { + 2.0f / 3.0f, // ENHORSE_ANIM_IDLE + 2.0f / 3.0f, // ENHORSE_ANIM_WHINNY + 3.0f / 3.0f, // ENHORSE_ANIM_STOPPING + 3.0f / 3.0f, // ENHORSE_ANIM_REARING + 3.0f / 3.0f, // ENHORSE_ANIM_WALK + 3.0f / 3.0f, // ENHORSE_ANIM_TROT + 3.0f / 3.0f, // ENHORSE_ANIM_GALLOP + 2.0f / 3.0f, // ENHORSE_ANIM_LOW_JUMP + 2.0f / 3.0f, // ENHORSE_ANIM_HIGH_JUMP }; -static SkeletonHeader* sSkeletonHeaders[] = { - NULL, NULL, &gEponaSkel, NULL, NULL, +static SkeletonHeader* sSkeletonHeaders[HORSE_TYPE_MAX] = { + NULL, // HORSE_TYPE_EPONA + NULL, // HORSE_TYPE_HNI + &gEponaSkel, // HORSE_TYPE_2 + NULL, // HORSE_TYPE_BANDIT + NULL, // HORSE_TYPE_DONKEY }; ActorInit En_Horse_InitVars = { @@ -570,7 +593,8 @@ void EnHorse_IdleAnimSounds(EnHorse* this, PlayState* play) { } else { Audio_PlaySfx_AtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_SANDDUST); } - } else if ((this->animIndex == 3) && (this->curFrame > 25.0f) && !(this->stateFlags & ENHORSE_LAND2_SOUND)) { + } else if ((this->animIndex == ENHORSE_ANIM_REARING) && (this->curFrame > 25.0f) && + !(this->stateFlags & ENHORSE_LAND2_SOUND)) { this->stateFlags |= ENHORSE_LAND2_SOUND; if (this->type == HORSE_TYPE_2) { Audio_PlaySfx_AtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_LAND2); @@ -836,7 +860,7 @@ void EnHorse_Init(Actor* thisx, PlayState* play2) { Skin_Init(&play->state, &this->skin, sSkeletonHeaders[this->type], sAnimationHeaders[this->type][0]); } - this->animIndex = 0; + this->animIndex = ENHORSE_ANIM_IDLE; this->numBoosts = 6; this->boostRegenTime = 0; this->postDrawFunc = NULL; @@ -1900,21 +1924,21 @@ void EnHorse_Inactive(EnHorse* this, PlayState* play) { } } -void EnHorse_PlayIdleAnimation(EnHorse* this, s32 anim, f32 morphFrames, f32 startFrames) { +void EnHorse_PlayIdleAnimation(EnHorse* this, s32 animIndex, f32 morphFrames, f32 startFrames) { this->action = ENHORSE_ACTION_IDLE; this->actor.speed = 0.0f; - if ((anim != ENHORSE_ANIM_IDLE) && (anim != ENHORSE_ANIM_WHINNY) && (anim != ENHORSE_ANIM_REARING)) { - anim = ENHORSE_ANIM_IDLE; + if ((animIndex != ENHORSE_ANIM_IDLE) && (animIndex != ENHORSE_ANIM_WHINNY) && (animIndex != ENHORSE_ANIM_REARING)) { + animIndex = ENHORSE_ANIM_IDLE; } - if (sAnimationHeaders[this->type][anim] == NULL) { - anim = ENHORSE_ANIM_IDLE; + if (sAnimationHeaders[this->type][animIndex] == NULL) { + animIndex = ENHORSE_ANIM_IDLE; } - if (anim != this->animIndex) { - this->animIndex = anim; - if (anim == ENHORSE_ANIM_IDLE) { + if (this->animIndex != animIndex) { + this->animIndex = animIndex; + if (animIndex == ENHORSE_ANIM_IDLE) { this->stateFlags &= ~ENHORSE_SANDDUST_SOUND; } else { if (this->animIndex == ENHORSE_ANIM_WHINNY) { @@ -1942,8 +1966,8 @@ void EnHorse_PlayIdleAnimation(EnHorse* this, s32 anim, f32 morphFrames, f32 sta } } -void EnHorse_ChangeIdleAnimation(EnHorse* this, s32 anim, f32 morphFrames) { - EnHorse_PlayIdleAnimation(this, anim, morphFrames, this->curFrame); +void EnHorse_ChangeIdleAnimation(EnHorse* this, s32 animIndex, f32 morphFrames) { + EnHorse_PlayIdleAnimation(this, animIndex, morphFrames, this->curFrame); } void EnHorse_ResetIdleAnimation(EnHorse* this) { @@ -1999,16 +2023,16 @@ void EnHorse_Idle(EnHorse* this, PlayState* play) { } } -void EnHorse_StartMovingAnimation(EnHorse* this, s32 anim, f32 morphFrames, f32 startFrames) { +void EnHorse_StartMovingAnimation(EnHorse* this, s32 animIndex, f32 morphFrames, f32 startFrames) { this->action = ENHORSE_ACTION_FOLLOW_PLAYER; this->stateFlags &= ~ENHORSE_TURNING_TO_PLAYER; - if ((anim != ENHORSE_ANIM_TROT) && (anim != ENHORSE_ANIM_GALLOP) && (anim != ENHORSE_ANIM_WALK)) { - anim = ENHORSE_ANIM_WALK; + if ((animIndex != ENHORSE_ANIM_TROT) && (animIndex != ENHORSE_ANIM_GALLOP) && (animIndex != ENHORSE_ANIM_WALK)) { + animIndex = ENHORSE_ANIM_WALK; } - if (anim != this->animIndex) { - this->animIndex = anim; + if (this->animIndex != animIndex) { + this->animIndex = animIndex; Animation_Change(&this->skin.skelAnime, sAnimationHeaders[this->type][this->animIndex], 1.0f, startFrames, Animation_GetLastFrame(sAnimationHeaders[this->type][this->animIndex]), ANIMMODE_ONCE, morphFrames); @@ -2019,38 +2043,38 @@ void EnHorse_StartMovingAnimation(EnHorse* this, s32 anim, f32 morphFrames, f32 } void EnHorse_SetFollowAnimation(EnHorse* this, PlayState* play) { - s32 anim = ENHORSE_ANIM_WALK; + s32 animIndex = ENHORSE_ANIM_WALK; f32 distToPlayer = Actor_WorldDistXZToActor(&this->actor, &GET_PLAYER(play)->actor); if (distToPlayer > 400.0f) { - anim = ENHORSE_ANIM_GALLOP; + animIndex = ENHORSE_ANIM_GALLOP; } else if (!(distToPlayer <= 300.0f) && (distToPlayer <= 400.0f)) { - anim = ENHORSE_ANIM_TROT; + animIndex = ENHORSE_ANIM_TROT; } if (this->animIndex == ENHORSE_ANIM_GALLOP) { if (distToPlayer > 400.0f) { - anim = ENHORSE_ANIM_GALLOP; + animIndex = ENHORSE_ANIM_GALLOP; } else { - anim = ENHORSE_ANIM_TROT; + animIndex = ENHORSE_ANIM_TROT; } } else if (this->animIndex == ENHORSE_ANIM_TROT) { if (distToPlayer > 400.0f) { - anim = ENHORSE_ANIM_GALLOP; + animIndex = ENHORSE_ANIM_GALLOP; } else if (distToPlayer < 300.0f) { - anim = ENHORSE_ANIM_WALK; + animIndex = ENHORSE_ANIM_WALK; } else { - anim = ENHORSE_ANIM_TROT; + animIndex = ENHORSE_ANIM_TROT; } } else if (this->animIndex == ENHORSE_ANIM_WALK) { if (distToPlayer > 300.0f) { - anim = ENHORSE_ANIM_TROT; + animIndex = ENHORSE_ANIM_TROT; } else { - anim = ENHORSE_ANIM_WALK; + animIndex = ENHORSE_ANIM_WALK; } } - EnHorse_StartMovingAnimation(this, anim, -3.0f, 0.0f); + EnHorse_StartMovingAnimation(this, animIndex, -3.0f, 0.0f); } void EnHorse_FollowPlayer(EnHorse* this, PlayState* play) { @@ -2155,7 +2179,7 @@ void EnHorse_InitIngoHorse(EnHorse* this) { void EnHorse_SetIngoAnimation(s32 animIndex, f32 curFrame, s32 arg2, s16* animIndexOut) { *animIndexOut = sIngoAnimIndices[animIndex]; - if (arg2 == ENIN_ANIM_1) { + if (arg2 == 1) { if (animIndex == ENHORSE_ANIM_TROT) { *animIndexOut = ENIN_ANIM_4; } else if (animIndex == ENHORSE_ANIM_GALLOP) { @@ -2286,7 +2310,7 @@ void func_80881290(EnHorse* this, PlayState* play) { void func_80881398(EnHorse* this, PlayState* play) { Vec3s* jointTable; f32 y; - s32 animeUpdated; + s32 isAnimFinished; f32 curFrame; this->stateFlags |= ENHORSE_JUMPING; @@ -2294,7 +2318,7 @@ void func_80881398(EnHorse* this, PlayState* play) { this->actor.speed = 14.0f; } - animeUpdated = SkelAnime_Update(&this->skin.skelAnime); + isAnimFinished = SkelAnime_Update(&this->skin.skelAnime); curFrame = this->skin.skelAnime.curFrame; if (curFrame > 23.0f) { @@ -2313,8 +2337,8 @@ void func_80881398(EnHorse* this, PlayState* play) { this->actor.world.pos.y = this->jumpStartY + (y * 0.01f * this->unk_528 * 0.01f); } - if (animeUpdated || ((curFrame > 17.0f) && - (this->actor.world.pos.y < ((this->actor.floorHeight - this->actor.velocity.y) + 80.0f)))) { + if (isAnimFinished || ((curFrame > 17.0f) && + (this->actor.world.pos.y < ((this->actor.floorHeight - this->actor.velocity.y) + 80.0f)))) { if (this->type == HORSE_TYPE_2) { Audio_PlaySfx_AtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_LAND); } else { @@ -2962,7 +2986,7 @@ void EnHorse_FleePlayer(EnHorse* this, PlayState* play) { f32 playerDistToHome; f32 distToPlayer; s32 nextAnimIndex = this->animIndex; - s32 animFinished; + s32 isAnimFinished; s16 yaw; if (gHorsePlayedEponasSong || (this->type == HORSE_TYPE_HNI)) { @@ -3041,7 +3065,7 @@ void EnHorse_FleePlayer(EnHorse* this, PlayState* play) { this->actor.shape.rot.y = this->actor.world.rot.y; } - animFinished = SkelAnime_Update(&this->skin.skelAnime); + isAnimFinished = SkelAnime_Update(&this->skin.skelAnime); if (((this->animIndex == ENHORSE_ANIM_IDLE) || (this->animIndex == ENHORSE_ANIM_WHINNY)) && ((nextAnimIndex == ENHORSE_ANIM_GALLOP) || (nextAnimIndex == ENHORSE_ANIM_TROT) || @@ -3054,7 +3078,7 @@ void EnHorse_FleePlayer(EnHorse* this, PlayState* play) { } else if (this->animIndex == ENHORSE_ANIM_TROT) { func_8087C178(this); } - } else if (animFinished) { + } else if (isAnimFinished) { if (nextAnimIndex == ENHORSE_ANIM_GALLOP) { func_8087C1C0(this); } else if (nextAnimIndex == ENHORSE_ANIM_TROT) { @@ -3499,7 +3523,7 @@ void EnHorse_ObstructMovement(EnHorse* this, PlayState* play, s32 obstacleType, this->actor.world.pos = this->lastPos; this->stateFlags |= ENHORSE_OBSTACLE; if (this->playerControlled == 0) { - if (this->animIndex != 3) {} + if (this->animIndex != ENHORSE_ANIM_REARING) {} } else if (this->action != ENHORSE_ACTION_MOUNTED_REARING) { if (this->stateFlags & ENHORSE_JUMPING) { this->stateFlags &= ~ENHORSE_JUMPING; diff --git a/src/overlays/actors/ovl_En_Horse/z_en_horse.h b/src/overlays/actors/ovl_En_Horse/z_en_horse.h index 75f0254fc..f3c868c85 100644 --- a/src/overlays/actors/ovl_En_Horse/z_en_horse.h +++ b/src/overlays/actors/ovl_En_Horse/z_en_horse.h @@ -93,7 +93,8 @@ typedef enum EnHorseAnimation { /* 5 */ ENHORSE_ANIM_TROT, /* 6 */ ENHORSE_ANIM_GALLOP, /* 7 */ ENHORSE_ANIM_LOW_JUMP, - /* 8 */ ENHORSE_ANIM_HIGH_JUMP + /* 8 */ ENHORSE_ANIM_HIGH_JUMP, + /* 9 */ ENHORSE_ANIM_MAX } EnHorseAnimation; typedef enum HorseType { @@ -101,7 +102,8 @@ typedef enum HorseType { /* 1 */ HORSE_TYPE_HNI, /* 2 */ HORSE_TYPE_2, /* 3 */ HORSE_TYPE_BANDIT, - /* 4 */ HORSE_TYPE_DONKEY // Cremia's donkey + /* 4 */ HORSE_TYPE_DONKEY, // Cremia's donkey + /* 5 */ HORSE_TYPE_MAX } HorseType; #define ENHORSE_PARAM_BANDIT 0x2000 diff --git a/src/overlays/actors/ovl_En_Horse_Link_Child/z_en_horse_link_child.c b/src/overlays/actors/ovl_En_Horse_Link_Child/z_en_horse_link_child.c index bba55073b..78d6f8624 100644 --- a/src/overlays/actors/ovl_En_Horse_Link_Child/z_en_horse_link_child.c +++ b/src/overlays/actors/ovl_En_Horse_Link_Child/z_en_horse_link_child.c @@ -19,7 +19,7 @@ void EnHorseLinkChild_Update(Actor* thisx, PlayState* play); void EnHorseLinkChild_Draw(Actor* thisx, PlayState* play); void EnHorseLinkChild_ActionFunc0(EnHorseLinkChild* this, PlayState* play); -void EnHorseLinkChild_SetupWaitForPlayer(EnHorseLinkChild* this, s32 nextAnimIndex); +void EnHorseLinkChild_SetupWaitForPlayer(EnHorseLinkChild* this, s32 animIndex); void EnHorseLinkChild_WaitForPlayer(EnHorseLinkChild* this, PlayState* play); void EnHorseLinkChild_SetupGreetPlayer(EnHorseLinkChild* this); void EnHorseLinkChild_GreetPlayer(EnHorseLinkChild* this, PlayState* play); @@ -51,7 +51,7 @@ typedef enum { /* 5 */ OOT_CHILD_EPONA_ANIM_MAX } OoTEponaAnimation; -AnimationHeader* sAnimations[OOT_CHILD_EPONA_ANIM_MAX] = { +static AnimationHeader* sAnimations[OOT_CHILD_EPONA_ANIM_MAX] = { &gEponaIdleAnim, // OOT_CHILD_EPONA_ANIM_IDLE &gEponaWhinnyAnim, // OOT_CHILD_EPONA_ANIM_WHINNY &gEponaWalkAnim, // OOT_CHILD_EPONA_ANIM_WALK @@ -221,7 +221,7 @@ void EnHorseLinkChild_Destroy(Actor* thisx, PlayState* play) { void EnHorseLinkChild_SetupActionFunc0(EnHorseLinkChild* this) { this->action = OOT_CHILD_EPONA_ACTION_0; this->animIndex++; - if (this->animIndex >= ARRAY_COUNT(sAnimPlaySpeeds)) { + if (this->animIndex >= OOT_CHILD_EPONA_ANIM_MAX) { this->animIndex = OOT_CHILD_EPONA_ANIM_IDLE; } Animation_PlayOnce(&this->skin.skelAnime, sAnimations[this->animIndex]); @@ -238,16 +238,16 @@ void EnHorseLinkChild_ActionFunc0(EnHorseLinkChild* this, PlayState* play) { } } -void EnHorseLinkChild_SetupWaitForPlayer(EnHorseLinkChild* this, s32 nextAnimIndex) { +void EnHorseLinkChild_SetupWaitForPlayer(EnHorseLinkChild* this, s32 animIndex) { this->action = OOT_CHILD_EPONA_ACTION_WAIT_FOR_PLAYER; this->actor.speed = 0.0f; - if ((nextAnimIndex != OOT_CHILD_EPONA_ANIM_IDLE) && (nextAnimIndex != OOT_CHILD_EPONA_ANIM_WHINNY)) { - nextAnimIndex = OOT_CHILD_EPONA_ANIM_IDLE; + if ((animIndex != OOT_CHILD_EPONA_ANIM_IDLE) && (animIndex != OOT_CHILD_EPONA_ANIM_WHINNY)) { + animIndex = OOT_CHILD_EPONA_ANIM_IDLE; } - if (nextAnimIndex != this->animIndex) { - this->animIndex = nextAnimIndex; + if (this->animIndex != animIndex) { + this->animIndex = animIndex; Animation_Change(&this->skin.skelAnime, sAnimations[this->animIndex], EnHorseLinkChild_GetAnimSpeed(this), 0.0f, Animation_GetLastFrame(sAnimations[this->animIndex]), ANIMMODE_ONCE, -5.0f); } @@ -258,7 +258,7 @@ void EnHorseLinkChild_SetupWaitForPlayer(EnHorseLinkChild* this, s32 nextAnimInd */ void EnHorseLinkChild_WaitForPlayer(EnHorseLinkChild* this, PlayState* play) { f32 distToPlayer = Actor_WorldDistXZToActor(&this->actor, &GET_PLAYER(play)->actor); - s32 nextAnimIndex; + s32 animIndex; if (SkelAnime_Update(&this->skin.skelAnime)) { if ((distToPlayer < 1000.0f) && (distToPlayer > 70.0f)) { @@ -267,13 +267,13 @@ void EnHorseLinkChild_WaitForPlayer(EnHorseLinkChild* this, PlayState* play) { } if (this->animIndex == OOT_CHILD_EPONA_ANIM_WHINNY) { - nextAnimIndex = OOT_CHILD_EPONA_ANIM_IDLE; + animIndex = OOT_CHILD_EPONA_ANIM_IDLE; } else { - nextAnimIndex = OOT_CHILD_EPONA_ANIM_WHINNY; + animIndex = OOT_CHILD_EPONA_ANIM_WHINNY; } - if (nextAnimIndex != this->animIndex) { - this->animIndex = nextAnimIndex; + if (this->animIndex != animIndex) { + this->animIndex = animIndex; Animation_Change(&this->skin.skelAnime, sAnimations[this->animIndex], EnHorseLinkChild_GetAnimSpeed(this), 0.0f, Animation_GetLastFrame(sAnimations[this->animIndex]), ANIMMODE_ONCE, -5.0f); } else { @@ -297,7 +297,7 @@ void EnHorseLinkChild_SetupGreetPlayer(EnHorseLinkChild* this) { void EnHorseLinkChild_GreetPlayer(EnHorseLinkChild* this, PlayState* play) { f32 distToPlayer; s16 yawTowardPlayerDiff; - s32 nextAnimIndex; + s32 animIndex; if ((this->animIndex == OOT_CHILD_EPONA_ANIM_GALLOP) || (this->animIndex == OOT_CHILD_EPONA_ANIM_TROT) || (this->animIndex == OOT_CHILD_EPONA_ANIM_WALK)) { @@ -321,13 +321,13 @@ void EnHorseLinkChild_GreetPlayer(EnHorseLinkChild* this, PlayState* play) { } if ((distToPlayer < 1000.0f) && (distToPlayer >= 300.0f)) { - nextAnimIndex = OOT_CHILD_EPONA_ANIM_GALLOP; + animIndex = OOT_CHILD_EPONA_ANIM_GALLOP; this->actor.speed = 6.0f; } else if ((distToPlayer < 300.0f) && (distToPlayer >= 150.0f)) { - nextAnimIndex = OOT_CHILD_EPONA_ANIM_TROT; + animIndex = OOT_CHILD_EPONA_ANIM_TROT; this->actor.speed = 4.0f; } else if ((distToPlayer < 150.0f) && (distToPlayer >= 70.0f)) { - nextAnimIndex = OOT_CHILD_EPONA_ANIM_WALK; + animIndex = OOT_CHILD_EPONA_ANIM_WALK; this->footstepCounter = 0; this->actor.speed = 2.0f; } else { @@ -335,8 +335,8 @@ void EnHorseLinkChild_GreetPlayer(EnHorseLinkChild* this, PlayState* play) { return; } - if (nextAnimIndex != this->animIndex) { - this->animIndex = nextAnimIndex; + if (this->animIndex != animIndex) { + this->animIndex = animIndex; Animation_Change(&this->skin.skelAnime, sAnimations[this->animIndex], EnHorseLinkChild_GetAnimSpeed(this), 0.0f, Animation_GetLastFrame(sAnimations[this->animIndex]), ANIMMODE_ONCE, -5.0f); } else { @@ -394,16 +394,16 @@ void EnHorseLinkChild_LonLonIdle(EnHorseLinkChild* this, PlayState* play) { Player* player; f32 distToPlayer; s32 isAnimFinished; - s32 nextAnimIndex; + s32 animIndex; func_808DF088(this, play); player = GET_PLAYER(play); distToPlayer = Actor_WorldDistXZToActor(&this->actor, &player->actor); - nextAnimIndex = this->animIndex; + animIndex = this->animIndex; isAnimFinished = SkelAnime_Update(&this->skin.skelAnime); - if ((isAnimFinished) || (this->animIndex == OOT_CHILD_EPONA_ANIM_WHINNY) || + if (isAnimFinished || (this->animIndex == OOT_CHILD_EPONA_ANIM_WHINNY) || (this->animIndex == OOT_CHILD_EPONA_ANIM_IDLE)) { //! @bug: The carry-over of this flag from OoT was not done correctly if (CHECK_WEEKEVENTREG(WEEKEVENTREG_ENTERED_ZORA_HALL)) { @@ -412,55 +412,53 @@ void EnHorseLinkChild_LonLonIdle(EnHorseLinkChild* this, PlayState* play) { if (Math3D_Distance(&player->actor.world.pos, &this->actor.home.pos) > 250.0f) { if (distToHome >= 300.0f) { - nextAnimIndex = OOT_CHILD_EPONA_ANIM_GALLOP; + animIndex = OOT_CHILD_EPONA_ANIM_GALLOP; this->actor.speed = 6.0f; } else if ((distToHome < 300.0f) && (distToHome >= 150.0f)) { - nextAnimIndex = OOT_CHILD_EPONA_ANIM_TROT; + animIndex = OOT_CHILD_EPONA_ANIM_TROT; this->actor.speed = 4.0f; } else if ((distToHome < 150.0f) && (distToHome >= 70.0f)) { - nextAnimIndex = OOT_CHILD_EPONA_ANIM_WALK; + animIndex = OOT_CHILD_EPONA_ANIM_WALK; this->footstepCounter = 0; this->actor.speed = 2.0f; } else { this->actor.speed = 0.0f; if (this->animIndex == OOT_CHILD_EPONA_ANIM_IDLE) { - nextAnimIndex = - (isAnimFinished == true) ? OOT_CHILD_EPONA_ANIM_WHINNY : OOT_CHILD_EPONA_ANIM_IDLE; + animIndex = (isAnimFinished == true) ? OOT_CHILD_EPONA_ANIM_WHINNY : OOT_CHILD_EPONA_ANIM_IDLE; } else { - nextAnimIndex = - (isAnimFinished == true) ? OOT_CHILD_EPONA_ANIM_IDLE : OOT_CHILD_EPONA_ANIM_WHINNY; + animIndex = (isAnimFinished == true) ? OOT_CHILD_EPONA_ANIM_IDLE : OOT_CHILD_EPONA_ANIM_WHINNY; } } } else if (distToPlayer < 200.0f) { - nextAnimIndex = OOT_CHILD_EPONA_ANIM_GALLOP; + animIndex = OOT_CHILD_EPONA_ANIM_GALLOP; this->actor.speed = 6.0f; } else if (distToPlayer < 300.0f) { - nextAnimIndex = OOT_CHILD_EPONA_ANIM_TROT; + animIndex = OOT_CHILD_EPONA_ANIM_TROT; this->actor.speed = 4.0f; } else if (distToPlayer < 400.0f) { - nextAnimIndex = OOT_CHILD_EPONA_ANIM_WALK; + animIndex = OOT_CHILD_EPONA_ANIM_WALK; this->footstepCounter = 0; this->actor.speed = 2.0f; } else { this->actor.speed = 0.0f; if (this->animIndex == OOT_CHILD_EPONA_ANIM_IDLE) { - nextAnimIndex = (isAnimFinished == true) ? OOT_CHILD_EPONA_ANIM_WHINNY : OOT_CHILD_EPONA_ANIM_IDLE; + animIndex = (isAnimFinished == true) ? OOT_CHILD_EPONA_ANIM_WHINNY : OOT_CHILD_EPONA_ANIM_IDLE; } else { - nextAnimIndex = (isAnimFinished == true) ? OOT_CHILD_EPONA_ANIM_IDLE : OOT_CHILD_EPONA_ANIM_WHINNY; + animIndex = (isAnimFinished == true) ? OOT_CHILD_EPONA_ANIM_IDLE : OOT_CHILD_EPONA_ANIM_WHINNY; } } } else { this->actor.speed = 0.0f; if (this->animIndex == OOT_CHILD_EPONA_ANIM_IDLE) { - nextAnimIndex = (isAnimFinished == true) ? OOT_CHILD_EPONA_ANIM_WHINNY : OOT_CHILD_EPONA_ANIM_IDLE; + animIndex = (isAnimFinished == true) ? OOT_CHILD_EPONA_ANIM_WHINNY : OOT_CHILD_EPONA_ANIM_IDLE; } else { - nextAnimIndex = (isAnimFinished == true) ? OOT_CHILD_EPONA_ANIM_IDLE : OOT_CHILD_EPONA_ANIM_WHINNY; + animIndex = (isAnimFinished == true) ? OOT_CHILD_EPONA_ANIM_IDLE : OOT_CHILD_EPONA_ANIM_WHINNY; } } } - if ((nextAnimIndex != this->animIndex) || (isAnimFinished == true)) { - this->animIndex = nextAnimIndex; + if ((this->animIndex != animIndex) || (isAnimFinished == true)) { + this->animIndex = animIndex; Animation_Change(&this->skin.skelAnime, sAnimations[this->animIndex], EnHorseLinkChild_GetAnimSpeed(this), 0.0f, Animation_GetLastFrame(sAnimations[this->animIndex]), ANIMMODE_ONCE, -5.0f); } else { @@ -526,7 +524,7 @@ void EnHorseLinkChild_SetupActionFunc4(EnHorseLinkChild* this) { void EnHorseLinkChild_ActionFunc4(EnHorseLinkChild* this, PlayState* play) { Player* player = GET_PLAYER(play); f32 distToTargetPos; - s32 nextAnimIndex; + s32 animIndex; this->timer++; if (this->timer > 300) { @@ -551,24 +549,24 @@ void EnHorseLinkChild_ActionFunc4(EnHorseLinkChild* this, PlayState* play) { if (!this->isReturningHome) { if (distToTargetPos >= 300.0f) { - nextAnimIndex = OOT_CHILD_EPONA_ANIM_GALLOP; + animIndex = OOT_CHILD_EPONA_ANIM_GALLOP; this->actor.speed = 6.0f; } else if (distToTargetPos >= 150.0f) { - nextAnimIndex = OOT_CHILD_EPONA_ANIM_TROT; + animIndex = OOT_CHILD_EPONA_ANIM_TROT; this->actor.speed = 4.0f; } else { - nextAnimIndex = OOT_CHILD_EPONA_ANIM_WALK; + animIndex = OOT_CHILD_EPONA_ANIM_WALK; this->footstepCounter = 0; this->actor.speed = 2.0f; } } else if (distToTargetPos >= 300.0f) { - nextAnimIndex = OOT_CHILD_EPONA_ANIM_GALLOP; + animIndex = OOT_CHILD_EPONA_ANIM_GALLOP; this->actor.speed = 6.0f; } else if (distToTargetPos >= 150.0f) { - nextAnimIndex = OOT_CHILD_EPONA_ANIM_TROT; + animIndex = OOT_CHILD_EPONA_ANIM_TROT; this->actor.speed = 4.0f; } else if (distToTargetPos >= 70.0f) { - nextAnimIndex = OOT_CHILD_EPONA_ANIM_WALK; + animIndex = OOT_CHILD_EPONA_ANIM_WALK; this->footstepCounter = 0; this->actor.speed = 2.0f; } else { @@ -576,8 +574,8 @@ void EnHorseLinkChild_ActionFunc4(EnHorseLinkChild* this, PlayState* play) { return; } - if (nextAnimIndex != this->animIndex) { - this->animIndex = nextAnimIndex; + if (this->animIndex != animIndex) { + this->animIndex = animIndex; Animation_Change(&this->skin.skelAnime, sAnimations[this->animIndex], EnHorseLinkChild_GetAnimSpeed(this), 0.0f, Animation_GetLastFrame(sAnimations[this->animIndex]), ANIMMODE_ONCE, -5.0f); } else { diff --git a/src/overlays/actors/ovl_En_Hs/z_en_hs.c b/src/overlays/actors/ovl_En_Hs/z_en_hs.c index 5146f4fcd..b665b5d02 100644 --- a/src/overlays/actors/ovl_En_Hs/z_en_hs.c +++ b/src/overlays/actors/ovl_En_Hs/z_en_hs.c @@ -110,7 +110,7 @@ void EnHs_UpdateChickPos(Vec3f* dst, Vec3f src, f32 offset) { Math_Vec3f_Diff(&src, dst, &diff); - distance = SQ(diff.x) + SQ(diff.z); // gets un-squared after we check if we are too close + distance = SQXZ(diff); // gets un-squared after we check if we are too close if (SQ(offset) > distance) { return; @@ -176,20 +176,20 @@ void func_80953098(EnHs* this, PlayState* play) { void func_80953180(EnHs* this, PlayState* play) { if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) { switch (play->msgCtx.currentTextId) { - case 0x33F4: // text: laughing that they are all roosters (!) - case 0x33F6: // text: Grog regrets not being able to see his chicks reach adult hood + case 0x33F4: // laughing that they are all roosters (!) + case 0x33F6: // Grog regrets not being able to see his chicks reach adult hood Message_CloseTextbox(play); this->actionFunc = func_8095345C; break; - case 0x33F7: // text: notice his chicks are grown up, happy, wants to give you bunny hood + case 0x33F7: // notice his chicks are grown up, happy, wants to give you bunny hood this->actor.flags &= ~ACTOR_FLAG_10000; Message_CloseTextbox(play); this->actionFunc = func_80953098; func_80953098(this, play); break; - case 0x33F9: // text: laughing that they are all roosters (.) + case 0x33F9: // laughing that they are all roosters (.) this->actor.flags &= ~ACTOR_FLAG_10000; Message_CloseTextbox(play); this->actionFunc = func_8095345C; @@ -341,6 +341,9 @@ s32 EnHs_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* po return false; } break; + + default: + break; } return false; } diff --git a/src/overlays/actors/ovl_En_Jg/z_en_jg.c b/src/overlays/actors/ovl_En_Jg/z_en_jg.c index 7e30676e2..9fbd7ff85 100644 --- a/src/overlays/actors/ovl_En_Jg/z_en_jg.c +++ b/src/overlays/actors/ovl_En_Jg/z_en_jg.c @@ -417,11 +417,11 @@ void EnJg_GoronShrineCheer(EnJg* this, PlayState* play) { */ void EnJg_AlternateTalkOrWalkInPlace(EnJg* this, PlayState* play) { u8 talkState = Message_GetState(&play->msgCtx); - s16 currentFrame = this->skelAnime.curFrame; + s16 curFrame = this->skelAnime.curFrame; s16 lastFrame = Animation_GetLastFrame(sAnimationInfo[this->animIndex].animation); if (this->animIndex == EN_JG_ANIM_SURPRISE_START) { - if (currentFrame == lastFrame) { + if (curFrame == lastFrame) { this->animIndex = EN_JG_ANIM_SURPRISE_LOOP; SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, this->animIndex); } @@ -472,11 +472,11 @@ void EnJg_Walk(EnJg* this, PlayState* play) { void EnJg_Talk(EnJg* this, PlayState* play) { u8 talkState = Message_GetState(&play->msgCtx); - s16 currentFrame = this->skelAnime.curFrame; + s16 curFrame = this->skelAnime.curFrame; s16 lastFrame = Animation_GetLastFrame(sAnimationInfo[this->animIndex].animation); u16 temp; - if ((this->animIndex == EN_JG_ANIM_SURPRISE_START) && (currentFrame == lastFrame)) { + if ((this->animIndex == EN_JG_ANIM_SURPRISE_START) && (curFrame == lastFrame)) { this->animIndex = EN_JG_ANIM_SURPRISE_LOOP; SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, this->animIndex); } @@ -542,7 +542,7 @@ void EnJg_SetupWalk(EnJg* this, PlayState* play) { } void EnJg_Freeze(EnJg* this, PlayState* play) { - s16 currentFrame = this->skelAnime.curFrame; + s16 curFrame = this->skelAnime.curFrame; s16 lastFrame = Animation_GetLastFrame(sAnimationInfo[this->animIndex].animation); if (this->action == EN_JG_ACTION_SPAWNING) { @@ -557,7 +557,7 @@ void EnJg_Freeze(EnJg* this, PlayState* play) { this->actionFunc = EnJg_FrozenIdle; } else if (this->animIndex == EN_JG_ANIM_FROZEN_START) { this->action = EN_JG_ACTION_FROZEN_OR_NON_FIRST_THAW; - if (currentFrame == lastFrame) { + if (curFrame == lastFrame) { this->freezeTimer = 1000; this->icePoly = Actor_Spawn(&play->actorCtx, play, ACTOR_OBJ_ICE_POLY, this->actor.world.pos.x, this->actor.world.pos.y, this->actor.world.pos.z, this->actor.world.rot.x, @@ -898,7 +898,7 @@ void EnJg_SpawnBreath(EnJg* this, PlayState* play) { * handing it off to EnJg_Freeze. */ void EnJg_CheckIfTalkingToPlayerAndHandleFreezeTimer(EnJg* this, PlayState* play) { - s16 currentFrame = this->skelAnime.curFrame; + s16 curFrame = this->skelAnime.curFrame; s16 lastFrame = Animation_GetLastFrame(sAnimationInfo[this->animIndex].animation); if (Actor_ProcessTalkRequest(&this->actor, &play->state)) { @@ -924,7 +924,7 @@ void EnJg_CheckIfTalkingToPlayerAndHandleFreezeTimer(EnJg* this, PlayState* play } this->freezeTimer--; - if ((this->freezeTimer <= 0) && (currentFrame == lastFrame)) { + if ((this->freezeTimer <= 0) && (curFrame == lastFrame)) { this->animIndex = EN_JG_ANIM_FROZEN_START; SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, this->animIndex); Audio_PlaySfx_AtPos(&sSfxPos, NA_SE_EV_FREEZE_S); diff --git a/src/overlays/actors/ovl_En_Pr2/z_en_pr2.c b/src/overlays/actors/ovl_En_Pr2/z_en_pr2.c index 73f1111a5..5ebdcd43f 100644 --- a/src/overlays/actors/ovl_En_Pr2/z_en_pr2.c +++ b/src/overlays/actors/ovl_En_Pr2/z_en_pr2.c @@ -115,7 +115,7 @@ void EnPr2_Init(Actor* thisx, PlayState* play) { this->actor.colChkInfo.damageTable = &sDamageTable; SkelAnime_InitFlex(play, &this->skelAnime, &object_pr_Skel_004188, &object_pr_Anim_004340, this->jointTable, - this->morphtable, 5); + this->morphTable, 5); this->unk_1E0 = ENPR2_GET_F(&this->actor); this->actor.colChkInfo.mass = 10; Math_Vec3f_Copy(&this->unk_228, &this->actor.home.pos); diff --git a/src/overlays/actors/ovl_En_Pr2/z_en_pr2.h b/src/overlays/actors/ovl_En_Pr2/z_en_pr2.h index 94fb7e033..7d462b639 100644 --- a/src/overlays/actors/ovl_En_Pr2/z_en_pr2.h +++ b/src/overlays/actors/ovl_En_Pr2/z_en_pr2.h @@ -17,7 +17,7 @@ typedef struct EnPr2 { /* 0x000 */ Actor actor; /* 0x144 */ SkelAnime skelAnime; /* 0x188 */ Vec3s jointTable[5]; - /* 0x1A6 */ Vec3s morphtable[5]; + /* 0x1A6 */ Vec3s morphTable[5]; /* 0x1C4 */ EnPr2ActionFunc actionFunc; /* 0x1C8 */ s16 pathIndex; /* 0x1CC */ Path* path; diff --git a/src/overlays/actors/ovl_En_Ssh/z_en_ssh.c b/src/overlays/actors/ovl_En_Ssh/z_en_ssh.c index 605761711..c7006f087 100644 --- a/src/overlays/actors/ovl_En_Ssh/z_en_ssh.c +++ b/src/overlays/actors/ovl_En_Ssh/z_en_ssh.c @@ -636,7 +636,7 @@ void EnSsh_Init(Actor* thisx, PlayState* play) { EnSsh* this = THIS; ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 30.0f); - SkelAnime_Init(play, &this->skelAnime, &object_ssh_Skel_006470, NULL, this->jointTable, this->morphtable, 30); + SkelAnime_Init(play, &this->skelAnime, &object_ssh_Skel_006470, NULL, this->jointTable, this->morphTable, 30); Animation_Change(&this->skelAnime, &object_ssh_Anim_001494, 1.0f, 0.0f, frameCount, ANIMMODE_LOOP_INTERP, 0.0f); this->blureIdx = EnSsh_CreateBlureEffect(play); EnSsh_InitColliders(this, play); diff --git a/src/overlays/actors/ovl_En_Ssh/z_en_ssh.h b/src/overlays/actors/ovl_En_Ssh/z_en_ssh.h index 6f19a5e51..8c95ea628 100644 --- a/src/overlays/actors/ovl_En_Ssh/z_en_ssh.h +++ b/src/overlays/actors/ovl_En_Ssh/z_en_ssh.h @@ -31,7 +31,7 @@ typedef struct EnSsh { /* 0x000 */ Actor actor; /* 0x144 */ SkelAnime skelAnime; /* 0x188 */ Vec3s jointTable[30]; - /* 0x23C */ Vec3s morphtable[30]; + /* 0x23C */ Vec3s morphTable[30]; /* 0x2F0 */ EnSshActionFunc actionFunc; /* 0x2F4 */ ColliderCylinder collider1[6]; /* 0x4BC */ ColliderJntSph collider2; diff --git a/tools/disasm/functions.txt b/tools/disasm/functions.txt index 7ecc8c4e3..9a4244bc2 100644 --- a/tools/disasm/functions.txt +++ b/tools/disasm/functions.txt @@ -15951,7 +15951,7 @@ 0x80BDAF24:("ObjHsStump_Draw",), 0x80BDB040:("EnHiddenNuts_Init",), 0x80BDB188:("EnHiddenNuts_Destroy",), - 0x80BDB1B4:("func_80BDB1B4",), + 0x80BDB1B4:("EnHiddenNuts_ChangeAnim",), 0x80BDB268:("func_80BDB268",), 0x80BDB2B8:("func_80BDB2B8",), 0x80BDB580:("func_80BDB580",), diff --git a/tools/disasm/variables.txt b/tools/disasm/variables.txt index 01a46d7d1..9320ca10e 100644 --- a/tools/disasm/variables.txt +++ b/tools/disasm/variables.txt @@ -15810,8 +15810,8 @@ 0x80BDAFA0:("D_80BDAFA0","f32","",0x4), 0x80BDC0B0:("En_Hidden_Nuts_InitVars","UNK_TYPE1","",0x1), 0x80BDC0D0:("D_80BDC0D0","UNK_TYPE1","",0x1), - 0x80BDC0FC:("D_80BDC0FC","UNK_TYPE1","",0x1), - 0x80BDC120:("D_80BDC120","UNK_TYPE1","",0x1), + 0x80BDC0FC:("sAnimations","UNK_TYPE1","",0x1), + 0x80BDC120:("sAnimationModes","UNK_TYPE1","",0x1), 0x80BDC12C:("D_80BDC12C","UNK_TYPE1","",0x1), 0x80BDC138:("D_80BDC138","UNK_TYPE1","",0x1), 0x80BDC144:("D_80BDC144","UNK_TYPE1","",0x1), From 9b1335aa7b5f33231e7bde444d77b38df3bfa87a Mon Sep 17 00:00:00 2001 From: engineer124 <47598039+engineer124@users.noreply.github.com> Date: Fri, 29 Sep 2023 23:14:05 +1000 Subject: [PATCH 06/16] Animation Cleanup: En_I* (#1400) * cleanup I * oops --- src/overlays/actors/ovl_En_Horse/z_en_horse.c | 8 +- src/overlays/actors/ovl_En_Ig/z_en_ig.c | 168 ++++++++++------- src/overlays/actors/ovl_En_Ig/z_en_ig.h | 9 +- src/overlays/actors/ovl_En_Ik/z_en_ik.c | 8 +- src/overlays/actors/ovl_En_In/z_en_in.c | 174 ++++++++++-------- src/overlays/actors/ovl_En_In/z_en_in.h | 29 ++- .../actors/ovl_En_Insect/z_en_insect.c | 5 +- .../actors/ovl_En_Insect/z_en_insect.h | 5 +- .../z_en_invisible_ruppe.c | 3 + tools/disasm/functions.txt | 4 +- 10 files changed, 242 insertions(+), 171 deletions(-) diff --git a/src/overlays/actors/ovl_En_Horse/z_en_horse.c b/src/overlays/actors/ovl_En_Horse/z_en_horse.c index fe386b2ff..088e3fae0 100644 --- a/src/overlays/actors/ovl_En_Horse/z_en_horse.c +++ b/src/overlays/actors/ovl_En_Horse/z_en_horse.c @@ -2491,10 +2491,10 @@ void func_808819D8(EnHorse* this, PlayState* play) { } if (GET_WEEKEVENTREG_HORSE_RACE_STATE == WEEKEVENTREG_HORSE_RACE_STATE_3) { - this->rider->unk488 = 7; + this->rider->animIndex2 = ENIN_ANIM2_7; } else { EnHorse_SetIngoAnimation(this->animIndex, this->skin.skelAnime.curFrame, this->unk_394 & 1, - &this->rider->unk488); + &this->rider->animIndex2); } } @@ -3447,10 +3447,10 @@ void func_80884E0C(EnHorse* this, PlayState* play) { this->unk_56C = Math3D_Distance(&this->actor.world.pos, &this->actor.prevPos); if (((this->unk_550 == 5) || (this->unk_550 == 7)) && (Player_GetMask(play) != PLAYER_MASK_CIRCUS_LEADER)) { - this->rider->unk488 = 7; + this->rider->animIndex2 = ENIN_ANIM2_7; } else { EnHorse_SetIngoAnimation(this->animIndex, this->skin.skelAnime.curFrame, this->unk_394 & 1, - &this->rider->unk488); + &this->rider->animIndex2); } pos = this->actor.world.pos; diff --git a/src/overlays/actors/ovl_En_Ig/z_en_ig.c b/src/overlays/actors/ovl_En_Ig/z_en_ig.c index bd90f48c1..3006c7bfe 100644 --- a/src/overlays/actors/ovl_En_Ig/z_en_ig.c +++ b/src/overlays/actors/ovl_En_Ig/z_en_ig.c @@ -6,7 +6,6 @@ #include "z_en_ig.h" #include "overlays/actors/ovl_En_Door/z_en_door.h" -#include "objects/object_dai/object_dai.h" #define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10) @@ -143,17 +142,32 @@ static ColliderSphereInit sSphereInit = { static CollisionCheckInfoInit2 sColChkInfoInit = { 0, 0, 0, 0, MASS_IMMOVABLE }; -static AnimationInfoS sAnimationInfo[] = { - { &object_dai_Anim_0048B4, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, - { &object_dai_Anim_0048B4, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, - { &object_dai_Anim_005100, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, - { &object_dai_Anim_005100, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, - { &object_dai_Anim_0010F8, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, - { &object_dai_Anim_001E44, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, - { &object_dai_Anim_0014BC, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, - { &object_dai_Anim_003CAC, 1.0f, 0, -1, ANIMMODE_ONCE, -4 }, - { &object_dai_Anim_0040E0, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, - { &object_dai_Anim_0040E0, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, +typedef enum EnIgAnimation { + /* -1 */ ENIG_ANIM_NONE = -1, + /* 0 */ ENIG_ANIM_0, + /* 1 */ ENIG_ANIM_1, + /* 2 */ ENIG_ANIM_2, + /* 3 */ ENIG_ANIM_3, + /* 4 */ ENIG_ANIM_4, + /* 5 */ ENIG_ANIM_5, + /* 6 */ ENIG_ANIM_6, + /* 7 */ ENIG_ANIM_7, + /* 8 */ ENIG_ANIM_8, + /* 9 */ ENIG_ANIM_9, + /* 10 */ ENIG_ANIM_MAX +} EnIgAnimation; + +static AnimationInfoS sAnimationInfo[ENIG_ANIM_MAX] = { + { &object_dai_Anim_0048B4, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENIG_ANIM_0 + { &object_dai_Anim_0048B4, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // ENIG_ANIM_1 + { &object_dai_Anim_005100, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENIG_ANIM_2 + { &object_dai_Anim_005100, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // ENIG_ANIM_3 + { &object_dai_Anim_0010F8, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // ENIG_ANIM_4 + { &object_dai_Anim_001E44, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // ENIG_ANIM_5 + { &object_dai_Anim_0014BC, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // ENIG_ANIM_6 + { &object_dai_Anim_003CAC, 1.0f, 0, -1, ANIMMODE_ONCE, -4 }, // ENIG_ANIM_7 + { &object_dai_Anim_0040E0, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENIG_ANIM_8 + { &object_dai_Anim_0040E0, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // ENIG_ANIM_9 }; Actor* func_80BF1150(EnIg* this, PlayState* play, u8 actorCat, s16 actorId) { @@ -204,44 +218,44 @@ EnDoor* func_80BF1200(PlayState* play, s32 arg1) { return SubS_FindDoor(play, phi_a1); } -void func_80BF1258(EnIg* this) { - this->skelAnime.playSpeed = this->unk_3D4; +void EnIg_UpdateSkelAnime(EnIg* this) { + this->skelAnime.playSpeed = this->animPlaySpeed; SkelAnime_Update(&this->skelAnime); } -s32 func_80BF1284(EnIg* this, s32 arg1) { - s32 phi_v1 = false; - s32 ret = false; +s32 EnIg_ChangeAnim(EnIg* this, s32 animIndex) { + s32 changeAnim = false; + s32 didAnimChange = false; - switch (arg1) { - case 0: - case 1: - if ((this->unk_3FC != 0) && (this->unk_3FC != 1)) { - phi_v1 = true; + switch (animIndex) { + case ENIG_ANIM_0: + case ENIG_ANIM_1: + if ((this->animIndex != ENIG_ANIM_0) && (this->animIndex != ENIG_ANIM_1)) { + changeAnim = true; } break; - case 2: - case 3: - if ((this->unk_3FC != 2) && (this->unk_3FC != 3)) { - phi_v1 = true; + case ENIG_ANIM_2: + case ENIG_ANIM_3: + if ((this->animIndex != ENIG_ANIM_2) && (this->animIndex != ENIG_ANIM_3)) { + changeAnim = true; } break; default: - if (arg1 != this->unk_3FC) { - phi_v1 = true; + if (this->animIndex != animIndex) { + changeAnim = true; } break; } - if (phi_v1) { - this->unk_3FC = arg1; - ret = SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, arg1); - this->unk_3D4 = this->skelAnime.playSpeed; + if (changeAnim) { + this->animIndex = animIndex; + didAnimChange = SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, animIndex); + this->animPlaySpeed = this->skelAnime.playSpeed; } - return ret; + return didAnimChange; } void func_80BF1354(EnIg* this, PlayState* play) { @@ -358,16 +372,18 @@ s32 func_80BF17BC(EnIg* this, PlayState* play) { switch (this->unk_3F6) { case 0: - if (func_80BF16C8(this, csId)) { - case 2: - case 4: - if ((this->actor.child != NULL) && (this->actor.child->update != NULL)) { - Camera_SetTargetActor(Play_GetCamera(play, CutsceneManager_GetCurrentSubCamId(csId)), - this->actor.child); - } - this->unk_3F6++; - ret = true; + if (!func_80BF16C8(this, csId)) { + break; } + // fallthrough + case 2: + case 4: + if ((this->actor.child != NULL) && (this->actor.child->update != NULL)) { + Camera_SetTargetActor(Play_GetCamera(play, CutsceneManager_GetCurrentSubCamId(csId)), + this->actor.child); + } + this->unk_3F6++; + ret = true; break; case 1: @@ -387,6 +403,9 @@ s32 func_80BF17BC(EnIg* this, PlayState* play) { this->unk_3F6++; ret = true; break; + + default: + break; } return ret; } @@ -438,10 +457,10 @@ s32 func_80BF19A0(EnIg* this, PlayState* play) { void func_80BF1A60(EnIg* this, PlayState* play) { if (this->unk_3F4 == 0) { - func_80BF1284(this, 4); + EnIg_ChangeAnim(this, ENIG_ANIM_4); this->unk_3F4++; } else if ((this->unk_3F4 == 1) && Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) { - func_80BF1284(this, 5); + EnIg_ChangeAnim(this, ENIG_ANIM_5); this->unk_3F4++; } } @@ -449,7 +468,7 @@ void func_80BF1A60(EnIg* this, PlayState* play) { s32 func_80BF1AE0(EnIg* this, PlayState* play) { switch (this->scheduleResult) { case 3: - func_80BF1284(this, 0); + EnIg_ChangeAnim(this, ENIG_ANIM_0); break; case 10: @@ -457,7 +476,10 @@ s32 func_80BF1AE0(EnIg* this, PlayState* play) { case 12: case 13: case 14: - func_80BF1284(this, 2); + EnIg_ChangeAnim(this, ENIG_ANIM_2); + break; + + default: break; } return true; @@ -471,8 +493,8 @@ s32 func_80BF1B40(EnIg* this, PlayState* play) { if (player->stateFlags1 & (PLAYER_STATE1_40 | PLAYER_STATE1_400 | PLAYER_STATE1_800)) { this->unk_3D0 |= 0x400; if (this->unk_3D2 != temp) { - if ((this->unk_3FC == 2) || (this->unk_3FC == 3)) { - func_80BF1284(this, 0); + if ((this->animIndex == ENIG_ANIM_2) || (this->animIndex == ENIG_ANIM_3)) { + EnIg_ChangeAnim(this, ENIG_ANIM_0); } if ((temp == 0x28B0) || (temp == 0x28B7)) { @@ -484,7 +506,10 @@ s32 func_80BF1B40(EnIg* this, PlayState* play) { } else if (this->unk_3D0 & 0x400) { this->unk_3D2 = 0; this->unk_3D0 &= ~0x400; + + //! FAKE: if (1) {} + func_80BF1AE0(this, play); } @@ -529,7 +554,7 @@ s32 func_80BF1D78(EnIg* this, PlayState* play, ScheduleOutput* scheduleOutput) { s32 sp2C = 0; if (func_80BF1C44(this, play, scheduleOutput, ACTORCAT_NPC, ACTOR_EN_AN)) { - func_80BF1284(this, 0); + EnIg_ChangeAnim(this, ENIG_ANIM_0); SubS_SetOfferMode(&this->unk_3D0, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK); this->unk_3D0 |= 0x20; this->unk_3D0 |= 0x100; @@ -575,7 +600,7 @@ s32 func_80BF1DF4(EnIg* this, PlayState* play, ScheduleOutput* scheduleOutput) { this->unk_3E2 = sp56 - scheduleOutput->time0; this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; this->unk_3D0 |= 0x100; - func_80BF1284(this, 3); + EnIg_ChangeAnim(this, ENIG_ANIM_3); this->actor.gravity = 0.0f; ret = true; } @@ -626,7 +651,7 @@ s32 func_80BF1FA8(EnIg* this, PlayState* play, ScheduleOutput* scheduleOutput) { this->unk_3D0 &= ~0x10; SubS_SetOfferMode(&this->unk_3D0, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK); this->unk_3D0 |= 0x100; - func_80BF1284(this, 2); + EnIg_ChangeAnim(this, ENIG_ANIM_2); this->actor.gravity = -1.0f; ret = true; } @@ -662,7 +687,7 @@ s32 func_80BF219C(EnIg* this, PlayState* play, ScheduleOutput* scheduleOutput) { this->actor.home.rot.y += 0x8000; SubS_SetOfferMode(&this->unk_3D0, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK); this->unk_3D0 |= 0x100; - func_80BF1284(this, 1); + EnIg_ChangeAnim(this, ENIG_ANIM_1); break; case 4: @@ -670,7 +695,10 @@ s32 func_80BF219C(EnIg* this, PlayState* play, ScheduleOutput* scheduleOutput) { this->actor.shape.rot.y = this->actor.world.rot.y; SubS_SetOfferMode(&this->unk_3D0, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK); this->unk_3D0 |= 0x100; - func_80BF1284(this, 8); + EnIg_ChangeAnim(this, ENIG_ANIM_8); + break; + + default: break; } ret = true; @@ -710,6 +738,9 @@ s32 func_80BF2368(EnIg* this, PlayState* play, ScheduleOutput* scheduleOutput) { case 3: ret = func_80BF1D78(this, play, scheduleOutput); break; + + default: + break; } return ret; } @@ -765,6 +796,7 @@ s32 func_80BF25E8(EnIg* this, PlayState* play) { s32 pad; SubS_TimePathing_FillKnots(knots, SUBS_TIME_PATHING_ORDER, this->timePath->count + SUBS_TIME_PATHING_ORDER); + if (!(this->unk_3D0 & 8)) { timePathTargetPos = gZeroVec3f; SubS_TimePathing_Update(this->timePath, &this->timePathProgress, &this->timePathElapsedTime, @@ -830,11 +862,11 @@ s32 func_80BF293C(EnIg* this, PlayState* play) { Math_ApproachS(&this->actor.world.rot.y, this->actor.home.rot.y, 3, 0x2AA8); } else { this->actor.world.rot.y = this->actor.home.rot.y; - func_80BF1284(this, 7); + EnIg_ChangeAnim(this, ENIG_ANIM_7); } - } else if ((this->unk_3FC == 7) && Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) { + } else if ((this->animIndex == ENIG_ANIM_7) && Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) { SubS_SetOfferMode(&this->unk_3D0, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK); - func_80BF1284(this, 9); + EnIg_ChangeAnim(this, ENIG_ANIM_9); } return true; } @@ -868,6 +900,9 @@ void func_80BF2A50(EnIg* this, PlayState* play) { case 4: func_80BF2890(this, play); break; + + default: + break; } Math_ApproachS(&this->actor.shape.rot.y, this->actor.world.rot.y, 3, 0x2AA8); } @@ -916,9 +951,10 @@ void EnIg_Init(Actor* thisx, PlayState* play) { EnIg* this = THIS; ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 28.0f); - SkelAnime_InitFlex(play, &this->skelAnime, &object_dai_Skel_0130D0, NULL, this->jointTable, this->morphTable, 19); - this->unk_3FC = -1; - func_80BF1284(this, 0); + SkelAnime_InitFlex(play, &this->skelAnime, &object_dai_Skel_0130D0, NULL, this->jointTable, this->morphTable, + OBJECT_DAI_LIMB_MAX); + this->animIndex = ENIG_ANIM_NONE; + EnIg_ChangeAnim(this, ENIG_ANIM_0); Collider_InitAndSetCylinder(play, &this->collider1, &this->actor, &sCylinderInit); Collider_InitAndSetSphere(play, &this->collider2, &this->actor, &sSphereInit); CollisionCheck_SetInfo2(&this->actor.colChkInfo, DamageTable_Get(0x16), &sColChkInfoInit); @@ -946,7 +982,7 @@ void EnIg_Update(Actor* thisx, PlayState* play) { func_80BF1B40(this, play); if (this->scheduleResult != 0) { - func_80BF1258(this); + EnIg_UpdateSkelAnime(this); func_80BF13E4(this); func_80BF15EC(this); SubS_Offer(&this->actor, play, 60.0f, 30.0f, PLAYER_IA_NONE, this->unk_3D0 & SUBS_OFFER_MODE_MASK); @@ -960,7 +996,7 @@ s32 EnIg_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* po Gfx** gfx) { EnIg* this = THIS; - if (limbIndex == 10) { + if (limbIndex == OBJECT_DAI_LIMB_0A) { *dList = NULL; } return false; @@ -973,7 +1009,7 @@ void EnIg_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, EnIg* this = THIS; Vec3f sp2C; - if (limbIndex == 11) { + if (limbIndex == OBJECT_DAI_LIMB_0B) { Matrix_MultVec3f(&D_80BF3528, &this->actor.focus.pos); Math_Vec3s_Copy(&this->actor.focus.rot, &this->actor.world.rot); @@ -981,17 +1017,17 @@ void EnIg_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, gSPDisplayList((*gfx)++, object_dai_DL_0087B8); } - if (limbIndex == 12) { + if (limbIndex == OBJECT_DAI_LIMB_0C) { gSPDisplayList((*gfx)++, object_dai_DL_0089D8); } - if (limbIndex == 9) { + if (limbIndex == OBJECT_DAI_LIMB_09) { gSPDisplayList((*gfx)++, object_dai_DL_008B00); Matrix_MultVec3f(&D_80BF351C, &sp2C); Math_Vec3f_ToVec3s(&this->collider2.dim.worldSphere.center, &sp2C); } - if (limbIndex == 10) { + if (limbIndex == OBJECT_DAI_LIMB_0A) { Matrix_Get(&this->unk_190); } } @@ -1013,7 +1049,7 @@ void EnIg_TransformLimbDraw(PlayState* play, s32 limbIndex, Actor* thisx, Gfx** stepRot = false; } - if (limbIndex == 9) { + if (limbIndex == OBJECT_DAI_LIMB_09) { SubS_UpdateLimb(this->unk_3E8 + 0x4000, this->unk_3EA + this->actor.shape.rot.y + 0x4000, &this->unk_2D4, &this->unk_2E6, stepRot, overrideRot); Matrix_Pop(); diff --git a/src/overlays/actors/ovl_En_Ig/z_en_ig.h b/src/overlays/actors/ovl_En_Ig/z_en_ig.h index 274338a11..71c7c509d 100644 --- a/src/overlays/actors/ovl_En_Ig/z_en_ig.h +++ b/src/overlays/actors/ovl_En_Ig/z_en_ig.h @@ -2,6 +2,7 @@ #define Z_EN_IG_H #include "global.h" +#include "objects/object_dai/object_dai.h" struct EnIg; @@ -38,11 +39,11 @@ typedef struct EnIg { /* 0x2D4 */ Vec3f unk_2D4; /* 0x2E0 */ UNK_TYPE1 unk2E0[0x6]; /* 0x2E6 */ Vec3s unk_2E6; - /* 0x2EC */ Vec3s jointTable[19]; - /* 0x35E */ Vec3s morphTable[19]; + /* 0x2EC */ Vec3s jointTable[OBJECT_DAI_LIMB_MAX]; + /* 0x35E */ Vec3s morphTable[OBJECT_DAI_LIMB_MAX]; /* 0x3D0 */ u16 unk_3D0; /* 0x3D2 */ u16 unk_3D2; - /* 0x3D4 */ f32 unk_3D4; + /* 0x3D4 */ f32 animPlaySpeed; /* 0x3D8 */ UNK_TYPE1 unk3D8[0x8]; /* 0x3E0 */ s16 unk_3E0; /* 0x3E2 */ s16 unk_3E2; @@ -57,7 +58,7 @@ typedef struct EnIg { /* 0x3F4 */ s16 unk_3F4; /* 0x3F6 */ s16 unk_3F6; /* 0x3F8 */ EnIgUnkFunc unk_3F8; - /* 0x3FC */ s32 unk_3FC; + /* 0x3FC */ s32 animIndex; /* 0x400 */ UNK_TYPE1 unk400[0x8]; /* 0x408 */ s32 unk_408; } EnIg; // size = 0x40C diff --git a/src/overlays/actors/ovl_En_Ik/z_en_ik.c b/src/overlays/actors/ovl_En_Ik/z_en_ik.c index 96ce3db8c..7f3ed6de4 100644 --- a/src/overlays/actors/ovl_En_Ik/z_en_ik.c +++ b/src/overlays/actors/ovl_En_Ik/z_en_ik.c @@ -365,15 +365,15 @@ void EnIk_CheckActions(EnIk* this, PlayState* play) { } void EnIk_SetupIdle(EnIk* this) { - f32 frameCount = Animation_GetLastFrame(&gIronKnuckleHorizontalAttackAnim); + f32 endFrame = Animation_GetLastFrame(&gIronKnuckleHorizontalAttackAnim); if (this->drawArmorFlags != 0) { this->timer = 10; } else { this->timer = 0; } - Animation_Change(&this->skelAnime, &gIronKnuckleEndHorizontalAttackAnim, 1.0f, frameCount, frameCount, - ANIMMODE_ONCE, this->timer); + Animation_Change(&this->skelAnime, &gIronKnuckleEndHorizontalAttackAnim, 1.0f, endFrame, endFrame, ANIMMODE_ONCE, + this->timer); this->actionFunc = EnIk_Idle; this->actor.speed = 0.0f; } @@ -461,7 +461,7 @@ void EnIk_SetupVerticalAttack(EnIk* this) { playbackSpeed = 1.2f; } Animation_Change(&this->skelAnime, &gIronKnuckleVerticalAttackAnim, playbackSpeed, 0.0f, - Animation_GetLastFrame(&gIronKnuckleVerticalAttackAnim.common), 3, -4.0f); + Animation_GetLastFrame(&gIronKnuckleVerticalAttackAnim.common), ANIMMODE_ONCE_INTERP, -4.0f); this->timer = 0; this->blurEffectSpawnLock = -1; this->actionFunc = EnIk_VerticalAttack; diff --git a/src/overlays/actors/ovl_En_In/z_en_in.c b/src/overlays/actors/ovl_En_In/z_en_in.c index 1c0fc091d..19fbd436e 100644 --- a/src/overlays/actors/ovl_En_In/z_en_in.c +++ b/src/overlays/actors/ovl_En_In/z_en_in.c @@ -118,25 +118,25 @@ static DamageTable sDamageTable = { /* Powder Keg */ DMG_ENTRY(0, 0x0), }; -static AnimationInfoS sAnimationInfo[] = { - { &object_in_Anim_001D10, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, - { &object_in_Anim_001D10, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, - { &object_in_Anim_014F8C, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, - { &object_in_Anim_014F8C, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, - { &object_in_Anim_000CB0, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, - { &object_in_Anim_0003B4, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, - { &object_in_Anim_001BE0, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, - { &object_in_Anim_015918, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, - { &object_in_Anim_01C0B0, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, - { &object_in_Anim_01C0B0, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, - { &object_in_Anim_01A140, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, - { &object_in_Anim_01A140, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, - { &object_in_Anim_01B904, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, - { &object_in_Anim_01B904, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, - { &object_in_Anim_01B3C4, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, - { &object_in_Anim_01B3C4, 0.0f, 0, -1, ANIMMODE_ONCE, 0 }, - { &object_in_Anim_01B3C4, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, - { &object_in_Anim_019EB4, 1.0f, 0, -1, ANIMMODE_ONCE, -4 }, +static AnimationInfoS sAnimationInfo[ENIN_ANIM_MAX] = { + { &object_in_Anim_001D10, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENIN_ANIM_0 + { &object_in_Anim_001D10, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // ENIN_ANIM_1 + { &object_in_Anim_014F8C, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENIN_ANIM_2 + { &object_in_Anim_014F8C, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // ENIN_ANIM_3 + { &object_in_Anim_000CB0, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // ENIN_ANIM_4 + { &object_in_Anim_0003B4, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // ENIN_ANIM_5 + { &object_in_Anim_001BE0, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // ENIN_ANIM_6 + { &object_in_Anim_015918, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // ENIN_ANIM_7 + { &object_in_Anim_01C0B0, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENIN_ANIM_8 + { &object_in_Anim_01C0B0, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // ENIN_ANIM_9 + { &object_in_Anim_01A140, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENIN_ANIM_10 + { &object_in_Anim_01A140, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // ENIN_ANIM_11 + { &object_in_Anim_01B904, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENIN_ANIM_12 + { &object_in_Anim_01B904, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // ENIN_ANIM_13 + { &object_in_Anim_01B3C4, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENIN_ANIM_14 + { &object_in_Anim_01B3C4, 0.0f, 0, -1, ANIMMODE_ONCE, 0 }, // ENIN_ANIM_15 + { &object_in_Anim_01B3C4, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // ENIN_ANIM_16 + { &object_in_Anim_019EB4, 1.0f, 0, -1, ANIMMODE_ONCE, -4 }, // ENIN_ANIM_17 }; static TrackOptionsSet sTrackOptions = { @@ -147,20 +147,20 @@ static TrackOptionsSet sTrackOptions = { }; s32 EnIn_ChangeAnim(SkelAnime* skelAnime, s16 animIndex) { - s16 frameCount; - s32 ret = false; + s16 endFrame; + s32 didAnimChange = false; - if ((animIndex >= 0) && (animIndex < 18)) { - ret = true; - frameCount = sAnimationInfo[animIndex].frameCount; - if (frameCount < 0) { - frameCount = Animation_GetLastFrame(sAnimationInfo[animIndex].animation); + if ((animIndex > ENIN_ANIM_NONE) && (animIndex < ENIN_ANIM_MAX)) { + didAnimChange = true; + endFrame = sAnimationInfo[animIndex].frameCount; + if (endFrame < 0) { + endFrame = Animation_GetLastFrame(sAnimationInfo[animIndex].animation); } Animation_Change(skelAnime, sAnimationInfo[animIndex].animation, sAnimationInfo[animIndex].playSpeed, - sAnimationInfo[animIndex].startFrame, frameCount, sAnimationInfo[animIndex].mode, + sAnimationInfo[animIndex].startFrame, endFrame, sAnimationInfo[animIndex].mode, sAnimationInfo[animIndex].morphFrames); } - return ret; + return didAnimChange; } s32 func_808F3178(EnIn* this, PlayState* play) { @@ -298,12 +298,19 @@ void func_808F3690(EnIn* this, PlayState* play) { } void func_808F374C(EnIn* this, PlayState* play) { - AnimationHeader* sAnimations[] = { - &object_in_Anim_015E38, &object_in_Anim_016A60, &object_in_Anim_0177AC, &object_in_Anim_016484, - &object_in_Anim_0170DC, &object_in_Anim_018240, &object_in_Anim_0187C8, &object_in_Anim_0198A8, + AnimationHeader* sAnimations[ENIN_ANIM2_MAX] = { + &object_in_Anim_015E38, // ENIN_ANIM2_0 + &object_in_Anim_016A60, // ENIN_ANIM2_1 + &object_in_Anim_0177AC, // ENIN_ANIM2_2 + &object_in_Anim_016484, // ENIN_ANIM2_3 + &object_in_Anim_0170DC, // ENIN_ANIM2_4 + &object_in_Anim_018240, // ENIN_ANIM2_5 + &object_in_Anim_0187C8, // ENIN_ANIM2_6 + &object_in_Anim_0198A8, // ENIN_ANIM2_7 }; - if (this->skelAnime.animation == &object_in_Anim_016484 || this->skelAnime.animation == &object_in_Anim_0170DC) { + if ((this->skelAnime.animation == &object_in_Anim_016484) || + (this->skelAnime.animation == &object_in_Anim_0170DC)) { if (Animation_OnFrame(&this->skelAnime, 8.0f)) { Audio_PlaySfx_Randomized(&this->actor.projectedPos, NA_SE_VO_IN_LASH_0, 2); if (Rand_ZeroOne() < 0.3f) { @@ -312,14 +319,16 @@ void func_808F374C(EnIn* this, PlayState* play) { Audio_PlaySfx_AtPos(&this->actor.projectedPos, NA_SE_IT_LASH); } } - if (this->skelAnime.animation == &object_in_Anim_0198A8 && Animation_OnFrame(&this->skelAnime, 20.0f)) { + + if ((this->skelAnime.animation == &object_in_Anim_0198A8) && Animation_OnFrame(&this->skelAnime, 20.0f)) { Actor_PlaySfx(&this->actor, NA_SE_VO_IN_CRY_0); } + if (SkelAnime_Update(&this->skelAnime)) { - this->unk488 %= ARRAY_COUNT(sAnimations); - this->unk486 = this->unk488; - Animation_Change(&this->skelAnime, sAnimations[this->unk488], 1.0f, 0.0f, - Animation_GetLastFrame(sAnimations[this->unk488]), ANIMMODE_ONCE, -10.0f); + this->animIndex2 %= ENIN_ANIM2_MAX; + this->unk486 = this->animIndex2; + Animation_Change(&this->skelAnime, sAnimations[this->animIndex2], 1.0f, 0.0f, + Animation_GetLastFrame(sAnimations[this->animIndex2]), ANIMMODE_ONCE, -10.0f); } } @@ -407,7 +416,7 @@ void func_808F3B40(EnIn* this, PlayState* play) { this->actor.parent = NULL; this->actor.flags |= ACTOR_FLAG_10000; this->actionFunc = func_808F3AD4; - textId = gSaveContext.save.day != 3 ? 0x3481 : 0x34A4; + textId = (gSaveContext.save.day != 3) ? 0x3481 : 0x34A4; this->actor.textId = textId; } else { Actor_OfferGetItem(&this->actor, play, GI_MILK, 500.0f, 100.0f); @@ -958,6 +967,7 @@ s32 func_808F4414(PlayState* play, EnIn* this, s32 arg2) { ret = false; } break; + case 0x347E: func_808F35D8(this, play); if (Inventory_HasEmptyBottle()) { @@ -1430,7 +1440,7 @@ void func_808F5A94(EnIn* this, PlayState* play) { void func_808F5B58(EnIn* this, PlayState* play) { if (Horse_IsActive(play, &play->actorCtx)) { - if ((Player_GetMask(play) == PLAYER_MASK_CIRCUS_LEADER && CHECK_WEEKEVENTREG(WEEKEVENTREG_63_40)) || + if (((Player_GetMask(play) == PLAYER_MASK_CIRCUS_LEADER) && CHECK_WEEKEVENTREG(WEEKEVENTREG_63_40)) || CHECK_WEEKEVENTREG(WEEKEVENTREG_56_08)) { if (gSaveContext.save.day == 3) { func_808F5728(play, this, 6, &this->unk48C); @@ -1438,8 +1448,8 @@ void func_808F5B58(EnIn* this, PlayState* play) { func_808F5728(play, this, 2, &this->unk48C); } } - } else if (Player_GetMask(play) != PLAYER_MASK_CIRCUS_LEADER || - (Player_GetMask(play) == PLAYER_MASK_CIRCUS_LEADER && CHECK_WEEKEVENTREG(WEEKEVENTREG_63_40))) { + } else if ((Player_GetMask(play) != PLAYER_MASK_CIRCUS_LEADER) || + ((Player_GetMask(play) == PLAYER_MASK_CIRCUS_LEADER) && CHECK_WEEKEVENTREG(WEEKEVENTREG_63_40))) { if (gSaveContext.save.day == 3) { func_808F5728(play, this, 4, &this->unk48C); } else { @@ -1452,7 +1462,7 @@ void func_808F5C98(EnIn* this, PlayState* play) { if (this->unk4B0 == WEEKEVENTREG_HORSE_RACE_STATE_END) { this->actionFunc = func_808F5B58; } - if ((Player_GetMask(play) == PLAYER_MASK_CIRCUS_LEADER && CHECK_WEEKEVENTREG(WEEKEVENTREG_63_40)) || + if (((Player_GetMask(play) == PLAYER_MASK_CIRCUS_LEADER) && CHECK_WEEKEVENTREG(WEEKEVENTREG_63_40)) || CHECK_WEEKEVENTREG(WEEKEVENTREG_56_08)) { if (gSaveContext.save.day != 3) { func_808F5728(play, this, 2, &this->unk48C); @@ -1484,7 +1494,8 @@ void EnIn_Init(Actor* thisx, PlayState* play) { Actor_ProcessInitChain(&this->actor, sInitChain); ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 30.0f); - SkelAnime_InitFlex(play, &this->skelAnime, &object_in_Skel_014EA8, NULL, this->jointTable, this->morphTable, 20); + SkelAnime_InitFlex(play, &this->skelAnime, &object_in_Skel_014EA8, NULL, this->jointTable, this->morphTable, + OBJECT_IN_LIMB_MAX); EnIn_ChangeAnim(&this->skelAnime, ENIN_ANIM_0); Collider_InitCylinder(play, &this->colliderCylinder); Collider_SetCylinder(play, &this->colliderCylinder, &this->actor, &sCylinderInit); @@ -1499,7 +1510,7 @@ void EnIn_Init(Actor* thisx, PlayState* play) { } if ((type == ENIN_HORSE_RIDER_YELLOW_SHIRT) || (type == ENIN_HORSE_RIDER_BLUE_SHIRT)) { ActorShape_Init(&this->actor.shape, 0.0f, NULL, 0.0f); - this->unk488 = 1; + this->animIndex2 = ENIN_ANIM2_1; Animation_Change(&this->skelAnime, &object_in_Anim_016A60, 1.0f, 0.0f, Animation_GetLastFrame(&object_in_Anim_016A60), ANIMMODE_ONCE, 0.0f); Actor_SetScale(&this->actor, 0.01f); @@ -1623,41 +1634,41 @@ void func_808F6334(EnIn* this, PlayState* play) { s32 EnIn_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) { EnIn* this = THIS; s32 pad; - Gfx* sp50[] = { - NULL, - NULL, - object_in_DL_0149A8, - object_in_DL_014AE0, - object_in_DL_014C30, - object_in_DL_0145D8, - object_in_DL_014710, - object_in_DL_014860, - object_in_DL_014420, - object_in_DL_012A78, - object_in_DL_013DE0, - object_in_DL_013F10, - object_in_DL_014040, - object_in_DL_0137A0, - object_in_DL_0138D0, - object_in_DL_013A00, - object_in_DL_012DF8, - object_in_DL_013670, - object_in_DL_013540, - object_in_DL_013440, + Gfx* sp50[OBJECT_IN_LIMB_MAX] = { + NULL, // OBJECT_IN_LIMB_NONE + NULL, // OBJECT_IN_LIMB_01 + object_in_DL_0149A8, // OBJECT_IN_LIMB_02 + object_in_DL_014AE0, // OBJECT_IN_LIMB_03 + object_in_DL_014C30, // OBJECT_IN_LIMB_04 + object_in_DL_0145D8, // OBJECT_IN_LIMB_05 + object_in_DL_014710, // OBJECT_IN_LIMB_06 + object_in_DL_014860, // OBJECT_IN_LIMB_07 + object_in_DL_014420, // OBJECT_IN_LIMB_08 + object_in_DL_012A78, // OBJECT_IN_LIMB_09 + object_in_DL_013DE0, // OBJECT_IN_LIMB_0A + object_in_DL_013F10, // OBJECT_IN_LIMB_0B + object_in_DL_014040, // OBJECT_IN_LIMB_0C + object_in_DL_0137A0, // OBJECT_IN_LIMB_0D + object_in_DL_0138D0, // OBJECT_IN_LIMB_0E + object_in_DL_013A00, // OBJECT_IN_LIMB_0F + object_in_DL_012DF8, // OBJECT_IN_LIMB_10 + object_in_DL_013670, // OBJECT_IN_LIMB_11 + object_in_DL_013540, // OBJECT_IN_LIMB_12 + object_in_DL_013440, // OBJECT_IN_LIMB_13 }; - if ((this->unk23C != 0) && (limbIndex != 16)) { + if ((this->unk23C != 0) && (limbIndex != OBJECT_IN_LIMB_10)) { if (sp50[limbIndex] != NULL) { *dList = sp50[limbIndex]; } } - if ((this->unk4AC & 4) && (limbIndex == 16)) { + if ((this->unk4AC & 4) && (limbIndex == OBJECT_IN_LIMB_10)) { *dList = object_in_DL_01C528; } OPEN_DISPS(play->state.gfxCtx); - if (limbIndex == 16) { + if (limbIndex == OBJECT_IN_LIMB_10) { TexturePtr sp38[] = { object_in_Tex_0035E0, object_in_Tex_004820, object_in_Tex_004C20, object_in_Tex_0043E0 }; gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sp38[this->unk482])); @@ -1668,31 +1679,34 @@ s32 EnIn_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* po CLOSE_DISPS(play->state.gfxCtx); - if (limbIndex == 16) { + if (limbIndex == OBJECT_IN_LIMB_10) { Matrix_Translate(1500.0f, 0.0f, 0.0f, MTXMODE_APPLY); Matrix_RotateXS(this->headRot.y, MTXMODE_APPLY); Matrix_RotateZS(-this->headRot.x, MTXMODE_APPLY); Matrix_Translate(-1500.0f, 0.0f, 0.0f, MTXMODE_APPLY); func_808F6334(this, play); } - if (limbIndex == 9) { + + if (limbIndex == OBJECT_IN_LIMB_09) { Matrix_RotateYS(this->torsoRot.y, MTXMODE_APPLY); Matrix_RotateXS(this->torsoRot.x, MTXMODE_APPLY); } - if ((limbIndex == 9) || (limbIndex == 10) || (limbIndex == 13)) { + + if ((limbIndex == OBJECT_IN_LIMB_09) || (limbIndex == OBJECT_IN_LIMB_0A) || (limbIndex == OBJECT_IN_LIMB_0D)) { rot->y += (s16)(Math_SinS(this->fidgetTableY[limbIndex]) * 200.0f); rot->z += (s16)(Math_CosS(this->fidgetTableZ[limbIndex]) * 200.0f); } + if (this->unk4AC & 0x40) { - if (limbIndex == 18) { + if (limbIndex == OBJECT_IN_LIMB_12) { rot->x = 0x1F40; rot->y = -0x3E8; rot->z = 0x1D4C; - } else if (limbIndex == 17) { + } else if (limbIndex == OBJECT_IN_LIMB_11) { rot->x = -0x1F40; rot->y = 0x3E8; rot->z = 0x1D4C; - } else if (limbIndex == 19) { + } else if (limbIndex == OBJECT_IN_LIMB_13) { rot->x = 0; rot->y = 0x7FFF; rot->z = -0x2328; @@ -1706,26 +1720,26 @@ void EnIn_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Vec3f sp50 = { 1600.0f, 0.0f, 0.0f }; Vec3f sp44 = { 0.0f, 0.0f, 0.0f }; - if (limbIndex == 16) { + if (limbIndex == OBJECT_IN_LIMB_10) { Matrix_MultVec3f(&sp50, &this->unk4B4); Math_Vec3f_Copy(&this->actor.focus.pos, &this->unk4B4); } if (this->unk23D == 0) { Collider_UpdateSpheres(limbIndex, &this->colliderJntSph); - if (limbIndex == 4) { + if (limbIndex == OBJECT_IN_LIMB_04) { Matrix_MultVec3f(&sp44, &this->unk248); } - if (limbIndex == 7) { + if (limbIndex == OBJECT_IN_LIMB_07) { Matrix_MultVec3f(&sp44, &this->unk254); } if (this->unk23C == 0) { if (!(this->unk4AC & 8)) { OPEN_DISPS(play->state.gfxCtx); - if (limbIndex == 12) { + if (limbIndex == OBJECT_IN_LIMB_0C) { gSPDisplayList(POLY_OPA_DISP++, object_in_DL_007A70); } - if (limbIndex == 15) { + if (limbIndex == OBJECT_IN_LIMB_0F) { gSPDisplayList(POLY_OPA_DISP++, object_in_DL_007C48); } @@ -1736,7 +1750,7 @@ void EnIn_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, if (this->unk4AC & 0x20) { OPEN_DISPS(play->state.gfxCtx); - if (limbIndex == 12) { + if (limbIndex == OBJECT_IN_LIMB_0C) { gSPDisplayList(POLY_OPA_DISP++, object_in_DL_007C48); } diff --git a/src/overlays/actors/ovl_En_In/z_en_in.h b/src/overlays/actors/ovl_En_In/z_en_in.h index c4833568c..ab774606a 100644 --- a/src/overlays/actors/ovl_En_In/z_en_in.h +++ b/src/overlays/actors/ovl_En_In/z_en_in.h @@ -16,7 +16,13 @@ typedef enum { /* 4 */ ENIN_BLUE_SHIRT } EnInType; -typedef enum { +#define ENIN_GET_TYPE(thisx) ((thisx)->params & 0x1FF) +#define ENIN_GET_PATH_INDEX(thisx) (((thisx)->params & 0x7E00) >> 9) // Only used with ENIN_UNK_TYPE + +#define ENIN_PATH_INDEX_NONE 0x3F + +typedef enum EnInAnimation { + /* -1 */ ENIN_ANIM_NONE = -1, /* 0 */ ENIN_ANIM_0, /* 1 */ ENIN_ANIM_1, /* 2 */ ENIN_ANIM_2, @@ -34,13 +40,22 @@ typedef enum { /* 14 */ ENIN_ANIM_14, /* 15 */ ENIN_ANIM_15, /* 16 */ ENIN_ANIM_16, - /* 17 */ ENIN_ANIM_17 + /* 17 */ ENIN_ANIM_17, + /* 18 */ ENIN_ANIM_MAX } EnInAnimation; -#define ENIN_GET_TYPE(thisx) ((thisx)->params & 0x1FF) -#define ENIN_GET_PATH_INDEX(thisx) (((thisx)->params & 0x7E00) >> 9) // Only used with ENIN_UNK_TYPE - -#define ENIN_PATH_INDEX_NONE 0x3F +typedef enum EnInAnimation2 { + /* -1 */ ENIN_ANIM2_NONE = -1, + /* 0 */ ENIN_ANIM2_0, + /* 1 */ ENIN_ANIM2_1, + /* 2 */ ENIN_ANIM2_2, + /* 3 */ ENIN_ANIM2_3, + /* 4 */ ENIN_ANIM2_4, + /* 5 */ ENIN_ANIM2_5, + /* 6 */ ENIN_ANIM2_6, + /* 7 */ ENIN_ANIM2_7, + /* 8 */ ENIN_ANIM2_MAX +} EnInAnimation2; typedef struct EnIn { /* 0x000 */ Actor actor; @@ -70,7 +85,7 @@ typedef struct EnIn { /* 0x482 */ s16 unk482; /* 0x484 */ s16 unk484; /* 0x486 */ s16 unk486; - /* 0x488 */ s16 unk488; + /* 0x488 */ s16 animIndex2; /* 0x48A */ u16 unk48A; /* 0x48C */ s32 unk48C; /* 0x490 */ UNK_TYPE1 unk490[0x4]; diff --git a/src/overlays/actors/ovl_En_Insect/z_en_insect.c b/src/overlays/actors/ovl_En_Insect/z_en_insect.c index 6a51e9486..9d8667f0a 100644 --- a/src/overlays/actors/ovl_En_Insect/z_en_insect.c +++ b/src/overlays/actors/ovl_En_Insect/z_en_insect.c @@ -5,7 +5,6 @@ */ #include "z_en_insect.h" -#include "objects/gameplay_keep/gameplay_keep.h" #define FLAGS 0x00000000 @@ -132,7 +131,7 @@ void EnInsect_Init(Actor* thisx, PlayState* play) { func_8091A8A0(this); SkelAnime_Init(play, &this->skelAnime, &gameplay_keep_Skel_0527A0, &gameplay_keep_Anim_05140C, this->jointTable, - this->morphTable, 24); + this->morphTable, BUG_LIMB_MAX); Animation_Change(&this->skelAnime, &gameplay_keep_Anim_05140C, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP_INTERP, 0.0f); Collider_InitJntSph(play, &this->collider); Collider_SetJntSph(play, &this->collider, &this->actor, &sJntSphInit, this->colliderElements); @@ -278,7 +277,9 @@ void func_8091B07C(EnInsect* this, PlayState* play) { yaw -= 0x2000; } + //! FAKE: if (play) {} + Math_ScaledStepToS(&this->actor.world.rot.y, yaw, 0x7D0); } diff --git a/src/overlays/actors/ovl_En_Insect/z_en_insect.h b/src/overlays/actors/ovl_En_Insect/z_en_insect.h index 4e1f5b762..4fd2985f1 100644 --- a/src/overlays/actors/ovl_En_Insect/z_en_insect.h +++ b/src/overlays/actors/ovl_En_Insect/z_en_insect.h @@ -2,6 +2,7 @@ #define Z_EN_INSECT_H #include "global.h" +#include "objects/gameplay_keep/gameplay_keep.h" struct EnInsect; @@ -16,8 +17,8 @@ typedef struct EnInsect { /* 0x144 */ ColliderJntSph collider; /* 0x164 */ ColliderJntSphElement colliderElements[1]; /* 0x1A4 */ SkelAnime skelAnime; - /* 0x1E8 */ Vec3s jointTable[24]; - /* 0x278 */ Vec3s morphTable[24]; + /* 0x1E8 */ Vec3s jointTable[BUG_LIMB_MAX]; + /* 0x278 */ Vec3s morphTable[BUG_LIMB_MAX]; /* 0x308 */ EnInsectActionFunc actionFunc; /* 0x30C */ u16 unk_30C; /* 0x30E */ s16 unk_30E; diff --git a/src/overlays/actors/ovl_En_Invisible_Ruppe/z_en_invisible_ruppe.c b/src/overlays/actors/ovl_En_Invisible_Ruppe/z_en_invisible_ruppe.c index ef64e3954..3a6c54983 100644 --- a/src/overlays/actors/ovl_En_Invisible_Ruppe/z_en_invisible_ruppe.c +++ b/src/overlays/actors/ovl_En_Invisible_Ruppe/z_en_invisible_ruppe.c @@ -75,6 +75,9 @@ void func_80C2590C(EnInvisibleRuppe* this, PlayState* play) { Audio_PlaySfx(NA_SE_SY_GET_RUPY); Item_DropCollectible(play, &this->actor.world.pos, 0x8000 | ITEM00_RUPEE_RED); break; + + default: + break; } if (this->unk_190 >= 0) { diff --git a/tools/disasm/functions.txt b/tools/disasm/functions.txt index 9a4244bc2..0ecbdb9b1 100644 --- a/tools/disasm/functions.txt +++ b/tools/disasm/functions.txt @@ -16283,8 +16283,8 @@ 0x80BF0F10:("EffStk_Draw",), 0x80BF1150:("func_80BF1150",), 0x80BF1200:("func_80BF1200",), - 0x80BF1258:("func_80BF1258",), - 0x80BF1284:("func_80BF1284",), + 0x80BF1258:("EnIg_UpdateSkelAnime",), + 0x80BF1284:("EnIg_ChangeAnim",), 0x80BF1354:("func_80BF1354",), 0x80BF13E4:("func_80BF13E4",), 0x80BF146C:("func_80BF146C",), From 33aaaea2c40228e4df2b3508b3f206eaf4186d92 Mon Sep 17 00:00:00 2001 From: engineer124 <47598039+engineer124@users.noreply.github.com> Date: Sat, 30 Sep 2023 17:28:14 +1000 Subject: [PATCH 07/16] Start Player Item Docs (#1396) * Copy Fig Docs * small cleanup * ItemChangeType comment * bool * item change comments * PR Review * rm comments --- include/functions.h | 2 +- include/z64player.h | 12 +- src/code/z_player_lib.c | 26 +- .../actors/ovl_player_actor/z_player.c | 588 ++++++++++-------- tools/disasm/functions.txt | 32 +- tools/disasm/variables.txt | 18 +- tools/sizes/code_functions.csv | 2 +- 7 files changed, 387 insertions(+), 293 deletions(-) diff --git a/include/functions.h b/include/functions.h index 88d8468e9..849329d94 100644 --- a/include/functions.h +++ b/include/functions.h @@ -884,7 +884,7 @@ s32 func_80123448(PlayState* play); s32 Player_IsGoronOrDeku(Player* player); s32 func_801234D4(PlayState* play); s32 func_80123590(PlayState* play, Actor* actor); -ItemId func_8012364C(PlayState* play, Player* player, s32 arg2); +ItemId Player_GetItemOnButton(PlayState* play, Player* player, EquipSlot slot); PlayerItemAction func_80123810(PlayState* play); PlayerModelGroup Player_ActionToModelGroup(Player* player, PlayerItemAction itemAction); void Player_SetModelsForHoldingShield(Player* player); diff --git a/include/z64player.h b/include/z64player.h index 11145480e..3f0af150a 100644 --- a/include/z64player.h +++ b/include/z64player.h @@ -1040,7 +1040,7 @@ typedef enum PlayerCueId { // breman mask march? #define PLAYER_STATE3_20000000 (1 << 29) // -#define PLAYER_STATE3_40000000 (1 << 30) +#define PLAYER_STATE3_START_CHANGING_HELD_ITEM (1 << 30) // TARGETING_HOSTILE? #define PLAYER_STATE3_80000000 (1 << 31) @@ -1095,7 +1095,7 @@ typedef struct Player { /* 0x14B */ u8 transformation; // PlayerTransformation enum /* 0x14C */ u8 modelGroup; // PlayerModelGroup enum /* 0x14D */ u8 nextModelGroup; - /* 0x14E */ s8 unk_14E; + /* 0x14E */ s8 itemChangeType; // ItemChangeType enum /* 0x14F */ u8 modelAnimType; // PlayerAnimType enum /* 0x150 */ u8 leftHandType; /* 0x151 */ u8 rightHandType; @@ -1122,7 +1122,7 @@ typedef struct Player { /* 0x238 */ OSMesg maskObjectLoadMsg; /* 0x23C */ void* maskObjectSegment; /* 0x240 */ SkelAnime skelAnime; - /* 0x284 */ SkelAnime unk_284; + /* 0x284 */ SkelAnime skelAnimeUpper; /* 0x2C8 */ SkelAnime unk_2C8; /* 0x30C */ Vec3s jointTable[5]; /* 0x32A */ Vec3s morphTable[5]; @@ -1176,8 +1176,8 @@ typedef struct Player { /* 0x74C */ u8 jointTableBuffer[PLAYER_LIMB_BUF_SIZE]; /* 0x7EB */ u8 morphTableBuffer[PLAYER_LIMB_BUF_SIZE]; /* 0x88A */ u8 blendTableBuffer[PLAYER_LIMB_BUF_SIZE]; - /* 0x929 */ u8 unk_929[PLAYER_LIMB_BUF_SIZE]; - /* 0x9C8 */ u8 unk_9C8[PLAYER_LIMB_BUF_SIZE]; + /* 0x929 */ u8 jointTableUpperBuffer[PLAYER_LIMB_BUF_SIZE]; + /* 0x9C8 */ u8 morphTableUpperBuffer[PLAYER_LIMB_BUF_SIZE]; /* 0xA68 */ PlayerAgeProperties* ageProperties; // repurposed as "transformation properties"? /* 0xA6C */ u32 stateFlags1; /* 0xA70 */ u32 stateFlags2; @@ -1206,7 +1206,7 @@ typedef struct Player { /* 0xABC */ f32 unk_ABC; /* 0xAC0 */ f32 unk_AC0; /* 0xAC4 */ PlayerUpperActionFunc upperActionFunc; // Upper body/item action functions - /* 0xAC8 */ f32 unk_AC8; + /* 0xAC8 */ f32 skelAnimeUpperBlendWeight; /* 0xACC */ s16 unk_ACC; /* 0xACE */ s8 unk_ACE; /* 0xACF */ u8 putAwayCountdown; // Frames to wait before showing "Put Away" on A diff --git a/src/code/z_player_lib.c b/src/code/z_player_lib.c index db9a8c974..24b55cfea 100644 --- a/src/code/z_player_lib.c +++ b/src/code/z_player_lib.c @@ -570,12 +570,12 @@ s32 func_801235DC(PlayState* play, f32 arg1, s16 arg2) { return false; } -ItemId func_8012364C(PlayState* play, Player* player, s32 arg2) { - if (arg2 >= 4) { +ItemId Player_GetItemOnButton(PlayState* play, Player* player, EquipSlot slot) { + if (slot >= EQUIP_SLOT_A) { return ITEM_NONE; } - if (arg2 == 0) { + if (slot == EQUIP_SLOT_B) { ItemId item = Inventory_GetBtnBItem(play); if (item >= ITEM_FD) { @@ -597,18 +597,24 @@ ItemId func_8012364C(PlayState* play, Player* player, s32 arg2) { return item; } - if (arg2 == 1) { + if (slot == EQUIP_SLOT_C_LEFT) { return C_BTN_ITEM(EQUIP_SLOT_C_LEFT); } - if (arg2 == 2) { + if (slot == EQUIP_SLOT_C_DOWN) { return C_BTN_ITEM(EQUIP_SLOT_C_DOWN); } + // EQUIP_SLOT_C_RIGHT + return C_BTN_ITEM(EQUIP_SLOT_C_RIGHT); } -u16 sCItemButtons[] = { BTN_CLEFT, BTN_CDOWN, BTN_CRIGHT }; +u16 sCItemButtons[] = { + BTN_CLEFT, + BTN_CDOWN, + BTN_CRIGHT, +}; PlayerItemAction func_80123810(PlayState* play) { Player* player = GET_PLAYER(play); @@ -630,7 +636,7 @@ PlayerItemAction func_80123810(PlayState* play) { for (i = 0; i < ARRAY_COUNT(sCItemButtons); i++) { if (CHECK_BTN_ALL(CONTROLLER1(&play->state)->press.button, sCItemButtons[i])) { i++; - itemId = func_8012364C(play, player, i); + itemId = Player_GetItemOnButton(play, player, i); play->interfaceCtx.unk_222 = 0; play->interfaceCtx.unk_224 = 0; @@ -2092,7 +2098,7 @@ s32 Player_OverrideLimbDrawGameplayCommon(PlayState* play, s32 limbIndex, Gfx** EnArrow* bubble = NULL; if (((player->skelAnime.animation == &gPlayerAnim_pn_drinkend)) || - (player->unk_284.animation == &gPlayerAnim_pn_tamahaki) || + (player->skelAnimeUpper.animation == &gPlayerAnim_pn_tamahaki) || ((player->stateFlags3 & PLAYER_STATE3_40) && ((bubble = (EnArrow*)player->heldActor) != NULL))) { Matrix_TranslateRotateZYX(pos, rot); func_80125340(); @@ -2108,7 +2114,7 @@ s32 Player_OverrideLimbDrawGameplayCommon(PlayState* play, s32 limbIndex, Gfx** } else if (player->skelAnime.animation == &gPlayerAnim_pn_drinkend) { func_80124618(D_801C03E0, player->skelAnime.curFrame, player->unk_AF0); } else { - func_80124618(D_801C03C0, player->unk_284.curFrame, player->unk_AF0); + func_80124618(D_801C03C0, player->skelAnimeUpper.curFrame, player->unk_AF0); } Matrix_Scale(player->unk_AF0[0].x, player->unk_AF0[0].y, player->unk_AF0[0].z, MTXMODE_APPLY); @@ -3784,7 +3790,7 @@ void Player_PostLimbDrawGameplay(PlayState* play, s32 limbIndex, Gfx** dList1, G Matrix_MultVec3f(&sPlayerFocusHeadLimbModelPos, &player->actor.focus.pos); Matrix_MultVec3f(&D_801C0E94, sPlayerCurBodyPartPos); if ((player->skelAnime.animation == &gPlayerAnim_pn_drinkend) || - (player->unk_284.animation == &gPlayerAnim_pn_tamahaki) || + (player->skelAnimeUpper.animation == &gPlayerAnim_pn_tamahaki) || ((player->stateFlags3 & PLAYER_STATE3_40) && ((spA8 = player->heldActor) != NULL))) { if (spA8 != NULL) { static Vec3f D_801C0EA0 = { 1300.0f, -400.0f, 0.0f }; diff --git a/src/overlays/actors/ovl_player_actor/z_player.c b/src/overlays/actors/ovl_player_actor/z_player.c index 8c1de93e5..d01dbd3be 100644 --- a/src/overlays/actors/ovl_player_actor/z_player.c +++ b/src/overlays/actors/ovl_player_actor/z_player.c @@ -64,9 +64,9 @@ void Player_UpdateCommon(Player* this, PlayState* play, Input* input); s32 Player_StartFishing(PlayState* play); void func_8085B170(PlayState* play, Player* this); s32 func_8083A658(PlayState* play, Player* this); -void func_8082F8BC(PlayState* play, Player* this, PlayerItemAction itemAction); +void Player_InitItemAction(PlayState* play, Player* this, PlayerItemAction itemAction); -void func_80831990(PlayState* play, Player* this, ItemId item); +void Player_UseItem(PlayState* play, Player* this, ItemId item); void func_80836988(Player* this, PlayState* play); @@ -210,7 +210,7 @@ void Player_Action_97(Player* this, PlayState* play); s32 Player_UpperAction_0(Player* this, PlayState* play); s32 Player_UpperAction_1(Player* this, PlayState* play); -s32 Player_UpperAction_2(Player* this, PlayState* play); +s32 Player_UpperAction_ChangeHeldItem(Player* this, PlayState* play); s32 Player_UpperAction_3(Player* this, PlayState* play); s32 Player_UpperAction_4(Player* this, PlayState* play); s32 Player_UpperAction_5(Player* this, PlayState* play); @@ -468,10 +468,10 @@ typedef struct MeleeWeaponDamageInfo { /* 0x7 */ u8 dmgHumanStrong; } MeleeWeaponDamageInfo; // size = 0x8 -typedef struct struct_8085CC88 { +typedef struct ItemChangeInfo { /* 0x0 */ PlayerAnimationHeader* anim; - /* 0x4 */ u8 frame; -} struct_8085CC88; // size = 0x8 + /* 0x4 */ u8 changeFrame; +} ItemChangeInfo; // size = 0x8 typedef struct { /* 0x0 */ u8 itemId; @@ -504,7 +504,7 @@ typedef struct struct_8085D200 { f32 sPlayerControlStickMagnitude; s16 sPlayerControlStickAngle; s16 D_80862B02; // analog stick yaw + camera yaw -s32 D_80862B04; // boolean, set to the return value of func_8083216C +s32 D_80862B04; // boolean, set to the return value of Player_UpdateUpperBody FloorType sPlayerFloorType; u32 sPlayerTouchedWallFlags; ConveyorSpeed sPlayerConveyorSpeedIndex; @@ -520,10 +520,10 @@ Vec3f sPlayerInteractWallCheckResult; f32 D_80862B3C; FloorEffect sPlayerFloorEffect; Input* sPlayerControlInput; -s32 D_80862B48; -s32 D_80862B4C; -EnvLightSettings D_80862B50; // backup of play->envCtx.lightSettings -s32 D_80862B6C; // this->skelAnime.moveFlags // sPlayerSkelMoveFlags? +s32 sPlayerUseHeldItem; // When true, the current held item is used. Is reset to false every frame. +s32 sPlayerHeldItemButtonIsHeldDown; // Indicates if the button for the current held item is held down. +EnvLightSettings D_80862B50; // backup of play->envCtx.lightSettings +s32 D_80862B6C; // this->skelAnime.moveFlags // sPlayerSkelMoveFlags? s32 func_8082DA90(PlayState* play) { return (play->transitionTrigger != TRANS_TRIGGER_OFF) || (play->transitionMode != TRANS_MODE_OFF); @@ -586,7 +586,7 @@ void func_8082DC64(PlayState* play, Player* this) { this->stateFlags2 &= ~(PLAYER_STATE2_400 | PLAYER_STATE2_800); } -void func_8082DCA0(PlayState* play, Player* this) { +void Player_DetachHeldActor(PlayState* play, Player* this) { Actor* heldActor = this->heldActor; if ((heldActor != NULL) && !Player_IsHoldingHookshot(this)) { @@ -598,7 +598,7 @@ void func_8082DCA0(PlayState* play, Player* this) { } if (Player_GetExplosiveHeld(this) > PLAYER_EXPLOSIVE_NONE) { - func_8082F8BC(play, this, PLAYER_IA_NONE); + Player_InitItemAction(play, this, PLAYER_IA_NONE); this->heldItemId = ITEM_FE; } } @@ -632,7 +632,7 @@ void func_8082DD2C(PlayState* play, Player* this) { s32 func_8082DE14(PlayState* play, Player* this) { if (this->heldItemAction > PLAYER_IA_LAST_USED) { - func_80831990(play, this, ITEM_NONE); + Player_UseItem(play, this, ITEM_NONE); return true; } else { return false; @@ -641,7 +641,7 @@ s32 func_8082DE14(PlayState* play, Player* this) { void func_8082DE50(PlayState* play, Player* this) { func_8082DD2C(play, this); - func_8082DCA0(play, this); + Player_DetachHeldActor(play, this); } s32 func_8082DE88(Player* this, s32 arg1, s32 arg2) { @@ -663,7 +663,7 @@ void func_8082DF2C(PlayState* play) { } } -u8 D_8085B9F0[PLAYER_LIMB_MAX] = { +u8 sPlayerUpperBodyLimbCopyMap[PLAYER_LIMB_MAX] = { false, // PLAYER_LIMB_NONE false, // PLAYER_LIMB_ROOT false, // PLAYER_LIMB_WAIST @@ -2863,30 +2863,30 @@ void func_8082F1AC(PlayState* play, Player* this) { void Player_SetUpperAction(PlayState* play, Player* this, PlayerUpperActionFunc upperActionFunc) { this->upperActionFunc = upperActionFunc; this->unk_ACE = 0; - this->unk_AC8 = 0.0f; + this->skelAnimeUpperBlendWeight = 0.0f; func_8082E00C(this); } #define GET_PLAYER_ANIM(group, type) ((PlayerAnimationHeader**)D_8085BE84)[group * PLAYER_ANIMTYPE_MAX + type] -void func_8082F470(PlayState* play, Player* this, PlayerItemAction itemAction) { +void Player_InitItemActionWithAnim(PlayState* play, Player* this, PlayerItemAction itemAction) { PlayerAnimationHeader* curAnim = this->skelAnime.animation; PlayerAnimationHeader*(*iter)[PLAYER_ANIMTYPE_MAX] = (void*)&D_8085BE84[0][this->modelAnimType]; - s32 i; + s32 animGroup; this->stateFlags1 &= ~(PLAYER_STATE1_8 | PLAYER_STATE1_1000000); - for (i = 0; i < PLAYER_ANIMGROUP_MAX; i++) { + for (animGroup = 0; animGroup < PLAYER_ANIMGROUP_MAX; animGroup++) { if (curAnim == **iter) { break; } iter++; } - func_8082F8BC(play, this, itemAction); + Player_InitItemAction(play, this, itemAction); - if (i < PLAYER_ANIMGROUP_MAX) { - this->skelAnime.animation = GET_PLAYER_ANIM(i, this->modelAnimType); + if (animGroup < PLAYER_ANIMGROUP_MAX) { + this->skelAnime.animation = GET_PLAYER_ANIM(animGroup, this->modelAnimType); } } @@ -2988,7 +2988,7 @@ PlayerItemAction Player_ItemToItemAction(Player* this, ItemId item) { } } -PlayerUpperActionFunc D_8085C9F0[PLAYER_IA_MAX] = { +PlayerUpperActionFunc sPlayerUpperActionUpdateFuncs[PLAYER_IA_MAX] = { Player_UpperAction_0, // PLAYER_IA_NONE Player_UpperAction_0, // PLAYER_IA_LAST_USED Player_UpperAction_0, // PLAYER_IA_FISHING_ROD @@ -3076,7 +3076,7 @@ PlayerUpperActionFunc D_8085C9F0[PLAYER_IA_MAX] = { typedef void (*PlayerInitItemActionFunc)(PlayState*, Player*); -PlayerInitItemActionFunc sPlayerInitItemActionFuncs[PLAYER_IA_MAX] = { +PlayerInitItemActionFunc sPlayerItemActionInitFuncs[PLAYER_IA_MAX] = { Player_InitItemAction_DoNothing, // PLAYER_IA_NONE Player_InitItemAction_DoNothing, // PLAYER_IA_LAST_USED Player_InitItemAction_DoNothing, // PLAYER_IA_FISHING_ROD @@ -3189,27 +3189,94 @@ void func_8082F5FC(Player* this, Actor* actor) { this->stateFlags1 |= PLAYER_STATE1_800; } -struct_8085CC88 D_8085CC88[] = { - { &gPlayerAnim_link_normal_free2free, 12 }, - { &gPlayerAnim_link_normal_normal2fighter, 6 }, - { &gPlayerAnim_link_hammer_normal2long, 8 }, - { &gPlayerAnim_link_normal_normal2free, 8 }, - { &gPlayerAnim_link_fighter_fighter2long, 8 }, - { &gPlayerAnim_link_normal_fighter2free, 10 }, - { &gPlayerAnim_link_hammer_long2free, 7 }, - { &gPlayerAnim_link_hammer_long2long, 11 }, - { &gPlayerAnim_link_normal_free2free, 12 }, - { &gPlayerAnim_link_normal_normal2bom, 4 }, - { &gPlayerAnim_link_normal_long2bom, 4 }, - { &gPlayerAnim_link_normal_free2bom, 4 }, - { &gPlayerAnim_link_anchor_anchor2fighter, 5 }, - { &gPlayerAnim_link_normal_free2freeB, 13 }, - { &gPlayerAnim_pz_bladeon, 4 }, +typedef enum ItemChangeType { + /* 0 */ PLAYER_ITEM_CHG_0, + /* 1 */ PLAYER_ITEM_CHG_1, + /* 2 */ PLAYER_ITEM_CHG_2, + /* 3 */ PLAYER_ITEM_CHG_3, + /* 4 */ PLAYER_ITEM_CHG_4, + /* 5 */ PLAYER_ITEM_CHG_5, + /* 6 */ PLAYER_ITEM_CHG_6, + /* 7 */ PLAYER_ITEM_CHG_7, + /* 8 */ PLAYER_ITEM_CHG_8, + /* 9 */ PLAYER_ITEM_CHG_9, + /* 10 */ PLAYER_ITEM_CHG_10, + /* 11 */ PLAYER_ITEM_CHG_11, + /* 12 */ PLAYER_ITEM_CHG_12, + /* 13 */ PLAYER_ITEM_CHG_13, + /* 14 */ PLAYER_ITEM_CHG_14, + /* 15 */ PLAYER_ITEM_CHG_MAX +} ItemChangeType; + +ItemChangeInfo sPlayerItemChangeInfo[PLAYER_ITEM_CHG_MAX] = { + { &gPlayerAnim_link_normal_free2free, 12 }, // PLAYER_ITEM_CHG_0 + { &gPlayerAnim_link_normal_normal2fighter, 6 }, // PLAYER_ITEM_CHG_1 + { &gPlayerAnim_link_hammer_normal2long, 8 }, // PLAYER_ITEM_CHG_2 + { &gPlayerAnim_link_normal_normal2free, 8 }, // PLAYER_ITEM_CHG_3 + { &gPlayerAnim_link_fighter_fighter2long, 8 }, // PLAYER_ITEM_CHG_4 + { &gPlayerAnim_link_normal_fighter2free, 10 }, // PLAYER_ITEM_CHG_5 + { &gPlayerAnim_link_hammer_long2free, 7 }, // PLAYER_ITEM_CHG_6 + { &gPlayerAnim_link_hammer_long2long, 11 }, // PLAYER_ITEM_CHG_7 + { &gPlayerAnim_link_normal_free2free, 12 }, // PLAYER_ITEM_CHG_8 + { &gPlayerAnim_link_normal_normal2bom, 4 }, // PLAYER_ITEM_CHG_9 + { &gPlayerAnim_link_normal_long2bom, 4 }, // PLAYER_ITEM_CHG_10 + { &gPlayerAnim_link_normal_free2bom, 4 }, // PLAYER_ITEM_CHG_11 + { &gPlayerAnim_link_anchor_anchor2fighter, 5 }, // PLAYER_ITEM_CHG_12 + { &gPlayerAnim_link_normal_free2freeB, 13 }, // PLAYER_ITEM_CHG_13 + { &gPlayerAnim_pz_bladeon, 4 }, // PLAYER_ITEM_CHG_14 }; -s8 D_8085CD00[PLAYER_ANIMTYPE_MAX][PLAYER_ANIMTYPE_MAX] = { - { 8, -5, -3, -6, 8, 0xB }, { 5, 0, -1, 4, 5, 9 }, { 3, 1, 0, 2, 3, 9 }, - { 6, -4, -2, 7, 6, 0xA }, { 8, -5, -3, -6, 8, 0xB }, { 8, -5, -3, -6, 8, 0xB }, +// Maps the appropriate ItemChangeType based on current and next animtype. +// A negative type value means the corresponding animation should be played in reverse. +s8 sPlayerItemChangeTypes[PLAYER_ANIMTYPE_MAX][PLAYER_ANIMTYPE_MAX] = { + { + PLAYER_ITEM_CHG_8, // PLAYER_ANIMTYPE_DEFAULT -> PLAYER_ANIMTYPE_DEFAULT + -PLAYER_ITEM_CHG_5, // PLAYER_ANIMTYPE_DEFAULT -> PLAYER_ANIMTYPE_1 + -PLAYER_ITEM_CHG_3, // PLAYER_ANIMTYPE_DEFAULT -> PLAYER_ANIMTYPE_2 + -PLAYER_ITEM_CHG_6, // PLAYER_ANIMTYPE_DEFAULT -> PLAYER_ANIMTYPE_3 + PLAYER_ITEM_CHG_8, // PLAYER_ANIMTYPE_DEFAULT -> PLAYER_ANIMTYPE_4 + PLAYER_ITEM_CHG_11, // PLAYER_ANIMTYPE_DEFAULT -> PLAYER_ANIMTYPE_5 + }, + { + PLAYER_ITEM_CHG_5, // PLAYER_ANIMTYPE_1 -> PLAYER_ANIMTYPE_DEFAULT + PLAYER_ITEM_CHG_0, // PLAYER_ANIMTYPE_1 -> PLAYER_ANIMTYPE_1 + -PLAYER_ITEM_CHG_1, // PLAYER_ANIMTYPE_1 -> PLAYER_ANIMTYPE_2 + PLAYER_ITEM_CHG_4, // PLAYER_ANIMTYPE_1 -> PLAYER_ANIMTYPE_3 + PLAYER_ITEM_CHG_5, // PLAYER_ANIMTYPE_1 -> PLAYER_ANIMTYPE_4 + PLAYER_ITEM_CHG_9, // PLAYER_ANIMTYPE_1 -> PLAYER_ANIMTYPE_5 + }, + { + PLAYER_ITEM_CHG_3, // PLAYER_ANIMTYPE_2 -> PLAYER_ANIMTYPE_DEFAULT + PLAYER_ITEM_CHG_1, // PLAYER_ANIMTYPE_2 -> PLAYER_ANIMTYPE_1 + PLAYER_ITEM_CHG_0, // PLAYER_ANIMTYPE_2 -> PLAYER_ANIMTYPE_2 + PLAYER_ITEM_CHG_2, // PLAYER_ANIMTYPE_2 -> PLAYER_ANIMTYPE_3 + PLAYER_ITEM_CHG_3, // PLAYER_ANIMTYPE_2 -> PLAYER_ANIMTYPE_4 + PLAYER_ITEM_CHG_9, // PLAYER_ANIMTYPE_2 -> PLAYER_ANIMTYPE_5 + }, + { + PLAYER_ITEM_CHG_6, // PLAYER_ANIMTYPE_3 -> PLAYER_ANIMTYPE_DEFAULT + -PLAYER_ITEM_CHG_4, // PLAYER_ANIMTYPE_3 -> PLAYER_ANIMTYPE_1 + -PLAYER_ITEM_CHG_2, // PLAYER_ANIMTYPE_3 -> PLAYER_ANIMTYPE_2 + PLAYER_ITEM_CHG_7, // PLAYER_ANIMTYPE_3 -> PLAYER_ANIMTYPE_3 + PLAYER_ITEM_CHG_6, // PLAYER_ANIMTYPE_3 -> PLAYER_ANIMTYPE_4 + PLAYER_ITEM_CHG_10, // PLAYER_ANIMTYPE_3 -> PLAYER_ANIMTYPE_5 + }, + { + PLAYER_ITEM_CHG_8, // PLAYER_ANIMTYPE_4 -> PLAYER_ANIMTYPE_DEFAULT + -PLAYER_ITEM_CHG_5, // PLAYER_ANIMTYPE_4 -> PLAYER_ANIMTYPE_1 + -PLAYER_ITEM_CHG_3, // PLAYER_ANIMTYPE_4 -> PLAYER_ANIMTYPE_2 + -PLAYER_ITEM_CHG_6, // PLAYER_ANIMTYPE_4 -> PLAYER_ANIMTYPE_3 + PLAYER_ITEM_CHG_8, // PLAYER_ANIMTYPE_4 -> PLAYER_ANIMTYPE_4 + PLAYER_ITEM_CHG_11, // PLAYER_ANIMTYPE_4 -> PLAYER_ANIMTYPE_5 + }, + { + PLAYER_ITEM_CHG_8, // PLAYER_ANIMTYPE_5 -> PLAYER_ANIMTYPE_DEFAULT + -PLAYER_ITEM_CHG_5, // PLAYER_ANIMTYPE_5 -> PLAYER_ANIMTYPE_1 + -PLAYER_ITEM_CHG_3, // PLAYER_ANIMTYPE_5 -> PLAYER_ANIMTYPE_2 + -PLAYER_ITEM_CHG_6, // PLAYER_ANIMTYPE_5 -> PLAYER_ANIMTYPE_3 + PLAYER_ITEM_CHG_8, // PLAYER_ANIMTYPE_5 -> PLAYER_ANIMTYPE_4 + PLAYER_ITEM_CHG_11, // PLAYER_ANIMTYPE_5 -> PLAYER_ANIMTYPE_5 + }, }; ExplosiveInfo sPlayerExplosiveInfo[PLAYER_EXPLOSIVE_MAX] = { @@ -3271,7 +3338,7 @@ void Player_InitItemAction_SpawnHookshot(PlayState* play, Player* this) { this->actor.world.pos.y, this->actor.world.pos.z, 0, this->actor.shape.rot.y, 0, 0); if (this->heldActor == NULL) { - func_80831990(play, this, ITEM_NONE); + Player_UseItem(play, this, ITEM_NONE); return; } armsHook = (ArmsHook*)this->heldActor; @@ -3283,7 +3350,7 @@ void Player_InitItemAction_5(PlayState* play, Player* this) { this->stateFlags1 |= PLAYER_STATE1_1000000; } -void func_8082F8BC(PlayState* play, Player* this, PlayerItemAction itemAction) { +void Player_InitItemAction(PlayState* play, Player* this, PlayerItemAction itemAction) { this->itemAction = this->heldItemAction = itemAction; this->modelGroup = this->nextModelGroup; @@ -3293,7 +3360,7 @@ void func_8082F8BC(PlayState* play, Player* this, PlayerItemAction itemAction) { this->unk_B0C = 0.0f; this->unk_B28 = 0; - sPlayerInitItemActionFuncs[itemAction](play, this); + sPlayerItemActionInitFuncs[itemAction](play, this); Player_SetModelGroup(this, this->modelGroup); } @@ -3528,7 +3595,7 @@ void func_8082FC60(Player* this) { this->unk_B40 = 0.0f; } -s32 func_8082FC78(Player* this, ItemId item) { +s32 Player_ItemIsInUse(Player* this, ItemId item) { if ((item < ITEM_FD) && (Player_ItemToItemAction(this, item) == this->itemAction)) { return true; } else { @@ -3536,7 +3603,7 @@ s32 func_8082FC78(Player* this, ItemId item) { } } -s32 func_8082FCC4(Player* this, ItemId item, PlayerItemAction itemAction) { +s32 Player_ItemIsItemAction(Player* this, ItemId item, PlayerItemAction itemAction) { if ((item < ITEM_FD) && (Player_ItemToItemAction(this, item) == itemAction)) { return true; } else { @@ -3548,7 +3615,7 @@ EquipSlot func_8082FD0C(Player* this, PlayerItemAction itemAction) { s32 btn; for (btn = EQUIP_SLOT_C_LEFT; btn <= EQUIP_SLOT_C_RIGHT; btn++) { - if (func_8082FCC4(this, GET_CUR_FORM_BTN_ITEM(btn), itemAction)) { + if (Player_ItemIsItemAction(this, GET_CUR_FORM_BTN_ITEM(btn), itemAction)) { return btn; } } @@ -3556,7 +3623,7 @@ EquipSlot func_8082FD0C(Player* this, PlayerItemAction itemAction) { return EQUIP_SLOT_NONE; } -u16 D_8085CFA8[] = { +u16 sPlayerItemButtons[] = { BTN_B, BTN_CLEFT, BTN_CDOWN, @@ -3567,8 +3634,8 @@ u16 D_8085CFA8[] = { EquipSlot func_8082FDC4(void) { EquipSlot i; - for (i = 0; i < ARRAY_COUNT(D_8085CFA8); i++) { - if (CHECK_BTN_ALL(sPlayerControlInput->press.button, D_8085CFA8[i])) { + for (i = 0; i < ARRAY_COUNT(sPlayerItemButtons); i++) { + if (CHECK_BTN_ALL(sPlayerControlInput->press.button, sPlayerItemButtons[i])) { break; } } @@ -3576,7 +3643,10 @@ EquipSlot func_8082FDC4(void) { return i; } -void func_8082FE0C(Player* this, PlayState* play) { +/** + * Handles the high level item usage and changing process based on the B and C buttons. + */ +void Player_ProcessItemButtons(Player* this, PlayState* play) { if (this->stateFlags1 & (PLAYER_STATE1_800 | PLAYER_STATE1_20000000)) { return; } @@ -3602,7 +3672,7 @@ void func_8082FE0C(Player* this, PlayState* play) { if ((maskIdMinusOne < PLAYER_MASK_TRUTH - 1) || (maskIdMinusOne >= PLAYER_MASK_MAX - 1)) { maskIdMinusOne = this->currentMask - 1; } - func_80831990(play, this, Player_MaskIdToItemId(maskIdMinusOne)); + Player_UseItem(play, this, Player_MaskIdToItemId(maskIdMinusOne)); return; } @@ -3616,10 +3686,11 @@ void func_8082FE0C(Player* this, PlayState* play) { if (((this->actor.id == ACTOR_PLAYER) && (this->itemAction >= PLAYER_IA_FISHING_ROD)) && !(((Player_GetHeldBButtonSword(this) == PLAYER_B_SWORD_NONE) || (gSaveContext.jinxTimer == 0)) && - (func_8082FC78(this, (IREG(1) != 0) ? ITEM_FISHING_ROD : Inventory_GetBtnBItem(play)) || - func_8082FC78(this, C_BTN_ITEM(EQUIP_SLOT_C_LEFT)) || func_8082FC78(this, C_BTN_ITEM(EQUIP_SLOT_C_DOWN)) || - func_8082FC78(this, C_BTN_ITEM(EQUIP_SLOT_C_RIGHT))))) { - func_80831990(play, this, ITEM_NONE); + (Player_ItemIsInUse(this, (IREG(1) != 0) ? ITEM_FISHING_ROD : Inventory_GetBtnBItem(play)) || + Player_ItemIsInUse(this, C_BTN_ITEM(EQUIP_SLOT_C_LEFT)) || + Player_ItemIsInUse(this, C_BTN_ITEM(EQUIP_SLOT_C_DOWN)) || + Player_ItemIsInUse(this, C_BTN_ITEM(EQUIP_SLOT_C_RIGHT))))) { + Player_UseItem(play, this, ITEM_NONE); } else { s32 pad; ItemId item; @@ -3630,17 +3701,18 @@ void func_8082FE0C(Player* this, PlayState* play) { ? EQUIP_SLOT_B : i; - item = func_8012364C(play, this, i); + item = Player_GetItemOnButton(play, this, i); + if (item >= ITEM_FD) { - for (i = 0; i < ARRAY_COUNT(D_8085CFA8); i++) { - if (CHECK_BTN_ALL(sPlayerControlInput->cur.button, D_8085CFA8[i])) { + for (i = 0; i < ARRAY_COUNT(sPlayerItemButtons); i++) { + if (CHECK_BTN_ALL(sPlayerControlInput->cur.button, sPlayerItemButtons[i])) { break; } } - item = func_8012364C(play, this, i); + item = Player_GetItemOnButton(play, this, i); if ((item < ITEM_FD) && (Player_ItemToItemAction(this, item) == this->heldItemAction)) { - D_80862B4C = 1; + sPlayerHeldItemButtonIsHeldDown = true; } } else if (item == ITEM_F0) { if (this->blastMaskTimer == 0) { @@ -3664,44 +3736,45 @@ void func_8082FE0C(Player* this, PlayState* play) { } } else { this->heldItemButton = i; - func_80831990(play, this, item); + Player_UseItem(play, this, item); } } } -void func_808302CC(Player* this, PlayState* play) { +void Player_StartChangingHeldItem(Player* this, PlayState* play) { PlayerAnimationHeader* anim; s32 pad[3]; u8 nextModelAnimType; - s32 var_v1; - s8 itemAction = Player_ItemToItemAction(this, this->heldItemId); + s32 itemChangeType; + s8 heldItemAction = Player_ItemToItemAction(this, this->heldItemId); s32 pad3; f32 startFrame; f32 endFrame; f32 frameSpeed; - Player_SetUpperAction(play, this, Player_UpperAction_2); + Player_SetUpperAction(play, this, Player_UpperAction_ChangeHeldItem); nextModelAnimType = gPlayerModelTypes[this->nextModelGroup].modelAnimType; - var_v1 = D_8085CD00[gPlayerModelTypes[this->modelGroup].modelAnimType][nextModelAnimType]; + itemChangeType = sPlayerItemChangeTypes[gPlayerModelTypes[this->modelGroup].modelAnimType][nextModelAnimType]; - if ((itemAction == PLAYER_IA_ZORA_FINS) || (this->heldItemAction == PLAYER_IA_ZORA_FINS)) { - var_v1 = (itemAction == PLAYER_IA_NONE) ? -14 : 14; - } else if ((itemAction == PLAYER_IA_BOTTLE_EMPTY) || (itemAction == PLAYER_IA_11) || - ((itemAction == PLAYER_IA_NONE) && + if ((heldItemAction == PLAYER_IA_ZORA_FINS) || (this->heldItemAction == PLAYER_IA_ZORA_FINS)) { + itemChangeType = (heldItemAction == PLAYER_IA_NONE) ? -PLAYER_ITEM_CHG_14 : PLAYER_ITEM_CHG_14; + } else if ((heldItemAction == PLAYER_IA_BOTTLE_EMPTY) || (heldItemAction == PLAYER_IA_11) || + ((heldItemAction == PLAYER_IA_NONE) && ((this->heldItemAction == PLAYER_IA_BOTTLE_EMPTY) || (this->heldItemAction == PLAYER_IA_11)))) { - var_v1 = (itemAction == PLAYER_IA_NONE) ? -13 : 13; + itemChangeType = (heldItemAction == PLAYER_IA_NONE) ? -PLAYER_ITEM_CHG_13 : PLAYER_ITEM_CHG_13; } - this->unk_14E = ABS_ALT(var_v1); - anim = D_8085CC88[this->unk_14E].anim; + this->itemChangeType = ABS_ALT(itemChangeType); + anim = sPlayerItemChangeInfo[this->itemChangeType].anim; + if ((anim == &gPlayerAnim_link_normal_fighter2free) && (this->currentShield == PLAYER_SHIELD_NONE)) { anim = &gPlayerAnim_link_normal_free2fighter_free; } endFrame = Animation_GetLastFrame(anim); - if (var_v1 >= 0) { + if (itemChangeType >= 0) { frameSpeed = 1.2f; startFrame = 0.0f; } else { @@ -3710,30 +3783,31 @@ void func_808302CC(Player* this, PlayState* play) { endFrame = 0.0f; } - if (itemAction != PLAYER_IA_NONE) { + if (heldItemAction != PLAYER_IA_NONE) { frameSpeed *= 2.0f; } - PlayerAnimation_Change(play, &this->unk_284, anim, frameSpeed, startFrame, endFrame, ANIMMODE_ONCE, 0.0f); - this->stateFlags3 &= ~PLAYER_STATE3_40000000; + PlayerAnimation_Change(play, &this->skelAnimeUpper, anim, frameSpeed, startFrame, endFrame, ANIMMODE_ONCE, 0.0f); + + this->stateFlags3 &= ~PLAYER_STATE3_START_CHANGING_HELD_ITEM; } -void func_808304BC(Player* this, PlayState* play) { - if ((this->actor.id == ACTOR_PLAYER) && !(this->stateFlags3 & PLAYER_STATE3_40000000)) { +void Player_UpdateItems(Player* this, PlayState* play) { + if ((this->actor.id == ACTOR_PLAYER) && !(this->stateFlags3 & PLAYER_STATE3_START_CHANGING_HELD_ITEM)) { if ((this->heldItemAction == this->itemAction) || (this->stateFlags1 & PLAYER_STATE1_400000)) { if ((gSaveContext.save.saveInfo.playerData.health != 0) && (play->csCtx.state == CS_STATE_IDLE)) { if ((this->csMode == PLAYER_CSMODE_NONE) && (play->unk_1887C == 0) && (play->activeCamId == CAM_ID_MAIN)) { if (!func_8082DA90(play) && (gSaveContext.timerStates[TIMER_ID_MINIGAME_2] != TIMER_STATE_STOP)) { - func_8082FE0C(this, play); + Player_ProcessItemButtons(this, play); } } } } } - if (this->stateFlags3 & PLAYER_STATE3_40000000) { - func_808302CC(this, play); + if (this->stateFlags3 & PLAYER_STATE3_START_CHANGING_HELD_ITEM) { + Player_StartChangingHeldItem(this, play); } } @@ -3836,8 +3910,7 @@ s32 func_808306F8(Player* this, PlayState* play) { return false; } -// Take out / put away sounds? -void func_808308DC(PlayState* play, Player* this) { +void Player_FinishItemChange(PlayState* play, Player* this) { s32 isGoronOrDeku = (this->transformation == PLAYER_FORM_GORON) || (this->transformation == PLAYER_FORM_DEKU); if ((this->heldItemAction != PLAYER_IA_NONE) && !isGoronOrDeku) { @@ -3848,7 +3921,7 @@ void func_808308DC(PlayState* play, Player* this) { } } - func_80831990(play, this, this->heldItemId); + Player_UseItem(play, this, this->heldItemId); if (!isGoronOrDeku) { if (Player_SwordFromIA(this, this->heldItemAction) > PLAYER_SWORD_NONE) { @@ -3860,15 +3933,15 @@ void func_808308DC(PlayState* play, Player* this) { } void func_808309CC(PlayState* play, Player* this) { - if (Player_UpperAction_2 == this->upperActionFunc) { - func_808308DC(play, this); + if (Player_UpperAction_ChangeHeldItem == this->upperActionFunc) { + Player_FinishItemChange(play, this); } - Player_SetUpperAction(play, this, D_8085C9F0[this->heldItemAction]); + Player_SetUpperAction(play, this, sPlayerUpperActionUpdateFuncs[this->heldItemAction]); this->unk_ACC = 0; this->unk_AA4 = 0; - func_8082DCA0(play, this); - this->stateFlags3 &= ~PLAYER_STATE3_40000000; + Player_DetachHeldActor(play, this); + this->stateFlags3 &= ~PLAYER_STATE3_START_CHANGING_HELD_ITEM; } PlayerAnimationHeader* D_8085CFBC[2] = { @@ -3894,7 +3967,7 @@ PlayerAnimationHeader* D_8085CFDC[2] = { PlayerAnimationHeader* func_80830A58(PlayState* play, Player* this) { Player_SetUpperAction(play, this, Player_UpperAction_3); - func_8082DCA0(play, this); + Player_DetachHeldActor(play, this); if (this->unk_B40 < 0.5f) { return D_8085CFBC[Player_IsHoldingTwoHandedWeapon(this)]; @@ -3933,9 +4006,9 @@ s32 func_80830B88(PlayState* play, Player* this) { (this->currentShield != PLAYER_SHIELD_NONE))) && func_8082FBE8(this))) { PlayerAnimationHeader* anim = func_80830A58(play, this); - f32 lastFrame = Animation_GetLastFrame(anim); + f32 endFrame = Animation_GetLastFrame(anim); - PlayerAnimation_Change(play, &this->unk_284, anim, 3.0f / 3.0f, lastFrame, lastFrame, + PlayerAnimation_Change(play, &this->skelAnimeUpper, anim, 3.0f / 3.0f, endFrame, endFrame, ANIMMODE_ONCE, 0.0f); func_80830AE8(this); return true; @@ -3955,26 +4028,28 @@ void func_80830CE8(PlayState* play, Player* this) { func_80123C58(this); } - Animation_Reverse(&this->unk_284); + Animation_Reverse(&this->skelAnimeUpper); func_80830B38(this); } -void func_80830D40(PlayState* play, Player* this) { - struct_8085CC88* entry = &D_8085CC88[this->unk_14E]; - f32 frame = entry->frame; +void Player_WaitToFinishItemChange(PlayState* play, Player* this) { + ItemChangeInfo* itemChangeEntry = &sPlayerItemChangeInfo[this->itemChangeType]; + f32 changeFrame = itemChangeEntry->changeFrame; - if (this->unk_284.playSpeed < 0.0f) { - frame -= 1.0f; + if (this->skelAnimeUpper.playSpeed < 0.0f) { + changeFrame -= 1.0f; } - if (PlayerAnimation_OnFrame(&this->unk_284, frame)) { - func_808308DC(play, this); + + if (PlayerAnimation_OnFrame(&this->skelAnimeUpper, changeFrame)) { + Player_FinishItemChange(play, this); } + func_8082FB68(this); } s32 func_80830DF0(Player* this, PlayState* play) { - if (this->stateFlags3 & PLAYER_STATE3_40000000) { - func_808302CC(this, play); + if (this->stateFlags3 & PLAYER_STATE3_START_CHANGING_HELD_ITEM) { + Player_StartChangingHeldItem(this, play); } else { return false; } @@ -3985,7 +4060,7 @@ s32 func_80830E30(Player* this, PlayState* play) { if ((this->heldItemAction == PLAYER_IA_11) || (this->transformation == PLAYER_FORM_ZORA)) { Player_SetUpperAction(play, this, Player_UpperAction_12); - PlayerAnimation_PlayOnce(play, &this->unk_284, + PlayerAnimation_PlayOnce(play, &this->skelAnimeUpper, (this->meleeWeaponAnimation == PLAYER_MWA_ZORA_PUNCH_LEFT) ? &gPlayerAnim_pz_cutterwaitA : ((this->meleeWeaponAnimation == PLAYER_MWA_ZORA_PUNCH_COMBO) @@ -3997,7 +4072,7 @@ s32 func_80830E30(Player* this, PlayState* play) { return false; } - PlayerAnimation_PlayOnce(play, &this->unk_284, + PlayerAnimation_PlayOnce(play, &this->skelAnimeUpper, (Player_IsHoldingHookshot(this)) ? &gPlayerAnim_link_hook_shot_ready : ((this->transformation == PLAYER_FORM_DEKU) ? &gPlayerAnim_pn_tamahakidf @@ -4036,7 +4111,7 @@ s32 func_80831010(Player* this, PlayState* play) { s32 func_80831094(Player* this, PlayState* play) { if ((this->doorType == PLAYER_DOORTYPE_NONE) && !(this->stateFlags1 & PLAYER_STATE1_2000000)) { - if ((D_80862B48 != 0) || func_80830F9C(play)) { + if (sPlayerUseHeldItem || func_80830F9C(play)) { if (func_80830E30(this, play)) { return func_80831010(this, play); } @@ -4122,7 +4197,7 @@ s32 func_808313A8(PlayState* play, Player* this, Actor* actor) { void func_808313F0(Player* this, PlayState* play) { if (!func_808313A8(play, this, this->heldActor)) { Player_SetUpperAction(play, this, Player_UpperAction_10); - PlayerAnimation_PlayLoop(play, &this->unk_284, &gPlayerAnim_link_normal_carryB_wait); + PlayerAnimation_PlayLoop(play, &this->skelAnimeUpper, &gPlayerAnim_link_normal_carryB_wait); } } @@ -4163,7 +4238,7 @@ s32 Player_SetAction(PlayState* play, Player* this, PlayerActionFunc actionFunc, } } else if ((this->transformation == PLAYER_FORM_GORON) && (Player_GetMeleeWeaponHeld(this) != PLAYER_MELEEWEAPON_NONE)) { - func_80831990(play, this, ITEM_NONE); + Player_UseItem(play, this, ITEM_NONE); } func_800AEF44(Effect_GetByIndex(this->meleeWeaponEffectIndex[2])); @@ -4175,7 +4250,7 @@ s32 Player_SetAction(PlayState* play, Player* this, PlayerActionFunc actionFunc, if (!(arg3 & 1) && !(this->stateFlags1 & PLAYER_STATE1_800)) { func_808309CC(play, this); - PlayerAnimation_PlayLoop(play, &this->unk_284, func_8082ED20(this)); + PlayerAnimation_PlayLoop(play, &this->skelAnimeUpper, func_8082ED20(this)); this->stateFlags1 &= ~PLAYER_STATE1_400000; } @@ -4237,7 +4312,7 @@ void Player_SetAction_PreserveItemAction(PlayState* play, Player* this, PlayerAc } } -void func_808317C4(Player* this) { +void Player_DestroyHookshot(Player* this) { if (Player_IsHoldingHookshot(this)) { if (this->heldActor != NULL) { Actor_Kill(this->heldActor); @@ -4277,13 +4352,12 @@ void func_808318C0(PlayState* play) { // Toggle Lens from a button press void func_80831944(PlayState* play, Player* this) { - if (func_8012364C(play, this, func_8082FDC4()) == ITEM_LENS_OF_TRUTH) { + if (Player_GetItemOnButton(play, this, func_8082FDC4()) == ITEM_LENS_OF_TRUTH) { func_808318C0(play); } } -// Proposed name: Player_UseItem -void func_80831990(PlayState* play, Player* this, ItemId item) { +void Player_UseItem(PlayState* play, Player* this, ItemId item) { PlayerItemAction itemAction = Player_ItemToItemAction(this, item); if ((((this->heldItemAction == this->itemAction) && @@ -4336,15 +4410,20 @@ void func_80831990(PlayState* play, Player* this, ItemId item) { ((explosiveType = Player_ExplosiveFromIA(this, itemAction)) > PLAYER_EXPLOSIVE_NONE) && ((AMMO(sPlayerExplosiveInfo[explosiveType].itemId) == 0) || (play->actorCtx.actorLists[ACTORCAT_EXPLOSIVES].length >= 3)))) { + // Prevent some items from being used if player is out of ammo. + // Also prevent explosives from being used if too many are active Audio_PlaySfx(NA_SE_SY_ERROR); } else if (itemAction == PLAYER_IA_LENS_OF_TRUTH) { + // Handle Lens of Truth func_808318C0(play); } else if (itemAction == PLAYER_IA_PICTOGRAPH_BOX) { + // Handle Pictograph Box if (!func_80831814(this, play, PLAYER_UNKAA5_2)) { Audio_PlaySfx(NA_SE_SY_ERROR); } } else if ((itemAction == PLAYER_IA_DEKU_NUT) && ((this->transformation != PLAYER_FORM_DEKU) || (this->heldItemButton != 0))) { + // Handle Deku Nuts if (AMMO(ITEM_DEKU_NUT) != 0) { func_8083A658(play, this); } else { @@ -4354,6 +4433,7 @@ void func_80831990(PlayState* play, Player* this, ItemId item) { (itemAction < PLAYER_IA_MASK_GIANT)) { PlayerMask maskId = GET_MASK_FROM_IA(itemAction); + // Handle wearable masks this->prevMask = this->currentMask; if (maskId == this->currentMask) { this->currentMask = PLAYER_MASK_NONE; @@ -4367,26 +4447,30 @@ void func_80831990(PlayState* play, Player* this, ItemId item) { ((this->heldActor == NULL) && (Player_ExplosiveFromIA(this, itemAction) > PLAYER_EXPLOSIVE_NONE))) { u8 nextAnimType; + // Handle using a new held item this->nextModelGroup = Player_ActionToModelGroup(this, itemAction); nextAnimType = gPlayerModelTypes[this->nextModelGroup].modelAnimType; var_v1 = ((this->transformation != PLAYER_FORM_GORON) || (itemAction == PLAYER_IA_POWDER_KEG)); if (var_v1 && (this->heldItemAction >= 0) && (item != this->heldItemId) && - (D_8085CD00[gPlayerModelTypes[this->modelGroup].modelAnimType][nextAnimType] != 0)) { + (sPlayerItemChangeTypes[gPlayerModelTypes[this->modelGroup].modelAnimType][nextAnimType] != + PLAYER_ITEM_CHG_0)) { + // Start the held item change process this->heldItemId = item; - this->stateFlags3 |= PLAYER_STATE3_40000000; + this->stateFlags3 |= PLAYER_STATE3_START_CHANGING_HELD_ITEM; } else { - func_808317C4(this); - func_8082DCA0(play, this); - func_8082F470(play, this, itemAction); + // Init new held item for use + Player_DestroyHookshot(this); + Player_DetachHeldActor(play, this); + Player_InitItemActionWithAnim(play, this, itemAction); if (!var_v1) { - D_80862B48 = 1; - D_80862B4C = 1; + sPlayerUseHeldItem = true; + sPlayerHeldItemButtonIsHeldDown = true; } } } else { - D_80862B48 = 1; - D_80862B4C = 1; + sPlayerUseHeldItem = true; + sPlayerHeldItemButtonIsHeldDown = true; } } } @@ -4429,11 +4513,11 @@ void func_80831F34(PlayState* play, Player* this, PlayerAnimationHeader* anim) { } } -s32 func_80832090(Player* this) { +s32 Player_CanUpdateItems(Player* this) { return (!(Player_Action_34 == this->actionFunc) || - (((this->stateFlags3 & PLAYER_STATE3_40000000)) && + ((this->stateFlags3 & PLAYER_STATE3_START_CHANGING_HELD_ITEM) && ((this->heldItemId == ITEM_FC) || (this->heldItemId == ITEM_NONE)))) && - (!(Player_UpperAction_2 == this->upperActionFunc) || + (!(Player_UpperAction_ChangeHeldItem == this->upperActionFunc) || Player_ItemToItemAction(this, this->heldItemId) == this->heldItemAction); } @@ -4442,7 +4526,7 @@ s32 func_8083213C(Player* this) { return (Player_Action_11 == this->actionFunc) || (Player_Action_12 == this->actionFunc); } -s32 func_8083216C(Player* this, PlayState* play) { +s32 Player_UpdateUpperBody(Player* this, PlayState* play) { if (!(this->stateFlags1 & PLAYER_STATE1_800000) && (this->actor.parent != NULL) && Player_IsHoldingHookshot(this)) { Player_SetAction(play, this, Player_Action_92, 1); this->stateFlags3 |= PLAYER_STATE3_80; @@ -4456,8 +4540,8 @@ s32 func_8083216C(Player* this, PlayState* play) { return true; } - if (func_80832090(this)) { - func_808304BC(this, play); + if (Player_CanUpdateItems(this)) { + Player_UpdateItems(this, play); if (Player_Action_64 == this->actionFunc) { return true; } @@ -4467,23 +4551,23 @@ s32 func_8083216C(Player* this, PlayState* play) { return false; } - if (this->unk_AC8 != 0.0f) { + if (this->skelAnimeUpperBlendWeight != 0.0f) { if ((func_8082ED94(this) == 0) || (this->linearVelocity != 0.0f)) { - AnimationContext_SetCopyFalse(play, this->skelAnime.limbCount, this->unk_284.jointTable, - this->skelAnime.jointTable, D_8085B9F0); + AnimationContext_SetCopyFalse(play, this->skelAnime.limbCount, this->skelAnimeUpper.jointTable, + this->skelAnime.jointTable, sPlayerUpperBodyLimbCopyMap); } if ((this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) && !(this->skelAnime.moveFlags & ANIM_FLAG_8)) { - Math_StepToF(&this->unk_AC8, 0.0f, 0.25f); + Math_StepToF(&this->skelAnimeUpperBlendWeight, 0.0f, 0.25f); AnimationContext_SetInterp(play, this->skelAnime.limbCount, this->skelAnime.jointTable, - this->unk_284.jointTable, 1.0f - this->unk_AC8); + this->skelAnimeUpper.jointTable, 1.0f - this->skelAnimeUpperBlendWeight); } } else if ((func_8082ED94(this) == 0) || (this->linearVelocity != 0.0f) || (this->skelAnime.moveFlags & ANIM_FLAG_8)) { AnimationContext_SetCopyTrue(play, this->skelAnime.limbCount, this->skelAnime.jointTable, - this->unk_284.jointTable, D_8085B9F0); + this->skelAnimeUpper.jointTable, sPlayerUpperBodyLimbCopyMap); } else { AnimationContext_SetCopyAll(play, this->skelAnime.limbCount, this->skelAnime.jointTable, - this->unk_284.jointTable); + this->skelAnimeUpper.jointTable); } return true; @@ -5014,7 +5098,7 @@ s32 (*sPlayerActionChangeFuncs[PLAYER_ACTION_CHG_MAX])(Player*, PlayState*) = { s32 Player_TryActionChangeList(PlayState* play, Player* this, s8* actionChangeList, s32 updateUpperBody) { if (!(this->stateFlags1 & (PLAYER_STATE1_1 | PLAYER_STATE1_80 | PLAYER_STATE1_20000000)) && !func_8082DA90(play)) { if (updateUpperBody) { - D_80862B04 = func_8083216C(this, play); + D_80862B04 = Player_UpdateUpperBody(this, play); if (Player_Action_64 == this->actionFunc) { return true; } @@ -5025,7 +5109,8 @@ s32 Player_TryActionChangeList(PlayState* play, Player* this, s8* actionChangeLi return true; } - if (!(this->stateFlags3 & PLAYER_STATE3_40000000) && (Player_UpperAction_2 != this->upperActionFunc)) { + if (!(this->stateFlags3 & PLAYER_STATE3_START_CHANGING_HELD_ITEM) && + (Player_UpperAction_ChangeHeldItem != this->upperActionFunc)) { // Process all entries in the Action Change List with a positive index while (*actionChangeList >= 0) { if (sPlayerActionChangeFuncs[*actionChangeList](this, play)) { @@ -5044,7 +5129,7 @@ s32 Player_TryActionChangeList(PlayState* play, Player* this, s8* actionChangeLi return true; } } else if (this->stateFlags1 & PLAYER_STATE1_800) { - func_8083216C(this, play); + Player_UpdateUpperBody(this, play); } return false; @@ -5692,7 +5777,7 @@ s32 func_80834600(Player* this, PlayState* play) { Player_SetUpperAction(play, this, Player_UpperAction_4); var_a2 = (this->unk_B40 < 0.5f) ? D_8085CFD4[Player_IsHoldingTwoHandedWeapon(this)] : D_8085CFCC[Player_IsHoldingTwoHandedWeapon(this)]; - PlayerAnimation_PlayOnce(play, &this->unk_284, var_a2); + PlayerAnimation_PlayOnce(play, &this->skelAnimeUpper, var_a2); } else { Player_AnimationPlayOnce(play, this, D_8085CFDC[Player_IsHoldingTwoHandedWeapon(this)]); } @@ -7678,7 +7763,7 @@ s32 func_808396B8(PlayState* play, Player* this) { ((Player_GetMeleeWeaponHeld(this) != PLAYER_MELEEWEAPON_NONE) && ((this->transformation != PLAYER_FORM_GORON) || (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) && ((this->transformation != PLAYER_FORM_ZORA) || !(this->stateFlags1 & PLAYER_STATE1_2000000)) && - (D_80862B48 != 0)))) { + sPlayerUseHeldItem))) { return true; } @@ -7782,8 +7867,8 @@ s32 Player_ActionChange_10(Player* this, PlayState* play) { func_80836B3C(play, this, 0.0f); } } else if (!(this->stateFlags1 & PLAYER_STATE1_8000000) && - (Player_GetMeleeWeaponHeld(this) != PLAYER_MELEEWEAPON_NONE) && func_80832090(this) && - (this->transformation != PLAYER_FORM_GORON)) { + (Player_GetMeleeWeaponHeld(this) != PLAYER_MELEEWEAPON_NONE) && + Player_CanUpdateItems(this) && (this->transformation != PLAYER_FORM_GORON)) { func_808395F0(play, this, PLAYER_MWA_JUMPSLASH_START, 5.0f, 5.0f); } else if (!func_80839A84(play, this)) { func_80836B3C(play, this, 0.0f); @@ -7909,7 +7994,7 @@ s32 Player_ActionChange_6(Player* this, PlayState* play) { if ((this->putAwayCountdown == 0) && (this->heldItemAction >= PLAYER_IA_SWORD_KOKIRI) && (this->transformation != PLAYER_FORM_FIERCE_DEITY)) { - func_80831990(play, this, ITEM_NONE); + Player_UseItem(play, this, ITEM_NONE); } else { this->stateFlags2 ^= PLAYER_STATE2_100000; } @@ -7927,7 +8012,7 @@ s32 Player_ActionChange_11(Player* this, PlayState* play) { ((this->transformation == PLAYER_FORM_HUMAN) && (this->currentShield != PLAYER_SHIELD_NONE))) && !func_80123434(this) && (this->lockOnActor == NULL))) { func_8082DC38(this); - func_8082DCA0(play, this); + Player_DetachHeldActor(play, this); if (Player_SetAction(play, this, Player_Action_18, 0)) { this->stateFlags1 |= PLAYER_STATE1_400000; if (this->transformation != PLAYER_FORM_GORON) { @@ -8025,7 +8110,7 @@ struct_8085D200 D_8085D200[] = { }; s32 func_8083A6C0(PlayState* play, Player* this) { - if (D_80862B48 != 0) { + if (sPlayerUseHeldItem) { if (Player_GetBottleHeld(this) > PLAYER_BOTTLE_NONE) { Player_SetAction(play, this, Player_Action_68, 0); if (this->actor.depthInWater > 12.0f) { @@ -8977,7 +9062,7 @@ s32 Player_ActionChange_2(Player* this, PlayState* play) { interactRangeActor->parent = &this->actor; if ((Item_CheckObtainability(giEntry->itemId) == ITEM_NONE) || ((s16)giEntry->objectId == OBJECT_GI_BOMB_2)) { - func_8082DCA0(play, this); + Player_DetachHeldActor(play, this); func_80838830(this, giEntry->objectId); if (!(this->stateFlags2 & PLAYER_STATE2_400) || @@ -9539,7 +9624,7 @@ void Player_ChooseIdleAnim(PlayState* play, Player* this) { s32 animIndex; s32 rand; f32 morphFrames; - s16 lastFrame; + s16 endFrame; if (((this->actor.id != ACTOR_PLAYER) && !(healthIsCritical = (this->actor.colChkInfo.health < 0x64))) || ((this->actor.id == ACTOR_PLAYER) && @@ -9586,7 +9671,7 @@ void Player_ChooseIdleAnim(PlayState* play, Player* this) { } } - lastFrame = Animation_GetLastFrame(anim); + endFrame = Animation_GetLastFrame(anim); if ((this->skelAnime.animation == anim) || (this->skelAnime.animation == &gPlayerAnim_pz_attackAend) || (this->skelAnime.animation == &gPlayerAnim_pz_attackBend) || (this->skelAnime.animation == &gPlayerAnim_pz_attackCend)) { @@ -9595,7 +9680,7 @@ void Player_ChooseIdleAnim(PlayState* play, Player* this) { morphFrames = -6.0f; } - PlayerAnimation_Change(play, &this->skelAnime, anim, (2.0f / 3.0f) * D_8085C3E4, 0.0f, lastFrame, ANIMMODE_ONCE, + PlayerAnimation_Change(play, &this->skelAnime, anim, (2.0f / 3.0f) * D_8085C3E4, 0.0f, endFrame, ANIMMODE_ONCE, morphFrames); } @@ -9884,7 +9969,7 @@ s32 func_8083FCF0(PlayState* play, Player* this, f32 arg2, f32 arg3, f32 arg4) { // Crouch-stabbing s32 func_8083FD80(Player* this, PlayState* play) { if (!Player_IsGoronOrDeku(this) && (Player_GetMeleeWeaponHeld(this) != PLAYER_MELEEWEAPON_NONE) && - (this->transformation != PLAYER_FORM_ZORA) && (D_80862B48 != 0)) { + (this->transformation != PLAYER_FORM_ZORA) && sPlayerUseHeldItem) { //! Calling this function sets the meleeWeaponQuads' damage properties correctly, patching "Power Crouch Stab". func_8083375C(this, PLAYER_MWA_STAB_1H); Player_AnimationPlayOnce(play, this, &gPlayerAnim_link_normal_defense_kiru); @@ -9909,7 +9994,7 @@ void Player_RequestQuakeAndRumble(PlayState* play, Player* this, u16 sfxId) { void func_8083FEF4(PlayState* play, Player* this) { Inventory_ChangeAmmo(ITEM_DEKU_STICK, -1); - func_80831990(play, this, ITEM_NONE); + Player_UseItem(play, this, ITEM_NONE); } s32 func_8083FF30(PlayState* play, Player* this) { @@ -9934,7 +10019,7 @@ s32 func_8083FFEC(PlayState* play, Player* this) { gSaveContext.save.saveInfo.playerData.swordHealth--; if (gSaveContext.save.saveInfo.playerData.swordHealth <= 0) { Item_Give(play, ITEM_SWORD_KOKIRI); - func_80831990(play, this, ITEM_SWORD_KOKIRI); + Player_UseItem(play, this, ITEM_SWORD_KOKIRI); Player_PlaySfx(this, NA_SE_IT_MAJIN_SWORD_BROKEN); if (Message_GetState(&play->msgCtx) == TEXT_STATE_NONE) { Message_StartTextbox(play, 0xF9, NULL); @@ -10377,11 +10462,11 @@ void func_80841358(PlayState* play, Player* this, s32 arg2) { //! @bug OoB read if player is goron, deku or human item = D_8085D2B0[this->transformation]; itemAction = sItemItemActions[item]; - func_808317C4(this); - func_8082DCA0(play, this); + Player_DestroyHookshot(this); + Player_DetachHeldActor(play, this); this->heldItemId = item; this->nextModelGroup = Player_ActionToModelGroup(this, itemAction); - func_8082F8BC(play, this, itemAction); + Player_InitItemAction(play, this, itemAction); func_808309CC(play, this); if (arg2) { Player_PlaySfx(this, NA_SE_IT_SWORD_PICKOUT); @@ -10464,7 +10549,7 @@ static InitChainEntry sInitChain[] = { ICHAIN_F32(targetArrowOffset, 500, ICHAIN_STOP), }; -Vec3s D_8085D2C4 = { -57, 3377, 0 }; +Vec3s sPlayerSkeletonBaseTransl = { -57, 3377, 0 }; void Player_InitCommon(Player* this, PlayState* play, FlexSkeletonHeader* skelHeader) { Actor_ProcessInitChain(&this->actor, sInitChain); @@ -10476,11 +10561,11 @@ void Player_InitCommon(Player* this, PlayState* play, FlexSkeletonHeader* skelHe func_808309CC(play, this); SkelAnime_InitPlayer(play, &this->skelAnime, skelHeader, D_8085BE84[PLAYER_ANIMGROUP_0][this->modelAnimType], 1 | 8, this->jointTableBuffer, this->morphTableBuffer, PLAYER_LIMB_MAX); - this->skelAnime.baseTransl = D_8085D2C4; + this->skelAnime.baseTransl = sPlayerSkeletonBaseTransl; - SkelAnime_InitPlayer(play, &this->unk_284, skelHeader, func_8082ED20(this), 1 | 8, this->unk_929, this->unk_9C8, - PLAYER_LIMB_MAX); - this->unk_284.baseTransl = D_8085D2C4; + SkelAnime_InitPlayer(play, &this->skelAnimeUpper, skelHeader, func_8082ED20(this), 1 | 8, + this->jointTableUpperBuffer, this->morphTableUpperBuffer, PLAYER_LIMB_MAX); + this->skelAnimeUpper.baseTransl = sPlayerSkeletonBaseTransl; if (this->transformation == PLAYER_FORM_GORON) { SkelAnime_InitFlex(play, &this->unk_2C8, &gLinkGoronShieldingSkel, &gLinkGoronShieldingAnim, @@ -10636,7 +10721,7 @@ void Player_Init(Actor* thisx, PlayState* play) { this->heldItemAction = PLAYER_IA_NONE; this->heldItemId = ITEM_NONE; - func_80831990(play, this, ITEM_NONE); + Player_UseItem(play, this, ITEM_NONE); Player_SetEquipmentData(play, this); this->prevBoots = this->currentBoots; Player_InitCommon(this, play, gPlayerSkeletons[this->transformation]); @@ -10781,7 +10866,7 @@ void Player_Init(Actor* thisx, PlayState* play) { if (gSaveContext.powderKegTimer != 0) { this->nextModelGroup = Player_ActionToModelGroup(this, PLAYER_IA_POWDER_KEG); this->heldItemId = ITEM_POWDER_KEG; - func_8082F8BC(play, this, PLAYER_IA_POWDER_KEG); + Player_InitItemAction(play, this, PLAYER_IA_POWDER_KEG); func_808313F0(this, play); } else if (gSaveContext.unk_1014 != 0) { func_8082F5FC(this, Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, ACTOR_EN_MM, @@ -11497,7 +11582,7 @@ void func_808442D8(PlayState* play, Player* this) { f32 temp_fv1; if (this->unk_B0C == 0.0f) { - func_80831990(play, this, ITEM_NONE); + Player_UseItem(play, this, ITEM_NONE); return; } @@ -12112,7 +12197,7 @@ void Player_UpdateCommon(Player* this, PlayState* play, Input* input) { D_8085C3E4 = (this->stateFlags1 & PLAYER_STATE1_8000000) ? 0.5f : 1.0f; D_8085C3E8 = 1.0f / D_8085C3E4; - D_80862B48 = D_80862B4C = 0; + sPlayerUseHeldItem = sPlayerHeldItemButtonIsHeldDown = false; var_v1 = Play_InCsMode(play); D_80862B2C = this->currentMask; @@ -12318,7 +12403,7 @@ void Player_Update(Actor* thisx, PlayState* play) { } if ((this->heldActor != NULL) && (this->heldActor->update == NULL)) { - func_8082DCA0(play, this); + Player_DetachHeldActor(play, this); } if ((play->actorCtx.unk268 != 0) && (this == GET_PLAYER(play))) { @@ -12812,7 +12897,7 @@ s32 func_80847880(PlayState* play, Player* this) { func_8082DE50(play, this); Player_SetAction(play, this, Player_Action_81, 0); if (!func_800B7118(this) || Player_IsHoldingHookshot(this)) { - func_80831990(play, this, ITEM_BOW); + Player_UseItem(play, this, ITEM_BOW); } Player_AnimationPlayOnce(play, this, func_8082ED20(this)); this->csMode = PLAYER_CSMODE_NONE; @@ -13198,30 +13283,32 @@ s32 Player_UpperAction_1(Player* this, PlayState* play) { return false; } -s32 Player_UpperAction_2(Player* this, PlayState* play) { - if (PlayerAnimation_Update(play, &this->unk_284) || +s32 Player_UpperAction_ChangeHeldItem(Player* this, PlayState* play) { + if (PlayerAnimation_Update(play, &this->skelAnimeUpper) || ((Player_ItemToItemAction(this, this->heldItemId) == this->heldItemAction) && - (D_80862B48 = D_80862B48 || ((this->modelAnimType != PLAYER_ANIMTYPE_3) && - (this->heldItemAction != PLAYER_IA_DEKU_STICK) && (play->unk_1887C == 0))))) { - Player_SetUpperAction(play, this, D_8085C9F0[this->heldItemAction]); + (sPlayerUseHeldItem = + (sPlayerUseHeldItem || ((this->modelAnimType != PLAYER_ANIMTYPE_3) && + (this->heldItemAction != PLAYER_IA_DEKU_STICK) && (play->unk_1887C == 0)))))) { + Player_SetUpperAction(play, this, sPlayerUpperActionUpdateFuncs[this->heldItemAction]); this->unk_ACC = 0; this->unk_AA4 = 0; - D_80862B4C = D_80862B48; + sPlayerHeldItemButtonIsHeldDown = sPlayerUseHeldItem; return this->upperActionFunc(this, play); } if (func_8082ED94(this) != 0) { - func_80830D40(play, this); + Player_WaitToFinishItemChange(play, this); Player_AnimationPlayOnce(play, this, func_8082ED20(this)); this->unk_AA4 = 0; } else { - func_80830D40(play, this); + Player_WaitToFinishItemChange(play, this); } + return true; } s32 Player_UpperAction_3(Player* this, PlayState* play) { - PlayerAnimation_Update(play, &this->unk_284); + PlayerAnimation_Update(play, &this->skelAnimeUpper); if (!CHECK_BTN_ALL(sPlayerControlInput->cur.button, BTN_R)) { func_80830CE8(play, this); } else { @@ -13235,13 +13322,13 @@ s32 Player_UpperAction_3(Player* this, PlayState* play) { } s32 Player_UpperAction_4(Player* this, PlayState* play) { - if (PlayerAnimation_Update(play, &this->unk_284)) { + if (PlayerAnimation_Update(play, &this->skelAnimeUpper)) { PlayerAnimationHeader* anim; - f32 lastFrame; + f32 endFrame; anim = func_80830A58(play, this); - lastFrame = Animation_GetLastFrame(anim); - PlayerAnimation_Change(play, &this->unk_284, anim, 1.0f, lastFrame, lastFrame, ANIMMODE_ONCE, 0.0f); + endFrame = Animation_GetLastFrame(anim); + PlayerAnimation_Change(play, &this->skelAnimeUpper, anim, 1.0f, endFrame, endFrame, ANIMMODE_ONCE, 0.0f); } this->stateFlags1 |= PLAYER_STATE1_400000; @@ -13250,11 +13337,10 @@ s32 Player_UpperAction_4(Player* this, PlayState* play) { } s32 Player_UpperAction_5(Player* this, PlayState* play) { - // possibly a case of if ((D_80862B48 = D_80862B4C) || PlayerAnimation_Update(play, &this->unk_284)) - D_80862B48 = D_80862B4C; - if ((D_80862B48 != 0) || PlayerAnimation_Update(play, &this->unk_284)) { - Player_SetUpperAction(play, this, D_8085C9F0[this->heldItemAction]); - PlayerAnimation_PlayLoop(play, &this->unk_284, D_8085BE84[PLAYER_ANIMGROUP_0][this->modelAnimType]); + sPlayerUseHeldItem = sPlayerHeldItemButtonIsHeldDown; + if (sPlayerUseHeldItem || PlayerAnimation_Update(play, &this->skelAnimeUpper)) { + Player_SetUpperAction(play, this, sPlayerUpperActionUpdateFuncs[this->heldItemAction]); + PlayerAnimation_PlayLoop(play, &this->skelAnimeUpper, D_8085BE84[PLAYER_ANIMGROUP_0][this->modelAnimType]); this->unk_AA4 = 0; this->upperActionFunc(this, play); return false; @@ -13312,10 +13398,10 @@ s32 Player_UpperAction_7(Player* this, PlayState* play) { if ((this->unk_ACE == 0) && (func_8082ED94(this) == 0) && (this->skelAnime.animation == &gPlayerAnim_link_bow_side_walk)) { - PlayerAnimation_PlayOnce(play, &this->unk_284, D_8085D5E4[index]); + PlayerAnimation_PlayOnce(play, &this->skelAnimeUpper, D_8085D5E4[index]); this->unk_ACE = -1; - } else if (PlayerAnimation_Update(play, &this->unk_284)) { - PlayerAnimation_PlayLoop(play, &this->unk_284, D_8085D5F0[index]); + } else if (PlayerAnimation_Update(play, &this->skelAnimeUpper)) { + PlayerAnimation_PlayLoop(play, &this->skelAnimeUpper, D_8085D5F0[index]); this->unk_ACE = 1; } else if (this->unk_ACE == 1) { this->unk_ACE = 2; @@ -13326,7 +13412,7 @@ s32 Player_UpperAction_7(Player* this, PlayState* play) { } func_80831010(this, play); - if ((this->unk_ACE > 0) && ((this->unk_B28 < 0) || ((D_80862B4C == 0) && !func_80830FD4(play)))) { + if ((this->unk_ACE > 0) && ((this->unk_B28 < 0) || (!sPlayerHeldItemButtonIsHeldDown && !func_80830FD4(play)))) { Player_SetUpperAction(play, this, Player_UpperAction_8); if (this->unk_B28 >= 0) { if (index != 0) { @@ -13335,7 +13421,8 @@ s32 Player_UpperAction_7(Player* this, PlayState* play) { } if (this->transformation == PLAYER_FORM_DEKU) { - PlayerAnimation_PlayOnceSetSpeed(play, &this->unk_284, &gPlayerAnim_pn_tamahaki, 2.0f / 3.0f); + PlayerAnimation_PlayOnceSetSpeed(play, &this->skelAnimeUpper, &gPlayerAnim_pn_tamahaki, + 2.0f / 3.0f); } } else if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) { func_80831194(play, this); @@ -13351,15 +13438,15 @@ s32 Player_UpperAction_7(Player* this, PlayState* play) { } s32 Player_UpperAction_8(Player* this, PlayState* play) { - s32 animFinished = PlayerAnimation_Update(play, &this->unk_284); + s32 animFinished = PlayerAnimation_Update(play, &this->skelAnimeUpper); if (Player_IsHoldingHookshot(this) && !func_80831124(play, this)) { return true; } if (!func_80830B88(play, this) && - ((((this->unk_B28 < 0) && (D_80862B4C != 0)) || - ((animFinished || (this->transformation != PLAYER_FORM_DEKU)) && (D_80862B48 != 0))) || + ((((this->unk_B28 < 0) && sPlayerHeldItemButtonIsHeldDown) || + ((animFinished || (this->transformation != PLAYER_FORM_DEKU)) && sPlayerUseHeldItem)) || func_80830F9C(play))) { this->unk_B28 = ABS_ALT(this->unk_B28); @@ -13367,7 +13454,7 @@ s32 Player_UpperAction_8(Player* this, PlayState* play) { if (Player_IsHoldingHookshot(this)) { this->unk_ACE = 1; } else { - PlayerAnimation_PlayOnce(play, &this->unk_284, + PlayerAnimation_PlayOnce(play, &this->skelAnimeUpper, (this->transformation == PLAYER_FORM_DEKU) ? &gPlayerAnim_pn_tamahakidf : &gPlayerAnim_link_bow_bow_shoot_next); @@ -13389,7 +13476,7 @@ s32 Player_UpperAction_8(Player* this, PlayState* play) { Player_SetUpperAction(play, this, Player_UpperAction_6); } else { Player_SetUpperAction(play, this, Player_UpperAction_9); - PlayerAnimation_PlayOnce(play, &this->unk_284, + PlayerAnimation_PlayOnce(play, &this->skelAnimeUpper, (this->transformation == PLAYER_FORM_DEKU) ? &gPlayerAnim_pn_tamahakidf : &gPlayerAnim_link_bow_bow_shoot_end); } @@ -13400,7 +13487,7 @@ s32 Player_UpperAction_8(Player* this, PlayState* play) { } s32 Player_UpperAction_9(Player* this, PlayState* play) { - if (!(this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) || PlayerAnimation_Update(play, &this->unk_284)) { + if (!(this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) || PlayerAnimation_Update(play, &this->skelAnimeUpper)) { Player_SetUpperAction(play, this, Player_UpperAction_6); } return true; @@ -13418,8 +13505,8 @@ s32 Player_UpperAction_10(Player* this, PlayState* play) { } if (this->stateFlags1 & PLAYER_STATE1_800) { - if (PlayerAnimation_Update(play, &this->unk_284)) { - PlayerAnimation_PlayLoop(play, &this->unk_284, &gPlayerAnim_link_normal_carryB_wait); + if (PlayerAnimation_Update(play, &this->skelAnimeUpper)) { + PlayerAnimation_PlayLoop(play, &this->skelAnimeUpper, &gPlayerAnim_link_normal_carryB_wait); } if ((heldActor->id == ACTOR_EN_NIW) && (this->actor.velocity.y <= 0.0f)) { @@ -13447,31 +13534,31 @@ s32 Player_UpperAction_11(Player* this, PlayState* play) { } s32 Player_UpperAction_12(Player* this, PlayState* play) { - if (PlayerAnimation_Update(play, &this->unk_284)) { + if (PlayerAnimation_Update(play, &this->skelAnimeUpper)) { Player_SetUpperAction(play, this, Player_UpperAction_13); - PlayerAnimation_PlayLoop(play, &this->unk_284, &gPlayerAnim_pz_cutterwaitanim); + PlayerAnimation_PlayLoop(play, &this->skelAnimeUpper, &gPlayerAnim_pz_cutterwaitanim); } - if (this->unk_284.animation == &gPlayerAnim_pz_cutterwaitanim) { + if (this->skelAnimeUpper.animation == &gPlayerAnim_pz_cutterwaitanim) { func_80831010(this, play); } return true; } s32 Player_UpperAction_13(Player* this, PlayState* play) { - PlayerAnimation_Update(play, &this->unk_284); + PlayerAnimation_Update(play, &this->skelAnimeUpper); func_80831010(this, play); - if (D_80862B4C == 0) { + if (!sPlayerHeldItemButtonIsHeldDown) { Player_SetUpperAction(play, this, Player_UpperAction_14); - PlayerAnimation_PlayOnce(play, &this->unk_284, &gPlayerAnim_pz_cutterattack); + PlayerAnimation_PlayOnce(play, &this->skelAnimeUpper, &gPlayerAnim_pz_cutterattack); } return true; } s32 Player_UpperAction_14(Player* this, PlayState* play) { - if (PlayerAnimation_Update(play, &this->unk_284)) { + if (PlayerAnimation_Update(play, &this->skelAnimeUpper)) { Player_SetUpperAction(play, this, Player_UpperAction_15); this->unk_ACC = 0; - } else if (PlayerAnimation_OnFrame(&this->unk_284, 6.0f)) { + } else if (PlayerAnimation_OnFrame(&this->skelAnimeUpper, 6.0f)) { Vec3f pos; s16 untargetedRotY; @@ -13535,7 +13622,7 @@ s32 Player_UpperAction_15(Player* this, PlayState* play) { if (this->stateFlags3 & PLAYER_STATE3_800000) { Player_SetUpperAction(play, this, Player_UpperAction_16); - PlayerAnimation_PlayOnce(play, &this->unk_284, &gPlayerAnim_pz_cuttercatch); + PlayerAnimation_PlayOnce(play, &this->skelAnimeUpper, &gPlayerAnim_pz_cuttercatch); this->stateFlags3 &= ~PLAYER_STATE3_800000; Player_PlaySfx(this, NA_SE_PL_CATCH_BOOMERANG); Player_AnimSfx_PlayVoice(this, NA_SE_VO_LI_SWORD_N); @@ -13546,7 +13633,7 @@ s32 Player_UpperAction_15(Player* this, PlayState* play) { } s32 Player_UpperAction_16(Player* this, PlayState* play) { - if (!Player_UpperAction_11(this, play) && PlayerAnimation_Update(play, &this->unk_284)) { + if (!Player_UpperAction_11(this, play) && PlayerAnimation_Update(play, &this->skelAnimeUpper)) { if (this->stateFlags1 & PLAYER_STATE1_2000000) { Player_SetUpperAction(play, this, Player_UpperAction_15); this->unk_ACC = 0; @@ -13579,7 +13666,7 @@ void Player_Action_0(Player* this, PlayState* play) { void Player_Action_1(Player* this, PlayState* play) { this->stateFlags3 |= PLAYER_STATE3_10000000; PlayerAnimation_Update(play, &this->skelAnime); - func_8083216C(this, play); + Player_UpdateUpperBody(this, play); if (R_PLAY_FILL_SCREEN_ON == 0) { R_PLAY_FILL_SCREEN_ON = 20; @@ -14047,7 +14134,7 @@ void Player_Action_10(Player* this, PlayState* play) { AnimationContext_SetLoadFrame(play, func_8082ED20(this), 0, this->skelAnime.limbCount, this->skelAnime.morphTable); AnimationContext_SetCopyTrue(play, this->skelAnime.limbCount, this->skelAnime.jointTable, - this->skelAnime.morphTable, D_8085B9F0); + this->skelAnime.morphTable, sPlayerUpperBodyLimbCopyMap); } Player_GetMovementSpeedAndYaw(this, &speedTarget, &yawTarget, SPEED_MODE_CURVED, play); @@ -14294,7 +14381,7 @@ void Player_Action_18(Player* this, PlayState* play) { if (!Player_IsGoronOrDeku(this)) { this->stateFlags1 |= PLAYER_STATE1_400000; - func_8083216C(this, play); + Player_UpdateUpperBody(this, play); this->stateFlags1 &= ~PLAYER_STATE1_400000; if (this->transformation == PLAYER_FORM_ZORA) { func_8082F164(this, BTN_R | BTN_B); @@ -14368,8 +14455,9 @@ void Player_Action_18(Player* this, PlayState* play) { void Player_Action_19(Player* this, PlayState* play) { func_80832F24(this); if (this->actionVar1 == 0) { - D_80862B04 = func_8083216C(this, play); - if ((Player_UpperAction_3 == this->upperActionFunc) || (func_808331FC(play, this, &this->unk_284, 4.0f) > 0)) { + D_80862B04 = Player_UpdateUpperBody(this, play); + if ((Player_UpperAction_3 == this->upperActionFunc) || + (func_808331FC(play, this, &this->skelAnimeUpper, 4.0f) > 0)) { Player_SetAction(play, this, Player_Action_2, 1); } } else { @@ -14379,13 +14467,13 @@ void Player_Action_19(Player* this, PlayState* play) { temp_v0 = func_808331FC(play, this, &this->skelAnime, 4.0f); if ((temp_v0 != 0) && ((temp_v0 > 0) || PlayerAnimation_Update(play, &this->skelAnime))) { PlayerAnimationHeader* anim; - f32 lastFrame; + f32 endFrame; Player_SetAction(play, this, Player_Action_18, 1); Player_SetModelsForHoldingShield(this); anim = D_8085BE84[PLAYER_ANIMGROUP_19][this->modelAnimType]; - lastFrame = Animation_GetLastFrame(anim); - PlayerAnimation_Change(play, &this->skelAnime, anim, 1.0f, lastFrame, lastFrame, ANIMMODE_ONCE, 0.0f); + endFrame = Animation_GetLastFrame(anim); + PlayerAnimation_Change(play, &this->skelAnime, anim, 1.0f, endFrame, endFrame, ANIMMODE_ONCE, 0.0f); } } } @@ -14575,7 +14663,7 @@ void Player_Action_25(Player* this, PlayState* play) { func_8083CBC4(this, speedTarget, yawTarget, 1.0f, 0.05f, 0.1f, 0xC8); } - func_8083216C(this, play); + Player_UpdateUpperBody(this, play); if ((((this->stateFlags2 & PLAYER_STATE2_80000) && ((this->actionVar1 == 2) || (this->actionVar1 >= 4))) || !func_80839770(this, play)) && (this->actor.velocity.y < 0.0f)) { @@ -14631,7 +14719,7 @@ void Player_Action_25(Player* this, PlayState* play) { } } else { func_80837134(play, this); - func_8083216C(this, play); + Player_UpdateUpperBody(this, play); } Player_ActionChange_13(this, play); @@ -15013,9 +15101,9 @@ void Player_Action_34(Player* this, PlayState* play) { PlayerAnimation_Update(play, &this->skelAnime); func_8083249C(this); - temp_v0 = func_8083216C(this, play); + temp_v0 = Player_UpdateUpperBody(this, play); if (((this->stateFlags1 & PLAYER_STATE1_800) && (this->heldActor != NULL) && (this->getItemId == GI_NONE)) || - (temp_v0 == 0)) { + !temp_v0) { this->unk_D58(play, this); } } @@ -15183,7 +15271,7 @@ void Player_Action_35(Player* this, PlayState* play) { } if (this->stateFlags1 & PLAYER_STATE1_800) { - func_8083216C(this, play); + Player_UpdateUpperBody(this, play); } } @@ -15202,7 +15290,7 @@ void Player_Action_36(Player* this, PlayState* play) { } animFinished = PlayerAnimation_Update(play, &this->skelAnime); - func_8083216C(this, play); + Player_UpdateUpperBody(this, play); if (animFinished) { if (this->actionVar2 == 0) { @@ -15359,7 +15447,7 @@ void Player_Action_43(Player* this, PlayState* play) { if (this->unk_AA5 == PLAYER_UNKAA5_3) { if (func_800B7118(this) || func_8082ECCC(this)) { - func_8083216C(this, play); + Player_UpdateUpperBody(this, play); } } @@ -15394,7 +15482,7 @@ void Player_Action_44(Player* this, PlayState* play) { this->stateFlags2 |= PLAYER_STATE2_20; func_8083249C(this); - func_8083216C(this, play); + Player_UpdateUpperBody(this, play); if (Message_GetState(&play->msgCtx) == TEXT_STATE_CLOSING) { this->actor.flags &= ~ACTOR_FLAG_TALK_REQUESTED; if (!CHECK_FLAG_ALL(this->talkActor->flags, ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY)) { @@ -15447,24 +15535,24 @@ void Player_Action_44(Player* this, PlayState* play) { this->actor.shape.rot.y = this->currentYaw; if (this->actionVar1 != 0) { if (!(this->stateFlags1 & PLAYER_STATE1_800)) { - if (PlayerAnimation_Update(play, &this->unk_284)) { + if (PlayerAnimation_Update(play, &this->skelAnimeUpper)) { this->actionVar1--; if (this->actionVar1 != 0) { - PlayerAnimation_Change(play, &this->unk_284, &gPlayerAnim_link_normal_talk_free, 1.0f, 0.0f, - Animation_GetLastFrame(&gPlayerAnim_link_normal_talk_free), + PlayerAnimation_Change(play, &this->skelAnimeUpper, &gPlayerAnim_link_normal_talk_free, 1.0f, + 0.0f, Animation_GetLastFrame(&gPlayerAnim_link_normal_talk_free), ANIMMODE_ONCE, -6.0f); } } } AnimationContext_SetCopyFalse(play, this->skelAnime.limbCount, this->skelAnime.jointTable, - this->unk_284.jointTable, D_8085B9F0); + this->skelAnimeUpper.jointTable, sPlayerUpperBodyLimbCopyMap); } else if (!(this->stateFlags1 & PLAYER_STATE1_800) && (this->skelAnime.animation == &gPlayerAnim_link_normal_talk_free_wait)) { s32 temp_v0 = this->actor.focus.rot.y - this->actor.shape.rot.y; if (ABS_ALT(temp_v0) > 0xFA0) { PlayerAnimation_Change( - play, &this->unk_284, D_8085BE84[PLAYER_ANIMGROUP_25][this->modelAnimType], 0.4f, 0.0f, + play, &this->skelAnimeUpper, D_8085BE84[PLAYER_ANIMGROUP_25][this->modelAnimType], 0.4f, 0.0f, Animation_GetLastFrame(D_8085BE84[PLAYER_ANIMGROUP_25][this->modelAnimType]), ANIMMODE_ONCE, -6.0f); this->actionVar1 = 2; } @@ -16001,7 +16089,7 @@ void Player_Action_52(Player* this, PlayState* play) { this->unk_AA5 = PLAYER_UNKAA5_0; this->actionVar1 = 0; } else if ((this->actionVar2 < 2) || (this->actionVar2 >= 4)) { - D_80862B04 = func_8083216C(this, play); + D_80862B04 = Player_UpdateUpperBody(this, play); if (D_80862B04) { this->actionVar1 = 0; } @@ -16015,27 +16103,27 @@ void Player_Action_52(Player* this, PlayState* play) { if (!D_80862B04) { if (this->actionVar1 != 0) { - if (PlayerAnimation_Update(play, &this->unk_284)) { + if (PlayerAnimation_Update(play, &this->skelAnimeUpper)) { rideActor->stateFlags &= ~ENHORSE_FLAG_8; this->actionVar1 = 0; } - if (this->unk_284.animation == &gPlayerAnim_link_uma_stop_muti) { - if (PlayerAnimation_OnFrame(&this->unk_284, 23.0f)) { + if (this->skelAnimeUpper.animation == &gPlayerAnim_link_uma_stop_muti) { + if (PlayerAnimation_OnFrame(&this->skelAnimeUpper, 23.0f)) { Player_PlaySfx(this, NA_SE_IT_LASH); Player_AnimSfx_PlayVoice(this, NA_SE_VO_LI_LASH); } AnimationContext_SetCopyAll(play, this->skelAnime.limbCount, this->skelAnime.jointTable, - this->unk_284.jointTable); + this->skelAnimeUpper.jointTable); } else { - if (PlayerAnimation_OnFrame(&this->unk_284, 10.0f)) { + if (PlayerAnimation_OnFrame(&this->skelAnimeUpper, 10.0f)) { Player_PlaySfx(this, NA_SE_IT_LASH); Player_AnimSfx_PlayVoice(this, NA_SE_VO_LI_LASH); } AnimationContext_SetCopyTrue(play, this->skelAnime.limbCount, this->skelAnime.jointTable, - this->unk_284.jointTable, D_8085B9F0); + this->skelAnimeUpper.jointTable, sPlayerUpperBodyLimbCopyMap); } } else if (!CHECK_FLAG_ALL(this->actor.flags, 0x100)) { PlayerAnimationHeader* anim = NULL; @@ -16049,7 +16137,7 @@ void Player_Action_52(Player* this, PlayState* play) { } if (anim != NULL) { - PlayerAnimation_PlayOnce(play, &this->unk_284, anim); + PlayerAnimation_PlayOnce(play, &this->skelAnimeUpper, anim); this->actionVar1 = 1; } } @@ -16439,7 +16527,7 @@ void Player_Action_59(Player* this, PlayState* play) { this->stateFlags2 |= PLAYER_STATE2_20; this->actor.gravity = 0.0f; - func_8083216C(this, play); + Player_UpdateUpperBody(this, play); func_8082F164(this, BTN_R); if (Player_ActionChange_13(this, play)) { @@ -17149,7 +17237,7 @@ void Player_Action_68(Player* this, PlayState* play) { Player_PlaySfx(this, NA_SE_IT_SCOOP_UP_WATER); } - if (func_8012364C(play, this, this->heldItemButton) == ITEM_BOTTLE) { + if (Player_GetItemOnButton(play, this, this->heldItemButton) == ITEM_BOTTLE) { Actor* interactRangeActor = this->interactRangeActor; if (interactRangeActor != NULL) { @@ -17531,7 +17619,7 @@ void Player_Action_80(Player* this, PlayState* play) { } else { this->stateFlags1 &= ~PLAYER_STATE1_100000; if ((play->sceneId == SCENE_20SICHITAI) && - (func_8012364C(play, this, func_8082FDC4()) == ITEM_PICTOGRAPH_BOX)) { + (Player_GetItemOnButton(play, this, func_8082FDC4()) == ITEM_PICTOGRAPH_BOX)) { s32 requiredScopeTemp; play->actorCtx.flags |= ACTORCTX_FLAG_PICTO_BOX_ON; @@ -17554,7 +17642,7 @@ void Player_Action_81(Player* this, PlayState* play) { this->unk_AA5 = PLAYER_UNKAA5_3; func_8083868C(play, this); PlayerAnimation_Update(play, &this->skelAnime); - func_8083216C(this, play); + Player_UpdateUpperBody(this, play); this->upperLimbRot.y = func_80847190(play, this, 1) - this->actor.shape.rot.y; this->unk_AA6 |= 0x80; @@ -17651,7 +17739,7 @@ void Player_Action_84(Player* this, PlayState* play) { ((this->meleeWeaponAnimation >= PLAYER_MWA_FLIPSLASH_FINISH) && (this->meleeWeaponAnimation <= PLAYER_MWA_ZORA_JUMPKICK_FINISH) && (this->skelAnime.curFrame > 2.0f) && func_808333CC(this))) { - D_80862B48 = this->actionVar2; + sPlayerUseHeldItem = this->actionVar2; if (!Player_ActionChange_7(this, play)) { PlayerAnimationHeader* anim = func_80123420(this) ? attackInfoEntry->unk_8 : attackInfoEntry->unk_4; @@ -17666,7 +17754,7 @@ void Player_Action_84(Player* this, PlayState* play) { if (this->transformation == PLAYER_FORM_ZORA) { if (Player_ActionChange_8(this, play)) { - anim = this->unk_284.animation; + anim = this->skelAnimeUpper.animation; } this->unk_ADC = 0; } else if ((anim == &gPlayerAnim_link_fighter_Lpower_jump_kiru_end) && @@ -19670,7 +19758,7 @@ void Player_CsAction_0(PlayState* play, Player* this, CsCmdActorCue* cue) { } else { PlayerAnimation_Update(play, &this->skelAnime); if (func_801240DC(this) || (this->stateFlags1 & PLAYER_STATE1_800)) { - func_8083216C(this, play); + Player_UpdateUpperBody(this, play); } else if ((this->interactRangeActor != NULL) && (this->interactRangeActor->textId == 0xFFFF)) { Player_ActionChange_2(this, play); } @@ -19707,7 +19795,7 @@ void Player_CsAction_2(PlayState* play, Player* this, CsCmdActorCue* cue) { } else { PlayerAnimation_Update(play, &this->skelAnime); if (func_801240DC(this) || (this->stateFlags1 & PLAYER_STATE1_800)) { - func_8083216C(this, play); + Player_UpdateUpperBody(this, play); } } } @@ -20232,7 +20320,7 @@ void func_8085AC9C(PlayState* play, Player* this, CsCmdActorCue* cue, PlayerCsMo void func_8085AD5C(PlayState* play, Player* this, PlayerCsMode csMode) { if ((csMode != PLAYER_CSMODE_1) && (csMode != PLAYER_CSMODE_WAIT) && (csMode != PLAYER_CSMODE_20) && (csMode != PLAYER_CSMODE_END)) { - func_8082DCA0(play, this); + Player_DetachHeldActor(play, this); } } @@ -20326,7 +20414,7 @@ s32 Player_StartFishing(PlayState* play) { Player* player = GET_PLAYER(play); func_8082DE50(play, player); - func_80831990(play, player, ITEM_FISHING_ROD); + Player_UseItem(play, player, ITEM_FISHING_ROD); return 1; } diff --git a/tools/disasm/functions.txt b/tools/disasm/functions.txt index 0ecbdb9b1..83c871191 100644 --- a/tools/disasm/functions.txt +++ b/tools/disasm/functions.txt @@ -2199,7 +2199,7 @@ 0x801234D4:("func_801234D4",), 0x80123590:("func_80123590",), 0x801235DC:("func_801235DC",), - 0x8012364C:("func_8012364C",), + 0x8012364C:("Player_GetItemOnButton",), 0x80123810:("func_80123810",), 0x80123960:("Player_ActionToModelGroup",), 0x801239AC:("Player_SetModelsForHoldingShield",), @@ -4256,7 +4256,7 @@ 0x8082DC28:("func_8082DC28",), 0x8082DC38:("func_8082DC38",), 0x8082DC64:("func_8082DC64",), - 0x8082DCA0:("func_8082DCA0",), + 0x8082DCA0:("Player_DetachHeldActor",), 0x8082DD2C:("func_8082DD2C",), 0x8082DE14:("func_8082DE14",), 0x8082DE50:("func_8082DE50",), @@ -4314,7 +4314,7 @@ 0x8082F164:("func_8082F164",), 0x8082F1AC:("func_8082F1AC",), 0x8082F43C:("Player_SetUpperAction",), - 0x8082F470:("func_8082F470",), + 0x8082F470:("Player_InitItemActionWithAnim",), 0x8082F524:("Player_ItemToItemAction",), 0x8082F594:("Player_InitItemAction_DoNothing",), 0x8082F5A4:("Player_InitItemAction_DekuStick",), @@ -4323,30 +4323,30 @@ 0x8082F62C:("Player_InitItemAction_SpawnExplosive",), 0x8082F7F4:("Player_InitItemAction_SpawnHookshot",), 0x8082F8A0:("Player_InitItemAction_5",), - 0x8082F8BC:("func_8082F8BC",), + 0x8082F8BC:("Player_InitItemAction",), 0x8082F938:("Player_OverrideBlureColors",), 0x8082FA5C:("func_8082FA5C",), 0x8082FB68:("func_8082FB68",), 0x8082FBE8:("func_8082FBE8",), 0x8082FC24:("func_8082FC24",), 0x8082FC60:("func_8082FC60",), - 0x8082FC78:("func_8082FC78",), - 0x8082FCC4:("func_8082FCC4",), + 0x8082FC78:("Player_ItemIsInUse",), + 0x8082FCC4:("Player_ItemIsItemAction",), 0x8082FD0C:("func_8082FD0C",), 0x8082FDC4:("func_8082FDC4",), - 0x8082FE0C:("func_8082FE0C",), - 0x808302CC:("func_808302CC",), - 0x808304BC:("func_808304BC",), + 0x8082FE0C:("Player_ProcessItemButtons",), + 0x808302CC:("Player_StartChangingHeldItem",), + 0x808304BC:("Player_UpdateItems",), 0x808305BC:("func_808305BC",), 0x808306F8:("func_808306F8",), - 0x808308DC:("func_808308DC",), + 0x808308DC:("Player_FinishItemChange",), 0x808309CC:("func_808309CC",), 0x80830A58:("func_80830A58",), 0x80830AE8:("func_80830AE8",), 0x80830B38:("func_80830B38",), 0x80830B88:("func_80830B88",), 0x80830CE8:("func_80830CE8",), - 0x80830D40:("func_80830D40",), + 0x80830D40:("Player_WaitToFinishItemChange",), 0x80830DF0:("func_80830DF0",), 0x80830E30:("func_80830E30",), 0x80830F9C:("func_80830F9C",), @@ -4362,15 +4362,15 @@ 0x80831494:("Player_SetAction",), 0x8083172C:("Player_SetAction_PreserveMoveFlags",), 0x80831760:("Player_SetAction_PreserveItemAction",), - 0x808317C4:("func_808317C4",), + 0x808317C4:("Player_DestroyHookshot",), 0x80831814:("func_80831814",), 0x808318C0:("func_808318C0",), 0x80831944:("func_80831944",), - 0x80831990:("func_80831990",), + 0x80831990:("Player_UseItem",), 0x80831F34:("func_80831F34",), - 0x80832090:("func_80832090",), + 0x80832090:("Player_CanUpdateItems",), 0x8083213C:("func_8083213C",), - 0x8083216C:("func_8083216C",), + 0x8083216C:("Player_UpdateUpperBody",), 0x808323C0:("func_808323C0",), 0x80832444:("func_80832444",), 0x8083249C:("func_8083249C",), @@ -4646,7 +4646,7 @@ 0x80848640:("func_80848640",), 0x80848780:("Player_UpperAction_0",), 0x808487B8:("Player_UpperAction_1",), - 0x80848808:("Player_UpperAction_2",), + 0x80848808:("Player_UpperAction_ChangeHeldItem",), 0x8084894C:("Player_UpperAction_3",), 0x80848A0C:("Player_UpperAction_4",), 0x80848AB0:("Player_UpperAction_5",), diff --git a/tools/disasm/variables.txt b/tools/disasm/variables.txt index 9320ca10e..aababcf0b 100644 --- a/tools/disasm/variables.txt +++ b/tools/disasm/variables.txt @@ -4914,7 +4914,7 @@ 0x8082DA82:("sPauseZRCursorGreen","UNK_TYPE1","",0x1), 0x8082DA84:("sPauseZRCursorBlue","UNK_TYPE1","",0x1), 0x8082DA86:("sPauseZRCursorAlpha","UNK_TYPE1","",0x1), - 0x8085B9F0:("D_8085B9F0","UNK_TYPE1","",0x1), + 0x8085B9F0:("sPlayerUpperBodyLimbCopyMap","UNK_TYPE1","",0x1), 0x8085BA08:("D_8085BA08","UNK_TYPE1","",0x1), 0x8085BA20:("D_8085BA20","UNK_TYPE1","",0x1), 0x8085BA38:("sPlayerAgeProperties","UNK_TYPE1","",0x1), @@ -4944,10 +4944,10 @@ 0x8085C96C:("D_8085C96C","UNK_TYPE1","",0x1), 0x8085C98C:("sZoraBarrierEnvLighting","UNK_TYPE1","",0x1), 0x8085C99C:("sItemActionParams","UNK_TYPE1","",0x1), - 0x8085C9F0:("D_8085C9F0","UNK_PTR","",0x4), - 0x8085CB3C:("sPlayerInitItemActionFuncs","UNK_PTR","",0x4), - 0x8085CC88:("D_8085CC88","UNK_TYPE1","",0x1), - 0x8085CD00:("D_8085CD00","s8","[36]",0x24), + 0x8085C9F0:("sPlayerUpperActionUpdateFuncs","UNK_PTR","",0x4), + 0x8085CB3C:("sPlayerItemActionInitFuncs","UNK_PTR","",0x4), + 0x8085CC88:("sPlayerItemChangeInfo","UNK_TYPE1","",0x1), + 0x8085CD00:("sPlayerItemChangeTypes","s8","[36]",0x24), 0x8085CD24:("sPlayerExplosiveInfo","UNK_TYPE1","",0x1), 0x8085CD30:("sMeleeAttackAnimInfo","UNK_TYPE1","",0x220), 0x8085CF50:("D_8085CF50","UNK_TYPE1","",0x1), @@ -4959,7 +4959,7 @@ 0x8085CF80:("D_8085CF80","UNK_TYPE1","",0x1), 0x8085CF84:("D_8085CF84","UNK_TYPE1","",0x1), 0x8085CF88:("D_8085CF88","BlureColors","[2]",0x20), - 0x8085CFA8:("D_8085CFA8","u16","[4]",0x8), + 0x8085CFA8:("sPlayerItemButtons","u16","[4]",0x8), 0x8085CFB0:("D_8085CFB0","UNK_TYPE1","",0x1), 0x8085CFB8:("sMagicArrowCosts","u8","[4]",0x4), 0x8085CFBC:("D_8085CFBC","UNK_TYPE1","",0x1), @@ -5017,7 +5017,7 @@ 0x8085D2B0:("D_8085D2B0","UNK_TYPE1","",0x1), 0x8085D2B4:("D_8085D2B4","UNK_TYPE1","",0x1), 0x8085D2C0:("sInitChain","ActorInitVar","",0x4), - 0x8085D2C4:("D_8085D2C4","UNK_TYPE4","",0x4), + 0x8085D2C4:("sPlayerSkeletonBaseTransl","UNK_TYPE4","",0x4), 0x8085D2CC:("D_8085D2CC","UNK_PTR","",0x4), 0x8085D30C:("D_8085D30C","EffectBlureInit2","",0x24), 0x8085D330:("D_8085D330","EffectTireMarkInit","",0x8), @@ -5377,8 +5377,8 @@ 0x80862B3C:("D_80862B3C","f32","",0x4), 0x80862B40:("sPlayerFloorEffect","UNK_TYPE1","",0x1), 0x80862B44:("sPlayerControlInput","UNK_TYPE1","",0x1), - 0x80862B48:("D_80862B48","UNK_TYPE1","",0x1), - 0x80862B4C:("D_80862B4C","UNK_TYPE1","",0x1), + 0x80862B48:("sPlayerUseHeldItem","UNK_TYPE1","",0x1), + 0x80862B4C:("sPlayerHeldItemButtonIsHeldDown","UNK_TYPE1","",0x1), 0x80862B50:("D_80862B50","UNK_TYPE1","",0x1), 0x80862B6C:("D_80862B6C","UNK_TYPE1","",0x1), 0x808637B0:("En_Test_InitVars","ActorInit","",0x20), diff --git a/tools/sizes/code_functions.csv b/tools/sizes/code_functions.csv index caaa33d73..5194497c7 100644 --- a/tools/sizes/code_functions.csv +++ b/tools/sizes/code_functions.csv @@ -1713,7 +1713,7 @@ asm/non_matchings/code/z_player_lib/Player_IsGoronOrDeku.s,Player_IsGoronOrDeku, asm/non_matchings/code/z_player_lib/func_801234D4.s,func_801234D4,0x801234D4,0x2F asm/non_matchings/code/z_player_lib/func_80123590.s,func_80123590,0x80123590,0x13 asm/non_matchings/code/z_player_lib/func_801235DC.s,func_801235DC,0x801235DC,0x1C -asm/non_matchings/code/z_player_lib/func_8012364C.s,func_8012364C,0x8012364C,0x71 +asm/non_matchings/code/z_player_lib/Player_GetItemOnButton.s,Player_GetItemOnButton,0x8012364C,0x71 asm/non_matchings/code/z_player_lib/func_80123810.s,func_80123810,0x80123810,0x54 asm/non_matchings/code/z_player_lib/Player_ActionToModelGroup.s,Player_ActionToModelGroup,0x80123960,0x13 asm/non_matchings/code/z_player_lib/Player_SetModelsForHoldingShield.s,Player_SetModelsForHoldingShield,0x801239AC,0x3E From 1509349bd76a90e163a538fb159bffa74a54f8a9 Mon Sep 17 00:00:00 2001 From: engineer124 <47598039+engineer124@users.noreply.github.com> Date: Sun, 1 Oct 2023 12:56:38 +1100 Subject: [PATCH 08/16] Animation Cleanup: En_K* (#1402) * cleanup k * one more name --- src/code/z_skelanime.c | 3 +- .../actors/ovl_En_Fishing/z_en_fishing.c | 5 +- .../ovl_En_Guard_Nuts/z_en_guard_nuts.c | 3 +- .../actors/ovl_En_Kaizoku/z_en_kaizoku.c | 50 +++-- .../actors/ovl_En_Kaizoku/z_en_kaizoku.h | 2 +- .../actors/ovl_En_Kakasi/z_en_kakasi.c | 40 ++-- src/overlays/actors/ovl_En_Kame/z_en_kame.c | 6 +- src/overlays/actors/ovl_En_Kbt/z_en_kbt.c | 151 +++++++++----- src/overlays/actors/ovl_En_Kbt/z_en_kbt.h | 2 +- .../actors/ovl_En_Kendo_Js/z_en_kendo_js.c | 53 +++-- .../actors/ovl_En_Kendo_Js/z_en_kendo_js.h | 5 +- src/overlays/actors/ovl_En_Kgy/z_en_kgy.c | 191 +++++++++++------- src/overlays/actors/ovl_En_Kgy/z_en_kgy.h | 9 +- .../actors/ovl_En_Kujiya/z_en_kujiya.c | 15 ++ src/overlays/actors/ovl_En_Kusa/z_en_kusa.c | 7 + .../actors/ovl_Obj_Syokudai/z_obj_syokudai.c | 3 +- tools/disasm/functions.txt | 4 +- 17 files changed, 354 insertions(+), 195 deletions(-) diff --git a/src/code/z_skelanime.c b/src/code/z_skelanime.c index 79af1b73f..675487072 100644 --- a/src/code/z_skelanime.c +++ b/src/code/z_skelanime.c @@ -1680,7 +1680,8 @@ void SkelAnime_AnimateFrame(SkelAnime* skelAnime) { s32 frame = skelAnime->curFrame; f32 partialFrame = skelAnime->curFrame - frame; - if (++frame >= (s32)skelAnime->animLength) { + frame++; + if (frame >= (s32)skelAnime->animLength) { frame = 0; } SkelAnime_GetFrameData(skelAnime->animation, frame, skelAnime->limbCount, nextjointTable); diff --git a/src/overlays/actors/ovl_En_Fishing/z_en_fishing.c b/src/overlays/actors/ovl_En_Fishing/z_en_fishing.c index 39269c2ac..08f97aa93 100644 --- a/src/overlays/actors/ovl_En_Fishing/z_en_fishing.c +++ b/src/overlays/actors/ovl_En_Fishing/z_en_fishing.c @@ -3931,10 +3931,11 @@ void EnFishing_UpdateFish(Actor* thisx, PlayState* play2) { SkelAnime_Free(&this->skelAnime, play); if (this->unk_148 == 0) { - SkelAnime_InitFlex(play, &this->skelAnime, &gFishingBassSkel, &gFishingBassAnim, 0, 0, 0); + SkelAnime_InitFlex(play, &this->skelAnime, &gFishingBassSkel, &gFishingBassAnim, NULL, NULL, 0); Animation_MorphToLoop(&this->skelAnime, &gFishingBassAnim, 0.0f); } else { - SkelAnime_InitFlex(play, &this->skelAnime, &gFishingLoachSkel, &gFishingLoachAnim, 0, 0, 0); + SkelAnime_InitFlex(play, &this->skelAnime, &gFishingLoachSkel, &gFishingLoachAnim, NULL, NULL, + 0); Animation_MorphToLoop(&this->skelAnime, &gFishingLoachAnim, 0.0f); } } diff --git a/src/overlays/actors/ovl_En_Guard_Nuts/z_en_guard_nuts.c b/src/overlays/actors/ovl_En_Guard_Nuts/z_en_guard_nuts.c index 7fcf32bf4..e00f3b523 100644 --- a/src/overlays/actors/ovl_En_Guard_Nuts/z_en_guard_nuts.c +++ b/src/overlays/actors/ovl_En_Guard_Nuts/z_en_guard_nuts.c @@ -329,7 +329,8 @@ void EnGuardNuts_Update(Actor* thisx, PlayState* play) { s32 pad; if (this->blinkTimer == 0) { - if (++(this->eyeState) >= 3) { + this->eyeState++; + if (this->eyeState >= 3) { this->eyeState = 0; this->blinkTimer = (s16)Rand_ZeroFloat(60.0f) + 20; } diff --git a/src/overlays/actors/ovl_En_Kaizoku/z_en_kaizoku.c b/src/overlays/actors/ovl_En_Kaizoku/z_en_kaizoku.c index cee6b38fa..d629c57b9 100644 --- a/src/overlays/actors/ovl_En_Kaizoku/z_en_kaizoku.c +++ b/src/overlays/actors/ovl_En_Kaizoku/z_en_kaizoku.c @@ -442,8 +442,8 @@ s32 func_80B85A00(EnKaizoku* this, PlayState* play, s16 arg2) { void EnKaizoku_ChangeAnim(EnKaizoku* this, EnKaizokuAnimation animIndex) { this->animIndex = animIndex; - this->frameCount = Animation_GetLastFrame(sAnimations[this->animIndex]); - Animation_Change(&this->skelAnime, sAnimations[this->animIndex], 1.0f, 0.0f, this->frameCount, + this->animEndFrame = Animation_GetLastFrame(sAnimations[this->animIndex]); + Animation_Change(&this->skelAnime, sAnimations[this->animIndex], 1.0f, 0.0f, this->animEndFrame, sAnimationModes[this->animIndex], 0.0f); } @@ -553,7 +553,7 @@ void func_80B85FA8(EnKaizoku* this, PlayState* play) { break; case 3: - if (this->frameCount <= curFrame) { + if (curFrame >= this->animEndFrame) { sp54 = this->unk_2CA * 4 + this->unk_2C8; if (Player_GetMask(play) == PLAYER_MASK_STONE) { if (D_80B8A8D0[sp54] == 0x11A5) { @@ -595,7 +595,7 @@ void func_80B85FA8(EnKaizoku* this, PlayState* play) { case 6: Math_ApproachF(&this->unk_5E0, 5.0f, 0.3f, 1.0f); - if (this->frameCount <= curFrame) { + if (curFrame >= this->animEndFrame) { this->unk_598 = 7; this->unk_2F8.x = 1.0f; this->unk_59C++; @@ -700,7 +700,7 @@ void func_80B868B8(EnKaizoku* this, PlayState* play) { switch (this->unk_59C) { case 0: - if (this->frameCount <= curFrame) { + if (curFrame >= this->animEndFrame) { EnKaizoku_ChangeAnim(this, EN_KAIZOKU_ANIM_14); this->unk_2C8 = 3; this->unk_598 = 0; @@ -709,7 +709,7 @@ void func_80B868B8(EnKaizoku* this, PlayState* play) { break; case 1: - if (this->frameCount <= curFrame) { + if (curFrame >= this->animEndFrame) { s32 textId; EnKaizoku_ChangeAnim(this, EN_KAIZOKU_ANIM_15); @@ -787,7 +787,7 @@ void func_80B86B74(EnKaizoku* this, PlayState* play) { break; case 1: - if (this->frameCount <= curFrame) { + if (curFrame >= this->animEndFrame) { if (this->unk_2D9 == 0) { Actor_PlaySfx(&this->picto.actor, NA_SE_EN_PIRATE_DAMM_BREATH); this->unk_2D9 = 1; @@ -843,7 +843,7 @@ void func_80B86B74(EnKaizoku* this, PlayState* play) { 255; } - if ((this->frameCount <= curFrame) && (this->unk_5A0 >= 0x28)) { + if ((curFrame >= this->animEndFrame) && (this->unk_5A0 >= 0x28)) { this->picto.actor.draw = NULL; this->unk_598 = 10; Math_Vec3f_Copy(&this->unk_2F8, &gZeroVec3f); @@ -1127,7 +1127,7 @@ void func_80B87D3C(EnKaizoku* this, PlayState* play) { } this->unk_2D8 = 0; - if ((this->frameCount <= curFrame) && + if ((curFrame >= this->animEndFrame) && (this->picto.actor.bgCheckFlags & (BGCHECKFLAG_GROUND | BGCHECKFLAG_GROUND_TOUCH))) { this->bodyCollider.info.elemType = ELEMTYPE_UNK1; this->bodyCollider.base.colType = COLTYPE_HIT3; @@ -1157,7 +1157,7 @@ void func_80B87E9C(EnKaizoku* this, PlayState* play) { f32 curFrame = this->skelAnime.curFrame; this->unk_2D8 = 0; - if (this->frameCount <= curFrame) { + if (curFrame >= this->animEndFrame) { if ((this->picto.actor.xzDistToPlayer < 170.0f) && (this->picto.actor.xzDistToPlayer > 140.0f) && (Rand_ZeroOne() < 0.2f)) { func_80B88910(this); @@ -1207,7 +1207,7 @@ void func_80B87FDC(EnKaizoku* this, PlayState* play2) { } this->unk_2D8 = 0; - if (this->frameCount <= curFrame) { + if (curFrame >= this->animEndFrame) { if (!Actor_IsFacingPlayer(&this->picto.actor, 0x1554)) { func_80B872A4(this); @@ -1252,7 +1252,7 @@ void func_80B88278(EnKaizoku* this, PlayState* play) { f32 curFrame = this->skelAnime.curFrame; this->unk_2D8 = 0; - if (this->frameCount <= curFrame) { + if (curFrame >= this->animEndFrame) { this->picto.actor.speed = 0.0f; if (!Actor_IsFacingPlayer(&this->picto.actor, 0x1554)) { func_80B872A4(this); @@ -1404,22 +1404,20 @@ void func_80B88964(EnKaizoku* this, PlayState* play) { if (this->skelAnime.curFrame <= 8.0f) { this->picto.actor.shape.rot.y = this->picto.actor.world.rot.y = this->picto.actor.yawTowardsPlayer; - } else { - if (Animation_OnFrame(&this->skelAnime, 13.0f)) { - Actor_SpawnFloorDustRing(play, &this->picto.actor, &this->leftFootPos, 3.0f, 2, 2.0f, 0, 0, 0); - Actor_SpawnFloorDustRing(play, &this->picto.actor, &this->rightFootPos, 3.0f, 2, 2.0f, 0, 0, 0); - this->swordState = 1; - this->picto.actor.speed = 10.0f; - Actor_PlaySfx(&this->picto.actor, NA_SE_EN_PIRATE_ATTACK); - } else if (Animation_OnFrame(&this->skelAnime, 21.0f)) { - this->picto.actor.speed = 0.0f; - } else if (Animation_OnFrame(&this->skelAnime, 24.0f)) { - this->swordState = -1; - } + } else if (Animation_OnFrame(&this->skelAnime, 13.0f)) { + Actor_SpawnFloorDustRing(play, &this->picto.actor, &this->leftFootPos, 3.0f, 2, 2.0f, 0, 0, 0); + Actor_SpawnFloorDustRing(play, &this->picto.actor, &this->rightFootPos, 3.0f, 2, 2.0f, 0, 0, 0); + this->swordState = 1; + this->picto.actor.speed = 10.0f; + Actor_PlaySfx(&this->picto.actor, NA_SE_EN_PIRATE_ATTACK); + } else if (Animation_OnFrame(&this->skelAnime, 21.0f)) { + this->picto.actor.speed = 0.0f; + } else if (Animation_OnFrame(&this->skelAnime, 24.0f)) { + this->swordState = -1; } this->unk_2D8 = 0; - if ((this->frameCount <= curFrame) && (this->unk_2D0 < 2)) { + if ((curFrame >= this->animEndFrame) && (this->unk_2D0 < 2)) { if (!Actor_IsFacingPlayer(&this->picto.actor, 0x1554)) { func_80B872A4(this); this->unk_2B2 = Rand_ZeroOne() * 5.0f + 5.0f; @@ -1755,7 +1753,7 @@ void func_80B8971C(EnKaizoku* this, PlayState* play) { Math_SmoothStepToS(&this->picto.actor.shape.rot.y, this->picto.actor.yawTowardsPlayer, 1, 0xFA0, 1); SkelAnime_Update(&this->skelAnime); - if (this->frameCount <= curFrame) { + if (curFrame >= this->animEndFrame) { this->unk_2D8 = 0; func_80B86B58(this); } else if (Animation_OnFrame(&this->skelAnime, 10.0f)) { diff --git a/src/overlays/actors/ovl_En_Kaizoku/z_en_kaizoku.h b/src/overlays/actors/ovl_En_Kaizoku/z_en_kaizoku.h index e2c53d34b..a119777a9 100644 --- a/src/overlays/actors/ovl_En_Kaizoku/z_en_kaizoku.h +++ b/src/overlays/actors/ovl_En_Kaizoku/z_en_kaizoku.h @@ -80,7 +80,7 @@ typedef struct EnKaizoku { /* 0x2D6 */ s16 csId; /* 0x2D8 */ u8 unk_2D8; /* 0x2D9 */ u8 unk_2D9; - /* 0x2DC */ f32 frameCount; + /* 0x2DC */ f32 animEndFrame; /* 0x2E0 */ f32 unk_2E0; /* 0x2E4 */ EnKaizokuAnimation animIndex; /* 0x2E8 */ s32 bodyPartIndex; diff --git a/src/overlays/actors/ovl_En_Kakasi/z_en_kakasi.c b/src/overlays/actors/ovl_En_Kakasi/z_en_kakasi.c index be787e8d9..d2c877ad3 100644 --- a/src/overlays/actors/ovl_En_Kakasi/z_en_kakasi.c +++ b/src/overlays/actors/ovl_En_Kakasi/z_en_kakasi.c @@ -121,18 +121,32 @@ typedef enum { /* 5 */ ENKAKASI_ANIM_ARMS_CROSSED_STILL, // arms crossed but still, also some noise sfx /* 6 */ ENKAKASI_ANIM_WAVE, // "wave" short sideways shake, stops early, partial? unused? /* 7 */ ENKAKASI_ANIM_SLOWROLL, // partial bounch, ends looking left, OFFER anim takes over - /* 8 */ ENKAKASI_ANIM_IDLE // slow stretching wiggle, ends in regular position + /* 8 */ ENKAKASI_ANIM_IDLE, // slow stretching wiggle, ends in regular position + /* 9 */ ENKAKASI_ANIM_MAX } EnKakasiAnimation; -static AnimationHeader* sAnimations[] = { - &object_ka_Anim_007444, &object_ka_Anim_00686C, &object_ka_Anim_0081A4, - &object_ka_Anim_007B90, &object_ka_Anim_0071EC, &object_ka_Anim_007444, - &object_ka_Anim_00686C, &object_ka_Anim_0081A4, &object_ka_Anim_000214, +static AnimationHeader* sAnimations[ENKAKASI_ANIM_MAX] = { + &object_ka_Anim_007444, // ENKAKASI_ANIM_ARMS_CROSSED_ROCKING + &object_ka_Anim_00686C, // ENKAKASI_ANIM_SIDEWAYS_SHAKING + &object_ka_Anim_0081A4, // ENKAKASI_ANIM_HOPPING_REGULAR + &object_ka_Anim_007B90, // ENKAKASI_ANIM_SPIN_REACH_OFFER + &object_ka_Anim_0071EC, // ENKAKASI_ANIM_TWIRL + &object_ka_Anim_007444, // ENKAKASI_ANIM_ARMS_CROSSED_STILL + &object_ka_Anim_00686C, // ENKAKASI_ANIM_WAVE + &object_ka_Anim_0081A4, // ENKAKASI_ANIM_SLOWROLL + &object_ka_Anim_000214, // ENKAKASI_ANIM_IDLE }; -static u8 sAnimationModes[] = { - ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_ONCE, ANIMMODE_ONCE, - ANIMMODE_ONCE, ANIMMODE_ONCE, ANIMMODE_ONCE, ANIMMODE_ONCE, +static u8 sAnimationModes[ENKAKASI_ANIM_MAX] = { + ANIMMODE_LOOP, // ENKAKASI_ANIM_ARMS_CROSSED_ROCKING + ANIMMODE_LOOP, // ENKAKASI_ANIM_SIDEWAYS_SHAKING + ANIMMODE_LOOP, // ENKAKASI_ANIM_HOPPING_REGULAR + ANIMMODE_ONCE, // ENKAKASI_ANIM_SPIN_REACH_OFFER + ANIMMODE_ONCE, // ENKAKASI_ANIM_TWIRL + ANIMMODE_ONCE, // ENKAKASI_ANIM_ARMS_CROSSED_STILL + ANIMMODE_ONCE, // ENKAKASI_ANIM_WAVE + ANIMMODE_ONCE, // ENKAKASI_ANIM_SLOWROLL + ANIMMODE_ONCE, // ENKAKASI_ANIM_IDLE }; void EnKakasi_Destroy(Actor* thisx, PlayState* play) { @@ -147,7 +161,7 @@ void EnKakasi_Init(Actor* thisx, PlayState* play) { s32 i; Collider_InitAndSetCylinder(play, &this->collider, &this->picto.actor, &D_80971D80); - SkelAnime_InitFlex(play, &this->skelAnime, &object_ka_Skel_0065B0, &object_ka_Anim_000214, 0, 0, 0); + SkelAnime_InitFlex(play, &this->skelAnime, &object_ka_Skel_0065B0, &object_ka_Anim_000214, NULL, NULL, 0); this->songSummonDist = KAKASI_GET_SUMMON_DISTANCE(&this->picto.actor) * 20.0f; if (this->songSummonDist < 40.0f) { @@ -278,7 +292,6 @@ void func_8096FBB8(EnKakasi* this, PlayState* play) { (play->msgCtx.ocarinaButtonIndex == OCARINA_BTN_C_RIGHT) || (play->msgCtx.ocarinaButtonIndex == OCARINA_BTN_C_LEFT) || (play->msgCtx.ocarinaButtonIndex == OCARINA_BTN_C_UP)) { - // why not 0 < x < 4? fewer branches this->unk190++; } if ((this->unk190 != 0) && (this->animIndex != ENKAKASI_ANIM_SIDEWAYS_SHAKING)) { @@ -364,7 +377,7 @@ void EnKakasi_IdleStanding(EnKakasi* this, PlayState* play) { } else if ((day == 3) && gSaveContext.save.isNight) { this->skelAnime.playSpeed = 1.0f; if (this->animIndex != ENKAKASI_ANIM_SIDEWAYS_SHAKING) { - EnKakasi_ChangeAnim(this, 1); + EnKakasi_ChangeAnim(this, ENKAKASI_ANIM_SIDEWAYS_SHAKING); } } else if (this->animIndex != ENKAKASI_ANIM_IDLE) { EnKakasi_ChangeAnim(this, ENKAKASI_ANIM_IDLE); @@ -403,7 +416,8 @@ void EnKakasi_RegularDialogue(EnKakasi* this, PlayState* play) { // if dialogue: oh sorry come back again if ((this->picto.actor.textId == 0x1651) || (this->picto.actor.textId == 0x1659)) { if ((curFrame >= this->animEndFrame) && (this->animIndex != ENKAKASI_ANIM_SPIN_REACH_OFFER)) { - if (++this->unkCounter1A4 >= 2) { + this->unkCounter1A4++; + if (this->unkCounter1A4 >= 2) { this->unkCounter1A4 = 0; EnKakasi_ChangeAnim(this, ENKAKASI_ANIM_SPIN_REACH_OFFER); } @@ -1154,7 +1168,7 @@ void EnKakasi_Update(Actor* thisx, PlayState* play) { void EnKakasi_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) { EnKakasi* this = THIS; - if (limbIndex == 4) { + if (limbIndex == OBJECT_KA_LIMB_04) { Matrix_MultVec3f(&gZeroVec3f, &this->unk1BC); } } diff --git a/src/overlays/actors/ovl_En_Kame/z_en_kame.c b/src/overlays/actors/ovl_En_Kame/z_en_kame.c index c400b3428..8171e56b4 100644 --- a/src/overlays/actors/ovl_En_Kame/z_en_kame.c +++ b/src/overlays/actors/ovl_En_Kame/z_en_kame.c @@ -647,10 +647,10 @@ void EnKame_Stunned(EnKame* this, PlayState* play) { } void EnKame_SetupDamaged(EnKame* this) { - s16 lastFrame = Animation_GetLastFrame(&gSnapperDamageAnim); + s16 endFrame = Animation_GetLastFrame(&gSnapperDamageAnim); - Animation_Change(&this->snapperSkelAnime, &gSnapperDamageAnim, 1.0f, 0.0f, lastFrame, ANIMMODE_ONCE, -3.0f); - Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, lastFrame); + Animation_Change(&this->snapperSkelAnime, &gSnapperDamageAnim, 1.0f, 0.0f, endFrame, ANIMMODE_ONCE, -3.0f); + Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, endFrame); Actor_PlaySfx(&this->actor, NA_SE_EN_PAMET_DAMAGE); this->collider.base.acFlags &= ~AC_ON; this->actionFunc = EnKame_Damaged; diff --git a/src/overlays/actors/ovl_En_Kbt/z_en_kbt.c b/src/overlays/actors/ovl_En_Kbt/z_en_kbt.c index 76d88fa94..01e781ecb 100644 --- a/src/overlays/actors/ovl_En_Kbt/z_en_kbt.c +++ b/src/overlays/actors/ovl_En_Kbt/z_en_kbt.c @@ -17,11 +17,28 @@ void EnKbt_Draw(Actor* thisx, PlayState* play); s32 func_80B33E64(PlayState* play); s32 func_80B33E8C(PlayState* play); -void func_80B33EF0(EnKbt* this, s16 arg1); +void EnKbt_ChangeAnim(EnKbt* this, s16 animIndex); Actor* func_80B3403C(PlayState* play); void func_80B34314(EnKbt* this, PlayState* play); void func_80B34598(EnKbt* this, PlayState* play); +typedef enum EnKbtAnimation { + /* 0 */ ENKBT_ANIM_0, + /* 1 */ ENKBT_ANIM_1, + /* 2 */ ENKBT_ANIM_2, + /* 3 */ ENKBT_ANIM_3, + /* 4 */ ENKBT_ANIM_4, + /* 5 */ ENKBT_ANIM_5, + /* 6 */ ENKBT_ANIM_6, + /* 7 */ ENKBT_ANIM_7, + /* 8 */ ENKBT_ANIM_8, + /* 9 */ ENKBT_ANIM_9, + /* 10 */ ENKBT_ANIM_10, + /* 11 */ ENKBT_ANIM_11, + /* 12 */ ENKBT_ANIM_12, + /* 13 */ ENKBT_ANIM_MAX +} EnKbtAnimation; + ActorInit En_Kbt_InitVars = { ACTOR_EN_KBT, ACTORCAT_NPC, @@ -44,13 +61,13 @@ void EnKbt_Init(Actor* thisx, PlayState* play) { this->actor.home.rot.z = 0; this->unk_27E = 4; this->unk_27F = 0; - this->unk_280 = 13; + this->animIndex = ENKBT_ANIM_MAX; this->unk_282 = 13; this->unk_278 = func_80B3403C(play); this->unk_284 = 0; this->actor.textId = 0; if (func_80B33E64(play)) { - func_80B33EF0(this, 6); + EnKbt_ChangeAnim(this, ENKBT_ANIM_6); this->unk_282 = 11; if (func_80B33E8C(play)) { this->actor.textId = 0xC50; @@ -60,7 +77,7 @@ void EnKbt_Init(Actor* thisx, PlayState* play) { } this->actionFunc = func_80B34314; } else { - func_80B33EF0(this, 0); + EnKbt_ChangeAnim(this, ENKBT_ANIM_0); this->unk_282 = 0; this->actionFunc = func_80B34598; } @@ -82,27 +99,48 @@ s32 func_80B33E8C(PlayState* play) { return false; } -void func_80B33EF0(EnKbt* this, s16 arg1) { - static AnimationHeader* sAnimations[] = { - &object_kbt_Anim_000670, &object_kbt_Anim_001674, &object_kbt_Anim_002084, &object_kbt_Anim_000FE8, - &object_kbt_Anim_001940, &object_kbt_Anim_00E7BC, &object_kbt_Anim_00F0C8, &object_kbt_Anim_002710, - &object_kbt_Anim_002DE0, &object_kbt_Anim_003414, &object_kbt_Anim_003D24, &object_kbt_Anim_001BF4, - &object_kbt_Anim_002084, +void EnKbt_ChangeAnim(EnKbt* this, s16 animIndex) { + static AnimationHeader* sAnimations[ENKBT_ANIM_MAX] = { + &object_kbt_Anim_000670, // ENKBT_ANIM_0 + &object_kbt_Anim_001674, // ENKBT_ANIM_1 + &object_kbt_Anim_002084, // ENKBT_ANIM_2 + &object_kbt_Anim_000FE8, // ENKBT_ANIM_3 + &object_kbt_Anim_001940, // ENKBT_ANIM_4 + &object_kbt_Anim_00E7BC, // ENKBT_ANIM_5 + &object_kbt_Anim_00F0C8, // ENKBT_ANIM_6 + &object_kbt_Anim_002710, // ENKBT_ANIM_7 + &object_kbt_Anim_002DE0, // ENKBT_ANIM_8 + &object_kbt_Anim_003414, // ENKBT_ANIM_9 + &object_kbt_Anim_003D24, // ENKBT_ANIM_10 + &object_kbt_Anim_001BF4, // ENKBT_ANIM_11 + &object_kbt_Anim_002084, // ENKBT_ANIM_12 }; - u8 sp38[] = { - ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_ONCE, ANIMMODE_LOOP, ANIMMODE_ONCE, ANIMMODE_LOOP, ANIMMODE_LOOP, - ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_ONCE, ANIMMODE_ONCE, + u8 animationModes[ENKBT_ANIM_MAX] = { + ANIMMODE_LOOP, // ENKBT_ANIM_0 + ANIMMODE_LOOP, // ENKBT_ANIM_1 + ANIMMODE_ONCE, // ENKBT_ANIM_2 + ANIMMODE_LOOP, // ENKBT_ANIM_3 + ANIMMODE_ONCE, // ENKBT_ANIM_4 + ANIMMODE_LOOP, // ENKBT_ANIM_5 + ANIMMODE_LOOP, // ENKBT_ANIM_6 + ANIMMODE_LOOP, // ENKBT_ANIM_7 + ANIMMODE_LOOP, // ENKBT_ANIM_8 + ANIMMODE_LOOP, // ENKBT_ANIM_9 + ANIMMODE_LOOP, // ENKBT_ANIM_10 + ANIMMODE_ONCE, // ENKBT_ANIM_11 + ANIMMODE_ONCE, // ENKBT_ANIM_12 }; - if (arg1 != this->unk_280) { - if (arg1 >= 12) { - Animation_Change(&this->skelAnime, sAnimations[arg1], -1.0f, - Animation_GetLastFrame(sAnimations[arg1]) - 1.0f, 0.0f, sp38[arg1], -5.0f); + if (this->animIndex != animIndex) { + if (animIndex >= ENKBT_ANIM_12) { + Animation_Change(&this->skelAnime, sAnimations[animIndex], -1.0f, + Animation_GetLastFrame(sAnimations[animIndex]) - 1.0f, 0.0f, animationModes[animIndex], + -5.0f); } else { - Animation_Change(&this->skelAnime, sAnimations[arg1], 1.0f, 0.0f, Animation_GetLastFrame(sAnimations[arg1]), - sp38[arg1], -5.0f); + Animation_Change(&this->skelAnime, sAnimations[animIndex], 1.0f, 0.0f, + Animation_GetLastFrame(sAnimations[animIndex]), animationModes[animIndex], -5.0f); } - this->unk_280 = arg1; + this->animIndex = animIndex; } } @@ -124,11 +162,11 @@ void func_80B34078(EnKbt* this) { if (this->unk_284 > 0) { this->unk_284--; } else { - switch (this->unk_280) { - case 2: + switch (this->animIndex) { + case ENKBT_ANIM_2: switch (this->unk_282) { case 0: - func_80B33EF0(this, 12); + EnKbt_ChangeAnim(this, ENKBT_ANIM_12); break; case 5: @@ -136,21 +174,24 @@ void func_80B34078(EnKbt* this) { break; default: - func_80B33EF0(this, 5); + EnKbt_ChangeAnim(this, ENKBT_ANIM_5); break; } break; - case 12: - func_80B33EF0(this, 0); + case ENKBT_ANIM_12: + EnKbt_ChangeAnim(this, ENKBT_ANIM_0); this->actor.home.rot.z = 0; break; - case 4: - func_80B33EF0(this, 1); + case ENKBT_ANIM_4: + EnKbt_ChangeAnim(this, ENKBT_ANIM_1); this->unk_27E = 2; this->actor.home.rot.z = 0; break; + + default: + break; } } } @@ -169,67 +210,70 @@ void func_80B3415C(EnKbt* this) { switch (this->unk_282) { case 0: - if ((this->unk_280 != 2) && (this->unk_280 != 12)) { - func_80B33EF0(this, 0); + if ((this->animIndex != ENKBT_ANIM_2) && (this->animIndex != ENKBT_ANIM_12)) { + EnKbt_ChangeAnim(this, ENKBT_ANIM_0); } break; case 1: - func_80B33EF0(this, 2); + EnKbt_ChangeAnim(this, ENKBT_ANIM_2); this->unk_282 = 0; break; case 2: - if (this->unk_280 != 12) { - func_80B33EF0(this, 3); + if (this->animIndex != ENKBT_ANIM_12) { + EnKbt_ChangeAnim(this, ENKBT_ANIM_3); } break; case 3: - if (this->unk_280 != 1) { - func_80B33EF0(this, 4); + if (this->animIndex != ENKBT_ANIM_1) { + EnKbt_ChangeAnim(this, ENKBT_ANIM_4); } break; case 10: - func_80B33EF0(this, 11); + EnKbt_ChangeAnim(this, ENKBT_ANIM_11); break; case 4: - func_80B33EF0(this, 2); + EnKbt_ChangeAnim(this, ENKBT_ANIM_2); this->unk_282 = 6; break; case 6: - if (this->unk_280 != 2) { - func_80B33EF0(this, 5); + if (this->animIndex != ENKBT_ANIM_2) { + EnKbt_ChangeAnim(this, ENKBT_ANIM_5); } break; case 11: - func_80B33EF0(this, 6); + EnKbt_ChangeAnim(this, ENKBT_ANIM_6); break; case 7: - if (this->unk_280 != 2) { - func_80B33EF0(this, 7); + if (this->animIndex != ENKBT_ANIM_2) { + EnKbt_ChangeAnim(this, ENKBT_ANIM_7); } break; case 8: - if (this->unk_280 != 2) { - func_80B33EF0(this, 8); + if (this->animIndex != ENKBT_ANIM_2) { + EnKbt_ChangeAnim(this, ENKBT_ANIM_8); } break; case 9: - if (this->unk_280 != 2) { - func_80B33EF0(this, 9); + if (this->animIndex != ENKBT_ANIM_2) { + EnKbt_ChangeAnim(this, ENKBT_ANIM_9); } break; case 12: - func_80B33EF0(this, 10); + EnKbt_ChangeAnim(this, ENKBT_ANIM_10); + break; + + default: break; } } @@ -327,7 +371,7 @@ void func_80B34598(EnKbt* this, PlayState* play) { this->unk_27E = 4; this->unk_27F = 0; this->unk_282 = 0; - func_80B33EF0(this, 12); + EnKbt_ChangeAnim(this, ENKBT_ANIM_12); break; case 0x6: @@ -411,26 +455,26 @@ void func_80B34598(EnKbt* this, PlayState* play) { case 0xC35: this->unk_27E = 4; this->unk_27F = 0; - func_80B33EF0(this, 2); + EnKbt_ChangeAnim(this, ENKBT_ANIM_2); this->unk_282 = 5; break; case 0xC36: this->unk_27E = 1; this->unk_27F = 1; - func_80B33EF0(this, 7); + EnKbt_ChangeAnim(this, ENKBT_ANIM_7); this->unk_282 = 7; break; case 0xC37: - func_80B33EF0(this, 10); + EnKbt_ChangeAnim(this, ENKBT_ANIM_10); this->unk_27E = 0; this->unk_27F = 1; break; case 0xC38: case 0xC39: - func_80B33EF0(this, 7); + EnKbt_ChangeAnim(this, ENKBT_ANIM_7); this->unk_27E = 0; this->unk_27F = 1; break; @@ -517,6 +561,9 @@ void func_80B34598(EnKbt* this, PlayState* play) { this->unk_27F = 1; this->unk_282 = 12; break; + + default: + break; } this->actor.textId = 0; diff --git a/src/overlays/actors/ovl_En_Kbt/z_en_kbt.h b/src/overlays/actors/ovl_En_Kbt/z_en_kbt.h index eb491bf28..9a7a5cdf0 100644 --- a/src/overlays/actors/ovl_En_Kbt/z_en_kbt.h +++ b/src/overlays/actors/ovl_En_Kbt/z_en_kbt.h @@ -17,7 +17,7 @@ typedef struct EnKbt { /* 0x27C */ u16 unk_27C; /* 0x27E */ u8 unk_27E; /* 0x27F */ u8 unk_27F; - /* 0x280 */ s16 unk_280; + /* 0x280 */ s16 animIndex; /* 0x282 */ s16 unk_282; /* 0x284 */ s16 unk_284; /* 0x288 */ EnKbtActionFunc actionFunc; diff --git a/src/overlays/actors/ovl_En_Kendo_Js/z_en_kendo_js.c b/src/overlays/actors/ovl_En_Kendo_Js/z_en_kendo_js.c index ce3011e6d..31d98abf0 100644 --- a/src/overlays/actors/ovl_En_Kendo_Js/z_en_kendo_js.c +++ b/src/overlays/actors/ovl_En_Kendo_Js/z_en_kendo_js.c @@ -6,7 +6,6 @@ #include "z_en_kendo_js.h" #include "overlays/actors/ovl_En_Maruta/z_en_maruta.h" -#include "objects/object_js/object_js.h" #define FLAGS \ (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10 | ACTOR_FLAG_2000000 | ACTOR_FLAG_CANT_LOCK_ON) @@ -72,12 +71,21 @@ static ColliderCylinderInit sCylinderInit = { static CollisionCheckInfoInit2 sColChkInfoInit = { 0, 0, 0, 0, MASS_IMMOVABLE }; -static AnimationInfo sAnimationInfo[] = { - { &object_js_Anim_000C7C, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -8.0f }, - { &object_js_Anim_000F4C, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -8.0f }, - { &object_js_Anim_00016C, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -8.0f }, - { &object_js_Anim_0003DC, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -8.0f }, - { &object_js_Anim_000AD4, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -8.0f }, +typedef enum EnKendoJsAnimation { + /* 0 */ ENKENDOJS_ANIM_0, + /* 1 */ ENKENDOJS_ANIM_1, + /* 2 */ ENKENDOJS_ANIM_2, + /* 3 */ ENKENDOJS_ANIM_3, + /* 4 */ ENKENDOJS_ANIM_4, + /* 5 */ ENKENDOJS_ANIM_MAX +} EnKendoJsAnimation; + +static AnimationInfo sAnimationInfo[ENKENDOJS_ANIM_MAX] = { + { &object_js_Anim_000C7C, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -8.0f }, // ENKENDOJS_ANIM_0 + { &object_js_Anim_000F4C, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -8.0f }, // ENKENDOJS_ANIM_1 + { &object_js_Anim_00016C, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -8.0f }, // ENKENDOJS_ANIM_2 + { &object_js_Anim_0003DC, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -8.0f }, // ENKENDOJS_ANIM_3 + { &object_js_Anim_000AD4, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -8.0f }, // ENKENDOJS_ANIM_4 }; s16 D_80B27CE0[][3] = { @@ -110,7 +118,7 @@ void EnKendoJs_Init(Actor* thisx, PlayState* play) { CollisionCheck_SetInfo2(&this->actor.colChkInfo, DamageTable_Get(0x16), &sColChkInfoInit); SkelAnime_InitFlex(play, &this->skelAnime, &object_js_Skel_006990, &object_js_Anim_000F4C, this->jointTable, - this->morphTable, 13); + this->morphTable, OBJECT_JS_LIMB_MAX); if ((CURRENT_DAY == 3) && !((gSaveContext.save.time <= CLOCK_TIME(23, 0)) && (gSaveContext.save.time >= CLOCK_TIME(6, 0)))) { @@ -120,7 +128,7 @@ void EnKendoJs_Init(Actor* thisx, PlayState* play) { this->actor.home.rot.z, 0x10); Actor_Kill(&this->actor); } else { - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 4); + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENKENDOJS_ANIM_4); } } else if (ENKENDOJS_GET_FF(&this->actor) == ENKENDOJS_FF_1) { Actor_Kill(&this->actor); @@ -224,7 +232,7 @@ void func_80B26758(EnKendoJs* this, PlayState* play) { Audio_PlaySfx(NA_SE_SY_ERROR); Message_StartTextbox(play, 0x272C, &this->actor); this->unk_288 = 0x272C; - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 2); + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENKENDOJS_ANIM_2); } else if (gSaveContext.save.saveInfo.playerData.rupees < play->msgCtx.unk1206C) { Audio_PlaySfx(NA_SE_SY_ERROR); Message_StartTextbox(play, 0x2718, &this->actor); @@ -242,7 +250,7 @@ void func_80B26758(EnKendoJs* this, PlayState* play) { Audio_PlaySfx(NA_SE_SY_ERROR); Message_StartTextbox(play, 0x272C, &this->actor); this->unk_288 = 0x272C; - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 2); + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENKENDOJS_ANIM_2); } else if (gSaveContext.save.saveInfo.playerData.rupees < play->msgCtx.unk12070) { Audio_PlaySfx(NA_SE_SY_ERROR); Message_StartTextbox(play, 0x2718, &this->actor); @@ -259,6 +267,9 @@ void func_80B26758(EnKendoJs* this, PlayState* play) { Audio_PlaySfx_MessageCancel(); Message_StartTextbox(play, 0x2717, &this->actor); this->unk_288 = 0x2717; + + default: + break; } } } @@ -310,6 +321,9 @@ void func_80B269A4(EnKendoJs* this, PlayState* play) { func_80B276C4(this); func_80B276D8(this, play); break; + + default: + break; } } @@ -332,7 +346,7 @@ void func_80B26AFC(EnKendoJs* this, PlayState* play) { case TEXT_STATE_DONE: if (Message_ShouldAdvance(play)) { if (this->unk_288 == 0x272C) { - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 3); + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENKENDOJS_ANIM_3); } if ((this->unk_288 == 0x272E) || (this->unk_288 == 0x272F) || (this->unk_288 == 0x2730)) { @@ -347,6 +361,7 @@ void func_80B26AFC(EnKendoJs* this, PlayState* play) { case TEXT_STATE_1: case TEXT_STATE_CLOSING: case TEXT_STATE_3: + default: break; } } @@ -443,6 +458,9 @@ s32 func_80B26BF8(EnKendoJs* this, PlayState* play) { return 1; } break; + + default: + break; } return 2; } @@ -477,6 +495,9 @@ s32 func_80B26F6C(EnKendoJs* this, PlayState* play) { return true; } break; + + default: + break; } return false; } @@ -523,7 +544,7 @@ void func_80B27188(EnKendoJs* this, PlayState* play) { func_80B26F14(this, play); } else if (!func_80B26F6C(this, play)) { if (this->skelAnime.animation == &object_js_Anim_00016C) { - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 3); + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENKENDOJS_ANIM_3); } this->unk_286 = 2; Message_CloseTextbox(play); @@ -548,7 +569,7 @@ void func_80B27188(EnKendoJs* this, PlayState* play) { player->stateFlags1 |= PLAYER_STATE1_20; Message_StartTextbox(play, 0x2729, &this->actor); this->unk_288 = 0x2729; - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 2); + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENKENDOJS_ANIM_2); break; default: @@ -564,7 +585,7 @@ void func_80B27188(EnKendoJs* this, PlayState* play) { if ((this->skelAnime.animation == &object_js_Anim_0003DC) && Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) { - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 1); + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENKENDOJS_ANIM_1); } if (this->unk_284 == 7) { @@ -764,7 +785,7 @@ void EnKendoJs_Update(Actor* thisx, PlayState* play) { s32 EnKendoJs_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) { EnKendoJs* this = THIS; - if (limbIndex == 12) { + if (limbIndex == OBJECT_JS_LIMB_0C) { rot->y -= this->unk_278.y; } return false; diff --git a/src/overlays/actors/ovl_En_Kendo_Js/z_en_kendo_js.h b/src/overlays/actors/ovl_En_Kendo_Js/z_en_kendo_js.h index 1992f7234..8602550e0 100644 --- a/src/overlays/actors/ovl_En_Kendo_Js/z_en_kendo_js.h +++ b/src/overlays/actors/ovl_En_Kendo_Js/z_en_kendo_js.h @@ -2,6 +2,7 @@ #define Z_EN_KENDO_JS_H #include "global.h" +#include "objects/object_js/object_js.h" struct EnKendoJs; @@ -17,8 +18,8 @@ typedef struct EnKendoJs { /* 0x144 */ ColliderCylinder collider; /* 0x190 */ SkelAnime skelAnime; /* 0x1D4 */ EnKendoJsActionFunc actionFunc; - /* 0x1D8 */ Vec3s jointTable[13]; - /* 0x226 */ Vec3s morphTable[13]; + /* 0x1D8 */ Vec3s jointTable[OBJECT_JS_LIMB_MAX]; + /* 0x226 */ Vec3s morphTable[OBJECT_JS_LIMB_MAX]; /* 0x274 */ Vec3s* unk_274; /* 0x278 */ Vec3s unk_278; /* 0x27E */ Vec3s unk_27E; diff --git a/src/overlays/actors/ovl_En_Kgy/z_en_kgy.c b/src/overlays/actors/ovl_En_Kgy/z_en_kgy.c index b5819e333..62d4a1f62 100644 --- a/src/overlays/actors/ovl_En_Kgy/z_en_kgy.c +++ b/src/overlays/actors/ovl_En_Kgy/z_en_kgy.c @@ -5,7 +5,6 @@ */ #include "z_en_kgy.h" -#include "objects/object_kgy/object_kgy.h" #include "objects/gameplay_keep/gameplay_keep.h" #define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY) @@ -31,6 +30,21 @@ void func_80B425A0(EnKgy* this, PlayState* play); void func_80B42714(EnKgy* this, PlayState* play); void func_80B42D28(EnKgy* this, PlayState* play); +typedef enum EnKgyAnimation { + /* -1 */ ENKGY_ANIM_NONE = -1, + /* 0 */ ENKGY_ANIM_0, + /* 1 */ ENKGY_ANIM_1, + /* 2 */ ENKGY_ANIM_2, + /* 3 */ ENKGY_ANIM_3, + /* 4 */ ENKGY_ANIM_4, + /* 5 */ ENKGY_ANIM_5, + /* 6 */ ENKGY_ANIM_6, + /* 7 */ ENKGY_ANIM_7, + /* 8 */ ENKGY_ANIM_8, + /* 9 */ ENKGY_ANIM_9, + /* 10 */ ENKGY_ANIM_MAX +} EnKgyAnimation; + ActorInit En_Kgy_InitVars = { ACTOR_EN_KGY, ACTORCAT_NPC, @@ -50,11 +64,11 @@ void EnKgy_Init(Actor* thisx, PlayState* play) { Actor_SetScale(&this->actor, 0.01f); SkelAnime_InitFlex(play, &this->skelAnime, &object_kgy_Skel_00F910, &object_kgy_Anim_004B98, this->jointTable, - this->morphTable, 23); - this->unk_2D2 = -1; + this->morphTable, OBJECT_KGY_LIMB_MAX); + this->animIndex = ENKGY_ANIM_NONE; this->unk_29C = 0; this->unk_2E4 = 0; - this->unk_2E2 = -1; + this->animIndex2 = ENKGY_ANIM_NONE; this->zubora = EnKgy_FindZubora(play); this->iceBlock = EnKgy_FindIceBlock(play); Flags_UnsetSwitch(play, ENKGY_GET_FE00(&this->actor) + 1); @@ -64,25 +78,25 @@ void EnKgy_Init(Actor* thisx, PlayState* play) { play->envCtx.lightSettingOverride = 1; SET_WEEKEVENTREG(WEEKEVENTREG_21_01); if (!func_80B40D64(play)) { - EnKgy_ChangeAnim(this, 4, ANIMMODE_LOOP, 0); + EnKgy_ChangeAnim(this, ENKGY_ANIM_4, ANIMMODE_LOOP, 0); this->actionFunc = func_80B425A0; this->actor.textId = 0xC35; } else if (!func_80B40DB4(play)) { - EnKgy_ChangeAnim(this, 6, ANIMMODE_ONCE, 0); + EnKgy_ChangeAnim(this, ENKGY_ANIM_6, ANIMMODE_ONCE, 0); this->actionFunc = func_80B419B0; this->actor.textId = 0xC4E; this->unk_29C |= 1; this->getItemId = GI_RUPEE_10; } else { - EnKgy_ChangeAnim(this, 4, ANIMMODE_LOOP, 0); + EnKgy_ChangeAnim(this, ENKGY_ANIM_4, ANIMMODE_LOOP, 0); this->actionFunc = func_80B42714; this->actor.textId = 0xC50; } } else { if (CHECK_WEEKEVENTREG(WEEKEVENTREG_20_80)) { - EnKgy_ChangeAnim(this, 4, ANIMMODE_LOOP, 0); + EnKgy_ChangeAnim(this, ENKGY_ANIM_4, ANIMMODE_LOOP, 0); } else { - EnKgy_ChangeAnim(this, 0, ANIMMODE_LOOP, 0); + EnKgy_ChangeAnim(this, ENKGY_ANIM_0, ANIMMODE_LOOP, 0); } this->actionFunc = func_80B42D28; } @@ -109,21 +123,28 @@ void EnKgy_Destroy(Actor* thisx, PlayState* play) { LightContext_RemoveLight(play, &play->lightCtx, this->lightNode); } -void EnKgy_ChangeAnim(EnKgy* this, s16 animIndex, u8 animMode, f32 morphFrames) { - static AnimationHeader* sAnimations[] = { - &object_kgy_Anim_004B98, &object_kgy_Anim_0008FC, &object_kgy_Anim_00292C, &object_kgy_Anim_0042E4, - &object_kgy_Anim_0101F0, &object_kgy_Anim_001764, &object_kgy_Anim_003334, &object_kgy_Anim_010B84, - &object_kgy_Anim_001EA4, &object_kgy_Anim_003D88, - }; +static AnimationHeader* sAnimations[ENKGY_ANIM_MAX] = { + &object_kgy_Anim_004B98, // ENKGY_ANIM_0 + &object_kgy_Anim_0008FC, // ENKGY_ANIM_1 + &object_kgy_Anim_00292C, // ENKGY_ANIM_2 + &object_kgy_Anim_0042E4, // ENKGY_ANIM_3 + &object_kgy_Anim_0101F0, // ENKGY_ANIM_4 + &object_kgy_Anim_001764, // ENKGY_ANIM_5 + &object_kgy_Anim_003334, // ENKGY_ANIM_6 + &object_kgy_Anim_010B84, // ENKGY_ANIM_7 + &object_kgy_Anim_001EA4, // ENKGY_ANIM_8 + &object_kgy_Anim_003D88, // ENKGY_ANIM_9 +}; +void EnKgy_ChangeAnim(EnKgy* this, s16 animIndex, u8 animMode, f32 morphFrames) { Animation_Change(&this->skelAnime, sAnimations[animIndex], 1.0f, 0.0f, Animation_GetLastFrame(sAnimations[animIndex]), animMode, morphFrames); - this->unk_2D2 = animIndex; + this->animIndex = animIndex; } -void func_80B40BC0(EnKgy* this, s16 arg1) { - if (arg1 != this->unk_2D2) { - EnKgy_ChangeAnim(this, arg1, ANIMMODE_LOOP, -5.0f); +void EnKgy_ChangeAnimLoopMorph(EnKgy* this, s16 animIndex) { + if (this->animIndex != animIndex) { + EnKgy_ChangeAnim(this, animIndex, ANIMMODE_LOOP, -5.0f); } } @@ -218,13 +239,13 @@ void func_80B40EE8(EnKgy* this, PlayState* play) { if (this->unk_2E4 > 0) { this->unk_2E4--; - if ((this->unk_2E4 == 0) && (this->unk_2E2 >= 0)) { - if (this->unk_2E2 == 3) { - EnKgy_ChangeAnim(this, 3, ANIMMODE_ONCE, -5.0f); + if ((this->unk_2E4 == 0) && (this->animIndex2 > ENKGY_ANIM_NONE)) { + if (this->animIndex2 == ENKGY_ANIM_3) { + EnKgy_ChangeAnim(this, ENKGY_ANIM_3, ANIMMODE_ONCE, -5.0f); } else { - func_80B40BC0(this, this->unk_2E2); + EnKgy_ChangeAnimLoopMorph(this, this->animIndex2); } - this->unk_2E2 = -1; + this->animIndex2 = ENKGY_ANIM_NONE; } } @@ -258,14 +279,14 @@ void func_80B40EE8(EnKgy* this, PlayState* play) { switch (this->actor.textId) { case 0xC22: this->unk_2E4 = 20; - this->unk_2E2 = 3; + this->animIndex2 = ENKGY_ANIM_3; break; case 0xC43: if (func_80B40D64(play)) { - func_80B40BC0(this, 7); + EnKgy_ChangeAnimLoopMorph(this, ENKGY_ANIM_7); } else { - func_80B40BC0(this, 1); + EnKgy_ChangeAnimLoopMorph(this, ENKGY_ANIM_1); } this->unk_2E4 = 30; this->actionFunc = func_80B41A48; @@ -273,7 +294,10 @@ void func_80B40EE8(EnKgy* this, PlayState* play) { case 0xC52: case 0xC54: - func_80B40BC0(this, 1); + EnKgy_ChangeAnimLoopMorph(this, ENKGY_ANIM_1); + break; + + default: break; } } @@ -288,7 +312,7 @@ void func_80B40EE8(EnKgy* this, PlayState* play) { if (this->unk_2E8 == 0) { if ((this->actor.textId == 0xC1D) || (this->actor.textId == 0xC2D)) { this->unk_2E4 = 20; - this->unk_2E2 = 3; + this->animIndex2 = ENKGY_ANIM_3; func_80B40EBC(this, play, this->actor.textId); } else { func_80B40EBC(this, play, this->actor.textId); @@ -339,6 +363,9 @@ void func_80B411DC(EnKgy* this, PlayState* play, s32 arg2) { } this->csIdIndex = 4; break; + + default: + break; } } @@ -419,16 +446,16 @@ void func_80B4163C(EnKgy* this, PlayState* play) { this->actor.focus.pos = this->unk_2A8; if (SkelAnime_Update(&this->skelAnime)) { - if (this->unk_2D2 == 6) { + if (this->animIndex == ENKGY_ANIM_6) { if (this->getItemId > GI_NONE) { - EnKgy_ChangeAnim(this, 6, ANIMMODE_ONCE, 0.0f); + EnKgy_ChangeAnim(this, ENKGY_ANIM_6, ANIMMODE_ONCE, 0.0f); this->getItemId--; } else { - EnKgy_ChangeAnim(this, 9, ANIMMODE_ONCE, -5.0f); + EnKgy_ChangeAnim(this, ENKGY_ANIM_9, ANIMMODE_ONCE, -5.0f); this->getItemId = (s32)Rand_ZeroFloat(GI_RUPEE_PURPLE - GI_RUPEE_BLUE) + GI_RUPEE_BLUE; } } else { - EnKgy_ChangeAnim(this, 6, ANIMMODE_ONCE, -5.0f); + EnKgy_ChangeAnim(this, ENKGY_ANIM_6, ANIMMODE_ONCE, -5.0f); } SkelAnime_Update(&this->skelAnime); } @@ -446,6 +473,9 @@ void func_80B4163C(EnKgy* this, PlayState* play) { this->unk_300 = 200; Actor_PlaySfx(&this->actor, NA_SE_EV_SWORD_FORGE); break; + + default: + break; } this->lightInfo.params.point.radius = this->unk_300; @@ -608,11 +638,11 @@ void func_80B41E18(EnKgy* this, PlayState* play) { s32 pad; Player* player = GET_PLAYER(play); - if (SkelAnime_Update(&this->skelAnime) && (this->unk_2D2 == 3)) { - func_80B40BC0(this, 4); + if (SkelAnime_Update(&this->skelAnime) && (this->animIndex == ENKGY_ANIM_3)) { + EnKgy_ChangeAnimLoopMorph(this, ENKGY_ANIM_4); } - if ((this->unk_2E4 <= 0) && !(this->unk_29C & 2) && func_80B40E54(this) == 0) { + if ((this->unk_2E4 <= 0) && !(this->unk_29C & 2) && (func_80B40E54(this) == 0)) { switch (Message_GetState(&play->msgCtx)) { case TEXT_STATE_CHOICE: if (Message_ShouldAdvance(play)) { @@ -636,6 +666,9 @@ void func_80B41E18(EnKgy* this, PlayState* play) { Audio_PlaySfx_MessageCancel(); func_80B40EBC(this, play, textId); break; + + default: + break; } break; @@ -650,8 +683,14 @@ void func_80B41E18(EnKgy* this, PlayState* play) { Audio_PlaySfx_MessageCancel(); func_80B40E74(this, play, 0xC3C); break; + + default: + break; } break; + + default: + break; } } break; @@ -683,13 +722,13 @@ void func_80B41E18(EnKgy* this, PlayState* play) { this->actionFunc = func_80B425A0; func_80B413C8(this); func_80B40E18(this, 5); - func_80B40BC0(this, 4); + EnKgy_ChangeAnimLoopMorph(this, ENKGY_ANIM_4); this->actor.textId = 0xC35; break; case 0xC3A: func_80B40E74(this, play, func_80B41528(play)); - func_80B40BC0(this, 4); + EnKgy_ChangeAnimLoopMorph(this, ENKGY_ANIM_4); break; case 0xC3C: @@ -758,7 +797,7 @@ void func_80B41E18(EnKgy* this, PlayState* play) { break; case 0xC47: - func_80B40BC0(this, 1); + EnKgy_ChangeAnimLoopMorph(this, ENKGY_ANIM_1); if (this->unk_29C & 8) { player->exchangeItemAction = PLAYER_IA_NONE; this->unk_29C &= ~8; @@ -780,7 +819,7 @@ void func_80B41E18(EnKgy* this, PlayState* play) { case 0xC4A: case 0xC4B: - func_80B40BC0(this, 4); + EnKgy_ChangeAnimLoopMorph(this, ENKGY_ANIM_4); Message_CloseTextbox(play); this->actionFunc = func_80B41C54; this->actor.textId = 0xC4B; @@ -817,9 +856,15 @@ void func_80B41E18(EnKgy* this, PlayState* play) { func_80B413C8(this); func_80B40E18(this, 8); break; + + default: + break; } } break; + + default: + break; } } @@ -844,7 +889,7 @@ void func_80B425A0(EnKgy* this, PlayState* play) { this->actor.focus.pos = this->unk_2A8; if (Actor_ProcessTalkRequest(&this->actor, &play->state)) { this->actionFunc = func_80B41E18; - func_80B40BC0(this, 1); + EnKgy_ChangeAnimLoopMorph(this, ENKGY_ANIM_1); func_80B411DC(this, play, 0); func_80B40E18(this, this->actor.textId); } else if (this->actor.xzDistToPlayer < 200.0f) { @@ -887,11 +932,11 @@ void func_80B427C8(EnKgy* this, PlayState* play) { u16 textId; if (SkelAnime_Update(&this->skelAnime)) { - if (this->unk_2D2 == 5) { - func_80B40BC0(this, 7); + if (this->animIndex == ENKGY_ANIM_5) { + EnKgy_ChangeAnimLoopMorph(this, ENKGY_ANIM_7); } - if (this->unk_2D2 == 3) { - func_80B40BC0(this, 4); + if (this->animIndex == ENKGY_ANIM_3) { + EnKgy_ChangeAnimLoopMorph(this, ENKGY_ANIM_4); } } @@ -923,26 +968,29 @@ void func_80B427C8(EnKgy* this, PlayState* play) { this->actionFunc = func_80B41C54; func_80B413C8(this); func_80B40E18(this, 6); - func_80B40BC0(this, 4); + EnKgy_ChangeAnimLoopMorph(this, ENKGY_ANIM_4); this->actor.textId = 0xC3A; break; + + default: + break; } } func_80B40EE8(this, play); } void func_80B4296C(EnKgy* this, PlayState* play) { - if (SkelAnime_Update(&this->skelAnime) && (this->unk_2D2 == 8)) { - func_80B40BC0(this, 2); + if (SkelAnime_Update(&this->skelAnime) && (this->animIndex == ENKGY_ANIM_8)) { + EnKgy_ChangeAnimLoopMorph(this, ENKGY_ANIM_2); } this->actor.focus.pos = this->unk_2A8; if (Actor_ProcessTalkRequest(&this->actor, &play->state)) { this->actionFunc = func_80B427C8; - if (this->unk_2D2 == 4) { - func_80B40BC0(this, 7); + if (this->animIndex == ENKGY_ANIM_4) { + EnKgy_ChangeAnimLoopMorph(this, ENKGY_ANIM_7); } else { - EnKgy_ChangeAnim(this, 5, ANIMMODE_ONCE, -5.0f); + EnKgy_ChangeAnim(this, ENKGY_ANIM_5, ANIMMODE_ONCE, -5.0f); } func_80B411DC(this, play, 0); func_80B40E18(this, this->actor.textId); @@ -958,12 +1006,12 @@ void func_80B42A8C(EnKgy* this, PlayState* play) { s32 pad; if (SkelAnime_Update(&this->skelAnime)) { - if (this->unk_2D2 == 5) { - func_80B40BC0(this, 1); + if (this->animIndex == ENKGY_ANIM_5) { + EnKgy_ChangeAnimLoopMorph(this, ENKGY_ANIM_1); } - if (this->unk_2D2 == 3) { - func_80B40BC0(this, 4); + if (this->animIndex == ENKGY_ANIM_3) { + EnKgy_ChangeAnimLoopMorph(this, ENKGY_ANIM_4); } } @@ -995,7 +1043,7 @@ void func_80B42A8C(EnKgy* this, PlayState* play) { case 0xC20: case 0xC28: - func_80B40BC0(this, 1); + EnKgy_ChangeAnimLoopMorph(this, ENKGY_ANIM_1); play->msgCtx.msgLength = 0; this->unk_29C |= 4; this->unk_2E8 = 3; @@ -1027,7 +1075,7 @@ void func_80B42A8C(EnKgy* this, PlayState* play) { case 0xC2A: this->unk_2E4 = 20; - this->unk_2E2 = 3; + this->animIndex2 = ENKGY_ANIM_3; func_80B40EBC(this, play, this->actor.textId); break; @@ -1038,23 +1086,26 @@ void func_80B42A8C(EnKgy* this, PlayState* play) { func_80B413C8(this); func_80B40E18(this, 1); break; + + default: + break; } } func_80B40EE8(this, play); } void func_80B42D28(EnKgy* this, PlayState* play) { - if (SkelAnime_Update(&this->skelAnime) && (this->unk_2D2 == 8)) { - func_80B40BC0(this, 2); + if (SkelAnime_Update(&this->skelAnime) && (this->animIndex == ENKGY_ANIM_8)) { + EnKgy_ChangeAnimLoopMorph(this, ENKGY_ANIM_2); } this->actor.focus.pos = this->unk_2A8; if (Actor_ProcessTalkRequest(&this->actor, &play->state)) { this->actionFunc = func_80B42A8C; if (this->actor.textId == 0xC2D) { - func_80B40BC0(this, 1); + EnKgy_ChangeAnimLoopMorph(this, ENKGY_ANIM_1); } else { - EnKgy_ChangeAnim(this, 5, ANIMMODE_ONCE, -5.0f); + EnKgy_ChangeAnim(this, ENKGY_ANIM_5, ANIMMODE_ONCE, -5.0f); SET_WEEKEVENTREG(WEEKEVENTREG_20_80); } func_80B411DC(this, play, 0); @@ -1065,7 +1116,7 @@ void func_80B42D28(EnKgy* this, PlayState* play) { this->actionFunc = func_80B4296C; SET_WEEKEVENTREG(WEEKEVENTREG_21_01); } else if (this->actor.xzDistToPlayer < 200.0f) { - if (this->unk_2D2 == 4) { + if (this->animIndex == ENKGY_ANIM_4) { this->actor.textId = 0xC2D; } else { this->actor.textId = 0xC1D; @@ -1073,8 +1124,8 @@ void func_80B42D28(EnKgy* this, PlayState* play) { Actor_OfferTalk(&this->actor, play, 210.0f); } - if ((this->unk_2D2 == 0) && (this->actor.xzDistToPlayer < 200.0f)) { - EnKgy_ChangeAnim(this, 8, ANIMMODE_ONCE, 5.0f); + if ((this->animIndex == ENKGY_ANIM_0) && (this->actor.xzDistToPlayer < 200.0f)) { + EnKgy_ChangeAnim(this, ENKGY_ANIM_8, ANIMMODE_ONCE, 5.0f); } } } @@ -1085,7 +1136,7 @@ void EnKgy_Update(Actor* thisx, PlayState* play) { Vec3s sp30; this->actionFunc(this, play); - if (this->unk_2D2 == 2) { + if (this->animIndex == ENKGY_ANIM_2) { sp30.z = 0; sp30.y = 0; sp30.x = 0; @@ -1100,14 +1151,14 @@ s32 EnKgy_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* p EnKgy* this = THIS; if (!(this->unk_29C & 1)) { - if (limbIndex == 17) { + if (limbIndex == OBJECT_KGY_LIMB_11) { *dList = NULL; } - } else if (limbIndex == 16) { + } else if (limbIndex == OBJECT_KGY_LIMB_10) { *dList = NULL; } - if (limbIndex == 11) { + if (limbIndex == OBJECT_KGY_LIMB_0B) { rot->x += this->unk_2CC.y; } @@ -1119,11 +1170,11 @@ void EnKgy_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, static Vec3f D_80B432E4 = { 3000.0f, 4000.0f, 300.0f }; EnKgy* this = THIS; - if (limbIndex == 11) { + if (limbIndex == OBJECT_KGY_LIMB_0B) { Matrix_MultVec3f(&D_80B432D8, &this->unk_2A8); } - if (limbIndex == 16) { + if (limbIndex == OBJECT_KGY_LIMB_10) { Matrix_MultVec3f(&D_80B432E4, &this->unk_2C0); } } diff --git a/src/overlays/actors/ovl_En_Kgy/z_en_kgy.h b/src/overlays/actors/ovl_En_Kgy/z_en_kgy.h index 94f2aabd5..9a037ba9e 100644 --- a/src/overlays/actors/ovl_En_Kgy/z_en_kgy.h +++ b/src/overlays/actors/ovl_En_Kgy/z_en_kgy.h @@ -2,6 +2,7 @@ #define Z_EN_KGY_H #include "global.h" +#include "objects/object_kgy/object_kgy.h" #include "overlays/actors/ovl_En_Kbt/z_en_kbt.h" #include "overlays/actors/ovl_Obj_Ice_Poly/z_obj_ice_poly.h" @@ -15,8 +16,8 @@ typedef void (*EnKgyActionFunc)(struct EnKgy*, PlayState*); typedef struct EnKgy { /* 0x000 */ Actor actor; /* 0x144 */ SkelAnime skelAnime; - /* 0x188 */ Vec3s jointTable[23]; - /* 0x212 */ Vec3s morphTable[23]; + /* 0x188 */ Vec3s jointTable[OBJECT_KGY_LIMB_MAX]; + /* 0x212 */ Vec3s morphTable[OBJECT_KGY_LIMB_MAX]; /* 0x29C */ u16 unk_29C; /* 0x2A0 */ EnKbt* zubora; /* 0x2A4 */ ObjIcePoly* iceBlock; @@ -24,10 +25,10 @@ typedef struct EnKgy { /* 0x2B4 */ Vec3f unk_2B4; /* 0x2C0 */ Vec3f unk_2C0; /* 0x2CC */ Vec3s unk_2CC; - /* 0x2D2 */ s16 unk_2D2; + /* 0x2D2 */ s16 animIndex; /* 0x2D4 */ s16 csIdList[6]; /* 0x2E0 */ s16 csIdIndex; - /* 0x2E2 */ s16 unk_2E2; + /* 0x2E2 */ s16 animIndex2; /* 0x2E4 */ s16 unk_2E4; /* 0x2E6 */ s16 unk_2E6; /* 0x2E8 */ s16 unk_2E8; diff --git a/src/overlays/actors/ovl_En_Kujiya/z_en_kujiya.c b/src/overlays/actors/ovl_En_Kujiya/z_en_kujiya.c index beb994374..24fa855c5 100644 --- a/src/overlays/actors/ovl_En_Kujiya/z_en_kujiya.c +++ b/src/overlays/actors/ovl_En_Kujiya/z_en_kujiya.c @@ -173,6 +173,9 @@ void EnKujiya_ChooseNextDialogue(EnKujiya* this, PlayState* play) { EnKujiya_SetupGivePrize(this); EnKujiya_GivePrize(this, play); break; + + default: + break; } } } @@ -207,6 +210,9 @@ void EnKujiya_Talk(EnKujiya* this, PlayState* play) { this->textId = 0x2B60; // Will announce winning numbers after 6 } break; + + default: + break; } } @@ -251,6 +257,9 @@ s32 EnKujiya_CheckBoughtTicket(void) { return true; } break; + + default: + break; } return false; } @@ -268,6 +277,9 @@ void EnKujiya_SetBoughtTicket(void) { case 3: SET_WEEKEVENTREG(WEEKEVENTREG_33_40); break; + + default: + break; } } @@ -287,6 +299,9 @@ void EnKujiya_UnsetBoughtTicket(void) { case 3: CLEAR_WEEKEVENTREG(WEEKEVENTREG_33_40); break; + + default: + break; } } diff --git a/src/overlays/actors/ovl_En_Kusa/z_en_kusa.c b/src/overlays/actors/ovl_En_Kusa/z_en_kusa.c index 8bbbaca14..890fafd37 100644 --- a/src/overlays/actors/ovl_En_Kusa/z_en_kusa.c +++ b/src/overlays/actors/ovl_En_Kusa/z_en_kusa.c @@ -571,6 +571,9 @@ void EnKusa_Fall(EnKusa* this, PlayState* play) { EnKusa_SetupUprootedWaitRegrow(this); this->actor.shape.shadowDraw = NULL; break; + + default: + break; } } else { @@ -621,9 +624,13 @@ void EnKusa_SetupCut(EnKusa* this) { case ENKUSA_TYPE_GRASS_2: this->actionFunc = EnKusa_DoNothing; break; + case ENKUSA_TYPE_REGROWING_GRASS: this->actionFunc = EnKusa_CutWaitRegrow; break; + + default: + break; } this->timer = 0; } diff --git a/src/overlays/actors/ovl_Obj_Syokudai/z_obj_syokudai.c b/src/overlays/actors/ovl_Obj_Syokudai/z_obj_syokudai.c index 5dc86c745..cbd94d808 100644 --- a/src/overlays/actors/ovl_Obj_Syokudai/z_obj_syokudai.c +++ b/src/overlays/actors/ovl_Obj_Syokudai/z_obj_syokudai.c @@ -248,7 +248,8 @@ void ObjSyokudai_Update(Actor* thisx, PlayState* play2) { this->snuffTimer = OBJ_SYOKUDAI_SNUFF_NEVER; } } else { - if (++sNumLitTorchesInGroup >= groupSize) { + sNumLitTorchesInGroup++; + if (sNumLitTorchesInGroup >= groupSize) { this->pendingAction = OBJ_SYOKUDAI_PENDING_ACTION_CUTSCENE_AND_SWITCH; } else { this->snuffTimer = diff --git a/tools/disasm/functions.txt b/tools/disasm/functions.txt index 83c871191..fbdcd2791 100644 --- a/tools/disasm/functions.txt +++ b/tools/disasm/functions.txt @@ -13493,7 +13493,7 @@ 0x80B33E54:("EnKbt_Destroy",), 0x80B33E64:("func_80B33E64",), 0x80B33E8C:("func_80B33E8C",), - 0x80B33EF0:("func_80B33EF0",), + 0x80B33EF0:("EnKbt_ChangeAnim",), 0x80B3403C:("func_80B3403C",), 0x80B34078:("func_80B34078",), 0x80B3415C:("func_80B3415C",), @@ -13678,7 +13678,7 @@ 0x80B40800:("EnKgy_Init",), 0x80B40B04:("EnKgy_Destroy",), 0x80B40B38:("func_80B40B38",), - 0x80B40BC0:("func_80B40BC0",), + 0x80B40BC0:("EnKgy_ChangeAnimLoopMorph",), 0x80B40BFC:("func_80B40BFC",), 0x80B40C38:("func_80B40C38",), 0x80B40C74:("func_80B40C74",), From 2a485ad774d10ce5225dc8e119c0879108c78740 Mon Sep 17 00:00:00 2001 From: engineer124 <47598039+engineer124@users.noreply.github.com> Date: Sun, 1 Oct 2023 17:12:09 +1100 Subject: [PATCH 09/16] Animation Cleanup: En_J* (#1401) * cleanup J * small fix --- src/overlays/actors/ovl_En_Ja/z_en_ja.c | 107 +++++++++++------- src/overlays/actors/ovl_En_Ja/z_en_ja.h | 9 +- .../actors/ovl_En_Jc_Mato/z_en_jc_mato.c | 2 +- src/overlays/actors/ovl_En_Jg/z_en_jg.c | 107 +++++++++--------- .../actors/ovl_En_Jgame_Tsn/z_en_jgame_tsn.c | 48 +++++--- src/overlays/actors/ovl_En_Js/z_en_js.c | 76 +++++++++++-- .../actors/ovl_En_S_Goro/z_en_s_goro.c | 97 +++++++++------- tools/disasm/functions.txt | 4 +- 8 files changed, 281 insertions(+), 169 deletions(-) diff --git a/src/overlays/actors/ovl_En_Ja/z_en_ja.c b/src/overlays/actors/ovl_En_Ja/z_en_ja.c index 8cf9ce0e9..6bf6b4434 100644 --- a/src/overlays/actors/ovl_En_Ja/z_en_ja.c +++ b/src/overlays/actors/ovl_En_Ja/z_en_ja.c @@ -5,7 +5,6 @@ */ #include "z_en_ja.h" -#include "objects/object_boj/object_boj.h" #define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10) @@ -89,27 +88,41 @@ static ColliderCylinderInit sCylinderInit = { static CollisionCheckInfoInit2 sColChkInfoInit = { 0, 0, 0, 0, MASS_IMMOVABLE }; -static AnimationInfoS sAnimationInfo[] = { - { &object_boj_Anim_002734, 1.0f, 0, -1, 0, 0 }, { &object_boj_Anim_0033B0, 1.0f, 0, -1, 0, 0 }, - { &object_boj_Anim_002734, 1.0f, 0, -1, 0, -4 }, { &object_boj_Anim_0033B0, 1.0f, 0, -1, 0, -4 }, - { &object_boj_Anim_004078, 1.0f, 0, -1, 0, 0 }, { &object_boj_Anim_005CE4, 1.0f, 0, -1, 0, 0 }, +typedef enum EnJaAnimation { + /* -1 */ ENJA_ANIM_NONE = -1, + /* 0 */ ENJA_ANIM_0, + /* 1 */ ENJA_ANIM_1, + /* 2 */ ENJA_ANIM_2, + /* 3 */ ENJA_ANIM_3, + /* 4 */ ENJA_ANIM_4, + /* 5 */ ENJA_ANIM_5, + /* 6 */ ENJA_ANIM_MAX +} EnJaAnimation; + +static AnimationInfoS sAnimationInfo[ENJA_ANIM_MAX] = { + { &object_boj_Anim_002734, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENJA_ANIM_0 + { &object_boj_Anim_0033B0, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENJA_ANIM_1 + { &object_boj_Anim_002734, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // ENJA_ANIM_2 + { &object_boj_Anim_0033B0, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // ENJA_ANIM_3 + { &object_boj_Anim_004078, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENJA_ANIM_4 + { &object_boj_Anim_005CE4, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENJA_ANIM_5 }; -void func_80BC1900(EnJa* this) { - this->skelAnime.playSpeed = this->unk_344; +void EnJa_UpdateSkelAnime(EnJa* this) { + this->skelAnime.playSpeed = this->animPlaySpeed; SkelAnime_Update(&this->skelAnime); } -s32 func_80BC192C(EnJa* this, s32 arg1) { - s32 ret = false; +s32 EnJa_ChangeAnim(EnJa* this, s32 animIndex) { + s32 didAnimChange = false; - if (arg1 != this->unk_36C) { - this->unk_36C = arg1; - ret = SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, arg1); - this->unk_344 = this->skelAnime.playSpeed; + if (this->animIndex != animIndex) { + this->animIndex = animIndex; + didAnimChange = SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, animIndex); + this->animPlaySpeed = this->skelAnime.playSpeed; } - return ret; + return didAnimChange; } void func_80BC1984(EnJa* this, PlayState* play) { @@ -246,7 +259,7 @@ s32 func_80BC1FC8(EnJa* this, PlayState* play, ScheduleOutput* scheduleOutput) { if (func_80BC1AE0(this, play)) { SubS_SetOfferMode(&this->unk_340, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK); this->unk_340 |= 0x10; - func_80BC192C(this, 5); + EnJa_ChangeAnim(this, ENJA_ANIM_5); func_80BC2EA4(this); ret = true; } @@ -258,9 +271,9 @@ s32 func_80BC203C(EnJa* this, PlayState* play, ScheduleOutput* scheduleOutput) { if (func_80BC1AE0(this, play)) { if (ENJA_GET_3(&this->actor) == 0) { - func_80BC192C(this, 1); + EnJa_ChangeAnim(this, ENJA_ANIM_1); } else { - func_80BC192C(this, 4); + EnJa_ChangeAnim(this, ENJA_ANIM_4); } SubS_SetOfferMode(&this->unk_340, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK); this->actor.shape.shadowDraw = NULL; @@ -284,6 +297,9 @@ s32 func_80BC20D0(EnJa* this, PlayState* play, ScheduleOutput* scheduleOutput) { case 2: ret = func_80BC203C(this, play, scheduleOutput); break; + + default: + break; } return ret; } @@ -329,8 +345,10 @@ s32* func_80BC2274(EnJa* this, PlayState* play) { return D_80BC362C; } return D_80BC366C; + + default: + return D_80BC360C; } - return D_80BC360C; } void func_80BC22F4(EnJa* this, PlayState* play) { @@ -348,9 +366,10 @@ void EnJa_Init(Actor* thisx, PlayState* play) { EnJa* this = THIS; ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 18.0f); - SkelAnime_InitFlex(play, &this->skelAnime, &object_boj_Skel_00C240, NULL, this->jointTable, this->morphTable, 16); - this->unk_36C = -1; - func_80BC192C(this, 0); + SkelAnime_InitFlex(play, &this->skelAnime, &object_boj_Skel_00C240, NULL, this->jointTable, this->morphTable, + OBJECT_BOJ_LIMB_MAX); + this->animIndex = ENJA_ANIM_NONE; + EnJa_ChangeAnim(this, ENJA_ANIM_0); Collider_InitAndSetCylinder(play, &this->collider, &this->actor, &sCylinderInit); CollisionCheck_SetInfo2(&this->actor.colChkInfo, DamageTable_Get(0x16), &sColChkInfoInit); Actor_SetScale(&this->actor, 0.01f); @@ -380,7 +399,7 @@ void EnJa_Update(Actor* thisx, PlayState* play) { this->actionFunc(this, play); if (this->unk_1D8.unk_00 != 0) { - func_80BC1900(this); + EnJa_UpdateSkelAnime(this); func_80BC1A68(this); func_80BC1D70(this, play); @@ -403,7 +422,7 @@ void EnJa_Update(Actor* thisx, PlayState* play) { s32 EnJa_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) { EnJa* this = THIS; - if (limbIndex == 15) { + if (limbIndex == OBJECT_BOJ_LIMB_0F) { func_80BC1E40(this, play); } return false; @@ -419,10 +438,10 @@ void EnJa_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, EnJa* this = THIS; s32 pad2; - if (limbIndex == 15) { + if (limbIndex == OBJECT_BOJ_LIMB_0F) { Matrix_MultVec3f(&D_80BC3780, &this->actor.focus.pos); Math_Vec3s_Copy(&this->actor.focus.rot, &this->actor.world.rot); - } else if ((this->unk_340 & 0x40) && (limbIndex == 11)) { + } else if ((this->unk_340 & 0x40) && (limbIndex == OBJECT_BOJ_LIMB_0B)) { OPEN_DISPS(play->state.gfxCtx); Matrix_Push(); @@ -437,8 +456,9 @@ void EnJa_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, } if (this->unk_1D8.unk_00 == 1) { - if ((limbIndex == 11) && (((this->skelAnime.curFrame >= 0.0f) && (this->skelAnime.curFrame <= 6.0f)) || - ((this->skelAnime.curFrame >= 35.0f) && (this->skelAnime.curFrame <= 47.0f)))) { + if ((limbIndex == OBJECT_BOJ_LIMB_0B) && + (((this->skelAnime.curFrame >= 0.0f) && (this->skelAnime.curFrame <= 6.0f)) || + ((this->skelAnime.curFrame >= 35.0f) && (this->skelAnime.curFrame <= 47.0f)))) { OPEN_DISPS(play->state.gfxCtx); Matrix_Push(); @@ -475,7 +495,7 @@ void EnJa_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Matrix_Pop(); CLOSE_DISPS(play->state.gfxCtx); - } else if (limbIndex == 14) { + } else if (limbIndex == OBJECT_BOJ_LIMB_0E) { if ((this->skelAnime.curFrame >= 0.0f) && (this->skelAnime.curFrame <= 18.0f)) { OPEN_DISPS(play->state.gfxCtx); @@ -541,8 +561,8 @@ void EnJa_TransformLimbDraw(PlayState* play, s32 limbIndex, Actor* thisx) { overrideRot = false; } - if (limbIndex != 8) { - if (limbIndex == 15) { + switch (limbIndex) { + case OBJECT_BOJ_LIMB_0F: SubS_UpdateLimb(this->unk_354 + this->unk_358 + 0x4000, this->unk_356 + this->unk_35A + this->actor.shape.rot.y + 0x4000, &this->unk_1EC, &this->unk_274, stepRot, overrideRot); @@ -553,17 +573,22 @@ void EnJa_TransformLimbDraw(PlayState* play, s32 limbIndex, Actor* thisx) { Matrix_RotateXS(this->unk_274.x, MTXMODE_APPLY); Matrix_RotateZS(this->unk_274.z, MTXMODE_APPLY); Matrix_Push(); - } - } else { - SubS_UpdateLimb(this->unk_358 + 0x4000, this->unk_35A + this->actor.shape.rot.y + 0x4000, &this->unk_1F8, - &this->unk_27A, stepRot, overrideRot); - Matrix_Pop(); - Matrix_Translate(this->unk_1F8.x, this->unk_1F8.y, this->unk_1F8.z, MTXMODE_NEW); - Matrix_Scale(this->actor.scale.x, this->actor.scale.y, this->actor.scale.z, MTXMODE_APPLY); - Matrix_RotateYS(this->unk_27A.y, MTXMODE_APPLY); - Matrix_RotateXS(this->unk_27A.x, MTXMODE_APPLY); - Matrix_RotateZS(this->unk_27A.z, MTXMODE_APPLY); - Matrix_Push(); + break; + + case OBJECT_BOJ_LIMB_08: + SubS_UpdateLimb(this->unk_358 + 0x4000, this->unk_35A + this->actor.shape.rot.y + 0x4000, &this->unk_1F8, + &this->unk_27A, stepRot, overrideRot); + Matrix_Pop(); + Matrix_Translate(this->unk_1F8.x, this->unk_1F8.y, this->unk_1F8.z, MTXMODE_NEW); + Matrix_Scale(this->actor.scale.x, this->actor.scale.y, this->actor.scale.z, MTXMODE_APPLY); + Matrix_RotateYS(this->unk_27A.y, MTXMODE_APPLY); + Matrix_RotateXS(this->unk_27A.x, MTXMODE_APPLY); + Matrix_RotateZS(this->unk_27A.z, MTXMODE_APPLY); + Matrix_Push(); + break; + + default: + break; } } diff --git a/src/overlays/actors/ovl_En_Ja/z_en_ja.h b/src/overlays/actors/ovl_En_Ja/z_en_ja.h index 00746ec63..fcbbf485f 100644 --- a/src/overlays/actors/ovl_En_Ja/z_en_ja.h +++ b/src/overlays/actors/ovl_En_Ja/z_en_ja.h @@ -2,6 +2,7 @@ #define Z_EN_JA_H #include "global.h" +#include "objects/object_boj/object_boj.h" struct EnJa; @@ -37,10 +38,10 @@ typedef struct EnJa { /* 0x234 */ EnJaStruct unk_234[4]; /* 0x274 */ Vec3s unk_274; /* 0x27A */ Vec3s unk_27A; - /* 0x280 */ Vec3s jointTable[16]; - /* 0x2E0 */ Vec3s morphTable[16]; + /* 0x280 */ Vec3s jointTable[OBJECT_BOJ_LIMB_MAX]; + /* 0x2E0 */ Vec3s morphTable[OBJECT_BOJ_LIMB_MAX]; /* 0x340 */ u16 unk_340; - /* 0x344 */ f32 unk_344; + /* 0x344 */ f32 animPlaySpeed; /* 0x348 */ f32 unk_348; /* 0x34C */ f32 unk_34C; /* 0x350 */ UNK_TYPE1 unk350[0x4]; @@ -55,7 +56,7 @@ typedef struct EnJa { /* 0x364 */ s16 unk_364; /* 0x366 */ s16 unk_366; /* 0x368 */ void* unk_368; - /* 0x36C */ s32 unk_36C; + /* 0x36C */ s32 animIndex; /* 0x370 */ UNK_TYPE1 unk_370[4]; /* 0x374 */ s32 prevTalkState; } EnJa; // size = 0x378 diff --git a/src/overlays/actors/ovl_En_Jc_Mato/z_en_jc_mato.c b/src/overlays/actors/ovl_En_Jc_Mato/z_en_jc_mato.c index 314e94d1b..c66c9a355 100644 --- a/src/overlays/actors/ovl_En_Jc_Mato/z_en_jc_mato.c +++ b/src/overlays/actors/ovl_En_Jc_Mato/z_en_jc_mato.c @@ -122,7 +122,7 @@ void EnJcMato_Init(Actor* thisx, PlayState* play) { ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 24.0f); Collider_InitSphere(play, &this->collider); Collider_SetSphere(play, &this->collider, &this->actor, &sSphereInit); - this->collider.dim.worldSphere.radius = 0xF; + this->collider.dim.worldSphere.radius = 15; this->actor.colChkInfo.damageTable = &sDamageTable; Actor_SetScale(&this->actor, 0.008f); this->hitFlag = false; diff --git a/src/overlays/actors/ovl_En_Jg/z_en_jg.c b/src/overlays/actors/ovl_En_Jg/z_en_jg.c index 9fbd7ff85..137799af3 100644 --- a/src/overlays/actors/ovl_En_Jg/z_en_jg.c +++ b/src/overlays/actors/ovl_En_Jg/z_en_jg.c @@ -34,29 +34,6 @@ s32 EnJg_GetNextTextId(EnJg* this); s32 EnJg_GetStartingConversationTextId(EnJg* this, PlayState* play); void EnJg_CheckIfTalkingToPlayerAndHandleFreezeTimer(EnJg* this, PlayState* play); -typedef enum { - /* 0 */ EN_JG_ANIM_IDLE, - /* 1 */ EN_JG_ANIM_WALK, - /* 2 */ EN_JG_ANIM_WAVING, - /* 3 */ EN_JG_ANIM_SHAKING_HEAD, - /* 4 */ EN_JG_ANIM_SURPRISE_START, - /* 5 */ EN_JG_ANIM_SURPRISE_LOOP, - /* 6 */ EN_JG_ANIM_ANGRY, - /* 7 */ EN_JG_ANIM_FROZEN_START, - /* 8 */ EN_JG_ANIM_FROZEN_LOOP, - /* 9 */ EN_JG_ANIM_WALK_2, - /* 10 */ EN_JG_ANIM_TAKING_OUT_DRUM, - /* 11 */ EN_JG_ANIM_DRUM_IDLE, - /* 12 */ EN_JG_ANIM_PLAYING_DRUM, - /* 13 */ EN_JG_ANIM_THINKING, - /* 14 */ EN_JG_ANIM_REMEMBERING, - /* 15 */ EN_JG_ANIM_STRONG_REMEMBERING, - /* 16 */ EN_JG_ANIM_DEPRESSED, - /* 17 */ EN_JG_ANIM_CUTSCENE_IDLE, - /* 18 */ EN_JG_ANIM_CRADLE, - /* 19 */ EN_JG_ANIM_MAX -} EnJgAnimation; - typedef enum { /* 0 */ EN_JG_ACTION_FIRST_THAW, /* 1 */ EN_JG_ACTION_SPAWNING, @@ -133,26 +110,49 @@ static DamageTable sDamageTable = { /* Powder Keg */ DMG_ENTRY(0, 0x0), }; -static AnimationInfoS sAnimationInfo[] = { - { &gGoronElderIdleAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -10 }, - { &gGoronElderWalkAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -10 }, - { &gGoronElderWavingAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -10 }, - { &gGoronElderHeadShakeAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -10 }, - { &gGoronElderSurpriseStartAnim, 1.0f, 0, -1, ANIMMODE_ONCE, -10 }, - { &gGoronElderSurpriseLoopAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -10 }, - { &gGoronElderAngryAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -10 }, - { &gGoronElderSurpriseStartAnim, 2.0f, 0, -1, ANIMMODE_ONCE, 0 }, - { &gGoronElderSurpriseStartAnim, -2.0f, 0, -1, ANIMMODE_ONCE, 0 }, - { &gGoronElderWalkAnim, -1.0f, 0, -1, ANIMMODE_LOOP, -10 }, - { &gGoronElderTakeOutDrumAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, - { &gGoronElderDrumIdleAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, - { &gGoronElderPlayingDrumAnim, 1.0f, 1, 44, ANIMMODE_ONCE, 0 }, - { &gGoronElderThinkingAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, - { &gGoronElderRememberingAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, - { &gGoronElderStrongRememberingAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, - { &gGoronElderDepressedAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, - { &gGoronElderIdleAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, - { &gGoronElderCradleAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, +typedef enum EnJgAnimation { + /* 0 */ EN_JG_ANIM_IDLE, + /* 1 */ EN_JG_ANIM_WALK, + /* 2 */ EN_JG_ANIM_WAVING, + /* 3 */ EN_JG_ANIM_SHAKING_HEAD, + /* 4 */ EN_JG_ANIM_SURPRISE_START, + /* 5 */ EN_JG_ANIM_SURPRISE_LOOP, + /* 6 */ EN_JG_ANIM_ANGRY, + /* 7 */ EN_JG_ANIM_FROZEN_START, + /* 8 */ EN_JG_ANIM_FROZEN_LOOP, + /* 9 */ EN_JG_ANIM_WALK_2, + /* 10 */ EN_JG_ANIM_TAKING_OUT_DRUM, + /* 11 */ EN_JG_ANIM_DRUM_IDLE, + /* 12 */ EN_JG_ANIM_PLAYING_DRUM, + /* 13 */ EN_JG_ANIM_THINKING, + /* 14 */ EN_JG_ANIM_REMEMBERING, + /* 15 */ EN_JG_ANIM_STRONG_REMEMBERING, + /* 16 */ EN_JG_ANIM_DEPRESSED, + /* 17 */ EN_JG_ANIM_CUTSCENE_IDLE, + /* 18 */ EN_JG_ANIM_CRADLE, + /* 19 */ EN_JG_ANIM_MAX +} EnJgAnimation; + +static AnimationInfoS sAnimationInfo[EN_JG_ANIM_MAX] = { + { &gGoronElderIdleAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -10 }, // EN_JG_ANIM_IDLE + { &gGoronElderWalkAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -10 }, // EN_JG_ANIM_WALK + { &gGoronElderWavingAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -10 }, // EN_JG_ANIM_WAVING + { &gGoronElderHeadShakeAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -10 }, // EN_JG_ANIM_SHAKING_HEAD + { &gGoronElderSurpriseStartAnim, 1.0f, 0, -1, ANIMMODE_ONCE, -10 }, // EN_JG_ANIM_SURPRISE_START + { &gGoronElderSurpriseLoopAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -10 }, // EN_JG_ANIM_SURPRISE_LOOP + { &gGoronElderAngryAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -10 }, // EN_JG_ANIM_ANGRY + { &gGoronElderSurpriseStartAnim, 2.0f, 0, -1, ANIMMODE_ONCE, 0 }, // EN_JG_ANIM_FROZEN_START + { &gGoronElderSurpriseStartAnim, -2.0f, 0, -1, ANIMMODE_ONCE, 0 }, // EN_JG_ANIM_FROZEN_LOOP + { &gGoronElderWalkAnim, -1.0f, 0, -1, ANIMMODE_LOOP, -10 }, // EN_JG_ANIM_WALK_2 + { &gGoronElderTakeOutDrumAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // EN_JG_ANIM_TAKING_OUT_DRUM + { &gGoronElderDrumIdleAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // EN_JG_ANIM_DRUM_IDLE + { &gGoronElderPlayingDrumAnim, 1.0f, 1, 44, ANIMMODE_ONCE, 0 }, // EN_JG_ANIM_PLAYING_DRUM + { &gGoronElderThinkingAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // EN_JG_ANIM_THINKING + { &gGoronElderRememberingAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // EN_JG_ANIM_REMEMBERING + { &gGoronElderStrongRememberingAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // EN_JG_ANIM_STRONG_REMEMBERING + { &gGoronElderDepressedAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // EN_JG_ANIM_DEPRESSED + { &gGoronElderIdleAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // EN_JG_ANIM_CUTSCENE_IDLE + { &gGoronElderCradleAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // EN_JG_ANIM_CRADLE }; static Vec3f sSfxPos = { 0.0f, 0.0f, 0.0f }; @@ -340,6 +340,9 @@ void EnJg_SetupTalk(EnJg* this, PlayState* play) { SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, this->animIndex); this->actionFunc = EnJg_Talk; break; + + default: + break; } } @@ -418,10 +421,10 @@ void EnJg_GoronShrineCheer(EnJg* this, PlayState* play) { void EnJg_AlternateTalkOrWalkInPlace(EnJg* this, PlayState* play) { u8 talkState = Message_GetState(&play->msgCtx); s16 curFrame = this->skelAnime.curFrame; - s16 lastFrame = Animation_GetLastFrame(sAnimationInfo[this->animIndex].animation); + s16 endFrame = Animation_GetLastFrame(sAnimationInfo[this->animIndex].animation); if (this->animIndex == EN_JG_ANIM_SURPRISE_START) { - if (curFrame == lastFrame) { + if (curFrame == endFrame) { this->animIndex = EN_JG_ANIM_SURPRISE_LOOP; SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, this->animIndex); } @@ -473,10 +476,10 @@ void EnJg_Walk(EnJg* this, PlayState* play) { void EnJg_Talk(EnJg* this, PlayState* play) { u8 talkState = Message_GetState(&play->msgCtx); s16 curFrame = this->skelAnime.curFrame; - s16 lastFrame = Animation_GetLastFrame(sAnimationInfo[this->animIndex].animation); + s16 endFrame = Animation_GetLastFrame(sAnimationInfo[this->animIndex].animation); u16 temp; - if ((this->animIndex == EN_JG_ANIM_SURPRISE_START) && (curFrame == lastFrame)) { + if ((this->animIndex == EN_JG_ANIM_SURPRISE_START) && (curFrame == endFrame)) { this->animIndex = EN_JG_ANIM_SURPRISE_LOOP; SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, this->animIndex); } @@ -543,12 +546,12 @@ void EnJg_SetupWalk(EnJg* this, PlayState* play) { void EnJg_Freeze(EnJg* this, PlayState* play) { s16 curFrame = this->skelAnime.curFrame; - s16 lastFrame = Animation_GetLastFrame(sAnimationInfo[this->animIndex].animation); + s16 endFrame = Animation_GetLastFrame(sAnimationInfo[this->animIndex].animation); if (this->action == EN_JG_ACTION_SPAWNING) { this->action = EN_JG_ACTION_FROZEN_OR_NON_FIRST_THAW; this->freezeTimer = 1000; - this->skelAnime.curFrame = lastFrame; + this->skelAnime.curFrame = endFrame; this->icePoly = Actor_Spawn(&play->actorCtx, play, ACTOR_OBJ_ICE_POLY, this->actor.world.pos.x, this->actor.world.pos.y, this->actor.world.pos.z, this->actor.world.rot.x, this->actor.world.rot.y, this->actor.world.rot.z, 0xFF50); @@ -557,7 +560,7 @@ void EnJg_Freeze(EnJg* this, PlayState* play) { this->actionFunc = EnJg_FrozenIdle; } else if (this->animIndex == EN_JG_ANIM_FROZEN_START) { this->action = EN_JG_ACTION_FROZEN_OR_NON_FIRST_THAW; - if (curFrame == lastFrame) { + if (curFrame == endFrame) { this->freezeTimer = 1000; this->icePoly = Actor_Spawn(&play->actorCtx, play, ACTOR_OBJ_ICE_POLY, this->actor.world.pos.x, this->actor.world.pos.y, this->actor.world.pos.z, this->actor.world.rot.x, @@ -899,7 +902,7 @@ void EnJg_SpawnBreath(EnJg* this, PlayState* play) { */ void EnJg_CheckIfTalkingToPlayerAndHandleFreezeTimer(EnJg* this, PlayState* play) { s16 curFrame = this->skelAnime.curFrame; - s16 lastFrame = Animation_GetLastFrame(sAnimationInfo[this->animIndex].animation); + s16 endFrame = Animation_GetLastFrame(sAnimationInfo[this->animIndex].animation); if (Actor_ProcessTalkRequest(&this->actor, &play->state)) { this->flags |= FLAG_LOOKING_AT_PLAYER; @@ -924,7 +927,7 @@ void EnJg_CheckIfTalkingToPlayerAndHandleFreezeTimer(EnJg* this, PlayState* play } this->freezeTimer--; - if ((this->freezeTimer <= 0) && (curFrame == lastFrame)) { + if ((this->freezeTimer <= 0) && (curFrame == endFrame)) { this->animIndex = EN_JG_ANIM_FROZEN_START; SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, this->animIndex); Audio_PlaySfx_AtPos(&sSfxPos, NA_SE_EV_FREEZE_S); diff --git a/src/overlays/actors/ovl_En_Jgame_Tsn/z_en_jgame_tsn.c b/src/overlays/actors/ovl_En_Jgame_Tsn/z_en_jgame_tsn.c index 013fb5050..aba7cdeeb 100644 --- a/src/overlays/actors/ovl_En_Jgame_Tsn/z_en_jgame_tsn.c +++ b/src/overlays/actors/ovl_En_Jgame_Tsn/z_en_jgame_tsn.c @@ -48,10 +48,18 @@ ActorInit En_Jgame_Tsn_InitVars = { (ActorFunc)EnJgameTsn_Draw, }; -static AnimationInfo sAnimationInfo[] = { - { &object_tsn_Anim_0092FC, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -6.0f }, - { &object_tsn_Anim_000964, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -6.0f }, - { &object_tsn_Anim_001198, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -6.0f }, +typedef enum EnJgameTsnAnimation { + /* -1 */ ENJGAMETSN_ANIM_NONE = -1, + /* 0 */ ENJGAMETSN_ANIM_0, + /* 1 */ ENJGAMETSN_ANIM_1, + /* 2 */ ENJGAMETSN_ANIM_2, + /* 3 */ ENJGAMETSN_ANIM_MAX +} EnJgameTsnAnimation; + +static AnimationInfo sAnimationInfo[ENJGAMETSN_ANIM_MAX] = { + { &object_tsn_Anim_0092FC, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -6.0f }, // ENJGAMETSN_ANIM_0 + { &object_tsn_Anim_000964, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -6.0f }, // ENJGAMETSN_ANIM_1 + { &object_tsn_Anim_001198, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -6.0f }, // ENJGAMETSN_ANIM_2 }; static ColliderCylinderInit sCylinderInit = { @@ -145,7 +153,7 @@ void EnJgameTsn_Destroy(Actor* thisx, PlayState* play) { } void func_80C13B74(EnJgameTsn* this) { - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 0); + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENJGAMETSN_ANIM_0); this->actionFunc = func_80C13BB8; } @@ -156,15 +164,15 @@ void func_80C13BB8(EnJgameTsn* this, PlayState* play) { if (this->actor.flags & ACTOR_FLAG_10000) { this->actor.flags &= ~ACTOR_FLAG_10000; if (gSaveContext.timerCurTimes[TIMER_ID_MINIGAME_2] > SECONDS_TO_TIMER(0)) { - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 1); + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENJGAMETSN_ANIM_1); Message_StartTextbox(play, 0x10A2, &this->actor); this->unk_300 = 0x10A2; } else if (gSaveContext.minigameScore < 20) { - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 1); + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENJGAMETSN_ANIM_1); Message_StartTextbox(play, 0x10A2, &this->actor); this->unk_300 = 0x10A2; } else { - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 2); + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENJGAMETSN_ANIM_2); Message_StartTextbox(play, 0x10A3, &this->actor); this->unk_300 = 0x10A3; } @@ -174,11 +182,11 @@ void func_80C13BB8(EnJgameTsn* this, PlayState* play) { this->unk_300 = 0x1094; } else if (this->unk_2F8 == 0) { this->unk_2F8 = 1; - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 1); + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENJGAMETSN_ANIM_1); Message_StartTextbox(play, 0x1095, &this->actor); this->unk_300 = 0x1095; } else { - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 1); + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENJGAMETSN_ANIM_1); Message_StartTextbox(play, 0x1096, &this->actor); this->unk_300 = 0x1096; } @@ -211,11 +219,11 @@ void func_80C13E90(EnJgameTsn* this, PlayState* play) { this->actor.flags &= ~ACTOR_FLAG_10000; if (((gSaveContext.save.time > CLOCK_TIME(4, 0)) && (gSaveContext.save.time < CLOCK_TIME(7, 0))) || ((gSaveContext.save.time > CLOCK_TIME(16, 0)) && (gSaveContext.save.time < CLOCK_TIME(19, 0)))) { - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 2); + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENJGAMETSN_ANIM_2); Message_StartTextbox(play, 0x1094, &this->actor); this->unk_300 = 0x1094; } else { - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 1); + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENJGAMETSN_ANIM_1); Message_StartTextbox(play, 0x1098, &this->actor); this->unk_300 = 0x1098; } @@ -273,6 +281,9 @@ void func_80C14044(EnJgameTsn* this, PlayState* play) { func_80C13B74(this); } break; + + default: + break; } Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 5, 0x71C, 0xB6); @@ -335,7 +346,7 @@ void func_80C14230(EnJgameTsn* this, PlayState* play) { this->unk_2FC++; if ((player->actor.bgCheckFlags & BGCHECKFLAG_GROUND_TOUCH) && func_80C149B0(play, &this->unk_200)) { - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 2); + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENJGAMETSN_ANIM_2); Message_StartTextbox(play, 0x109F, &this->actor); this->unk_300 = 0x109F; player->stateFlags1 |= PLAYER_STATE1_20; @@ -344,7 +355,7 @@ void func_80C14230(EnJgameTsn* this, PlayState* play) { func_80C14030(this); } else if ((player->actor.bgCheckFlags & BGCHECKFLAG_WATER_TOUCH) || (player->actor.bgCheckFlags & BGCHECKFLAG_WATER)) { - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 2); + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENJGAMETSN_ANIM_2); Message_StartTextbox(play, 0x10A0, &this->actor); this->unk_300 = 0x10A0; player->stateFlags1 |= PLAYER_STATE1_20; @@ -413,12 +424,12 @@ void func_80C14684(EnJgameTsn* this, PlayState* play) { this->unk_300 = 0x109E; Rupees_ChangeBy(-20); } else { - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 2); + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENJGAMETSN_ANIM_2); Message_StartTextbox(play, 0x109D, &this->actor); this->unk_300 = 0x109D; } } else { - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 2); + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENJGAMETSN_ANIM_2); Message_StartTextbox(play, 0x109C, &this->actor); this->unk_300 = 0x109C; } @@ -461,7 +472,7 @@ void func_80C147B4(EnJgameTsn* this, PlayState* play) { break; case 0x109A: - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 0); + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENJGAMETSN_ANIM_0); Message_StartTextbox(play, 0x109B, &this->actor); this->unk_300 = 0x109B; break; @@ -490,6 +501,9 @@ void func_80C147B4(EnJgameTsn* this, PlayState* play) { func_80C14540(this); func_80C14554(this, play); break; + + default: + break; } } } diff --git a/src/overlays/actors/ovl_En_Js/z_en_js.c b/src/overlays/actors/ovl_En_Js/z_en_js.c index c0f5bc3fd..7d5185935 100644 --- a/src/overlays/actors/ovl_En_Js/z_en_js.c +++ b/src/overlays/actors/ovl_En_Js/z_en_js.c @@ -117,6 +117,7 @@ void EnJs_Init(Actor* thisx, PlayState* play) { CLEAR_WEEKEVENTREG(WEEKEVENTREG_84_20); } break; + case 1: case 2: case 3: @@ -130,6 +131,7 @@ void EnJs_Init(Actor* thisx, PlayState* play) { return; } break; + case 5: case 6: case 7: @@ -137,6 +139,7 @@ void EnJs_Init(Actor* thisx, PlayState* play) { this->maskType = ENJS_GET_TYPE(&this->actor) - 4; this->actionFunc = func_8096A104; break; + default: break; } @@ -153,6 +156,7 @@ void EnJs_Destroy(Actor* thisx, PlayState* play) { case 0: Play_DisableMotionBlur(); break; + case 5: case 6: case 7: @@ -161,6 +165,7 @@ void EnJs_Destroy(Actor* thisx, PlayState* play) { func_80969400(ENJS_GET_TYPE(&this->actor)); } break; + default: break; } @@ -414,6 +419,7 @@ s32 func_809692A8(s32 arg0) { return false; } return true; + case 5: case 6: case 7: @@ -422,6 +428,7 @@ s32 func_809692A8(s32 arg0) { return false; } return true; + default: return false; } @@ -441,6 +448,7 @@ s32 func_8096933C(s32 arg0) { } else { return true; } + case 5: case 6: case 7: @@ -451,6 +459,7 @@ s32 func_8096933C(s32 arg0) { } else { return true; } + default: return false; } @@ -579,13 +588,18 @@ void func_80969898(EnJs* this, PlayState* play) { Audio_PlaySfx_MessageDecide(); Message_ContinueTextbox(play, 0x2217); break; + case 1: Audio_PlaySfx_MessageCancel(); Message_ContinueTextbox(play, 0x2216); break; + + default: + break; } } break; + case TEXT_STATE_5: if (Message_ShouldAdvance(play)) { switch (play->msgCtx.currentTextId) { @@ -593,18 +607,21 @@ void func_80969898(EnJs* this, PlayState* play) { this->unk_2B8 |= 1; if (!func_8096933C(ENJS_GET_TYPE(&this->actor))) { Message_ContinueTextbox(play, 0x220F); - break; + } else { + Message_ContinueTextbox(play, 0x220D); } - Message_ContinueTextbox(play, 0x220D); break; + case 0x220D: case 0x2213: Message_ContinueTextbox(play, play->msgCtx.currentTextId + 1); break; + case 0x220E: Message_ContinueTextbox(play, 0xFF); this->actionFunc = func_80969748; break; + case 0x2210: case 0x2211: case 0x2212: @@ -612,19 +629,23 @@ void func_80969898(EnJs* this, PlayState* play) { Message_ContinueTextbox(play, 0xFF); this->actionFunc = func_80969748; break; + case 0x2214: case 0x2217: if (!func_809695FC(this, play)) { func_80969494(this, play); - break; } break; + default: func_80969494(this, play); break; } } break; + + default: + break; } } @@ -729,13 +750,16 @@ void func_80969DA4(EnJs* this, PlayState* play) { Audio_PlaySfx_MessageDecide(); if (!func_809695FC(this, play)) { func_809694E8(this, play); - break; } break; + case 1: Audio_PlaySfx_MessageCancel(); Message_ContinueTextbox(play, play->msgCtx.currentTextId + 1); break; + + default: + break; } } break; @@ -745,49 +769,60 @@ void func_80969DA4(EnJs* this, PlayState* play) { case 0x221B: if (!func_8096933C(ENJS_GET_TYPE(&this->actor))) { Message_ContinueTextbox(play, 0x2219); - break; + } else { + Message_ContinueTextbox(play, 0x221C); } - Message_ContinueTextbox(play, 0x221C); break; + case 0x2224: case 0x2226: case 0x2228: case 0x222A: Message_ContinueTextbox(play, play->msgCtx.currentTextId + 1); break; + case 0x2225: case 0x2227: case 0x2229: case 0x222B: if (!func_809695FC(this, play)) { func_809694E8(this, play); - break; } break; + case 0x2222: player->exchangeItemAction = PLAYER_IA_NONE; Message_ContinueTextbox(play, play->msgCtx.currentTextId + 1); break; + case 0x2223: switch (ENJS_GET_TYPE(&this->actor)) { case 5: Message_ContinueTextbox(play, 0x2224); break; + case 6: Message_ContinueTextbox(play, 0x2226); break; + case 7: Message_ContinueTextbox(play, 0x2228); break; + case 8: Message_ContinueTextbox(play, 0x222A); break; + + default: + break; } break; + case 0x221C: Message_ContinueTextbox(play, 0xFF); this->actionFunc = func_80969C54; break; + case 0x221D: case 0x2220: case 0x2221: @@ -795,12 +830,16 @@ void func_80969DA4(EnJs* this, PlayState* play) { Message_ContinueTextbox(play, 0xFF); this->actionFunc = func_80969C54; break; + default: func_809694E8(this, play); break; } } break; + + default: + break; } } @@ -892,6 +931,9 @@ void func_8096A38C(EnJs* this, PlayState* play) { case 1: Audio_PlaySfx_MessageCancel(); break; + + default: + break; } switch (play->msgCtx.currentTextId) { @@ -902,9 +944,13 @@ void func_8096A38C(EnJs* this, PlayState* play) { Animation_MorphToPlayOnce(&this->skelAnime, &gMoonChildGettingUpAnim, -5.0f); this->unk_2B8 |= 0x10; break; + case 1: Message_ContinueTextbox(play, 0x21FD); break; + + default: + break; } break; @@ -914,9 +960,13 @@ void func_8096A38C(EnJs* this, PlayState* play) { Message_ContinueTextbox(play, 0x2200); func_809696EC(this, 0); break; + case 1: Message_ContinueTextbox(play, 0x21FF); break; + + default: + break; } break; @@ -927,13 +977,21 @@ void func_8096A38C(EnJs* this, PlayState* play) { Animation_MorphToPlayOnce(&this->skelAnime, &gMoonChildGettingUpAnim, -5.0f); this->unk_2B8 |= 0x10; break; + case 1: Message_ContinueTextbox(play, 0x2204); break; + + default: + break; } + + default: + break; } } break; + case TEXT_STATE_5: if (Message_ShouldAdvance(play)) { switch (play->msgCtx.currentTextId) { @@ -962,7 +1020,6 @@ void func_8096A38C(EnJs* this, PlayState* play) { break; case 0x2201: - case 0x220A: if (!func_809695FC(this, play)) { func_80969530(this, play); @@ -975,6 +1032,9 @@ void func_8096A38C(EnJs* this, PlayState* play) { } } break; + + default: + break; } } diff --git a/src/overlays/actors/ovl_En_S_Goro/z_en_s_goro.c b/src/overlays/actors/ovl_En_S_Goro/z_en_s_goro.c index 6b2e06f0b..3e3ecc621 100644 --- a/src/overlays/actors/ovl_En_S_Goro/z_en_s_goro.c +++ b/src/overlays/actors/ovl_En_S_Goro/z_en_s_goro.c @@ -1381,53 +1381,62 @@ void EnSGoro_TransformLimbDraw(PlayState* play, s32 limbIndex, Actor* thisx) { s32 overrideRot; EnSGoro* this = THIS; - if (limbIndex != GORON_LIMB_BODY) { - if ((limbIndex == GORON_LIMB_HEAD) && (this->animInfoIndex != EN_S_GORO_ANIM_SLEEPY)) { - if (this->actionFlags & EN_S_GORO_ACTIONFLAG_FACEPLAYER) { - overrideRot = true; - } else { - overrideRot = false; + switch (limbIndex) { + case GORON_LIMB_HEAD: + if (this->animInfoIndex != EN_S_GORO_ANIM_SLEEPY) { + if (this->actionFlags & EN_S_GORO_ACTIONFLAG_FACEPLAYER) { + overrideRot = true; + } else { + overrideRot = false; + } + if (this->loseAttentionTimer != 0) { + stepRot = true; + } else { + stepRot = false; + } + + EnSGoro_UpdateLimb(this->headRotZ + this->bodyRotZ + 0x4000, + this->headRotY + this->bodyRotY + this->actor.shape.rot.y + 0x4000, + &this->headTranslate, &this->headRotate, stepRot, overrideRot); + + Matrix_Pop(); + Matrix_Translate(this->headTranslate.x, this->headTranslate.y, this->headTranslate.z, MTXMODE_NEW); + Matrix_Scale(this->actor.scale.x, this->actor.scale.y, this->actor.scale.z, MTXMODE_APPLY); + Matrix_RotateYS(this->headRotate.y, MTXMODE_APPLY); + Matrix_RotateXS(this->headRotate.x, MTXMODE_APPLY); + Matrix_RotateZS(this->headRotate.z, MTXMODE_APPLY); + Matrix_Push(); } - if (this->loseAttentionTimer != 0) { - stepRot = true; - } else { - stepRot = false; + break; + + case GORON_LIMB_BODY: + if (this->animInfoIndex != EN_S_GORO_ANIM_SLEEPY) { + if (this->actionFlags & EN_S_GORO_ACTIONFLAG_FACEPLAYER) { + overrideRot = true; + } else { + overrideRot = false; + } + if (this->loseAttentionTimer != 0) { + stepRot = true; + } else { + stepRot = false; + } + + EnSGoro_UpdateLimb(this->bodyRotZ + 0x4000, this->bodyRotY + this->actor.shape.rot.y + 0x4000, + &this->bodyTranslate, &this->bodyRotate, stepRot, overrideRot); + + Matrix_Pop(); + Matrix_Translate(this->bodyTranslate.x, this->bodyTranslate.y, this->bodyTranslate.z, MTXMODE_NEW); + Matrix_Scale(this->actor.scale.x, this->actor.scale.y, this->actor.scale.z, MTXMODE_APPLY); + Matrix_RotateYS(this->bodyRotate.y, MTXMODE_APPLY); + Matrix_RotateXS(this->bodyRotate.x, MTXMODE_APPLY); + Matrix_RotateZS(this->bodyRotate.z, MTXMODE_APPLY); + Matrix_Push(); } + break; - EnSGoro_UpdateLimb(this->headRotZ + this->bodyRotZ + 0x4000, - this->headRotY + this->bodyRotY + this->actor.shape.rot.y + 0x4000, &this->headTranslate, - &this->headRotate, stepRot, overrideRot); - - Matrix_Pop(); - Matrix_Translate(this->headTranslate.x, this->headTranslate.y, this->headTranslate.z, MTXMODE_NEW); - Matrix_Scale(this->actor.scale.x, this->actor.scale.y, this->actor.scale.z, MTXMODE_APPLY); - Matrix_RotateYS(this->headRotate.y, MTXMODE_APPLY); - Matrix_RotateXS(this->headRotate.x, MTXMODE_APPLY); - Matrix_RotateZS(this->headRotate.z, MTXMODE_APPLY); - Matrix_Push(); - } - } else if (this->animInfoIndex != EN_S_GORO_ANIM_SLEEPY) { - if (this->actionFlags & EN_S_GORO_ACTIONFLAG_FACEPLAYER) { - overrideRot = true; - } else { - overrideRot = false; - } - if (this->loseAttentionTimer != 0) { - stepRot = true; - } else { - stepRot = false; - } - - EnSGoro_UpdateLimb(this->bodyRotZ + 0x4000, this->bodyRotY + this->actor.shape.rot.y + 0x4000, - &this->bodyTranslate, &this->bodyRotate, stepRot, overrideRot); - - Matrix_Pop(); - Matrix_Translate(this->bodyTranslate.x, this->bodyTranslate.y, this->bodyTranslate.z, MTXMODE_NEW); - Matrix_Scale(this->actor.scale.x, this->actor.scale.y, this->actor.scale.z, MTXMODE_APPLY); - Matrix_RotateYS(this->bodyRotate.y, MTXMODE_APPLY); - Matrix_RotateXS(this->bodyRotate.x, MTXMODE_APPLY); - Matrix_RotateZS(this->bodyRotate.z, MTXMODE_APPLY); - Matrix_Push(); + default: + break; } } diff --git a/tools/disasm/functions.txt b/tools/disasm/functions.txt index fbdcd2791..4a8419dc5 100644 --- a/tools/disasm/functions.txt +++ b/tools/disasm/functions.txt @@ -15482,8 +15482,8 @@ 0x80BC11B4:("EnNb_PostLimbDraw",), 0x80BC1278:("EnNb_TransformLimbDraw",), 0x80BC1374:("EnNb_Draw",), - 0x80BC1900:("func_80BC1900",), - 0x80BC192C:("func_80BC192C",), + 0x80BC1900:("EnJa_UpdateSkelAnime",), + 0x80BC192C:("EnJa_ChangeAnim",), 0x80BC1984:("func_80BC1984",), 0x80BC19FC:("func_80BC19FC",), 0x80BC1A68:("func_80BC1A68",), From 4ca54d704eb84b6d9f4142d4445ac1e400e14fd4 Mon Sep 17 00:00:00 2001 From: Derek Hensley Date: Mon, 2 Oct 2023 21:52:41 -0700 Subject: [PATCH 10/16] Speedmeter OK (#1393) * Match * data + bss * x * Small cleanup * maxVal * gUnkTimeAcc * SET_FULLSCREEN_VIEWPORT_HIRES * Update permuter settings * SET_FULLSCREEN_VIEWPORT_DYNAMIC --- include/functions.h | 4 +- include/variables.h | 16 +- include/z64game.h | 2 +- include/z64speed_meter.h | 16 +- include/z64view.h | 11 + spec | 2 - src/boot/irqmgr.c | 6 +- src/code/game.c | 18 +- src/code/graph.c | 17 +- src/code/sched.c | 7 +- src/code/speed_meter.c | 262 +++++++++++++++++- src/code/sys_matrix.c | 2 +- src/code/z_bgcheck.c | 14 +- src/code/z_effect_soft_sprite.c | 2 +- src/code/z_kaleido_manager.c | 2 +- src/code/z_malloc.c | 6 +- src/code/z_map_exp.c | 2 +- src/code/z_message.c | 2 +- src/code/z_parameter.c | 6 +- src/code/z_play.c | 8 +- src/code/z_room.c | 2 +- src/code/z_scene.c | 4 +- src/code/z_sram_NES.c | 2 +- src/code/z_vr_box.c | 6 +- .../gamestates/ovl_daytelop/z_daytelop.c | 4 +- .../ovl_file_choose/z_file_choose_NES.c | 6 +- src/overlays/gamestates/ovl_title/z_title.c | 2 +- tools/disasm/functions.txt | 6 +- tools/disasm/variables.txt | 32 +-- tools/permuter_settings.toml | 2 + tools/sizes/code_functions.csv | 6 +- 31 files changed, 367 insertions(+), 110 deletions(-) diff --git a/include/functions.h b/include/functions.h index 849329d94..47bc7fe3d 100644 --- a/include/functions.h +++ b/include/functions.h @@ -667,10 +667,10 @@ void* ZeldaArena_Realloc(void* ptr, size_t newSize); void ZeldaArena_Free(void* ptr); void* ZeldaArena_Calloc(u32 num, size_t size); void ZeldaArena_GetSizes(size_t* outMaxFree, size_t* outFree, size_t* outAlloc); -s32 ZeldaArena_Check(); +s32 ZeldaArena_Check(void); void ZeldaArena_Init(void* start, size_t size); void ZeldaArena_Cleanup(void); -u8 ZeldaArena_IsInitialized(); +u8 ZeldaArena_IsInitialized(void); // void func_80102E40(void); // void func_80102E90(void); // void func_80102EA4(void); diff --git a/include/variables.h b/include/variables.h index 83427f55f..2d64bd2b0 100644 --- a/include/variables.h +++ b/include/variables.h @@ -14,7 +14,7 @@ extern OSPiHandle* gCartHandle; extern size_t gDmaMgrDmaBuffSize; extern vs32 gIrqMgrResetStatus; extern volatile OSTime sIrqMgrResetTime; -extern volatile OSTime sIrqMgrRetraceTime; +extern volatile OSTime gIrqMgrRetraceTime; extern s32 sIrqMgrRetraceCount; // extern UNK_TYPE1 sGfxPrintFontTLUT; @@ -366,7 +366,6 @@ extern Input* D_801D0D60; extern u32 retryCount; extern u32 cfbIdx[3]; -extern UNK_PTR D_801D1540; extern Vec3f gZeroVec3f; extern Vec3s gZeroVec3s; @@ -1903,19 +1902,6 @@ extern GfxMasterList* gGfxMasterDL; extern u64* gAudioSPDataPtr; extern u32 gAudioSPDataSize; -extern volatile OSTime D_801FBAE0; -extern volatile OSTime D_801FBAE8; -extern volatile OSTime gRDPTimeTotal; -extern volatile OSTime lastRenderFrameDuration; -extern volatile OSTime gRSPAudioTotalTime; -extern volatile OSTime sRSPGFXTotalTime; -extern volatile OSTime sRSPOtherTotalTime; -// extern UNK_TYPE1 D_801FBB18; - -// Accumulator for `gRDPTimeTotal` -extern volatile OSTime gRDPTimeAcc; -// extern UNK_TYPE1 D_801FBB28; - extern Vec3f D_801FBBF0; extern LineSegment Math3D_ColSphereTri_line; extern Vec3f Math3D_ColSphereTri_point; diff --git a/include/z64game.h b/include/z64game.h index 8b63b701f..50dd68473 100644 --- a/include/z64game.h +++ b/include/z64game.h @@ -61,7 +61,7 @@ typedef struct GameState { /* 0x0C */ GameStateFunc init; // Usually the current game state's init, though after stopping, the graph thread will look here to determine the next game state to load. /* 0x10 */ size_t size; /* 0x14 */ Input input[MAXCONTROLLERS]; - /* 0x74 */ TwoHeadArena heap; + /* 0x74 */ TwoHeadArena tha; /* 0x84 */ GameAlloc alloc; /* 0x98 */ UNK_TYPE1 pad98[0x3]; /* 0x9B */ u8 running; // If 0, switch to next game state diff --git a/include/z64speed_meter.h b/include/z64speed_meter.h index fbd815248..44b47ed1e 100644 --- a/include/z64speed_meter.h +++ b/include/z64speed_meter.h @@ -7,12 +7,24 @@ struct GameState; struct GraphicsContext; typedef struct SpeedMeter { - /* 0x00 */ char unk_00[0x20]; + /* 0x00 */ char unk_00[0x18]; + /* 0x18 */ s32 x; // Unused + /* 0x1C */ s32 y; } SpeedMeter; // size = 0x20 void SpeedMeter_Init(SpeedMeter* this); void SpeedMeter_Destroy(SpeedMeter* this); void SpeedMeter_DrawTimeEntries(SpeedMeter* this, struct GraphicsContext* gfxCtx); -void SpeedMeter_DrawAllocEntries(SpeedMeter* this, struct GraphicsContext* gfxCtx, struct GameState* gameState); +void SpeedMeter_DrawAllocEntries(SpeedMeter* this, struct GraphicsContext* gfxCtx, struct GameState* state); + +extern volatile OSTime gRSPAudioTimeTotal; +extern volatile OSTime gRSPGfxTimeTotal; +extern volatile OSTime gRDPTimeTotal; +extern volatile OSTime gGraphUpdatePeriod; +extern volatile OSTime gRSPAudioTimeAcc; +extern volatile OSTime gRSPGfxTimeAcc; +extern volatile OSTime gRSPOtherTimeAcc; +extern volatile OSTime gUnkTimeAcc; +extern volatile OSTime gRDPTimeAcc; #endif diff --git a/include/z64view.h b/include/z64view.h index f0661d947..19bb4492c 100644 --- a/include/z64view.h +++ b/include/z64view.h @@ -65,6 +65,17 @@ typedef struct View { } \ (void)0 +#define SET_FULLSCREEN_VIEWPORT_DYNAMIC(view) \ +{ \ + Viewport viewport; \ + viewport.bottomY = gScreenHeight; \ + viewport.rightX = gScreenWidth; \ + viewport.topY = 0; \ + viewport.leftX = 0; \ + View_SetViewport(view, &viewport); \ +} \ +(void)0 + void View_Init(View* view, struct GraphicsContext* gfxCtx); void View_LookAt(View* view, Vec3f* eye, Vec3f* at, Vec3f* up); void View_SetScale(View* view, f32 scale); diff --git a/spec b/spec index 2e2878c69..00e0fee37 100644 --- a/spec +++ b/spec @@ -560,8 +560,6 @@ beginseg include "build/src/code/padmgr.o" include "build/src/code/sched.o" include "build/src/code/speed_meter.o" - include "build/data/code/speed_meter.data.o" - include "build/data/code/speed_meter.bss.o" include "build/src/code/su_mtx.o" include "build/src/code/sys_cfb.o" include "build/src/code/sys_cmpdma.o" diff --git a/src/boot/irqmgr.c b/src/boot/irqmgr.c index 9a773f279..172eabec8 100644 --- a/src/boot/irqmgr.c +++ b/src/boot/irqmgr.c @@ -4,7 +4,7 @@ vs32 gIrqMgrResetStatus = 0; volatile OSTime sIrqMgrResetTime = 0; -volatile OSTime sIrqMgrRetraceTime = 0; +volatile OSTime gIrqMgrRetraceTime = 0; s32 sIrqMgrRetraceCount = 0; void IrqMgr_AddClient(IrqMgr* irqmgr, IrqMgrClient* client, OSMesgQueue* msgQueue) { @@ -109,11 +109,11 @@ void IrqMgr_HandlePRENMI500(IrqMgr* irqmgr) { IrqMgr_CheckStack(); } void IrqMgr_HandleRetrace(IrqMgr* irqmgr) { - if (sIrqMgrRetraceTime == 0) { + if (gIrqMgrRetraceTime == 0) { if (irqmgr->lastFrameTime == 0) { irqmgr->lastFrameTime = osGetTime(); } else { - sIrqMgrRetraceTime = osGetTime() - irqmgr->lastFrameTime; + gIrqMgrRetraceTime = osGetTime() - irqmgr->lastFrameTime; } } diff --git a/src/code/game.c b/src/code/game.c index 4f2df63cd..237783319 100644 --- a/src/code/game.c +++ b/src/code/game.c @@ -164,11 +164,11 @@ void GameState_InitArena(GameState* gameState, size_t size) { void* buf = GameAlloc_Malloc(alloc, size); if (buf) { - THA_Init(&gameState->heap, buf, size); + THA_Init(&gameState->tha, buf, size); return; } - THA_Init(&gameState->heap, NULL, 0); + THA_Init(&gameState->tha, NULL, 0); _dbg_hungup("../game.c", 1035); } @@ -178,9 +178,9 @@ void GameState_Realloc(GameState* gameState, size_t size) { size_t systemMaxFree; size_t bytesFree; size_t bytesAllocated; - void* heapStart = gameState->heap.start; + void* heapStart = gameState->tha.start; - THA_Destroy(&gameState->heap); + THA_Destroy(&gameState->tha); GameAlloc_Free(alloc, heapStart); SystemArena_GetSizes(&systemMaxFree, &bytesFree, &bytesAllocated); size = ((systemMaxFree - sizeof(ArenaNode)) < size) ? 0 : size; @@ -190,9 +190,9 @@ void GameState_Realloc(GameState* gameState, size_t size) { gameArena = GameAlloc_Malloc(alloc, size); if (gameArena != NULL) { - THA_Init(&gameState->heap, gameArena, size); + THA_Init(&gameState->tha, gameArena, size); } else { - THA_Init(&gameState->heap, NULL, 0); + THA_Init(&gameState->tha, NULL, 0); _dbg_hungup("../game.c", 1074); } } @@ -246,7 +246,7 @@ void GameState_Destroy(GameState* gameState) { VisZbuf_Destroy(&sGameVisZbuf); VisMono_Destroy(&sGameVisMono); ViMode_Destroy(&sGameViMode); - THA_Destroy(&gameState->heap); + THA_Destroy(&gameState->tha); GameAlloc_Cleanup(&gameState->alloc); } @@ -263,11 +263,11 @@ u32 GameState_IsRunning(GameState* gameState) { } s32 GameState_GetArenaSize(GameState* gameState) { - return THA_GetRemaining(&gameState->heap); + return THA_GetRemaining(&gameState->tha); } s32 func_80173B48(GameState* gameState) { - s32 result = OS_CYCLES_TO_NSEC(gameState->framerateDivisor * sIrqMgrRetraceTime) - OS_CYCLES_TO_NSEC(gRDPTimeTotal); + s32 result = OS_CYCLES_TO_NSEC(gameState->framerateDivisor * gIrqMgrRetraceTime) - OS_CYCLES_TO_NSEC(gRDPTimeTotal); return result; } diff --git a/src/code/graph.c b/src/code/graph.c index bce162406..ad4ad0286 100644 --- a/src/code/graph.c +++ b/src/code/graph.c @@ -8,7 +8,7 @@ FaultAddrConvClient sGraphFaultAddrConvClient; FaultClient sGraphFaultClient; GfxMasterList* gGfxMasterDL; CfbInfo sGraphCfbInfos[3]; -OSTime sGraphTaskStartTime; +OSTime sGraphPrevUpdateEndTime; #include "variables.h" #include "macros.h" @@ -16,6 +16,7 @@ OSTime sGraphTaskStartTime; #include "idle.h" #include "sys_cfb.h" #include "system_malloc.h" +#include "z64speed_meter.h" #include "overlays/gamestates/ovl_daytelop/z_daytelop.h" #include "overlays/gamestates/ovl_file_choose/z_file_select.h" #include "overlays/gamestates/ovl_opening/z_opening.h" @@ -310,17 +311,17 @@ void Graph_ExecuteAndDraw(GraphicsContext* gfxCtx, GameState* gameState) { { OSTime time = osGetTime(); - D_801FBAE8 = sRSPGFXTotalTime; - D_801FBAE0 = gRSPAudioTotalTime; + gRSPGfxTimeTotal = gRSPGfxTimeAcc; + gRSPAudioTimeTotal = gRSPAudioTimeAcc; gRDPTimeTotal = gRDPTimeAcc; - sRSPGFXTotalTime = 0; - gRSPAudioTotalTime = 0; + gRSPGfxTimeAcc = 0; + gRSPAudioTimeAcc = 0; gRDPTimeAcc = 0; - if (sGraphTaskStartTime != 0) { - lastRenderFrameDuration = time - sGraphTaskStartTime; + if (sGraphPrevUpdateEndTime != 0) { + gGraphUpdatePeriod = time - sGraphPrevUpdateEndTime; } - sGraphTaskStartTime = time; + sGraphPrevUpdateEndTime = time; } } diff --git a/src/code/sched.c b/src/code/sched.c index f8dc2a35d..289b4a696 100644 --- a/src/code/sched.c +++ b/src/code/sched.c @@ -16,6 +16,7 @@ u32 gAudioSPDataSize; #include "functions.h" #include "variables.h" #include "stackcheck.h" +#include "z64speed_meter.h" #include "z64thread.h" #define RSP_DONE_MSG 667 @@ -426,16 +427,16 @@ void Sched_HandleRSPDone(SchedContext* sched) { time = osGetTime(); switch (sched->curRSPTask->list.t.type) { case M_AUDTASK: - gRSPAudioTotalTime += time - sRSPAudioStartTime; + gRSPAudioTimeAcc += time - sRSPAudioStartTime; break; case M_GFXTASK: - sRSPGFXTotalTime += time - sRSPGFXStartTime; + gRSPGfxTimeAcc += time - sRSPGFXStartTime; break; default: if (1) {} - sRSPOtherTotalTime += time - sRSPOtherStartTime; + gRSPOtherTimeAcc += time - sRSPOtherStartTime; break; } diff --git a/src/code/speed_meter.c b/src/code/speed_meter.c index 1e6f1f886..3550d62ce 100644 --- a/src/code/speed_meter.c +++ b/src/code/speed_meter.c @@ -1,18 +1,266 @@ #include "global.h" +#include "sys_cfb.h" #include "z64speed_meter.h" #include "z64view.h" #include "system_malloc.h" -#pragma GLOBAL_ASM("asm/non_matchings/code/speed_meter/func_80177390.s") +/** + * How much time the RSP ran audio tasks for over the course of `gGraphUpdatePeriod`. + */ +volatile OSTime gRSPAudioTimeTotal; -#pragma GLOBAL_ASM("asm/non_matchings/code/speed_meter/SpeedMeter_Init.s") +/** + * How much time the RSP ran graphics tasks for over the course of `gGraphUpdatePeriod`. + * Typically the RSP runs 1 graphics task per `Graph_Update` cycle, but may run 0 (see `Graph_Update`). + */ +volatile OSTime gRSPGfxTimeTotal; -#pragma GLOBAL_ASM("asm/non_matchings/code/speed_meter/SpeedMeter_Destroy.s") +/** + * How much time the RDP ran for over the course of `gGraphUpdatePeriod`. + */ +volatile OSTime gRDPTimeTotal; -#pragma GLOBAL_ASM("asm/non_matchings/code/speed_meter/SpeedMeter_DrawTimeEntries.s") +/** + * How much time elapsed between the last two `Graph_Update` ending. + * This is expected to be at least the duration of a single frame, since it includes the time spent waiting on the + * graphics task to be done. + */ +volatile OSTime gGraphUpdatePeriod; -#pragma GLOBAL_ASM("asm/non_matchings/code/speed_meter/func_80177A84.s") +// Accumulator for `gRSPAudioTimeTotal` +volatile OSTime gRSPAudioTimeAcc; -#pragma GLOBAL_ASM("asm/non_matchings/code/speed_meter/func_80177AC8.s") +// Accumulator for `gRSPGfxTimeTotal`. +volatile OSTime gRSPGfxTimeAcc; -#pragma GLOBAL_ASM("asm/non_matchings/code/speed_meter/SpeedMeter_DrawAllocEntries.s") +volatile OSTime gRSPOtherTimeAcc; +volatile OSTime gUnkTimeAcc; + +// Accumulator for `gRDPTimeTotal` +volatile OSTime gRDPTimeAcc; + +typedef struct { + /* 0x0 */ volatile OSTime* time; + /* 0x4 */ u16 x; + /* 0x5 */ u16 y; + /* 0x6 */ u16 color; +} SpeedMeterTimeEntry; // size = 0x8 + +SpeedMeterTimeEntry* sSpeedMeterTimeEntryPtr; + +SpeedMeterTimeEntry sSpeedMeterTimeEntryArray[] = { + { &gRSPAudioTimeTotal, 0, 6, GPACK_RGBA5551(0, 0, 255, 1) }, + { &gRSPGfxTimeTotal, 0, 8, GPACK_RGBA5551(255, 128, 128, 1) }, + { &gRDPTimeTotal, 0, 10, GPACK_RGBA5551(0, 255, 0, 1) }, + { &gGraphUpdatePeriod, 0, 12, GPACK_RGBA5551(255, 0, 255, 1) }, +}; + +typedef struct { + /* 0x00 */ s32 maxVal; + /* 0x04 */ s32 val; + /* 0x08 */ u16 backColor; + /* 0x0A */ u16 foreColor; + /* 0x0C */ s32 ulx; + /* 0x10 */ s32 lrx; + /* 0x14 */ s32 uly; + /* 0x18 */ s32 lry; +} SpeedMeterAllocEntry; // size = 0x1C + +//! FAKE: if(1) in macro + +#define gDrawRect(gfx, color, ulx, uly, lrx, lry) \ + do { \ + if (gSysCfbHiResEnabled == true) { \ + u32 tmp = color; \ + gDPPipeSync(gfx); \ + gDPSetFillColor(gfx, ((tmp) << 16) | (tmp)); \ + gDPFillRectangle(gfx, (ulx)*2, (uly)*2, (lrx)*2, (lry)*2); \ + if (1) {} \ + } else { \ + u32 tmp = color; \ + gDPPipeSync(gfx); \ + gDPSetFillColor(gfx, ((tmp) << 16) | (tmp)); \ + gDPFillRectangle(gfx, (ulx), (uly), (lrx), (lry)); \ + } \ + } while (0) + +void SpeedMeter_InitImpl(SpeedMeter* this, s32 x, s32 y) { + this->x = x; + this->y = y; +} + +void SpeedMeter_Init(SpeedMeter* this) { + SpeedMeter_InitImpl(this, 32, 22); +} + +void SpeedMeter_Destroy(SpeedMeter* this) { +} + +void SpeedMeter_DrawTimeEntries(SpeedMeter* this, GraphicsContext* gfxCtx) { + s32 pad[3]; + u32 baseX = 32; + s32 width; + s32 uly; + s32 lry; + s32 pad3; + View view; + s32 pad2[2]; + s32 i; + Gfx* gfx; + + uly = this->y; + lry = this->y + 2; + + OPEN_DISPS(gfxCtx); + + /*! @bug if gIrqMgrRetraceTime is 0, CLOSE_DISPS will never be reached */ + if (gIrqMgrRetraceTime == 0) { + return; + } + + sSpeedMeterTimeEntryPtr = &sSpeedMeterTimeEntryArray[0]; + for (i = 0; i < ARRAY_COUNT(sSpeedMeterTimeEntryArray); i++) { + width = ((f64)*sSpeedMeterTimeEntryPtr->time / gIrqMgrRetraceTime) * 64.0; + sSpeedMeterTimeEntryPtr->x = baseX + width; + sSpeedMeterTimeEntryPtr++; + } + + View_Init(&view, gfxCtx); + view.flags = VIEW_VIEWPORT | VIEW_PROJECTION_ORTHO; + + SET_FULLSCREEN_VIEWPORT_DYNAMIC(&view); + + gfx = OVERLAY_DISP; + View_ApplyTo(&view, &gfx); + + gDPPipeSync(gfx++); + gDPSetOtherMode(gfx++, + G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_CONV | G_TF_POINT | G_TT_NONE | G_TL_TILE | + G_TD_CLAMP | G_TP_NONE | G_CYC_FILL | G_PM_NPRIMITIVE, + G_AC_NONE | G_ZS_PIXEL | G_RM_NOOP | G_RM_NOOP2); + + gDrawRect(gfx++, GPACK_RGBA5551(0, 0, 255, 1), baseX + 64 * 0, uly, baseX + 64 * 1, lry); + gDrawRect(gfx++, GPACK_RGBA5551(0, 255, 0, 1), baseX + 64 * 1, uly, baseX + 64 * 2, lry); + gDrawRect(gfx++, GPACK_RGBA5551(255, 0, 0, 1), baseX + 64 * 2, uly, baseX + 64 * 3, lry); + gDrawRect(gfx++, GPACK_RGBA5551(255, 0, 255, 1), baseX + 64 * 3, uly, baseX + 64 * 4, lry); + + sSpeedMeterTimeEntryPtr = &sSpeedMeterTimeEntryArray[0]; + for (i = 0; i < ARRAY_COUNT(sSpeedMeterTimeEntryArray); i++) { + gDrawRect(gfx++, sSpeedMeterTimeEntryPtr->color, baseX, lry + sSpeedMeterTimeEntryPtr->y, + sSpeedMeterTimeEntryPtr->x, lry + sSpeedMeterTimeEntryPtr->y + 1); + sSpeedMeterTimeEntryPtr++; + } + gDPPipeSync(gfx++); + + OVERLAY_DISP = gfx; + + CLOSE_DISPS(gfxCtx); +} + +void SpeedMeter_InitAllocEntry(SpeedMeterAllocEntry* this, u32 maxVal, u32 val, u16 backColor, u16 foreColor, u32 ulx, + u32 lrx, u32 uly, u32 lry) { + this->maxVal = maxVal; + this->val = val; + this->backColor = backColor; + this->foreColor = foreColor; + this->ulx = ulx; + this->lrx = lrx; + this->uly = uly; + this->lry = lry; +} + +void SpeedMeter_DrawAllocEntry(SpeedMeterAllocEntry* this, GraphicsContext* gfxCtx) { + s32 usedOff; + View view; + Gfx* gfx; + + if (this->maxVal != 0) { + OPEN_DISPS(gfxCtx); + + View_Init(&view, gfxCtx); + view.flags = VIEW_VIEWPORT | VIEW_PROJECTION_ORTHO; + + SET_FULLSCREEN_VIEWPORT_DYNAMIC(&view); + + gfx = OVERLAY_DISP; + View_ApplyTo(&view, &gfx); + + gDPPipeSync(gfx++); + gDPSetOtherMode(gfx++, + G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_CONV | G_TF_POINT | G_TT_NONE | G_TL_TILE | + G_TD_CLAMP | G_TP_NONE | G_CYC_FILL | G_PM_NPRIMITIVE, + G_AC_NONE | G_ZS_PIXEL | G_RM_NOOP | G_RM_NOOP2); + + usedOff = ((this->lrx - this->ulx) * this->val) / this->maxVal + this->ulx; + gDrawRect(gfx++, this->backColor, usedOff, this->uly, this->lrx, this->lry); + gDrawRect(gfx++, this->foreColor, this->ulx, this->uly, usedOff, this->lry); + + gDPPipeSync(gfx++); + + //! FAKE: + if (this && this && this) {} + + OVERLAY_DISP = gfx; + CLOSE_DISPS(gfxCtx); + } +} + +void SpeedMeter_DrawAllocEntries(SpeedMeter* meter, GraphicsContext* gfxCtx, GameState* state) { + s32 pad[2]; + u32 ulx = 30; + u32 lrx = 290; + SpeedMeterAllocEntry entry; + TwoHeadArena* tha; + s32 y; + TwoHeadGfxArena* thga; + u32 zeldaFreeMax; + u32 zeldaFree; + u32 zeldaAlloc; + s32 sysFreeMax; + s32 sysFree; + s32 sysAlloc; + + y = 212; + if (R_ENABLE_ARENA_DBG > 2) { + if (ZeldaArena_IsInitialized()) { + ZeldaArena_GetSizes(&zeldaFreeMax, &zeldaFree, &zeldaAlloc); + SpeedMeter_InitAllocEntry(&entry, zeldaFree + zeldaAlloc, zeldaAlloc, GPACK_RGBA5551(0, 0, 255, 1), + GPACK_RGBA5551(255, 255, 255, 1), ulx, lrx, y, y + 1); + SpeedMeter_DrawAllocEntry(&entry, gfxCtx); + y++; + y++; + } + } + + if (R_ENABLE_ARENA_DBG > 1) { + SystemArena_GetSizes((u32*)&sysFreeMax, (u32*)&sysFree, (u32*)&sysAlloc); + SpeedMeter_InitAllocEntry(&entry, sysFree + sysAlloc - state->tha.size, sysAlloc - state->tha.size, + GPACK_RGBA5551(0, 0, 255, 1), GPACK_RGBA5551(255, 128, 128, 1), ulx, lrx, y, y); + SpeedMeter_DrawAllocEntry(&entry, gfxCtx); + y++; + } + + tha = &state->tha; + SpeedMeter_InitAllocEntry(&entry, tha->size, tha->size - THA_GetRemaining(tha), GPACK_RGBA5551(0, 0, 255, 1), + GPACK_RGBA5551(0, 255, 0, 1), ulx, lrx, y, y); + SpeedMeter_DrawAllocEntry(&entry, gfxCtx); + y++; + + thga = &gfxCtx->polyOpa; + SpeedMeter_InitAllocEntry(&entry, thga->size, thga->size - THGA_GetRemaining(thga), GPACK_RGBA5551(0, 0, 255, 1), + GPACK_RGBA5551(255, 0, 255, 1), ulx, lrx, y, y); + SpeedMeter_DrawAllocEntry(&entry, gfxCtx); + y++; + + thga = &gfxCtx->polyXlu; + SpeedMeter_InitAllocEntry(&entry, thga->size, thga->size - THGA_GetRemaining(thga), GPACK_RGBA5551(0, 0, 255, 1), + GPACK_RGBA5551(255, 255, 0, 1), ulx, lrx, y, y); + SpeedMeter_DrawAllocEntry(&entry, gfxCtx); + y++; + + thga = &gfxCtx->overlay; + SpeedMeter_InitAllocEntry(&entry, thga->size, thga->size - THGA_GetRemaining(thga), GPACK_RGBA5551(0, 0, 255, 1), + GPACK_RGBA5551(255, 0, 0, 1), ulx, lrx, y, y); + SpeedMeter_DrawAllocEntry(&entry, gfxCtx); + y++; +} diff --git a/src/code/sys_matrix.c b/src/code/sys_matrix.c index 6269add5f..f84dae383 100644 --- a/src/code/sys_matrix.c +++ b/src/code/sys_matrix.c @@ -75,7 +75,7 @@ MtxF* sCurrentMatrix; //!< original name: "Matrix_now" * @remark original name: "new_Matrix" */ void Matrix_Init(GameState* gameState) { - sMatrixStack = THA_AllocTailAlign16(&gameState->heap, MATRIX_STACK_SIZE * sizeof(MtxF)); + sMatrixStack = THA_AllocTailAlign16(&gameState->tha, MATRIX_STACK_SIZE * sizeof(MtxF)); sCurrentMatrix = sMatrixStack; } diff --git a/src/code/z_bgcheck.c b/src/code/z_bgcheck.c index ae871c8a6..2bef40dce 100644 --- a/src/code/z_bgcheck.c +++ b/src/code/z_bgcheck.c @@ -140,7 +140,7 @@ void DynaSSNodeList_Init(PlayState* play, DynaSSNodeList* list) { } void DynaSSNodeList_Alloc(PlayState* play, DynaSSNodeList* list, u32 numNodes) { - list->tbl = (SSNode*)THA_AllocTailAlign(&play->state.heap, numNodes * sizeof(SSNode), -2); + list->tbl = (SSNode*)THA_AllocTailAlign(&play->state.tha, numNodes * sizeof(SSNode), -2); list->maxNodes = numNodes; list->count = 0; } @@ -1580,7 +1580,7 @@ void BgCheck_Allocate(CollisionContext* colCtx, PlayState* play, CollisionHeader } } colCtx->lookupTbl = THA_AllocTailAlign( - &play->state.heap, + &play->state.tha, colCtx->subdivAmount.x * sizeof(StaticLookup) * colCtx->subdivAmount.y * colCtx->subdivAmount.z, ~1); if (colCtx->lookupTbl == NULL) { Fault_AddHungupAndCrash("../z_bgcheck.c", 3955); @@ -2456,8 +2456,8 @@ void SSNodeList_Init(SSNodeList* this) { void SSNodeList_Alloc(PlayState* play, SSNodeList* this, s32 tblMax, s32 numPolys) { this->max = tblMax; this->count = 0; - this->tbl = THA_AllocTailAlign(&play->state.heap, tblMax * sizeof(SSNode), -2); - this->polyCheckTbl = THA_AllocTailAlign16(&play->state.heap, numPolys * sizeof(u8)); + this->tbl = THA_AllocTailAlign(&play->state.tha, tblMax * sizeof(SSNode), -2); + this->polyCheckTbl = THA_AllocTailAlign16(&play->state.tha, numPolys * sizeof(u8)); if (this->polyCheckTbl == NULL) { sprintf(D_801ED950, "this->polygon_check == NULL(game_alloc() MemoryAllocationError.)\n"); @@ -2599,7 +2599,7 @@ void DynaPoly_NullPolyList(CollisionPoly** polyList) { * Allocate dyna.polyList */ void DynaPoly_AllocPolyList(PlayState* play, CollisionPoly** polyList, s32 numPolys) { - *polyList = THA_AllocTailAlign(&play->state.heap, numPolys * sizeof(CollisionPoly), -2); + *polyList = THA_AllocTailAlign(&play->state.tha, numPolys * sizeof(CollisionPoly), -2); } /** @@ -2613,7 +2613,7 @@ void DynaPoly_NullVtxList(Vec3s** vtxList) { * Allocate dyna.vtxList */ void DynaPoly_AllocVtxList(PlayState* play, Vec3s** vtxList, s32 numVtx) { - *vtxList = THA_AllocTailAlign(&play->state.heap, numVtx * sizeof(Vec3s), -2); + *vtxList = THA_AllocTailAlign(&play->state.tha, numVtx * sizeof(Vec3s), -2); } /** @@ -2628,7 +2628,7 @@ void DynaPoly_InitWaterBoxList(DynaWaterBoxList* waterBoxList) { * Allocate dyna.waterBoxList */ void DynaPoly_AllocWaterBoxList(PlayState* play, DynaWaterBoxList* waterBoxList, s32 numWaterBoxes) { - waterBoxList->boxes = THA_AllocTailAlign(&play->state.heap, numWaterBoxes * sizeof(WaterBox), -2); + waterBoxList->boxes = THA_AllocTailAlign(&play->state.tha, numWaterBoxes * sizeof(WaterBox), -2); } /** diff --git a/src/code/z_effect_soft_sprite.c b/src/code/z_effect_soft_sprite.c index 870132a07..08aa845ab 100644 --- a/src/code/z_effect_soft_sprite.c +++ b/src/code/z_effect_soft_sprite.c @@ -8,7 +8,7 @@ void EffectSS_Init(PlayState* play, s32 numEntries) { EffectSs* effectsSs; EffectSsOverlay* overlay; - sEffectSsInfo.data_table = (EffectSs*)THA_AllocTailAlign16(&play->state.heap, numEntries * sizeof(EffectSs)); + sEffectSsInfo.data_table = (EffectSs*)THA_AllocTailAlign16(&play->state.tha, numEntries * sizeof(EffectSs)); sEffectSsInfo.searchIndex = 0; sEffectSsInfo.size = numEntries; diff --git a/src/code/z_kaleido_manager.c b/src/code/z_kaleido_manager.c index e09492d4e..d0bacdd22 100644 --- a/src/code/z_kaleido_manager.c +++ b/src/code/z_kaleido_manager.c @@ -66,7 +66,7 @@ void KaleidoManager_Init(PlayState* play) { } } - sKaleidoAreaPtr = THA_AllocTailAlign16(&play->state.heap, largestSize); + sKaleidoAreaPtr = THA_AllocTailAlign16(&play->state.tha, largestSize); gKaleidoMgrCurOvl = NULL; Fault_AddAddrConvClient(&sKaleidoMgrFaultAddrConvClient, KaleidoManager_FaultAddrConv, NULL); } diff --git a/src/code/z_malloc.c b/src/code/z_malloc.c index 781f4310e..ac56231cf 100644 --- a/src/code/z_malloc.c +++ b/src/code/z_malloc.c @@ -40,7 +40,7 @@ void ZeldaArena_GetSizes(size_t* outMaxFree, size_t* outFree, size_t* outAlloc) __osGetSizes(&sZeldaArena, outMaxFree, outFree, outAlloc); } -s32 ZeldaArena_Check() { +s32 ZeldaArena_Check(void) { return __osCheckArena(&sZeldaArena); } @@ -48,10 +48,10 @@ void ZeldaArena_Init(void* start, size_t size) { __osMallocInit(&sZeldaArena, start, size); } -void ZeldaArena_Cleanup() { +void ZeldaArena_Cleanup(void) { __osMallocCleanup(&sZeldaArena); } -u8 ZeldaArena_IsInitialized() { +u8 ZeldaArena_IsInitialized(void) { return __osMallocIsInitalized(&sZeldaArena); } diff --git a/src/code/z_map_exp.c b/src/code/z_map_exp.c index c087fe059..f04562e03 100644 --- a/src/code/z_map_exp.c +++ b/src/code/z_map_exp.c @@ -181,7 +181,7 @@ void Map_Init(PlayState* play) { func_80105C40(play->roomCtx.curRoom.num); interfaceCtx->unk_278 = -1; interfaceCtx->dungeonOrBossAreaMapIndex = -1; - interfaceCtx->mapSegment = THA_AllocTailAlign16(&play->state.heap, 0x1000); + interfaceCtx->mapSegment = THA_AllocTailAlign16(&play->state.tha, 0x1000); if (func_8010A2AC(play)) { gSaveContext.mapIndex = func_8010A238(play); return; diff --git a/src/code/z_message.c b/src/code/z_message.c index a922f237b..42a0e301f 100644 --- a/src/code/z_message.c +++ b/src/code/z_message.c @@ -597,7 +597,7 @@ void Message_Init(PlayState* play) { msgCtx->ocarinaAction = msgCtx->textUnskippable = 0; msgCtx->textColorAlpha = 0xFF; View_Init(&msgCtx->view, play->state.gfxCtx); - msgCtx->textboxSegment = THA_AllocTailAlign16(&play->state.heap, 0x13C00); + msgCtx->textboxSegment = THA_AllocTailAlign16(&play->state.tha, 0x13C00); font = &play->msgCtx.font; Font_LoadOrderedFont(&play->msgCtx.font); font->unk_11D88 = 0; diff --git a/src/code/z_parameter.c b/src/code/z_parameter.c index 2c4106e05..4fcd31c8b 100644 --- a/src/code/z_parameter.c +++ b/src/code/z_parameter.c @@ -7115,16 +7115,16 @@ void Interface_Init(PlayState* play) { interfaceCtx->healthTimer = 200; parameterStaticSize = SEGMENT_ROM_SIZE(parameter_static); - interfaceCtx->parameterSegment = THA_AllocTailAlign16(&play->state.heap, parameterStaticSize); + interfaceCtx->parameterSegment = THA_AllocTailAlign16(&play->state.tha, parameterStaticSize); DmaMgr_SendRequest0(interfaceCtx->parameterSegment, SEGMENT_ROM_START(parameter_static), parameterStaticSize); - interfaceCtx->doActionSegment = THA_AllocTailAlign16(&play->state.heap, 0xC90); + interfaceCtx->doActionSegment = THA_AllocTailAlign16(&play->state.tha, 0xC90); DmaMgr_SendRequest0(interfaceCtx->doActionSegment, SEGMENT_ROM_START(do_action_static), 0x300); DmaMgr_SendRequest0(interfaceCtx->doActionSegment + 0x300, SEGMENT_ROM_START(do_action_static) + 0x480, 0x180); Interface_NewDay(play, CURRENT_DAY); - interfaceCtx->iconItemSegment = THA_AllocTailAlign16(&play->state.heap, 0x4000); + interfaceCtx->iconItemSegment = THA_AllocTailAlign16(&play->state.tha, 0x4000); if (CUR_FORM_EQUIP(EQUIP_SLOT_B) < ITEM_F0) { Interface_LoadItemIconImpl(play, EQUIP_SLOT_B); diff --git a/src/code/z_play.c b/src/code/z_play.c index 44efbfbfb..41b921125 100644 --- a/src/code/z_play.c +++ b/src/code/z_play.c @@ -1562,7 +1562,7 @@ void Play_GetFloorSurface(PlayState* this, MtxF* mtx, Vec3f* pos) { void* Play_LoadFile(PlayState* this, RomFile* entry) { size_t size = entry->vromEnd - entry->vromStart; - void* allocp = THA_AllocTailAlign16(&this->state.heap, size); + void* allocp = THA_AllocTailAlign16(&this->state.tha, size); DmaMgr_SendRequest0(allocp, entry->vromStart, size); @@ -2324,9 +2324,9 @@ void Play_Init(GameState* thisx) { D_801F6D4C->envColor.b = 0; D_801F6D4C->envColor.a = 0; CutsceneFlags_UnsetAll(this); - THA_GetRemaining(&this->state.heap); - zAllocSize = THA_GetRemaining(&this->state.heap); - zAlloc = (uintptr_t)THA_AllocTailAlign16(&this->state.heap, zAllocSize); + THA_GetRemaining(&this->state.tha); + zAllocSize = THA_GetRemaining(&this->state.tha); + zAlloc = (uintptr_t)THA_AllocTailAlign16(&this->state.tha, zAllocSize); ZeldaArena_Init(((zAlloc + 8) & ~0xF), (zAllocSize - ((zAlloc + 8) & ~0xF)) + zAlloc); //! @bug: Incorrect ALIGN16s Actor_InitContext(this, &this->actorCtx, this->linkActorEntry); diff --git a/src/code/z_room.c b/src/code/z_room.c index b8de6caec..d06739d87 100644 --- a/src/code/z_room.c +++ b/src/code/z_room.c @@ -516,7 +516,7 @@ size_t Room_AllocateAndLoad(PlayState* play, RoomContext* roomCtx) { } } - roomCtx->roomMemPages[0] = THA_AllocTailAlign16(&play->state.heap, maxRoomSize); + roomCtx->roomMemPages[0] = THA_AllocTailAlign16(&play->state.tha, maxRoomSize); if (roomCtx->roomMemPages[0] == NULL) { _dbg_hungup("../z_room.c", 1078); } diff --git a/src/code/z_scene.c b/src/code/z_scene.c index 529458f83..811853f07 100644 --- a/src/code/z_scene.c +++ b/src/code/z_scene.c @@ -48,7 +48,7 @@ void Object_InitBank(GameState* gameState, ObjectContext* objectCtx) { for (i = 0; i < OBJECT_EXCHANGE_BANK_MAX; i++) { objectCtx->status[i].id = 0; } // clang-format on - objectCtx->spaceStart = objectCtx->status[0].segment = THA_AllocTailAlign16(&gameState->heap, spaceSize); + objectCtx->spaceStart = objectCtx->status[0].segment = THA_AllocTailAlign16(&gameState->tha, spaceSize); objectCtx->spaceEnd = (void*)((u32)objectCtx->spaceStart + spaceSize); objectCtx->mainKeepIndex = Object_Spawn(objectCtx, GAMEPLAY_KEEP); @@ -357,7 +357,7 @@ void Scene_LoadAreaTextures(PlayState* play, s32 fileIndex) { size_t size = sceneTextureFiles[fileIndex].vromEnd - vromStart; if (size != 0) { - play->roomCtx.unk74 = THA_AllocTailAlign16(&play->state.heap, size); + play->roomCtx.unk74 = THA_AllocTailAlign16(&play->state.tha, size); DmaMgr_SendRequest0(play->roomCtx.unk74, vromStart, size); } } diff --git a/src/code/z_sram_NES.c b/src/code/z_sram_NES.c index 198dac4e9..8d382e5db 100644 --- a/src/code/z_sram_NES.c +++ b/src/code/z_sram_NES.c @@ -1866,7 +1866,7 @@ void Sram_InitSram(GameState* gameState, SramContext* sramCtx) { void Sram_Alloc(GameState* gameState, SramContext* sramCtx) { if (gSaveContext.flashSaveAvailable) { - sramCtx->saveBuf = THA_AllocTailAlign16(&gameState->heap, SAVE_BUFFER_SIZE); + sramCtx->saveBuf = THA_AllocTailAlign16(&gameState->tha, SAVE_BUFFER_SIZE); sramCtx->status = 0; } } diff --git a/src/code/z_vr_box.c b/src/code/z_vr_box.c index dd0785d94..605dff84c 100644 --- a/src/code/z_vr_box.c +++ b/src/code/z_vr_box.c @@ -294,15 +294,15 @@ void Skybox_Init(GameState* gameState, SkyboxContext* skyboxCtx, s16 skyboxId) { Skybox_Setup(gameState, skyboxCtx, skyboxId); if (skyboxId != SKYBOX_NONE) { - skyboxCtx->dListBuf = THA_AllocTailAlign16(&gameState->heap, 0x3840); + skyboxCtx->dListBuf = THA_AllocTailAlign16(&gameState->tha, 0x3840); if (skyboxId == SKYBOX_CUTSCENE_MAP) { // Allocate enough space for the vertices for a 6 sided skybox (cube) - skyboxCtx->roomVtx = THA_AllocTailAlign16(&gameState->heap, sizeof(Vtx) * 32 * 6); + skyboxCtx->roomVtx = THA_AllocTailAlign16(&gameState->tha, sizeof(Vtx) * 32 * 6); func_80143148(skyboxCtx, 6); } else { // Allocate enough space for the vertices for a 5 sided skybox (bottom is missing) - skyboxCtx->roomVtx = THA_AllocTailAlign16(&gameState->heap, sizeof(Vtx) * 32 * 5); + skyboxCtx->roomVtx = THA_AllocTailAlign16(&gameState->tha, sizeof(Vtx) * 32 * 5); func_80143148(skyboxCtx, 5); } } diff --git a/src/overlays/gamestates/ovl_daytelop/z_daytelop.c b/src/overlays/gamestates/ovl_daytelop/z_daytelop.c index 1b68e0b14..637a20906 100644 --- a/src/overlays/gamestates/ovl_daytelop/z_daytelop.c +++ b/src/overlays/gamestates/ovl_daytelop/z_daytelop.c @@ -215,11 +215,11 @@ void DayTelop_Noop(DayTelopState* this) { void DayTelop_LoadGraphics(DayTelopState* this) { size_t segmentSize = SEGMENT_ROM_SIZE(daytelop_static); - this->daytelopStaticFile = THA_AllocTailAlign16(&this->state.heap, segmentSize); + this->daytelopStaticFile = THA_AllocTailAlign16(&this->state.tha, segmentSize); DmaMgr_SendRequest0(this->daytelopStaticFile, SEGMENT_ROM_START(daytelop_static), segmentSize); segmentSize = SEGMENT_ROM_SIZE(icon_item_gameover_static); - this->gameoverStaticFile = THA_AllocTailAlign16(&this->state.heap, segmentSize); + this->gameoverStaticFile = THA_AllocTailAlign16(&this->state.tha, segmentSize); DmaMgr_SendRequest0(this->gameoverStaticFile, SEGMENT_ROM_START(icon_item_gameover_static), segmentSize); } diff --git a/src/overlays/gamestates/ovl_file_choose/z_file_choose_NES.c b/src/overlays/gamestates/ovl_file_choose/z_file_choose_NES.c index 4d3e172d9..a47b5ed9e 100644 --- a/src/overlays/gamestates/ovl_file_choose/z_file_choose_NES.c +++ b/src/overlays/gamestates/ovl_file_choose/z_file_choose_NES.c @@ -2531,15 +2531,15 @@ void FileSelect_Init(GameState* thisx) { Font_LoadOrderedFont(&this->font); size = SEGMENT_ROM_SIZE(title_static); - this->staticSegment = THA_AllocTailAlign16(&this->state.heap, size); + this->staticSegment = THA_AllocTailAlign16(&this->state.tha, size); DmaMgr_SendRequest0(this->staticSegment, SEGMENT_ROM_START(title_static), size); size = SEGMENT_ROM_SIZE(parameter_static); - this->parameterSegment = THA_AllocTailAlign16(&this->state.heap, size); + this->parameterSegment = THA_AllocTailAlign16(&this->state.tha, size); DmaMgr_SendRequest0(this->parameterSegment, SEGMENT_ROM_START(parameter_static), size); size = gObjectTable[OBJECT_MAG].vromEnd - gObjectTable[OBJECT_MAG].vromStart; - this->titleSegment = THA_AllocTailAlign16(&this->state.heap, size); + this->titleSegment = THA_AllocTailAlign16(&this->state.tha, size); DmaMgr_SendRequest0(this->titleSegment, gObjectTable[OBJECT_MAG].vromStart, size); Audio_SetSpec(0xA); diff --git a/src/overlays/gamestates/ovl_title/z_title.c b/src/overlays/gamestates/ovl_title/z_title.c index c829e79a9..5cebc2fca 100644 --- a/src/overlays/gamestates/ovl_title/z_title.c +++ b/src/overlays/gamestates/ovl_title/z_title.c @@ -154,7 +154,7 @@ void ConsoleLogo_Init(GameState* thisx) { ConsoleLogoState* this = (ConsoleLogoState*)thisx; uintptr_t segmentSize = SEGMENT_ROM_SIZE(nintendo_rogo_static); - this->staticSegment = THA_AllocTailAlign16(&this->state.heap, segmentSize); + this->staticSegment = THA_AllocTailAlign16(&this->state.tha, segmentSize); DmaMgr_SendRequest0(this->staticSegment, SEGMENT_ROM_START(nintendo_rogo_static), segmentSize); GameState_SetFramerateDivisor(&this->state, 1); diff --git a/tools/disasm/functions.txt b/tools/disasm/functions.txt index 4a8419dc5..c1137d3b2 100644 --- a/tools/disasm/functions.txt +++ b/tools/disasm/functions.txt @@ -3215,12 +3215,12 @@ 0x80177084:("Sched_FaultClient",), 0x8017715C:("Sched_ThreadEntry",), 0x801772A0:("Sched_Init",), - 0x80177390:("func_80177390",), + 0x80177390:("SpeedMeter_InitImpl",), 0x801773A0:("SpeedMeter_Init",), 0x801773C4:("SpeedMeter_Destroy",), 0x801773D0:("SpeedMeter_DrawTimeEntries",), - 0x80177A84:("func_80177A84",), - 0x80177AC8:("func_80177AC8",), + 0x80177A84:("SpeedMeter_InitAllocEntry",), + 0x80177AC8:("SpeedMeter_DrawAllocEntry",), 0x80177E58:("SpeedMeter_DrawAllocEntries",), 0x801780F0:("Mtx_SetTranslateScaleMtx",), 0x801781EC:("Mtx_SetRotationMtx",), diff --git a/tools/disasm/variables.txt b/tools/disasm/variables.txt index aababcf0b..417e27b77 100644 --- a/tools/disasm/variables.txt +++ b/tools/disasm/variables.txt @@ -21,7 +21,7 @@ 0x80096B50:("gDmaMgrDmaBuffSize","u32","",0x4), 0x80096B60:("gIrqMgrResetStatus","vs32","",0x4), 0x80096B68:("sIrqMgrResetTime","volatile OSTime","",0x8), - 0x80096B70:("sIrqMgrRetraceTime","volatile OSTime","",0x8), + 0x80096B70:("gIrqMgrRetraceTime","volatile OSTime","",0x8), 0x80096B78:("sIrqMgrRetraceCount","s32","",0x4), 0x80096B80:("sCpuExceptions","char*","[18]",0x48), 0x80096BC8:("sFpuExceptions","char*","[6]",0x18), @@ -2159,7 +2159,7 @@ 0x801D1530:("sPadMgrInstance","PadMgr*","",0x4), 0x801D1534:("sPadMgrRetraceCount","UNK_TYPE4","",0x4), 0x801D1538:("sVoiceInitStatus","UNK_TYPE4","",0x4), - 0x801D1540:("D_801D1540","UNK_PTR","",0x4), + 0x801D1540:("sSpeedMeterTimeEntryArray","UNK_PTR","",0x4), 0x801D1570:("D_801D1570","f32","[13]",0x34), 0x801D15B0:("gZeroVec3f","Vec3f","",0xC), 0x801D15BC:("gZeroVec3s","Vec3s","",0x6), @@ -4032,7 +4032,7 @@ 0x801F80E0:("sGraphFaultClient","FaultClient","",0x10), 0x801F80F0:("gGfxMasterDL","Gfx*","",0x4), 0x801F80F8:("sGraphCfbInfos","UNK_TYPE1","",0x1), - 0x801F8150:("sGraphTaskStartTime","u64","",0x8), + 0x801F8150:("sGraphPrevUpdateEndTime","u64","",0x8), 0x801F8160:("sSerialEventQueue","OSMesgQueue","",0x18), 0x801F8178:("sSerialMsgBuf","OSMesg","[1]",0x4), 0x801F8180:("gSegments","u32","[16]",0x40), @@ -4052,24 +4052,22 @@ 0x801FB338:("sAudioMgr","AudioMgr","",0x2e0), 0x801FB620:("gPadMgr","PadMgr","",0x480), 0x801FBAA0:("sSchedFaultClient","UNK_TYPE1","",0x1), - 0x801FBAB0:("sRSPGFXStartTime","OSTime","",0x8), - 0x801FBAB8:("sRSPAudioStartTime","OSTime","",0x8), - 0x801FBAC0:("sRSPOtherStartTime","OSTime","",0x8), + 0x801FBAB0:("sRSPGfxTimeStart","OSTime","",0x8), + 0x801FBAB8:("sRSPAudioTimeStart","OSTime","",0x8), + 0x801FBAC0:("sRSPOtherTimeStart","OSTime","",0x8), 0x801FBAC8:("sRDPStartTime","OSTime","",0x8), 0x801FBAD0:("gAudioSPDataPtr","u64*","",0x4), 0x801FBAD4:("gAudioSPDataSize","u32","",0x4), - 0x801FBAE0:("D_801FBAE0","UNK_TYPE1","",0x1), - 0x801FBAE8:("D_801FBAE8","UNK_TYPE1","",0x1), + 0x801FBAE0:("gRSPAudioTimeTotal","volatile OSTime","",0x8), + 0x801FBAE8:("gRSPGfxTimeTotal","volatile OSTime","",0x8), 0x801FBAF0:("gRDPTimeTotal","volatile OSTime","",0x8), - 0x801FBAF8:("lastRenderFrameDuration","volatile OSTime","",0x8), - 0x801FBB00:("gRSPAudioTotalTime","UNK_TYPE1","",0x1), - 0x801FBB04:("D_801FBB04","UNK_TYPE1","",0x1), - 0x801FBB08:("sRSPGFXTotalTime","UNK_TYPE1","",0x1), - 0x801FBB0C:("D_801FBB0C","UNK_TYPE1","",0x1), - 0x801FBB10:("sRSPOtherTotalTime","UNK_TYPE1","",0x1), - 0x801FBB14:("D_801FBB14","UNK_TYPE1","",0x1), - 0x801FBB20:("gRDPTimeAcc","UNK_TYPE1","",0x1), - 0x801FBB28:("D_801FBB28","UNK_TYPE1","",0x1), + 0x801FBAF8:("gGraphUpdatePeriod","volatile OSTime","",0x8), + 0x801FBB00:("gRSPAudioTimeAcc","volatile OSTime","",0x8), + 0x801FBB08:("gRSPGfxTimeAcc","volatile OSTime","",0x8), + 0x801FBB10:("gRSPOtherTimeAcc","volatile OSTime","",0x8), + 0x801FBB18:("gUnkTimeAcc","volatile OSTime","",0x8), + 0x801FBB20:("gRDPTimeAcc","volatile OSTime","",0x8), + 0x801FBB28:("sSpeedMeterTimeEntryPtr","UNK_TYPE1","",0x1), 0x801FBB30:("sNotebookViMode","OSViMode","",0x50), 0x801FBB80:("gFramebuffers","u32*","[2]",0x8), 0x801FBB88:("gActiveViMode","OSViMode*","",0x4), diff --git a/tools/permuter_settings.toml b/tools/permuter_settings.toml index efa3bc2fe..0aa806f2a 100644 --- a/tools/permuter_settings.toml +++ b/tools/permuter_settings.toml @@ -34,6 +34,8 @@ CLEAR_EVENTINF = "int" CLEAR_EVENTINF_ALT = "int" "EVENTINF_.*" = "int" ".+REG" = "int" +SET_FULLSCREEN_VIEWPORT_DYNAMIC = "void" +gDrawRect = "void" [decompme.compilers] "tools/ido_recomp/linux/7.1/cc" = "ido7.1" diff --git a/tools/sizes/code_functions.csv b/tools/sizes/code_functions.csv index 5194497c7..3e6042f03 100644 --- a/tools/sizes/code_functions.csv +++ b/tools/sizes/code_functions.csv @@ -2729,12 +2729,12 @@ asm/non_matchings/code/sched/Sched_SendGfxCancelMsg.s,Sched_SendGfxCancelMsg,0x8 asm/non_matchings/code/sched/Sched_FaultClient.s,Sched_FaultClient,0x80177084,0x36 asm/non_matchings/code/sched/Sched_ThreadEntry.s,Sched_ThreadEntry,0x8017715C,0x51 asm/non_matchings/code/sched/Sched_Init.s,Sched_Init,0x801772A0,0x3C -asm/non_matchings/code/speed_meter/func_80177390.s,func_80177390,0x80177390,0x4 +asm/non_matchings/code/speed_meter/SpeedMeter_InitImpl.s,SpeedMeter_InitImpl,0x80177390,0x4 asm/non_matchings/code/speed_meter/SpeedMeter_Init.s,SpeedMeter_Init,0x801773A0,0x9 asm/non_matchings/code/speed_meter/SpeedMeter_Destroy.s,SpeedMeter_Destroy,0x801773C4,0x3 asm/non_matchings/code/speed_meter/SpeedMeter_DrawTimeEntries.s,SpeedMeter_DrawTimeEntries,0x801773D0,0x1AD -asm/non_matchings/code/speed_meter/func_80177A84.s,func_80177A84,0x80177A84,0x11 -asm/non_matchings/code/speed_meter/func_80177AC8.s,func_80177AC8,0x80177AC8,0xE4 +asm/non_matchings/code/speed_meter/SpeedMeter_InitAllocEntry.s,SpeedMeter_InitAllocEntry,0x80177A84,0x11 +asm/non_matchings/code/speed_meter/SpeedMeter_DrawAllocEntry.s,SpeedMeter_DrawAllocEntry,0x80177AC8,0xE4 asm/non_matchings/code/speed_meter/SpeedMeter_DrawAllocEntries.s,SpeedMeter_DrawAllocEntries,0x80177E58,0xA6 asm/non_matchings/code/speed_meter/func_801780F0.s,func_801780F0,0x801780F0,0x3F asm/non_matchings/code/speed_meter/func_801781EC.s,func_801781EC,0x801781EC,0x90 From 9d043f0197d57021cb704f94e5ba459d8b03cd30 Mon Sep 17 00:00:00 2001 From: Tom Overton Date: Mon, 2 Oct 2023 23:26:50 -0700 Subject: [PATCH 11/16] Add original asset names to all `object_l*` and `object_m*` files (#1403) --- assets/xml/objects/gameplay_keep.xml | 2 +- assets/xml/objects/object_ladder.xml | 16 ++--- assets/xml/objects/object_last_obj.xml | 12 ++-- assets/xml/objects/object_lastday.xml | 8 +-- assets/xml/objects/object_lbfshot.xml | 6 +- assets/xml/objects/object_lightblock.xml | 6 +- assets/xml/objects/object_lightswitch.xml | 6 +- assets/xml/objects/object_link_goron.xml | 8 +-- assets/xml/objects/object_link_zora.xml | 2 +- assets/xml/objects/object_lotus.xml | 2 +- assets/xml/objects/object_mamenoki.xml | 8 +-- assets/xml/objects/object_maruta.xml | 18 +++--- assets/xml/objects/object_mastergolon.xml | 2 +- assets/xml/objects/object_masterzoora.xml | 2 +- assets/xml/objects/object_milkbar.xml | 20 +++--- assets/xml/objects/object_mir_ray.xml | 2 +- assets/xml/objects/object_mk.xml | 10 +-- assets/xml/objects/object_mm.xml | 34 +++++----- assets/xml/objects/object_mnk.xml | 76 +++++++++++------------ assets/xml/objects/object_moonend.xml | 2 +- assets/xml/objects/object_moonston.xml | 4 +- assets/xml/objects/object_ms.xml | 2 +- assets/xml/objects/object_mu.xml | 12 ++-- assets/xml/overlays/ovl_En_Mm2.xml | 2 +- 24 files changed, 131 insertions(+), 131 deletions(-) diff --git a/assets/xml/objects/gameplay_keep.xml b/assets/xml/objects/gameplay_keep.xml index 8b1c482c2..5dababaab 100644 --- a/assets/xml/objects/gameplay_keep.xml +++ b/assets/xml/objects/gameplay_keep.xml @@ -1159,7 +1159,7 @@ - + diff --git a/assets/xml/objects/object_ladder.xml b/assets/xml/objects/object_ladder.xml index 6e42412ec..29ee69b9b 100644 --- a/assets/xml/objects/object_ladder.xml +++ b/assets/xml/objects/object_ladder.xml @@ -1,13 +1,13 @@  - - - - - - - - + + + + + + + + diff --git a/assets/xml/objects/object_last_obj.xml b/assets/xml/objects/object_last_obj.xml index 03dbddcf2..bd452a408 100644 --- a/assets/xml/objects/object_last_obj.xml +++ b/assets/xml/objects/object_last_obj.xml @@ -1,21 +1,21 @@  - + - - + + - - + + - + diff --git a/assets/xml/objects/object_lastday.xml b/assets/xml/objects/object_lastday.xml index e447edfbf..4c6b5fdb4 100644 --- a/assets/xml/objects/object_lastday.xml +++ b/assets/xml/objects/object_lastday.xml @@ -3,13 +3,13 @@ - + - + - + - + diff --git a/assets/xml/objects/object_lbfshot.xml b/assets/xml/objects/object_lbfshot.xml index 325ddf49e..881f877b6 100644 --- a/assets/xml/objects/object_lbfshot.xml +++ b/assets/xml/objects/object_lbfshot.xml @@ -1,9 +1,9 @@  - - + + - + diff --git a/assets/xml/objects/object_lightblock.xml b/assets/xml/objects/object_lightblock.xml index 207b03020..d58ec0004 100644 --- a/assets/xml/objects/object_lightblock.xml +++ b/assets/xml/objects/object_lightblock.xml @@ -1,9 +1,9 @@  - - + + - + diff --git a/assets/xml/objects/object_lightswitch.xml b/assets/xml/objects/object_lightswitch.xml index 4318488be..a8b26bc51 100644 --- a/assets/xml/objects/object_lightswitch.xml +++ b/assets/xml/objects/object_lightswitch.xml @@ -1,9 +1,9 @@  - - + + - + diff --git a/assets/xml/objects/object_link_goron.xml b/assets/xml/objects/object_link_goron.xml index 76017884e..b6dd7fe6f 100644 --- a/assets/xml/objects/object_link_goron.xml +++ b/assets/xml/objects/object_link_goron.xml @@ -42,7 +42,7 @@ - + @@ -72,10 +72,10 @@ - + - + @@ -90,7 +90,7 @@ - + diff --git a/assets/xml/objects/object_link_zora.xml b/assets/xml/objects/object_link_zora.xml index 5833293b8..be4c54274 100644 --- a/assets/xml/objects/object_link_zora.xml +++ b/assets/xml/objects/object_link_zora.xml @@ -80,7 +80,7 @@ - + diff --git a/assets/xml/objects/object_lotus.xml b/assets/xml/objects/object_lotus.xml index b9f40033c..923218811 100644 --- a/assets/xml/objects/object_lotus.xml +++ b/assets/xml/objects/object_lotus.xml @@ -4,6 +4,6 @@ - + diff --git a/assets/xml/objects/object_mamenoki.xml b/assets/xml/objects/object_mamenoki.xml index 9ce4644c3..9fa5b6832 100644 --- a/assets/xml/objects/object_mamenoki.xml +++ b/assets/xml/objects/object_mamenoki.xml @@ -1,9 +1,9 @@  - - - - + + + + diff --git a/assets/xml/objects/object_maruta.xml b/assets/xml/objects/object_maruta.xml index e61e1162b..c44907b1d 100644 --- a/assets/xml/objects/object_maruta.xml +++ b/assets/xml/objects/object_maruta.xml @@ -3,14 +3,14 @@ - - - - - - - - - + + + + + + + + + diff --git a/assets/xml/objects/object_mastergolon.xml b/assets/xml/objects/object_mastergolon.xml index 35eb9d285..481fb7cde 100644 --- a/assets/xml/objects/object_mastergolon.xml +++ b/assets/xml/objects/object_mastergolon.xml @@ -1,6 +1,6 @@  - + diff --git a/assets/xml/objects/object_masterzoora.xml b/assets/xml/objects/object_masterzoora.xml index f21b99b50..5a72744da 100644 --- a/assets/xml/objects/object_masterzoora.xml +++ b/assets/xml/objects/object_masterzoora.xml @@ -1,6 +1,6 @@  - + diff --git a/assets/xml/objects/object_milkbar.xml b/assets/xml/objects/object_milkbar.xml index 38bec140b..f3e732514 100644 --- a/assets/xml/objects/object_milkbar.xml +++ b/assets/xml/objects/object_milkbar.xml @@ -1,27 +1,27 @@  - + - + - + - + - + - - + + @@ -33,12 +33,12 @@ - + - - + + diff --git a/assets/xml/objects/object_mir_ray.xml b/assets/xml/objects/object_mir_ray.xml index 962982322..c0b1cf6f2 100644 --- a/assets/xml/objects/object_mir_ray.xml +++ b/assets/xml/objects/object_mir_ray.xml @@ -1,7 +1,7 @@  - + diff --git a/assets/xml/objects/object_mk.xml b/assets/xml/objects/object_mk.xml index 457eadf28..0db6c703d 100644 --- a/assets/xml/objects/object_mk.xml +++ b/assets/xml/objects/object_mk.xml @@ -1,11 +1,11 @@  - - - - - + + + + + diff --git a/assets/xml/objects/object_mm.xml b/assets/xml/objects/object_mm.xml index 43e8e930b..b7b727d4e 100644 --- a/assets/xml/objects/object_mm.xml +++ b/assets/xml/objects/object_mm.xml @@ -1,10 +1,10 @@  - - - - - + + + + + @@ -32,9 +32,9 @@ - - - + + + @@ -55,14 +55,14 @@ - - - - - - - - - + + + + + + + + + diff --git a/assets/xml/objects/object_mnk.xml b/assets/xml/objects/object_mnk.xml index ee2d1a55e..e80bcfba2 100644 --- a/assets/xml/objects/object_mnk.xml +++ b/assets/xml/objects/object_mnk.xml @@ -1,7 +1,7 @@  - + @@ -9,11 +9,11 @@ - - - - - + + + + + @@ -24,31 +24,31 @@ - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + @@ -110,13 +110,13 @@ - - - - - - - + + + + + + + diff --git a/assets/xml/objects/object_moonend.xml b/assets/xml/objects/object_moonend.xml index 666e9e07c..4e4b5a6f2 100644 --- a/assets/xml/objects/object_moonend.xml +++ b/assets/xml/objects/object_moonend.xml @@ -34,7 +34,7 @@ - + diff --git a/assets/xml/objects/object_moonston.xml b/assets/xml/objects/object_moonston.xml index 58a920522..2945469f2 100644 --- a/assets/xml/objects/object_moonston.xml +++ b/assets/xml/objects/object_moonston.xml @@ -4,8 +4,8 @@ along with its associated fire trail. --> - - + + diff --git a/assets/xml/objects/object_ms.xml b/assets/xml/objects/object_ms.xml index f861e6a37..1b3f86145 100644 --- a/assets/xml/objects/object_ms.xml +++ b/assets/xml/objects/object_ms.xml @@ -1,7 +1,7 @@  - + diff --git a/assets/xml/objects/object_mu.xml b/assets/xml/objects/object_mu.xml index 37886e8f5..a72b184c1 100644 --- a/assets/xml/objects/object_mu.xml +++ b/assets/xml/objects/object_mu.xml @@ -1,11 +1,11 @@  - - - - - + + + + + @@ -58,6 +58,6 @@ - + diff --git a/assets/xml/overlays/ovl_En_Mm2.xml b/assets/xml/overlays/ovl_En_Mm2.xml index 5d0be627f..81457d849 100644 --- a/assets/xml/overlays/ovl_En_Mm2.xml +++ b/assets/xml/overlays/ovl_En_Mm2.xml @@ -8,7 +8,7 @@ - + From f6a2f4492a5db3f3bd19601336a299d7b84cda6f Mon Sep 17 00:00:00 2001 From: Nuss <67802335+hack-nuss@users.noreply.github.com> Date: Tue, 3 Oct 2023 09:58:46 +0200 Subject: [PATCH 12/16] En_Encount3 decompiled (#1405) * data * some matches * draw func * Update func * improvements * forgot extern * improvements * improvements * improvements * improvements --- spec | 3 +- .../actors/ovl_En_Encount3/z_en_encount3.c | 178 ++++++++++++++++-- .../actors/ovl_En_Encount3/z_en_encount3.h | 28 ++- 3 files changed, 194 insertions(+), 15 deletions(-) diff --git a/spec b/spec index 00e0fee37..eb09f058f 100644 --- a/spec +++ b/spec @@ -2163,8 +2163,7 @@ beginseg name "ovl_En_Encount3" compress include "build/src/overlays/actors/ovl_En_Encount3/z_en_encount3.o" - include "build/data/ovl_En_Encount3/ovl_En_Encount3.data.o" - include "build/data/ovl_En_Encount3/ovl_En_Encount3.reloc.o" + include "build/src/overlays/actors/ovl_En_Encount3/ovl_En_Encount3_reloc.o" endseg beginseg diff --git a/src/overlays/actors/ovl_En_Encount3/z_en_encount3.c b/src/overlays/actors/ovl_En_Encount3/z_en_encount3.c index b2d172cfc..15d495e49 100644 --- a/src/overlays/actors/ovl_En_Encount3/z_en_encount3.c +++ b/src/overlays/actors/ovl_En_Encount3/z_en_encount3.c @@ -5,6 +5,7 @@ */ #include "z_en_encount3.h" +#include "objects/object_big_fwall/object_big_fwall.h" #define FLAGS (ACTOR_FLAG_10 | ACTOR_FLAG_20 | ACTOR_FLAG_CANT_LOCK_ON) @@ -12,14 +13,15 @@ void EnEncount3_Init(Actor* thisx, PlayState* play); void EnEncount3_Destroy(Actor* thisx, PlayState* play); -void EnEncount3_Update(Actor* thisx, PlayState* play); +void EnEncount3_Update(Actor* thisx, PlayState* play2); void EnEncount3_Draw(Actor* thisx, PlayState* play); +void func_809AD058(EnEncount3* this); + void func_809AD084(EnEncount3* this, PlayState* play); void func_809AD194(EnEncount3* this, PlayState* play); void func_809AD1EC(EnEncount3* this, PlayState* play); -#if 0 ActorInit En_Encount3_InitVars = { ACTOR_EN_ENCOUNT3, ACTORCAT_ENEMY, @@ -32,22 +34,174 @@ ActorInit En_Encount3_InitVars = { (ActorFunc)EnEncount3_Draw, }; -#endif +s32 D_809AD810 = false; -extern UNK_TYPE D_060009A0; +void EnEncount3_Init(Actor* thisx, PlayState* play) { + EnEncount3* this = THIS; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Encount3/EnEncount3_Init.s") + this->unk14A = ENCOUNT3_GET_SPAWN_INDEX(thisx); + this->childParams = ENCOUNT3_GET_PARAM_F80(thisx); + this->switchFlag = ENCOUNT3_GET_SWITCH_FLAG(thisx); + this->csId = this->actor.csId; + this->unk16C = ENCOUNT3_GET_ROTZ(thisx) * 10.0f; + if (this->unk16C < 10.0f) { + this->unk16C = 10.0f; + } else if (this->unk16C > 1000.0f) { + this->unk16C = 1000.0f; + } + if (this->switchFlag == 0x7F) { + this->switchFlag = -1; + } + if ((this->switchFlag >= 0) && Flags_GetSwitch(play, this->switchFlag)) { + Actor_Kill(&this->actor); + } + this->actor.flags |= ACTOR_FLAG_CANT_LOCK_ON; + this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + func_809AD058(this); +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Encount3/EnEncount3_Destroy.s") +void EnEncount3_Destroy(Actor* thisx, PlayState* play) { +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Encount3/func_809AD058.s") +void func_809AD058(EnEncount3* this) { + this->childActorId = ACTOR_EN_JSO; + this->unk150 = 1; + this->timer = 30; + this->actionFunc = func_809AD084; +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Encount3/func_809AD084.s") +void func_809AD084(EnEncount3* this, PlayState* play) { + if ((this->switchFlag >= 0) && Flags_GetSwitch(play, this->switchFlag)) { + Actor_Kill(&this->actor); + return; + } + if (!(this->unk16C < this->actor.xzDistToPlayer) && (Player_GetMask(play) == PLAYER_MASK_GARO) && !D_809AD810) { + if (this->timer > 0) { + this->timer--; + } else { + this->child = + Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, this->childActorId, this->actor.world.pos.x, + this->actor.world.pos.y, this->actor.world.pos.z, 0, 0, 0, this->childParams); + if (this->child != NULL) { + this->unk14E++; + D_809AD810 = true; + this->actionFunc = func_809AD194; + } + } + } +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Encount3/func_809AD194.s") +void func_809AD194(EnEncount3* this, PlayState* play) { + if (this->unk14E == 0) { + this->unk178 = 0.0f; + if (this->switchFlag >= 0) { + Flags_SetSwitch(play, this->switchFlag); + } + this->actionFunc = func_809AD1EC; + } +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Encount3/func_809AD1EC.s") +void func_809AD1EC(EnEncount3* this, PlayState* play) { + if (this->unk174 < 0.002f) { + D_809AD810 = false; + Actor_Kill(&this->actor); + } +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Encount3/EnEncount3_Update.s") +void EnEncount3_Update(Actor* thisx, PlayState* play2) { + EnEncount3* this = THIS; + f32 new_var; + PlayState* play = play2; + Player* player = GET_PLAYER(play); + f32 sp3C; + f32 sp38; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Encount3/EnEncount3_Draw.s") + this->actionFunc(this, play); + if (this->actionFunc == func_809AD194) { + new_var = this->unk16C * 0.52f; + if (new_var < this->actor.xzDistToPlayer) { + this->unk178 = ((this->unk16C * 0.03125f) * 0.001f) + 0.1f; + } else { + this->unk178 = 0.06f; + } + + if (((this->unk16C + 50.0f) + BREG(0)) < this->actor.xzDistToPlayer) { + if (this->actionFunc == func_809AD194) { + this->unk148 = 0; + this->unk178 = 0.0f; + D_809AD810 = false; + if (((this->child != NULL) && (this->child->update != NULL)) && (this->child->colChkInfo.health > 0)) { + Actor_Kill(this->child); + this->child = NULL; + } + func_809AD058(this); + } + } else if (this->unk16C < this->actor.xzDistToPlayer) { + s16 i; + + for (i = 0; i < PLAYER_BODYPART_MAX; i++) { + player->flameTimers[i] = Rand_S16Offset(0, 200); + } + player->isBurning = true; + + sp3C = this->actor.world.pos.x - player->actor.world.pos.x; + sp38 = this->actor.world.pos.z - player->actor.world.pos.z; + if (!Play_InCsMode(play)) { + func_800B8D50(play, &this->actor, 10.0f, Math_Atan2S_XY(sp38, sp3C), 0.0f, 1); + } + } + this->child->colChkInfo = this->child->colChkInfo; + } + + this->unk168 = this->unk16C; + this->unk168 /= 7666.0f; + if (this->actionFunc != func_809AD194) { + Math_ApproachZeroF(&this->unk170, 0.3f, 10.0f); + Math_ApproachZeroF(&this->unk160, 0.3f, 5.0f); + if (this->unk160 < 1.0f) { + play->unk_18880 = 0; + } + } else if (this->unk148 != 0) { + Math_ApproachF(&this->unk170, 255.0f, 0.4f, 10.0f); + Math_ApproachF(&this->unk160, 60.0f, 0.3f, 5.0f); + } + Math_ApproachF(&this->unk174, this->unk178, 0.3f, 0.03f); + + this->unk164 = this->unk160 / 60.0f; + if (this->unk164 != 0.0f) { + play->envCtx.lightSettings.fogNear = (960 - play->envCtx.unk_C4.fogNear) * this->unk164; + play->envCtx.lightSettings.fogColor[0] = (40.0f - play->envCtx.unk_C4.fogColor[0]) * this->unk164; + play->envCtx.lightSettings.fogColor[1] = (10.0f - play->envCtx.unk_C4.fogColor[1]) * this->unk164; + play->envCtx.lightSettings.fogColor[2] = (0.0f - play->envCtx.unk_C4.fogColor[2]) * this->unk164; + } +} + +void EnEncount3_Draw(Actor* thisx, PlayState* play) { + EnEncount3* this = THIS; + s32 pad; + + if (this->unk170 > 0.0f) { + OPEN_DISPS(play->state.gfxCtx); + + Gfx_SetupDL25_Xlu(play->state.gfxCtx); + Matrix_Push(); + + gDPPipeSync(POLY_XLU_DISP++); + gSPSegment(POLY_XLU_DISP++, 0x08, + Gfx_TwoTexScroll(play->state.gfxCtx, 0, (s32)play->gameplayFrames, 0, 0x20, 0x40, 1, + (s32)play->gameplayFrames * -2, (s32)play->gameplayFrames * -8, 0x20, 0x20)); + + gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 200, 0, (s8)this->unk170); + gDPSetEnvColor(POLY_XLU_DISP++, 255, 0, 0, 128); + + Matrix_Translate(this->actor.world.pos.x, this->actor.world.pos.y - 40.0f, this->actor.world.pos.z, + MTXMODE_NEW); + Matrix_Scale(this->unk168, this->unk174, this->unk168, MTXMODE_APPLY); + + gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_XLU_DISP++, object_big_fwall_DL_0009A0); + + Matrix_Pop(); + CLOSE_DISPS(play->state.gfxCtx); + } +} diff --git a/src/overlays/actors/ovl_En_Encount3/z_en_encount3.h b/src/overlays/actors/ovl_En_Encount3/z_en_encount3.h index 9ebc87303..9e8bd01ad 100644 --- a/src/overlays/actors/ovl_En_Encount3/z_en_encount3.h +++ b/src/overlays/actors/ovl_En_Encount3/z_en_encount3.h @@ -7,10 +7,36 @@ struct EnEncount3; typedef void (*EnEncount3ActionFunc)(struct EnEncount3*, PlayState*); +#define ENCOUNT3_GET_SPAWN_INDEX(thisx) (((thisx)->params >> 0xC) & 0xF) +#define ENCOUNT3_GET_PARAM_F80(thisx) (((thisx)->params >> 7) & 0x1F) +#define ENCOUNT3_GET_SWITCH_FLAG(thisx) ((thisx)->params & 0x7F) + +#define ENCOUNT3_GET_ROTZ(thisx) ((thisx)->world.rot.z) + typedef struct EnEncount3 { /* 0x000 */ Actor actor; /* 0x144 */ EnEncount3ActionFunc actionFunc; - /* 0x148 */ char unk_148[0x84]; + /* 0x148 */ u8 unk148; + /* 0x14A */ s16 unk14A; + /* 0x14C */ UNK_TYPE1 pad14C[0x2]; + /* 0x14E */ s16 unk14E; + /* 0x150 */ s16 unk150; + /* 0x152 */ s16 unk152; + /* 0x154 */ s16 childActorId; + /* 0x156 */ s16 unk156; + /* 0x158 */ s16 childParams; + /* 0x15A */ s16 csId; + /* 0x15C */ s16 switchFlag; + /* 0x15E */ s16 timer; + /* 0x160 */ f32 unk160; + /* 0x164 */ f32 unk164; + /* 0x168 */ f32 unk168; + /* 0x16C */ f32 unk16C; + /* 0x170 */ f32 unk170; + /* 0x174 */ f32 unk174; + /* 0x178 */ f32 unk178; + /* 0x17C */ Actor* child; + /* 0x180 */ UNK_TYPE1 unk180[0x4C]; } EnEncount3; // size = 0x1CC #endif // Z_EN_ENCOUNT3_H From f08a69a2cbded60798101e87797cc7a691ff5749 Mon Sep 17 00:00:00 2001 From: Anghelo Carvajal Date: Tue, 3 Oct 2023 18:13:22 -0300 Subject: [PATCH 13/16] `ovl_Bg_Dy_Yoseizo` and related docs (#1390) * Add ido setting to permuter * OK * Data imported & named, change spec * Some easy naming * Cleanup * More object stuff and enums * Document EnDyExtra * Document DemoGetitem * Document DemoEffect * Some work on Elforg * Elforg params macro, some more on Elfgrp * Defines for number of fairies * Tweak some flags wording * Label beam * Elfgrp: Name most of the stray fairy handling stuff * cleanup * fix typo * GreatFairyAnimation * name animations * BgDyYoseizo_TrainPlayer * Choose behaviour? * fix merge * format * self review * WEEKEVENTREG_OBTAINED_GREAT_SPIN_ATTACK * jenkins * review * Update src/overlays/actors/ovl_Bg_Dy_Yoseizo/z_bg_dy_yoseizo.c Co-authored-by: Derek Hensley * review * Update src/overlays/actors/ovl_En_Elfgrp/z_en_elfgrp.c Co-authored-by: engineer124 <47598039+engineer124@users.noreply.github.com> * Update src/overlays/actors/ovl_En_Elfgrp/z_en_elfgrp.c Co-authored-by: engineer124 <47598039+engineer124@users.noreply.github.com> * Update src/overlays/actors/ovl_Bg_Dy_Yoseizo/z_bg_dy_yoseizo.c Co-authored-by: engineer124 <47598039+engineer124@users.noreply.github.com> * Update src/overlays/actors/ovl_En_Elfgrp/z_en_elfgrp.c * review --------- Co-authored-by: Elliptic Ellipsis Co-authored-by: Derek Hensley Co-authored-by: engineer124 <47598039+engineer124@users.noreply.github.com> --- assets/xml/objects/object_dy_obj.xml | 165 ++-- assets/xml/objects/object_efc_tw.xml | 17 +- include/z64save.h | 8 +- spec | 3 +- src/code/z_actor.c | 30 +- src/code/z_en_item00.c | 13 +- src/code/z_sram_NES.c | 3 +- .../ovl_Bg_Dy_Yoseizo/z_bg_dy_yoseizo.c | 747 +++++++++++++++++- .../ovl_Bg_Dy_Yoseizo/z_bg_dy_yoseizo.h | 52 +- .../actors/ovl_Demo_Effect/z_demo_effect.c | 146 ++-- .../actors/ovl_Demo_Effect/z_demo_effect.h | 19 +- .../actors/ovl_Demo_Getitem/z_demo_getitem.c | 38 +- .../actors/ovl_Demo_Getitem/z_demo_getitem.h | 2 +- src/overlays/actors/ovl_En_Box/z_en_box.c | 3 +- .../actors/ovl_En_Dy_Extra/z_en_dy_extra.c | 62 +- .../actors/ovl_En_Dy_Extra/z_en_dy_extra.h | 11 +- src/overlays/actors/ovl_En_Elf/z_en_elf.c | 2 +- .../actors/ovl_En_Elfbub/z_en_elfbub.c | 10 +- .../actors/ovl_En_Elfgrp/z_en_elfgrp.c | 479 ++++++----- .../actors/ovl_En_Elfgrp/z_en_elfgrp.h | 31 +- .../actors/ovl_En_Elforg/z_en_elforg.c | 33 +- .../actors/ovl_En_Elforg/z_en_elforg.h | 39 +- .../actors/ovl_En_M_Thunder/z_en_m_thunder.c | 2 +- .../ovl_Obj_Flowerpot/z_obj_flowerpot.c | 8 +- .../ovl_Obj_Lightblock/z_obj_lightblock.c | 59 +- .../actors/ovl_player_actor/z_player.c | 2 +- .../ovl_kaleido_scope/z_kaleido_map.c | 2 +- tools/disasm/functions.txt | 80 +- tools/disasm/variables.txt | 26 +- tools/weekeventregconvert.py | 2 +- undefined_syms.txt | 8 - 31 files changed, 1467 insertions(+), 635 deletions(-) diff --git a/assets/xml/objects/object_dy_obj.xml b/assets/xml/objects/object_dy_obj.xml index 91b9a55fb..37fef4ab1 100644 --- a/assets/xml/objects/object_dy_obj.xml +++ b/assets/xml/objects/object_dy_obj.xml @@ -1,51 +1,62 @@  + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -55,42 +66,46 @@ + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/xml/objects/object_efc_tw.xml b/assets/xml/objects/object_efc_tw.xml index a7ca81b55..c28ae3c81 100644 --- a/assets/xml/objects/object_efc_tw.xml +++ b/assets/xml/objects/object_efc_tw.xml @@ -1,13 +1,16 @@  - - + + + - - - - - + + + + + + + diff --git a/include/z64save.h b/include/z64save.h index 1db5a566d..7d1bc781d 100644 --- a/include/z64save.h +++ b/include/z64save.h @@ -650,11 +650,14 @@ typedef enum { #define WEEKEVENTREG_CLOCK_TOWER_OPENED PACK_WEEKEVENTREG_FLAG(8, 0x40) #define WEEKEVENTREG_08_80 PACK_WEEKEVENTREG_FLAG(8, 0x80) + +// This 5 flags are managed in a special way by EnElfgrp #define WEEKEVENTREG_09_01 PACK_WEEKEVENTREG_FLAG(9, 0x01) #define WEEKEVENTREG_09_02 PACK_WEEKEVENTREG_FLAG(9, 0x02) #define WEEKEVENTREG_09_04 PACK_WEEKEVENTREG_FLAG(9, 0x04) #define WEEKEVENTREG_09_08 PACK_WEEKEVENTREG_FLAG(9, 0x08) #define WEEKEVENTREG_09_10 PACK_WEEKEVENTREG_FLAG(9, 0x10) + #define WEEKEVENTREG_09_20 PACK_WEEKEVENTREG_FLAG(9, 0x20) #define WEEKEVENTREG_09_40 PACK_WEEKEVENTREG_FLAG(9, 0x40) #define WEEKEVENTREG_09_80 PACK_WEEKEVENTREG_FLAG(9, 0x80) @@ -795,7 +798,7 @@ typedef enum { #define WEEKEVENTREG_22_40 PACK_WEEKEVENTREG_FLAG(22, 0x40) #define WEEKEVENTREG_22_80 PACK_WEEKEVENTREG_FLAG(22, 0x80) #define WEEKEVENTREG_23_01 PACK_WEEKEVENTREG_FLAG(23, 0x01) -#define WEEKEVENTREG_23_02 PACK_WEEKEVENTREG_FLAG(23, 0x02) +#define WEEKEVENTREG_OBTAINED_GREAT_SPIN_ATTACK PACK_WEEKEVENTREG_FLAG(23, 0x02) #define WEEKEVENTREG_23_04 PACK_WEEKEVENTREG_FLAG(23, 0x04) #define WEEKEVENTREG_23_08 PACK_WEEKEVENTREG_FLAG(23, 0x08) #define WEEKEVENTREG_23_10 PACK_WEEKEVENTREG_FLAG(23, 0x10) @@ -1631,6 +1634,9 @@ typedef enum { /* 3 */ DUNGEON_INDEX_STONE_TOWER_TEMPLE // Also applies to Inverted Stone Tower Temple } DungeonIndex; +#define STRAY_FAIRY_TOTAL 25 // total number of stray fairies, including those already in the Great Fairy Fountain +#define STRAY_FAIRY_SCATTERED_TOTAL 15 // original number of stray fairies in one dungeon area + void Sram_ActivateOwl(u8 owlId); void Sram_ClearFlagsAtDawnOfTheFirstDay(void); void Sram_SaveEndOfCycle(struct PlayState* play); diff --git a/spec b/spec index eb09f058f..d7d51ec20 100644 --- a/spec +++ b/spec @@ -2365,8 +2365,7 @@ beginseg name "ovl_Bg_Dy_Yoseizo" compress include "build/src/overlays/actors/ovl_Bg_Dy_Yoseizo/z_bg_dy_yoseizo.o" - include "build/data/ovl_Bg_Dy_Yoseizo/ovl_Bg_Dy_Yoseizo.data.o" - include "build/data/ovl_Bg_Dy_Yoseizo/ovl_Bg_Dy_Yoseizo.reloc.o" + include "build/src/overlays/actors/ovl_Bg_Dy_Yoseizo/ovl_Bg_Dy_Yoseizo_reloc.o" endseg beginseg diff --git a/src/code/z_actor.c b/src/code/z_actor.c index a69dada41..10f782e25 100644 --- a/src/code/z_actor.c +++ b/src/code/z_actor.c @@ -725,7 +725,7 @@ void Target_Update(TargetContext* targetCtx, Player* player, Actor* lockOnActor, /* Start of Flags section */ /** - * Tests if current scene switch flag is set. + * Tests if a current scene switch flag is set. */ s32 Flags_GetSwitch(PlayState* play, s32 flag) { if ((flag >= 0) && (flag < 0x80)) { @@ -735,7 +735,7 @@ s32 Flags_GetSwitch(PlayState* play, s32 flag) { } /** - * Sets current scene switch flag. + * Sets a current scene switch flag. */ void Flags_SetSwitch(PlayState* play, s32 flag) { if ((flag >= 0) && (flag < 0x80)) { @@ -744,7 +744,7 @@ void Flags_SetSwitch(PlayState* play, s32 flag) { } /** - * Unsets current scene switch flag. + * Unsets a current scene switch flag. */ void Flags_UnsetSwitch(PlayState* play, s32 flag) { if ((flag >= 0) && (flag < 0x80)) { @@ -753,77 +753,77 @@ void Flags_UnsetSwitch(PlayState* play, s32 flag) { } /** - * Tests if current scene chest flag is set. + * Tests if a current scene chest flag is set. */ s32 Flags_GetTreasure(PlayState* play, s32 flag) { return play->actorCtx.sceneFlags.chest & (1 << flag); } /** - * Sets current scene chest flag. + * Sets a current scene chest flag. */ void Flags_SetTreasure(PlayState* play, s32 flag) { play->actorCtx.sceneFlags.chest |= (1 << flag); } /** - * Overrides the all the chest flags. + * Overrides all the current scene chest flags. */ void Flags_SetAllTreasure(PlayState* play, s32 flag) { play->actorCtx.sceneFlags.chest = flag; } /** - * Returns all the chest flags. + * Returns all the current scene chest flags. */ s32 Flags_GetAllTreasure(PlayState* play) { return play->actorCtx.sceneFlags.chest; } /** - * Tests if current scene clear flag is set. + * Tests if a current scene clear flag is set. */ s32 Flags_GetClear(PlayState* play, s32 roomNumber) { return play->actorCtx.sceneFlags.clearedRoom & (1 << roomNumber); } /** - * Sets current scene clear flag. + * Sets a current scene clear flag. */ void Flags_SetClear(PlayState* play, s32 roomNumber) { play->actorCtx.sceneFlags.clearedRoom |= (1 << roomNumber); } /** - * Unsets current scene clear flag. + * Unsets a current scene clear flag. */ void Flags_UnsetClear(PlayState* play, s32 roomNumber) { play->actorCtx.sceneFlags.clearedRoom &= ~(1 << roomNumber); } /** - * Tests if current scene temp clear flag is set. + * Tests if a current scene temp clear flag is set. */ s32 Flags_GetClearTemp(PlayState* play, s32 roomNumber) { return play->actorCtx.sceneFlags.clearedRoomTemp & (1 << roomNumber); } /** - * Sets current scene temp clear flag. + * Sets a current scene temp clear flag. */ void Flags_SetClearTemp(PlayState* play, s32 roomNumber) { play->actorCtx.sceneFlags.clearedRoomTemp |= (1 << roomNumber); } /** - * Unsets current scene temp clear flag. + * Unsets a current scene temp clear flag. */ void Flags_UnsetClearTemp(PlayState* play, s32 roomNumber) { play->actorCtx.sceneFlags.clearedRoomTemp &= ~(1 << roomNumber); } /** - * Tests if current scene collectible flag is set. + * Tests if a current scene collectible flag is set. */ s32 Flags_GetCollectible(PlayState* play, s32 flag) { if ((flag > 0) && (flag < 0x80)) { @@ -833,7 +833,7 @@ s32 Flags_GetCollectible(PlayState* play, s32 flag) { } /** - * Sets current scene collectible flag. + * Sets a current scene collectible flag. */ void Flags_SetCollectible(PlayState* play, s32 flag) { if ((flag > 0) && (flag < 0x80)) { diff --git a/src/code/z_en_item00.c b/src/code/z_en_item00.c index 55ab1a708..f9f5df5a8 100644 --- a/src/code/z_en_item00.c +++ b/src/code/z_en_item00.c @@ -1,4 +1,5 @@ #include "global.h" +#include "overlays/actors/ovl_En_Elforg/z_en_elforg.h" #include "objects/gameplay_keep/gameplay_keep.h" #include "objects/object_gi_hearts/object_gi_hearts.h" #include "overlays/actors/ovl_En_Elf/z_en_elf.h" @@ -935,9 +936,9 @@ Actor* Item_DropCollectible(PlayState* play, Vec3f* spawnPos, u32 params) { SoundSource_PlaySfxAtFixedWorldPos(play, spawnPos, 40, NA_SE_EV_BUTTERFRY_TO_FAIRY); } } else { - spawnedActor = - Actor_Spawn(&play->actorCtx, play, ACTOR_EN_ELFORG, spawnPos->x, spawnPos->y + 40.0f, spawnPos->z, 0, 0, - 0, STRAY_FAIRY_PARAMS(((param7F00 >> 8) & 0x7F), 0, STRAY_FAIRY_TYPE_COLLECTIBLE)); + spawnedActor = Actor_Spawn( + &play->actorCtx, play, ACTOR_EN_ELFORG, spawnPos->x, spawnPos->y + 40.0f, spawnPos->z, 0, 0, 0, + STRAY_FAIRY_PARAMS((param7F00 >> 8) & 0x7F, STRAY_FAIRY_AREA_CLOCK_TOWN, STRAY_FAIRY_TYPE_COLLECTIBLE)); if (param20000 == 0) { if (!Flags_GetCollectible(play, (param7F00 >> 8) & 0x7F)) { SoundSource_PlaySfxAtFixedWorldPos(play, spawnPos, 40, NA_SE_EV_BUTTERFRY_TO_FAIRY); @@ -993,9 +994,9 @@ Actor* Item_DropCollectible2(PlayState* play, Vec3f* spawnPos, s32 params) { spawnedActor = Actor_Spawn(&play->actorCtx, play, ACTOR_EN_ELF, spawnPos->x, spawnPos->y + 40.0f, spawnPos->z, 0, 0, 0, FAIRY_PARAMS(FAIRY_TYPE_2, true, param7F00 >> 8)); } else { - spawnedActor = - Actor_Spawn(&play->actorCtx, play, ACTOR_EN_ELFORG, spawnPos->x, spawnPos->y + 40.0f, spawnPos->z, 0, 0, - 0, STRAY_FAIRY_PARAMS(((param7F00 >> 8) & 0x7F), 0, STRAY_FAIRY_TYPE_COLLECTIBLE)); + spawnedActor = Actor_Spawn( + &play->actorCtx, play, ACTOR_EN_ELFORG, spawnPos->x, spawnPos->y + 40.0f, spawnPos->z, 0, 0, 0, + STRAY_FAIRY_PARAMS((param7F00 >> 8) & 0x7F, STRAY_FAIRY_AREA_CLOCK_TOWN, STRAY_FAIRY_TYPE_COLLECTIBLE)); } if (Flags_GetCollectible(play, (param7F00 >> 8) & 0x7F) == 0) { SoundSource_PlaySfxAtFixedWorldPos(play, spawnPos, 40, NA_SE_EV_BUTTERFRY_TO_FAIRY); diff --git a/src/code/z_sram_NES.c b/src/code/z_sram_NES.c index 8d382e5db..c5fe03475 100644 --- a/src/code/z_sram_NES.c +++ b/src/code/z_sram_NES.c @@ -97,7 +97,8 @@ u16 sPersistentCycleWeekEventRegs[ARRAY_COUNT(gSaveContext.save.saveInfo.weekEve /* 20 */ 0, /* 21 */ 0, /* 22 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_22_02) | PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_22_80), - /* 23 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_23_02) | PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_23_80), + /* 23 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_OBTAINED_GREAT_SPIN_ATTACK) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_23_80), /* 24 */ PERSISTENT_WEEKEVENTREG_ALT(WEEKEVENTREG_24_02) | PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_24_80), /* 25 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_25_01), /* 26 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_26_40), diff --git a/src/overlays/actors/ovl_Bg_Dy_Yoseizo/z_bg_dy_yoseizo.c b/src/overlays/actors/ovl_Bg_Dy_Yoseizo/z_bg_dy_yoseizo.c index 332e4e543..404530342 100644 --- a/src/overlays/actors/ovl_Bg_Dy_Yoseizo/z_bg_dy_yoseizo.c +++ b/src/overlays/actors/ovl_Bg_Dy_Yoseizo/z_bg_dy_yoseizo.c @@ -5,6 +5,7 @@ */ #include "z_bg_dy_yoseizo.h" +#include "overlays/actors/ovl_Demo_Effect/z_demo_effect.h" #define FLAGS (ACTOR_FLAG_10 | ACTOR_FLAG_20 | ACTOR_FLAG_2000000) @@ -13,19 +14,17 @@ void BgDyYoseizo_Init(Actor* thisx, PlayState* play); void BgDyYoseizo_Destroy(Actor* thisx, PlayState* play); void BgDyYoseizo_Update(Actor* thisx, PlayState* play); +void BgDyYoseizo_Draw(Actor* thisx, PlayState* play); -void func_80A0AE1C(BgDyYoseizo* this, PlayState* play); -void func_80A0B078(BgDyYoseizo* this, PlayState* play); void func_80A0B184(BgDyYoseizo* this, PlayState* play); -void func_80A0B290(BgDyYoseizo* this, PlayState* play); -void func_80A0B35C(BgDyYoseizo* this, PlayState* play); -void func_80A0B500(BgDyYoseizo* this, PlayState* play); -void func_80A0B5F0(BgDyYoseizo* this, PlayState* play); -void func_80A0B75C(BgDyYoseizo* this, PlayState* play); -void func_80A0B8CC(BgDyYoseizo* this, PlayState* play); void func_80A0BB08(BgDyYoseizo* this, PlayState* play); -#if 0 +/* Effects functions */ +void BgDyYoseizo_SpawnEffect(BgDyYoseizo* this, Vec3f* initPos, Vec3f* initVelocity, Vec3f* accel, + Color_RGB8* primColor, Color_RGB8* envColor, f32 scale, s16 life, s16 type); +void BgDyYoseizo_UpdateEffects(BgDyYoseizo* this, PlayState* play); +void BgDyYoseizo_DrawEffects(BgDyYoseizo* this, PlayState* play); + ActorInit Bg_Dy_Yoseizo_InitVars = { ACTOR_BG_DY_YOSEIZO, ACTORCAT_PROP, @@ -38,56 +37,730 @@ ActorInit Bg_Dy_Yoseizo_InitVars = { (ActorFunc)NULL, }; -#endif +typedef enum GreatFairyAnimation { + /* 0 */ GREATFAIRY_ANIM_START_GIVING_UPGRADE, + /* 1 */ GREATFAIRY_ANIM_GIVING_UPGRADE, + /* 2 */ GREATFAIRY_ANIM_SPIN_LAY_DOWN, + /* 3 */ GREATFAIRY_ANIM_LAY_DOWN_TRANSITION, + /* 4 */ GREATFAIRY_ANIM_LAYING_DOWN, + /* 5 */ GREATFAIRY_ANIM_SHOWING_ITEM, + /* 6 */ GREATFAIRY_ANIM_ARMS_FOLDED, + /* 7 */ GREATFAIRY_ANIM_CLAPPING, + /* 8 */ GREATFAIRY_ANIM_TEACH_SPIN_ATTACK, + /* 9 */ GREATFAIRY_ANIM_MAX +} GreatFairyAnimation; -extern UNK_TYPE D_06008090; -extern UNK_TYPE D_0600D228; -extern UNK_TYPE D_0601C6F4; +static AnimationHeader* sAnimations[GREATFAIRY_ANIM_MAX] = { + &gGreatFairyStartGivingUpgradeAnim, // GREATFAIRY_ANIM_START_GIVING_UPGRADE + &gGreatFairyGivingUpgradeAnim, // GREATFAIRY_ANIM_GIVING_UPGRADE + &gGreatFairySpinLayDownAnim, // GREATFAIRY_ANIM_SPIN_LAY_DOWN + &gGreatFairyLayDownTransitionAnim, // GREATFAIRY_ANIM_LAY_DOWN_TRANSITION + &gGreatFairyLayingDownAnim, // GREATFAIRY_ANIM_LAYING_DOWN + &gGreatFairyShowingItemAnim, // GREATFAIRY_ANIM_SHOWING_ITEM + &gGreatFairyArmsFoldedAnim, // GREATFAIRY_ANIM_ARMS_FOLDED + &gGreatFairyClappingAnim, // GREATFAIRY_ANIM_CLAPPING + &gGreatFairyTeachSpinAttackAnim, // GREATFAIRY_ANIM_TEACH_SPIN_ATTACK +}; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Dy_Yoseizo/BgDyYoseizo_Init.s") +void BgDyYoseizo_Init(Actor* thisx, PlayState* play) { + BgDyYoseizo* this = THIS; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Dy_Yoseizo/BgDyYoseizo_Destroy.s") + this->unk2EC = this->actor.world.pos.y + 40.0f; + this->actor.focus.pos = this->actor.world.pos; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Dy_Yoseizo/func_80A0A96C.s") + SkelAnime_InitFlex(play, &this->skelAnime, &gGreatFairySkel, &gGreatFairyShowingItemAnim, this->jointTable, + this->morphTable, GREAT_FAIRY_LIMB_MAX); -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Dy_Yoseizo/func_80A0A9E4.s") + this->actionFunc = func_80A0BB08; + Actor_SetScale(&this->actor, 0.0f); + this->eyeIndex = 0; + this->mouthIndex = 0; + this->blinkTimer = 0; + this->unk2F8 = 0; + GREAT_FAIRY_ROTZ(&this->actor) = 1; + this->unk302 = 0; +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Dy_Yoseizo/func_80A0AA40.s") +void BgDyYoseizo_Destroy(Actor* thisx, PlayState* play) { +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Dy_Yoseizo/func_80A0AD50.s") +// Has no visible effect since no segment is set for manually-controllable eye textures +void BgDyYoseizo_UpdateEyes(BgDyYoseizo* this) { + if (this->blinkTimer != 0) { + this->blinkTimer--; + } -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Dy_Yoseizo/func_80A0AE1C.s") + if (this->blinkTimer == 0) { + this->eyeIndex++; + if (this->eyeIndex >= 3) { + this->eyeIndex = 0; + this->blinkTimer = (s32)Rand_ZeroFloat(60.0f) + 20; + } + } +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Dy_Yoseizo/func_80A0AFDC.s") +void BgDyYoseizo_Bob(BgDyYoseizo* this, PlayState* play) { + this->actor.shape.yOffset = Math_SinS(play->gameplayFrames * 1000) * 15.0f; +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Dy_Yoseizo/func_80A0B078.s") +typedef enum GreatFairyEffectTrajectory { + /* 0 */ GREAT_FAIRY_EFFECT_TRAJECTORY_RADIANT, // Dispersing particles, in the Great Fairy's signature colour. + /* 2 */ GREAT_FAIRY_EFFECT_TRAJECTORY_FAST_RADIANT = 2, // As above, but initially move 10 times faster. + /* 5 */ GREAT_FAIRY_EFFECT_TRAJECTORY_CONVERGE_ON_PLAYER = 5 // Similar to OoT's healing effect, fixed colour. +} GreatFairyEffectTrajectory; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Dy_Yoseizo/func_80A0B184.s") +/** + * Spawn particle effects; see `GreatFairyEffectTrajectory` enum for details + * + * @param trajectoryType use the `GreatFairyEffectTrajectory` enum. + * @param count number to spawn. + */ +void BgDyYoseizo_SpawnEffects(BgDyYoseizo* this, s16 trajectoryType, s32 count) { + static Color_RGB8 sEffectPrimColors[] = { + { 255, 235, 220 }, // Magic + { 255, 220, 220 }, // Power + { 220, 255, 220 }, // Wisdom + { 220, 220, 255 }, // Courage + { 255, 255, 200 }, // Kindness + { 255, 255, 170 }, // GREAT_FAIRY_EFFECT_TRAJECTORY_CONVERGE_ON_PLAYER + }; + static Color_RGB8 sEffectEnvColors[] = { + { 255, 150, 0 }, // Magic + { 255, 0, 0 }, // Power + { 0, 255, 0 }, // Wisdom + { 0, 0, 255 }, // Courage + { 255, 255, 0 }, // Kindness + { 255, 100, 255 }, // GREAT_FAIRY_EFFECT_TRAJECTORY_CONVERGE_ON_PLAYER + }; + Vec3f velocity; + Vec3f accel; + Vec3f pos; + Color_RGB8 primColor; + Color_RGB8 envColor; + f32 spawnHeightVariation; + f32 scale; + s32 effectType; + s32 life; + s32 i; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Dy_Yoseizo/func_80A0B290.s") + if (this->actor.scale.y < 0.01f) { + return; + } -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Dy_Yoseizo/func_80A0B35C.s") + spawnHeightVariation = this->actor.scale.y * 3500.0f; + accel.x = Rand_ZeroOne() - 0.5f; + accel.y = Rand_ZeroOne() - 0.5f; + accel.z = Rand_ZeroOne() - 0.5f; + velocity.x = accel.x * 10.0f; + velocity.y = accel.y * 10.0f; + velocity.z = accel.z * 10.0f; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Dy_Yoseizo/func_80A0B500.s") + for (i = 0; i < count; i++) { + switch (trajectoryType) { + case GREAT_FAIRY_EFFECT_TRAJECTORY_FAST_RADIANT: + scale = 1.0f; + life = 90; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Dy_Yoseizo/func_80A0B5F0.s") + velocity.x = accel.x * 100.0f; + velocity.y = accel.y * 100.0f; + velocity.z = accel.z * 100.0f; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Dy_Yoseizo/func_80A0B75C.s") + effectType = GREAT_FAIRY_GET_TYPE(&this->actor); -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Dy_Yoseizo/func_80A0B834.s") + pos.x = this->actor.world.pos.x; + pos.y = this->actor.world.pos.y + spawnHeightVariation + + (Rand_ZeroOne() - 0.5f) * (spawnHeightVariation * 0.5f); + pos.z = this->actor.world.pos.z + 30.0f; + break; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Dy_Yoseizo/func_80A0B8CC.s") + case GREAT_FAIRY_EFFECT_TRAJECTORY_RADIANT: + scale = 1.0f; + life = 90; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Dy_Yoseizo/func_80A0BB08.s") + effectType = GREAT_FAIRY_GET_TYPE(&this->actor); -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Dy_Yoseizo/BgDyYoseizo_Update.s") + pos.x = this->actor.world.pos.x; + pos.y = this->actor.world.pos.y + spawnHeightVariation + + (Rand_ZeroOne() - 0.5f) * (spawnHeightVariation * 0.5f); + pos.z = this->actor.world.pos.z + 30.0f; + break; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Dy_Yoseizo/func_80A0BCD8.s") + default: // all become convergent type + scale = 0.2f; + life = 50; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Dy_Yoseizo/func_80A0BD40.s") + effectType = GREAT_FAIRY_EFFECT_TRAJECTORY_CONVERGE_ON_PLAYER; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Dy_Yoseizo/func_80A0BE60.s") + pos.x = Rand_CenteredFloat(10.0f) + this->actor.world.pos.x; + pos.y = this->actor.world.pos.y + spawnHeightVariation + 50.0f + + (Rand_ZeroOne() - 0.5f) * (spawnHeightVariation * 0.1f); + pos.z = this->actor.world.pos.z + 30.0f; + break; + } -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Dy_Yoseizo/func_80A0BF70.s") + primColor.r = sEffectPrimColors[effectType].r; + primColor.g = sEffectPrimColors[effectType].g; + primColor.b = sEffectPrimColors[effectType].b; + envColor.r = sEffectEnvColors[effectType].r; + envColor.g = sEffectEnvColors[effectType].g; + envColor.b = sEffectEnvColors[effectType].b; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Dy_Yoseizo/func_80A0C270.s") + BgDyYoseizo_SpawnEffect(this, &pos, &velocity, &accel, &primColor, &envColor, scale, life, effectType); + } +} + +void func_80A0AD50(BgDyYoseizo* this) { + f32 scale = this->actor.scale.x; + f32 heightTarget = this->actor.home.pos.y + 40.0f; + + Math_ApproachF(&this->actor.world.pos.y, heightTarget, this->unk2F0, 100.0f); + Math_ApproachF(&scale, 0.035f, this->unk2F4, 0.005f); + Math_ApproachF(&this->unk2F0, 0.8f, 0.1f, 0.02f); + Math_ApproachF(&this->unk2F4, 0.2f, 0.03f, 0.05f); + BgDyYoseizo_SpawnEffects(this, GREAT_FAIRY_EFFECT_TRAJECTORY_RADIANT, 2); + Actor_SetScale(&this->actor, scale); +} + +void func_80A0AE1C(BgDyYoseizo* this, PlayState* play) { + f32 scale = this->actor.scale.x; + f32 heightTarget = this->actor.home.pos.y; + + if (scale < 0.003f) { + this->actionFunc = func_80A0BB08; + Actor_SetScale(&this->actor, 0.0f); + this->unk2F0 = 0.0f; + this->unk2F4 = 0.0f; + this->unk2F8 = 0; + + if (GREAT_FAIRY_GET_TYPE(&this->actor) <= GREAT_FAIRY_TYPE_COURAGE) { + Actor_Spawn(&play->actorCtx, play, ACTOR_DEMO_EFFECT, this->actor.world.pos.x, + this->actor.world.pos.y + 20.0f, this->actor.world.pos.z, 0, 0, 0, + GREAT_FAIRY_GET_TYPE(&this->actor) + DEMO_EFFECT_TYPE_LIGHT_BASE); + } else { + Actor_Spawn(&play->actorCtx, play, ACTOR_DEMO_EFFECT, this->actor.world.pos.x, + this->actor.world.pos.y + 20.0f, this->actor.world.pos.z, 0, 0, 0, + DEMO_EFFECT_TYPE_LIGHT_DARK_YELLOW); + } + Audio_PlaySfx(NA_SE_SY_WHITE_OUT_T); + } else { + Math_ApproachF(&this->actor.world.pos.y, heightTarget, this->unk2F0, 100.0f); + Math_ApproachZeroF(&scale, this->unk2F4, 0.005f); + Math_ApproachF(&this->unk2F0, 0.8f, 0.1f, 0.02f); + Math_ApproachF(&this->unk2F4, 0.2f, 0.03f, 0.05f); + + this->actor.shape.rot.y += this->unk2F8; + if (this->unk2F8 < 0x1770) { + this->unk2F8 += 0x12C; + } + + BgDyYoseizo_SpawnEffects(this, GREAT_FAIRY_EFFECT_TRAJECTORY_RADIANT, 2); + Actor_SetScale(&this->actor, scale); + } +} + +void func_80A0AFDC(BgDyYoseizo* this) { + Animation_Change(&this->skelAnime, sAnimations[GREATFAIRY_ANIM_SPIN_LAY_DOWN], 0.0f, 46.0f, + Animation_GetLastFrame(sAnimations[GREATFAIRY_ANIM_SPIN_LAY_DOWN]), ANIMMODE_ONCE, 0.0f); + this->actionFunc = func_80A0AE1C; + Actor_PlaySfx(&this->actor, NA_SE_VO_FR_LAUGH_0); + Actor_PlaySfx(&this->actor, NA_SE_EV_GREAT_FAIRY_VANISH); + this->unk2F8 = 0; + this->actor.velocity.y = 0.0f; + this->unk2F0 = 0.0f; + this->unk2F4 = 0.0f; + this->actor.shape.yOffset = 0.0f; +} + +void func_80A0B078(BgDyYoseizo* this, PlayState* play) { + BgDyYoseizo_Bob(this, play); + SkelAnime_Update(&this->skelAnime); + + if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_103) && + (play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_103)]->id == 7)) { + Animation_Change(&this->skelAnime, sAnimations[GREATFAIRY_ANIM_LAYING_DOWN], 1.0f, 0.0f, + Animation_GetLastFrame(sAnimations[GREATFAIRY_ANIM_LAYING_DOWN]), ANIMMODE_LOOP, 0.0f); + this->actionFunc = func_80A0B184; + } else if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_103) && + (play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_103)]->id == 6)) { + func_80A0AFDC(this); + } +} + +void func_80A0B184(BgDyYoseizo* this, PlayState* play) { + BgDyYoseizo_Bob(this, play); + SkelAnime_Update(&this->skelAnime); + + if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_103) && + (play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_103)]->id == 8)) { + Animation_Change(&this->skelAnime, sAnimations[GREATFAIRY_ANIM_SHOWING_ITEM], 1.0f, 0.0f, + Animation_GetLastFrame(sAnimations[GREATFAIRY_ANIM_SHOWING_ITEM]), ANIMMODE_LOOP, 0.0f); + this->actionFunc = func_80A0B078; + } else if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_103) && + (play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_103)]->id == 6)) { + func_80A0AFDC(this); + } +} + +void func_80A0B290(BgDyYoseizo* this, PlayState* play) { + BgDyYoseizo_Bob(this, play); + SkelAnime_Update(&this->skelAnime); + + if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_103) && + (play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_103)]->id == 7)) { + Animation_Change(&this->skelAnime, sAnimations[GREATFAIRY_ANIM_LAYING_DOWN], 1.0f, 0.0f, + Animation_GetLastFrame(sAnimations[GREATFAIRY_ANIM_LAYING_DOWN]), ANIMMODE_LOOP, -10.0f); + this->actionFunc = func_80A0B184; + this->mouthIndex = 0; + } +} + +void func_80A0B35C(BgDyYoseizo* this, PlayState* play) { + BgDyYoseizo_Bob(this, play); + SkelAnime_Update(&this->skelAnime); + + if (this->timer == 60) { + if (!Flags_GetSwitch(play, GREAT_FAIRY_GET_SWITCHFLAG(&this->actor))) { + switch (GREAT_FAIRY_GET_TYPE(&this->actor)) { + case GREAT_FAIRY_TYPE_MAGIC: + if (gSaveContext.save.saveInfo.playerData.isMagicAcquired != true) { + gSaveContext.save.saveInfo.playerData.isMagicAcquired = true; + gSaveContext.magicFillTarget = MAGIC_NORMAL_METER; + } + break; + + case GREAT_FAIRY_TYPE_WISDOM: + if (gSaveContext.save.saveInfo.playerData.isDoubleMagicAcquired != true) { + gSaveContext.save.saveInfo.playerData.isDoubleMagicAcquired = true; + gSaveContext.magicFillTarget = MAGIC_DOUBLE_METER; + gSaveContext.save.saveInfo.playerData.magicLevel = 0; + } + break; + + case GREAT_FAIRY_TYPE_COURAGE: + if (gSaveContext.save.saveInfo.playerData.doubleDefense != true) { + gSaveContext.save.saveInfo.playerData.doubleDefense = true; + } + break; + + default: + break; + } + } + Interface_SetHudVisibility(9); + } + + if ((this->timer < 50) && (GREAT_FAIRY_GET_TYPE(&this->actor) == GREAT_FAIRY_TYPE_COURAGE)) { + if (gSaveContext.save.saveInfo.inventory.defenseHearts < 20) { + gSaveContext.save.saveInfo.inventory.defenseHearts++; + } + } + + if (this->timer == 50) { + gSaveContext.healthAccumulator = 0x140; + Magic_Add(play, MAGIC_FILL_TO_CAPACITY); + } + + if (this->timer == 0) { + this->beam->trigger = true; + this->actionFunc = func_80A0B290; + } +} + +void func_80A0B500(BgDyYoseizo* this, PlayState* play) { + Player* player = GET_PLAYER(play); + + BgDyYoseizo_Bob(this, play); + + if (SkelAnime_Update(&this->skelAnime)) { + Vec3f pos; + + Animation_Change(&this->skelAnime, sAnimations[GREATFAIRY_ANIM_GIVING_UPGRADE], 1.0f, 0.0f, + Animation_GetLastFrame(sAnimations[GREATFAIRY_ANIM_GIVING_UPGRADE]), ANIMMODE_LOOP, 0.0f); + this->actionFunc = func_80A0B35C; + pos.x = player->actor.world.pos.x; + pos.y = player->actor.world.pos.y + 200.0f; + pos.z = player->actor.world.pos.z; + this->beam = (EnDyExtra*)Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, ACTOR_EN_DY_EXTRA, pos.x, + pos.y, pos.z, 0, 0, 0, GREAT_FAIRY_GET_TYPE(&this->actor)); + this->timer = 120; + } +} + +void func_80A0B5F0(BgDyYoseizo* this, PlayState* play) { + BgDyYoseizo_Bob(this, play); + + if (SkelAnime_Update(&this->skelAnime)) { + Animation_Change(&this->skelAnime, sAnimations[GREATFAIRY_ANIM_LAYING_DOWN], 1.0f, 0.0f, + Animation_GetLastFrame(sAnimations[GREATFAIRY_ANIM_LAYING_DOWN]), ANIMMODE_LOOP, 0.0f); + } + + if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_103) && + (play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_103)]->id == 5)) { + Animation_Change(&this->skelAnime, sAnimations[GREATFAIRY_ANIM_START_GIVING_UPGRADE], 1.0f, 0.0f, + Animation_GetLastFrame(sAnimations[GREATFAIRY_ANIM_START_GIVING_UPGRADE]), ANIMMODE_ONCE, + -5.0f); + Actor_PlaySfx(&this->actor, NA_SE_VO_FR_SMILE_0); + this->mouthIndex = 1; + this->eyeIndex = 0; + this->actionFunc = func_80A0B500; + } + + if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_103) && + (play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_103)]->id == 6)) { + func_80A0AFDC(this); + } + + BgDyYoseizo_UpdateEyes(this); +} + +void func_80A0B75C(BgDyYoseizo* this, PlayState* play) { + func_80A0AD50(this); + SkelAnime_Update(&this->skelAnime); + + if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_103) && + (play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_103)]->id == 4)) { + this->actor.shape.rot.y = 0; + this->actionFunc = func_80A0B5F0; + Animation_Change(&this->skelAnime, sAnimations[GREATFAIRY_ANIM_LAY_DOWN_TRANSITION], 1.0f, 2.0f, + Animation_GetLastFrame(sAnimations[GREATFAIRY_ANIM_LAY_DOWN_TRANSITION]), ANIMMODE_ONCE, 0.0f); + Actor_PlaySfx(&this->actor, NA_SE_VO_FR_SMILE_0); + this->unk2F8 = 0; + } +} + +void func_80A0B834(BgDyYoseizo* this) { + this->actor.draw = BgDyYoseizo_Draw; + Animation_Change(&this->skelAnime, sAnimations[GREATFAIRY_ANIM_SPIN_LAY_DOWN], 1.0f, 0.0f, + Animation_GetLastFrame(sAnimations[GREATFAIRY_ANIM_SPIN_LAY_DOWN]), ANIMMODE_ONCE, 0.0f); + Actor_PlaySfx(&this->actor, NA_SE_VO_FR_LAUGH_0); + Actor_PlaySfx(&this->actor, NA_SE_EV_GREAT_FAIRY_APPEAR); + BgDyYoseizo_SpawnEffects(this, GREAT_FAIRY_EFFECT_TRAJECTORY_FAST_RADIANT, 30); +} + +void BgDyYoseizo_TrainPlayer(BgDyYoseizo* this, PlayState* play) { + s16 csId; + s32 pad; + Player* player = GET_PLAYER(play); + + SkelAnime_Update(&this->skelAnime); + + csId = 0; + if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_103)) { + csId = play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_103)]->id; + Cutscene_ActorTranslateAndYaw(&this->actor, play, Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_103)); + } else { + if (GREAT_FAIRY_ROTZ(&this->actor) != 0) { + this->actor.home.pos.x = player->actor.world.pos.x; + this->actor.home.pos.z = player->actor.world.pos.z; + GREAT_FAIRY_ROTZ(&this->actor) = 0; + } else { + player->actor.world.pos.x = this->actor.home.pos.x; + player->actor.world.pos.z = this->actor.home.pos.z; + } + + if (this->unk302 & 1) { + if (this->timer == 0) { + if (CutsceneManager_IsNext(this->actor.csId)) { + CutsceneManager_StartWithPlayerCs(this->actor.csId, &this->actor); + this->unk302 &= ~1; + } else { + CutsceneManager_Queue(this->actor.csId); + } + } + } else if (!(this->unk302 & 2) && (player->meleeWeaponState != 0)) { + if (player->meleeWeaponAnimation >= PLAYER_MWA_SPIN_ATTACK_1H) { + if (player->unk_B08 >= 0.85f) { + this->unk302 |= 1; + this->unk302 |= 2; + if (play->msgCtx.currentTextId == 0x59A) { + Message_CloseTextbox(play); + } + this->timer = 20; + return; + } + } + + if (play->msgCtx.currentTextId != 0x59A) { + // "Hold B and then release" + Message_StartTextbox(play, 0x59A, &this->actor); + } + } + } + + if (csId != this->csId) { + switch (csId) { + case 9: + Animation_PlayLoop(&this->skelAnime, sAnimations[GREATFAIRY_ANIM_ARMS_FOLDED]); + break; + + case 10: + Animation_PlayLoop(&this->skelAnime, sAnimations[GREATFAIRY_ANIM_CLAPPING]); + break; + + case 11: + Animation_PlayOnce(&this->skelAnime, sAnimations[GREATFAIRY_ANIM_TEACH_SPIN_ATTACK]); + break; + + default: + break; + } + + this->csId = csId; + } +} + +// Choose behaviour? +void func_80A0BB08(BgDyYoseizo* this, PlayState* play) { + if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_103) && + (play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_103)]->id == 2)) { + func_80A0B834(this); + this->actionFunc = func_80A0B75C; + } + + if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_103) && + (play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_103)]->id == 7)) { + this->actor.draw = BgDyYoseizo_Draw; + Animation_PlayLoop(&this->skelAnime, sAnimations[GREATFAIRY_ANIM_LAYING_DOWN]); + this->actionFunc = func_80A0B184; + this->mouthIndex = 0; + this->actor.world.pos.y = this->actor.home.pos.y + 40.0f; + Actor_SetScale(&this->actor, 0.035f); + this->unk2F8 = 0; + } + + if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_103) && + (play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_103)]->id == 9)) { + Actor_SetScale(&this->actor, 0.01f); + Animation_PlayLoop(&this->skelAnime, sAnimations[GREATFAIRY_ANIM_ARMS_FOLDED]); + this->csId = 9; + this->actionFunc = BgDyYoseizo_TrainPlayer; + this->actor.draw = BgDyYoseizo_Draw; + } +} + +void BgDyYoseizo_Update(Actor* thisx, PlayState* play) { + BgDyYoseizo* this = THIS; + + this->actionFunc(this, play); + Actor_MoveWithGravity(&this->actor); + + DECR(this->timer); + + BgDyYoseizo_UpdateEffects(this, play); +} + +s32 BgDyYoseizo_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) { + BgDyYoseizo* this = THIS; + + if (limbIndex == GREAT_FAIRY_LIMB_TORSO) { + rot->x += this->torsoRot.y; + } + + if (limbIndex == GREAT_FAIRY_LIMB_HEAD) { + rot->x += this->headRot.y; + rot->z += this->headRot.z; + } + + return false; +} + +/* Colour and shape of eyebrows, hair colour. */ +typedef enum GreatFairyAppearance { + /* 0 */ GREAT_FAIRY_APPEARANCE_MAGIC, // Orange + /* 1 */ GREAT_FAIRY_APPEARANCE_WISDOM, // Green + /* 2 */ GREAT_FAIRY_APPEARANCE_POWER, // Pink + /* 3 */ GREAT_FAIRY_APPEARANCE_COURAGE, // Purple + /* 4 */ GREAT_FAIRY_APPEARANCE_KINDNESS // Yellow +} GreatFairyAppearance; + +void BgDyYoseizo_Draw(Actor* thisx, PlayState* play) { + static TexturePtr sMouthTextures[] = { + gGreatFairyMouthClosedTex, + gGreatFairyMouthOpenTex, + }; + BgDyYoseizo* this = THIS; + GreatFairyAppearance appearance = GREAT_FAIRY_APPEARANCE_MAGIC; + + // The differing eyes and hair colours + switch (GREAT_FAIRY_GET_TYPE(&this->actor)) { + case GREAT_FAIRY_TYPE_POWER: + appearance = GREAT_FAIRY_APPEARANCE_POWER; + break; + + case GREAT_FAIRY_TYPE_WISDOM: + appearance = GREAT_FAIRY_APPEARANCE_WISDOM; + break; + + case GREAT_FAIRY_TYPE_COURAGE: + case GREAT_FAIRY_TYPE_KINDNESS: + appearance = GREAT_FAIRY_GET_TYPE(&this->actor); + break; + + default: // GREAT_FAIRY_APPEARANCE_MAGIC + break; + } + + OPEN_DISPS(play->state.gfxCtx); + + Gfx_SetupDL25_Opa(play->state.gfxCtx); + + // Set eyes and hair colour, not actually animated. + AnimatedMat_DrawStepOpa(play, Lib_SegmentedToVirtual(gGreatFairyAppearenceTexAnim), appearance); + + // Draw mouth + { + Gfx* gfx = POLY_OPA_DISP; + s16 index = this->mouthIndex; + TexturePtr mouthTex = Lib_SegmentedToVirtual(sMouthTextures[index]); + + gSPSegment(&gfx[0], 0x09, mouthTex); + POLY_OPA_DISP = &gfx[1]; + } + + SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount, + BgDyYoseizo_OverrideLimbDraw, NULL, &this->actor); + + CLOSE_DISPS(play->state.gfxCtx); + + BgDyYoseizo_DrawEffects(this, play); +} + +/* Effects functions */ + +void BgDyYoseizo_SpawnEffect(BgDyYoseizo* this, Vec3f* initPos, Vec3f* initVelocity, Vec3f* accel, + Color_RGB8* primColor, Color_RGB8* envColor, f32 scale, s16 life, s16 type) { + BgDyYoseizoEffect* effect = this->effects; + s16 i; + + for (i = 0; i < BG_DY_YOSEIZO_EFFECT_COUNT; i++, effect++) { + if (!effect->alive) { + effect->alive = true; + effect->pos = *initPos; + effect->velocity = *initVelocity; + effect->accel = *accel; + effect->primColor = *primColor; + effect->alpha = 0; + effect->envColor = *envColor; + effect->scale = scale; + effect->timer = life; + effect->type = type; + effect->pitch = 0; + effect->yaw = TRUNCF_BINANG(Rand_CenteredFloat(30000.0f)); + effect->roll = 0; + return; + } + } +} + +void BgDyYoseizo_UpdateEffects(BgDyYoseizo* this, PlayState* play) { + BgDyYoseizoEffect* effect = this->effects; + Player* player = GET_PLAYER(play); + Vec3f sp94; + Vec3f sp88; + s32 pad[2]; + f32 targetPitch; + f32 targetYaw; + f32 floatAngle; + s16 i = 0; + + for (i = 0; i < BG_DY_YOSEIZO_EFFECT_COUNT; i++, effect++) { + if (effect->alive) { + effect->roll += 3000; + + if (effect->type < GREAT_FAIRY_EFFECT_TRAJECTORY_CONVERGE_ON_PLAYER) { + effect->pos.x += effect->velocity.x; + effect->pos.y += effect->velocity.y; + effect->pos.z += effect->velocity.z; + effect->velocity.x += effect->accel.x; + effect->velocity.y += effect->accel.y; + effect->velocity.z += effect->accel.z; + } else { + Actor_PlaySfx(&this->actor, NA_SE_EV_HEALING - SFX_FLAG); + + sp94 = player->actor.world.pos; + sp94.y = player->actor.world.pos.y - 150.0f; + sp94.z = player->actor.world.pos.z - 50.0f; + + targetPitch = Math_Vec3f_Pitch(&effect->pos, &sp94); + targetYaw = Math_Vec3f_Yaw(&effect->pos, &sp94); + + floatAngle = effect->pitch; + Math_ApproachF(&floatAngle, targetPitch, 0.9f, 5000.0f); + effect->pitch = floatAngle; + + floatAngle = effect->yaw; + Math_ApproachF(&floatAngle, targetYaw, 0.9f, 5000.0f); + effect->yaw = floatAngle; + + Matrix_Push(); + Matrix_RotateYS(effect->yaw, MTXMODE_NEW); + Matrix_RotateXS(effect->pitch, MTXMODE_APPLY); + + sp94.x = sp94.y = sp94.z = 3.0f; + + Matrix_MultVec3f(&sp94, &sp88); + Matrix_Pop(); + effect->pos.x += sp88.x; + effect->pos.y += sp88.y; + effect->pos.z += sp88.z; + } + } + + // fade up, fade down, vanish and reset + if (effect->timer != 0) { + effect->timer--; + effect->alpha += 30; + + if (effect->alpha > 255) { + effect->alpha = 255; + } + } else { + effect->alpha -= 30; + + if (effect->alpha <= 0) { + effect->alpha = 0; + effect->alive = false; + } + } + } +} + +void BgDyYoseizo_DrawEffects(BgDyYoseizo* this, PlayState* play) { + static f32 sStretchFactors[] = { + 1.0f, 1.1f, 1.15f, 1.1f, 1.0f, 0.9f, 0.85f, 0.9f, + }; + GraphicsContext* gfxCtx = play->state.gfxCtx; + u8 setup = 0; + BgDyYoseizoEffect* effect = this->effects; + f32 stretchFactor = sStretchFactors[play->gameplayFrames % ARRAY_COUNT(sStretchFactors)]; + s16 i; + + OPEN_DISPS(gfxCtx); + + Gfx_SetupDL25_Xlu(play->state.gfxCtx); + + for (i = 0; i < BG_DY_YOSEIZO_EFFECT_COUNT; i++, effect++) { + if (effect->alive == true) { + if (setup == 0) { + gSPDisplayList(POLY_XLU_DISP++, gGreatFairyParticleSetupDL); + gDPPipeSync(POLY_XLU_DISP++); + setup++; + } + + gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, effect->primColor.r, effect->primColor.g, effect->primColor.b, + effect->alpha); + gDPSetEnvColor(POLY_XLU_DISP++, effect->envColor.r, effect->envColor.g, effect->envColor.b, 0); + + Matrix_Translate(effect->pos.x, effect->pos.y, effect->pos.z, MTXMODE_NEW); + Matrix_ReplaceRotation(&play->billboardMtxF); + + Matrix_Scale(effect->scale, effect->scale * stretchFactor, 1.0f, MTXMODE_APPLY); + Matrix_RotateZS(effect->roll, MTXMODE_APPLY); + + gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_XLU_DISP++, gGreatFairyParticleDL); + } + } + + CLOSE_DISPS(gfxCtx); +} diff --git a/src/overlays/actors/ovl_Bg_Dy_Yoseizo/z_bg_dy_yoseizo.h b/src/overlays/actors/ovl_Bg_Dy_Yoseizo/z_bg_dy_yoseizo.h index bd06cdb38..4aaf67e77 100644 --- a/src/overlays/actors/ovl_Bg_Dy_Yoseizo/z_bg_dy_yoseizo.h +++ b/src/overlays/actors/ovl_Bg_Dy_Yoseizo/z_bg_dy_yoseizo.h @@ -2,15 +2,65 @@ #define Z_BG_DY_YOSEIZO_H #include "global.h" +#include "overlays/actors/ovl_En_Dy_Extra/z_en_dy_extra.h" +#include "objects/object_dy_obj/object_dy_obj.h" struct BgDyYoseizo; typedef void (*BgDyYoseizoActionFunc)(struct BgDyYoseizo*, PlayState*); +#define GREAT_FAIRY_GET_SWITCHFLAG(thisx) (((thisx)->params & 0xFE00) >> 9) +#define GREAT_FAIRY_GET_TYPE(thisx) ((thisx)->params & 0xF) +#define GREAT_FAIRY_ROTZ(thisx) ((thisx)->home.rot.z) + +typedef enum GreatFairyType { + /* 0 */ GREAT_FAIRY_TYPE_MAGIC, + /* 1 */ GREAT_FAIRY_TYPE_POWER, + /* 2 */ GREAT_FAIRY_TYPE_WISDOM, + /* 3 */ GREAT_FAIRY_TYPE_COURAGE, + /* 4 */ GREAT_FAIRY_TYPE_KINDNESS +} GreatFairyType; + +#define BG_DY_YOSEIZO_EFFECT_COUNT 200 + +typedef struct BgDyYoseizoEffect { + /* 0x00 */ u8 alive; // drawn if 1, respawn if 0 + /* 0x04 */ Vec3f pos; + /* 0x10 */ Vec3f velocity; + /* 0x1C */ Vec3f accel; + /* 0x28 */ Color_RGB8 primColor; + /* 0x2B */ Color_RGB8 envColor; + /* 0x2E */ s16 alpha; + /* 0x30 */ f32 scale; + /* 0x34 */ s16 timer; // lifetime + /* 0x36 */ s16 type; // 0 is general radiance, else is directed towards Player + /* 0x38 */ s16 pitch; + /* 0x3A */ s16 yaw; + /* 0x3C */ s16 roll; // all three are f32 in OoT +} BgDyYoseizoEffect; // size = 0x40 + typedef struct BgDyYoseizo { /* 0x0000 */ Actor actor; /* 0x0144 */ BgDyYoseizoActionFunc actionFunc; - /* 0x0148 */ char unk_148[0x33BC]; + /* 0x0148 */ SkelAnime skelAnime; + /* 0x018C */ Vec3s jointTable[GREAT_FAIRY_LIMB_MAX]; + /* 0x0234 */ Vec3s morphTable[GREAT_FAIRY_LIMB_MAX]; + /* 0x02DC */ Vec3s headRot; + /* 0x02DC */ Vec3s torsoRot; + /* 0x02E8 */ EnDyExtra* beam; + /* 0x02EC */ f32 unk2EC; // unused + /* 0x02F0 */ f32 unk2F0; + /* 0x02F4 */ f32 unk2F4; + /* 0x02F8 */ union { + s16 unk2F8; + s16 csId; // used on BgDyYoseizo_TrainPlayer + }; + /* 0x02FA */ s16 eyeIndex; + /* 0x02FC */ s16 mouthIndex; + /* 0x02FE */ s16 blinkTimer; + /* 0x0300 */ s16 timer; + /* 0x0302 */ u16 unk302; + /* 0x0304 */ BgDyYoseizoEffect effects[BG_DY_YOSEIZO_EFFECT_COUNT]; } BgDyYoseizo; // size = 0x3504 #endif // Z_BG_DY_YOSEIZO_H diff --git a/src/overlays/actors/ovl_Demo_Effect/z_demo_effect.c b/src/overlays/actors/ovl_Demo_Effect/z_demo_effect.c index ca472ccc3..ff88a61db 100644 --- a/src/overlays/actors/ovl_Demo_Effect/z_demo_effect.c +++ b/src/overlays/actors/ovl_Demo_Effect/z_demo_effect.c @@ -16,14 +16,13 @@ void DemoEffect_Init(Actor* thisx, PlayState* play); void DemoEffect_Destroy(Actor* thisx, PlayState* play); void DemoEffect_Update(Actor* thisx, PlayState* play); -void func_808CD940(DemoEffect* this, PlayState* play); -void func_808CD998(DemoEffect* this, PlayState* play); -void func_808CDBDC(DemoEffect* this, PlayState* play); -void func_808CDCEC(DemoEffect* this, PlayState* play); -void func_808CDD70(DemoEffect* this, PlayState* play); -void func_808CDDE0(DemoEffect* this, PlayState* play); -void func_808CDFF8(Actor* thisx, PlayState* play); -void func_808CE078(Actor* thisx, PlayState* play2); +void DemoEffect_WaitForObject(DemoEffect* this, PlayState* play); +void DemoEffect_SetupTimewarp(DemoEffect* this, PlayState* play); +void DemoEffect_StartTimewarp(DemoEffect* this, PlayState* play); +void DemoEffect_ShrinkLight(DemoEffect* this, PlayState* play); +void DemoEffect_ExpandLight(DemoEffect* this, PlayState* play); +void DemoEffect_DrawTimewarp(Actor* thisx, PlayState* play); +void DemoEffect_DrawLight(Actor* thisx, PlayState* play2); ActorInit Demo_Effect_InitVars = { ACTOR_DEMO_EFFECT, @@ -47,8 +46,12 @@ void DemoEffect_Init(Actor* thisx, PlayState* play) { s32 type = DEMO_EFFECT_GET_TYPE(&this->actor); s32 objectIndex; s32 pad2; - Color_RGB8 colors[] = { - { 200, 200, 0 }, { 255, 40, 100 }, { 50, 255, 0 }, { 0, 0, 255 }, { 255, 255, 80 }, + Color_RGB8 lightColors[] = { + { 200, 200, 0 }, // Yellow + { 255, 40, 100 }, // Pink + { 50, 255, 0 }, // Light green + { 0, 0, 255 }, // Blue + { 255, 255, 80 }, // Light Yellow }; if (sEffectTypeObjects[type] == GAMEPLAY_KEEP) { @@ -66,14 +69,14 @@ void DemoEffect_Init(Actor* thisx, PlayState* play) { Actor_SetScale(&this->actor, 0.2f); switch (type) { - case DEMO_EFFECT_TYPE_0: - case DEMO_EFFECT_TYPE_1: + case DEMO_EFFECT_TIMEWARP_TIMEBLOCK_LARGE: + case DEMO_EFFECT_TIMEWARP_TIMEBLOCK_SMALL: this->actor.flags |= ACTOR_FLAG_2000000; - - case DEMO_EFFECT_TYPE_2: - case DEMO_EFFECT_TYPE_3: - this->initDrawFunc = func_808CDFF8; - this->initActionFunc = func_808CD998; + // FALLTHROUGH + case DEMO_EFFECT_TIMEWARP_LIGHTBLOCK_LARGE: + case DEMO_EFFECT_TIMEWARP_LIGHTBLOCK_VERY_LARGE: + this->initDrawFunc = DemoEffect_DrawTimewarp; + this->initActionFunc = DemoEffect_SetupTimewarp; this->envXluColor[0] = 0; this->envXluColor[1] = 100; this->envXluColor[2] = 255; @@ -81,17 +84,17 @@ void DemoEffect_Init(Actor* thisx, PlayState* play) { this->timer = 0; break; - case DEMO_EFFECT_TYPE_4: - case DEMO_EFFECT_TYPE_5: - case DEMO_EFFECT_TYPE_6: - case DEMO_EFFECT_TYPE_7: - case DEMO_EFFECT_TYPE_8: - this->envXluColor[0] = colors[type - 4].r; - this->envXluColor[1] = colors[type - 4].g; - this->envXluColor[2] = colors[type - 4].b; + case DEMO_EFFECT_TYPE_LIGHT_DARK_YELLOW: + case DEMO_EFFECT_TYPE_LIGHT_PINK: + case DEMO_EFFECT_TYPE_LIGHT_GREEN: + case DEMO_EFFECT_TYPE_LIGHT_BLUE: + case DEMO_EFFECT_TYPE_LIGHT_YELLOW: + this->envXluColor[0] = lightColors[type - DEMO_EFFECT_TYPE_LIGHT_BASE].r; + this->envXluColor[1] = lightColors[type - DEMO_EFFECT_TYPE_LIGHT_BASE].g; + this->envXluColor[2] = lightColors[type - DEMO_EFFECT_TYPE_LIGHT_BASE].b; Actor_SetScale(&this->actor, 0.0f); - this->initDrawFunc = func_808CE078; - this->initActionFunc = func_808CDDE0; + this->initDrawFunc = DemoEffect_DrawLight; + this->initActionFunc = DemoEffect_ExpandLight; this->timer = 0; break; @@ -100,17 +103,17 @@ void DemoEffect_Init(Actor* thisx, PlayState* play) { } ActorShape_Init(&this->actor.shape, 0.0f, NULL, 0.0f); - this->actionFunc = func_808CD940; + this->actionFunc = DemoEffect_WaitForObject; } void DemoEffect_Destroy(Actor* thisx, PlayState* play) { DemoEffect* this = THIS; switch (DEMO_EFFECT_GET_TYPE(&this->actor)) { - case DEMO_EFFECT_TYPE_0: - case DEMO_EFFECT_TYPE_1: - case DEMO_EFFECT_TYPE_2: - case DEMO_EFFECT_TYPE_3: + case DEMO_EFFECT_TIMEWARP_TIMEBLOCK_LARGE: + case DEMO_EFFECT_TIMEWARP_TIMEBLOCK_SMALL: + case DEMO_EFFECT_TIMEWARP_LIGHTBLOCK_LARGE: + case DEMO_EFFECT_TIMEWARP_LIGHTBLOCK_VERY_LARGE: SkelCurve_Destroy(play, &this->skelCurve); break; @@ -119,7 +122,7 @@ void DemoEffect_Destroy(Actor* thisx, PlayState* play) { } } -void func_808CD940(DemoEffect* this, PlayState* play) { +void DemoEffect_WaitForObject(DemoEffect* this, PlayState* play) { if (Object_IsLoaded(&play->objectCtx, this->initObjectIndex)) { this->actor.objBankIndex = this->initObjectIndex; this->actor.draw = this->initDrawFunc; @@ -127,41 +130,41 @@ void func_808CD940(DemoEffect* this, PlayState* play) { } } -void func_808CD998(DemoEffect* this, PlayState* play) { +void DemoEffect_SetupTimewarp(DemoEffect* this, PlayState* play) { s32 type = DEMO_EFFECT_GET_TYPE(&this->actor); - if (SkelCurve_Init(play, &this->skelCurve, &object_efc_tw_Skel_0012E8, &object_efc_tw_CurveAnim_000050)) {} + if (SkelCurve_Init(play, &this->skelCurve, &gTimewarpSkel, &gTimewarpAnim)) {} - SkelCurve_SetAnim(&this->skelCurve, &object_efc_tw_CurveAnim_000050, 1.0f, 59.0f, 1.0f, 1.7f); + SkelCurve_SetAnim(&this->skelCurve, &gTimewarpAnim, 1.0f, 59.0f, 1.0f, 1.7f); SkelCurve_Update(play, &this->skelCurve); - this->actionFunc = func_808CDCEC; + this->actionFunc = DemoEffect_StartTimewarp; switch (type) { - case DEMO_EFFECT_TYPE_0: - Actor_SetScale(&this->actor, 0.16800001f); + case DEMO_EFFECT_TIMEWARP_TIMEBLOCK_LARGE: + Actor_SetScale(&this->actor, 168.0f * 0.001f); break; - case DEMO_EFFECT_TYPE_1: - Actor_SetScale(&this->actor, 0.08400001f); + case DEMO_EFFECT_TIMEWARP_TIMEBLOCK_SMALL: + Actor_SetScale(&this->actor, 84.0f * 0.001f); break; - case DEMO_EFFECT_TYPE_2: - Actor_SetScale(&this->actor, 0.16800001f); + case DEMO_EFFECT_TIMEWARP_LIGHTBLOCK_LARGE: + Actor_SetScale(&this->actor, 168.0f * 0.001f); break; - case DEMO_EFFECT_TYPE_3: - Actor_SetScale(&this->actor, 0.28f); + case DEMO_EFFECT_TIMEWARP_LIGHTBLOCK_VERY_LARGE: + Actor_SetScale(&this->actor, 280.0f * 0.001f); break; default: - Actor_SetScale(&this->actor, 0.014f); + Actor_SetScale(&this->actor, 14.0f * 0.001f); break; } } -void func_808CDAD0(f32 alphaScale) { +void DemoEffect_SetPerVertexAlpha(f32 alphaScale) { static u8 sAlphaTypes[] = { 1, 1, 2, 0, 1, 1, 2, 0, 1, 2, 0, 2, 1, 0, 1, 0, 2, 0, 2, 2, 0 }; - Vtx* vtx = Lib_SegmentedToVirtual(object_efc_tw_Vtx_000060); + Vtx* vtx = Lib_SegmentedToVirtual(gTimewarpVtx); s32 i; u8 alphas[3]; @@ -176,7 +179,10 @@ void func_808CDAD0(f32 alphaScale) { } } -void func_808CDBDC(DemoEffect* this, PlayState* play) { +/** + * Shrink and fade linearly for 100 frames then remove. + */ +void DemoEffect_FinishTimewarp(DemoEffect* this, PlayState* play) { s32 type = DEMO_EFFECT_GET_TYPE(&this->actor); f32 scale; f32 alphaScale; @@ -187,19 +193,19 @@ void func_808CDBDC(DemoEffect* this, PlayState* play) { scale = alphaScale * 0.14f; switch (type) { - case DEMO_EFFECT_TYPE_0: + case DEMO_EFFECT_TIMEWARP_TIMEBLOCK_LARGE: scale *= 1.2f; break; - case DEMO_EFFECT_TYPE_1: + case DEMO_EFFECT_TIMEWARP_TIMEBLOCK_SMALL: scale *= 0.6f; break; - case DEMO_EFFECT_TYPE_2: + case DEMO_EFFECT_TIMEWARP_LIGHTBLOCK_LARGE: scale *= 1.2f; break; - case DEMO_EFFECT_TYPE_3: + case DEMO_EFFECT_TIMEWARP_LIGHTBLOCK_VERY_LARGE: scale *= 2.0f; break; @@ -209,25 +215,31 @@ void func_808CDBDC(DemoEffect* this, PlayState* play) { this->actor.scale.x = scale; this->actor.scale.z = scale; - func_808CDAD0(alphaScale); + DemoEffect_SetPerVertexAlpha(alphaScale); Actor_PlaySfx_FlaggedCentered3(&this->actor, NA_SE_EV_TIMETRIP_LIGHT - SFX_FLAG); } else { - func_808CDAD0(1.0f); + DemoEffect_SetPerVertexAlpha(1.0f); Actor_Kill(&this->actor); } } -void func_808CDCEC(DemoEffect* this, PlayState* play) { +/** + * Runs until animation plays to frame 59 and pauses it on frame 59. + */ +void DemoEffect_StartTimewarp(DemoEffect* this, PlayState* play) { Actor_PlaySfx_FlaggedCentered3(&this->actor, NA_SE_EV_TIMETRIP_LIGHT - SFX_FLAG); if (SkelCurve_Update(play, &this->skelCurve)) { - SkelCurve_SetAnim(&this->skelCurve, &object_efc_tw_CurveAnim_000050, 1.0f, 60.0f, 59.0f, 0.0f); - this->actionFunc = func_808CDBDC; + SkelCurve_SetAnim(&this->skelCurve, &gTimewarpAnim, 1.0f, 60.0f, 59.0f, 0.0f); + this->actionFunc = DemoEffect_FinishTimewarp; this->timer = 0; } } -void func_808CDD70(DemoEffect* this, PlayState* play) { +/** + * Take scale to 0 linearly, when scale is small enough, remove. + */ +void DemoEffect_ShrinkLight(DemoEffect* this, PlayState* play) { Actor_SetScale(&this->actor, this->actor.scale.x - 0.02f); this->timer++; @@ -236,12 +248,16 @@ void func_808CDD70(DemoEffect* this, PlayState* play) { } } -void func_808CDDE0(DemoEffect* this, PlayState* play) { +/** + * Changes scale for 3 frames, scale is successively 0.0f, 0.2f, 0.3f, 0.35f (would converge to 0.4 exponentially if run + * for a long time). + */ +void DemoEffect_ExpandLight(DemoEffect* this, PlayState* play) { Actor_SetScale(&this->actor, (this->actor.scale.x * 0.5f) + 0.2f); this->timer++; if (this->timer >= 3) { - this->actionFunc = func_808CDD70; + this->actionFunc = DemoEffect_ShrinkLight; } } @@ -251,7 +267,7 @@ void DemoEffect_Update(Actor* thisx, PlayState* play) { this->actionFunc(this, play); } -s32 func_808CDE78(PlayState* play, SkelCurve* skelCurve, s32 limbIndex, Actor* thisx) { +s32 DemoEffect_OverrideLimbDrawTimewarp(PlayState* play, SkelCurve* skelCurve, s32 limbIndex, Actor* thisx) { s32 pad; DemoEffect* this = THIS; u32 frames = play->gameplayFrames; @@ -278,7 +294,7 @@ s32 func_808CDE78(PlayState* play, SkelCurve* skelCurve, s32 limbIndex, Actor* t return true; } -void func_808CDFF8(Actor* thisx, PlayState* play) { +void DemoEffect_DrawTimewarp(Actor* thisx, PlayState* play) { GraphicsContext* gfxCtx = play->state.gfxCtx; DemoEffect* this = THIS; @@ -287,12 +303,12 @@ void func_808CDFF8(Actor* thisx, PlayState* play) { POLY_XLU_DISP = Gfx_SetupDL(POLY_XLU_DISP, SETUPDL_25); Matrix_Scale(2.0f, 2.0f, 2.0f, MTXMODE_APPLY); - SkelCurve_Draw(&this->actor, play, &this->skelCurve, func_808CDE78, NULL, 1, &this->actor); + SkelCurve_Draw(&this->actor, play, &this->skelCurve, DemoEffect_OverrideLimbDrawTimewarp, NULL, 1, &this->actor); CLOSE_DISPS(gfxCtx); } -void func_808CE078(Actor* thisx, PlayState* play2) { +void DemoEffect_DrawLight(Actor* thisx, PlayState* play2) { PlayState* play = play2; DemoEffect* this = THIS; s16 zRot = (this->timer * 0x400) & 0xFFFF; diff --git a/src/overlays/actors/ovl_Demo_Effect/z_demo_effect.h b/src/overlays/actors/ovl_Demo_Effect/z_demo_effect.h index 9901a3189..a69316308 100644 --- a/src/overlays/actors/ovl_Demo_Effect/z_demo_effect.h +++ b/src/overlays/actors/ovl_Demo_Effect/z_demo_effect.h @@ -11,15 +11,16 @@ typedef void (*DemoEffectActionFunc)(struct DemoEffect*, PlayState*); #define DEMO_EFFECT_GET_TYPE(thisx) ((thisx)->params & 0xFF) typedef enum { - /* 0 */ DEMO_EFFECT_TYPE_0, - /* 1 */ DEMO_EFFECT_TYPE_1, - /* 2 */ DEMO_EFFECT_TYPE_2, - /* 3 */ DEMO_EFFECT_TYPE_3, - /* 4 */ DEMO_EFFECT_TYPE_4, - /* 5 */ DEMO_EFFECT_TYPE_5, - /* 6 */ DEMO_EFFECT_TYPE_6, - /* 7 */ DEMO_EFFECT_TYPE_7, - /* 8 */ DEMO_EFFECT_TYPE_8 + /* 0 */ DEMO_EFFECT_TIMEWARP_TIMEBLOCK_LARGE, + /* 1 */ DEMO_EFFECT_TIMEWARP_TIMEBLOCK_SMALL, + /* 2 */ DEMO_EFFECT_TIMEWARP_LIGHTBLOCK_LARGE, + /* 3 */ DEMO_EFFECT_TIMEWARP_LIGHTBLOCK_VERY_LARGE, + /* 4 */ DEMO_EFFECT_TYPE_LIGHT_BASE, + /* 4 */ DEMO_EFFECT_TYPE_LIGHT_DARK_YELLOW = DEMO_EFFECT_TYPE_LIGHT_BASE, + /* 5 */ DEMO_EFFECT_TYPE_LIGHT_PINK, + /* 6 */ DEMO_EFFECT_TYPE_LIGHT_GREEN, + /* 7 */ DEMO_EFFECT_TYPE_LIGHT_BLUE, + /* 8 */ DEMO_EFFECT_TYPE_LIGHT_YELLOW // Unused } DemoEffectType; typedef struct DemoEffect { diff --git a/src/overlays/actors/ovl_Demo_Getitem/z_demo_getitem.c b/src/overlays/actors/ovl_Demo_Getitem/z_demo_getitem.c index 6882c189a..63228436f 100644 --- a/src/overlays/actors/ovl_Demo_Getitem/z_demo_getitem.c +++ b/src/overlays/actors/ovl_Demo_Getitem/z_demo_getitem.c @@ -1,7 +1,7 @@ /* * File: z_demo_getitem.c * Overlay: ovl_Demo_Getitem - * Description: Cutscene objectIndex for Great Fairy's Mask and Great Fairy's Sword + * Description: Cutscene objects for Great Fairy's Mask and Great Fairy's Sword */ #include "z_demo_getitem.h" @@ -14,8 +14,8 @@ void DemoGetitem_Init(Actor* thisx, PlayState* play); void DemoGetitem_Destroy(Actor* thisx, PlayState* play); void DemoGetitem_Update(Actor* thisx, PlayState* play); -void func_80A4FB10(DemoGetitem* this, PlayState* play); -void func_80A4FB68(DemoGetitem* this, PlayState* play2); +void DemoGetitem_Wait(DemoGetitem* this, PlayState* play); +void DemoGetitem_PerformCutsceneActions(DemoGetitem* this, PlayState* play); void DemoGetitem_Draw(Actor* thisx, PlayState* play); ActorInit Demo_Getitem_InitVars = { @@ -36,20 +36,27 @@ static s16 sGetItemDraws[] = { GID_MASK_GREAT_FAIRY, GID_SWORD_GREAT_FAIRY }; static u16 sCueTypes[] = { CS_CMD_ACTOR_CUE_110, CS_CMD_ACTOR_CUE_566 }; +typedef enum GreatFairyRewardItem { + /* 0 */ DEMOGETITEM_ITEM_MASK_GREAT_FAIRY, + /* 1 */ DEMOGETITEM_ITEM_SWORD_GREAT_FAIRY +} GreatFairyRewardItem; + void DemoGetitem_Init(Actor* thisx, PlayState* play) { s32 pad; s32 objectIndex; s32 itemIndex; DemoGetitem* this = THIS; - itemIndex = 0; - if (DEMOGETITEM_GET_F(thisx) == 1) { - itemIndex = 1; + itemIndex = DEMOGETITEM_ITEM_MASK_GREAT_FAIRY; + if (DEMOGETITEM_GET_F(&this->actor) == 1) { + itemIndex = DEMOGETITEM_ITEM_SWORD_GREAT_FAIRY; } + Actor_SetScale(&this->actor, 0.25f); - this->actionFunc = func_80A4FB10; - this->item = sGetItemDraws[itemIndex]; + this->actionFunc = DemoGetitem_Wait; + this->getItemDrawId = sGetItemDraws[itemIndex]; this->cueType = sCueTypes[itemIndex]; + objectIndex = Object_GetIndex(&play->objectCtx, sObjectBankIndices[itemIndex]); if (objectIndex < 0) { Actor_Kill(&this->actor); @@ -62,22 +69,23 @@ void DemoGetitem_Init(Actor* thisx, PlayState* play) { void DemoGetitem_Destroy(Actor* thisx, PlayState* play) { } -void func_80A4FB10(DemoGetitem* this, PlayState* play) { +void DemoGetitem_Wait(DemoGetitem* this, PlayState* play) { if (Object_IsLoaded(&play->objectCtx, this->objectIndex)) { this->actor.draw = NULL; this->actor.objBankIndex = this->objectIndex; - this->actionFunc = func_80A4FB68; + this->actionFunc = DemoGetitem_PerformCutsceneActions; } } -void func_80A4FB68(DemoGetitem* this, PlayState* play2) { - PlayState* play = play2; - u16 sp22 = (play->gameplayFrames * 1000) & 0xFFFF; +void DemoGetitem_PerformCutsceneActions(DemoGetitem* this, PlayState* play) { + s32 pad; + u16 bobPhase = (play->gameplayFrames * 1000) % 0x10000; if (Cutscene_IsCueInChannel(play, this->cueType)) { if (play->csCtx.actorCues[Cutscene_GetCueChannel(play, this->cueType)]->id != 4) { this->actor.shape.yOffset = 0.0f; } + switch (play->csCtx.actorCues[Cutscene_GetCueChannel(play, this->cueType)]->id) { case 2: this->actor.draw = DemoGetitem_Draw; @@ -92,7 +100,7 @@ void func_80A4FB68(DemoGetitem* this, PlayState* play2) { case 4: this->actor.draw = DemoGetitem_Draw; Cutscene_ActorTranslateAndYaw(&this->actor, play, Cutscene_GetCueChannel(play, this->cueType)); - this->actor.shape.yOffset = Math_SinS(sp22) * 15.0f; + this->actor.shape.yOffset = Math_SinS(bobPhase) * 15.0f; break; default: @@ -115,5 +123,5 @@ void DemoGetitem_Draw(Actor* thisx, PlayState* play) { func_800B8050(&this->actor, play, 0); func_800B8118(&this->actor, play, 0); - GetItem_Draw(play, this->item); + GetItem_Draw(play, this->getItemDrawId); } diff --git a/src/overlays/actors/ovl_Demo_Getitem/z_demo_getitem.h b/src/overlays/actors/ovl_Demo_Getitem/z_demo_getitem.h index ca00f6048..130b2cfa6 100644 --- a/src/overlays/actors/ovl_Demo_Getitem/z_demo_getitem.h +++ b/src/overlays/actors/ovl_Demo_Getitem/z_demo_getitem.h @@ -11,7 +11,7 @@ typedef void (*DemoGetitemActionFunc)(struct DemoGetitem*, PlayState*); typedef struct DemoGetitem { /* 0x000 */ Actor actor; - /* 0x144 */ s16 item; + /* 0x144 */ s16 getItemDrawId; /* 0x146 */ u16 cueType; /* 0x148 */ s8 objectIndex; /* 0x14C */ DemoGetitemActionFunc actionFunc; diff --git a/src/overlays/actors/ovl_En_Box/z_en_box.c b/src/overlays/actors/ovl_En_Box/z_en_box.c index 959a986a4..8157d09c6 100644 --- a/src/overlays/actors/ovl_En_Box/z_en_box.c +++ b/src/overlays/actors/ovl_En_Box/z_en_box.c @@ -539,7 +539,8 @@ void EnBox_Open(EnBox* this, PlayState* play) { Actor_SpawnAsChild(&play->actorCtx, &this->dyna.actor, play, ACTOR_EN_ELFORG, this->dyna.actor.world.pos.x, this->dyna.actor.world.pos.y, this->dyna.actor.world.pos.z, this->dyna.actor.world.rot.x, this->dyna.actor.world.rot.y, this->dyna.actor.world.rot.z, - STRAY_FAIRY_PARAMS(ENBOX_GET_CHEST_FLAG(&this->dyna.actor), 0, STRAY_FAIRY_TYPE_CHEST)); + STRAY_FAIRY_PARAMS(ENBOX_GET_CHEST_FLAG(&this->dyna.actor), STRAY_FAIRY_AREA_CLOCK_TOWN, + STRAY_FAIRY_TYPE_CHEST)); } else if (this->movementFlags & ENBOX_MOVE_0x40) { this->movementFlags &= ~ENBOX_MOVE_0x40; } diff --git a/src/overlays/actors/ovl_En_Dy_Extra/z_en_dy_extra.c b/src/overlays/actors/ovl_En_Dy_Extra/z_en_dy_extra.c index 14f08c531..b8dea95a0 100644 --- a/src/overlays/actors/ovl_En_Dy_Extra/z_en_dy_extra.c +++ b/src/overlays/actors/ovl_En_Dy_Extra/z_en_dy_extra.c @@ -16,8 +16,8 @@ void EnDyExtra_Destroy(Actor* thisx, PlayState* play); void EnDyExtra_Update(Actor* thisx, PlayState* play); void EnDyExtra_Draw(Actor* thisx, PlayState* play); -void func_80A61334(EnDyExtra* this, PlayState* play); -void func_80A613C8(EnDyExtra* this, PlayState* play); +void EnDyExtra_WaitForTrigger(EnDyExtra* this, PlayState* play); +void EnDyExtra_Fall(EnDyExtra* this, PlayState* play); ActorInit En_Dy_Extra_InitVars = { ACTOR_EN_DY_EXTRA, @@ -41,35 +41,35 @@ void EnDyExtra_Init(Actor* thisx, PlayState* play) { this->actor.scale.x = 0.025f; this->actor.scale.y = 0.039f; this->actor.scale.z = 0.025f; - this->unk160 = this->actor.world.pos; + this->initPos = this->actor.world.pos; this->actor.gravity = -0.2f; - this->unk150 = 1.0f; - this->unk14C = 0x3C; - this->actionFunc = func_80A61334; + this->alphaScale = 1.0f; + this->timer = 60; + this->actionFunc = EnDyExtra_WaitForTrigger; } -void func_80A61334(EnDyExtra* this, PlayState* play) { +void EnDyExtra_WaitForTrigger(EnDyExtra* this, PlayState* play) { Math_ApproachF(&this->actor.gravity, 0.0f, 0.1f, 0.005f); if (this->actor.world.pos.y < -85.0f) { this->actor.velocity.y = 0.0f; } - if ((this->unk14C == 0) && (this->unk14A != 0)) { - this->unk14C = 0x32; - this->actionFunc = func_80A613C8; + if ((this->timer == 0) && this->trigger) { + this->timer = 50; + this->actionFunc = EnDyExtra_Fall; } } -void func_80A613C8(EnDyExtra* this, PlayState* play) { +void EnDyExtra_Fall(EnDyExtra* this, PlayState* play) { Math_ApproachF(&this->actor.gravity, 0.0f, 0.1f, 0.005f); - if ((this->unk14C == 0) || (this->unk150 < 0.02f)) { + if ((this->timer == 0) || (this->alphaScale < 0.02f)) { Actor_Kill(&this->actor); return; } - this->unk150 -= 0.02f; + this->alphaScale -= 0.02f; if (this->actor.world.pos.y < -85.0f) { this->actor.velocity.y = 0.0f; @@ -79,40 +79,40 @@ void func_80A613C8(EnDyExtra* this, PlayState* play) { void EnDyExtra_Update(Actor* thisx, PlayState* play) { EnDyExtra* this = THIS; - DECR(this->unk14C); + DECR(this->timer); Actor_PlaySfx(&this->actor, NA_SE_PL_SPIRAL_HEAL_BEAM - SFX_FLAG); this->actionFunc(this, play); Actor_MoveWithGravity(&this->actor); } -static Color_RGBA8 D_80A61740[] = { +static Color_RGBA8 sPrimColors[] = { { 255, 255, 170, 255 }, { 255, 170, 255, 255 }, { 255, 255, 170, 255 }, { 170, 255, 255, 255 }, { 255, 255, 170, 255 }, }; -static Color_RGBA8 D_80A61754[] = { +static Color_RGBA8 sEnvColors[] = { { 255, 100, 0, 255 }, { 255, 0, 100, 255 }, { 100, 255, 0, 255 }, { 0, 100, 255, 255 }, { 255, 230, 0, 255 } }; -static u8 D_80A61768[] = { - 2, 1, 1, 2, 0, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 1, 2, 0, 0, +static u8 sAlphaTypeIndices[] = { + 2, 1, 1, 2, 0, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 1, 2, 0, }; void EnDyExtra_Draw(Actor* thisx, PlayState* play) { - EnDyExtra* this = THIS; s32 pad; + EnDyExtra* this = THIS; GraphicsContext* gfxCtx = play->state.gfxCtx; - Vtx* vertices = Lib_SegmentedToVirtual(object_dy_obj_Vtx_00DD40); + Vtx* vertices = Lib_SegmentedToVirtual(gGreatFairySpiralBeamVtx); s32 i; - u8 unk[3]; + u8 alphas[3]; - unk[0] = 0.0f; - unk[1] = (s8)(this->unk150 * 240.0f); - unk[2] = (s8)(this->unk150 * 255.0f); + alphas[0] = 0.0f; + alphas[1] = (s32)(this->alphaScale * 240.0f); + alphas[2] = (s32)(this->alphaScale * 255.0f); - for (i = 0; i < 27; i++) { - if (D_80A61768[i]) { - vertices[i].v.cn[3] = unk[D_80A61768[i]]; + for (i = 0; i < ARRAY_COUNT(sAlphaTypeIndices); i++) { + if (sAlphaTypeIndices[i]) { + vertices[i].v.cn[3] = alphas[sAlphaTypeIndices[i]]; } } @@ -124,10 +124,10 @@ void EnDyExtra_Draw(Actor* thisx, PlayState* play) { play->state.frames * -8, 0x10, 0x10)); gDPPipeSync(POLY_XLU_DISP++); gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); - gDPSetPrimColor(POLY_XLU_DISP++, 0, 0x80, D_80A61740[this->type].r, D_80A61740[this->type].g, - D_80A61740[this->type].b, 255); - gDPSetEnvColor(POLY_XLU_DISP++, D_80A61754[this->type].r, D_80A61754[this->type].g, D_80A61754[this->type].b, 128); - gSPDisplayList(POLY_XLU_DISP++, object_dy_obj_DL_00DEF0); + gDPSetPrimColor(POLY_XLU_DISP++, 0, 0x80, sPrimColors[this->type].r, sPrimColors[this->type].g, + sPrimColors[this->type].b, 255); + gDPSetEnvColor(POLY_XLU_DISP++, sEnvColors[this->type].r, sEnvColors[this->type].g, sEnvColors[this->type].b, 128); + gSPDisplayList(POLY_XLU_DISP++, gGreatFairySpiralBeamDL); CLOSE_DISPS(gfxCtx); } diff --git a/src/overlays/actors/ovl_En_Dy_Extra/z_en_dy_extra.h b/src/overlays/actors/ovl_En_Dy_Extra/z_en_dy_extra.h index 0e5d8614b..f36b12051 100644 --- a/src/overlays/actors/ovl_En_Dy_Extra/z_en_dy_extra.h +++ b/src/overlays/actors/ovl_En_Dy_Extra/z_en_dy_extra.h @@ -11,12 +11,11 @@ typedef struct EnDyExtra { /* 0x000 */ Actor actor; /* 0x144 */ EnDyExtraActionFunc actionFunc; /* 0x148 */ s16 type; - /* 0x14A */ s16 unk14A; - /* 0x14C */ s16 unk14C; - /* 0x14E */ s16 unk14E; - /* 0x150 */ f32 unk150; - /* 0x154 */ UNK_TYPE1 unk154[0xC]; - /* 0x160 */ Vec3f unk160; + /* 0x14A */ s16 trigger; + /* 0x14C */ s16 timer; + /* 0x150 */ f32 alphaScale; + /* 0x154 */ Vec3f scale; // not used, leftover from OoT + /* 0x160 */ Vec3f initPos; // set and not used } EnDyExtra; // size = 0x16C #endif // Z_EN_DY_EXTRA_H diff --git a/src/overlays/actors/ovl_En_Elf/z_en_elf.c b/src/overlays/actors/ovl_En_Elf/z_en_elf.c index 61cf693d7..f1526d66b 100644 --- a/src/overlays/actors/ovl_En_Elf/z_en_elf.c +++ b/src/overlays/actors/ovl_En_Elf/z_en_elf.c @@ -744,7 +744,7 @@ void func_8088E0F0(EnElf* this, PlayState* play) { if (this->unk_250 < 2.0f) { this->unk_250 += 0.1f; } else { - gSaveContext.healthAccumulator = 160; + gSaveContext.healthAccumulator = 0xA0; this->unk_246++; } break; diff --git a/src/overlays/actors/ovl_En_Elfbub/z_en_elfbub.c b/src/overlays/actors/ovl_En_Elfbub/z_en_elfbub.c index ef53999de..9b34bf410 100644 --- a/src/overlays/actors/ovl_En_Elfbub/z_en_elfbub.c +++ b/src/overlays/actors/ovl_En_Elfbub/z_en_elfbub.c @@ -73,10 +73,11 @@ void EnElfbub_Init(Actor* thisx, PlayState* play) { Collider_InitAndSetCylinder(play, &this->collider, &this->actor, &sCylinderInit); this->actor.colChkInfo.mass = MASS_IMMOVABLE; - childActor = Actor_SpawnAsChild( - &play->actorCtx, &this->actor, play, ACTOR_EN_ELFORG, this->actor.world.pos.x, this->actor.world.pos.y + 12.0f, - this->actor.world.pos.z, this->actor.world.rot.x, this->actor.world.rot.y, this->actor.world.rot.z, - STRAY_FAIRY_PARAMS(ENELFBUB_GET_SWITCHFLAG(&this->actor), 0, STRAY_FAIRY_TYPE_BUBBLE)); + childActor = Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, ACTOR_EN_ELFORG, this->actor.world.pos.x, + this->actor.world.pos.y + 12.0f, this->actor.world.pos.z, this->actor.world.rot.x, + this->actor.world.rot.y, this->actor.world.rot.z, + STRAY_FAIRY_PARAMS(ENELFBUB_GET_SWITCHFLAG(&this->actor), + STRAY_FAIRY_AREA_CLOCK_TOWN, STRAY_FAIRY_TYPE_BUBBLE)); if (childActor != NULL) { childActor->parent = &this->actor; } @@ -140,6 +141,7 @@ void EnElfbub_Idle(EnElfbub* this, PlayState* play) { void EnElfbub_Update(Actor* thisx, PlayState* play) { EnElfbub* this = THIS; + Collider_UpdateCylinder(&this->actor, &this->collider); this->actionFunc(this, play); Actor_SetFocus(&this->actor, this->actor.shape.yOffset); diff --git a/src/overlays/actors/ovl_En_Elfgrp/z_en_elfgrp.c b/src/overlays/actors/ovl_En_Elfgrp/z_en_elfgrp.c index 42ac47f69..937c6bc8c 100644 --- a/src/overlays/actors/ovl_En_Elfgrp/z_en_elfgrp.c +++ b/src/overlays/actors/ovl_En_Elfgrp/z_en_elfgrp.c @@ -1,11 +1,38 @@ -/* - * File: z_en_elfgrp.c +/** + * @file z_en_elfgrp.c * Overlay: ovl_En_Elfgrp - * Description: Group of Stray Fairies in Fairy Fountain + * Description: Manager for group of Stray Fairies and Great Fairy in Fairy's Fountains + * + * There are many different quantities associated to the Stray Fairies in each of the 3 places (missing, in the + * Fountain, held by Player) + * - Total number of fairies (always 25 in the original game) + * - Original number in the Fountain (24 for Clock Town Fairy Fountain, 10 for the other 4) + * - Current number in the Fountain (bitpacked in Fountain scene flags, see below) + * - Total number found (stored in save context) + * - Current number held (i.e. found but not returned) + * + * The permanentSceneFlags for Fairy Fountains used in this actor are of the form + * ```c + * struct { + * u32 clockTown : 1; + * u32 fountains[4] : 5; + * } FairyFountains; + * ``` + * where arg1 is: + * - 0: Clock Town + * - 1: Woodfall, + * - 2: Snowhead, + * - 3: Great Bay, + * - 4: Ikana + * + * Clock Town is handled separately, and then the fountains are looked up with manual array indexing + * + * @note Clock Town is handled separately in a number of places */ #include "z_en_elfgrp.h" #include "overlays/actors/ovl_En_Elforg/z_en_elforg.h" +#include "overlays/actors/ovl_Demo_Effect/z_demo_effect.h" #define FLAGS (ACTOR_FLAG_10) @@ -17,24 +44,28 @@ void EnElfgrp_Init(Actor* thisx, PlayState* play); void EnElfgrp_Destroy(Actor* thisx, PlayState* play); void EnElfgrp_Update(Actor* thisx, PlayState* play); -s32 func_80A39BD0(PlayState* play, s32 arg2); -s32 func_80A39C1C(PlayState* play, s32 arg1); -void func_80A39DC8(EnElfgrp* this, PlayState* play, s32 arg2, s32 arg3); -void func_80A3A0AC(EnElfgrp* this, PlayState* play); -void func_80A3A0F4(EnElfgrp* this, PlayState* play); -void func_80A3A210(EnElfgrp* this, PlayState* play); -void func_80A3A274(EnElfgrp* this, PlayState* play); +s32 EnElfgrp_GetHeldFairiesCount(PlayState* play, s32 type); +s32 EnElfgrp_GetFountainFairiesCount(PlayState* play, s32 type); +void EnElfgrp_SpawnStrayFairies(EnElfgrp* this, PlayState* play, s32 count, s32 fairyType); void func_80A3A398(EnElfgrp* this, PlayState* play); -void func_80A3A484(EnElfgrp* this, PlayState* play); -void func_80A3A4AC(EnElfgrp* this, PlayState* play); void func_80A3A520(EnElfgrp* this, PlayState* play); -void func_80A3A600(EnElfgrp* this, PlayState* play); -void func_80A3A610(EnElfgrp* this, PlayState* play); -void func_80A3A6F4(EnElfgrp* this, PlayState* play); -void func_80A3A77C(EnElfgrp* this, PlayState* play); +void EnElfgrp_DoNothing(EnElfgrp* this, PlayState* play); void func_80A3A7FC(EnElfgrp* this, PlayState* play); void func_80A3A8F8(EnElfgrp* this, PlayState* play); +// State flags +#define ELFGRP_STATE_0 (1 << 0) +#define ELFGRP_STATE_1 (1 << 1) +#define ELFGRP_STATE_2 (1 << 2) +#define ELFGRP_STATE_3 (1 << 3) +#define ELFGRP_STATE_4 (1 << 4) + +// Used for the type in EnElfgrp_SpawnStrayFairies +typedef enum ElfgrpSpawnedFairyTypes { + /* 0 */ SPAWNED_STRAY_FAIRY_TYPE_PRESENT, // STRAY_FAIRY_TYPE_FAIRY_FOUNTAIN + /* 1 */ SPAWNED_STRAY_FAIRY_TYPE_RETURNING // STRAY_FAIRY_TYPE_RETURNING_TO_FOUNTAIN +} ElfgrpSpawnedFairyTypes; + ActorInit En_Elfgrp_InitVars = { ACTOR_EN_ELFGRP, ACTORCAT_PROP, @@ -47,7 +78,15 @@ ActorInit En_Elfgrp_InitVars = { (ActorFunc)NULL, }; -void func_80A396B0(EnElfgrp* this, s32 numCutscenes) { +/** + * Set the actor's cutscene id to a later one, or -1 if run out. + * + * @note This is only expected to be called in Init when this actor has the first cutscene set, but can also work for + * later cutscenes if \p numCutscenes is set correcly. + * + * @param numCutscenes Number of cutscenes in the list to skip forward to set this one. + */ +void EnElfgrp_SetCutscene(EnElfgrp* this, s32 numCutscenes) { while (numCutscenes > 0) { if (this->actor.csId == CS_ID_NONE) { break; @@ -61,113 +100,118 @@ void func_80A396B0(EnElfgrp* this, s32 numCutscenes) { void EnElfgrp_Init(Actor* thisx, PlayState* play) { s32 pad; EnElfgrp* this = THIS; - s32 sp24; + s32 numberInFountain; - this->unk_147 = ENELFGRP_GET(&this->actor); + this->type = ENELFGRP_GET_TYPE(&this->actor); this->unk_148 = 0; - this->unk_14A = 0; + this->stateFlags = 0; this->actor.focus.pos.y += 40.0f; this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; - switch (this->unk_147) { - case ENELFGRP_1: - case ENELFGRP_2: - case ENELFGRP_3: - case ENELFGRP_4: - this->unk_148 = this->unk_147 - 1; - sp24 = func_80A39C1C(play, this->unk_147); - this->unk_146 = 1 << this->unk_147; + switch (this->type) { + case ENELFGRP_TYPE_POWER: + case ENELFGRP_TYPE_WISDOM: + case ENELFGRP_TYPE_COURAGE: + case ENELFGRP_TYPE_KINDNESS: + this->unk_148 = this->type - 1; + numberInFountain = EnElfgrp_GetFountainFairiesCount(play, this->type); + this->talkedOnceFlag = 1 << this->type; - if (sp24 < 25) { - func_80A39DC8(this, play, sp24, 0); + if (numberInFountain < STRAY_FAIRY_TOTAL) { + EnElfgrp_SpawnStrayFairies(this, play, numberInFountain, SPAWNED_STRAY_FAIRY_TYPE_PRESENT); } - if (sp24 >= 25) { + if (numberInFountain >= STRAY_FAIRY_TOTAL) { this->actionFunc = func_80A3A520; - func_80A396B0(this, 2); - return; + EnElfgrp_SetCutscene(this, 2); + break; } - if ((func_80A39BD0(play, this->unk_147) + sp24) >= 25) { + if ((EnElfgrp_GetHeldFairiesCount(play, this->type) + numberInFountain) >= STRAY_FAIRY_TOTAL) { this->actionFunc = func_80A3A398; - switch (this->unk_147) { - case ENELFGRP_1: - if (CHECK_WEEKEVENTREG(WEEKEVENTREG_23_02)) { - func_80A396B0(this, 1); + switch (this->type) { + case ENELFGRP_TYPE_POWER: + if (CHECK_WEEKEVENTREG(WEEKEVENTREG_OBTAINED_GREAT_SPIN_ATTACK)) { + EnElfgrp_SetCutscene(this, 1); } else { - this->unk_14A |= 4; + this->stateFlags |= ELFGRP_STATE_2; } break; - case ENELFGRP_2: + case ENELFGRP_TYPE_WISDOM: if (gSaveContext.save.saveInfo.playerData.isDoubleMagicAcquired == true) { - func_80A396B0(this, 1); + EnElfgrp_SetCutscene(this, 1); } break; - case ENELFGRP_3: + case ENELFGRP_TYPE_COURAGE: if (gSaveContext.save.saveInfo.playerData.doubleDefense) { - func_80A396B0(this, 1); + EnElfgrp_SetCutscene(this, 1); } break; - case ENELFGRP_4: + case ENELFGRP_TYPE_KINDNESS: if (INV_CONTENT(ITEM_SWORD_GREAT_FAIRY) == ITEM_SWORD_GREAT_FAIRY) { - func_80A396B0(this, 1); + EnElfgrp_SetCutscene(this, 1); } else { - this->unk_14A |= 0x10; + this->stateFlags |= ELFGRP_STATE_4; } break; default: break; } - } else if (func_80A39BD0(play, this->unk_147)) { + } else if (EnElfgrp_GetHeldFairiesCount(play, this->type)) { this->actionFunc = func_80A3A7FC; - this->actor.textId = (this->unk_147 * 3) + 0x581; + this->actor.textId = (this->type * 3) + 0x581; } else { this->actionFunc = func_80A3A8F8; - if ((gSaveContext.save.saveInfo.weekEventReg[9] & this->unk_146)) { - this->actor.textId = (this->unk_147 * 3) + 0x580; + + if ((gSaveContext.save.saveInfo.weekEventReg[9] & this->talkedOnceFlag)) { // talked for first time + this->actor.textId = (this->type * 3) + 0x580; } else { - this->actor.textId = (this->unk_147 * 3) + 0x57F; + this->actor.textId = (this->type * 3) + 0x57F; } } break; - default: - sp24 = func_80A39C1C(play, 0); - this->unk_146 = ENELFGRP_1; - if (sp24 >= 25) { + default: // ENELFGRP_TYPE_MAGIC + numberInFountain = EnElfgrp_GetFountainFairiesCount(play, ENELFGRP_TYPE_MAGIC); + this->talkedOnceFlag = 1 << ENELFGRP_TYPE_MAGIC; + + if (numberInFountain >= STRAY_FAIRY_TOTAL) { this->actionFunc = func_80A3A520; - if ((this->actor.home.rot.z != 0) && Flags_GetSwitch(play, this->actor.home.rot.z)) { - this->actionFunc = func_80A3A600; + + if ((ENELFGRP_GET_SWITCHFLAG_ROT(&this->actor) != 0) && + Flags_GetSwitch(play, ENELFGRP_GET_SWITCHFLAG_ROT(&this->actor))) { + this->actionFunc = EnElfgrp_DoNothing; } else if (INV_CONTENT(ITEM_MASK_GREAT_FAIRY) == ITEM_MASK_GREAT_FAIRY) { - func_80A396B0(this, 4); + EnElfgrp_SetCutscene(this, 4); } else if (INV_CONTENT(ITEM_MASK_DEKU) != ITEM_MASK_DEKU) { - func_80A396B0(this, 5); + EnElfgrp_SetCutscene(this, 5); } else { - this->unk_14A |= 2; - func_80A396B0(this, 6); + this->stateFlags |= ELFGRP_STATE_1; + EnElfgrp_SetCutscene(this, 6); } } else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_08_80)) { - func_80A39DC8(this, play, 24, 0); + EnElfgrp_SpawnStrayFairies(this, play, STRAY_FAIRY_TOTAL - 1, SPAWNED_STRAY_FAIRY_TYPE_PRESENT); this->actionFunc = func_80A3A398; + if (INV_CONTENT(ITEM_MASK_DEKU) == ITEM_MASK_DEKU) { if (INV_CONTENT(ITEM_MASK_GREAT_FAIRY) == ITEM_MASK_GREAT_FAIRY) { - func_80A396B0(this, 2); + EnElfgrp_SetCutscene(this, 2); } else { - func_80A396B0(this, 3); - this->unk_14A |= 2; + EnElfgrp_SetCutscene(this, 3); + this->stateFlags |= ELFGRP_STATE_1; } } else if (gSaveContext.save.saveInfo.playerData.isMagicAcquired == true) { - func_80A396B0(this, 1); + EnElfgrp_SetCutscene(this, 1); } } else { - func_80A39DC8(this, play, 24, 0); + EnElfgrp_SpawnStrayFairies(this, play, STRAY_FAIRY_TOTAL - 1, SPAWNED_STRAY_FAIRY_TYPE_PRESENT); this->actionFunc = func_80A3A8F8; - if ((gSaveContext.save.saveInfo.weekEventReg[9] & this->unk_146)) { + if ((gSaveContext.save.saveInfo.weekEventReg[9] & this->talkedOnceFlag)) { this->actor.textId = 0x580; } else { this->actor.textId = 0x578; @@ -181,116 +225,119 @@ void EnElfgrp_Init(Actor* thisx, PlayState* play) { void EnElfgrp_Destroy(Actor* thisx, PlayState* play) { } -s32 func_80A39BD0(PlayState* play, s32 arg2) { - if ((arg2 < 1) || (arg2 >= 5)) { +// Number of Stray Fairies currently held by Player +s32 EnElfgrp_GetHeldFairiesCount(PlayState* play, s32 type) { + if ((type <= ENELFGRP_TYPE_MAGIC) || (type > ENELFGRP_TYPE_KINDNESS)) { return 0; } - return (((void)0, gSaveContext.save.saveInfo.inventory.strayFairies[arg2 - 1]) - func_80A39C1C(play, arg2)) + 10; + // Number in fountain originally + total number collected - number currently in fountain + return (STRAY_FAIRY_TOTAL - STRAY_FAIRY_SCATTERED_TOTAL) + + ((void)0, gSaveContext.save.saveInfo.inventory.strayFairies[type - 1]) - + EnElfgrp_GetFountainFairiesCount(play, type); } -s32 func_80A39C1C(PlayState* play, s32 arg1) { - // the permanentSceneFlags access here is in the form - // struct { - // u32 clockTown : 1; - // u32 fountains[4] : 5; - // } FairyFountains; - // where arg1 is: - // 0: clocktown - // 1: woodfall, - // 2: snowhead, - // 3: great bay, - // 4: stone tower - // clocktown is handled separately, and then the fountains are looked up as array indexing +// Number of Stray Fairies in currently in Fountain +s32 EnElfgrp_GetFountainFairiesCount(PlayState* play, s32 type) { + s32 numberInFountain; - s32 temp_v1; - - if ((arg1 < 0) || (arg1 >= 5)) { + if ((type < ENELFGRP_TYPE_MAGIC) || (type > ENELFGRP_TYPE_KINDNESS)) { return 0; } - if (arg1 == 0) { + if (type == ENELFGRP_TYPE_MAGIC) { if (gSaveContext.save.saveInfo.permanentSceneFlags[play->sceneId].unk_14 & 1) { - return 25; + return STRAY_FAIRY_TOTAL; + } else { + return STRAY_FAIRY_TOTAL - 1; } - return 24; } - temp_v1 = (gSaveContext.save.saveInfo.permanentSceneFlags[play->sceneId].unk_14 >> (((arg1 - 1) * 5) + 1)) & 0x1F; - if (temp_v1 < 10) { - temp_v1 = 10; - } else if (temp_v1 > 25) { - temp_v1 = 25; + numberInFountain = + (gSaveContext.save.saveInfo.permanentSceneFlags[play->sceneId].unk_14 >> (((type - 1) * 5) + 1)) & 0x1F; + if (numberInFountain < STRAY_FAIRY_TOTAL - STRAY_FAIRY_SCATTERED_TOTAL) { + numberInFountain = STRAY_FAIRY_TOTAL - STRAY_FAIRY_SCATTERED_TOTAL; + } else if (numberInFountain > STRAY_FAIRY_TOTAL) { + numberInFountain = STRAY_FAIRY_TOTAL; } - return temp_v1; + return numberInFountain; } -void func_80A39CD4(PlayState* play, s32 arg1, s32 arg2) { - if ((arg1 < 0) || (arg1 > 4) || (arg2 < 10) || (arg2 > 25)) { +// Update number of Stray Fairies in Fountain +void EnElfgrp_SetFountainFairiesCount(PlayState* play, s32 type, s32 newCount) { + if ((type < ENELFGRP_TYPE_MAGIC) || (type > ENELFGRP_TYPE_KINDNESS) || + (newCount < (STRAY_FAIRY_TOTAL - STRAY_FAIRY_SCATTERED_TOTAL)) || (newCount > STRAY_FAIRY_TOTAL)) { return; } - if (arg1 == 0) { - if (arg2 == 25) { + if (type == ENELFGRP_TYPE_MAGIC) { + if (newCount == STRAY_FAIRY_TOTAL) { gSaveContext.save.saveInfo.permanentSceneFlags[play->sceneId].unk_14 |= 1; } else { gSaveContext.save.saveInfo.permanentSceneFlags[play->sceneId].unk_14 &= ~1; } } else { - gSaveContext.save.saveInfo.permanentSceneFlags[play->sceneId].unk_14 &= ~(0x1F << ((arg1 * 5) - 4)); - gSaveContext.save.saveInfo.permanentSceneFlags[play->sceneId].unk_14 |= arg2 << ((arg1 * 5) - 4); + gSaveContext.save.saveInfo.permanentSceneFlags[play->sceneId].unk_14 &= ~(0x1F << ((type * 5) - 4)); + gSaveContext.save.saveInfo.permanentSceneFlags[play->sceneId].unk_14 |= newCount << ((type * 5) - 4); } } -void func_80A39DC8(EnElfgrp* this, PlayState* play, s32 arg2, s32 arg3) { +void EnElfgrp_SpawnStrayFairies(EnElfgrp* this, PlayState* play, s32 count, s32 fairyType) { s32 pad; s32 i; - Actor* elforg; - s32 params; - Vec3f sp6C; + Actor* strayFairy; + s32 strayFairyParams; + Vec3f spawnCenterPos; Player* player = GET_PLAYER(play); - if (arg3 == 0) { - this->unk_14A |= 8; + if (fairyType == 0) { + this->stateFlags |= ELFGRP_STATE_3; } - if (arg3 == 0) { - sp6C = this->actor.world.pos; - sp6C.y += 20.0f; - params = STRAY_FAIRY_PARAMS(0, this->unk_147, STRAY_FAIRY_TYPE_FAIRY_FOUNTAIN); + if (fairyType == 0) { + spawnCenterPos = this->actor.world.pos; + spawnCenterPos.y += 20.0f; + strayFairyParams = STRAY_FAIRY_PARAMS(0, this->type, STRAY_FAIRY_TYPE_FAIRY_FOUNTAIN); } else { - sp6C = player->actor.world.pos; - sp6C.y += 20.0f; - params = STRAY_FAIRY_PARAMS(0, this->unk_147, STRAY_FAIRY_TYPE_TURN_IN_TO_FAIRY_FOUNTAIN); + spawnCenterPos = player->actor.world.pos; + spawnCenterPos.y += 20.0f; + strayFairyParams = STRAY_FAIRY_PARAMS(0, this->type, STRAY_FAIRY_TYPE_RETURNING_TO_FOUNTAIN); } - for (i = 0; i < arg2; i++) { - elforg = Actor_Spawn(&play->actorCtx, play, ACTOR_EN_ELFORG, Rand_CenteredFloat(20.0f) + sp6C.x, sp6C.y, - Rand_CenteredFloat(20.0f) + sp6C.z, 0, 0, 0, params); - if (elforg == NULL) { + for (i = 0; i < count; i++) { + strayFairy = + Actor_Spawn(&play->actorCtx, play, ACTOR_EN_ELFORG, Rand_CenteredFloat(20.0f) + spawnCenterPos.x, + spawnCenterPos.y, Rand_CenteredFloat(20.0f) + spawnCenterPos.z, 0, 0, 0, strayFairyParams); + + if (strayFairy == NULL) { continue; } - elforg->home.pos.x = this->actor.home.pos.x; - elforg->home.pos.y = this->actor.home.pos.y + 20.0f; - elforg->home.pos.z = this->actor.home.pos.z; + strayFairy->home.pos.x = this->actor.home.pos.x; + strayFairy->home.pos.y = this->actor.home.pos.y + 20.0f; + strayFairy->home.pos.z = this->actor.home.pos.z; } } -s32 func_80A39F50(PlayState* play) { +/** + * Tell any spawned Stray Fairies to come to the Fountain center. + * + * @return s32 always 0 + */ +s32 EnElfgrp_SummonStrayFairies(PlayState* play) { Actor* itemAction = play->actorCtx.actorLists[ACTORCAT_ITEMACTION].first; - EnElforg* elfOrg; + EnElforg* strayFairy; while (itemAction != NULL) { if ((itemAction->id != ACTOR_EN_ELFORG) || ((STRAY_FAIRY_TYPE(itemAction) != STRAY_FAIRY_TYPE_FAIRY_FOUNTAIN) && - (STRAY_FAIRY_TYPE(itemAction) != STRAY_FAIRY_TYPE_TURN_IN_TO_FAIRY_FOUNTAIN))) { + (STRAY_FAIRY_TYPE(itemAction) != STRAY_FAIRY_TYPE_RETURNING_TO_FOUNTAIN))) { itemAction = itemAction->next; continue; } - elfOrg = (EnElforg*)itemAction; - if (!(elfOrg->strayFairyFlags & STRAY_FAIRY_FLAG_MOVES_QUICKLY_TO_HOME)) { - elfOrg->strayFairyFlags |= STRAY_FAIRY_FLAG_MOVES_QUICKLY_TO_HOME; + strayFairy = (EnElforg*)itemAction; + if (!(strayFairy->strayFairyFlags & STRAY_FAIRY_FLAG_MOVES_QUICKLY_TO_HOME)) { + strayFairy->strayFairyFlags |= STRAY_FAIRY_FLAG_MOVES_QUICKLY_TO_HOME; } itemAction = itemAction->next; } @@ -298,50 +345,58 @@ s32 func_80A39F50(PlayState* play) { return 0; } -s32 func_80A39FBC(PlayState* play) { +/** + * Make the Stray Fairies in the fountain spin quickly when healing Player. + * + * @return s32 time to spend in healing action. + */ +s32 EnElfgrp_SpinStrayFairies(PlayState* play) { Actor* itemAction = play->actorCtx.actorLists[ACTORCAT_ITEMACTION].first; - EnElforg* elfOrg; - s32 phi_v1 = 30; + EnElforg* strayFairy; + s32 timer = 30; while (itemAction != NULL) { if ((itemAction->id != ACTOR_EN_ELFORG) || ((STRAY_FAIRY_TYPE(itemAction) != STRAY_FAIRY_TYPE_FAIRY_FOUNTAIN) && - (STRAY_FAIRY_TYPE(itemAction) != STRAY_FAIRY_TYPE_TURN_IN_TO_FAIRY_FOUNTAIN))) { + (STRAY_FAIRY_TYPE(itemAction) != STRAY_FAIRY_TYPE_RETURNING_TO_FOUNTAIN))) { itemAction = itemAction->next; continue; } - elfOrg = (EnElforg*)itemAction; - if (!(elfOrg->strayFairyFlags & STRAY_FAIRY_FLAG_CIRCLES_QUICKLY_IN_FOUNTAIN)) { - elfOrg->strayFairyFlags |= STRAY_FAIRY_FLAG_CIRCLES_QUICKLY_IN_FOUNTAIN; - if (phi_v1 >= 100) { - return phi_v1; + strayFairy = (EnElforg*)itemAction; + if (!(strayFairy->strayFairyFlags & STRAY_FAIRY_FLAG_CIRCLES_QUICKLY_IN_FOUNTAIN)) { + strayFairy->strayFairyFlags |= STRAY_FAIRY_FLAG_CIRCLES_QUICKLY_IN_FOUNTAIN; + if (timer >= 100) { + return timer; } - elfOrg->secondaryTimer = phi_v1; - phi_v1 += 5; + strayFairy->secondaryTimer = timer; + timer += 5; } itemAction = itemAction->next; } - return phi_v1; + return timer; } -void func_80A3A044(PlayState* play) { +/** + * Tell the Stray Fairies to disappear, before reviving the Great Fairy + */ +void EnElfgrp_VanishStrayFairies(PlayState* play) { Actor* itemAction = play->actorCtx.actorLists[ACTORCAT_ITEMACTION].first; - EnElforg* elfOrg; + EnElforg* strayFairy; while (itemAction != NULL) { if ((itemAction->id != ACTOR_EN_ELFORG) || ((STRAY_FAIRY_TYPE(itemAction) != STRAY_FAIRY_TYPE_FAIRY_FOUNTAIN) && - (STRAY_FAIRY_TYPE(itemAction) != STRAY_FAIRY_TYPE_TURN_IN_TO_FAIRY_FOUNTAIN))) { + (STRAY_FAIRY_TYPE(itemAction) != STRAY_FAIRY_TYPE_RETURNING_TO_FOUNTAIN))) { itemAction = itemAction->next; continue; } - elfOrg = (EnElforg*)itemAction; - elfOrg->actor.home.rot.x = 0x14; - elfOrg->strayFairyFlags |= STRAY_FAIRY_FLAG_SPARKLES_AND_SHRINKS; + strayFairy = (EnElforg*)itemAction; + STRAY_FAIRY_SPARKLE_COUNT(&strayFairy->actor) = 20; + strayFairy->strayFairyFlags |= STRAY_FAIRY_FLAG_SPARKLES_AND_SHRINKS; itemAction = itemAction->next; } @@ -349,68 +404,70 @@ void func_80A3A044(PlayState* play) { void func_80A3A0AC(EnElfgrp* this, PlayState* play) { if (!Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_100)) { - this->actionFunc = func_80A3A600; + this->actionFunc = EnElfgrp_DoNothing; CutsceneManager_Stop(this->actor.csId); } } void func_80A3A0F4(EnElfgrp* this, PlayState* play) { - if (this->unk_144 == 10) { + if (this->timer == 10) { Audio_PlaySfx(NA_SE_SY_WHITE_OUT_T); - if (ENELFGRP_GET(&this->actor) < ENELFGRP_4) { + if (ENELFGRP_GET_TYPE(&this->actor) < ENELFGRP_TYPE_KINDNESS) { Actor_Spawn(&play->actorCtx, play, ACTOR_DEMO_EFFECT, this->actor.world.pos.x, this->actor.world.pos.y + 30.0f, this->actor.world.pos.z, 0, 0, 0, - ENELFGRP_GET(&this->actor) + ENELFGRP_4); - } else { + ENELFGRP_GET_TYPE(&this->actor) + DEMO_EFFECT_TYPE_LIGHT_BASE); + } else { // ENELFGRP_TYPE_KINDNESS Actor_Spawn(&play->actorCtx, play, ACTOR_DEMO_EFFECT, this->actor.world.pos.x, - this->actor.world.pos.y + 30.0f, this->actor.world.pos.z, 0, 0, 0, 4); + this->actor.world.pos.y + 30.0f, this->actor.world.pos.z, 0, 0, 0, + DEMO_EFFECT_TYPE_LIGHT_DARK_YELLOW); } } - if ((this->unk_144 > 10) && (this->unk_14A & 1)) { + if ((this->timer > 10) && (this->stateFlags & ELFGRP_STATE_0)) { Actor_PlaySfx_Flagged(&this->actor, NA_SE_EV_FAIRY_GROUP_FRY - SFX_FLAG); } - if (this->unk_144 == 0) { + if (this->timer == 0) { this->actionFunc = func_80A3A0AC; } } void func_80A3A210(EnElfgrp* this, PlayState* play) { - if (this->unk_144 == 0) { + if (this->timer == 0) { this->actionFunc = func_80A3A0F4; - func_80A3A044(play); - this->unk_144 = 30; + EnElfgrp_VanishStrayFairies(play); + this->timer = 30; } - if (this->unk_14A & 1) { + if (this->stateFlags & ELFGRP_STATE_0) { Actor_PlaySfx_Flagged(&this->actor, NA_SE_EV_FAIRY_GROUP_FRY - SFX_FLAG); } } void func_80A3A274(EnElfgrp* this, PlayState* play) { if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_100)) { - if (this->unk_14A & 1) { + if (this->stateFlags & ELFGRP_STATE_0) { Actor_PlaySfx_Flagged(&this->actor, NA_SE_PL_CHIBI_FAIRY_HEAL - SFX_FLAG); } switch (play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_100)]->id) { case 2: - if (!(this->unk_14A & 1)) { - if (this->unk_147 == ENELFGRP_0) { - func_80A39DC8(this, play, 1, 1); + if (!(this->stateFlags & ELFGRP_STATE_0)) { + if (this->type == ENELFGRP_TYPE_MAGIC) { // Clock Town + EnElfgrp_SpawnStrayFairies(this, play, 1, SPAWNED_STRAY_FAIRY_TYPE_RETURNING); } else { - func_80A39DC8(this, play, func_80A39BD0(play, this->unk_147), 1); + EnElfgrp_SpawnStrayFairies(this, play, EnElfgrp_GetHeldFairiesCount(play, this->type), + SPAWNED_STRAY_FAIRY_TYPE_RETURNING); } - this->unk_14A |= 1; - func_80A39CD4(play, this->unk_147, 25); + this->stateFlags |= ELFGRP_STATE_0; + EnElfgrp_SetFountainFairiesCount(play, this->type, STRAY_FAIRY_TOTAL); } break; case 3: - func_80A39F50(play); + EnElfgrp_SummonStrayFairies(play); this->actionFunc = func_80A3A210; - this->unk_144 = 90; + this->timer = 90; break; default: @@ -423,28 +480,30 @@ void func_80A3A398(EnElfgrp* this, PlayState* play) { if (CutsceneManager_IsNext(this->actor.csId)) { CutsceneManager_StartWithPlayerCs(this->actor.csId, &this->actor); this->actionFunc = func_80A3A274; - Flags_UnsetSwitch(play, ENELFGRP_GET_FE00(&this->actor)); - if (this->unk_14A & 2) { + Flags_UnsetSwitch(play, ENELFGRP_GET_SWITCHFLAG_PARAMS(&this->actor)); + + if (this->stateFlags & ELFGRP_STATE_1) { Item_Give(play, ITEM_MASK_GREAT_FAIRY); } - if ((this->unk_14A & 4) != 0) { - SET_WEEKEVENTREG(WEEKEVENTREG_23_02); + if (this->stateFlags & ELFGRP_STATE_2) { + SET_WEEKEVENTREG(WEEKEVENTREG_OBTAINED_GREAT_SPIN_ATTACK); } - if (this->unk_14A & 0x10) { + if (this->stateFlags & ELFGRP_STATE_4) { Item_Give(play, ITEM_SWORD_GREAT_FAIRY); } - this->unk_14A &= ~8; + + this->stateFlags &= ~ELFGRP_STATE_3; } else if (this->actor.xzDistToPlayer < 350.0f) { CutsceneManager_Queue(this->actor.csId); } } void func_80A3A484(EnElfgrp* this, PlayState* play) { - if (this->unk_144 == 0) { + if (this->timer == 0) { this->actionFunc = func_80A3A0F4; - this->unk_144 = 30; + this->timer = 30; } } @@ -454,51 +513,51 @@ void func_80A3A4AC(EnElfgrp* this, PlayState* play) { if (cueId == 3) { this->actionFunc = func_80A3A484; - this->unk_144 = 90; + this->timer = 90; } } } void func_80A3A520(EnElfgrp* this, PlayState* play) { if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_103)) { - this->actionFunc = func_80A3A600; + this->actionFunc = EnElfgrp_DoNothing; } else if (CutsceneManager_IsNext(this->actor.csId)) { CutsceneManager_StartWithPlayerCs(this->actor.csId, &this->actor); this->actionFunc = func_80A3A4AC; - Flags_SetSwitch(play, ENELFGRP_GET_FE00(&this->actor)); + Flags_SetSwitch(play, ENELFGRP_GET_SWITCHFLAG_PARAMS(&this->actor)); - if (this->unk_14A & 2) { + if (this->stateFlags & ELFGRP_STATE_1) { Item_Give(play, ITEM_MASK_GREAT_FAIRY); } - if (this->actor.home.rot.z != 0) { - Flags_SetSwitch(play, this->actor.home.rot.z); + if (ENELFGRP_GET_SWITCHFLAG_ROT(&this->actor) != 0) { + Flags_SetSwitch(play, ENELFGRP_GET_SWITCHFLAG_ROT(&this->actor)); } } else if (this->actor.xzDistToPlayer < 350.0f) { CutsceneManager_Queue(this->actor.csId); } } -void func_80A3A600(EnElfgrp* this, PlayState* play) { +void EnElfgrp_DoNothing(EnElfgrp* this, PlayState* play) { } -void func_80A3A610(EnElfgrp* this, PlayState* play) { +void EnElfgrp_HealPlayer(EnElfgrp* this, PlayState* play) { Player* player = GET_PLAYER(play); - if (this->unk_144 == 60) { + if (this->timer == 60) { Magic_Add(play, MAGIC_FILL_TO_CAPACITY); - gSaveContext.healthAccumulator = 320; + gSaveContext.healthAccumulator = 0x140; } - if (this->unk_144 > 0) { + if (this->timer > 0) { player->actor.freezeTimer = 100; player->stateFlags1 |= PLAYER_STATE1_20000000; Actor_PlaySfx(&this->actor, NA_SE_EV_FAIRY_GROUP_HEAL - SFX_FLAG); } else { player->actor.freezeTimer = 0; player->stateFlags1 &= ~PLAYER_STATE1_20000000; - this->actionFunc = func_80A3A600; - this->unk_14A |= 8; + this->actionFunc = EnElfgrp_DoNothing; + this->stateFlags |= ELFGRP_STATE_3; } } @@ -509,9 +568,9 @@ void func_80A3A6F4(EnElfgrp* this, PlayState* play) { if (Actor_TextboxIsClosing(&this->actor, play)) { player->actor.freezeTimer = 100; player->stateFlags1 |= PLAYER_STATE1_20000000; - this->unk_144 = func_80A39FBC(play); - this->actionFunc = func_80A3A610; - this->unk_14A &= ~8; + this->timer = EnElfgrp_SpinStrayFairies(play); + this->actionFunc = EnElfgrp_HealPlayer; + this->stateFlags &= ~ELFGRP_STATE_3; } } @@ -521,25 +580,27 @@ void func_80A3A77C(EnElfgrp* this, PlayState* play) { player->actor.freezeTimer = 100; player->stateFlags1 |= PLAYER_STATE1_20000000; if (Actor_TextboxIsClosing(&this->actor, play)) { - this->unk_144 = func_80A39FBC(play); - this->actionFunc = func_80A3A610; - this->unk_14A &= ~8; + this->timer = EnElfgrp_SpinStrayFairies(play); + this->actionFunc = EnElfgrp_HealPlayer; + this->stateFlags &= ~ELFGRP_STATE_3; } } void func_80A3A7FC(EnElfgrp* this, PlayState* play) { - s32 temp_s0; + s32 curTotalFairies; if (Actor_ProcessTalkRequest(&this->actor, &play->state)) { - gSaveContext.save.saveInfo.weekEventReg[9] |= this->unk_146; + gSaveContext.save.saveInfo.weekEventReg[9] |= this->talkedOnceFlag; this->actionFunc = func_80A3A6F4; - temp_s0 = func_80A39BD0(play, this->unk_147); - func_80A39DC8(this, play, temp_s0, 1); - temp_s0 += func_80A39C1C(play, this->unk_147); - if (temp_s0 > 25) { - temp_s0 = 25; + + curTotalFairies = EnElfgrp_GetHeldFairiesCount(play, this->type); + EnElfgrp_SpawnStrayFairies(this, play, curTotalFairies, SPAWNED_STRAY_FAIRY_TYPE_RETURNING); + curTotalFairies += EnElfgrp_GetFountainFairiesCount(play, this->type); + if (curTotalFairies > STRAY_FAIRY_TOTAL) { + curTotalFairies = STRAY_FAIRY_TOTAL; } - func_80A39CD4(play, this->unk_147, temp_s0); + + EnElfgrp_SetFountainFairiesCount(play, this->type, curTotalFairies); } else if (this->actor.xzDistToPlayer < 280.0f) { this->actor.flags |= ACTOR_FLAG_10000; Actor_OfferTalk(&this->actor, play, 300.0f); @@ -551,13 +612,13 @@ void func_80A3A8F8(EnElfgrp* this, PlayState* play) { Player* player = GET_PLAYER(play); if (Actor_ProcessTalkRequest(&this->actor, &play->state)) { - gSaveContext.save.saveInfo.weekEventReg[9] |= this->unk_146; + gSaveContext.save.saveInfo.weekEventReg[9] |= this->talkedOnceFlag; this->actionFunc = func_80A3A6F4; return; } - if (this->unk_147 != ENELFGRP_0) { - if (func_80A39BD0(play, this->unk_147) > 0) { + if (this->type != ENELFGRP_TYPE_MAGIC) { + if (EnElfgrp_GetHeldFairiesCount(play, this->type) > 0) { this->actionFunc = func_80A3A7FC; return; } @@ -570,7 +631,7 @@ void func_80A3A8F8(EnElfgrp* this, PlayState* play) { player->stateFlags1 |= PLAYER_STATE1_20000000; Message_StartTextbox(play, this->actor.textId, &this->actor); this->actionFunc = func_80A3A77C; - gSaveContext.save.saveInfo.weekEventReg[9] |= this->unk_146; + gSaveContext.save.saveInfo.weekEventReg[9] |= this->talkedOnceFlag; } else { this->actor.flags |= ACTOR_FLAG_10000; Actor_OfferTalk(&this->actor, play, 100.0f); @@ -585,11 +646,11 @@ void EnElfgrp_Update(Actor* thisx, PlayState* play) { this->actionFunc(this, play); - if (this->unk_14A & 8) { + if (this->stateFlags & ELFGRP_STATE_3) { Actor_PlaySfx(&this->actor, NA_SE_EV_FAIRY_GROUP_FRY - SFX_FLAG); } - if (this->unk_144 != 0) { - this->unk_144--; + if (this->timer != 0) { + this->timer--; } } diff --git a/src/overlays/actors/ovl_En_Elfgrp/z_en_elfgrp.h b/src/overlays/actors/ovl_En_Elfgrp/z_en_elfgrp.h index 692a76d82..d9767fb2f 100644 --- a/src/overlays/actors/ovl_En_Elfgrp/z_en_elfgrp.h +++ b/src/overlays/actors/ovl_En_Elfgrp/z_en_elfgrp.h @@ -2,29 +2,32 @@ #define Z_EN_ELFGRP_H #include "global.h" +#include "overlays/actors/ovl_Bg_Dy_Yoseizo/z_bg_dy_yoseizo.h" struct EnElfgrp; typedef void (*EnElfgrpActionFunc)(struct EnElfgrp*, PlayState*); -#define ENELFGRP_GET(thisx) ((thisx)->params & 0xF) -#define ENELFGRP_GET_FE00(thisx) (((thisx)->params & 0xFE00) >> 9) +#define ENELFGRP_GET_TYPE(thisx) ((thisx)->params & 0xF) //!< Same type as Great Fairies +#define ENELFGRP_GET_SWITCHFLAG_PARAMS(thisx) (((thisx)->params & 0xFE00) >> 9) +#define ENELFGRP_GET_SWITCHFLAG_ROT(thisx) ((thisx)->home.rot.z) -typedef enum { - /* 0 */ ENELFGRP_0, - /* 2 */ ENELFGRP_1, - /* 2 */ ENELFGRP_2, - /* 3 */ ENELFGRP_3, - /* 4 */ ENELFGRP_4 -} EnElfgrpParam; +typedef enum ElfgrpType { + /* 0 */ ENELFGRP_TYPE_MAGIC = GREAT_FAIRY_TYPE_MAGIC, + /* 1 */ ENELFGRP_TYPE_POWER = GREAT_FAIRY_TYPE_POWER, + /* 2 */ ENELFGRP_TYPE_WISDOM = GREAT_FAIRY_TYPE_WISDOM, + /* 3 */ ENELFGRP_TYPE_COURAGE = GREAT_FAIRY_TYPE_COURAGE, + /* 4 */ ENELFGRP_TYPE_KINDNESS = GREAT_FAIRY_TYPE_KINDNESS, + /* 5 */ ENELFGRP_TYPE_MAX +} ElfgrpType; typedef struct EnElfgrp { /* 0x000 */ Actor actor; - /* 0x144 */ s16 unk_144; - /* 0x146 */ u8 unk_146; - /* 0x147 */ u8 unk_147; - /* 0x148 */ s8 unk_148; - /* 0x14A */ u16 unk_14A; + /* 0x144 */ s16 timer; + /* 0x146 */ u8 talkedOnceFlag; + /* 0x147 */ u8 type; + /* 0x148 */ s8 unk_148; // set and not used + /* 0x14A */ u16 stateFlags; /* 0x14C */ EnElfgrpActionFunc actionFunc; } EnElfgrp; // size = 0x150 diff --git a/src/overlays/actors/ovl_En_Elforg/z_en_elforg.c b/src/overlays/actors/ovl_En_Elforg/z_en_elforg.c index f57f8e066..27dc844e7 100644 --- a/src/overlays/actors/ovl_En_Elforg/z_en_elforg.c +++ b/src/overlays/actors/ovl_En_Elforg/z_en_elforg.c @@ -96,7 +96,7 @@ void EnElforg_Init(Actor* thisx, PlayState* play) { case STRAY_FAIRY_TYPE_FAIRY_FOUNTAIN: case STRAY_FAIRY_TYPE_BUBBLE: case STRAY_FAIRY_TYPE_CHEST: - case STRAY_FAIRY_TYPE_TURN_IN_TO_FAIRY_FOUNTAIN: + case STRAY_FAIRY_TYPE_RETURNING_TO_FOUNTAIN: break; default: @@ -121,7 +121,7 @@ void EnElforg_Init(Actor* thisx, PlayState* play) { this->targetDistanceFromHome = Rand_ZeroFloat(100.0f) + 50.0f; break; - case STRAY_FAIRY_TYPE_TURN_IN_TO_FAIRY_FOUNTAIN: + case STRAY_FAIRY_TYPE_RETURNING_TO_FOUNTAIN: EnElforg_InitializeParams(this); this->actionFunc = EnElforg_TurnInFairy; this->secondaryTimer = 60; @@ -324,6 +324,7 @@ void EnElforg_TurnInFairy(EnElforg* this, PlayState* play) { void EnElforg_QuicklyCircleFairyFountain(EnElforg* this, PlayState* play) { SkelAnime_Update(&this->skelAnime); EnElforg_MoveToTargetFairyFountain(this, &this->actor.home.pos); + if (this->secondaryTimer <= 30) { this->actionFunc = EnElforg_TurnInFairy; } @@ -367,9 +368,9 @@ void EnElforg_FreeFloatingFairyFountain(EnElforg* this, PlayState* play) { if (this->strayFairyFlags & STRAY_FAIRY_FLAG_SPARKLES_AND_SHRINKS) { // This happens right before the Great Fairy appears once all // Stray Fairies are saved. - if (this->actor.home.rot.x > 0) { + if (STRAY_FAIRY_SPARKLE_COUNT(&this->actor) > 0) { EnElforg_SpawnSparkles(this, play, 10); - this->actor.home.rot.x--; + STRAY_FAIRY_SPARKLE_COUNT(&this->actor)--; } Actor_SetScale(&this->actor, this->actor.scale.x * 0.9f); @@ -383,22 +384,24 @@ void EnElforg_CirclePlayer(EnElforg* this, PlayState* play) { s32 pad; Actor* playerActor = &GET_PLAYER(play)->actor; Player* player = GET_PLAYER(play); - f32 distanceFromPlayer; + f32 orbitRadius; if (GET_PLAYER_FORM == PLAYER_FORM_GORON) { - distanceFromPlayer = 40.0f; + orbitRadius = 40.0f; } else { - distanceFromPlayer = 20.0f; + orbitRadius = 20.0f; } - this->actor.world.pos.x = (Math_SinS(this->timer * 0x1000) * distanceFromPlayer) + playerActor->world.pos.x; - this->actor.world.pos.z = (Math_CosS(this->timer * 0x1000) * distanceFromPlayer) + playerActor->world.pos.z; + this->actor.world.pos.x = (Math_SinS(this->timer * 0x1000) * orbitRadius) + playerActor->world.pos.x; + this->actor.world.pos.z = (Math_CosS(this->timer * 0x1000) * orbitRadius) + playerActor->world.pos.z; this->actor.world.pos.y = player->bodyPartsPos[PLAYER_BODYPART_WAIST].y; + EnElforg_SpawnSparkles(this, play, 16); } void EnElforg_FairyCollected(EnElforg* this, PlayState* play) { EnElforg_CirclePlayer(this, play); + if (this->timer > 80) { Actor_Kill(&this->actor); return; @@ -424,8 +427,10 @@ void EnElforg_ClockTownFairyCollected(EnElforg* this, PlayState* play) { Player* player = GET_PLAYER(play); EnElforg_CirclePlayer(this, play); + player->actor.freezeTimer = 100; player->stateFlags1 |= PLAYER_STATE1_20000000; + if (Actor_TextboxIsClosing(&this->actor, play)) { player->actor.freezeTimer = 0; player->stateFlags1 &= ~PLAYER_STATE1_20000000; @@ -451,6 +456,7 @@ void EnElforg_FreeFloating(EnElforg* this, PlayState* play) { Player* player = GET_PLAYER(play); SkelAnime_Update(&this->skelAnime); + if (Player_GetMask(play) == PLAYER_MASK_GREAT_FAIRY) { pos = player->bodyPartsPos[PLAYER_BODYPART_WAIST]; this->targetSpeedXZ = 5.0f; @@ -461,10 +467,12 @@ void EnElforg_FreeFloating(EnElforg* this, PlayState* play) { } scaledYDistance = this->actor.playerHeightRel - (this->actor.shape.yOffset * this->actor.scale.y); + if (!Player_InCsMode(play)) { if ((this->actor.xzDistToPlayer < 30.0f) && (scaledYDistance < 12.0f) && (scaledYDistance > -68.0f)) { EnElforg_SetupFairyCollected(this, play); Health_ChangeBy(play, 0x30); + switch (STRAY_FAIRY_TYPE(&this->actor)) { case STRAY_FAIRY_TYPE_COLLECTIBLE: Flags_SetCollectible(play, STRAY_FAIRY_FLAG(&this->actor)); @@ -493,7 +501,8 @@ void EnElforg_FreeFloating(EnElforg* this, PlayState* play) { gSaveContext.save.saveInfo.inventory.strayFairies[gSaveContext.dungeonIndex]++; // You found a Stray Fairy! Message_StartTextbox(play, 0x11, NULL); - if (gSaveContext.save.saveInfo.inventory.strayFairies[(void)0, gSaveContext.dungeonIndex] >= 15) { + if (gSaveContext.save.saveInfo.inventory.strayFairies[(void)0, gSaveContext.dungeonIndex] >= + STRAY_FAIRY_SCATTERED_TOTAL) { Audio_PlayFanfare(NA_BGM_GET_ITEM | 0x900); } } @@ -502,6 +511,7 @@ void EnElforg_FreeFloating(EnElforg* this, PlayState* play) { Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 20.0f, 20.0f, UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_2 | UPDBGCHECKINFO_FLAG_4); func_80ACCBB8(this, play); + if (Player_GetMask(play) == PLAYER_MASK_GREAT_FAIRY) { if (!(this->strayFairyFlags & STRAY_FAIRY_FLAG_GREAT_FAIRYS_MASK_EQUIPPED)) { Audio_PlaySfx(NA_SE_SY_FAIRY_MASK_SUCCESS); @@ -627,6 +637,7 @@ void EnElforg_Draw(Actor* thisx, PlayState* play) { OPEN_DISPS(play->state.gfxCtx); Gfx_SetupDL25_Xlu(play->state.gfxCtx); + switch (this->area) { case STRAY_FAIRY_AREA_WOODFALL: AnimatedMat_Draw(play, Lib_SegmentedToVirtual(gStrayFairyWoodfallTexAnim)); @@ -644,7 +655,7 @@ void EnElforg_Draw(Actor* thisx, PlayState* play) { AnimatedMat_Draw(play, Lib_SegmentedToVirtual(gStrayFairyStoneTowerTexAnim)); break; - default: + default: // STRAY_FAIRY_AREA_CLOCK_TOWN AnimatedMat_Draw(play, Lib_SegmentedToVirtual(gStrayFairyClockTownTexAnim)); break; } diff --git a/src/overlays/actors/ovl_En_Elforg/z_en_elforg.h b/src/overlays/actors/ovl_En_Elforg/z_en_elforg.h index 798982b09..7bb8672b1 100644 --- a/src/overlays/actors/ovl_En_Elforg/z_en_elforg.h +++ b/src/overlays/actors/ovl_En_Elforg/z_en_elforg.h @@ -2,36 +2,41 @@ #define Z_EN_ELFORG_H #include "global.h" +#include "overlays/actors/ovl_Bg_Dy_Yoseizo/z_bg_dy_yoseizo.h" #include "objects/gameplay_keep/gameplay_keep.h" #define STRAY_FAIRY_TYPE(thisx) ((thisx)->params & 0xF) #define STRAY_FAIRY_GET_NON_DUNGEON_AREA(thisx) (((thisx)->params & 0x1C0) >> 6) #define STRAY_FAIRY_FLAG(thisx) (((thisx)->params & 0xFE00) >> 9) -#define STRAY_FAIRY_PARAMS(flag, nonDungeonArea, type) (((flag & 0x7F) << 9) | ((nonDungeonArea & 7) << 6) | (type & 0xF)) +#define STRAY_FAIRY_SPARKLE_COUNT(thisx) ((thisx)->home.rot.x) + +//! @note `nonDungeonArea` does not always use the enum +#define STRAY_FAIRY_PARAMS(flag, nonDungeonArea, type) ((((flag) & 0x7F) << 9) | (((nonDungeonArea) & 7) << 6) | ((type) & 0xF)) #define STRAY_FAIRY_FLAG_MOVES_QUICKLY_TO_HOME (1 << 0) #define STRAY_FAIRY_FLAG_SPARKLES_AND_SHRINKS (1 << 1) #define STRAY_FAIRY_FLAG_CIRCLES_QUICKLY_IN_FOUNTAIN (1 << 2) #define STRAY_FAIRY_FLAG_GREAT_FAIRYS_MASK_EQUIPPED (1 << 3) -typedef enum { - /* 0 */ STRAY_FAIRY_TYPE_FREE_FLOATING, // The ones just floating around - /* 1 */ STRAY_FAIRY_TYPE_FAIRY_FOUNTAIN, // The ones already present when you enter a Fairy Fountain - /* 2 */ STRAY_FAIRY_TYPE_BUBBLE, // The ones trapped in bubbles - /* 3 */ STRAY_FAIRY_TYPE_CLOCK_TOWN, // The free-floating Stray Fairies in Clock Town - /* 4 */ STRAY_FAIRY_TYPE_ENEMY, // The ones trapped inside enemies - /* 5 */ STRAY_FAIRY_TYPE_COLLIDER, // Unused in retail. The fairy is hidden until the collider is hit - /* 6 */ STRAY_FAIRY_TYPE_CHEST, // The ones in treasure chests - /* 7 */ STRAY_FAIRY_TYPE_COLLECTIBLE, // The ones in boxes, pots, beehives, etc. - /* 8 */ STRAY_FAIRY_TYPE_TURN_IN_TO_FAIRY_FOUNTAIN // The ones you "turn in" by walking into a Fairy Fountain +typedef enum StrayFairyType { + /* 0 */ STRAY_FAIRY_TYPE_FREE_FLOATING, // The ones just floating around + /* 1 */ STRAY_FAIRY_TYPE_FAIRY_FOUNTAIN, // The ones already present when you enter a Fairy Fountain + /* 2 */ STRAY_FAIRY_TYPE_BUBBLE, // The ones trapped in bubbles + /* 3 */ STRAY_FAIRY_TYPE_CLOCK_TOWN, // The free-floating Stray Fairies in Clock Town + /* 4 */ STRAY_FAIRY_TYPE_ENEMY, // The ones trapped inside enemies + /* 5 */ STRAY_FAIRY_TYPE_COLLIDER, // Unused in retail. The fairy is hidden until the collider is hit + /* 6 */ STRAY_FAIRY_TYPE_CHEST, // The ones in treasure chests + /* 7 */ STRAY_FAIRY_TYPE_COLLECTIBLE, // The ones in boxes, pots, beehives, etc. + /* 8 */ STRAY_FAIRY_TYPE_RETURNING_TO_FOUNTAIN // The ones you "turn in" by walking into a Fairy Fountain } StrayFairyType; -typedef enum { - /* 0 */ STRAY_FAIRY_AREA_CLOCK_TOWN, - /* 1 */ STRAY_FAIRY_AREA_WOODFALL, - /* 2 */ STRAY_FAIRY_AREA_SNOWHEAD, - /* 3 */ STRAY_FAIRY_AREA_GREAT_BAY, - /* 4 */ STRAY_FAIRY_AREA_STONE_TOWER, +// Corresponds to the Great Fairy types +typedef enum StrayFairyArea { + /* 0 */ STRAY_FAIRY_AREA_CLOCK_TOWN = GREAT_FAIRY_TYPE_MAGIC, + /* 1 */ STRAY_FAIRY_AREA_WOODFALL = GREAT_FAIRY_TYPE_POWER, + /* 2 */ STRAY_FAIRY_AREA_SNOWHEAD = GREAT_FAIRY_TYPE_WISDOM, + /* 3 */ STRAY_FAIRY_AREA_GREAT_BAY = GREAT_FAIRY_TYPE_COURAGE, + /* 4 */ STRAY_FAIRY_AREA_STONE_TOWER = GREAT_FAIRY_TYPE_KINDNESS, /* 5 */ STRAY_FAIRY_AREA_MAX } StrayFairyArea; diff --git a/src/overlays/actors/ovl_En_M_Thunder/z_en_m_thunder.c b/src/overlays/actors/ovl_En_M_Thunder/z_en_m_thunder.c index d6f34a256..b09f8f54d 100644 --- a/src/overlays/actors/ovl_En_M_Thunder/z_en_m_thunder.c +++ b/src/overlays/actors/ovl_En_M_Thunder/z_en_m_thunder.c @@ -143,7 +143,7 @@ void EnMThunder_Init(Actor* thisx, PlayState* play) { player->stateFlags2 &= ~PLAYER_STATE2_20000; this->isCharging = false; - if (CHECK_WEEKEVENTREG(WEEKEVENTREG_23_02)) { + if (CHECK_WEEKEVENTREG(WEEKEVENTREG_OBTAINED_GREAT_SPIN_ATTACK)) { player->unk_B08 = 1.0f; this->collider.info.toucher.damage = sDamages[this->type + ENMTHUNDER_TYPE_MAX]; this->subtype = ENMTHUNDER_SUBTYPE_SPIN_GREAT; diff --git a/src/overlays/actors/ovl_Obj_Flowerpot/z_obj_flowerpot.c b/src/overlays/actors/ovl_Obj_Flowerpot/z_obj_flowerpot.c index aca30fe92..cd8632659 100644 --- a/src/overlays/actors/ovl_Obj_Flowerpot/z_obj_flowerpot.c +++ b/src/overlays/actors/ovl_Obj_Flowerpot/z_obj_flowerpot.c @@ -255,7 +255,7 @@ void func_80A1BA44(ObjFlowerpot* this, PlayState* play) { } EffectSsKakera_Spawn(play, &spC4, &spB8, &spC4, -600, phi_s0, 30, 0, 0, (Rand_ZeroOne() * 12.0f) + 16.6f, - phi_s1, 0, 35, -1, ACTOR_DEMO_GETITEM, object_flowerpot_DL_0015B0); + phi_s1, 0, 35, -1, OBJECT_FLOWERPOT, object_flowerpot_DL_0015B0); } spD0.y += 20.0f; @@ -298,7 +298,7 @@ void func_80A1BD80(ObjFlowerpot* this, PlayState* play) { } EffectSsKakera_Spawn(play, &spBC, &spB0, &spBC, -240, phi_s0, 40, 0, 0, (Rand_ZeroOne() * 20.0f) + 10.6f, 0, 0, - 42, -1, ACTOR_DEMO_GETITEM, object_flowerpot_DL_0015B0); + 42, -1, OBJECT_FLOWERPOT, object_flowerpot_DL_0015B0); } spBC.y = this->actor.world.pos.y + this->actor.depthInWater; @@ -338,7 +338,7 @@ void func_80A1C0FC(ObjFlowerpot* this, PlayState* play) { Math_Vec3f_Sum(&spB8, &spC4, &spB8); EffectSsKakera_Spawn(play, &spB8, &spAC, &spB8, -100, 64, 40, 0, 0, (Rand_ZeroOne() * 16.0f) + 14.0f, 0, 0, 80, - -1, ACTOR_DEMO_GETITEM, object_flowerpot_DL_0014F0); + -1, OBJECT_FLOWERPOT, object_flowerpot_DL_0014F0); } } @@ -365,7 +365,7 @@ void func_80A1C328(ObjFlowerpot* this, PlayState* play) { Math_Vec3f_Sum(&spB8, &spC4, &spB8); EffectSsKakera_Spawn(play, &spB8, &spAC, &spB8, -80, 64, 44, 0, 0, (Rand_ZeroOne() * 16.0f) + 14.0f, 0, 0, 80, - -1, ACTOR_DEMO_GETITEM, object_flowerpot_DL_0014F0); + -1, OBJECT_FLOWERPOT, object_flowerpot_DL_0014F0); } } diff --git a/src/overlays/actors/ovl_Obj_Lightblock/z_obj_lightblock.c b/src/overlays/actors/ovl_Obj_Lightblock/z_obj_lightblock.c index 6a6937e7e..f8ee482df 100644 --- a/src/overlays/actors/ovl_Obj_Lightblock/z_obj_lightblock.c +++ b/src/overlays/actors/ovl_Obj_Lightblock/z_obj_lightblock.c @@ -5,6 +5,7 @@ */ #include "z_obj_lightblock.h" +#include "overlays/actors/ovl_Demo_Effect/z_demo_effect.h" #include "objects/object_lightblock/object_lightblock.h" #define FLAGS 0x00000000 @@ -15,12 +16,12 @@ void ObjLightblock_Init(Actor* thisx, PlayState* play); void ObjLightblock_Destroy(Actor* thisx, PlayState* play); void ObjLightblock_Update(Actor* thisx, PlayState* play); void ObjLightblock_Draw(Actor* thisx, PlayState* play); -void func_80AF3AC8(ObjLightblock* this); -void func_80AF3ADC(ObjLightblock* this, PlayState* play); -void func_80AF3B8C(ObjLightblock* this); -void func_80AF3BA0(ObjLightblock* this, PlayState* play); -void func_80AF3C18(ObjLightblock* this); -void func_80AF3C34(ObjLightblock* this, PlayState* play); +void ObjLightblock_SetupWait(ObjLightblock* this); +void ObjLightblock_Wait(ObjLightblock* this, PlayState* play); +void ObjLightblock_SetupPlayCutscene(ObjLightblock* this); +void ObjLightblock_PlayCutscene(ObjLightblock* this, PlayState* play); +void ObjLightblock_SetupFadeAway(ObjLightblock* this); +void ObjLightblock_FadeAway(ObjLightblock* this, PlayState* play); ActorInit Obj_Lightblock_InitVars = { ACTOR_OBJ_LIGHTBLOCK, @@ -54,17 +55,17 @@ static ColliderCylinderInit sCylinderInit = { { 84, 120, 0, { 0, 0, 0 } }, }; -typedef struct { +typedef struct LightblockTypeVars { /* 0x0 */ f32 scale; /* 0x4 */ s16 radius; /* 0x6 */ s16 height; /* 0x8 */ s16 yShift; - /* 0xC */ s32 params; + /* 0xC */ s32 effectParams; } LightblockTypeVars; // size = 0x10 static LightblockTypeVars sLightblockTypeVars[] = { - { 0.1f, 76, 80, 19, 2 }, - { (1.0f / 6), 126, 144, 19, 3 }, + { 0.1f, 76, 80, 19, DEMO_EFFECT_TIMEWARP_LIGHTBLOCK_LARGE }, + { (1.0f / 6.0f), 126, 144, 19, DEMO_EFFECT_TIMEWARP_LIGHTBLOCK_VERY_LARGE }, }; static InitChainEntry sInitChain[] = { @@ -76,11 +77,11 @@ static InitChainEntry sInitChain[] = { extern Gfx D_801AEF88[]; extern Gfx D_801AEFA0[]; -void func_80AF3910(ObjLightblock* this, PlayState* play) { +void ObjLightblock_SpawnEffect(ObjLightblock* this, PlayState* play) { LightblockTypeVars* typeVars = &sLightblockTypeVars[LIGHTBLOCK_TYPE(&this->dyna.actor)]; Actor_Spawn(&play->actorCtx, play, ACTOR_DEMO_EFFECT, this->dyna.actor.world.pos.x, this->dyna.actor.world.pos.y, - this->dyna.actor.world.pos.z, 0, 0, 0, typeVars->params); + this->dyna.actor.world.pos.z, 0, 0, 0, typeVars->effectParams); } void ObjLightblock_Init(Actor* thisx, PlayState* play) { @@ -104,7 +105,7 @@ void ObjLightblock_Init(Actor* thisx, PlayState* play) { this->collider.dim.height = typeVars->height; this->collider.dim.yShift = typeVars->yShift; this->alpha = 255; - func_80AF3AC8(this); + ObjLightblock_SetupWait(this); } void ObjLightblock_Destroy(Actor* thisx, PlayState* play) { @@ -114,11 +115,14 @@ void ObjLightblock_Destroy(Actor* thisx, PlayState* play) { Collider_DestroyCylinder(play, &this->collider); } -void func_80AF3AC8(ObjLightblock* this) { - this->actionFunc = func_80AF3ADC; +void ObjLightblock_SetupWait(ObjLightblock* this) { + this->actionFunc = ObjLightblock_Wait; } -void func_80AF3ADC(ObjLightblock* this, PlayState* play) { +/** + * Wait for a single collision from a Light Arrow or 8 frames of Mirror Shield ray collision. + */ +void ObjLightblock_Wait(ObjLightblock* this, PlayState* play) { if (this->collider.base.acFlags & AC_HIT) { this->collider.base.acFlags &= ~AC_HIT; // light arrows @@ -135,39 +139,36 @@ void func_80AF3ADC(ObjLightblock* this, PlayState* play) { if (this->collisionCounter >= 8) { CutsceneManager_Queue(this->dyna.actor.csId); - func_80AF3B8C(this); + ObjLightblock_SetupPlayCutscene(this); } else { CollisionCheck_SetAC(play, &play->colChkCtx, &this->collider.base); } } -void func_80AF3B8C(ObjLightblock* this) { - this->actionFunc = func_80AF3BA0; +void ObjLightblock_SetupPlayCutscene(ObjLightblock* this) { + this->actionFunc = ObjLightblock_PlayCutscene; } -void func_80AF3BA0(ObjLightblock* this, PlayState* play) { +void ObjLightblock_PlayCutscene(ObjLightblock* this, PlayState* play) { if (CutsceneManager_IsNext(this->dyna.actor.csId)) { CutsceneManager_StartWithPlayerCs(this->dyna.actor.csId, &this->dyna.actor); Flags_SetSwitch(play, LIGHTBLOCK_DESTROYED(&this->dyna.actor)); - func_80AF3910(this, play); - func_80AF3C18(this); + ObjLightblock_SpawnEffect(this, play); + ObjLightblock_SetupFadeAway(this); } else { CutsceneManager_Queue(this->dyna.actor.csId); } } -void func_80AF3C18(ObjLightblock* this) { +void ObjLightblock_SetupFadeAway(ObjLightblock* this) { this->timer = 80; - this->actionFunc = func_80AF3C34; + this->actionFunc = ObjLightblock_FadeAway; } -void func_80AF3C34(ObjLightblock* this, PlayState* play) { - s8 csId; - +void ObjLightblock_FadeAway(ObjLightblock* this, PlayState* play) { this->timer--; if (this->timer <= 0) { - csId = this->dyna.actor.csId; - CutsceneManager_Stop(csId); + CutsceneManager_Stop(this->dyna.actor.csId); Actor_Kill(&this->dyna.actor); return; } diff --git a/src/overlays/actors/ovl_player_actor/z_player.c b/src/overlays/actors/ovl_player_actor/z_player.c index d01dbd3be..07e691591 100644 --- a/src/overlays/actors/ovl_player_actor/z_player.c +++ b/src/overlays/actors/ovl_player_actor/z_player.c @@ -10374,7 +10374,7 @@ void func_80840EC0(Player* this, PlayState* play) { // Spin attack size void func_80840F34(Player* this) { - Math_StepToF(&this->unk_B08, (CHECK_WEEKEVENTREG(WEEKEVENTREG_23_02)) ? 1.0f : 0.5f, 0.02f); + Math_StepToF(&this->unk_B08, CHECK_WEEKEVENTREG(WEEKEVENTREG_OBTAINED_GREAT_SPIN_ATTACK) ? 1.0f : 0.5f, 0.02f); } s32 func_80840F90(PlayState* play, Player* this, CsCmdActorCue* cue, f32 arg3, s16 arg4, s32 arg5) { diff --git a/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_map.c b/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_map.c index b4ed531f8..ec1ca83ec 100644 --- a/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_map.c +++ b/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_map.c @@ -19,7 +19,7 @@ void KaleidoScope_DrawDungeonStrayFairyCount(PlayState* play) { OPEN_DISPS(play->state.gfxCtx); // Get digits for max number of stray fairies - counterDigits[1] = 15; + counterDigits[1] = STRAY_FAIRY_SCATTERED_TOTAL; counterDigits[0] = counterDigits[1] / 10; counterDigits[1] -= (s16)(counterDigits[0] * 10); diff --git a/tools/disasm/functions.txt b/tools/disasm/functions.txt index c1137d3b2..8a60d1f66 100644 --- a/tools/disasm/functions.txt +++ b/tools/disasm/functions.txt @@ -6263,17 +6263,17 @@ 0x808CD238:("EnVm_Draw",), 0x808CD740:("DemoEffect_Init",), 0x808CD8E8:("DemoEffect_Destroy",), - 0x808CD940:("func_808CD940",), - 0x808CD998:("func_808CD998",), - 0x808CDAD0:("func_808CDAD0",), - 0x808CDBDC:("func_808CDBDC",), - 0x808CDCEC:("func_808CDCEC",), - 0x808CDD70:("func_808CDD70",), - 0x808CDDE0:("func_808CDDE0",), + 0x808CD940:("DemoEffect_WaitForObject",), + 0x808CD998:("DemoEffect_SetupTimewarp",), + 0x808CDAD0:("DemoEffect_SetPerVertexAlpha",), + 0x808CDBDC:("DemoEffect_FinishTimewarp",), + 0x808CDCEC:("DemoEffect_StartTimewarp",), + 0x808CDD70:("DemoEffect_ShrinkLight",), + 0x808CDDE0:("DemoEffect_ExpandLight",), 0x808CDE54:("DemoEffect_Update",), - 0x808CDE78:("func_808CDE78",), - 0x808CDFF8:("func_808CDFF8",), - 0x808CE078:("func_808CE078",), + 0x808CDE78:("DemoEffect_OverrideLimbDrawTimewarp",), + 0x808CDFF8:("DemoEffect_DrawTimewarp",), + 0x808CE078:("DemoEffect_DrawLight",), 0x808CE450:("DemoKankyo_SetupAction",), 0x808CE45C:("func_808CE45C",), 0x808CF06C:("func_808CF06C",), @@ -9573,9 +9573,9 @@ 0x80A07740:("func_80A07740",), 0x80A0A8A0:("BgDyYoseizo_Init",), 0x80A0A95C:("BgDyYoseizo_Destroy",), - 0x80A0A96C:("func_80A0A96C",), - 0x80A0A9E4:("func_80A0A9E4",), - 0x80A0AA40:("func_80A0AA40",), + 0x80A0A96C:("BgDyYoseizo_UpdateEyes",), + 0x80A0A9E4:("BgDyYoseizo_Bob",), + 0x80A0AA40:("BgDyYoseizo_SpawnEffects",), 0x80A0AD50:("func_80A0AD50",), 0x80A0AE1C:("func_80A0AE1C",), 0x80A0AFDC:("func_80A0AFDC",), @@ -9587,14 +9587,14 @@ 0x80A0B5F0:("func_80A0B5F0",), 0x80A0B75C:("func_80A0B75C",), 0x80A0B834:("func_80A0B834",), - 0x80A0B8CC:("func_80A0B8CC",), + 0x80A0B8CC:("BgDyYoseizo_TrainPlayer",), 0x80A0BB08:("func_80A0BB08",), 0x80A0BC84:("BgDyYoseizo_Update",), - 0x80A0BCD8:("func_80A0BCD8",), - 0x80A0BD40:("func_80A0BD40",), - 0x80A0BE60:("func_80A0BE60",), - 0x80A0BF70:("func_80A0BF70",), - 0x80A0C270:("func_80A0C270",), + 0x80A0BCD8:("BgDyYoseizo_OverrideLimbDraw",), + 0x80A0BD40:("BgDyYoseizo_Draw",), + 0x80A0BE60:("BgDyYoseizo_SpawnEffect",), + 0x80A0BF70:("BgDyYoseizo_UpdateEffects",), + 0x80A0C270:("BgDyYoseizo_DrawEffects",), 0x80A0C780:("EnBoj05_Init",), 0x80A0C790:("EnBoj05_Destroy",), 0x80A0C7A0:("EnBoj05_Update",), @@ -10266,16 +10266,16 @@ 0x80A38FB4:("EnRu_OverrideLimbdraw",), 0x80A390F8:("EnRu_PostLimbdraw",), 0x80A39204:("EnRu_Draw",), - 0x80A396B0:("func_80A396B0",), + 0x80A396B0:("EnElfgrp_SetCutscene",), 0x80A3970C:("EnElfgrp_Init",), 0x80A39BC0:("EnElfgrp_Destroy",), - 0x80A39BD0:("func_80A39BD0",), - 0x80A39C1C:("func_80A39C1C",), - 0x80A39CD4:("func_80A39CD4",), - 0x80A39DC8:("func_80A39DC8",), - 0x80A39F50:("func_80A39F50",), - 0x80A39FBC:("func_80A39FBC",), - 0x80A3A044:("func_80A3A044",), + 0x80A39BD0:("EnElfgrp_GetHeldFairiesCount",), + 0x80A39C1C:("EnElfgrp_GetFountainFairiesCount",), + 0x80A39CD4:("EnElfgrp_SetFountainFairiesCount",), + 0x80A39DC8:("EnElfgrp_SpawnStrayFairies",), + 0x80A39F50:("EnElfgrp_SummonStrayFairies",), + 0x80A39FBC:("EnElfgrp_SpinStrayFairies",), + 0x80A3A044:("EnElfgrp_VanishStrayFairies",), 0x80A3A0AC:("func_80A3A0AC",), 0x80A3A0F4:("func_80A3A0F4",), 0x80A3A210:("func_80A3A210",), @@ -10284,8 +10284,8 @@ 0x80A3A484:("func_80A3A484",), 0x80A3A4AC:("func_80A3A4AC",), 0x80A3A520:("func_80A3A520",), - 0x80A3A600:("func_80A3A600",), - 0x80A3A610:("func_80A3A610",), + 0x80A3A600:("EnElfgrp_DoNothing",), + 0x80A3A610:("EnElfgrp_HealPlayer",), 0x80A3A6F4:("func_80A3A6F4",), 0x80A3A77C:("func_80A3A77C",), 0x80A3A7FC:("func_80A3A7FC",), @@ -10546,8 +10546,8 @@ 0x80A4F4C8:("func_80A4F4C8",), 0x80A4FA40:("DemoGetitem_Init",), 0x80A4FB00:("DemoGetitem_Destroy",), - 0x80A4FB10:("func_80A4FB10",), - 0x80A4FB68:("func_80A4FB68",), + 0x80A4FB10:("DemoGetitem_Wait",), + 0x80A4FB68:("DemoGetitem_PerformCutsceneActions",), 0x80A4FCCC:("DemoGetitem_Update",), 0x80A4FCF0:("DemoGetitem_Draw",), 0x80A4FDD0:("func_80A4FDD0",), @@ -10752,8 +10752,8 @@ 0x80A61040:("BgSpoutFire_Draw",), 0x80A612B0:("EnDyExtra_Destroy",), 0x80A612C0:("EnDyExtra_Init",), - 0x80A61334:("func_80A61334",), - 0x80A613C8:("func_80A613C8",), + 0x80A61334:("EnDyExtra_WaitForTrigger",), + 0x80A613C8:("EnDyExtra_Fall",), 0x80A61470:("EnDyExtra_Update",), 0x80A614C4:("EnDyExtra_Draw",), 0x80A61810:("EnBal_Init",), @@ -12656,15 +12656,15 @@ 0x80AF3144:("EnTest7_Update",), 0x80AF31D0:("func_80AF31D0",), 0x80AF3248:("EnTest7_Draw",), - 0x80AF3910:("func_80AF3910",), + 0x80AF3910:("ObjLightblock_SpawnEffect",), 0x80AF397C:("ObjLightblock_Init",), 0x80AF3A80:("ObjLightblock_Destroy",), - 0x80AF3AC8:("func_80AF3AC8",), - 0x80AF3ADC:("func_80AF3ADC",), - 0x80AF3B8C:("func_80AF3B8C",), - 0x80AF3BA0:("func_80AF3BA0",), - 0x80AF3C18:("func_80AF3C18",), - 0x80AF3C34:("func_80AF3C34",), + 0x80AF3AC8:("ObjLightblock_SetupWait",), + 0x80AF3ADC:("ObjLightblock_Wait",), + 0x80AF3B8C:("ObjLightblock_SetupPlayCutscene",), + 0x80AF3BA0:("ObjLightblock_PlayCutscene",), + 0x80AF3C18:("ObjLightblock_SetupFadeAway",), + 0x80AF3C34:("ObjLightblock_FadeAway",), 0x80AF3CC0:("ObjLightblock_Update",), 0x80AF3CE4:("ObjLightblock_Draw",), 0x80AF3F70:("func_80AF3F70",), diff --git a/tools/disasm/variables.txt b/tools/disasm/variables.txt index 417e27b77..5aaa2f1d0 100644 --- a/tools/disasm/variables.txt +++ b/tools/disasm/variables.txt @@ -10574,27 +10574,11 @@ 0x80A0A88C:("D_80A0A88C","UNK_TYPE4","",0x4), 0x80A0A890:("D_80A0A890","UNK_TYPE4","",0x4), 0x80A0C4A0:("Bg_Dy_Yoseizo_InitVars","UNK_TYPE1","",0x1), - 0x80A0C4C0:("D_80A0C4C0","UNK_TYPE4","",0x4), - 0x80A0C4C4:("D_80A0C4C4","UNK_TYPE4","",0x4), - 0x80A0C4C8:("D_80A0C4C8","UNK_TYPE4","",0x4), - 0x80A0C4CC:("D_80A0C4CC","UNK_TYPE4","",0x4), - 0x80A0C4D0:("D_80A0C4D0","UNK_TYPE4","",0x4), - 0x80A0C4D8:("D_80A0C4D8","UNK_TYPE4","",0x4), - 0x80A0C4DC:("D_80A0C4DC","UNK_TYPE4","",0x4), - 0x80A0C4E0:("D_80A0C4E0","UNK_TYPE4","",0x4), - 0x80A0C4E4:("D_80A0C4E4","UNK_TYPE1","",0x1), - 0x80A0C4F8:("D_80A0C4F8","UNK_TYPE1","",0x1), - 0x80A0C50C:("D_80A0C50C","UNK_TYPE1","",0x1), - 0x80A0C514:("D_80A0C514","UNK_TYPE1","",0x1), - 0x80A0C540:("D_80A0C540","f32","",0x4), - 0x80A0C544:("D_80A0C544","f32","",0x4), - 0x80A0C548:("D_80A0C548","f32","",0x4), - 0x80A0C54C:("D_80A0C54C","f32","",0x4), - 0x80A0C550:("D_80A0C550","f32","",0x4), - 0x80A0C554:("D_80A0C554","f32","",0x4), - 0x80A0C558:("D_80A0C558","f32","",0x4), - 0x80A0C55C:("D_80A0C55C","f32","",0x4), - 0x80A0C560:("D_80A0C560","f32","",0x4), + 0x80A0C4C0:("sAnimations","AnimationHeader*","9",0x24), + 0x80A0C4E4:("sEffectPrimColors","Color_RGB8","6",0x12), + 0x80A0C4F8:("sEffectEnvColors","Color_RGB8","6",0x12), + 0x80A0C50C:("sMouthTextures","UNK_TYPE1","2",0x8), + 0x80A0C514:("sStretchFactors","f32","8",0x20), 0x80A0C7C0:("En_Boj_05_InitVars","UNK_TYPE1","",0x1), 0x80A10860:("sAnimationsBombShopkeeper","UNK_PTR","",0x4), 0x80A10890:("En_Sob1_InitVars","UNK_TYPE1","",0x1), diff --git a/tools/weekeventregconvert.py b/tools/weekeventregconvert.py index 0bde4a5ce..35757a022 100755 --- a/tools/weekeventregconvert.py +++ b/tools/weekeventregconvert.py @@ -189,7 +189,7 @@ weekEventReg = { (22 << 8) | 0x40: "WEEKEVENTREG_22_40", (22 << 8) | 0x80: "WEEKEVENTREG_22_80", (23 << 8) | 0x01: "WEEKEVENTREG_23_01", - (23 << 8) | 0x02: "WEEKEVENTREG_23_02", + (23 << 8) | 0x02: "WEEKEVENTREG_OBTAINED_GREAT_SPIN_ATTACK", (23 << 8) | 0x04: "WEEKEVENTREG_23_04", (23 << 8) | 0x08: "WEEKEVENTREG_23_08", (23 << 8) | 0x10: "WEEKEVENTREG_23_10", diff --git a/undefined_syms.txt b/undefined_syms.txt index 45307fc87..010f94c05 100644 --- a/undefined_syms.txt +++ b/undefined_syms.txt @@ -191,14 +191,6 @@ D_050089D0 = 0x050089D0; D_060002C8 = 0x060002C8; D_060005C4 = 0x060005C4; -// ovl_Bg_Dy_Yoseizo - -D_06008090 = 0x06008090; -D_0600D1B0 = 0x0600D1B0; -D_0600D228 = 0x0600D228; -D_0601C6F4 = 0x0601C6F4; -D_0601C8B4 = 0x0601C8B4; - // ovl_Bg_Lotus D_06000A20 = 0x06000A20; From 9e72c240d9d1190244a0b0a1fd9de1cec4a82bcb Mon Sep 17 00:00:00 2001 From: Derek Hensley Date: Tue, 3 Oct 2023 14:51:45 -0700 Subject: [PATCH 14/16] Z_message (2 NON_MATCHINGS) (#1398) * matched func_8014D62C * matched func_8014D304 * matched func_80149048 * matched func_80159438 & func_8014CDF0 * matched Message_GetState * matched func_80152CAC * matched func_80149454 * matched func_801491DC * matched func_80150A84 * matched func_801496C8 * matched func_80149C18 * func_8014995C progress * matched 8014995C * matched func_80153EF0 * fix MessageContext lottery guess array size to match func_801496C8 * matched 80148D64 * matched func_8014AAD0 * progress func_8014CFDC * matched func_8014CFDC * progress func_801514B0 * progress#2 func_801514B0 * matched func_801514B0 * progress func_8014C70C * Progress on few functions * fix some variables & func name * change unk11F00 type and usages * func_8014C70C matched * match func_8015268c * fix building * format * engi message WIP * enums, cleanup * missed one * oops * even more enums * another oops * func_8015E7EC NON_MATCHING * cleanup Message_DrawTextCredits * MSGMODE cleanup * import sFontWidths * Import z_message_nes data * Message_DrawTextNES draft * fix types in message_nes * Message_DrawTextNES NON_EQUIVALENT * Message_DrawTextNES improvement Co-authored-by: engineer124 <47598039+engineer124@users.noreply.github.com> * Import bss * fixes * Data clean up * Delete Message_Decode m2c output * Readd Message_Update data * import data * func declaration * cleanup * Language enum * fix naming, some flags * Update functions and variables related to the bombers notebook event queue. * Update renamed variables.txt * format * attempt Message_DecodeCredits * begin Message_DecodeNES * decode cleanup * incremental improvements on Message_DecodeNES * oops * more progress * first attempt at Message_Decode * cleanup Message_Decode * Message_Decode progress * good progress on decode loops * more progress * good Message_Decode progress, thank anon * decode creep * big improvements, thanks anon/hatal * small nes improvement * cleanup * match Message_DrawTextDefault, big progress on Message_DrawTextNES * namefixer for save structs * Some cleanup/fix non-equivalencies in decodes * cleanup * Small cleanup * func_80150A84 * TextBoxType enum usage * Format * match Message_DecodeCredit by Maide, small improvement in Message_DrawTextNES * comments * some docs * cleanup, improve matches * Some improvement Co-Authored-By: Santiago * Fixes * Missed * Match Message_DrawTextNES * Move functions to z64message.h * string macros * Small cleanups * 1 more small thing * decompme scratches * Cleanup * Item enum * PR * SEGMENT_ROM_START * PR * format * ocarina cleanup --------- Co-authored-by: andzura Co-authored-by: Angie Co-authored-by: engineer124 Co-authored-by: engineer124 <47598039+engineer124@users.noreply.github.com> Co-authored-by: Zoey Zolotova Co-authored-by: Santiago --- include/functions.h | 64 +- include/variables.h | 131 - include/z64item.h | 21 + include/z64message.h | 37 +- include/z64ocarina.h | 143 +- include/z64save.h | 10 +- spec | 2 - src/code/z_common_data.c | 2 +- src/code/z_demo.c | 8 +- src/code/z_kaleido_setup.c | 2 +- src/code/z_message.c | 5764 ++++++++++++++++- src/code/z_message_nes.c | 1 - src/code/z_message_tables.inc.c | 1172 ++++ src/code/z_parameter.c | 57 +- src/code/z_play.c | 2 +- src/code/z_sram_NES.c | 13 +- .../actors/ovl_Arrow_Fire/z_arrow_fire.c | 2 +- .../actors/ovl_Arrow_Ice/z_arrow_ice.c | 2 +- .../actors/ovl_Arrow_Light/z_arrow_light.c | 2 +- .../actors/ovl_Dm_Char01/z_dm_char01.c | 2 +- .../actors/ovl_Dm_Char08/z_dm_char08.c | 2 +- src/overlays/actors/ovl_Dm_Stk/z_dm_stk.c | 2 +- .../ovl_En_Akindonuts/z_en_akindonuts.c | 24 +- .../actors/ovl_En_Aob_01/z_en_aob_01.c | 8 +- src/overlays/actors/ovl_En_Az/z_en_az.c | 10 +- src/overlays/actors/ovl_En_Baba/z_en_baba.c | 6 +- .../actors/ovl_En_Bji_01/z_en_bji_01.c | 2 +- .../ovl_En_Bom_Bowl_Man/z_en_bom_bowl_man.c | 4 +- src/overlays/actors/ovl_En_Cow/z_en_cow.c | 2 +- src/overlays/actors/ovl_En_Dai/z_en_dai.c | 2 +- src/overlays/actors/ovl_En_Dno/z_en_dno.c | 6 +- .../actors/ovl_En_Fishing/z_en_fishing.c | 2 +- src/overlays/actors/ovl_En_Fsn/z_en_fsn.c | 16 +- src/overlays/actors/ovl_En_Gb2/z_en_gb2.c | 16 +- src/overlays/actors/ovl_En_Geg/z_en_geg.c | 14 +- src/overlays/actors/ovl_En_Gg/z_en_gg.c | 4 +- src/overlays/actors/ovl_En_Gg2/z_en_gg2.c | 2 +- .../actors/ovl_En_Ginko_Man/z_en_ginko_man.c | 2 +- src/overlays/actors/ovl_En_Gk/z_en_gk.c | 8 +- src/overlays/actors/ovl_En_Go/z_en_go.c | 2 +- src/overlays/actors/ovl_En_Gs/z_en_gs.c | 12 +- src/overlays/actors/ovl_En_Hg/z_en_hg.c | 2 +- .../ovl_En_Hidden_Nuts/z_en_hidden_nuts.c | 4 +- .../actors/ovl_En_Hint_Skb/z_en_hint_skb.c | 2 +- src/overlays/actors/ovl_En_Jg/z_en_jg.c | 12 +- .../actors/ovl_En_Kakasi/z_en_kakasi.c | 12 +- .../actors/ovl_En_Kanban/z_en_kanban.c | 5 +- src/overlays/actors/ovl_En_Mk/z_en_mk.c | 2 +- src/overlays/actors/ovl_En_Mnk/z_en_mnk.c | 6 +- .../ovl_En_Okarina_Tag/z_en_okarina_tag.c | 21 +- .../actors/ovl_En_Onpuman/z_en_onpuman.c | 8 +- src/overlays/actors/ovl_En_Osn/z_en_osn.c | 2 +- src/overlays/actors/ovl_En_Ossan/z_en_ossan.c | 6 +- .../actors/ovl_En_Ruppecrow/z_en_ruppecrow.c | 2 +- .../actors/ovl_En_S_Goro/z_en_s_goro.c | 8 +- .../actors/ovl_En_Scopenuts/z_en_scopenuts.c | 4 +- .../actors/ovl_En_Sellnuts/z_en_sellnuts.c | 10 +- src/overlays/actors/ovl_En_Sob1/z_en_sob1.c | 6 +- .../actors/ovl_En_Suttari/z_en_suttari.c | 8 +- .../ovl_En_Syateki_Man/z_en_syateki_man.c | 14 +- src/overlays/actors/ovl_En_Test3/z_en_test3.c | 4 +- src/overlays/actors/ovl_En_Test4/z_en_test4.c | 8 +- src/overlays/actors/ovl_En_Test6/z_en_test6.c | 6 +- .../actors/ovl_En_Time_Tag/z_en_time_tag.c | 14 +- src/overlays/actors/ovl_En_Tk/z_en_tk.c | 8 +- src/overlays/actors/ovl_En_Toto/z_en_toto.c | 11 +- src/overlays/actors/ovl_En_Trt/z_en_trt.c | 10 +- src/overlays/actors/ovl_En_Trt2/z_en_trt2.c | 10 +- .../actors/ovl_En_Warp_tag/z_en_warp_tag.c | 14 +- .../ovl_En_Weather_Tag/z_en_weather_tag.c | 2 +- src/overlays/actors/ovl_En_Yb/z_en_yb.c | 2 +- src/overlays/actors/ovl_En_Zob/z_en_zob.c | 16 +- src/overlays/actors/ovl_En_Zog/z_en_zog.c | 4 +- src/overlays/actors/ovl_En_Zos/z_en_zos.c | 4 +- src/overlays/actors/ovl_En_Zot/z_en_zot.c | 2 +- .../actors/ovl_Obj_Ghaka/z_obj_ghaka.c | 4 +- .../ovl_Obj_Ocarinalift/z_obj_ocarinalift.c | 8 +- src/overlays/actors/ovl_Obj_Um/z_obj_um.c | 2 +- .../ovl_Obj_Warpstone/z_obj_warpstone.c | 2 +- .../actors/ovl_Obj_Wturn/z_obj_wturn.c | 3 +- .../actors/ovl_Oceff_Spot/z_oceff_spot.c | 5 +- src/overlays/actors/ovl_Shot_Sun/z_shot_sun.c | 6 +- .../actors/ovl_player_actor/z_player.c | 39 +- .../ovl_kaleido_scope/z_kaleido_scope_NES.c | 22 +- tools/disasm/functions.txt | 50 +- tools/disasm/variables.txt | 172 +- tools/namefixer.py | 2 +- tools/sizes/code_functions.csv | 66 +- 88 files changed, 7398 insertions(+), 815 deletions(-) create mode 100644 src/code/z_message_tables.inc.c diff --git a/include/functions.h b/include/functions.h index 47bc7fe3d..9f4aea656 100644 --- a/include/functions.h +++ b/include/functions.h @@ -991,68 +991,6 @@ void func_8014116C(Gfx** gfxP, u16* arg1, u16* workBuffer, s32 width, s32 height // void func_80141678(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5); void func_80141778(Struct_80140E80* arg0, Gfx** gfxp, void* unk_18E60, GraphicsContext* gfxCtx); -// void func_80147520(void); -void func_80147564(PlayState* play); -s32 Message_ShouldAdvance(PlayState* play); -s32 Message_ShouldAdvanceSilent(PlayState* play); -void Message_CloseTextbox(PlayState* play); -void func_80147818(PlayState* play, UNK_PTR puParm2, UNK_TYPE4 uParm3, UNK_TYPE4 uParm4); -// void func_80147F18(PlayState* play, UNK_PTR puParm2, UNK_TYPE4 uParm3, UNK_TYPE4 uParm4); -// void func_80148558(PlayState* play, UNK_PTR puParm2, UNK_TYPE4 uParm3, UNK_TYPE4 uParm4); -void func_80148B98(PlayState* play, u8 arg1); -// void func_80148CBC(void); -// void func_80148D64(void); -// void func_80149048(void); -// void func_801491DC(void); -// void func_80149454(void); -// void func_801496C8(void); -void Message_DrawTextChar(PlayState* play, TexturePtr texture, Gfx** gfxP); -void func_80149C18(PlayState* play); -// void Message_FindMessage(void); -void Message_DrawItemIcon(PlayState* play, Gfx** gfxP); -void Message_HandleOcarina(PlayState* play); -void func_8014ADBC(PlayState* play, UNK_PTR puParm2); -void Message_LoadItemIcon(PlayState* play, u16 itemId, s16 arg2); -void Message_SetupLoadItemIcon(PlayState* play); -// void func_8014CCB4(void); -// void func_8014CDF0(void); -// void Message_SetupLoadItemIcon(void); -void func_8014D304(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5); -// void func_8014D62C(void); -// void func_8014D7B4(void); -void func_80150A84(PlayState* play); -void func_80150D08(PlayState* play, u32 uParm2); -void func_801514B0(PlayState* play, u16 arg1, u8 arg2); -void Message_StartTextbox(PlayState* play, u16 textId, Actor* actor); -void Message_ContinueTextbox(PlayState* play, u16 textId); -void func_80151A68(PlayState* play, u16 textId); -void Message_BombersNotebookQueueEvent(PlayState* play, u8 event); -// void func_80151C9C(void); -void func_80151DA4(PlayState* play, u16 arg2); -void func_80152434(PlayState* play, u16 arg2); -// void func_80152464(void); -u8 Message_GetState(MessageContext* msgCtx); -// void func_8015268C(void); -// void func_80152C64(void); -// void func_80152CAC(void); -// void func_80152EC0(void); -// void func_80152FB8(void); -// void func_80153750(void); -// void func_80153E7C(void); -// void func_80153EF0(void); -void func_801541D4(PlayState* play, Gfx** gfxp); -void Message_Draw(PlayState* play); -void Message_Update(PlayState* play); -void func_801586A4(PlayState* play); -void Message_Init(PlayState* play); -void Message_FindMessageNES(PlayState* play, u16 textId); -void Message_DrawTextNES(PlayState* play, Gfx** gfxP, u16 textDrawPos); -void Message_DecodeNES(PlayState* play); -void Message_FindCreditsMessage(PlayState* play, u16 textId); -void Message_FindCreditsMessage(PlayState* play, u16 textId); -void Message_DrawTextCredits(PlayState* play, Gfx** gfxP); -void Message_DecodeCredits(PlayState* play); - uintptr_t KaleidoManager_FaultAddrConv(uintptr_t address, void* param); void KaleidoManager_LoadOvl(KaleidoMgrOverlay* ovl); void KaleidoManager_ClearOvl(KaleidoMgrOverlay* ovl); @@ -1463,7 +1401,7 @@ void Audio_StopSequenceInCutscene(u16 seqId); s32 Audio_IsSequencePlaying(u8 seqId); void Audio_PlayBgm_StorePrevBgm(u16 seqId); void Audio_RestorePrevBgm(void); -// void func_801A3000(void); +void func_801A3000(u16 seqId, u8 ioData); // void func_801A3038(void); void Audio_PlayFanfare(u16 seqId); // void func_801A312C(void); diff --git a/include/variables.h b/include/variables.h index 2d64bd2b0..8a2e66960 100644 --- a/include/variables.h +++ b/include/variables.h @@ -219,137 +219,6 @@ extern UNK_PTR D_801C5C50; // extern UNK_TYPE1 D_801C5C9C; extern UNK_PTR D_801C5CB0; -// extern UNK_TYPE1 D_801C6A70; -// extern UNK_TYPE2 D_801C6A74; -// extern UNK_TYPE2 D_801C6A78; -// extern UNK_TYPE2 D_801C6A7C; -// extern UNK_TYPE2 D_801C6A80; -// extern UNK_TYPE2 D_801C6A84; -// extern UNK_TYPE2 D_801C6A88; -// extern UNK_TYPE2 D_801C6A8C; -// extern UNK_TYPE2 D_801C6A90; -// extern UNK_TYPE2 D_801C6A94; -extern u8 gPageSwitchNextButtonStatus[6][5]; -// extern UNK_TYPE1 D_801CED40; -// extern UNK_TYPE2 D_801CFC78; -// extern UNK_TYPE1 D_801CFC7A; -// extern UNK_TYPE1 D_801CFC7C; -// extern UNK_TYPE1 D_801CFC7E; -// extern UNK_TYPE1 D_801CFC84; -// extern UNK_TYPE1 D_801CFC88; -// extern UNK_TYPE1 D_801CFC8C; -// extern UNK_TYPE1 D_801CFC8E; -// extern UNK_TYPE1 D_801CFC92; -extern u8 D_801CFC98; -extern s16 D_801CFCA4[9]; -// extern UNK_TYPE2 D_801CFCAC; -extern s16 gOcarinaSongItemMap[]; -// extern UNK_TYPE2 D_801CFCD8; -// extern UNK_TYPE2 D_801CFCE4; -// extern UNK_TYPE2 D_801CFCF0; -// extern UNK_TYPE2 D_801CFCF4; -// extern UNK_TYPE2 D_801CFCF8; -// extern UNK_TYPE2 D_801CFCFC; -// extern UNK_TYPE2 D_801CFD00; -// extern UNK_TYPE2 D_801CFD04; -// extern UNK_TYPE2 D_801CFD08; -// extern UNK_TYPE2 D_801CFD0C; -// extern UNK_TYPE2 D_801CFD10; -// extern UNK_TYPE2 D_801CFD1C; -// extern UNK_TYPE2 D_801CFD28; -// extern UNK_TYPE2 D_801CFD2C; -// extern UNK_TYPE2 D_801CFD30; -// extern UNK_TYPE2 D_801CFD34; -// extern UNK_TYPE2 D_801CFD38; -// extern UNK_TYPE2 D_801CFD3C; -// extern UNK_TYPE2 D_801CFD40; -// extern UNK_TYPE2 D_801CFD44; -// extern UNK_TYPE2 D_801CFD48; -// extern UNK_TYPE2 D_801CFD54; -// extern UNK_TYPE2 D_801CFD60; -// extern UNK_TYPE2 D_801CFD64; -// extern UNK_TYPE2 D_801CFD68; -// extern UNK_TYPE2 D_801CFD6C; -// extern UNK_TYPE2 D_801CFD70; -// extern UNK_TYPE2 D_801CFD74; -// extern UNK_TYPE2 D_801CFD78; -// extern UNK_TYPE2 D_801CFD7C; -// extern UNK_TYPE2 D_801CFD80; -// extern UNK_TYPE2 D_801CFD84; -// extern UNK_TYPE2 D_801CFD88; -// extern UNK_TYPE2 D_801CFD8C; -// extern UNK_TYPE2 D_801CFD90; -extern UNK_PTR D_801CFD94; -// extern UNK_TYPE2 D_801CFD98; -// extern UNK_TYPE2 D_801CFD9C; -// extern UNK_TYPE2 D_801CFDA0; -// extern UNK_TYPE1 D_801CFDA4; -// extern UNK_TYPE1 D_801CFDC8; -// extern UNK_TYPE1 D_801CFDEC; -// extern UNK_TYPE1 D_801CFE04; -// extern UNK_TYPE1 D_801CFE1C; -// extern UNK_TYPE1 D_801CFE34; -// extern UNK_TYPE1 D_801CFE4C; -// extern UNK_TYPE1 D_801CFE5C; -// extern UNK_TYPE1 D_801CFE68; -// extern UNK_TYPE1 D_801CFE74; -// extern UNK_TYPE1 D_801CFEA4; -// extern UNK_TYPE1 D_801CFED4; -// extern UNK_TYPE1 D_801CFF04; -// extern UNK_TYPE1 D_801CFF34; -// extern UNK_TYPE1 D_801CFF64; -// extern UNK_TYPE1 D_801CFF70; -// extern UNK_TYPE1 D_801CFF7C; -// extern UNK_TYPE1 D_801CFF88; -// extern UNK_TYPE1 D_801CFF94; -// extern UNK_TYPE1 D_801D0000; -// extern UNK_TYPE1 D_801D0001; -// extern UNK_TYPE1 D_801D001F; -// extern UNK_TYPE1 D_801D0188; -// extern UNK_TYPE1 D_801D023A; -// extern UNK_TYPE1 D_801D0250; -// extern UNK_TYPE2 D_801D0268; -// extern UNK_TYPE1 D_801D027C; -// extern UNK_TYPE1 D_801D0284; -// extern UNK_TYPE1 D_801D028C; -// extern UNK_TYPE1 D_801D02C0; -// extern UNK_TYPE1 D_801D02D8; -// extern UNK_TYPE1 D_801D02F8; -// extern UNK_TYPE1 D_801D0330; -// extern UNK_TYPE1 D_801D0334; -// extern UNK_TYPE1 D_801D0340; -// extern UNK_TYPE1 D_801D034C; -// extern UNK_TYPE1 D_801D0358; -// extern UNK_TYPE1 D_801D0364; -// extern UNK_TYPE1 D_801D0378; -extern char D_801D039C[]; -// extern UNK_TYPE1 D_801D03A4; -// extern UNK_TYPE1 D_801D03A8; -// extern UNK_TYPE1 D_801D03C8; -// extern UNK_TYPE1 D_801D03E8; -// extern UNK_TYPE1 D_801D03F0; -// extern UNK_TYPE1 D_801D0401; -// extern UNK_TYPE1 D_801D0408; -// extern UNK_TYPE1 D_801D0428; -// extern UNK_TYPE1 D_801D045A; -// extern UNK_TYPE1 D_801D0462; -//extern UNK_TYPE1 D_801D0468; -// extern UNK_TYPE1 sNESFontWidths; -// extern char sRupeesTextLocalization[]; -// extern UNK_TYPE1 sRupeesTextLength; -// extern char D_801D0714[]; -// extern UNK_TYPE1 D_801D07C4; -// extern UNK_TYPE1 D_801D07DC; -// extern UNK_TYPE1 D_801D080C; -// extern UNK_TYPE1 D_801D083C; -// extern UNK_TYPE1 D_801D086C; -// extern UNK_TYPE1 D_801D0890; -// extern UNK_TYPE1 D_801D089C; -// extern UNK_TYPE1 D_801D08CC; -// extern UNK_TYPE1 D_801D08D8; -// extern UNK_TYPE1 D_801D08E4; -// extern UNK_TYPE1 sMaskCodeTextENG; -// extern UNK_TYPE1 sMaskCodeTextLengthENG; extern KaleidoMgrOverlay gKaleidoMgrOverlayTable[2]; // extern UNK_TYPE1 D_801D0B8C; extern KaleidoMgrOverlay* gKaleidoMgrCurOvl; diff --git a/include/z64item.h b/include/z64item.h index 7cc31eeca..1a43b00af 100644 --- a/include/z64item.h +++ b/include/z64item.h @@ -326,6 +326,27 @@ typedef enum ItemId { /* 0xB1 */ ITEM_MAP_POINT_MOUNTAIN_VILLAGE, /* 0xB2 */ ITEM_MAP_POINT_MILK_ROAD, /* 0xB3 */ ITEM_MAP_POINT_ZORA_CAPE, + /* 0xB8 */ ITEM_B8 = 0xB8, + /* 0xB9 */ ITEM_B9, + /* 0xBA */ ITEM_BA, + /* 0xBB */ ITEM_BB, + /* 0xBC */ ITEM_BC, + /* 0xBD */ ITEM_BD, + /* 0xBE */ ITEM_BE, + /* 0xBF */ ITEM_BF, + /* 0xC0 */ ITEM_C0, + /* 0xC1 */ ITEM_C1, + /* 0xC2 */ ITEM_C2, + /* 0xC3 */ ITEM_C3, + /* 0xC4 */ ITEM_C4, + /* 0xC5 */ ITEM_C5, + /* 0xC6 */ ITEM_C6, + /* 0xC7 */ ITEM_C7, + /* 0xC8 */ ITEM_C8, + /* 0xC9 */ ITEM_C9, + /* 0xCA */ ITEM_CA, + /* 0xCB */ ITEM_CB, + /* 0xCC */ ITEM_CC, /* 0xF0 */ ITEM_F0 = 0xF0, // PLAYER_MASK_BLAST /* 0xF1 */ ITEM_F1, // PLAYER_MASK_BREMEN /* 0xF2 */ ITEM_F2, // PLAYER_MASK_KAMARO diff --git a/include/z64message.h b/include/z64message.h index fc41055d4..1b84f90db 100644 --- a/include/z64message.h +++ b/include/z64message.h @@ -139,9 +139,6 @@ typedef enum MessageMode { /* 0x4F */ MSGMODE_OWL_SAVE_2 } MessageMode; -extern u16 sBombersNotebookEventMessages[BOMBERS_NOTEBOOK_EVENT_MAX]; -extern u16 gBombersNotebookWeekEventFlags[BOMBERS_NOTEBOOK_EVENT_MAX]; - typedef enum FaceReactionSet { /* 0x11 */ FACE_REACTION_SET_JIM = 0x11, /* 0x12 */ FACE_REACTION_SET_BOMBERS, @@ -177,7 +174,6 @@ typedef enum TextState { /* 18 */ TEXT_STATE_18 } TextState; - #define FONT_CHAR_TEX_WIDTH 16 #define FONT_CHAR_TEX_HEIGHT 16 //! TODO: Make this use `sizeof(AnyFontTextureSymbol)` @@ -203,8 +199,8 @@ typedef struct { u16 wchar[640]; // msgBufWide u64 force_structure_alignment_msg; } msgBuf; - /* 0x11D80 */ u8* messageStart; - /* 0x11D84 */ u8* messageEnd; + /* 0x11D80 */ u32 messageStart; + /* 0x11D84 */ u32 messageEnd; /* 0x11D88 */ u8 unk_11D88; // current Char Buffer ? } Font; // size = 0x11D90 @@ -324,4 +320,33 @@ typedef struct MessageContext { /* 0x120DA */ UNK_TYPE1 unk_120DA[0x6]; } MessageContext; // size = 0x120E0 +s32 Message_ShouldAdvance(struct PlayState* play); +void Message_CloseTextbox(struct PlayState* play); +void Message_DrawTextChar(struct PlayState* play, TexturePtr texture, Gfx** gfxP); +void Message_DrawItemIcon(struct PlayState* play, Gfx** gfxP); +void Message_HandleOcarina(struct PlayState* play); +void Message_LoadItemIcon(struct PlayState* play, u16 itemId, s16 arg2); +void Message_SetupLoadItemIcon(struct PlayState* play); +void func_801514B0(struct PlayState* play, u16 arg1, u8 arg2); +void Message_StartTextbox(struct PlayState* play, u16 textId, Actor* actor); +void Message_ContinueTextbox(struct PlayState* play, u16 textId); +void Message_DisplaySceneTitleCard(struct PlayState* play, u16 textId); +void Message_BombersNotebookQueueEvent(struct PlayState* play, u8 event); +void Message_DisplayOcarinaStaff(struct PlayState* play, u16 ocarinaAction); +void Message_DisplayOcarinaStaffBlockSunsSong(struct PlayState* play, u16 ocarinaAction); +u8 Message_GetState(MessageContext* msgCtx); +void Message_Draw(struct PlayState* play); +void Message_Update(struct PlayState* play); +void Message_Init(struct PlayState* play); +void Message_FindMessageNES(struct PlayState* play, u16 textId); +void Message_DrawTextNES(struct PlayState* play, Gfx** gfxP, u16 textDrawPos); +void Message_DecodeNES(struct PlayState* play); +void Message_FindCreditsMessage(struct PlayState* play, u16 textId); +void Message_DrawTextCredits(struct PlayState* play, Gfx** gfxP); +void Message_DecodeCredits(struct PlayState* play); + +extern u8 gPageSwitchNextButtonStatus[6][5]; +extern u16 gBombersNotebookWeekEventFlags[BOMBERS_NOTEBOOK_EVENT_MAX]; +extern s16 gOcarinaSongItemMap[]; + #endif diff --git a/include/z64ocarina.h b/include/z64ocarina.h index 7cfafde4f..2419a98df 100644 --- a/include/z64ocarina.h +++ b/include/z64ocarina.h @@ -32,10 +32,135 @@ typedef enum { /* 24 */ OCARINA_SONG_SCARECROW_LONG = OCARINA_SONG_MAX // anything larger than 24 is considered the long scarecrow's song } OcarinaSongId; -typedef enum OcarinaMode { - /* 0x18 */ OCARINA_MODE_APPLY_INV_SOT_FAST = 24, +typedef enum { + /* 0x00 */ OCARINA_ACTION_0, // acts like free play but never set + /* 0x01 */ OCARINA_ACTION_FREE_PLAY, + /* 0x02 */ OCARINA_ACTION_DEMONSTRATE_SONATA, // Song demonstrated/previewed by another actor/teacher + /* 0x03 */ OCARINA_ACTION_DEMONSTRATE_GORON_LULLABY, + /* 0x04 */ OCARINA_ACTION_DEMONSTRATE_NEW_WAVE, + /* 0x05 */ OCARINA_ACTION_DEMONSTRATE_ELEGY, + /* 0x06 */ OCARINA_ACTION_DEMONSTRATE_OATH, + /* 0x07 */ OCARINA_ACTION_DEMONSTRATE_SARIAS, + /* 0x08 */ OCARINA_ACTION_DEMONSTRATE_TIME, + /* 0x09 */ OCARINA_ACTION_DEMONSTRATE_HEALING, + /* 0x0A */ OCARINA_ACTION_DEMONSTRATE_EPONAS, + /* 0x0B */ OCARINA_ACTION_DEMONSTRATE_SOARING, + /* 0x0C */ OCARINA_ACTION_DEMONSTRATE_STORMS, + /* 0x0D */ OCARINA_ACTION_DEMONSTRATE_SUNS, + /* 0x0E */ OCARINA_ACTION_DEMONSTRATE_INVERTED_TIME, + /* 0x0F */ OCARINA_ACTION_DEMONSTRATE_DOUBLE_TIME, + /* 0x10 */ OCARINA_ACTION_DEMONSTRATE_GORON_LULLABY_INTRO, + /* 0x11 */ OCARINA_ACTION_11, + /* 0x12 */ OCARINA_ACTION_PROMPT_SONATA, // User plays back song through inputing 1 note at a time, as a tutorial. Each note is verified. + /* 0x13 */ OCARINA_ACTION_PROMPT_GORON_LULLABY, + /* 0x14 */ OCARINA_ACTION_PROMPT_NEW_WAVE, + /* 0x15 */ OCARINA_ACTION_PROMPT_ELEGY, + /* 0x16 */ OCARINA_ACTION_PROMPT_OATH, + /* 0x17 */ OCARINA_ACTION_PROMPT_SARIAS, + /* 0x18 */ OCARINA_ACTION_PROMPT_TIME, + /* 0x19 */ OCARINA_ACTION_PROMPT_HEALING, + /* 0x1A */ OCARINA_ACTION_PROMPT_EPONAS, + /* 0x1B */ OCARINA_ACTION_PROMPT_SOARING, + /* 0x1C */ OCARINA_ACTION_PROMPT_STORMS, + /* 0x1D */ OCARINA_ACTION_PROMPT_SUNS, + /* 0x1E */ OCARINA_ACTION_PROMPT_INVERTED_TIME, + /* 0x1F */ OCARINA_ACTION_PROMPT_DOUBLE_TIME, + /* 0x20 */ OCARINA_ACTION_PROMPT_GORON_LULLABY_INTRO, + /* 0x21 */ OCARINA_ACTION_21, + /* 0x22 */ OCARINA_ACTION_CHECK_SONATA, // Once the entire song is played, checks for a specific song. Broken as playing any dungeon song will softlock. + /* 0x23 */ OCARINA_ACTION_CHECK_GORON_LULLABY, + /* 0x24 */ OCARINA_ACTION_CHECK_NEW_WAVE, + /* 0x25 */ OCARINA_ACTION_CHECK_ELEGY, + /* 0x26 */ OCARINA_ACTION_CHECK_OATH, + /* 0x27 */ OCARINA_ACTION_CHECK_SARIAS, + /* 0x28 */ OCARINA_ACTION_CHECK_TIME, + /* 0x29 */ OCARINA_ACTION_CHECK_HEALING, + /* 0x2A */ OCARINA_ACTION_CHECK_EPONAS, + /* 0x2B */ OCARINA_ACTION_CHECK_SOARING, + /* 0x2C */ OCARINA_ACTION_CHECK_STORMS, + /* 0x2D */ OCARINA_ACTION_CHECK_SUNS, + /* 0x2E */ OCARINA_ACTION_CHECK_INVERTED_TIME, + /* 0x2F */ OCARINA_ACTION_CHECK_DOUBLE_TIME, + /* 0x30 */ OCARINA_ACTION_CHECK_GORON_LULLABY_INTRO, + /* 0x31 */ OCARINA_ACTION_CHECK_SCARECROW_SPAWN, // TODO: Verify (may include more) + /* 0x32 */ OCARINA_ACTION_FREE_PLAY_DONE, + /* 0x33 */ OCARINA_ACTION_SCARECROW_LONG_RECORDING, + /* 0x34 */ OCARINA_ACTION_SCARECROW_LONG_DEMONSTRATION, + /* 0x35 */ OCARINA_ACTION_SCARECROW_SPAWN_RECORDING, + /* 0x36 */ OCARINA_ACTION_SCARECROW_SPAWN_DEMONSTRATION, + /* 0x37 */ OCARINA_ACTION_37, + /* 0x38 */ OCARINA_ACTION_CHECK_NOTIME, + /* 0x39 */ OCARINA_ACTION_CHECK_NOTIME_DONE, + /* 0x3A */ OCARINA_ACTION_3A, // Monkey Instrument Prompt + /* 0x3B */ OCARINA_ACTION_3B, + /* 0x3C */ OCARINA_ACTION_3C, + /* 0x3D */ OCARINA_ACTION_DEMONSTRATE_EVAN_PART1_FIRST_HALF, // Evan Part 1 demonstrate first half (Japa) + /* 0x3E */ OCARINA_ACTION_DEMONSTRATE_EVAN_PART2_FIRST_HALF, // Evan Part 2 demonstrate first half (Japa) + /* 0x3F */ OCARINA_ACTION_DEMONSTRATE_EVAN_PART1_SECOND_HALF, // Evan Part 1 demonstrate second half (Diary) + /* 0x40 */ OCARINA_ACTION_DEMONSTRATE_EVAN_PART2_SECOND_HALF, // Evan Part 2 demonstrate second half (Diary) + /* 0x41 */ OCARINA_ACTION_PROMPT_EVAN_PART1_SECOND_HALF, // Evan Part 1 prompt second half (Japa) + /* 0x42 */ OCARINA_ACTION_PROMPT_EVAN_PART2_SECOND_HALF, // Evan Part 2 prompt second half (Japa) + /* 0x43 */ OCARINA_ACTION_PROMPT_WIND_FISH_HUMAN, + /* 0x44 */ OCARINA_ACTION_PROMPT_WIND_FISH_GORON, + /* 0x45 */ OCARINA_ACTION_PROMPT_WIND_FISH_ZORA, + /* 0x46 */ OCARINA_ACTION_PROMPT_WIND_FISH_DEKU, + /* 0x47 */ OCARINA_ACTION_TIMED_PROMPT_SONATA, // Playing back a particular song, but must also time the notes properly. Not fully implemented + /* 0x48 */ OCARINA_ACTION_TIMED_PROMPT_GORON_LULLABY, + /* 0x49 */ OCARINA_ACTION_TIMED_PROMPT_NEW_WAVE, + /* 0x4A */ OCARINA_ACTION_TIMED_PROMPT_ELEGY, + /* 0x4B */ OCARINA_ACTION_TIMED_PROMPT_OATH, + /* 0x4C */ OCARINA_ACTION_TIMED_PROMPT_SARIAS, + /* 0x4D */ OCARINA_ACTION_TIMED_PROMPT_TIME, + /* 0x4E */ OCARINA_ACTION_TIMED_PROMPT_HEALING, + /* 0x4F */ OCARINA_ACTION_TIMED_PROMPT_EPONAS, + /* 0x50 */ OCARINA_ACTION_TIMED_PROMPT_SOARING, + /* 0x51 */ OCARINA_ACTION_TIMED_PROMPT_STORMS +} OcarinaSongActionId; + +typedef enum { + /* 0x00 */ OCARINA_MODE_NONE, + /* 0x01 */ OCARINA_MODE_ACTIVE, + /* 0x02 */ OCARINA_MODE_WARP, + /* 0x03 */ OCARINA_MODE_EVENT, + /* 0x04 */ OCARINA_MODE_END, + /* 0x05 */ OCARINA_MODE_PLAYED_TIME, // Played Time + /* 0x06 */ OCARINA_MODE_PLAYED_HEALING, + /* 0x07 */ OCARINA_MODE_PLAYED_EPONAS, + /* 0x08 */ OCARINA_MODE_PLAYED_SOARING, + /* 0x09 */ OCARINA_MODE_PLAYED_STORMS, + /* 0x0A */ OCARINA_MODE_PLAYED_SUNS, + /* 0x0B */ OCARINA_MODE_PLAYED_INVERTED_TIME, + /* 0x0C */ OCARINA_MODE_PLAYED_DOUBLE_TIME, + /* 0x0D */ OCARINA_MODE_PLAYED_SCARECROW_SPAWN, + /* 0x0E */ OCARINA_MODE_E, + /* 0x0F */ OCARINA_MODE_F, + /* 0x10 */ OCARINA_MODE_10, + /* 0x11 */ OCARINA_MODE_11, // End memory/scarecrow from OoT + /* 0x12 */ OCARINA_MODE_PROCESS_SOT, // Song of Time related + /* 0x13 */ OCARINA_MODE_PROCESS_INVERTED_TIME, // Inverted Song of Time related + /* 0x14 */ OCARINA_MODE_14, + /* 0x15 */ OCARINA_MODE_PROCESS_DOUBLE_TIME, // Song of Double Time related + /* 0x16 */ OCARINA_MODE_APPLY_SOT, // Apply + /* 0x17 */ OCARINA_MODE_17, + /* 0x18 */ OCARINA_MODE_APPLY_INV_SOT_FAST, /* 0x19 */ OCARINA_MODE_APPLY_INV_SOT_SLOW, - /* 0x1A */ OCARINA_MODE_APPLY_DOUBLE_SOT + /* 0x1A */ OCARINA_MODE_APPLY_DOUBLE_SOT, + /* 0x1B */ OCARINA_MODE_1B, + /* 0x1C */ OCARINA_MODE_WARP_TO_GREAT_BAY_COAST, + /* 0x1D */ OCARINA_MODE_WARP_TO_ZORA_CAPE, + /* 0x1E */ OCARINA_MODE_WARP_TO_SNOWHEAD, + /* 0x1F */ OCARINA_MODE_WARP_TO_MOUNTAIN_VILLAGE, + /* 0x20 */ OCARINA_MODE_WARP_TO_SOUTH_CLOCK_TOWN, + /* 0x21 */ OCARINA_MODE_WARP_TO_MILK_ROAD, + /* 0x22 */ OCARINA_MODE_WARP_TO_WOODFALL, + /* 0x23 */ OCARINA_MODE_WARP_TO_SOUTHERN_SWAMP, + /* 0x24 */ OCARINA_MODE_WARP_TO_IKANA_CANYON, + /* 0x25 */ OCARINA_MODE_WARP_TO_STONE_TOWER, + /* 0x26 */ OCARINA_MODE_WARP_TO_ENTRANCE, + /* 0x27 */ OCARINA_MODE_PROCESS_RESTRICTED_SONG, // Variants of Song of Time, Soaring, or Elegy restricted + /* 0x28 */ OCARINA_MODE_28, + /* 0x29 */ OCARINA_MODE_29, + /* 0x2A */ OCARINA_MODE_PLAYED_FULL_EVAN_SONG } OcarinaMode; typedef enum { @@ -78,7 +203,7 @@ typedef enum { /* 3 */ OCARINA_INSTRUMENT_WHISTLING_FLUTE, /* 4 */ OCARINA_INSTRUMENT_HARP, /* 5 */ OCARINA_INSTRUMENT_IKANA_KING, - /* 6 */ OCARINA_INSTRUMENT_TATL, + /* 6 */ OCARINA_INSTRUMENT_TATL, // Sounds like bells /* 7 */ OCARINA_INSTRUMENT_GORON_DRUMS, /* 8 */ OCARINA_INSTRUMENT_ZORA_GUITAR, /* 9 */ OCARINA_INSTRUMENT_DEKU_PIPES, @@ -98,6 +223,16 @@ typedef enum { /* -1 */ OCARINA_RECORD_REJECTED = 0xFF } OcarinaRecordingState; +typedef enum { + /* 0 */ OCARINA_ERROR_NONE, + /* 1 */ OCARINA_ERROR_1, + /* 2 */ OCARINA_ERROR_2, + /* 3 */ OCARINA_ERROR_3, + /* 4 */ OCARINA_ERROR_BEND, + /* 5 */ OCARINA_ERROR_5, + /* 0xFF */ OCARINA_ERROR_INACTIVE = 0xFF // Song not available +} OcarinaError; + /** * bFlat4Flag Note: * Flag for resolving whether (pitch = OCARINA_PITCH_BFLAT4) diff --git a/include/z64save.h b/include/z64save.h index 7d1bc781d..e22b2c58f 100644 --- a/include/z64save.h +++ b/include/z64save.h @@ -115,7 +115,7 @@ typedef enum { /* 16 */ TIMER_STATE_POSTMAN_END } TimerState; -typedef enum { +typedef enum BottleTimerState { /* 0 */ BOTTLE_TIMER_STATE_OFF, /* 1 */ BOTTLE_TIMER_STATE_COUNTING } BottleTimerState; @@ -126,7 +126,7 @@ typedef enum { /* 3 */ MINIGAME_STATUS_END = 3 } MinigameStatus; -typedef enum { +typedef enum HudVisibility { /* 0 */ HUD_VISIBILITY_IDLE, /* 1 */ HUD_VISIBILITY_NONE, /* 2 */ HUD_VISIBILITY_NONE_ALT, // Identical to HUD_VISIBILITY_NONE @@ -304,7 +304,7 @@ typedef struct SaveInfo { /* 0xF38 */ u32 regionsVisited; // "area_arrival" /* 0xF3C */ u32 worldMapCloudVisibility; // "cloud_clear" /* 0xF40 */ u8 unk_F40; // "oca_rec_flag" has scarecrows song - /* 0xF41 */ u8 unk_F41; // "oca_rec_flag8" scarecrows song set? + /* 0xF41 */ u8 scarecrowSpawnSongSet; // "oca_rec_flag8" /* 0xF42 */ u8 scarecrowSpawnSong[128]; /* 0xFC2 */ s8 bombersCaughtNum; // "aikotoba_index" /* 0xFC3 */ s8 bombersCaughtOrder[5]; // "aikotoba_table" @@ -453,8 +453,8 @@ typedef enum { // The day begins at CLOCK_TIME(6, 0) so it must be offset. #define TIME_UNTIL_MOON_CRASH \ - ((4 - CURRENT_DAY) * DAY_LENGTH - (u16)(((void)0, gSaveContext.save.time) - CLOCK_TIME(6, 0))); -#define TIME_UNTIL_NEW_DAY (DAY_LENGTH - (u16)(((void)0, gSaveContext.save.time) - CLOCK_TIME(6, 0))); + ((4 - CURRENT_DAY) * DAY_LENGTH - (u16)(((void)0, gSaveContext.save.time) - CLOCK_TIME(6, 0))) +#define TIME_UNTIL_NEW_DAY (DAY_LENGTH - (u16)(((void)0, gSaveContext.save.time) - CLOCK_TIME(6, 0))) #define GET_PLAYER_FORM ((void)0, gSaveContext.save.playerForm) diff --git a/spec b/spec index d7d51ec20..dcd055a6f 100644 --- a/spec +++ b/spec @@ -528,8 +528,6 @@ beginseg include "build/src/code/z_vr_box_draw.o" include "build/src/code/z_sram_NES.o" include "build/src/code/z_message.o" - include "build/data/code/z_message.data.o" - include "build/data/code/z_message.bss.o" include "build/src/code/z_message_nes.o" include "build/src/code/z_message_staff.o" include "build/src/code/z_player_call.o" diff --git a/src/code/z_common_data.c b/src/code/z_common_data.c index 46dfe189e..976b0fd4d 100644 --- a/src/code/z_common_data.c +++ b/src/code/z_common_data.c @@ -18,7 +18,7 @@ void SaveContext_Init(void) { gSaveContext.nextTransitionType = TRANS_NEXT_TYPE_DEFAULT; gSaveContext.prevHudVisibility = HUD_VISIBILITY_ALL; - gSaveContext.options.language = 1; + gSaveContext.options.language = LANGUAGE_ENG; gSaveContext.options.audioSetting = SAVE_AUDIO_STEREO; gSaveContext.options.zTargetSetting = 0; } diff --git a/src/code/z_demo.c b/src/code/z_demo.c index ba9199dbb..11d614fc1 100644 --- a/src/code/z_demo.c +++ b/src/code/z_demo.c @@ -197,7 +197,7 @@ void CutsceneCmd_Misc(PlayState* play, CutsceneContext* csCtx, CsCmdMisc* cmd) { if (isFirstFrame) { loadedScene = play->loadedScene; if (loadedScene->titleTextId != 0) { - func_80151A68(play, loadedScene->titleTextId); + Message_DisplaySceneTitleCard(play, loadedScene->titleTextId); } } break; @@ -1043,7 +1043,7 @@ void CutsceneCmd_Text(PlayState* play, CutsceneContext* csCtx, CsCmdText* cmd) { if (sCurOcarinaAction != cmd->textId) { sCutsceneTextboxType = CS_TEXT_OCARINA_ACTION; sCurOcarinaAction = cmd->textId; - func_80152434(play, cmd->textId); + Message_DisplayOcarinaStaff(play, cmd->textId); return; } } @@ -1098,7 +1098,7 @@ void CutsceneCmd_Text(PlayState* play, CutsceneContext* csCtx, CsCmdText* cmd) { } if ((talkState == TEXT_STATE_5) && Message_ShouldAdvance(play)) { - func_80152434(play, cmd->textId); + Message_DisplayOcarinaStaff(play, cmd->textId); } } @@ -1565,7 +1565,7 @@ void Cutscene_HandleEntranceTriggers(PlayState* play) { if ((Entrance_GetTransitionFlags(((void)0, gSaveContext.save.entrance) + ((void)0, gSaveContext.sceneLayer)) & 0x4000) != 0) { - func_80151A68(play, scene->titleTextId); + Message_DisplaySceneTitleCard(play, scene->titleTextId); } } diff --git a/src/code/z_kaleido_setup.c b/src/code/z_kaleido_setup.c index a08f2b56b..1b3aa49d7 100644 --- a/src/code/z_kaleido_setup.c +++ b/src/code/z_kaleido_setup.c @@ -93,7 +93,7 @@ void KaleidoSetup_Update(PlayState* play) { (play->gameOverCtx.state == GAMEOVER_INACTIVE)) { if ((play->transitionTrigger == TRANS_TRIGGER_OFF) && (play->transitionMode == TRANS_MODE_OFF)) { if ((gSaveContext.save.cutsceneIndex < 0xFFF0) && (gSaveContext.nextCutsceneIndex < 0xFFF0)) { - if (!Play_InCsMode(play) || ((msgCtx->msgMode != 0) && (msgCtx->currentTextId == 0xFF))) { + if (!Play_InCsMode(play) || ((msgCtx->msgMode != MSGMODE_NONE) && (msgCtx->currentTextId == 0xFF))) { if ((play->unk_1887C < 2) && (gSaveContext.magicState != MAGIC_STATE_STEP_CAPACITY) && (gSaveContext.magicState != MAGIC_STATE_FILL)) { if (!CHECK_EVENTINF(EVENTINF_17) && !(player->stateFlags1 & PLAYER_STATE1_20)) { diff --git a/src/code/z_message.c b/src/code/z_message.c index 42a0e301f..3fb8f5bac 100644 --- a/src/code/z_message.c +++ b/src/code/z_message.c @@ -1,10 +1,31 @@ #include "global.h" +#include "z64horse.h" #include "z64shrink_window.h" #include "z64view.h" #include "message_data_static.h" +#include "interface/parameter_static/parameter_static.h" #include "overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope.h" -#if 0 +u8 D_801C6A70 = 0; +s16 sOcarinaButtonIndexBufPos = 0; +s16 sOcarinaButtonIndexBufLen = 0; +s16 sLastPlayedSong = 0xFF; +s16 sOcarinaButtonStepR = 0; +s16 sOcarinaButtonStepG = 0; +s16 sOcarinaButtonStepB = 0; +s16 sOcarinaButtonFlashTimer = 12; +s16 sOcarinaButtonFlashColorIndex = 1; +s16 D_801C6A94 = 0; + +u8 gPageSwitchNextButtonStatus[][5] = { + { BTN_ENABLED, BTN_ENABLED, BTN_DISABLED, BTN_ENABLED, BTN_ENABLED }, + { BTN_ENABLED, BTN_ENABLED, BTN_DISABLED, BTN_ENABLED, BTN_ENABLED }, + { BTN_ENABLED, BTN_DISABLED, BTN_DISABLED, BTN_ENABLED, BTN_ENABLED }, + { BTN_ENABLED, BTN_DISABLED, BTN_DISABLED, BTN_ENABLED, BTN_ENABLED }, + { BTN_ENABLED, BTN_ENABLED, BTN_DISABLED, BTN_ENABLED, BTN_ENABLED }, + { BTN_ENABLED, BTN_ENABLED, BTN_DISABLED, BTN_ENABLED, BTN_ENABLED }, +}; + #define DEFINE_PERSON(_enum, _photo, _description, _metEnum, metMessage, _metFlag) metMessage, #define DEFINE_EVENT(_enum, _icon, _colorFlag, _description, completedMessage, _completedFlag) completedMessage, @@ -27,44 +48,65 @@ u16 gBombersNotebookWeekEventFlags[BOMBERS_NOTEBOOK_EVENT_MAX] = { #undef DEFINE_PERSON #undef DEFINE_EVENT -s16 D_801D02D8[15] = { - ACTOR_OCEFF_WIPE5, ACTOR_OCEFF_WIPE5, // Sonata of Awakening Effect, Sonata of Awakening Effect - ACTOR_OCEFF_WIPE5, ACTOR_OCEFF_WIPE5, // Sonata of Awakening Effect, Sonata of Awakening Effect - ACTOR_OCEFF_WIPE5, ACTOR_OCEFF_WIPE5, // Sonata of Awakening Effect, Sonata of Awakening Effect - ACTOR_OCEFF_WIPE, ACTOR_OCEFF_WIPE7, // Song of Time Effect, Song of Healing Effect - ACTOR_OCEFF_WIPE2, ACTOR_OCEFF_WIPE6, // Epona's Song Effect, Song of Soaring Effect - ACTOR_OCEFF_STORM, ACTOR_OCEFF_SPOT, // Song of Storms Effect II [?], Sun's Song Effect - ACTOR_OCEFF_WIPE, ACTOR_OCEFF_WIPE, // Song of Time Effect, Song of Time Effect - ACTOR_OCEFF_WIPE4 // Scarecrow's Song Effect +// TODO: Scripts +// Include message tables D_801C6B98 and D_801CFB08 +#include "src/code/z_message_tables.inc.c" + +s16 D_801CFC78[TEXTBOX_TYPE_MAX] = { + 0, // TEXTBOX_TYPE_0 + 1, // TEXTBOX_TYPE_1 + 3, // TEXTBOX_TYPE_2 + 2, // TEXTBOX_TYPE_3 + 14, // TEXTBOX_TYPE_4 + 14, // TEXTBOX_TYPE_5 + 0, // TEXTBOX_TYPE_6 + 14, // TEXTBOX_TYPE_7 + 0, // TEXTBOX_TYPE_8 + 0, // TEXTBOX_TYPE_9 + 0, // TEXTBOX_TYPE_A + 14, // TEXTBOX_TYPE_B + 14, // TEXTBOX_TYPE_C + 4, // TEXTBOX_TYPE_D + 14, // TEXTBOX_TYPE_E + 0, // TEXTBOX_TYPE_F +}; +u8 sOcarinaButtonIndexBuf[12] = { 0 }; +s16 sOcarinaButtonAlphaValues[9] = { 0 }; +s16 gOcarinaSongItemMap[] = { + OCARINA_SONG_SONATA, OCARINA_SONG_GORON_LULLABY, OCARINA_SONG_NEW_WAVE, + OCARINA_SONG_ELEGY, OCARINA_SONG_OATH, OCARINA_SONG_SARIAS, + OCARINA_SONG_TIME, OCARINA_SONG_HEALING, OCARINA_SONG_EPONAS, + OCARINA_SONG_SOARING, OCARINA_SONG_STORMS, OCARINA_SONG_SUNS, + OCARINA_SONG_INVERTED_TIME, OCARINA_SONG_DOUBLE_TIME, OCARINA_SONG_GORON_LULLABY_INTRO, }; -s32 D_801D02F8[15] = { 0,1,2,3,4,0,1,0,0,0,0,0,1,1,0 }; -#endif +// bss -extern s16 D_801D02D8[]; -extern s32 D_801D02F8[]; -extern s16 D_801F6B0C; -extern s16 D_801F6B0E; -extern s16 D_801F6B10; -extern s16 D_801F6B12; -extern s16 D_801F6B14; -extern s16 D_801F6B16; -extern s16 D_801F6B18; -extern s16 D_801F6B1A; -extern s16 D_801F6B1C; -extern s16 D_801F6B1E; -extern s16 D_801F6B20; -extern s16 D_801F6B22; -extern MessageTableEntry D_801C6B98[]; -extern MessageTableEntry D_801CFB08[]; +s32 sCharTexSize; +s32 sCharTexScale; +s32 D_801F6B08; -void func_80147520(void) { - D_801CFC98 = 0xFF; - D_801CFCA4[0] = D_801CFCA4[1] = D_801CFCA4[2] = D_801CFCA4[3] = D_801CFCA4[4] = D_801CFCA4[5] = D_801CFCA4[6] = - D_801CFCA4[7] = D_801CFCA4[8] = 0; +s16 sOcarinaButtonAPrimR; +s16 sOcarinaButtonAPrimB; +s16 sOcarinaButtonAPrimG; +s16 sOcarinaButtonAEnvR; +s16 sOcarinaButtonAEnvB; +s16 sOcarinaButtonAEnvG; +s16 sOcarinaButtonCPrimR; +s16 sOcarinaButtonCPrimB; +s16 sOcarinaButtonCPrimG; +s16 sOcarinaButtonCEnvR; +s16 sOcarinaButtonCEnvB; +s16 sOcarinaButtonCEnvG; + +void Message_ResetOcarinaButtonAlphas(void) { + sOcarinaButtonIndexBuf[0] = OCARINA_BTN_INVALID; + sOcarinaButtonAlphaValues[0] = sOcarinaButtonAlphaValues[1] = sOcarinaButtonAlphaValues[2] = + sOcarinaButtonAlphaValues[3] = sOcarinaButtonAlphaValues[4] = sOcarinaButtonAlphaValues[5] = + sOcarinaButtonAlphaValues[6] = sOcarinaButtonAlphaValues[7] = sOcarinaButtonAlphaValues[8] = 0; } -void func_80147564(PlayState* play) { +void Message_ResetOcarinaButtonState(PlayState* play) { MessageContext* msgCtx = &play->msgCtx; msgCtx->ocarinaButtonsPosY[OCARINA_BTN_A] = 189; @@ -72,19 +114,21 @@ void func_80147564(PlayState* play) { msgCtx->ocarinaButtonsPosY[OCARINA_BTN_C_RIGHT] = 179; msgCtx->ocarinaButtonsPosY[OCARINA_BTN_C_LEFT] = 174; msgCtx->ocarinaButtonsPosY[OCARINA_BTN_C_UP] = 169; - func_80147520(); - D_801F6B0C = 0x50; - D_801F6B10 = 0x96; - D_801F6B0E = 0xFF; - D_801F6B12 = 0xA; - D_801F6B16 = 0xA; - D_801F6B14 = 0xA; - D_801F6B18 = 0xFF; - D_801F6B1C = 0xFF; - D_801F6B1A = 0x32; - D_801F6B1E = 0xA; - D_801F6B22 = 0xA; - D_801F6B20 = 0xA; + + Message_ResetOcarinaButtonAlphas(); + + sOcarinaButtonAPrimR = 80; + sOcarinaButtonAPrimG = 150; + sOcarinaButtonAPrimB = 255; + sOcarinaButtonAEnvR = 10; + sOcarinaButtonAEnvG = 10; + sOcarinaButtonAEnvB = 10; + sOcarinaButtonCPrimR = 255; + sOcarinaButtonCPrimG = 255; + sOcarinaButtonCPrimB = 50; + sOcarinaButtonCEnvR = 10; + sOcarinaButtonCEnvG = 10; + sOcarinaButtonCEnvB = 10; } s32 Message_ShouldAdvance(PlayState* play) { @@ -123,77 +167,617 @@ void Message_CloseTextbox(PlayState* play) { if (play->msgCtx.msgLength != 0) { msgCtx->stateTimer = 2; - msgCtx->msgMode = 0x43; + msgCtx->msgMode = MSGMODE_TEXT_CLOSING; msgCtx->textboxEndType = TEXTBOX_ENDTYPE_00; Audio_PlaySfx(NA_SE_NONE); } } -#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/func_80147818.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/func_80147F18.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/func_80148558.s") - -#ifdef NON_MATCHING -void func_80148B98(PlayState* play, u8 arg1) { - static s16 held = 0; +void Message_DrawTextboxIcon(PlayState* play, Gfx** gfxP, s16 x, s16 y) { + static Color_RGB16 sIconPrimColors[] = { + { 0, 80, 200 }, + { 50, 130, 255 }, + }; + static Color_RGB16 sIconEnvColors[] = { + { 0, 0, 0 }, + { 0, 130, 255 }, + }; + static s16 sIconPrimR = 0; + static s16 sIconPrimG = 80; + static s16 sIconPrimB = 200; + static s16 sIconFlashTimer = 12; + static s16 sIconFlashColorIndex = 0; + static s16 sIconEnvR = 0; + static s16 sIconEnvG = 0; + static s16 sIconEnvB = 0; + Gfx* gfx; MessageContext* msgCtx = &play->msgCtx; - Input* curInput = CONTROLLER1(&play->state); + Font* font = &msgCtx->font; + s16 primR; + s16 primG; + s16 primB; + s16 envR; + s16 envG; + s16 envB; + u8* iconTexture = msgCtx->font.iconBuf; - if ((curInput->rel.stick_y > 29) && held == 0) { - held = 1; + gfx = *gfxP; + + if (!msgCtx->textIsCredits) { + primR = ABS_ALT(sIconPrimR - sIconPrimColors[sIconFlashColorIndex].r) / sIconFlashTimer; + primG = ABS_ALT(sIconPrimG - sIconPrimColors[sIconFlashColorIndex].g) / sIconFlashTimer; + primB = ABS_ALT(sIconPrimB - sIconPrimColors[sIconFlashColorIndex].b) / sIconFlashTimer; + + if (sIconPrimR >= sIconPrimColors[sIconFlashColorIndex].r) { + sIconPrimR -= primR; + } else { + sIconPrimR += primR; + } + + if (sIconPrimG >= sIconPrimColors[sIconFlashColorIndex].g) { + sIconPrimG -= primG; + } else { + sIconPrimG += primG; + } + + if (sIconPrimB >= sIconPrimColors[sIconFlashColorIndex].b) { + sIconPrimB -= primB; + } else { + sIconPrimB += primB; + } + + envR = ABS_ALT(sIconEnvR - sIconEnvColors[sIconFlashColorIndex].r) / sIconFlashTimer; + envG = ABS_ALT(sIconEnvG - sIconEnvColors[sIconFlashColorIndex].g) / sIconFlashTimer; + envB = ABS_ALT(sIconEnvB - sIconEnvColors[sIconFlashColorIndex].b) / sIconFlashTimer; + + if (sIconEnvR >= sIconEnvColors[sIconFlashColorIndex].r) { + sIconEnvR -= envR; + } else { + sIconEnvR += envR; + } + + if (sIconEnvG >= sIconEnvColors[sIconFlashColorIndex].g) { + sIconEnvG -= envG; + } else { + sIconEnvG += envG; + } + + if (sIconEnvB >= sIconEnvColors[sIconFlashColorIndex].b) { + sIconEnvB -= envB; + } else { + sIconEnvB += envB; + } + + sIconFlashTimer--; + if (sIconFlashTimer == 0) { + sIconPrimR = sIconPrimColors[sIconFlashColorIndex].r; + sIconPrimG = sIconPrimColors[sIconFlashColorIndex].g; + sIconPrimB = sIconPrimColors[sIconFlashColorIndex].b; + sIconEnvR = sIconEnvColors[sIconFlashColorIndex].r; + sIconEnvG = sIconEnvColors[sIconFlashColorIndex].g; + sIconEnvB = sIconEnvColors[sIconFlashColorIndex].b; + sIconFlashTimer = 12; + sIconFlashColorIndex ^= 1; + } + + gDPPipeSync(gfx++); + gDPSetCombineLERP(gfx++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, PRIMITIVE, + ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0); + gDPSetPrimColor(gfx++, 0, 0, sIconPrimR, sIconPrimG, sIconPrimB, 255); + gDPSetEnvColor(gfx++, sIconEnvR, sIconEnvG, sIconEnvB, 255); + + if (!play->pauseCtx.bombersNotebookOpen) { + gDPLoadTextureBlock_4b(gfx++, iconTexture, G_IM_FMT_I, 16, 16, 0, G_TX_NOMIRROR | G_TX_CLAMP, + G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); + gSPTextureRectangle(gfx++, x << 2, y << 2, (x + sCharTexSize) << 2, (y + sCharTexSize) << 2, + G_TX_RENDERTILE, 0, 0, sCharTexScale, sCharTexScale); + } + + msgCtx->stateTimer++; + *gfxP = gfx; + } +} + +void func_80147F18(PlayState* play, Gfx** gfxP, s16 arg2, s16 arg3) { + static Color_RGB16 D_801CFD10[] = { + { 0, 80, 200 }, + { 50, 130, 255 }, + }; + static Color_RGB16 D_801CFD1C[] = { + { 0, 0, 0 }, + { 0, 130, 255 }, + }; + static s16 D_801CFD28 = 0; + static s16 D_801CFD2C = 80; + static s16 D_801CFD30 = 200; + static s16 D_801CFD34 = 12; + static s16 D_801CFD38 = 0; + static s16 D_801CFD3C = 0; + static s16 D_801CFD40 = 0; + static s16 D_801CFD44 = 0; + Gfx* gfx; + MessageContext* msgCtx = &play->msgCtx; + s16 primR; + s16 primG; + s16 primB; + s16 envR; + s16 envG; + s16 envB; + + gfx = *gfxP; + + if (!msgCtx->textIsCredits) { + primR = ABS_ALT(D_801CFD28 - D_801CFD10[D_801CFD38].r) / D_801CFD34; + primG = ABS_ALT(D_801CFD2C - D_801CFD10[D_801CFD38].g) / D_801CFD34; + primB = ABS_ALT(D_801CFD30 - D_801CFD10[D_801CFD38].b) / D_801CFD34; + + if (D_801CFD28 >= D_801CFD10[D_801CFD38].r) { + D_801CFD28 -= primR; + } else { + D_801CFD28 += primR; + } + + if (D_801CFD2C >= D_801CFD10[D_801CFD38].g) { + D_801CFD2C -= primG; + } else { + D_801CFD2C += primG; + } + + if (D_801CFD30 >= D_801CFD10[D_801CFD38].b) { + D_801CFD30 -= primB; + } else { + D_801CFD30 += primB; + } + + envR = ABS_ALT(D_801CFD3C - D_801CFD1C[D_801CFD38].r) / D_801CFD34; + envG = ABS_ALT(D_801CFD40 - D_801CFD1C[D_801CFD38].g) / D_801CFD34; + envB = ABS_ALT(D_801CFD44 - D_801CFD1C[D_801CFD38].b) / D_801CFD34; + + if (D_801CFD3C >= D_801CFD1C[D_801CFD38].r) { + D_801CFD3C -= envR; + } else { + D_801CFD3C += envR; + } + + if (D_801CFD40 >= D_801CFD1C[D_801CFD38].g) { + D_801CFD40 -= envG; + } else { + D_801CFD40 += envG; + } + + if (D_801CFD44 >= D_801CFD1C[D_801CFD38].b) { + D_801CFD44 -= envB; + } else { + D_801CFD44 += envB; + } + + D_801CFD34--; + if (D_801CFD34 == 0) { + D_801CFD28 = D_801CFD10[D_801CFD38].r; + D_801CFD2C = D_801CFD10[D_801CFD38].g; + D_801CFD30 = D_801CFD10[D_801CFD38].b; + D_801CFD3C = D_801CFD1C[D_801CFD38].r; + D_801CFD40 = D_801CFD1C[D_801CFD38].g; + D_801CFD44 = D_801CFD1C[D_801CFD38].b; + D_801CFD34 = 12; + D_801CFD38 ^= 1; + } + + gDPPipeSync(gfx++); + gDPSetRenderMode(gfx++, G_RM_XLU_SURF, G_RM_XLU_SURF2); + gDPSetCombineMode(gfx++, G_CC_PRIMITIVE, G_CC_PRIMITIVE); + gDPSetPrimColor(gfx++, 0, 0, D_801CFD28, D_801CFD2C, D_801CFD30, 120); + gDPFillRectangle(gfx++, arg2 + 3, arg3, arg2 + 17, arg3 + 11); + gDPFillRectangle(gfx++, arg2 + 6, arg3 - 2, arg2 + 14, arg3 + 13); + gDPPipeSync(gfx++); + + msgCtx->stateTimer++; + *gfxP = gfx++; + } +} + +void func_80148558(PlayState* play, Gfx** gfxP, s16 arg2, s16 arg3) { + static Color_RGB16 D_801CFD48[] = { + { 0, 80, 200 }, + { 50, 130, 255 }, + }; + static Color_RGB16 D_801CFD54[] = { + { 0, 0, 0 }, + { 0, 130, 255 }, + }; + static s16 D_801CFD60 = 0; + static s16 D_801CFD64 = 80; + static s16 D_801CFD68 = 200; + static s16 D_801CFD6C = 12; + static s16 D_801CFD70 = 0; + static s16 D_801CFD74 = 0; + static s16 D_801CFD78 = 0; + static s16 D_801CFD7C = 0; + Gfx* gfx; + MessageContext* msgCtx = &play->msgCtx; + s16 primR; + s16 primG; + s16 primB; + s16 envR; + s16 envG; + s16 envB; + + gfx = *gfxP; + + if (!msgCtx->textIsCredits) { + primR = ABS_ALT(D_801CFD60 - D_801CFD48[D_801CFD70].r) / D_801CFD6C; + primG = ABS_ALT(D_801CFD64 - D_801CFD48[D_801CFD70].g) / D_801CFD6C; + primB = ABS_ALT(D_801CFD68 - D_801CFD48[D_801CFD70].b) / D_801CFD6C; + + if (D_801CFD60 >= D_801CFD48[D_801CFD70].r) { + D_801CFD60 -= primR; + } else { + D_801CFD60 += primR; + } + + if (D_801CFD64 >= D_801CFD48[D_801CFD70].g) { + D_801CFD64 -= primG; + } else { + D_801CFD64 += primG; + } + + if (D_801CFD68 >= D_801CFD48[D_801CFD70].b) { + D_801CFD68 -= primB; + } else { + D_801CFD68 += primB; + } + + envR = ABS_ALT(D_801CFD74 - D_801CFD54[D_801CFD70].r) / D_801CFD6C; + envG = ABS_ALT(D_801CFD78 - D_801CFD54[D_801CFD70].g) / D_801CFD6C; + envB = ABS_ALT(D_801CFD7C - D_801CFD54[D_801CFD70].b) / D_801CFD6C; + + if (D_801CFD74 >= D_801CFD54[D_801CFD70].r) { + D_801CFD74 -= envR; + } else { + D_801CFD74 += envR; + } + + if (D_801CFD78 >= D_801CFD54[D_801CFD70].g) { + D_801CFD78 -= envG; + } else { + D_801CFD78 += envG; + } + + if (D_801CFD7C >= D_801CFD54[D_801CFD70].b) { + D_801CFD7C -= envB; + } else { + D_801CFD7C += envB; + } + + D_801CFD6C--; + if (D_801CFD6C == 0) { + D_801CFD60 = D_801CFD48[D_801CFD70].r; + D_801CFD64 = D_801CFD48[D_801CFD70].g; + D_801CFD68 = D_801CFD48[D_801CFD70].b; + D_801CFD74 = D_801CFD54[D_801CFD70].r; + D_801CFD78 = D_801CFD54[D_801CFD70].g; + D_801CFD7C = D_801CFD54[D_801CFD70].b; + D_801CFD6C = 12; + D_801CFD70 ^= 1; + } + + gDPPipeSync(gfx++); + gDPSetRenderMode(gfx++, G_RM_XLU_SURF, G_RM_XLU_SURF2); + gDPSetCombineMode(gfx++, G_CC_PRIMITIVE, G_CC_PRIMITIVE); + gDPSetPrimColor(gfx++, 0, 0, D_801CFD60, D_801CFD64, D_801CFD68, 120); + gDPFillRectangle(gfx++, arg2 + 3, arg3, arg2 + 29, arg3 + 11); + gDPFillRectangle(gfx++, arg2 + 6, arg3 - 2, arg2 + 26, arg3 + 13); + gDPPipeSync(gfx++); + + msgCtx->stateTimer++; + *gfxP = gfx++; + } +} + +void Message_HandleChoiceSelection(PlayState* play, u8 numChoices) { + static s16 sAnalogStickHeld = false; + MessageContext* msgCtx = &play->msgCtx; + Input* input = CONTROLLER1(&play->state); + + if ((input->rel.stick_y >= 30) && !sAnalogStickHeld) { + sAnalogStickHeld = true; msgCtx->choiceIndex--; if (msgCtx->choiceIndex > 128) { msgCtx->choiceIndex = 0; } else { Audio_PlaySfx(NA_SE_SY_CURSOR); } - return; - } else if ((curInput->rel.stick_y < -29) && held == 0) { - held = 1; + } else if ((input->rel.stick_y <= -30) && !sAnalogStickHeld) { + sAnalogStickHeld = true; msgCtx->choiceIndex++; - if (msgCtx->choiceIndex > arg1) { - msgCtx->choiceIndex = arg1; + if (msgCtx->choiceIndex > numChoices) { + msgCtx->choiceIndex = numChoices; } else { Audio_PlaySfx(NA_SE_SY_CURSOR); } - return; - } else { - if (ABS_ALT(curInput->rel.stick_y) < 30) { - held = 0; - } + } else if (ABS_ALT(input->rel.stick_y) < 30) { + sAnalogStickHeld = false; } } -#else -#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/func_80148B98.s") -#endif -void func_80148CBC(PlayState* play, UNK_PTR puParm2, u8 arg2) { +void func_80148CBC(PlayState* play, Gfx** gfxP, u8 arg2) { MessageContext* msgCtx = &play->msgCtx; - msgCtx->textPosX = 0x30; + msgCtx->textPosX = 48; if (arg2 == 1) { msgCtx->textPosY = msgCtx->unk11FFE[1 + msgCtx->choiceIndex]; } else { msgCtx->textPosY = msgCtx->unk11FFE[msgCtx->choiceIndex]; } - func_80147818(play, puParm2, msgCtx->textPosX, msgCtx->textPosY); + Message_DrawTextboxIcon(play, gfxP, msgCtx->textPosX, msgCtx->textPosY); } -#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/func_80148D64.s") +void func_80148D64(PlayState* play) { + static s16 sAnalogStickHeld = false; + MessageContext* msgCtx = &play->msgCtx; -#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/func_80149048.s") + if (play->msgCtx.stickAdjY <= -30) { + msgCtx->decodedBuffer.schar[msgCtx->unk120C0 + msgCtx->unk120C2]--; + if (msgCtx->decodedBuffer.schar[msgCtx->unk120C0 + msgCtx->unk120C2] < '0') { + msgCtx->decodedBuffer.schar[msgCtx->unk120C0 + msgCtx->unk120C2] = '9'; + } + Font_LoadCharNES(play, msgCtx->decodedBuffer.schar[msgCtx->unk120C0 + msgCtx->unk120C2], + msgCtx->unk120C4 + (msgCtx->unk120C2 << 7)); + Audio_PlaySfx(NA_SE_SY_RUPY_COUNT); + } else if (msgCtx->stickAdjY >= 30) { + msgCtx->decodedBuffer.schar[msgCtx->unk120C0 + msgCtx->unk120C2]++; + if (msgCtx->decodedBuffer.schar[msgCtx->unk120C0 + msgCtx->unk120C2] > '9') { + msgCtx->decodedBuffer.schar[msgCtx->unk120C0 + msgCtx->unk120C2] = '0'; + } + Font_LoadCharNES(play, msgCtx->decodedBuffer.schar[msgCtx->unk120C0 + msgCtx->unk120C2], + msgCtx->unk120C4 + (msgCtx->unk120C2 << 7)); + Audio_PlaySfx(NA_SE_SY_RUPY_COUNT); + } else if ((msgCtx->stickAdjX >= 30) && !sAnalogStickHeld) { + sAnalogStickHeld = true; + msgCtx->unk120C2++; + if (msgCtx->unk120C2 > 2) { + msgCtx->unk120C2 = 2; + } else { + Audio_PlaySfx(NA_SE_SY_CURSOR); + } + } else if ((msgCtx->stickAdjX <= -30) && !sAnalogStickHeld) { + sAnalogStickHeld = true; + msgCtx->unk120C2--; + if (msgCtx->unk120C2 < 0) { + msgCtx->unk120C2 = 0; + } else { + Audio_PlaySfx(NA_SE_SY_CURSOR); + } + } else { + sAnalogStickHeld = false; + } -#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/func_801491DC.s") + msgCtx->bankRupeesSelected = (msgCtx->decodedBuffer.schar[msgCtx->unk120C0] - '0') * 100; + msgCtx->bankRupeesSelected += (msgCtx->decodedBuffer.schar[msgCtx->unk120C0 + 1] - '0') * 10; + msgCtx->bankRupeesSelected += msgCtx->decodedBuffer.schar[msgCtx->unk120C0 + 2] - '0'; +} -#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/func_80149454.s") +void func_80149048(PlayState* play) { + MessageContext* msgCtx = &play->msgCtx; -#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/func_801496C8.s") + if (msgCtx->stickAdjY <= -30) { + msgCtx->decodedBuffer.schar[msgCtx->unk120C0 + msgCtx->unk120C2]--; + if (msgCtx->decodedBuffer.schar[msgCtx->unk120C0 + msgCtx->unk120C2] < '0') { + msgCtx->decodedBuffer.schar[msgCtx->unk120C0 + msgCtx->unk120C2] = '9'; + } + Font_LoadCharNES(play, msgCtx->decodedBuffer.schar[msgCtx->unk120C0 + msgCtx->unk120C2], + msgCtx->unk120C4 + (msgCtx->unk120C2 << 7)); + Audio_PlaySfx(NA_SE_SY_RUPY_COUNT); + } else if (msgCtx->stickAdjY >= 30) { + msgCtx->decodedBuffer.schar[msgCtx->unk120C0 + msgCtx->unk120C2]++; + if (msgCtx->decodedBuffer.schar[msgCtx->unk120C0 + msgCtx->unk120C2] > '9') { + msgCtx->decodedBuffer.schar[msgCtx->unk120C0 + msgCtx->unk120C2] = '0'; + } + Font_LoadCharNES(play, msgCtx->decodedBuffer.schar[msgCtx->unk120C0 + msgCtx->unk120C2], + msgCtx->unk120C4 + (msgCtx->unk120C2 << 7)); + Audio_PlaySfx(NA_SE_SY_RUPY_COUNT); + } -#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/Message_DrawTextChar.s") + msgCtx->bankRupeesSelected = (msgCtx->decodedBuffer.schar[msgCtx->unk120C0] - '0') * 10; +} -#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/func_80149C18.s") +void func_801491DC(PlayState* play) { + static s16 sAnalogStickHeld = false; + MessageContext* msgCtx = &play->msgCtx; + + if (msgCtx->stickAdjY <= -30) { + msgCtx->unk12054[msgCtx->unk120C2]--; + if (msgCtx->unk12054[msgCtx->unk120C2] <= 0) { + msgCtx->unk12054[msgCtx->unk120C2] = 5; + } + msgCtx->decodedBuffer.schar[msgCtx->unk120C0 + msgCtx->unk120C2] = msgCtx->unk12054[msgCtx->unk120C2] + '0'; + Font_LoadCharNES(play, msgCtx->decodedBuffer.schar[msgCtx->unk120C0 + msgCtx->unk120C2], + msgCtx->unk120C4 + (msgCtx->unk120C2 << 7)); + Audio_PlaySfx(NA_SE_SY_RUPY_COUNT); + } else if (msgCtx->stickAdjY >= 30) { + msgCtx->unk12054[msgCtx->unk120C2]++; + if (msgCtx->unk12054[msgCtx->unk120C2] > 5) { + msgCtx->unk12054[msgCtx->unk120C2] = 1; + } + msgCtx->decodedBuffer.schar[msgCtx->unk120C0 + msgCtx->unk120C2] = msgCtx->unk12054[msgCtx->unk120C2] + '0'; + Font_LoadCharNES(play, msgCtx->decodedBuffer.schar[msgCtx->unk120C0 + msgCtx->unk120C2], + msgCtx->unk120C4 + (msgCtx->unk120C2 << 7)); + Audio_PlaySfx(NA_SE_SY_RUPY_COUNT); + } else if ((msgCtx->stickAdjX >= 30) && !sAnalogStickHeld) { + sAnalogStickHeld = true; + msgCtx->unk120C2++; + if (msgCtx->unk120C2 > 4) { + msgCtx->unk120C2 = 4; + } else { + Audio_PlaySfx(NA_SE_SY_CURSOR); + } + } else if ((msgCtx->stickAdjX <= -30) && !sAnalogStickHeld) { + sAnalogStickHeld = true; + msgCtx->unk120C2--; + if (msgCtx->unk120C2 < 0) { + msgCtx->unk120C2 = 0; + } else { + Audio_PlaySfx(NA_SE_SY_CURSOR); + } + } else { + sAnalogStickHeld = false; + } +} + +void func_80149454(PlayState* play) { + static s16 sAnalogStickHeld = false; + MessageContext* msgCtx = &play->msgCtx; + + if (msgCtx->stickAdjY <= -30) { + msgCtx->unk12054[msgCtx->unk120C2]--; + if (msgCtx->unk12054[msgCtx->unk120C2] < 0) { + msgCtx->unk12054[msgCtx->unk120C2] = 9; + } + msgCtx->decodedBuffer.schar[msgCtx->unk120C0 + msgCtx->unk120C2] = msgCtx->unk12054[msgCtx->unk120C2] + '0'; + Font_LoadCharNES(play, msgCtx->decodedBuffer.schar[msgCtx->unk120C0 + msgCtx->unk120C2], + msgCtx->unk120C4 + (msgCtx->unk120C2 << 7)); + Audio_PlaySfx(NA_SE_SY_RUPY_COUNT); + } else if (msgCtx->stickAdjY >= 30) { + msgCtx->unk12054[msgCtx->unk120C2]++; + if (msgCtx->unk12054[msgCtx->unk120C2] > 9) { + msgCtx->unk12054[msgCtx->unk120C2] = 0; + } + msgCtx->decodedBuffer.schar[msgCtx->unk120C0 + msgCtx->unk120C2] = msgCtx->unk12054[msgCtx->unk120C2] + '0'; + Font_LoadCharNES(play, msgCtx->decodedBuffer.schar[msgCtx->unk120C0 + msgCtx->unk120C2], + msgCtx->unk120C4 + (msgCtx->unk120C2 << 7)); + Audio_PlaySfx(NA_SE_SY_RUPY_COUNT); + } else if ((msgCtx->stickAdjX >= 30) && !sAnalogStickHeld) { + sAnalogStickHeld = true; + msgCtx->unk120C2++; + if (msgCtx->unk120C2 > 2) { + msgCtx->unk120C2 = 2; + } else { + Audio_PlaySfx(NA_SE_SY_CURSOR); + } + } else if ((msgCtx->stickAdjX <= -30) && !sAnalogStickHeld) { + sAnalogStickHeld = true; + msgCtx->unk120C2--; + if (msgCtx->unk120C2 < 0) { + msgCtx->unk120C2 = 0; + } else { + Audio_PlaySfx(NA_SE_SY_CURSOR); + } + } else { + sAnalogStickHeld = false; + } +} + +void func_801496C8(PlayState* play) { + static s16 sAnalogStickHeld = false; + MessageContext* msgCtx = &play->msgCtx; + + if (play->msgCtx.stickAdjY <= -30) { + msgCtx->unk12054[msgCtx->unk120C2]--; + if (msgCtx->unk12054[msgCtx->unk120C2] < 0) { + msgCtx->unk12054[msgCtx->unk120C2] = 3; + } + msgCtx->decodedBuffer.wchar[msgCtx->unk120C0 + msgCtx->unk120C2] = msgCtx->unk12054[msgCtx->unk120C2] + 0x824F; + Font_LoadChar(play, msgCtx->decodedBuffer.wchar[msgCtx->unk120C0 + msgCtx->unk120C2], + msgCtx->unk120C4 + (msgCtx->unk120C2 << 7)); + Audio_PlaySfx(NA_SE_SY_RUPY_COUNT); + } else if (msgCtx->stickAdjY >= 30) { + msgCtx->unk12054[msgCtx->unk120C2]++; + if (msgCtx->unk12054[msgCtx->unk120C2] >= 4) { + msgCtx->unk12054[msgCtx->unk120C2] = 0; + } + msgCtx->decodedBuffer.wchar[msgCtx->unk120C0 + msgCtx->unk120C2] = msgCtx->unk12054[msgCtx->unk120C2] + 0x824F; + Font_LoadChar(play, msgCtx->decodedBuffer.wchar[msgCtx->unk120C0 + msgCtx->unk120C2], + msgCtx->unk120C4 + (msgCtx->unk120C2 << 7)); + Audio_PlaySfx(NA_SE_SY_RUPY_COUNT); + } else if ((msgCtx->stickAdjX >= 30) && !sAnalogStickHeld) { + sAnalogStickHeld = true; + msgCtx->unk120C2++; + if (msgCtx->unk120C2 > 5) { + msgCtx->unk120C2 = 5; + } else { + Audio_PlaySfx(NA_SE_SY_CURSOR); + } + } else if ((msgCtx->stickAdjX <= -30) && !sAnalogStickHeld) { + sAnalogStickHeld = true; + msgCtx->unk120C2--; + if (msgCtx->unk120C2 < 0) { + msgCtx->unk120C2 = 0; + } else { + Audio_PlaySfx(NA_SE_SY_CURSOR); + } + } else { + sAnalogStickHeld = false; + } +} + +void Message_DrawTextChar(PlayState* play, TexturePtr texture, Gfx** gfxP) { + MessageContext* msgCtx = &play->msgCtx; + Gfx* gfx = *gfxP; + s16 x = msgCtx->textPosX; + s16 y = msgCtx->textPosY; + + gDPPipeSync(gfx++); + + gDPLoadTextureBlock_4b(gfx++, texture, G_IM_FMT_I, 16, 16, 0, G_TX_NOMIRROR | G_TX_CLAMP, + G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); + + if ((msgCtx->textBoxType != TEXTBOX_TYPE_5) && (msgCtx->textBoxType != TEXTBOX_TYPE_D) && + !play->pauseCtx.bombersNotebookOpen) { + gDPSetPrimColor(gfx++, 0, 0, 0, 0, 0, msgCtx->textColorAlpha); + gSPTextureRectangle(gfx++, (x + 1) << 2, (y + 1) << 2, (x + sCharTexSize + 1) << 2, (y + sCharTexSize + 1) << 2, + G_TX_RENDERTILE, 0, 0, sCharTexScale, sCharTexScale); + gDPPipeSync(gfx++); + } + + gDPSetPrimColor(gfx++, 0, 0, msgCtx->textColorR, msgCtx->textColorG, msgCtx->textColorB, msgCtx->textColorAlpha); + gSPTextureRectangle(gfx++, x << 2, y << 2, (x + sCharTexSize) << 2, (y + sCharTexSize) << 2, G_TX_RENDERTILE, 0, 0, + sCharTexScale, sCharTexScale); + *gfxP = gfx++; +} + +s16 sTextboxWidth = 256; +s16 sTextboxHeight = 64; +s16 sTextboxTexWidth = 1024; +s16 sTextboxTexHeight = 1024; + +f32 D_801CFDA4[] = { 0.6f, 0.75f, 0.9f, 1.0f, 1.05f, 1.1f, 1.05f, 1.0f, 1.0f }; +f32 D_801CFDC8[] = { 0.6f, 0.75f, 0.9f, 1.0f, 1.05f, 1.1f, 1.05f, 1.0f, 1.0f }; + +// resizes textboxes when opening them +void Message_GrowTextbox(PlayState* play) { + MessageContext* msgCtx = &play->msgCtx; + + if (!play->pauseCtx.bombersNotebookOpen) { + sTextboxWidth = D_801CFDA4[msgCtx->stateTimer] * 256.0f; + sTextboxTexWidth = 1024.0f / D_801CFDA4[msgCtx->stateTimer]; + sTextboxHeight = D_801CFDC8[msgCtx->stateTimer] * 64.0f; + sTextboxTexHeight = 1024.0f / D_801CFDC8[msgCtx->stateTimer]; + msgCtx->textboxY = msgCtx->textboxYTarget + ((64 - sTextboxHeight) / 2); + msgCtx->textboxColorAlphaCurrent += msgCtx->textboxColorAlphaTarget / 8; + msgCtx->stateTimer++; + } else { + msgCtx->stateTimer = 8; + sTextboxWidth = 512; + sTextboxTexWidth = 512; + sTextboxHeight = 89; + sTextboxTexHeight = 731; + msgCtx->textboxY = msgCtx->textboxYTarget + ((90 - sTextboxHeight) / 2); + } + + if (msgCtx->stateTimer == 8) { + // Reached the end + msgCtx->textboxX = msgCtx->textboxXTarget; + msgCtx->textboxY = msgCtx->textboxYTarget; + msgCtx->msgMode = MSGMODE_TEXT_STARTING; + msgCtx->textboxColorAlphaCurrent = msgCtx->textboxColorAlphaTarget; + } + + if (!play->pauseCtx.bombersNotebookOpen) { + msgCtx->textboxX = msgCtx->textboxXTarget + ((256 - sTextboxWidth) / 2); + } else { + msgCtx->textboxX = msgCtx->textboxXTarget + ((512 - sTextboxWidth) / 2); + } +} void Message_FindMessage(PlayState* play, u16 textId) { MessageContext* msgCtx = &play->msgCtx; @@ -223,13 +807,1075 @@ void Message_FindMessage(PlayState* play, u16 textId) { font->messageEnd = nextSegment - foundSegment; } -#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/Message_DrawItemIcon.s") +Color_RGB8 D_801CFDEC[] = { + { 0, 255, 0 }, { 0, 0, 255 }, { 255, 255, 255 }, { 255, 0, 0 }, + { 255, 0, 255 }, { 255, 255, 255 }, { 255, 100, 0 }, { 0, 0, 0 }, +}; -#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/Message_HandleOcarina.s") +s16 D_801CFE04[] = { + 150, // ITEM_SONG_SONATA + 255, // ITEM_SONG_LULLABY + 100, // ITEM_SONG_NOVA + 255, // ITEM_SONG_ELEGY + 255, // ITEM_SONG_OATH + 255, // ITEM_SONG_SARIA + 255, // ITEM_SONG_TIME + 255, // ITEM_SONG_HEALING + 255, // ITEM_SONG_EPONA + 255, // ITEM_SONG_SOARING + 255, // ITEM_SONG_STORMS + 255 // ITEM_SONG_SUN -#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/func_8014ADBC.s") +}; +s16 D_801CFE1C[] = { + 255, // ITEM_SONG_SONATA + 80, // ITEM_SONG_LULLABY + 150, // ITEM_SONG_NOVA + 160, // ITEM_SONG_ELEGY + 100, // ITEM_SONG_OATH + 240, // ITEM_SONG_SARIA + 255, // ITEM_SONG_TIME + 255, // ITEM_SONG_HEALING + 255, // ITEM_SONG_EPONA + 255, // ITEM_SONG_SOARING + 255, // ITEM_SONG_STORMS + 255 // ITEM_SONG_SUN -#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/Message_LoadItemIcon.s") +}; +s16 D_801CFE34[] = { + 100, // ITEM_SONG_SONATA + 40, // ITEM_SONG_LULLABY + 255, // ITEM_SONG_NOVA + 0, // ITEM_SONG_ELEGY + 255, // ITEM_SONG_OATH + 100, // ITEM_SONG_SARIA + 255, // ITEM_SONG_TIME + 255, // ITEM_SONG_HEALING + 255, // ITEM_SONG_EPONA + 255, // ITEM_SONG_SOARING + 255, // ITEM_SONG_STORMS + 255 // ITEM_SONG_SUN +}; + +static TexturePtr sStrayFairyIconTextures[] = { + gStrayFairyWoodfallIconTex, + gStrayFairySnowheadIconTex, + gStrayFairyGreatBayIconTex, + gStrayFairyStoneTowerIconTex, +}; + +static Color_RGB8 sStrayFairyIconPrimColors[] = { + { 255, 110, 160 }, + { 90, 255, 100 }, + { 120, 255, 255 }, + { 245, 245, 90 }, +}; + +static Color_RGB8 sStrayFairyIconEnvColors[] = { + { 255, 255, 255 }, + { 255, 255, 255 }, + { 255, 255, 255 }, + { 225, 170, 0 }, +}; + +void Message_DrawItemIcon(PlayState* play, Gfx** gfxP) { + MessageContext* msgCtx = &play->msgCtx; + Gfx* gfx = *gfxP; + s32 index; + + msgCtx->unk12016 = msgCtx->unk12014; + + if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) { + Audio_PlaySfx(NA_SE_NONE); + } + + gDPPipeSync(gfx++); + gDPSetCombineMode(gfx++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM); + gDPSetPrimColor(gfx++, 0, 0, 255, 255, 255, msgCtx->textColorAlpha); + + if (msgCtx->itemId == ITEM_RECOVERY_HEART) { + gDPPipeSync(gfx++); + gDPSetPrimColor(gfx++, 0, 0, 255, 0, 0, msgCtx->textColorAlpha); + gDPSetEnvColor(gfx++, 0, 80, 0, 255); + gDPLoadTextureBlock(gfx++, gHeartFullTex, G_IM_FMT_IA, G_IM_SIZ_8b, 16, 16, 0, G_TX_NOMIRROR | G_TX_WRAP, + G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); + } else if ((msgCtx->itemId >= ITEM_RUPEE_GREEN) && (msgCtx->itemId <= ITEM_RUPEE_HUGE)) { + index = msgCtx->itemId - ITEM_RUPEE_GREEN; + gDPPipeSync(gfx++); + gDPSetPrimColor(gfx++, 0, 0, D_801CFDEC[index].r, D_801CFDEC[index].g, D_801CFDEC[index].b, + msgCtx->textColorAlpha); + gDPSetEnvColor(gfx++, 0, 80, 0, 255); + gDPLoadTextureBlock(gfx++, gRupeeCounterIconTex, G_IM_FMT_IA, G_IM_SIZ_8b, 16, 16, 0, G_TX_NOMIRROR | G_TX_WRAP, + G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); + } else if (msgCtx->itemId == ITEM_STRAY_FAIRIES) { + msgCtx->unk12016 = 0x18; + gDPPipeSync(gfx++); + gDPSetPrimColor(gfx++, 0, 0, sStrayFairyIconPrimColors[((void)0, gSaveContext.dungeonIndex)].r, + sStrayFairyIconPrimColors[((void)0, gSaveContext.dungeonIndex)].g, + sStrayFairyIconPrimColors[((void)0, gSaveContext.dungeonIndex)].b, msgCtx->textColorAlpha); + gDPSetEnvColor(gfx++, sStrayFairyIconEnvColors[((void)0, gSaveContext.dungeonIndex)].r, + sStrayFairyIconEnvColors[((void)0, gSaveContext.dungeonIndex)].g, + sStrayFairyIconEnvColors[((void)0, gSaveContext.dungeonIndex)].b, 0); + gDPLoadTextureBlock_4b(gfx++, gStrayFairyGlowingCircleIconTex, G_IM_FMT_I, 32, 24, 0, G_TX_NOMIRROR | G_TX_WRAP, + G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); + gSPTextureRectangle(gfx++, msgCtx->unk12010 << 2, msgCtx->unk12012 << 2, + (msgCtx->unk12010 + msgCtx->unk12014) << 2, (msgCtx->unk12012 + msgCtx->unk12016) << 2, + G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10); + gDPSetPrimColor(gfx++, 0, 0, 255, 255, 255, msgCtx->textColorAlpha); + gDPLoadTextureBlock(gfx++, sStrayFairyIconTextures[((void)0, gSaveContext.dungeonIndex)], G_IM_FMT_RGBA, + G_IM_SIZ_32b, 32, 24, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, + G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); + } else if ((msgCtx->itemId >= ITEM_SONG_SONATA) && (msgCtx->itemId <= ITEM_SONG_SUN)) { + index = msgCtx->itemId - ITEM_SONG_SONATA; + gDPSetPrimColor(gfx++, 0, 0, D_801CFE04[index], D_801CFE1C[index], D_801CFE34[index], msgCtx->textColorAlpha); + gDPLoadTextureBlock(gfx++, msgCtx->textboxSegment + 0x1000, G_IM_FMT_IA, G_IM_SIZ_8b, 16, 24, 0, + G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, + G_TX_NOLOD); + msgCtx->unk12016 = 0x18; + } else if (msgCtx->itemId == ITEM_CC) { + gDPPipeSync(gfx++); + gDPSetPrimColor(gfx++, 0, 0, 255, 255, 0, msgCtx->textColorAlpha); + gDPSetEnvColor(gfx++, 0, 0, 0, 255); + gDPLoadTextureBlock(gfx++, msgCtx->textboxSegment + 0x1000, G_IM_FMT_IA, G_IM_SIZ_8b, 32, 32, 0, + G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, + G_TX_NOLOD); + } else if (msgCtx->itemId >= ITEM_B8) { + gDPLoadTextureBlock(gfx++, msgCtx->textboxSegment + 0x1000, G_IM_FMT_RGBA, G_IM_SIZ_16b, 32, 32, 0, + G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, + G_TX_NOLOD); + } else if (msgCtx->itemId >= ITEM_SKULL_TOKEN) { + gDPLoadTextureBlock(gfx++, msgCtx->textboxSegment + 0x1000, G_IM_FMT_RGBA, G_IM_SIZ_32b, 24, 24, 0, + G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, + G_TX_NOLOD); + } else { + msgCtx->unk12016 = msgCtx->unk12014; + gDPLoadTextureBlock(gfx++, msgCtx->textboxSegment + 0x1000, G_IM_FMT_RGBA, G_IM_SIZ_32b, 32, 32, 0, + G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, + G_TX_NOLOD); + } + + gSPTextureRectangle(gfx++, msgCtx->unk12010 << 2, msgCtx->unk12012 << 2, (msgCtx->unk12010 + msgCtx->unk12014) << 2, + (msgCtx->unk12012 + msgCtx->unk12016) << 2, G_TX_RENDERTILE, 0, 0, D_801F6B08, D_801F6B08); + gDPPipeSync(gfx++); + gDPSetCombineLERP(gfx++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0); + + if (!play->pauseCtx.bombersNotebookOpen) { + msgCtx->textPosX += 16; + } else { + msgCtx->textPosX += 50; + } + *gfxP = gfx; +} + +void Message_HandleOcarina(PlayState* play) { + MessageContext* msgCtx = &play->msgCtx; + + if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) { + play->msgCtx.ocarinaMode = OCARINA_MODE_ACTIVE; + if (msgCtx->ocarinaAction == OCARINA_ACTION_SCARECROW_LONG_RECORDING) { + msgCtx->msgMode = MSGMODE_SCARECROW_LONG_RECORDING_START; + } else if (msgCtx->ocarinaAction == OCARINA_ACTION_SCARECROW_LONG_DEMONSTRATION) { + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_DEFAULT); + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_DEFAULT); + msgCtx->ocarinaStaff = AudioOcarina_GetPlaybackStaff(); + msgCtx->ocarinaStaff->pos = 0; + sOcarinaButtonIndexBufPos = sOcarinaButtonIndexBufLen = 0; + Message_ResetOcarinaButtonState(play); + msgCtx->stateTimer = 3; + msgCtx->msgMode = MSGMODE_SCARECROW_LONG_DEMONSTRATION; + AudioOcarina_SetPlaybackSong(OCARINA_SONG_SCARECROW_LONG + 1, 1); + } else if (msgCtx->ocarinaAction == OCARINA_ACTION_SCARECROW_SPAWN_RECORDING) { + msgCtx->msgMode = MSGMODE_SCARECROW_SPAWN_RECORDING_START; + } else if (msgCtx->ocarinaAction == OCARINA_ACTION_SCARECROW_SPAWN_DEMONSTRATION) { + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_DEFAULT); + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_DEFAULT); + msgCtx->ocarinaStaff = AudioOcarina_GetPlaybackStaff(); + msgCtx->ocarinaStaff->pos = 0; + sOcarinaButtonIndexBufPos = sOcarinaButtonIndexBufLen = 0; + Message_ResetOcarinaButtonState(play); + msgCtx->stateTimer = 3; + msgCtx->msgMode = MSGMODE_SCARECROW_SPAWN_DEMONSTRATION; + AudioOcarina_SetPlaybackSong(OCARINA_SONG_SCARECROW_SPAWN + 1, 1); + } else if (msgCtx->ocarinaAction == OCARINA_ACTION_37) { + msgCtx->msgMode = MSGMODE_2F; + } else if (msgCtx->ocarinaAction == OCARINA_ACTION_3A) { + msgCtx->msgMode = MSGMODE_32; + } else if ((msgCtx->ocarinaAction >= OCARINA_ACTION_TIMED_PROMPT_SONATA) && + (msgCtx->ocarinaAction <= OCARINA_ACTION_TIMED_PROMPT_STORMS)) { + msgCtx->msgMode = MSGMODE_35; + } else if (((msgCtx->ocarinaAction >= OCARINA_ACTION_DEMONSTRATE_SONATA) && + (msgCtx->ocarinaAction <= OCARINA_ACTION_DEMONSTRATE_GORON_LULLABY_INTRO)) || + (msgCtx->ocarinaAction == OCARINA_ACTION_3B) || (msgCtx->ocarinaAction == OCARINA_ACTION_3C) || + (msgCtx->ocarinaAction == OCARINA_ACTION_DEMONSTRATE_EVAN_PART1_FIRST_HALF) || + (msgCtx->ocarinaAction == OCARINA_ACTION_DEMONSTRATE_EVAN_PART2_FIRST_HALF) || + (msgCtx->ocarinaAction == OCARINA_ACTION_DEMONSTRATE_EVAN_PART1_SECOND_HALF) || + (msgCtx->ocarinaAction == OCARINA_ACTION_DEMONSTRATE_EVAN_PART2_SECOND_HALF)) { + msgCtx->msgMode = MSGMODE_SONG_DEMONSTRATION_STARTING; + } else if ((msgCtx->ocarinaAction == OCARINA_ACTION_PROMPT_EVAN_PART1_SECOND_HALF) || + (msgCtx->ocarinaAction == OCARINA_ACTION_PROMPT_EVAN_PART2_SECOND_HALF) || + (msgCtx->ocarinaAction == OCARINA_ACTION_PROMPT_WIND_FISH_HUMAN) || + (msgCtx->ocarinaAction == OCARINA_ACTION_PROMPT_WIND_FISH_GORON) || + (msgCtx->ocarinaAction == OCARINA_ACTION_PROMPT_WIND_FISH_ZORA) || + (msgCtx->ocarinaAction == OCARINA_ACTION_PROMPT_WIND_FISH_DEKU)) { + msgCtx->msgMode = MSGMODE_SONG_PROMPT_STARTING; + } else if ((msgCtx->ocarinaAction == OCARINA_ACTION_0) || (msgCtx->ocarinaAction == OCARINA_ACTION_FREE_PLAY) || + (msgCtx->ocarinaAction >= OCARINA_ACTION_CHECK_TIME)) { + msgCtx->msgMode = MSGMODE_OCARINA_STARTING; + } else { + msgCtx->msgMode = MSGMODE_SONG_PROMPT_STARTING; + } + } +} + +Color_RGB16 D_801CFE74[] = { + { 255, 120, 0 }, { 70, 255, 80 }, { 80, 110, 255 }, { 255, 255, 30 }, + { 90, 180, 255 }, { 210, 100, 255 }, { 170, 170, 170 }, { 255, 130, 30 }, +}; +Color_RGB16 D_801CFEA4[] = { + { 255, 60, 60 }, { 70, 255, 80 }, { 80, 90, 255 }, { 255, 255, 50 }, + { 80, 150, 255 }, { 255, 150, 180 }, { 170, 170, 170 }, { 255, 130, 30 }, +}; +Color_RGB16 D_801CFED4[] = { + { 255, 60, 60 }, { 70, 255, 80 }, { 80, 90, 255 }, { 255, 255, 50 }, + { 80, 150, 255 }, { 255, 150, 180 }, { 180, 180, 200 }, { 255, 130, 30 }, +}; +Color_RGB16 D_801CFF04[] = { + { 195, 0, 0 }, { 70, 255, 80 }, { 80, 90, 255 }, { 255, 255, 50 }, + { 80, 150, 255 }, { 255, 150, 180 }, { 170, 170, 170 }, { 255, 130, 30 }, +}; +Color_RGB16 D_801CFF34[] = { + { 255, 60, 60 }, { 110, 170, 255 }, { 80, 90, 255 }, { 255, 255, 50 }, + { 80, 150, 255 }, { 255, 150, 180 }, { 170, 170, 170 }, { 255, 130, 30 }, +}; + +u8 D_801CFF64[] = { 2, 1, 3, 6, 6, 6, 3, 3, 3, 3, 1, 6 }; + +#define MESSAGE_ITEM_NONE 9999 + +void Message_DrawTextDefault(PlayState* play, Gfx** gfxP) { + MessageContext* msgCtx = &play->msgCtx; + u16 j; + Font* font = &play->msgCtx.font; + u16 i; + u16 charTexIndex; + Gfx* gfx = *gfxP; + u16 character; + s16 sp130; + s16 sp12E; + s16 sp12C; + s16 sp12A; + u16 lookAheadCharacter; + + play->msgCtx.textPosX = play->msgCtx.unk11F1A[0] + play->msgCtx.unk11FF8; + play->msgCtx.textPosY = play->msgCtx.unk11FFA; + + sp130 = 0; + if (play->msgCtx.itemId != MESSAGE_ITEM_NONE) { + Message_DrawItemIcon(play, &gfx); + } + msgCtx->textColorR = msgCtx->unk120C8; + msgCtx->textColorG = msgCtx->unk120CA; + msgCtx->textColorB = msgCtx->unk120CC; + + charTexIndex = 0; + + for (i = 0; i < msgCtx->textDrawPos; i++) { + character = msgCtx->decodedBuffer.wchar[i]; + + switch (character) { + case 0x2000: + if (play->pauseCtx.bombersNotebookOpen || (msgCtx->textBoxType == TEXTBOX_TYPE_D)) { + msgCtx->textColorR = msgCtx->textColorG = msgCtx->textColorB = 0; + } else if (msgCtx->textBoxType == TEXTBOX_TYPE_5) { + msgCtx->textColorR = msgCtx->textColorG = msgCtx->textColorB = 0; + } else { + msgCtx->textColorR = msgCtx->textColorG = msgCtx->textColorB = 255; + } + if ((i + 1) == msgCtx->textDrawPos) { + msgCtx->textDrawPos++; + } + break; + + case 0x2001: + case 0x2002: + case 0x2003: + case 0x2004: + case 0x2005: + case 0x2006: + case 0x2007: + case 0x2008: + if ((msgCtx->msgMode >= MSGMODE_NEW_CYCLE_0) && (msgCtx->msgMode <= MSGMODE_NEW_CYCLE_2) && + (character == 0x2002)) { + msgCtx->textDrawPos = msgCtx->decodedTextLen; + if (msgCtx->unk120D6) { + msgCtx->unk120D4 += 25; + if (msgCtx->unk120D4 >= 100) { + msgCtx->unk120D6 = false; + } + } else { + msgCtx->unk120D4 -= 25; + if (msgCtx->unk120D4 <= -100) { + msgCtx->unk120D6 = true; + } + } + + if (D_801CFE74[(s16)(character - 0x2001)].r + msgCtx->unk120D4 < 0) { + msgCtx->textColorR = 0; + } else { + msgCtx->textColorR = D_801CFE74[(s16)(character - 0x2001)].r + msgCtx->unk120D4; + } + if (D_801CFE74[(s16)(character - 0x2001)].g + msgCtx->unk120D4 >= 255) { + msgCtx->textColorG = D_801CFE74[(s16)(character - 0x2001)].g; + } else { + msgCtx->textColorG = D_801CFE74[(s16)(character - 0x2001)].g + msgCtx->unk120D4; + } + if (D_801CFE74[(s16)(character - 0x2001)].b + msgCtx->unk120D4 < 0) { + msgCtx->textColorB = 0; + } else { + msgCtx->textColorB = D_801CFE74[(s16)(character - 0x2001)].b + msgCtx->unk120D4; + } + } else if (play->pauseCtx.bombersNotebookOpen) { + msgCtx->textColorR = D_801CFF34[(s16)(character - 0x2001)].r; + msgCtx->textColorG = D_801CFF34[(s16)(character - 0x2001)].g; + msgCtx->textColorB = D_801CFF34[(s16)(character - 0x2001)].b; + } else if (msgCtx->textBoxType == TEXTBOX_TYPE_1) { + msgCtx->textColorR = D_801CFE74[(s16)(character - 0x2001)].r; + msgCtx->textColorG = D_801CFE74[(s16)(character - 0x2001)].g; + msgCtx->textColorB = D_801CFE74[(s16)(character - 0x2001)].b; + } else if (msgCtx->textBoxType == TEXTBOX_TYPE_D) { + msgCtx->textColorR = D_801CFF04[(s16)(character - 0x2001)].r; + msgCtx->textColorG = D_801CFF04[(s16)(character - 0x2001)].g; + msgCtx->textColorB = D_801CFF04[(s16)(character - 0x2001)].b; + } else { + msgCtx->textColorR = D_801CFEA4[(s16)(character - 0x2001)].r; + msgCtx->textColorG = D_801CFEA4[(s16)(character - 0x2001)].g; + msgCtx->textColorB = D_801CFEA4[(s16)(character - 0x2001)].b; + } + + if ((i + 1) == msgCtx->textDrawPos) { + msgCtx->textDrawPos++; + } + break; + + case 0x20: // ` ` + msgCtx->textPosX += 6; + break; + + case 0xA: + msgCtx->textPosY += msgCtx->unk11FFC; + // fallthrough + case 0xC: + sp130++; + msgCtx->textPosX = msgCtx->unk11F1A[sp130] + msgCtx->unk11FF8; + if (msgCtx->choiceNum == 1) { + if (!play->pauseCtx.bombersNotebookOpen) { + msgCtx->textPosX += 32; + } else { + msgCtx->textPosX += 57; + } + } else if (msgCtx->choiceNum == 2) { + if (!play->pauseCtx.bombersNotebookOpen) { + msgCtx->textPosX += 22; + } else { + msgCtx->textPosX += 57; + } + } + continue; + + case 0x9: + case 0xB: + if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) { + if (!msgCtx->textboxSkipped) { + Audio_PlaySfx(NA_SE_NONE); + msgCtx->msgMode = MSGMODE_TEXT_AWAIT_NEXT; + Font_LoadMessageBoxEndIcon(font, 0); + } else { + msgCtx->msgMode = MSGMODE_TEXT_NEXT_MSG; + msgCtx->textUnskippable = false; + msgCtx->msgBufPos++; + } + msgCtx->unk120CE = msgCtx->textColorR; + msgCtx->unk120D0 = msgCtx->textColorG; + msgCtx->unk120D2 = msgCtx->textColorB; + } + *gfxP = gfx; + return; + + case 0x101: // MESSAGE_QUICKTEXT_ENABLE + if (((i + 1) == msgCtx->textDrawPos) && + ((msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) || + ((msgCtx->msgMode >= MSGMODE_OCARINA_STARTING) && (msgCtx->msgMode <= MSGMODE_26)))) { + + j = i; + while (true) { + if ((msgCtx->decodedBuffer.wchar[j] != 0x102) && (msgCtx->decodedBuffer.wchar[j] != 0x104) && + (msgCtx->decodedBuffer.wchar[j] != 0x103) && (msgCtx->decodedBuffer.wchar[j] != 0x230) && + (msgCtx->decodedBuffer.wchar[j] != 9) && (msgCtx->decodedBuffer.wchar[j] != 0xB)) { + j++; + continue; + } + break; + } + + i = j - 1; + msgCtx->textDrawPos = i + 1; + } + break; + + case 0x102: // MESSAGE_QUICKTEXT_DISABLE + break; + + case 0x110: // MESSAGE_BOX_BREAK_DELAYED + if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) { + msgCtx->stateTimer = msgCtx->decodedBuffer.wchar[++i]; + msgCtx->msgMode = MSGMODE_TEXT_DELAYED_BREAK; + } + *gfxP = gfx; + return; + + case 0x111: + if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) { + msgCtx->msgMode = MSGMODE_TEXT_DONE; + if (msgCtx->unk11F0C == 3) { + msgCtx->textboxEndType = TEXTBOX_ENDTYPE_55; + } else { + msgCtx->textboxEndType = TEXTBOX_ENDTYPE_50; + } + msgCtx->stateTimer = msgCtx->decodedBuffer.wchar[++i]; + Font_LoadMessageBoxEndIcon(&play->msgCtx.font, 1); + if (play->csCtx.state == CS_STATE_IDLE) { + func_8011552C(play, DO_ACTION_RETURN); + } + } + *gfxP = gfx; + return; + + case 0x112: + if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) { + msgCtx->msgMode = MSGMODE_TEXT_DONE; + msgCtx->textboxEndType = TEXTBOX_ENDTYPE_52; + msgCtx->stateTimer = msgCtx->decodedBuffer.wchar[++i]; + Font_LoadMessageBoxEndIcon(&play->msgCtx.font, 1); + if (play->csCtx.state == CS_STATE_IDLE) { + func_8011552C(play, DO_ACTION_RETURN); + } + } + *gfxP = gfx; + return; + + case 0x120: // MESSAGE_SFX + if (((i + 1) == msgCtx->textDrawPos) && (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING)) { + Audio_PlaySfx(msgCtx->decodedBuffer.wchar[i + 1]); + } + if ((i + 1) == msgCtx->textDrawPos) { + msgCtx->textDrawPos++; + } + i++; + break; + + case 0x128: + if (((i + 1) == msgCtx->textDrawPos) && (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING)) { + msgCtx->msgMode = MSGMODE_9; + msgCtx->textDelayTimer = msgCtx->decodedBuffer.wchar[i + 1]; + } + i++; + break; + + case 0x130: + case 0x131: + case 0x132: + case 0x133: + case 0x134: + case 0x135: + case 0x136: + msgCtx->textDelay = character - 0x130; + if ((i + 1) == msgCtx->textDrawPos) { + msgCtx->textDrawPos++; + } + break; + + case 0x201: // MESSAGE_BACKGROUND + msgCtx->textPosX = 45; + + if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) { + Audio_PlaySfx(NA_SE_NONE); + } + + gDPPipeSync(gfx++); + gDPSetCombineMode(gfx++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM); + gDPSetPrimColor(gfx++, 0, 0, 0, 0, 0, msgCtx->textColorAlpha); + gDPLoadTextureBlock_4b(gfx++, msgCtx->textboxSegment + 0x1000, G_IM_FMT_I, 96, 48, 0, + G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, + G_TX_NOLOD, G_TX_NOLOD); + gSPTextureRectangle(gfx++, msgCtx->textPosX << 2, (msgCtx->unk12012 + 1) << 2, + (msgCtx->textPosX + 96) << 2, (msgCtx->unk12012 + 49) << 2, G_TX_RENDERTILE, 0, 0, + 1 << 10, 1 << 10); + gDPLoadTextureBlock_4b(gfx++, msgCtx->textboxSegment + 0x1900, G_IM_FMT_I, 96, 48, 0, + G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, + G_TX_NOLOD, G_TX_NOLOD); + gSPTextureRectangle(gfx++, (msgCtx->textPosX + 96) << 2, (msgCtx->unk12012 + 1) << 2, + (msgCtx->textPosX + 193) << 2, (msgCtx->unk12012 + 49) << 2, G_TX_RENDERTILE, 0, 0, + 1 << 10, 1 << 10); + + gDPPipeSync(gfx++); + gDPSetPrimColor(gfx++, 0, 0, 255, 60, 0, msgCtx->textColorAlpha); + gDPLoadTextureBlock_4b(gfx++, msgCtx->textboxSegment + 0x1000, G_IM_FMT_I, 96, 48, 0, + G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, + G_TX_NOLOD, G_TX_NOLOD); + gSPTextureRectangle(gfx++, msgCtx->textPosX << 2, msgCtx->unk12012 << 2, (msgCtx->textPosX + 96) << 2, + (msgCtx->unk12012 + 48) << 2, G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10); + gDPLoadTextureBlock_4b(gfx++, msgCtx->textboxSegment + 0x1900, G_IM_FMT_I, 96, 48, 0, + G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, + G_TX_NOLOD, G_TX_NOLOD); + gSPTextureRectangle(gfx++, (msgCtx->textPosX + 96) << 2, msgCtx->unk12012 << 2, + (msgCtx->textPosX + 192) << 2, (msgCtx->unk12012 + 48) << 2, G_TX_RENDERTILE, 0, 0, + 1 << 10, 1 << 10); + gDPPipeSync(gfx++); + gDPSetCombineLERP(gfx++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE, TEXEL0, 0, + PRIMITIVE, 0); + + msgCtx->textPosX += 32; + break; + + case 0x202: + msgCtx->textboxEndType = TEXTBOX_ENDTYPE_10; + + if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) { + msgCtx->choiceTextId = msgCtx->currentTextId; + msgCtx->stateTimer = 4; + Font_LoadMessageBoxEndIcon(&play->msgCtx.font, 2); + } + break; + + case 0x203: + msgCtx->textboxEndType = TEXTBOX_ENDTYPE_11; + + if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) { + msgCtx->choiceTextId = msgCtx->currentTextId; + msgCtx->stateTimer = 4; + Font_LoadMessageBoxEndIcon(&play->msgCtx.font, 2); + } + break; + + case 0x20C: + msgCtx->textboxEndType = TEXTBOX_ENDTYPE_60; + + if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) { + Font_LoadMessageBoxEndIcon(&play->msgCtx.font, 1); + } + break; + + case 0x220: + msgCtx->textboxEndType = TEXTBOX_ENDTYPE_61; + + if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) { + Font_LoadMessageBoxEndIcon(&play->msgCtx.font, 1); + } + break; + + case 0x221: + msgCtx->textboxEndType = TEXTBOX_ENDTYPE_62; + + if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) { + Font_LoadMessageBoxEndIcon(&play->msgCtx.font, 1); + } + break; + + case 0x222: + if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) { + msgCtx->msgMode = MSGMODE_TEXT_DONE; + msgCtx->textboxEndType = TEXTBOX_ENDTYPE_41; + Font_LoadMessageBoxEndIcon(&play->msgCtx.font, 0); + Audio_PlaySfx(NA_SE_SY_MESSAGE_END); + } + break; + + case 0x225: + msgCtx->textboxEndType = TEXTBOX_ENDTYPE_63; + + if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) { + Font_LoadMessageBoxEndIcon(&play->msgCtx.font, 1); + } + break; + + case 0x240: + case 0x500: + if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) { + if (msgCtx->textBoxType == TEXTBOX_TYPE_3) { + Message_HandleOcarina(play); + *gfxP = gfx; + return; + } + msgCtx->msgMode = MSGMODE_TEXT_DONE; + if (msgCtx->textboxEndType == TEXTBOX_ENDTYPE_00) { + Audio_PlaySfx(NA_SE_SY_MESSAGE_END); + if (character == 0x500) { + Font_LoadMessageBoxEndIcon(font, 1); + } else { + Font_LoadMessageBoxEndIcon(font, 0); + } + if (play->csCtx.state == CS_STATE_IDLE) { + func_8011552C(play, DO_ACTION_RETURN); + } + } else { + Audio_PlaySfx(NA_SE_NONE); + } + } + *gfxP = gfx; + return; + + case 0x104: + if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) { + Audio_PlaySfx(NA_SE_NONE); + msgCtx->msgMode = MSGMODE_TEXT_DONE; + msgCtx->textboxEndType = TEXTBOX_ENDTYPE_30; + } + *gfxP = gfx; + return; + + case 0x103: + if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) { + msgCtx->msgMode = MSGMODE_TEXT_DONE; + msgCtx->textboxEndType = TEXTBOX_ENDTYPE_40; + Font_LoadMessageBoxEndIcon(&play->msgCtx.font, 0); + Audio_PlaySfx(NA_SE_SY_MESSAGE_END); + } + *gfxP = gfx; + return; + + case 0x230: + if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) { + msgCtx->msgMode = MSGMODE_TEXT_DONE; + msgCtx->textboxEndType = TEXTBOX_ENDTYPE_42; + Font_LoadMessageBoxEndIcon(&play->msgCtx.font, 1); + Audio_PlaySfx(NA_SE_SY_MESSAGE_END); + } + *gfxP = gfx; + return; + + default: + switch (character) { + case 0x8169: + case 0x8175: + msgCtx->textPosX -= (s16)(6.0f * msgCtx->textCharScale); + break; + + case 0x8145: + msgCtx->textPosX -= (s16)(3.0f * msgCtx->textCharScale); + break; + + case 0x8148: + case 0x8149: + msgCtx->textPosX -= (s16)(2.0f * msgCtx->textCharScale); + break; + + default: + break; + } + + if ((msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) && ((i + 1) == msgCtx->textDrawPos)) { + Audio_PlaySfx(NA_SE_NONE); + } + + if ((character >= 0x839F) && (character < 0x83AB)) { + sp12E = msgCtx->textColorR; + sp12C = msgCtx->textColorG; + sp12A = msgCtx->textColorB; + msgCtx->textColorR = D_801CFED4[(s16)D_801CFF64[character - 0x839F]].r; + msgCtx->textColorG = D_801CFED4[(s16)D_801CFF64[character - 0x839F]].g; + msgCtx->textColorB = D_801CFED4[(s16)D_801CFF64[character - 0x839F]].b; + Message_DrawTextChar(play, &font->charBuf[font->unk_11D88][charTexIndex], &gfx); + msgCtx->textColorR = sp12E; + msgCtx->textColorG = sp12C; + msgCtx->textColorB = sp12A; + } else { + Message_DrawTextChar(play, &font->charBuf[font->unk_11D88][charTexIndex], &gfx); + } + charTexIndex += FONT_CHAR_TEX_SIZE; + switch (character) { + case 0x8144: + msgCtx->textPosX += (s16)(8.0f * msgCtx->textCharScale); + break; + + case 0x816A: + case 0x8176: + msgCtx->textPosX += (s16)(10.0f * msgCtx->textCharScale); + break; + + case 0x8141: + case 0x8142: + case 0x8168: + msgCtx->textPosX += (s16)(12.0f * msgCtx->textCharScale); + break; + + case 0x8194: + msgCtx->textPosX += (s16)(14.0f * msgCtx->textCharScale); + break; + + case 0x8145: + msgCtx->textPosX += (s16)(15.0f * msgCtx->textCharScale); + break; + + default: + if ((msgCtx->msgMode >= MSGMODE_SCENE_TITLE_CARD_FADE_IN_BACKGROUND) && + (msgCtx->msgMode <= MSGMODE_SCENE_TITLE_CARD_FADE_OUT_BACKGROUND)) { + msgCtx->textPosX += (s16)((16.0f * msgCtx->textCharScale) - 1.0f); + } else { + msgCtx->textPosX += (s16)(16.0f * msgCtx->textCharScale); + } + break; + } + break; + } + } + + if (msgCtx->textDelayTimer == 0) { + msgCtx->textDrawPos = i + 1; + msgCtx->textDelayTimer = 0; + if (msgCtx->msgMode == MSGMODE_9) { + msgCtx->msgMode = MSGMODE_TEXT_DISPLAYING; + } + } else { + msgCtx->textDelayTimer--; + } + *gfxP = gfx; +} + +s16 D_801CFF70[LANGUAGE_MAX] = { + 4, // LANGUAGE_JPN + 0x12, // LANGUAGE_ENG + 0x12, // LANGUAGE_GER + 0x12, // LANGUAGE_FRE + 0x12, // LANGUAGE_SPA +}; +s16 D_801CFF7C[LANGUAGE_MAX] = { + 0, // LANGUAGE_JPN + 0xE, // LANGUAGE_ENG + 0xE, // LANGUAGE_GER + 0xE, // LANGUAGE_FRE + 0xE, // LANGUAGE_SPA +}; +s16 D_801CFF88[LANGUAGE_MAX] = { + 0, // LANGUAGE_JPN + 0x16, // LANGUAGE_ENG + 0x16, // LANGUAGE_GER + 0x16, // LANGUAGE_FRE + 0x16, // LANGUAGE_SPA +}; + +s16 D_801CFF94[] = { + /* 0x00 */ MESSAGE_ITEM_NONE, + /* 0x01 */ ITEM_RUPEE_GREEN, + /* 0x02 */ ITEM_RUPEE_BLUE, + /* 0x03 */ ITEM_RUPEE_10, + /* 0x04 */ ITEM_RUPEE_RED, + /* 0x05 */ ITEM_RUPEE_PURPLE, + /* 0x06 */ ITEM_RUPEE_SILVER, + /* 0x07 */ ITEM_RUPEE_HUGE, + /* 0x08 */ ITEM_WALLET_ADULT, + /* 0x09 */ ITEM_WALLET_GIANT, + /* 0x0A */ ITEM_RECOVERY_HEART, + /* 0x0B */ ITEM_RECOVERY_HEART, + /* 0x0C */ ITEM_HEART_PIECE, + /* 0x0D */ ITEM_HEART_CONTAINER, + /* 0x0E */ ITEM_MAGIC_JAR_SMALL, + /* 0x0F */ ITEM_MAGIC_JAR_BIG, + /* 0x10 */ ITEM_RECOVERY_HEART, + /* 0x11 */ ITEM_STRAY_FAIRIES, + /* 0x12 */ ITEM_RECOVERY_HEART, + /* 0x13 */ ITEM_RECOVERY_HEART, + /* 0x14 */ ITEM_BOMB, + /* 0x15 */ ITEM_BOMB, + /* 0x16 */ ITEM_BOMB, + /* 0x17 */ ITEM_BOMB, + /* 0x18 */ ITEM_BOMB, + /* 0x19 */ ITEM_DEKU_STICK, + /* 0x1A */ ITEM_BOMBCHU, + /* 0x1B */ ITEM_BOMB_BAG_20, + /* 0x1C */ ITEM_BOMB_BAG_30, + /* 0x1D */ ITEM_BOMB_BAG_40, + /* 0x1E */ ITEM_BOW, + /* 0x1F */ ITEM_BOW, + /* 0x20 */ ITEM_BOW, + /* 0x21 */ ITEM_BOW, + /* 0x22 */ ITEM_QUIVER_30, + /* 0x23 */ ITEM_QUIVER_40, + /* 0x24 */ ITEM_QUIVER_50, + /* 0x25 */ ITEM_ARROW_FIRE, + /* 0x26 */ ITEM_ARROW_ICE, + /* 0x27 */ ITEM_ARROW_LIGHT, + /* 0x28 */ ITEM_DEKU_NUT, + /* 0x29 */ ITEM_DEKU_NUT, + /* 0x2A */ ITEM_DEKU_NUT, + /* 0x2B */ MESSAGE_ITEM_NONE, + /* 0x2C */ MESSAGE_ITEM_NONE, + /* 0x2D */ MESSAGE_ITEM_NONE, + /* 0x2E */ MESSAGE_ITEM_NONE, + /* 0x2F */ ITEM_DEKU_STICK_UPGRADE_20, + /* 0x30 */ MESSAGE_ITEM_NONE, + /* 0x31 */ MESSAGE_ITEM_NONE, + /* 0x32 */ ITEM_SHIELD_HERO, + /* 0x33 */ ITEM_SHIELD_MIRROR, + /* 0x34 */ ITEM_POWDER_KEG, + /* 0x35 */ ITEM_MAGIC_BEANS, + /* 0x36 */ ITEM_PICTOGRAPH_BOX, + /* 0x37 */ ITEM_SWORD_KOKIRI, + /* 0x38 */ ITEM_SWORD_RAZOR, + /* 0x39 */ ITEM_SWORD_GILDED, + /* 0x3A */ ITEM_SWORD_DEITY, + /* 0x3B */ ITEM_SWORD_GREAT_FAIRY, + /* 0x3C */ ITEM_KEY_SMALL, + /* 0x3D */ ITEM_KEY_BOSS, + /* 0x3E */ ITEM_DUNGEON_MAP, + /* 0x3F */ ITEM_COMPASS, + /* 0x40 */ ITEM_POWDER_KEG, + /* 0x41 */ ITEM_HOOKSHOT, + /* 0x42 */ ITEM_LENS_OF_TRUTH, + /* 0x43 */ ITEM_PICTOGRAPH_BOX, + /* 0x44 */ ITEM_FISHING_ROD, + /* 0x45 */ MESSAGE_ITEM_NONE, + /* 0x46 */ MESSAGE_ITEM_NONE, + /* 0x47 */ MESSAGE_ITEM_NONE, + /* 0x48 */ MESSAGE_ITEM_NONE, + /* 0x49 */ MESSAGE_ITEM_NONE, + /* 0x4A */ MESSAGE_ITEM_NONE, + /* 0x4B */ MESSAGE_ITEM_NONE, + /* 0x4C */ ITEM_OCARINA_OF_TIME, + /* 0x4D */ MESSAGE_ITEM_NONE, + /* 0x4E */ MESSAGE_ITEM_NONE, + /* 0x4F */ MESSAGE_ITEM_NONE, + /* 0x50 */ ITEM_BOMBERS_NOTEBOOK, + /* 0x51 */ MESSAGE_ITEM_NONE, + /* 0x52 */ ITEM_SKULL_TOKEN, + /* 0x53 */ MESSAGE_ITEM_NONE, + /* 0x54 */ MESSAGE_ITEM_NONE, + /* 0x55 */ ITEM_REMAINS_ODOLWA, + /* 0x56 */ ITEM_REMAINS_GOHT, + /* 0x57 */ ITEM_REMAINS_GYORG, + /* 0x58 */ ITEM_REMAINS_TWINMOLD, + /* 0x59 */ ITEM_POTION_RED, + /* 0x5A */ ITEM_BOTTLE, + /* 0x5B */ ITEM_POTION_RED, + /* 0x5C */ ITEM_POTION_GREEN, + /* 0x5D */ ITEM_POTION_BLUE, + /* 0x5E */ ITEM_FAIRY, + /* 0x5F */ ITEM_DEKU_PRINCESS, + /* 0x60 */ ITEM_MILK_BOTTLE, + /* 0x61 */ ITEM_MILK_HALF, + /* 0x62 */ ITEM_FISH, + /* 0x63 */ ITEM_BUG, + /* 0x64 */ ITEM_BLUE_FIRE, + /* 0x65 */ ITEM_POE, + /* 0x66 */ ITEM_BIG_POE, + /* 0x67 */ ITEM_SPRING_WATER, + /* 0x68 */ ITEM_HOT_SPRING_WATER, + /* 0x69 */ ITEM_ZORA_EGG, + /* 0x6A */ ITEM_GOLD_DUST, + /* 0x6B */ ITEM_MUSHROOM, + /* 0x6C */ MESSAGE_ITEM_NONE, + /* 0x6D */ MESSAGE_ITEM_NONE, + /* 0x6E */ ITEM_SEAHORSE, + /* 0x6F */ ITEM_CHATEAU, + /* 0x70 */ ITEM_HYLIAN_LOACH, + /* 0x71 */ MESSAGE_ITEM_NONE, + /* 0x72 */ MESSAGE_ITEM_NONE, + /* 0x73 */ MESSAGE_ITEM_NONE, + /* 0x74 */ MESSAGE_ITEM_NONE, + /* 0x75 */ MESSAGE_ITEM_NONE, + /* 0x76 */ MESSAGE_ITEM_NONE, + /* 0x77 */ MESSAGE_ITEM_NONE, + /* 0x78 */ ITEM_MASK_DEKU, + /* 0x79 */ ITEM_MASK_GORON, + /* 0x7A */ ITEM_MASK_ZORA, + /* 0x7B */ ITEM_MASK_FIERCE_DEITY, + /* 0x7C */ ITEM_MASK_TRUTH, + /* 0x7D */ ITEM_MASK_KAFEIS_MASK, + /* 0x7E */ ITEM_MASK_ALL_NIGHT, + /* 0x7F */ ITEM_MASK_BUNNY, + /* 0x80 */ ITEM_MASK_KEATON, + /* 0x81 */ ITEM_MASK_GARO, + /* 0x82 */ ITEM_MASK_ROMANI, + /* 0x83 */ ITEM_MASK_CIRCUS_LEADER, + /* 0x84 */ ITEM_MASK_POSTMAN, + /* 0x85 */ ITEM_MASK_COUPLE, + /* 0x86 */ ITEM_MASK_GREAT_FAIRY, + /* 0x87 */ ITEM_MASK_GIBDO, + /* 0x88 */ ITEM_MASK_DON_GERO, + /* 0x89 */ ITEM_MASK_KAMARO, + /* 0x8A */ ITEM_MASK_CAPTAIN, + /* 0x8B */ ITEM_MASK_STONE, + /* 0x8C */ ITEM_MASK_BREMEN, + /* 0x8D */ ITEM_MASK_BLAST, + /* 0x8E */ ITEM_MASK_SCENTS, + /* 0x8F */ ITEM_MASK_GIANT, + /* 0x90 */ MESSAGE_ITEM_NONE, + /* 0x91 */ ITEM_CHATEAU, + /* 0x92 */ ITEM_MILK_BOTTLE, + /* 0x93 */ ITEM_GOLD_DUST, + /* 0x94 */ ITEM_HYLIAN_LOACH, + /* 0x95 */ ITEM_SEAHORSE, + /* 0x96 */ ITEM_MOONS_TEAR, + /* 0x97 */ ITEM_DEED_LAND, + /* 0x98 */ ITEM_DEED_SWAMP, + /* 0x99 */ ITEM_DEED_MOUNTAIN, + /* 0x9A */ ITEM_DEED_OCEAN, + /* 0x9B */ MESSAGE_ITEM_NONE, + /* 0x9C */ MESSAGE_ITEM_NONE, + /* 0x9D */ MESSAGE_ITEM_NONE, + /* 0x9E */ MESSAGE_ITEM_NONE, + /* 0x9F */ MESSAGE_ITEM_NONE, + /* 0xA0 */ ITEM_ROOM_KEY, + /* 0xA1 */ ITEM_LETTER_MAMA, + /* 0xA2 */ MESSAGE_ITEM_NONE, + /* 0xA3 */ MESSAGE_ITEM_NONE, + /* 0xA4 */ MESSAGE_ITEM_NONE, + /* 0xA5 */ MESSAGE_ITEM_NONE, + /* 0xA6 */ MESSAGE_ITEM_NONE, + /* 0xA7 */ MESSAGE_ITEM_NONE, + /* 0xA8 */ MESSAGE_ITEM_NONE, + /* 0xA9 */ MESSAGE_ITEM_NONE, + /* 0xAA */ ITEM_LETTER_TO_KAFEI, + /* 0xAB */ ITEM_PENDANT_OF_MEMORIES, + /* 0xAC */ MESSAGE_ITEM_NONE, + /* 0xAD */ MESSAGE_ITEM_NONE, + /* 0xAE */ MESSAGE_ITEM_NONE, + /* 0xAF */ MESSAGE_ITEM_NONE, + /* 0xB0 */ MESSAGE_ITEM_NONE, + /* 0xB1 */ MESSAGE_ITEM_NONE, + /* 0xB2 */ MESSAGE_ITEM_NONE, + /* 0xB3 */ ITEM_TINGLE_MAP, + /* 0xB4 */ ITEM_TINGLE_MAP, + /* 0xB5 */ ITEM_TINGLE_MAP, + /* 0xB6 */ ITEM_TINGLE_MAP, + /* 0xB7 */ ITEM_TINGLE_MAP, + /* 0xB8 */ ITEM_TINGLE_MAP, + /* 0xB9 */ ITEM_TINGLE_MAP, + /* 0xBA */ MESSAGE_ITEM_NONE, + /* 0xBB */ MESSAGE_ITEM_NONE, + /* 0xBC */ MESSAGE_ITEM_NONE, + /* 0xBD */ MESSAGE_ITEM_NONE, + /* 0xBE */ MESSAGE_ITEM_NONE, + /* 0xBF */ MESSAGE_ITEM_NONE, + /* 0xC0 */ MESSAGE_ITEM_NONE, + /* 0xC1 */ MESSAGE_ITEM_NONE, + /* 0xC2 */ MESSAGE_ITEM_NONE, + /* 0xC3 */ MESSAGE_ITEM_NONE, + /* 0xC4 */ MESSAGE_ITEM_NONE, + /* 0xC5 */ MESSAGE_ITEM_NONE, + /* 0xC6 */ MESSAGE_ITEM_NONE, + /* 0xC7 */ MESSAGE_ITEM_NONE, + /* 0xC8 */ ITEM_SONG_SONATA, + /* 0xC9 */ ITEM_SONG_SONATA, + /* 0xCA */ ITEM_SONG_SONATA, + /* 0xCB */ ITEM_SONG_LULLABY, + /* 0xCC */ ITEM_SONG_NOVA, + /* 0xCD */ ITEM_SONG_ELEGY, + /* 0xCE */ ITEM_SONG_OATH, + /* 0xCF */ ITEM_SONG_SARIA, + /* 0xD0 */ ITEM_SONG_TIME, + /* 0xD1 */ ITEM_SONG_HEALING, + /* 0xD2 */ ITEM_SONG_EPONA, + /* 0xD3 */ ITEM_SONG_SOARING, + /* 0xD4 */ ITEM_SONG_STORMS, + /* 0xD5 */ ITEM_SONG_SUN, + /* 0xD6 */ ITEM_SONG_LULLABY, + /* 0xD7 */ ITEM_SONG_SONATA, + /* 0xD8 */ ITEM_SONG_SONATA, + /* 0xD9 */ ITEM_SONG_SONATA, + /* 0xDA */ ITEM_SONG_LULLABY, + /* 0xDB */ ITEM_SONG_NOVA, + /* 0xDC */ ITEM_B8, + /* 0xDD */ ITEM_B9, + /* 0xDE */ ITEM_BA, + /* 0xDF */ ITEM_BB, + /* 0xE0 */ ITEM_BC, + /* 0xE1 */ ITEM_BD, + /* 0xE2 */ ITEM_BE, + /* 0xE3 */ ITEM_BF, + /* 0xE4 */ ITEM_C0, + /* 0xE5 */ ITEM_C1, + /* 0xE6 */ ITEM_C2, + /* 0xE7 */ ITEM_C3, + /* 0xE8 */ ITEM_C4, + /* 0xE9 */ ITEM_C5, + /* 0xEA */ ITEM_C6, + /* 0xEB */ ITEM_C7, + /* 0xEC */ ITEM_C8, + /* 0xED */ ITEM_C9, + /* 0xEE */ ITEM_CA, + /* 0xEF */ ITEM_CB, + /* 0xF0 */ ITEM_CC, + /* 0xF1 */ MESSAGE_ITEM_NONE, + /* 0xF2 */ MESSAGE_ITEM_NONE, + /* 0xF3 */ MESSAGE_ITEM_NONE, + /* 0xF4 */ MESSAGE_ITEM_NONE, + /* 0xF5 */ MESSAGE_ITEM_NONE, + /* 0xF6 */ MESSAGE_ITEM_NONE, + /* 0xF7 */ MESSAGE_ITEM_NONE, + /* 0xF8 */ MESSAGE_ITEM_NONE, + /* 0xF9 */ MESSAGE_ITEM_NONE, +}; + +void Message_LoadItemIcon(PlayState* play, u16 itemId, s16 arg2) { + MessageContext* msgCtx = &play->msgCtx; + u16* new_var2 = &itemId; + + if (itemId == ITEM_RECOVERY_HEART) { + msgCtx->unk12010 = (msgCtx->unk11FF8 - D_801CFF88[gSaveContext.options.language]); + msgCtx->unk12012 = (arg2 + 0xA); + msgCtx->unk12014 = 0x10; + } else if ((itemId >= ITEM_RUPEE_GREEN) && (itemId <= ITEM_RUPEE_HUGE)) { + msgCtx->unk12010 = (msgCtx->unk11FF8 - D_801CFF88[gSaveContext.options.language]); + msgCtx->unk12012 = (arg2 + 0xA); + msgCtx->unk12014 = 0x10; + } else if (itemId == ITEM_STRAY_FAIRIES) { + msgCtx->unk12010 = (msgCtx->unk11FF8 - D_801CFF70[gSaveContext.options.language]); + msgCtx->unk12012 = (arg2 + 0xA); + msgCtx->unk12014 = 0x20; + } else if ((itemId >= ITEM_SONG_SONATA) && (itemId <= ITEM_SONG_SUN)) { + msgCtx->unk12010 = (msgCtx->unk11FF8 - D_801CFF88[gSaveContext.options.language]); + msgCtx->unk12012 = (arg2 + 0xA); + msgCtx->unk12014 = 0x10; + CmpDma_LoadFile(SEGMENT_ROM_START(icon_item_static_yar), ITEM_SONG_SONATA, msgCtx->textboxSegment + 0x1000, + 0x180); + } else if (itemId == ITEM_BOMBERS_NOTEBOOK) { + msgCtx->unk12010 = (msgCtx->unk11FF8 - D_801CFF70[gSaveContext.options.language]); + msgCtx->unk12012 = (arg2 + 6); + msgCtx->unk12014 = 0x20; + CmpDma_LoadFile(SEGMENT_ROM_START(icon_item_static_yar), ITEM_SONG_SONATA, msgCtx->textboxSegment + 0x1000, + 0x1000); + } else if (itemId <= ITEM_REMAINS_TWINMOLD) { + msgCtx->unk12010 = (msgCtx->unk11FF8 - D_801CFF70[gSaveContext.options.language]); + msgCtx->unk12012 = (arg2 + 6); + msgCtx->unk12014 = 0x20; + CmpDma_LoadFile(SEGMENT_ROM_START(icon_item_static_yar), itemId, msgCtx->textboxSegment + 0x1000, 0x1000); + } else if (itemId == ITEM_CC) { + msgCtx->unk12010 = (msgCtx->unk11FF8 - D_801CFF70[gSaveContext.options.language]); + msgCtx->unk12012 = (arg2 + 8); + msgCtx->unk12014 = 0x20; + CmpDma_LoadFile(SEGMENT_ROM_START(schedule_dma_static_yar), ITEM_POTION_BLUE, msgCtx->textboxSegment + 0x1000, + 0x400); + } else if (itemId >= ITEM_B8) { + msgCtx->unk12010 = (msgCtx->unk11FF8 - D_801CFF70[gSaveContext.options.language]); + msgCtx->unk12012 = (arg2 + 8); + msgCtx->unk12014 = 0x20; + CmpDma_LoadFile(SEGMENT_ROM_START(schedule_dma_static_yar), (itemId - ITEM_B8), msgCtx->textboxSegment + 0x1000, + 0x800); + } else if (itemId >= ITEM_SKULL_TOKEN) { + msgCtx->unk12010 = (msgCtx->unk11FF8 - D_801CFF7C[gSaveContext.options.language]); + msgCtx->unk12012 = (arg2 + 0xA); + msgCtx->unk12014 = 0x18; + CmpDma_LoadFile(SEGMENT_ROM_START(icon_item_24_static_yar), (itemId - ITEM_SKULL_TOKEN), + msgCtx->textboxSegment + 0x1000, 0x900); + } + + if (play->pauseCtx.bombersNotebookOpen) { + msgCtx->unk12010 = ((msgCtx->unk12010 * 1.4f) + 2.0f); + msgCtx->unk12014 = (msgCtx->unk12014 * 1.4f); + } + + msgCtx->choiceNum = 1; +} void Message_LoadChar(PlayState* play, u16 codePointIndex, s32* offset, f32* arg3, s16 decodedBufPos) { MessageContext* msgCtx = &play->msgCtx; @@ -255,11 +1901,11 @@ void func_8014CCB4(PlayState* play, s16* decodedBufPos, s32* offset, f32* arg3) Font_LoadChar(play, 0x838B, k); // 0x838B = ル in JISX0213 k += FONT_CHAR_TEX_SIZE; msgCtx->decodedBuffer.wchar[t] = 0x838B; - t += 1; + t++; Font_LoadChar(play, 0x8373, k); // 0x8373 = ピ in JISX0213 k += FONT_CHAR_TEX_SIZE; msgCtx->decodedBuffer.wchar[t] = 0x8373; - t += 1; + t++; Font_LoadChar(play, 0x815C, k); // 0x815C = ― in JISX0213 k += FONT_CHAR_TEX_SIZE; msgCtx->decodedBuffer.wchar[t] = 0x815C; @@ -270,63 +1916,1411 @@ void func_8014CCB4(PlayState* play, s16* decodedBufPos, s32* offset, f32* arg3) *arg3 = f; } -#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/func_8014CDF0.s") +/* + * offsetting to actual codepoints is done outside this function + * every digit will be added 0x824F to get an actual S-JIS + * printable character. + */ +void Message_GetTimerDigits(OSTime time, s16* digits) { + OSTime t = time; -#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/Message_SetupLoadItemIcon.s") + // 6 minutes + digits[0] = t / SECONDS_TO_TIMER(360); + t -= digits[0] * SECONDS_TO_TIMER(360); -#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/func_8014D304.s") + // minutes + digits[1] = t / SECONDS_TO_TIMER(60); + t -= digits[1] * SECONDS_TO_TIMER(60); -extern u16 D_801D0188[OWL_WARP_MAX][9]; -extern s16 D_801D0250[OWL_WARP_MAX]; + digits[2] = 0x135B; // 0x135B + 0x824F = 分 (minutes) in S-JIS -void func_8014D62C(PlayState* play, s32* arg1, f32* arg2, s16* arg3) { + // 10 seconds + digits[3] = t / SECONDS_TO_TIMER(10); + t -= digits[3] * SECONDS_TO_TIMER(10); + + // seconds + digits[4] = t / SECONDS_TO_TIMER(1); + t -= digits[4] * SECONDS_TO_TIMER(1); + + digits[5] = 0x1313; // 0x1313 + 0x824F = 秒 (seconds) in S-JIS + + // 100 milliseconds + digits[6] = t / SECONDS_TO_TIMER_PRECISE(0, 10); + t -= digits[6] * SECONDS_TO_TIMER_PRECISE(0, 10); + + // 10 milliseconds + digits[7] = t; +} + +void Message_SetupLoadItemIcon(PlayState* play) { + Font* font; + MessageContext* msgCtx = &play->msgCtx; + + font = &msgCtx->font; + if (msgCtx->msgBufPos == 0) { + if (font->msgBuf.schar[msgCtx->msgBufPos + 2] != 0xFE) { + msgCtx->unk11F18 = 0; + if ((msgCtx->currentTextId == 0x176F) || (msgCtx->currentTextId == 0x1770) || + (msgCtx->currentTextId == 0x1771)) { + msgCtx->itemId = ITEM_OCARINA_OF_TIME; + msgCtx->msgBufPos += 2; + } else { + msgCtx->msgBufPos += 2; + if ((font->msgBuf.schar[msgCtx->msgBufPos] < 0xC8) || (font->msgBuf.schar[msgCtx->msgBufPos] >= 0xD8)) { + msgCtx->itemId = D_801CFF94[(u8)font->msgBuf.schar[msgCtx->msgBufPos]]; + } else { + msgCtx->itemId = 0xFE; + } + } + } else { + msgCtx->msgBufPos += 2; + msgCtx->itemId = font->msgBuf.schar[msgCtx->msgBufPos]; + } + msgCtx->nextTextId = font->msgBuf.schar[++msgCtx->msgBufPos] << 8; + msgCtx->nextTextId |= font->msgBuf.schar[++msgCtx->msgBufPos]; + + msgCtx->unk1206C = font->msgBuf.schar[++msgCtx->msgBufPos] << 8; + msgCtx->unk1206C |= font->msgBuf.schar[++msgCtx->msgBufPos]; + + msgCtx->unk12070 = font->msgBuf.schar[++msgCtx->msgBufPos] << 8; + msgCtx->unk12070 |= font->msgBuf.schar[++msgCtx->msgBufPos]; + + msgCtx->unk12074 = font->msgBuf.schar[++msgCtx->msgBufPos] << 8; + msgCtx->unk12074 |= font->msgBuf.schar[++msgCtx->msgBufPos]; + + msgCtx->msgBufPos++; + if (msgCtx->itemId != 0xFE) { + Message_LoadItemIcon(play, msgCtx->itemId, msgCtx->textboxY + 10); + } + } +} + +void Message_LoadTime(PlayState* play, u16 curChar, s32* offset, f32* arg3, s16* decodedBufPos) { + MessageContext* msgCtx = &play->msgCtx; + s16 i; + s16 p = *decodedBufPos; + s32 o = *offset; + f32 f = *arg3; + u32 dayTime; + s16 digits[4]; + f32 timeInMinutes; + + if (curChar == 0x20F) { + dayTime = TIME_UNTIL_MOON_CRASH; + } else { + dayTime = TIME_UNTIL_NEW_DAY; + } + timeInMinutes = TIME_TO_MINUTES_F(dayTime); + + digits[0] = 0; + digits[1] = (timeInMinutes / 60.0f); + while (digits[1] >= 10) { + digits[0]++; + digits[1] -= 10; + } + + digits[2] = 0; + digits[3] = (s32)timeInMinutes % 60; + while (digits[3] >= 10) { + digits[2]++; + digits[3] -= 10; + } + + for (i = 0; i < 4; i++) { + Font_LoadChar(play, digits[i] + 0x824F, o); // 0x824F = '0' in S-JIS + o += FONT_CHAR_TEX_SIZE; + msgCtx->decodedBuffer.wchar[p] = digits[i] + 0x824F; + p++; + if (i == 1) { + // Hours (時間) + Font_LoadChar(play, 0x8E9E, o); + o += FONT_CHAR_TEX_SIZE; + msgCtx->decodedBuffer.wchar[p] = 0x8E9E; + p++; + Font_LoadChar(play, 0x8AD4, o); + o += FONT_CHAR_TEX_SIZE; + msgCtx->decodedBuffer.wchar[p] = 0x8E9E; + p++; + } else if (i == 3) { + // Minutes (分) + Font_LoadChar(play, 0x95AA, o); + o += FONT_CHAR_TEX_SIZE; + msgCtx->decodedBuffer.wchar[p] = 0x95AA; + } + } + + f += 7.0f * (16.0f * msgCtx->textCharScale); + *decodedBufPos = p; + *offset = o; + *arg3 = f; +} + +#define GREAT_BAY_COAST_STR \ + { 0x834F, 0x838C, 0x815B, 0x8367, 0x8378, 0x8343, 0x82CC, 0x8A43, 0x8ADD } +#define ZORA_CAPE_STR \ + { 0x835D, 0x815B, 0x8389, 0x82CC, 0x82DD, 0x82B3, 0x82AB } +#define SNOWHEAD_STR \ + { 0x8358, 0x836D, 0x815B, 0x8377, 0x8362, 0x8368 } +#define MOUNTAIN_VILLAGE_STR \ + { 0x8E52, 0x97A2 } +#define CLOCK_TOWN_STR \ + { 0x834E, 0x838D, 0x8362, 0x834E, 0x835E, 0x8345, 0x8393 } +#define MILK_ROAD_STR \ + { 0x837E, 0x838B, 0x834E, 0x838D, 0x815B, 0x8368 } +#define WOODFALL_STR \ + { 0x8345, 0x8362, 0x8368, 0x8374, 0x8348, 0x815B, 0x838B } +#define SOUTHERN_SWAMP_STR \ + { 0x8FC0, 0x926E } +#define IKANA_CANYON_STR \ + { 0x8343, 0x834A, 0x815B, 0x8369, 0x8C6B, 0x924A } +#define STONE_TOWER_STR \ + { 0x838D, 0x8362, 0x834E, 0x8372, 0x838B } +#define ENTRANCE_STR \ + { 0x93FC, 0x82E8, 0x8CFB } + +// Shift JIS +u16 sOwlWarpTextJPN[OWL_WARP_MAX][9] = { + GREAT_BAY_COAST_STR, // OWL_WARP_GREAT_BAY_COAST + ZORA_CAPE_STR, // OWL_WARP_ZORA_CAPE + SNOWHEAD_STR, // OWL_WARP_SNOWHEAD + MOUNTAIN_VILLAGE_STR, // OWL_WARP_MOUNTAIN_VILLAGE + CLOCK_TOWN_STR, // OWL_WARP_CLOCK_TOWN + MILK_ROAD_STR, // OWL_WARP_MILK_ROAD + WOODFALL_STR, // OWL_WARP_WOODFALL + SOUTHERN_SWAMP_STR, // OWL_WARP_SOUTHERN_SWAMP + IKANA_CANYON_STR, // OWL_WARP_IKANA_CANYON + STONE_TOWER_STR, // OWL_WARP_STONE_TOWER + ENTRANCE_STR, // OWL_WARP_ENTRANCE +}; + +//! TODO: use sizeof when we have strings +s16 sOwlWarpTextLengthJPN[OWL_WARP_MAX] = { + 9, // OWL_WARP_GREAT_BAY_COAST + 7, // OWL_WARP_ZORA_CAPE + 6, // OWL_WARP_SNOWHEAD + 2, // OWL_WARP_MOUNTAIN_VILLAGE + 7, // OWL_WARP_CLOCK_TOWN + 6, // OWL_WARP_MILK_ROAD + 7, // OWL_WARP_WOODFALL + 2, // OWL_WARP_SOUTHERN_SWAMP + 6, // OWL_WARP_IKANA_CANYON + 5, // OWL_WARP_STONE_TOWER + 3, // OWL_WARP_ENTRANCE +}; + +void Message_LoadOwlWarpText(PlayState* play, s32* offset, f32* arg2, s16* decodedBufPos) { MessageContext* msgCtx = &play->msgCtx; PauseContext* pauseCtx = &play->pauseCtx; s16 stringLimit; - s16 temp_s1 = *arg3; - s32 temp_s2 = *arg1; + s16 curDecodedBufPos = *decodedBufPos; + s32 temp_s2 = *offset; f32 sp3C = *arg2; s16 owlWarpId; - s16 phi_s0; + s16 i; if (func_8010A0A4(play) || (play->sceneId == SCENE_SECOM)) { owlWarpId = OWL_WARP_ENTRANCE; } else { owlWarpId = pauseCtx->cursorPoint[PAUSE_WORLD_MAP]; } - stringLimit = D_801D0250[owlWarpId]; + stringLimit = sOwlWarpTextLengthJPN[owlWarpId]; - for (phi_s0 = 0; phi_s0 < stringLimit; phi_s0++, temp_s1++, temp_s2 += 0x80) { - msgCtx->decodedBuffer.wchar[temp_s1] = D_801D0188[owlWarpId][phi_s0]; - Font_LoadChar(play, D_801D0188[owlWarpId][phi_s0], temp_s2); + for (i = 0; i < stringLimit; i++, curDecodedBufPos++, temp_s2 += FONT_CHAR_TEX_SIZE) { + msgCtx->decodedBuffer.wchar[curDecodedBufPos] = sOwlWarpTextJPN[owlWarpId][i]; + Font_LoadChar(play, sOwlWarpTextJPN[owlWarpId][i], temp_s2); } - temp_s1--; + curDecodedBufPos--; sp3C += (stringLimit - 1) * (16.0f * msgCtx->textCharScale); - *arg3 = temp_s1; - *arg1 = temp_s2; + *decodedBufPos = curDecodedBufPos; + *offset = temp_s2; *arg2 = sp3C; } -#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/func_8014D7B4.s") +// Counterpart to NES D_801D08D8 +u16 D_801D0268[][3] = { + { 0x82CD, 0x82E2, 0x82A2 }, + { 0x82D3, 0x82C2, 0x82A4 }, + { 0x82A8, 0x82BB, 0x82A2 }, +}; -#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/func_80150A84.s") +// Counterpart to NES D_801D08E4 +u16 D_801D027C[] = { 0x2001, 0x2003, 0x2004, 0x2002 }; -#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/func_80150D08.s") +// Counterpart to NES sMaskCodeTextENG +u16 D_801D0284[] = { 0x90D4, 0x90C2, 0x89A9, 0x97CE }; -#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/func_801514B0.s") +#ifdef NON_MATCHING +// https://decomp.me/scratch/ZTbP4 +void Message_Decode(PlayState* play) { + MessageContext* msgCtx = &play->msgCtx; + Font* font = &msgCtx->font; // spF0 + Player* player; // spEC + s16 decodedBufPos; // spEA + u32 timeToMoonCrash; + s16 temp2; + s16 spE0; + s32 pad4; + s16 digits[4]; // spD4/D6/D8/DA + s16 spD2; + f32 timeInSeconds; + s32 charTexIdx; // spC8 + s16 var_v0; + s16 loadChar; + f32 spC0; + f32 var_fs0; + s16 index; + s16 value; + s16 playerNameLen; + s16 i; // s1 + s16 spAC[4]; + u8 var_s3_8; + u16 curChar; + u32 temp; + u8* ptr2; + + player = GET_PLAYER(play); + msgCtx->textDelayTimer = 0; + msgCtx->textDelay = msgCtx->textDelayTimer; + msgCtx->textFade = 0; + spC0 = 0.0f; + font->unk_11D88 = (font->unk_11D88 ^ 1) & 1; + + if ((gSaveContext.options.language == LANGUAGE_JPN) && !msgCtx->textIsCredits) { + spD2 = 0; + spE0 = 0; + decodedBufPos = 0; + charTexIdx = 0; + Message_SetupLoadItemIcon(play); + + while (true) { + curChar = msgCtx->decodedBuffer.wchar[decodedBufPos] = font->msgBuf.wchar[msgCtx->msgBufPos]; + + if ((curChar == 9) || (curChar == 0xB) || (curChar == 0x110) || (curChar == 0x111) || (curChar == 0x112) || + (curChar == 0x103) || (curChar == 0x230) || (curChar == 0x500) || (curChar == 0x240) || + (curChar == 0x104)) { + + msgCtx->msgMode = MSGMODE_TEXT_DISPLAYING; + msgCtx->textDrawPos = 1; + msgCtx->unk11FFA = msgCtx->textboxY + 6; + msgCtx->unk11F1A[spD2] = 0; + if (msgCtx->unk11F18 == 0) { + msgCtx->unk11F1A[spD2] = (s16)((msgCtx->textCharScale * 16.0f * 16.0f) - spC0) / 2; + } + spC0 = 0.0f; + if (curChar == 0xB) { + if ((msgCtx->textBoxType != TEXTBOX_TYPE_3) && (msgCtx->textBoxType != TEXTBOX_TYPE_4)) { + if (spE0 < 2) { + msgCtx->unk11FFA = msgCtx->textboxY + 0x16; + } else if (spE0 == 2) { + msgCtx->unk11FFA = msgCtx->textboxY + 0xE; + } + } + } else { + if ((msgCtx->textBoxType != TEXTBOX_TYPE_3) && (msgCtx->textBoxType != TEXTBOX_TYPE_4)) { + if (spE0 == 0) { + msgCtx->unk11FFA = msgCtx->textboxY + 0x16; + } else if (spE0 == 1) { + msgCtx->unk11FFA = msgCtx->textboxY + 0xE; + } + } + } + + { + s32 pad; + + if ((curChar == 0x110) || (curChar == 0x111) || (curChar == 0x112)) { + msgCtx->decodedBuffer.wchar[++decodedBufPos] = font->msgBuf.wchar[msgCtx->msgBufPos + 1]; + msgCtx->msgBufPos += 2; + } + } + + msgCtx->decodedTextLen = decodedBufPos; + if (msgCtx->textboxSkipped || (msgCtx->textBoxType == TEXTBOX_TYPE_1) || + (msgCtx->textBoxType == TEXTBOX_TYPE_3) || (msgCtx->textBoxType == TEXTBOX_TYPE_6) || + (msgCtx->textBoxType == TEXTBOX_TYPE_8) || (msgCtx->textBoxType == TEXTBOX_TYPE_9) || + (msgCtx->textBoxType == TEXTBOX_TYPE_B) || (msgCtx->unk11F0C == 3)) { + msgCtx->textDrawPos = msgCtx->decodedTextLen; + } + msgCtx->unk120C8 = msgCtx->unk120CE; + msgCtx->unk120CA = msgCtx->unk120D0; + msgCtx->unk120CC = msgCtx->unk120D2; + break; + } + + if (curChar == 0x100) { + for (playerNameLen = ARRAY_COUNT(gSaveContext.save.saveInfo.playerData.playerName); playerNameLen > 0; + playerNameLen--) { + if (gSaveContext.save.saveInfo.playerData.playerName[playerNameLen - 1] != 0x3E) { + break; + } + } + + for (i = 0; i < playerNameLen; i++) { + ptr2 = &font->fontBuf[((void)0, gSaveContext.save.saveInfo.playerData.playerName[i]) * + FONT_CHAR_TEX_SIZE]; + msgCtx->decodedBuffer.wchar[decodedBufPos + i] = 0x100; + + for (var_v0 = 0; var_v0 < FONT_CHAR_TEX_SIZE; var_v0 += 4) { + font->charBuf[font->unk_11D88][charTexIdx + var_v0 + 0] = + ptr2[var_v0 + 0] & 0xFF; //! FAKE: Fixes later regalloc + font->charBuf[font->unk_11D88][charTexIdx + var_v0 + 1] = ptr2[var_v0 + 1]; + font->charBuf[font->unk_11D88][charTexIdx + var_v0 + 2] = ptr2[var_v0 + 2]; + font->charBuf[font->unk_11D88][charTexIdx + var_v0 + 3] = ptr2[var_v0 + 3]; + } + charTexIdx += FONT_CHAR_TEX_SIZE; + } + decodedBufPos += playerNameLen - 1; + spC0 += playerNameLen * (16.0f * msgCtx->textCharScale); + } else if (curChar == 0x201) { + DmaMgr_SendRequest0(msgCtx->textboxSegment + 0x1000, SEGMENT_ROM_START(message_texture_static), 0x900); + DmaMgr_SendRequest0(msgCtx->textboxSegment + 0x1900, + (uintptr_t)SEGMENT_ROM_START(message_texture_static) + 0x900, 0x900); + spE0 = 2; + spD2 = 2; + msgCtx->unk12012 = msgCtx->textboxY + 8; + msgCtx->unk11F18 = 1; + msgCtx->unk12010 = XREG(47); + } else if (curChar == 0x202) { + msgCtx->unk11F18 = 1; + msgCtx->choiceNum = 2; + } else if (curChar == 0x203) { + msgCtx->unk11F18 = 1; + msgCtx->choiceNum = 3; + msgCtx->unk11FF8 = msgCtx->unk11FF8 + 0x16; + } else if (curChar == 0x204) { + Message_GetTimerDigits(((void)0, gSaveContext.timerCurTimes[curChar - 0x204]), spAC); + + loadChar = false; + for (i = 0; i < 5; i++) { + if ((i == 1) || (spAC[i + 3] != 0)) { + loadChar = true; + } + if (loadChar) { + Message_LoadChar(play, spAC[i + 3] + 0x824F, &charTexIdx, &spC0, decodedBufPos); + decodedBufPos++; + } + } + decodedBufPos--; + } else if ((curChar == 0x205) || (curChar == 0x206) || (curChar == 0x207) || (curChar == 0x208) || + (curChar == 0x209)) { + Message_GetTimerDigits(((void)0, gSaveContext.timerCurTimes[curChar - 0x204]), spAC); + + loadChar = false; + for (i = 0; i < 8; i++) { + if ((i == 4) || ((i != 2) && (i != 5) && (spAC[i] != '\0'))) { + loadChar = true; + } + if (loadChar) { + Message_LoadChar(play, spAC[i] + 0x824F, &charTexIdx, &spC0, decodedBufPos); + decodedBufPos++; + } + } + decodedBufPos--; + } else if (curChar == 0x20A) { + digits[0] = 0; + timeInSeconds = TIME_TO_MINUTES_F(gSaveContext.save.time); + digits[1] = timeInSeconds / 60.0f; + while (digits[1] >= 10) { + digits[0]++; + digits[1] -= 10; + } + + digits[2] = 0; + digits[3] = (s32)timeInSeconds % 60; + while (digits[3] >= 10) { + digits[2]++; + digits[3] -= 10; + } + + for (i = 0; i < 4; i++) { + Font_LoadChar(play, digits[i] + 0x824F, charTexIdx); + charTexIdx += FONT_CHAR_TEX_SIZE; + msgCtx->decodedBuffer.wchar[decodedBufPos] = digits[i] + 0x824F; + decodedBufPos++; + if (i == 1) { + Font_LoadChar(play, 0x8E9E, charTexIdx); + charTexIdx += FONT_CHAR_TEX_SIZE; + msgCtx->decodedBuffer.wchar[decodedBufPos] = 0x8E9E; + decodedBufPos++; + } else if (i == 3) { + Font_LoadChar(play, 0x95AA, charTexIdx); + charTexIdx += FONT_CHAR_TEX_SIZE; + msgCtx->decodedBuffer.wchar[decodedBufPos] = 0x95AA; + } + } + spC0 += 6 * (16.0f * msgCtx->textCharScale); + } else if (curChar == 0x20B) { + digits[0] = digits[1] = digits[2] = 0; + digits[3] = Flags_GetAllTreasure(play); + + while (digits[3] >= 1000) { + digits[0]++; + digits[3] -= 1000; + } + while (digits[3] >= 100) { + digits[1]++; + digits[3] -= 100; + } + while (digits[3] >= 10) { + digits[2]++; + digits[3] -= 10; + } + + loadChar = false; + for (i = 0; i < 4; i++) { + if ((i == 3) || (digits[i] != 0)) { + loadChar = true; + } + if (loadChar) { + Font_LoadChar(play, digits[i] + 0x824F, charTexIdx); + charTexIdx += FONT_CHAR_TEX_SIZE; + msgCtx->decodedBuffer.wchar[decodedBufPos] = digits[i] + 0x824F; + decodedBufPos++; + spC0 += 16.0f * msgCtx->textCharScale; + } + } + Message_LoadChar(play, 0x9543, &charTexIdx, &spC0, decodedBufPos); + } else if (curChar == 0x20C) { + decodedBufPos++; + msgCtx->unk120BE = spD2; + msgCtx->unk120C0 = decodedBufPos; + msgCtx->unk120C2 = 2; + msgCtx->bankRupeesSelected = 0; + msgCtx->unk120C4 = charTexIdx; + digits[0] = digits[1] = digits[2] = 0; + + for (i = 0; i < 3; i++) { + Message_LoadChar(play, digits[i] + 0x824F, &charTexIdx, &spC0, decodedBufPos); + decodedBufPos++; + } + func_8014CCB4(play, &decodedBufPos, &charTexIdx, &spC0); + } else if (curChar == 0x20D) { + digits[0] = digits[1] = 0; + digits[2] = msgCtx->bankRupeesSelected; + + while (digits[2] >= 100) { + digits[0]++; + digits[2] -= 100; + } + + while (digits[2] >= 10) { + digits[1]++; + digits[2] -= 10; + } + + loadChar = false; + for (i = 0; i < 3; i++) { + if ((i == 2) || (digits[i] != 0)) { + loadChar = true; + } + if (loadChar) { + Message_LoadChar(play, digits[i] + 0x824F, &charTexIdx, &spC0, decodedBufPos); + decodedBufPos++; + } + } + func_8014CCB4(play, &decodedBufPos, &charTexIdx, &spC0); + } else if (curChar == 0x20E) { + digits[0] = digits[1] = digits[2] = 0; + digits[3] = msgCtx->bankRupees; + + while (digits[3] >= 1000) { + digits[0]++; + digits[3] -= 1000; + } + while (digits[3] >= 100) { + digits[1]++; + digits[3] -= 100; + } + while (digits[3] >= 10) { + digits[2]++; + digits[3] -= 10; + } + + loadChar = false; + for (i = 0; i < 4; i++) { + if ((i == 3) || (digits[i] != 0)) { + loadChar = true; + } + if (loadChar) { + Message_LoadChar(play, digits[i] + 0x824F, &charTexIdx, &spC0, decodedBufPos); + decodedBufPos++; + } + } + func_8014CCB4(play, &decodedBufPos, &charTexIdx, &spC0); + } else if (curChar == 0x20F) { + Message_LoadTime(play, curChar, &charTexIdx, &spC0, &decodedBufPos); + } else if (curChar == 0x21C) { + digits[0] = digits[1] = 0; + digits[2] = gSaveContext.save.saveInfo.inventory.strayFairies[(void)0, gSaveContext.dungeonIndex]; + + while (digits[2] >= 100) { + digits[0]++; + digits[2] -= 100; + } + while (digits[2] >= 10) { + digits[1]++; + digits[2] -= 10; + } + + loadChar = false; + for (i = 0; i < 3; i++) { + if ((i == 2) || (digits[i] != 0)) { + loadChar = true; + } + if (loadChar) { + Message_LoadChar(play, digits[i] + 0x824F, &charTexIdx, &spC0, decodedBufPos); + decodedBufPos++; + } + } + Message_LoadChar(play, 0x906C, &charTexIdx, &spC0, decodedBufPos); + decodedBufPos++; + Message_LoadChar(play, 0x96DA, &charTexIdx, &spC0, decodedBufPos); + } else if (curChar == 0x21D) { + digits[0] = digits[1] = 0; + digits[2] = Inventory_GetSkullTokenCount(play->sceneId); + + while (digits[2] >= 100) { + digits[0]++; + digits[2] -= 100; + } + while (digits[2] >= 10) { + digits[1]++; + digits[2] -= 10; + } + + loadChar = false; + for (i = 0; i < 3; i++) { + if ((i == 2) || (digits[i] != 0)) { + loadChar = true; + } + if (loadChar) { + Message_LoadChar(play, digits[i] + 0x824F, &charTexIdx, &spC0, decodedBufPos); + decodedBufPos++; + } + } + Message_LoadChar(play, 0x9543, &charTexIdx, &spC0, decodedBufPos); + } else if (curChar == 0x21E) { + digits[0] = 0; + digits[1] = gSaveContext.minigameScore; + + while (digits[1] >= 10) { + digits[0]++; + digits[1] -= 10; + } + + for (i = 0; i < 2; i++) { + if ((i == 1) || (digits[i] != 0)) { + Message_LoadChar(play, digits[i] + 0x824F, &charTexIdx, &spC0, decodedBufPos); + decodedBufPos++; + } + } + decodedBufPos--; + } else if (curChar == 0x21F) { + digits[0] = digits[1] = digits[2] = 0; + digits[3] = gSaveContext.minigameScore; + + while (digits[3] >= 1000) { + digits[0]++; + digits[3] -= 1000; + } + while (digits[3] >= 100) { + digits[1]++; + digits[3] -= 100; + } + while (digits[3] >= 10) { + digits[2]++; + digits[3] -= 10; + } + + loadChar = false; + for (i = 0; i < 4; i++) { + if ((i == 3) || (digits[i] != 0)) { + loadChar = true; + } + if (loadChar) { + Message_LoadChar(play, digits[i] + 0x824F, &charTexIdx, &spC0, decodedBufPos); + decodedBufPos++; + } + } + decodedBufPos--; + } else if (curChar == 0x220) { + decodedBufPos++; + msgCtx->unk120BE = spD2; + msgCtx->unk120C0 = decodedBufPos; + msgCtx->unk120C2 = 0; + msgCtx->bankRupeesSelected = 0; + msgCtx->unk120C4 = charTexIdx; + digits[0] = digits[1] = digits[2] = 0; + for (i = 0; i < 2; i++) { + Message_LoadChar(play, digits[i] + 0x824F, &charTexIdx, &spC0, decodedBufPos); + decodedBufPos++; + } + func_8014CCB4(play, &decodedBufPos, &charTexIdx, &spC0); + } else if (curChar == 0x221) { + decodedBufPos++; + msgCtx->unk120BE = spD2; + msgCtx->unk120C0 = decodedBufPos; + msgCtx->unk120C2 = 0; + msgCtx->bankRupeesSelected = 0; + msgCtx->unk120C4 = charTexIdx; + + for (i = 0; i < 5; i++) { + msgCtx->unk12054[i] = 1; + Message_LoadChar(play, 0x8250, &charTexIdx, &spC0, decodedBufPos); + decodedBufPos++; + } + decodedBufPos--; + } else if (curChar == 0x223) { + if (gSaveContext.save.timeSpeedOffset == 0x12) { + var_s3_8 = 0; + } else if (gSaveContext.save.timeSpeedOffset == 0) { + var_s3_8 = 1; + } else { + var_s3_8 = 2; + } + + for (i = 0; i < 3; i++) { + msgCtx->decodedBuffer.wchar[decodedBufPos] = D_801D0268[var_s3_8][i]; + Font_LoadChar(play, D_801D0268[var_s3_8][i], charTexIdx); + decodedBufPos++; + charTexIdx += FONT_CHAR_TEX_SIZE; + } + decodedBufPos--; + spC0 += 3.0f * (16.0f * msgCtx->textCharScale); + msgCtx->choiceIndex = var_s3_8; + } else if (curChar == 0x224) { + Message_LoadOwlWarpText(play, &charTexIdx, &spC0, &decodedBufPos); + } else if (curChar == 0x225) { + decodedBufPos++; + msgCtx->unk120BE = spD2; + msgCtx->unk120C0 = decodedBufPos; + msgCtx->unk120C2 = 0; + msgCtx->bankRupeesSelected = 0; + msgCtx->unk120C4 = charTexIdx; + + for (i = 0; i < 3; i++) { + msgCtx->unk12054[i] = 1; + Font_LoadChar(play, 0x8250, charTexIdx); + charTexIdx += FONT_CHAR_TEX_SIZE; + msgCtx->decodedBuffer.wchar[decodedBufPos] = 0x8250; + spC0 += 16.0f * msgCtx->textCharScale; + decodedBufPos++; + } + decodedBufPos--; + } else if (curChar == 0x226) { + for (i = 0; i < 6; i++) { + msgCtx->decodedBuffer.wchar[decodedBufPos] = + D_801D027C[((void)0, gSaveContext.save.saveInfo.spiderHouseMaskOrder[i])]; + decodedBufPos++; + Message_LoadChar(play, i + 0x8250, &charTexIdx, &spC0, decodedBufPos); + decodedBufPos++; + } + msgCtx->decodedBuffer.wchar[decodedBufPos] = 0x2000; + } else if ((curChar >= 0x227) && (curChar < 0x22B)) { + digits[0] = digits[1] = 0; + digits[2] = 15 - gSaveContext.save.saveInfo.inventory.strayFairies[curChar - 0x227]; + + while (digits[2] >= 100) { + digits[0]++; + digits[2] -= 100; + } + while (digits[2] >= 10) { + digits[1]++; + digits[2] -= 10; + } + + loadChar = false; + for (i = 0; i < 3; i++) { + if ((i == 2) || (digits[i] != 0)) { + loadChar = true; + } + if (loadChar) { + Font_LoadChar(play, digits[i] + 0x824F, charTexIdx); + charTexIdx += FONT_CHAR_TEX_SIZE; + msgCtx->decodedBuffer.wchar[decodedBufPos] = digits[i] + 0x824F; + decodedBufPos++; + spC0 += 16.0f * msgCtx->textCharScale; + } + } + Message_LoadChar(play, 0x906C, &charTexIdx, &spC0, decodedBufPos); + } else if (curChar == 0x22B) { + digits[0] = digits[1] = digits[2] = 0; + digits[3] = gSaveContext.minigameScore; + + while (digits[3] >= 1000) { + digits[0]++; + digits[3] -= 1000; + } + while (digits[3] >= 100) { + digits[1]++; + digits[3] -= 100; + } + while (digits[3] >= 10) { + digits[2]++; + digits[3] -= 10; + } + + loadChar = false; + for (i = 0; i < 4; i++) { + if ((i == 3) || (digits[i] != 0)) { + loadChar = true; + } + if (loadChar) { + Font_LoadChar(play, digits[i] + 0x824F, charTexIdx); + charTexIdx += FONT_CHAR_TEX_SIZE; + msgCtx->decodedBuffer.wchar[decodedBufPos] = digits[i] + 0x824F; + decodedBufPos++; + spC0 += 16.0f * msgCtx->textCharScale; + } + } + Message_LoadChar(play, 0x94AD, &charTexIdx, &spC0, decodedBufPos); + } else if ((curChar == 0x22C) || (curChar == 0x22D)) { + if (curChar == 0x22C) { + digits[0] = gSaveContext.save.saveInfo.lotteryCodes[CURRENT_DAY - 1][0]; + digits[1] = gSaveContext.save.saveInfo.lotteryCodes[CURRENT_DAY - 1][1]; + digits[2] = gSaveContext.save.saveInfo.lotteryCodes[CURRENT_DAY - 1][2]; + } else { + digits[0] = (HS_GET_LOTTERY_CODE_GUESS() & 0xF00) >> 8; + digits[1] = (HS_GET_LOTTERY_CODE_GUESS() & 0xF0) >> 4; + digits[2] = HS_GET_LOTTERY_CODE_GUESS() & 0xF; + } + for (i = 0; i < 3; i++) { + Font_LoadChar(play, digits[i] + 0x824F, charTexIdx); + charTexIdx += FONT_CHAR_TEX_SIZE; + msgCtx->decodedBuffer.wchar[decodedBufPos] = digits[i] + 0x824F; + decodedBufPos++; + spC0 += 16.0f * msgCtx->textCharScale; + } + decodedBufPos--; + } else if (curChar == 0x22E) { + digits[0] = digits[1] = digits[2] = 0; + digits[3] = gItemPrices[GET_CUR_FORM_BTN_ITEM(player->heldItemButton)]; + + while (digits[3] >= 1000) { + digits[0]++; + digits[3] -= 1000; + } + while (digits[3] >= 100) { + digits[1]++; + digits[3] -= 100; + } + while (digits[3] >= 10) { + digits[2]++; + digits[3] -= 10; + } + + loadChar = false; + for (i = 0; i < 4; i++) { + if ((i == 3) || (digits[i] != 0)) { + loadChar = true; + } + if (loadChar) { + Font_LoadChar(play, digits[i] + 0x824F, charTexIdx); + charTexIdx += FONT_CHAR_TEX_SIZE; + msgCtx->decodedBuffer.wchar[decodedBufPos] = digits[i] + 0x824F; + decodedBufPos++; + spC0 += 16.0f * msgCtx->textCharScale; + } + } + func_8014CCB4(play, &decodedBufPos, &charTexIdx, &spC0); + } else if (curChar == 0x22F) { + for (i = 0; i < 5; i++) { + digits[i] = gSaveContext.save.saveInfo.bomberCode[i]; + Font_LoadChar(play, digits[i] + 0x824F, charTexIdx); + charTexIdx += FONT_CHAR_TEX_SIZE; + msgCtx->decodedBuffer.wchar[decodedBufPos] = digits[i] + 0x824F; + decodedBufPos++; + spC0 += 16.0f * msgCtx->textCharScale; + } + decodedBufPos--; + } else if ((curChar >= 0x231) && (curChar < 0x237)) { + // index = curChar - 0x231; + msgCtx->decodedBuffer.wchar[decodedBufPos] = + D_801D027C[((void)0, gSaveContext.save.saveInfo.spiderHouseMaskOrder[(s16)(curChar - 0x231)])]; + decodedBufPos++; + Message_LoadChar( + play, + D_801D0284[((void)0, gSaveContext.save.saveInfo.spiderHouseMaskOrder[(s16)(curChar - 0x231)])], + &charTexIdx, &spC0, decodedBufPos); + decodedBufPos++; + msgCtx->decodedBuffer.wchar[decodedBufPos] = 0x2000; + } else if (curChar == 0x237) { + timeToMoonCrash = TIME_UNTIL_MOON_CRASH; + digits[0] = 0; + digits[1] = TIME_TO_HOURS_F_ALT(timeToMoonCrash); + + while (digits[1] >= 10) { + digits[0]++; + digits[1] -= 10; + } + + loadChar = false; + for (i = 0; i < 2; i++) { + if ((i == 1) || (digits[i] != 0)) { + loadChar = true; + } + if (loadChar) { + Message_LoadChar(play, digits[i] + 0x824F, &charTexIdx, &spC0, decodedBufPos); + decodedBufPos++; + } + } + Font_LoadChar(play, 0x8E9E, charTexIdx); + charTexIdx += FONT_CHAR_TEX_SIZE; + msgCtx->decodedBuffer.wchar[decodedBufPos] = 0x8E9E; + decodedBufPos++; + Font_LoadChar(play, 0x8AD4, charTexIdx); + charTexIdx += FONT_CHAR_TEX_SIZE; + msgCtx->decodedBuffer.wchar[decodedBufPos] = 0x8E9E; + spC0 += 2.0f * (16.0f * msgCtx->textCharScale); + } else if (curChar == 0x238) { + Message_LoadTime(play, curChar, &charTexIdx, &spC0, &decodedBufPos); + } else if ((curChar == 0x300) || (curChar == 0x301) || (curChar == 0x302) || (curChar == 0x308)) { + if (curChar == 0x308) { + value = (s32)HS_GET_HIGH_SCORE_3_LOWER(); + } else { + value = HIGH_SCORE(curChar - 0x300); + } + if (curChar == 0x302) { + if (LINK_AGE_IN_YEARS == YEARS_CHILD) { + value &= 0x7F; + } else { + value = (s16)((HIGH_SCORE(font->msgBuf.wchar[msgCtx->msgBufPos]) & 0xFF000000) >> 0x18) & 0x7F; + } + } + digits[3] = value; + digits[0] = digits[1] = digits[2] = 0; + + while (digits[3] >= 1000) { + digits[0]++; + digits[3] -= 1000; + } + while (digits[3] >= 100) { + digits[1]++; + digits[3] -= 100; + } + while (digits[3] >= 10) { + digits[2]++; + digits[3] -= 10; + } + + loadChar = false; + for (i = 0; i < 4; i++) { + if ((i == 3) || (digits[i] != 0)) { + loadChar = true; + } + if (loadChar) { + Font_LoadChar(play, digits[i] + 0x824F, charTexIdx); + charTexIdx += FONT_CHAR_TEX_SIZE; + msgCtx->decodedBuffer.wchar[decodedBufPos] = digits[i] + 0x824F; + decodedBufPos++; + spC0 += 16.0f * msgCtx->textCharScale; + } + } + decodedBufPos--; + } else if ((curChar == 0x307) || (curChar == 0x309) || (curChar == 0x30A) || (curChar == 0x30B) || + (curChar == 0x30C)) { + var_fs0 = 8.0f; + if (curChar == 0x307) { + Message_GetTimerDigits(GET_HIGH_SCORE(HS_UNK_1), spAC); + } else if (curChar == 0x309) { + Message_GetTimerDigits(GET_HIGH_SCORE(HS_HORSE_BACK_BALLOON), spAC); + } else { + Message_GetTimerDigits( + ((void)0, gSaveContext.save.saveInfo.dekuPlaygroundHighScores[curChar - 0x30A]), spAC); + } + + loadChar = false; + for (i = 0; i < 8; i++) { + if ((i == 4) || ((i != 2) && (i != 5) && (spAC[i] != '\0'))) { + loadChar = true; + } + if (loadChar) { + Font_LoadChar(play, spAC[i] + 0x824F, charTexIdx); + charTexIdx += FONT_CHAR_TEX_SIZE; + msgCtx->decodedBuffer.wchar[decodedBufPos] = spAC[i] + 0x824F; + decodedBufPos++; + } else { + var_fs0 -= 1.0f; + } + } + spC0 += var_fs0 * (16.0f * msgCtx->textCharScale); + decodedBufPos--; + } else if ((curChar == 0x303) || (curChar == 0x304) || (curChar == 0x305)) { + temp2 = HIGH_SCORE(curChar - 0x303 + HS_BOAT_ARCHERY); + digits[0] = digits[1] = digits[2] = 0; + digits[3] = temp2; + + while (digits[3] >= 60) { + digits[1]++; + if (digits[1] >= 10) { + digits[0]++; + digits[1] -= 10; + } + digits[3] -= 60; + } + while (digits[3] >= 10) { + digits[2]++; + digits[3] -= 10; + } + + for (i = 0; i < 4; i++) { + Font_LoadChar(play, digits[i] + 0x824F, charTexIdx); + charTexIdx += FONT_CHAR_TEX_SIZE; + msgCtx->decodedBuffer.wchar[decodedBufPos] = digits[i] + 0x824F; + decodedBufPos++; + if (i == 1) { + Font_LoadChar(play, 0x95AA, charTexIdx); + charTexIdx += FONT_CHAR_TEX_SIZE; + msgCtx->decodedBuffer.wchar[decodedBufPos] = 0x95AA; + decodedBufPos++; + } else if (i == 3) { + Font_LoadChar(play, 0x9562, charTexIdx); + charTexIdx += FONT_CHAR_TEX_SIZE; + msgCtx->decodedBuffer.wchar[decodedBufPos] = 0x9562; + } + } + spC0 += 4.0f * (16.0f * msgCtx->textCharScale); + } else if (curChar == 0x306) { + digits[0] = digits[1] = digits[2] = 0; + digits[3] = HS_GET_TOWN_SHOOTING_GALLERY_HIGH_SCORE(); + + while (digits[3] >= 1000) { + digits[0]++; + digits[3] -= 1000; + } + while (digits[3] >= 100) { + digits[1]++; + digits[3] -= 100; + } + while (digits[3] >= 10) { + digits[2]++; + digits[3] -= 10; + } + + loadChar = false; + for (i = 0; i < 4; i++) { + if ((i == 3) || (digits[i] != 0)) { + loadChar = true; + } + if (loadChar) { + Font_LoadChar(play, digits[i] + 0x824F, charTexIdx); + charTexIdx += FONT_CHAR_TEX_SIZE; + msgCtx->decodedBuffer.wchar[decodedBufPos] = digits[i] + 0x824F; + decodedBufPos++; + spC0 += 16.0f * msgCtx->textCharScale; + } + } + Message_LoadChar(play, 0x9543, &charTexIdx, &spC0, decodedBufPos); + } else if ((curChar == 0x30D) || (curChar == 0x30E) || (curChar == 0x30F)) { + //! Removing index and casting one version causes gSaveContext to be reloaded + // index = curChar - 0x30D; + + for (playerNameLen = 8; playerNameLen > 0; playerNameLen--) { + if (gSaveContext.save.saveInfo.inventory + .dekuPlaygroundPlayerName[(s16)(curChar - 0x30D)][playerNameLen - 1] != 0x3E) { + break; + } + } + + for (i = 0; i < playerNameLen; i++) { + ptr2 = &font->fontBuf[((void)0, gSaveContext.save.saveInfo.inventory + .dekuPlaygroundPlayerName[curChar - 0x30D][i]) * + FONT_CHAR_TEX_SIZE]; + msgCtx->decodedBuffer.wchar[decodedBufPos + i] = 0x30D; + + for (var_v0 = 0; var_v0 < FONT_CHAR_TEX_SIZE; var_v0 += 4) { + font->charBuf[font->unk_11D88][charTexIdx + var_v0 + 0] = ptr2[var_v0 + 0]; + font->charBuf[font->unk_11D88][charTexIdx + var_v0 + 1] = ptr2[var_v0 + 1]; + font->charBuf[font->unk_11D88][charTexIdx + var_v0 + 2] = ptr2[var_v0 + 2]; + font->charBuf[font->unk_11D88][charTexIdx + var_v0 + 3] = ptr2[var_v0 + 3]; + } + charTexIdx += FONT_CHAR_TEX_SIZE; + } + decodedBufPos += playerNameLen - 1; + spC0 += playerNameLen * (16.0f * msgCtx->textCharScale); + } else if (curChar == 0x310) { + digits[0] = digits[1] = digits[2] = 0; + digits[3] = HS_GET_BOAT_ARCHERY_HIGH_SCORE(); + + while (digits[3] >= 1000) { + digits[0]++; + digits[3] -= 1000; + } + while (digits[3] >= 100) { + digits[1]++; + digits[3] -= 100; + } + while (digits[3] >= 10) { + digits[2]++; + digits[3] -= 10; + } + + loadChar = false; + for (i = 0; i < 4; i++) { + if ((i == 3) || (digits[i] != 0)) { + loadChar = true; + } + if (loadChar) { + Font_LoadChar(play, digits[i] + 0x824F, charTexIdx); + charTexIdx += FONT_CHAR_TEX_SIZE; + msgCtx->decodedBuffer.wchar[decodedBufPos] = digits[i] + 0x824F; + decodedBufPos++; + spC0 += 16.0f * msgCtx->textCharScale; + } + } + Message_LoadChar(play, 0x94AD, &charTexIdx, &spC0, decodedBufPos); + } else if (curChar == 0x1F) { + decodedBufPos--; + for (i = 0; i < font->msgBuf.wchar[msgCtx->msgBufPos + 1]; i++) { + msgCtx->decodedBuffer.wchar[++decodedBufPos] = ' '; + spC0 += 6.0f; + } + msgCtx->msgBufPos++; + } else if ((curChar == 0xC) || (curChar == 0xA)) { + msgCtx->unk11F1A[spD2] = 0; + if (msgCtx->unk11F18 == 0) { + msgCtx->unk11F1A[spD2] = ((msgCtx->textCharScale * 16.0f * 16.0f) - spC0) * 0.5f; + } + spD2++; + spC0 = 0.0f; + if (curChar == 0xA) { + spE0++; + } + } else if ((curChar == 0x101) || (curChar == 0x102) || (curChar == 0x104) || + ((curChar >= 0x130) && (curChar < 0x137))) { + // pass + } else if (curChar == 0x111) { + msgCtx->textFade = true; + msgCtx->decodedBuffer.wchar[++decodedBufPos] = font->msgBuf.wchar[++msgCtx->msgBufPos] & 0xFF; + } else if (curChar == 0x120) { + msgCtx->decodedBuffer.wchar[++decodedBufPos] = font->msgBuf.wchar[++msgCtx->msgBufPos]; + if (msgCtx->textboxSkipped || (msgCtx->textBoxType == TEXTBOX_TYPE_1) || + (msgCtx->textBoxType == TEXTBOX_TYPE_3) || (msgCtx->textBoxType == TEXTBOX_TYPE_6) || + (msgCtx->textBoxType == TEXTBOX_TYPE_8) || (msgCtx->textBoxType == TEXTBOX_TYPE_9) || + (msgCtx->textBoxType == TEXTBOX_TYPE_B) || (msgCtx->unk11F0C == 3)) { + Audio_PlaySfx(msgCtx->decodedBuffer.wchar[decodedBufPos]); + } + } else if (curChar == 0x128) { + msgCtx->decodedBuffer.wchar[++decodedBufPos] = font->msgBuf.wchar[++msgCtx->msgBufPos]; + } else if ((curChar != 0x20) && ((curChar < 0x2000) || (curChar >= 0x2009))) { + Font_LoadChar(play, curChar, charTexIdx); + charTexIdx += FONT_CHAR_TEX_SIZE; + if ((curChar == 0x8169) || (curChar == 0x8175)) { + spC0 += 10.0f * msgCtx->textCharScale; + } else if (curChar == 0x8145) { + spC0 += (12.0f * msgCtx->textCharScale); + } else if ((curChar == 0x8148) || (curChar == 0x8149)) { + spC0 += 14.0f * msgCtx->textCharScale; + } else if (curChar == 0x8144) { + spC0 += 8.0f * msgCtx->textCharScale; + } else if ((curChar == 0x816A) || (curChar == 0x8176)) { + spC0 += 10.0f * msgCtx->textCharScale; + } else if ((curChar == 0x8141) || (curChar == 0x8142) || (curChar == 0x8168)) { + spC0 += 12.0f * msgCtx->textCharScale; + } else if (curChar == 0x8194) { + spC0 += 14.0f * msgCtx->textCharScale; + } else { + spC0 += 16.0f * msgCtx->textCharScale; + } + + } else if (curChar == 0x20) { + spC0 += 6.0f; + } + + decodedBufPos++; + msgCtx->msgBufPos++; + } + } else if (msgCtx->textIsCredits) { + Message_DecodeCredits(play); + } else { + Message_DecodeNES(play); + } +} +#else +void Message_Decode(PlayState* play); +#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/Message_Decode.s") +#endif + +void func_80150A84(PlayState* play) { + MessageContext* msgCtx = &play->msgCtx; + s32 textBoxType = msgCtx->textBoxType; + + if (D_801CFC78[textBoxType] != 14) { + DmaMgr_SendRequest0(msgCtx->textboxSegment, + &SEGMENT_ROM_START(message_static)[D_801CFC78[textBoxType] * 0x1000], 0x1000); + + if (!play->pauseCtx.bombersNotebookOpen) { + if ((textBoxType == TEXTBOX_TYPE_0) || (textBoxType == TEXTBOX_TYPE_6) || (textBoxType == TEXTBOX_TYPE_A) || + (textBoxType == TEXTBOX_TYPE_B)) { + msgCtx->textboxColorRed = 0; + msgCtx->textboxColorGreen = 0; + msgCtx->textboxColorBlue = 0; + } else if (textBoxType == TEXTBOX_TYPE_1) { + msgCtx->textboxColorRed = 70; + msgCtx->textboxColorGreen = 50; + msgCtx->textboxColorBlue = 30; + } else if ((textBoxType == TEXTBOX_TYPE_2) || (textBoxType == TEXTBOX_TYPE_8)) { + msgCtx->textboxColorRed = 0; + msgCtx->textboxColorGreen = 10; + msgCtx->textboxColorBlue = 50; + } else if (textBoxType == TEXTBOX_TYPE_D) { + msgCtx->textboxColorRed = 255; + msgCtx->textboxColorGreen = 255; + msgCtx->textboxColorBlue = 195; + } else { + msgCtx->textboxColorRed = 255; + msgCtx->textboxColorGreen = 0; + msgCtx->textboxColorBlue = 0; + } + + if (textBoxType == TEXTBOX_TYPE_1) { + msgCtx->textboxColorAlphaTarget = 230; + } else if (textBoxType == TEXTBOX_TYPE_3) { + msgCtx->textboxColorAlphaTarget = 180; + } else if (textBoxType == TEXTBOX_TYPE_D) { + msgCtx->textboxColorAlphaTarget = 220; + } else { + msgCtx->textboxColorAlphaTarget = 170; + } + } else { + msgCtx->textboxColorRed = 255; + msgCtx->textboxColorGreen = 255; + msgCtx->textboxColorBlue = 255; + msgCtx->textboxColorAlphaTarget = 255; + } + msgCtx->textboxColorAlphaCurrent = 0; + } +} + +void Message_OpenText(PlayState* play, u16 textId) { + MessageContext* msgCtx = &play->msgCtx; + Font* font = &msgCtx->font; + Player* player = GET_PLAYER(play); + f32 var_fv0; + + if (play->msgCtx.msgMode == MSGMODE_NONE) { + gSaveContext.prevHudVisibility = gSaveContext.hudVisibility; + } + + if (textId == 0xFF) { + func_80115844(play, DO_ACTION_STOP); + play->msgCtx.hudVisibility = gSaveContext.hudVisibility; + Interface_SetHudVisibility(HUD_VISIBILITY_A_B_C); + gSaveContext.save.unk_06 = 20; + } else if ((textId == 0x579) || (textId == 0x8D8)) { + Interface_SetHudVisibility(HUD_VISIBILITY_A_HEARTS_MAGIC_WITH_OVERWRITE); + } else if (((textId == 0x28) || (textId == 0x29) || (textId == 0x2A)) && + (player->transformation == PLAYER_FORM_DEKU)) { + //! FAKE: + if (msgCtx) {} + textId = 0xC9; + } else if (textId == 0x11) { + if (gSaveContext.save.saveInfo.inventory.strayFairies[((void)0, gSaveContext.dungeonIndex)] == 0xF) { + textId = 0xF3; + } + } else if ((textId == 0x92) && (play->sceneId == SCENE_KOEPONARACE)) { + textId = 0xCD; + } + + if ((textId == 0xC) && (GET_QUEST_HEART_PIECE_COUNT != 0)) { + textId = GET_QUEST_HEART_PIECE_COUNT; + textId += 0xC4; + } + + msgCtx->currentTextId = textId; + + if ((msgCtx->currentTextId == 0xC) || (msgCtx->currentTextId == 0xD) || (msgCtx->currentTextId == 0xC5) || + (msgCtx->currentTextId == 0xC6) || (msgCtx->currentTextId == 0xC7)) { + Interface_SetHudVisibility(HUD_VISIBILITY_A_HEARTS_MAGIC_WITH_OVERWRITE); + } + + msgCtx->messageHasSetSfx = false; + D_801C6A70 = 0; + msgCtx->textboxSkipped = false; + msgCtx->textIsCredits = false; + var_fv0 = 1.0f; + + if (play->pauseCtx.bombersNotebookOpen) { + if (gSaveContext.options.language == LANGUAGE_JPN) { + msgCtx->textCharScale = 1.4f; + msgCtx->unk11FFC = 0x1E; + msgCtx->unk11FF8 = 0x32; + var_fv0 = 1.4; + } else { + msgCtx->textCharScale = 1.4f; + msgCtx->unk11FFC = 0x16; + msgCtx->unk11FF8 = 0x32; + var_fv0 = 1.4; + } + } else if (textId >= 0x4E20) { + msgCtx->textIsCredits = true; + msgCtx->textCharScale = 0.85f; + msgCtx->unk11FFC = 6; + msgCtx->unk11FF8 = 0x14; + } else if (gSaveContext.options.language == LANGUAGE_JPN) { + msgCtx->textCharScale = 0.88f; + msgCtx->unk11FFC = 0x12; + msgCtx->unk11FF8 = 0x32; + } else { + msgCtx->textCharScale = 0.75f; + msgCtx->unk11FFC = 0xC; + msgCtx->unk11FF8 = 0x41; + } + + sCharTexSize = msgCtx->textCharScale * 16.0f; + sCharTexScale = 1024.0f / msgCtx->textCharScale; + D_801F6B08 = 1024.0f / var_fv0; + + if (msgCtx->textIsCredits) { + Message_FindCreditsMessage(play, textId); + msgCtx->msgLength = font->messageEnd; + DmaMgr_SendRequest0(&font->msgBuf, &SEGMENT_ROM_START(staff_message_data_static)[font->messageStart], + font->messageEnd); + } else if (gSaveContext.options.language == LANGUAGE_JPN) { + Message_FindMessage(play, textId); + msgCtx->msgLength = font->messageEnd; + DmaMgr_SendRequest0(&font->msgBuf, &SEGMENT_ROM_START(message_data_static)[font->messageStart], + font->messageEnd); + } else { + Message_FindMessageNES(play, textId); + msgCtx->msgLength = font->messageEnd; + DmaMgr_SendRequest0(&font->msgBuf, &SEGMENT_ROM_START(message_data_static)[font->messageStart], + font->messageEnd); + } + + msgCtx->choiceNum = 0; + msgCtx->textUnskippable = false; + msgCtx->textboxEndType = TEXTBOX_ENDTYPE_00; + msgCtx->textDrawPos = 0; + msgCtx->msgBufPos = 0; + msgCtx->decodedTextLen = 0; + + msgCtx->unk11F08 = font->msgBuf.schar[msgCtx->msgBufPos] << 8; + msgCtx->unk11F08 |= font->msgBuf.schar[msgCtx->msgBufPos + 1]; + + msgCtx->unk11F18 = (msgCtx->unk11F08 & 0xF000) >> 0xC; + msgCtx->textBoxType = (msgCtx->unk11F08 & 0xF00) >> 8; + msgCtx->textBoxPos = (msgCtx->unk11F08 & 0xF0) >> 4; + msgCtx->unk11F0C = msgCtx->unk11F08 & 0xF; + + if ((msgCtx->unk11F0C == 1) || (msgCtx->unk11F0C == 3)) { + msgCtx->textUnskippable = true; + } + msgCtx->itemId = 0xFE; + + if ((msgCtx->textBoxType == TEXTBOX_TYPE_5) || (msgCtx->textBoxType == TEXTBOX_TYPE_D) || + (play->pauseCtx.bombersNotebookOpen)) { + msgCtx->unk120CE = msgCtx->unk120D0 = msgCtx->unk120D2 = 0; + } else { + msgCtx->unk120CE = msgCtx->unk120D0 = msgCtx->unk120D2 = 0xFF; + } + + msgCtx->choiceIndex = 0; + + if (msgCtx->unk11F0C != 3) { + msgCtx->textColorAlpha = 0xFF; + } else { + msgCtx->textColorAlpha = 0; + } + + if (textId == 0x1467) { + Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_KAFEI); + } + + if (textId == 0x2955) { + Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_ANJU); + Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_KAFEI); + Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_RECEIVED_COUPLES_MASK); + } +} + +void func_801514B0(PlayState* play, u16 arg1, u8 arg2) { + MessageContext* msgCtx = &play->msgCtx; + Font* font = &msgCtx->font; + Player* player = GET_PLAYER(play); + f32 temp = 1024.0f; + + msgCtx->ocarinaAction = 0xFFFF; + + if (msgCtx->msgMode == MSGMODE_NONE) { + gSaveContext.prevHudVisibility = gSaveContext.hudVisibility; + } + msgCtx->messageHasSetSfx = false; + D_801C6A70 = 0; + msgCtx->textboxSkipped = false; + msgCtx->textIsCredits = false; + + if (gSaveContext.options.language == LANGUAGE_JPN) { + msgCtx->textCharScale = 0.88f; + msgCtx->unk11FFC = 0x12; + msgCtx->unk11FF8 = 0x32; + } else { + msgCtx->textCharScale = 0.75f; + msgCtx->unk11FFC = 0xC; + msgCtx->unk11FF8 = 0x41; + } + + sCharTexSize = msgCtx->textCharScale * 16.0f; + sCharTexScale = temp / msgCtx->textCharScale; + D_801F6B08 = temp / 1; + + if ((arg1 == 0x1709) && (player->transformation == 3)) { + arg1 = 0x1705; + } + + msgCtx->currentTextId = arg1; + + if (gSaveContext.options.language == LANGUAGE_JPN) { + Message_FindMessage(play, arg1); + msgCtx->msgLength = font->messageEnd; + DmaMgr_SendRequest0(&font->msgBuf, &SEGMENT_ROM_START(message_data_static)[font->messageStart], + font->messageEnd); + } else { + Message_FindMessageNES(play, arg1); + msgCtx->msgLength = font->messageEnd; + DmaMgr_SendRequest0(&font->msgBuf, &SEGMENT_ROM_START(message_data_static)[font->messageStart], + font->messageEnd); + } + msgCtx->choiceNum = 0; + msgCtx->textUnskippable = false; + msgCtx->textboxEndType = TEXTBOX_ENDTYPE_00; + msgCtx->textDrawPos = 0; + msgCtx->msgBufPos = 0; + msgCtx->decodedTextLen = 0; + msgCtx->unk11F08 = font->msgBuf.wchar[msgCtx->msgBufPos]; + msgCtx->unk11F18 = (msgCtx->unk11F08 & 0xF000) >> 0xC; + msgCtx->textBoxType = TEXTBOX_TYPE_9; + msgCtx->textBoxPos = arg2; + msgCtx->unk11F0C = msgCtx->unk11F08 & 0xF; + msgCtx->textUnskippable = true; + DmaMgr_SendRequest0(msgCtx->textboxSegment, &SEGMENT_ROM_START(message_static)[D_801CFC78[0] << 12], 0x1000); + msgCtx->textboxColorRed = 0; + msgCtx->textboxColorGreen = 0; + msgCtx->textboxColorBlue = 0; + msgCtx->textboxColorAlphaTarget = 0xE6; + msgCtx->textboxColorAlphaCurrent = 0; + msgCtx->textColorAlpha = 0xFF; + msgCtx->talkActor = NULL; + msgCtx->msgMode = MSGMODE_TEXT_START; + msgCtx->stateTimer = 0; + msgCtx->textDelayTimer = 0; + play->msgCtx.ocarinaMode = OCARINA_MODE_NONE; + msgCtx->unk120D2 = 0xFF; + msgCtx->unk120CE = msgCtx->unk120D0 = msgCtx->unk120D2; +} void Message_StartTextbox(PlayState* play, u16 textId, Actor* actor) { MessageContext* msgCtx = &play->msgCtx; msgCtx->ocarinaAction = 0xFFFF; - func_80150D08(play, textId); + Message_OpenText(play, textId); msgCtx->talkActor = actor; - msgCtx->msgMode = 1; + msgCtx->msgMode = MSGMODE_TEXT_START; msgCtx->stateTimer = 0; msgCtx->textDelayTimer = 0; - play->msgCtx.ocarinaMode = 0; + play->msgCtx.ocarinaMode = OCARINA_MODE_NONE; } void Message_ContinueTextbox(PlayState* play, u16 textId) { @@ -334,9 +3328,9 @@ void Message_ContinueTextbox(PlayState* play, u16 textId) { InterfaceContext* interfaceCtx = &play->interfaceCtx; msgCtx->msgLength = 0; - func_80150D08(play, textId); + Message_OpenText(play, textId); func_80150A84(play); - msgCtx->msgMode = 5; + msgCtx->msgMode = MSGMODE_TEXT_CONTINUING; msgCtx->stateTimer = 8; msgCtx->textDelayTimer = 0; @@ -350,21 +3344,21 @@ void Message_ContinueTextbox(PlayState* play, u16 textId) { msgCtx->textboxColorAlphaCurrent = msgCtx->textboxColorAlphaTarget; if (play->pauseCtx.bombersNotebookOpen) { - msgCtx->textboxXTarget = 0x22; - msgCtx->textboxYTarget = 0x15E; - func_80149C18(play); + msgCtx->textboxXTarget = 34; + msgCtx->textboxYTarget = 350; + Message_GrowTextbox(play); msgCtx->stateTimer = 1; } } -void func_80151A68(PlayState* play, u16 textId) { +void Message_DisplaySceneTitleCard(PlayState* play, u16 textId) { MessageContext* msgCtx = &play->msgCtx; msgCtx->msgLength = 0; - func_80150D08(play, textId); + Message_OpenText(play, textId); func_80150A84(play); Message_DecodeNES(play); - msgCtx->msgMode = 0x45; + msgCtx->msgMode = MSGMODE_SCENE_TITLE_CARD_FADE_IN_BACKGROUND; msgCtx->textDelayTimer = 0; msgCtx->textboxColorAlphaCurrent = msgCtx->textboxColorAlphaTarget = msgCtx->textColorAlpha = 0; msgCtx->stateTimer = 30; @@ -402,7 +3396,10 @@ void Message_BombersNotebookQueueEvent(PlayState* play, u8 event) { } } -u32 func_80151C9C(PlayState* play) { +/** + * @return s32 true if an entry to be shown was found and triggered + */ +s32 Message_BombersNotebookProcessEventQueue(PlayState* play) { MessageContext* msgCtx = &play->msgCtx; while (true) { @@ -429,16 +3426,188 @@ u32 func_80151C9C(PlayState* play) { } } -#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/func_80151DA4.s") +u16 D_801D028C[] = { + 0x1B5A, // OCARINA_ACTION_0 + 0x1B5B, // + 0x1B5C, // OCARINA_ACTION_DEMONSTRATE_SONATA + 0x1B5D, // OCARINA_ACTION_DEMONSTRATE_GORON_LULLABY + 0x1B5E, // OCARINA_ACTION_DEMONSTRATE_NEW_WAVE + 0x1B5F, // OCARINA_ACTION_DEMONSTRATE_ELEGY + 0x1B60, // OCARINA_ACTION_DEMONSTRATE_OATH + 0x1B61, // OCARINA_ACTION_DEMONSTRATE_SARIAS + 0x1B62, // OCARINA_ACTION_DEMONSTRATE_TIME + 0x1B63, // OCARINA_ACTION_DEMONSTRATE_HEALING + 0x1B64, // OCARINA_ACTION_DEMONSTRATE_EPONAS + 0x1B65, // OCARINA_ACTION_DEMONSTRATE_SOARING + 0x1B66, // OCARINA_ACTION_DEMONSTRATE_STORMS + 0x1B67, // OCARINA_ACTION_DEMONSTRATE_SUNS + 0x1B68, // OCARINA_ACTION_DEMONSTRATE_INVERTED_TIME + 0x1B69, // OCARINA_ACTION_DEMONSTRATE_DOUBLE_TIME + 0x1B6A, // OCARINA_ACTION_DEMONSTRATE_GORON_LULLABY_INTRO + 0, // OCARINA_ACTION_11 + 0xDC7, // OCARINA_ACTION_3B + 0xDC9, // OCARINA_ACTION_3C + 0x120A, // OCARINA_ACTION_DEMONSTRATE_EVAN_PART1_FIRST_HALF + 0x120B, // OCARINA_ACTION_DEMONSTRATE_EVAN_PART2_FIRST_HALF + 0x122C, // OCARINA_ACTION_DEMONSTRATE_EVAN_PART1_SECOND_HALF + 0x122F, // OCARINA_ACTION_DEMONSTRATE_EVAN_PART2_SECOND_HALF + 0x120A, // OCARINA_ACTION_PROMPT_EVAN_PART1_SECOND_HALF + 0x120B, // OCARINA_ACTION_PROMPT_EVAN_PART2_SECOND_HALF +}; -void func_80152434(PlayState* play, u16 arg2) { - play->msgCtx.blockSunsSong = false; - func_80151DA4(play, arg2); +u16 sOcarinaSongFlagsMap[] = { 1, 2, 4, 8, 0x10, 0x20, 0x40, 0x80, 0x100, 0x200, 0x400, 0x800 }; + +void Message_DisplayOcarinaStaffImpl(PlayState* play, u16 ocarinaAction) { + MessageContext* msgCtx = &play->msgCtx; + s16 j; + s16 noStop; + s32 k; + u32 i; + + msgCtx->ocarinaAvailableSongs = 0; + + for (i = msgCtx->ocarinaAvailableSongs; i <= (QUEST_SONG_SUN - QUEST_SONG_SONATA); i++) { + if (CHECK_QUEST_ITEM(QUEST_SONG_SONATA + i)) { + msgCtx->ocarinaAvailableSongs = msgCtx->ocarinaAvailableSongs | sOcarinaSongFlagsMap[i]; + } + } + + if (CHECK_QUEST_ITEM(QUEST_SONG_TIME)) { + msgCtx->ocarinaAvailableSongs |= 0x3000; + } + if (CHECK_QUEST_ITEM(QUEST_SONG_LULLABY_INTRO)) { + msgCtx->ocarinaAvailableSongs |= 0x4000; + } + if (CHECK_QUEST_ITEM(QUEST_SONG_LULLABY)) { + msgCtx->ocarinaAvailableSongs &= (u16)~0x4000; + } + if (gSaveContext.save.saveInfo.scarecrowSpawnSongSet) { + msgCtx->ocarinaAvailableSongs |= 0x400000; + } + if (CHECK_EVENTINF(EVENTINF_31)) { + msgCtx->ocarinaAvailableSongs |= 0x800000; + } + + msgCtx->ocarinaStaff = AudioOcarina_GetRecordingStaff(); + + if ((ocarinaAction == OCARINA_ACTION_PROMPT_EVAN_PART1_SECOND_HALF) || + (ocarinaAction == OCARINA_ACTION_PROMPT_EVAN_PART2_SECOND_HALF)) { + sOcarinaButtonAlphaValues[0] = sOcarinaButtonAlphaValues[1] = sOcarinaButtonAlphaValues[2] = + sOcarinaButtonAlphaValues[3] = 255; + } else { + msgCtx->ocarinaStaff->pos = 0; + sOcarinaButtonIndexBufPos = 0; + sOcarinaButtonIndexBufLen = 0; + Message_ResetOcarinaButtonState(play); + } + + sLastPlayedSong = 0xFF; + msgCtx->lastPlayedSong = 0xFF; + msgCtx->ocarinaButtonIndex = OCARINA_BTN_INVALID; + noStop = false; + msgCtx->ocarinaAction = ocarinaAction; + + if ((ocarinaAction >= OCARINA_ACTION_TIMED_PROMPT_SONATA) && + (ocarinaAction <= OCARINA_ACTION_TIMED_PROMPT_STORMS)) { + Message_OpenText(play, 0x1B59); + func_80150A84(play); + } else if ((ocarinaAction == OCARINA_ACTION_3B) || (ocarinaAction == OCARINA_ACTION_3C)) { + noStop = true; + Message_OpenText(play, D_801D028C[ocarinaAction - 0x29]); + func_80150A84(play); + } else if ((ocarinaAction >= OCARINA_ACTION_DEMONSTRATE_EVAN_PART1_FIRST_HALF) && + (ocarinaAction <= OCARINA_ACTION_PROMPT_EVAN_PART2_SECOND_HALF)) { + noStop = true; + Message_OpenText(play, D_801D028C[ocarinaAction - 0x29]); + func_80150A84(play); + } else if ((ocarinaAction >= OCARINA_ACTION_PROMPT_WIND_FISH_HUMAN) && + (ocarinaAction <= OCARINA_ACTION_PROMPT_WIND_FISH_DEKU)) { + noStop = true; + Message_OpenText(play, 0x1B59); + func_80150A84(play); + } else if ((ocarinaAction == OCARINA_ACTION_FREE_PLAY) || (ocarinaAction >= OCARINA_ACTION_CHECK_TIME)) { + if ((ocarinaAction >= OCARINA_ACTION_CHECK_TIME) && (ocarinaAction <= OCARINA_ACTION_CHECK_STORMS)) { + Audio_PlaySfx(NA_SE_SY_TRE_BOX_APPEAR); + } + if (ocarinaAction == OCARINA_ACTION_SCARECROW_SPAWN_DEMONSTRATION) { + Message_OpenText(play, 0x1B5B); + func_80150A84(play); + } else { + Message_OpenText(play, 0x1B5A); + func_80150A84(play); + } + } else { + noStop = true; + if (ocarinaAction >= OCARINA_ACTION_PROMPT_SONATA) { + Message_OpenText(play, 0x1B59); + func_80150A84(play); + } else { + Message_OpenText(play, D_801D028C[ocarinaAction]); + func_80150A84(play); + } + } + + msgCtx->talkActor = NULL; + msgCtx->textDelayTimer = 0; + play->msgCtx.ocarinaMode = OCARINA_MODE_NONE; + msgCtx->textboxXTarget = 34; + msgCtx->textboxYTarget = 142; + msgCtx->stateTimer = 8; + Message_GrowTextbox(play); + msgCtx->textboxX = 34; + msgCtx->textboxY = 142; + msgCtx->unk1200C = 0x200; + msgCtx->unk1200E = 0x200; + msgCtx->unk12008 = 0x100; + msgCtx->unk1200A = 0x40; + msgCtx->msgMode = MSGMODE_TEXT_CONTINUING; + msgCtx->textboxColorAlphaCurrent = msgCtx->textboxColorAlphaTarget; + msgCtx->textboxColorAlphaCurrent = msgCtx->textboxColorAlphaTarget; + + if (!noStop) { + func_80115844(play, DO_ACTION_STOP); + noStop = gSaveContext.hudVisibility; + Interface_SetHudVisibility(HUD_VISIBILITY_B_ALT); + gSaveContext.hudVisibility = noStop; + } + + if ((ocarinaAction == OCARINA_ACTION_FREE_PLAY) || (ocarinaAction == OCARINA_ACTION_CHECK_NOTIME)) { + msgCtx->msgMode = MSGMODE_OCARINA_STARTING; + msgCtx->textBoxType = TEXTBOX_TYPE_E; + } else if (ocarinaAction == OCARINA_ACTION_3A) { + msgCtx->msgMode = MSGMODE_32; + } else if (ocarinaAction == OCARINA_ACTION_37) { + msgCtx->msgMode = MSGMODE_2F; + msgCtx->textBoxType = TEXTBOX_TYPE_2; + } else if (ocarinaAction == OCARINA_ACTION_SCARECROW_LONG_DEMONSTRATION) { + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_DEFAULT); + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_DEFAULT); + msgCtx->ocarinaStaff = AudioOcarina_GetPlaybackStaff(); + msgCtx->ocarinaStaff->pos = 0; + sOcarinaButtonIndexBufLen = 0; + sOcarinaButtonIndexBufPos = sOcarinaButtonIndexBufLen; + Message_ResetOcarinaButtonState(play); + msgCtx->msgMode = MSGMODE_SCARECROW_LONG_DEMONSTRATION; + AudioOcarina_SetPlaybackSong(OCARINA_SONG_SCARECROW_LONG + 1, 1); + gSaveContext.hudVisibility = HUD_VISIBILITY_IDLE; + Interface_SetHudVisibility(HUD_VISIBILITY_NONE); + } + + for (j = 0, k = 0; j < 48; j++, k += FONT_CHAR_TEX_SIZE) { + Font_LoadChar(play, 0x8140, k); + }; + + msgCtx->stateTimer = 3; } -void func_80152464(PlayState* play, u16 arg1) { +void Message_DisplayOcarinaStaff(PlayState* play, u16 ocarinaAction) { + play->msgCtx.blockSunsSong = false; + Message_DisplayOcarinaStaffImpl(play, ocarinaAction); +} + +void Message_DisplayOcarinaStaffBlockSunsSong(PlayState* play, u16 ocarinaAction) { play->msgCtx.blockSunsSong = true; - func_80151DA4(play, arg1); + Message_DisplayOcarinaStaffImpl(play, ocarinaAction); } /** @@ -449,7 +3618,7 @@ u8 Message_GetState(MessageContext* msgCtx) { return TEXT_STATE_NONE; } - if (msgCtx->msgMode == 0x42) { + if (msgCtx->msgMode == MSGMODE_TEXT_DONE) { if (msgCtx->nextTextId != 0xFFFF) { return TEXT_STATE_1; } @@ -482,69 +3651,419 @@ u8 Message_GetState(MessageContext* msgCtx) { return TEXT_STATE_DONE; } - if (msgCtx->msgMode == 0x41) { + if (msgCtx->msgMode == MSGMODE_TEXT_AWAIT_NEXT) { return TEXT_STATE_10; } - if (msgCtx->msgMode == 0x1B) { + if (msgCtx->msgMode == MSGMODE_SONG_DEMONSTRATION_DONE) { return TEXT_STATE_7; } - if ((msgCtx->ocarinaMode == 3) || (msgCtx->msgMode == 0x37)) { + if ((msgCtx->ocarinaMode == OCARINA_MODE_EVENT) || (msgCtx->msgMode == MSGMODE_37)) { return TEXT_STATE_8; } - if (msgCtx->msgMode == 0x20) { + if (msgCtx->msgMode == MSGMODE_OCARINA_AWAIT_INPUT) { return TEXT_STATE_9; } - if ((msgCtx->msgMode == 0x21) || (msgCtx->msgMode == 0x3A)) { + if ((msgCtx->msgMode == MSGMODE_21) || (msgCtx->msgMode == MSGMODE_3A)) { return TEXT_STATE_11; } - if (msgCtx->msgMode == 0x3D) { + if (msgCtx->msgMode == MSGMODE_3D) { return TEXT_STATE_12; } - if (msgCtx->msgMode == 0x40) { + if (msgCtx->msgMode == MSGMODE_40) { return TEXT_STATE_13; } - if ((msgCtx->msgMode == 0x43) && (msgCtx->stateTimer == 1) && (msgCtx->bombersNotebookEventQueueCount == 0)) { + if ((msgCtx->msgMode == MSGMODE_TEXT_CLOSING) && (msgCtx->stateTimer == 1) && + (msgCtx->bombersNotebookEventQueueCount == 0)) { return TEXT_STATE_CLOSING; } return TEXT_STATE_3; } -#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/func_8015268C.s") +void Message_DrawTextBox(PlayState* play, Gfx** gfxP) { + MessageContext* msgCtx = &play->msgCtx; + Gfx* gfx = *gfxP; -void func_80152C64(View* view) { + gDPPipeSync(gfx++); + + if (((u32)msgCtx->textBoxType == TEXTBOX_TYPE_0) || (msgCtx->textBoxType == TEXTBOX_TYPE_2) || + (msgCtx->textBoxType == TEXTBOX_TYPE_9) || (msgCtx->textBoxType == TEXTBOX_TYPE_A)) { + gDPSetRenderMode(gfx++, G_RM_CLD_SURF, G_RM_CLD_SURF2); + } else if (msgCtx->textBoxType == TEXTBOX_TYPE_3) { + gDPSetAlphaCompare(gfx++, G_AC_THRESHOLD); + gDPSetRenderMode(gfx++, G_RM_XLU_SURF, G_RM_XLU_SURF2); + } + + gDPSetPrimColor(gfx++, 0, 0, msgCtx->textboxColorRed, msgCtx->textboxColorGreen, msgCtx->textboxColorBlue, + msgCtx->textboxColorAlphaCurrent); + + if (((u32)msgCtx->textBoxType == TEXTBOX_TYPE_0) || (msgCtx->textBoxType == TEXTBOX_TYPE_2) || + (msgCtx->textBoxType == TEXTBOX_TYPE_6) || (msgCtx->textBoxType == TEXTBOX_TYPE_8) || + (msgCtx->textBoxType == TEXTBOX_TYPE_9) || (msgCtx->textBoxType == TEXTBOX_TYPE_A)) { + gDPLoadTextureBlock_4b(gfx++, msgCtx->textboxSegment, G_IM_FMT_I, 128, 64, 0, G_TX_MIRROR | G_TX_WRAP, + G_TX_NOMIRROR | G_TX_WRAP, 7, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); + } else { + gDPPipeSync(gfx++); + + if (msgCtx->textBoxType == TEXTBOX_TYPE_3) { + gDPSetEnvColor(gfx++, 0, 0, 0, 255); + } else if (msgCtx->textBoxType == TEXTBOX_TYPE_D) { + gDPSetEnvColor(gfx++, 20, 0, 10, 255); + } else { + gDPSetEnvColor(gfx++, 50, 20, 0, 255); + } + gDPLoadTextureBlock_4b(gfx++, msgCtx->textboxSegment, G_IM_FMT_IA, 128, 64, 0, G_TX_MIRROR | G_TX_WRAP, + G_TX_MIRROR | G_TX_WRAP, 7, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); + } + + if (msgCtx->textBoxType == TEXTBOX_TYPE_A) { + gSPTextureRectangle(gfx++, msgCtx->textboxX << 2, (msgCtx->textboxY + 22) << 2, + (msgCtx->textboxX + msgCtx->unk12008) << 2, (msgCtx->textboxY + 54) << 2, G_TX_RENDERTILE, + 0, 6, msgCtx->unk1200C << 1, 2 << 10); + } else { + gSPTextureRectangle(gfx++, msgCtx->textboxX << 2, (msgCtx->textboxY) << 2, + (msgCtx->textboxX + sTextboxWidth) << 2, (msgCtx->textboxY + sTextboxHeight) << 2, + G_TX_RENDERTILE, 0, 0, sTextboxTexWidth, sTextboxTexHeight); + } + + // Draw treble clef + if (msgCtx->textBoxType == TEXTBOX_TYPE_3) { + gDPPipeSync(gfx++); + gDPSetCombineLERP(gfx++, 1, 0, PRIMITIVE, 0, TEXEL0, 0, PRIMITIVE, 0, 1, 0, PRIMITIVE, 0, TEXEL0, 0, PRIMITIVE, + 0); + gDPSetPrimColor(gfx++, 0, 0, 255, 100, 0, 255); + gDPLoadTextureBlock_4b(gfx++, gOcarinaTrebleClefTex, G_IM_FMT_I, 16, 32, 0, G_TX_MIRROR | G_TX_WRAP, + G_TX_MIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); + gSPTextureRectangle(gfx++, 78 << 2, 166 << 2, 94 << 2, 198 << 2, G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10); + } + + *gfxP = gfx++; +} + +void Message_SetView(View* view) { SET_FULLSCREEN_VIEWPORT(view); View_ApplyOrthoToOverlay(view); } -#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/func_80152CAC.s") +void func_80152CAC(PlayState* play) { + MessageContext* msgCtx = &play->msgCtx; -// Spawn song effect? -void func_80152EC0(PlayState* play) { + if (msgCtx->ocarinaAction == OCARINA_ACTION_DEMONSTRATE_SONATA) { + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_MONKEY); + } else if (msgCtx->ocarinaAction == OCARINA_ACTION_DEMONSTRATE_HEALING) { + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_PIANO); + } else if (msgCtx->ocarinaAction == OCARINA_ACTION_DEMONSTRATE_SARIAS) { + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_TATL); + } else if (msgCtx->ocarinaAction == OCARINA_ACTION_DEMONSTRATE_EPONAS) { + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_FEMALE_VOICE); + } else if (msgCtx->ocarinaAction == OCARINA_ACTION_DEMONSTRATE_STORMS) { + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_DEFAULT); + } else if (msgCtx->ocarinaAction == OCARINA_ACTION_DEMONSTRATE_GORON_LULLABY) { + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_BABY_SINGING); + } else if (msgCtx->ocarinaAction == OCARINA_ACTION_DEMONSTRATE_GORON_LULLABY_INTRO) { + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_ELDER_GORON_DRUMS); + } else if (msgCtx->ocarinaAction == OCARINA_ACTION_DEMONSTRATE_OATH) { + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_TATL); + } else if (msgCtx->ocarinaAction == OCARINA_ACTION_DEMONSTRATE_ELEGY) { + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_IKANA_KING); + } else { + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_DEFAULT); + } + + if ((msgCtx->ocarinaAction == OCARINA_ACTION_3B) || (msgCtx->ocarinaAction == OCARINA_ACTION_3C)) { + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_ELDER_GORON_DRUMS); + AudioOcarina_SetPlaybackSong(OCARINA_SONG_GORON_LULLABY_INTRO + 1, 0x83); + return; + } + if ((msgCtx->ocarinaAction == OCARINA_ACTION_DEMONSTRATE_EVAN_PART1_FIRST_HALF) || + (msgCtx->ocarinaAction == OCARINA_ACTION_DEMONSTRATE_EVAN_PART2_FIRST_HALF)) { + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_BASS_GUITAR); + AudioOcarina_SetPlaybackSong( + ((msgCtx->ocarinaAction - OCARINA_ACTION_DEMONSTRATE_EVAN_PART1_FIRST_HALF) + OCARINA_SONG_EVAN_PART1 + 1), + 0x84); + return; + } + if ((msgCtx->ocarinaAction == OCARINA_ACTION_DEMONSTRATE_EVAN_PART1_SECOND_HALF) || + (msgCtx->ocarinaAction == OCARINA_ACTION_DEMONSTRATE_EVAN_PART2_SECOND_HALF)) { + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_ZORA_GUITAR); + AudioOcarina_SetPlaybackSong( + ((msgCtx->ocarinaAction - OCARINA_ACTION_DEMONSTRATE_EVAN_PART1_SECOND_HALF) + OCARINA_SONG_EVAN_PART1 + 1), + 0x44); + return; + } + AudioOcarina_SetPlaybackSong((msgCtx->ocarinaAction - OCARINA_ACTION_FREE_PLAY), 2); +} + +s16 sOcarinaEffectActorIds[] = { + ACTOR_OCEFF_WIPE5, // Sonata of Awakening Effect + ACTOR_OCEFF_WIPE5, // Sonata of Awakening Effect + ACTOR_OCEFF_WIPE5, // Sonata of Awakening Effect + ACTOR_OCEFF_WIPE5, // Sonata of Awakening Effect + ACTOR_OCEFF_WIPE5, // Sonata of Awakening Effect + ACTOR_OCEFF_WIPE5, // Sonata of Awakening Effect + ACTOR_OCEFF_WIPE, // Song of Time Effect + ACTOR_OCEFF_WIPE7, // Song of Healing Effect + ACTOR_OCEFF_WIPE2, // Epona's Song Effect + ACTOR_OCEFF_WIPE6, // Song of Soaring Effect + ACTOR_OCEFF_STORM, // Song of Storms Effect II [?] + ACTOR_OCEFF_SPOT, // Sun's Song Effect + ACTOR_OCEFF_WIPE, // Song of Time Effect + ACTOR_OCEFF_WIPE, // Song of Time Effect + ACTOR_OCEFF_WIPE4 // Scarecrow's Song Effect +}; +s32 sOcarinaEffectActorParams[] = { 0, 1, 2, 3, 4, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0 }; + +void Message_SpawnSongEffect(PlayState* play) { MessageContext* msgCtx = &play->msgCtx; Player* player = GET_PLAYER(play); + //! FAKE: if (1) {} - if ((msgCtx->songPlayed < 0x17) && (msgCtx->songPlayed != 0xE) && - ((msgCtx->ocarinaAction < 0x43) || (msgCtx->ocarinaAction >= 0x47))) { + if ((msgCtx->songPlayed <= OCARINA_SONG_SCARECROW_SPAWN) && + (msgCtx->songPlayed != OCARINA_SONG_GORON_LULLABY_INTRO) && + !((msgCtx->ocarinaAction >= OCARINA_ACTION_PROMPT_WIND_FISH_HUMAN) && + (msgCtx->ocarinaAction <= OCARINA_ACTION_PROMPT_WIND_FISH_DEKU))) { msgCtx->ocarinaSongEffectActive = true; - if (msgCtx->songPlayed != 0x16) { - Actor_Spawn(&play->actorCtx, play, D_801D02D8[msgCtx->songPlayed], player->actor.world.pos.x, - player->actor.world.pos.y, player->actor.world.pos.z, 0, 0, 0, D_801D02F8[msgCtx->songPlayed]); - return; + if (msgCtx->songPlayed != OCARINA_SONG_SCARECROW_SPAWN) { + Actor_Spawn(&play->actorCtx, play, sOcarinaEffectActorIds[msgCtx->songPlayed], player->actor.world.pos.x, + player->actor.world.pos.y, player->actor.world.pos.z, 0, 0, 0, + sOcarinaEffectActorParams[msgCtx->songPlayed]); + } else { + Actor_Spawn(&play->actorCtx, play, ACTOR_OCEFF_WIPE4, player->actor.world.pos.x, player->actor.world.pos.y, + player->actor.world.pos.z, 0, 0, 0, 0); } - Actor_Spawn(&play->actorCtx, play, ACTOR_OCEFF_WIPE4, player->actor.world.pos.x, player->actor.world.pos.y, - player->actor.world.pos.z, 0, 0, 0, 0); } } -#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/func_80152FB8.s") +Color_RGB16 sOcarinaButtonAPrimColors[] = { + { 80, 150, 255 }, + { 100, 200, 255 }, +}; +Color_RGB16 sOcarinaButtonAEnvColors[] = { + { 10, 10, 10 }, + { 50, 50, 255 }, +}; +Color_RGB16 sOcarinaButtonCPrimColors[] = { + { 255, 255, 50 }, + { 255, 255, 180 }, +}; +Color_RGB16 sOcarinaButtonCEnvColors[] = { + { 10, 10, 10 }, + { 110, 110, 50 }, +}; -#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/func_80153750.s") +void Message_FlashOcarinaButtons(void) { + sOcarinaButtonStepR = ABS_ALT(sOcarinaButtonAPrimR - sOcarinaButtonAPrimColors[sOcarinaButtonFlashColorIndex].r) / + sOcarinaButtonFlashTimer; + sOcarinaButtonStepG = ABS_ALT(sOcarinaButtonAPrimG - sOcarinaButtonAPrimColors[sOcarinaButtonFlashColorIndex].g) / + sOcarinaButtonFlashTimer; + sOcarinaButtonStepB = ABS_ALT(sOcarinaButtonAPrimB - sOcarinaButtonAPrimColors[sOcarinaButtonFlashColorIndex].b) / + sOcarinaButtonFlashTimer; -void func_80153E7C(PlayState* play, Gfx** gfxP) { - if ((gSaveContext.options.language == 0) && !play->msgCtx.textIsCredits) { - func_8014ADBC(play, gfxP); + if (sOcarinaButtonAPrimR >= sOcarinaButtonAPrimColors[sOcarinaButtonFlashColorIndex].r) { + sOcarinaButtonAPrimR -= sOcarinaButtonStepR; + } else { + sOcarinaButtonAPrimR += sOcarinaButtonStepR; + } + if (sOcarinaButtonAPrimG >= sOcarinaButtonAPrimColors[sOcarinaButtonFlashColorIndex].g) { + sOcarinaButtonAPrimG -= sOcarinaButtonStepG; + } else { + sOcarinaButtonAPrimG += sOcarinaButtonStepG; + } + if (sOcarinaButtonAPrimB >= sOcarinaButtonAPrimColors[sOcarinaButtonFlashColorIndex].b) { + sOcarinaButtonAPrimB -= sOcarinaButtonStepB; + } else { + sOcarinaButtonAPrimB += sOcarinaButtonStepB; + } + + sOcarinaButtonStepR = ABS_ALT(sOcarinaButtonAEnvR - sOcarinaButtonAEnvColors[sOcarinaButtonFlashColorIndex].r) / + sOcarinaButtonFlashTimer; + sOcarinaButtonStepG = ABS_ALT(sOcarinaButtonAEnvG - sOcarinaButtonAEnvColors[sOcarinaButtonFlashColorIndex].g) / + sOcarinaButtonFlashTimer; + sOcarinaButtonStepB = ABS_ALT(sOcarinaButtonAEnvB - sOcarinaButtonAEnvColors[sOcarinaButtonFlashColorIndex].b) / + sOcarinaButtonFlashTimer; + + if (sOcarinaButtonCEnvR >= sOcarinaButtonAEnvColors[sOcarinaButtonFlashColorIndex].r) { + sOcarinaButtonAEnvR -= sOcarinaButtonStepR; + } else { + sOcarinaButtonAEnvR += sOcarinaButtonStepR; + } + if (sOcarinaButtonCEnvG >= sOcarinaButtonAEnvColors[sOcarinaButtonFlashColorIndex].g) { + sOcarinaButtonAEnvG -= sOcarinaButtonStepG; + } else { + sOcarinaButtonAEnvG += sOcarinaButtonStepG; + } + if (sOcarinaButtonCEnvB >= sOcarinaButtonAEnvColors[sOcarinaButtonFlashColorIndex].b) { + sOcarinaButtonAEnvB -= sOcarinaButtonStepB; + } else { + sOcarinaButtonAEnvB += sOcarinaButtonStepB; + } + + sOcarinaButtonStepR = ABS_ALT(sOcarinaButtonCPrimR - sOcarinaButtonCPrimColors[sOcarinaButtonFlashColorIndex].r) / + sOcarinaButtonFlashTimer; + sOcarinaButtonStepG = ABS_ALT(sOcarinaButtonCPrimG - sOcarinaButtonCPrimColors[sOcarinaButtonFlashColorIndex].g) / + sOcarinaButtonFlashTimer; + sOcarinaButtonStepB = ABS_ALT(sOcarinaButtonCPrimB - sOcarinaButtonCPrimColors[sOcarinaButtonFlashColorIndex].b) / + sOcarinaButtonFlashTimer; + + if (sOcarinaButtonCPrimR >= sOcarinaButtonCPrimColors[sOcarinaButtonFlashColorIndex].r) { + sOcarinaButtonCPrimR -= sOcarinaButtonStepR; + } else { + sOcarinaButtonCPrimR += sOcarinaButtonStepR; + } + if (sOcarinaButtonCPrimG >= sOcarinaButtonCPrimColors[sOcarinaButtonFlashColorIndex].g) { + sOcarinaButtonCPrimG -= sOcarinaButtonStepG; + } else { + sOcarinaButtonCPrimG += sOcarinaButtonStepG; + } + if (sOcarinaButtonCPrimB >= sOcarinaButtonCPrimColors[sOcarinaButtonFlashColorIndex].b) { + sOcarinaButtonCPrimB -= sOcarinaButtonStepB; + } else { + sOcarinaButtonCPrimB += sOcarinaButtonStepB; + } + + sOcarinaButtonStepR = ABS_ALT(sOcarinaButtonCEnvR - sOcarinaButtonCEnvColors[sOcarinaButtonFlashColorIndex].r) / + sOcarinaButtonFlashTimer; + sOcarinaButtonStepG = ABS_ALT(sOcarinaButtonCEnvG - sOcarinaButtonCEnvColors[sOcarinaButtonFlashColorIndex].g) / + sOcarinaButtonFlashTimer; + sOcarinaButtonStepB = ABS_ALT(sOcarinaButtonCEnvB - sOcarinaButtonCEnvColors[sOcarinaButtonFlashColorIndex].b) / + sOcarinaButtonFlashTimer; + + if (sOcarinaButtonCEnvR >= sOcarinaButtonCEnvColors[sOcarinaButtonFlashColorIndex].r) { + sOcarinaButtonCEnvR -= sOcarinaButtonStepR; + } else { + sOcarinaButtonCEnvR += sOcarinaButtonStepR; + } + if (sOcarinaButtonCEnvG >= sOcarinaButtonCEnvColors[sOcarinaButtonFlashColorIndex].g) { + sOcarinaButtonCEnvG -= sOcarinaButtonStepG; + } else { + sOcarinaButtonCEnvG += sOcarinaButtonStepG; + } + if (sOcarinaButtonCEnvB >= sOcarinaButtonCEnvColors[sOcarinaButtonFlashColorIndex].b) { + sOcarinaButtonCEnvB -= sOcarinaButtonStepB; + } else { + sOcarinaButtonCEnvB += sOcarinaButtonStepB; + } + + sOcarinaButtonFlashTimer--; + if (sOcarinaButtonFlashTimer == 0) { + sOcarinaButtonAPrimR = sOcarinaButtonAPrimColors[sOcarinaButtonFlashColorIndex].r; + sOcarinaButtonAPrimG = sOcarinaButtonAPrimColors[sOcarinaButtonFlashColorIndex].g; + sOcarinaButtonAPrimB = sOcarinaButtonAPrimColors[sOcarinaButtonFlashColorIndex].b; + sOcarinaButtonAEnvR = sOcarinaButtonAEnvColors[sOcarinaButtonFlashColorIndex].r; + sOcarinaButtonAEnvG = sOcarinaButtonAEnvColors[sOcarinaButtonFlashColorIndex].g; + sOcarinaButtonAEnvB = sOcarinaButtonAEnvColors[sOcarinaButtonFlashColorIndex].b; + sOcarinaButtonCPrimR = sOcarinaButtonCPrimColors[sOcarinaButtonFlashColorIndex].r; + sOcarinaButtonCPrimG = sOcarinaButtonCPrimColors[sOcarinaButtonFlashColorIndex].g; + sOcarinaButtonCPrimB = sOcarinaButtonCPrimColors[sOcarinaButtonFlashColorIndex].b; + sOcarinaButtonCEnvR = sOcarinaButtonCEnvColors[sOcarinaButtonFlashColorIndex].r; + sOcarinaButtonCEnvG = sOcarinaButtonCEnvColors[sOcarinaButtonFlashColorIndex].g; + sOcarinaButtonCEnvB = sOcarinaButtonCEnvColors[sOcarinaButtonFlashColorIndex].b; + sOcarinaButtonFlashTimer = 3; + sOcarinaButtonFlashColorIndex ^= 1; + } +} + +TexturePtr sOcarinaButtonTextures[] = { + gOcarinaATex, gOcarinaCDownTex, gOcarinaCRightTex, gOcarinaCLeftTex, gOcarinaCUpTex, +}; + +void Message_DrawOcarinaButtons(PlayState* play, Gfx** gfxP) { + MessageContext* msgCtx = &play->msgCtx; + Gfx* gfx = *gfxP; + u16 i; + u16 notePosX; + + if ((play->msgCtx.msgMode >= MSGMODE_OCARINA_PLAYING) && (msgCtx->msgMode <= MSGMODE_40)) { + if ((msgCtx->ocarinaAction != OCARINA_ACTION_FREE_PLAY) && + (msgCtx->ocarinaAction != OCARINA_ACTION_CHECK_NOTIME)) { + Gfx_SetupDL39_Ptr(&gfx); + + gDPSetCombineLERP(gfx++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, PRIMITIVE, + ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0); + + if ((msgCtx->msgMode == MSGMODE_SONG_PROMPT) || (msgCtx->msgMode == MSGMODE_36)) { + if ((msgCtx->ocarinaAction != OCARINA_ACTION_PROMPT_EVAN_PART1_SECOND_HALF) && + (msgCtx->ocarinaAction != OCARINA_ACTION_PROMPT_EVAN_PART2_SECOND_HALF)) { + if (msgCtx->ocarinaAction >= OCARINA_ACTION_TIMED_PROMPT_SONATA) { + sOcarinaButtonStepG = msgCtx->ocarinaAction - OCARINA_ACTION_TIMED_PROMPT_SONATA; + } else if ((msgCtx->ocarinaAction == OCARINA_ACTION_PROMPT_EVAN_PART1_SECOND_HALF) || + (msgCtx->ocarinaAction == OCARINA_ACTION_PROMPT_EVAN_PART2_SECOND_HALF)) { + // Can never pass as the conditional is opposite to one scope higher + sOcarinaButtonStepG = (msgCtx->ocarinaAction - OCARINA_ACTION_PROMPT_EVAN_PART1_SECOND_HALF) + + OCARINA_SONG_EVAN_PART1; + } else if ((msgCtx->ocarinaAction >= OCARINA_ACTION_PROMPT_WIND_FISH_HUMAN) && + (msgCtx->ocarinaAction <= OCARINA_ACTION_PROMPT_WIND_FISH_DEKU)) { + sOcarinaButtonStepG = msgCtx->ocarinaAction - OCARINA_ACTION_PROMPT_WIND_FISH_HUMAN + + OCARINA_SONG_WIND_FISH_HUMAN; + } else { + sOcarinaButtonStepG = msgCtx->ocarinaAction - OCARINA_ACTION_PROMPT_SONATA; + } + sOcarinaButtonStepR = gOcarinaSongButtons[sOcarinaButtonStepG].numButtons; + + for (notePosX = 98, i = 0; i < sOcarinaButtonStepR; notePosX += 18, i++) { + gDPPipeSync(gfx++); + gDPSetPrimColor(gfx++, 0, 0, 150, 150, 150, 150); + gDPSetEnvColor(gfx++, 10, 10, 10, 0); + + gDPLoadTextureBlock( + gfx++, sOcarinaButtonTextures[gOcarinaSongButtons[sOcarinaButtonStepG].buttonIndex[i]], + G_IM_FMT_IA, G_IM_SIZ_8b, 16, 16, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, + G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); + + gSPTextureRectangle( + gfx++, notePosX << 2, + msgCtx->ocarinaButtonsPosY[gOcarinaSongButtons[sOcarinaButtonStepG].buttonIndex[i]] << 2, + (notePosX + 16) << 2, + (msgCtx->ocarinaButtonsPosY[gOcarinaSongButtons[sOcarinaButtonStepG].buttonIndex[i]] + 16) + << 2, + G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10); + } + } + } + + if (msgCtx->msgMode != MSGMODE_SCARECROW_LONG_RECORDING_START) { + for (notePosX = 98, i = 0; i < 8; notePosX += 18, i++) { + if (sOcarinaButtonIndexBuf[i] == OCARINA_BTN_INVALID) { + break; + } + + if (sOcarinaButtonAlphaValues[i] != 255) { + sOcarinaButtonAlphaValues[i] += 50; + if (sOcarinaButtonAlphaValues[i] >= 255) { + sOcarinaButtonAlphaValues[i] = 255; + } + } + + gDPPipeSync(gfx++); + if (sOcarinaButtonIndexBuf[i] == OCARINA_BTN_A) { + gDPSetPrimColor(gfx++, 0, 0, sOcarinaButtonAPrimR, sOcarinaButtonAPrimG, sOcarinaButtonAPrimB, + sOcarinaButtonAlphaValues[i]); + gDPSetEnvColor(gfx++, sOcarinaButtonAEnvR, sOcarinaButtonAEnvG, sOcarinaButtonAEnvB, 0); + } else { + gDPSetPrimColor(gfx++, 0, 0, sOcarinaButtonCPrimR, sOcarinaButtonCPrimG, sOcarinaButtonCPrimB, + sOcarinaButtonAlphaValues[i]); + gDPSetEnvColor(gfx++, sOcarinaButtonCEnvR, sOcarinaButtonCEnvG, sOcarinaButtonCEnvB, 0); + } + + gDPLoadTextureBlock(gfx++, sOcarinaButtonTextures[sOcarinaButtonIndexBuf[i]], G_IM_FMT_IA, + G_IM_SIZ_8b, 16, 16, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, + G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); + + gSPTextureRectangle( + gfx++, notePosX << 2, msgCtx->ocarinaButtonsPosY[sOcarinaButtonIndexBuf[i]] << 2, + (notePosX + 16) << 2, (msgCtx->ocarinaButtonsPosY[sOcarinaButtonIndexBuf[i]] + 16) << 2, + G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10); + } + } + } + } + *gfxP = gfx; +} + +void Message_DrawText(PlayState* play, Gfx** gfxP) { + if ((gSaveContext.options.language == LANGUAGE_JPN) && !play->msgCtx.textIsCredits) { + Message_DrawTextDefault(play, gfxP); } else if (play->msgCtx.textIsCredits) { Message_DrawTextCredits(play, gfxP); } else { @@ -552,9 +4071,1035 @@ void func_80153E7C(PlayState* play, Gfx** gfxP) { } } -#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/func_80153EF0.s") +void Message_DrawSceneTitleCard(PlayState* play, Gfx** gfxP) { + MessageContext* msgCtx = &play->msgCtx; + Gfx* gfx; -#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/func_801541D4.s") + gfx = *gfxP; + Gfx_SetupDL39_Ptr(&gfx); + + gDPSetCombineLERP(gfx++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, PRIMITIVE, + ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0); + gDPSetTextureFilter(gfx++, G_TF_BILERP); + gDPSetAlphaDither(gfx++, G_AD_NOTPATTERN); + gDPSetPrimColor(gfx++, 0, 0, 0, 0, 0, msgCtx->textboxColorAlphaCurrent); + gDPSetEnvColor(gfx++, 140, 40, 160, 255); + gDPLoadTextureBlock(gfx++, gSceneTitleCardGradientTex, G_IM_FMT_I, G_IM_SIZ_8b, 64, 1, 0, G_TX_NOMIRROR | G_TX_WRAP, + G_TX_NOMIRROR | G_TX_WRAP, 6, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); + gSPTextureRectangle(gfx++, 0, XREG(77) << 2, 320 << 2, (XREG(77) + XREG(76)) << 2, G_TX_RENDERTILE, 0, 0, 204, + 1 << 10); + gDPPipeSync(gfx++); + gDPSetCombineLERP(gfx++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0); + gDPSetEnvColor(gfx++, 0, 0, 0, 255); + + if ((msgCtx->currentTextId < 0x1BB2) || (msgCtx->currentTextId >= 0x1BB7)) { + msgCtx->unk11FF8 = XREG(75); + } + msgCtx->unk11FFA = XREG(74); + Message_DrawTextNES(play, &gfx, 0); + *gfxP = gfx++; +} + +s16 sOcarinaSongFanfares[] = { + NA_BGM_OCARINA_SONATA, // OCARINA_SONG_SONATA + NA_BGM_OCARINA_LULLABY, // OCARINA_SONG_GORON_LULLABY + NA_BGM_OCARINA_NEW_WAVE, // OCARINA_SONG_NEW_WAVE + NA_BGM_OCARINA_ELEGY, // OCARINA_SONG_ELEGY + NA_BGM_OCARINA_OATH, // OCARINA_SONG_OATH + NA_BGM_MAJORAS_LAIR, // OCARINA_SONG_SARIAS + NA_BGM_OCARINA_TIME, // OCARINA_SONG_TIME + NA_BGM_OCARINA_HEALING, // OCARINA_SONG_HEALING + NA_BGM_OCARINA_EPONA, // OCARINA_SONG_EPONAS + NA_BGM_OCARINA_SOARING, // OCARINA_SONG_SOARING + NA_BGM_OCARINA_STORM, // OCARINA_SONG_STORMS + NA_BGM_OCARINA_SUNS, // OCARINA_SONG_SUNS + NA_BGM_INVERTED_SONG_OF_TIME, // OCARINA_SONG_INVERTED_TIME + NA_BGM_SONG_OF_DOUBLE_TIME, // OCARINA_SONG_DOUBLE_TIME + NA_BGM_OCARINA_LULLABY_INTRO_PTR, // OCARINA_SONG_GORON_LULLABY_INTRO + NA_BGM_OCARINA_LULLABY_INTRO_PTR, // OCARINA_SONG_WIND_FISH_HUMAN + NA_BGM_OCARINA_LULLABY_INTRO_PTR, // OCARINA_SONG_WIND_FISH_GORON +}; + +s8 sOcarinaSongFanfareIoData[PLAYER_FORM_MAX] = { + 0x35, // PLAYER_FORM_FIERCE_DEITY + 0x5C, // PLAYER_FORM_GORON + 0x5D, // PLAYER_FORM_ZORA + 0x5E, // PLAYER_FORM_DEKU + 0x35, // PLAYER_FORM_HUMAN +}; + +u8 sPlayerFormOcarinaInstruments[] = { + OCARINA_INSTRUMENT_DEFAULT, + OCARINA_INSTRUMENT_GORON_DRUMS, + OCARINA_INSTRUMENT_ZORA_GUITAR, + OCARINA_INSTRUMENT_DEKU_PIPES, +}; + +s16 D_801D03A8[TEXTBOX_TYPE_MAX] = { + 0x3B, // TEXTBOX_TYPE_0 + 0x3B, // TEXTBOX_TYPE_1 + 0x3B, // TEXTBOX_TYPE_2 + 0x3B, // TEXTBOX_TYPE_3 + 0x22, // TEXTBOX_TYPE_4 + 0x3B, // TEXTBOX_TYPE_5 + 0x3B, // TEXTBOX_TYPE_6 + 0x3B, // TEXTBOX_TYPE_7 + 0x3B, // TEXTBOX_TYPE_8 + 0x3B, // TEXTBOX_TYPE_9 + 0x3B, // TEXTBOX_TYPE_A + 0x3B, // TEXTBOX_TYPE_B + 0x3B, // TEXTBOX_TYPE_C + 0x3B, // TEXTBOX_TYPE_D + 0x3B, // TEXTBOX_TYPE_E + 0x3B, // TEXTBOX_TYPE_F +}; + +void Message_DrawMain(PlayState* play, Gfx** gfxP) { + s32 pad; + MessageContext* msgCtx = &play->msgCtx; + Gfx* gfx; + u16 i; + u16 buttonIndexPos; + u8 ocarinaError; + s32 j; + s16 temp_v0_33; + s16 temp; + + gfx = *gfxP; + + gSPSegment(gfx++, 0x02, play->interfaceCtx.parameterSegment); + gSPSegment(gfx++, 0x07, msgCtx->textboxSegment); + + if (msgCtx->msgLength != 0) { + if (!msgCtx->textIsCredits) { + Message_SetView(&msgCtx->view); + Gfx_SetupDL39_Ptr(&gfx); + if (msgCtx->ocarinaAction != OCARINA_ACTION_37) { + if ((msgCtx->msgMode != MSGMODE_18) && (msgCtx->msgMode != MSGMODE_39) && + (msgCtx->msgMode != MSGMODE_3C) && (msgCtx->msgMode != MSGMODE_3F) && + (msgCtx->msgMode != MSGMODE_3A) && (msgCtx->msgMode != MSGMODE_3D) && + (msgCtx->msgMode != MSGMODE_40) && + (((msgCtx->msgMode >= MSGMODE_TEXT_BOX_GROWING) && (msgCtx->msgMode <= MSGMODE_TEXT_DONE)) || + ((msgCtx->msgMode >= MSGMODE_NEW_CYCLE_0) && (msgCtx->msgMode <= MSGMODE_OWL_SAVE_2))) && + (D_801CFC78[msgCtx->textBoxType] != 0xE)) { + Message_DrawTextBox(play, &gfx); + } + } + } + Gfx_SetupDL39_Ptr(&gfx); + gDPSetAlphaCompare(gfx++, G_AC_NONE); + gDPSetCombineLERP(gfx++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, + 0); + + if (YREG(0) != msgCtx->msgMode) { + YREG(0) = msgCtx->msgMode; + YREG(1) = msgCtx->ocarinaAction; + } + + switch (msgCtx->msgMode) { + case MSGMODE_TEXT_START: + case MSGMODE_TEXT_BOX_GROWING: + case MSGMODE_TEXT_STARTING: + case MSGMODE_TEXT_NEXT_MSG: + break; + + case MSGMODE_TEXT_CONTINUING: + if (msgCtx->stateTimer == 1) { + for (i = 0, j = 0; i < 48; i++, j += FONT_CHAR_TEX_SIZE) { + Font_LoadChar(play, 0x8140, j); + } + Message_DrawText(play, &gfx); + } else { + gDPPipeSync(gfx++); + gDPSetRenderMode(gfx++, G_RM_CLD_SURF, G_RM_CLD_SURF2); + gDPSetPrimColor(gfx++, 0, 0, 0, 0, 0, 0); + gDPSetEnvColor(gfx++, 0, 0, 0, 255); + } + break; + + case MSGMODE_TEXT_DISPLAYING: + case MSGMODE_TEXT_DELAYED_BREAK: + case MSGMODE_9: + if ((gSaveContext.options.language == LANGUAGE_JPN) && !msgCtx->textIsCredits) { + if (msgCtx->textDelay != 0) { + msgCtx->textDrawPos += msgCtx->textDelay; + } + Message_DrawTextNES(play, &gfx, 0); + if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) { + Message_DrawTextNES(play, &gfx, (s32)msgCtx->textDrawPos); + } + } else if (msgCtx->textIsCredits) { + Message_DrawTextCredits(play, &gfx); + } else { + if (msgCtx->textDelay != 0) { + msgCtx->textDrawPos += msgCtx->textDelay; + } + Message_DrawTextNES(play, &gfx, 0); + if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) { + Message_DrawTextNES(play, &gfx, (s32)msgCtx->textDrawPos); + } + } + break; + + case MSGMODE_NEW_CYCLE_0: + case MSGMODE_NEW_CYCLE_1: + case MSGMODE_NEW_CYCLE_2: + case MSGMODE_OWL_SAVE_0: + case MSGMODE_OWL_SAVE_1: + case MSGMODE_OWL_SAVE_2: + Message_DrawTextNES(play, &gfx, 0); + break; + + case MSGMODE_TEXT_AWAIT_INPUT: + case MSGMODE_TEXT_AWAIT_NEXT: + Message_DrawText(play, &gfx); + Message_DrawTextboxIcon(play, &gfx, 158, + (s16)(D_801D03A8[msgCtx->textBoxType] + msgCtx->textboxYTarget)); + break; + + case MSGMODE_OCARINA_STARTING: + case MSGMODE_SONG_DEMONSTRATION_STARTING: + case MSGMODE_SONG_PROMPT_STARTING: + case MSGMODE_32: + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_DEFAULT); + msgCtx->ocarinaStaff = AudioOcarina_GetPlayingStaff(); + play->msgCtx.ocarinaMode = OCARINA_MODE_ACTIVE; + if ((msgCtx->ocarinaAction != OCARINA_ACTION_PROMPT_EVAN_PART1_SECOND_HALF) && + (msgCtx->ocarinaAction != OCARINA_ACTION_PROMPT_EVAN_PART2_SECOND_HALF)) { + msgCtx->ocarinaStaff->pos = 0; + sOcarinaButtonIndexBufPos = 0; + Message_ResetOcarinaButtonState(play); + } + sOcarinaButtonFlashColorIndex = 1; + sOcarinaButtonFlashTimer = 3; + if (msgCtx->msgMode == MSGMODE_OCARINA_STARTING) { + if ((msgCtx->ocarinaAction == OCARINA_ACTION_0) || + (msgCtx->ocarinaAction == OCARINA_ACTION_FREE_PLAY) || + (msgCtx->ocarinaAction == OCARINA_ACTION_SCARECROW_SPAWN_RECORDING) || + (msgCtx->ocarinaAction == OCARINA_ACTION_CHECK_NOTIME) || + (msgCtx->ocarinaAction >= OCARINA_ACTION_CHECK_TIME)) { + if ((msgCtx->ocarinaAction == OCARINA_ACTION_FREE_PLAY) || + (msgCtx->ocarinaAction == OCARINA_ACTION_CHECK_NOTIME)) { + if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_52_10)) { + AudioOcarina_StartDefault(msgCtx->ocarinaAvailableSongs | 0xC0000000); + } else if (CHECK_EVENTINF(EVENTINF_31)) { + AudioOcarina_SetInstrument(sPlayerFormOcarinaInstruments[CUR_FORM]); + AudioOcarina_StartDefault(0x80800000); + } else { + AudioOcarina_StartAtSongStartingPos((msgCtx->ocarinaAvailableSongs + 0x80000) | + 0xC0000000); + AudioOcarina_SetInstrument(sPlayerFormOcarinaInstruments[CUR_FORM]); + } + } else { + AudioOcarina_StartDefault(msgCtx->ocarinaAvailableSongs); + } + } else { + AudioOcarina_StartDefault((1 << msgCtx->ocarinaAction) | 0x80000000); + } + msgCtx->msgMode = MSGMODE_OCARINA_PLAYING; + if (CHECK_EVENTINF(EVENTINF_24)) { + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_DEKU_TRUMPET); + } else if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_41_20)) { + AudioOcarina_SetInstrument(sPlayerFormOcarinaInstruments[CUR_FORM]); + //! FAKE: + (void)CUR_FORM; + if (gSaveContext.save.playerForm == 4) {} + } else { + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_AMPLIFIED_GUITAR); + } + } else if (msgCtx->msgMode == MSGMODE_SONG_DEMONSTRATION_STARTING) { + msgCtx->stateTimer = 20; + msgCtx->msgMode = MSGMODE_19; + } else if (msgCtx->msgMode == MSGMODE_32) { + AudioOcarina_SetInstrument(sPlayerFormOcarinaInstruments[CUR_FORM]); + AudioOcarina_StartDefault(0x80800000); + msgCtx->msgMode = MSGMODE_33; + } else { // MSGMODE_SONG_PROMPT_STARTING + if (CHECK_EVENTINF(EVENTINF_24)) { + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_DEKU_TRUMPET); + } else { + AudioOcarina_SetInstrument(sPlayerFormOcarinaInstruments[CUR_FORM]); + } + + if ((msgCtx->ocarinaAction == OCARINA_ACTION_PROMPT_EVAN_PART1_SECOND_HALF) || + (msgCtx->ocarinaAction == OCARINA_ACTION_PROMPT_EVAN_PART2_SECOND_HALF)) { + AudioOcarina_StartForSongCheck( + (1 << (OCARINA_ACTION_PROMPT_SONATA + msgCtx->ocarinaAction)) | 0x80000000, 4); + msgCtx->msgMode = MSGMODE_SONG_PROMPT; + } else { + if ((msgCtx->ocarinaAction >= OCARINA_ACTION_PROMPT_WIND_FISH_HUMAN) && + (msgCtx->ocarinaAction <= OCARINA_ACTION_PROMPT_WIND_FISH_DEKU)) { + AudioOcarina_StartDefault( + (1 << ((msgCtx->ocarinaAction - OCARINA_ACTION_PROMPT_WIND_FISH_HUMAN) + + OCARINA_SONG_WIND_FISH_HUMAN)) | + 0x80000000); + } else { + AudioOcarina_StartDefault( + (1 << ((msgCtx->ocarinaAction - OCARINA_ACTION_PROMPT_SONATA) + OCARINA_SONG_SONATA)) | + 0x80000000); + } + msgCtx->msgMode = MSGMODE_SONG_PROMPT; + } + } + + if ((msgCtx->ocarinaAction != OCARINA_ACTION_FREE_PLAY) && + (msgCtx->ocarinaAction != OCARINA_ACTION_CHECK_NOTIME)) { + Message_DrawText(play, &gfx); + } + break; + + case MSGMODE_OCARINA_PLAYING: + msgCtx->ocarinaStaff = AudioOcarina_GetPlayingStaff(); + + if ((u32)msgCtx->ocarinaStaff->pos != 0) { + if ((msgCtx->ocarinaStaff->pos == 1) && (sOcarinaButtonIndexBufPos == 8)) { + sOcarinaButtonIndexBufPos = 0; + } + + if (sOcarinaButtonIndexBufPos == (msgCtx->ocarinaStaff->pos - 1)) { + msgCtx->ocarinaButtonIndex = sOcarinaButtonIndexBuf[msgCtx->ocarinaStaff->pos - 1] = + msgCtx->ocarinaStaff->buttonIndex; + sOcarinaButtonIndexBuf[msgCtx->ocarinaStaff->pos] = OCARINA_BTN_INVALID; + sOcarinaButtonIndexBufPos++; + } + } + + msgCtx->songPlayed = msgCtx->ocarinaStaff->state; + + if (msgCtx->ocarinaStaff->state <= OCARINA_SONG_SCARECROW_SPAWN) { + if (msgCtx->ocarinaStaff->state == OCARINA_SONG_EVAN_PART1) { + AudioOcarina_ResetAndReadInput(); + AudioOcarina_StartDefault(0x80100000); + } else if (msgCtx->ocarinaStaff->state == OCARINA_SONG_EVAN_PART2) { + Audio_PlaySfx(NA_SE_SY_CORRECT_CHIME); + AudioOcarina_SetOcarinaDisableTimer(0, 20); + Message_CloseTextbox(play); + play->msgCtx.ocarinaMode = OCARINA_MODE_PLAYED_FULL_EVAN_SONG; + } else if ((msgCtx->ocarinaStaff->state == OCARINA_SONG_SCARECROW_SPAWN) || + (msgCtx->ocarinaStaff->state == OCARINA_SONG_INVERTED_TIME) || + (msgCtx->ocarinaStaff->state == OCARINA_SONG_DOUBLE_TIME) || + (msgCtx->ocarinaStaff->state == OCARINA_SONG_GORON_LULLABY_INTRO) || + CHECK_QUEST_ITEM(QUEST_SONG_SONATA + msgCtx->ocarinaStaff->state)) { + sLastPlayedSong = msgCtx->ocarinaStaff->state; + msgCtx->lastPlayedSong = msgCtx->ocarinaStaff->state; + msgCtx->songPlayed = msgCtx->ocarinaStaff->state; + msgCtx->msgMode = MSGMODE_E; + msgCtx->stateTimer = 20; + + if (msgCtx->ocarinaAction == OCARINA_ACTION_CHECK_NOTIME) { + if ((msgCtx->ocarinaStaff->state <= OCARINA_SONG_SARIAS) || + (msgCtx->ocarinaStaff->state == OCARINA_SONG_SCARECROW_SPAWN)) { + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_OFF); + Audio_PlaySfx(NA_SE_SY_OCARINA_ERROR); + msgCtx->msgMode = MSGMODE_OCARINA_STARTING; + } else { + Message_ContinueTextbox(play, 0x1B5B); + msgCtx->msgMode = MSGMODE_SONG_PLAYED; + msgCtx->textBoxType = TEXTBOX_TYPE_3; + msgCtx->stateTimer = 10; + Audio_PlaySfx(NA_SE_SY_TRE_BOX_APPEAR); + Interface_SetHudVisibility(HUD_VISIBILITY_NONE); + } + } else if (msgCtx->ocarinaAction == OCARINA_ACTION_CHECK_SCARECROW_SPAWN) { + if (msgCtx->ocarinaStaff->state <= OCARINA_SONG_STORMS) { + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_OFF); + Audio_PlaySfx(NA_SE_SY_OCARINA_ERROR); + msgCtx->stateTimer = 10; + msgCtx->msgMode = MSGMODE_OCARINA_FAIL; + } else { + Message_ContinueTextbox(play, 0x1B5B); + msgCtx->msgMode = MSGMODE_SONG_PLAYED; + msgCtx->textBoxType = TEXTBOX_TYPE_3; + msgCtx->stateTimer = 10; + Audio_PlaySfx(NA_SE_SY_TRE_BOX_APPEAR); + Interface_SetHudVisibility(HUD_VISIBILITY_NONE); + } + } else if (msgCtx->ocarinaAction == OCARINA_ACTION_FREE_PLAY) { + Message_ContinueTextbox(play, 0x1B5B); + msgCtx->msgMode = MSGMODE_SONG_PLAYED; + msgCtx->textBoxType = TEXTBOX_TYPE_3; + msgCtx->stateTimer = 10; + Audio_PlaySfx(NA_SE_SY_TRE_BOX_APPEAR); + } else { + Audio_PlaySfx(NA_SE_SY_TRE_BOX_APPEAR); + } + Interface_SetHudVisibility(HUD_VISIBILITY_NONE); + } else { + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_OFF); + Audio_PlaySfx(NA_SE_SY_OCARINA_ERROR); + msgCtx->msgMode = MSGMODE_OCARINA_STARTING; + } + } else if (msgCtx->ocarinaStaff->state == OCARINA_SONG_TERMINA_WALL) { + Message_CloseTextbox(play); + play->msgCtx.ocarinaMode = OCARINA_MODE_END; + SET_EVENTINF(EVENTINF_32); + Audio_PlaySfx(NA_SE_SY_CORRECT_CHIME); + AudioOcarina_SetOcarinaDisableTimer(0, 20); + } else if (msgCtx->ocarinaStaff->state == 0xFF) { + if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_52_10)) { + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_OFF); + Audio_PlaySfx(NA_SE_SY_OCARINA_ERROR); + msgCtx->stateTimer = 10; + msgCtx->msgMode = MSGMODE_OCARINA_FAIL; + } else { + AudioOcarina_SetSongStartingPos(); + AudioOcarina_SetInstrument(sPlayerFormOcarinaInstruments[CUR_FORM]); + AudioOcarina_StartAtSongStartingPos((msgCtx->ocarinaAvailableSongs + 0x80000) | 0xC0000000); + } + } + if ((msgCtx->ocarinaAction != OCARINA_ACTION_FREE_PLAY) && + (msgCtx->ocarinaAction != OCARINA_ACTION_CHECK_NOTIME)) { + Message_DrawText(play, &gfx); + } + break; + + case MSGMODE_E: + case MSGMODE_SONG_PROMPT_SUCCESS: + case MSGMODE_22: + case MSGMODE_SCARECROW_SPAWN_RECORDING_DONE: + case MSGMODE_34: + Message_FlashOcarinaButtons(); + msgCtx->stateTimer--; + if (msgCtx->stateTimer == 0) { + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_OFF); + + if (msgCtx->msgMode == MSGMODE_E) { + Message_ContinueTextbox(play, 0x1B5B); + msgCtx->msgMode = MSGMODE_SONG_PLAYED; + msgCtx->textBoxType = TEXTBOX_TYPE_3; + msgCtx->stateTimer = 1; + } else if (msgCtx->msgMode == MSGMODE_SONG_PROMPT_SUCCESS) { + Message_ContinueTextbox(play, 0x1B5B); + msgCtx->msgMode = MSGMODE_SONG_PLAYED; + msgCtx->textBoxType = TEXTBOX_TYPE_3; + msgCtx->stateTimer = 1; + } else if (msgCtx->msgMode == MSGMODE_22) { + msgCtx->msgMode = MSGMODE_23; + play->msgCtx.ocarinaMode = OCARINA_MODE_EVENT; + msgCtx->textBoxType = TEXTBOX_TYPE_0; + } else if (msgCtx->msgMode == MSGMODE_34) { + if (msgCtx->songPlayed == OCARINA_SONG_TERMINA_WALL) { + Message_CloseTextbox(play); + play->msgCtx.ocarinaMode = OCARINA_MODE_EVENT; + Audio_PlaySfx(NA_SE_SY_CORRECT_CHIME); + } else { + Message_CloseTextbox(play); + play->msgCtx.ocarinaMode = OCARINA_MODE_END; + } + } else { + Message_CloseTextbox(play); + play->msgCtx.ocarinaMode = OCARINA_MODE_EVENT; + } + } + Message_DrawText(play, &gfx); + break; + + case MSGMODE_OCARINA_FAIL: + case MSGMODE_SONG_PROMPT_FAIL: + Message_DrawText(play, &gfx); + // fallthrough + case MSGMODE_OCARINA_FAIL_NO_TEXT: + msgCtx->stateTimer--; + if (msgCtx->stateTimer == 0) { + D_801C6A94 = 1; + if (msgCtx->msgMode == MSGMODE_SONG_PROMPT_FAIL) { + Message_ContinueTextbox(play, 0x1B89); + Message_Decode(play); + msgCtx->msgMode = MSGMODE_SONG_PROMPT_NOTES_DROP; + } else { + msgCtx->msgMode = MSGMODE_OCARINA_NOTES_DROP; + } + } + break; + + case MSGMODE_OCARINA_NOTES_DROP: + case MSGMODE_SONG_PROMPT_NOTES_DROP: + for (i = 0; i < 5; i++) { + msgCtx->ocarinaButtonsPosY[i] += D_801C6A94; + } + D_801C6A94 += D_801C6A94; + if (D_801C6A94 >= 0x226) { + Message_ResetOcarinaButtonAlphas(); + if (msgCtx->msgMode == MSGMODE_SONG_PROMPT_NOTES_DROP) { + msgCtx->msgMode = MSGMODE_OCARINA_AWAIT_INPUT; + msgCtx->stateTimer = 10; + } else { + msgCtx->msgMode = MSGMODE_OCARINA_STARTING; + } + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_OFF); + } + break; + + case MSGMODE_SONG_PLAYED: + msgCtx->stateTimer--; + if (msgCtx->stateTimer == 0) { + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_OFF); + Message_Decode(play); + msgCtx->msgMode = MSGMODE_SETUP_DISPLAY_SONG_PLAYED; + msgCtx->ocarinaStaff = AudioOcarina_GetPlayingStaff(); + msgCtx->ocarinaStaff->pos = 0; + sOcarinaButtonIndexBufPos = 0; + Message_ResetOcarinaButtonState(play); + Message_SpawnSongEffect(play); + } + break; + + case MSGMODE_SETUP_DISPLAY_SONG_PLAYED: + Message_DrawText(play, &gfx); + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_DEFAULT); + + if ((msgCtx->ocarinaAction >= OCARINA_ACTION_PROMPT_WIND_FISH_HUMAN) && + (msgCtx->ocarinaAction <= OCARINA_ACTION_PROMPT_WIND_FISH_DEKU)) { + AudioOcarina_SetInstrument(sPlayerFormOcarinaInstruments[CUR_FORM]); + AudioOcarina_SetPlaybackSong(msgCtx->ocarinaAction - OCARINA_ACTION_SCARECROW_LONG_RECORDING, 1); + } else { + AudioOcarina_SetInstrument(sPlayerFormOcarinaInstruments[CUR_FORM]); + AudioOcarina_SetPlaybackSong((u8)msgCtx->songPlayed + 1, 1); + if (msgCtx->songPlayed != OCARINA_SONG_SCARECROW_SPAWN) { + func_801A3000((u16)sOcarinaSongFanfares[msgCtx->songPlayed], + (u8)sOcarinaSongFanfareIoData[CUR_FORM]); + AudioSfx_MuteBanks(0x20); + } + } + play->msgCtx.ocarinaMode = OCARINA_MODE_ACTIVE; + if (msgCtx->ocarinaAction == OCARINA_ACTION_FREE_PLAY) { + msgCtx->ocarinaAction = OCARINA_ACTION_FREE_PLAY_DONE; + } + if (msgCtx->ocarinaAction == OCARINA_ACTION_CHECK_NOTIME) { + msgCtx->ocarinaAction = OCARINA_ACTION_CHECK_NOTIME_DONE; + } + sOcarinaButtonIndexBufPos = 0; + msgCtx->msgMode = MSGMODE_DISPLAY_SONG_PLAYED; + break; + + case MSGMODE_DISPLAY_SONG_PLAYED_TEXT_BEGIN: + if (msgCtx->songPlayed == OCARINA_SONG_SCARECROW_SPAWN) { + Message_ContinueTextbox(play, 0x1B6B); + } else { + Message_ContinueTextbox(play, 0x1B72 + msgCtx->songPlayed); + } + Message_Decode(play); + msgCtx->msgMode = MSGMODE_16; + msgCtx->stateTimer = 20; + Message_DrawText(play, &gfx); + break; + + case MSGMODE_16: + msgCtx->stateTimer--; + if (msgCtx->stateTimer == 0) { + msgCtx->msgMode = MSGMODE_17; + } + Message_DrawText(play, &gfx); + break; + + case MSGMODE_17: + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_OFF); + Message_ResetOcarinaButtonState(play); + msgCtx->msgMode = MSGMODE_18; + msgCtx->stateTimer = 2; + Message_DrawText(play, &gfx); + break; + + case MSGMODE_18: + msgCtx->stateTimer--; + if (msgCtx->stateTimer == 0) { + Message_CloseTextbox(play); + if (msgCtx->songPlayed == OCARINA_SONG_EPONAS) { + gHorsePlayedEponasSong = true; + } + + if (msgCtx->ocarinaAction == OCARINA_ACTION_FREE_PLAY_DONE) { + if (sLastPlayedSong == OCARINA_SONG_ELEGY) { + if ((play->sceneId == SCENE_F40) || (play->sceneId == SCENE_F41) || + (play->sceneId == SCENE_IKANAMAE) || (play->sceneId == SCENE_CASTLE) || + (play->sceneId == SCENE_IKNINSIDE) || (play->sceneId == SCENE_IKANA) || + (play->sceneId == SCENE_INISIE_N) || (play->sceneId == SCENE_INISIE_R) || + (play->sceneId == SCENE_INISIE_BS) || (play->sceneId == SCENE_RANDOM) || + (play->sceneId == SCENE_REDEAD) || (play->sceneId == SCENE_TOUGITES)) { + play->msgCtx.ocarinaMode = OCARINA_MODE_EVENT; + } else { + sLastPlayedSong = 0xFF; + Message_StartTextbox(play, 0x1B95, NULL); + play->msgCtx.ocarinaMode = OCARINA_MODE_PROCESS_RESTRICTED_SONG; + } + } else { + play->msgCtx.ocarinaMode = OCARINA_MODE_EVENT; + if (msgCtx->songPlayed == OCARINA_SONG_SCARECROW_SPAWN) { + play->msgCtx.ocarinaMode = OCARINA_MODE_PLAYED_SCARECROW_SPAWN; + } + } + } else if (msgCtx->ocarinaAction >= OCARINA_ACTION_CHECK_SONATA) { + if ((OCARINA_ACTION_CHECK_SONATA + msgCtx->songPlayed) == msgCtx->ocarinaAction) { + play->msgCtx.ocarinaMode = OCARINA_MODE_EVENT; + } else { + play->msgCtx.ocarinaMode = msgCtx->songPlayed - 1; + } + } else if ((OCARINA_ACTION_PROMPT_SONATA + msgCtx->songPlayed) == msgCtx->ocarinaAction) { + play->msgCtx.ocarinaMode = OCARINA_MODE_EVENT; + } else { + play->msgCtx.ocarinaMode = OCARINA_MODE_END; + } + } + break; + + case MSGMODE_19: + msgCtx->stateTimer--; + if (msgCtx->stateTimer == 0) { + func_80152CAC(play); + sOcarinaButtonIndexBufPos = 0; + msgCtx->msgMode = MSGMODE_SONG_DEMONSTRATION; + } + Message_DrawText(play, &gfx); + break; + + case MSGMODE_DISPLAY_SONG_PLAYED: + case MSGMODE_SONG_DEMONSTRATION: + msgCtx->ocarinaStaff = AudioOcarina_GetPlaybackStaff(); + if (msgCtx->ocarinaStaff->state == 0) { + if ((msgCtx->ocarinaAction == OCARINA_ACTION_DEMONSTRATE_EVAN_PART1_SECOND_HALF) || + (msgCtx->ocarinaAction == OCARINA_ACTION_DEMONSTRATE_EVAN_PART2_SECOND_HALF)) { + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_OFF); + } + if ((msgCtx->ocarinaAction >= OCARINA_ACTION_PROMPT_WIND_FISH_HUMAN) && + (msgCtx->ocarinaAction <= OCARINA_ACTION_PROMPT_WIND_FISH_DEKU)) { + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_OFF); + Message_CloseTextbox(play); + play->msgCtx.ocarinaMode = OCARINA_MODE_END; + } else if (msgCtx->msgMode == MSGMODE_DISPLAY_SONG_PLAYED) { + msgCtx->msgMode = MSGMODE_DISPLAY_SONG_PLAYED_TEXT_BEGIN; + } else { + msgCtx->msgMode = MSGMODE_SONG_DEMONSTRATION_DONE; + } + } else { + if ((sOcarinaButtonIndexBufPos != 0) && (msgCtx->ocarinaStaff->pos == 1)) { + sOcarinaButtonIndexBufPos = 0; + } + + if (((u32)msgCtx->ocarinaStaff->pos != 0) && + (sOcarinaButtonIndexBufPos == (msgCtx->ocarinaStaff->pos - 1))) { + msgCtx->ocarinaButtonIndex = sOcarinaButtonIndexBuf[msgCtx->ocarinaStaff->pos - 1] = + msgCtx->ocarinaStaff->buttonIndex; + sOcarinaButtonIndexBuf[msgCtx->ocarinaStaff->pos] = OCARINA_BTN_INVALID; + sOcarinaButtonIndexBufPos++; + } + } + // fallthrough + case MSGMODE_SONG_DEMONSTRATION_DONE: + Message_DrawText(play, &gfx); + break; + + case MSGMODE_SONG_PROMPT: + case MSGMODE_33: + msgCtx->ocarinaStaff = AudioOcarina_GetPlayingStaff(); + + if (((u32)msgCtx->ocarinaStaff->pos != 0) && + (sOcarinaButtonIndexBufPos == (msgCtx->ocarinaStaff->pos - 1))) { + msgCtx->ocarinaButtonIndex = sOcarinaButtonIndexBuf[msgCtx->ocarinaStaff->pos - 1] = + msgCtx->ocarinaStaff->buttonIndex; + sOcarinaButtonIndexBuf[msgCtx->ocarinaStaff->pos] = OCARINA_BTN_INVALID; + sOcarinaButtonIndexBufPos++; + } + + if (msgCtx->ocarinaStaff->state <= OCARINA_SONG_SCARECROW_SPAWN) { + if ((msgCtx->ocarinaAction == OCARINA_ACTION_PROMPT_EVAN_PART1_SECOND_HALF) || + (msgCtx->ocarinaAction == OCARINA_ACTION_PROMPT_EVAN_PART2_SECOND_HALF)) { + msgCtx->songPlayed = msgCtx->ocarinaStaff->state; + msgCtx->msgMode = MSGMODE_22; + } else { + msgCtx->songPlayed = msgCtx->ocarinaStaff->state; + msgCtx->msgMode = MSGMODE_SONG_PROMPT_SUCCESS; + if (msgCtx->ocarinaStaff->state == OCARINA_SONG_GORON_LULLABY_INTRO) { + Item_Give(play, ITEM_SONG_LULLABY_INTRO); + } else if (!((msgCtx->ocarinaAction >= OCARINA_ACTION_PROMPT_WIND_FISH_HUMAN) && + (msgCtx->ocarinaAction <= OCARINA_ACTION_PROMPT_WIND_FISH_DEKU)) && + (msgCtx->ocarinaStaff->state != OCARINA_SONG_NEW_WAVE)) { + Item_Give(play, + (gOcarinaSongItemMap[msgCtx->ocarinaStaff->state] + ITEM_SONG_SONATA) & 0xFF); + } + } + msgCtx->stateTimer = 20; + Audio_PlaySfx(NA_SE_SY_TRE_BOX_APPEAR); + } else if (msgCtx->ocarinaStaff->state == OCARINA_SONG_TERMINA_WALL) { + msgCtx->songPlayed = msgCtx->ocarinaStaff->state; + msgCtx->msgMode = MSGMODE_34; + Item_Give(play, (gOcarinaSongItemMap[msgCtx->ocarinaStaff->state] + ITEM_SONG_SONATA) & 0xFF); + msgCtx->stateTimer = 20; + AudioOcarina_SetOcarinaDisableTimer(0, 20); + Audio_PlaySfx(NA_SE_SY_TRE_BOX_APPEAR); + } else if (msgCtx->ocarinaStaff->state == 0xFF) { + Audio_PlaySfx(NA_SE_SY_OCARINA_ERROR); + msgCtx->stateTimer = 10; + if (msgCtx->msgMode == MSGMODE_SONG_PROMPT) { + msgCtx->msgMode = MSGMODE_SONG_PROMPT_FAIL; + } else { + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_OFF); + play->msgCtx.ocarinaMode = OCARINA_MODE_END; + Message_CloseTextbox(play); + } + } + Message_DrawText(play, &gfx); + break; + + case MSGMODE_OCARINA_AWAIT_INPUT: + Message_DrawText(play, &gfx); + if ((msgCtx->ocarinaAction == OCARINA_ACTION_PROMPT_EVAN_PART1_SECOND_HALF) || + (msgCtx->ocarinaAction == OCARINA_ACTION_PROMPT_EVAN_PART2_SECOND_HALF)) { + msgCtx->stateTimer--; + if (msgCtx->stateTimer == 0) { + msgCtx->msgMode = MSGMODE_21; + msgCtx->textBoxType = TEXTBOX_TYPE_0; + } + } + break; + + case MSGMODE_SCARECROW_LONG_RECORDING_START: + AudioOcarina_SetRecordingState(OCARINA_RECORD_SCARECROW_LONG); + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_DEFAULT); + msgCtx->ocarinaStaff = AudioOcarina_GetRecordingStaff(); + msgCtx->ocarinaStaff->pos = 0; + sOcarinaButtonIndexBufPos = 0; + sOcarinaButtonIndexBufLen = 0; + Message_ResetOcarinaButtonState(play); + msgCtx->msgMode = MSGMODE_SCARECROW_LONG_RECORDING_ONGOING; + Message_DrawText(play, &gfx); + break; + + case MSGMODE_SCARECROW_LONG_RECORDING_ONGOING: + msgCtx->ocarinaStaff = AudioOcarina_GetRecordingStaff(); + + if (((u32)msgCtx->ocarinaStaff->pos != 0) && + (sOcarinaButtonIndexBufPos == (msgCtx->ocarinaStaff->pos - 1))) { + + if (sOcarinaButtonIndexBufLen >= 8) { + for (buttonIndexPos = sOcarinaButtonIndexBufLen - 8, i = 0; i < 8; i++, buttonIndexPos++) { + sOcarinaButtonIndexBuf[buttonIndexPos] = sOcarinaButtonIndexBuf[buttonIndexPos + 1]; + } + sOcarinaButtonIndexBufLen--; + } + + msgCtx->ocarinaButtonIndex = sOcarinaButtonIndexBuf[sOcarinaButtonIndexBufLen] = + msgCtx->ocarinaStaff->buttonIndex; + sOcarinaButtonIndexBufLen++; + sOcarinaButtonIndexBuf[sOcarinaButtonIndexBufLen] = OCARINA_BTN_INVALID; + sOcarinaButtonIndexBufPos++; + if (msgCtx->ocarinaStaff) {} + if (msgCtx->ocarinaStaff->pos == 8) { + sOcarinaButtonIndexBufPos = 0; + } + } + Message_DrawText(play, &gfx); + break; + + case MSGMODE_SCARECROW_LONG_DEMONSTRATION: + case MSGMODE_SCARECROW_SPAWN_DEMONSTRATION: + msgCtx->ocarinaStaff = AudioOcarina_GetPlaybackStaff(); + + if (((u32)msgCtx->ocarinaStaff->pos != 0) && + (sOcarinaButtonIndexBufPos == (msgCtx->ocarinaStaff->pos - 1))) { + if (sOcarinaButtonIndexBufLen >= 8) { + for (buttonIndexPos = sOcarinaButtonIndexBufLen - 8, i = 0; i < 8; i++, buttonIndexPos++) { + sOcarinaButtonIndexBuf[buttonIndexPos] = sOcarinaButtonIndexBuf[buttonIndexPos + 1]; + } + sOcarinaButtonIndexBufLen--; + } + sOcarinaButtonIndexBuf[sOcarinaButtonIndexBufLen] = msgCtx->ocarinaStaff->buttonIndex; + sOcarinaButtonIndexBufLen++; + sOcarinaButtonIndexBuf[sOcarinaButtonIndexBufLen] = OCARINA_BTN_INVALID; + sOcarinaButtonIndexBufPos++; + if (msgCtx->ocarinaStaff->pos == 8) { + sOcarinaButtonIndexBufLen = sOcarinaButtonIndexBufPos = 0; + } + } + + if (msgCtx->stateTimer == 0) { + if (msgCtx->ocarinaStaff->state == 0) { + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_OFF); + play->msgCtx.ocarinaMode = OCARINA_MODE_11; + Message_CloseTextbox(play); + } + } else { + msgCtx->stateTimer--; + } + break; + + case MSGMODE_SCARECROW_SPAWN_RECORDING_START: + AudioOcarina_SetRecordingState(OCARINA_RECORD_SCARECROW_SPAWN); + AudioOcarina_SetInstrument(sPlayerFormOcarinaInstruments[CUR_FORM]); + msgCtx->msgMode = MSGMODE_SCARECROW_SPAWN_RECORDING_ONGOING; + Message_DrawText(play, &gfx); + break; + + case MSGMODE_SCARECROW_SPAWN_RECORDING_ONGOING: + msgCtx->ocarinaStaff = AudioOcarina_GetRecordingStaff(); + if ((u32)msgCtx->ocarinaStaff->pos != 0) { + if (sOcarinaButtonIndexBufPos == (msgCtx->ocarinaStaff->pos - 1)) { + msgCtx->ocarinaButtonIndex = sOcarinaButtonIndexBuf[sOcarinaButtonIndexBufPos] = + msgCtx->ocarinaStaff->buttonIndex; + sOcarinaButtonIndexBufPos++; + sOcarinaButtonIndexBuf[sOcarinaButtonIndexBufPos] = OCARINA_BTN_INVALID; + } + } + + if (msgCtx->ocarinaStaff->state == 0) { + msgCtx->stateTimer = 20; + gSaveContext.save.saveInfo.scarecrowSpawnSongSet = true; + msgCtx->msgMode = MSGMODE_SCARECROW_SPAWN_RECORDING_DONE; + Audio_PlaySfx(NA_SE_SY_TRE_BOX_APPEAR); + Lib_MemCpy(gSaveContext.save.saveInfo.scarecrowSpawnSong, gScarecrowSpawnSongPtr, + sizeof(gSaveContext.save.saveInfo.scarecrowSpawnSong)); + for (i = 0; i < ARRAY_COUNT(gSaveContext.save.saveInfo.scarecrowSpawnSong); i++) { + // osSyncPrintf("%d, ", gSaveContext.scarecrowSpawnSong[i]); + } + } else if (msgCtx->ocarinaStaff->state == 0xFF) { + AudioOcarina_SetRecordingState(OCARINA_RECORD_OFF); + Audio_PlaySfx(NA_SE_SY_OCARINA_ERROR); + Message_CloseTextbox(play); + msgCtx->msgMode = MSGMODE_SCARECROW_SPAWN_RECORDING_FAILED; + } + Message_DrawText(play, &gfx); + break; + + case MSGMODE_SCARECROW_SPAWN_RECORDING_FAILED: + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_OFF); + Message_StartTextbox(play, 0x1647, NULL); + play->msgCtx.ocarinaMode = OCARINA_MODE_END; + break; + + case MSGMODE_2F: + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_DEFAULT); + msgCtx->ocarinaStaff = AudioOcarina_GetPlayingStaff(); + msgCtx->ocarinaStaff->pos = 0; + sOcarinaButtonIndexBufPos = 0; + play->msgCtx.ocarinaMode = OCARINA_MODE_ACTIVE; + Message_ResetOcarinaButtonState(play); + AudioOcarina_StartDefault(msgCtx->ocarinaAvailableSongs | 0xC0000000); + msgCtx->msgMode = MSGMODE_30; + break; + + case MSGMODE_30: + msgCtx->ocarinaStaff = AudioOcarina_GetPlayingStaff(); + if (((u32)msgCtx->ocarinaStaff->pos != 0) && + (sOcarinaButtonIndexBufPos == (msgCtx->ocarinaStaff->pos - 1))) { + msgCtx->ocarinaButtonIndex = msgCtx->ocarinaStaff->buttonIndex; + msgCtx->ocarinaStaff->pos = 0; + sOcarinaButtonIndexBufPos = 0; + Message_ResetOcarinaButtonState(play); + msgCtx->msgMode = MSGMODE_31; + } + break; + + case MSGMODE_35: + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_DEFAULT); + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_DEFAULT); + msgCtx->ocarinaStaff = AudioOcarina_GetPlayingStaff(); + msgCtx->ocarinaStaff->pos = 0; + sOcarinaButtonIndexBufPos = 0; + play->msgCtx.ocarinaMode = OCARINA_MODE_ACTIVE; + Message_ResetOcarinaButtonState(play); + sOcarinaButtonFlashColorIndex = 1; + sOcarinaButtonFlashTimer = 3; + AudioOcarina_StartWithSongNoteLengths( + (1 << ((msgCtx->ocarinaAction - OCARINA_ACTION_TIMED_PROMPT_SONATA) & 0xFFFF)) | 0x80000000); + msgCtx->msgMode = MSGMODE_36; + Message_DrawText(play, &gfx); + break; + + case MSGMODE_36: + msgCtx->ocarinaStaff = AudioOcarina_GetPlayingStaff(); + + if ((u32)msgCtx->ocarinaStaff->pos != 0) { + if (sOcarinaButtonIndexBufPos == (msgCtx->ocarinaStaff->pos - 1)) { + sOcarinaButtonIndexBuf[msgCtx->ocarinaStaff->pos - 1] = msgCtx->ocarinaStaff->buttonIndex; + sOcarinaButtonIndexBuf[msgCtx->ocarinaStaff->pos] = OCARINA_BTN_INVALID; + sOcarinaButtonIndexBufPos++; + } + } + + if (msgCtx->ocarinaStaff->state <= OCARINA_SONG_SCARECROW_SPAWN) { + msgCtx->songPlayed = msgCtx->ocarinaStaff->state; + msgCtx->msgMode = MSGMODE_37; + Item_Give(play, (gOcarinaSongItemMap[msgCtx->ocarinaStaff->state] + ITEM_SONG_SONATA) & 0xFF); + msgCtx->stateTimer = 20; + Audio_PlaySfx(NA_SE_SY_TRE_BOX_APPEAR); + } else if (msgCtx->ocarinaStaff->state == 0xFF) { + ocarinaError = func_8019B5AC(); + if (ocarinaError == OCARINA_ERROR_2) { + Audio_PlaySfx(NA_SE_SY_OCARINA_ERROR); + D_801C6A94 = 1; + msgCtx->msgMode = MSGMODE_3B; + } else if (ocarinaError == OCARINA_ERROR_3) { + Audio_PlaySfx(NA_SE_SY_OCARINA_ERROR); + D_801C6A94 = 1; + msgCtx->msgMode = MSGMODE_3E; + } else { + Audio_PlaySfx(NA_SE_SY_OCARINA_ERROR); + D_801C6A94 = 1; + msgCtx->msgMode = MSGMODE_38; + } + } + Message_DrawText(play, &gfx); + break; + + case MSGMODE_37: + Message_FlashOcarinaButtons(); + Message_DrawText(play, &gfx); + break; + + case MSGMODE_38: + case MSGMODE_3B: + case MSGMODE_3E: + // notes drop + for (i = 0; i < 5; i++) { + msgCtx->ocarinaButtonsPosY[i] += D_801C6A94; + } + + D_801C6A94 += D_801C6A94; + if (D_801C6A94 >= 0x226) { + Message_ResetOcarinaButtonAlphas(); + msgCtx->textBoxType = TEXTBOX_TYPE_0; + msgCtx->textboxColorRed = msgCtx->textboxColorGreen = msgCtx->textboxColorBlue = 0; + msgCtx->stateTimer = 3; + msgCtx->msgMode++; + } + break; + + case MSGMODE_39: + case MSGMODE_3C: + case MSGMODE_3F: + msgCtx->stateTimer--; + if (msgCtx->stateTimer == 0) { + msgCtx->msgMode++; + } + break; + + case MSGMODE_TEXT_DONE: + switch (msgCtx->textboxEndType) { + case TEXTBOX_ENDTYPE_60: + temp_v0_33 = msgCtx->unk120BE; + temp = msgCtx->unk11FFA + (msgCtx->unk11FFC * temp_v0_33); + func_80147F18(play, &gfx, + msgCtx->unk11F1A[temp_v0_33] + + (s32)(16.0f * msgCtx->textCharScale * (msgCtx->unk120C2 + 5)) - 1, + temp); + func_80148D64(play); + break; + + case TEXTBOX_ENDTYPE_61: + temp_v0_33 = msgCtx->unk120BE; + temp = msgCtx->unk11FFA + (msgCtx->unk11FFC * temp_v0_33); + func_80148558(play, &gfx, + msgCtx->unk11F1A[temp_v0_33] + (s32)(16.0f * msgCtx->textCharScale * 5.0f) - 1, + temp); + func_80149048(play); + break; + + case TEXTBOX_ENDTYPE_62: + temp_v0_33 = msgCtx->unk120BE; + temp = msgCtx->unk11FFA + (msgCtx->unk11FFC * temp_v0_33); + func_80147F18(play, &gfx, + msgCtx->unk11F1A[temp_v0_33] + + (s32)(16.0f * msgCtx->textCharScale * (msgCtx->unk120C2 + 5)) - 1, + temp); + func_801491DC(play); + break; + + case TEXTBOX_ENDTYPE_63: + temp_v0_33 = msgCtx->unk120BE; + temp = msgCtx->unk11FFA + (msgCtx->unk11FFC * temp_v0_33); + func_80147F18(play, &gfx, + msgCtx->unk11F1A[temp_v0_33] + + (s32)(16.0f * msgCtx->textCharScale * (msgCtx->unk120C2 + 5)) - 1, + temp); + func_80149454(play); + break; + + case TEXTBOX_ENDTYPE_64: + temp_v0_33 = msgCtx->unk120BE; + temp = msgCtx->unk11FFA + (msgCtx->unk11FFC * temp_v0_33); + func_80147F18(play, &gfx, + msgCtx->unk11F1A[temp_v0_33] + + (s32)(16.0f * msgCtx->textCharScale * (msgCtx->unk120C2 + 4)) - 6, + temp); + func_801496C8(play); + break; + + default: + break; + } + + gDPPipeSync(gfx++); + gDPSetCombineLERP(gfx++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE, TEXEL0, 0, + PRIMITIVE, 0); + gDPSetEnvColor(gfx++, 0, 0, 0, 255); + Message_DrawText(play, &gfx); + + switch (msgCtx->textboxEndType) { + case TEXTBOX_ENDTYPE_10: + func_80148CBC(play, &gfx, 1); + break; + + case TEXTBOX_ENDTYPE_11: + func_80148CBC(play, &gfx, 2); + break; + + case TEXTBOX_ENDTYPE_12: + func_80148CBC(play, &gfx, 1); + break; + + case TEXTBOX_ENDTYPE_30: + case TEXTBOX_ENDTYPE_41: + case TEXTBOX_ENDTYPE_50: + case TEXTBOX_ENDTYPE_52: + case TEXTBOX_ENDTYPE_55: + case TEXTBOX_ENDTYPE_56: + case TEXTBOX_ENDTYPE_57: + case TEXTBOX_ENDTYPE_62: + break; + + case TEXTBOX_ENDTYPE_40: + case TEXTBOX_ENDTYPE_60: + case TEXTBOX_ENDTYPE_61: + default: + Message_DrawTextboxIcon(play, &gfx, 158, + (s16)(D_801D03A8[msgCtx->textBoxType] + msgCtx->textboxYTarget)); + break; + + case TEXTBOX_ENDTYPE_42: + Message_DrawTextboxIcon(play, &gfx, 158, + (s16)(D_801D03A8[msgCtx->textBoxType] + msgCtx->textboxYTarget)); + break; + } + break; + + case MSGMODE_SCENE_TITLE_CARD_FADE_IN_BACKGROUND: + case MSGMODE_SCENE_TITLE_CARD_FADE_IN_TEXT: + case MSGMODE_SCENE_TITLE_CARD_DISPLAYING: + case MSGMODE_SCENE_TITLE_CARD_FADE_OUT_TEXT: + case MSGMODE_SCENE_TITLE_CARD_FADE_OUT_BACKGROUND: + Message_DrawSceneTitleCard(play, &gfx); + break; + + case MSGMODE_21: + case MSGMODE_23: + case MSGMODE_31: + case MSGMODE_3A: + case MSGMODE_3D: + case MSGMODE_40: + case MSGMODE_TEXT_CLOSING: + case MSGMODE_PAUSED: + break; + + case MSGMODE_24: + case MSGMODE_25: + case MSGMODE_26: + default: + msgCtx->msgMode = MSGMODE_TEXT_DISPLAYING; + break; + } + } + Message_DrawOcarinaButtons(play, &gfx); + *gfxP = gfx; +} void Message_Draw(PlayState* play) { Gfx* nextDisplayList; @@ -567,7 +5112,7 @@ void Message_Draw(PlayState* play) { gSPDisplayList(OVERLAY_DISP++, nextDisplayList); if ((play->msgCtx.currentTextId != 0x5E6) || !Play_InCsMode(play)) { - func_801541D4(play, &nextDisplayList); + Message_DrawMain(play, &nextDisplayList); } gSPEndDisplayList(nextDisplayList++); @@ -576,9 +5121,890 @@ void Message_Draw(PlayState* play) { CLOSE_DISPS(gfxCtx); } -#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/Message_Update.s") +s16 sTextboxXPositions[TEXTBOX_TYPE_MAX] = { + 34, // TEXTBOX_TYPE_0 + 34, // TEXTBOX_TYPE_1 + 34, // TEXTBOX_TYPE_2 + 34, // TEXTBOX_TYPE_3 + 34, // TEXTBOX_TYPE_4 + 34, // TEXTBOX_TYPE_5 + 34, // TEXTBOX_TYPE_6 + 34, // TEXTBOX_TYPE_7 + 34, // TEXTBOX_TYPE_8 + 34, // TEXTBOX_TYPE_9 + 34, // TEXTBOX_TYPE_A + 34, // TEXTBOX_TYPE_B + 34, // TEXTBOX_TYPE_C + 34, // TEXTBOX_TYPE_D + 34, // TEXTBOX_TYPE_E + 34, // TEXTBOX_TYPE_F +}; -void func_801586A4(PlayState* play) { +s16 sTextboxLowerYPositions[] = { + 142, // TEXTBOX_TYPE_0 + 142, // TEXTBOX_TYPE_1 + 142, // TEXTBOX_TYPE_2 + 142, // TEXTBOX_TYPE_3 + 174, // TEXTBOX_TYPE_4 + 142, // TEXTBOX_TYPE_5 + 142, // TEXTBOX_TYPE_6 + 142, // TEXTBOX_TYPE_7 + 142, // TEXTBOX_TYPE_8 + 130, // TEXTBOX_TYPE_9 + 174, // TEXTBOX_TYPE_A + 0, // TEXTBOX_TYPE_B + 142, // TEXTBOX_TYPE_C + 142, // TEXTBOX_TYPE_D + 142, // TEXTBOX_TYPE_E + 142, // TEXTBOX_TYPE_F +}; + +s16 sTextboxUpperYPositions[] = { + 38, // TEXTBOX_TYPE_0 + 38, // TEXTBOX_TYPE_1 + 38, // TEXTBOX_TYPE_2 + 38, // TEXTBOX_TYPE_3 + 174, // TEXTBOX_TYPE_4 + 38, // TEXTBOX_TYPE_5 + 38, // TEXTBOX_TYPE_6 + 38, // TEXTBOX_TYPE_7 + 38, // TEXTBOX_TYPE_8 + 60, // TEXTBOX_TYPE_9 + 174, // TEXTBOX_TYPE_A + 0, // TEXTBOX_TYPE_B + 38, // TEXTBOX_TYPE_C + 38, // TEXTBOX_TYPE_D + 38, // TEXTBOX_TYPE_E + 38, // TEXTBOX_TYPE_F +}; + +s16 sTextboxMidYPositions[] = { + 90, // TEXTBOX_TYPE_0 + 90, // TEXTBOX_TYPE_1 + 90, // TEXTBOX_TYPE_2 + 90, // TEXTBOX_TYPE_3 + 174, // TEXTBOX_TYPE_4 + 90, // TEXTBOX_TYPE_5 + 90, // TEXTBOX_TYPE_6 + 90, // TEXTBOX_TYPE_7 + 90, // TEXTBOX_TYPE_8 + 90, // TEXTBOX_TYPE_9 + 174, // TEXTBOX_TYPE_A + 0, // TEXTBOX_TYPE_B + 90, // TEXTBOX_TYPE_C + 90, // TEXTBOX_TYPE_D + 90, // TEXTBOX_TYPE_E + 90, // TEXTBOX_TYPE_F +}; + +s16 D_801D0448[] = { 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25 }; + +s16 D_801D045C[] = { + 0x1B91, + 0x1B90, + 0x1B8F, +}; +s16 D_801D0464[] = { + 0x1B92, + 0x1B8E, +}; + +#ifdef NON_MATCHING +// Down to a single compiler-managed stack variable +// Also contains in-function data +// https://decomp.me/scratch/QcQ0a +void Message_Update(PlayState* play) { + static u8 D_801D0468 = 0; + MessageContext* msgCtx = &play->msgCtx; + SramContext* sramCtx = &play->sramCtx; // Optional + PauseContext* pauseCtx = &play->pauseCtx; + InterfaceContext* interfaceCtx = &play->interfaceCtx; + Input* input = CONTROLLER1(&play->state); + s16 averageY; + s16 sp50; + u16 temp_v1_2; + s16 sp4C; + s16 sp4A; + s16 sp48; + s32 sp44; + s32 sp40; + u16 sp3E; + s16 var_v1; + u16 temp; + + msgCtx->stickAdjX = input->rel.stick_x; + msgCtx->stickAdjY = input->rel.stick_y; + + averageY = 0; + + // If stickAdj is held, set a delay to allow the cursor to read the next input. + // The first delay is given a longer time than all subsequent delays. + if (msgCtx->stickAdjX < -30) { + if (msgCtx->stickXRepeatState == -1) { + msgCtx->stickXRepeatTimer--; + if (msgCtx->stickXRepeatTimer < 0) { + // Allow the input to register and apply the delay for all subsequent repeated inputs + msgCtx->stickXRepeatTimer = 2; + } else { + // Cancel the current input + msgCtx->stickAdjX = 0; + } + } else { + // Allow the input to register and apply the delay for the first repeated input + msgCtx->stickXRepeatTimer = 10; + msgCtx->stickXRepeatState = -1; + } + } else if (msgCtx->stickAdjX > 30) { + if (msgCtx->stickXRepeatState == 1) { + msgCtx->stickXRepeatTimer--; + if (msgCtx->stickXRepeatTimer < 0) { + // Allow the input to register and apply the delay for all subsequent repeated inputs + msgCtx->stickXRepeatTimer = 2; + } else { + // Cancel the current input + msgCtx->stickAdjX = 0; + } + } else { + // Allow the input to register and apply the delay for the first repeated input + msgCtx->stickXRepeatTimer = 10; + msgCtx->stickXRepeatState = 1; + } + } else { + msgCtx->stickXRepeatState = 0; + } + + if (msgCtx->stickAdjY < -30) { + if (msgCtx->stickYRepeatState == -1) { + msgCtx->stickYRepeatTimer--; + if (msgCtx->stickYRepeatTimer < 0) { + // Allow the input to register and apply the delay for all subsequent repeated inputs + msgCtx->stickYRepeatTimer = 2; + } else { + // Cancel the current input + msgCtx->stickAdjY = 0; + } + } else { + // Allow the input to register and apply the delay for the first repeated input + msgCtx->stickYRepeatTimer = 10; + msgCtx->stickYRepeatState = -1; + } + } else if (msgCtx->stickAdjY > 30) { + if (msgCtx->stickYRepeatState == 1) { + msgCtx->stickYRepeatTimer--; + if (msgCtx->stickYRepeatTimer < 0) { + // Allow the input to register and apply the delay for all subsequent repeated inputs + msgCtx->stickYRepeatTimer = 2; + } else { + // Cancel the current input + msgCtx->stickAdjY = 0; + } + } else { + // Allow the input to register and apply the delay for the first repeated input + msgCtx->stickYRepeatTimer = 10; + msgCtx->stickYRepeatState = 1; + } + } else { + msgCtx->stickYRepeatState = 0; + } + + if (msgCtx->msgLength == 0) { + return; + } + + switch (msgCtx->msgMode) { + case MSGMODE_TEXT_START: + D_801C6A70++; + + temp = false; + if ((D_801C6A70 >= 4) || ((msgCtx->talkActor == NULL) && (D_801C6A70 >= 2))) { + temp = true; + } + if (temp) { + if (msgCtx->talkActor != NULL) { + Actor_GetScreenPos(play, &GET_PLAYER(play)->actor, &sp50, &sp4C); + Actor_GetScreenPos(play, msgCtx->talkActor, &sp50, &sp4A); + if (sp4C >= sp4A) { + averageY = ((sp4C - sp4A) / 2) + sp4A; + } else { + averageY = ((sp4A - sp4C) / 2) + sp4C; + } + } else { + msgCtx->textboxX = msgCtx->textboxXTarget; + msgCtx->textboxY = msgCtx->textboxYTarget; + } + + var_v1 = msgCtx->textBoxType; + + if ((u32)msgCtx->textBoxPos == 0) { + if ((play->sceneId == SCENE_UNSET_04) || (play->sceneId == SCENE_UNSET_05) || + (play->sceneId == SCENE_UNSET_06)) { + if (averageY < 0x64) { + msgCtx->textboxYTarget = sTextboxLowerYPositions[var_v1]; + } else { + msgCtx->textboxYTarget = sTextboxUpperYPositions[var_v1]; + } + } else { + if (averageY < 0xA0) { + msgCtx->textboxYTarget = sTextboxLowerYPositions[var_v1]; + } else { + msgCtx->textboxYTarget = sTextboxUpperYPositions[var_v1]; + } + } + } else if (msgCtx->textBoxPos == 1) { + msgCtx->textboxYTarget = sTextboxUpperYPositions[var_v1]; + } else if (msgCtx->textBoxPos == 2) { + msgCtx->textboxYTarget = sTextboxMidYPositions[var_v1]; + } else if (msgCtx->textBoxPos == 7) { + msgCtx->textboxYTarget = 0x9E; + } else { + msgCtx->textboxYTarget = sTextboxLowerYPositions[var_v1]; + } + + msgCtx->textboxXTarget = sTextboxXPositions[var_v1]; + + if ((gSaveContext.options.language == LANGUAGE_JPN) && !msgCtx->textIsCredits) { + msgCtx->unk11FFE[0] = (s16)(msgCtx->textboxYTarget + 7); + msgCtx->unk11FFE[1] = (s16)(msgCtx->textboxYTarget + 0x19); + msgCtx->unk11FFE[2] = (s16)(msgCtx->textboxYTarget + 0x2B); + } else { + msgCtx->unk11FFE[0] = (s16)(msgCtx->textboxYTarget + 0x14); + msgCtx->unk11FFE[1] = (s16)(msgCtx->textboxYTarget + 0x20); + msgCtx->unk11FFE[2] = (s16)(msgCtx->textboxYTarget + 0x2C); + } + + if ((msgCtx->textBoxType == TEXTBOX_TYPE_4) || (msgCtx->textBoxType == TEXTBOX_TYPE_5)) { + msgCtx->msgMode = MSGMODE_TEXT_STARTING; + msgCtx->textboxX = msgCtx->textboxXTarget; + msgCtx->textboxY = msgCtx->textboxYTarget; + msgCtx->unk12008 = 0x100; + msgCtx->unk1200A = 0x40; + msgCtx->unk1200C = 0x200; + msgCtx->unk1200E = 0x200; + break; + } + + Message_GrowTextbox(play); + Audio_PlaySfx_IfNotInCutscene(NA_SE_NONE); + msgCtx->stateTimer = 0; + msgCtx->msgMode = MSGMODE_TEXT_BOX_GROWING; + + if (!pauseCtx->itemDescriptionOn) { + func_80150A84(play); + } + } + break; + + case MSGMODE_TEXT_BOX_GROWING: + Message_GrowTextbox(play); + break; + + case MSGMODE_TEXT_STARTING: + msgCtx->msgMode = MSGMODE_TEXT_NEXT_MSG; + if (!pauseCtx->itemDescriptionOn) { + if (msgCtx->currentTextId == 0xFF) { + func_8011552C(play, DO_ACTION_STOP); + } else if (msgCtx->currentTextId != 0xF8) { + func_8011552C(play, DO_ACTION_NEXT); + } + } + break; + + case MSGMODE_TEXT_NEXT_MSG: + Message_Decode(play); + if (msgCtx->textFade) { + Interface_SetHudVisibility(HUD_VISIBILITY_NONE); + } + if (D_801D0468 != 0) { + msgCtx->textDrawPos = msgCtx->decodedTextLen; + D_801D0468 = 0; + } + break; + + case MSGMODE_TEXT_CONTINUING: + msgCtx->stateTimer--; + if (msgCtx->stateTimer == 0) { + Message_Decode(play); + } + break; + + case MSGMODE_TEXT_DISPLAYING: + if (msgCtx->textBoxType != TEXTBOX_TYPE_4) { + if (CHECK_BTN_ALL(input->press.button, BTN_B) && !msgCtx->textUnskippable) { + msgCtx->textboxSkipped = true; + msgCtx->textDrawPos = msgCtx->decodedTextLen; + } else if (CHECK_BTN_ALL(input->press.button, BTN_A) && !msgCtx->textUnskippable) { + + while (true) { + temp_v1_2 = msgCtx->decodedBuffer.wchar[msgCtx->textDrawPos]; + if ((temp_v1_2 == 0x10) || (temp_v1_2 == 0x12) || (temp_v1_2 == 0x1B) || (temp_v1_2 == 0x1C) || + (temp_v1_2 == 0x1D) || (temp_v1_2 == 0x19) || (temp_v1_2 == 0xE0) || (temp_v1_2 == 0xBF) || + (temp_v1_2 == 0x15) || (temp_v1_2 == 0x1A)) { + break; + } + msgCtx->textDrawPos++; + } + } + } else if (CHECK_BTN_ALL(input->press.button, BTN_A) && (msgCtx->textUnskippable == 0)) { + while (true) { + temp_v1_2 = msgCtx->decodedBuffer.wchar[msgCtx->textDrawPos]; + if ((temp_v1_2 == 0x10) || (temp_v1_2 == 0x12) || (temp_v1_2 == 0x1B) || (temp_v1_2 == 0x1C) || + (temp_v1_2 == 0x1D) || (temp_v1_2 == 0x19) || (temp_v1_2 == 0xE0) || (temp_v1_2 == 0xBF) || + (temp_v1_2 == 0x15) || (temp_v1_2 == 0x1A)) { + break; + } + msgCtx->textDrawPos++; + } + } + break; + + case MSGMODE_TEXT_AWAIT_INPUT: + if (Message_ShouldAdvance(play)) { + msgCtx->msgMode = MSGMODE_TEXT_DISPLAYING; + msgCtx->textDrawPos++; + } + break; + + case MSGMODE_TEXT_DELAYED_BREAK: + msgCtx->stateTimer--; + if (msgCtx->stateTimer == 0) { + msgCtx->msgMode = MSGMODE_TEXT_NEXT_MSG; + } + break; + + case MSGMODE_TEXT_AWAIT_NEXT: + if (Message_ShouldAdvance(play)) { + msgCtx->msgMode = MSGMODE_TEXT_NEXT_MSG; + msgCtx->msgBufPos++; + } + break; + + case MSGMODE_TEXT_DONE: + if ((msgCtx->textboxEndType == TEXTBOX_ENDTYPE_50) || (msgCtx->textboxEndType == TEXTBOX_ENDTYPE_52)) { + msgCtx->stateTimer--; + if ((msgCtx->stateTimer == 0) || + ((msgCtx->textboxEndType == TEXTBOX_ENDTYPE_52) && Message_ShouldAdvance(play))) { + if (msgCtx->nextTextId != 0xFFFF) { + Audio_PlaySfx(NA_SE_SY_MESSAGE_PASS); + Message_ContinueTextbox(play, msgCtx->nextTextId); + } else if (msgCtx->bombersNotebookEventQueueCount != 0) { + if (Message_BombersNotebookProcessEventQueue(play) == 0) { + Message_CloseTextbox(play); + } + } else { + Message_CloseTextbox(play); + } + } + } else { + if ((msgCtx->textboxEndType == TEXTBOX_ENDTYPE_30) || (msgCtx->textboxEndType == TEXTBOX_ENDTYPE_40) || + (msgCtx->textboxEndType == TEXTBOX_ENDTYPE_42) || (msgCtx->textboxEndType == TEXTBOX_ENDTYPE_41)) { + return; + } + + switch (msgCtx->textboxEndType) { + case TEXTBOX_ENDTYPE_55: + msgCtx->textColorAlpha += 20; + if (msgCtx->textColorAlpha >= 255) { + msgCtx->textColorAlpha = 255; + msgCtx->textboxEndType = TEXTBOX_ENDTYPE_56; + } + break; + + case TEXTBOX_ENDTYPE_56: + msgCtx->stateTimer--; + if (msgCtx->stateTimer == 0) { + msgCtx->textboxEndType = TEXTBOX_ENDTYPE_57; + } + break; + + case TEXTBOX_ENDTYPE_57: + msgCtx->textColorAlpha -= 20; + if (msgCtx->textColorAlpha <= 0) { + msgCtx->textColorAlpha = 0; + if (msgCtx->nextTextId != 0xFFFF) { + Audio_PlaySfx(NA_SE_SY_MESSAGE_PASS); + Message_ContinueTextbox(play, msgCtx->nextTextId); + return; + } + if (msgCtx->bombersNotebookEventQueueCount != 0) { + if (Message_BombersNotebookProcessEventQueue(play) == 0) { + Message_CloseTextbox(play); + return; + } + } else { + Message_CloseTextbox(play); + return; + } + } + break; + + case TEXTBOX_ENDTYPE_10: + Message_HandleChoiceSelection(play, 1); + break; + + case TEXTBOX_ENDTYPE_11: + Message_HandleChoiceSelection(play, 2); + break; + + case TEXTBOX_ENDTYPE_12: + Message_HandleChoiceSelection(play, 1); + break; + + default: + break; + } + + if ((msgCtx->textboxEndType == TEXTBOX_ENDTYPE_10) && + (play->msgCtx.ocarinaMode == OCARINA_MODE_ACTIVE)) { + if (Message_ShouldAdvance(play)) { + if (msgCtx->choiceIndex == 0) { + play->msgCtx.ocarinaMode = OCARINA_MODE_WARP; + } else { + play->msgCtx.ocarinaMode = OCARINA_MODE_END; + } + Message_CloseTextbox(play); + } + } else if ((msgCtx->textboxEndType == TEXTBOX_ENDTYPE_10) && + (play->msgCtx.ocarinaMode == OCARINA_MODE_PROCESS_SOT)) { + if (Message_ShouldAdvance(play)) { + if (msgCtx->choiceIndex == 0) { + Audio_PlaySfx_MessageDecide(); + msgCtx->msgMode = MSGMODE_NEW_CYCLE_0; + msgCtx->decodedTextLen -= 3; + msgCtx->unk120D6 = 0; + msgCtx->unk120D4 = 0; + } else { + Audio_PlaySfx_MessageCancel(); + play->msgCtx.ocarinaMode = OCARINA_MODE_END; + Message_CloseTextbox(play); + } + } + } else if ((msgCtx->textboxEndType == TEXTBOX_ENDTYPE_10) && + (play->msgCtx.ocarinaMode == OCARINA_MODE_PROCESS_INVERTED_TIME)) { + if (Message_ShouldAdvance(play)) { + if (msgCtx->choiceIndex == 0) { + Audio_PlaySfx_MessageDecide(); + if (gSaveContext.save.timeSpeedOffset == 0) { + play->msgCtx.ocarinaMode = OCARINA_MODE_APPLY_INV_SOT_SLOW; + gSaveContext.save.timeSpeedOffset = -2; + } else { + play->msgCtx.ocarinaMode = OCARINA_MODE_APPLY_INV_SOT_FAST; + gSaveContext.save.timeSpeedOffset = 0; + } + Message_CloseTextbox(play); + } else { + Audio_PlaySfx_MessageCancel(); + play->msgCtx.ocarinaMode = OCARINA_MODE_END; + Message_CloseTextbox(play); + } + } + } else if ((msgCtx->textboxEndType == TEXTBOX_ENDTYPE_10) && + (play->msgCtx.ocarinaMode == OCARINA_MODE_PROCESS_DOUBLE_TIME)) { + if (Message_ShouldAdvance(play)) { + if (msgCtx->choiceIndex == 0) { + Audio_PlaySfx_MessageDecide(); + if (gSaveContext.save.isNight != 0) { + gSaveContext.save.time = CLOCK_TIME(6, 0); + } else { + gSaveContext.save.time = CLOCK_TIME(18, 0); + } + play->msgCtx.ocarinaMode = OCARINA_MODE_APPLY_DOUBLE_SOT; + gSaveContext.timerStates[TIMER_ID_MOON_CRASH] = TIMER_STATE_OFF; + } else { + Audio_PlaySfx_MessageCancel(); + play->msgCtx.ocarinaMode = OCARINA_MODE_END; + } + Message_CloseTextbox(play); + } + } else if ((msgCtx->textboxEndType != TEXTBOX_ENDTYPE_10) || + (pauseCtx->state != PAUSE_STATE_OWLWARP_CONFIRM)) { + if ((msgCtx->textboxEndType == TEXTBOX_ENDTYPE_10) && + (play->msgCtx.ocarinaMode == OCARINA_MODE_1B)) { + if (Message_ShouldAdvance(play)) { + if (msgCtx->choiceIndex == 0) { + Audio_PlaySfx_MessageDecide(); + play->msgCtx.ocarinaMode = OCARINA_MODE_WARP_TO_ENTRANCE; + } else { + Audio_PlaySfx_MessageCancel(); + play->msgCtx.ocarinaMode = OCARINA_MODE_END; + } + Message_CloseTextbox(play); + } + } else if ((msgCtx->textboxEndType == TEXTBOX_ENDTYPE_60) || + (msgCtx->textboxEndType == TEXTBOX_ENDTYPE_61) || + (msgCtx->textboxEndType == TEXTBOX_ENDTYPE_10) || + (msgCtx->textboxEndType == TEXTBOX_ENDTYPE_11) || + (msgCtx->textboxEndType == TEXTBOX_ENDTYPE_50) || + (msgCtx->textboxEndType == TEXTBOX_ENDTYPE_52) || + (msgCtx->textboxEndType == TEXTBOX_ENDTYPE_55) || + (msgCtx->textboxEndType == TEXTBOX_ENDTYPE_56) || + (msgCtx->textboxEndType == TEXTBOX_ENDTYPE_57) || + (msgCtx->textboxEndType == TEXTBOX_ENDTYPE_62)) { + //! FAKE: debug? + if (msgCtx->textboxEndType == TEXTBOX_ENDTYPE_50) {} + } else if (pauseCtx->itemDescriptionOn) { + if ((input->rel.stick_x != 0) || (input->rel.stick_y != 0) || + CHECK_BTN_ALL(input->press.button, BTN_A) || CHECK_BTN_ALL(input->press.button, BTN_B) || + CHECK_BTN_ALL(input->press.button, BTN_START)) { + Audio_PlaySfx(NA_SE_SY_DECIDE); + Message_CloseTextbox(play); + } + } else if (play->msgCtx.ocarinaMode == OCARINA_MODE_PROCESS_RESTRICTED_SONG) { + if (Message_ShouldAdvanceSilent(play)) { + Audio_PlaySfx(NA_SE_SY_DECIDE); + Message_CloseTextbox(play); + play->msgCtx.ocarinaMode = OCARINA_MODE_END; + } + } else if ((msgCtx->currentTextId != 0x2790) && Message_ShouldAdvanceSilent(play)) { + if (msgCtx->nextTextId != 0xFFFF) { + Audio_PlaySfx(NA_SE_SY_MESSAGE_PASS); + Message_ContinueTextbox(play, msgCtx->nextTextId); + } else if ((msgCtx->bombersNotebookEventQueueCount == 0) || + (Message_BombersNotebookProcessEventQueue(play) != 1)) { + if (msgCtx->currentTextId == 0x579) { + gSaveContext.hudVisibility = HUD_VISIBILITY_IDLE; + } + Audio_PlaySfx(NA_SE_SY_DECIDE); + Message_CloseTextbox(play); + } + } + } + } + break; + + case MSGMODE_TEXT_CLOSING: + msgCtx->stateTimer--; + if (msgCtx->stateTimer != 0) { + break; + } + + if (sLastPlayedSong == OCARINA_SONG_SOARING) { + if (interfaceCtx->restrictions.songOfSoaring == 0) { + if (func_8010A0A4(play) || (play->sceneId == SCENE_SECOM)) { + Message_StartTextbox(play, 0x1B93, NULL); + play->msgCtx.ocarinaMode = OCARINA_MODE_1B; + sLastPlayedSong = 0xFF; + } else if (!msgCtx->ocarinaSongEffectActive) { + if (gSaveContext.save.saveInfo.playerData.owlActivationFlags != 0) { + pauseCtx->unk_2C8 = pauseCtx->pageIndex; + pauseCtx->unk_2CA = pauseCtx->cursorPoint[4]; + pauseCtx->pageIndex = PAUSE_ITEM; + pauseCtx->state = PAUSE_STATE_OWLWARP_0; + func_800F4A10(play); + pauseCtx->pageIndex = PAUSE_MAP; + sLastPlayedSong = 0xFF; + Message_CloseTextbox(play); + play->msgCtx.ocarinaMode = OCARINA_MODE_END; + gSaveContext.prevHudVisibility = HUD_VISIBILITY_A_B; + func_80115844(play, DO_ACTION_STOP); + GameState_SetFramerateDivisor(&play->state, 2); + if (ShrinkWindow_Letterbox_GetSizeTarget() != 0) { + ShrinkWindow_Letterbox_SetSizeTarget(0); + } + Audio_PlaySfx_PauseMenuOpenOrClose(1); + break; + } + sLastPlayedSong = 0xFF; + Message_StartTextbox(play, 0xFB, NULL); + play->msgCtx.ocarinaMode = OCARINA_MODE_PROCESS_RESTRICTED_SONG; + } else { + msgCtx->stateTimer = 1; + } + } else { + sLastPlayedSong = 0xFF; + Message_StartTextbox(play, 0x1B95, NULL); + play->msgCtx.ocarinaMode = OCARINA_MODE_PROCESS_RESTRICTED_SONG; + } + break; + } + + if ((msgCtx->currentTextId == 0xC) || (msgCtx->currentTextId == 0xD) || (msgCtx->currentTextId == 0xC5) || + (msgCtx->currentTextId == 0xC6) || (msgCtx->currentTextId == 0xC7) || + (msgCtx->currentTextId == 0x2165) || (msgCtx->currentTextId == 0x2166) || + (msgCtx->currentTextId == 0x2167) || (msgCtx->currentTextId == 0x2168)) { + gSaveContext.healthAccumulator = 20 * 0x10; // Refill 20 hearts + } + + if ((play->csCtx.state == CS_STATE_IDLE) && (gSaveContext.save.cutsceneIndex < 0xFFF0) && + ((play->activeCamId == CAM_ID_MAIN) || + ((play->transitionTrigger == TRANS_TRIGGER_OFF) && (play->transitionMode == TRANS_MODE_OFF))) && + (play->msgCtx.ocarinaMode == OCARINA_MODE_END)) { + if ((gSaveContext.prevHudVisibility == HUD_VISIBILITY_IDLE) || + (gSaveContext.prevHudVisibility == HUD_VISIBILITY_NONE) || + (gSaveContext.prevHudVisibility == HUD_VISIBILITY_NONE_ALT)) { + gSaveContext.prevHudVisibility = HUD_VISIBILITY_ALL; + } + gSaveContext.hudVisibility = HUD_VISIBILITY_IDLE; + } + + if ((msgCtx->currentTextId >= 0x1BB2) && (msgCtx->currentTextId <= 0x1BB6) && + (play->actorCtx.flags & ACTORCTX_FLAG_1)) { + Message_StartTextbox(play, 0x5E6, NULL); + break; + } + + if (msgCtx->bombersNotebookEventQueueCount != 0) { + if (Message_BombersNotebookProcessEventQueue(play) == 0) { + msgCtx->stateTimer = 1; + } + break; + } + + msgCtx->msgLength = 0; + msgCtx->msgMode = MSGMODE_NONE; + msgCtx->currentTextId = 0; + msgCtx->stateTimer = 0; + XREG(31) = 0; + + if (pauseCtx->itemDescriptionOn) { + func_8011552C(play, DO_ACTION_INFO); + pauseCtx->itemDescriptionOn = false; + } + + if (msgCtx->textboxEndType == TEXTBOX_ENDTYPE_30) { + msgCtx->textboxEndType = TEXTBOX_ENDTYPE_00; + play->msgCtx.ocarinaMode = OCARINA_MODE_WARP; + } else { + msgCtx->textboxEndType = TEXTBOX_ENDTYPE_00; + } + + if (EQ_MAX_QUEST_HEART_PIECE_COUNT) { + RESET_HEART_PIECE_COUNT; + gSaveContext.save.saveInfo.playerData.healthCapacity += 0x10; + gSaveContext.save.saveInfo.playerData.health += 0x10; + } + + if (msgCtx->ocarinaAction != OCARINA_ACTION_CHECK_NOTIME_DONE) { + s16 pad; + + if (sLastPlayedSong == OCARINA_SONG_TIME) { + if (interfaceCtx->restrictions.songOfTime == 0) { + Message_StartTextbox(play, 0x1B8A, NULL); + play->msgCtx.ocarinaMode = OCARINA_MODE_PROCESS_SOT; + } else { + sLastPlayedSong = 0xFF; + Message_StartTextbox(play, 0x1B95, NULL); + play->msgCtx.ocarinaMode = OCARINA_MODE_PROCESS_RESTRICTED_SONG; + } + } else if (sLastPlayedSong == OCARINA_SONG_INVERTED_TIME) { + if (interfaceCtx->restrictions.invSongOfTime == 0) { + if (R_TIME_SPEED != 0) { + if (gSaveContext.save.timeSpeedOffset == 0) { + Message_StartTextbox(play, 0x1B8C, NULL); + } else { + Message_StartTextbox(play, 0x1B8D, NULL); + } + play->msgCtx.ocarinaMode = OCARINA_MODE_PROCESS_INVERTED_TIME; + } else { + Message_StartTextbox(play, 0x1B8B, NULL); + play->msgCtx.ocarinaMode = OCARINA_MODE_END; + } + } else { + sLastPlayedSong = 0xFF; + Message_StartTextbox(play, 0x1B95, NULL); + play->msgCtx.ocarinaMode = OCARINA_MODE_PROCESS_RESTRICTED_SONG; + } + } else if (sLastPlayedSong == OCARINA_SONG_DOUBLE_TIME) { + if (interfaceCtx->restrictions.songOfDoubleTime == 0) { + if ((CURRENT_DAY != 3) || (gSaveContext.save.isNight == 0)) { + if (gSaveContext.save.isNight) { + Message_StartTextbox(play, D_801D0464[CURRENT_DAY - 1], NULL); + } else { + Message_StartTextbox(play, D_801D045C[CURRENT_DAY - 1], NULL); + } + play->msgCtx.ocarinaMode = OCARINA_MODE_PROCESS_DOUBLE_TIME; + } else { + Message_StartTextbox(play, 0x1B94, NULL); + play->msgCtx.ocarinaMode = OCARINA_MODE_END; + } + } else { + sLastPlayedSong = 0xFF; + Message_StartTextbox(play, 0x1B95, NULL); + play->msgCtx.ocarinaMode = OCARINA_MODE_PROCESS_RESTRICTED_SONG; + } + } else if ((msgCtx->ocarinaAction == OCARINA_ACTION_FREE_PLAY_DONE) && + ((play->msgCtx.ocarinaMode == OCARINA_MODE_ACTIVE) || + (play->msgCtx.ocarinaMode == OCARINA_MODE_EVENT) || + (play->msgCtx.ocarinaMode == OCARINA_MODE_PLAYED_SCARECROW_SPAWN) || + (play->msgCtx.ocarinaMode == OCARINA_MODE_PLAYED_FULL_EVAN_SONG))) { + play->msgCtx.ocarinaMode = OCARINA_MODE_END; + if (msgCtx->lastPlayedSong == OCARINA_SONG_SOARING) { + play->msgCtx.ocarinaMode = OCARINA_MODE_ACTIVE; + } + } + sLastPlayedSong = 0xFF; + } + break; + + case MSGMODE_OCARINA_PLAYING: + if (CHECK_BTN_ALL(input->press.button, BTN_B)) { + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_OFF); + play->msgCtx.ocarinaMode = OCARINA_MODE_END; + Message_CloseTextbox(play); + } else { + msgCtx->ocarinaButtonIndex = OCARINA_BTN_INVALID; + } + break; + + case MSGMODE_OCARINA_AWAIT_INPUT: + if ((msgCtx->ocarinaAction != OCARINA_ACTION_PROMPT_EVAN_PART1_SECOND_HALF) && + (msgCtx->ocarinaAction != OCARINA_ACTION_PROMPT_EVAN_PART2_SECOND_HALF)) { + if (Message_ShouldAdvance(play)) { + Message_DisplayOcarinaStaff(play, msgCtx->ocarinaAction); + } + } + break; + + case MSGMODE_SCARECROW_SPAWN_RECORDING_ONGOING: + if (CHECK_BTN_ALL(input->press.button, BTN_B)) { + AudioOcarina_SetRecordingState(OCARINA_RECORD_OFF); + Audio_PlaySfx(NA_SE_SY_OCARINA_ERROR); + Message_CloseTextbox(play); + msgCtx->msgMode = MSGMODE_SCARECROW_SPAWN_RECORDING_FAILED; + } else { + msgCtx->ocarinaButtonIndex = OCARINA_BTN_INVALID; + } + break; + + case MSGMODE_SCENE_TITLE_CARD_FADE_IN_BACKGROUND: + msgCtx->textboxColorAlphaCurrent += XREG(73); + if (msgCtx->textboxColorAlphaCurrent >= 255) { + msgCtx->textboxColorAlphaCurrent = 255; + msgCtx->msgMode = MSGMODE_SCENE_TITLE_CARD_FADE_IN_TEXT; + } + break; + + case MSGMODE_SCENE_TITLE_CARD_FADE_IN_TEXT: + msgCtx->textColorAlpha += XREG(73); + if (msgCtx->textColorAlpha >= 255) { + msgCtx->textColorAlpha = 255; + msgCtx->msgMode = MSGMODE_SCENE_TITLE_CARD_DISPLAYING; + } + break; + + case MSGMODE_SCENE_TITLE_CARD_DISPLAYING: + msgCtx->stateTimer--; + if (msgCtx->stateTimer == 0) { + msgCtx->msgMode = MSGMODE_SCENE_TITLE_CARD_FADE_OUT_TEXT; + } + break; + + case MSGMODE_SCENE_TITLE_CARD_FADE_OUT_TEXT: + msgCtx->textColorAlpha -= XREG(70); + if (msgCtx->textColorAlpha <= 0) { + msgCtx->textColorAlpha = 0; + msgCtx->msgMode = MSGMODE_SCENE_TITLE_CARD_FADE_OUT_BACKGROUND; + } + break; + + case MSGMODE_SCENE_TITLE_CARD_FADE_OUT_BACKGROUND: + msgCtx->textboxColorAlphaCurrent -= XREG(70); + if (msgCtx->textboxColorAlphaCurrent <= 0) { + if ((msgCtx->currentTextId >= 0x1BB2) && (msgCtx->currentTextId <= 0x1BB6) && + (play->actorCtx.flags & ACTORCTX_FLAG_1)) { + Message_StartTextbox(play, 0x5E6, NULL); + Interface_SetHudVisibility(HUD_VISIBILITY_NONE_ALT); + } else { + //! FAKE: debug? + if (msgCtx->currentTextId >= 0x100) { + if (msgCtx && msgCtx && msgCtx) {} + } + msgCtx->textboxColorAlphaCurrent = 0; + msgCtx->msgLength = 0; + msgCtx->msgMode = MSGMODE_NONE; + msgCtx->currentTextId = 0; + msgCtx->stateTimer = 0; + } + } + break; + + case MSGMODE_NEW_CYCLE_0: + play->state.unk_A3 = 1; + sp44 = gSaveContext.save.cutsceneIndex; + sp3E = gSaveContext.save.time; + sp40 = gSaveContext.save.day; + + Sram_SaveEndOfCycle(play); + gSaveContext.timerStates[TIMER_ID_MOON_CRASH] = TIMER_STATE_OFF; + func_8014546C(&play->sramCtx); + + gSaveContext.save.day = sp40; + gSaveContext.save.time = sp3E; + gSaveContext.save.cutsceneIndex = sp44; + + if (gSaveContext.fileNum != 0xFF) { + Sram_SetFlashPagesDefault(&play->sramCtx, gFlashSaveStartPages[gSaveContext.fileNum * 2], + gFlashSpecialSaveNumPages[gSaveContext.fileNum * 2]); + Sram_StartWriteToFlashDefault(&play->sramCtx); + } + msgCtx->msgMode = MSGMODE_NEW_CYCLE_1; + break; + + case MSGMODE_NEW_CYCLE_1: + if (gSaveContext.fileNum != 0xFF) { + play->state.unk_A3 = 1; + if (play->sramCtx.status == 0) { + play->msgCtx.ocarinaMode = OCARINA_MODE_APPLY_SOT; + msgCtx->msgMode = MSGMODE_NEW_CYCLE_2; + } + } else { + play->msgCtx.ocarinaMode = OCARINA_MODE_APPLY_SOT; + msgCtx->msgMode = MSGMODE_NEW_CYCLE_2; + } + break; + + case MSGMODE_OWL_SAVE_0: + play->state.unk_A3 = 1; + gSaveContext.save.isOwlSave = true; + Play_SaveCycleSceneFlags(&play->state); + func_8014546C(&play->sramCtx); + + if (gSaveContext.fileNum != 0xFF) { + Sram_SetFlashPagesOwlSave(&play->sramCtx, gFlashOwlSaveStartPages[gSaveContext.fileNum * 2], + gFlashOwlSaveNumPages[gSaveContext.fileNum * 2]); + Sram_StartWriteToFlashOwlSave(&play->sramCtx); + } + msgCtx->msgMode = MSGMODE_OWL_SAVE_1; + break; + + case MSGMODE_OWL_SAVE_1: + if (gSaveContext.fileNum != 0xFF) { + play->state.unk_A3 = 1; + if (play->sramCtx.status == 0) { + play->msgCtx.ocarinaMode = OCARINA_MODE_APPLY_SOT; + msgCtx->msgMode = MSGMODE_OWL_SAVE_2; + } + } else { + play->msgCtx.ocarinaMode = OCARINA_MODE_APPLY_SOT; + msgCtx->msgMode = MSGMODE_OWL_SAVE_2; + } + + if (msgCtx->msgMode == MSGMODE_OWL_SAVE_2) { + gSaveContext.gameMode = GAMEMODE_OWL_SAVE; + play->transitionTrigger = TRANS_TRIGGER_START; + play->transitionType = TRANS_TYPE_FADE_BLACK; + play->nextEntrance = ENTRANCE(CUTSCENE, 0); + gSaveContext.save.cutsceneIndex = 0; + gSaveContext.sceneLayer = 0; + } + break; + + case MSGMODE_9: + case MSGMODE_PAUSED: + case MSGMODE_NEW_CYCLE_2: + case MSGMODE_OWL_SAVE_2: + break; + + default: + msgCtx->ocarinaButtonIndex = OCARINA_BTN_INVALID; + break; + } +} +#else +u8 D_801D0468 = 0; +#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/Message_Update.s") +#endif + +void Message_SetTables(PlayState* play) { play->msgCtx.messageEntryTableNes = D_801C6B98; play->msgCtx.messageTableStaff = D_801CFB08; } @@ -587,26 +6013,32 @@ void Message_Init(PlayState* play) { Font* font; MessageContext* msgCtx = &play->msgCtx; - func_801586A4(play); - play->msgCtx.ocarinaMode = 0; - msgCtx->msgMode = 0; + Message_SetTables(play); + + play->msgCtx.ocarinaMode = OCARINA_MODE_NONE; + + msgCtx->msgMode = MSGMODE_NONE; msgCtx->msgLength = 0; msgCtx->currentTextId = 0; - msgCtx->textboxEndType = 0; + msgCtx->textboxEndType = TEXTBOX_ENDTYPE_00; msgCtx->choiceIndex = 0; msgCtx->ocarinaAction = msgCtx->textUnskippable = 0; msgCtx->textColorAlpha = 0xFF; + View_Init(&msgCtx->view, play->state.gfxCtx); + msgCtx->textboxSegment = THA_AllocTailAlign16(&play->state.tha, 0x13C00); + font = &play->msgCtx.font; Font_LoadOrderedFont(&play->msgCtx.font); font->unk_11D88 = 0; + msgCtx->textIsCredits = msgCtx->messageHasSetSfx = false; - msgCtx->textboxSkipped = 0; - msgCtx->textFade = 0; + msgCtx->textboxSkipped = false; + msgCtx->textFade = false; msgCtx->ocarinaAvailableSongs = 0; - msgCtx->textboxX = 0x34; - msgCtx->textboxY = 0x24; + msgCtx->textboxX = 52; + msgCtx->textboxY = 36; msgCtx->ocarinaSongEffectActive = false; msgCtx->unk120BE = 0; msgCtx->unk120C0 = 0; diff --git a/src/code/z_message_nes.c b/src/code/z_message_nes.c index 6ace9acc1..3775b5b26 100644 --- a/src/code/z_message_nes.c +++ b/src/code/z_message_nes.c @@ -2,7 +2,6 @@ #include "message_data_static.h" #include "overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope.h" -// fontWidth f32 sNESFontWidths[160] = { 8.0f, 8.0f, 6.0f, 9.0f, 9.0f, 14.0f, 12.0f, 3.0f, 7.0f, 7.0f, 7.0f, 9.0f, 4.0f, 6.0f, 4.0f, 9.0f, 10.0f, 5.0f, 9.0f, 9.0f, 10.0f, 9.0f, 9.0f, 9.0f, 9.0f, 9.0f, 6.0f, 6.0f, 9.0f, 11.0f, 9.0f, 11.0f, diff --git a/src/code/z_message_tables.inc.c b/src/code/z_message_tables.inc.c new file mode 100644 index 000000000..fb60e7a14 --- /dev/null +++ b/src/code/z_message_tables.inc.c @@ -0,0 +1,1172 @@ +#include "include/message_data_static.h" +#include "PR/mbi.h" + +MessageTableEntry D_801C6B98[4590] = { + { 0, 0, 0x08000000 }, { 2, 0, 0x0800000C }, { 4, 0, 0x08000064 }, { 5, 0, 0x080000B8 }, + { 6, 0, 0x08000110 }, { 7, 0, 0x08000168 }, { 8, 0, 0x080001C4 }, { 9, 0, 0x08000248 }, + { 0xA, 0, 0x080002A8 }, { 0xB, 0, 0x08000310 }, { 0xC, 0, 0x0800031C }, { 0xD, 0, 0x080003E8 }, + { 0xE, 0, 0x08000474 }, { 0xF, 0, 0x080004BC }, { 0x10, 0, 0x08000504 }, { 0x11, 0, 0x08000510 }, + { 0x12, 0, 0x08000554 }, { 0x13, 0, 0x08000560 }, { 0x14, 0, 0x0800056C }, { 0x15, 0, 0x08000604 }, + { 0x16, 0, 0x080006A0 }, { 0x17, 0, 0x0800073C }, { 0x18, 0, 0x080007D8 }, { 0x19, 0, 0x08000874 }, + { 0x1A, 0, 0x08000940 }, { 0x1B, 0, 0x080009E8 }, { 0x1C, 0, 0x08000A84 }, { 0x1D, 0, 0x08000AD4 }, + { 0x1E, 0, 0x08000B28 }, { 0x1F, 0, 0x08000B58 }, { 0x20, 0, 0x08000B88 }, { 0x21, 0, 0x08000BB8 }, + { 0x22, 0, 0x08000BE8 }, { 0x23, 0, 0x08000C78 }, { 0x24, 0, 0x08000CD0 }, { 0x25, 0, 0x08000D30 }, + { 0x26, 0, 0x08000DA4 }, { 0x27, 0, 0x08000E38 }, { 0x28, 0, 0x08000EB4 }, { 0x29, 0, 0x08000F88 }, + { 0x2A, 0, 0x08001060 }, { 0x2B, 0, 0x0800113C }, { 0x2C, 0, 0x08001148 }, { 0x2D, 0, 0x08001154 }, + { 0x2E, 0, 0x08001160 }, { 0x2F, 0, 0x08001210 }, { 0x30, 0, 0x0800121C }, { 0x31, 0, 0x08001228 }, + { 0x32, 0, 0x08001234 }, { 0x33, 0, 0x080012D4 }, { 0x34, 0, 0x0800139C }, { 0x35, 0, 0x08001428 }, + { 0x36, 0, 0x080014B0 }, { 0x37, 0, 0x08001554 }, { 0x38, 0, 0x08001560 }, { 0x39, 0, 0x08001624 }, + { 0x3A, 0, 0x080016B8 }, { 0x3B, 0, 0x08001768 }, { 0x3C, 0, 0x08001814 }, { 0x3D, 0, 0x08001884 }, + { 0x3E, 0, 0x080018E0 }, { 0x3F, 0, 0x080019DC }, { 0x40, 0, 0x08001A48 }, { 0x41, 0, 0x08001A54 }, + { 0x42, 0, 0x08001B0C }, { 0x43, 0, 0x08001BF4 }, { 0x4C, 0, 0x08001CBC }, { 0x4D, 0, 0x08001DBC }, + { 0x4E, 0, 0x08001DC8 }, { 0x50, 0, 0x08001DD4 }, { 0x51, 0, 0x08001EA4 }, { 0x52, 0, 0x08001EB0 }, + { 0x53, 0, 0x08001EFC }, { 0x54, 0, 0x08001F08 }, { 0x55, 0, 0x08001F14 }, { 0x56, 0, 0x08001FB8 }, + { 0x57, 0, 0x08002058 }, { 0x58, 0, 0x080020F8 }, { 0x59, 0, 0x080021A0 }, { 0x5A, 0, 0x08002290 }, + { 0x5B, 0, 0x080022E4 }, { 0x5C, 0, 0x08002388 }, { 0x5D, 0, 0x08002434 }, { 0x5E, 0, 0x080024E8 }, + { 0x5F, 0, 0x08002590 }, { 0x60, 0, 0x0800261C }, { 0x61, 0, 0x080026F0 }, { 0x62, 0, 0x080026FC }, + { 0x63, 0, 0x08002760 }, { 0x64, 0, 0x080027CC }, { 0x65, 0, 0x080027D8 }, { 0x66, 0, 0x0800282C }, + { 0x67, 0, 0x08002884 }, { 0x68, 0, 0x080028EC }, { 0x69, 0, 0x08002950 }, { 0x6A, 0, 0x080029CC }, + { 0x6B, 0, 0x08002A24 }, { 0x6E, 0, 0x08002A7C }, { 0x6F, 0, 0x08002A88 }, { 0x70, 0, 0x08002B54 }, + { 0x71, 0, 0x08002B60 }, { 0x72, 0, 0x08002B6C }, { 0x73, 0, 0x08002B78 }, { 0x74, 0, 0x08002B84 }, + { 0x75, 0, 0x08002B90 }, { 0x76, 0, 0x08002B9C }, { 0x77, 0, 0x08002BA8 }, { 0x78, 0, 0x08002BB4 }, + { 0x79, 0, 0x08002C98 }, { 0x7A, 0, 0x08002D54 }, { 0x7B, 0, 0x08002E14 }, { 0x7C, 0, 0x08002E90 }, + { 0x7D, 0, 0x08002F20 }, { 0x7E, 0, 0x08002F9C }, { 0x7F, 0, 0x0800302C }, { 0x80, 0, 0x0800309C }, + { 0x81, 0, 0x08003144 }, { 0x82, 0, 0x080031B0 }, { 0x83, 0, 0x08003224 }, { 0x84, 0, 0x08003298 }, + { 0x85, 0, 0x08003324 }, { 0x86, 0, 0x08003370 }, { 0x87, 0, 0x08003444 }, { 0x88, 0, 0x080034F8 }, + { 0x89, 0, 0x08003560 }, { 0x8A, 0, 0x080035F4 }, { 0x8B, 0, 0x080036B8 }, { 0x8C, 0, 0x08003710 }, + { 0x8D, 0, 0x080037A0 }, { 0x8E, 0, 0x08003828 }, { 0x8F, 0, 0x080038E0 }, { 0x91, 0, 0x0800396C }, + { 0x92, 0, 0x08003A44 }, { 0x93, 0, 0x08003B08 }, { 0x94, 0, 0x08003B60 }, { 0x95, 0, 0x08003B6C }, + { 0x96, 0, 0x08003BC0 }, { 0x97, 0, 0x08003C1C }, { 0x98, 0, 0x08003C60 }, { 0x99, 0, 0x08003CA8 }, + { 0x9A, 0, 0x08003CF4 }, { 0x9B, 0, 0x08003D40 }, { 0x9C, 0, 0x08003DE0 }, { 0x9D, 0, 0x08003E78 }, + { 0x9E, 0, 0x08003F10 }, { 0x9F, 0, 0x08003FA8 }, { 0xA0, 0, 0x08003FB4 }, { 0xA1, 0, 0x0800401C }, + { 0xA2, 0, 0x08004088 }, { 0xA3, 0, 0x08004094 }, { 0xA4, 0, 0x080040A0 }, { 0xA9, 0, 0x080040AC }, + { 0xAA, 0, 0x08004130 }, { 0xAB, 0, 0x08004198 }, { 0xAC, 0, 0x08004240 }, { 0xAD, 0, 0x0800424C }, + { 0xAE, 0, 0x08004258 }, { 0xAF, 0, 0x08004264 }, { 0xB0, 0, 0x08004270 }, { 0xB1, 0, 0x0800427C }, + { 0xB2, 0, 0x08004288 }, { 0xB4, 0, 0x08004294 }, { 0xB5, 0, 0x08004354 }, { 0xB6, 0, 0x08004418 }, + { 0xB7, 0, 0x080044E0 }, { 0xB8, 0, 0x080045A8 }, { 0xB9, 0, 0x08004670 }, { 0xBA, 0, 0x08004738 }, + { 0xBB, 0, 0x08004744 }, { 0xBC, 0, 0x08004750 }, { 0xBD, 0, 0x0800475C }, { 0xBE, 0, 0x08004768 }, + { 0xBF, 0, 0x08004774 }, { 0xC0, 0, 0x08004780 }, { 0xC4, 0, 0x0800478C }, { 0xC5, 0, 0x080047D0 }, + { 0xC6, 0, 0x08004850 }, { 0xC7, 0, 0x080048D0 }, { 0xC8, 0, 0x08004954 }, { 0xC9, 0, 0x08004A5C }, + { 0xCA, 0, 0x08004AFC }, { 0xCB, 0, 0x08004C14 }, { 0xCC, 0, 0x08004C78 }, { 0xCD, 0, 0x08004CDC }, + { 0xF2, 0, 0x08004D8C }, { 0xF3, 0, 0x08004DC8 }, { 0xF4, 0, 0x08004E3C }, { 0xF5, 0, 0x08004E8C }, + { 0xF6, 0, 0x08004EDC }, { 0xF7, 0, 0x08004F30 }, { 0xF8, 0, 0x08004F70 }, { 0xF9, 0, 0x08004F9C }, + { 0xFA, 0, 0x08005034 }, { 0xFB, 0, 0x08005088 }, { 0xFC, 0, 0x080050FC }, { 0xFD, 0, 0x0800515C }, + { 0xFE, 0, 0x08005184 }, { 0xFF, 0, 0x080051B8 }, { 0x100, 0, 0x08005214 }, { 0x101, 0, 0x08005230 }, + { 0x102, 0, 0x0800524C }, { 0x103, 0, 0x08005268 }, { 0x104, 0, 0x08005284 }, { 0x105, 0, 0x080052A0 }, + { 0x106, 0, 0x080052B8 }, { 0x107, 0, 0x080052D4 }, { 0x108, 0, 0x080052F8 }, { 0x109, 0, 0x0800531C }, + { 0x10A, 0, 0x0800533C }, { 0x10B, 0, 0x08005358 }, { 0x10C, 0, 0x0800537C }, { 0x10D, 0, 0x08005390 }, + { 0x10E, 0, 0x080053A8 }, { 0x10F, 0, 0x080053C4 }, { 0x110, 0, 0x080053DC }, { 0x111, 0, 0x080053FC }, + { 0x112, 0, 0x08005414 }, { 0x113, 0, 0x0800542C }, { 0x114, 0, 0x08005450 }, { 0x115, 0, 0x08005470 }, + { 0x116, 0, 0x0800548C }, { 0x117, 0, 0x080054A8 }, { 0x118, 0, 0x080054BC }, { 0x119, 0, 0x080054D4 }, + { 0x11A, 0, 0x080054F4 }, { 0x11B, 0, 0x08005518 }, { 0x11C, 0, 0x0800553C }, { 0x11D, 0, 0x0800555C }, + { 0x11E, 0, 0x08005578 }, { 0x11F, 0, 0x08005598 }, { 0x120, 0, 0x080055B4 }, { 0x121, 0, 0x080055CC }, + { 0x122, 0, 0x080055E8 }, { 0x123, 0, 0x08005604 }, { 0x124, 0, 0x08005620 }, { 0x125, 0, 0x08005638 }, + { 0x126, 0, 0x0800564C }, { 0x127, 0, 0x08005668 }, { 0x129, 0, 0x08005684 }, { 0x12A, 0, 0x0800569C }, + { 0x12B, 0, 0x080056B8 }, { 0x12C, 0, 0x080056D4 }, { 0x12D, 0, 0x080056F0 }, { 0x12E, 0, 0x0800570C }, + { 0x12F, 0, 0x08005724 }, { 0x130, 0, 0x0800573C }, { 0x131, 0, 0x08005758 }, { 0x132, 0, 0x08005770 }, + { 0x134, 0, 0x08005788 }, { 0x135, 0, 0x080057A4 }, { 0x136, 0, 0x080057C0 }, { 0x137, 0, 0x080057D8 }, + { 0x138, 0, 0x080057F4 }, { 0x139, 0, 0x08005814 }, { 0x13A, 0, 0x0800582C }, { 0x13B, 0, 0x0800584C }, + { 0x13D, 0, 0x08005868 }, { 0x13E, 0, 0x08005884 }, { 0x13F, 0, 0x080058A0 }, { 0x140, 0, 0x080058C4 }, + { 0x141, 0, 0x080058DC }, { 0x142, 0, 0x080058F4 }, { 0x143, 0, 0x08005918 }, { 0x144, 0, 0x08005934 }, + { 0x145, 0, 0x08005954 }, { 0x146, 0, 0x08005970 }, { 0x147, 0, 0x08005988 }, { 0x148, 0, 0x080059A4 }, + { 0x149, 0, 0x080059C0 }, { 0x200, 0, 0x080059D8 }, { 0x201, 0, 0x08005A54 }, { 0x202, 0, 0x08005B48 }, + { 0x203, 0, 0x08005B74 }, { 0x204, 0, 0x08005BE4 }, { 0x205, 0, 0x08005C38 }, { 0x206, 0, 0x08005C94 }, + { 0x207, 0, 0x08005D04 }, { 0x208, 0, 0x08005D2C }, { 0x209, 0, 0x08005D64 }, { 0x20A, 0, 0x08005DB4 }, + { 0x20B, 0, 0x08005E08 }, { 0x20C, 0, 0x08005E14 }, { 0x20D, 0, 0x08005E60 }, { 0x20E, 0, 0x08005ECC }, + { 0x20F, 0, 0x08005ED8 }, { 0x210, 0, 0x08005F74 }, { 0x211, 0, 0x08005FAC }, { 0x212, 0, 0x08005FD4 }, + { 0x213, 0, 0x0800602C }, { 0x214, 0, 0x08006050 }, { 0x215, 0, 0x08006124 }, { 0x216, 0, 0x08006358 }, + { 0x217, 0, 0x080065B8 }, { 0x218, 0, 0x08006620 }, { 0x219, 0, 0x0800668C }, { 0x21A, 0, 0x08006720 }, + { 0x21B, 0, 0x0800674C }, { 0x21D, 0, 0x08006774 }, { 0x21E, 0, 0x080067CC }, { 0x21F, 0, 0x08006874 }, + { 0x220, 0, 0x080068E0 }, { 0x221, 0, 0x08006978 }, { 0x222, 0, 0x08006A04 }, { 0x223, 0, 0x08006A48 }, + { 0x224, 0, 0x08006AE8 }, { 0x225, 0, 0x08006B54 }, { 0x226, 0, 0x08006BB0 }, { 0x227, 0, 0x08006BE8 }, + { 0x228, 0, 0x08006D58 }, { 0x229, 0, 0x08006E18 }, { 0x22A, 0, 0x08006EA0 }, { 0x22B, 0, 0x08006F00 }, + { 0x22C, 0, 0x08006F44 }, { 0x22D, 0, 0x08006F60 }, { 0x22E, 0, 0x08006FB0 }, { 0x22F, 0, 0x08006FC8 }, + { 0x230, 0, 0x08007010 }, { 0x231, 0, 0x080070C0 }, { 0x232, 0, 0x08007110 }, { 0x233, 0, 0x08007158 }, + { 0x234, 0, 0x080071A4 }, { 0x235, 0, 0x08007208 }, { 0x236, 0, 0x0800725C }, { 0x237, 0, 0x080072AC }, + { 0x238, 0, 0x0800730C }, { 0x239, 0, 0x0800734C }, { 0x23A, 0, 0x08007400 }, { 0x23B, 0, 0x08007468 }, + { 0x23C, 0, 0x08007500 }, { 0x23D, 0, 0x08007538 }, { 0x23E, 0, 0x080075E4 }, { 0x23F, 0, 0x080075F0 }, + { 0x240, 0, 0x0800765C }, { 0x241, 0, 0x080076D0 }, { 0x242, 0, 0x08007744 }, { 0x243, 0, 0x080077B0 }, + { 0x244, 0, 0x08007830 }, { 0x245, 0, 0x08007888 }, { 0x246, 0, 0x080078B4 }, { 0x247, 0, 0x08007904 }, + { 0x248, 0, 0x08007950 }, { 0x249, 0, 0x080079A0 }, { 0x24A, 0, 0x080079F0 }, { 0x24B, 0, 0x08007A30 }, + { 0x24C, 0, 0x08007A78 }, { 0x24D, 0, 0x08007AD8 }, { 0x24E, 0, 0x08007B54 }, { 0x24F, 0, 0x08007BE8 }, + { 0x250, 0, 0x08007C88 }, { 0x251, 0, 0x08007CEC }, { 0x252, 0, 0x08007D18 }, { 0x253, 0, 0x08007D68 }, + { 0x254, 0, 0x08007DAC }, { 0x255, 0, 0x08007E04 }, { 0x256, 0, 0x08007E4C }, { 0x257, 0, 0x08007EA4 }, + { 0x258, 0, 0x08007F00 }, { 0x25A, 0, 0x08007F58 }, { 0x25B, 0, 0x08007FA0 }, { 0x25C, 0, 0x08007FDC }, + { 0x25D, 0, 0x08007FF8 }, { 0x25E, 0, 0x08008024 }, { 0x25F, 0, 0x080080E4 }, { 0x260, 0, 0x0800818C }, + { 0x261, 0, 0x080081F8 }, { 0x262, 0, 0x08008288 }, { 0x263, 0, 0x08008304 }, { 0x264, 0, 0x08008344 }, + { 0x265, 0, 0x08008420 }, { 0x302, 0, 0x08008498 }, { 0x303, 0, 0x080085DC }, { 0x304, 0, 0x08008660 }, + { 0x305, 0, 0x080086B4 }, { 0x306, 0, 0x08008720 }, { 0x307, 0, 0x0800872C }, { 0x308, 0, 0x0800875C }, + { 0x309, 0, 0x08008788 }, { 0x30A, 0, 0x080087BC }, { 0x30B, 0, 0x080087E8 }, { 0x30C, 0, 0x08008824 }, + { 0x30D, 0, 0x08008894 }, { 0x30E, 0, 0x080088E4 }, { 0x30F, 0, 0x08008914 }, { 0x310, 0, 0x08008970 }, + { 0x311, 0, 0x080089BC }, { 0x312, 0, 0x080089F0 }, { 0x313, 0, 0x08008A64 }, { 0x314, 0, 0x08008AA4 }, + { 0x315, 0, 0x08008B0C }, { 0x316, 0, 0x08008B64 }, { 0x317, 0, 0x08008BA4 }, { 0x318, 0, 0x08008BF0 }, + { 0x319, 0, 0x08008C48 }, { 0x31A, 0, 0x08008C84 }, { 0x31B, 0, 0x08008CD0 }, { 0x31C, 0, 0x08008D10 }, + { 0x31D, 0, 0x08008D5C }, { 0x31E, 0, 0x08008DCC }, { 0x31F, 0, 0x08008E2C }, { 0x320, 0, 0x08008EBC }, + { 0x321, 0, 0x08008F30 }, { 0x322, 0, 0x08008F60 }, { 0x323, 0, 0x08008F9C }, { 0x324, 0, 0x08008FFC }, + { 0x325, 0, 0x08009044 }, { 0x326, 0, 0x080090A8 }, { 0x327, 0, 0x080090F8 }, { 0x328, 0, 0x08009140 }, + { 0x329, 0, 0x08009188 }, { 0x32A, 0, 0x080091F0 }, { 0x32B, 0, 0x08009240 }, { 0x32C, 0, 0x0800928C }, + { 0x32D, 0, 0x080092F0 }, { 0x32E, 0, 0x08009318 }, { 0x32F, 0, 0x08009358 }, { 0x330, 0, 0x0800939C }, + { 0x331, 0, 0x080093E4 }, { 0x332, 0, 0x08009440 }, { 0x333, 0, 0x0800949C }, { 0x334, 0, 0x08009518 }, + { 0x335, 0, 0x0800955C }, { 0x336, 0, 0x08009598 }, { 0x337, 0, 0x08009658 }, { 0x338, 0, 0x08009680 }, + { 0x339, 0, 0x080096A8 }, { 0x33A, 0, 0x080096C8 }, { 0x33B, 0, 0x080096EC }, { 0x33C, 0, 0x0800973C }, + { 0x33D, 0, 0x08009778 }, { 0x33E, 0, 0x080097BC }, { 0x33F, 0, 0x08009930 }, { 0x340, 0, 0x08009C50 }, + { 0x341, 0, 0x08009CC4 }, { 0x342, 0, 0x08009D30 }, { 0x343, 0, 0x08009D58 }, { 0x3E8, 0, 0x08009D7C }, + { 0x3E9, 0, 0x08009DCC }, { 0x3EA, 0, 0x08009DE8 }, { 0x3EB, 0, 0x08009E2C }, { 0x3EC, 0, 0x08009E54 }, + { 0x3ED, 0, 0x08009EB8 }, { 0x3EE, 0, 0x08009EFC }, { 0x3EF, 0, 0x08009F6C }, { 0x3F0, 0, 0x08009FA0 }, + { 0x3F1, 0, 0x08009FF0 }, { 0x3F2, 0, 0x0800A030 }, { 0x3F3, 0, 0x0800A090 }, { 0x3F4, 0, 0x0800A0D0 }, + { 0x3F5, 0, 0x0800A0F8 }, { 0x3F6, 0, 0x0800A158 }, { 0x3F7, 0, 0x0800A190 }, { 0x3F8, 0, 0x0800A1BC }, + { 0x3F9, 0, 0x0800A214 }, { 0x3FA, 0, 0x0800A25C }, { 0x3FB, 0, 0x0800A29C }, { 0x3FC, 0, 0x0800A2D8 }, + { 0x3FD, 0, 0x0800A31C }, { 0x3FE, 0, 0x0800A40C }, { 0x3FF, 0, 0x0800A478 }, { 0x400, 0, 0x0800A4EC }, + { 0x401, 0, 0x0800A528 }, { 0x402, 0, 0x0800A560 }, { 0x403, 0, 0x0800A5D4 }, { 0x404, 0, 0x0800A608 }, + { 0x405, 0, 0x0800A63C }, { 0x406, 0, 0x0800A680 }, { 0x407, 0, 0x0800A6B8 }, { 0x408, 0, 0x0800A70C }, + { 0x44C, 0, 0x0800A75C }, { 0x44D, 0, 0x0800A850 }, { 0x44E, 0, 0x0800A8B8 }, { 0x44F, 0, 0x0800A904 }, + { 0x450, 0, 0x0800A924 }, { 0x451, 0, 0x0800A974 }, { 0x452, 0, 0x0800A9E8 }, { 0x453, 0, 0x0800AA24 }, + { 0x454, 0, 0x0800AA7C }, { 0x455, 0, 0x0800AAB4 }, { 0x456, 0, 0x0800AB10 }, { 0x457, 0, 0x0800AB44 }, + { 0x458, 0, 0x0800AB78 }, { 0x459, 0, 0x0800AC0C }, { 0x45A, 0, 0x0800AC84 }, { 0x45B, 0, 0x0800ACD0 }, + { 0x45C, 0, 0x0800AD4C }, { 0x45D, 0, 0x0800ADC8 }, { 0x45E, 0, 0x0800AE68 }, { 0x45F, 0, 0x0800AEBC }, + { 0x460, 0, 0x0800AF54 }, { 0x461, 0, 0x0800AF98 }, { 0x462, 0, 0x0800AFC8 }, { 0x463, 0, 0x0800AFE8 }, + { 0x464, 0, 0x0800B044 }, { 0x465, 0, 0x0800B094 }, { 0x466, 0, 0x0800B0CC }, { 0x467, 0, 0x0800B0FC }, + { 0x468, 0, 0x0800B178 }, { 0x469, 0, 0x0800B1B8 }, { 0x46A, 0, 0x0800B1F0 }, { 0x46B, 0, 0x0800B244 }, + { 0x46C, 0, 0x0800B258 }, { 0x46D, 0, 0x0800B2B4 }, { 0x46E, 0, 0x0800B324 }, { 0x46F, 0, 0x0800B374 }, + { 0x470, 0, 0x0800B3A8 }, { 0x471, 0, 0x0800B3F4 }, { 0x472, 0, 0x0800B428 }, { 0x473, 0, 0x0800B484 }, + { 0x474, 0, 0x0800B4A4 }, { 0x475, 0, 0x0800B514 }, { 0x476, 0, 0x0800B570 }, { 0x477, 0, 0x0800B5FC }, + { 0x478, 0, 0x0800B65C }, { 0x479, 0, 0x0800B6CC }, { 0x47A, 0, 0x0800B6FC }, { 0x47B, 0, 0x0800B760 }, + { 0x47C, 0, 0x0800B78C }, { 0x47D, 0, 0x0800B7DC }, { 0x47E, 0, 0x0800B82C }, { 0x4B0, 0, 0x0800B854 }, + { 0x4B1, 0, 0x0800B8B0 }, { 0x4B2, 0, 0x0800B8F8 }, { 0x4B3, 0, 0x0800B93C }, { 0x4B4, 0, 0x0800B994 }, + { 0x4B5, 0, 0x0800B9D0 }, { 0x4B6, 0, 0x0800BA04 }, { 0x4B7, 0, 0x0800BA94 }, { 0x4B8, 0, 0x0800BAC4 }, + { 0x4B9, 0, 0x0800BB4C }, { 0x4BA, 0, 0x0800BB7C }, { 0x4BB, 0, 0x0800BBFC }, { 0x4BC, 0, 0x0800BC28 }, + { 0x4BD, 0, 0x0800BCA4 }, { 0x4BE, 0, 0x0800BCD0 }, { 0x4BF, 0, 0x0800BD58 }, { 0x4C0, 0, 0x0800BD84 }, + { 0x4C1, 0, 0x0800BE18 }, { 0x4C2, 0, 0x0800BE54 }, { 0x4C3, 0, 0x0800BED0 }, { 0x4C4, 0, 0x0800BEEC }, + { 0x4C5, 0, 0x0800BF5C }, { 0x4C6, 0, 0x0800BF78 }, { 0x4C7, 0, 0x0800BFF4 }, { 0x4C8, 0, 0x0800C018 }, + { 0x4C9, 0, 0x0800C0A4 }, { 0x4CA, 0, 0x0800C0D8 }, { 0x4CB, 0, 0x0800C140 }, { 0x4CC, 0, 0x0800C158 }, + { 0x4CD, 0, 0x0800C1E0 }, { 0x4CE, 0, 0x0800C220 }, { 0x4CF, 0, 0x0800C29C }, { 0x4D0, 0, 0x0800C2D0 }, + { 0x4D1, 0, 0x0800C34C }, { 0x4D2, 0, 0x0800C378 }, { 0x4D3, 0, 0x0800C400 }, { 0x4D4, 0, 0x0800C448 }, + { 0x4D5, 0, 0x0800C4BC }, { 0x4D6, 0, 0x0800C4E0 }, { 0x4D7, 0, 0x0800C560 }, { 0x4D8, 0, 0x0800C598 }, + { 0x4D9, 0, 0x0800C604 }, { 0x4DA, 0, 0x0800C63C }, { 0x4DB, 0, 0x0800C6B4 }, { 0x4DC, 0, 0x0800C714 }, + { 0x4DD, 0, 0x0800C784 }, { 0x4DE, 0, 0x0800C7B4 }, { 0x4DF, 0, 0x0800C81C }, { 0x4E0, 0, 0x0800C840 }, + { 0x4E1, 0, 0x0800C8AC }, { 0x4E2, 0, 0x0800C8CC }, { 0x4E3, 0, 0x0800C95C }, { 0x4E4, 0, 0x0800C990 }, + { 0x4E5, 0, 0x0800CA04 }, { 0x4E6, 0, 0x0800CA20 }, { 0x4E7, 0, 0x0800CA9C }, { 0x4E8, 0, 0x0800CAC0 }, + { 0x4E9, 0, 0x0800CB48 }, { 0x4EA, 0, 0x0800CB64 }, { 0x4EB, 0, 0x0800CBE8 }, { 0x4EC, 0, 0x0800CC04 }, + { 0x4ED, 0, 0x0800CC64 }, { 0x4EE, 0, 0x0800CC88 }, { 0x4EF, 0, 0x0800CCE8 }, { 0x4F0, 0, 0x0800CD0C }, + { 0x4F1, 0, 0x0800CD7C }, { 0x514, 0, 0x0800CDA4 }, { 0x515, 0, 0x0800CED0 }, { 0x516, 0, 0x0800CFE8 }, + { 0x517, 0, 0x0800D094 }, { 0x518, 0, 0x0800D128 }, { 0x519, 0, 0x0800D1C8 }, { 0x51A, 0, 0x0800D254 }, + { 0x51B, 0, 0x0800D2A8 }, { 0x51C, 0, 0x0800D318 }, { 0x51D, 0, 0x0800D360 }, { 0x51E, 0, 0x0800D3D0 }, + { 0x51F, 0, 0x0800D418 }, { 0x520, 0, 0x0800D488 }, { 0x521, 0, 0x0800D534 }, { 0x522, 0, 0x0800D5BC }, + { 0x523, 0, 0x0800D65C }, { 0x524, 0, 0x0800D6E4 }, { 0x525, 0, 0x0800D728 }, { 0x526, 0, 0x0800D794 }, + { 0x527, 0, 0x0800D7D0 }, { 0x528, 0, 0x0800D834 }, { 0x529, 0, 0x0800D878 }, { 0x52A, 0, 0x0800D8E4 }, + { 0x52B, 0, 0x0800D98C }, { 0x52C, 0, 0x0800DA2C }, { 0x52D, 0, 0x0800DAC8 }, { 0x52E, 0, 0x0800DB6C }, + { 0x52F, 0, 0x0800DBD4 }, { 0x530, 0, 0x0800DC5C }, { 0x531, 0, 0x0800DCC4 }, { 0x532, 0, 0x0800DD54 }, + { 0x533, 0, 0x0800DDA4 }, { 0x534, 0, 0x0800DE1C }, { 0x535, 0, 0x0800DEC8 }, { 0x536, 0, 0x0800DF50 }, + { 0x537, 0, 0x0800DFF0 }, { 0x538, 0, 0x0800E078 }, { 0x539, 0, 0x0800E0BC }, { 0x53A, 0, 0x0800E128 }, + { 0x53B, 0, 0x0800E16C }, { 0x53C, 0, 0x0800E1D8 }, { 0x53D, 0, 0x0800E21C }, { 0x53E, 0, 0x0800E288 }, + { 0x53F, 0, 0x0800E334 }, { 0x540, 0, 0x0800E414 }, { 0x541, 0, 0x0800E474 }, { 0x542, 0, 0x0800E50C }, + { 0x543, 0, 0x0800E57C }, { 0x544, 0, 0x0800E614 }, { 0x545, 0, 0x0800E678 }, { 0x546, 0, 0x0800E728 }, + { 0x547, 0, 0x0800E794 }, { 0x548, 0, 0x0800E7F4 }, { 0x549, 0, 0x0800E86C }, { 0x54A, 0, 0x0800E8D8 }, + { 0x54B, 0, 0x0800E934 }, { 0x54C, 0, 0x0800E9B4 }, { 0x54D, 0, 0x0800EA28 }, { 0x54E, 0, 0x0800EB08 }, + { 0x54F, 0, 0x0800EB60 }, { 0x550, 0, 0x0800EBC8 }, { 0x551, 0, 0x0800EC2C }, { 0x552, 0, 0x0800ECAC }, + { 0x553, 0, 0x0800ED1C }, { 0x554, 0, 0x0800ED9C }, { 0x555, 0, 0x0800EE00 }, { 0x556, 0, 0x0800EEEC }, + { 0x557, 0, 0x0800EF4C }, { 0x558, 0, 0x0800EFBC }, { 0x559, 0, 0x0800F03C }, { 0x55A, 0, 0x0800F0B4 }, + { 0x55B, 0, 0x0800F110 }, { 0x55C, 0, 0x0800F188 }, { 0x55D, 0, 0x0800F258 }, { 0x55E, 0, 0x0800F300 }, + { 0x55F, 0, 0x0800F398 }, { 0x560, 0, 0x0800F44C }, { 0x561, 0, 0x0800F570 }, { 0x562, 0, 0x0800F688 }, + { 0x563, 0, 0x0800F7A8 }, { 0x564, 0, 0x0800F8B8 }, { 0x565, 0, 0x0800F9D8 }, { 0x566, 0, 0x0800FAEC }, + { 0x567, 0, 0x0800FB84 }, { 0x568, 0, 0x0800FC34 }, { 0x569, 0, 0x0800FCC8 }, { 0x56A, 0, 0x0800FD78 }, + { 0x56B, 0, 0x0800FE0C }, { 0x56C, 0, 0x0800FEBC }, { 0x56D, 0, 0x08010008 }, { 0x56E, 0, 0x08010168 }, + { 0x56F, 0, 0x080102C4 }, { 0x570, 0, 0x0801042C }, { 0x571, 0, 0x08010584 }, { 0x572, 0, 0x080106EC }, + { 0x573, 0, 0x08010844 }, { 0x578, 0, 0x080109A4 }, { 0x579, 0, 0x08010A70 }, { 0x57A, 0, 0x08010B28 }, + { 0x57B, 0, 0x08010C7C }, { 0x57C, 0, 0x08010D98 }, { 0x57D, 0, 0x08010EC4 }, { 0x57E, 0, 0x08010FF4 }, + { 0x57F, 0, 0x080110E4 }, { 0x580, 0, 0x080111D0 }, { 0x582, 0, 0x08011260 }, { 0x583, 0, 0x08011304 }, + { 0x584, 0, 0x08011374 }, { 0x585, 0, 0x08011408 }, { 0x586, 0, 0x080114BC }, { 0x587, 0, 0x08011528 }, + { 0x588, 0, 0x080115C0 }, { 0x589, 0, 0x08011674 }, { 0x58A, 0, 0x080116E4 }, { 0x58B, 0, 0x08011760 }, + { 0x58C, 0, 0x08011820 }, { 0x58D, 0, 0x08011884 }, { 0x58E, 0, 0x0801192C }, { 0x58F, 0, 0x08011A20 }, + { 0x590, 0, 0x08011B08 }, { 0x591, 0, 0x08011B68 }, { 0x592, 0, 0x08011BA4 }, { 0x593, 0, 0x08011BE4 }, + { 0x594, 0, 0x08011C20 }, { 0x595, 0, 0x08011D00 }, { 0x59C, 0, 0x08011DC8 }, { 0x59D, 0, 0x08011E78 }, + { 0x59E, 0, 0x08011EB4 }, { 0x59F, 0, 0x08011EFC }, { 0x5A0, 0, 0x08011FB4 }, { 0x5A1, 0, 0x08012068 }, + { 0x5A2, 0, 0x080120A4 }, { 0x5A3, 0, 0x080120E4 }, { 0x5A4, 0, 0x08012198 }, { 0x5A5, 0, 0x08012248 }, + { 0x5A6, 0, 0x08012284 }, { 0x5A7, 0, 0x080122C4 }, { 0x5A8, 0, 0x08012380 }, { 0x5A9, 0, 0x0801243C }, + { 0x5AA, 0, 0x08012478 }, { 0x5DC, 0, 0x080124B8 }, { 0x5DD, 0, 0x08012548 }, { 0x5DE, 0, 0x080125BC }, + { 0x5DF, 0, 0x08012678 }, { 0x5E0, 0, 0x08012730 }, { 0x5E1, 0, 0x0801276C }, { 0x5E2, 0, 0x08012784 }, + { 0x5E3, 0, 0x080127C4 }, { 0x5E4, 0, 0x080128A8 }, { 0x5E5, 0, 0x080128E0 }, { 0x5E6, 0, 0x0801294C }, + { 0x5E7, 0, 0x08012970 }, { 0x5E8, 0, 0x080129A4 }, { 0x5E9, 0, 0x08012A5C }, { 0x5EA, 0, 0x08012ACC }, + { 0x5EB, 0, 0x08012B4C }, { 0x5EC, 0, 0x08012BF0 }, { 0x5ED, 0, 0x08012CE0 }, { 0x5EE, 0, 0x08012D84 }, + { 0x5EF, 0, 0x08012DE4 }, { 0x5F0, 0, 0x08012E1C }, { 0x5F1, 0, 0x08012E7C }, { 0x5F2, 0, 0x08012EF0 }, + { 0x5F3, 0, 0x08012FAC }, { 0x5F4, 0, 0x08013060 }, { 0x5F5, 0, 0x080130F4 }, { 0x5F6, 0, 0x0801315C }, + { 0x5F7, 0, 0x08013210 }, { 0x5F8, 0, 0x08013258 }, { 0x60E, 0, 0x080132B0 }, { 0x60F, 0, 0x08013368 }, + { 0x610, 0, 0x08013470 }, { 0x611, 0, 0x08013530 }, { 0x612, 0, 0x080135F8 }, { 0x613, 0, 0x08013680 }, + { 0x614, 0, 0x080137D0 }, { 0x615, 0, 0x0801386C }, { 0x616, 0, 0x08013944 }, { 0x617, 0, 0x080139B8 }, + { 0x618, 0, 0x08013A44 }, { 0x619, 0, 0x08013AA8 }, { 0x61A, 0, 0x08013BFC }, { 0x61B, 0, 0x08013C5C }, + { 0x61C, 0, 0x08013CB0 }, { 0x61D, 0, 0x08013D00 }, { 0x61E, 0, 0x08013D60 }, { 0x61F, 0, 0x08013DAC }, + { 0x620, 0, 0x08013DEC }, { 0x621, 0, 0x08013E4C }, { 0x622, 0, 0x08013E80 }, { 0x623, 0, 0x08013ED8 }, + { 0x624, 0, 0x08013F24 }, { 0x625, 0, 0x08013FEC }, { 0x626, 0, 0x08014010 }, { 0x627, 0, 0x08014064 }, + { 0x628, 0, 0x080140C4 }, { 0x629, 0, 0x08014170 }, { 0x62A, 0, 0x08014208 }, { 0x62B, 0, 0x080142D0 }, + { 0x62C, 0, 0x08014398 }, { 0x640, 0, 0x0801454C }, { 0x641, 0, 0x0801458C }, { 0x642, 0, 0x080145B4 }, + { 0x644, 0, 0x080145F0 }, { 0x645, 0, 0x08014608 }, { 0x646, 0, 0x08014648 }, { 0x647, 0, 0x080146B0 }, + { 0x648, 0, 0x080146D4 }, { 0x649, 0, 0x08014760 }, { 0x64A, 0, 0x08014798 }, { 0x64B, 0, 0x08014850 }, + { 0x64C, 0, 0x08014898 }, { 0x64D, 0, 0x080148B4 }, { 0x64E, 0, 0x08014924 }, { 0x64F, 0, 0x08014988 }, + { 0x650, 0, 0x080149F0 }, { 0x651, 0, 0x08014A50 }, { 0x652, 0, 0x08014A8C }, { 0x653, 0, 0x08014AF4 }, + { 0x654, 0, 0x08014B34 }, { 0x655, 0, 0x08014B9C }, { 0x656, 0, 0x08014BD8 }, { 0x657, 0, 0x08014C38 }, + { 0x658, 0, 0x08014C78 }, { 0x659, 0, 0x08014CBC }, { 0x65A, 0, 0x08014D10 }, { 0x65B, 0, 0x08014D94 }, + { 0x65C, 0, 0x08014E68 }, { 0x65D, 0, 0x08014F18 }, { 0x65E, 0, 0x08014F5C }, { 0x65F, 0, 0x08014F88 }, + { 0x660, 0, 0x08014FD0 }, { 0x661, 0, 0x08015024 }, { 0x662, 0, 0x080150F0 }, { 0x663, 0, 0x08015188 }, + { 0x664, 0, 0x080151AC }, { 0x665, 0, 0x080151E4 }, { 0x666, 0, 0x08015248 }, { 0x667, 0, 0x0801529C }, + { 0x668, 0, 0x080152CC }, { 0x669, 0, 0x0801532C }, { 0x66A, 0, 0x08015390 }, { 0x66B, 0, 0x080153E4 }, + { 0x66C, 0, 0x08015450 }, { 0x66D, 0, 0x080154BC }, { 0x66E, 0, 0x08015550 }, { 0x66F, 0, 0x080155C0 }, + { 0x670, 0, 0x08015600 }, { 0x671, 0, 0x08015634 }, { 0x672, 0, 0x0801568C }, { 0x673, 0, 0x080156C8 }, + { 0x674, 0, 0x0801574C }, { 0x675, 0, 0x08015784 }, { 0x676, 0, 0x080157F8 }, { 0x677, 0, 0x0801588C }, + { 0x678, 0, 0x080158E4 }, { 0x679, 0, 0x08015940 }, { 0x67A, 0, 0x08015994 }, { 0x67B, 0, 0x080159E8 }, + { 0x67C, 0, 0x08015A48 }, { 0x67D, 0, 0x08015B58 }, { 0x67E, 0, 0x08015C04 }, { 0x67F, 0, 0x08015C50 }, + { 0x680, 0, 0x08015D64 }, { 0x681, 0, 0x08015E40 }, { 0x682, 0, 0x08015ED0 }, { 0x683, 0, 0x08015F00 }, + { 0x684, 0, 0x08015F90 }, { 0x685, 0, 0x08015FCC }, { 0x686, 0, 0x08016020 }, { 0x687, 0, 0x08016078 }, + { 0x688, 0, 0x080160AC }, { 0x689, 0, 0x08016104 }, { 0x68A, 0, 0x08016130 }, { 0x6A4, 0, 0x08016184 }, + { 0x6A5, 0, 0x080161B8 }, { 0x6A6, 0, 0x0801620C }, { 0x6A7, 0, 0x08016248 }, { 0x6A8, 0, 0x080162A0 }, + { 0x6A9, 0, 0x080162C8 }, { 0x6AA, 0, 0x0801634C }, { 0x6AB, 0, 0x08016398 }, { 0x6AC, 0, 0x080163FC }, + { 0x6AD, 0, 0x08016478 }, { 0x6AE, 0, 0x080164B4 }, { 0x6AF, 0, 0x08016508 }, { 0x6B0, 0, 0x08016548 }, + { 0x6B1, 0, 0x080165C0 }, { 0x6B2, 0, 0x08016600 }, { 0x6B3, 0, 0x08016674 }, { 0x6B4, 0, 0x080166B4 }, + { 0x6B5, 0, 0x0801671C }, { 0x6B6, 0, 0x08016758 }, { 0x6B7, 0, 0x080167C0 }, { 0x6B8, 0, 0x080167F8 }, + { 0x6B9, 0, 0x08016858 }, { 0x6BA, 0, 0x08016894 }, { 0x6BB, 0, 0x08016900 }, { 0x6BC, 0, 0x0801693C }, + { 0x6BD, 0, 0x0801698C }, { 0x6BE, 0, 0x080169CC }, { 0x6BF, 0, 0x08016A04 }, { 0x6C0, 0, 0x08016A28 }, + { 0x6C1, 0, 0x08016A7C }, { 0x6C2, 0, 0x08016A98 }, { 0x6C3, 0, 0x08016AC8 }, { 0x6C4, 0, 0x08016AE4 }, + { 0x6C5, 0, 0x08016B2C }, { 0x6C6, 0, 0x08016B84 }, { 0x6C7, 0, 0x08016BC8 }, { 0x6C8, 0, 0x08016BE0 }, + { 0x6C9, 0, 0x08016C34 }, { 0x6CA, 0, 0x08016C94 }, { 0x6CB, 0, 0x08016CD0 }, { 0x6CC, 0, 0x08016D24 }, + { 0x6CD, 0, 0x08016D64 }, { 0x6CE, 0, 0x08016DC8 }, { 0x6CF, 0, 0x08016E08 }, { 0x6D0, 0, 0x08016E6C }, + { 0x6D1, 0, 0x08016EAC }, { 0x6D2, 0, 0x08016F14 }, { 0x6D3, 0, 0x08016F50 }, { 0x6D4, 0, 0x08016FD0 }, + { 0x6D5, 0, 0x08017008 }, { 0x6D6, 0, 0x08017084 }, { 0x6D7, 0, 0x080170C0 }, { 0x6D8, 0, 0x08017110 }, + { 0x6D9, 0, 0x0801714C }, { 0x6DA, 0, 0x080171A4 }, { 0x6DB, 0, 0x080171E0 }, { 0x6DC, 0, 0x08017218 }, + { 0x6DD, 0, 0x08017264 }, { 0x6DE, 0, 0x080172E0 }, { 0x708, 0, 0x08017330 }, { 0x709, 0, 0x080173C4 }, + { 0x70A, 0, 0x0801741C }, { 0x70B, 0, 0x080174B4 }, { 0x70C, 0, 0x0801753C }, { 0x70D, 0, 0x08017564 }, + { 0x70E, 0, 0x0801758C }, { 0x70F, 0, 0x080175FC }, { 0x710, 0, 0x08017650 }, { 0x711, 0, 0x08017748 }, + { 0x712, 0, 0x0801775C }, { 0x713, 0, 0x080177B0 }, { 0x714, 0, 0x080177D8 }, { 0x715, 0, 0x0801781C }, + { 0x716, 0, 0x0801787C }, { 0x717, 0, 0x08017A6C }, { 0x718, 0, 0x08017AB8 }, { 0x719, 0, 0x08017AE8 }, + { 0x71A, 0, 0x08017B48 }, { 0x71B, 0, 0x08017BA0 }, { 0x721, 0, 0x08017C00 }, { 0x722, 0, 0x08017C44 }, + { 0x723, 0, 0x08017C84 }, { 0x724, 0, 0x08017CC4 }, { 0x725, 0, 0x08017D04 }, { 0x726, 0, 0x08017D90 }, + { 0x727, 0, 0x08017DE4 }, { 0x728, 0, 0x08017DF0 }, { 0x729, 0, 0x08017E50 }, { 0x72A, 0, 0x08017E9C }, + { 0x72B, 0, 0x08017F08 }, { 0x72C, 0, 0x08017F5C }, { 0x72D, 0, 0x08017F8C }, { 0x72E, 0, 0x08017FC8 }, + { 0x72F, 0, 0x0801800C }, { 0x730, 0, 0x08018064 }, { 0x731, 0, 0x080180A0 }, { 0x732, 0, 0x080180E8 }, + { 0x733, 0, 0x08018104 }, { 0x734, 0, 0x08018188 }, { 0x735, 0, 0x08018240 }, { 0x736, 0, 0x080182A8 }, + { 0x737, 0, 0x080182E4 }, { 0x738, 0, 0x080184D0 }, { 0x73A, 0, 0x08018510 }, { 0x73B, 0, 0x08018594 }, + { 0x73C, 0, 0x08018618 }, { 0x73D, 0, 0x080186B0 }, { 0x73E, 0, 0x0801876C }, { 0x73F, 0, 0x08018818 }, + { 0x740, 0, 0x080188CC }, { 0x741, 0, 0x08018908 }, { 0x742, 0, 0x08018938 }, { 0x743, 0, 0x080189A0 }, + { 0x744, 0, 0x08018A00 }, { 0x745, 0, 0x08018A90 }, { 0x746, 0, 0x08018B4C }, { 0x747, 0, 0x08018C18 }, + { 0x748, 0, 0x08018C8C }, { 0x749, 0, 0x08018CE0 }, { 0x74A, 0, 0x08018D78 }, { 0x74B, 0, 0x08018DD0 }, + { 0x74C, 0, 0x08018E38 }, { 0x74D, 0, 0x08018E78 }, { 0x74E, 0, 0x08018EC0 }, { 0x74F, 0, 0x08018F38 }, + { 0x750, 0, 0x08018FF4 }, { 0x751, 0, 0x08019014 }, { 0x752, 0, 0x0801910C }, { 0x753, 0, 0x08019160 }, + { 0x754, 0, 0x080191A4 }, { 0x755, 0, 0x080191FC }, { 0x756, 0, 0x08019254 }, { 0x757, 0, 0x0801927C }, + { 0x758, 0, 0x080192E8 }, { 0x759, 0, 0x08019354 }, { 0x75A, 0, 0x0801939C }, { 0x76C, 0, 0x0801941C }, + { 0x76D, 0, 0x08019468 }, { 0x76E, 0, 0x080194BC }, { 0x76F, 0, 0x080194F8 }, { 0x770, 0, 0x08019530 }, + { 0x771, 0, 0x0801956C }, { 0x772, 0, 0x080195A4 }, { 0x773, 0, 0x080195DC }, { 0x774, 0, 0x08019620 }, + { 0x775, 0, 0x08019654 }, { 0x776, 0, 0x08019688 }, { 0x777, 0, 0x080196A4 }, { 0x778, 0, 0x080196F0 }, + { 0x779, 0, 0x080197A4 }, { 0x77A, 0, 0x080197C0 }, { 0x77B, 0, 0x080197E4 }, { 0x77C, 0, 0x0801982C }, + { 0x77D, 0, 0x08019854 }, { 0x7D0, 0, 0x08019878 }, { 0x7D1, 0, 0x080198BC }, { 0x7D2, 0, 0x080199A8 }, + { 0x7D3, 0, 0x080199BC }, { 0x7D4, 0, 0x080199E4 }, { 0x7D5, 0, 0x08019AD8 }, { 0x7D6, 0, 0x08019B10 }, + { 0x7D7, 0, 0x08019B28 }, { 0x7D8, 0, 0x08019BA4 }, { 0x7D9, 0, 0x08019BC8 }, { 0x7DC, 0, 0x08019C20 }, + { 0x7DD, 0, 0x08019C40 }, { 0x7DE, 0, 0x08019C60 }, { 0x800, 0, 0x08019C80 }, { 0x801, 0, 0x08019D44 }, + { 0x802, 0, 0x08019DD0 }, { 0x803, 0, 0x08019E24 }, { 0x804, 0, 0x08019E44 }, { 0x806, 0, 0x08019F84 }, + { 0x807, 0, 0x0801A0F0 }, { 0x80B, 0, 0x0801A0FC }, { 0x80C, 0, 0x0801A144 }, { 0x80D, 0, 0x0801A1AC }, + { 0x80E, 0, 0x0801A218 }, { 0x80F, 0, 0x0801A288 }, { 0x810, 0, 0x0801A320 }, { 0x811, 0, 0x0801A348 }, + { 0x820, 0, 0x0801A378 }, { 0x821, 0, 0x0801A3B4 }, { 0x822, 0, 0x0801A408 }, { 0x823, 0, 0x0801A484 }, + { 0x824, 0, 0x0801A4D4 }, { 0x825, 0, 0x0801A538 }, { 0x826, 0, 0x0801A5A8 }, { 0x827, 0, 0x0801A614 }, + { 0x828, 0, 0x0801A654 }, { 0x829, 0, 0x0801A680 }, { 0x82A, 0, 0x0801A6EC }, { 0x82B, 0, 0x0801A740 }, + { 0x82C, 0, 0x0801A79C }, { 0x82D, 0, 0x0801A808 }, { 0x82E, 0, 0x0801A868 }, { 0x82F, 0, 0x0801A894 }, + { 0x830, 0, 0x0801A918 }, { 0x831, 0, 0x0801A968 }, { 0x832, 0, 0x0801A9DC }, { 0x833, 0, 0x0801AA5C }, + { 0x834, 0, 0x0801AA80 }, { 0x835, 0, 0x0801AAD0 }, { 0x836, 0, 0x0801AB60 }, { 0x838, 0, 0x0801AC28 }, + { 0x839, 0, 0x0801AC7C }, { 0x83A, 0, 0x0801AD18 }, { 0x83B, 0, 0x0801AD48 }, { 0x83C, 0, 0x0801ADC4 }, + { 0x83D, 0, 0x0801AE2C }, { 0x83E, 0, 0x0801AE84 }, { 0x83F, 0, 0x0801AEC4 }, { 0x840, 0, 0x0801AF0C }, + { 0x841, 0, 0x0801AF48 }, { 0x842, 0, 0x0801AFA4 }, { 0x843, 0, 0x0801AFE4 }, { 0x844, 0, 0x0801B054 }, + { 0x845, 0, 0x0801B090 }, { 0x846, 0, 0x0801B0CC }, { 0x847, 0, 0x0801B114 }, { 0x848, 0, 0x0801B168 }, + { 0x849, 0, 0x0801B190 }, { 0x84A, 0, 0x0801B210 }, { 0x84B, 0, 0x0801B278 }, { 0x84C, 0, 0x0801B2BC }, + { 0x84D, 0, 0x0801B310 }, { 0x84E, 0, 0x0801B380 }, { 0x84F, 0, 0x0801B3A4 }, { 0x850, 0, 0x0801B3CC }, + { 0x851, 0, 0x0801B47C }, { 0x852, 0, 0x0801B488 }, { 0x853, 0, 0x0801B4B4 }, { 0x854, 0, 0x0801B5C4 }, + { 0x855, 0, 0x0801B608 }, { 0x856, 0, 0x0801B678 }, { 0x857, 0, 0x0801B6D8 }, { 0x858, 0, 0x0801B718 }, + { 0x859, 0, 0x0801B78C }, { 0x85A, 0, 0x0801B810 }, { 0x85B, 0, 0x0801B85C }, { 0x85C, 0, 0x0801B8C4 }, + { 0x85D, 0, 0x0801B8F4 }, { 0x85E, 0, 0x0801B900 }, { 0x85F, 0, 0x0801B92C }, { 0x860, 0, 0x0801B968 }, + { 0x861, 0, 0x0801B994 }, { 0x862, 0, 0x0801B9E0 }, { 0x863, 0, 0x0801BA6C }, { 0x864, 0, 0x0801BACC }, + { 0x865, 0, 0x0801BB18 }, { 0x866, 0, 0x0801BB8C }, { 0x867, 0, 0x0801BBA4 }, { 0x868, 0, 0x0801BC0C }, + { 0x869, 0, 0x0801BC88 }, { 0x86A, 0, 0x0801BCC0 }, { 0x86B, 0, 0x0801BD30 }, { 0x86C, 0, 0x0801BD90 }, + { 0x86D, 0, 0x0801BDD4 }, { 0x86E, 0, 0x0801BE60 }, { 0x86F, 0, 0x0801BF1C }, { 0x870, 0, 0x0801BF40 }, + { 0x871, 0, 0x0801BF90 }, { 0x872, 0, 0x0801BFB0 }, { 0x873, 0, 0x0801C004 }, { 0x874, 0, 0x0801C038 }, + { 0x875, 0, 0x0801C0A0 }, { 0x876, 0, 0x0801C0F8 }, { 0x877, 0, 0x0801C170 }, { 0x878, 0, 0x0801C1E0 }, + { 0x879, 0, 0x0801C23C }, { 0x87A, 0, 0x0801C2A0 }, { 0x87B, 0, 0x0801C2D4 }, { 0x87C, 0, 0x0801C314 }, + { 0x87D, 0, 0x0801C384 }, { 0x87E, 0, 0x0801C3DC }, { 0x87F, 0, 0x0801C43C }, { 0x880, 0, 0x0801C494 }, + { 0x881, 0, 0x0801C504 }, { 0x882, 0, 0x0801C580 }, { 0x883, 0, 0x0801C5E8 }, { 0x884, 0, 0x0801C694 }, + { 0x885, 0, 0x0801C6DC }, { 0x886, 0, 0x0801C73C }, { 0x887, 0, 0x0801C798 }, { 0x888, 0, 0x0801C7EC }, + { 0x889, 0, 0x0801C824 }, { 0x88A, 0, 0x0801C86C }, { 0x88B, 0, 0x0801C890 }, { 0x88C, 0, 0x0801C8C4 }, + { 0x88D, 0, 0x0801C914 }, { 0x88E, 0, 0x0801C98C }, { 0x88F, 0, 0x0801CA00 }, { 0x890, 0, 0x0801CA40 }, + { 0x898, 0, 0x0801CADC }, { 0x899, 0, 0x0801CB1C }, { 0x89A, 0, 0x0801CB60 }, { 0x89B, 0, 0x0801CC18 }, + { 0x89C, 0, 0x0801CC74 }, { 0x89D, 0, 0x0801CCCC }, { 0x89E, 0, 0x0801CD40 }, { 0x89F, 0, 0x0801CDA0 }, + { 0x8A0, 0, 0x0801CDE8 }, { 0x8A1, 0, 0x0801CE44 }, { 0x8A2, 0, 0x0801CEB0 }, { 0x8A3, 0, 0x0801CF0C }, + { 0x8A4, 0, 0x0801CF38 }, { 0x8A5, 0, 0x0801CFD0 }, { 0x8CA, 0, 0x0801D010 }, { 0x8CB, 0, 0x0801D0E0 }, + { 0x8CC, 0, 0x0801D108 }, { 0x8CD, 0, 0x0801D138 }, { 0x8CE, 0, 0x0801D170 }, { 0x8CF, 0, 0x0801D1C0 }, + { 0x8D0, 0, 0x0801D200 }, { 0x8D1, 0, 0x0801D238 }, { 0x8D2, 0, 0x0801D268 }, { 0x8D3, 0, 0x0801D340 }, + { 0x8D4, 0, 0x0801D3D4 }, { 0x8D5, 0, 0x0801D444 }, { 0x8D6, 0, 0x0801D488 }, { 0x8D7, 0, 0x0801D4D8 }, + { 0x8D8, 0, 0x0801D508 }, { 0x8D9, 0, 0x0801D574 }, { 0x8DA, 0, 0x0801D5A0 }, { 0x8DB, 0, 0x0801D5D0 }, + { 0x8DC, 0, 0x0801D600 }, { 0x8DD, 0, 0x0801D644 }, { 0x8DE, 0, 0x0801D7C8 }, { 0x8DF, 0, 0x0801D7FC }, + { 0x8E0, 0, 0x0801D844 }, { 0x8E1, 0, 0x0801D898 }, { 0x8E2, 0, 0x0801D938 }, { 0x8E3, 0, 0x0801D9E0 }, + { 0x8E4, 0, 0x0801DA40 }, { 0x8E5, 0, 0x0801DA9C }, { 0x8E6, 0, 0x0801DB20 }, { 0x8E7, 0, 0x0801DB88 }, + { 0x8E8, 0, 0x0801DBB0 }, { 0x8E9, 0, 0x0801DBE4 }, { 0x8EA, 0, 0x0801DC6C }, { 0x8EB, 0, 0x0801DC84 }, + { 0x8EC, 0, 0x0801DD18 }, { 0x910, 0, 0x0801DD64 }, { 0x911, 0, 0x0801DDC0 }, { 0x912, 0, 0x0801DE3C }, + { 0x913, 0, 0x0801DEAC }, { 0x914, 0, 0x0801DF18 }, { 0x915, 0, 0x0801DF88 }, { 0x916, 0, 0x0801DFF0 }, + { 0x917, 0, 0x0801E038 }, { 0x918, 0, 0x0801E164 }, { 0x919, 0, 0x0801E1BC }, { 0x91A, 0, 0x0801E204 }, + { 0x91B, 0, 0x0801E330 }, { 0x91C, 0, 0x0801E370 }, { 0x91E, 0, 0x0801E3CC }, { 0x92E, 0, 0x0801E464 }, + { 0x92F, 0, 0x0801E4C0 }, { 0x930, 0, 0x0801E534 }, { 0x931, 0, 0x0801E5AC }, { 0x932, 0, 0x0801E5B8 }, + { 0x933, 0, 0x0801E608 }, { 0x934, 0, 0x0801E650 }, { 0x935, 0, 0x0801E698 }, { 0x936, 0, 0x0801E6D0 }, + { 0x937, 0, 0x0801E738 }, { 0x938, 0, 0x0801E768 }, { 0x960, 0, 0x0801E774 }, { 0x961, 0, 0x0801E798 }, + { 0x962, 0, 0x0801E810 }, { 0x963, 0, 0x0801E8AC }, { 0x964, 0, 0x0801E97C }, { 0x965, 0, 0x0801E9C8 }, + { 0x966, 0, 0x0801EA1C }, { 0x967, 0, 0x0801EABC }, { 0x968, 0, 0x0801EB08 }, { 0x969, 0, 0x0801EBC8 }, + { 0x96A, 0, 0x0801EC58 }, { 0x96B, 0, 0x0801EC8C }, { 0x96C, 0, 0x0801ECD4 }, { 0x96D, 0, 0x0801ED40 }, + { 0x96E, 0, 0x0801ED88 }, { 0x96F, 0, 0x0801EE4C }, { 0x970, 0, 0x0801EF08 }, { 0x971, 0, 0x0801EF98 }, + { 0x972, 0, 0x0801EFF4 }, { 0x9C4, 0, 0x0801F000 }, { 0x9C5, 0, 0x0801F08C }, { 0x9C6, 0, 0x0801F0B0 }, + { 0x9C7, 0, 0x0801F104 }, { 0x9C8, 0, 0x0801F110 }, { 0x9C9, 0, 0x0801F160 }, { 0x9CA, 0, 0x0801F1D4 }, + { 0x9CB, 0, 0x0801F25C }, { 0x9CC, 0, 0x0801F2A0 }, { 0x9CD, 0, 0x0801F2E8 }, { 0x9CE, 0, 0x0801F338 }, + { 0x9CF, 0, 0x0801F37C }, { 0x9D0, 0, 0x0801F3CC }, { 0x9D1, 0, 0x0801F424 }, { 0x9D2, 0, 0x0801F450 }, + { 0x9D3, 0, 0x0801F510 }, { 0x9D4, 0, 0x0801F558 }, { 0x9D5, 0, 0x0801F580 }, { 0x9D6, 0, 0x0801F5D0 }, + { 0x9D7, 0, 0x0801F61C }, { 0x9D8, 0, 0x0801F65C }, { 0x9D9, 0, 0x0801F69C }, { 0x9DA, 0, 0x0801F6EC }, + { 0x9DB, 0, 0x0801F764 }, { 0x9DC, 0, 0x0801F7B0 }, { 0x9DD, 0, 0x0801F808 }, { 0x9DE, 0, 0x0801F8AC }, + { 0x9DF, 0, 0x0801F91C }, { 0x9E0, 0, 0x0801F990 }, { 0x9E1, 0, 0x0801F9CC }, { 0x9E2, 0, 0x0801FA2C }, + { 0x9E3, 0, 0x0801FA74 }, { 0x9E4, 0, 0x0801FB24 }, { 0x9E5, 0, 0x0801FB90 }, { 0x9E6, 0, 0x0801FBBC }, + { 0x9E7, 0, 0x0801FBE4 }, { 0x9E8, 0, 0x0801FC4C }, { 0x9E9, 0, 0x0801FCA0 }, { 0x9EA, 0, 0x0801FD80 }, + { 0x9EB, 0, 0x0801FDE8 }, { 0x9EC, 0, 0x0801FE70 }, { 0x9ED, 0, 0x0801FEAC }, { 0x9EE, 0, 0x0801FF40 }, + { 0x9EF, 0, 0x0801FF8C }, { 0xA28, 0, 0x0801FFC4 }, { 0xA29, 0, 0x0801FFF4 }, { 0xA2A, 0, 0x08020014 }, + { 0xA2B, 0, 0x08020048 }, { 0xA2C, 0, 0x0802012C }, { 0xA2D, 0, 0x08020190 }, { 0xA2E, 0, 0x080201EC }, + { 0xA2F, 0, 0x08020278 }, { 0xA30, 0, 0x080202E4 }, { 0xA31, 0, 0x0802031C }, { 0xA32, 0, 0x08020360 }, + { 0xA33, 0, 0x080203A4 }, { 0xA34, 0, 0x080203C8 }, { 0xA35, 0, 0x08020424 }, { 0xA36, 0, 0x0802047C }, + { 0xA37, 0, 0x080204F0 }, { 0xA38, 0, 0x08020534 }, { 0xA39, 0, 0x08020570 }, { 0xA3A, 0, 0x080205E4 }, + { 0xBB8, 0, 0x08020668 }, { 0xBB9, 0, 0x080206A4 }, { 0xBBA, 0, 0x080206EC }, { 0xBBB, 0, 0x08020710 }, + { 0xBBC, 0, 0x08020764 }, { 0xBBD, 0, 0x080207A4 }, { 0xBBE, 0, 0x080207E8 }, { 0xBBF, 0, 0x08020814 }, + { 0xBC0, 0, 0x08020858 }, { 0xBC1, 0, 0x080208B0 }, { 0xBC2, 0, 0x08020910 }, { 0xBC3, 0, 0x08020960 }, + { 0xBC4, 0, 0x080209C4 }, { 0xBC5, 0, 0x080209F0 }, { 0xBC6, 0, 0x08020A50 }, { 0xBC7, 0, 0x08020A8C }, + { 0xBC8, 0, 0x08020B00 }, { 0xBC9, 0, 0x08020B3C }, { 0xBCA, 0, 0x08020BB8 }, { 0xBCB, 0, 0x08020BF4 }, + { 0xBCC, 0, 0x08020C4C }, { 0xBCD, 0, 0x08020C88 }, { 0xBCE, 0, 0x08020CF0 }, { 0xBCF, 0, 0x08020D2C }, + { 0xBD0, 0, 0x08020D80 }, { 0xBD1, 0, 0x08020DC0 }, { 0xBD2, 0, 0x08020DFC }, { 0xBD3, 0, 0x08020E58 }, + { 0xBD4, 0, 0x08020E88 }, { 0xBD5, 0, 0x08020EE0 }, { 0xBD6, 0, 0x08020F18 }, { 0xBD7, 0, 0x08020F44 }, + { 0xBEA, 0, 0x08020F60 }, { 0xBEB, 0, 0x08021158 }, { 0xBEC, 0, 0x080211C0 }, { 0xBED, 0, 0x080211EC }, + { 0xBEE, 0, 0x08021350 }, { 0xBEF, 0, 0x08021380 }, { 0xBF0, 0, 0x080213F8 }, { 0xBF1, 0, 0x08021480 }, + { 0xBF2, 0, 0x08021558 }, { 0xBF3, 0, 0x08021588 }, { 0xBF4, 0, 0x080215E0 }, { 0xBF5, 0, 0x080216A0 }, + { 0xBF6, 0, 0x080217CC }, { 0xBF7, 0, 0x08021858 }, { 0xBF8, 0, 0x080218CC }, { 0xBF9, 0, 0x08021974 }, + { 0xBFA, 0, 0x080219F8 }, { 0xBFB, 0, 0x08021A68 }, { 0xBFC, 0, 0x08021AF8 }, { 0xBFD, 0, 0x08021B9C }, + { 0xBFE, 0, 0x08021BE0 }, { 0xBFF, 0, 0x08021C54 }, { 0xC00, 0, 0x08021C80 }, { 0xC01, 0, 0x08021CC8 }, + { 0xC02, 0, 0x08021F20 }, { 0xC03, 0, 0x08021F50 }, { 0xC04, 0, 0x08022024 }, { 0xC1D, 0, 0x08022090 }, + { 0xC1E, 0, 0x080220B8 }, { 0xC1F, 0, 0x080220D0 }, { 0xC20, 0, 0x08022104 }, { 0xC21, 0, 0x08022198 }, + { 0xC22, 0, 0x080221B8 }, { 0xC23, 0, 0x080221DC }, { 0xC24, 0, 0x08022248 }, { 0xC25, 0, 0x08022288 }, + { 0xC26, 0, 0x08022308 }, { 0xC27, 0, 0x0802233C }, { 0xC28, 0, 0x0802239C }, { 0xC29, 0, 0x080223E4 }, + { 0xC2A, 0, 0x08022408 }, { 0xC2B, 0, 0x08022470 }, { 0xC2C, 0, 0x080224C4 }, { 0xC2D, 0, 0x0802255C }, + { 0xC2E, 0, 0x08022584 }, { 0xC2F, 0, 0x080225AC }, { 0xC30, 0, 0x08022640 }, { 0xC31, 0, 0x08022670 }, + { 0xC32, 0, 0x0802268C }, { 0xC33, 0, 0x080226A0 }, { 0xC34, 0, 0x080226E0 }, { 0xC35, 0, 0x08022738 }, + { 0xC36, 0, 0x08022760 }, { 0xC37, 0, 0x08022780 }, { 0xC38, 0, 0x080227B8 }, { 0xC39, 0, 0x080227F0 }, + { 0xC3A, 0, 0x080228DC }, { 0xC3B, 0, 0x08022954 }, { 0xC3C, 0, 0x08022AD4 }, { 0xC3D, 0, 0x08022B48 }, + { 0xC3E, 0, 0x08022C14 }, { 0xC3F, 0, 0x08022C48 }, { 0xC40, 0, 0x08022C78 }, { 0xC41, 0, 0x08022CB0 }, + { 0xC42, 0, 0x08022CFC }, { 0xC43, 0, 0x08022D64 }, { 0xC44, 0, 0x08022D84 }, { 0xC45, 0, 0x08022DEC }, + { 0xC46, 0, 0x08022EBC }, { 0xC47, 0, 0x08022F9C }, { 0xC48, 0, 0x08023004 }, { 0xC49, 0, 0x08023024 }, + { 0xC4A, 0, 0x080230B0 }, { 0xC4B, 0, 0x080230E0 }, { 0xC4C, 0, 0x080231E4 }, { 0xC4D, 0, 0x0802329C }, + { 0xC4E, 0, 0x080232FC }, { 0xC4F, 0, 0x08023360 }, { 0xC50, 0, 0x080233BC }, { 0xC51, 0, 0x080233F4 }, + { 0xC52, 0, 0x0802352C }, { 0xC53, 0, 0x08023550 }, { 0xC54, 0, 0x08023640 }, { 0xC55, 0, 0x08023668 }, + { 0xC56, 0, 0x080236A4 }, { 0xC57, 0, 0x080236F4 }, { 0xC58, 0, 0x08023788 }, { 0xC80, 0, 0x080237C4 }, + { 0xC81, 0, 0x08023824 }, { 0xC82, 0, 0x080238F0 }, { 0xC83, 0, 0x08023920 }, { 0xC84, 0, 0x080239E4 }, + { 0xC85, 0, 0x08023B24 }, { 0xC86, 0, 0x08023B58 }, { 0xC87, 0, 0x08023C3C }, { 0xC88, 0, 0x08023CF0 }, + { 0xC89, 0, 0x08023D44 }, { 0xC8A, 0, 0x08023D80 }, { 0xC8B, 0, 0x08023DB0 }, { 0xC8C, 0, 0x08023E0C }, + { 0xC8D, 0, 0x08023E60 }, { 0xC8E, 0, 0x08023E90 }, { 0xC8F, 0, 0x08023F40 }, { 0xC90, 0, 0x08023FA0 }, + { 0xC91, 0, 0x0802400C }, { 0xC92, 0, 0x08024058 }, { 0xC93, 0, 0x080240D0 }, { 0xC94, 0, 0x0802410C }, + { 0xCE4, 0, 0x08024164 }, { 0xCE5, 0, 0x080241D4 }, { 0xCE6, 0, 0x08024254 }, { 0xCE7, 0, 0x08024304 }, + { 0xCE8, 0, 0x08024330 }, { 0xCE9, 0, 0x08024360 }, { 0xCEA, 0, 0x0802444C }, { 0xCEB, 0, 0x08024470 }, + { 0xCEC, 0, 0x080244E8 }, { 0xCED, 0, 0x08024548 }, { 0xCEE, 0, 0x08024634 }, { 0xCEF, 0, 0x08024718 }, + { 0xCF0, 0, 0x0802476C }, { 0xCF1, 0, 0x080247F8 }, { 0xCF2, 0, 0x0802483C }, { 0xCF3, 0, 0x08024880 }, + { 0xCF4, 0, 0x08024918 }, { 0xCF5, 0, 0x08024994 }, { 0xCF6, 0, 0x08024B58 }, { 0xCF7, 0, 0x08024BD8 }, + { 0xCF8, 0, 0x08024C84 }, { 0xCF9, 0, 0x08024D10 }, { 0xCFA, 0, 0x08024D44 }, { 0xCFB, 0, 0x08024D8C }, + { 0xCFC, 0, 0x08024DB8 }, { 0xCFD, 0, 0x08024DFC }, { 0xCFE, 0, 0x08024E6C }, { 0xCFF, 0, 0x08024EA4 }, + { 0xD00, 0, 0x08024ED4 }, { 0xD01, 0, 0x08024F4C }, { 0xD02, 0, 0x08024F8C }, { 0xD03, 0, 0x08024FDC }, + { 0xD04, 0, 0x08025040 }, { 0xD05, 0, 0x080250D8 }, { 0xD06, 0, 0x08025100 }, { 0xD07, 0, 0x08025134 }, + { 0xD08, 0, 0x0802516C }, { 0xD09, 0, 0x080251B4 }, { 0xD0A, 0, 0x080251E0 }, { 0xD0B, 0, 0x08025260 }, + { 0xD0C, 0, 0x080252AC }, { 0xD0D, 0, 0x080252E4 }, { 0xD0E, 0, 0x08025330 }, { 0xD0F, 0, 0x08025358 }, + { 0xD10, 0, 0x08025394 }, { 0xD11, 0, 0x080253C8 }, { 0xD12, 0, 0x08025434 }, { 0xD13, 0, 0x0802547C }, + { 0xD14, 0, 0x080254C0 }, { 0xD15, 0, 0x0802550C }, { 0xD16, 0, 0x08025550 }, { 0xD17, 0, 0x080255A4 }, + { 0xD18, 0, 0x080255DC }, { 0xD19, 0, 0x080255FC }, { 0xD1A, 0, 0x0802563C }, { 0xD1B, 0, 0x080256C8 }, + { 0xD1C, 0, 0x08025708 }, { 0xD1D, 0, 0x0802575C }, { 0xD1E, 0, 0x080257B8 }, { 0xD1F, 0, 0x08025814 }, + { 0xD20, 0, 0x08025874 }, { 0xD21, 0, 0x080258EC }, { 0xD48, 0, 0x08025960 }, { 0xD49, 0, 0x0802597C }, + { 0xD4A, 0, 0x080259B8 }, { 0xD4B, 0, 0x080259F8 }, { 0xD4C, 0, 0x08025A9C }, { 0xD4D, 0, 0x08025AF4 }, + { 0xD4E, 0, 0x08025B4C }, { 0xD4F, 0, 0x08025B80 }, { 0xD5E, 0, 0x08025BBC }, { 0xD5F, 0, 0x08025BD8 }, + { 0xD60, 0, 0x08025BFC }, { 0xD61, 0, 0x08025C3C }, { 0xD62, 0, 0x08025C7C }, { 0xD63, 0, 0x08025CE0 }, + { 0xD64, 0, 0x08025D64 }, { 0xD65, 0, 0x08025D90 }, { 0xD66, 0, 0x08025DC0 }, { 0xD67, 0, 0x08025E34 }, + { 0xD68, 0, 0x08025E74 }, { 0xD69, 0, 0x08025EB0 }, { 0xD6A, 0, 0x08025EE4 }, { 0xD6B, 0, 0x08025F14 }, + { 0xD6C, 0, 0x08025F4C }, { 0xD6D, 0, 0x08025F9C }, { 0xD6E, 0, 0x08025FEC }, { 0xD6F, 0, 0x08026024 }, + { 0xD70, 0, 0x08026064 }, { 0xD71, 0, 0x080260D4 }, { 0xD72, 0, 0x0802613C }, { 0xD73, 0, 0x08026190 }, + { 0xD74, 0, 0x080261E4 }, { 0xD75, 0, 0x0802621C }, { 0xD76, 0, 0x0802626C }, { 0xD77, 0, 0x08026354 }, + { 0xD78, 0, 0x0802637C }, { 0xD79, 0, 0x080263C8 }, { 0xD7A, 0, 0x08026444 }, { 0xD7B, 0, 0x08026490 }, + { 0xD7C, 0, 0x080264EC }, { 0xD7D, 0, 0x08026548 }, { 0xD7E, 0, 0x08026598 }, { 0xD7F, 0, 0x080265C4 }, + { 0xD80, 0, 0x080265F8 }, { 0xD81, 0, 0x08026628 }, { 0xD82, 0, 0x08026658 }, { 0xD83, 0, 0x08026688 }, + { 0xD84, 0, 0x080266D0 }, { 0xD85, 0, 0x08026728 }, { 0xD86, 0, 0x08026770 }, { 0xD87, 0, 0x080267B4 }, + { 0xD88, 0, 0x08026850 }, { 0xD89, 0, 0x080268B0 }, { 0xD8A, 0, 0x08026998 }, { 0xD8B, 0, 0x08026A5C }, + { 0xDAC, 0, 0x08026AA0 }, { 0xDAD, 0, 0x08026AC8 }, { 0xDAE, 0, 0x08026B04 }, { 0xDAF, 0, 0x08026B9C }, + { 0xDB0, 0, 0x08026BDC }, { 0xDB1, 0, 0x08026C6C }, { 0xDB2, 0, 0x08026CD8 }, { 0xDB3, 0, 0x08026D4C }, + { 0xDB4, 0, 0x08026DB4 }, { 0xDB5, 0, 0x08026E34 }, { 0xDB6, 0, 0x08026EA4 }, { 0xDB7, 0, 0x08026EBC }, + { 0xDB8, 0, 0x08026EE8 }, { 0xDB9, 0, 0x08026F28 }, { 0xDBA, 0, 0x08026F70 }, { 0xDBB, 0, 0x08026FA0 }, + { 0xDBC, 0, 0x0802701C }, { 0xDBD, 0, 0x08027070 }, { 0xDBE, 0, 0x08027088 }, { 0xDBF, 0, 0x080270BC }, + { 0xDC0, 0, 0x080270E0 }, { 0xDC1, 0, 0x0802713C }, { 0xDC2, 0, 0x08027194 }, { 0xDC3, 0, 0x08027220 }, + { 0xDC4, 0, 0x0802727C }, { 0xDC5, 0, 0x08027300 }, { 0xDC6, 0, 0x08027334 }, { 0xDC7, 0, 0x08027370 }, + { 0xDC8, 0, 0x08027394 }, { 0xDC9, 0, 0x080273A8 }, { 0xDCA, 0, 0x080273D0 }, { 0xDCB, 0, 0x08027414 }, + { 0xDCC, 0, 0x0802744C }, { 0xDCD, 0, 0x080274BC }, { 0xDCE, 0, 0x08027500 }, { 0xDCF, 0, 0x080275D4 }, + { 0xDD0, 0, 0x0802762C }, { 0xDD1, 0, 0x08027668 }, { 0xDD2, 0, 0x08027684 }, { 0xDD3, 0, 0x080276D8 }, + { 0xDD4, 0, 0x08027710 }, { 0xDD5, 0, 0x0802773C }, { 0xDD6, 0, 0x08027760 }, { 0xDD7, 0, 0x08027798 }, + { 0xDD8, 0, 0x080277C0 }, { 0xDD9, 0, 0x08027824 }, { 0xDDA, 0, 0x080278AC }, { 0xDDB, 0, 0x08027934 }, + { 0xDDC, 0, 0x08027984 }, { 0xDDD, 0, 0x080279E8 }, { 0xDDE, 0, 0x08027A70 }, { 0xDDF, 0, 0x08027AE8 }, + { 0xDE0, 0, 0x08027B28 }, { 0xDE1, 0, 0x08027B84 }, { 0xDE2, 0, 0x08027BF4 }, { 0xDE3, 0, 0x08027C40 }, + { 0xDE4, 0, 0x08027C84 }, { 0xDE5, 0, 0x08027CC8 }, { 0xDE6, 0, 0x08027D3C }, { 0xDE7, 0, 0x08027D8C }, + { 0xDE8, 0, 0x08027DBC }, { 0xDE9, 0, 0x08027DEC }, { 0xDEA, 0, 0x08027E78 }, { 0xDEB, 0, 0x08027EBC }, + { 0xDEC, 0, 0x08027EE4 }, { 0xDED, 0, 0x08027F4C }, { 0xDEE, 0, 0x08027F9C }, { 0xDEF, 0, 0x0802800C }, + { 0xDF0, 0, 0x08028058 }, { 0xDF1, 0, 0x080280A4 }, { 0xDF2, 0, 0x080280DC }, { 0xDF3, 0, 0x08028134 }, + { 0xDF4, 0, 0x080281B0 }, { 0xDF5, 0, 0x080281E8 }, { 0xDF6, 0, 0x08028234 }, { 0xDF7, 0, 0x08028264 }, + { 0xDF8, 0, 0x080282C0 }, { 0xDF9, 0, 0x080282F8 }, { 0xDFA, 0, 0x08028378 }, { 0xDFB, 0, 0x080283C4 }, + { 0xDFC, 0, 0x080283FC }, { 0xDFD, 0, 0x08028444 }, { 0xDFE, 0, 0x08028478 }, { 0xDFF, 0, 0x080284BC }, + { 0xE02, 0, 0x080284F4 }, { 0xE03, 0, 0x08028540 }, { 0xE04, 0, 0x08028588 }, { 0xE05, 0, 0x080285C8 }, + { 0xE06, 0, 0x08028604 }, { 0xE07, 0, 0x08028620 }, { 0xE10, 0, 0x08028670 }, { 0xE11, 0, 0x080286AC }, + { 0xE12, 0, 0x08028744 }, { 0xE13, 0, 0x080287C4 }, { 0xE14, 0, 0x0802885C }, { 0xE15, 0, 0x08028940 }, + { 0xE16, 0, 0x080289D4 }, { 0xE17, 0, 0x08028A20 }, { 0xE18, 0, 0x08028A58 }, { 0xE19, 0, 0x08028AA8 }, + { 0xE1A, 0, 0x08028B5C }, { 0xE1B, 0, 0x08028B8C }, { 0xE1C, 0, 0x08028BF0 }, { 0xE1D, 0, 0x08028C38 }, + { 0xE1E, 0, 0x08028C98 }, { 0xE1F, 0, 0x08028CBC }, { 0xE20, 0, 0x08028D10 }, { 0xE21, 0, 0x08028D28 }, + { 0xE22, 0, 0x08028D68 }, { 0xE23, 0, 0x08028DC8 }, { 0xE24, 0, 0x08028E24 }, { 0xE25, 0, 0x08028E44 }, + { 0xE26, 0, 0x08028E88 }, { 0xE27, 0, 0x08028ED0 }, { 0xE28, 0, 0x08028EEC }, { 0xE29, 0, 0x08028F40 }, + { 0xE2A, 0, 0x08028F9C }, { 0xE2B, 0, 0x08029010 }, { 0xE2C, 0, 0x08029078 }, { 0xE2D, 0, 0x08029104 }, + { 0xE2E, 0, 0x08029174 }, { 0xE2F, 0, 0x080291D4 }, { 0xE30, 0, 0x08029238 }, { 0xE31, 0, 0x080292B8 }, + { 0xE32, 0, 0x0802933C }, { 0xE42, 0, 0x0802939C }, { 0xE43, 0, 0x080293FC }, { 0xE44, 0, 0x08029428 }, + { 0xE45, 0, 0x080294A8 }, { 0xE46, 0, 0x08029500 }, { 0xE47, 0, 0x080295A0 }, { 0xE48, 0, 0x080295C4 }, + { 0xE49, 0, 0x08029634 }, { 0xE4A, 0, 0x0802969C }, { 0xE4B, 0, 0x08029704 }, { 0xE4C, 0, 0x08029774 }, + { 0xE4D, 0, 0x080297D4 }, { 0xE4E, 0, 0x08029860 }, { 0xE4F, 0, 0x080298C8 }, { 0xE50, 0, 0x08029948 }, + { 0xE51, 0, 0x080299D0 }, { 0xE52, 0, 0x08029A30 }, { 0xE74, 0, 0x08029AC0 }, { 0xE75, 0, 0x08029B20 }, + { 0xE76, 0, 0x08029B74 }, { 0xE77, 0, 0x08029BD4 }, { 0xE78, 0, 0x08029C48 }, { 0xE79, 0, 0x08029C9C }, + { 0xE7A, 0, 0x08029CB0 }, { 0xE7B, 0, 0x08029CCC }, { 0xE7C, 0, 0x08029D58 }, { 0xE7D, 0, 0x08029DAC }, + { 0xE7E, 0, 0x08029DC0 }, { 0xE7F, 0, 0x08029E10 }, { 0xE80, 0, 0x08029E74 }, { 0xE81, 0, 0x08029ED4 }, + { 0xE82, 0, 0x08029F2C }, { 0xE83, 0, 0x08029F54 }, { 0xE84, 0, 0x08029FCC }, { 0xE85, 0, 0x0802A03C }, + { 0xE86, 0, 0x0802A090 }, { 0xE87, 0, 0x0802A0D8 }, { 0xE88, 0, 0x0802A128 }, { 0xE89, 0, 0x0802A1BC }, + { 0xE8A, 0, 0x0802A1F4 }, { 0xE8B, 0, 0x0802A260 }, { 0xE8C, 0, 0x0802A2A4 }, { 0xE8D, 0, 0x0802A2F4 }, + { 0xE8E, 0, 0x0802A334 }, { 0xE8F, 0, 0x0802A37C }, { 0xE90, 0, 0x0802A3DC }, { 0xE91, 0, 0x0802A448 }, + { 0xE92, 0, 0x0802A47C }, { 0xE93, 0, 0x0802A4A8 }, { 0xE94, 0, 0x0802A550 }, { 0xE95, 0, 0x0802A5B0 }, + { 0xE97, 0, 0x0802A608 }, { 0xE98, 0, 0x0802A69C }, { 0xE99, 0, 0x0802A6F0 }, { 0xFA0, 0, 0x0802A760 }, + { 0xFA1, 0, 0x0802A79C }, { 0xFA2, 0, 0x0802A7F4 }, { 0xFA3, 0, 0x0802A84C }, { 0xFA4, 0, 0x0802A8F4 }, + { 0xFA5, 0, 0x0802AA24 }, { 0xFA6, 0, 0x0802AAA0 }, { 0xFA7, 0, 0x0802AB04 }, { 0xFA8, 0, 0x0802ABA0 }, + { 0xFA9, 0, 0x0802AC08 }, { 0xFAA, 0, 0x0802ACA4 }, { 0xFAB, 0, 0x0802AD1C }, { 0xFAC, 0, 0x0802AD8C }, + { 0xFAD, 0, 0x0802ADF4 }, { 0xFAE, 0, 0x0802AE90 }, { 0xFAF, 0, 0x0802AF00 }, { 0xFB0, 0, 0x0802AF70 }, + { 0xFB1, 0, 0x0802B018 }, { 0xFB2, 0, 0x0802B0B8 }, { 0xFB3, 0, 0x0802B110 }, { 0xFB4, 0, 0x0802B190 }, + { 0xFB5, 0, 0x0802B24C }, { 0xFB6, 0, 0x0802B288 }, { 0xFB7, 0, 0x0802B2E4 }, { 0xFB8, 0, 0x0802B314 }, + { 0xFB9, 0, 0x0802B39C }, { 0xFBA, 0, 0x0802B40C }, { 0xFBB, 0, 0x0802B488 }, { 0xFBC, 0, 0x0802B4EC }, + { 0xFBD, 0, 0x0802B598 }, { 0xFBE, 0, 0x0802B650 }, { 0xFBF, 0, 0x0802B6F8 }, { 0x1004, 0, 0x0802B750 }, + { 0x1005, 0, 0x0802B778 }, { 0x1006, 0, 0x0802B7A0 }, { 0x1007, 0, 0x0802B7C8 }, { 0x1008, 0, 0x0802B7EC }, + { 0x1009, 0, 0x0802B84C }, { 0x100A, 0, 0x0802B890 }, { 0x100B, 0, 0x0802B8D8 }, { 0x100C, 0, 0x0802B908 }, + { 0x100D, 0, 0x0802B97C }, { 0x100E, 0, 0x0802BA00 }, { 0x100F, 0, 0x0802BA54 }, { 0x1010, 0, 0x0802BAC0 }, + { 0x1011, 0, 0x0802BB28 }, { 0x1012, 0, 0x0802BB94 }, { 0x1013, 0, 0x0802BC18 }, { 0x1014, 0, 0x0802BC44 }, + { 0x1015, 0, 0x0802BC88 }, { 0x1016, 0, 0x0802BCE0 }, { 0x1017, 0, 0x0802BD24 }, { 0x1018, 0, 0x0802BD8C }, + { 0x1019, 0, 0x0802BE18 }, { 0x101A, 0, 0x0802BE80 }, { 0x101B, 0, 0x0802BF84 }, { 0x101C, 0, 0x0802C048 }, + { 0x101D, 0, 0x0802C064 }, { 0x101E, 0, 0x0802C15C }, { 0x101F, 0, 0x0802C284 }, { 0x1020, 0, 0x0802C3BC }, + { 0x1021, 0, 0x0802C3D4 }, { 0x1022, 0, 0x0802C438 }, { 0x1023, 0, 0x0802C470 }, { 0x1024, 0, 0x0802C494 }, + { 0x1025, 0, 0x0802C4C4 }, { 0x1026, 0, 0x0802C4F8 }, { 0x1027, 0, 0x0802C564 }, { 0x1028, 0, 0x0802C5F8 }, + { 0x1029, 0, 0x0802C67C }, { 0x102A, 0, 0x0802C6DC }, { 0x102B, 0, 0x0802C73C }, { 0x102C, 0, 0x0802C798 }, + { 0x102D, 0, 0x0802C824 }, { 0x102E, 0, 0x0802C87C }, { 0x102F, 0, 0x0802C8B8 }, { 0x1030, 0, 0x0802C928 }, + { 0x1031, 0, 0x0802CA60 }, { 0x1032, 0, 0x0802CAB4 }, { 0x1033, 0, 0x0802CB00 }, { 0x1034, 0, 0x0802CB3C }, + { 0x1035, 0, 0x0802CB94 }, { 0x1036, 0, 0x0802CBF0 }, { 0x1037, 0, 0x0802CC28 }, { 0x1038, 0, 0x0802CC80 }, + { 0x1039, 0, 0x0802CCE0 }, { 0x103A, 0, 0x0802CD30 }, { 0x103B, 0, 0x0802CD64 }, { 0x103C, 0, 0x0802CDDC }, + { 0x1068, 0, 0x0802CE10 }, { 0x1069, 0, 0x0802CE64 }, { 0x106A, 0, 0x0802CF30 }, { 0x106B, 0, 0x0802CF90 }, + { 0x106C, 0, 0x0802CFD4 }, { 0x106D, 0, 0x0802D07C }, { 0x106E, 0, 0x0802D0C0 }, { 0x106F, 0, 0x0802D110 }, + { 0x1070, 0, 0x0802D178 }, { 0x1071, 0, 0x0802D1C4 }, { 0x1072, 0, 0x0802D234 }, { 0x1073, 0, 0x0802D27C }, + { 0x1074, 0, 0x0802D2BC }, { 0x1075, 0, 0x0802D314 }, { 0x1076, 0, 0x0802D354 }, { 0x1077, 0, 0x0802D3AC }, + { 0x1078, 0, 0x0802D3F0 }, { 0x1079, 0, 0x0802D434 }, { 0x107A, 0, 0x0802D4AC }, { 0x107B, 0, 0x0802D4EC }, + { 0x107C, 0, 0x0802D554 }, { 0x107D, 0, 0x0802D5A8 }, { 0x107E, 0, 0x0802D5FC }, { 0x107F, 0, 0x0802D69C }, + { 0x1080, 0, 0x0802D6E8 }, { 0x1081, 0, 0x0802D744 }, { 0x1082, 0, 0x0802D7A4 }, { 0x1083, 0, 0x0802D7EC }, + { 0x1084, 0, 0x0802D82C }, { 0x1085, 0, 0x0802D8B0 }, { 0x1086, 0, 0x0802D8F0 }, { 0x1087, 0, 0x0802D954 }, + { 0x1088, 0, 0x0802D9DC }, { 0x1089, 0, 0x0802DA24 }, { 0x108A, 0, 0x0802DA8C }, { 0x108B, 0, 0x0802DACC }, + { 0x108C, 0, 0x0802DB30 }, { 0x108D, 0, 0x0802DBA0 }, { 0x108E, 0, 0x0802DBF4 }, { 0x108F, 0, 0x0802DC28 }, + { 0x1090, 0, 0x0802DC94 }, { 0x1091, 0, 0x0802DCFC }, { 0x1092, 0, 0x0802DDC0 }, { 0x1093, 0, 0x0802DE18 }, + { 0x1094, 0, 0x0802DEA0 }, { 0x1095, 0, 0x0802DF10 }, { 0x1096, 0, 0x0802DF78 }, { 0x1097, 0, 0x0802DFE0 }, + { 0x1098, 0, 0x0802E024 }, { 0x1099, 0, 0x0802E088 }, { 0x109A, 0, 0x0802E170 }, { 0x109B, 0, 0x0802E1F8 }, + { 0x109C, 0, 0x0802E240 }, { 0x109D, 0, 0x0802E290 }, { 0x109E, 0, 0x0802E2D8 }, { 0x109F, 0, 0x0802E308 }, + { 0x10A0, 0, 0x0802E364 }, { 0x10A1, 0, 0x0802E3B8 }, { 0x10A2, 0, 0x0802E3DC }, { 0x10A3, 0, 0x0802E480 }, + { 0x10A4, 0, 0x0802E4D4 }, { 0x10A5, 0, 0x0802E53C }, { 0x10A6, 0, 0x0802E624 }, { 0x10A7, 0, 0x0802E68C }, + { 0x10A8, 0, 0x0802E738 }, { 0x10A9, 0, 0x0802E78C }, { 0x10CE, 0, 0x0802E830 }, { 0x10CF, 0, 0x0802E878 }, + { 0x10D0, 0, 0x0802E8CC }, { 0x10D1, 0, 0x0802E90C }, { 0x10D2, 0, 0x0802E970 }, { 0x10D3, 0, 0x0802E9A4 }, + { 0x10D4, 0, 0x0802E9D0 }, { 0x10D6, 0, 0x0802EA7C }, { 0x10D7, 0, 0x0802EB50 }, { 0x10D8, 0, 0x0802EB6C }, + { 0x10D9, 0, 0x0802EBA0 }, { 0x10DA, 0, 0x0802EBC8 }, { 0x10DB, 0, 0x0802EC10 }, { 0x10DC, 0, 0x0802EC40 }, + { 0x10DD, 0, 0x0802EC6C }, { 0x10DE, 0, 0x0802ECA8 }, { 0x10DF, 0, 0x0802ECD8 }, { 0x10E0, 0, 0x0802ED14 }, + { 0x10E1, 0, 0x0802ED40 }, { 0x10E2, 0, 0x0802ED68 }, { 0x10E3, 0, 0x0802EDA0 }, { 0x10E4, 0, 0x0802EE18 }, + { 0x10E5, 0, 0x0802EE44 }, { 0x10E6, 0, 0x0802EEB0 }, { 0x10E7, 0, 0x0802EEE8 }, { 0x10E8, 0, 0x0802EF24 }, + { 0x10E9, 0, 0x0802EF84 }, { 0x10EA, 0, 0x0802EFCC }, { 0x10EB, 0, 0x0802EFF8 }, { 0x10EC, 0, 0x0802F030 }, + { 0x10ED, 0, 0x0802F078 }, { 0x10EE, 0, 0x0802F0B4 }, { 0x10EF, 0, 0x0802F0E0 }, { 0x10F0, 0, 0x0802F110 }, + { 0x10F1, 0, 0x0802F14C }, { 0x10F2, 0, 0x0802F184 }, { 0x10F3, 0, 0x0802F1A8 }, { 0x10F4, 0, 0x0802F1D4 }, + { 0x10F5, 0, 0x0802F204 }, { 0x10F6, 0, 0x0802F258 }, { 0x10F7, 0, 0x0802F28C }, { 0x10F8, 0, 0x0802F2D4 }, + { 0x10F9, 0, 0x0802F30C }, { 0x10FA, 0, 0x0802F334 }, { 0x10FB, 0, 0x0802F3A8 }, { 0x10FC, 0, 0x0802F3D8 }, + { 0x10FD, 0, 0x0802F408 }, { 0x10FE, 0, 0x0802F44C }, { 0x10FF, 0, 0x0802F484 }, { 0x1100, 0, 0x0802F4CC }, + { 0x1101, 0, 0x0802F500 }, { 0x1102, 0, 0x0802F590 }, { 0x1103, 0, 0x0802F5CC }, { 0x1104, 0, 0x0802F604 }, + { 0x1105, 0, 0x0802F660 }, { 0x1106, 0, 0x0802F694 }, { 0x1107, 0, 0x0802F6B8 }, { 0x1108, 0, 0x0802F730 }, + { 0x1109, 0, 0x0802F7B4 }, { 0x1130, 0, 0x0802F7D8 }, { 0x1131, 0, 0x0802F7F4 }, { 0x1132, 0, 0x0802F82C }, + { 0x1133, 0, 0x0802F8C0 }, { 0x1134, 0, 0x0802F8E8 }, { 0x1135, 0, 0x0802F8F4 }, { 0x1136, 0, 0x0802F900 }, + { 0x1137, 0, 0x0802F960 }, { 0x1138, 0, 0x0802F9D0 }, { 0x1139, 0, 0x0802FA70 }, { 0x113A, 0, 0x0802FB2C }, + { 0x113B, 0, 0x0802FB64 }, { 0x113C, 0, 0x0802FBF4 }, { 0x113D, 0, 0x0802FC4C }, { 0x113E, 0, 0x0802FCA0 }, + { 0x113F, 0, 0x0802FD10 }, { 0x1140, 0, 0x0802FDA8 }, { 0x1141, 0, 0x0802FE38 }, { 0x1142, 0, 0x0802FE7C }, + { 0x1143, 0, 0x0802FEBC }, { 0x1144, 0, 0x0802FEF8 }, { 0x1145, 0, 0x0802FF58 }, { 0x1146, 0, 0x0802FFB4 }, + { 0x1147, 0, 0x08030004 }, { 0x1148, 0, 0x08030018 }, { 0x1149, 0, 0x080300B8 }, { 0x114A, 0, 0x08030114 }, + { 0x114B, 0, 0x08030170 }, { 0x114C, 0, 0x080301CC }, { 0x114D, 0, 0x08030228 }, { 0x114E, 0, 0x08030284 }, + { 0x114F, 0, 0x080302E0 }, { 0x1150, 0, 0x08030318 }, { 0x1151, 0, 0x080303C8 }, { 0x1152, 0, 0x080303DC }, + { 0x1194, 0, 0x08030438 }, { 0x1195, 0, 0x08030458 }, { 0x1196, 0, 0x080304AC }, { 0x1197, 0, 0x080304E0 }, + { 0x1198, 0, 0x08030578 }, { 0x1199, 0, 0x080305E4 }, { 0x119A, 0, 0x080305FC }, { 0x119B, 0, 0x08030638 }, + { 0x119C, 0, 0x080306D0 }, { 0x119D, 0, 0x08030748 }, { 0x119E, 0, 0x08030770 }, { 0x119F, 0, 0x08030784 }, + { 0x11A0, 0, 0x080307EC }, { 0x11A1, 0, 0x08030828 }, { 0x11A2, 0, 0x080308E0 }, { 0x11A3, 0, 0x08030918 }, + { 0x11A4, 0, 0x08030934 }, { 0x11A5, 0, 0x08030948 }, { 0x11A6, 0, 0x080309BC }, { 0x11A7, 0, 0x080309E8 }, + { 0x11A8, 0, 0x08030A38 }, { 0x11A9, 0, 0x08030A60 }, { 0x11AA, 0, 0x08030AA0 }, { 0x11AB, 0, 0x08030ADC }, + { 0x11AC, 0, 0x08030B10 }, { 0x11AD, 0, 0x08030B40 }, { 0x11AE, 0, 0x08030B80 }, { 0x11AF, 0, 0x08030BB4 }, + { 0x11F8, 0, 0x08030BFC }, { 0x11F9, 0, 0x08030C64 }, { 0x11FA, 0, 0x08030CA0 }, { 0x11FB, 0, 0x08030D28 }, + { 0x11FC, 0, 0x08030D58 }, { 0x11FD, 0, 0x08030E14 }, { 0x11FE, 0, 0x08030E94 }, { 0x11FF, 0, 0x08030F2C }, + { 0x1200, 0, 0x08030F6C }, { 0x1201, 0, 0x08031004 }, { 0x1202, 0, 0x08031038 }, { 0x1203, 0, 0x080310A4 }, + { 0x1204, 0, 0x08031110 }, { 0x1205, 0, 0x08031154 }, { 0x1206, 0, 0x080311EC }, { 0x1207, 0, 0x08031230 }, + { 0x1208, 0, 0x08031290 }, { 0x1209, 0, 0x080312C4 }, { 0x120A, 0, 0x08031304 }, { 0x120B, 0, 0x08031320 }, + { 0x120C, 0, 0x08031348 }, { 0x120D, 0, 0x08031390 }, { 0x120E, 0, 0x080313DC }, { 0x120F, 0, 0x08031470 }, + { 0x1210, 0, 0x08031498 }, { 0x1211, 0, 0x08031520 }, { 0x1212, 0, 0x08031580 }, { 0x1213, 0, 0x080315A8 }, + { 0x1214, 0, 0x08031644 }, { 0x1215, 0, 0x080316AC }, { 0x1216, 0, 0x08031708 }, { 0x1217, 0, 0x0803176C }, + { 0x1218, 0, 0x080317BC }, { 0x1219, 0, 0x080317E8 }, { 0x121A, 0, 0x08031834 }, { 0x121B, 0, 0x080318B8 }, + { 0x121C, 0, 0x08031900 }, { 0x121D, 0, 0x08031930 }, { 0x121E, 0, 0x08031984 }, { 0x121F, 0, 0x080319C8 }, + { 0x1220, 0, 0x08031A08 }, { 0x1221, 0, 0x08031A7C }, { 0x1222, 0, 0x08031AFC }, { 0x1223, 0, 0x08031B68 }, + { 0x1224, 0, 0x08031BC0 }, { 0x1225, 0, 0x08031C10 }, { 0x1226, 0, 0x08031CD4 }, { 0x1227, 0, 0x08031D38 }, + { 0x1228, 0, 0x08031DC0 }, { 0x1229, 0, 0x08031E00 }, { 0x122A, 0, 0x08031E54 }, { 0x122B, 0, 0x08031E80 }, + { 0x122C, 0, 0x08031EF8 }, { 0x122D, 0, 0x08031F1C }, { 0x122E, 0, 0x08031FA4 }, { 0x122F, 0, 0x0803202C }, + { 0x1230, 0, 0x08032050 }, { 0x1231, 0, 0x0803210C }, { 0x1232, 0, 0x08032148 }, { 0x1233, 0, 0x080321B4 }, + { 0x1234, 0, 0x08032200 }, { 0x1235, 0, 0x08032250 }, { 0x1236, 0, 0x080322C4 }, { 0x1237, 0, 0x08032330 }, + { 0x1238, 0, 0x08032364 }, { 0x1239, 0, 0x08032414 }, { 0x123A, 0, 0x08032464 }, { 0x123B, 0, 0x08032504 }, + { 0x123C, 0, 0x08032550 }, { 0x123D, 0, 0x080325A4 }, { 0x123E, 0, 0x08032638 }, { 0x123F, 0, 0x08032698 }, + { 0x1240, 0, 0x080326FC }, { 0x1241, 0, 0x080327D4 }, { 0x1242, 0, 0x0803284C }, { 0x1243, 0, 0x08032904 }, + { 0x1244, 0, 0x08032964 }, { 0x1245, 0, 0x080329B8 }, { 0x1246, 0, 0x080329E4 }, { 0x1247, 0, 0x08032A54 }, + { 0x1248, 0, 0x08032AC0 }, { 0x1249, 0, 0x08032B08 }, { 0x124A, 0, 0x08032B68 }, { 0x124B, 0, 0x08032BC4 }, + { 0x124C, 0, 0x08032BE0 }, { 0x124D, 0, 0x08032C24 }, { 0x124E, 0, 0x08032C68 }, { 0x124F, 0, 0x08032CD8 }, + { 0x1250, 0, 0x08032D1C }, { 0x1251, 0, 0x08032D6C }, { 0x1252, 0, 0x08032DE4 }, { 0x1253, 0, 0x08032E0C }, + { 0x1254, 0, 0x08032E60 }, { 0x1255, 0, 0x08032EC4 }, { 0x1256, 0, 0x08032F38 }, { 0x1257, 0, 0x08032F7C }, + { 0x1258, 0, 0x08032FF4 }, { 0x1259, 0, 0x08033030 }, { 0x125A, 0, 0x080330BC }, { 0x125B, 0, 0x080330F8 }, + { 0x125C, 0, 0x0803319C }, { 0x125D, 0, 0x08033224 }, { 0x125E, 0, 0x080332D0 }, { 0x125F, 0, 0x08033358 }, + { 0x1260, 0, 0x080333CC }, { 0x1261, 0, 0x08033410 }, { 0x1262, 0, 0x08033450 }, { 0x1263, 0, 0x080334BC }, + { 0x1264, 0, 0x080334F4 }, { 0x1265, 0, 0x0803353C }, { 0x1266, 0, 0x08033588 }, { 0x1267, 0, 0x080335F4 }, + { 0x1268, 0, 0x08033678 }, { 0x1269, 0, 0x0803370C }, { 0x126A, 0, 0x08033778 }, { 0x126B, 0, 0x080337CC }, + { 0x126C, 0, 0x08033830 }, { 0x126D, 0, 0x080338B0 }, { 0x126E, 0, 0x08033934 }, { 0x126F, 0, 0x0803397C }, + { 0x1270, 0, 0x080339F0 }, { 0x1271, 0, 0x08033A14 }, { 0x1272, 0, 0x08033A44 }, { 0x1273, 0, 0x08033A88 }, + { 0x1274, 0, 0x08033AE0 }, { 0x1275, 0, 0x08033B74 }, { 0x1276, 0, 0x08033BC0 }, { 0x1277, 0, 0x08033C24 }, + { 0x1278, 0, 0x08033CA0 }, { 0x1279, 0, 0x08033D10 }, { 0x127A, 0, 0x08033D80 }, { 0x127B, 0, 0x08033DB4 }, + { 0x127C, 0, 0x08033E18 }, { 0x127D, 0, 0x08033E68 }, { 0x127E, 0, 0x08033EB4 }, { 0x127F, 0, 0x08033F04 }, + { 0x1280, 0, 0x08033F58 }, { 0x1281, 0, 0x08033FB8 }, { 0x1282, 0, 0x08034014 }, { 0x1283, 0, 0x08034044 }, + { 0x1284, 0, 0x0803409C }, { 0x1285, 0, 0x080340EC }, { 0x1286, 0, 0x08034140 }, { 0x1287, 0, 0x080341A0 }, + { 0x1288, 0, 0x08034204 }, { 0x1289, 0, 0x08034248 }, { 0x128A, 0, 0x080342A8 }, { 0x128B, 0, 0x080342E0 }, + { 0x128C, 0, 0x08034314 }, { 0x128D, 0, 0x08034340 }, { 0x128E, 0, 0x08034368 }, { 0x128F, 0, 0x080343C8 }, + { 0x1290, 0, 0x0803445C }, { 0x1291, 0, 0x080344E8 }, { 0x1292, 0, 0x08034528 }, { 0x1293, 0, 0x08034538 }, + { 0x1294, 0, 0x08034578 }, { 0x1295, 0, 0x080345C4 }, { 0x1296, 0, 0x08034618 }, { 0x1297, 0, 0x08034680 }, + { 0x1298, 0, 0x080346AC }, { 0x1299, 0, 0x08034728 }, { 0x129A, 0, 0x0803479C }, { 0x129B, 0, 0x08034808 }, + { 0x129C, 0, 0x08034854 }, { 0x129D, 0, 0x08034888 }, { 0x129E, 0, 0x080348B4 }, { 0x129F, 0, 0x080348FC }, + { 0x12A0, 0, 0x08034938 }, { 0x12A1, 0, 0x08034984 }, { 0x12A2, 0, 0x080349C4 }, { 0x12A3, 0, 0x08034A24 }, + { 0x12A4, 0, 0x08034A80 }, { 0x12A5, 0, 0x08034AF0 }, { 0x12A6, 0, 0x08034B40 }, { 0x12A7, 0, 0x08034B74 }, + { 0x12A8, 0, 0x08034BCC }, { 0x12A9, 0, 0x08034C2C }, { 0x12AA, 0, 0x08034CA0 }, { 0x12AB, 0, 0x08034CDC }, + { 0x12AC, 0, 0x08034D50 }, { 0x12AD, 0, 0x08034D9C }, { 0x12AE, 0, 0x08034E10 }, { 0x12AF, 0, 0x08034E40 }, + { 0x12B0, 0, 0x08034E70 }, { 0x12B1, 0, 0x08034EDC }, { 0x12B2, 0, 0x08034F28 }, { 0x12B3, 0, 0x08034F74 }, + { 0x12B4, 0, 0x08034FA0 }, { 0x12B5, 0, 0x08034FF4 }, { 0x12B6, 0, 0x08035018 }, { 0x12B7, 0, 0x0803504C }, + { 0x12B8, 0, 0x08035078 }, { 0x12B9, 0, 0x080350C0 }, { 0x12BA, 0, 0x080350F0 }, { 0x12BB, 0, 0x08035134 }, + { 0x12BC, 0, 0x0803516C }, { 0x12BD, 0, 0x080351D0 }, { 0x12BE, 0, 0x0803521C }, { 0x12BF, 0, 0x08035288 }, + { 0x12C0, 0, 0x08035308 }, { 0x12C1, 0, 0x0803534C }, { 0x12C2, 0, 0x0803539C }, { 0x12C3, 0, 0x080353CC }, + { 0x12C4, 0, 0x08035410 }, { 0x12C5, 0, 0x08035470 }, { 0x12C6, 0, 0x080354B8 }, { 0x12C7, 0, 0x08035520 }, + { 0x12C8, 0, 0x08035560 }, { 0x12C9, 0, 0x08035604 }, { 0x12CA, 0, 0x0803566C }, { 0x12CB, 0, 0x080356A4 }, + { 0x12CC, 0, 0x080356E4 }, { 0x12CD, 0, 0x0803577C }, { 0x12CE, 0, 0x080357EC }, { 0x12CF, 0, 0x0803581C }, + { 0x12D0, 0, 0x08035848 }, { 0x12D1, 0, 0x08035888 }, { 0x12D2, 0, 0x080358D0 }, { 0x12D3, 0, 0x080358E8 }, + { 0x12D4, 0, 0x0803590C }, { 0x12D5, 0, 0x0803592C }, { 0x12D6, 0, 0x0803596C }, { 0x12D7, 0, 0x080359C4 }, + { 0x12D8, 0, 0x08035A10 }, { 0x12D9, 0, 0x08035A80 }, { 0x12DA, 0, 0x08035ADC }, { 0x12DB, 0, 0x08035B48 }, + { 0x12DC, 0, 0x08035BB8 }, { 0x12DD, 0, 0x08035BF8 }, { 0x12DE, 0, 0x08035C74 }, { 0x12DF, 0, 0x08035CB0 }, + { 0x12E0, 0, 0x08035D10 }, { 0x12E3, 0, 0x08035D4C }, { 0x12E4, 0, 0x08035D70 }, { 0x12E5, 0, 0x08035DAC }, + { 0x12E6, 0, 0x08035DD8 }, { 0x12E7, 0, 0x08035DF4 }, { 0x12E8, 0, 0x08035E0C }, { 0x12E9, 0, 0x08035E58 }, + { 0x12EA, 0, 0x08035ED4 }, { 0x12EB, 0, 0x08035F44 }, { 0x12EC, 0, 0x08036074 }, { 0x12ED, 0, 0x080360BC }, + { 0x12EE, 0, 0x08036104 }, { 0x12EF, 0, 0x0803613C }, { 0x12F0, 0, 0x080361A0 }, { 0x12F1, 0, 0x080361F0 }, + { 0x12F2, 0, 0x08036248 }, { 0x12F3, 0, 0x08036260 }, { 0x12F4, 0, 0x080362A0 }, { 0x12F5, 0, 0x08036300 }, + { 0x12F6, 0, 0x08036324 }, { 0x12F7, 0, 0x080363A0 }, { 0x12F8, 0, 0x0803640C }, { 0x12F9, 0, 0x08036474 }, + { 0x12FA, 0, 0x080364CC }, { 0x12FB, 0, 0x08036508 }, { 0x12FC, 0, 0x0803655C }, { 0x12FD, 0, 0x08036578 }, + { 0x12FE, 0, 0x080365D4 }, { 0x12FF, 0, 0x080365F8 }, { 0x1300, 0, 0x08036654 }, { 0x1301, 0, 0x080366A4 }, + { 0x1302, 0, 0x080366F0 }, { 0x1303, 0, 0x08036738 }, { 0x1304, 0, 0x08036770 }, { 0x1305, 0, 0x080367AC }, + { 0x1306, 0, 0x080367F0 }, { 0x1307, 0, 0x08036830 }, { 0x1308, 0, 0x08036850 }, { 0x1309, 0, 0x0803688C }, + { 0x130A, 0, 0x080368F0 }, { 0x130B, 0, 0x08036924 }, { 0x130C, 0, 0x0803695C }, { 0x130D, 0, 0x080369A8 }, + { 0x130E, 0, 0x080369FC }, { 0x130F, 0, 0x08036A40 }, { 0x1310, 0, 0x08036A74 }, { 0x1311, 0, 0x08036AB8 }, + { 0x1312, 0, 0x08036B14 }, { 0x1313, 0, 0x08036B4C }, { 0x1314, 0, 0x08036BAC }, { 0x1315, 0, 0x08036C0C }, + { 0x1316, 0, 0x08036C64 }, { 0x1317, 0, 0x08036CBC }, { 0x1318, 0, 0x08036D1C }, { 0x1319, 0, 0x08036D80 }, + { 0x131A, 0, 0x08036DC4 }, { 0x131B, 0, 0x08036E0C }, { 0x131C, 0, 0x08036E8C }, { 0x131D, 0, 0x08036F14 }, + { 0x1388, 0, 0x08036F8C }, { 0x1389, 0, 0x08036FB4 }, { 0x138A, 0, 0x08036FF8 }, { 0x138B, 0, 0x08037034 }, + { 0x138C, 0, 0x08037060 }, { 0x138D, 0, 0x0803709C }, { 0x138E, 0, 0x0803711C }, { 0x138F, 0, 0x08037140 }, + { 0x1390, 0, 0x08037178 }, { 0x1391, 0, 0x080371AC }, { 0x1392, 0, 0x08037204 }, { 0x1393, 0, 0x08037234 }, + { 0x1394, 0, 0x08037288 }, { 0x1395, 0, 0x080372BC }, { 0x1396, 0, 0x080372F0 }, { 0x1397, 0, 0x08037310 }, + { 0x1398, 0, 0x08037338 }, { 0x1399, 0, 0x080373C4 }, { 0x139A, 0, 0x08037438 }, { 0x139B, 0, 0x080374A0 }, + { 0x139C, 0, 0x0803751C }, { 0x139D, 0, 0x0803758C }, { 0x139E, 0, 0x08037620 }, { 0x139F, 0, 0x08037704 }, + { 0x13A0, 0, 0x08037764 }, { 0x13A1, 0, 0x080377F4 }, { 0x13A2, 0, 0x08037838 }, { 0x13A3, 0, 0x08037894 }, + { 0x13A4, 0, 0x08037918 }, { 0x13A5, 0, 0x08037974 }, { 0x13A6, 0, 0x080379CC }, { 0x13A7, 0, 0x08037A68 }, + { 0x13A8, 0, 0x08037ACC }, { 0x13AE, 0, 0x08037B5C }, { 0x13AF, 0, 0x08037BF8 }, { 0x13B0, 0, 0x08037CE0 }, + { 0x13B1, 0, 0x08037D2C }, { 0x13B2, 0, 0x08037D54 }, { 0x13B3, 0, 0x08037D74 }, { 0x13EC, 0, 0x08037DB8 }, + { 0x13ED, 0, 0x08037DCC }, { 0x13EE, 0, 0x08037E30 }, { 0x13EF, 0, 0x08037EB4 }, { 0x13F0, 0, 0x08037EF4 }, + { 0x13F1, 0, 0x08037F34 }, { 0x13F2, 0, 0x08037F74 }, { 0x13F3, 0, 0x08037F8C }, { 0x13F4, 0, 0x08037FA4 }, + { 0x13F5, 0, 0x08037FC8 }, { 0x13F6, 0, 0x08037FF8 }, { 0x13F7, 0, 0x0803800C }, { 0x13F8, 0, 0x0803803C }, + { 0x13F9, 0, 0x08038084 }, { 0x13FA, 0, 0x080380C8 }, { 0x13FB, 0, 0x08038108 }, { 0x13FC, 0, 0x080381A4 }, + { 0x13FD, 0, 0x080381FC }, { 0x13FE, 0, 0x08038254 }, { 0x13FF, 0, 0x080382D8 }, { 0x1400, 0, 0x080383A8 }, + { 0x1401, 0, 0x08038504 }, { 0x1402, 0, 0x080385A8 }, { 0x1403, 0, 0x08038630 }, { 0x1404, 0, 0x0803868C }, + { 0x1405, 0, 0x080386C4 }, { 0x1406, 0, 0x08038728 }, { 0x1407, 0, 0x08038824 }, { 0x1408, 0, 0x08038844 }, + { 0x1409, 0, 0x080388F4 }, { 0x140A, 0, 0x08038984 }, { 0x140B, 0, 0x080389D0 }, { 0x140C, 0, 0x08038A3C }, + { 0x140D, 0, 0x08038A88 }, { 0x140E, 0, 0x08038AE8 }, { 0x140F, 0, 0x08038B20 }, { 0x1410, 0, 0x08038B60 }, + { 0x1411, 0, 0x08038BBC }, { 0x1412, 0, 0x08038BF4 }, { 0x1413, 0, 0x08038C34 }, { 0x1414, 0, 0x08038CC0 }, + { 0x1450, 0, 0x08038D04 }, { 0x1451, 0, 0x08038EC4 }, { 0x1452, 0, 0x08038EF8 }, { 0x1453, 0, 0x08038F10 }, + { 0x1454, 0, 0x08038F50 }, { 0x1455, 0, 0x08038F9C }, { 0x1456, 0, 0x08038FE4 }, { 0x1457, 0, 0x08039064 }, + { 0x1458, 0, 0x080390A8 }, { 0x1459, 0, 0x080390D4 }, { 0x145A, 0, 0x08039128 }, { 0x145B, 0, 0x08039198 }, + { 0x145C, 0, 0x080391C4 }, { 0x145D, 0, 0x080391D8 }, { 0x145E, 0, 0x08039204 }, { 0x145F, 0, 0x080392B0 }, + { 0x1460, 0, 0x08039360 }, { 0x1461, 0, 0x080393A8 }, { 0x1462, 0, 0x080393BC }, { 0x1463, 0, 0x080393EC }, + { 0x1464, 0, 0x0803940C }, { 0x1465, 0, 0x0803942C }, { 0x1466, 0, 0x08039454 }, { 0x1467, 0, 0x0803948C }, + { 0x1468, 0, 0x080394E8 }, { 0x1469, 0, 0x08039548 }, { 0x146A, 0, 0x080395A8 }, { 0x146B, 0, 0x08039638 }, + { 0x146C, 0, 0x08039700 }, { 0x146D, 0, 0x08039738 }, { 0x146E, 0, 0x08039758 }, { 0x146F, 0, 0x080397D8 }, + { 0x1470, 0, 0x08039858 }, { 0x1471, 0, 0x08039880 }, { 0x1472, 0, 0x080398B8 }, { 0x1473, 0, 0x08039924 }, + { 0x1474, 0, 0x08039950 }, { 0x1475, 0, 0x08039A64 }, { 0x1476, 0, 0x08039AE8 }, { 0x1477, 0, 0x08039B4C }, + { 0x1478, 0, 0x08039B70 }, { 0x1479, 0, 0x08039B98 }, { 0x147A, 0, 0x08039BCC }, { 0x147B, 0, 0x08039C00 }, + { 0x147C, 0, 0x08039D6C }, { 0x147D, 0, 0x08039E18 }, { 0x14B4, 0, 0x08039E78 }, { 0x14B5, 0, 0x08039EA8 }, + { 0x14B6, 0, 0x08039EF8 }, { 0x14B7, 0, 0x08039F64 }, { 0x14B8, 0, 0x08039F90 }, { 0x14B9, 0, 0x08039FE4 }, + { 0x14BA, 0, 0x0803A044 }, { 0x14BB, 0, 0x0803A090 }, { 0x14BC, 0, 0x0803A110 }, { 0x14BD, 0, 0x0803A138 }, + { 0x14BE, 0, 0x0803A1B8 }, { 0x14BF, 0, 0x0803A208 }, { 0x14C0, 0, 0x0803A25C }, { 0x14C1, 0, 0x0803A29C }, + { 0x14C2, 0, 0x0803A2E8 }, { 0x14C3, 0, 0x0803A384 }, { 0x14C4, 0, 0x0803A3FC }, { 0x14C5, 0, 0x0803A458 }, + { 0x14C6, 0, 0x0803A514 }, { 0x14C7, 0, 0x0803A540 }, { 0x14C8, 0, 0x0803A570 }, { 0x14C9, 0, 0x0803A5E4 }, + { 0x14CA, 0, 0x0803A614 }, { 0x14CB, 0, 0x0803A684 }, { 0x14CC, 0, 0x0803A700 }, { 0x14CD, 0, 0x0803A79C }, + { 0x14CE, 0, 0x0803A7B8 }, { 0x14CF, 0, 0x0803A880 }, { 0x14D0, 0, 0x0803A8AC }, { 0x14D1, 0, 0x0803A96C }, + { 0x14D2, 0, 0x0803AA08 }, { 0x14D3, 0, 0x0803AA80 }, { 0x14D4, 0, 0x0803AB40 }, { 0x14D5, 0, 0x0803AB80 }, + { 0x14D6, 0, 0x0803ABC0 }, { 0x14D7, 0, 0x0803AC30 }, { 0x14D8, 0, 0x0803AC78 }, { 0x14D9, 0, 0x0803ACEC }, + { 0x14DA, 0, 0x0803AD64 }, { 0x14DB, 0, 0x0803AD8C }, { 0x14DC, 0, 0x0803ADB8 }, { 0x14DD, 0, 0x0803ADEC }, + { 0x14DE, 0, 0x0803AE40 }, { 0x14DF, 0, 0x0803AEAC }, { 0x14E0, 0, 0x0803AEFC }, { 0x14E1, 0, 0x0803AF58 }, + { 0x14E2, 0, 0x0803AFDC }, { 0x14E3, 0, 0x0803B018 }, { 0x14E4, 0, 0x0803B044 }, { 0x14E5, 0, 0x0803B07C }, + { 0x14E6, 0, 0x0803B100 }, { 0x14E7, 0, 0x0803B13C }, { 0x14E8, 0, 0x0803B19C }, { 0x14E9, 0, 0x0803B220 }, + { 0x14EA, 0, 0x0803B2A0 }, { 0x14EB, 0, 0x0803B358 }, { 0x14EC, 0, 0x0803B398 }, { 0x14ED, 0, 0x0803B40C }, + { 0x14EE, 0, 0x0803B518 }, { 0x14EF, 0, 0x0803B5F8 }, { 0x14F0, 0, 0x0803B63C }, { 0x14F1, 0, 0x0803B6A8 }, + { 0x14F2, 0, 0x0803B734 }, { 0x14F3, 0, 0x0803B7B8 }, { 0x14F4, 0, 0x0803B834 }, { 0x14F5, 0, 0x0803B910 }, + { 0x14F6, 0, 0x0803B984 }, { 0x14F7, 0, 0x0803B9F0 }, { 0x14F8, 0, 0x0803BA80 }, { 0x14F9, 0, 0x0803BAB8 }, + { 0x14FA, 0, 0x0803BAF8 }, { 0x14FB, 0, 0x0803BB60 }, { 0x14FC, 0, 0x0803BB8C }, { 0x1518, 0, 0x0803BBFC }, + { 0x1519, 0, 0x0803BC5C }, { 0x151A, 0, 0x0803BCB0 }, { 0x151B, 0, 0x0803BCC8 }, { 0x151C, 0, 0x0803BCF8 }, + { 0x151D, 0, 0x0803BD44 }, { 0x151E, 0, 0x0803BDB8 }, { 0x151F, 0, 0x0803BDFC }, { 0x1520, 0, 0x0803BE9C }, + { 0x1521, 0, 0x0803BF18 }, { 0x1522, 0, 0x0803BF64 }, { 0x1523, 0, 0x0803BF8C }, { 0x1524, 0, 0x0803BFA4 }, + { 0x1525, 0, 0x0803BFD8 }, { 0x1526, 0, 0x0803BFF8 }, { 0x1527, 0, 0x0803C014 }, { 0x1528, 0, 0x0803C068 }, + { 0x1529, 0, 0x0803C0EC }, { 0x152A, 0, 0x0803C174 }, { 0x152B, 0, 0x0803C1CC }, { 0x152C, 0, 0x0803C22C }, + { 0x152D, 0, 0x0803C290 }, { 0x152E, 0, 0x0803C314 }, { 0x152F, 0, 0x0803C398 }, { 0x1530, 0, 0x0803C3F0 }, + { 0x1531, 0, 0x0803C454 }, { 0x1532, 0, 0x0803C4DC }, { 0x1533, 0, 0x0803C518 }, { 0x1534, 0, 0x0803C564 }, + { 0x1535, 0, 0x0803C5A4 }, { 0x1536, 0, 0x0803C5E4 }, { 0x1537, 0, 0x0803C644 }, { 0x1538, 0, 0x0803C6C8 }, + { 0x1539, 0, 0x0803C744 }, { 0x153A, 0, 0x0803C7E0 }, { 0x153B, 0, 0x0803C80C }, { 0x153C, 0, 0x0803C84C }, + { 0x153D, 0, 0x0803C884 }, { 0x153E, 0, 0x0803C89C }, { 0x153F, 0, 0x0803C8DC }, { 0x1540, 0, 0x0803C908 }, + { 0x1541, 0, 0x0803C944 }, { 0x1542, 0, 0x0803C9A0 }, { 0x157C, 0, 0x0803C9BC }, { 0x157D, 0, 0x0803C9D4 }, + { 0x157E, 0, 0x0803CA30 }, { 0x157F, 0, 0x0803CA70 }, { 0x1580, 0, 0x0803CAA0 }, { 0x1581, 0, 0x0803CAEC }, + { 0x1582, 0, 0x0803CB04 }, { 0x1583, 0, 0x0803CB18 }, { 0x1584, 0, 0x0803CB30 }, { 0x1585, 0, 0x0803CB64 }, + { 0x1586, 0, 0x0803CBD8 }, { 0x1587, 0, 0x0803CBF4 }, { 0x1588, 0, 0x0803CC34 }, { 0x1589, 0, 0x0803CC78 }, + { 0x158A, 0, 0x0803CD14 }, { 0x158B, 0, 0x0803CDA0 }, { 0x158C, 0, 0x0803CDE0 }, { 0x158D, 0, 0x0803CE3C }, + { 0x158E, 0, 0x0803CEA8 }, { 0x158F, 0, 0x0803CEE8 }, { 0x1590, 0, 0x0803CF30 }, { 0x1591, 0, 0x0803CFA4 }, + { 0x1592, 0, 0x0803D050 }, { 0x1593, 0, 0x0803D0C8 }, { 0x1594, 0, 0x0803D118 }, { 0x1595, 0, 0x0803D168 }, + { 0x1596, 0, 0x0803D1A8 }, { 0x1597, 0, 0x0803D1F0 }, { 0x1598, 0, 0x0803D228 }, { 0x1599, 0, 0x0803D290 }, + { 0x159A, 0, 0x0803D2FC }, { 0x159B, 0, 0x0803D368 }, { 0x159C, 0, 0x0803D448 }, { 0x159D, 0, 0x0803D4C0 }, + { 0x159E, 0, 0x0803D500 }, { 0x159F, 0, 0x0803D558 }, { 0x15A0, 0, 0x0803D5B4 }, { 0x15A1, 0, 0x0803D628 }, + { 0x15A2, 0, 0x0803D730 }, { 0x15A3, 0, 0x0803D798 }, { 0x15A4, 0, 0x0803D818 }, { 0x15A5, 0, 0x0803D868 }, + { 0x15A6, 0, 0x0803D8C4 }, { 0x15A7, 0, 0x0803D9AC }, { 0x15A8, 0, 0x0803D9FC }, { 0x15E0, 0, 0x0803DA3C }, + { 0x15E1, 0, 0x0803DA80 }, { 0x15E2, 0, 0x0803DB14 }, { 0x15E3, 0, 0x0803DB9C }, { 0x15E4, 0, 0x0803DC1C }, + { 0x15E5, 0, 0x0803DC70 }, { 0x15E6, 0, 0x0803DCA8 }, { 0x15E7, 0, 0x0803DCF8 }, { 0x15E8, 0, 0x0803DD5C }, + { 0x15E9, 0, 0x0803DE00 }, { 0x15EA, 0, 0x0803DE5C }, { 0x15EB, 0, 0x0803DE84 }, { 0x15EC, 0, 0x0803DED0 }, + { 0x15ED, 0, 0x0803DF34 }, { 0x15EE, 0, 0x0803DF64 }, { 0x15EF, 0, 0x0803DF9C }, { 0x15F0, 0, 0x0803DFBC }, + { 0x15F1, 0, 0x0803E018 }, { 0x15F2, 0, 0x0803E0B8 }, { 0x15F3, 0, 0x0803E124 }, { 0x15F4, 0, 0x0803E178 }, + { 0x15F5, 0, 0x0803E1E0 }, { 0x15F6, 0, 0x0803E298 }, { 0x15F7, 0, 0x0803E310 }, { 0x15F8, 0, 0x0803E36C }, + { 0x15F9, 0, 0x0803E3D0 }, { 0x15FA, 0, 0x0803E420 }, { 0x15FB, 0, 0x0803E454 }, { 0x15FC, 0, 0x0803E488 }, + { 0x15FD, 0, 0x0803E4E8 }, { 0x15FE, 0, 0x0803E59C }, { 0x15FF, 0, 0x0803E620 }, { 0x1600, 0, 0x0803E66C }, + { 0x1601, 0, 0x0803E70C }, { 0x1602, 0, 0x0803E74C }, { 0x1603, 0, 0x0803E7A4 }, { 0x1604, 0, 0x0803E7DC }, + { 0x1605, 0, 0x0803E804 }, { 0x1606, 0, 0x0803E864 }, { 0x1607, 0, 0x0803E8E8 }, { 0x1608, 0, 0x0803E930 }, + { 0x1609, 0, 0x0803E9E4 }, { 0x160A, 0, 0x0803EA4C }, { 0x160B, 0, 0x0803EAB0 }, { 0x160C, 0, 0x0803EB18 }, + { 0x160D, 0, 0x0803EB58 }, { 0x160E, 0, 0x0803EBA8 }, { 0x160F, 0, 0x0803EBFC }, { 0x1610, 0, 0x0803EC9C }, + { 0x1611, 0, 0x0803ED14 }, { 0x1612, 0, 0x0803EE08 }, { 0x1613, 0, 0x0803EE48 }, { 0x1614, 0, 0x0803EEB0 }, + { 0x1615, 0, 0x0803EEF0 }, { 0x1616, 0, 0x0803EFAC }, { 0x1617, 0, 0x0803F004 }, { 0x1618, 0, 0x0803F04C }, + { 0x1619, 0, 0x0803F078 }, { 0x161A, 0, 0x0803F0E0 }, { 0x161B, 0, 0x0803F110 }, { 0x161C, 0, 0x0803F15C }, + { 0x161D, 0, 0x0803F1EC }, { 0x161E, 0, 0x0803F264 }, { 0x161F, 0, 0x0803F2CC }, { 0x1620, 0, 0x0803F344 }, + { 0x1621, 0, 0x0803F3A8 }, { 0x1622, 0, 0x0803F3F4 }, { 0x1623, 0, 0x0803F46C }, { 0x1624, 0, 0x0803F4AC }, + { 0x1625, 0, 0x0803F500 }, { 0x1626, 0, 0x0803F608 }, { 0x1627, 0, 0x0803F66C }, { 0x1628, 0, 0x0803F6E8 }, + { 0x1629, 0, 0x0803F718 }, { 0x162A, 0, 0x0803F760 }, { 0x162B, 0, 0x0803F7C0 }, { 0x162C, 0, 0x0803F87C }, + { 0x162D, 0, 0x0803F8A8 }, { 0x162E, 0, 0x0803F8EC }, { 0x162F, 0, 0x0803F94C }, { 0x1630, 0, 0x0803F978 }, + { 0x1631, 0, 0x0803F9DC }, { 0x1632, 0, 0x0803FA3C }, { 0x1633, 0, 0x0803FA78 }, { 0x1634, 0, 0x0803FAC4 }, + { 0x1635, 0, 0x0803FB0C }, { 0x1636, 0, 0x0803FB5C }, { 0x1637, 0, 0x0803FBCC }, { 0x1638, 0, 0x0803FC50 }, + { 0x1644, 0, 0x0803FC6C }, { 0x1645, 0, 0x0803FD0C }, { 0x1646, 0, 0x0803FD5C }, { 0x1647, 0, 0x0803FDC0 }, + { 0x1648, 0, 0x0803FE08 }, { 0x1649, 0, 0x0803FE54 }, { 0x164A, 0, 0x0803FEB4 }, { 0x164B, 0, 0x0803FF88 }, + { 0x164C, 0, 0x0803FFF4 }, { 0x164D, 0, 0x08040064 }, { 0x164E, 0, 0x080400BC }, { 0x164F, 0, 0x0804010C }, + { 0x1650, 0, 0x08040174 }, { 0x1651, 0, 0x0804019C }, { 0x1652, 0, 0x08040208 }, { 0x1653, 0, 0x08040250 }, + { 0x1654, 0, 0x080402B0 }, { 0x1655, 0, 0x080402CC }, { 0x1656, 0, 0x0804032C }, { 0x1657, 0, 0x0804035C }, + { 0x1658, 0, 0x080403C0 }, { 0x1659, 0, 0x08040494 }, { 0x165A, 0, 0x08040530 }, { 0x165B, 0, 0x0804054C }, + { 0x165C, 0, 0x080405AC }, { 0x165D, 0, 0x080405E0 }, { 0x165E, 0, 0x08040624 }, { 0x165F, 0, 0x0804070C }, + { 0x1660, 0, 0x08040798 }, { 0x1661, 0, 0x080407C0 }, { 0x1700, 0, 0x08040848 }, { 0x1701, 0, 0x080408E4 }, + { 0x1702, 0, 0x0804092C }, { 0x1703, 0, 0x08040988 }, { 0x1704, 0, 0x080409D4 }, { 0x1705, 0, 0x08040A28 }, + { 0x1706, 0, 0x08040ABC }, { 0x1707, 0, 0x08040B0C }, { 0x1708, 0, 0x08040B50 }, { 0x1709, 0, 0x08040BA4 }, + { 0x170A, 0, 0x08040C18 }, { 0x170B, 0, 0x08040C60 }, { 0x170C, 0, 0x08040C6C }, { 0x170D, 0, 0x08040CC8 }, + { 0x170E, 0, 0x08040D38 }, { 0x170F, 0, 0x08040DBC }, { 0x1710, 0, 0x08040E0C }, { 0x1711, 0, 0x08040E84 }, + { 0x1712, 0, 0x08040E90 }, { 0x1713, 0, 0x08040EE8 }, { 0x1714, 0, 0x08040F30 }, { 0x1715, 0, 0x08040F78 }, + { 0x1716, 0, 0x08040FD0 }, { 0x1717, 0, 0x08041050 }, { 0x1718, 0, 0x08041084 }, { 0x1719, 0, 0x080410E8 }, + { 0x171A, 0, 0x08041128 }, { 0x171B, 0, 0x08041170 }, { 0x171C, 0, 0x080411BC }, { 0x171D, 0, 0x080411C8 }, + { 0x171E, 0, 0x0804122C }, { 0x171F, 0, 0x0804125C }, { 0x1720, 0, 0x080412A8 }, { 0x1721, 0, 0x080412E8 }, + { 0x1722, 0, 0x0804132C }, { 0x1723, 0, 0x08041378 }, { 0x1724, 0, 0x080413C0 }, { 0x1725, 0, 0x08041414 }, + { 0x1726, 0, 0x08041470 }, { 0x1727, 0, 0x0804147C }, { 0x1728, 0, 0x08041488 }, { 0x1729, 0, 0x080414D0 }, + { 0x172A, 0, 0x08041530 }, { 0x172B, 0, 0x08041588 }, { 0x172C, 0, 0x080415E4 }, { 0x172D, 0, 0x08041640 }, + { 0x172E, 0, 0x08041698 }, { 0x172F, 0, 0x080416FC }, { 0x1730, 0, 0x08041740 }, { 0x1731, 0, 0x08041794 }, + { 0x1732, 0, 0x080417A0 }, { 0x1733, 0, 0x080417F4 }, { 0x1734, 0, 0x08041848 }, { 0x1735, 0, 0x0804189C }, + { 0x1736, 0, 0x08041900 }, { 0x1737, 0, 0x08041958 }, { 0x1738, 0, 0x080419A8 }, { 0x1739, 0, 0x080419F4 }, + { 0x173A, 0, 0x08041A54 }, { 0x173B, 0, 0x08041AA0 }, { 0x173C, 0, 0x08041AF8 }, { 0x173D, 0, 0x08041B54 }, + { 0x173E, 0, 0x08041BA4 }, { 0x173F, 0, 0x08041BF4 }, { 0x1740, 0, 0x08041C48 }, { 0x1741, 0, 0x08041CAC }, + { 0x1742, 0, 0x08041D08 }, { 0x1743, 0, 0x08041D68 }, { 0x1744, 0, 0x08041DB4 }, { 0x1745, 0, 0x08041DF8 }, + { 0x1746, 0, 0x08041E54 }, { 0x1747, 0, 0x08041EB0 }, { 0x1748, 0, 0x08041F2C }, { 0x1749, 0, 0x08041F78 }, + { 0x1784, 0, 0x08041FD0 }, { 0x1785, 0, 0x0804202C }, { 0x1786, 0, 0x08042088 }, { 0x1787, 0, 0x080420E4 }, + { 0x1788, 0, 0x080420F0 }, { 0x1789, 0, 0x0804214C }, { 0x178A, 0, 0x080421B0 }, { 0x178B, 0, 0x080421F4 }, + { 0x178C, 0, 0x0804223C }, { 0x178D, 0, 0x08042288 }, { 0x178E, 0, 0x080422CC }, { 0x178F, 0, 0x08042314 }, + { 0x1798, 0, 0x08042360 }, { 0x1799, 0, 0x080423AC }, { 0x179A, 0, 0x080423F4 }, { 0x179B, 0, 0x08042440 }, + { 0x17AA, 0, 0x08042490 }, { 0x17AC, 0, 0x08042514 }, { 0x17AD, 0, 0x08042568 }, { 0x17AE, 0, 0x080425C0 }, + { 0x17AF, 0, 0x0804262C }, { 0x1800, 0, 0x080426AC }, { 0x1801, 0, 0x080426CC }, { 0x1802, 0, 0x0804272C }, + { 0x1803, 0, 0x08042754 }, { 0x1804, 0, 0x08042784 }, { 0x1805, 0, 0x080427E0 }, { 0x1806, 0, 0x08042834 }, + { 0x1807, 0, 0x08042870 }, { 0x1808, 0, 0x080428D0 }, { 0x1809, 0, 0x08042910 }, { 0x180A, 0, 0x0804293C }, + { 0x180B, 0, 0x08042968 }, { 0x180C, 0, 0x08042990 }, { 0x180D, 0, 0x080429AC }, { 0x180E, 0, 0x08042A04 }, + { 0x180F, 0, 0x08042A50 }, { 0x1810, 0, 0x08042A80 }, { 0x1811, 0, 0x08042AB4 }, { 0x1812, 0, 0x08042AF8 }, + { 0x1813, 0, 0x08042B38 }, { 0x1814, 0, 0x08042B6C }, { 0x1815, 0, 0x08042BAC }, { 0x1816, 0, 0x08042C04 }, + { 0x1817, 0, 0x08042C4C }, { 0x1818, 0, 0x08042C8C }, { 0x1819, 0, 0x08042CB8 }, { 0x181A, 0, 0x08042CEC }, + { 0x181B, 0, 0x08042D28 }, { 0x181C, 0, 0x08042D34 }, { 0x181D, 0, 0x08042D94 }, { 0x181E, 0, 0x08042DD8 }, + { 0x181F, 0, 0x08042DF0 }, { 0x1820, 0, 0x08042E40 }, { 0x1821, 0, 0x08042E7C }, { 0x1822, 0, 0x08042EB0 }, + { 0x1823, 0, 0x08042EE8 }, { 0x1824, 0, 0x08042F20 }, { 0x1883, 0, 0x08042F2C }, { 0x1884, 0, 0x08042F60 }, + { 0x1885, 0, 0x08042F9C }, { 0x1886, 0, 0x08043008 }, { 0x1887, 0, 0x08043054 }, { 0x1888, 0, 0x08043094 }, + { 0x1889, 0, 0x080430E4 }, { 0x188A, 0, 0x08043134 }, { 0x188B, 0, 0x08043150 }, { 0x188C, 0, 0x0804318C }, + { 0x188D, 0, 0x080431E8 }, { 0x188E, 0, 0x08043224 }, { 0x188F, 0, 0x0804326C }, { 0x1890, 0, 0x08043298 }, + { 0x1891, 0, 0x080432D8 }, { 0x1892, 0, 0x0804332C }, { 0x1893, 0, 0x08043378 }, { 0x1901, 0, 0x080433B4 }, + { 0x1902, 0, 0x0804341C }, { 0x1903, 0, 0x08043484 }, { 0x1904, 0, 0x08043508 }, { 0x1905, 0, 0x08043580 }, + { 0x1906, 0, 0x08043610 }, { 0x1907, 0, 0x0804367C }, { 0x1908, 0, 0x08043710 }, { 0x1909, 0, 0x08043784 }, + { 0x190A, 0, 0x0804380C }, { 0x190B, 0, 0x08043880 }, { 0x190C, 0, 0x080438E8 }, { 0x190D, 0, 0x08043948 }, + { 0x190E, 0, 0x080439C4 }, { 0x190F, 0, 0x08043A20 }, { 0x1910, 0, 0x08043AA0 }, { 0x1911, 0, 0x08043B24 }, + { 0x1912, 0, 0x08043BA8 }, { 0x1913, 0, 0x08043C30 }, { 0x1914, 0, 0x08043C9C }, { 0x1915, 0, 0x08043CEC }, + { 0x1916, 0, 0x08043D50 }, { 0x1917, 0, 0x08043DD8 }, { 0x1918, 0, 0x08043E40 }, { 0x1919, 0, 0x08043EB0 }, + { 0x191A, 0, 0x08043F24 }, { 0x191B, 0, 0x08043FB0 }, { 0x191C, 0, 0x0804401C }, { 0x191D, 0, 0x08044098 }, + { 0x191E, 0, 0x0804411C }, { 0x191F, 0, 0x08044184 }, { 0x1921, 0, 0x080441E8 }, { 0x1922, 0, 0x08044258 }, + { 0x1923, 0, 0x080442D4 }, { 0x1924, 0, 0x08044348 }, { 0x1925, 0, 0x080443D0 }, { 0x1926, 0, 0x08044458 }, + { 0x1927, 0, 0x080444DC }, { 0x1928, 0, 0x08044574 }, { 0x1929, 0, 0x080445CC }, { 0x192A, 0, 0x08044630 }, + { 0x192C, 0, 0x080446AC }, { 0x192D, 0, 0x0804471C }, { 0x192E, 0, 0x08044780 }, { 0x1930, 0, 0x08044808 }, + { 0x1931, 0, 0x08044898 }, { 0x1932, 0, 0x08044910 }, { 0x1933, 0, 0x0804498C }, { 0x1934, 0, 0x08044A04 }, + { 0x1935, 0, 0x08044A94 }, { 0x1937, 0, 0x08044B10 }, { 0x1939, 0, 0x08044B9C }, { 0x193A, 0, 0x08044C0C }, + { 0x193B, 0, 0x08044C18 }, { 0x193C, 0, 0x08044C8C }, { 0x1942, 0, 0x08044D04 }, { 0x1944, 0, 0x08044D6C }, + { 0x1945, 0, 0x08044DCC }, { 0x1946, 0, 0x08044E48 }, { 0x1947, 0, 0x08044EAC }, { 0x1948, 0, 0x08044F20 }, + { 0x1949, 0, 0x08044F88 }, { 0x194A, 0, 0x08045004 }, { 0x194B, 0, 0x08045084 }, { 0x194C, 0, 0x080450F4 }, + { 0x194D, 0, 0x08045174 }, { 0x1950, 0, 0x080451C8 }, { 0x1951, 0, 0x08045238 }, { 0x1952, 0, 0x080452A0 }, + { 0x1953, 0, 0x08045310 }, { 0x1954, 0, 0x08045378 }, { 0x1955, 0, 0x080453E8 }, { 0x1956, 0, 0x08045458 }, + { 0x1957, 0, 0x080454CC }, { 0x1958, 0, 0x08045540 }, { 0x1959, 0, 0x080455C4 }, { 0x195A, 0, 0x0804564C }, + { 0x195B, 0, 0x080456AC }, { 0x195C, 0, 0x08045704 }, { 0x195D, 0, 0x0804576C }, { 0x195E, 0, 0x080457E8 }, + { 0x195F, 0, 0x08045838 }, { 0x1960, 0, 0x0804589C }, { 0x1961, 0, 0x08045918 }, { 0x1962, 0, 0x08045988 }, + { 0x1963, 0, 0x080459E4 }, { 0x1964, 0, 0x08045A24 }, { 0x1B58, 0, 0x08045ACC }, { 0x1B59, 0, 0x08045ADC }, + { 0x1B5A, 0, 0x08045B00 }, { 0x1B5B, 0, 0x08045B20 }, { 0x1B5C, 0, 0x08045B2C }, { 0x1B5D, 0, 0x08045B58 }, + { 0x1B5E, 0, 0x08045B7C }, { 0x1B5F, 0, 0x08045BAC }, { 0x1B60, 0, 0x08045BD8 }, { 0x1B61, 0, 0x08045BFC }, + { 0x1B62, 0, 0x08045C18 }, { 0x1B63, 0, 0x08045C3C }, { 0x1B64, 0, 0x08045C60 }, { 0x1B65, 0, 0x08045C90 }, + { 0x1B66, 0, 0x08045CC0 }, { 0x1B67, 0, 0x08045CEC }, { 0x1B6A, 0, 0x08045CF8 }, { 0x1B6B, 0, 0x08045D28 }, + { 0x1B72, 0, 0x08045D58 }, { 0x1B73, 0, 0x08045D8C }, { 0x1B74, 0, 0x08045DB8 }, { 0x1B75, 0, 0x08045DEC }, + { 0x1B76, 0, 0x08045E1C }, { 0x1B77, 0, 0x08045E48 }, { 0x1B78, 0, 0x08045E54 }, { 0x1B79, 0, 0x08045E80 }, + { 0x1B7A, 0, 0x08045EB0 }, { 0x1B7B, 0, 0x08045ED8 }, { 0x1B7C, 0, 0x08045F08 }, { 0x1B7D, 0, 0x08045F34 }, + { 0x1B7E, 0, 0x08045F40 }, { 0x1B7F, 0, 0x08045F74 }, { 0x1B80, 0, 0x08045FA8 }, { 0x1B81, 0, 0x08045FD4 }, + { 0x1B89, 0, 0x08045FE0 }, { 0x1B8A, 0, 0x08045FF0 }, { 0x1B8B, 0, 0x08046038 }, { 0x1B8C, 0, 0x08046060 }, + { 0x1B8D, 0, 0x08046098 }, { 0x1B8E, 0, 0x080460D4 }, { 0x1B8F, 0, 0x08046110 }, { 0x1B90, 0, 0x08046150 }, + { 0x1B91, 0, 0x0804618C }, { 0x1B92, 0, 0x080461CC }, { 0x1B93, 0, 0x08046208 }, { 0x1B94, 0, 0x0804622C }, + { 0x1B95, 0, 0x0804626C }, { 0x1B96, 0, 0x080462A8 }, { 0x1B98, 0, 0x080462B4 }, { 0x1B9E, 0, 0x08046300 }, + { 0x1B9F, 0, 0x08046374 }, { 0x1BA0, 0, 0x080463FC }, { 0x1BA1, 0, 0x08046480 }, { 0x1BA2, 0, 0x08046594 }, + { 0x1BA4, 0, 0x080465C4 }, { 0x1BA5, 0, 0x08046654 }, { 0x1BA6, 0, 0x08046684 }, { 0x1BA7, 0, 0x080466D4 }, + { 0x1BA8, 0, 0x08046760 }, { 0x1BAC, 0, 0x080467E8 }, { 0x1BB2, 0, 0x08046848 }, { 0x1BB3, 0, 0x08046888 }, + { 0x1BB4, 0, 0x080468C4 }, { 0x1BB5, 0, 0x08046904 }, { 0x1BB6, 0, 0x08046944 }, { 0x1C00, 0, 0x08046984 }, + { 0x1C01, 0, 0x08046A4C }, { 0x1C02, 0, 0x08046AB8 }, { 0x1C03, 0, 0x08046BA8 }, { 0x1C04, 0, 0x08046C10 }, + { 0x1C05, 0, 0x08046D68 }, { 0x1C06, 0, 0x08046E44 }, { 0x1C07, 0, 0x08046EAC }, { 0x1C08, 0, 0x08046F0C }, + { 0x1C09, 0, 0x08046F5C }, { 0x1C0A, 0, 0x08046F94 }, { 0x1C0B, 0, 0x08047014 }, { 0x1C0C, 0, 0x080470D4 }, + { 0x1C0D, 0, 0x08047118 }, { 0x1C0E, 0, 0x08047130 }, { 0x1C0F, 0, 0x08047148 }, { 0x1C10, 0, 0x08047164 }, + { 0x1C11, 0, 0x0804717C }, { 0x1C12, 0, 0x0804719C }, { 0x1C13, 0, 0x080471BC }, { 0x1C14, 0, 0x080471D4 }, + { 0x1C15, 0, 0x080471F0 }, { 0x1C16, 0, 0x08047214 }, { 0x1C17, 0, 0x0804730C }, { 0x1C18, 0, 0x0804734C }, + { 0x1D00, 0, 0x080473A4 }, { 0x1D01, 0, 0x08047414 }, { 0x1D02, 0, 0x08047524 }, { 0x1D03, 0, 0x0804758C }, + { 0x1D04, 0, 0x08047644 }, { 0x1D05, 0, 0x08047678 }, { 0x1D06, 0, 0x080476D0 }, { 0x1D07, 0, 0x080476F8 }, + { 0x1D08, 0, 0x08047728 }, { 0x1D09, 0, 0x08047788 }, { 0x1D0A, 0, 0x080477C0 }, { 0x1D0B, 0, 0x080477F4 }, + { 0x1D0C, 0, 0x08047808 }, { 0x1D0D, 0, 0x08047820 }, { 0x1D11, 0, 0x08047844 }, { 0x1D12, 0, 0x08047890 }, + { 0x1D13, 0, 0x080478D8 }, { 0x1D14, 0, 0x08047920 }, { 0x1D15, 0, 0x0804796C }, { 0x1D16, 0, 0x080479B4 }, + { 0x1D17, 0, 0x080479FC }, { 0x1F40, 0, 0x08047A20 }, { 0x1F41, 0, 0x08047ABC }, { 0x1F42, 0, 0x08047B20 }, + { 0x1F43, 0, 0x08047B94 }, { 0x1F44, 0, 0x08047BD8 }, { 0x1F45, 0, 0x08047C40 }, { 0x1F46, 0, 0x08047CB4 }, + { 0x1F47, 0, 0x08047D1C }, { 0x1F48, 0, 0x08047D88 }, { 0x1F49, 0, 0x08047DA8 }, { 0x1F4A, 0, 0x08047E48 }, + { 0x1F4B, 0, 0x08047F30 }, { 0x1F4C, 0, 0x08047F88 }, { 0x1F4D, 0, 0x08048014 }, { 0x1F4E, 0, 0x080480E0 }, + { 0x1F4F, 0, 0x0804819C }, { 0x1F50, 0, 0x08048280 }, { 0x1F51, 0, 0x080482E4 }, { 0x1F52, 0, 0x0804833C }, + { 0x1F53, 0, 0x080483B8 }, { 0x1F54, 0, 0x08048430 }, { 0x1F55, 0, 0x080484AC }, { 0x1F56, 0, 0x080484F8 }, + { 0x1F5F, 0, 0x0804857C }, { 0x1F60, 0, 0x0804859C }, { 0x1F61, 0, 0x080485D4 }, { 0x1F62, 0, 0x08048604 }, + { 0x1F63, 0, 0x0804862C }, { 0x1F64, 0, 0x0804866C }, { 0x1F65, 0, 0x080486A4 }, { 0x1F66, 0, 0x080486E0 }, + { 0x1F67, 0, 0x08048708 }, { 0x1F68, 0, 0x08048774 }, { 0x1F69, 0, 0x080487A4 }, { 0x1F6A, 0, 0x080487E0 }, + { 0x1F6B, 0, 0x08048810 }, { 0x1F6C, 0, 0x08048864 }, { 0x1F6D, 0, 0x08048898 }, { 0x1F6E, 0, 0x08048960 }, + { 0x1F6F, 0, 0x08048990 }, { 0x1F70, 0, 0x080489E8 }, { 0x1F71, 0, 0x08048A44 }, { 0x1F72, 0, 0x08048AB8 }, + { 0x1F73, 0, 0x08048AE8 }, { 0x1F74, 0, 0x08048B94 }, { 0x1F75, 0, 0x08048BB0 }, { 0x1FA4, 0, 0x08048BD8 }, + { 0x1FA5, 0, 0x08048C14 }, { 0x1FA6, 0, 0x08048CF8 }, { 0x1FA7, 0, 0x08048D40 }, { 0x1FA8, 0, 0x08048D88 }, + { 0x1FA9, 0, 0x08048DF4 }, { 0x1FAA, 0, 0x08048E68 }, { 0x1FAB, 0, 0x08048EE0 }, { 0x1FAC, 0, 0x08048FB4 }, + { 0x1FAD, 0, 0x08049034 }, { 0x1FAE, 0, 0x08049068 }, { 0x1FAF, 0, 0x080491B0 }, { 0x1FB0, 0, 0x0804927C }, + { 0x1FB1, 0, 0x080492C8 }, { 0x1FB2, 0, 0x08049318 }, { 0x1FB3, 0, 0x08049384 }, { 0x1FB4, 0, 0x08049424 }, + { 0x1FB5, 0, 0x0804951C }, { 0x1FB6, 0, 0x08049558 }, { 0x1FB7, 0, 0x08049598 }, { 0x1FB8, 0, 0x080495B8 }, + { 0x1FB9, 0, 0x080495D0 }, { 0x1FBA, 0, 0x080495E8 }, { 0x1FBB, 0, 0x08049614 }, { 0x1FBC, 0, 0x0804963C }, + { 0x1FBD, 0, 0x08049688 }, { 0x1FBE, 0, 0x080496DC }, { 0x1FBF, 0, 0x08049758 }, { 0x1FC0, 0, 0x080497BC }, + { 0x1FC1, 0, 0x080497E4 }, { 0x1FC2, 0, 0x0804982C }, { 0x1FC3, 0, 0x080498A0 }, { 0x1FC4, 0, 0x08049920 }, + { 0x1FC5, 0, 0x08049940 }, { 0x1FC6, 0, 0x08049A0C }, { 0x1FC7, 0, 0x08049A38 }, { 0x1FC8, 0, 0x08049AA0 }, + { 0x1FC9, 0, 0x08049AB8 }, { 0x1FCA, 0, 0x08049AF0 }, { 0x1FCB, 0, 0x08049B74 }, { 0x1FCC, 0, 0x08049BD0 }, + { 0x1FCD, 0, 0x08049C34 }, { 0x1FCE, 0, 0x08049D14 }, { 0x1FCF, 0, 0x08049D70 }, { 0x1FD0, 0, 0x08049DAC }, + { 0x1FD1, 0, 0x08049E08 }, { 0x1FD2, 0, 0x08049E24 }, { 0x1FD3, 0, 0x08049E44 }, { 0x1FD4, 0, 0x08049E88 }, + { 0x1FD5, 0, 0x08049EB8 }, { 0x1FD6, 0, 0x08049F00 }, { 0x1FD7, 0, 0x08049F3C }, { 0x1FD8, 0, 0x08049F90 }, + { 0x1FD9, 0, 0x08049FC4 }, { 0x1FDA, 0, 0x0804A018 }, { 0x1FDB, 0, 0x0804A050 }, { 0x1FDC, 0, 0x0804A0BC }, + { 0x1FDD, 0, 0x0804A0F0 }, { 0x1FDE, 0, 0x0804A11C }, { 0x1FDF, 0, 0x0804A14C }, { 0x1FE0, 0, 0x0804A1A0 }, + { 0x1FE1, 0, 0x0804A1D4 }, { 0x1FE2, 0, 0x0804A210 }, { 0x1FE3, 0, 0x0804A244 }, { 0x1FE4, 0, 0x0804A290 }, + { 0x1FE5, 0, 0x0804A2C8 }, { 0x1FE6, 0, 0x0804A334 }, { 0x1FE7, 0, 0x0804A36C }, { 0x1FE8, 0, 0x0804A3EC }, + { 0x1FE9, 0, 0x0804A420 }, { 0x1FEA, 0, 0x0804A484 }, { 0x1FEB, 0, 0x0804A4B8 }, { 0x1FEC, 0, 0x0804A51C }, + { 0x1FED, 0, 0x0804A554 }, { 0x1FEE, 0, 0x0804A59C }, { 0x1FEF, 0, 0x0804A5D0 }, { 0x1FF0, 0, 0x0804A620 }, + { 0x1FF1, 0, 0x0804A658 }, { 0x1FF2, 0, 0x0804A6C0 }, { 0x1FF3, 0, 0x0804A6F4 }, { 0x1FF4, 0, 0x0804A74C }, + { 0x1FF5, 0, 0x0804A788 }, { 0x1FF6, 0, 0x0804A800 }, { 0x1FF7, 0, 0x0804A834 }, { 0x1FF8, 0, 0x0804A888 }, + { 0x1FF9, 0, 0x0804A8B8 }, { 0x1FFA, 0, 0x0804A908 }, { 0x1FFB, 0, 0x0804A940 }, { 0x1FFC, 0, 0x0804A970 }, + { 0x1FFD, 0, 0x0804A9A4 }, { 0x1FFE, 0, 0x0804AA00 }, { 0x1FFF, 0, 0x0804AA60 }, { 0x2000, 0, 0x0804AAA0 }, + { 0x2001, 0, 0x0804AACC }, { 0x2002, 0, 0x0804AB00 }, { 0x2003, 0, 0x0804AB60 }, { 0x2004, 0, 0x0804ABA0 }, + { 0x2005, 0, 0x0804ACE0 }, { 0x2006, 0, 0x0804ADB4 }, { 0x2007, 0, 0x0804AE8C }, { 0x2008, 0, 0x0804AEE0 }, + { 0x2009, 0, 0x0804AEF8 }, { 0x200A, 0, 0x0804AF10 }, { 0x200B, 0, 0x0804AFAC }, { 0x200C, 0, 0x0804B024 }, + { 0x200D, 0, 0x0804B058 }, { 0x200E, 0, 0x0804B0D0 }, { 0x200F, 0, 0x0804B144 }, { 0x2010, 0, 0x0804B168 }, + { 0x2011, 0, 0x0804B1B4 }, { 0x2012, 0, 0x0804B1F8 }, { 0x2013, 0, 0x0804B260 }, { 0x2014, 0, 0x0804B298 }, + { 0x2015, 0, 0x0804B300 }, { 0x2016, 0, 0x0804B338 }, { 0x2017, 0, 0x0804B350 }, { 0x201D, 0, 0x0804B3B0 }, + { 0x201E, 0, 0x0804B3F8 }, { 0x201F, 0, 0x0804B508 }, { 0x2020, 0, 0x0804B58C }, { 0x2021, 0, 0x0804B5F8 }, + { 0x2022, 0, 0x0804B68C }, { 0x2023, 0, 0x0804B6E4 }, { 0x2024, 0, 0x0804B6F0 }, { 0x2026, 0, 0x0804B6FC }, + { 0x2027, 0, 0x0804B71C }, { 0x2028, 0, 0x0804B744 }, { 0x2029, 0, 0x0804B758 }, { 0x202A, 0, 0x0804B770 }, + { 0x202B, 0, 0x0804B7C4 }, { 0x202C, 0, 0x0804B81C }, { 0x202D, 0, 0x0804B860 }, { 0x202E, 0, 0x0804B8A8 }, + { 0x202F, 0, 0x0804B908 }, { 0x2030, 0, 0x0804B93C }, { 0x2031, 0, 0x0804B9B8 }, { 0x2032, 0, 0x0804BA20 }, + { 0x2033, 0, 0x0804BA9C }, { 0x2034, 0, 0x0804BAEC }, { 0x2035, 0, 0x0804BB34 }, { 0x2036, 0, 0x0804BB7C }, + { 0x2037, 0, 0x0804BBAC }, { 0x2038, 0, 0x0804BBDC }, { 0x2039, 0, 0x0804BC20 }, { 0x203A, 0, 0x0804BC98 }, + { 0x203B, 0, 0x0804BCF0 }, { 0x203C, 0, 0x0804BD40 }, { 0x203D, 0, 0x0804BD5C }, { 0x203E, 0, 0x0804BDAC }, + { 0x203F, 0, 0x0804BE24 }, { 0x2040, 0, 0x0804BE4C }, { 0x2041, 0, 0x0804BEB8 }, { 0x2042, 0, 0x0804BEEC }, + { 0x2043, 0, 0x0804BF08 }, { 0x2044, 0, 0x0804BF38 }, { 0x2045, 0, 0x0804BF74 }, { 0x2046, 0, 0x0804BFB4 }, + { 0x2047, 0, 0x0804C028 }, { 0x2048, 0, 0x0804C08C }, { 0x2049, 0, 0x0804C0BC }, { 0x204A, 0, 0x0804C0D8 }, + { 0x204B, 0, 0x0804C114 }, { 0x204C, 0, 0x0804C144 }, { 0x204D, 0, 0x0804C180 }, { 0x204E, 0, 0x0804C204 }, + { 0x206C, 0, 0x0804C264 }, { 0x206D, 0, 0x0804C2A8 }, { 0x206E, 0, 0x0804C2F8 }, { 0x206F, 0, 0x0804C338 }, + { 0x2070, 0, 0x0804C384 }, { 0x2076, 0, 0x0804C390 }, { 0x2077, 0, 0x0804C3C0 }, { 0x2078, 0, 0x0804C404 }, + { 0x2079, 0, 0x0804C480 }, { 0x2080, 0, 0x0804C4C4 }, { 0x2081, 0, 0x0804C5B4 }, { 0x2082, 0, 0x0804C5FC }, + { 0x2083, 0, 0x0804C630 }, { 0x208A, 0, 0x0804C674 }, { 0x208B, 0, 0x0804C6BC }, { 0x208C, 0, 0x0804C708 }, + { 0x208D, 0, 0x0804C7B4 }, { 0x208E, 0, 0x0804C7FC }, { 0x2093, 0, 0x0804C8A4 }, { 0x2094, 0, 0x0804C8C0 }, + { 0x2095, 0, 0x0804C8E8 }, { 0x20B0, 0, 0x0804C920 }, { 0x20B1, 0, 0x0804C984 }, { 0x20B2, 0, 0x0804CA38 }, + { 0x20B3, 0, 0x0804CB34 }, { 0x20B4, 0, 0x0804CC18 }, { 0x20B5, 0, 0x0804CD10 }, { 0x20B6, 0, 0x0804CDD4 }, + { 0x20B7, 0, 0x0804CE8C }, { 0x20B8, 0, 0x0804CF48 }, { 0x20B9, 0, 0x0804CFA4 }, { 0x20BA, 0, 0x0804D018 }, + { 0x20BB, 0, 0x0804D084 }, { 0x20BC, 0, 0x0804D0EC }, { 0x20BD, 0, 0x0804D158 }, { 0x20BE, 0, 0x0804D1C0 }, + { 0x20BF, 0, 0x0804D230 }, { 0x20C0, 0, 0x0804D294 }, { 0x20C1, 0, 0x0804D300 }, { 0x20C2, 0, 0x0804D380 }, + { 0x20C3, 0, 0x0804D3F8 }, { 0x20C4, 0, 0x0804D460 }, { 0x20C5, 0, 0x0804D4AC }, { 0x20C6, 0, 0x0804D52C }, + { 0x20C7, 0, 0x0804D590 }, { 0x20D0, 0, 0x0804D5FC }, { 0x20D1, 0, 0x0804D654 }, { 0x20D2, 0, 0x0804D6C8 }, + { 0x20D4, 0, 0x0804D6EC }, { 0x20D5, 0, 0x0804D75C }, { 0x20D6, 0, 0x0804D7B4 }, { 0x20D7, 0, 0x0804D834 }, + { 0x20D8, 0, 0x0804D8B0 }, { 0x20D9, 0, 0x0804D93C }, { 0x20DA, 0, 0x0804D99C }, { 0x20DB, 0, 0x0804D9FC }, + { 0x20DC, 0, 0x0804DA74 }, { 0x20DD, 0, 0x0804DB20 }, { 0x20DE, 0, 0x0804DBB0 }, { 0x20DF, 0, 0x0804DC18 }, + { 0x20E0, 0, 0x0804DC90 }, { 0x20E1, 0, 0x0804DCFC }, { 0x20E2, 0, 0x0804DD84 }, { 0x20E3, 0, 0x0804DE0C }, + { 0x20E4, 0, 0x0804DEA0 }, { 0x20E5, 0, 0x0804DF10 }, { 0x20E6, 0, 0x0804DF78 }, { 0x20E7, 0, 0x0804DFEC }, + { 0x20F3, 0, 0x0804E05C }, { 0x20F7, 0, 0x0804E0C0 }, { 0x20F8, 0, 0x0804E134 }, { 0x20F9, 0, 0x0804E1AC }, + { 0x2103, 0, 0x0804E220 }, { 0x2104, 0, 0x0804E288 }, { 0x2105, 0, 0x0804E2CC }, { 0x2106, 0, 0x0804E320 }, + { 0x2107, 0, 0x0804E364 }, { 0x2108, 0, 0x0804E3BC }, { 0x2109, 0, 0x0804E408 }, { 0x210A, 0, 0x0804E458 }, + { 0x210B, 0, 0x0804E4B0 }, { 0x210C, 0, 0x0804E4EC }, { 0x210D, 0, 0x0804E52C }, { 0x210E, 0, 0x0804E578 }, + { 0x210F, 0, 0x0804E5D0 }, { 0x2110, 0, 0x0804E618 }, { 0x2111, 0, 0x0804E660 }, { 0x2112, 0, 0x0804E6BC }, + { 0x2113, 0, 0x0804E70C }, { 0x2114, 0, 0x0804E75C }, { 0x2115, 0, 0x0804E7A8 }, { 0x2116, 0, 0x0804E7F0 }, + { 0x2134, 0, 0x0804E83C }, { 0x2135, 0, 0x0804E880 }, { 0x2136, 0, 0x0804E8CC }, { 0x2137, 0, 0x0804E91C }, + { 0x2138, 0, 0x0804E96C }, { 0x2139, 0, 0x0804E9B4 }, { 0x213A, 0, 0x0804E9FC }, { 0x213B, 0, 0x0804EA38 }, + { 0x213C, 0, 0x0804EA88 }, { 0x213D, 0, 0x0804EAD0 }, { 0x213E, 0, 0x0804EB28 }, { 0x213F, 0, 0x0804EB80 }, + { 0x2140, 0, 0x0804EBD0 }, { 0x2141, 0, 0x0804EC1C }, { 0x2142, 0, 0x0804EC60 }, { 0x2143, 0, 0x0804ECAC }, + { 0x2144, 0, 0x0804ECF0 }, { 0x2145, 0, 0x0804ED40 }, { 0x2146, 0, 0x0804ED88 }, { 0x2147, 0, 0x0804EDDC }, + { 0x2152, 0, 0x0804EE34 }, { 0x2153, 0, 0x0804EE78 }, { 0x2154, 0, 0x0804EECC }, { 0x2156, 0, 0x0804EF1C }, + { 0x2157, 0, 0x0804EF64 }, { 0x2158, 0, 0x0804EFC4 }, { 0x2159, 0, 0x0804F014 }, { 0x215A, 0, 0x0804F05C }, + { 0x215B, 0, 0x0804F0C0 }, { 0x215D, 0, 0x0804F124 }, { 0x215E, 0, 0x0804F178 }, { 0x215F, 0, 0x0804F184 }, + { 0x2160, 0, 0x0804F1D8 }, { 0x2161, 0, 0x0804F234 }, { 0x2162, 0, 0x0804F298 }, { 0x2163, 0, 0x0804F2A4 }, + { 0x2164, 0, 0x0804F2F8 }, { 0x2165, 0, 0x0804F358 }, { 0x2166, 0, 0x0804F3B0 }, { 0x2167, 0, 0x0804F400 }, + { 0x2168, 0, 0x0804F458 }, { 0x2169, 0, 0x0804F4B0 }, { 0x216A, 0, 0x0804F504 }, { 0x216B, 0, 0x0804F554 }, + { 0x216C, 0, 0x0804F5A0 }, { 0x216D, 0, 0x0804F5F8 }, { 0x216E, 0, 0x0804F658 }, { 0x216F, 0, 0x0804F6B8 }, + { 0x2170, 0, 0x0804F710 }, { 0x2171, 0, 0x0804F764 }, { 0x2172, 0, 0x0804F7BC }, { 0x2173, 0, 0x0804F814 }, + { 0x2174, 0, 0x0804F870 }, { 0x2198, 0, 0x0804F8CC }, { 0x2199, 0, 0x0804F920 }, { 0x219A, 0, 0x0804F978 }, + { 0x219B, 0, 0x0804F9D0 }, { 0x219C, 0, 0x0804FA2C }, { 0x219D, 0, 0x0804FA80 }, { 0x219E, 0, 0x0804FAD0 }, + { 0x219F, 0, 0x0804FB28 }, { 0x21A0, 0, 0x0804FB80 }, { 0x21A1, 0, 0x0804FBD8 }, { 0x21A2, 0, 0x0804FC30 }, + { 0x21A3, 0, 0x0804FC88 }, { 0x21A4, 0, 0x0804FCD8 }, { 0x21A5, 0, 0x0804FD30 }, { 0x21A6, 0, 0x0804FD84 }, + { 0x21A7, 0, 0x0804FDDC }, { 0x21A8, 0, 0x0804FE34 }, { 0x21A9, 0, 0x0804FE88 }, { 0x21AA, 0, 0x0804FED8 }, + { 0x21AB, 0, 0x0804FF30 }, { 0x21AC, 0, 0x0804FF84 }, { 0x21AD, 0, 0x0804FFDC }, { 0x21AE, 0, 0x08050038 }, + { 0x21AF, 0, 0x08050094 }, { 0x21B0, 0, 0x080500EC }, { 0x21B1, 0, 0x08050140 }, { 0x21B2, 0, 0x08050198 }, + { 0x21B3, 0, 0x080501F4 }, { 0x21B4, 0, 0x0805024C }, { 0x21B5, 0, 0x080502A4 }, { 0x21B6, 0, 0x080502F8 }, + { 0x21B7, 0, 0x08050350 }, { 0x21B8, 0, 0x080503A8 }, { 0x21B9, 0, 0x08050400 }, { 0x21BA, 0, 0x0805045C }, + { 0x21CA, 0, 0x080504AC }, { 0x21CB, 0, 0x080504EC }, { 0x21CC, 0, 0x08050528 }, { 0x21CD, 0, 0x08050580 }, + { 0x21CE, 0, 0x080505C8 }, { 0x21CF, 0, 0x08050604 }, { 0x21D0, 0, 0x08050648 }, { 0x21D1, 0, 0x08050680 }, + { 0x21D2, 0, 0x080506CC }, { 0x21D3, 0, 0x08050700 }, { 0x21D4, 0, 0x0805075C }, { 0x21D5, 0, 0x080507A8 }, + { 0x21D6, 0, 0x080507F0 }, { 0x21D7, 0, 0x08050840 }, { 0x21D8, 0, 0x08050884 }, { 0x21D9, 0, 0x080508CC }, + { 0x21DA, 0, 0x08050910 }, { 0x21DB, 0, 0x0805094C }, { 0x21DC, 0, 0x08050998 }, { 0x21DD, 0, 0x080509D0 }, + { 0x21FC, 0, 0x08050A20 }, { 0x21FD, 0, 0x08050A50 }, { 0x21FE, 0, 0x08050A74 }, { 0x21FF, 0, 0x08050ABC }, + { 0x2200, 0, 0x08050ADC }, { 0x2201, 0, 0x08050AF0 }, { 0x2202, 0, 0x08050B0C }, { 0x2203, 0, 0x08050B44 }, + { 0x2204, 0, 0x08050B74 }, { 0x2205, 0, 0x08050B98 }, { 0x2206, 0, 0x08050BCC }, { 0x2207, 0, 0x08050BF8 }, + { 0x2208, 0, 0x08050C48 }, { 0x2209, 0, 0x08050CB0 }, { 0x220A, 0, 0x08050CC4 }, { 0x220B, 0, 0x08050CE0 }, + { 0x220C, 0, 0x08050D10 }, { 0x220D, 0, 0x08050D44 }, { 0x220E, 0, 0x08050D98 }, { 0x220F, 0, 0x08050DE0 }, + { 0x2210, 0, 0x08050E24 }, { 0x2211, 0, 0x08050E44 }, { 0x2212, 0, 0x08050E78 }, { 0x2213, 0, 0x08050E8C }, + { 0x2214, 0, 0x08050ECC }, { 0x2215, 0, 0x08050F14 }, { 0x2216, 0, 0x08050F44 }, { 0x2217, 0, 0x08050F6C }, + { 0x2218, 0, 0x08050FB4 }, { 0x2219, 0, 0x08050FDC }, { 0x221A, 0, 0x0805100C }, { 0x221B, 0, 0x08051034 }, + { 0x221C, 0, 0x08051054 }, { 0x221D, 0, 0x08051080 }, { 0x221E, 0, 0x080510A0 }, { 0x221F, 0, 0x080510DC }, + { 0x2220, 0, 0x08051104 }, { 0x2221, 0, 0x08051138 }, { 0x2222, 0, 0x0805114C }, { 0x2223, 0, 0x0805117C }, + { 0x2224, 0, 0x080511A8 }, { 0x2225, 0, 0x080511E4 }, { 0x2226, 0, 0x0805122C }, { 0x2227, 0, 0x08051258 }, + { 0x2228, 0, 0x080512AC }, { 0x2229, 0, 0x080512D8 }, { 0x222A, 0, 0x08051338 }, { 0x222B, 0, 0x08051374 }, + { 0x2328, 0, 0x080513C4 }, { 0x2329, 0, 0x08051410 }, { 0x232A, 0, 0x08051454 }, { 0x232B, 0, 0x080514B4 }, + { 0x232C, 0, 0x08051514 }, { 0x232D, 0, 0x08051564 }, { 0x232E, 0, 0x080515A8 }, { 0x232F, 0, 0x080515E4 }, + { 0x2330, 0, 0x08051630 }, { 0x2331, 0, 0x08051680 }, { 0x2332, 0, 0x08051700 }, { 0x2333, 0, 0x08051750 }, + { 0x2334, 0, 0x080517AC }, { 0x2335, 0, 0x08051814 }, { 0x2336, 0, 0x08051868 }, { 0x2337, 0, 0x080518C8 }, + { 0x2338, 0, 0x08051914 }, { 0x2339, 0, 0x08051948 }, { 0x233A, 0, 0x080519A4 }, { 0x233B, 0, 0x080519D8 }, + { 0x233C, 0, 0x08051A10 }, { 0x233D, 0, 0x08051A70 }, { 0x233E, 0, 0x08051AA4 }, { 0x233F, 0, 0x08051ADC }, + { 0x2340, 0, 0x08051B10 }, { 0x2341, 0, 0x08051B54 }, { 0x2342, 0, 0x08051BC8 }, { 0x2343, 0, 0x08051C38 }, + { 0x2344, 0, 0x08051C70 }, { 0x2345, 0, 0x08051CC0 }, { 0x2346, 0, 0x08051CFC }, { 0x2347, 0, 0x08051D24 }, + { 0x2348, 0, 0x08051DA4 }, { 0x2349, 0, 0x08051DE4 }, { 0x234A, 0, 0x08051E44 }, { 0x234B, 0, 0x08051E84 }, + { 0x234C, 0, 0x08051EA4 }, { 0x234D, 0, 0x08051EC4 }, { 0x234E, 0, 0x08051F04 }, { 0x234F, 0, 0x08051F30 }, + { 0x2350, 0, 0x08051F48 }, { 0x2351, 0, 0x08051F7C }, { 0x2352, 0, 0x08051FA8 }, { 0x2353, 0, 0x08051FC0 }, + { 0x2354, 0, 0x08051FE4 }, { 0x2355, 0, 0x08052004 }, { 0x2356, 0, 0x08052020 }, { 0x2357, 0, 0x08052048 }, + { 0x2358, 0, 0x080520AC }, { 0x2359, 0, 0x080520DC }, { 0x235A, 0, 0x08052104 }, { 0x235B, 0, 0x08052138 }, + { 0x235C, 0, 0x0805215C }, { 0x235D, 0, 0x08052188 }, { 0x235E, 0, 0x080522B4 }, { 0x235F, 0, 0x080522DC }, + { 0x2360, 0, 0x08052334 }, { 0x2361, 0, 0x080523A8 }, { 0x2362, 0, 0x08052400 }, { 0x2363, 0, 0x08052450 }, + { 0x2364, 0, 0x0805250C }, { 0x2365, 0, 0x08052644 }, { 0x2366, 0, 0x080526C0 }, { 0x2367, 0, 0x08052718 }, + { 0x2368, 0, 0x080527E4 }, { 0x2369, 0, 0x080528E0 }, { 0x236A, 0, 0x08052930 }, { 0x236B, 0, 0x08052A04 }, + { 0x236C, 0, 0x08052A40 }, { 0x236D, 0, 0x08052A8C }, { 0x236E, 0, 0x08052ABC }, { 0x236F, 0, 0x08052AD8 }, + { 0x2370, 0, 0x08052B34 }, { 0x2371, 0, 0x08052B64 }, { 0x2372, 0, 0x08052BE0 }, { 0x2373, 0, 0x08052BF8 }, + { 0x2374, 0, 0x08052C3C }, { 0x2375, 0, 0x08052C80 }, { 0x2376, 0, 0x08052CE4 }, { 0x2377, 0, 0x08052D08 }, + { 0x2378, 0, 0x08052D54 }, { 0x2710, 0, 0x08052D8C }, { 0x2711, 0, 0x08052E54 }, { 0x2712, 0, 0x08052EA4 }, + { 0x2713, 0, 0x08053008 }, { 0x2714, 0, 0x0805305C }, { 0x2715, 0, 0x080531A0 }, { 0x2716, 0, 0x08053220 }, + { 0x2717, 0, 0x08053284 }, { 0x2718, 0, 0x080532BC }, { 0x2719, 0, 0x08053300 }, { 0x271A, 0, 0x0805332C }, + { 0x271B, 0, 0x08053424 }, { 0x271C, 0, 0x080534AC }, { 0x271D, 0, 0x08053524 }, { 0x271E, 0, 0x0805358C }, + { 0x271F, 0, 0x08053608 }, { 0x2720, 0, 0x0805367C }, { 0x2721, 0, 0x08053718 }, { 0x2722, 0, 0x0805374C }, + { 0x2723, 0, 0x080537A8 }, { 0x2724, 0, 0x080537F4 }, { 0x2725, 0, 0x08053850 }, { 0x2726, 0, 0x080538A8 }, + { 0x2727, 0, 0x08053914 }, { 0x2728, 0, 0x08053974 }, { 0x2729, 0, 0x08053A34 }, { 0x272A, 0, 0x08053A4C }, + { 0x272B, 0, 0x08053A90 }, { 0x272C, 0, 0x08053AB0 }, { 0x272D, 0, 0x08053AF4 }, { 0x272E, 0, 0x08053B3C }, + { 0x272F, 0, 0x08053B9C }, { 0x2730, 0, 0x08053BCC }, { 0x2731, 0, 0x08053C04 }, { 0x2732, 0, 0x08053C70 }, + { 0x2733, 0, 0x08053CD8 }, { 0x2734, 0, 0x08053D4C }, { 0x2735, 0, 0x08053DD4 }, { 0x2736, 0, 0x08053E48 }, + { 0x2737, 0, 0x08053EA8 }, { 0x2738, 0, 0x08053F9C }, { 0x2739, 0, 0x08054038 }, { 0x273A, 0, 0x080540A0 }, + { 0x273B, 0, 0x0805411C }, { 0x273C, 0, 0x08054188 }, { 0x273D, 0, 0x080541D0 }, { 0x273E, 0, 0x08054278 }, + { 0x273F, 0, 0x080542A0 }, { 0x2740, 0, 0x0805432C }, { 0x2741, 0, 0x080543CC }, { 0x2742, 0, 0x08054478 }, + { 0x2743, 0, 0x080544F8 }, { 0x2744, 0, 0x08054580 }, { 0x2745, 0, 0x08054630 }, { 0x2746, 0, 0x08054674 }, + { 0x2747, 0, 0x080546C4 }, { 0x2748, 0, 0x08054784 }, { 0x2749, 0, 0x080547EC }, { 0x274A, 0, 0x0805483C }, + { 0x274B, 0, 0x0805489C }, { 0x274C, 0, 0x08054924 }, { 0x274D, 0, 0x0805494C }, { 0x274E, 0, 0x080549E0 }, + { 0x274F, 0, 0x08054A90 }, { 0x2774, 0, 0x08054B24 }, { 0x2775, 0, 0x08054B7C }, { 0x2776, 0, 0x08054C30 }, + { 0x2777, 0, 0x08054C3C }, { 0x2778, 0, 0x08054CD0 }, { 0x2779, 0, 0x08054CDC }, { 0x277A, 0, 0x08054D00 }, + { 0x277B, 0, 0x08054DA4 }, { 0x277C, 0, 0x08054EC8 }, { 0x277D, 0, 0x08054F54 }, { 0x277E, 0, 0x08054FA0 }, + { 0x277F, 0, 0x08055004 }, { 0x2780, 0, 0x0805503C }, { 0x2781, 0, 0x080550B0 }, { 0x2782, 0, 0x08055110 }, + { 0x2783, 0, 0x08055138 }, { 0x2784, 0, 0x08055160 }, { 0x2785, 0, 0x08055194 }, { 0x2786, 0, 0x080551E0 }, + { 0x2787, 0, 0x08055224 }, { 0x2788, 0, 0x08055264 }, { 0x2789, 0, 0x080552A8 }, { 0x278A, 0, 0x080552E8 }, + { 0x278B, 0, 0x08055310 }, { 0x278C, 0, 0x0805535C }, { 0x278D, 0, 0x080553E0 }, { 0x278E, 0, 0x08055424 }, + { 0x278F, 0, 0x08055448 }, { 0x2790, 0, 0x08055470 }, { 0x2791, 0, 0x080554F0 }, { 0x2792, 0, 0x08055510 }, + { 0x2793, 0, 0x08055534 }, { 0x2794, 0, 0x080555BC }, { 0x2795, 0, 0x080555FC }, { 0x2796, 0, 0x0805565C }, + { 0x2797, 0, 0x08055688 }, { 0x2798, 0, 0x080556CC }, { 0x2799, 0, 0x08055700 }, { 0x279A, 0, 0x0805573C }, + { 0x279B, 0, 0x0805576C }, { 0x279C, 0, 0x080557B0 }, { 0x279D, 0, 0x08055804 }, { 0x279E, 0, 0x08055858 }, + { 0x279F, 0, 0x080558DC }, { 0x27A0, 0, 0x0805591C }, { 0x27A1, 0, 0x08055984 }, { 0x27A2, 0, 0x080559C0 }, + { 0x27A3, 0, 0x08055A10 }, { 0x27A4, 0, 0x08055A38 }, { 0x27A5, 0, 0x08055AB0 }, { 0x27A6, 0, 0x08055AE8 }, + { 0x27A7, 0, 0x08055B1C }, { 0x27A8, 0, 0x08055B60 }, { 0x27A9, 0, 0x08055BA8 }, { 0x27AA, 0, 0x08055BC0 }, + { 0x27AB, 0, 0x08055C10 }, { 0x27AC, 0, 0x08055C34 }, { 0x27AD, 0, 0x08055CAC }, { 0x27AE, 0, 0x08055CC4 }, + { 0x27D8, 0, 0x08055D0C }, { 0x27D9, 0, 0x08055D50 }, { 0x27DA, 0, 0x08055D94 }, { 0x27DB, 0, 0x08055DCC }, + { 0x27DC, 0, 0x08055E10 }, { 0x27DD, 0, 0x08055E50 }, { 0x27DE, 0, 0x08055ED0 }, { 0x27DF, 0, 0x08055F14 }, + { 0x27E0, 0, 0x08055F70 }, { 0x27E1, 0, 0x08056000 }, { 0x27E2, 0, 0x0805609C }, { 0x27E3, 0, 0x080560DC }, + { 0x27E4, 0, 0x080560F8 }, { 0x27E5, 0, 0x08056128 }, { 0x27E6, 0, 0x08056170 }, { 0x27E7, 0, 0x08056220 }, + { 0x27E8, 0, 0x0805627C }, { 0x27E9, 0, 0x080562D8 }, { 0x27EA, 0, 0x08056334 }, { 0x27EB, 0, 0x0805635C }, + { 0x27EC, 0, 0x080563B0 }, { 0x27ED, 0, 0x080563D8 }, { 0x27EE, 0, 0x0805643C }, { 0x27EF, 0, 0x08056468 }, + { 0x27F0, 0, 0x08056488 }, { 0x27F1, 0, 0x080564AC }, { 0x27F2, 0, 0x080564F4 }, { 0x27F3, 0, 0x0805653C }, + { 0x27F4, 0, 0x08056570 }, { 0x27F5, 0, 0x0805662C }, { 0x27F6, 0, 0x0805668C }, { 0x27F7, 0, 0x080566B0 }, + { 0x27F8, 0, 0x080566E4 }, { 0x27F9, 0, 0x08056708 }, { 0x27FA, 0, 0x08056734 }, { 0x283C, 0, 0x0805678C }, + { 0x283D, 0, 0x080567C4 }, { 0x2841, 0, 0x080567FC }, { 0x2842, 0, 0x08056840 }, { 0x2843, 0, 0x08056878 }, + { 0x2844, 0, 0x080568E0 }, { 0x2845, 0, 0x0805696C }, { 0x2846, 0, 0x080569BC }, { 0x2847, 0, 0x08056A18 }, + { 0x2848, 0, 0x08056A54 }, { 0x2849, 0, 0x08056AB0 }, { 0x284A, 0, 0x08056AF4 }, { 0x284B, 0, 0x08056B38 }, + { 0x284C, 0, 0x08056B88 }, { 0x284D, 0, 0x08056BCC }, { 0x284E, 0, 0x08056C2C }, { 0x284F, 0, 0x08056C7C }, + { 0x2850, 0, 0x08056CA8 }, { 0x2851, 0, 0x08056CF8 }, { 0x2852, 0, 0x08056D24 }, { 0x2853, 0, 0x08056D68 }, + { 0x2854, 0, 0x08056DC0 }, { 0x2855, 0, 0x08056E04 }, { 0x2856, 0, 0x08056E50 }, { 0x2857, 0, 0x08056E98 }, + { 0x2858, 0, 0x08056EFC }, { 0x2859, 0, 0x08056F44 }, { 0x285A, 0, 0x08056FA8 }, { 0x285B, 0, 0x08056FE8 }, + { 0x285C, 0, 0x08057014 }, { 0x285D, 0, 0x0805705C }, { 0x285E, 0, 0x08057088 }, { 0x285F, 0, 0x080570C8 }, + { 0x2860, 0, 0x080570FC }, { 0x2861, 0, 0x08057114 }, { 0x2862, 0, 0x08057174 }, { 0x2863, 0, 0x080571C0 }, + { 0x2864, 0, 0x0805722C }, { 0x2865, 0, 0x08057278 }, { 0x2866, 0, 0x080572E4 }, { 0x2867, 0, 0x08057328 }, + { 0x2868, 0, 0x08057358 }, { 0x2869, 0, 0x080573A4 }, { 0x286A, 0, 0x08057410 }, { 0x286B, 0, 0x08057454 }, + { 0x286C, 0, 0x08057484 }, { 0x286D, 0, 0x080574D0 }, { 0x286E, 0, 0x080574F8 }, { 0x286F, 0, 0x0805753C }, + { 0x2870, 0, 0x080575A8 }, { 0x2871, 0, 0x080575E4 }, { 0x2872, 0, 0x08057628 }, { 0x2873, 0, 0x0805765C }, + { 0x2874, 0, 0x080576B4 }, { 0x2875, 0, 0x080576D0 }, { 0x2876, 0, 0x08057728 }, { 0x2877, 0, 0x0805777C }, + { 0x2878, 0, 0x080577D4 }, { 0x2879, 0, 0x08057828 }, { 0x287A, 0, 0x08057890 }, { 0x287B, 0, 0x08057900 }, + { 0x287C, 0, 0x08057968 }, { 0x287D, 0, 0x080579B8 }, { 0x287E, 0, 0x080579E8 }, { 0x287F, 0, 0x08057A5C }, + { 0x2880, 0, 0x08057AA8 }, { 0x2881, 0, 0x08057B24 }, { 0x2882, 0, 0x08057B5C }, { 0x2883, 0, 0x08057B94 }, + { 0x2884, 0, 0x08057BC8 }, { 0x2885, 0, 0x08057BE0 }, { 0x2886, 0, 0x08057BF8 }, { 0x2887, 0, 0x08057C24 }, + { 0x2888, 0, 0x08057C5C }, { 0x2889, 0, 0x08057C88 }, { 0x288A, 0, 0x08057CB4 }, { 0x288B, 0, 0x08057CD4 }, + { 0x28A0, 0, 0x08057CF0 }, { 0x28A1, 0, 0x08057D20 }, { 0x28A2, 0, 0x08057D5C }, { 0x28A3, 0, 0x08057D94 }, + { 0x28A4, 0, 0x08057E80 }, { 0x28A5, 0, 0x08057F64 }, { 0x28A6, 0, 0x08057FA8 }, { 0x28A7, 0, 0x08058080 }, + { 0x28A8, 0, 0x080580B4 }, { 0x28A9, 0, 0x080580F4 }, { 0x28AA, 0, 0x08058130 }, { 0x28AB, 0, 0x08058160 }, + { 0x28AC, 0, 0x080581EC }, { 0x28AD, 0, 0x080582C0 }, { 0x28AF, 0, 0x080582DC }, { 0x28B0, 0, 0x080582F8 }, + { 0x28B1, 0, 0x08058340 }, { 0x28B2, 0, 0x080583A8 }, { 0x28B3, 0, 0x08058400 }, { 0x28B4, 0, 0x08058488 }, + { 0x28B5, 0, 0x080584E8 }, { 0x28B6, 0, 0x08058524 }, { 0x28B7, 0, 0x08058594 }, { 0x28B8, 0, 0x080585F4 }, + { 0x28B9, 0, 0x08058618 }, { 0x28BA, 0, 0x0805864C }, { 0x28BB, 0, 0x08058688 }, { 0x28BC, 0, 0x080586B8 }, + { 0x28BD, 0, 0x080586F8 }, { 0x28BE, 0, 0x0805871C }, { 0x28BF, 0, 0x08058760 }, { 0x28C0, 0, 0x0805878C }, + { 0x28C1, 0, 0x080587B4 }, { 0x28C2, 0, 0x0805881C }, { 0x28C3, 0, 0x08058880 }, { 0x28C4, 0, 0x080589EC }, + { 0x28C5, 0, 0x08058A60 }, { 0x28C6, 0, 0x08058A78 }, { 0x28C7, 0, 0x08058AC0 }, { 0x28C8, 0, 0x08058AF4 }, + { 0x28C9, 0, 0x08058B54 }, { 0x28CA, 0, 0x08058B9C }, { 0x28CB, 0, 0x08058BD4 }, { 0x28CC, 0, 0x08058C24 }, + { 0x28CD, 0, 0x08058C58 }, { 0x28CE, 0, 0x08058C6C }, { 0x28CF, 0, 0x08058C88 }, { 0x28D0, 0, 0x08058CCC }, + { 0x28D1, 0, 0x08058D1C }, { 0x28D2, 0, 0x08058D4C }, { 0x28D3, 0, 0x08058DA0 }, { 0x28D4, 0, 0x08058DF0 }, + { 0x28D5, 0, 0x08058E4C }, { 0x28D6, 0, 0x08058EE8 }, { 0x28D7, 0, 0x08058F10 }, { 0x28D8, 0, 0x08058F60 }, + { 0x28D9, 0, 0x0805901C }, { 0x28DA, 0, 0x08059030 }, { 0x28DB, 0, 0x08059154 }, { 0x28DC, 0, 0x08059184 }, + { 0x28DE, 0, 0x080591A8 }, { 0x28DF, 0, 0x080591E4 }, { 0x28E0, 0, 0x08059220 }, { 0x28E1, 0, 0x08059260 }, + { 0x28E2, 0, 0x080592C8 }, { 0x28E3, 0, 0x0805931C }, { 0x28E4, 0, 0x08059378 }, { 0x28E5, 0, 0x080593A4 }, + { 0x28E6, 0, 0x080593B8 }, { 0x28E7, 0, 0x080593FC }, { 0x28E8, 0, 0x08059420 }, { 0x28E9, 0, 0x0805945C }, + { 0x28EA, 0, 0x08059480 }, { 0x28EB, 0, 0x080594D4 }, { 0x28EC, 0, 0x08059564 }, { 0x28ED, 0, 0x080595B8 }, + { 0x28EE, 0, 0x080595F8 }, { 0x28EF, 0, 0x08059640 }, { 0x28F0, 0, 0x080596F8 }, { 0x28F1, 0, 0x08059754 }, + { 0x28F2, 0, 0x080597D4 }, { 0x28F3, 0, 0x08059814 }, { 0x28F4, 0, 0x080599B0 }, { 0x28F5, 0, 0x080599F8 }, + { 0x28F6, 0, 0x08059AC0 }, { 0x28F7, 0, 0x08059AEC }, { 0x28F8, 0, 0x08059B70 }, { 0x28F9, 0, 0x08059BDC }, + { 0x28FA, 0, 0x08059C00 }, { 0x28FB, 0, 0x08059C60 }, { 0x28FC, 0, 0x08059CBC }, { 0x28FD, 0, 0x08059DA0 }, + { 0x28FE, 0, 0x08059DB0 }, { 0x28FF, 0, 0x08059E2C }, { 0x2900, 0, 0x08059EC8 }, { 0x2901, 0, 0x08059EF4 }, + { 0x2902, 0, 0x08059F70 }, { 0x2903, 0, 0x08059FD0 }, { 0x2904, 0, 0x0805A04C }, { 0x2905, 0, 0x0805A24C }, + { 0x2906, 0, 0x0805A4F8 }, { 0x2907, 0, 0x0805A584 }, { 0x2908, 0, 0x0805A5C0 }, { 0x2909, 0, 0x0805A60C }, + { 0x290A, 0, 0x0805A640 }, { 0x290B, 0, 0x0805A6C8 }, { 0x290C, 0, 0x0805A9C0 }, { 0x290D, 0, 0x0805AD84 }, + { 0x290E, 0, 0x0805ADF8 }, { 0x290F, 0, 0x0805AE40 }, { 0x2910, 0, 0x0805AE74 }, { 0x2911, 0, 0x0805AF50 }, + { 0x2912, 0, 0x0805AFCC }, { 0x2913, 0, 0x0805B044 }, { 0x2914, 0, 0x0805B104 }, { 0x2915, 0, 0x0805B1F8 }, + { 0x2916, 0, 0x0805B224 }, { 0x2917, 0, 0x0805B244 }, { 0x2918, 0, 0x0805B2A0 }, { 0x2919, 0, 0x0805B2D0 }, + { 0x291A, 0, 0x0805B314 }, { 0x291B, 0, 0x0805B354 }, { 0x291C, 0, 0x0805B3B0 }, { 0x291D, 0, 0x0805B400 }, + { 0x291E, 0, 0x0805B454 }, { 0x291F, 0, 0x0805B494 }, { 0x2920, 0, 0x0805B4EC }, { 0x2921, 0, 0x0805B538 }, + { 0x2922, 0, 0x0805B58C }, { 0x2923, 0, 0x0805B600 }, { 0x2924, 0, 0x0805B65C }, { 0x2925, 0, 0x0805B738 }, + { 0x2926, 0, 0x0805B770 }, { 0x2927, 0, 0x0805B794 }, { 0x2928, 0, 0x0805B7C8 }, { 0x2929, 0, 0x0805B7EC }, + { 0x292A, 0, 0x0805B814 }, { 0x292B, 0, 0x0805B8C0 }, { 0x292C, 0, 0x0805B994 }, { 0x292D, 0, 0x0805BA44 }, + { 0x292E, 0, 0x0805BB14 }, { 0x292F, 0, 0x0805BB74 }, { 0x2930, 0, 0x0805BBEC }, { 0x2931, 0, 0x0805BC40 }, + { 0x2932, 0, 0x0805BCBC }, { 0x2933, 0, 0x0805BD3C }, { 0x2934, 0, 0x0805BDA4 }, { 0x2935, 0, 0x0805BDE0 }, + { 0x2936, 0, 0x0805BE20 }, { 0x2937, 0, 0x0805BE90 }, { 0x2938, 0, 0x0805BEE8 }, { 0x2939, 0, 0x0805BF5C }, + { 0x293A, 0, 0x0805BF80 }, { 0x293B, 0, 0x0805BFE4 }, { 0x293C, 0, 0x0805C00C }, { 0x293D, 0, 0x0805C094 }, + { 0x293E, 0, 0x0805C0EC }, { 0x293F, 0, 0x0805C168 }, { 0x2940, 0, 0x0805C1EC }, { 0x2941, 0, 0x0805C258 }, + { 0x2942, 0, 0x0805C2DC }, { 0x2943, 0, 0x0805C350 }, { 0x2944, 0, 0x0805C3B8 }, { 0x2945, 0, 0x0805C3F8 }, + { 0x2946, 0, 0x0805C44C }, { 0x2947, 0, 0x0805C470 }, { 0x2948, 0, 0x0805C4F0 }, { 0x2949, 0, 0x0805C518 }, + { 0x294A, 0, 0x0805C534 }, { 0x294B, 0, 0x0805C54C }, { 0x294C, 0, 0x0805C570 }, { 0x294D, 0, 0x0805C5A8 }, + { 0x294E, 0, 0x0805C680 }, { 0x294F, 0, 0x0805C740 }, { 0x2950, 0, 0x0805C794 }, { 0x2951, 0, 0x0805C7F4 }, + { 0x2952, 0, 0x0805C854 }, { 0x2953, 0, 0x0805C914 }, { 0x2954, 0, 0x0805C940 }, { 0x2955, 0, 0x0805C980 }, + { 0x2956, 0, 0x0805C9DC }, { 0x2957, 0, 0x0805CA08 }, { 0x2958, 0, 0x0805CA2C }, { 0x2959, 0, 0x0805CA48 }, + { 0x295A, 0, 0x0805CA6C }, { 0x295B, 0, 0x0805CAB4 }, { 0x295C, 0, 0x0805CB08 }, { 0x295D, 0, 0x0805CB24 }, + { 0x295E, 0, 0x0805CB44 }, { 0x295F, 0, 0x0805CB60 }, { 0x2960, 0, 0x0805CC3C }, { 0x2961, 0, 0x0805CD14 }, + { 0x2962, 0, 0x0805CD3C }, { 0x2968, 0, 0x0805CE60 }, { 0x2969, 0, 0x0805CE78 }, { 0x296A, 0, 0x0805CEF4 }, + { 0x296B, 0, 0x0805CF24 }, { 0x296C, 0, 0x0805CF64 }, { 0x296D, 0, 0x0805CF9C }, { 0x296E, 0, 0x0805CFB4 }, + { 0x296F, 0, 0x0805D018 }, { 0x2970, 0, 0x0805D08C }, { 0x2971, 0, 0x0805D17C }, { 0x2972, 0, 0x0805D1C4 }, + { 0x2973, 0, 0x0805D234 }, { 0x2974, 0, 0x0805D258 }, { 0x2975, 0, 0x0805D2E4 }, { 0x2976, 0, 0x0805D314 }, + { 0x2977, 0, 0x0805D358 }, { 0x2978, 0, 0x0805D3DC }, { 0x2979, 0, 0x0805D414 }, { 0x297A, 0, 0x0805D458 }, + { 0x29CC, 0, 0x0805D4A8 }, { 0x29CD, 0, 0x0805D4C0 }, { 0x29CE, 0, 0x0805D514 }, { 0x29CF, 0, 0x0805D550 }, + { 0x29D0, 0, 0x0805D580 }, { 0x29D1, 0, 0x0805D5AC }, { 0x29D2, 0, 0x0805D5D4 }, { 0x29D3, 0, 0x0805D620 }, + { 0x29D4, 0, 0x0805D724 }, { 0x29D5, 0, 0x0805D824 }, { 0x29D6, 0, 0x0805D864 }, { 0x29D7, 0, 0x0805D8A8 }, + { 0x29D8, 0, 0x0805D9A8 }, { 0x29D9, 0, 0x0805DAA4 }, { 0x29DA, 0, 0x0805DAFC }, { 0x29DB, 0, 0x0805DB3C }, + { 0x29DC, 0, 0x0805DBA0 }, { 0x29DD, 0, 0x0805DBDC }, { 0x29DE, 0, 0x0805DC00 }, { 0x29DF, 0, 0x0805DC68 }, + { 0x29E0, 0, 0x0805DC94 }, { 0x29E1, 0, 0x0805DCC0 }, { 0x29E2, 0, 0x0805DCE8 }, { 0x29E3, 0, 0x0805DE80 }, + { 0x29E4, 0, 0x0805DEC0 }, { 0x29E5, 0, 0x0805DFAC }, { 0x29E6, 0, 0x0805DFC8 }, { 0x29E7, 0, 0x0805E00C }, + { 0x29E8, 0, 0x0805E098 }, { 0x29E9, 0, 0x0805E0DC }, { 0x29EA, 0, 0x0805E1D0 }, { 0x29EB, 0, 0x0805E204 }, + { 0x29EC, 0, 0x0805E234 }, { 0x29ED, 0, 0x0805E258 }, { 0x29EE, 0, 0x0805E2A4 }, { 0x29EF, 0, 0x0805E2D4 }, + { 0x29F0, 0, 0x0805E314 }, { 0x29F1, 0, 0x0805E344 }, { 0x29F2, 0, 0x0805E390 }, { 0x29F3, 0, 0x0805E3EC }, + { 0x29F4, 0, 0x0805E428 }, { 0x29F5, 0, 0x0805E49C }, { 0x29F8, 0, 0x0805E4D8 }, { 0x29F9, 0, 0x0805E530 }, + { 0x29FA, 0, 0x0805E56C }, { 0x29FB, 0, 0x0805E5B8 }, { 0x29FC, 0, 0x0805E608 }, { 0x29FD, 0, 0x0805E654 }, + { 0x29FE, 0, 0x0805E6C8 }, { 0x29FF, 0, 0x0805E700 }, { 0x2A00, 0, 0x0805E7B4 }, { 0x2A01, 0, 0x0805E7D0 }, + { 0x2A02, 0, 0x0805E81C }, { 0x2A30, 0, 0x0805E878 }, { 0x2A31, 0, 0x0805E898 }, { 0x2A32, 0, 0x0805E8DC }, + { 0x2A33, 0, 0x0805E94C }, { 0x2A34, 0, 0x0805EA04 }, { 0x2A35, 0, 0x0805EA90 }, { 0x2A36, 0, 0x0805EB14 }, + { 0x2A37, 0, 0x0805EB4C }, { 0x2A38, 0, 0x0805EBD0 }, { 0x2A39, 0, 0x0805EC28 }, { 0x2A3A, 0, 0x0805EC40 }, + { 0x2A94, 0, 0x0805EC78 }, { 0x2A95, 0, 0x0805ECA4 }, { 0x2A96, 0, 0x0805ECD0 }, { 0x2A97, 0, 0x0805EDEC }, + { 0x2A98, 0, 0x0805EF18 }, { 0x2A99, 0, 0x0805EF50 }, { 0x2A9A, 0, 0x0805EFE0 }, { 0x2A9B, 0, 0x0805F120 }, + { 0x2A9C, 0, 0x0805F254 }, { 0x2A9D, 0, 0x0805F30C }, { 0x2A9E, 0, 0x0805F3CC }, { 0x2A9F, 0, 0x0805F4B4 }, + { 0x2AA0, 0, 0x0805F5D0 }, { 0x2AA1, 0, 0x0805F604 }, { 0x2AA2, 0, 0x0805F63C }, { 0x2AA3, 0, 0x0805F68C }, + { 0x2AA4, 0, 0x0805F6BC }, { 0x2AA5, 0, 0x0805F71C }, { 0x2AA6, 0, 0x0805F760 }, { 0x2AA7, 0, 0x0805F7E4 }, + { 0x2AA8, 0, 0x0805F81C }, { 0x2AA9, 0, 0x0805F834 }, { 0x2AAA, 0, 0x0805F870 }, { 0x2AAB, 0, 0x0805F888 }, + { 0x2AAC, 0, 0x0805F8B0 }, { 0x2AAD, 0, 0x0805F8D4 }, { 0x2AAE, 0, 0x0805F944 }, { 0x2AAF, 0, 0x0805F988 }, + { 0x2AB0, 0, 0x0805F9B0 }, { 0x2AB1, 0, 0x0805FA58 }, { 0x2AB2, 0, 0x0805FA6C }, { 0x2AB3, 0, 0x0805FA80 }, + { 0x2AB4, 0, 0x0805FB0C }, { 0x2AB5, 0, 0x0805FB20 }, { 0x2AB6, 0, 0x0805FB64 }, { 0x2AB7, 0, 0x0805FB80 }, + { 0x2AB8, 0, 0x0805FB9C }, { 0x2AB9, 0, 0x0805FBF4 }, { 0x2ABA, 0, 0x0805FC24 }, { 0x2ABB, 0, 0x0805FC88 }, + { 0x2ABC, 0, 0x0805FCB0 }, { 0x2ABD, 0, 0x0805FCD8 }, { 0x2ABE, 0, 0x0805FDD8 }, { 0x2ABF, 0, 0x0805FDFC }, + { 0x2AC0, 0, 0x0805FF50 }, { 0x2AC1, 0, 0x0805FF7C }, { 0x2AC2, 0, 0x080600D0 }, { 0x2AC3, 0, 0x080600EC }, + { 0x2AC4, 0, 0x080601F8 }, { 0x2AC5, 0, 0x0806022C }, { 0x2AC6, 0, 0x08060250 }, { 0x2AC7, 0, 0x08060260 }, + { 0x2AC8, 0, 0x08060270 }, { 0x2AC9, 0, 0x08060280 }, { 0x2ACA, 0, 0x080602E0 }, { 0x2ACB, 0, 0x0806030C }, + { 0x2ACC, 0, 0x08060340 }, { 0x2ACD, 0, 0x080603A4 }, { 0x2ACE, 0, 0x080603C0 }, { 0x2ACF, 0, 0x0806047C }, + { 0x2AD0, 0, 0x08060494 }, { 0x2AD1, 0, 0x0806053C }, { 0x2AD2, 0, 0x080605B0 }, { 0x2AD3, 0, 0x080605FC }, + { 0x2AD4, 0, 0x0806067C }, { 0x2AD5, 0, 0x080606A0 }, { 0x2AD6, 0, 0x080606BC }, { 0x2AD7, 0, 0x080606EC }, + { 0x2AD8, 0, 0x08060724 }, { 0x2AD9, 0, 0x08060748 }, { 0x2ADA, 0, 0x08060794 }, { 0x2ADB, 0, 0x08060814 }, + { 0x2ADC, 0, 0x08060874 }, { 0x2ADD, 0, 0x080608B4 }, { 0x2ADE, 0, 0x080608D0 }, { 0x2ADF, 0, 0x08060960 }, + { 0x2AE0, 0, 0x08060A00 }, { 0x2AE1, 0, 0x08060AA8 }, { 0x2AE2, 0, 0x08060AD4 }, { 0x2AE3, 0, 0x08060B10 }, + { 0x2AE4, 0, 0x08060B74 }, { 0x2AE5, 0, 0x08060BD0 }, { 0x2AE6, 0, 0x08060C6C }, { 0x2AEA, 0, 0x08060CDC }, + { 0x2AEB, 0, 0x08060D1C }, { 0x2AEC, 0, 0x08060D70 }, { 0x2AED, 0, 0x08060D98 }, { 0x2AEE, 0, 0x08060DB8 }, + { 0x2AF8, 0, 0x08060DC8 }, { 0x2AF9, 0, 0x08060DE4 }, { 0x2AFA, 0, 0x08060EC8 }, { 0x2AFB, 0, 0x08060FC0 }, + { 0x2AFC, 0, 0x080610CC }, { 0x2AFD, 0, 0x080611BC }, { 0x2AFE, 0, 0x080611F4 }, { 0x2AFF, 0, 0x080612EC }, + { 0x2B00, 0, 0x080613FC }, { 0x2B01, 0, 0x08061448 }, { 0x2B02, 0, 0x08061470 }, { 0x2B03, 0, 0x080614D0 }, + { 0x2B04, 0, 0x08061504 }, { 0x2B05, 0, 0x08061578 }, { 0x2B06, 0, 0x080615DC }, { 0x2B07, 0, 0x08061658 }, + { 0x2B08, 0, 0x0806167C }, { 0x2B09, 0, 0x080616C0 }, { 0x2B0A, 0, 0x08061714 }, { 0x2B0B, 0, 0x08061750 }, + { 0x2B0C, 0, 0x080617A8 }, { 0x2B0D, 0, 0x080617D8 }, { 0x2B0E, 0, 0x08061810 }, { 0x2B0F, 0, 0x08061890 }, + { 0x2B10, 0, 0x080619A0 }, { 0x2B11, 0, 0x08061AD8 }, { 0x2B12, 0, 0x08061B44 }, { 0x2B13, 0, 0x08061BA0 }, + { 0x2B14, 0, 0x08061C0C }, { 0x2B15, 0, 0x08061C44 }, { 0x2B16, 0, 0x08061CE0 }, { 0x2B17, 0, 0x08061D4C }, + { 0x2B18, 0, 0x08061D70 }, { 0x2B19, 0, 0x08061DD4 }, { 0x2B1A, 0, 0x08061EB4 }, { 0x2B1B, 0, 0x08061F10 }, + { 0x2B1C, 0, 0x08061F88 }, { 0x2B1D, 0, 0x08061FC4 }, { 0x2B1E, 0, 0x08061FEC }, { 0x2B1F, 0, 0x08062024 }, + { 0x2B20, 0, 0x0806209C }, { 0x2B21, 0, 0x0806212C }, { 0x2B22, 0, 0x08062164 }, { 0x2B23, 0, 0x080621A8 }, + { 0x2B24, 0, 0x0806229C }, { 0x2B25, 0, 0x080622D8 }, { 0x2B26, 0, 0x080622F8 }, { 0x2B27, 0, 0x08062350 }, + { 0x2B28, 0, 0x080623A0 }, { 0x2B29, 0, 0x080623D0 }, { 0x2B2A, 0, 0x08062428 }, { 0x2B2B, 0, 0x08062478 }, + { 0x2B2C, 0, 0x080624AC }, { 0x2B2D, 0, 0x08062500 }, { 0x2B2E, 0, 0x08062550 }, { 0x2B2F, 0, 0x08062580 }, + { 0x2B30, 0, 0x080625D4 }, { 0x2B31, 0, 0x08062624 }, { 0x2B32, 0, 0x08062650 }, { 0x2B33, 0, 0x08062670 }, + { 0x2B34, 0, 0x080626B0 }, { 0x2B35, 0, 0x080626DC }, { 0x2B36, 0, 0x080626FC }, { 0x2B37, 0, 0x0806273C }, + { 0x2B38, 0, 0x080627D8 }, { 0x2B39, 0, 0x08062890 }, { 0x2B3A, 0, 0x08062910 }, { 0x2B3B, 0, 0x08062968 }, + { 0x2B3C, 0, 0x080629A4 }, { 0x2B3D, 0, 0x080629E0 }, { 0x2B3E, 0, 0x08062A90 }, { 0x2B3F, 0, 0x08062AD8 }, + { 0x2B40, 0, 0x08062B34 }, { 0x2B5C, 0, 0x08062B84 }, { 0x2B5D, 0, 0x08062C3C }, { 0x2B5E, 0, 0x08062C68 }, + { 0x2B5F, 0, 0x08062C94 }, { 0x2B60, 0, 0x08062CE8 }, { 0x2B61, 0, 0x08062D8C }, { 0x2B62, 0, 0x08062E34 }, + { 0x2B63, 0, 0x08062E84 }, { 0x2B64, 0, 0x08062F18 }, { 0x2B65, 0, 0x08062F50 }, { 0x2B66, 0, 0x08062F98 }, + { 0x2B67, 0, 0x08062FE0 }, { 0x32C8, 0, 0x08063054 }, { 0x32C9, 0, 0x080630D8 }, { 0x32CA, 0, 0x08063120 }, + { 0x32CB, 0, 0x08063184 }, { 0x32CC, 0, 0x080631E0 }, { 0x32CD, 0, 0x08063210 }, { 0x32CE, 0, 0x0806326C }, + { 0x32CF, 0, 0x08063294 }, { 0x32D0, 0, 0x080632B4 }, { 0x32D1, 0, 0x08063300 }, { 0x32D2, 0, 0x08063338 }, + { 0x32D3, 0, 0x08063384 }, { 0x32D4, 0, 0x080633B4 }, { 0x332C, 0, 0x080633E8 }, { 0x332D, 0, 0x08063408 }, + { 0x332E, 0, 0x080634FC }, { 0x332F, 0, 0x0806356C }, { 0x3330, 0, 0x08063594 }, { 0x3331, 0, 0x080635AC }, + { 0x3332, 0, 0x080635D0 }, { 0x3333, 0, 0x08063618 }, { 0x3334, 0, 0x0806369C }, { 0x3335, 0, 0x08063714 }, + { 0x3336, 0, 0x08063734 }, { 0x3337, 0, 0x08063788 }, { 0x3338, 0, 0x080637AC }, { 0x3339, 0, 0x080637CC }, + { 0x333A, 0, 0x08063838 }, { 0x333B, 0, 0x08063868 }, { 0x333C, 0, 0x08063898 }, { 0x333D, 0, 0x08063948 }, + { 0x333E, 0, 0x08063988 }, { 0x333F, 0, 0x080639AC }, { 0x3340, 0, 0x08063A58 }, { 0x3341, 0, 0x08063AB0 }, + { 0x3342, 0, 0x08063B24 }, { 0x3343, 0, 0x08063BBC }, { 0x3344, 0, 0x08063C28 }, { 0x3345, 0, 0x08063CF0 }, + { 0x3346, 0, 0x08063D24 }, { 0x3347, 0, 0x08063D5C }, { 0x3348, 0, 0x08063D8C }, { 0x3349, 0, 0x08063DEC }, + { 0x334A, 0, 0x08063E70 }, { 0x334B, 0, 0x08063EA8 }, { 0x334C, 0, 0x08063EC4 }, { 0x334D, 0, 0x08063FB4 }, + { 0x334E, 0, 0x08063FDC }, { 0x334F, 0, 0x08064038 }, { 0x3350, 0, 0x08064058 }, { 0x3351, 0, 0x0806408C }, + { 0x3352, 0, 0x080640B0 }, { 0x3353, 0, 0x080640E0 }, { 0x3354, 0, 0x08064168 }, { 0x3355, 0, 0x080641B4 }, + { 0x3356, 0, 0x080641EC }, { 0x3357, 0, 0x08064218 }, { 0x3358, 0, 0x08064230 }, { 0x3359, 0, 0x08064264 }, + { 0x335A, 0, 0x08064298 }, { 0x335B, 0, 0x080642F0 }, { 0x335C, 0, 0x08064354 }, { 0x335D, 0, 0x0806437C }, + { 0x335E, 0, 0x080643B4 }, { 0x335F, 0, 0x080643E4 }, { 0x3360, 0, 0x0806444C }, { 0x3361, 0, 0x08064498 }, + { 0x3362, 0, 0x080644EC }, { 0x3363, 0, 0x0806453C }, { 0x3364, 0, 0x08064564 }, { 0x3365, 0, 0x08064654 }, + { 0x3366, 0, 0x08064718 }, { 0x3367, 0, 0x080647E4 }, { 0x3368, 0, 0x08064860 }, { 0x3369, 0, 0x080648B8 }, + { 0x336A, 0, 0x08064988 }, { 0x336B, 0, 0x080649F4 }, { 0x336C, 0, 0x08064A44 }, { 0x336D, 0, 0x08064AA0 }, + { 0x336E, 0, 0x08064AE8 }, { 0x336F, 0, 0x08064B10 }, { 0x3370, 0, 0x08064B64 }, { 0x3371, 0, 0x08064BBC }, + { 0x3390, 0, 0x08064BEC }, { 0x3391, 0, 0x08064C24 }, { 0x3392, 0, 0x08064CE0 }, { 0x3393, 0, 0x08064D4C }, + { 0x3394, 0, 0x08064DA0 }, { 0x3395, 0, 0x08064E04 }, { 0x3396, 0, 0x08064F10 }, { 0x3397, 0, 0x08064F84 }, + { 0x3398, 0, 0x08064FBC }, { 0x3399, 0, 0x08065070 }, { 0x339A, 0, 0x080650DC }, { 0x339B, 0, 0x08065144 }, + { 0x339C, 0, 0x0806516C }, { 0x339D, 0, 0x0806519C }, { 0x339E, 0, 0x080651D4 }, { 0x339F, 0, 0x080651F0 }, + { 0x33A0, 0, 0x0806524C }, { 0x33A1, 0, 0x08065358 }, { 0x33A2, 0, 0x080653CC }, { 0x33A3, 0, 0x08065408 }, + { 0x33A4, 0, 0x08065438 }, { 0x33A5, 0, 0x08065470 }, { 0x33A6, 0, 0x080654CC }, { 0x33A7, 0, 0x08065510 }, + { 0x33A8, 0, 0x0806555C }, { 0x33A9, 0, 0x080655A0 }, { 0x33AA, 0, 0x080655C0 }, { 0x33AB, 0, 0x08065600 }, + { 0x33AC, 0, 0x08065658 }, { 0x33AD, 0, 0x08065678 }, { 0x33AE, 0, 0x08065710 }, { 0x33AF, 0, 0x080657A8 }, + { 0x33B0, 0, 0x080657D0 }, { 0x33B1, 0, 0x080657E8 }, { 0x33B2, 0, 0x08065860 }, { 0x33B3, 0, 0x080658E4 }, + { 0x33B4, 0, 0x08065930 }, { 0x33B5, 0, 0x0806597C }, { 0x33B6, 0, 0x080659DC }, { 0x33B7, 0, 0x08065A28 }, + { 0x33B8, 0, 0x08065ABC }, { 0x33B9, 0, 0x08065AE0 }, { 0x33BA, 0, 0x08065B08 }, { 0x33BB, 0, 0x08065B7C }, + { 0x33BC, 0, 0x08065BD8 }, { 0x33BD, 0, 0x08065C5C }, { 0x33BE, 0, 0x08065C88 }, { 0x33BF, 0, 0x08065CCC }, + { 0x33C0, 0, 0x08065D30 }, { 0x33C1, 0, 0x08065DD4 }, { 0x33C2, 0, 0x08065E24 }, { 0x33C3, 0, 0x08065E84 }, + { 0x33C4, 0, 0x08065F4C }, { 0x33C5, 0, 0x08066024 }, { 0x33C6, 0, 0x08066120 }, { 0x33C7, 0, 0x08066144 }, + { 0x33C8, 0, 0x08066200 }, { 0x33C9, 0, 0x08066268 }, { 0x33CA, 0, 0x0806629C }, { 0x33CB, 0, 0x080662D0 }, + { 0x33CC, 0, 0x0806630C }, { 0x33CD, 0, 0x08066324 }, { 0x33CE, 0, 0x0806635C }, { 0x33CF, 0, 0x0806637C }, + { 0x33D0, 0, 0x080663AC }, { 0x33D1, 0, 0x08066464 }, { 0x33D2, 0, 0x08066578 }, { 0x33D3, 0, 0x080665F4 }, + { 0x33D4, 0, 0x0806665C }, { 0x33D5, 0, 0x080666D0 }, { 0x33D6, 0, 0x08066708 }, { 0x33D7, 0, 0x08066788 }, + { 0x33D8, 0, 0x080667D4 }, { 0x33D9, 0, 0x08066834 }, { 0x33F4, 0, 0x080668FC }, { 0x33F5, 0, 0x08066934 }, + { 0x33F6, 0, 0x080669DC }, { 0x33F7, 0, 0x08066A3C }, { 0x33F9, 0, 0x08066B00 }, { 0x3458, 0, 0x08066B40 }, + { 0x3459, 0, 0x08066B60 }, { 0x345A, 0, 0x08066BC0 }, { 0x345B, 0, 0x08066C10 }, { 0x345C, 0, 0x08066C7C }, + { 0x345D, 0, 0x08066CB8 }, { 0x345E, 0, 0x08066D20 }, { 0x345F, 0, 0x08066D90 }, { 0x3460, 0, 0x08066E58 }, + { 0x3461, 0, 0x08066E9C }, { 0x3462, 0, 0x08066EE8 }, { 0x3463, 0, 0x08066F38 }, { 0x3464, 0, 0x08066F64 }, + { 0x3465, 0, 0x08066FF8 }, { 0x3466, 0, 0x080670A4 }, { 0x3467, 0, 0x080670F0 }, { 0x3468, 0, 0x08067144 }, + { 0x3469, 0, 0x08067174 }, { 0x346A, 0, 0x080671E8 }, { 0x346B, 0, 0x08067208 }, { 0x346C, 0, 0x08067224 }, + { 0x346D, 0, 0x0806728C }, { 0x346E, 0, 0x0806731C }, { 0x346F, 0, 0x0806739C }, { 0x3470, 0, 0x08067400 }, + { 0x3471, 0, 0x0806743C }, { 0x3472, 0, 0x0806746C }, { 0x3473, 0, 0x080674B0 }, { 0x3474, 0, 0x08067520 }, + { 0x3475, 0, 0x08067594 }, { 0x3476, 0, 0x080675B8 }, { 0x3477, 0, 0x080675E0 }, { 0x3478, 0, 0x08067618 }, + { 0x3479, 0, 0x08067648 }, { 0x347A, 0, 0x08067688 }, { 0x347B, 0, 0x080676B0 }, { 0x347C, 0, 0x080676F0 }, + { 0x347D, 0, 0x08067760 }, { 0x347E, 0, 0x080677A4 }, { 0x347F, 0, 0x080677F4 }, { 0x3480, 0, 0x0806782C }, + { 0x3481, 0, 0x080678A0 }, { 0x3482, 0, 0x080678C8 }, { 0x3483, 0, 0x080678F8 }, { 0x3484, 0, 0x08067934 }, + { 0x3485, 0, 0x08067990 }, { 0x3486, 0, 0x080679E0 }, { 0x3487, 0, 0x08067A18 }, { 0x3488, 0, 0x08067A68 }, + { 0x3489, 0, 0x08067AE8 }, { 0x348A, 0, 0x08067B54 }, { 0x348B, 0, 0x08067BBC }, { 0x348C, 0, 0x08067C0C }, + { 0x348D, 0, 0x08067C5C }, { 0x348E, 0, 0x08067CB8 }, { 0x348F, 0, 0x08067D6C }, { 0x3490, 0, 0x08067DE0 }, + { 0x3491, 0, 0x08067E2C }, { 0x3492, 0, 0x08067E80 }, { 0x3493, 0, 0x08067EDC }, { 0x3494, 0, 0x08067F20 }, + { 0x3495, 0, 0x08067F44 }, { 0x3496, 0, 0x08067F64 }, { 0x3497, 0, 0x08067FEC }, { 0x3498, 0, 0x0806803C }, + { 0x3499, 0, 0x08068094 }, { 0x349A, 0, 0x080680C8 }, { 0x349B, 0, 0x080680FC }, { 0x349C, 0, 0x0806812C }, + { 0x349D, 0, 0x08068158 }, { 0x349E, 0, 0x08068180 }, { 0x349F, 0, 0x080681C0 }, { 0x34A0, 0, 0x08068224 }, + { 0x34A1, 0, 0x08068278 }, { 0x34A2, 0, 0x080682C0 }, { 0x34A3, 0, 0x0806830C }, { 0x34A4, 0, 0x08068394 }, + { 0x34A5, 0, 0x080683F4 }, { 0x34A6, 0, 0x08068430 }, { 0x34A7, 0, 0x08068498 }, { 0x34A8, 0, 0x080684FC }, + { 0x34A9, 0, 0x08068544 }, { 0x34AA, 0, 0x08068564 }, { 0x34AB, 0, 0x08068598 }, { 0x34AC, 0, 0x0806860C }, + { 0x34AD, 0, 0x08068640 }, { 0x34AE, 0, 0x080686F4 }, { 0x34AF, 0, 0x08068768 }, { 0x34B0, 0, 0x08068780 }, + { 0x34B1, 0, 0x080687E0 }, { 0x34B2, 0, 0x080687F8 }, { 0x34B3, 0, 0x08068860 }, { 0x3520, 0, 0x080688F4 }, + { 0x3521, 0, 0x08068958 }, { 0x3522, 0, 0x080689C8 }, { 0x3523, 0, 0x08068A38 }, { 0x3524, 0, 0x08068A88 }, + { 0x3525, 0, 0x08068B04 }, { 0x3526, 0, 0x08068B30 }, { 0x3527, 0, 0x08068B7C }, { 0x3528, 0, 0x08068CA0 }, + { 0x3529, 0, 0x08068CF4 }, { 0x352A, 0, 0x08068D1C }, { 0x352B, 0, 0x08068DB0 }, { 0x352C, 0, 0x08068E28 }, + { 0x352D, 0, 0x08068E78 }, { 0x352E, 0, 0x08068F14 }, { 0x352F, 0, 0x08068F78 }, { 0x3530, 0, 0x08068FA0 }, + { 0x3531, 0, 0x08069020 }, { 0x3532, 0, 0x080690CC }, { 0x3533, 0, 0x0806913C }, { 0x3534, 0, 0x080691B0 }, + { 0x3535, 0, 0x08069224 }, { 0x3536, 0, 0x0806923C }, { 0x3537, 0, 0x08069284 }, { 0x3538, 0, 0x080692D8 }, + { 0x3539, 0, 0x08069314 }, { 0x353A, 0, 0x08069358 }, { 0x353B, 0, 0x08069390 }, { 0x353C, 0, 0x080693E4 }, + { 0x353D, 0, 0x08069434 }, { 0x353E, 0, 0x08069490 }, { 0x353F, 0, 0x080694C4 }, { 0x3540, 0, 0x08069524 }, + { 0x3541, 0, 0x0806957C }, { 0x3542, 0, 0x080695C0 }, { 0x3543, 0, 0x08069608 }, { 0x3544, 0, 0x08069668 }, + { 0x3545, 0, 0x080696DC }, { 0x3546, 0, 0x08069734 }, { 0x3548, 0, 0x08069774 }, { 0x3549, 0, 0x08069814 }, + { 0x354A, 0, 0x080698A0 }, { 0x354B, 0, 0x08069930 }, { 0x354C, 0, 0x08069998 }, { 0xFFFC, 0, 0x080699C8 }, + { 0xFFFD, 0, 0x080699D4 }, { 0xFFFF, 0, NULL }, +}; + +MessageTableEntry D_801CFB08[46] = { + { 0x4E20, 0xB0, 0x07000000 }, { 0x4E21, 0xB0, 0x0700003C }, { 0x4E22, 0xB0, 0x07000094 }, + { 0x4E23, 0xB0, 0x070000F0 }, { 0x4E24, 0xB0, 0x07000140 }, { 0x4E25, 0xB0, 0x0700019C }, + { 0x4E26, 0xB0, 0x070001D8 }, { 0x4E27, 0xB0, 0x07000248 }, { 0x4E28, 0xB0, 0x0700027C }, + { 0x4E29, 0xB0, 0x070002E0 }, { 0x4E2A, 0xB0, 0x0700033C }, { 0x4E2B, 0xB0, 0x07000384 }, + { 0x4E2C, 0xB0, 0x070003C8 }, { 0x4E2D, 0xB0, 0x0700040C }, { 0x4E2E, 0xB0, 0x07000450 }, + { 0x4E2F, 0xB0, 0x070004A8 }, { 0x4E30, 0xB0, 0x07000504 }, { 0x4E31, 0xB0, 0x07000564 }, + { 0x4E32, 0xB0, 0x070005CC }, { 0x4E33, 0xB0, 0x07000610 }, { 0x4E34, 0xB0, 0x07000654 }, + { 0x4E35, 0xB0, 0x07000698 }, { 0x4E36, 0xB0, 0x070006F8 }, { 0x4E37, 0xB0, 0x07000750 }, + { 0x4E38, 0xB0, 0x07000798 }, { 0x4E39, 0xB0, 0x0700081C }, { 0x4E3A, 0xB0, 0x07000888 }, + { 0x4E3B, 0xB0, 0x07000924 }, { 0x4E3C, 0xB0, 0x070009B4 }, { 0x4E3D, 0xB0, 0x070009E8 }, + { 0x4E3E, 0xB0, 0x07000A78 }, { 0x4E3F, 0xB0, 0x07000AB0 }, { 0x4E40, 0xB0, 0x07000B2C }, + { 0x4E41, 0xB0, 0x07000B54 }, { 0x4E42, 0xB0, 0x07000B7C }, { 0x4E43, 0xB0, 0x07000BA4 }, + { 0x4E44, 0xB0, 0x07000BCC }, { 0x4E45, 0xB0, 0x07000BF4 }, { 0x4E46, 0xB0, 0x07000C1C }, + { 0x4E47, 0xB0, 0x07000C44 }, { 0x4E48, 0xB0, 0x07000C6C }, { 0x4E49, 0xB0, 0x07000CEC }, + { 0x4E4A, 0xB0, 0x07000D5C }, { 0x4E4B, 0xB0, 0x07000DC8 }, { 0x4E4C, 0xB0, 0x07000E54 }, + { 0xFFFF, 0, NULL }, +}; diff --git a/src/code/z_parameter.c b/src/code/z_parameter.c index 4fcd31c8b..956bda896 100644 --- a/src/code/z_parameter.c +++ b/src/code/z_parameter.c @@ -1709,7 +1709,7 @@ void Interface_UpdateButtonsPart2(PlayState* play) { if (CHECK_EVENTINF(EVENTINF_41)) { // Related to swamp boat (non-minigame)? for (i = EQUIP_SLOT_C_LEFT; i <= EQUIP_SLOT_C_RIGHT; i++) { - if ((GET_CUR_FORM_BTN_ITEM(i) != ITEM_PICTOGRAPH_BOX) || (msgCtx->msgMode != 0)) { + if ((GET_CUR_FORM_BTN_ITEM(i) != ITEM_PICTOGRAPH_BOX) || (msgCtx->msgMode != MSGMODE_NONE)) { if (gSaveContext.buttonStatus[i] == BTN_ENABLED) { restoreHudVisibility = true; } @@ -3657,7 +3657,7 @@ void Magic_Update(PlayState* play) { case MAGIC_STATE_CONSUME_LENS: // Slowly consume magic while Lens of Truth is active if ((play->pauseCtx.state == PAUSE_STATE_OFF) && (play->pauseCtx.debugEditor == DEBUG_EDITOR_NONE) && - (msgCtx->msgMode == 0) && (play->gameOverCtx.state == GAMEOVER_INACTIVE) && + (msgCtx->msgMode == MSGMODE_NONE) && (play->gameOverCtx.state == GAMEOVER_INACTIVE) && (play->transitionTrigger == TRANS_TRIGGER_OFF) && (play->transitionMode == TRANS_MODE_OFF) && !Play_InCsMode(play)) { @@ -3700,7 +3700,7 @@ void Magic_Update(PlayState* play) { // fallthrough case MAGIC_STATE_CONSUME_GORON_ZORA: if ((play->pauseCtx.state == PAUSE_STATE_OFF) && (play->pauseCtx.debugEditor == 0) && - (msgCtx->msgMode == 0) && (play->gameOverCtx.state == GAMEOVER_INACTIVE) && + (msgCtx->msgMode == MSGMODE_NONE) && (play->gameOverCtx.state == GAMEOVER_INACTIVE) && (play->transitionTrigger == TRANS_TRIGGER_OFF) && (play->transitionMode == TRANS_MODE_OFF)) { if (!Play_InCsMode(play)) { interfaceCtx->magicConsumptionTimer--; @@ -3722,7 +3722,7 @@ void Magic_Update(PlayState* play) { case MAGIC_STATE_CONSUME_GIANTS_MASK: if ((play->pauseCtx.state == PAUSE_STATE_OFF) && (play->pauseCtx.debugEditor == DEBUG_EDITOR_NONE) && - (msgCtx->msgMode == 0) && (play->gameOverCtx.state == GAMEOVER_INACTIVE) && + (msgCtx->msgMode == MSGMODE_NONE) && (play->gameOverCtx.state == GAMEOVER_INACTIVE) && (play->transitionTrigger == TRANS_TRIGGER_OFF) && (play->transitionMode == TRANS_MODE_OFF)) { if (!Play_InCsMode(play)) { interfaceCtx->magicConsumptionTimer--; @@ -3932,7 +3932,7 @@ void Interface_DrawItemButtons(PlayState* play) { if ((gSaveContext.hudVisibility == HUD_VISIBILITY_NONE) || (gSaveContext.hudVisibility == HUD_VISIBILITY_NONE_ALT) || (gSaveContext.hudVisibility == HUD_VISIBILITY_A_HEARTS_MAGIC_WITH_OVERWRITE) || - (msgCtx->msgMode != 0)) { + (msgCtx->msgMode != MSGMODE_NONE)) { temp = 0; } else if (player->stateFlags1 & PLAYER_STATE1_200000) { temp = 70; @@ -4400,8 +4400,8 @@ void Interface_DrawClock(PlayState* play) { OPEN_DISPS(play->state.gfxCtx); if ((R_TIME_SPEED != 0) && - ((msgCtx->msgMode == 0) || ((play->actorCtx.flags & ACTORCTX_FLAG_1) && !Play_InCsMode(play)) || - (msgCtx->msgMode == 0) || ((msgCtx->currentTextId >= 0x100) && (msgCtx->currentTextId <= 0x200)) || + ((msgCtx->msgMode == MSGMODE_NONE) || ((play->actorCtx.flags & ACTORCTX_FLAG_1) && !Play_InCsMode(play)) || + (msgCtx->msgMode == MSGMODE_NONE) || ((msgCtx->currentTextId >= 0x100) && (msgCtx->currentTextId <= 0x200)) || (gSaveContext.gameMode == GAMEMODE_END_CREDITS)) && !FrameAdvance_IsEnabled(&play->state) && !Environment_IsTimeStopped() && (gSaveContext.save.day <= 3)) { /** @@ -5440,31 +5440,31 @@ void Interface_StartMoonCrash(PlayState* play) { play->transitionType = TRANS_TYPE_FADE_WHITE; } -void Interface_GetTimerDigits(u64 timer, s16* timerArr) { - u64 time = timer; +void Interface_GetTimerDigits(OSTime time, s16* timerArr) { + OSTime t = time; // 6 minutes - timerArr[0] = time / SECONDS_TO_TIMER(360); - time -= timerArr[0] * SECONDS_TO_TIMER(360); + timerArr[0] = t / SECONDS_TO_TIMER(360); + t -= timerArr[0] * SECONDS_TO_TIMER(360); // minutes - timerArr[1] = time / SECONDS_TO_TIMER(60); - time -= timerArr[1] * SECONDS_TO_TIMER(60); + timerArr[1] = t / SECONDS_TO_TIMER(60); + t -= timerArr[1] * SECONDS_TO_TIMER(60); // 10 seconds - timerArr[3] = time / SECONDS_TO_TIMER(10); - time -= timerArr[3] * SECONDS_TO_TIMER(10); + timerArr[3] = t / SECONDS_TO_TIMER(10); + t -= timerArr[3] * SECONDS_TO_TIMER(10); // seconds - timerArr[4] = time / SECONDS_TO_TIMER(1); - time -= timerArr[4] * SECONDS_TO_TIMER(1); + timerArr[4] = t / SECONDS_TO_TIMER(1); + t -= timerArr[4] * SECONDS_TO_TIMER(1); // 100 milliseconds - timerArr[6] = time / SECONDS_TO_TIMER_PRECISE(0, 10); - time -= timerArr[6] * SECONDS_TO_TIMER_PRECISE(0, 10); + timerArr[6] = t / SECONDS_TO_TIMER_PRECISE(0, 10); + t -= timerArr[6] * SECONDS_TO_TIMER_PRECISE(0, 10); // 10 milliseconds - timerArr[7] = time; + timerArr[7] = t; } #define IS_POSTMAN_TIMER_DRAWN \ @@ -5500,8 +5500,8 @@ void Interface_DrawTimers(PlayState* play) { // Not satisfying any of these conditions will pause the timer if ((play->pauseCtx.state == PAUSE_STATE_OFF) && (play->pauseCtx.debugEditor == DEBUG_EDITOR_NONE) && (play->gameOverCtx.state == GAMEOVER_INACTIVE) && - ((msgCtx->msgMode == 0) || - ((msgCtx->msgMode != 0) && (msgCtx->currentTextId >= 0x1BB2) && (msgCtx->currentTextId <= 0x1BB6))) && + ((msgCtx->msgMode == MSGMODE_NONE) || ((msgCtx->msgMode != MSGMODE_NONE) && (msgCtx->currentTextId >= 0x1BB2) && + (msgCtx->currentTextId <= 0x1BB6))) && !(player->stateFlags1 & PLAYER_STATE1_200) && (play->transitionTrigger == TRANS_TRIGGER_OFF) && (play->transitionMode == TRANS_MODE_OFF) && !Play_InCsMode(play)) { @@ -5950,7 +5950,7 @@ void Interface_UpdateBottleTimers(PlayState* play) { // Not satisfying any of these conditions will pause the bottle timer if ((play->pauseCtx.state == PAUSE_STATE_OFF) && (play->pauseCtx.debugEditor == DEBUG_EDITOR_NONE) && (play->gameOverCtx.state == GAMEOVER_INACTIVE) && - ((msgCtx->msgMode == 0) || ((msgCtx->currentTextId >= 0x100) && (msgCtx->currentTextId <= 0x200)) || + ((msgCtx->msgMode == MSGMODE_NONE) || ((msgCtx->currentTextId >= 0x100) && (msgCtx->currentTextId <= 0x200)) || ((msgCtx->currentTextId >= 0x1BB2) && (msgCtx->currentTextId <= 0x1BB6))) && (play->transitionTrigger == TRANS_TRIGGER_OFF) && (play->transitionMode == TRANS_MODE_OFF) && !Play_InCsMode(play)) { @@ -6870,7 +6870,7 @@ void Interface_Update(PlayState* play) { interfaceCtx->aButtonRoll = -15700.0f; interfaceCtx->aButtonState = A_BTN_STATE_2; - if ((msgCtx->msgMode != 0) && (msgCtx->textboxYTarget == 0x26)) { + if ((msgCtx->msgMode != MSGMODE_NONE) && (msgCtx->textboxYTarget == 38)) { R_A_BTN_Y_OFFSET = -14; } else { R_A_BTN_Y_OFFSET = 0; @@ -7018,8 +7018,9 @@ void Interface_Update(PlayState* play) { // Update Sun Song if (gSaveContext.sunsSongState != SUNSSONG_INACTIVE) { // exit out of ocarina mode after suns song finishes playing - if ((msgCtx->ocarinaAction != 0x39) && (gSaveContext.sunsSongState == SUNSSONG_START)) { - play->msgCtx.ocarinaMode = 4; + if ((msgCtx->ocarinaAction != OCARINA_ACTION_CHECK_NOTIME_DONE) && + (gSaveContext.sunsSongState == SUNSSONG_START)) { + play->msgCtx.ocarinaMode = OCARINA_MODE_END; } // handle suns song in areas where time moves @@ -7039,7 +7040,7 @@ void Interface_Update(PlayState* play) { // Daytime has been reached. End suns song effect gSaveContext.sunsSongState = SUNSSONG_INACTIVE; R_TIME_SPEED = sPrevTimeSpeed; - play->msgCtx.ocarinaMode = 4; + play->msgCtx.ocarinaMode = OCARINA_MODE_END; } } else { // Daytime @@ -7047,7 +7048,7 @@ void Interface_Update(PlayState* play) { // Nighttime has been reached. End suns song effect gSaveContext.sunsSongState = SUNSSONG_INACTIVE; R_TIME_SPEED = sPrevTimeSpeed; - play->msgCtx.ocarinaMode = 4; + play->msgCtx.ocarinaMode = OCARINA_MODE_END; } } } else { diff --git a/src/code/z_play.c b/src/code/z_play.c index 41b921125..9a5e6541d 100644 --- a/src/code/z_play.c +++ b/src/code/z_play.c @@ -1072,7 +1072,7 @@ void Play_Update(PlayState* this) { this->pauseCtx.bombersNotebookOpen = false; sBombersNotebook.loadState = BOMBERS_NOTEBOOK_LOAD_STATE_NONE; this->msgCtx.msgLength = 0; - this->msgCtx.msgMode = 0; + this->msgCtx.msgMode = MSGMODE_NONE; this->msgCtx.currentTextId = 0; this->msgCtx.stateTimer = 0; Audio_PlaySfx(NA_SE_SY_CANCEL); diff --git a/src/code/z_sram_NES.c b/src/code/z_sram_NES.c index c5fe03475..059596909 100644 --- a/src/code/z_sram_NES.c +++ b/src/code/z_sram_NES.c @@ -638,7 +638,7 @@ void Sram_SaveEndOfCycle(PlayState* play) { } gSaveContext.save.saveInfo.playerData.rupees = 0; - gSaveContext.save.saveInfo.unk_F41 = 0; + gSaveContext.save.saveInfo.scarecrowSpawnSongSet = false; gSaveContext.powderKegTimer = 0; gSaveContext.unk_1014 = 0; gSaveContext.jinxTimer = 0; @@ -1304,7 +1304,7 @@ void Sram_OpenSave(FileSelectState* fileSelect, SramContext* sramCtx) { gSaveContext.cycleSceneFlags[i].collectible = gSaveContext.save.saveInfo.permanentSceneFlags[i].collectible; } - if (gSaveContext.save.saveInfo.unk_F41) { + if (gSaveContext.save.saveInfo.scarecrowSpawnSongSet) { Lib_MemCpy(gScarecrowSpawnSongPtr, gSaveContext.save.saveInfo.scarecrowSpawnSong, sizeof(gSaveContext.save.saveInfo.scarecrowSpawnSong)); @@ -1649,7 +1649,7 @@ void func_801457CC(GameState* gameState, SramContext* sramCtx) { } else { if (phi_s2) { gSaveContext.options.optionId = 0xA51D; - gSaveContext.options.language = 1; + gSaveContext.options.language = LANGUAGE_ENG; gSaveContext.options.audioSetting = SAVE_AUDIO_STEREO; gSaveContext.options.languageSetting = 0; gSaveContext.options.zTargetSetting = 0; @@ -1657,7 +1657,7 @@ void func_801457CC(GameState* gameState, SramContext* sramCtx) { Lib_MemCpy(&gSaveContext.options, sramCtx->saveBuf, sizeof(SaveOptions)); if (gSaveContext.options.optionId != 0xA51D) { gSaveContext.options.optionId = 0xA51D; - gSaveContext.options.language = 1; + gSaveContext.options.language = LANGUAGE_ENG; gSaveContext.options.audioSetting = SAVE_AUDIO_STEREO; gSaveContext.options.languageSetting = 0; gSaveContext.options.zTargetSetting = 0; @@ -1671,7 +1671,7 @@ void func_801457CC(GameState* gameState, SramContext* sramCtx) { gSaveContext.flashSaveAvailable = D_801F6AF2; } - gSaveContext.options.language = 1; + gSaveContext.options.language = LANGUAGE_ENG; } #else #pragma GLOBAL_ASM("asm/non_matchings/code/z_sram_NES/func_801457CC.s") @@ -1853,8 +1853,7 @@ void Sram_InitSave(FileSelectState* fileSelect2, SramContext* sramCtx) { */ void Sram_WriteSaveOptionsToBuffer(SramContext* sramCtx) { if (gSaveContext.flashSaveAvailable) { - // TODO: macros for languages - gSaveContext.options.language = 1; + gSaveContext.options.language = LANGUAGE_ENG; Lib_MemCpy(sramCtx->saveBuf, &gSaveContext.options, sizeof(SaveOptions)); } } diff --git a/src/overlays/actors/ovl_Arrow_Fire/z_arrow_fire.c b/src/overlays/actors/ovl_Arrow_Fire/z_arrow_fire.c index 1d8ca14b0..83edc9548 100644 --- a/src/overlays/actors/ovl_Arrow_Fire/z_arrow_fire.c +++ b/src/overlays/actors/ovl_Arrow_Fire/z_arrow_fire.c @@ -204,7 +204,7 @@ void FireArrow_Fly(ArrowFire* this, PlayState* play) { void ArrowFire_Update(Actor* thisx, PlayState* play) { ArrowFire* this = (ArrowFire*)thisx; - if ((play->msgCtx.msgMode == 0xE) || (play->msgCtx.msgMode == 0x12)) { + if ((play->msgCtx.msgMode == MSGMODE_E) || (play->msgCtx.msgMode == MSGMODE_SONG_PLAYED)) { Actor_Kill(&this->actor); return; } diff --git a/src/overlays/actors/ovl_Arrow_Ice/z_arrow_ice.c b/src/overlays/actors/ovl_Arrow_Ice/z_arrow_ice.c index b3df6c265..8a908a0e3 100644 --- a/src/overlays/actors/ovl_Arrow_Ice/z_arrow_ice.c +++ b/src/overlays/actors/ovl_Arrow_Ice/z_arrow_ice.c @@ -176,7 +176,7 @@ void ArrowIce_Fly(ArrowIce* this, PlayState* play) { void ArrowIce_Update(Actor* thisx, PlayState* play) { ArrowIce* this = THIS; - if ((play->msgCtx.msgMode == 0xE) || (play->msgCtx.msgMode == 0x12)) { + if ((play->msgCtx.msgMode == MSGMODE_E) || (play->msgCtx.msgMode == MSGMODE_SONG_PLAYED)) { Actor_Kill(&this->actor); return; } else { diff --git a/src/overlays/actors/ovl_Arrow_Light/z_arrow_light.c b/src/overlays/actors/ovl_Arrow_Light/z_arrow_light.c index 8b4f8cad9..902443a95 100644 --- a/src/overlays/actors/ovl_Arrow_Light/z_arrow_light.c +++ b/src/overlays/actors/ovl_Arrow_Light/z_arrow_light.c @@ -172,7 +172,7 @@ void ArrowLight_Fly(ArrowLight* this, PlayState* play) { void ArrowLight_Update(Actor* thisx, PlayState* play) { ArrowLight* this = THIS; - if ((play->msgCtx.msgMode == 0xE) || (play->msgCtx.msgMode == 0x12)) { + if ((play->msgCtx.msgMode == MSGMODE_E) || (play->msgCtx.msgMode == MSGMODE_SONG_PLAYED)) { Actor_Kill(&this->actor); return; } diff --git a/src/overlays/actors/ovl_Dm_Char01/z_dm_char01.c b/src/overlays/actors/ovl_Dm_Char01/z_dm_char01.c index 764b00224..d224694ec 100644 --- a/src/overlays/actors/ovl_Dm_Char01/z_dm_char01.c +++ b/src/overlays/actors/ovl_Dm_Char01/z_dm_char01.c @@ -176,7 +176,7 @@ void func_80AA8698(DmChar01* this, PlayState* play) { D_80AAAAB4 = false; } - if ((player->transformation == PLAYER_FORM_DEKU) && (play->msgCtx.ocarinaMode == 3) && + if ((player->transformation == PLAYER_FORM_DEKU) && (play->msgCtx.ocarinaMode == OCARINA_MODE_EVENT) && (play->msgCtx.lastPlayedSong == OCARINA_SONG_SONATA)) { if ((player2->actor.world.pos.x > -40.0f) && (player2->actor.world.pos.x < 40.0f) && diff --git a/src/overlays/actors/ovl_Dm_Char08/z_dm_char08.c b/src/overlays/actors/ovl_Dm_Char08/z_dm_char08.c index 0948b7afc..250abea20 100644 --- a/src/overlays/actors/ovl_Dm_Char08/z_dm_char08.c +++ b/src/overlays/actors/ovl_Dm_Char08/z_dm_char08.c @@ -266,7 +266,7 @@ void DmChar08_WaitForSong(DmChar08* this, PlayState* play) { } else { sSuccessSoundAlreadyPlayed = false; } - if ((player->transformation == PLAYER_FORM_ZORA) && (play->msgCtx.ocarinaMode == 3) && + if ((player->transformation == PLAYER_FORM_ZORA) && (play->msgCtx.ocarinaMode == OCARINA_MODE_EVENT) && (play->msgCtx.lastPlayedSong == OCARINA_SONG_NEW_WAVE)) { if ((player2->actor.world.pos.x > -5780.0f) && (player2->actor.world.pos.x < -5385.0f)) { if ((player2->actor.world.pos.z > 1120.0f) && (player2->actor.world.pos.z < 2100.0f)) { diff --git a/src/overlays/actors/ovl_Dm_Stk/z_dm_stk.c b/src/overlays/actors/ovl_Dm_Stk/z_dm_stk.c index 9b1d0f048..fb45200bc 100644 --- a/src/overlays/actors/ovl_Dm_Stk/z_dm_stk.c +++ b/src/overlays/actors/ovl_Dm_Stk/z_dm_stk.c @@ -1867,7 +1867,7 @@ void DmStk_Update(Actor* thisx, PlayState* play) { // This code is responsible for making in-game time pass while using the telescope in the Astral Observatory. // Skull Kid is always loaded in the scene, even if he isn't visible, hence why time always passes. - if ((play->actorCtx.flags & ACTORCTX_FLAG_1) && (play->msgCtx.msgMode != 0) && + if ((play->actorCtx.flags & ACTORCTX_FLAG_1) && (play->msgCtx.msgMode != MSGMODE_NONE) && (play->msgCtx.currentTextId == 0x5E6) && !FrameAdvance_IsEnabled(&play->state) && (play->transitionTrigger == TRANS_TRIGGER_OFF) && (CutsceneManager_GetCurrentCsId() == CS_ID_NONE) && (play->csCtx.state == CS_STATE_IDLE)) { diff --git a/src/overlays/actors/ovl_En_Akindonuts/z_en_akindonuts.c b/src/overlays/actors/ovl_En_Akindonuts/z_en_akindonuts.c index 0d6ee9380..c7bfb6234 100644 --- a/src/overlays/actors/ovl_En_Akindonuts/z_en_akindonuts.c +++ b/src/overlays/actors/ovl_En_Akindonuts/z_en_akindonuts.c @@ -457,7 +457,7 @@ void func_80BED3BC(EnAkindonuts* this, PlayState* play) { Audio_PlaySfx_MessageDecide(); this->unk_32C &= ~0x1; this->unk_32C |= 0x40; - play->msgCtx.msgMode = 0x43; + play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; this->unk_33C = 0x15EF; this->actionFunc = func_80BEF360; @@ -546,7 +546,7 @@ void func_80BED680(EnAkindonuts* this, PlayState* play) { Audio_PlaySfx_MessageDecide(); this->unk_32C |= 0x40; this->unk_32C &= ~0x1; - play->msgCtx.msgMode = 0x43; + play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; this->unk_33C = 0x15EF; this->actionFunc = func_80BEF360; @@ -650,7 +650,7 @@ void func_80BED8A4(EnAkindonuts* this, PlayState* play) { Audio_PlaySfx_MessageDecide(); this->unk_32C |= 0x40; this->unk_32C &= ~0x1; - play->msgCtx.msgMode = 0x43; + play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; this->unk_33C = 0x15EF; this->actionFunc = func_80BEF360; @@ -739,7 +739,7 @@ void func_80BEDB88(EnAkindonuts* this, PlayState* play) { Audio_PlaySfx_MessageDecide(); this->unk_32C |= 0x40; this->unk_32C &= ~0x1; - play->msgCtx.msgMode = 0x43; + play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; this->unk_33C = 0x15EF; this->actionFunc = func_80BEF360; @@ -838,7 +838,7 @@ void func_80BEDDAC(EnAkindonuts* this, PlayState* play) { Audio_PlaySfx_MessageDecide(); this->unk_32C |= 0x40; this->unk_32C &= ~0x1; - play->msgCtx.msgMode = 0x43; + play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; this->unk_33C = 0x15EF; this->actionFunc = func_80BEF360; @@ -922,7 +922,7 @@ void func_80BEE070(EnAkindonuts* this, PlayState* play) { Audio_PlaySfx_MessageDecide(); this->unk_32C |= 0x40; this->unk_32C &= ~0x1; - play->msgCtx.msgMode = 0x43; + play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; this->unk_33C = 0x161A; this->actionFunc = func_80BEF360; @@ -1011,7 +1011,7 @@ void func_80BEE274(EnAkindonuts* this, PlayState* play) { Audio_PlaySfx_MessageDecide(); this->unk_32C |= 0x40; this->unk_32C &= ~0x1; - play->msgCtx.msgMode = 0x43; + play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; this->unk_33C = 0x1629; this->actionFunc = func_80BEF360; @@ -1095,7 +1095,7 @@ void func_80BEE530(EnAkindonuts* this, PlayState* play) { Audio_PlaySfx_MessageDecide(); this->unk_32C |= 0x40; this->unk_32C &= ~0x1; - play->msgCtx.msgMode = 0x43; + play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; this->unk_33C = 0x15EF; this->actionFunc = func_80BEF360; @@ -1335,7 +1335,7 @@ void func_80BEEFA8(EnAkindonuts* this, PlayState* play) { if (Message_ShouldAdvance(play)) { if (this->unk_32C & 1) { this->unk_32C &= ~0x1; - play->msgCtx.msgMode = 0x43; + play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; this->unk_33C = 0; this->actionFunc = func_80BEEE10; @@ -1343,7 +1343,7 @@ void func_80BEEFA8(EnAkindonuts* this, PlayState* play) { this->unk_32C &= ~0x20; this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; this->unk_32C &= ~0x4; - play->msgCtx.msgMode = 0x43; + play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; this->animIndex = ENAKINDONUTS_ANIM_8; this->unk_33C = 0; @@ -1378,7 +1378,7 @@ void func_80BEEFA8(EnAkindonuts* this, PlayState* play) { void func_80BEF18C(EnAkindonuts* this, PlayState* play) { if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) { - play->msgCtx.msgMode = 0x43; + play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; this->unk_33C = 0; this->actionFunc = func_80BEEE10; @@ -1405,7 +1405,7 @@ void func_80BEF20C(EnAkindonuts* this, PlayState* play) { if ((talkState == TEXT_STATE_5) && Message_ShouldAdvance(play)) { if (this->unk_32C & 1) { this->unk_32C &= ~0x1; - play->msgCtx.msgMode = 0x43; + play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; this->actionFunc = func_80BEF360; } else { diff --git a/src/overlays/actors/ovl_En_Aob_01/z_en_aob_01.c b/src/overlays/actors/ovl_En_Aob_01/z_en_aob_01.c index eab1c83ce..eea47caa5 100644 --- a/src/overlays/actors/ovl_En_Aob_01/z_en_aob_01.c +++ b/src/overlays/actors/ovl_En_Aob_01/z_en_aob_01.c @@ -449,7 +449,7 @@ void EnAob01_BeforeRace_HandleConversation(EnAob01* this, PlayState* play) { this->stateFlags &= ~ENAOB01_FLAG_PLAYER_CONFIRMED_CHOICE; Rupees_ChangeBy(-this->rupeesBet); func_800B7298(play, NULL, PLAYER_CSMODE_WAIT); - play->msgCtx.msgMode = 0x43; + play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; this->actionFunc = EnAob01_BeforeRace_StartRace; return; @@ -518,7 +518,7 @@ void EnAob01_BeforeRace_RespondToPlayAgainQuestion(EnAob01* this, PlayState* pla } } } else if ((talkState == TEXT_STATE_5) && Message_ShouldAdvance(play)) { - play->msgCtx.msgMode = 0x43; + play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; this->textId = 0; this->actionFunc = EnAob01_BeforeRace_Idle; @@ -672,7 +672,7 @@ void EnAob01_BeforeRace_Talk(EnAob01* this, PlayState* play) { this->stateFlags &= ~ENAOB01_FLAG_LAUGH; if (this->stateFlags & ENAOB01_FLAG_CONVERSATION_OVER) { this->stateFlags &= ~ENAOB01_FLAG_CONVERSATION_OVER; - play->msgCtx.msgMode = 0x43; + play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; this->actionFunc = EnAob01_BeforeRace_Idle; } else { @@ -898,7 +898,7 @@ void EnAob01_AfterRace_GiveReward(EnAob01* this, PlayState* play) { if (EnAob01_ProcessIdleAnim(this)) { if ((talkState == TEXT_STATE_5) && Message_ShouldAdvance(play)) { this->rupeesBet = 0; - play->msgCtx.msgMode = 0x43; + play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; } diff --git a/src/overlays/actors/ovl_En_Az/z_en_az.c b/src/overlays/actors/ovl_En_Az/z_en_az.c index 8b98808e1..17c9dbc50 100644 --- a/src/overlays/actors/ovl_En_Az/z_en_az.c +++ b/src/overlays/actors/ovl_En_Az/z_en_az.c @@ -707,7 +707,7 @@ s32 func_80A9617C(EnAz* this, PlayState* play) { if (SubS_StartCutscene(&brother->actor, brother->csIdList[0], CS_ID_GLOBAL_TALK, SUBS_CUTSCENE_NORMAL)) { brother->unk_374 |= 0x8000; - play->msgCtx.msgMode = 0x44; + play->msgCtx.msgMode = MSGMODE_PAUSED; ret = 0; } } else if (Message_ShouldAdvance(play)) { @@ -832,7 +832,7 @@ s32 func_80A9617C(EnAz* this, PlayState* play) { case 0x10DB: if (play->msgCtx.choiceIndex == 0) { Audio_PlaySfx_MessageDecide(); - play->msgCtx.msgMode = 0x44; + play->msgCtx.msgMode = MSGMODE_PAUSED; this->unk_2FA = 1; ret = 0; } else { @@ -945,7 +945,7 @@ s32 func_80A9617C(EnAz* this, PlayState* play) { case 0x10EB: if (play->msgCtx.choiceIndex == 0) { - play->msgCtx.msgMode = 0x44; + play->msgCtx.msgMode = MSGMODE_PAUSED; Audio_PlaySfx_MessageDecide(); switch (this->unk_2FA) { case 4: @@ -1497,7 +1497,7 @@ void func_80A97A28(EnAz* this, PlayState* play) { void func_80A97A40(EnAz* this, PlayState* play) { if (SubS_StartCutscene(&this->actor, 0, CS_ID_NONE, SUBS_CUTSCENE_WITH_PLAYER)) { - play->msgCtx.msgMode = 0; + play->msgCtx.msgMode = MSGMODE_NONE; play->msgCtx.msgLength = 0; func_80A97A9C(this, play); } @@ -1525,7 +1525,7 @@ void func_80A97AB4(EnAz* this, PlayState* play) { case 0x10D8: if (play->msgCtx.choiceIndex == 0) { Audio_PlaySfx_MessageDecide(); - play->msgCtx.msgMode = 0x44; + play->msgCtx.msgMode = MSGMODE_PAUSED; func_800FD750(NA_BGM_TIMED_MINI_GAME); func_80A94AB8(this, play, 1); func_80A979DC(this, play); diff --git a/src/overlays/actors/ovl_En_Baba/z_en_baba.c b/src/overlays/actors/ovl_En_Baba/z_en_baba.c index bf93ad365..43cbd2969 100644 --- a/src/overlays/actors/ovl_En_Baba/z_en_baba.c +++ b/src/overlays/actors/ovl_En_Baba/z_en_baba.c @@ -596,7 +596,7 @@ void EnBaba_FollowSchedule_Talk(EnBaba* this, PlayState* play) { u8 talkState = Message_GetState(&play->msgCtx); if (((talkState == TEXT_STATE_5) || (talkState == TEXT_STATE_DONE)) && Message_ShouldAdvance(play)) { - play->msgCtx.msgMode = 0x43; + play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; this->actionFunc = EnBaba_FollowSchedule; } @@ -610,7 +610,7 @@ void EnBaba_Talk(EnBaba* this, PlayState* play) { if (Message_ShouldAdvance(play)) { if (this->stateFlags & BOMB_SHOP_LADY_STATE_END_CONVERSATION) { this->stateFlags &= ~BOMB_SHOP_LADY_STATE_END_CONVERSATION; - play->msgCtx.msgMode = 0x43; + play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; if (this->stateFlags & BOMB_SHOP_LADY_STATE_AUTOTALK) { if (CHECK_QUEST_ITEM(QUEST_BOMBERS_NOTEBOOK)) { @@ -629,7 +629,7 @@ void EnBaba_Talk(EnBaba* this, PlayState* play) { } } else if (this->stateFlags & BOMB_SHOP_LADY_STATE_GIVE_BLAST_MASK) { this->stateFlags &= ~BOMB_SHOP_LADY_STATE_GIVE_BLAST_MASK; - play->msgCtx.msgMode = 0x43; + play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; this->actionFunc = EnBaba_GiveBlastMask; } else { diff --git a/src/overlays/actors/ovl_En_Bji_01/z_en_bji_01.c b/src/overlays/actors/ovl_En_Bji_01/z_en_bji_01.c index 81e94d78f..a9f290371 100644 --- a/src/overlays/actors/ovl_En_Bji_01/z_en_bji_01.c +++ b/src/overlays/actors/ovl_En_Bji_01/z_en_bji_01.c @@ -101,7 +101,7 @@ void func_809CCEE8(EnBji01* this, PlayState* play) { } } if (Actor_ProcessTalkRequest(&this->actor, &play->state)) { - play->msgCtx.msgMode = 0; + play->msgCtx.msgMode = MSGMODE_NONE; play->msgCtx.msgLength = 0; func_809CD028(this, play); } else { diff --git a/src/overlays/actors/ovl_En_Bom_Bowl_Man/z_en_bom_bowl_man.c b/src/overlays/actors/ovl_En_Bom_Bowl_Man/z_en_bom_bowl_man.c index 7e277f4cf..061081bc1 100644 --- a/src/overlays/actors/ovl_En_Bom_Bowl_Man/z_en_bom_bowl_man.c +++ b/src/overlays/actors/ovl_En_Bom_Bowl_Man/z_en_bom_bowl_man.c @@ -393,7 +393,7 @@ void func_809C51B4(EnBomBowlMan* this, PlayState* play) { Player* player = GET_PLAYER(play); if ((play->msgCtx.bombersNotebookEventQueueCount == 0) && - ((play->msgCtx.msgMode == 0) || (Message_GetState(&play->msgCtx) == TEXT_STATE_DONE))) { + ((play->msgCtx.msgMode == MSGMODE_NONE) || (Message_GetState(&play->msgCtx) == TEXT_STATE_DONE))) { play->nextEntrance = Entrance_CreateFromSpawn(6); gSaveContext.nextCutsceneIndex = 0; play->transitionTrigger = TRANS_TRIGGER_START; @@ -511,7 +511,7 @@ void func_809C5738(EnBomBowlMan* this, PlayState* play) { if (this->unk_2C2 == 0) { if ((play->msgCtx.bombersNotebookEventQueueCount == 0) && - ((play->msgCtx.msgMode == 0) || (Message_GetState(&play->msgCtx) == TEXT_STATE_DONE))) { + ((play->msgCtx.msgMode == MSGMODE_NONE) || (Message_GetState(&play->msgCtx) == TEXT_STATE_DONE))) { this->unk_2C2 = 1; func_809C4B6C(this); if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) { diff --git a/src/overlays/actors/ovl_En_Cow/z_en_cow.c b/src/overlays/actors/ovl_En_Cow/z_en_cow.c index f96e43cd5..5a234c05e 100644 --- a/src/overlays/actors/ovl_En_Cow/z_en_cow.c +++ b/src/overlays/actors/ovl_En_Cow/z_en_cow.c @@ -268,7 +268,7 @@ void EnCow_Talk(EnCow* this, PlayState* play) { } void EnCow_Idle(EnCow* this, PlayState* play) { - if ((play->msgCtx.ocarinaMode == 0) || (play->msgCtx.ocarinaMode == 4)) { + if ((play->msgCtx.ocarinaMode == OCARINA_MODE_NONE) || (play->msgCtx.ocarinaMode == OCARINA_MODE_END)) { if (gHorsePlayedEponasSong) { if (this->flags & EN_COW_FLAG_WONT_GIVE_MILK) { this->flags &= ~EN_COW_FLAG_WONT_GIVE_MILK; diff --git a/src/overlays/actors/ovl_En_Dai/z_en_dai.c b/src/overlays/actors/ovl_En_Dai/z_en_dai.c index 6a936636c..d9147aa26 100644 --- a/src/overlays/actors/ovl_En_Dai/z_en_dai.c +++ b/src/overlays/actors/ovl_En_Dai/z_en_dai.c @@ -429,7 +429,7 @@ void func_80B3EE8C(EnDai* this, PlayState* play) { void func_80B3EEDC(EnDai* this, PlayState* play) { Player* player = GET_PLAYER(play); - if ((player->transformation == PLAYER_FORM_GORON) && (play->msgCtx.ocarinaMode == 3) && + if ((player->transformation == PLAYER_FORM_GORON) && (play->msgCtx.ocarinaMode == OCARINA_MODE_EVENT) && (play->msgCtx.lastPlayedSong == OCARINA_SONG_GORON_LULLABY)) { EnDai_ChangeAnim(this, ENDAI_ANIM_1); this->actionFunc = func_80B3EE8C; diff --git a/src/overlays/actors/ovl_En_Dno/z_en_dno.c b/src/overlays/actors/ovl_En_Dno/z_en_dno.c index 500259dc6..d32f2f3f4 100644 --- a/src/overlays/actors/ovl_En_Dno/z_en_dno.c +++ b/src/overlays/actors/ovl_En_Dno/z_en_dno.c @@ -372,7 +372,7 @@ void func_80A71C3C(EnDno* this, PlayState* play) { } if (Actor_ProcessTalkRequest(&this->actor, &play->state)) { - play->msgCtx.msgMode = 0; + play->msgCtx.msgMode = MSGMODE_NONE; play->msgCtx.msgLength = 0; func_80A71E54(this, play); } else if (this->actor.xzDistToPlayer < 60.0f) { @@ -482,7 +482,7 @@ void func_80A71F18(EnDno* this, PlayState* play) { if (Message_ShouldAdvance(play)) { SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationSpeedInfo, EN_DNO_ANIM_IMPLORE_END, &this->animIndex); - play->msgCtx.msgMode = 0x44; + play->msgCtx.msgMode = MSGMODE_PAUSED; } break; @@ -688,7 +688,7 @@ void func_80A725F8(EnDno* this, PlayState* play) { case 0x800: case 0x801: if (Message_ShouldAdvance(play)) { - play->msgCtx.msgMode = 0x44; + play->msgCtx.msgMode = MSGMODE_PAUSED; this->unk_452 = 1; this->unk_454 = 0.0f; SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationSpeedInfo, EN_DNO_ANIM_OPEN_PARASOL, diff --git a/src/overlays/actors/ovl_En_Fishing/z_en_fishing.c b/src/overlays/actors/ovl_En_Fishing/z_en_fishing.c index 08f97aa93..b2a9b75d8 100644 --- a/src/overlays/actors/ovl_En_Fishing/z_en_fishing.c +++ b/src/overlays/actors/ovl_En_Fishing/z_en_fishing.c @@ -5605,7 +5605,7 @@ void EnFishing_UpdateOwner(Actor* thisx, PlayState* play2) { Audio_PlaySfx_AtPos(&sStreamSoundProjectedPos, NA_SE_EV_WATER_WALL - SFX_FLAG); - if (gSaveContext.options.language == 0) { // Added in MM + if (gSaveContext.options.language == LANGUAGE_JPN) { // Added in MM gSaveContext.minigameScore = D_8090CCF8; } else { gSaveContext.minigameScore = (SQ((f32)D_8090CCF8) * 0.0036f) + 0.5f; diff --git a/src/overlays/actors/ovl_En_Fsn/z_en_fsn.c b/src/overlays/actors/ovl_En_Fsn/z_en_fsn.c index 917624a64..ec8c09b71 100644 --- a/src/overlays/actors/ovl_En_Fsn/z_en_fsn.c +++ b/src/overlays/actors/ovl_En_Fsn/z_en_fsn.c @@ -410,7 +410,7 @@ void EnFsn_EndInteraction(EnFsn* this, PlayState* play) { this->cutsceneState = ENFSN_CUTSCENESTATE_STOPPED; } Actor_ProcessTalkRequest(&this->actor, &play->state); - play->msgCtx.msgMode = 0x43; + play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; Interface_SetHudVisibility(HUD_VISIBILITY_ALL); this->drawCursor = 0; @@ -995,7 +995,7 @@ void EnFsn_MakeOffer(EnFsn* this, PlayState* play) { switch (play->msgCtx.choiceIndex) { case 0: Audio_PlaySfx_MessageDecide(); - play->msgCtx.msgMode = 0x43; + play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; if (this->cutsceneState == ENFSN_CUTSCENESTATE_PLAYING) { CutsceneManager_Stop(this->csId); @@ -1204,7 +1204,7 @@ void EnFsn_HandleCanPlayerBuyItem(EnFsn* this, PlayState* play) { item = this->items[this->cursorIndex]; item->buyFanfareFunc(play, item); Actor_OfferGetItem(&this->actor, play, this->items[this->cursorIndex]->getItemId, 300.0f, 300.0f); - play->msgCtx.msgMode = 0x43; + play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; Interface_SetHudVisibility(HUD_VISIBILITY_ALL); this->drawCursor = 0; @@ -1246,7 +1246,7 @@ void EnFsn_SetupEndInteraction(EnFsn* this, PlayState* play) { if (play->msgCtx.bombersNotebookEventQueueCount == 0) { EnFsn_EndInteraction(this, play); } else { - play->msgCtx.msgMode = 0x43; + play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; } } else { @@ -1327,7 +1327,7 @@ void EnFsn_AskCanBuyMore(EnFsn* this, PlayState* play) { if (play->msgCtx.bombersNotebookEventQueueCount == 0) { EnFsn_EndInteraction(this, play); } else { - play->msgCtx.msgMode = 0x43; + play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; } } else { @@ -1378,7 +1378,7 @@ void EnFsn_AskCanBuyAterRunningOutOfItems(EnFsn* this, PlayState* play) { if (play->msgCtx.bombersNotebookEventQueueCount == 0) { EnFsn_EndInteraction(this, play); } else { - play->msgCtx.msgMode = 0x43; + play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; } } else { @@ -1433,12 +1433,12 @@ void EnFsn_ConverseBackroom(EnFsn* this, PlayState* play) { if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) { if (this->flags & ENFSN_END_CONVERSATION) { this->flags &= ~ENFSN_END_CONVERSATION; - play->msgCtx.msgMode = 0x43; + play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; this->actionFunc = EnFsn_IdleBackroom; } else if (this->flags & ENFSN_GIVE_ITEM) { this->flags &= ~ENFSN_GIVE_ITEM; - play->msgCtx.msgMode = 0x43; + play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; this->actionFunc = EnFsn_GiveItem; } else { diff --git a/src/overlays/actors/ovl_En_Gb2/z_en_gb2.c b/src/overlays/actors/ovl_En_Gb2/z_en_gb2.c index 36e18e350..b9ef1fe88 100644 --- a/src/overlays/actors/ovl_En_Gb2/z_en_gb2.c +++ b/src/overlays/actors/ovl_En_Gb2/z_en_gb2.c @@ -379,8 +379,8 @@ void func_80B0FE7C(PlayState* play) { } void func_80B0FEBC(EnGb2* this, PlayState* play) { - if ((play->msgCtx.ocarinaMode == 3) && (play->msgCtx.lastPlayedSong == OCARINA_SONG_HEALING)) { - play->msgCtx.ocarinaMode = 4; + if ((play->msgCtx.ocarinaMode == OCARINA_MODE_EVENT) && (play->msgCtx.lastPlayedSong == OCARINA_SONG_HEALING)) { + play->msgCtx.ocarinaMode = OCARINA_MODE_END; SET_EVENTINF(EVENTINF_47); this->unk_26E = 0x14D1; this->unk_288 = 10; @@ -400,7 +400,7 @@ void func_80B0FFA8(EnGb2* this, PlayState* play) { if (talkState == TEXT_STATE_5) { if (Message_ShouldAdvance(play)) { if (this->unk_26C & 2) { - play->msgCtx.msgMode = 0x43; + play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; this->unk_26E = 0x14D1; this->unk_288 = 30; @@ -443,7 +443,7 @@ void func_80B0FFA8(EnGb2* this, PlayState* play) { case 0: Audio_PlaySfx_MessageDecide(); Rupees_ChangeBy(-this->unk_288); - play->msgCtx.msgMode = 0x43; + play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; func_800B7298(play, NULL, PLAYER_CSMODE_WAIT); this->actionFunc = func_80B11344; @@ -568,7 +568,7 @@ void func_80B10634(EnGb2* this, PlayState* play) { if (talkState == TEXT_STATE_5) { if (Message_ShouldAdvance(play)) { if (this->unk_26C & 2) { - play->msgCtx.msgMode = 0x43; + play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; this->unk_26C &= ~2; if (this->unk_26E == 0x14DD) { @@ -598,7 +598,7 @@ void func_80B10634(EnGb2* this, PlayState* play) { } else { Audio_PlaySfx_MessageDecide(); Rupees_ChangeBy(-this->unk_288); - play->msgCtx.msgMode = 0x43; + play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; func_800B7298(play, NULL, PLAYER_CSMODE_WAIT); this->actionFunc = func_80B11344; @@ -771,7 +771,7 @@ void func_80B10E98(EnGb2* this, PlayState* play) { if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) { if (this->unk_26C & 2) { this->unk_26C &= ~2; - play->msgCtx.msgMode = 0x43; + play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; if ((this->unk_26E != 0x14E8) && (this->unk_26E != 0x14EA)) { CutsceneManager_Stop(this->csIdList[this->csIdIndex]); @@ -814,7 +814,7 @@ void func_80B11048(EnGb2* this, PlayState* play) { void func_80B110F8(EnGb2* this, PlayState* play) { if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) { if (this->unk_26C & 2) { - play->msgCtx.msgMode = 0x43; + play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; this->unk_26C &= ~2; this->actionFunc = func_80B10A48; diff --git a/src/overlays/actors/ovl_En_Geg/z_en_geg.c b/src/overlays/actors/ovl_En_Geg/z_en_geg.c index 9183856ab..727b2ff2a 100644 --- a/src/overlays/actors/ovl_En_Geg/z_en_geg.c +++ b/src/overlays/actors/ovl_En_Geg/z_en_geg.c @@ -598,7 +598,7 @@ void func_80BB26EC(EnGeg* this, PlayState* play) { case 0xD61: CutsceneManager_Stop(this->csId); - play->msgCtx.msgMode = 0x43; + play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; this->unk_230 &= ~0x10; this->actionFunc = func_80BB221C; @@ -617,14 +617,14 @@ void func_80BB27D4(EnGeg* this, PlayState* play) { if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) { switch (this->unk_496) { case 0xD63: - play->msgCtx.msgMode = 0x43; + play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; this->actionFunc = func_80BB221C; break; case 0xD69: this->nextCsId = this->csIdList[6]; - play->msgCtx.msgMode = 0x43; + play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; this->actionFunc = func_80BB2520; break; @@ -632,7 +632,7 @@ void func_80BB27D4(EnGeg* this, PlayState* play) { case 0xD6D: case 0xD6F: case 0xD8A: - play->msgCtx.msgMode = 0x43; + play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; this->actionFunc = func_80BB31B8; break; @@ -640,7 +640,7 @@ void func_80BB27D4(EnGeg* this, PlayState* play) { case 0xD72: case 0xD75: case 0xD8B: - play->msgCtx.msgMode = 0x43; + play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; this->unk_230 &= ~0x10; this->nextCsId = this->csIdList[7]; @@ -667,7 +667,7 @@ void func_80BB2944(EnGeg* this, PlayState* play) { } } else if ((talkState == TEXT_STATE_5) && Message_ShouldAdvance(play)) { if (this->unk_496 == 0xD67) { - play->msgCtx.msgMode = 0x43; + play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; this->nextCsId = this->csIdList[4]; this->actionFunc = func_80BB2520; @@ -684,7 +684,7 @@ void func_80BB2A54(EnGeg* this, PlayState* play) { CutsceneManager_Stop(this->csId); this->unk_230 &= ~0x10; this->unk_244 = 65; - play->msgCtx.msgMode = 0x43; + play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; this->actionFunc = func_80BB347C; } else { diff --git a/src/overlays/actors/ovl_En_Gg/z_en_gg.c b/src/overlays/actors/ovl_En_Gg/z_en_gg.c index 1d59139a4..5a0f0f3f2 100644 --- a/src/overlays/actors/ovl_En_Gg/z_en_gg.c +++ b/src/overlays/actors/ovl_En_Gg/z_en_gg.c @@ -278,7 +278,7 @@ void func_80B35450(EnGg* this, PlayState* play) { void func_80B3556C(EnGg* this, PlayState* play) { if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) { if (this->animIndex == ENGG_ANIM_4) { - play->msgCtx.msgMode = 0x43; + play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; this->unk_308 = 0; this->actor.flags &= ~ACTOR_FLAG_REACT_TO_LENS; @@ -429,7 +429,7 @@ void func_80B359DC(EnGg* this, PlayState* play) { this->unk_306 = 0; } - if ((player->transformation == PLAYER_FORM_HUMAN) && (play->msgCtx.ocarinaMode == 3) && + if ((player->transformation == PLAYER_FORM_HUMAN) && (play->msgCtx.ocarinaMode == OCARINA_MODE_EVENT) && (play->msgCtx.lastPlayedSong == OCARINA_SONG_HEALING)) { if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_19_80)) { SET_WEEKEVENTREG(WEEKEVENTREG_19_80); diff --git a/src/overlays/actors/ovl_En_Gg2/z_en_gg2.c b/src/overlays/actors/ovl_En_Gg2/z_en_gg2.c index e106c8f88..3b6d62775 100644 --- a/src/overlays/actors/ovl_En_Gg2/z_en_gg2.c +++ b/src/overlays/actors/ovl_En_Gg2/z_en_gg2.c @@ -201,7 +201,7 @@ void func_80B3B05C(EnGg2* this, PlayState* play) { void func_80B3B0A0(EnGg2* this, PlayState* play) { if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) { - play->msgCtx.msgMode = 0x43; + play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; this->unk_2F0 = 0; this->actionFunc = func_80B3B5D4; diff --git a/src/overlays/actors/ovl_En_Ginko_Man/z_en_ginko_man.c b/src/overlays/actors/ovl_En_Ginko_Man/z_en_ginko_man.c index 566f35ba0..2a5e6712a 100644 --- a/src/overlays/actors/ovl_En_Ginko_Man/z_en_ginko_man.c +++ b/src/overlays/actors/ovl_En_Ginko_Man/z_en_ginko_man.c @@ -223,7 +223,7 @@ void EnGinkoMan_DepositDialogue(EnGinkoMan* this, PlayState* play) { break; case 0x464: - play->msgCtx.msgMode = 0x44; + play->msgCtx.msgMode = MSGMODE_PAUSED; EnGinkoMan_SetupStamp(this); // stamp player break; diff --git a/src/overlays/actors/ovl_En_Gk/z_en_gk.c b/src/overlays/actors/ovl_En_Gk/z_en_gk.c index ad5bc484f..900664e4c 100644 --- a/src/overlays/actors/ovl_En_Gk/z_en_gk.c +++ b/src/overlays/actors/ovl_En_Gk/z_en_gk.c @@ -294,7 +294,7 @@ s32 func_80B50854(EnGk* this, PlayState* play) { this->unk_1E4 &= ~0x40; } - if ((player->transformation == PLAYER_FORM_GORON) && (play->msgCtx.ocarinaMode == 3) && + if ((player->transformation == PLAYER_FORM_GORON) && (play->msgCtx.ocarinaMode == OCARINA_MODE_EVENT) && (play->msgCtx.lastPlayedSong == OCARINA_SONG_GORON_LULLABY)) { Flags_SetSwitch(play, ENGK_GET_3F00(&this->actor)); this->animIndex = ENGK_ANIM_3; @@ -545,7 +545,7 @@ void func_80B51410(EnGk* this, PlayState* play) { Player* player = GET_PLAYER(play); if (this->actor.xzDistToPlayer < 100.0f) { - if ((player->transformation == PLAYER_FORM_GORON) && (play->msgCtx.ocarinaMode == 3) && + if ((player->transformation == PLAYER_FORM_GORON) && (play->msgCtx.ocarinaMode == OCARINA_MODE_EVENT) && (play->msgCtx.lastPlayedSong == OCARINA_SONG_GORON_LULLABY_INTRO)) { this->unk_1E4 |= 0x20; } @@ -906,7 +906,7 @@ void func_80B5202C(EnGk* this, PlayState* play) { } if (this->unk_1E4 & 2) { - if ((play->msgCtx.ocarinaMode != 1) && (play->msgCtx.ocarinaMode != 3) && + if ((play->msgCtx.ocarinaMode != OCARINA_MODE_ACTIVE) && (play->msgCtx.ocarinaMode != OCARINA_MODE_EVENT) && (play->csCtx.state == CS_STATE_IDLE)) { Audio_PlaySfx_AtFixedPos(&this->actor.projectedPos, NA_SE_EN_GOLON_KID_CRY - SFX_FLAG); } @@ -918,7 +918,7 @@ void func_80B5202C(EnGk* this, PlayState* play) { void func_80B5216C(EnGk* this, PlayState* play) { if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) { - play->msgCtx.msgMode = 0x43; + play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; this->actionFunc = func_80B51698; } diff --git a/src/overlays/actors/ovl_En_Go/z_en_go.c b/src/overlays/actors/ovl_En_Go/z_en_go.c index f5678eedd..0aecc3233 100644 --- a/src/overlays/actors/ovl_En_Go/z_en_go.c +++ b/src/overlays/actors/ovl_En_Go/z_en_go.c @@ -748,7 +748,7 @@ s32 EnGo_IsFallingAsleep(EnGo* this, PlayState* play) { Player* player = GET_PLAYER(play); s32 isFallingAsleep = false; - if (((player->transformation == PLAYER_FORM_GORON) && (play->msgCtx.ocarinaMode == 3) && + if (((player->transformation == PLAYER_FORM_GORON) && (play->msgCtx.ocarinaMode == OCARINA_MODE_EVENT) && (play->msgCtx.lastPlayedSong == OCARINA_SONG_GORON_LULLABY) && (this->sleepState == ENGO_AWAKE) && (this->actor.xzDistToPlayer < 400.0f)) || (!CHECK_WEEKEVENTREG(WEEKEVENTREG_CALMED_GORON_ELDERS_SON) && (play->sceneId == SCENE_16GORON_HOUSE) && diff --git a/src/overlays/actors/ovl_En_Gs/z_en_gs.c b/src/overlays/actors/ovl_En_Gs/z_en_gs.c index 55bd83106..6cc8af5a5 100644 --- a/src/overlays/actors/ovl_En_Gs/z_en_gs.c +++ b/src/overlays/actors/ovl_En_Gs/z_en_gs.c @@ -277,13 +277,13 @@ void func_80997FF0(EnGs* this, PlayState* play) { } void func_80998040(EnGs* this, PlayState* play) { - func_80152434(play, 1); + Message_DisplayOcarinaStaff(play, OCARINA_ACTION_FREE_PLAY); this->actionFunc = func_8099807C; } void func_8099807C(EnGs* this, PlayState* play) { switch (play->msgCtx.ocarinaMode) { - case 3: + case OCARINA_MODE_EVENT: switch (play->msgCtx.lastPlayedSong) { case OCARINA_SONG_HEALING: case OCARINA_SONG_EPONAS: @@ -341,11 +341,11 @@ void func_8099807C(EnGs* this, PlayState* play) { } break; - case 0: - case 4: + case OCARINA_MODE_NONE: + case OCARINA_MODE_END: func_80998300(this, play); - case 26: + case OCARINA_MODE_APPLY_DOUBLE_SOT: func_80997D14(this, play); break; @@ -1030,7 +1030,7 @@ void EnGs_Update(Actor* thisx, PlayState* play) { EnGs* this = THIS; if (Actor_ProcessTalkRequest(&this->actor, &play->state)) { - play->msgCtx.msgMode = 0; + play->msgCtx.msgMode = MSGMODE_NONE; play->msgCtx.msgLength = 0; this->collider.base.acFlags &= ~AC_HIT; func_80997DEC(this, play); diff --git a/src/overlays/actors/ovl_En_Hg/z_en_hg.c b/src/overlays/actors/ovl_En_Hg/z_en_hg.c index ded070de4..648b63b6b 100644 --- a/src/overlays/actors/ovl_En_Hg/z_en_hg.c +++ b/src/overlays/actors/ovl_En_Hg/z_en_hg.c @@ -398,7 +398,7 @@ void EnHg_WaitForPlayerAction(EnHg* this, PlayState* play) { sHasSoundPlayed = false; } - if (play->msgCtx.ocarinaMode == 3) { + if (play->msgCtx.ocarinaMode == OCARINA_MODE_EVENT) { if ((play->msgCtx.lastPlayedSong == OCARINA_SONG_HEALING) && (GET_PLAYER_FORM == PLAYER_FORM_HUMAN)) { if (INV_CONTENT(ITEM_MASK_GIBDO) == ITEM_MASK_GIBDO) { this->csIdIndex = HG_CS_SONG_OF_HEALING; diff --git a/src/overlays/actors/ovl_En_Hidden_Nuts/z_en_hidden_nuts.c b/src/overlays/actors/ovl_En_Hidden_Nuts/z_en_hidden_nuts.c index 5d1e0ee24..b10793a56 100644 --- a/src/overlays/actors/ovl_En_Hidden_Nuts/z_en_hidden_nuts.c +++ b/src/overlays/actors/ovl_En_Hidden_Nuts/z_en_hidden_nuts.c @@ -210,8 +210,8 @@ void func_80BDB2B8(EnHiddenNuts* this, PlayState* play) { } if (!(this->actor.xzDistToPlayer > 120.0f)) { - if ((play->msgCtx.ocarinaMode == 3) && (play->msgCtx.lastPlayedSong == OCARINA_SONG_SONATA)) { - play->msgCtx.ocarinaMode = 4; + if ((play->msgCtx.ocarinaMode == OCARINA_MODE_EVENT) && (play->msgCtx.lastPlayedSong == OCARINA_SONG_SONATA)) { + play->msgCtx.ocarinaMode = OCARINA_MODE_END; func_80BDB788(this); } else if (func_801A5100() == 2) { func_80BDB788(this); diff --git a/src/overlays/actors/ovl_En_Hint_Skb/z_en_hint_skb.c b/src/overlays/actors/ovl_En_Hint_Skb/z_en_hint_skb.c index f9e51b55c..b0ea746d9 100644 --- a/src/overlays/actors/ovl_En_Hint_Skb/z_en_hint_skb.c +++ b/src/overlays/actors/ovl_En_Hint_Skb/z_en_hint_skb.c @@ -417,7 +417,7 @@ void func_80C2077C(EnHintSkb* this, PlayState* play) { Message_StartTextbox(play, 0x1147, &this->actor); this->unk_3E6 = 0x1147; if (this->skelAnime.animation == &object_skb_Anim_00697C) { - play->msgCtx.msgMode = 0x44; + play->msgCtx.msgMode = MSGMODE_PAUSED; this->actor.speed = 2.4f; this->actor.gravity = -1.0f; this->actor.velocity.y = 3.0f; diff --git a/src/overlays/actors/ovl_En_Jg/z_en_jg.c b/src/overlays/actors/ovl_En_Jg/z_en_jg.c index 137799af3..4573bdcf5 100644 --- a/src/overlays/actors/ovl_En_Jg/z_en_jg.c +++ b/src/overlays/actors/ovl_En_Jg/z_en_jg.c @@ -365,7 +365,7 @@ void EnJg_GoronShrineTalk(EnJg* this, PlayState* play) { if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) { if ((this->textId == 0xDCC) || (this->textId == 0xDDD) || (this->textId == 0xDE0)) { // There is nothing more to say after these lines, so end the current conversation. - play->msgCtx.msgMode = 0x43; + play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; this->flags &= ~FLAG_LOOKING_AT_PLAYER; this->actionFunc = EnJg_GoronShrineIdle; @@ -430,7 +430,7 @@ void EnJg_AlternateTalkOrWalkInPlace(EnJg* this, PlayState* play) { } } else if (this->animIndex == EN_JG_ANIM_SURPRISE_LOOP) { if ((talkState == TEXT_STATE_5) && Message_ShouldAdvance(play)) { - play->msgCtx.msgMode = 0x43; + play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; this->flags &= ~FLAG_LOOKING_AT_PLAYER; this->animIndex = EN_JG_ANIM_WALK; @@ -488,7 +488,7 @@ void EnJg_Talk(EnJg* this, PlayState* play) { temp = this->textId; if ((temp == 0xDB4) || (temp == 0xDB5) || (temp == 0xDC4) || (temp == 0xDC6)) { // There is nothing more to say after these lines, so end the current conversation. - play->msgCtx.msgMode = 0x43; + play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; this->flags &= ~FLAG_LOOKING_AT_PLAYER; this->actionFunc = EnJg_SetupWalk; @@ -500,7 +500,7 @@ void EnJg_Talk(EnJg* this, PlayState* play) { if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_24_80)) { // The player hasn't talked to the Goron Child at least once, so they can't learn // the Lullaby Intro. End the current conversation with the player. - play->msgCtx.msgMode = 0x43; + play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; this->flags &= ~FLAG_LOOKING_AT_PLAYER; this->actionFunc = EnJg_SetupWalk; @@ -514,7 +514,7 @@ void EnJg_Talk(EnJg* this, PlayState* play) { // To get to this point, the player *has* talked to the Goron Child, but doesn't // already have the Lullaby or Lullaby Intro. End the current conversation and // start the cutscene that teaches the Lullaby Intro. - play->msgCtx.msgMode = 0x43; + play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; this->flags &= ~FLAG_LOOKING_AT_PLAYER; this->csId = EnJg_GetCsIdForTeachingLullabyIntro(this); @@ -605,7 +605,7 @@ void EnJg_FrozenIdle(EnJg* this, PlayState* play) { void EnJg_EndFrozenInteraction(EnJg* this, PlayState* play) { if ((Message_GetState(&play->msgCtx) == TEXT_STATE_DONE) && Message_ShouldAdvance(play)) { - play->msgCtx.msgMode = 0x43; + play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; this->actionFunc = EnJg_FrozenIdle; } diff --git a/src/overlays/actors/ovl_En_Kakasi/z_en_kakasi.c b/src/overlays/actors/ovl_En_Kakasi/z_en_kakasi.c index d2c877ad3..a3d0e4608 100644 --- a/src/overlays/actors/ovl_En_Kakasi/z_en_kakasi.c +++ b/src/overlays/actors/ovl_En_Kakasi/z_en_kakasi.c @@ -575,7 +575,7 @@ void EnKakasi_SetupSongTeach(EnKakasi* this, PlayState* play) { */ void EnKakasi_OcarinaRemark(EnKakasi* this, PlayState* play) { if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) { - func_80152434(play, 0x35); + Message_DisplayOcarinaStaff(play, OCARINA_ACTION_SCARECROW_SPAWN_RECORDING); this->unkState1A8 = 0; if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) { CutsceneManager_Stop(CS_ID_GLOBAL_TALK); @@ -632,7 +632,7 @@ void EnKakasi_TeachingSong(EnKakasi* this, PlayState* play) { func_8096FAAC(this, play); func_8096FBB8(this, play); - if (play->msgCtx.ocarinaMode == 4) { // song failed + if (play->msgCtx.ocarinaMode == OCARINA_MODE_END) { // song failed this->unk190 = 0; this->unkCounter1A4 = 0; CutsceneManager_Stop(this->csIdList[0]); @@ -645,7 +645,7 @@ void EnKakasi_TeachingSong(EnKakasi* this, PlayState* play) { EnKakasi_ChangeAnim(this, ENKAKASI_ANIM_ARMS_CROSSED_ROCKING); this->actionFunc = EnKakasi_RegularDialogue; - } else if (play->msgCtx.ocarinaMode == 3) { // song success + } else if (play->msgCtx.ocarinaMode == OCARINA_MODE_EVENT) { // song success this->postTeachTimer = 30; this->skelAnime.playSpeed = 2.0f; EnKakasi_ChangeAnim(this, ENKAKASI_ANIM_HOPPING_REGULAR); @@ -668,7 +668,7 @@ void EnKakasi_PostSongLearnTwirl(EnKakasi* this, PlayState* play) { void EnKakasi_SetupPostSongLearnDialogue(EnKakasi* this, PlayState* play) { CutsceneManager_Stop(this->csIdList[0]); - play->msgCtx.ocarinaMode = 4; + play->msgCtx.ocarinaMode = OCARINA_MODE_END; this->unk190 = 0; this->unkCounter1A4 = 0; EnKakasi_ChangeAnim(this, ENKAKASI_ANIM_HOPPING_REGULAR); @@ -1054,9 +1054,9 @@ void EnKakasi_SetupIdleUnderground(EnKakasi* this) { void EnKakasi_IdleUnderground(EnKakasi* this, PlayState* play) { if (CHECK_WEEKEVENTREG(WEEKEVENTREG_79_08) && (this->picto.actor.xzDistToPlayer < this->songSummonDist) && - ((BREG(1) != 0) || (play->msgCtx.ocarinaMode == 0xD))) { + ((BREG(1) != 0) || (play->msgCtx.ocarinaMode == OCARINA_MODE_PLAYED_SCARECROW_SPAWN))) { this->picto.actor.flags &= ~ACTOR_FLAG_CANT_LOCK_ON; - play->msgCtx.ocarinaMode = 4; + play->msgCtx.ocarinaMode = OCARINA_MODE_END; this->actionFunc = EnKakasi_SetupRiseOutOfGround; } } diff --git a/src/overlays/actors/ovl_En_Kanban/z_en_kanban.c b/src/overlays/actors/ovl_En_Kanban/z_en_kanban.c index 8e5aa5802..4a95c525d 100644 --- a/src/overlays/actors/ovl_En_Kanban/z_en_kanban.c +++ b/src/overlays/actors/ovl_En_Kanban/z_en_kanban.c @@ -824,13 +824,14 @@ void EnKanban_Update(Actor* thisx, PlayState* play) { switch (this->ocarinaFlag) { case 0: - if (play->msgCtx.ocarinaMode == 1) { + if (play->msgCtx.ocarinaMode == OCARINA_MODE_ACTIVE) { this->ocarinaFlag = 1; } break; case 1: - if ((play->msgCtx.ocarinaMode == 4) && (play->msgCtx.lastPlayedSong == OCARINA_SONG_HEALING)) { + if ((play->msgCtx.ocarinaMode == OCARINA_MODE_END) && + (play->msgCtx.lastPlayedSong == OCARINA_SONG_HEALING)) { this->actionState = ENKANBAN_REPAIR; this->bounceX = 1; Audio_PlaySfx(NA_SE_SY_TRE_BOX_APPEAR); diff --git a/src/overlays/actors/ovl_En_Mk/z_en_mk.c b/src/overlays/actors/ovl_En_Mk/z_en_mk.c index 43f9a3d99..0c9f545f1 100644 --- a/src/overlays/actors/ovl_En_Mk/z_en_mk.c +++ b/src/overlays/actors/ovl_En_Mk/z_en_mk.c @@ -412,7 +412,7 @@ void func_80959E18(EnMk* this, PlayState* play) { } if (func_800B8718(&this->actor, &play->state)) { - play->msgCtx.ocarinaMode = 4; + play->msgCtx.ocarinaMode = OCARINA_MODE_END; this->actionFunc = func_80959D28; if (GET_PLAYER_FORM == PLAYER_FORM_ZORA) { this->actor.csId = this->csIdList[0]; diff --git a/src/overlays/actors/ovl_En_Mnk/z_en_mnk.c b/src/overlays/actors/ovl_En_Mnk/z_en_mnk.c index 8113526f2..bf6c611f6 100644 --- a/src/overlays/actors/ovl_En_Mnk/z_en_mnk.c +++ b/src/overlays/actors/ovl_En_Mnk/z_en_mnk.c @@ -1318,7 +1318,7 @@ void EnMnk_MonkeyTiedUp_ReactToWrongInstrument(EnMnk* this, PlayState* play) { case 0x8DB: Message_CloseTextbox(play); this->actionFunc = EnMnk_MonkeyTiedUp_WaitForInstrument; - play->msgCtx.ocarinaMode = 4; + play->msgCtx.ocarinaMode = OCARINA_MODE_END; EnMnk_MonkeyTiedUp_SetAnim(this, MONKEY_TIEDUP_ANIM_WAIT); if (this->csId != CS_ID_NONE) { CutsceneManager_Stop(this->csId); @@ -1489,7 +1489,7 @@ void EnMnk_MonkeyTiedUp_WaitForInstrument(EnMnk* this, PlayState* play) { this->csId = 2; SET_EVENTINF(EVENTINF_24); this->picto.actor.csId = this->csIdList[2]; - play->msgCtx.ocarinaMode = 4; + play->msgCtx.ocarinaMode = OCARINA_MODE_END; CutsceneManager_Queue(this->csIdList[2]); return; @@ -1577,7 +1577,7 @@ void EnMnk_MonkeyTiedUp_Wait(EnMnk* this, PlayState* play) { this->csId = 2; SET_EVENTINF(EVENTINF_24); this->picto.actor.csId = this->csIdList[2]; - play->msgCtx.ocarinaMode = 4; + play->msgCtx.ocarinaMode = OCARINA_MODE_END; CutsceneManager_Queue(this->csIdList[2]); } else if (Actor_ProcessTalkRequest(&this->picto.actor, &play->state)) { if (gSaveContext.save.playerForm == PLAYER_FORM_DEKU) { diff --git a/src/overlays/actors/ovl_En_Okarina_Tag/z_en_okarina_tag.c b/src/overlays/actors/ovl_En_Okarina_Tag/z_en_okarina_tag.c index c65ca03ba..b07a5d58c 100644 --- a/src/overlays/actors/ovl_En_Okarina_Tag/z_en_okarina_tag.c +++ b/src/overlays/actors/ovl_En_Okarina_Tag/z_en_okarina_tag.c @@ -81,7 +81,7 @@ void func_8093E518(EnOkarinaTag* this, PlayState* play) { var_v1 = this->unk14A; if (var_v1 == 6) { var_v1 = 0xA; - if (gSaveContext.save.saveInfo.unk_F41 == 0) { + if (!gSaveContext.save.saveInfo.scarecrowSpawnSongSet) { return; } } @@ -89,7 +89,7 @@ void func_8093E518(EnOkarinaTag* this, PlayState* play) { var_v1 = 0; } if (func_800B8718(&this->actor, &play->state)) { - func_80152434(play, var_v1 + 0x29); + Message_DisplayOcarinaStaff(play, OCARINA_ACTION_CHECK_HEALING + var_v1); this->actionFunc = func_8093E68C; } else { yDiff = ABS_ALT((s16)(this->actor.yawTowardsPlayer - this->actor.world.rot.y)); @@ -111,14 +111,17 @@ void func_8093E518(EnOkarinaTag* this, PlayState* play) { } void func_8093E68C(EnOkarinaTag* this, PlayState* play) { - if (play->msgCtx.ocarinaMode == 4) { + if (play->msgCtx.ocarinaMode == OCARINA_MODE_END) { this->actionFunc = func_8093E518; } else { - if ((play->msgCtx.ocarinaMode == 3) || - ((this->unk14A == -1) && - ((play->msgCtx.ocarinaMode == 5) || (play->msgCtx.ocarinaMode == 6) || (play->msgCtx.ocarinaMode == 7) || - (play->msgCtx.ocarinaMode == 8) || (play->msgCtx.ocarinaMode == 0xA) || (play->msgCtx.ocarinaMode == 9) || - (play->msgCtx.ocarinaMode == 0xF)))) { + if ((play->msgCtx.ocarinaMode == OCARINA_MODE_EVENT) || + ((this->unk14A == -1) && ((play->msgCtx.ocarinaMode == OCARINA_MODE_PLAYED_TIME) || + (play->msgCtx.ocarinaMode == OCARINA_MODE_PLAYED_HEALING) || + (play->msgCtx.ocarinaMode == OCARINA_MODE_PLAYED_EPONAS) || + (play->msgCtx.ocarinaMode == OCARINA_MODE_PLAYED_SOARING) || + (play->msgCtx.ocarinaMode == OCARINA_MODE_PLAYED_SUNS) || + (play->msgCtx.ocarinaMode == OCARINA_MODE_PLAYED_STORMS) || + (play->msgCtx.ocarinaMode == OCARINA_MODE_F)))) { if (this->switchFlags >= 0) { switch (this->unk148) { case 0: @@ -136,7 +139,7 @@ void func_8093E68C(EnOkarinaTag* this, PlayState* play) { break; } } - play->msgCtx.ocarinaMode = 4; + play->msgCtx.ocarinaMode = OCARINA_MODE_END; Audio_PlaySfx(NA_SE_SY_CORRECT_CHIME); this->actionFunc = func_8093E518; } diff --git a/src/overlays/actors/ovl_En_Onpuman/z_en_onpuman.c b/src/overlays/actors/ovl_En_Onpuman/z_en_onpuman.c index 4bac34933..4e666ed5c 100644 --- a/src/overlays/actors/ovl_En_Onpuman/z_en_onpuman.c +++ b/src/overlays/actors/ovl_En_Onpuman/z_en_onpuman.c @@ -84,14 +84,14 @@ Actor* func_80B11F44(PlayState* play) { } void func_80B11F78(EnOnpuman* this, PlayState* play) { - if (play->msgCtx.ocarinaMode == 4) { + if (play->msgCtx.ocarinaMode == OCARINA_MODE_END) { this->actionFunc = func_80B121D8; if (this->actor.csId != CS_ID_NONE) { CutsceneManager_Stop(this->actor.csId); } - } else if (play->msgCtx.ocarinaMode == 3) { + } else if (play->msgCtx.ocarinaMode == OCARINA_MODE_EVENT) { Audio_PlaySfx(NA_SE_SY_CORRECT_CHIME); - play->msgCtx.ocarinaMode = 4; + play->msgCtx.ocarinaMode = OCARINA_MODE_END; if (this->actor.csId != CS_ID_NONE) { CutsceneManager_Stop(this->actor.csId); } @@ -118,7 +118,7 @@ void func_80B1202C(EnOnpuman* this, PlayState* play2) { case 0x8D6: this->actionFunc = func_80B11F78; - func_80152434(play, 0x3A); + Message_DisplayOcarinaStaff(play, OCARINA_ACTION_3A); if (this->unk_2A0 != NULL) { this->unk_2A0->home.rot.x = 0; } 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 9046f613a..eb0936ef9 100644 --- a/src/overlays/actors/ovl_En_Osn/z_en_osn.c +++ b/src/overlays/actors/ovl_En_Osn/z_en_osn.c @@ -888,7 +888,7 @@ void EnOsn_Talk(EnOsn* this, PlayState* play) { if (((talkState == TEXT_STATE_DONE) || (talkState == TEXT_STATE_5)) && Message_ShouldAdvance(play)) { if (this->stateFlags & OSN_STATE_END_CONVERSATION) { this->stateFlags &= ~OSN_STATE_END_CONVERSATION; - play->msgCtx.msgMode = 0x43; + play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; this->actionFunc = EnOsn_Idle; } else { diff --git a/src/overlays/actors/ovl_En_Ossan/z_en_ossan.c b/src/overlays/actors/ovl_En_Ossan/z_en_ossan.c index fe7333cf7..096b8ff38 100644 --- a/src/overlays/actors/ovl_En_Ossan/z_en_ossan.c +++ b/src/overlays/actors/ovl_En_Ossan/z_en_ossan.c @@ -304,7 +304,7 @@ void EnOssan_EndInteraction(PlayState* play, EnOssan* this) { Player* player = GET_PLAYER(play); Actor_ProcessTalkRequest(&this->actor, &play->state); - play->msgCtx.msgMode = 0x43; + play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; Interface_SetHudVisibility(HUD_VISIBILITY_ALL); this->drawCursor = 0; @@ -994,7 +994,7 @@ void EnOssan_SetupBuyItemWithFanfare(PlayState* play, EnOssan* this) { Player* player = GET_PLAYER(play); Actor_OfferGetItem(&this->actor, play, this->items[this->cursorIndex]->getItemId, 300.0f, 300.0f); - play->msgCtx.msgMode = 0x43; + play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; player->stateFlags2 &= ~PLAYER_STATE2_20000000; Interface_SetHudVisibility(HUD_VISIBILITY_ALL); @@ -1124,7 +1124,7 @@ void EnOssan_BuyItemWithFanfare(EnOssan* this, PlayState* play) { void EnOssan_SetupItemPurchased(EnOssan* this, PlayState* play) { if ((Message_GetState(&play->msgCtx) == TEXT_STATE_DONE) && Message_ShouldAdvance(play)) { - play->msgCtx.msgMode = 0x43; + play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; EnOssan_SetupAction(this, EnOssan_ItemPurchased); if (this->cutsceneState == ENOSSAN_CUTSCENESTATE_STOPPED) { diff --git a/src/overlays/actors/ovl_En_Ruppecrow/z_en_ruppecrow.c b/src/overlays/actors/ovl_En_Ruppecrow/z_en_ruppecrow.c index f22a78ec2..27f95af01 100644 --- a/src/overlays/actors/ovl_En_Ruppecrow/z_en_ruppecrow.c +++ b/src/overlays/actors/ovl_En_Ruppecrow/z_en_ruppecrow.c @@ -368,7 +368,7 @@ void EnRuppecrow_UpdatePosition(EnRuppecrow* this, PlayState* play) { s32 EnRuppecrow_CheckPlayedMatchingSong(PlayState* play) { Player* player = GET_PLAYER(play); - if (play->msgCtx.ocarinaMode == 0x3) { + if (play->msgCtx.ocarinaMode == OCARINA_MODE_EVENT) { switch (player->transformation) { case PLAYER_FORM_DEKU: if (play->msgCtx.lastPlayedSong == OCARINA_SONG_SONATA) { diff --git a/src/overlays/actors/ovl_En_S_Goro/z_en_s_goro.c b/src/overlays/actors/ovl_En_S_Goro/z_en_s_goro.c index 3e3ecc621..a89ec608e 100644 --- a/src/overlays/actors/ovl_En_S_Goro/z_en_s_goro.c +++ b/src/overlays/actors/ovl_En_S_Goro/z_en_s_goro.c @@ -811,7 +811,7 @@ s32 EnSGoro_CheckLullaby(EnSGoro* this, PlayState* play) { s32 actorType; Player* player = GET_PLAYER(play); - if ((player->transformation == PLAYER_FORM_GORON) && (play->msgCtx.ocarinaMode == 3)) { + if ((player->transformation == PLAYER_FORM_GORON) && (play->msgCtx.ocarinaMode == OCARINA_MODE_EVENT)) { if (play->msgCtx.lastPlayedSong == OCARINA_SONG_GORON_LULLABY) { this->animInfoIndex = EN_S_GORO_ANIM_ROLLUP; SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, this->animInfoIndex); @@ -1157,7 +1157,7 @@ void EnSGoro_SpringShrineGoron_Talk(EnSGoro* this, PlayState* play) { if (this->actionFlags & EN_S_GORO_ACTIONFLAG_LASTMESSAGE) { this->actionFlags &= ~EN_S_GORO_ACTIONFLAG_LASTMESSAGE; this->actionFlags &= ~EN_S_GORO_ACTIONFLAG_ENGAGED; - play->msgCtx.msgMode = 0x43; + play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; this->actionFunc = EnSGoro_SpringShrineGoron_Idle; return; @@ -1243,7 +1243,7 @@ void EnSGoro_ShopGoron_Talk(EnSGoro* this, PlayState* play) { this->textId = EnSGoro_BombshopGoron_NextTextId(this, play); if ((this->textId == 0x675) || (this->textId == 0x676)) { - play->msgCtx.msgMode = 0x43; + play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; Actor_OfferGetItem(&this->actor, play, GI_POWDER_KEG, 300.0f, 300.0f); this->actionFunc = EnSGoro_ShopGoron_TakePayment; @@ -1288,7 +1288,7 @@ void EnSGoro_Sleep(EnSGoro* this, PlayState* play) { void EnSGoro_SleepTalk(EnSGoro* this, PlayState* play) { if (Message_GetState(&play->msgCtx) == TEXT_STATE_DONE) { if (Message_ShouldAdvance(play)) { - play->msgCtx.msgMode = 0x43; + play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; this->actionFunc = EnSGoro_Sleep; } diff --git a/src/overlays/actors/ovl_En_Scopenuts/z_en_scopenuts.c b/src/overlays/actors/ovl_En_Scopenuts/z_en_scopenuts.c index c8bc7d660..a280a94c6 100644 --- a/src/overlays/actors/ovl_En_Scopenuts/z_en_scopenuts.c +++ b/src/overlays/actors/ovl_En_Scopenuts/z_en_scopenuts.c @@ -318,7 +318,7 @@ void func_80BCB6D0(EnScopenuts* this, PlayState* play) { if (Message_ShouldAdvance(play)) { if (this->unk_328 & 1) { this->unk_328 &= ~1; - play->msgCtx.msgMode = 0x43; + play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; this->unk_328 &= ~4; @@ -341,7 +341,7 @@ void func_80BCB6D0(EnScopenuts* this, PlayState* play) { Message_StartTextbox(play, this->unk_33C, &this->actor); } else { Audio_PlaySfx_MessageDecide(); - play->msgCtx.msgMode = 0x43; + play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; Rupees_ChangeBy(-this->unk_358); this->actionFunc = func_80BCB90C; diff --git a/src/overlays/actors/ovl_En_Sellnuts/z_en_sellnuts.c b/src/overlays/actors/ovl_En_Sellnuts/z_en_sellnuts.c index fbd757bd5..597c2c392 100644 --- a/src/overlays/actors/ovl_En_Sellnuts/z_en_sellnuts.c +++ b/src/overlays/actors/ovl_En_Sellnuts/z_en_sellnuts.c @@ -470,7 +470,7 @@ void func_80ADBAB8(EnSellnuts* this, PlayState* play) { } if ((talkState == TEXT_STATE_5) && Message_ShouldAdvance(play)) { - play->msgCtx.msgMode = 0x43; + play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; this->actionFunc = func_80ADBBEC; func_800B7298(play, NULL, PLAYER_CSMODE_19); @@ -516,7 +516,7 @@ void func_80ADBD64(EnSellnuts* this, PlayState* play) { } if ((talkState == TEXT_STATE_5) && Message_ShouldAdvance(play)) { - play->msgCtx.msgMode = 0x43; + play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; this->unk_338 &= ~2; this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; @@ -558,7 +558,7 @@ void func_80ADBE80(EnSellnuts* this, PlayState* play) { void func_80ADBFA0(EnSellnuts* this, PlayState* play) { if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) { - play->msgCtx.msgMode = 0x43; + play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; if (this->unk_34C == 0) { this->actionFunc = func_80ADB544; @@ -721,7 +721,7 @@ void func_80ADC6D0(EnSellnuts* this, PlayState* play) { Player* player = GET_PLAYER(play); if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) { - play->msgCtx.msgMode = 0x43; + play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; if (player->transformation == PLAYER_FORM_DEKU) { if (gSaveContext.save.day == 3) { @@ -751,7 +751,7 @@ void func_80ADC7B4(EnSellnuts* this, PlayState* play) { CutsceneManager_Queue(this->csId); } } else if ((this->unk_366 == 1) && (talkState == TEXT_STATE_5) && Message_ShouldAdvance(play)) { - play->msgCtx.msgMode = 0x43; + play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; this->unk_366 = 0; CutsceneManager_Stop(this->csId); diff --git a/src/overlays/actors/ovl_En_Sob1/z_en_sob1.c b/src/overlays/actors/ovl_En_Sob1/z_en_sob1.c index 90a625c88..e5ab7dbad 100644 --- a/src/overlays/actors/ovl_En_Sob1/z_en_sob1.c +++ b/src/overlays/actors/ovl_En_Sob1/z_en_sob1.c @@ -466,7 +466,7 @@ void EnSob1_EndInteraction(PlayState* play, EnSob1* this) { this->cutsceneState = ENSOB1_CUTSCENESTATE_STOPPED; } Actor_ProcessTalkRequest(&this->actor, &play->state); - play->msgCtx.msgMode = 0x43; + play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; Interface_SetHudVisibility(HUD_VISIBILITY_ALL); this->drawCursor = 0; @@ -957,7 +957,7 @@ void EnSob1_SetupBuyItemWithFanfare(PlayState* play, EnSob1* this) { Player* player = GET_PLAYER(play); Actor_OfferGetItem(&this->actor, play, this->items[this->cursorIndex]->getItemId, 300.0f, 300.0f); - play->msgCtx.msgMode = 0x43; + play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; player->stateFlags2 &= ~PLAYER_STATE2_20000000; Interface_SetHudVisibility(HUD_VISIBILITY_ALL); @@ -1110,7 +1110,7 @@ void EnSob1_BuyItemWithFanfare(EnSob1* this, PlayState* play) { void EnSob1_SetupItemPurchased(EnSob1* this, PlayState* play) { if ((Message_GetState(&play->msgCtx) == TEXT_STATE_DONE) && Message_ShouldAdvance(play)) { - play->msgCtx.msgMode = 0x43; + play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; EnSob1_SetupAction(this, EnSob1_ItemPurchased); if (this->cutsceneState == ENSOB1_CUTSCENESTATE_STOPPED) { diff --git a/src/overlays/actors/ovl_En_Suttari/z_en_suttari.c b/src/overlays/actors/ovl_En_Suttari/z_en_suttari.c index 29f53ae7c..bc0099298 100644 --- a/src/overlays/actors/ovl_En_Suttari/z_en_suttari.c +++ b/src/overlays/actors/ovl_En_Suttari/z_en_suttari.c @@ -1201,7 +1201,7 @@ void func_80BAD130(EnSuttari* this, PlayState* play) { u8 talkState = Message_GetState(&play->msgCtx); if (((talkState == TEXT_STATE_5) || (talkState == TEXT_STATE_DONE)) && Message_ShouldAdvance(play)) { - play->msgCtx.msgMode = 0x43; + play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; if (this->flags1 & 8) { this->actionFunc = func_80BAD004; @@ -1238,7 +1238,7 @@ void func_80BAD2B4(EnSuttari* this, PlayState* play) { this->actionFunc = func_80BAD230; } else { CutsceneManager_Stop(this->csIdList[1]); - play->msgCtx.msgMode = 0x43; + play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; this->flags1 |= 0x40; this->actionFunc = func_80BAD380; @@ -1262,7 +1262,7 @@ void func_80BAD380(EnSuttari* this, PlayState* play) { player->stateFlags1 &= ~PLAYER_STATE1_10000000; this->flags1 &= ~0x4000; CutsceneManager_Stop(this->csIdList[1]); - play->msgCtx.msgMode = 0x43; + play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; this->flags1 |= 0x40; } @@ -1403,7 +1403,7 @@ void func_80BADA9C(EnSuttari* this, PlayState* play) { ((EnElf*)GET_PLAYER(play)->tatlActor)->unk_264 |= 0x10; this->flags2 &= ~1; } - play->msgCtx.msgMode = 0x43; + play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; this->textId = 0; if (this->flags1 & 1) { diff --git a/src/overlays/actors/ovl_En_Syateki_Man/z_en_syateki_man.c b/src/overlays/actors/ovl_En_Syateki_Man/z_en_syateki_man.c index 52c6d42f9..28eeafc09 100644 --- a/src/overlays/actors/ovl_En_Syateki_Man/z_en_syateki_man.c +++ b/src/overlays/actors/ovl_En_Syateki_Man/z_en_syateki_man.c @@ -362,7 +362,7 @@ void EnSyatekiMan_Swamp_HandleChoice(EnSyatekiMan* this, PlayState* play) { Rupees_ChangeBy(-20); SET_WEEKEVENTREG(WEEKEVENTREG_KICKOUT_WAIT); CLEAR_WEEKEVENTREG(WEEKEVENTREG_KICKOUT_TIME_PASSED); - play->msgCtx.msgMode = 0x43; + play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; this->shootingGameState = SG_GAME_STATE_MOVING_PLAYER; player->stateFlags1 |= PLAYER_STATE1_20; @@ -415,7 +415,7 @@ void EnSyatekiMan_Swamp_HandleNormalMessage(EnSyatekiMan* this, PlayState* play) case 0xA2B: // The rules of the game are a piece of cake! case 0xA2C: // I keep saying - you have to aim with [Control Stick]! case 0xA35: // You almost had it! Well...just this once...here you go! - play->msgCtx.msgMode = 0x43; + play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; player->actor.freezeTimer = 0; Interface_InitMinigame(play); @@ -450,7 +450,7 @@ void EnSyatekiMan_Swamp_HandleNormalMessage(EnSyatekiMan* this, PlayState* play) break; case 0xA34: // Perfect! Take this! - play->msgCtx.msgMode = 0x43; + play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; player->actor.freezeTimer = 0; gSaveContext.minigameStatus = MINIGAME_STATUS_END; @@ -485,7 +485,7 @@ void EnSyatekiMan_Swamp_Talk(EnSyatekiMan* this, PlayState* play) { case TEXT_STATE_DONE: if (Message_ShouldAdvance(play)) { - play->msgCtx.msgMode = 0x43; + play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; player->stateFlags1 &= ~PLAYER_STATE1_20; CLEAR_WEEKEVENTREG(WEEKEVENTREG_KICKOUT_WAIT); @@ -764,7 +764,7 @@ void EnSyatekiMan_Town_HandleNormalMessage(EnSyatekiMan* this, PlayState* play) this->prevTextId = 0x400; } } else { - play->msgCtx.msgMode = 0x43; + play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; player->actor.freezeTimer = 0; this->shootingGameState = SG_GAME_STATE_MOVING_PLAYER; @@ -777,7 +777,7 @@ void EnSyatekiMan_Town_HandleNormalMessage(EnSyatekiMan* this, PlayState* play) case 0x3FE: // Our highest score is [score]. If you break the record, you'll win a prize! case 0x400: // Our highest score is [score]. Good luck! - play->msgCtx.msgMode = 0x43; + play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; player->actor.freezeTimer = 0; this->flagsIndex = 0; @@ -827,7 +827,7 @@ void EnSyatekiMan_Town_HandleNormalMessage(EnSyatekiMan* this, PlayState* play) case 0x405: // No way! That was perfect! case 0x406: // That was perfect! case 0x407: // You got a new record! - play->msgCtx.msgMode = 0x43; + play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; player->actor.freezeTimer = 0; gSaveContext.minigameStatus = MINIGAME_STATUS_END; diff --git a/src/overlays/actors/ovl_En_Test3/z_en_test3.c b/src/overlays/actors/ovl_En_Test3/z_en_test3.c index e897ffefb..062f76230 100644 --- a/src/overlays/actors/ovl_En_Test3/z_en_test3.c +++ b/src/overlays/actors/ovl_En_Test3/z_en_test3.c @@ -359,7 +359,7 @@ s32 func_80A3EA30(EnTest3* this, PlayState* play) { if (this->unk_D78->unk_1 != 0) { CutsceneManager_Stop(CS_ID_GLOBAL_TALK); CutsceneManager_Queue(this->csId); - play->msgCtx.msgMode = 0x44; + play->msgCtx.msgMode = MSGMODE_PAUSED; } return false; } @@ -391,7 +391,7 @@ s32 func_80A3EB8C(EnTest3* this, PlayState* play) { if (hideoutObject != NULL) { this->player.lockOnActor = hideoutObject; } - play->msgCtx.msgMode = 0x44; + play->msgCtx.msgMode = MSGMODE_PAUSED; return 1; } return 0; diff --git a/src/overlays/actors/ovl_En_Test4/z_en_test4.c b/src/overlays/actors/ovl_En_Test4/z_en_test4.c index 3c1a5958d..e726408a5 100644 --- a/src/overlays/actors/ovl_En_Test4/z_en_test4.c +++ b/src/overlays/actors/ovl_En_Test4/z_en_test4.c @@ -48,12 +48,12 @@ static s16 sCurCsId; void func_80A41D70(EnTest4* this, PlayState* play) { if (this->csIdIndex != 0) { - func_80151A68(play, sNightMessages1[CURRENT_DAY - 1]); + Message_DisplaySceneTitleCard(play, sNightMessages1[CURRENT_DAY - 1]); } else if ((sCsIdList[this->csIdIndex] < 0) || (play->actorCtx.flags & ACTORCTX_FLAG_1)) { if (play->actorCtx.flags & ACTORCTX_FLAG_1) { Sram_IncrementDay(); gSaveContext.save.time = CLOCK_TIME(6, 0); - func_80151A68(play, sDayMessages1[CURRENT_DAY - 1]); + Message_DisplaySceneTitleCard(play, sDayMessages1[CURRENT_DAY - 1]); } else { this->csIdIndex = 0; this->unk_146 = gSaveContext.save.time += CLOCK_TIME_MINUTE; @@ -91,12 +91,12 @@ void func_80A41D70(EnTest4* this, PlayState* play) { void func_80A41FA4(EnTest4* this, PlayState* play) { if (this->csIdIndex != 0) { - func_80151A68(play, sNightMessages2[CURRENT_DAY - 1]); + Message_DisplaySceneTitleCard(play, sNightMessages2[CURRENT_DAY - 1]); } else if ((sCsIdList[this->csIdIndex] < 0) || (play->actorCtx.flags & ACTORCTX_FLAG_1)) { Sram_IncrementDay(); gSaveContext.save.time = CLOCK_TIME(6, 0); Interface_NewDay(play, CURRENT_DAY); - func_80151A68(play, sDayMessages2[CURRENT_DAY - 1]); + Message_DisplaySceneTitleCard(play, sDayMessages2[CURRENT_DAY - 1]); D_801BDBC8 = 0xFE; func_800FB758(play); func_800FEAF4(&play->envCtx); diff --git a/src/overlays/actors/ovl_En_Test6/z_en_test6.c b/src/overlays/actors/ovl_En_Test6/z_en_test6.c index 462e1e784..bee7c94e7 100644 --- a/src/overlays/actors/ovl_En_Test6/z_en_test6.c +++ b/src/overlays/actors/ovl_En_Test6/z_en_test6.c @@ -685,7 +685,7 @@ void EnTest6_InvertedSoTCutscene(EnTest6* this, PlayState* play) { if (DECR(this->timer) == 0) { EnTest6_StopInvertedSoTCutscene(this, play); - play->msgCtx.ocarinaMode = 4; + play->msgCtx.ocarinaMode = OCARINA_MODE_END; } } @@ -1091,7 +1091,7 @@ void EnTest6_SharedSoTCutscene(EnTest6* this, PlayState* play) { } else { gSaveContext.respawnFlag = 2; } - play->msgCtx.ocarinaMode = 4; + play->msgCtx.ocarinaMode = OCARINA_MODE_END; return; } } else { @@ -1168,7 +1168,7 @@ void EnTest6_SharedSoTCutscene(EnTest6* this, PlayState* play) { play->nextEntrance = gSaveContext.respawn[RESPAWN_MODE_RETURN].entrance; play->transitionType = TRANS_TYPE_FADE_BLACK; gSaveContext.respawnFlag = 2; - play->msgCtx.ocarinaMode = 4; + play->msgCtx.ocarinaMode = OCARINA_MODE_END; } return; } diff --git a/src/overlays/actors/ovl_En_Time_Tag/z_en_time_tag.c b/src/overlays/actors/ovl_En_Time_Tag/z_en_time_tag.c index ded290262..a76d9ed47 100644 --- a/src/overlays/actors/ovl_En_Time_Tag/z_en_time_tag.c +++ b/src/overlays/actors/ovl_En_Time_Tag/z_en_time_tag.c @@ -116,13 +116,13 @@ void EnTimeTag_RooftopOath_Cutscene(EnTimeTag* this, PlayState* play) { void EnTimeTag_RooftopOath_Wait(EnTimeTag* this, PlayState* play) { Actor* thisx = &this->actor; - if ((play->msgCtx.ocarinaMode == 3) && (play->msgCtx.lastPlayedSong == OCARINA_SONG_OATH)) { - if (thisx->csId != CS_ID_NONE) { + if ((play->msgCtx.ocarinaMode == OCARINA_MODE_EVENT) && (play->msgCtx.lastPlayedSong == OCARINA_SONG_OATH)) { + if (this->actor.csId != CS_ID_NONE) { this->actionFunc = EnTimeTag_RooftopOath_Cutscene; CutsceneManager_Queue(thisx->csId); gSaveContext.timerStates[TIMER_ID_MOON_CRASH] = TIMER_STATE_OFF; } - play->msgCtx.ocarinaMode = 4; + play->msgCtx.ocarinaMode = OCARINA_MODE_END; } } @@ -186,11 +186,11 @@ void EnTimeTag_Diary_AfterOcarina(EnTimeTag* this, PlayState* play) { } void EnTimeTag_Diary_TeachEvanSongSnippets(EnTimeTag* this, PlayState* play) { - if ((play->msgCtx.ocarinaStaff->state == 0) && (play->msgCtx.msgMode == 0x1B)) { + if ((play->msgCtx.ocarinaStaff->state == 0) && (play->msgCtx.msgMode == MSGMODE_SONG_DEMONSTRATION_DONE)) { TIMETAG_DIARY_TIMER(&this->actor) = 5; this->actionFunc = EnTimeTag_Diary_AfterOcarina; play->msgCtx.msgLength = 0; - play->msgCtx.msgMode = 0; + play->msgCtx.msgMode = MSGMODE_NONE; } } @@ -217,13 +217,13 @@ void EnTimeTag_Diary_Cutscene(EnTimeTag* this, PlayState* play) { break; case 0x122B: // Mikau diary part 1 - func_80152434(play, 0x3F); + Message_DisplayOcarinaStaff(play, OCARINA_ACTION_DEMONSTRATE_EVAN_PART1_SECOND_HALF); this->actionFunc = EnTimeTag_Diary_TeachEvanSongSnippets; TIMETAG_DIARY_SONG(&this->actor) = TIMETAG_DIARY_SONG_EVAN_PART1; break; case 0x122E: // Mikau diary part 3 - func_80152434(play, 0x40); + Message_DisplayOcarinaStaff(play, OCARINA_ACTION_DEMONSTRATE_EVAN_PART2_SECOND_HALF); this->actionFunc = EnTimeTag_Diary_TeachEvanSongSnippets; TIMETAG_DIARY_SONG(&this->actor) = TIMETAG_DIARY_SONG_EVAN_PART2; break; diff --git a/src/overlays/actors/ovl_En_Tk/z_en_tk.c b/src/overlays/actors/ovl_En_Tk/z_en_tk.c index 61540eec0..8afe73e5e 100644 --- a/src/overlays/actors/ovl_En_Tk/z_en_tk.c +++ b/src/overlays/actors/ovl_En_Tk/z_en_tk.c @@ -290,7 +290,7 @@ void func_80AECA3C(EnTk* this, PlayState* play) { void func_80AECA90(EnTk* this, PlayState* play) { if (Actor_ProcessTalkRequest(&this->actor, &play->state)) { - play->msgCtx.msgMode = 0; + play->msgCtx.msgMode = MSGMODE_NONE; play->msgCtx.msgLength = 0; func_80AEDE10(this, play); } else if (this->actor.xzDistToPlayer < 100.0f) { @@ -317,7 +317,7 @@ void func_80AECB6C(EnTk* this, PlayState* play) { this->actor.textId = 0; if (Actor_ProcessTalkRequest(&this->actor, &play->state)) { - play->msgCtx.msgMode = 0; + play->msgCtx.msgMode = MSGMODE_NONE; play->msgCtx.msgLength = 0; func_80AED4F8(this, play); return; @@ -691,7 +691,7 @@ void func_80AED940(EnTk* this, PlayState* play) { if (Actor_ProcessTalkRequest(&this->actor, &play->state)) { this->unk_2CA &= ~0x80; this->actor.flags &= ~ACTOR_FLAG_10000; - play->msgCtx.msgMode = 0; + play->msgCtx.msgMode = MSGMODE_NONE; play->msgCtx.msgLength = 0; func_80AEDE10(this, play); } else if (!(this->unk_2CA & 0x80)) { @@ -874,7 +874,7 @@ void func_80AEDF5C(EnTk* this, PlayState* play) { this->unk_2CA |= 2; if (play->msgCtx.choiceIndex == 0) { Audio_PlaySfx_MessageDecide(); - play->msgCtx.msgMode = 0x44; + play->msgCtx.msgMode = MSGMODE_PAUSED; func_80AEE2A8(this, play); } else { Audio_PlaySfx_MessageCancel(); diff --git a/src/overlays/actors/ovl_En_Toto/z_en_toto.c b/src/overlays/actors/ovl_En_Toto/z_en_toto.c index d167e51fd..ce02cd835 100644 --- a/src/overlays/actors/ovl_En_Toto/z_en_toto.c +++ b/src/overlays/actors/ovl_En_Toto/z_en_toto.c @@ -151,7 +151,12 @@ static Vec3s D_80BA510C[] = { { 0xFF64, 0x0016, 0xFE7E }, }; -static u16 D_80BA5120[] = { 67, 68, 69, 70 }; +static u16 sOcarinaActionWindFishPrompts[] = { + OCARINA_ACTION_PROMPT_WIND_FISH_HUMAN, + OCARINA_ACTION_PROMPT_WIND_FISH_GORON, + OCARINA_ACTION_PROMPT_WIND_FISH_ZORA, + OCARINA_ACTION_PROMPT_WIND_FISH_DEKU, +}; static u8 D_80BA5128[] = { 8, 4, 2, 1 }; @@ -542,12 +547,12 @@ s32 func_80BA4530(EnToto* this, PlayState* play) { s32 func_80BA46D8(EnToto* this, PlayState* play) { func_800B7298(play, NULL, PLAYER_CSMODE_68); - func_80152434(play, D_80BA5120[CUR_FORM]); + Message_DisplayOcarinaStaff(play, sOcarinaActionWindFishPrompts[CUR_FORM]); return 0; } s32 func_80BA4740(EnToto* this, PlayState* play) { - if (play->msgCtx.ocarinaMode == 4) { + if (play->msgCtx.ocarinaMode == OCARINA_MODE_END) { if (GET_PLAYER_FORM == PLAYER_FORM_HUMAN) { SET_WEEKEVENTREG(WEEKEVENTREG_56_10); } diff --git a/src/overlays/actors/ovl_En_Trt/z_en_trt.c b/src/overlays/actors/ovl_En_Trt/z_en_trt.c index 0eb54ed34..499a3a748 100644 --- a/src/overlays/actors/ovl_En_Trt/z_en_trt.c +++ b/src/overlays/actors/ovl_En_Trt/z_en_trt.c @@ -217,7 +217,7 @@ void EnTrt_EndInteraction(PlayState* play, EnTrt* this) { this->cutsceneState = ENTRT_CUTSCENESTATE_STOPPED; } Actor_ProcessTalkRequest(&this->actor, &play->state); - play->msgCtx.msgMode = 0x43; + play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; Interface_SetHudVisibility(HUD_VISIBILITY_ALL); this->drawCursor = 0; @@ -362,7 +362,7 @@ void EnTrt_GetMushroom(EnTrt* this, PlayState* play) { CutsceneManager_Stop(this->csId); this->cutsceneState = ENTRT_CUTSCENESTATE_STOPPED; } - play->msgCtx.msgMode = 0x43; + play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; this->actionFunc = EnTrt_PayForMushroom; break; @@ -412,7 +412,7 @@ void EnTrt_StartRedPotionConversation(EnTrt* this, PlayState* play) { CutsceneManager_Stop(this->csId); this->cutsceneState = ENTRT_CUTSCENESTATE_STOPPED; } - play->msgCtx.msgMode = 0x43; + play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; this->actionFunc = EnTrt_GiveRedPotionForKoume; } else { @@ -660,7 +660,7 @@ void EnTrt_SetupBuyItemWithFanfare(PlayState* play, EnTrt* this) { Player* player = GET_PLAYER(play); Actor_OfferGetItem(&this->actor, play, this->items[this->cursorIndex]->getItemId, 300.0f, 300.0f); - play->msgCtx.msgMode = 0x43; + play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; player->stateFlags2 &= ~PLAYER_STATE2_20000000; Interface_SetHudVisibility(HUD_VISIBILITY_ALL); @@ -999,7 +999,7 @@ void EnTrt_TryToGiveRedPotion(EnTrt* this, PlayState* play) { CutsceneManager_Stop(this->csId); this->cutsceneState = ENTRT_CUTSCENESTATE_STOPPED; } - play->msgCtx.msgMode = 0x43; + play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; this->actionFunc = EnTrt_GiveRedPotionForKoume; } else { diff --git a/src/overlays/actors/ovl_En_Trt2/z_en_trt2.c b/src/overlays/actors/ovl_En_Trt2/z_en_trt2.c index 40d1946fc..8bc8e2541 100644 --- a/src/overlays/actors/ovl_En_Trt2/z_en_trt2.c +++ b/src/overlays/actors/ovl_En_Trt2/z_en_trt2.c @@ -347,7 +347,7 @@ void func_80AD3CEC(EnTrt2* this, PlayState* play) { Message_StartTextbox(play, this->unk_3A8, &this->actor); this->unk_3D8 = false; } else if ((talkState == TEXT_STATE_5) && Message_ShouldAdvance(play)) { - play->msgCtx.msgMode = 0x43; + play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; EnTrt2_ChangeAnim(&this->skelAnime, sAnimationInfo, TRT2_ANIM_HOVER); this->unk_3B2 = 4; @@ -375,7 +375,7 @@ void func_80AD3DA4(EnTrt2* this, PlayState* play) { void func_80AD3E34(EnTrt2* this, PlayState* play) { if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) { if (Inventory_HasEmptyBottle()) { - play->msgCtx.msgMode = 0x43; + play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; this->unk_3B2 = 12; } else { @@ -403,7 +403,7 @@ void func_80AD3EF0(EnTrt2* this, PlayState* play) { } } } else if ((talkState == TEXT_STATE_5) && Message_ShouldAdvance(play)) { - play->msgCtx.msgMode = 0x43; + play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; this->unk_3B2 = 12; } @@ -447,7 +447,7 @@ void func_80AD417C(EnTrt2* this, PlayState* play) { func_80AD349C(this); func_80AD3DA4(this, play); } else { - play->msgCtx.msgMode = 0x43; + play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; if (this->unk_3A8 == 0x84C) { EnTrt2_ChangeAnim(&this->skelAnime, sAnimationInfo, TRT2_ANIM_HOVER); @@ -529,7 +529,7 @@ void func_80AD4550(EnTrt2* this, PlayState* play) { } if ((talkState == TEXT_STATE_5) && Message_ShouldAdvance(play)) { - play->msgCtx.msgMode = 0x43; + play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; } } diff --git a/src/overlays/actors/ovl_En_Warp_tag/z_en_warp_tag.c b/src/overlays/actors/ovl_En_Warp_tag/z_en_warp_tag.c index cbb095279..bae88696f 100644 --- a/src/overlays/actors/ovl_En_Warp_tag/z_en_warp_tag.c +++ b/src/overlays/actors/ovl_En_Warp_tag/z_en_warp_tag.c @@ -37,8 +37,10 @@ ActorInit En_Warp_tag_InitVars = { }; // this appears to be unused, as the code never accesses it in known vanilla cases -// these unknown values get passed to a unknown z_message function -u8 D_809C1000[] = { 0x28, 0x29, 0x2A, 0x2B, 0x2D, 0x2C, 0, 0 }; +u8 D_809C1000[] = { + OCARINA_ACTION_CHECK_TIME, OCARINA_ACTION_CHECK_HEALING, OCARINA_ACTION_CHECK_EPONAS, + OCARINA_ACTION_CHECK_SOARING, OCARINA_ACTION_CHECK_SUNS, OCARINA_ACTION_CHECK_STORMS, +}; static InitChainEntry sInitChain[] = { ICHAIN_VEC3F(scale, 1, ICHAIN_CONTINUE), @@ -113,7 +115,7 @@ void EnWarpTag_Unused809C09A0(EnWarptag* this, PlayState* play) { // and I doubt its set externally by another actor, so I believe this is unused // might be a bug, they might have meant to set actor flag (0x2000 0000) up above but mistyped (0x200 0000) // also WARPTAG_GET_3C0 should always return 2C0 -> 0xF for all known in-game uses, which is OOB - func_80152434(play, D_809C1000[WARPTAG_GET_3C0(&this->dyna.actor)]); // unk message function + Message_DisplayOcarinaStaff(play, D_809C1000[WARPTAG_GET_3C0(&this->dyna.actor)]); this->actionFunc = EnWarpTag_Unused809C0A20; } else { @@ -125,13 +127,13 @@ void EnWarpTag_Unused809C09A0(EnWarptag* this, PlayState* play) { * Unused ActionFunc: assigned by EnWarpTag_Unused809C09A0, no known variants use. */ void EnWarpTag_Unused809C0A20(EnWarptag* this, PlayState* play) { - if (play->msgCtx.ocarinaMode == 9) { + if (play->msgCtx.ocarinaMode == OCARINA_MODE_PLAYED_STORMS) { func_800B7298(play, NULL, PLAYER_CSMODE_WAIT); this->actionFunc = EnWarpTag_RespawnPlayer; CutsceneManager_Stop(CutsceneManager_GetCurrentCsId()); - } else if (play->msgCtx.ocarinaMode >= 2) { - play->msgCtx.ocarinaMode = 4; + } else if (play->msgCtx.ocarinaMode >= OCARINA_MODE_WARP) { + play->msgCtx.ocarinaMode = OCARINA_MODE_END; this->actionFunc = EnWarpTag_Unused809C09A0; } } diff --git a/src/overlays/actors/ovl_En_Weather_Tag/z_en_weather_tag.c b/src/overlays/actors/ovl_En_Weather_Tag/z_en_weather_tag.c index 97c381beb..fb34c3b64 100644 --- a/src/overlays/actors/ovl_En_Weather_Tag/z_en_weather_tag.c +++ b/src/overlays/actors/ovl_En_Weather_Tag/z_en_weather_tag.c @@ -497,7 +497,7 @@ void EnWeatherTag_Update(Actor* thisx, PlayState* play) { EnWeatherTag* this = THIS; this->actionFunc(this, play); - if ((play->actorCtx.flags & ACTORCTX_FLAG_1) && (play->msgCtx.msgMode != 0) && + if ((play->actorCtx.flags & ACTORCTX_FLAG_1) && (play->msgCtx.msgMode != MSGMODE_NONE) && (play->msgCtx.currentTextId == 0x5E6) && !FrameAdvance_IsEnabled(&play->state) && (play->transitionTrigger == TRANS_TRIGGER_OFF) && (CutsceneManager_GetCurrentCsId() == CS_ID_NONE) && (play->csCtx.state == CS_STATE_IDLE)) { diff --git a/src/overlays/actors/ovl_En_Yb/z_en_yb.c b/src/overlays/actors/ovl_En_Yb/z_en_yb.c index c9881a5e0..42bc9ffb4 100644 --- a/src/overlays/actors/ovl_En_Yb/z_en_yb.c +++ b/src/overlays/actors/ovl_En_Yb/z_en_yb.c @@ -358,7 +358,7 @@ void EnYb_Idle(EnYb* this, PlayState* play) { EnYb_UpdateAnimation(this, play); if ((this->actor.xzDistToPlayer < 180.0f) && (fabsf(this->actor.playerHeightRel) < 50.0f) && - (play->msgCtx.ocarinaMode == 3) && (play->msgCtx.lastPlayedSong == OCARINA_SONG_HEALING) && + (play->msgCtx.ocarinaMode == OCARINA_MODE_EVENT) && (play->msgCtx.lastPlayedSong == OCARINA_SONG_HEALING) && (GET_PLAYER_FORM == PLAYER_FORM_HUMAN)) { this->actionFunc = EnYb_TeachingDance; this->teachingCutsceneTimer = 200; diff --git a/src/overlays/actors/ovl_En_Zob/z_en_zob.c b/src/overlays/actors/ovl_En_Zob/z_en_zob.c index b54986829..9e6310a71 100644 --- a/src/overlays/actors/ovl_En_Zob/z_en_zob.c +++ b/src/overlays/actors/ovl_En_Zob/z_en_zob.c @@ -268,7 +268,7 @@ void func_80B9FC70(EnZob* this, s16 csIdIndex) { void func_80B9FCA0(EnZob* this, PlayState* play) { Message_CloseTextbox(play); - play->msgCtx.ocarinaMode = 4; + play->msgCtx.ocarinaMode = OCARINA_MODE_END; func_80B9FC0C(this); this->unk_2F4 &= ~1; this->actionFunc = func_80BA0728; @@ -315,7 +315,7 @@ void func_80B9FE1C(EnZob* this, PlayState* play) { void func_80B9FE5C(EnZob* this, PlayState* play) { func_80B9F86C(this); - if (play->msgCtx.ocarinaMode == 3) { + if (play->msgCtx.ocarinaMode == OCARINA_MODE_EVENT) { play->msgCtx.msgLength = 0; this->actionFunc = func_80B9FDDC; func_80B9FC70(this, 0); @@ -331,7 +331,7 @@ void func_80B9FE5C(EnZob* this, PlayState* play) { void func_80B9FF20(EnZob* this, PlayState* play) { func_80B9F86C(this); if (Message_GetState(&play->msgCtx) == TEXT_STATE_7) { - func_80152434(play, 0x42); + Message_DisplayOcarinaStaff(play, OCARINA_ACTION_PROMPT_EVAN_PART2_SECOND_HALF); this->actionFunc = func_80B9FE5C; func_80B9FC70(this, 2); } @@ -339,11 +339,11 @@ void func_80B9FF20(EnZob* this, PlayState* play) { void func_80B9FF80(EnZob* this, PlayState* play) { func_80B9F86C(this); - if (play->msgCtx.ocarinaMode == 3) { + if (play->msgCtx.ocarinaMode == OCARINA_MODE_EVENT) { this->actionFunc = func_80B9FF20; this->unk_304 = 6; func_80B9F7E4(this, 1, ANIMMODE_LOOP); - func_80152434(play, 0x3E); + Message_DisplayOcarinaStaff(play, OCARINA_ACTION_DEMONSTRATE_EVAN_PART2_FIRST_HALF); func_80B9FC70(this, 1); } else if (Message_GetState(&play->msgCtx) == TEXT_STATE_11) { play->msgCtx.msgLength = 0; @@ -357,7 +357,7 @@ void func_80B9FF80(EnZob* this, PlayState* play) { void func_80BA005C(EnZob* this, PlayState* play) { func_80B9F86C(this); if (Message_GetState(&play->msgCtx) == TEXT_STATE_7) { - func_80152434(play, 0x41); + Message_DisplayOcarinaStaff(play, OCARINA_ACTION_PROMPT_EVAN_PART1_SECOND_HALF); this->actionFunc = func_80B9FF80; func_80B9FC70(this, 2); } @@ -426,7 +426,7 @@ void func_80BA00BC(EnZob* this, PlayState* play) { break; case 0x1209: - func_80152434(play, 0x3D); + Message_DisplayOcarinaStaff(play, OCARINA_ACTION_DEMONSTRATE_EVAN_PART1_FIRST_HALF); this->unk_304 = 4; func_80B9F7E4(this, 0, ANIMMODE_LOOP); this->actionFunc = func_80BA005C; @@ -439,7 +439,7 @@ void func_80BA00BC(EnZob* this, PlayState* play) { } void func_80BA0318(EnZob* this, PlayState* play) { - func_80152434(play, 0x3D); + Message_DisplayOcarinaStaff(play, OCARINA_ACTION_DEMONSTRATE_EVAN_PART1_FIRST_HALF); this->unk_304 = 4; func_80B9F7E4(this, 0, ANIMMODE_LOOP); this->actionFunc = func_80BA005C; diff --git a/src/overlays/actors/ovl_En_Zog/z_en_zog.c b/src/overlays/actors/ovl_En_Zog/z_en_zog.c index 2e99ccb7b..92fa313a6 100644 --- a/src/overlays/actors/ovl_En_Zog/z_en_zog.c +++ b/src/overlays/actors/ovl_En_Zog/z_en_zog.c @@ -627,7 +627,7 @@ void func_80B9451C(EnZog* this, PlayState* play) { if (Actor_ProcessTalkRequest(&this->actor, &play->state)) { this->unk_300 = 2; this->actionFunc = func_80B94470; - } else if ((play->msgCtx.ocarinaMode == 3) && (this->actor.xzDistToPlayer < 120.0f)) { + } else if ((play->msgCtx.ocarinaMode == OCARINA_MODE_EVENT) && (this->actor.xzDistToPlayer < 120.0f)) { if ((play->msgCtx.lastPlayedSong == OCARINA_SONG_HEALING) && (GET_PLAYER_FORM == PLAYER_FORM_HUMAN)) { func_80B93BA8(this, 2); this->actionFunc = func_80B943C0; @@ -715,7 +715,7 @@ void func_80B948A8(EnZog* this, PlayState* play) { if (Actor_ProcessTalkRequest(&this->actor, &play->state)) { this->unk_300 = 2; this->actionFunc = func_80B946FC; - } else if ((play->msgCtx.ocarinaMode == 3) && (this->actor.xzDistToPlayer < 120.0f)) { + } else if ((play->msgCtx.ocarinaMode == OCARINA_MODE_EVENT) && (this->actor.xzDistToPlayer < 120.0f)) { if ((play->msgCtx.lastPlayedSong == OCARINA_SONG_HEALING) && (GET_PLAYER_FORM == PLAYER_FORM_HUMAN)) { func_80B93BA8(this, 2); this->actionFunc = func_80B943C0; diff --git a/src/overlays/actors/ovl_En_Zos/z_en_zos.c b/src/overlays/actors/ovl_En_Zos/z_en_zos.c index 0e3262869..8a942ce17 100644 --- a/src/overlays/actors/ovl_En_Zos/z_en_zos.c +++ b/src/overlays/actors/ovl_En_Zos/z_en_zos.c @@ -555,8 +555,8 @@ void func_80BBBDE0(EnZos* this, PlayState* play) { func_80BBB0D4(this, play); - if (play->msgCtx.ocarinaMode == 0x2A) { - play->msgCtx.ocarinaMode = 4; + if (play->msgCtx.ocarinaMode == OCARINA_MODE_PLAYED_FULL_EVAN_SONG) { + play->msgCtx.ocarinaMode = OCARINA_MODE_END; this->actionFunc = func_80BBBB84; this->actor.flags |= ACTOR_FLAG_10000; Actor_OfferTalk(&this->actor, play, 120.0f); diff --git a/src/overlays/actors/ovl_En_Zot/z_en_zot.c b/src/overlays/actors/ovl_En_Zot/z_en_zot.c index e9e86668a..e17f6dc94 100644 --- a/src/overlays/actors/ovl_En_Zot/z_en_zot.c +++ b/src/overlays/actors/ovl_En_Zot/z_en_zot.c @@ -1146,7 +1146,7 @@ void func_80B98BF4(EnZot* this, PlayState* play) { void func_80B98CA8(EnZot* this, PlayState* play) { if (func_800B8718(&this->actor, &play->state)) { - play->msgCtx.ocarinaMode = 4; + play->msgCtx.ocarinaMode = OCARINA_MODE_END; AudioOcarina_StartDefault(0xFFFF); this->actionFunc = func_80B98BF4; this->actor.flags |= ACTOR_FLAG_10000; diff --git a/src/overlays/actors/ovl_Obj_Ghaka/z_obj_ghaka.c b/src/overlays/actors/ovl_Obj_Ghaka/z_obj_ghaka.c index 5668021e3..92479cc4a 100644 --- a/src/overlays/actors/ovl_Obj_Ghaka/z_obj_ghaka.c +++ b/src/overlays/actors/ovl_Obj_Ghaka/z_obj_ghaka.c @@ -99,7 +99,7 @@ void func_80B3C4E0(ObjGhaka* this, PlayState* play) { if (talkState == TEXT_STATE_5) { if (Message_ShouldAdvance(play)) { - play->msgCtx.msgMode = 0x43; + play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; func_80B3C260(this); } @@ -120,7 +120,7 @@ void func_80B3C4E0(ObjGhaka* this, PlayState* play) { case 2: Audio_PlaySfx_MessageCancel(); - play->msgCtx.msgMode = 0x43; + play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; func_80B3C260(this); break; diff --git a/src/overlays/actors/ovl_Obj_Ocarinalift/z_obj_ocarinalift.c b/src/overlays/actors/ovl_Obj_Ocarinalift/z_obj_ocarinalift.c index 17a277e82..b5ba51418 100644 --- a/src/overlays/actors/ovl_Obj_Ocarinalift/z_obj_ocarinalift.c +++ b/src/overlays/actors/ovl_Obj_Ocarinalift/z_obj_ocarinalift.c @@ -203,7 +203,7 @@ void func_80AC9AB8(ObjOcarinalift* this) { void func_80AC9AE0(ObjOcarinalift* this, PlayState* play) { if (func_800B8718(&this->dyna.actor, &play->state)) { - func_80152434(play, 1); + Message_DisplayOcarinaStaff(play, OCARINA_ACTION_FREE_PLAY); func_80AC9B48(this); } else if (DynaPolyActor_IsPlayerOnTop(&this->dyna)) { func_800B8804(&this->dyna.actor, play, 40.0f); @@ -216,7 +216,7 @@ void func_80AC9B48(ObjOcarinalift* this) { void func_80AC9B5C(ObjOcarinalift* this, PlayState* play) { if (func_800B886C(&this->dyna.actor, play)) { - if (play->msgCtx.ocarinaMode == 4) { + if (play->msgCtx.ocarinaMode == OCARINA_MODE_END) { if (play->msgCtx.lastPlayedSong == 0) { if (OBJOCARINALIFT_GET_C(&this->dyna.actor) != OBJOCARINALIFT_PARAM_1) { Flags_SetSwitch(play, OBJOCARINALIFT_GET_SWITCH_FLAG(&this->dyna.actor)); @@ -225,8 +225,8 @@ void func_80AC9B5C(ObjOcarinalift* this, PlayState* play) { func_80AC9C20(this); } } else { - if (play->msgCtx.ocarinaMode >= 2) { - play->msgCtx.ocarinaMode = 4; + if (play->msgCtx.ocarinaMode >= OCARINA_MODE_WARP) { + play->msgCtx.ocarinaMode = OCARINA_MODE_END; } func_80AC9AB8(this); } diff --git a/src/overlays/actors/ovl_Obj_Um/z_obj_um.c b/src/overlays/actors/ovl_Obj_Um/z_obj_um.c index 09b95d3a0..3f556d640 100644 --- a/src/overlays/actors/ovl_Obj_Um/z_obj_um.c +++ b/src/overlays/actors/ovl_Obj_Um/z_obj_um.c @@ -897,7 +897,7 @@ s32 func_80B79734(PlayState* play, ObjUm* this, s32 arg2) { case TEXT_STATE_CHOICE: case TEXT_STATE_5: if (Message_ShouldAdvance(play) && func_80B795A0(play, this, arg2)) { - msgCtx->msgMode = 0x43; + msgCtx->msgMode = MSGMODE_TEXT_CLOSING; ret = true; } break; diff --git a/src/overlays/actors/ovl_Obj_Warpstone/z_obj_warpstone.c b/src/overlays/actors/ovl_Obj_Warpstone/z_obj_warpstone.c index e3d11f2fc..62ec8f0f7 100644 --- a/src/overlays/actors/ovl_Obj_Warpstone/z_obj_warpstone.c +++ b/src/overlays/actors/ovl_Obj_Warpstone/z_obj_warpstone.c @@ -141,7 +141,7 @@ void ObjWarpstone_Update(Actor* thisx, PlayState* play) { } else if ((Message_GetState(&play->msgCtx) == TEXT_STATE_CHOICE) && Message_ShouldAdvance(play)) { if (play->msgCtx.choiceIndex != 0) { Audio_PlaySfx_MessageDecide(); - play->msgCtx.msgMode = 0x4D; + play->msgCtx.msgMode = MSGMODE_OWL_SAVE_0; play->msgCtx.unk120D6 = 0; play->msgCtx.unk120D4 = 0; gSaveContext.save.owlSaveLocation = OBJ_WARPSTONE_GET_ID(&this->dyna.actor); diff --git a/src/overlays/actors/ovl_Obj_Wturn/z_obj_wturn.c b/src/overlays/actors/ovl_Obj_Wturn/z_obj_wturn.c index 6f361294e..00b4e9acf 100644 --- a/src/overlays/actors/ovl_Obj_Wturn/z_obj_wturn.c +++ b/src/overlays/actors/ovl_Obj_Wturn/z_obj_wturn.c @@ -39,7 +39,8 @@ void func_808A7954(ObjWturn* this) { } void func_808A7968(ObjWturn* this, PlayState* play) { - if (play->msgCtx.ocarinaMode >= 28 && play->msgCtx.ocarinaMode < 39) { + if ((play->msgCtx.ocarinaMode >= OCARINA_MODE_WARP_TO_GREAT_BAY_COAST) && + (play->msgCtx.ocarinaMode <= OCARINA_MODE_WARP_TO_ENTRANCE)) { Flags_UnsetSwitch(play, this->actor.params); Actor_Kill(&this->actor); return; diff --git a/src/overlays/actors/ovl_Oceff_Spot/z_oceff_spot.c b/src/overlays/actors/ovl_Oceff_Spot/z_oceff_spot.c index 406e4ba0f..be5374519 100644 --- a/src/overlays/actors/ovl_Oceff_Spot/z_oceff_spot.c +++ b/src/overlays/actors/ovl_Oceff_Spot/z_oceff_spot.c @@ -81,11 +81,12 @@ void OceffSpot_End(OceffSpot* this, PlayState* play) { } else { Actor_Kill(&this->actor); if ((R_TIME_SPEED != 400) && !play->msgCtx.blockSunsSong) { - if ((play->msgCtx.ocarinaAction != 0x39) || (play->msgCtx.ocarinaMode != 0xA)) { + if ((play->msgCtx.ocarinaAction != OCARINA_ACTION_CHECK_NOTIME_DONE) || + (play->msgCtx.ocarinaMode != OCARINA_MODE_PLAYED_SUNS)) { gSaveContext.sunsSongState = SUNSSONG_START; } } else { - play->msgCtx.ocarinaMode = 4; + play->msgCtx.ocarinaMode = OCARINA_MODE_END; } } } diff --git a/src/overlays/actors/ovl_Shot_Sun/z_shot_sun.c b/src/overlays/actors/ovl_Shot_Sun/z_shot_sun.c index 4130dcb74..7a5cc209d 100644 --- a/src/overlays/actors/ovl_Shot_Sun/z_shot_sun.c +++ b/src/overlays/actors/ovl_Shot_Sun/z_shot_sun.c @@ -129,18 +129,18 @@ void ShotSun_TriggerFairy(ShotSun* this, PlayState* play) { void ShotSun_UpdateForOcarina(ShotSun* this, PlayState* play) { s32 type = SHOTSUN_GET_TYPE(&this->actor); - if (play->msgCtx.ocarinaMode == 3) { + if (play->msgCtx.ocarinaMode == OCARINA_MODE_EVENT) { switch (play->msgCtx.lastPlayedSong) { case OCARINA_SONG_STORMS: if (type == SHOTSUN_FAIRY_SPAWNER_STORMS) { this->actionFunc = ShotSun_TriggerFairy; - play->msgCtx.ocarinaMode = 4; + play->msgCtx.ocarinaMode = OCARINA_MODE_END; } break; case OCARINA_SONG_SUNS: if (type == SHOTSUN_FAIRY_SPAWNER_SUNS) { this->actionFunc = ShotSun_TriggerFairy; - play->msgCtx.ocarinaMode = 4; + play->msgCtx.ocarinaMode = OCARINA_MODE_END; } break; } diff --git a/src/overlays/actors/ovl_player_actor/z_player.c b/src/overlays/actors/ovl_player_actor/z_player.c index 07e691591..57322fb0f 100644 --- a/src/overlays/actors/ovl_player_actor/z_player.c +++ b/src/overlays/actors/ovl_player_actor/z_player.c @@ -16630,10 +16630,12 @@ void Player_Action_62(Player* this, PlayState* play) { s32 func_80851C40(PlayState* play, Player* this) { return ((play->sceneId == SCENE_MILK_BAR) && Audio_IsSequencePlaying(NA_BGM_BALLAD_OF_THE_WIND_FISH)) || (((play->sceneId != SCENE_MILK_BAR) && (this->csMode == PLAYER_CSMODE_68)) || - ((play->msgCtx.msgMode == 0x12) || (play->msgCtx.msgMode == 0x13) || (play->msgCtx.msgMode == 0x14) || - ((play->msgCtx.ocarinaMode != 1) && - ((this->csMode == PLAYER_CSMODE_5) || (play->msgCtx.ocarinaMode == 3) || - play->msgCtx.ocarinaAction == 0x32)))); + ((play->msgCtx.msgMode == MSGMODE_SONG_PLAYED) || + (play->msgCtx.msgMode == MSGMODE_SETUP_DISPLAY_SONG_PLAYED) || + (play->msgCtx.msgMode == MSGMODE_DISPLAY_SONG_PLAYED) || + ((play->msgCtx.ocarinaMode != OCARINA_MODE_ACTIVE) && + ((this->csMode == PLAYER_CSMODE_5) || (play->msgCtx.ocarinaMode == OCARINA_MODE_EVENT) || + play->msgCtx.ocarinaAction == OCARINA_ACTION_FREE_PLAY_DONE)))); } // Deku playing the pipes? The loops both overwrite unk_AF0[0].y,z and unk_AF0[1].x,y,z @@ -16653,7 +16655,7 @@ void func_80851D30(PlayState* play, Player* this) { *var_s0 = sp50.x; var_s0++; } - } else if (play->msgCtx.ocarinaMode == 1) { + } else if (play->msgCtx.ocarinaMode == OCARINA_MODE_ACTIVE) { if (play->msgCtx.ocarinaButtonIndex != OCARINA_BTN_INVALID) { var_s0[play->msgCtx.ocarinaButtonIndex] = 1.2f; func_8082DB90(play, this, D_8085D190[this->transformation]); @@ -16738,7 +16740,7 @@ void func_808521E0(PlayState* play, Player* this) { } func_80124618(D_801C0490, this->skelAnime.curFrame, &this->unk_AF0[1]); - } else if (play->msgCtx.ocarinaMode == 1) { + } else if (play->msgCtx.ocarinaMode == OCARINA_MODE_ACTIVE) { if (play->msgCtx.ocarinaButtonIndex != OCARINA_BTN_INVALID) { func_80851EC8(play, this); } @@ -16760,7 +16762,8 @@ void func_80852290(PlayState* play, Player* this) { s16 var_a1_3; s16 sp38; - if ((play->msgCtx.ocarinaMode == 1) && (play->msgCtx.ocarinaButtonIndex != OCARINA_BTN_INVALID)) { + if ((play->msgCtx.ocarinaMode == OCARINA_MODE_ACTIVE) && + (play->msgCtx.ocarinaButtonIndex != OCARINA_BTN_INVALID)) { if ((this->unk_A90 != NULL) && (this->unk_A94 < 0.0f)) { this->unk_A90->flags |= ACTOR_FLAG_20000000; this->unk_A94 = 0.0f; @@ -16841,10 +16844,10 @@ void Player_Action_63(Player* this, PlayState* play) { ((this->skelAnime.mode == 0) && (this->actionVar2 == 0)))) { func_808525C4(play, this); if (!(this->actor.flags & ACTOR_FLAG_20000000) || (this->unk_A90->id == ACTOR_EN_ZOT)) { - func_80152434(play, 1); + Message_DisplayOcarinaStaff(play, OCARINA_ACTION_FREE_PLAY); } } else if (this->actionVar2 != 0) { - if (play->msgCtx.ocarinaMode == 4) { + if (play->msgCtx.ocarinaMode == OCARINA_MODE_END) { play->interfaceCtx.unk_222 = 0; CutsceneManager_Stop(play->playerCsIds[PLAYER_CS_ID_ITEM_OCARINA]); this->actor.flags &= ~ACTOR_FLAG_20000000; @@ -16860,12 +16863,15 @@ void Player_Action_63(Player* this, PlayState* play) { Player_AnimationPlayOnceReverse(play, this, D_8085D17C[this->transformation]); } } else { - s32 var_v1 = (play->msgCtx.ocarinaMode >= 0x1C) && (play->msgCtx.ocarinaMode < 0x27); + s32 var_v1 = (play->msgCtx.ocarinaMode >= OCARINA_MODE_WARP_TO_GREAT_BAY_COAST) && + (play->msgCtx.ocarinaMode <= OCARINA_MODE_WARP_TO_ENTRANCE); s32 pad[2]; - if (var_v1 || (play->msgCtx.ocarinaMode == 0x16) || (play->msgCtx.ocarinaMode == 0x1A) || - (play->msgCtx.ocarinaMode == 0x18) || (play->msgCtx.ocarinaMode == 0x19)) { - if (play->msgCtx.ocarinaMode == 0x16) { + if (var_v1 || (play->msgCtx.ocarinaMode == OCARINA_MODE_APPLY_SOT) || + (play->msgCtx.ocarinaMode == OCARINA_MODE_APPLY_DOUBLE_SOT) || + (play->msgCtx.ocarinaMode == OCARINA_MODE_APPLY_INV_SOT_FAST) || + (play->msgCtx.ocarinaMode == OCARINA_MODE_APPLY_INV_SOT_SLOW)) { + if (play->msgCtx.ocarinaMode == OCARINA_MODE_APPLY_SOT) { if (!func_8082DA90(play)) { if (gSaveContext.save.saveInfo.playerData.threeDayResetCount == 1) { play->nextEntrance = ENTRANCE(CUTSCENE, 1); @@ -16896,7 +16902,8 @@ void Player_Action_63(Player* this, PlayState* play) { Player_AnimationPlayOnceReverse(play, this, D_8085D17C[this->transformation]); } } - } else if ((play->msgCtx.ocarinaMode == 3) && (play->msgCtx.lastPlayedSong == OCARINA_SONG_ELEGY)) { + } else if ((play->msgCtx.ocarinaMode == OCARINA_MODE_EVENT) && + (play->msgCtx.lastPlayedSong == OCARINA_SONG_ELEGY)) { play->interfaceCtx.unk_222 = 0; CutsceneManager_Stop(play->playerCsIds[PLAYER_CS_ID_ITEM_OCARINA]); @@ -18114,7 +18121,7 @@ void Player_Action_87(Player* this, PlayState* play) { void Player_Action_88(Player* this, PlayState* play) { if (this->actionVar2++ > 90) { - play->msgCtx.ocarinaMode = 4; + play->msgCtx.ocarinaMode = OCARINA_MODE_END; func_8085B384(this, play); } else if (this->actionVar2 == 10) { func_80848640(play, this); @@ -19814,7 +19821,7 @@ void Player_CsAction_4(PlayState* play, Player* this, CsCmdActorCue* cue) { PlayerAnimation_Update(play, &this->skelAnime); if ((this->actor.id == ACTOR_EN_TEST3) && Animation_OnFrame(&this->skelAnime, 20.0f)) { this->getItemDrawIdPlusOne = GID_MASK_SUN + 1; - Message_BombersNotebookQueueEvent(play, 0x1B); + Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_ESCAPED_SAKONS_HIDEOUT); Audio_PlayFanfare(NA_BGM_GET_NEW_MASK); } } diff --git a/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope_NES.c b/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope_NES.c index 6b451b506..c99e6d718 100644 --- a/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope_NES.c +++ b/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope_NES.c @@ -2799,10 +2799,14 @@ void KaleidoScope_UpdateOpening(PlayState* play) { } } +u16 sCursorPointsToOcarinaModes[] = { + OCARINA_MODE_WARP_TO_GREAT_BAY_COAST, OCARINA_MODE_WARP_TO_ZORA_CAPE, OCARINA_MODE_WARP_TO_SNOWHEAD, + OCARINA_MODE_WARP_TO_MOUNTAIN_VILLAGE, OCARINA_MODE_WARP_TO_SOUTH_CLOCK_TOWN, OCARINA_MODE_WARP_TO_MILK_ROAD, + OCARINA_MODE_WARP_TO_WOODFALL, OCARINA_MODE_WARP_TO_SOUTHERN_SWAMP, OCARINA_MODE_WARP_TO_IKANA_CANYON, + OCARINA_MODE_WARP_TO_STONE_TOWER, +}; + void KaleidoScope_Update(PlayState* play) { - static u16 sCursorPointsToOcarinaModes[] = { - 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, - }; static s16 sUnpausedHudVisibility = HUD_VISIBILITY_IDLE; static s16 sNextMainState = PAUSE_MAIN_STATE_IDLE; static s16 sDelayTimer = 10; @@ -3484,7 +3488,7 @@ void KaleidoScope_Update(PlayState* play) { pauseCtx->state = PAUSE_STATE_OWLWARP_6; sPauseMenuVerticalOffset = -6240.0f; Audio_PlaySfx_PauseMenuOpenOrClose(SFX_PAUSE_MENU_CLOSE); - play->msgCtx.ocarinaMode = 4; + play->msgCtx.ocarinaMode = OCARINA_MODE_END; gSaveContext.prevHudVisibility = HUD_VISIBILITY_ALL; } else if (CHECK_BTN_ALL(input->press.button, BTN_A)) { Audio_PlaySfx(NA_SE_SY_DECIDE); @@ -3498,7 +3502,7 @@ void KaleidoScope_Update(PlayState* play) { case PAUSE_STATE_OWLWARP_CONFIRM: if (CHECK_BTN_ALL(input->press.button, BTN_A)) { msgCtx->msgLength = 0; - msgCtx->msgMode = 0; + msgCtx->msgMode = MSGMODE_NONE; if (msgCtx->choiceIndex == 0) { func_8011552C(play, DO_ACTION_NONE); pauseCtx->state = PAUSE_STATE_OWLWARP_6; @@ -3513,17 +3517,17 @@ void KaleidoScope_Update(PlayState* play) { } } else if (CHECK_BTN_ALL(input->press.button, BTN_B)) { msgCtx->msgLength = 0; - msgCtx->msgMode = 0; + msgCtx->msgMode = MSGMODE_NONE; pauseCtx->state = PAUSE_STATE_OWLWARP_SELECT; Audio_PlaySfx(NA_SE_SY_MESSAGE_PASS); } else if (CHECK_BTN_ALL(input->press.button, BTN_START)) { msgCtx->msgLength = 0; - msgCtx->msgMode = 0; + msgCtx->msgMode = MSGMODE_NONE; func_8011552C(play, DO_ACTION_NONE); pauseCtx->state = PAUSE_STATE_OWLWARP_6; sPauseMenuVerticalOffset = -6240.0f; Audio_PlaySfx_PauseMenuOpenOrClose(SFX_PAUSE_MENU_CLOSE); - play->msgCtx.ocarinaMode = 4; + play->msgCtx.ocarinaMode = OCARINA_MODE_END; gSaveContext.prevHudVisibility = HUD_VISIBILITY_ALL; } break; @@ -3598,7 +3602,7 @@ void KaleidoScope_Update(PlayState* play) { MsgEvent_SendNullTask(); func_80143324(play, &play->skyboxCtx, play->skyboxId); - if ((msgCtx->msgMode != 0) && (msgCtx->currentTextId == 0xFF)) { + if ((msgCtx->msgMode != MSGMODE_NONE) && (msgCtx->currentTextId == 0xFF)) { func_80115844(play, DO_ACTION_STOP); func_8011552C(play, DO_ACTION_STOP); Interface_SetHudVisibility(HUD_VISIBILITY_A_B_C); diff --git a/tools/disasm/functions.txt b/tools/disasm/functions.txt index 8a60d1f66..79ab56b45 100644 --- a/tools/disasm/functions.txt +++ b/tools/disasm/functions.txt @@ -2820,15 +2820,15 @@ 0x80147314:("func_80147314",), 0x80147414:("func_80147414",), 0x8014750C:("Sram_nop8014750C",), - 0x80147520:("func_80147520",), - 0x80147564:("func_80147564",), + 0x80147520:("Message_ResetOcarinaButtonAlphas",), + 0x80147564:("Message_ResetOcarinaButtonState",), 0x80147624:("Message_ShouldAdvance",), 0x80147734:("Message_ShouldAdvanceSilent",), 0x801477B4:("Message_CloseTextbox",), - 0x80147818:("func_80147818",), + 0x80147818:("Message_DrawTextboxIcon",), 0x80147F18:("func_80147F18",), 0x80148558:("func_80148558",), - 0x80148B98:("func_80148B98",), + 0x80148B98:("Message_HandleChoiceSelection",), 0x80148CBC:("func_80148CBC",), 0x80148D64:("func_80148D64",), 0x80149048:("func_80149048",), @@ -2836,43 +2836,43 @@ 0x80149454:("func_80149454",), 0x801496C8:("func_801496C8",), 0x8014995C:("Message_DrawTextChar",), - 0x80149C18:("func_80149C18",), + 0x80149C18:("Message_GrowTextbox",), 0x80149EBC:("Message_FindMessage",), 0x80149F74:("Message_DrawItemIcon",), 0x8014AAD0:("Message_HandleOcarina",), - 0x8014ADBC:("func_8014ADBC",), + 0x8014ADBC:("Message_DrawTextDefault",), 0x8014C70C:("Message_LoadItemIcon",), 0x8014CC14:("Message_LoadChar",), 0x8014CCB4:("func_8014CCB4",), - 0x8014CDF0:("func_8014CDF0",), + 0x8014CDF0:("Message_GetTimerDigits",), 0x8014CFDC:("Message_SetupLoadItemIcon",), - 0x8014D304:("func_8014D304",), - 0x8014D62C:("func_8014D62C",), - 0x8014D7B4:("func_8014D7B4",), + 0x8014D304:("Message_LoadTime",), + 0x8014D62C:("Message_LoadOwlWarpText",), + 0x8014D7B4:("Message_Decode",), 0x80150A84:("func_80150A84",), - 0x80150D08:("func_80150D08",), + 0x80150D08:("Message_OpenText",), 0x801514B0:("func_801514B0",), 0x801518B0:("Message_StartTextbox",), 0x80151938:("Message_ContinueTextbox",), - 0x80151A68:("func_80151A68",), + 0x80151A68:("Message_DisplaySceneTitleCard",), 0x80151BB4:("Message_BombersNotebookQueueEvent",), - 0x80151C9C:("func_80151C9C",), - 0x80151DA4:("func_80151DA4",), - 0x80152434:("func_80152434",), - 0x80152464:("func_80152464",), + 0x80151C9C:("Message_BombersNotebookProcessEventQueue",), + 0x80151DA4:("Message_DisplayOcarinaStaffImpl",), + 0x80152434:("Message_DisplayOcarinaStaff",), + 0x80152464:("Message_DisplayOcarinaStaffBlockSunsSong",), 0x80152498:("Message_GetState",), - 0x8015268C:("func_8015268C",), - 0x80152C64:("func_80152C64",), + 0x8015268C:("Message_DrawTextBox",), + 0x80152C64:("Message_SetView",), 0x80152CAC:("func_80152CAC",), - 0x80152EC0:("func_80152EC0",), - 0x80152FB8:("func_80152FB8",), - 0x80153750:("func_80153750",), - 0x80153E7C:("func_80153E7C",), - 0x80153EF0:("func_80153EF0",), - 0x801541D4:("func_801541D4",), + 0x80152EC0:("Message_SpawnSongEffect",), + 0x80152FB8:("Message_FlashOcarinaButtons",), + 0x80153750:("Message_DrawOcarinaButtons",), + 0x80153E7C:("Message_DrawText",), + 0x80153EF0:("Message_DrawSceneTitleCard",), + 0x801541D4:("Message_DrawMain",), 0x80156758:("Message_Draw",), 0x8015680C:("Message_Update",), - 0x801586A4:("func_801586A4",), + 0x801586A4:("Message_SetTables",), 0x801586D4:("Message_Init",), 0x801588D0:("Message_FindMessageNES",), 0x80158988:("Message_LoadCharNES",), diff --git a/tools/disasm/variables.txt b/tools/disasm/variables.txt index 5aaa2f1d0..6f243b124 100644 --- a/tools/disasm/variables.txt +++ b/tools/disasm/variables.txt @@ -1941,44 +1941,34 @@ 0x801C6A50:("D_801C6A50","UNK_TYPE1","",0x1), 0x801C6A58:("D_801C6A58","UNK_TYPE1","",0x1), 0x801C6A70:("D_801C6A70","UNK_TYPE1","",0x1), - 0x801C6A74:("D_801C6A74","UNK_TYPE2","",0x2), - 0x801C6A78:("D_801C6A78","UNK_TYPE2","",0x2), - 0x801C6A7C:("D_801C6A7C","UNK_TYPE2","",0x2), - 0x801C6A80:("D_801C6A80","UNK_TYPE2","",0x2), - 0x801C6A84:("D_801C6A84","UNK_TYPE2","",0x2), - 0x801C6A88:("D_801C6A88","UNK_TYPE2","",0x2), - 0x801C6A8C:("D_801C6A8C","UNK_TYPE2","",0x2), - 0x801C6A90:("D_801C6A90","UNK_TYPE2","",0x2), + 0x801C6A74:("sOcarinaButtonIndexBufPos","UNK_TYPE2","",0x2), + 0x801C6A78:("sOcarinaButtonIndexBufLen","UNK_TYPE2","",0x2), + 0x801C6A7C:("sLastPlayedSong","UNK_TYPE2","",0x2), + 0x801C6A80:("sOcarinaButtonStepR","UNK_TYPE2","",0x2), + 0x801C6A84:("sOcarinaButtonStepG","UNK_TYPE2","",0x2), + 0x801C6A88:("sOcarinaButtonStepB","UNK_TYPE2","",0x2), + 0x801C6A8C:("sOcarinaButtonFlashTimer","UNK_TYPE2","",0x2), + 0x801C6A90:("sOcarinaButtonFlashColorIndex","UNK_TYPE2","",0x2), 0x801C6A94:("D_801C6A94","UNK_TYPE2","",0x2), 0x801C6A98:("gPageSwitchNextButtonStatus","UNK_TYPE1","",0x1), 0x801C6AB8:("sBombersNotebookEventMessages","UNK_TYPE1","",0x1), 0x801C6B28:("gBombersNotebookWeekEventFlags","UNK_TYPE1","",0x1), 0x801C6B98:("D_801C6B98","UNK_TYPE1","",0x1), - 0x801CED40:("D_801CED40","UNK_TYPE1","",0x1), 0x801CFB08:("D_801CFB08","UNK_TYPE1","",0x1), - 0x801CFC78:("D_801CFC78","UNK_TYPE2","",0x2), - 0x801CFC7A:("D_801CFC7A","UNK_TYPE1","",0x1), - 0x801CFC7C:("D_801CFC7C","UNK_TYPE1","",0x1), - 0x801CFC7E:("D_801CFC7E","UNK_TYPE1","",0x1), - 0x801CFC84:("D_801CFC84","UNK_TYPE1","",0x1), - 0x801CFC88:("D_801CFC88","UNK_TYPE1","",0x1), - 0x801CFC8C:("D_801CFC8C","UNK_TYPE1","",0x1), - 0x801CFC8E:("D_801CFC8E","UNK_TYPE1","",0x1), - 0x801CFC92:("D_801CFC92","UNK_TYPE1","",0x1), - 0x801CFC98:("D_801CFC98","UNK_TYPE1","",0x1), - 0x801CFCA4:("D_801CFCA4","UNK_TYPE2","",0x2), - 0x801CFCAC:("D_801CFCAC","UNK_TYPE2","",0x2), + 0x801CFC78:("D_801CFC78","s16","[15]",0x1E), + 0x801CFC98:("sOcarinaButtonIndexBuf","UNK_TYPE1","",0x1), + 0x801CFCA4:("sOcarinaButtonAlphaValues","UNK_TYPE2","",0x2), 0x801CFCB8:("gOcarinaSongItemMap","UNK_TYPE1","",0x1), - 0x801CFCD8:("D_801CFCD8","UNK_TYPE2","",0x2), - 0x801CFCE4:("D_801CFCE4","UNK_TYPE2","",0x2), - 0x801CFCF0:("D_801CFCF0","UNK_TYPE2","",0x2), - 0x801CFCF4:("D_801CFCF4","UNK_TYPE2","",0x2), - 0x801CFCF8:("D_801CFCF8","UNK_TYPE2","",0x2), - 0x801CFCFC:("D_801CFCFC","UNK_TYPE2","",0x2), - 0x801CFD00:("D_801CFD00","UNK_TYPE2","",0x2), - 0x801CFD04:("D_801CFD04","UNK_TYPE2","",0x2), - 0x801CFD08:("D_801CFD08","UNK_TYPE2","",0x2), - 0x801CFD0C:("D_801CFD0C","UNK_TYPE2","",0x2), + 0x801CFCD8:("sIconPrimColors","UNK_TYPE2","",0x2), + 0x801CFCE4:("sIconEnvColors","UNK_TYPE2","",0x2), + 0x801CFCF0:("sIconPrimR","UNK_TYPE2","",0x2), + 0x801CFCF4:("sIconPrimG","UNK_TYPE2","",0x2), + 0x801CFCF8:("sIconPrimB","UNK_TYPE2","",0x2), + 0x801CFCFC:("sIconFlashTimer","UNK_TYPE2","",0x2), + 0x801CFD00:("sIconFlashColorIndex","UNK_TYPE2","",0x2), + 0x801CFD04:("sIconEnvR","UNK_TYPE2","",0x2), + 0x801CFD08:("sIconEnvG","UNK_TYPE2","",0x2), + 0x801CFD0C:("sIconEnvB","UNK_TYPE2","",0x2), 0x801CFD10:("D_801CFD10","UNK_TYPE2","",0x2), 0x801CFD1C:("D_801CFD1C","UNK_TYPE2","",0x2), 0x801CFD28:("D_801CFD28","UNK_TYPE2","",0x2), @@ -1999,24 +1989,24 @@ 0x801CFD74:("D_801CFD74","UNK_TYPE2","",0x2), 0x801CFD78:("D_801CFD78","UNK_TYPE2","",0x2), 0x801CFD7C:("D_801CFD7C","UNK_TYPE2","",0x2), - 0x801CFD80:("D_801CFD80","UNK_TYPE2","",0x2), - 0x801CFD84:("D_801CFD84","UNK_TYPE2","",0x2), - 0x801CFD88:("D_801CFD88","UNK_TYPE2","",0x2), - 0x801CFD8C:("D_801CFD8C","UNK_TYPE2","",0x2), - 0x801CFD90:("D_801CFD90","UNK_TYPE2","",0x2), - 0x801CFD94:("D_801CFD94","UNK_PTR","",0x4), - 0x801CFD98:("D_801CFD98","UNK_TYPE2","",0x2), - 0x801CFD9C:("D_801CFD9C","UNK_TYPE2","",0x2), - 0x801CFDA0:("D_801CFDA0","UNK_TYPE2","",0x2), + 0x801CFD80:("sAnalogStickHeld","UNK_TYPE2","",0x2), + 0x801CFD84:("sAnalogStickHeld","UNK_TYPE2","",0x2), + 0x801CFD88:("sAnalogStickHeld","UNK_TYPE2","",0x2), + 0x801CFD8C:("sAnalogStickHeld","UNK_TYPE2","",0x2), + 0x801CFD90:("sAnalogStickHeld","UNK_TYPE2","",0x2), + 0x801CFD94:("sTextboxWidth","UNK_PTR","",0x4), + 0x801CFD98:("sTextboxHeight","UNK_TYPE2","",0x2), + 0x801CFD9C:("sTextboxTexWidth","UNK_TYPE2","",0x2), + 0x801CFDA0:("sTextboxTexHeight","UNK_TYPE2","",0x2), 0x801CFDA4:("D_801CFDA4","UNK_TYPE1","",0x1), 0x801CFDC8:("D_801CFDC8","UNK_TYPE1","",0x1), 0x801CFDEC:("D_801CFDEC","UNK_TYPE1","",0x1), 0x801CFE04:("D_801CFE04","UNK_TYPE1","",0x1), 0x801CFE1C:("D_801CFE1C","UNK_TYPE1","",0x1), 0x801CFE34:("D_801CFE34","UNK_TYPE1","",0x1), - 0x801CFE4C:("D_801CFE4C","UNK_TYPE1","",0x1), - 0x801CFE5C:("D_801CFE5C","UNK_TYPE1","",0x1), - 0x801CFE68:("D_801CFE68","UNK_TYPE1","",0x1), + 0x801CFE4C:("sStrayFairyIconTextures","UNK_TYPE1","",0x1), + 0x801CFE5C:("sStrayFairyIconPrimColors","UNK_TYPE1","",0x1), + 0x801CFE68:("sStrayFairyIconEnvColors","UNK_TYPE1","",0x1), 0x801CFE74:("D_801CFE74","UNK_TYPE1","",0x1), 0x801CFEA4:("D_801CFEA4","UNK_TYPE1","",0x1), 0x801CFED4:("D_801CFED4","UNK_TYPE1","",0x1), @@ -2027,59 +2017,38 @@ 0x801CFF7C:("D_801CFF7C","UNK_TYPE1","",0x1), 0x801CFF88:("D_801CFF88","UNK_TYPE1","",0x1), 0x801CFF94:("D_801CFF94","UNK_TYPE1","",0x1), - 0x801D0000:("D_801D0000","UNK_TYPE1","",0x1), - 0x801D0001:("D_801D0001","UNK_TYPE1","",0x1), - 0x801D001F:("D_801D001F","UNK_TYPE1","",0x1), - 0x801D0188:("D_801D0188","UNK_TYPE1","",0x1), - 0x801D023A:("D_801D023A","UNK_TYPE1","",0x1), - 0x801D0250:("D_801D0250","UNK_TYPE1","",0x1), + 0x801D0188:("sOwlWarpTextJPN","UNK_TYPE1","",0x1), + 0x801D0250:("sOwlWarpTextLengthJPN","UNK_TYPE1","",0x1), 0x801D0268:("D_801D0268","UNK_TYPE2","",0x2), 0x801D027C:("D_801D027C","UNK_TYPE1","",0x1), 0x801D0284:("D_801D0284","UNK_TYPE1","",0x1), 0x801D028C:("D_801D028C","UNK_TYPE1","",0x1), - 0x801D02C0:("D_801D02C0","UNK_TYPE1","",0x1), - 0x801D02D8:("D_801D02D8","UNK_TYPE1","",0x1), - 0x801D02F8:("D_801D02F8","UNK_TYPE1","",0x1), + 0x801D02C0:("sOcarinaSongFlagsMap","UNK_TYPE1","",0x1), + 0x801D02D8:("sOcarinaEffectActorIds","UNK_TYPE1","",0x1), + 0x801D02F8:("sOcarinaEffectActorParams","UNK_TYPE1","",0x1), 0x801D0330:("D_801D0330","UNK_TYPE1","",0x1), - 0x801D0334:("D_801D0334","UNK_TYPE1","",0x1), - 0x801D0340:("D_801D0340","UNK_TYPE1","",0x1), - 0x801D034C:("D_801D034C","UNK_TYPE1","",0x1), - 0x801D0358:("D_801D0358","UNK_TYPE1","",0x1), - 0x801D0364:("D_801D0364","UNK_TYPE1","",0x1), - 0x801D0378:("D_801D0378","UNK_TYPE1","",0x1), - 0x801D039C:("D_801D039C","UNK_TYPE1","",0x8), - 0x801D03A4:("D_801D03A4","UNK_TYPE1","",0x1), + 0x801D0334:("sOcarinaButtonAPrimColors","UNK_TYPE1","",0x1), + 0x801D0340:("sOcarinaButtonAEnvColors","UNK_TYPE1","",0x1), + 0x801D034C:("sOcarinaButtonCPrimColors","UNK_TYPE1","",0x1), + 0x801D0358:("sOcarinaButtonCEnvColors","UNK_TYPE1","",0x1), + 0x801D0364:("sOcarinaButtonTextures","UNK_TYPE1","",0x1), + 0x801D0378:("sOcarinaSongFanfares","UNK_TYPE1","",0x1), + 0x801D039C:("sOcarinaSongFanfareIoData","UNK_TYPE1","",0x8), + 0x801D03A4:("sPlayerFormOcarinaInstruments","UNK_TYPE1","",0x1), 0x801D03A8:("D_801D03A8","UNK_TYPE1","",0x1), - 0x801D03C8:("D_801D03C8","UNK_TYPE1","",0x1), - 0x801D03E8:("D_801D03E8","UNK_TYPE1","",0x1), - 0x801D03F0:("D_801D03F0","UNK_TYPE1","",0x1), - 0x801D0408:("D_801D0408","UNK_TYPE1","",0x1), - 0x801D0428:("D_801D0428","UNK_TYPE1","",0x1), - 0x801D045A:("D_801D045A","UNK_TYPE1","",0x1), - 0x801D0462:("D_801D0462","UNK_TYPE1","",0x1), + 0x801D03C8:("sTextboxXPositions","UNK_TYPE1","",0x20), + 0x801D03E8:("sTextboxLowerYPositions","UNK_TYPE1","",0x20), + 0x801D0408:("sTextboxUpperYPositions","UNK_TYPE1","",0x1), + 0x801D0428:("sTextboxMidYPositions","UNK_TYPE1","",0x1), + 0x801D0448:("D_801D0448","s16","[10]",0x14), + 0x801D045C:("D_801D045C","s16","[3]",0x8), + 0x801D0464:("D_801D0464","s16","[2]",0x4), 0x801D0468:("D_801D0468","UNK_TYPE1","",0x1), 0x801D0470:("sNESFontWidths","UNK_TYPE1","",0x1), 0x801D06F0:("sRupeesTextLocalization","char","[]",0x18), - 0x801D0708:("D_801D0708","char","[]",1), 0x801D0710:("sRupeesTextLength","UNK_TYPE1","",0x1), - 0x801D0714:("D_801D0714","char","[]",0x1), - 0x801D0724:("D_801D0724","char","[]",0x1), - 0x801D0730:("D_801D0730","char","[]",0x1), - 0x801D0734:("D_801D0734","char","[]",0x1), - 0x801D0740:("D_801D0740","char","[]",0x1), - 0x801D0744:("D_801D0744","char","[]",0x1), - 0x801D0760:("D_801D0760","char","[]",0x1), - 0x801D0764:("D_801D0764","char","[]",0x1), - 0x801D0770:("D_801D0770","char","[]",0x1), - 0x801D0774:("D_801D0774","char","[]",0x1), - 0x801D0780:("D_801D0780","char","[]",0x1), - 0x801D0784:("D_801D0784","char","[]",0x1), - 0x801D0794:("D_801D0794","char","[]",0x1), - 0x801D07A4:("D_801D07A4","char","[]",0x1), - 0x801D07B0:("D_801D07B0","char","[]",0x1), - 0x801D07B4:("D_801D07B4","char","[]",0x1), - 0x801D07C0:("D_801D07C0","char","[]",0x1), - 0x801D07C4:("D_801D07C4","UNK_TYPE1","",0x1), + 0x801D0714:("sOwlWarpTextENG","char","[]",0xB0), + 0x801D07C4:("sOwlWarpTextLengthENG","UNK_TYPE1","",0x16), 0x801D07DC:("D_801D07DC","UNK_TYPE1","",0x1), 0x801D080C:("D_801D080C","UNK_TYPE1","",0x1), 0x801D083C:("D_801D083C","UNK_TYPE1","",0x1), @@ -2090,6 +2059,7 @@ 0x801D08E4:("D_801D08E4","UNK_TYPE1","",0x1), 0x801D08E8:("sMaskCodeTextENG","UNK_TYPE1","",0x1), 0x801D0900:("sMaskCodeTextLengthENG","UNK_TYPE1","",0x1), + 0x801D0910:("sCreditsFontWidths","f32","[]",0x1), 0x801D0B50:("Player_InitVars","ActorInit","",0x20), 0x801D0B70:("gKaleidoMgrOverlayTable","KaleidoMgrOverlay","",0x38), 0x801D0BA8:("sKaleidoAreaPtr","void*","",0x4), @@ -3982,21 +3952,21 @@ 0x801F6AE0:("sSkyboxDrawMatrix","Mtx*","",0x4), 0x801F6AF0:("D_801F6AF0","UNK_TYPE1","",0x1), 0x801F6AF2:("D_801F6AF2","UNK_TYPE1","",0x1), - 0x801F6B00:("D_801F6B00","UNK_TYPE4","",0x4), - 0x801F6B04:("D_801F6B04","UNK_TYPE4","",0x4), + 0x801F6B00:("sCharTexSize","UNK_TYPE4","",0x4), + 0x801F6B04:("sCharTexScale","UNK_TYPE4","",0x4), 0x801F6B08:("D_801F6B08","UNK_TYPE4","",0x4), - 0x801F6B0C:("D_801F6B0C","UNK_TYPE1","",0x1), - 0x801F6B0E:("D_801F6B0E","UNK_TYPE1","",0x1), - 0x801F6B10:("D_801F6B10","UNK_TYPE1","",0x1), - 0x801F6B12:("D_801F6B12","UNK_TYPE1","",0x1), - 0x801F6B14:("D_801F6B14","UNK_TYPE1","",0x1), - 0x801F6B16:("D_801F6B16","UNK_TYPE1","",0x1), - 0x801F6B18:("D_801F6B18","UNK_TYPE1","",0x1), - 0x801F6B1A:("D_801F6B1A","UNK_TYPE1","",0x1), - 0x801F6B1C:("D_801F6B1C","UNK_TYPE1","",0x1), - 0x801F6B1E:("D_801F6B1E","UNK_TYPE1","",0x1), - 0x801F6B20:("D_801F6B20","UNK_TYPE1","",0x1), - 0x801F6B22:("D_801F6B22","UNK_TYPE1","",0x1), + 0x801F6B0C:("sOcarinaButtonAPrimR","UNK_TYPE1","",0x1), + 0x801F6B0E:("sOcarinaButtonAPrimB","UNK_TYPE1","",0x1), + 0x801F6B10:("sOcarinaButtonAPrimG","UNK_TYPE1","",0x1), + 0x801F6B12:("sOcarinaButtonAEnvR","UNK_TYPE1","",0x1), + 0x801F6B14:("sOcarinaButtonAEnvB","UNK_TYPE1","",0x1), + 0x801F6B16:("sOcarinaButtonAEnvG","UNK_TYPE1","",0x1), + 0x801F6B18:("sOcarinaButtonCPrimR","UNK_TYPE1","",0x1), + 0x801F6B1A:("sOcarinaButtonCPrimB","UNK_TYPE1","",0x1), + 0x801F6B1C:("sOcarinaButtonCPrimG","UNK_TYPE1","",0x1), + 0x801F6B1E:("sOcarinaButtonCEnvR","UNK_TYPE1","",0x1), + 0x801F6B20:("sOcarinaButtonCEnvB","UNK_TYPE1","",0x1), + 0x801F6B22:("sOcarinaButtonCEnvG","UNK_TYPE1","",0x1), 0x801F6B30:("sPlayerCallInitFunc","UNK_TYPE1","",0x1), 0x801F6B34:("sPlayerCallDestroyFunc","UNK_TYPE1","",0x1), 0x801F6B38:("sPlayerCallUpdateFunc","UNK_TYPE1","",0x1), @@ -15291,7 +15261,7 @@ 0x80BA50BC:("D_80BA50BC","UNK_TYPE1","",0x1), 0x80BA50DC:("D_80BA50DC","UNK_TYPE1","",0x1), 0x80BA510C:("D_80BA510C","UNK_TYPE1","",0x1), - 0x80BA5120:("D_80BA5120","UNK_TYPE2","",0x2), + 0x80BA5120:("sOcarinaActionWindFishPrompts","UNK_TYPE2","",0x2), 0x80BA5128:("D_80BA5128","UNK_TYPE1","",0x1), 0x80BA512C:("D_80BA512C","UNK_PTR","",0x4), 0x80BA5174:("D_80BA5174","UNK_PTR","",0x4), diff --git a/tools/namefixer.py b/tools/namefixer.py index 7fb2fe912..43e554975 100755 --- a/tools/namefixer.py +++ b/tools/namefixer.py @@ -1104,7 +1104,7 @@ wordReplace = { "play->msgCtx.unk12023": "play->msgCtx.stateTimer", "play->msgCtx.unk1202A": "play->msgCtx.ocarinaMode", "play->msgCtx.unk1202C": "play->msgCtx.ocarinaAction", - "play->msgCtx.unk12048": "play->msgCtx.lastOcarinaButtonIndex", + "play->msgCtx.unk12048": "play->msgCtx.ocarinaButtonIndex", "play->msgCtx.unk120B0": "play->msgCtx.ocarinaSongEffectActive", "play->msgCtx.unk12046": "play->msgCtx.blockSunsSong", "play->msgCtx.unk12090": "play->msgCtx.textIsCredits", diff --git a/tools/sizes/code_functions.csv b/tools/sizes/code_functions.csv index 3e6042f03..762334814 100644 --- a/tools/sizes/code_functions.csv +++ b/tools/sizes/code_functions.csv @@ -2334,59 +2334,59 @@ asm/non_matchings/code/z_sram_NES/Sram_UpdateWriteToFlashOwlSave.s,Sram_UpdateWr asm/non_matchings/code/z_sram_NES/func_80147314.s,func_80147314,0x80147314,0x40 asm/non_matchings/code/z_sram_NES/func_80147414.s,func_80147414,0x80147414,0x3E asm/non_matchings/code/z_sram_NES/Sram_nop8014750C.s,Sram_nop8014750C,0x8014750C,0x5 -asm/non_matchings/code/z_message/func_80147520.s,func_80147520,0x80147520,0x11 -asm/non_matchings/code/z_message/func_80147564.s,func_80147564,0x80147564,0x30 +asm/non_matchings/code/z_message/Message_ResetOcarinaButtonAlphas.s,Message_ResetOcarinaButtonAlphas,0x80147520,0x11 +asm/non_matchings/code/z_message/Message_ResetOcarinaButtonState.s,Message_ResetOcarinaButtonState,0x80147564,0x30 asm/non_matchings/code/z_message/Message_ShouldAdvance.s,Message_ShouldAdvance,0x80147624,0x44 asm/non_matchings/code/z_message/Message_ShouldAdvanceSilent.s,Message_ShouldAdvanceSilent,0x80147734,0x20 asm/non_matchings/code/z_message/Message_CloseTextbox.s,Message_CloseTextbox,0x801477B4,0x19 -asm/non_matchings/code/z_message/func_80147818.s,func_80147818,0x80147818,0x1C0 +asm/non_matchings/code/z_message/Message_DrawTextboxIcon.s,Message_DrawTextboxIcon,0x80147818,0x1C0 asm/non_matchings/code/z_message/func_80147F18.s,func_80147F18,0x80147F18,0x190 asm/non_matchings/code/z_message/func_80148558.s,func_80148558,0x80148558,0x190 -asm/non_matchings/code/z_message/func_80148B98.s,func_80148B98,0x80148B98,0x49 +asm/non_matchings/code/z_message/Message_HandleChoiceSelection.s,Message_HandleChoiceSelection,0x80148B98,0x49 asm/non_matchings/code/z_message/func_80148CBC.s,func_80148CBC,0x80148CBC,0x2A asm/non_matchings/code/z_message/func_80148D64.s,func_80148D64,0x80148D64,0xB9 asm/non_matchings/code/z_message/func_80149048.s,func_80149048,0x80149048,0x65 asm/non_matchings/code/z_message/func_801491DC.s,func_801491DC,0x801491DC,0x9E asm/non_matchings/code/z_message/func_80149454.s,func_80149454,0x80149454,0x9D asm/non_matchings/code/z_message/func_801496C8.s,func_801496C8,0x801496C8,0xA5 -asm/non_matchings/code/z_message/func_8014995C.s,func_8014995C,0x8014995C,0xAF -asm/non_matchings/code/z_message/Message_DrawItemIcon.s,Message_DrawItemIcon,0x80149C18,0xA9 +asm/non_matchings/code/z_message/Message_DrawTextChar.s,Message_DrawTextChar,0x8014995C,0xAF +asm/non_matchings/code/z_message/Message_GrowTextbox.s,Message_GrowTextbox,0x80149C18,0xA9 asm/non_matchings/code/z_message/Message_FindMessage.s,Message_FindMessage,0x80149EBC,0x2E asm/non_matchings/code/z_message/Message_DrawItemIcon.s,Message_DrawItemIcon,0x80149F74,0x2D7 -asm/non_matchings/code/z_message/func_8014AAD0.s,func_8014AAD0,0x8014AAD0,0xBB -asm/non_matchings/code/z_message/func_8014ADBC.s,func_8014ADBC,0x8014ADBC,0x654 -asm/non_matchings/code/z_message/func_8014C70C.s,func_8014C70C,0x8014C70C,0x142 +asm/non_matchings/code/z_message/Message_HandleOcarina.s,Message_HandleOcarina,0x8014AAD0,0xBB +asm/non_matchings/code/z_message/Message_DrawTextDefault.s,Message_DrawTextDefault,0x8014ADBC,0x654 +asm/non_matchings/code/z_message/Message_LoadItemIcon.s,Message_LoadItemIcon,0x8014C70C,0x142 asm/non_matchings/code/z_message/Message_LoadChar.s,Message_LoadChar,0x8014CC14,0x28 asm/non_matchings/code/z_message/func_8014CCB4.s,func_8014CCB4,0x8014CCB4,0x4F -asm/non_matchings/code/z_message/func_8014CDF0.s,func_8014CDF0,0x8014CDF0,0x7B +asm/non_matchings/code/z_message/Message_GetTimerDigits.s,Message_GetTimerDigits,0x8014CDF0,0x7B asm/non_matchings/code/z_message/Message_SetupLoadItemIcon.s,Message_SetupLoadItemIcon,0x8014CFDC,0xCA -asm/non_matchings/code/z_message/func_8014D304.s,func_8014D304,0x8014D304,0xCA -asm/non_matchings/code/z_message/func_8014D62C.s,func_8014D62C,0x8014D62C,0x62 -asm/non_matchings/code/z_message/func_8014D7B4.s,func_8014D7B4,0x8014D7B4,0xCB4 +asm/non_matchings/code/z_message/Message_LoadTime.s,Message_LoadTime,0x8014D304,0xCA +asm/non_matchings/code/z_message/Message_LoadOwlWarpText.s,Message_LoadOwlWarpText,0x8014D62C,0x62 +asm/non_matchings/code/z_message/Message_Decode.s,Message_Decode,0x8014D7B4,0xCB4 asm/non_matchings/code/z_message/func_80150A84.s,func_80150A84,0x80150A84,0xA1 -asm/non_matchings/code/z_message/func_80150D08.s,func_80150D08,0x80150D08,0x1EA +asm/non_matchings/code/z_message/Message_OpenText.s,Message_OpenText,0x80150D08,0x1EA asm/non_matchings/code/z_message/func_801514B0.s,func_801514B0,0x801514B0,0x100 asm/non_matchings/code/z_message/Message_StartTextbox.s,Message_StartTextbox,0x801518B0,0x22 asm/non_matchings/code/z_message/Message_ContinueTextbox.s,Message_ContinueTextbox,0x80151938,0x4C -asm/non_matchings/code/z_message/func_80151A68.s,func_80151A68,0x80151A68,0x53 +asm/non_matchings/code/z_message/Message_DisplaySceneTitleCard.s,Message_DisplaySceneTitleCard,0x80151A68,0x53 asm/non_matchings/code/z_message/Message_BombersNotebookQueueEvent.s,Message_BombersNotebookQueueEvent,0x80151BB4,0x3A -asm/non_matchings/code/z_message/func_80151C9C.s,func_80151C9C,0x80151C9C,0x42 -asm/non_matchings/code/z_message/func_80151DA4.s,func_80151DA4,0x80151DA4,0x1A4 -asm/non_matchings/code/z_message/func_80152434.s,func_80152434,0x80152434,0xC -asm/non_matchings/code/z_message/func_80152464.s,func_80152464,0x80152464,0xD +asm/non_matchings/code/z_message/Message_BombersNotebookProcessEventQueue.s,func_80151C9C,0x80151C9C,0x42 +asm/non_matchings/code/z_message/Message_DisplayOcarinaStaffImpl.s,Message_DisplayOcarinaStaffImpl,0x80151DA4,0x1A4 +asm/non_matchings/code/z_message/Message_DisplayOcarinaStaff.s,Message_DisplayOcarinaStaff,0x80152434,0xC +asm/non_matchings/code/z_message/Message_DisplayOcarinaStaffBlockSunsSong.s,Message_DisplayOcarinaStaffBlockSunsSong,0x80152464,0xD asm/non_matchings/code/z_message/Message_GetState.s,Message_GetState,0x80152498,0x7D -asm/non_matchings/code/z_message/func_8015268C.s,func_8015268C,0x8015268C,0x176 -asm/non_matchings/code/z_message/func_80152C64.s,func_80152C64,0x80152C64,0x12 +asm/non_matchings/code/z_message/Message_DrawTextBox.s,Message_DrawTextBox,0x8015268C,0x176 +asm/non_matchings/code/z_message/Message_SetView.s,Message_SetView,0x80152C64,0x12 asm/non_matchings/code/z_message/func_80152CAC.s,func_80152CAC,0x80152CAC,0x85 -asm/non_matchings/code/z_message/func_80152EC0.s,func_80152EC0,0x80152EC0,0x3E -asm/non_matchings/code/z_message/func_80152FB8.s,func_80152FB8,0x80152FB8,0x1E6 -asm/non_matchings/code/z_message/func_80153750.s,func_80153750,0x80153750,0x1CB -asm/non_matchings/code/z_message/func_80153E7C.s,func_80153E7C,0x80153E7C,0x1D -asm/non_matchings/code/z_message/func_80153EF0.s,func_80153EF0,0x80153EF0,0xB9 -asm/non_matchings/code/z_message/func_801541D4.s,func_801541D4,0x801541D4,0x961 +asm/non_matchings/code/z_message/Message_SpawnSongEffect.s,Message_SpawnSongEffect,0x80152EC0,0x3E +asm/non_matchings/code/z_message/Message_FlashOcarinaButtons.s,Message_FlashOcarinaButtons,0x80152FB8,0x1E6 +asm/non_matchings/code/z_message/Message_DrawOcarinaButtons.s,Message_DrawOcarinaButtons,0x80153750,0x1CB +asm/non_matchings/code/z_message/Message_DrawText.s,Message_DrawText,0x80153E7C,0x1D +asm/non_matchings/code/z_message/Message_DrawSceneTitleCard.s,Message_DrawSceneTitleCard,0x80153EF0,0xB9 +asm/non_matchings/code/z_message/Message_DrawMain.s,Message_DrawMain,0x801541D4,0x961 asm/non_matchings/code/z_message/Message_Draw.s,Message_Draw,0x80156758,0x2D asm/non_matchings/code/z_message/Message_Update.s,Message_Update,0x8015680C,0x7A6 -asm/non_matchings/code/z_message/func_801586A4.s,func_801586A4,0x801586A4,0xC +asm/non_matchings/code/z_message/Message_SetTables.s,Message_SetTables,0x801586A4,0xC asm/non_matchings/code/z_message/Message_Init.s,Message_Init,0x801586D4,0x7F asm/non_matchings/code/z_message_nes/Message_FindMessageNES.s,Message_FindMessageNES,0x801588D0,0x2E asm/non_matchings/code/z_message_nes/Message_LoadCharNES.s,Message_LoadCharNES,0x80158988,0x27 @@ -2395,12 +2395,12 @@ asm/non_matchings/code/z_message_nes/Message_LoadLocalizedRupeesNES.s,Message_Lo asm/non_matchings/code/z_message_nes/Message_LoadRupeesNES.s,Message_LoadRupeesNES,0x80158D98,0x86 asm/non_matchings/code/z_message_nes/Message_LoadTimeNES.s,Message_LoadTimeNES,0x80158FB0,0xAF asm/non_matchings/code/z_message_nes/Message_LoadOwlWarpTextNES.s,Message_LoadOwlWarpTextNES,0x8015926C,0x73 -asm/non_matchings/code/z_message_nes/func_80159438.s,func_80159438,0x80159438,0x8D -asm/non_matchings/code/z_message_nes/func_8015966C.s,func_8015966C,0x8015966C,0x6CB -asm/non_matchings/code/z_message_nes/func_8015B198.s,func_8015B198,0x8015B198,0xD6E +asm/non_matchings/code/z_message_nes/Message_GetTimerDigitsNES.s,Message_GetTimerDigitsNES,0x80159438,0x8D +asm/non_matchings/code/z_message_nes/Message_DrawTextNES.s,Message_DrawTextNES,0x8015966C,0x6CB +asm/non_matchings/code/z_message_nes/Message_DecodeNES.s,Message_DecodeNES,0x8015B198,0xD6E asm/non_matchings/code/z_message_staff/Message_FindCreditsMessage.s,Message_FindCreditsMessage,0x8015E750,0x27 -asm/non_matchings/code/z_message_staff/func_8015E7EC.s,func_8015E7EC,0x8015E7EC,0x42F -asm/non_matchings/code/z_message_staff/func_8015F8A8.s,func_8015F8A8,0x8015F8A8,0x47A +asm/non_matchings/code/z_message_staff/Message_DrawTextCredits.s,Message_DrawTextCredits,0x8015E7EC,0x42F +asm/non_matchings/code/z_message_staff/Message_DecodeCredits.s,Message_DecodeCredits,0x8015F8A8,0x47A asm/non_matchings/code/z_player_call/PlayerCall_InitFuncPtrs.s,PlayerCall_InitFuncPtrs,0x80160A90,0x1A asm/non_matchings/code/z_player_call/PlayerCall_Init.s,PlayerCall_Init,0x80160AF8,0x12 asm/non_matchings/code/z_player_call/PlayerCall_Destroy.s,PlayerCall_Destroy,0x80160B40,0x10 From d635b81ee6f952fd8ec5c997912d5f0fb69e8a43 Mon Sep 17 00:00:00 2001 From: MegaIDK <125525714+MegaIDK@users.noreply.github.com> Date: Tue, 3 Oct 2023 23:31:06 -0300 Subject: [PATCH 15/16] document object_kanban (cuttable sign) (#1364) * initial commit of doc * comment * model and material * indeed c file exists * renamed confusing stuff * space Co-authored-by: engineer124 <47598039+engineer124@users.noreply.github.com> --------- Co-authored-by: engineer124 <47598039+engineer124@users.noreply.github.com> --- assets/xml/objects/object_kanban.xml | 29 ++++---- .../actors/ovl_En_Kanban/z_en_kanban.c | 73 +++++++++++-------- .../actors/ovl_En_Kanban/z_en_kanban.h | 42 +++++------ 3 files changed, 77 insertions(+), 67 deletions(-) diff --git a/assets/xml/objects/object_kanban.xml b/assets/xml/objects/object_kanban.xml index c52be1022..e5baa90ee 100644 --- a/assets/xml/objects/object_kanban.xml +++ b/assets/xml/objects/object_kanban.xml @@ -1,18 +1,19 @@  + - - - - - - - - - - - - - - + + + + + + + + + + + + + + diff --git a/src/overlays/actors/ovl_En_Kanban/z_en_kanban.c b/src/overlays/actors/ovl_En_Kanban/z_en_kanban.c index 4a95c525d..cd34383be 100644 --- a/src/overlays/actors/ovl_En_Kanban/z_en_kanban.c +++ b/src/overlays/actors/ovl_En_Kanban/z_en_kanban.c @@ -50,8 +50,9 @@ static ColliderCylinderInit sCylinderInit = { }; static u16 sPartFlags[] = { - PART_UPPER_LEFT, PART_LEFT_UPPER, PART_LEFT_LOWER, PART_RIGHT_UPPER, PART_RIGHT_LOWER, PART_LOWER_LEFT, - PART_UPPER_RIGHT, PART_LOWER_RIGHT, PART_POST_UPPER, PART_POST_LOWER, PART_POST_STAND, + PART_UPPER_SIDE_LEFT, PART_LEFT_SIDE_UPPER, PART_LEFT_SIDE_LOWER, PART_RIGHT_SIDE_UPPER, + PART_RIGHT_SIDE_LOWER, PART_LOWER_SIDE_LEFT, PART_UPPER_SIDE_RIGHT, PART_LOWER_SIDE_RIGHT, + PART_POST_UPPER, PART_POST_LOWER, PART_POST_STAND, }; static Vec3f sPieceOffsets[] = { @@ -289,40 +290,48 @@ void EnKanban_Update(Actor* thisx, PlayState* play) { this->zTargetTimer = 10; } - if ((piece->partFlags & PART_UPPER_LEFT) && (piece->partFlags & PART_LOWER_RIGHT)) { + if ((piece->partFlags & PART_UPPER_SIDE_LEFT) && (piece->partFlags & PART_LOWER_SIDE_RIGHT)) { piece->pieceType = PIECE_WHOLE_SIGN; - } else if ((piece->partFlags & PART_LEFT_UPPER) && (piece->partFlags & PART_RIGHT_UPPER)) { + } else if ((piece->partFlags & PART_LEFT_SIDE_UPPER) && + (piece->partFlags & PART_RIGHT_SIDE_UPPER)) { piece->pieceType = PIECE_UPPER_HALF; - } else if ((piece->partFlags & PART_LEFT_LOWER) && (piece->partFlags & PART_RIGHT_LOWER)) { + } else if ((piece->partFlags & PART_LEFT_SIDE_LOWER) && + (piece->partFlags & PART_RIGHT_SIDE_LOWER)) { piece->pieceType = PIECE_LOWER_HALF; - } else if ((piece->partFlags & PART_UPPER_RIGHT) && (piece->partFlags & PART_LOWER_RIGHT)) { + } else if ((piece->partFlags & PART_UPPER_SIDE_RIGHT) && + (piece->partFlags & PART_LOWER_SIDE_RIGHT)) { piece->pieceType = PIECE_RIGHT_HALF; - } else if ((piece->partFlags & PART_UPPER_LEFT) && (piece->partFlags & PART_LOWER_LEFT)) { + } else if ((piece->partFlags & PART_UPPER_SIDE_LEFT) && + (piece->partFlags & PART_LOWER_SIDE_LEFT)) { piece->pieceType = PIECE_LEFT_HALF; - } else if ((piece->partFlags & PART_UPPER_LEFT) && (piece->partFlags & PART_LEFT_UPPER)) { + } else if ((piece->partFlags & PART_UPPER_SIDE_LEFT) && + (piece->partFlags & PART_LEFT_SIDE_UPPER)) { piece->pieceType = PIECE_2ND_QUAD; - } else if ((piece->partFlags & PART_UPPER_RIGHT) && (piece->partFlags & PART_RIGHT_UPPER)) { + } else if ((piece->partFlags & PART_UPPER_SIDE_RIGHT) && + (piece->partFlags & PART_RIGHT_SIDE_UPPER)) { piece->pieceType = PIECE_1ST_QUAD; - } else if ((piece->partFlags & PART_LEFT_LOWER) && (piece->partFlags & PART_LOWER_LEFT)) { + } else if ((piece->partFlags & PART_LEFT_SIDE_LOWER) && + (piece->partFlags & PART_LOWER_SIDE_LEFT)) { piece->pieceType = PIECE_3RD_QUAD; - } else if ((piece->partFlags & PART_RIGHT_LOWER) && (piece->partFlags & PART_LOWER_RIGHT)) { + } else if ((piece->partFlags & PART_RIGHT_SIDE_LOWER) && + (piece->partFlags & PART_LOWER_SIDE_RIGHT)) { piece->pieceType = PIECE_4TH_QUAD; - } else if (piece->partFlags & PART_UPPER_LEFT) { - piece->pieceType = PIECE_UPPER_LEFT; - } else if (piece->partFlags & PART_LEFT_UPPER) { - piece->pieceType = PIECE_LEFT_UPPER; - } else if (piece->partFlags & PART_LEFT_LOWER) { - piece->pieceType = PIECE_LEFT_LOWER; - } else if (piece->partFlags & PART_LOWER_LEFT) { - piece->pieceType = PIECE_LOWER_LEFT; - } else if (piece->partFlags & PART_UPPER_RIGHT) { - piece->pieceType = PIECE_UPPER_RIGHT; - } else if (piece->partFlags & PART_RIGHT_UPPER) { - piece->pieceType = PIECE_RIGHT_UPPER; - } else if (piece->partFlags & PART_RIGHT_LOWER) { - piece->pieceType = PIECE_RIGHT_LOWER; - } else if (piece->partFlags & PART_LOWER_RIGHT) { - piece->pieceType = PIECE_LOWER_RIGHT; + } else if (piece->partFlags & PART_UPPER_SIDE_LEFT) { + piece->pieceType = PIECE_UPPER_SIDE_LEFT; + } else if (piece->partFlags & PART_LEFT_SIDE_UPPER) { + piece->pieceType = PIECE_LEFT_SIDE_UPPER; + } else if (piece->partFlags & PART_LEFT_SIDE_LOWER) { + piece->pieceType = PIECE_LEFT_SIDE_LOWER; + } else if (piece->partFlags & PART_LOWER_SIDE_LEFT) { + piece->pieceType = PIECE_LOWER_SIDE_LEFT; + } else if (piece->partFlags & PART_UPPER_SIDE_RIGHT) { + piece->pieceType = PIECE_UPPER_SIDE_RIGHT; + } else if (piece->partFlags & PART_RIGHT_SIDE_UPPER) { + piece->pieceType = PIECE_RIGHT_SIDE_UPPER; + } else if (piece->partFlags & PART_RIGHT_SIDE_LOWER) { + piece->pieceType = PIECE_RIGHT_SIDE_LOWER; + } else if (piece->partFlags & PART_LOWER_SIDE_RIGHT) { + piece->pieceType = PIECE_LOWER_SIDE_RIGHT; } else if (piece->partFlags & PART_POST_UPPER) { piece->pieceType = PIECE_POST_UPPER; } else if (piece->partFlags & PART_POST_LOWER) { @@ -891,9 +900,9 @@ void EnKanban_Update(Actor* thisx, PlayState* play) { } static Gfx* sDisplayLists[] = { - object_kanban_DL_000CB0, object_kanban_DL_000DB8, object_kanban_DL_000E78, object_kanban_DL_000F38, - object_kanban_DL_000FF8, object_kanban_DL_0010B8, object_kanban_DL_0011C0, object_kanban_DL_0012C8, - object_kanban_DL_0013D0, object_kanban_DL_001488, object_kanban_DL_001540, + gSignUpperSideLeftModelDL, gSignLeftSideUpperModelDL, gSignLeftSideLowerModelDL, gSignRightSideUpperModelDL, + gSignRightSideLowerModelDL, gSignLowerSideLeftModelDL, gSignUpperSideRightModelDL, gSignLowerSideRightModelDL, + gSignPostUpperModelDL, gSignPostLowerModelDL, gSignPostStandModelDL, }; #include "z_en_kanban_gfx.c" @@ -924,7 +933,7 @@ void EnKanban_Draw(Actor* thisx, PlayState* play) { Gfx_SetupDL25_Opa(play->state.gfxCtx); Gfx_SetupDL25_Xlu(play->state.gfxCtx); - gSPDisplayList(POLY_OPA_DISP++, object_kanban_DL_000C30); + gSPDisplayList(POLY_OPA_DISP++, gSignMaterialDL); if (this->actionState != ENKANBAN_SIGN) { Matrix_Translate(this->actor.world.pos.x, this->actor.world.pos.y, this->actor.world.pos.z, MTXMODE_NEW); @@ -983,7 +992,7 @@ void EnKanban_Draw(Actor* thisx, PlayState* play) { gDPSetPrimColor(POLY_XLU_DISP++, 0x00, 0x00, 255, 255, 255, this->cutMarkAlpha); gDPSetEnvColor(POLY_XLU_DISP++, 255, 255, 150, 0); gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); - gSPDisplayList(POLY_XLU_DISP++, object_kanban_DL_001630); + gSPDisplayList(POLY_XLU_DISP++, gSignParticleDL); } } diff --git a/src/overlays/actors/ovl_En_Kanban/z_en_kanban.h b/src/overlays/actors/ovl_En_Kanban/z_en_kanban.h index e54bb3fad..43b3b61fb 100644 --- a/src/overlays/actors/ovl_En_Kanban/z_en_kanban.h +++ b/src/overlays/actors/ovl_En_Kanban/z_en_kanban.h @@ -5,22 +5,22 @@ struct EnKanban; -#define PART_UPPER_LEFT (1 << 0) -#define PART_LEFT_UPPER (1 << 1) -#define PART_LEFT_LOWER (1 << 2) -#define PART_RIGHT_UPPER (1 << 3) -#define PART_RIGHT_LOWER (1 << 4) -#define PART_LOWER_LEFT (1 << 5) -#define PART_UPPER_RIGHT (1 << 6) -#define PART_LOWER_RIGHT (1 << 7) +#define PART_UPPER_SIDE_LEFT (1 << 0) +#define PART_LEFT_SIDE_UPPER (1 << 1) +#define PART_LEFT_SIDE_LOWER (1 << 2) +#define PART_RIGHT_SIDE_UPPER (1 << 3) +#define PART_RIGHT_SIDE_LOWER (1 << 4) +#define PART_LOWER_SIDE_LEFT (1 << 5) +#define PART_UPPER_SIDE_RIGHT (1 << 6) +#define PART_LOWER_SIDE_RIGHT (1 << 7) #define PART_POST_UPPER (1 << 8) #define PART_POST_LOWER (1 << 9) #define PART_POST_STAND (1 << 10) -#define LEFT_HALF (PART_UPPER_LEFT | PART_LEFT_UPPER | PART_LEFT_LOWER | PART_LOWER_LEFT) -#define RIGHT_HALF (PART_UPPER_RIGHT | PART_RIGHT_UPPER | PART_RIGHT_LOWER | PART_LOWER_RIGHT) -#define UPPER_HALF (PART_POST_UPPER | PART_UPPER_RIGHT | PART_RIGHT_UPPER | PART_UPPER_LEFT | PART_LEFT_UPPER) -#define UPPERLEFT_HALF (PART_POST_UPPER | PART_UPPER_RIGHT | PART_LEFT_LOWER | PART_UPPER_LEFT | PART_LEFT_UPPER) -#define UPPERRIGHT_HALF (PART_POST_UPPER | PART_UPPER_RIGHT | PART_RIGHT_UPPER | PART_UPPER_LEFT | PART_RIGHT_LOWER) +#define LEFT_HALF (PART_UPPER_SIDE_LEFT | PART_LEFT_SIDE_UPPER | PART_LEFT_SIDE_LOWER | PART_LOWER_SIDE_LEFT) +#define RIGHT_HALF (PART_UPPER_SIDE_RIGHT | PART_RIGHT_SIDE_UPPER | PART_RIGHT_SIDE_LOWER | PART_LOWER_SIDE_RIGHT) +#define UPPER_HALF (PART_POST_UPPER | PART_UPPER_SIDE_RIGHT | PART_RIGHT_SIDE_UPPER | PART_UPPER_SIDE_LEFT | PART_LEFT_SIDE_UPPER) +#define UPPERLEFT_HALF (PART_POST_UPPER | PART_UPPER_SIDE_RIGHT | PART_LEFT_SIDE_LOWER | PART_UPPER_SIDE_LEFT | PART_LEFT_SIDE_UPPER) +#define UPPERRIGHT_HALF (PART_POST_UPPER | PART_UPPER_SIDE_RIGHT | PART_RIGHT_SIDE_UPPER | PART_UPPER_SIDE_LEFT | PART_RIGHT_SIDE_LOWER) #define ALL_PARTS (LEFT_HALF | RIGHT_HALF | PART_POST_UPPER | PART_POST_LOWER) typedef enum { @@ -42,14 +42,14 @@ typedef enum { /* 6 */ PIECE_1ST_QUAD, /* 7 */ PIECE_3RD_QUAD, /* 8 */ PIECE_4TH_QUAD, - /* 9 */ PIECE_UPPER_LEFT, - /* 10 */ PIECE_LEFT_UPPER, - /* 11 */ PIECE_LEFT_LOWER, - /* 12 */ PIECE_LOWER_LEFT, - /* 13 */ PIECE_UPPER_RIGHT, - /* 14 */ PIECE_RIGHT_UPPER, - /* 15 */ PIECE_RIGHT_LOWER, - /* 16 */ PIECE_LOWER_RIGHT, + /* 9 */ PIECE_UPPER_SIDE_LEFT, + /* 10 */ PIECE_LEFT_SIDE_UPPER, + /* 11 */ PIECE_LEFT_SIDE_LOWER, + /* 12 */ PIECE_LOWER_SIDE_LEFT, + /* 13 */ PIECE_UPPER_SIDE_RIGHT, + /* 14 */ PIECE_RIGHT_SIDE_UPPER, + /* 15 */ PIECE_RIGHT_SIDE_LOWER, + /* 16 */ PIECE_LOWER_SIDE_RIGHT, /* 17 */ PIECE_POST_UPPER, /* 18 */ PIECE_POST_LOWER, /* 100 */ PIECE_OTHER = 100 From f4a490bb6a2e4d1564ed06b0ee98be274dda7b91 Mon Sep 17 00:00:00 2001 From: fig02 Date: Tue, 3 Oct 2023 23:01:04 -0400 Subject: [PATCH 16/16] Port Proposed OoT Object Docs (#1361) * port docs in z_scene * undo accidental ctrl-f * another fix * expose Object_SpawnPersistent --------- Co-authored-by: engineer124 --- include/z64object.h | 7 - include/z64scene.h | 26 +-- src/code/z_actor.c | 8 +- src/code/z_draw.c | 4 +- src/code/z_effect_soft_sprite_old_init.c | 2 +- src/code/z_en_hy_code.c | 6 +- src/code/z_en_item00.c | 12 +- src/code/z_play.c | 24 +-- src/code/z_player_lib.c | 6 +- src/code/z_scene.c | 157 ++++++++++-------- src/code/z_sub_s.c | 2 +- .../actors/ovl_Bg_Breakwall/z_bg_breakwall.c | 2 +- .../actors/ovl_Bg_Numa_Hana/z_bg_numa_hana.c | 4 +- .../actors/ovl_Bg_Umajump/z_bg_umajump.c | 2 +- src/overlays/actors/ovl_Boss_03/z_boss_03.c | 8 +- .../actors/ovl_Demo_Effect/z_demo_effect.c | 2 +- .../actors/ovl_Demo_Getitem/z_demo_getitem.c | 2 +- .../actors/ovl_Demo_Kankyo/z_demo_kankyo.c | 2 +- src/overlays/actors/ovl_Dm_An/z_dm_an.c | 12 +- .../actors/ovl_Dm_Char03/z_dm_char03.c | 2 +- .../actors/ovl_Dm_Char05/z_dm_char05.c | 10 +- src/overlays/actors/ovl_Dm_Gm/z_dm_gm.c | 12 +- src/overlays/actors/ovl_Dm_Stk/z_dm_stk.c | 18 +- .../actors/ovl_Door_Shutter/z_door_shutter.c | 2 +- .../actors/ovl_En_Bba_01/z_en_bba_01.c | 10 +- .../actors/ovl_En_Cne_01/z_en_cne_01.c | 10 +- .../actors/ovl_En_Daiku2/z_en_daiku2.c | 4 +- src/overlays/actors/ovl_En_Dnk/z_en_dnk.c | 2 +- src/overlays/actors/ovl_En_Door/z_en_door.c | 6 +- .../actors/ovl_En_Door_Etc/z_en_door_etc.c | 4 +- src/overlays/actors/ovl_En_Drs/z_en_drs.c | 4 +- .../ovl_En_Ending_Hero6/z_en_ending_hero6.c | 2 +- src/overlays/actors/ovl_En_Fall/z_en_fall.c | 8 +- src/overlays/actors/ovl_En_Geg/z_en_geg.c | 12 +- src/overlays/actors/ovl_En_GirlA/z_en_girla.c | 2 +- src/overlays/actors/ovl_En_Go/z_en_go.c | 8 +- src/overlays/actors/ovl_En_Horse/z_en_horse.c | 8 +- .../z_en_invadepoh_demo.c | 8 +- src/overlays/actors/ovl_En_Ishi/z_en_ishi.c | 2 +- src/overlays/actors/ovl_En_Kusa/z_en_kusa.c | 2 +- src/overlays/actors/ovl_En_Mag/z_en_mag.c | 2 +- src/overlays/actors/ovl_En_Nwc/z_en_nwc.c | 6 +- src/overlays/actors/ovl_En_Ossan/z_en_ossan.c | 2 +- .../actors/ovl_En_S_Goro/z_en_s_goro.c | 12 +- .../actors/ovl_En_Sekihi/z_en_sekihi.c | 2 +- src/overlays/actors/ovl_En_Sob1/z_en_sob1.c | 12 +- src/overlays/actors/ovl_En_St/z_en_st.c | 6 +- src/overlays/actors/ovl_En_Sth/z_en_sth.c | 8 +- src/overlays/actors/ovl_En_Sth2/z_en_sth2.c | 2 +- src/overlays/actors/ovl_En_Test2/z_en_test2.c | 2 +- .../actors/ovl_En_Warp_tag/z_en_warp_tag.c | 2 +- .../ovl_Item_Etcetera/z_item_etcetera.c | 2 +- .../actors/ovl_Obj_Etcetera/z_obj_etcetera.c | 2 +- .../actors/ovl_Obj_Kibako/z_obj_kibako.c | 2 +- .../actors/ovl_Obj_Nozoki/z_obj_nozoki.c | 2 +- .../actors/ovl_Obj_Purify/z_obj_purify.c | 2 +- .../actors/ovl_Obj_Pzlblock/z_obj_pzlblock.c | 2 +- .../actors/ovl_Obj_Tsubo/z_obj_tsubo.c | 2 +- .../actors/ovl_player_actor/z_player.c | 4 +- .../z_eff_en_ice_block.c | 4 +- .../ovl_Effect_Ss_D_Fire/z_eff_ss_d_fire.c | 4 +- .../ovl_Effect_Ss_Extra/z_eff_ss_extra.c | 6 +- .../ovl_Effect_Ss_Hahen/z_eff_ss_hahen.c | 6 +- .../ovl_Effect_Ss_Kakera/z_eff_ss_kakera.c | 6 +- .../ovl_Effect_Ss_Stick/z_eff_ss_stick.c | 4 +- tools/disasm/functions.txt | 8 +- tools/namefixer.py | 4 + tools/sizes/code_functions.csv | 8 +- 68 files changed, 279 insertions(+), 269 deletions(-) diff --git a/include/z64object.h b/include/z64object.h index 712826815..d547d4a9e 100644 --- a/include/z64object.h +++ b/include/z64object.h @@ -1,13 +1,6 @@ #ifndef Z64OBJECT_H #define Z64OBJECT_H -#define OBJECT_SPACE_SIZE_DEFAULT 1413120 -#define OBJECT_SPACE_SIZE_CLOCK_TOWN 1566720 -#define OBJECT_SPACE_SIZE_MILK_BAR 1617920 -#define OBJECT_SPACE_SIZE_TERMINA_FIELD 1505280 - -#define OBJECT_EXCHANGE_BANK_MAX 35 - #define DEFINE_OBJECT(_name, enumValue) enumValue, #define DEFINE_OBJECT_UNSET(enumValue) enumValue, #define DEFINE_OBJECT_SIZE_ZERO(_name, enumValue) enumValue, diff --git a/include/z64scene.h b/include/z64scene.h index e0f186cd8..b66ad4e41 100644 --- a/include/z64scene.h +++ b/include/z64scene.h @@ -74,7 +74,7 @@ typedef struct { typedef struct { /* 0x0 */ u8 code; /* 0x1 */ u8 naviQuestHintFileId; - /* 0x4 */ u32 subKeepIndex; + /* 0x4 */ u32 subKeepId; } SCmdSpecialFiles; // size = 0x8 typedef struct { @@ -415,7 +415,7 @@ typedef struct { /* 0x08 */ DmaRequest dmaReq; /* 0x28 */ OSMesgQueue loadQueue; /* 0x40 */ OSMesg loadMsg; -} ObjectStatus; // size = 0x44 +} ObjectEntry; // size = 0x44 typedef struct { /* 0x0 */ RomFile segment; @@ -475,11 +475,11 @@ typedef RoomShapeCullable PolygonType2; typedef struct { /* 0x000 */ void* spaceStart; /* 0x004 */ void* spaceEnd; - /* 0x008 */ u8 num; - /* 0x009 */ u8 spawnedObjectCount; - /* 0x00A */ u8 mainKeepIndex; - /* 0x00B */ u8 subKeepIndex; - /* 0x00C */ ObjectStatus status[OBJECT_EXCHANGE_BANK_MAX]; + /* 0x008 */ u8 numEntries; // total amount of used entries + /* 0x009 */ u8 numPersistentEntries; // amount of entries that won't be reused when loading a new object list (when loading a new room) + /* 0x00A */ u8 mainKeepSlot; // "gameplay_keep" slot + /* 0x00B */ u8 subKeepSlot; // "gameplay_field_keep" or "gameplay_dangeon_keep" slot + /* 0x00C */ ObjectEntry slots[35]; } ObjectContext; // size = 0x958 #define PATH_INDEX_NONE -1 @@ -899,13 +899,13 @@ typedef enum { #define SCENE_CMD_MISC_SETTINGS SCENE_CMD_SET_REGION_VISITED #define SCENE_CMD_CUTSCENE_LIST SCENE_CMD_CUTSCENE_SCRIPT_LIST -s32 Object_Spawn(ObjectContext* objectCtx, s16 id); -void Object_InitBank(struct GameState* gameState, ObjectContext* objectCtx); -void Object_UpdateBank(ObjectContext* objectCtx); -s32 Object_GetIndex(ObjectContext* objectCtx, s16 objectId); -s32 Object_IsLoaded(ObjectContext* objectCtx, s32 index); +s32 Object_SpawnPersistent(ObjectContext* objectCtx, s16 id); +void Object_InitContext(struct GameState* gameState, ObjectContext* objectCtx); +void Object_UpdateEntries(ObjectContext* objectCtx); +s32 Object_GetSlot(ObjectContext* objectCtx, s16 objectId); +s32 Object_IsLoaded(ObjectContext* objectCtx, s32 slot); void Object_LoadAll(ObjectContext* objectCtx); -void* func_8012F73C(ObjectContext* objectCtx, s32 iParm2, s16 id); +void* func_8012F73C(ObjectContext* objectCtx, s32 slot, s16 id); void Scene_CommandSpawnList(struct PlayState* play, SceneCmd* cmd); void Scene_CommandActorList(struct PlayState* play, SceneCmd* cmd); void Scene_CommandActorCutsceneCamList(struct PlayState* play, SceneCmd* cmd); diff --git a/src/code/z_actor.c b/src/code/z_actor.c index 10f782e25..7c741ae85 100644 --- a/src/code/z_actor.c +++ b/src/code/z_actor.c @@ -1096,7 +1096,7 @@ void Actor_SetScale(Actor* actor, f32 scale) { } void Actor_SetObjectDependency(PlayState* play, Actor* actor) { - gSegments[0x06] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[actor->objBankIndex].segment); + gSegments[0x06] = VIRTUAL_TO_PHYSICAL(play->objectCtx.slots[actor->objBankIndex].segment); } void Actor_Init(Actor* actor, PlayState* play) { @@ -2700,8 +2700,8 @@ void Actor_Draw(PlayState* play, Actor* actor) { Matrix_Scale(actor->scale.x, actor->scale.y, actor->scale.z, MTXMODE_APPLY); Actor_SetObjectDependency(play, actor); - gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.status[actor->objBankIndex].segment); - gSPSegment(POLY_XLU_DISP++, 0x06, play->objectCtx.status[actor->objBankIndex].segment); + gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.slots[actor->objBankIndex].segment); + gSPSegment(POLY_XLU_DISP++, 0x06, play->objectCtx.slots[actor->objBankIndex].segment); if (actor->colorFilterTimer != 0) { s32 colorFlag = COLORFILTER_GET_COLORFLAG(actor->colorFilterParams); @@ -3299,7 +3299,7 @@ Actor* Actor_SpawnAsChildAndCutscene(ActorContext* actorCtx, PlayState* play, s1 return NULL; } - objBankIndex = Object_GetIndex(&play->objectCtx, actorInit->objectId); + objBankIndex = Object_GetSlot(&play->objectCtx, actorInit->objectId); if ((objBankIndex < 0) || ((actorInit->type == ACTORCAT_ENEMY) && Flags_GetClear(play, play->roomCtx.curRoom.num) && (actorInit->id != ACTOR_BOSS_05))) { Actor_FreeOverlay(&gActorOverlayTable[index]); diff --git a/src/code/z_draw.c b/src/code/z_draw.c index 2a56e0ba5..3f1d1dc47 100644 --- a/src/code/z_draw.c +++ b/src/code/z_draw.c @@ -827,9 +827,9 @@ void GetItem_DrawRemains(PlayState* play, s16 drawId) { OPEN_DISPS(play->state.gfxCtx); - objectIndex = Object_GetIndex(&play->objectCtx, OBJECT_BSMASK); + objectIndex = Object_GetSlot(&play->objectCtx, OBJECT_BSMASK); - gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.status[objectIndex].segment); + gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.slots[objectIndex].segment); Gfx_SetupDL25_Opa(play->state.gfxCtx); Matrix_Scale(0.02f, 0.02f, 0.02f, MTXMODE_APPLY); diff --git a/src/code/z_effect_soft_sprite_old_init.c b/src/code/z_effect_soft_sprite_old_init.c index 63b6861a7..d71a18674 100644 --- a/src/code/z_effect_soft_sprite_old_init.c +++ b/src/code/z_effect_soft_sprite_old_init.c @@ -41,7 +41,7 @@ void EffectSs_DrawGEffect(PlayState* play, EffectSs* this, TexturePtr texture) { MtxF mfTrans11DA0; s32 pad1; Mtx* mtx; - void* object = play->objectCtx.status[this->rgObjBankIndex].segment; + void* object = play->objectCtx.slots[this->rgObjBankIndex].segment; OPEN_DISPS(gfxCtx); diff --git a/src/code/z_en_hy_code.c b/src/code/z_en_hy_code.c index e2f31c404..d64308bff 100644 --- a/src/code/z_en_hy_code.c +++ b/src/code/z_en_hy_code.c @@ -133,7 +133,7 @@ EnDoor* EnHy_FindNearestDoor(Actor* actor, PlayState* play) { } void EnHy_ChangeObjectAndAnim(EnHy* enHy, PlayState* play, s16 animIndex) { - gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[enHy->animObjIndex].segment); + gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.slots[enHy->animObjIndex].segment); EnHy_ChangeAnim(&enHy->skelAnime, animIndex); } @@ -141,7 +141,7 @@ s32 EnHy_UpdateSkelAnime(EnHy* enHy, PlayState* play) { s32 isUpdated = false; if (enHy->actor.draw != NULL) { - gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[enHy->animObjIndex].segment); + gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.slots[enHy->animObjIndex].segment); SkelAnime_Update(&enHy->skelAnime); isUpdated = true; } @@ -168,7 +168,7 @@ s32 EnHy_Init(EnHy* enHy, PlayState* play, FlexSkeletonHeader* skeletonHeaderSeg enHy->actor.objBankIndex = enHy->skelLowerObjIndex; isInitialized = true; ActorShape_Init(&enHy->actor.shape, 0.0f, NULL, 0.0f); - gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[enHy->actor.objBankIndex].segment); + gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.slots[enHy->actor.objBankIndex].segment); SkelAnime_InitFlex(play, &enHy->skelAnime, skeletonHeaderSeg, NULL, enHy->jointTable, enHy->morphTable, ENHY_LIMB_MAX); EnHy_ChangeObjectAndAnim(enHy, play, animIndex); diff --git a/src/code/z_en_item00.c b/src/code/z_en_item00.c index f9f5df5a8..c6b52e476 100644 --- a/src/code/z_en_item00.c +++ b/src/code/z_en_item00.c @@ -184,17 +184,17 @@ void EnItem00_Init(Actor* thisx, PlayState* play) { break; case ITEM00_SHIELD_HERO: - thisx->objBankIndex = Object_GetIndex(&play->objectCtx, OBJECT_GI_SHIELD_2); + thisx->objBankIndex = Object_GetSlot(&play->objectCtx, OBJECT_GI_SHIELD_2); EnItem00_SetObject(this, play, &shadowOffset, &shadowScale); break; case ITEM00_MAP: - thisx->objBankIndex = Object_GetIndex(&play->objectCtx, OBJECT_GI_MAP); + thisx->objBankIndex = Object_GetSlot(&play->objectCtx, OBJECT_GI_MAP); EnItem00_SetObject(this, play, &shadowOffset, &shadowScale); break; case ITEM00_COMPASS: - thisx->objBankIndex = Object_GetIndex(&play->objectCtx, OBJECT_GI_COMPASS); + thisx->objBankIndex = Object_GetSlot(&play->objectCtx, OBJECT_GI_COMPASS); EnItem00_SetObject(this, play, &shadowOffset, &shadowScale); break; @@ -317,7 +317,7 @@ void EnItem00_Destroy(Actor* thisx, PlayState* play) { } void EnItem00_WaitForHeartObject(EnItem00* this, PlayState* play) { - s32 objBankIndex = Object_GetIndex(&play->objectCtx, OBJECT_GI_HEARTS); + s32 objBankIndex = Object_GetSlot(&play->objectCtx, OBJECT_GI_HEARTS); if (Object_IsLoaded(&play->objectCtx, objBankIndex)) { this->actor.objBankIndex = objBankIndex; @@ -725,7 +725,7 @@ void EnItem00_Draw(Actor* thisx, PlayState* play) { case ITEM00_RECOVERY_HEART: if (this->unk152 < 0) { if (this->unk152 == -1) { - s8 bankIndex = Object_GetIndex(&play->objectCtx, OBJECT_GI_HEART); + s8 bankIndex = Object_GetSlot(&play->objectCtx, OBJECT_GI_HEART); if (Object_IsLoaded(&play->objectCtx, bankIndex)) { this->actor.objBankIndex = bankIndex; @@ -852,7 +852,7 @@ void EnItem00_DrawSprite(EnItem00* this, PlayState* play) { void EnItem00_DrawHeartContainer(EnItem00* this, PlayState* play) { s32 pad[2]; - if (Object_GetIndex(&play->objectCtx, OBJECT_GI_HEARTS) == this->actor.objBankIndex) { + if (Object_GetSlot(&play->objectCtx, OBJECT_GI_HEARTS) == this->actor.objBankIndex) { OPEN_DISPS(play->state.gfxCtx); Gfx_SetupDL25_Xlu(play->state.gfxCtx); diff --git a/src/code/z_play.c b/src/code/z_play.c index 9a5e6541d..f71cf0c0d 100644 --- a/src/code/z_play.c +++ b/src/code/z_play.c @@ -921,8 +921,8 @@ void Play_UpdateMain(PlayState* this) { u8 freezeFlashTimer; s32 sp5C = false; - gSegments[4] = VIRTUAL_TO_PHYSICAL(this->objectCtx.status[this->objectCtx.mainKeepIndex].segment); - gSegments[5] = VIRTUAL_TO_PHYSICAL(this->objectCtx.status[this->objectCtx.subKeepIndex].segment); + gSegments[4] = VIRTUAL_TO_PHYSICAL(this->objectCtx.slots[this->objectCtx.mainKeepSlot].segment); + gSegments[5] = VIRTUAL_TO_PHYSICAL(this->objectCtx.slots[this->objectCtx.subKeepSlot].segment); gSegments[2] = VIRTUAL_TO_PHYSICAL(this->sceneSegment); if (R_PICTO_PHOTO_STATE == PICTO_PHOTO_STATE_PROCESS) { @@ -972,7 +972,7 @@ void Play_UpdateMain(PlayState* this) { sp5C = (this->pauseCtx.state != 0) || (this->pauseCtx.debugEditor != DEBUG_EDITOR_NONE); AnimationContext_Reset(&this->animationCtx); - Object_UpdateBank(&this->objectCtx); + Object_UpdateEntries(&this->objectCtx); if (!sp5C && (IREG(72) == 0)) { this->gameplayFrames++; @@ -1153,17 +1153,17 @@ void Play_DrawMain(PlayState* this) { OPEN_DISPS(gfxCtx); - gSegments[4] = VIRTUAL_TO_PHYSICAL(this->objectCtx.status[this->objectCtx.mainKeepIndex].segment); - gSegments[5] = VIRTUAL_TO_PHYSICAL(this->objectCtx.status[this->objectCtx.subKeepIndex].segment); + gSegments[4] = VIRTUAL_TO_PHYSICAL(this->objectCtx.slots[this->objectCtx.mainKeepSlot].segment); + gSegments[5] = VIRTUAL_TO_PHYSICAL(this->objectCtx.slots[this->objectCtx.subKeepSlot].segment); gSegments[2] = VIRTUAL_TO_PHYSICAL(this->sceneSegment); - gSPSegment(POLY_OPA_DISP++, 0x04, this->objectCtx.status[this->objectCtx.mainKeepIndex].segment); - gSPSegment(POLY_XLU_DISP++, 0x04, this->objectCtx.status[this->objectCtx.mainKeepIndex].segment); - gSPSegment(OVERLAY_DISP++, 0x04, this->objectCtx.status[this->objectCtx.mainKeepIndex].segment); + gSPSegment(POLY_OPA_DISP++, 0x04, this->objectCtx.slots[this->objectCtx.mainKeepSlot].segment); + gSPSegment(POLY_XLU_DISP++, 0x04, this->objectCtx.slots[this->objectCtx.mainKeepSlot].segment); + gSPSegment(OVERLAY_DISP++, 0x04, this->objectCtx.slots[this->objectCtx.mainKeepSlot].segment); - gSPSegment(POLY_OPA_DISP++, 0x05, this->objectCtx.status[this->objectCtx.subKeepIndex].segment); - gSPSegment(POLY_XLU_DISP++, 0x05, this->objectCtx.status[this->objectCtx.subKeepIndex].segment); - gSPSegment(OVERLAY_DISP++, 0x05, this->objectCtx.status[this->objectCtx.subKeepIndex].segment); + gSPSegment(POLY_OPA_DISP++, 0x05, this->objectCtx.slots[this->objectCtx.subKeepSlot].segment); + gSPSegment(POLY_XLU_DISP++, 0x05, this->objectCtx.slots[this->objectCtx.subKeepSlot].segment); + gSPSegment(OVERLAY_DISP++, 0x05, this->objectCtx.slots[this->objectCtx.subKeepSlot].segment); gSPSegment(POLY_OPA_DISP++, 0x02, this->sceneSegment); gSPSegment(POLY_XLU_DISP++, 0x02, this->sceneSegment); @@ -1585,7 +1585,7 @@ void Play_InitScene(PlayState* this, s32 spawn) { this->sceneMaterialAnims = NULL; this->roomCtx.unk74 = NULL; this->numSetupActors = 0; - Object_InitBank(&this->state, &this->objectCtx); + Object_InitContext(&this->state, &this->objectCtx); LightContext_Init(this, &this->lightCtx); Door_InitContext(&this->state, &this->doorCtx); Room_Init(this, &this->roomCtx); diff --git a/src/code/z_player_lib.c b/src/code/z_player_lib.c index 24b55cfea..f288b31de 100644 --- a/src/code/z_player_lib.c +++ b/src/code/z_player_lib.c @@ -396,9 +396,9 @@ void func_8012301C(Actor* thisx, PlayState* play2) { gActorOverlayTable[ACTOR_PLAYER].initInfo->objectId = objectId; func_8012F73C(&play->objectCtx, this->actor.objBankIndex, objectId); - this->actor.objBankIndex = Object_GetIndex(&play->objectCtx, GAMEPLAY_KEEP); + this->actor.objBankIndex = Object_GetSlot(&play->objectCtx, GAMEPLAY_KEEP); } else if (this->actionVar1 >= 3) { - s32 objBankIndex = Object_GetIndex(&play->objectCtx, gActorOverlayTable[ACTOR_PLAYER].initInfo->objectId); + s32 objBankIndex = Object_GetSlot(&play->objectCtx, gActorOverlayTable[ACTOR_PLAYER].initInfo->objectId); if (Object_IsLoaded(&play->objectCtx, objBankIndex)) { this->actor.objBankIndex = objBankIndex; @@ -1869,7 +1869,7 @@ void Player_DrawHookshotReticle(PlayState* play, Player* player, f32 hookshotDis gSPMatrix(OVERLAY_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); - gSPSegment(OVERLAY_DISP++, 0x06, play->objectCtx.status[player->actor.objBankIndex].segment); + gSPSegment(OVERLAY_DISP++, 0x06, play->objectCtx.slots[player->actor.objBankIndex].segment); gSPDisplayList(OVERLAY_DISP++, gHookshotReticleDL); CLOSE_DISPS(play->state.gfxCtx); diff --git a/src/code/z_scene.c b/src/code/z_scene.c index 811853f07..d26156d58 100644 --- a/src/code/z_scene.c +++ b/src/code/z_scene.c @@ -1,28 +1,41 @@ #include "global.h" -s32 Object_Spawn(ObjectContext* objectCtx, s16 id) { +/** + * Spawn an object file of a specified ID that will persist through room changes. + * + * This waits for the file to be fully loaded, the data is available when the function returns. + * + * @return The new object slot corresponding to the requested object ID. + * + * @note This function is not meant to be called externally to spawn object files on the fly. + * When an object is spawned with this function, all objects that come before it in the entry list will be treated as + * persistent, which will likely cause either the amount of free slots or object space memory to run out. + * This function is only meant to be called internally on scene load, before the object list from any room is processed. + */ +s32 Object_SpawnPersistent(ObjectContext* objectCtx, s16 id) { size_t size; - objectCtx->status[objectCtx->num].id = id; + objectCtx->slots[objectCtx->numEntries].id = id; size = gObjectTable[id].vromEnd - gObjectTable[id].vromStart; if (1) {} if (size != 0) { - DmaMgr_SendRequest0(objectCtx->status[objectCtx->num].segment, gObjectTable[id].vromStart, size); + DmaMgr_SendRequest0(objectCtx->slots[objectCtx->numEntries].segment, gObjectTable[id].vromStart, size); } - if (objectCtx->num < OBJECT_EXCHANGE_BANK_MAX - 1) { - objectCtx->status[objectCtx->num + 1].segment = ALIGN16((u32)objectCtx->status[objectCtx->num].segment + size); + if (objectCtx->numEntries < ARRAY_COUNT(objectCtx->slots) - 1) { + objectCtx->slots[objectCtx->numEntries + 1].segment = + ALIGN16((u32)objectCtx->slots[objectCtx->numEntries].segment + size); } - objectCtx->num++; - objectCtx->spawnedObjectCount = objectCtx->num; + objectCtx->numEntries++; + objectCtx->numPersistentEntries = objectCtx->numEntries; - return objectCtx->num - 1; + return objectCtx->numEntries - 1; } -void Object_InitBank(GameState* gameState, ObjectContext* objectCtx) { +void Object_InitContext(GameState* gameState, ObjectContext* objectCtx) { PlayState* play = (PlayState*)gameState; s32 pad; u32 spaceSize; @@ -30,66 +43,66 @@ void Object_InitBank(GameState* gameState, ObjectContext* objectCtx) { if (play->sceneId == SCENE_CLOCKTOWER || play->sceneId == SCENE_TOWN || play->sceneId == SCENE_BACKTOWN || play->sceneId == SCENE_ICHIBA) { - spaceSize = OBJECT_SPACE_SIZE_CLOCK_TOWN; + spaceSize = 1530 * 1024; } else if (play->sceneId == SCENE_MILK_BAR) { - spaceSize = OBJECT_SPACE_SIZE_MILK_BAR; + spaceSize = 1580 * 1024; } else if (play->sceneId == SCENE_00KEIKOKU) { - spaceSize = OBJECT_SPACE_SIZE_TERMINA_FIELD; + spaceSize = 1470 * 1024; } else { - spaceSize = OBJECT_SPACE_SIZE_DEFAULT; + spaceSize = 1380 * 1024; } - objectCtx->num = 0; - objectCtx->spawnedObjectCount = 0; - objectCtx->mainKeepIndex = 0; - objectCtx->subKeepIndex = 0; + objectCtx->numEntries = 0; + objectCtx->numPersistentEntries = 0; + objectCtx->mainKeepSlot = 0; + objectCtx->subKeepSlot = 0; // clang-format off - for (i = 0; i < OBJECT_EXCHANGE_BANK_MAX; i++) { objectCtx->status[i].id = 0; } + for (i = 0; i < ARRAY_COUNT(objectCtx->slots); i++) { objectCtx->slots[i].id = 0; } // clang-format on - objectCtx->spaceStart = objectCtx->status[0].segment = THA_AllocTailAlign16(&gameState->tha, spaceSize); + objectCtx->spaceStart = objectCtx->slots[0].segment = THA_AllocTailAlign16(&gameState->tha, spaceSize); objectCtx->spaceEnd = (void*)((u32)objectCtx->spaceStart + spaceSize); - objectCtx->mainKeepIndex = Object_Spawn(objectCtx, GAMEPLAY_KEEP); + objectCtx->mainKeepSlot = Object_SpawnPersistent(objectCtx, GAMEPLAY_KEEP); - gSegments[0x04] = VIRTUAL_TO_PHYSICAL(objectCtx->status[objectCtx->mainKeepIndex].segment); + gSegments[4] = VIRTUAL_TO_PHYSICAL(objectCtx->slots[objectCtx->mainKeepSlot].segment); } -void Object_UpdateBank(ObjectContext* objectCtx) { +void Object_UpdateEntries(ObjectContext* objectCtx) { s32 i; - ObjectStatus* status = &objectCtx->status[0]; + ObjectEntry* entry = &objectCtx->slots[0]; RomFile* objectFile; size_t size; - for (i = 0; i < objectCtx->num; i++) { - if (status->id < 0) { - s32 id = -status->id; + for (i = 0; i < objectCtx->numEntries; i++) { + if (entry->id < 0) { + s32 id = -entry->id; - if (status->dmaReq.vromAddr == 0) { + if (entry->dmaReq.vromAddr == 0) { objectFile = &gObjectTable[id]; size = objectFile->vromEnd - objectFile->vromStart; if (size == 0) { - status->id = 0; + entry->id = 0; } else { - osCreateMesgQueue(&status->loadQueue, &status->loadMsg, 1); - DmaMgr_SendRequestImpl(&status->dmaReq, status->segment, objectFile->vromStart, size, 0, - &status->loadQueue, NULL); + osCreateMesgQueue(&entry->loadQueue, &entry->loadMsg, 1); + DmaMgr_SendRequestImpl(&entry->dmaReq, entry->segment, objectFile->vromStart, size, 0, + &entry->loadQueue, NULL); } - } else if (!osRecvMesg(&status->loadQueue, NULL, OS_MESG_NOBLOCK)) { - status->id = id; + } else if (!osRecvMesg(&entry->loadQueue, NULL, OS_MESG_NOBLOCK)) { + entry->id = id; } } - status++; + entry++; } } -s32 Object_GetIndex(ObjectContext* objectCtx, s16 objectId) { +s32 Object_GetSlot(ObjectContext* objectCtx, s16 objectId) { s32 i; - for (i = 0; i < objectCtx->num; i++) { - if (ABS_ALT(objectCtx->status[i].id) == objectId) { + for (i = 0; i < objectCtx->numEntries; i++) { + if (ABS_ALT(objectCtx->slots[i].id) == objectId) { return i; } } @@ -97,8 +110,8 @@ s32 Object_GetIndex(ObjectContext* objectCtx, s16 objectId) { return -1; } -s32 Object_IsLoaded(ObjectContext* objectCtx, s32 index) { - if (objectCtx->status[index].id > 0) { +s32 Object_IsLoaded(ObjectContext* objectCtx, s32 slot) { + if (objectCtx->slots[slot].id > 0) { return true; } else { return false; @@ -110,31 +123,31 @@ void Object_LoadAll(ObjectContext* objectCtx) { s32 id; uintptr_t vromSize; - for (i = 0; i < objectCtx->num; i++) { - id = objectCtx->status[i].id; + for (i = 0; i < objectCtx->numEntries; i++) { + id = objectCtx->slots[i].id; vromSize = gObjectTable[id].vromEnd - gObjectTable[id].vromStart; if (vromSize == 0) { continue; } - DmaMgr_SendRequest0(objectCtx->status[i].segment, gObjectTable[id].vromStart, vromSize); + DmaMgr_SendRequest0(objectCtx->slots[i].segment, gObjectTable[id].vromStart, vromSize); } } -void* func_8012F73C(ObjectContext* objectCtx, s32 iParm2, s16 id) { +void* func_8012F73C(ObjectContext* objectCtx, s32 slot, s16 id) { u32 addr; uintptr_t vromSize; RomFile* fileTableEntry; - objectCtx->status[iParm2].id = -id; - objectCtx->status[iParm2].dmaReq.vromAddr = 0; + objectCtx->slots[slot].id = -id; + objectCtx->slots[slot].dmaReq.vromAddr = 0; fileTableEntry = &gObjectTable[id]; vromSize = fileTableEntry->vromEnd - fileTableEntry->vromStart; // TODO: UB to cast void to u32 - addr = ((u32)objectCtx->status[iParm2].segment) + vromSize; + addr = ((u32)objectCtx->slots[slot].segment) + vromSize; addr = ALIGN16(addr); return (void*)addr; @@ -152,19 +165,19 @@ void Scene_CommandSpawnList(PlayState* play, SceneCmd* cmd) { ((gSaveContext.respawnFlag == 2) && (gSaveContext.respawn[RESPAWN_MODE_RETURN].playerParams == PLAYER_PARAMS(0xFF, PLAYER_INITMODE_TELESCOPE)))) { // Skull Kid Object - Object_Spawn(&play->objectCtx, OBJECT_STK); + Object_SpawnPersistent(&play->objectCtx, OBJECT_STK); return; } - loadedCount = Object_Spawn(&play->objectCtx, OBJECT_LINK_CHILD); - nextObject = play->objectCtx.status[play->objectCtx.num].segment; - play->objectCtx.num = loadedCount; - play->objectCtx.spawnedObjectCount = loadedCount; + loadedCount = Object_SpawnPersistent(&play->objectCtx, OBJECT_LINK_CHILD); + nextObject = play->objectCtx.slots[play->objectCtx.numEntries].segment; + play->objectCtx.numEntries = loadedCount; + play->objectCtx.numPersistentEntries = loadedCount; playerObjectId = gPlayerFormObjectIndices[GET_PLAYER_FORM]; gActorOverlayTable[0].initInfo->objectId = playerObjectId; - Object_Spawn(&play->objectCtx, playerObjectId); + Object_SpawnPersistent(&play->objectCtx, playerObjectId); - play->objectCtx.status[play->objectCtx.num].segment = nextObject; + play->objectCtx.slots[play->objectCtx.numEntries].segment = nextObject; } // SceneTableEntry Header Command 0x01: Actor List @@ -224,10 +237,10 @@ void Scene_CommandSpecialFiles(PlayState* play, SceneCmd* cmd) { { SEGMENT_ROM_START(elf_message_ydan), SEGMENT_ROM_END(elf_message_ydan) }, }; - if (cmd->specialFiles.subKeepIndex != 0) { - play->objectCtx.subKeepIndex = Object_Spawn(&play->objectCtx, cmd->specialFiles.subKeepIndex); + if (cmd->specialFiles.subKeepId != 0) { + play->objectCtx.subKeepSlot = Object_SpawnPersistent(&play->objectCtx, cmd->specialFiles.subKeepId); // TODO: Segment number enum? - gSegments[0x05] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[play->objectCtx.subKeepIndex].segment); + gSegments[0x05] = VIRTUAL_TO_PHYSICAL(play->objectCtx.slots[play->objectCtx.subKeepSlot].segment); } if (cmd->specialFiles.naviQuestHintFileId != NAVI_QUEST_HINTS_NONE) { @@ -255,28 +268,28 @@ void Scene_CommandObjectList(PlayState* play, SceneCmd* cmd) { s32 i; s32 j; s32 k; - ObjectStatus* firstObject; - ObjectStatus* status; - ObjectStatus* status2; + ObjectEntry* firstObject; + ObjectEntry* entry; + ObjectEntry* invalidatedEntry; s16* objectEntry; void* nextPtr; objectEntry = Lib_SegmentedToVirtual(cmd->objectList.segment); k = 0; - i = play->objectCtx.spawnedObjectCount; - status = &play->objectCtx.status[i]; - firstObject = play->objectCtx.status; + i = play->objectCtx.numPersistentEntries; + entry = &play->objectCtx.slots[i]; + firstObject = &play->objectCtx.slots[0]; - while (i < play->objectCtx.num) { - if (status->id != *objectEntry) { - status2 = &play->objectCtx.status[i]; + while (i < play->objectCtx.numEntries) { + if (entry->id != *objectEntry) { + invalidatedEntry = &play->objectCtx.slots[i]; - for (j = i; j < play->objectCtx.num; j++) { - status2->id = 0; - status2++; + for (j = i; j < play->objectCtx.numEntries; j++) { + invalidatedEntry->id = 0; + invalidatedEntry++; } - play->objectCtx.num = i; + play->objectCtx.numEntries = i; Actor_KillAllWithMissingObject(play, &play->actorCtx); continue; @@ -285,13 +298,13 @@ void Scene_CommandObjectList(PlayState* play, SceneCmd* cmd) { i++; k++; objectEntry++; - status++; + entry++; } while (k < cmd->objectList.num) { nextPtr = func_8012F73C(&play->objectCtx, i, *objectEntry); - if (i < OBJECT_EXCHANGE_BANK_MAX - 1) { + if (i < ARRAY_COUNT(play->objectCtx.slots) - 1) { firstObject[i + 1].segment = nextPtr; } @@ -300,7 +313,7 @@ void Scene_CommandObjectList(PlayState* play, SceneCmd* cmd) { objectEntry++; } - play->objectCtx.num = i; + play->objectCtx.numEntries = i; } // SceneTableEntry Header Command 0x0C: Light List diff --git a/src/code/z_sub_s.c b/src/code/z_sub_s.c index 4baff41ce..3dc02ba7d 100644 --- a/src/code/z_sub_s.c +++ b/src/code/z_sub_s.c @@ -1174,7 +1174,7 @@ s8 SubS_IsObjectLoaded(s8 index, PlayState* play) { } s8 SubS_GetObjectIndex(s16 id, PlayState* play) { - return Object_GetIndex(&play->objectCtx, id); + return Object_GetSlot(&play->objectCtx, id); } /** diff --git a/src/overlays/actors/ovl_Bg_Breakwall/z_bg_breakwall.c b/src/overlays/actors/ovl_Bg_Breakwall/z_bg_breakwall.c index ea2fe2c90..dae692c89 100644 --- a/src/overlays/actors/ovl_Bg_Breakwall/z_bg_breakwall.c +++ b/src/overlays/actors/ovl_Bg_Breakwall/z_bg_breakwall.c @@ -212,7 +212,7 @@ void BgBreakwall_Init(Actor* thisx, PlayState* play) { BgBreakwallStruct* sp24 = &D_808B8140[BGBREAKWALL_GET_F(&this->dyna.actor)]; Actor_ProcessInitChain(&this->dyna.actor, sInitChain); - this->unk_15C = Object_GetIndex(&play->objectCtx, sp24->unk_00); + this->unk_15C = Object_GetSlot(&play->objectCtx, sp24->unk_00); if ((this->unk_15C < 0) || !sp24->unk_14(this, play)) { Actor_Kill(&this->dyna.actor); diff --git a/src/overlays/actors/ovl_Bg_Numa_Hana/z_bg_numa_hana.c b/src/overlays/actors/ovl_Bg_Numa_Hana/z_bg_numa_hana.c index 8e96cae50..91ea969e2 100644 --- a/src/overlays/actors/ovl_Bg_Numa_Hana/z_bg_numa_hana.c +++ b/src/overlays/actors/ovl_Bg_Numa_Hana/z_bg_numa_hana.c @@ -404,13 +404,13 @@ void BgNumaHana_Draw(Actor* thisx, PlayState* play2) { gSPDisplayList(POLY_OPA_DISP++, gWoodenFlowerOuterPetalDL); } - objectIndex = Object_GetIndex(&play->objectCtx, OBJECT_SYOKUDAI); + objectIndex = Object_GetSlot(&play->objectCtx, OBJECT_SYOKUDAI); if ((objectIndex >= 0) && (Object_IsLoaded(&play->objectCtx, objectIndex))) { Matrix_SetTranslateRotateYXZ(this->dyna.actor.world.pos.x, this->dyna.actor.world.pos.y - 64.5f, this->dyna.actor.world.pos.z, &this->dyna.actor.shape.rot); Matrix_Scale(1.5f, 1.5f, 1.5f, MTXMODE_APPLY); gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); - gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.status[objectIndex].segment); + gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.slots[objectIndex].segment); gSPDisplayList(POLY_OPA_DISP++, gObjectSyokudaiTypeNoSwitchDL); } diff --git a/src/overlays/actors/ovl_Bg_Umajump/z_bg_umajump.c b/src/overlays/actors/ovl_Bg_Umajump/z_bg_umajump.c index 16e068156..63cedff5a 100644 --- a/src/overlays/actors/ovl_Bg_Umajump/z_bg_umajump.c +++ b/src/overlays/actors/ovl_Bg_Umajump/z_bg_umajump.c @@ -103,7 +103,7 @@ void BgUmajump_Init(Actor* thisx, PlayState* play) { thisx->update = Actor_Noop; } } else { - this->objectIndex = Object_GetIndex(&play->objectCtx, OBJECT_UMAJUMP); + this->objectIndex = Object_GetSlot(&play->objectCtx, OBJECT_UMAJUMP); if (this->objectIndex < 0) { Actor_Kill(thisx); diff --git a/src/overlays/actors/ovl_Boss_03/z_boss_03.c b/src/overlays/actors/ovl_Boss_03/z_boss_03.c index e9a3e79c7..e9394f783 100644 --- a/src/overlays/actors/ovl_Boss_03/z_boss_03.c +++ b/src/overlays/actors/ovl_Boss_03/z_boss_03.c @@ -2152,14 +2152,14 @@ void Boss03_Update(Actor* thisx, PlayState* play2) { /* Start of Gyorg's Draw section */ void Boss03_SetObject(PlayState* play, s16 objectId) { - s32 objectIndex = Object_GetIndex(&play->objectCtx, objectId); + s32 objectIndex = Object_GetSlot(&play->objectCtx, objectId); OPEN_DISPS(play->state.gfxCtx); - gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[objectIndex].segment); + gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.slots[objectIndex].segment); - gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.status[objectIndex].segment); - gSPSegment(POLY_XLU_DISP++, 0x06, play->objectCtx.status[objectIndex].segment); + gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.slots[objectIndex].segment); + gSPSegment(POLY_XLU_DISP++, 0x06, play->objectCtx.slots[objectIndex].segment); CLOSE_DISPS(play->state.gfxCtx); } diff --git a/src/overlays/actors/ovl_Demo_Effect/z_demo_effect.c b/src/overlays/actors/ovl_Demo_Effect/z_demo_effect.c index ff88a61db..8f3b401da 100644 --- a/src/overlays/actors/ovl_Demo_Effect/z_demo_effect.c +++ b/src/overlays/actors/ovl_Demo_Effect/z_demo_effect.c @@ -57,7 +57,7 @@ void DemoEffect_Init(Actor* thisx, PlayState* play) { if (sEffectTypeObjects[type] == GAMEPLAY_KEEP) { objectIndex = 0; } else { - objectIndex = Object_GetIndex(&play->objectCtx, sEffectTypeObjects[type]); + objectIndex = Object_GetSlot(&play->objectCtx, sEffectTypeObjects[type]); } if (objectIndex < 0) { diff --git a/src/overlays/actors/ovl_Demo_Getitem/z_demo_getitem.c b/src/overlays/actors/ovl_Demo_Getitem/z_demo_getitem.c index 63228436f..b52787f36 100644 --- a/src/overlays/actors/ovl_Demo_Getitem/z_demo_getitem.c +++ b/src/overlays/actors/ovl_Demo_Getitem/z_demo_getitem.c @@ -57,7 +57,7 @@ void DemoGetitem_Init(Actor* thisx, PlayState* play) { this->getItemDrawId = sGetItemDraws[itemIndex]; this->cueType = sCueTypes[itemIndex]; - objectIndex = Object_GetIndex(&play->objectCtx, sObjectBankIndices[itemIndex]); + objectIndex = Object_GetSlot(&play->objectCtx, sObjectBankIndices[itemIndex]); if (objectIndex < 0) { Actor_Kill(&this->actor); return; diff --git a/src/overlays/actors/ovl_Demo_Kankyo/z_demo_kankyo.c b/src/overlays/actors/ovl_Demo_Kankyo/z_demo_kankyo.c index 1ee2b1c9d..badd4bc12 100644 --- a/src/overlays/actors/ovl_Demo_Kankyo/z_demo_kankyo.c +++ b/src/overlays/actors/ovl_Demo_Kankyo/z_demo_kankyo.c @@ -461,7 +461,7 @@ void DemoKankyo_Init(Actor* thisx, PlayState* play) { case DEMO_KANKYO_TYPE_GIANTS: this->isSafeToDrawGiants = false; - objId = Object_GetIndex(&play->objectCtx, sObjectBubbleIndex); + objId = Object_GetSlot(&play->objectCtx, sObjectBubbleIndex); DemoKankyo_SetupAction(this, DemoKakyo_GiantObjectCheck); break; diff --git a/src/overlays/actors/ovl_Dm_An/z_dm_an.c b/src/overlays/actors/ovl_Dm_An/z_dm_an.c index dfcb610c8..a55f2cc1f 100644 --- a/src/overlays/actors/ovl_Dm_An/z_dm_an.c +++ b/src/overlays/actors/ovl_Dm_An/z_dm_an.c @@ -81,9 +81,9 @@ s32 DmAn_UpdateSkelAnime(DmAn* this, PlayState* play) { } if (objectIndex2 >= 0) { - gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[objectIndex2].segment); + gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.slots[objectIndex2].segment); isAnimFinished = SkelAnime_Update(&this->skelAnime); - gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[objectIndex].segment); + gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.slots[objectIndex].segment); } return isAnimFinished; @@ -101,10 +101,10 @@ s32 DmAn_ChangeAnim(DmAn* this, PlayState* play, s32 animIndex) { } if ((objectIndex2 >= 0) && (this->animIndex != animIndex)) { - gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[objectIndex2].segment); + gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.slots[objectIndex2].segment); this->animIndex = animIndex; didAnimChange = SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, animIndex); - gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[objectIndex].segment); + gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.slots[objectIndex].segment); } return didAnimChange; @@ -312,9 +312,9 @@ void func_80C1CD80(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Acto Matrix_TranslateRotateZYX(&D_80C1D2C8, &D_80C1D2D4); gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); - gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.status[sp2A].segment); + gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.slots[sp2A].segment); gSPDisplayList(POLY_OPA_DISP++, gMoonMaskDL); - gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.status[sp2B].segment); + gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.slots[sp2B].segment); Matrix_Pop(); 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 9f30d4343..3c499aa7a 100644 --- a/src/overlays/actors/ovl_Dm_Char03/z_dm_char03.c +++ b/src/overlays/actors/ovl_Dm_Char03/z_dm_char03.c @@ -72,7 +72,7 @@ void DmChar03_Destroy(Actor* thisx, PlayState* play) { } void func_80AAB5F8(DmChar03* this, PlayState* play) { - s32 index = Object_GetIndex(&play->objectCtx, OBJECT_GI_NUTSMASK); + s32 index = Object_GetSlot(&play->objectCtx, OBJECT_GI_NUTSMASK); if (index >= 0) { this->objectIndex = index; diff --git a/src/overlays/actors/ovl_Dm_Char05/z_dm_char05.c b/src/overlays/actors/ovl_Dm_Char05/z_dm_char05.c index 192e040a9..f2f8980a0 100644 --- a/src/overlays/actors/ovl_Dm_Char05/z_dm_char05.c +++ b/src/overlays/actors/ovl_Dm_Char05/z_dm_char05.c @@ -178,7 +178,7 @@ void DmChar05_Destroy(Actor* thisx, PlayState* play) { } void func_80AAC990(DmChar05* this, PlayState* play) { - s32 objectIdx = Object_GetIndex(&play->objectCtx, OBJECT_GI_GOLONMASK); + s32 objectIdx = Object_GetSlot(&play->objectCtx, OBJECT_GI_GOLONMASK); if (objectIdx >= 0) { this->unk_18F = objectIdx; @@ -200,7 +200,7 @@ void func_80AAC9DC(DmChar05* this, PlayState* play) { } void func_80AACA98(DmChar05* this, PlayState* play) { - s32 objectIdx = Object_GetIndex(&play->objectCtx, OBJECT_GI_MASK13); + s32 objectIdx = Object_GetSlot(&play->objectCtx, OBJECT_GI_MASK13); if (objectIdx >= 0) { this->unk_18F = objectIdx; @@ -232,7 +232,7 @@ void func_80AACBE4(DmChar05* this, PlayState* play) { OBJECT_GI_MASK11, OBJECT_GI_MASK20, OBJECT_GI_RABIT_MASK, OBJECT_GI_MASK12, }; s32 params = DMCHAR05_GET(&this->actor) - DMCHAR05_5; - s32 objectIdx = Object_GetIndex(&play->objectCtx, D_80AAE2F0[params]); + s32 objectIdx = Object_GetSlot(&play->objectCtx, D_80AAE2F0[params]); if (objectIdx >= 0) { this->unk_18F = objectIdx; @@ -278,7 +278,7 @@ void func_80AACD0C(DmChar05* this, PlayState* play) { } void func_80AACD1C(DmChar05* this, PlayState* play) { - s32 objectIdx = Object_GetIndex(&play->objectCtx, OBJECT_GI_ZORAMASK); + s32 objectIdx = Object_GetSlot(&play->objectCtx, OBJECT_GI_ZORAMASK); if (objectIdx >= 0) { this->unk_18F = objectIdx; @@ -298,7 +298,7 @@ void func_80AACD68(DmChar05* this, PlayState* play) { } void func_80AACE10(DmChar05* this, PlayState* play) { - s32 objectIdx = Object_GetIndex(&play->objectCtx, OBJECT_GI_MASK15); + s32 objectIdx = Object_GetSlot(&play->objectCtx, OBJECT_GI_MASK15); if (objectIdx >= 0) { this->unk_18F = objectIdx; diff --git a/src/overlays/actors/ovl_Dm_Gm/z_dm_gm.c b/src/overlays/actors/ovl_Dm_Gm/z_dm_gm.c index 2f7435053..ec5a83095 100644 --- a/src/overlays/actors/ovl_Dm_Gm/z_dm_gm.c +++ b/src/overlays/actors/ovl_Dm_Gm/z_dm_gm.c @@ -81,9 +81,9 @@ s32 DmGm_UpdateSkelAnime(DmGm* this, PlayState* play) { } if (objectIndex2 >= 0) { - gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[objectIndex2].segment); + gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.slots[objectIndex2].segment); isAnimFinished = SkelAnime_Update(&this->skelAnime); - gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[objectIndex].segment); + gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.slots[objectIndex].segment); } return isAnimFinished; @@ -101,10 +101,10 @@ s32 DmGm_ChangeAnim(DmGm* this, PlayState* play, s32 animIndex) { } if ((objectIndex2 >= 0) && (this->animIndex != animIndex)) { - gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[objectIndex2].segment); + gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.slots[objectIndex2].segment); this->animIndex = animIndex; didAnimChange = SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, animIndex); - gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[objectIndex].segment); + gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.slots[objectIndex].segment); } return didAnimChange; @@ -312,9 +312,9 @@ void DmGm_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Matrix_TranslateRotateZYX(&D_80C25218, &D_80C25224); gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); - gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.status[sp2A].segment); + gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.slots[sp2A].segment); gSPDisplayList(POLY_OPA_DISP++, gMoonMaskDL); - gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.status[sp2B].segment); + gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.slots[sp2B].segment); Matrix_Pop(); diff --git a/src/overlays/actors/ovl_Dm_Stk/z_dm_stk.c b/src/overlays/actors/ovl_Dm_Stk/z_dm_stk.c index fb45200bc..cf8ed15e1 100644 --- a/src/overlays/actors/ovl_Dm_Stk/z_dm_stk.c +++ b/src/overlays/actors/ovl_Dm_Stk/z_dm_stk.c @@ -320,7 +320,7 @@ void DmStk_LoadObjectForAnimation(DmStk* this, PlayState* play) { } if (objectIndex >= 0) { - gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[objectIndex].segment); + gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.slots[objectIndex].segment); } } @@ -1062,9 +1062,9 @@ void DmStk_Init(Actor* thisx, PlayState* play) { this->shouldDraw = true; if (DM_STK_GET_TYPE(&this->actor) != DM_STK_TYPE_MAJORAS_MASK) { this->dekuPipesCutsceneState = SK_DEKU_PIPES_CS_STATE_NOT_READY; - this->objectStkObjectIndex = Object_GetIndex(&play->objectCtx, OBJECT_STK); - this->objectStk2ObjectIndex = Object_GetIndex(&play->objectCtx, OBJECT_STK2); - this->objectStk3ObjectIndex = Object_GetIndex(&play->objectCtx, OBJECT_STK3); + this->objectStkObjectIndex = Object_GetSlot(&play->objectCtx, OBJECT_STK); + this->objectStk2ObjectIndex = Object_GetSlot(&play->objectCtx, OBJECT_STK2); + this->objectStk3ObjectIndex = Object_GetSlot(&play->objectCtx, OBJECT_STK3); if (this->objectStkObjectIndex < 0) { Actor_Kill(&this->actor); } @@ -1968,15 +1968,15 @@ void DmStk_PostLimbDraw2(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot (this->objectStk2ObjectIndex >= 0)) { Matrix_Push(); Matrix_Scale(2.0f, 2.0f, 2.0f, MTXMODE_APPLY); - gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[this->objectStk2ObjectIndex].segment); + gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.slots[this->objectStk2ObjectIndex].segment); - gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.status[this->objectStk2ObjectIndex].segment); + gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.slots[this->objectStk2ObjectIndex].segment); AnimatedMat_Draw(play, Lib_SegmentedToVirtual(gSkullKidMajorasMaskCurseOverlayTexAnim)); Gfx_DrawDListOpa(play, gSkullKidMajorasMaskCurseOverlayDL); - gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[this->objectStkObjectIndex].segment); + gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.slots[this->objectStkObjectIndex].segment); - gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.status[this->objectStkObjectIndex].segment); + gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.slots[this->objectStkObjectIndex].segment); Matrix_Pop(); } @@ -2095,7 +2095,7 @@ void DmStk_Draw(Actor* thisx, PlayState* play) { return; } - gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[this->objectStkObjectIndex].segment); + gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.slots[this->objectStkObjectIndex].segment); OPEN_DISPS(play->state.gfxCtx); diff --git a/src/overlays/actors/ovl_Door_Shutter/z_door_shutter.c b/src/overlays/actors/ovl_Door_Shutter/z_door_shutter.c index c6e0e4269..b9b53a081 100644 --- a/src/overlays/actors/ovl_Door_Shutter/z_door_shutter.c +++ b/src/overlays/actors/ovl_Door_Shutter/z_door_shutter.c @@ -234,7 +234,7 @@ void DoorShutter_Init(Actor* thisx, PlayState* play2) { this->slidingDoor.dyna.actor.room = -1; } - if ((this->requiredObjBankIndex = Object_GetIndex(&play->objectCtx, D_808A2180[sp24].objectId)) < 0) { + if ((this->requiredObjBankIndex = Object_GetSlot(&play->objectCtx, D_808A2180[sp24].objectId)) < 0) { Actor_Kill(&this->slidingDoor.dyna.actor); return; } diff --git a/src/overlays/actors/ovl_En_Bba_01/z_en_bba_01.c b/src/overlays/actors/ovl_En_Bba_01/z_en_bba_01.c index 7b9355305..46fd9d5b2 100644 --- a/src/overlays/actors/ovl_En_Bba_01/z_en_bba_01.c +++ b/src/overlays/actors/ovl_En_Bba_01/z_en_bba_01.c @@ -264,9 +264,9 @@ s32 EnBba01_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* if (limbIndex == BBA_LIMB_RIGHT_LOWER_ARM_ROOT) { OPEN_DISPS(play->state.gfxCtx); - gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.status[this->enHy.headObjIndex].segment); - gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[this->enHy.headObjIndex].segment); - gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[this->enHy.skelLowerObjIndex].segment); + gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.slots[this->enHy.headObjIndex].segment); + gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.slots[this->enHy.headObjIndex].segment); + gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.slots[this->enHy.skelLowerObjIndex].segment); CLOSE_DISPS(play->state.gfxCtx); } @@ -303,8 +303,8 @@ void EnBba01_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* ro if (limbIndex == BBA_LIMB_HEAD) { OPEN_DISPS(play->state.gfxCtx); - gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.status[this->enHy.skelUpperObjIndex].segment); - gSegments[0x06] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[this->enHy.skelUpperObjIndex].segment); + gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.slots[this->enHy.skelUpperObjIndex].segment); + gSegments[0x06] = VIRTUAL_TO_PHYSICAL(play->objectCtx.slots[this->enHy.skelUpperObjIndex].segment); CLOSE_DISPS(play->state.gfxCtx); } diff --git a/src/overlays/actors/ovl_En_Cne_01/z_en_cne_01.c b/src/overlays/actors/ovl_En_Cne_01/z_en_cne_01.c index daa07db44..09d67ac24 100644 --- a/src/overlays/actors/ovl_En_Cne_01/z_en_cne_01.c +++ b/src/overlays/actors/ovl_En_Cne_01/z_en_cne_01.c @@ -254,10 +254,10 @@ s32 EnCne01_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* if (limbIndex == CNE_LIMB_HEAD) { OPEN_DISPS(play->state.gfxCtx); - gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.status[this->enHy.headObjIndex].segment); - gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[this->enHy.headObjIndex].segment); + gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.slots[this->enHy.headObjIndex].segment); + gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.slots[this->enHy.headObjIndex].segment); *dList = gCneHeadBrownHairDL; - gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[this->enHy.skelLowerObjIndex].segment); + gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.slots[this->enHy.skelLowerObjIndex].segment); CLOSE_DISPS(play->state.gfxCtx); } @@ -294,8 +294,8 @@ void EnCne01_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* ro if (limbIndex == CNE_LIMB_RIGHT_FOOT) { OPEN_DISPS(play->state.gfxCtx); - gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.status[this->enHy.skelUpperObjIndex].segment); - gSegments[0x06] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[this->enHy.skelUpperObjIndex].segment); + gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.slots[this->enHy.skelUpperObjIndex].segment); + gSegments[0x06] = VIRTUAL_TO_PHYSICAL(play->objectCtx.slots[this->enHy.skelUpperObjIndex].segment); CLOSE_DISPS(play->state.gfxCtx); } diff --git a/src/overlays/actors/ovl_En_Daiku2/z_en_daiku2.c b/src/overlays/actors/ovl_En_Daiku2/z_en_daiku2.c index 5282697a4..31e904bcf 100644 --- a/src/overlays/actors/ovl_En_Daiku2/z_en_daiku2.c +++ b/src/overlays/actors/ovl_En_Daiku2/z_en_daiku2.c @@ -588,10 +588,10 @@ void func_80BE7718(EnDaiku2* this, PlayState* play) { Gfx_SetupDL25_Opa(play->state.gfxCtx); - objectIdx = Object_GetIndex(&play->objectCtx, OBJECT_BOMBIWA); + objectIdx = Object_GetSlot(&play->objectCtx, OBJECT_BOMBIWA); if ((objectIdx >= 0) && Object_IsLoaded(&play->objectCtx, objectIdx)) { gDPPipeSync(POLY_OPA_DISP++); - gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.status[objectIdx].segment); + gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.slots[objectIdx].segment); for (i = 0; i < ARRAY_COUNT(this->effects); i++, effect++) { if (effect->isEnabled) { diff --git a/src/overlays/actors/ovl_En_Dnk/z_en_dnk.c b/src/overlays/actors/ovl_En_Dnk/z_en_dnk.c index 2dfc36daa..61170a5d0 100644 --- a/src/overlays/actors/ovl_En_Dnk/z_en_dnk.c +++ b/src/overlays/actors/ovl_En_Dnk/z_en_dnk.c @@ -210,7 +210,7 @@ s32 func_80A515C4(EnDnk* this) { void func_80A51648(EnDnk* this, PlayState* play) { if (SubS_IsObjectLoaded(this->unk_28E, play) == true) { - gSegments[0x06] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[this->unk_28E].segment); + gSegments[0x06] = VIRTUAL_TO_PHYSICAL(play->objectCtx.slots[this->unk_28E].segment); this->actor.draw = func_80A52018; this->actor.objBankIndex = this->unk_28E; ActorShape_Init(&this->actor.shape, 0.0f, NULL, 18.0f); diff --git a/src/overlays/actors/ovl_En_Door/z_en_door.c b/src/overlays/actors/ovl_En_Door/z_en_door.c index 289b1403d..a63766b70 100644 --- a/src/overlays/actors/ovl_En_Door/z_en_door.c +++ b/src/overlays/actors/ovl_En_Door/z_en_door.c @@ -440,16 +440,16 @@ void EnDoor_Init(Actor* thisx, PlayState* play2) { break; } } - if ((i >= ARRAY_COUNT(sObjInfo) - 34) && (Object_GetIndex(&play->objectCtx, GAMEPLAY_FIELD_KEEP) >= 0)) { + if ((i >= ARRAY_COUNT(sObjInfo) - 34) && (Object_GetSlot(&play->objectCtx, GAMEPLAY_FIELD_KEEP) >= 0)) { objectInfo++; } } this->knobDoor.dlIndex = objectInfo->dListIndex; - objectBankIndex = Object_GetIndex(&play->objectCtx, objectInfo->objectId); + objectBankIndex = Object_GetSlot(&play->objectCtx, objectInfo->objectId); if (objectBankIndex < 0) { objectInfo = &sObjInfo[15]; - objectBankIndex = Object_GetIndex(&play->objectCtx, objectInfo->objectId); + objectBankIndex = Object_GetSlot(&play->objectCtx, objectInfo->objectId); if (objectBankIndex != 0) { Actor_Kill(&this->knobDoor.dyna.actor); return; diff --git a/src/overlays/actors/ovl_En_Door_Etc/z_en_door_etc.c b/src/overlays/actors/ovl_En_Door_Etc/z_en_door_etc.c index dfa0e4934..fe09aa1fe 100644 --- a/src/overlays/actors/ovl_En_Door_Etc/z_en_door_etc.c +++ b/src/overlays/actors/ovl_En_Door_Etc/z_en_door_etc.c @@ -101,10 +101,10 @@ void EnDoorEtc_Init(Actor* thisx, PlayState* play2) { break; } } - if ((i >= 15) && (Object_GetIndex(&play->objectCtx, GAMEPLAY_FIELD_KEEP) >= 0)) { + if ((i >= 15) && (Object_GetSlot(&play->objectCtx, GAMEPLAY_FIELD_KEEP) >= 0)) { objectInfo++; } - objectIndex = Object_GetIndex(&play->objectCtx, objectInfo->objectId); + objectIndex = Object_GetSlot(&play->objectCtx, objectInfo->objectId); if (objectIndex < 0) { Actor_Kill(&this->knobDoor.dyna.actor); } else { diff --git a/src/overlays/actors/ovl_En_Drs/z_en_drs.c b/src/overlays/actors/ovl_En_Drs/z_en_drs.c index da2f0571d..a521abaa0 100644 --- a/src/overlays/actors/ovl_En_Drs/z_en_drs.c +++ b/src/overlays/actors/ovl_En_Drs/z_en_drs.c @@ -118,9 +118,9 @@ void EnDrs_PostLimbDraw(PlayState* play2, s32 limbIndex, Gfx** dList, Vec3s* rot if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_87_02) && (limbIndex == WEDDING_DRESS_MANNEQUIN_LIMB_MASK)) { OPEN_DISPS(play->state.gfxCtx); - gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.status[temp].segment); + gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.slots[temp].segment); gSPDisplayList(POLY_OPA_DISP++, &gMoonMaskDL); - gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.status[temp2].segment); + gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.slots[temp2].segment); CLOSE_DISPS(play->state.gfxCtx); } diff --git a/src/overlays/actors/ovl_En_Ending_Hero6/z_en_ending_hero6.c b/src/overlays/actors/ovl_En_Ending_Hero6/z_en_ending_hero6.c index 8f6551e84..64b7ea1c2 100644 --- a/src/overlays/actors/ovl_En_Ending_Hero6/z_en_ending_hero6.c +++ b/src/overlays/actors/ovl_En_Ending_Hero6/z_en_ending_hero6.c @@ -172,7 +172,7 @@ void EnEndingHero6_Draw(Actor* thisx, PlayState* play) { Gfx_SetupDL25_Xlu(play->state.gfxCtx); if ((this->objectIndex >= 0) && Object_IsLoaded(&play->objectCtx, this->objectIndex)) { - gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.status[this->objectIndex].segment); + gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.slots[this->objectIndex].segment); switch (this->type) { case ENDING_HERO6_TYPE_DAIKU_RED: diff --git a/src/overlays/actors/ovl_En_Fall/z_en_fall.c b/src/overlays/actors/ovl_En_Fall/z_en_fall.c index 8468c3e54..e902baa2d 100644 --- a/src/overlays/actors/ovl_En_Fall/z_en_fall.c +++ b/src/overlays/actors/ovl_En_Fall/z_en_fall.c @@ -165,19 +165,19 @@ void EnFall_Init(Actor* thisx, PlayState* play) { case EN_FALL_TYPE_LODMOON_NO_LERP: case EN_FALL_TYPE_LODMOON: case EN_FALL_TYPE_LODMOON_INVERTED_STONE_TOWER: - objectIndex = Object_GetIndex(&play->objectCtx, OBJECT_LODMOON); + objectIndex = Object_GetSlot(&play->objectCtx, OBJECT_LODMOON); break; case EN_FALL_TYPE_MOONS_TEAR: - objectIndex = Object_GetIndex(&play->objectCtx, OBJECT_MOONSTON); + objectIndex = Object_GetSlot(&play->objectCtx, OBJECT_MOONSTON); break; case EN_FALL_TYPE_STOPPED_MOON_OPEN_MOUTH: - objectIndex = Object_GetIndex(&play->objectCtx, OBJECT_FALL2); + objectIndex = Object_GetSlot(&play->objectCtx, OBJECT_FALL2); break; default: - objectIndex = Object_GetIndex(&play->objectCtx, OBJECT_FALL); + objectIndex = Object_GetSlot(&play->objectCtx, OBJECT_FALL); break; } diff --git a/src/overlays/actors/ovl_En_Geg/z_en_geg.c b/src/overlays/actors/ovl_En_Geg/z_en_geg.c index 727b2ff2a..938874266 100644 --- a/src/overlays/actors/ovl_En_Geg/z_en_geg.c +++ b/src/overlays/actors/ovl_En_Geg/z_en_geg.c @@ -416,12 +416,12 @@ s32 func_80BB1D64(EnGeg* this, PlayState* play) { } void EnGeg_UpdateSkelAnime(EnGeg* this, PlayState* play) { - gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[this->unk_248].segment); + gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.slots[this->unk_248].segment); SkelAnime_Update(&this->skelAnime); } void EnGeg_ChangeAnim(EnGeg* this, PlayState* play) { - gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[this->unk_248].segment); + gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.slots[this->unk_248].segment); SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, this->animIndex); } @@ -550,7 +550,7 @@ void func_80BB2520(EnGeg* this, PlayState* play) { break; case 0xD66: - this->unk_248 = Object_GetIndex(&play->objectCtx, OBJECT_OF1D_MAP); + this->unk_248 = Object_GetSlot(&play->objectCtx, OBJECT_OF1D_MAP); if (this->unk_248 >= 0) { this->animIndex = ENGEG_ANIM_19; EnGeg_ChangeAnim(this, play); @@ -568,7 +568,7 @@ void func_80BB2520(EnGeg* this, PlayState* play) { case 0xD72: case 0xD75: case 0xD8B: - this->unk_248 = Object_GetIndex(&play->objectCtx, OBJECT_OF1D_MAP); + this->unk_248 = Object_GetSlot(&play->objectCtx, OBJECT_OF1D_MAP); if (this->unk_248 >= 0) { this->animIndex = ENGEG_ANIM_4; EnGeg_ChangeAnim(this, play); @@ -713,7 +713,7 @@ void func_80BB2B1C(EnGeg* this, PlayState* play) { CutsceneManager_StartWithPlayerCsAndSetFlag(this->csId, &this->actor); this->unk_496 = 0xD68; Message_ContinueTextbox(play, this->unk_496); - this->unk_248 = Object_GetIndex(&play->objectCtx, OBJECT_TAISOU); + this->unk_248 = Object_GetSlot(&play->objectCtx, OBJECT_TAISOU); if (this->unk_248 >= 0) { this->animIndex = ENGEG_ANIM_13; EnGeg_ChangeAnim(this, play); @@ -926,7 +926,7 @@ void EnGeg_Init(Actor* thisx, PlayState* play) { CollisionCheck_SetInfo2(&this->actor.colChkInfo, &sDamageTable, &sColChkInfoInit); if (this->actor.update != NULL) { - this->unk_248 = Object_GetIndex(&play->objectCtx, OBJECT_OF1D_MAP); + this->unk_248 = Object_GetSlot(&play->objectCtx, OBJECT_OF1D_MAP); if (this->unk_248 < 0) { Actor_Kill(&this->actor); } diff --git a/src/overlays/actors/ovl_En_GirlA/z_en_girla.c b/src/overlays/actors/ovl_En_GirlA/z_en_girla.c index 495f4712c..299ab5c4b 100644 --- a/src/overlays/actors/ovl_En_GirlA/z_en_girla.c +++ b/src/overlays/actors/ovl_En_GirlA/z_en_girla.c @@ -165,7 +165,7 @@ void EnGirlA_InitObjIndex(EnGirlA* this, PlayState* play) { return; } - this->objIndex = Object_GetIndex(&play->objectCtx, sShopItemEntries[params].objectId); + this->objIndex = Object_GetSlot(&play->objectCtx, sShopItemEntries[params].objectId); if (this->objIndex < 0) { Actor_Kill(&this->actor); return; diff --git a/src/overlays/actors/ovl_En_Go/z_en_go.c b/src/overlays/actors/ovl_En_Go/z_en_go.c index 0aecc3233..2f6217411 100644 --- a/src/overlays/actors/ovl_En_Go/z_en_go.c +++ b/src/overlays/actors/ovl_En_Go/z_en_go.c @@ -991,10 +991,10 @@ s32 EnGo_UpdateSkelAnime(EnGo* this, PlayState* play) { } if (extraObjIndex >= 0) { - gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[extraObjIndex].segment); + gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.slots[extraObjIndex].segment); this->skelAnime.playSpeed = this->animPlaySpeed; isAnimFinished = SkelAnime_Update(&this->skelAnime); - gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[objIndex].segment); + gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.slots[objIndex].segment); } return isAnimFinished; @@ -1051,11 +1051,11 @@ s32 EnGo_ChangeAnim(EnGo* this, PlayState* play, EnGoAnimation animIndex) { } if (extraObjIndex >= 0) { - gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[extraObjIndex].segment); + gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.slots[extraObjIndex].segment); this->animIndex = animIndex; didAnimChange = SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, animIndex); this->animPlaySpeed = this->skelAnime.playSpeed; - gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[objIndex].segment); + gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.slots[objIndex].segment); } return didAnimChange; diff --git a/src/overlays/actors/ovl_En_Horse/z_en_horse.c b/src/overlays/actors/ovl_En_Horse/z_en_horse.c index 088e3fae0..df5718605 100644 --- a/src/overlays/actors/ovl_En_Horse/z_en_horse.c +++ b/src/overlays/actors/ovl_En_Horse/z_en_horse.c @@ -738,7 +738,7 @@ void EnHorse_Init(Actor* thisx, PlayState* play2) { this->type = HORSE_TYPE_DONKEY; this->unk_528 = 80.0f; this->boostSpeed = 12; - if ((this->bankIndex = Object_GetIndex(&play->objectCtx, OBJECT_HA)) < 0) { + if ((this->bankIndex = Object_GetSlot(&play->objectCtx, OBJECT_HA)) < 0) { Actor_Kill(&this->actor); return; } @@ -748,8 +748,8 @@ void EnHorse_Init(Actor* thisx, PlayState* play2) { this->type = HORSE_TYPE_2; this->unk_528 = 64.8f; this->boostSpeed = 15; - if ((this->bankIndex = Object_GetIndex(&play->objectCtx, OBJECT_HORSE_LINK_CHILD)) < 0) { - thisx->objBankIndex = Object_Spawn(&play->objectCtx, OBJECT_HORSE_LINK_CHILD); + if ((this->bankIndex = Object_GetSlot(&play->objectCtx, OBJECT_HORSE_LINK_CHILD)) < 0) { + thisx->objBankIndex = Object_SpawnPersistent(&play->objectCtx, OBJECT_HORSE_LINK_CHILD); Actor_SetObjectDependency(play, &this->actor); Skin_Init(&play->state, &this->skin, sSkeletonHeaders[this->type], sAnimationHeaders[this->type][0]); Animation_PlayOnce(&this->skin.skelAnime, sAnimationHeaders[this->type][this->animIndex]); @@ -760,7 +760,7 @@ void EnHorse_Init(Actor* thisx, PlayState* play2) { } else if (ENHORSE_IS_BANDIT_TYPE(&this->actor)) { this->type = HORSE_TYPE_BANDIT; this->boostSpeed = 12; - if ((this->bankIndex = Object_GetIndex(&play->objectCtx, OBJECT_HA)) < 0) { + if ((this->bankIndex = Object_GetSlot(&play->objectCtx, OBJECT_HA)) < 0) { Actor_Kill(&this->actor); return; } diff --git a/src/overlays/actors/ovl_En_Invadepoh_Demo/z_en_invadepoh_demo.c b/src/overlays/actors/ovl_En_Invadepoh_Demo/z_en_invadepoh_demo.c index cb5d73093..801ad428c 100644 --- a/src/overlays/actors/ovl_En_Invadepoh_Demo/z_en_invadepoh_demo.c +++ b/src/overlays/actors/ovl_En_Invadepoh_Demo/z_en_invadepoh_demo.c @@ -209,7 +209,7 @@ void EnInvadepohDemo_DoNothing(EnInvadepohDemo* this, PlayState* play) { void EnInvadepohDemo_Alien_Init(EnInvadepohDemo* this, PlayState* play) { Actor_ProcessInitChain(&this->actor, sAlienInitChain); this->actor.flags = ACTOR_FLAG_10 | ACTOR_FLAG_IGNORE_QUAKE | ACTOR_FLAG_80000000; - this->objectIndex = Object_GetIndex(&play->objectCtx, OBJECT_UCH); + this->objectIndex = Object_GetSlot(&play->objectCtx, OBJECT_UCH); if (this->objectIndex < 0) { Actor_Kill(&this->actor); return; @@ -220,7 +220,7 @@ void EnInvadepohDemo_Alien_Init(EnInvadepohDemo* this, PlayState* play) { void EnInvadepohDemo_Romani_Init(EnInvadepohDemo* this, PlayState* play) { Actor_ProcessInitChain(&this->actor, sRomaniInitChain); - this->objectIndex = Object_GetIndex(&play->objectCtx, OBJECT_MA1); + this->objectIndex = Object_GetSlot(&play->objectCtx, OBJECT_MA1); if (this->objectIndex < 0) { Actor_Kill(&this->actor); return; @@ -233,7 +233,7 @@ void EnInvadepohDemo_Cow_Init(EnInvadepohDemo* this, PlayState* play) { Actor_ProcessInitChain(&this->actor, sCowInitChain); Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, ACTOR_EN_INVADEPOH_DEMO, 0.0f, 0.0f, 0.0f, 0, 0, 0, EN_INVADEPOH_DEMO_TYPE_COW_TAIL); - this->objectIndex = Object_GetIndex(&play->objectCtx, OBJECT_COW); + this->objectIndex = Object_GetSlot(&play->objectCtx, OBJECT_COW); if (this->objectIndex < 0) { Actor_Kill(&this->actor); return; @@ -250,7 +250,7 @@ void EnInvadepohDemo_Ufo_Init(EnInvadepohDemo* this, PlayState* play) { void EnInvadepohDemo_CowTail_Init(EnInvadepohDemo* this, PlayState* play) { Actor_ProcessInitChain(&this->actor, sCowTailInitChain); - this->objectIndex = Object_GetIndex(&play->objectCtx, OBJECT_COW); + this->objectIndex = Object_GetSlot(&play->objectCtx, OBJECT_COW); if (this->objectIndex < 0) { Actor_Kill(&this->actor); return; diff --git a/src/overlays/actors/ovl_En_Ishi/z_en_ishi.c b/src/overlays/actors/ovl_En_Ishi/z_en_ishi.c index 23e19bba2..10dc7bcdf 100644 --- a/src/overlays/actors/ovl_En_Ishi/z_en_ishi.c +++ b/src/overlays/actors/ovl_En_Ishi/z_en_ishi.c @@ -425,7 +425,7 @@ void EnIshi_Init(Actor* thisx, PlayState* play) { this->unk_197 |= 1; } - this->unk_196 = Object_GetIndex(&play->objectCtx, D_8095F6E8[ENISHI_GET_8(&this->actor)]); + this->unk_196 = Object_GetSlot(&play->objectCtx, D_8095F6E8[ENISHI_GET_8(&this->actor)]); if (this->unk_196 < 0) { Actor_Kill(&this->actor); return; diff --git a/src/overlays/actors/ovl_En_Kusa/z_en_kusa.c b/src/overlays/actors/ovl_En_Kusa/z_en_kusa.c index 890fafd37..0b246b4df 100644 --- a/src/overlays/actors/ovl_En_Kusa/z_en_kusa.c +++ b/src/overlays/actors/ovl_En_Kusa/z_en_kusa.c @@ -393,7 +393,7 @@ void EnKusa_Init(Actor* thisx, PlayState* play) { this->isInWater |= 1; } - this->objIndex = Object_GetIndex(&play->objectCtx, objectIds[(KUSA_GET_TYPE(&this->actor))]); + this->objIndex = Object_GetSlot(&play->objectCtx, objectIds[(KUSA_GET_TYPE(&this->actor))]); if (this->objIndex < 0) { Actor_Kill(&this->actor); return; diff --git a/src/overlays/actors/ovl_En_Mag/z_en_mag.c b/src/overlays/actors/ovl_En_Mag/z_en_mag.c index 215c2146c..856c13c0d 100644 --- a/src/overlays/actors/ovl_En_Mag/z_en_mag.c +++ b/src/overlays/actors/ovl_En_Mag/z_en_mag.c @@ -707,7 +707,7 @@ void EnMag_DrawInner(Actor* thisx, PlayState* play, Gfx** gfxp) { s16 step; // Set segment 6 to the object, since this will be read by OVERLAY_DISP where it is not set by default. - gSPSegment(gfx++, 0x06, play->objectCtx.status[this->actor.objBankIndex].segment); + gSPSegment(gfx++, 0x06, play->objectCtx.slots[this->actor.objBankIndex].segment); Gfx_SetupDL39_Ptr(&gfx); diff --git a/src/overlays/actors/ovl_En_Nwc/z_en_nwc.c b/src/overlays/actors/ovl_En_Nwc/z_en_nwc.c index 2a6a7ea1b..6ee4a5f80 100644 --- a/src/overlays/actors/ovl_En_Nwc/z_en_nwc.c +++ b/src/overlays/actors/ovl_En_Nwc/z_en_nwc.c @@ -61,7 +61,7 @@ void EnNwc_Init(Actor* thisx, PlayState* play) { s32 niwObjectIndex; EnNwc* this = THIS; - niwObjectIndex = Object_GetIndex(&play->objectCtx, OBJECT_NIW); + niwObjectIndex = Object_GetSlot(&play->objectCtx, OBJECT_NIW); if (niwObjectIndex < 0) { // niw object does not exist, we need it for tranformation, despawn Actor_Kill(&this->actor); @@ -248,14 +248,14 @@ void EnNwc_CheckFound(EnNwc* this, PlayState* play) { void EnNwc_LoadNiwSkeleton(EnNwc* this, PlayState* play) { if (Object_IsLoaded(&play->objectCtx, this->niwObjectIndex)) { - gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[this->niwObjectIndex].segment); + gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.slots[this->niwObjectIndex].segment); SkelAnime_InitFlex(play, &this->niwSkeleton, &gNiwSkeleton, &gNiwIdleAnim, this->jointTable, this->morphTable, NIW_LIMB_MAX); Animation_Change(&this->niwSkeleton, &gNiwIdleAnim, 1.0f, 0.0f, Animation_GetLastFrame(&gNiwIdleAnim), ANIMMODE_LOOP, 0.0f); - gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[this->nwcObjectIndex].segment); + gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.slots[this->nwcObjectIndex].segment); this->state = NWC_STATE_NIW_LOADED; EnNwc_ToggleState(this); } diff --git a/src/overlays/actors/ovl_En_Ossan/z_en_ossan.c b/src/overlays/actors/ovl_En_Ossan/z_en_ossan.c index 096b8ff38..45f2b485c 100644 --- a/src/overlays/actors/ovl_En_Ossan/z_en_ossan.c +++ b/src/overlays/actors/ovl_En_Ossan/z_en_ossan.c @@ -275,7 +275,7 @@ void EnOssan_Init(Actor* thisx, PlayState* play) { return; } id = sObjectIds[this->actor.params]; - this->objIndex = Object_GetIndex(&play->objectCtx, id); + this->objIndex = Object_GetSlot(&play->objectCtx, id); if (this->objIndex < 0) { Actor_Kill(&this->actor); return; diff --git a/src/overlays/actors/ovl_En_S_Goro/z_en_s_goro.c b/src/overlays/actors/ovl_En_S_Goro/z_en_s_goro.c index a89ec608e..33f79d4f2 100644 --- a/src/overlays/actors/ovl_En_S_Goro/z_en_s_goro.c +++ b/src/overlays/actors/ovl_En_S_Goro/z_en_s_goro.c @@ -786,18 +786,18 @@ void EnSGoro_UpdateSleeping(EnSGoro* this, PlayState* play) { s32 EnSGoro_UpdateCheerAnimation(EnSGoro* this, PlayState* play) { if (this->animInfoIndex == EN_S_GORO_ANIM_IDLE_STAND) { if (((EnJg*)this->otherGoron)->flags & 1) { - this->loadedObjIndex = Object_GetIndex(&play->objectCtx, OBJECT_TAISOU); + this->loadedObjIndex = Object_GetSlot(&play->objectCtx, OBJECT_TAISOU); if (this->loadedObjIndex >= 0) { - gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[this->loadedObjIndex].segment); + gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.slots[this->loadedObjIndex].segment); this->animInfoIndex = EN_S_GORO_ANIM_TAISOU_CHEER; SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, this->animInfoIndex); return true; } } } else if ((this->animInfoIndex == EN_S_GORO_ANIM_TAISOU_CHEER) && !(((EnJg*)this->otherGoron)->flags & 1)) { - this->loadedObjIndex = Object_GetIndex(&play->objectCtx, OBJECT_OF1D_MAP); + this->loadedObjIndex = Object_GetSlot(&play->objectCtx, OBJECT_OF1D_MAP); if (this->loadedObjIndex >= 0) { - gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[this->loadedObjIndex].segment); + gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.slots[this->loadedObjIndex].segment); this->animInfoIndex = EN_S_GORO_ANIM_IDLE_STAND; SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, this->animInfoIndex); this->skelAnime.curFrame = this->skelAnime.endFrame; @@ -1307,7 +1307,7 @@ void EnSGoro_Init(Actor* thisx, PlayState* play) { Collider_SetCylinder(play, &this->collider, &this->actor, &sCylinderInit); CollisionCheck_SetInfo2(&this->actor.colChkInfo, &sDamageTable, &sColChkInfoInit); if (this->actor.update != NULL) { - s32 objIndex = Object_GetIndex(&play->objectCtx, OBJECT_OF1D_MAP); + s32 objIndex = Object_GetSlot(&play->objectCtx, OBJECT_OF1D_MAP); this->loadedObjIndex = objIndex; if (objIndex < 0) { @@ -1329,7 +1329,7 @@ void EnSGoro_Update(Actor* thisx, PlayState* play) { this->actionFunc(this, play); Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, 12.0f, 0.0f, UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4); - gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[this->loadedObjIndex].segment); + gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.slots[this->loadedObjIndex].segment); SkelAnime_Update(&this->skelAnime); if (this->animInfoIndex != EN_S_GORO_ANIM_SLEEPY) { EnSGoro_UpdateAttentionTarget(this, play); diff --git a/src/overlays/actors/ovl_En_Sekihi/z_en_sekihi.c b/src/overlays/actors/ovl_En_Sekihi/z_en_sekihi.c index 2e05f0f57..92b88e462 100644 --- a/src/overlays/actors/ovl_En_Sekihi/z_en_sekihi.c +++ b/src/overlays/actors/ovl_En_Sekihi/z_en_sekihi.c @@ -69,7 +69,7 @@ void EnSekihi_Init(Actor* thisx, PlayState* play) { SET_WEEKEVENTREG(WEEKEVENTREG_OCEANSIDE_SPIDER_HOUSE_BUYER_MOVED_IN); } - objectIndex = Object_GetIndex(&play->objectCtx, sObjectIds[type]); + objectIndex = Object_GetSlot(&play->objectCtx, sObjectIds[type]); if (objectIndex >= 0) { this->objectIndex = objectIndex; } diff --git a/src/overlays/actors/ovl_En_Sob1/z_en_sob1.c b/src/overlays/actors/ovl_En_Sob1/z_en_sob1.c index e5ab7dbad..8a8be15c4 100644 --- a/src/overlays/actors/ovl_En_Sob1/z_en_sob1.c +++ b/src/overlays/actors/ovl_En_Sob1/z_en_sob1.c @@ -381,7 +381,7 @@ void EnSob1_SpawnShopItems(EnSob1* this, PlayState* play, ShopItem* shopItem) { s32 EnSob1_GetObjIndices(EnSob1* this, PlayState* play, s16* objIds) { if (objIds[1] != OBJECT_ID_MAX) { - this->unusedObjIndex = Object_GetIndex(&play->objectCtx, objIds[1]); + this->unusedObjIndex = Object_GetSlot(&play->objectCtx, objIds[1]); if (this->unusedObjIndex < 0) { return false; } @@ -389,7 +389,7 @@ s32 EnSob1_GetObjIndices(EnSob1* this, PlayState* play, s16* objIds) { this->unusedObjIndex = -1; } if (objIds[2] != OBJECT_ID_MAX) { - this->shopkeeperAnimObjIndex = Object_GetIndex(&play->objectCtx, objIds[2]); + this->shopkeeperAnimObjIndex = Object_GetSlot(&play->objectCtx, objIds[2]); if (this->shopkeeperAnimObjIndex < 0) { return false; } @@ -427,7 +427,7 @@ void EnSob1_Init(Actor* thisx, PlayState* play) { } objIds = sObjectIds[this->shopType]; - this->mainObjIndex = Object_GetIndex(&play->objectCtx, objIds[0]); + this->mainObjIndex = Object_GetSlot(&play->objectCtx, objIds[0]); if (this->mainObjIndex < 0) { Actor_Kill(&this->actor); return; @@ -1345,7 +1345,7 @@ void EnSob1_Blink(EnSob1* this) { } void EnSob1_ChangeObject(EnSob1* this, PlayState* play) { - gSegments[0x06] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[this->shopkeeperAnimObjIndex].segment); + gSegments[0x06] = VIRTUAL_TO_PHYSICAL(play->objectCtx.slots[this->shopkeeperAnimObjIndex].segment); } s32 EnSob1_AreObjectsLoaded(EnSob1* this, PlayState* play) { @@ -1363,7 +1363,7 @@ s32 EnSob1_AreObjectsLoaded(EnSob1* this, PlayState* play) { void EnSob1_ZoraShopkeeper_Init(EnSob1* this, PlayState* play) { SkelAnime_InitFlex(play, &this->skelAnime, &gZoraSkel, NULL, this->jointTable, this->morphTable, ZORA_LIMB_MAX); - gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[this->shopkeeperAnimObjIndex].segment); + gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.slots[this->shopkeeperAnimObjIndex].segment); Animation_Change(&this->skelAnime, &gZoraShopkeeperAnim, 1.0f, 0.0f, Animation_GetLastFrame(&gZoraShopkeeperAnim), ANIMMODE_LOOP, 0.0f); this->actor.draw = EnSob1_ZoraShopkeeper_Draw; @@ -1372,7 +1372,7 @@ void EnSob1_ZoraShopkeeper_Init(EnSob1* this, PlayState* play) { void EnSob1_GoronShopkeeper_Init(EnSob1* this, PlayState* play) { SkelAnime_InitFlex(play, &this->skelAnime, &gGoronSkel, NULL, this->jointTable, this->morphTable, GORON_LIMB_MAX); - gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[this->shopkeeperAnimObjIndex].segment); + gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.slots[this->shopkeeperAnimObjIndex].segment); Animation_Change(&this->skelAnime, &gGoronShopkeeperAnim, 1.0f, 0.0f, Animation_GetLastFrame(&gGoronShopkeeperAnim), ANIMMODE_LOOP, 0.0f); this->actor.draw = EnSob1_GoronShopkeeper_Draw; diff --git a/src/overlays/actors/ovl_En_St/z_en_st.c b/src/overlays/actors/ovl_En_St/z_en_st.c index 2491ec4ed..e4240de0a 100644 --- a/src/overlays/actors/ovl_En_St/z_en_st.c +++ b/src/overlays/actors/ovl_En_St/z_en_st.c @@ -245,9 +245,9 @@ void func_808A54B0(EnSt* this, PlayState* play) { if ((this->unk_18C & 1) && (this->actor.colChkInfo.health != 0)) { OPEN_DISPS(play->state.gfxCtx); - gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[this->unk_2C0].segment); + gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.slots[this->unk_2C0].segment); - gSPSegment(POLY_XLU_DISP++, 0x06, play->objectCtx.status[this->unk_2C0].segment); + gSPSegment(POLY_XLU_DISP++, 0x06, play->objectCtx.slots[this->unk_2C0].segment); Gfx_SetupDL25_Xlu(play->state.gfxCtx); Matrix_Translate(this->actor.world.pos.x, this->actor.world.pos.y, this->actor.world.pos.z, MTXMODE_NEW); @@ -842,7 +842,7 @@ void func_808A701C(EnSt* this, PlayState* play) { void EnSt_Init(Actor* thisx, PlayState* play) { EnSt* this = THIS; - this->unk_2C0 = Object_GetIndex(&play->objectCtx, GAMEPLAY_KEEP); + this->unk_2C0 = Object_GetSlot(&play->objectCtx, GAMEPLAY_KEEP); if (((ENST_GET_3F(&this->actor) != ENST_3F_63) && Flags_GetSwitch(play, ENST_GET_3F(&this->actor))) || (this->unk_2C0 < 0)) { Actor_Kill(&this->actor); diff --git a/src/overlays/actors/ovl_En_Sth/z_en_sth.c b/src/overlays/actors/ovl_En_Sth/z_en_sth.c index 97aa3ed7b..daf58065f 100644 --- a/src/overlays/actors/ovl_En_Sth/z_en_sth.c +++ b/src/overlays/actors/ovl_En_Sth/z_en_sth.c @@ -112,12 +112,12 @@ void EnSth_Init(Actor* thisx, PlayState* play) { // this actor can draw two separate bodies that use different objects if (STH_GET_SWAMP_BODY(&this->actor)) { - objectId = Object_GetIndex(&play->objectCtx, OBJECT_AHG); + objectId = Object_GetSlot(&play->objectCtx, OBJECT_AHG); } else { - objectId = Object_GetIndex(&play->objectCtx, OBJECT_STH); + objectId = Object_GetSlot(&play->objectCtx, OBJECT_STH); } this->mainObjectId = objectId; - this->maskOfTruthObjectId = Object_GetIndex(&play->objectCtx, OBJECT_MASK_TRUTH); + this->maskOfTruthObjectId = Object_GetSlot(&play->objectCtx, OBJECT_MASK_TRUTH); Actor_SetScale(&this->actor, 0.01f); Collider_InitAndSetCylinder(play, &this->collider, &this->actor, &sCylinderInit); @@ -740,7 +740,7 @@ void EnSth_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); - gSPSegment(POLY_OPA_DISP++, 0x0A, play->objectCtx.status[this->maskOfTruthObjectId].segment); + gSPSegment(POLY_OPA_DISP++, 0x0A, play->objectCtx.slots[this->maskOfTruthObjectId].segment); gSPDisplayList(POLY_OPA_DISP++, object_mask_truth_DL_0001A0); Matrix_Pop(); diff --git a/src/overlays/actors/ovl_En_Sth2/z_en_sth2.c b/src/overlays/actors/ovl_En_Sth2/z_en_sth2.c index 66b87c998..be0821580 100644 --- a/src/overlays/actors/ovl_En_Sth2/z_en_sth2.c +++ b/src/overlays/actors/ovl_En_Sth2/z_en_sth2.c @@ -35,7 +35,7 @@ ActorInit En_Sth2_InitVars = { void EnSth2_Init(Actor* thisx, PlayState* play) { EnSth2* this = THIS; - this->objIndex = Object_GetIndex(&play->objectCtx, OBJECT_STH); + this->objIndex = Object_GetSlot(&play->objectCtx, OBJECT_STH); Actor_SetScale(&this->actor, 0.01f); ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 36.0f); this->unused = 0; diff --git a/src/overlays/actors/ovl_En_Test2/z_en_test2.c b/src/overlays/actors/ovl_En_Test2/z_en_test2.c index e853570f4..d909826bb 100644 --- a/src/overlays/actors/ovl_En_Test2/z_en_test2.c +++ b/src/overlays/actors/ovl_En_Test2/z_en_test2.c @@ -83,7 +83,7 @@ void EnTest2_Update(Actor* thisx, PlayState* play) { EnTest2ModelInfo* modelInfo; EnTest2* this = THIS; - objectIndex = Object_GetIndex(&play->objectCtx, sObjectIds[this->actor.params]); + objectIndex = Object_GetSlot(&play->objectCtx, sObjectIds[this->actor.params]); if (objectIndex < 0) { Actor_Kill(&this->actor); return; diff --git a/src/overlays/actors/ovl_En_Warp_tag/z_en_warp_tag.c b/src/overlays/actors/ovl_En_Warp_tag/z_en_warp_tag.c index bae88696f..4ae591302 100644 --- a/src/overlays/actors/ovl_En_Warp_tag/z_en_warp_tag.c +++ b/src/overlays/actors/ovl_En_Warp_tag/z_en_warp_tag.c @@ -60,7 +60,7 @@ void EnWarptag_Init(Actor* thisx, PlayState* play) { this->actionFunc = EnWarpTag_WaitForPlayer; } else { - if ((this->dangeonKeepObject = Object_GetIndex(&play->objectCtx, GAMEPLAY_DANGEON_KEEP)) < 0) { + if ((this->dangeonKeepObject = Object_GetSlot(&play->objectCtx, GAMEPLAY_DANGEON_KEEP)) < 0) { Actor_Kill(&this->dyna.actor); } diff --git a/src/overlays/actors/ovl_Item_Etcetera/z_item_etcetera.c b/src/overlays/actors/ovl_Item_Etcetera/z_item_etcetera.c index c5b218815..ba4507b71 100644 --- a/src/overlays/actors/ovl_Item_Etcetera/z_item_etcetera.c +++ b/src/overlays/actors/ovl_Item_Etcetera/z_item_etcetera.c @@ -55,7 +55,7 @@ void ItemEtcetera_Init(Actor* thisx, PlayState* play) { s32 pad; ItemEtcetera* this = THIS; s32 type = ITEMETCETERA_GET_FF(&this->actor); - s32 objBankIndex = Object_GetIndex(&play->objectCtx, sObjectIds[type]); + s32 objBankIndex = Object_GetSlot(&play->objectCtx, sObjectIds[type]); if (objBankIndex < 0) { // assert on debug diff --git a/src/overlays/actors/ovl_Obj_Etcetera/z_obj_etcetera.c b/src/overlays/actors/ovl_Obj_Etcetera/z_obj_etcetera.c index 12afce508..3846ecfd0 100644 --- a/src/overlays/actors/ovl_Obj_Etcetera/z_obj_etcetera.c +++ b/src/overlays/actors/ovl_Obj_Etcetera/z_obj_etcetera.c @@ -80,7 +80,7 @@ void ObjEtcetera_Init(Actor* thisx, PlayState* play) { type = DEKU_FLOWER_TYPE_PINK; } - objectIndex = Object_GetIndex(&play->objectCtx, objectIds[type]); + objectIndex = Object_GetSlot(&play->objectCtx, objectIds[type]); if (objectIndex >= 0) { this->objIndex = objectIndex; } diff --git a/src/overlays/actors/ovl_Obj_Kibako/z_obj_kibako.c b/src/overlays/actors/ovl_Obj_Kibako/z_obj_kibako.c index e33f62f8b..93c79efa6 100644 --- a/src/overlays/actors/ovl_Obj_Kibako/z_obj_kibako.c +++ b/src/overlays/actors/ovl_Obj_Kibako/z_obj_kibako.c @@ -149,7 +149,7 @@ void ObjKibako_Init(Actor* thisx, PlayState* play2) { Collider_SetCylinder(play, &this->collider, &this->actor, &sCylinderInit); Collider_UpdateCylinder(&this->actor, &this->collider); this->actor.colChkInfo.mass = MASS_IMMOVABLE; - this->bankIndex = Object_GetIndex(&play->objectCtx, sObjectIdList[whichBankIndex]); + this->bankIndex = Object_GetSlot(&play->objectCtx, sObjectIdList[whichBankIndex]); if (this->bankIndex < 0) { Actor_Kill(&this->actor); return; diff --git a/src/overlays/actors/ovl_Obj_Nozoki/z_obj_nozoki.c b/src/overlays/actors/ovl_Obj_Nozoki/z_obj_nozoki.c index d783c88e8..770f2131d 100644 --- a/src/overlays/actors/ovl_Obj_Nozoki/z_obj_nozoki.c +++ b/src/overlays/actors/ovl_Obj_Nozoki/z_obj_nozoki.c @@ -93,7 +93,7 @@ void ObjNozoki_Destroy(Actor* thisx, PlayState* play) { } void func_80BA2514(ObjNozoki* this, PlayState* play) { - s32 sp24 = Object_GetIndex(&play->objectCtx, D_80BA34B8[this->unk_15C]); + s32 sp24 = Object_GetSlot(&play->objectCtx, D_80BA34B8[this->unk_15C]); if (sp24 < 0) { Actor_Kill(&this->dyna.actor); diff --git a/src/overlays/actors/ovl_Obj_Purify/z_obj_purify.c b/src/overlays/actors/ovl_Obj_Purify/z_obj_purify.c index 649343554..d8b04684b 100644 --- a/src/overlays/actors/ovl_Obj_Purify/z_obj_purify.c +++ b/src/overlays/actors/ovl_Obj_Purify/z_obj_purify.c @@ -130,7 +130,7 @@ void ObjPurify_Init(Actor* thisx, PlayState* play) { if (sp20 == 1) { DynaPolyActor_Init(&this->dyna, 0); } - this->objIndex = Object_GetIndex(&play->objectCtx, info->objectId); + this->objIndex = Object_GetSlot(&play->objectCtx, info->objectId); if (this->objIndex < 0) { Actor_Kill(&this->dyna.actor); } else if (sp20 == 0) { diff --git a/src/overlays/actors/ovl_Obj_Pzlblock/z_obj_pzlblock.c b/src/overlays/actors/ovl_Obj_Pzlblock/z_obj_pzlblock.c index 3bedc3ea4..9a0c9d1c3 100644 --- a/src/overlays/actors/ovl_Obj_Pzlblock/z_obj_pzlblock.c +++ b/src/overlays/actors/ovl_Obj_Pzlblock/z_obj_pzlblock.c @@ -207,7 +207,7 @@ void ObjPzlblock_Init(Actor* thisx, PlayState* play) { DynaPolyActor_Init(&this->dyna, 0); - this->unk_17A = Object_GetIndex(&play->objectCtx, sp24->unk_00); + this->unk_17A = Object_GetSlot(&play->objectCtx, sp24->unk_00); if (sp28 == 0) { func_809A3D1C(this); diff --git a/src/overlays/actors/ovl_Obj_Tsubo/z_obj_tsubo.c b/src/overlays/actors/ovl_Obj_Tsubo/z_obj_tsubo.c index d6f8b468b..1a316dfab 100644 --- a/src/overlays/actors/ovl_Obj_Tsubo/z_obj_tsubo.c +++ b/src/overlays/actors/ovl_Obj_Tsubo/z_obj_tsubo.c @@ -186,7 +186,7 @@ void ObjTsubo_Init(Actor* thisx, PlayState* play) { this->cylinderCollider.dim.radius = sPotTypeData[type].radius; this->cylinderCollider.dim.height = sPotTypeData[type].height; this->actor.colChkInfo.mass = MASS_IMMOVABLE; - this->objBankIndex = Object_GetIndex(&play->objectCtx, sPotTypeData[type].objId); + this->objBankIndex = Object_GetSlot(&play->objectCtx, sPotTypeData[type].objId); if (this->objBankIndex < 0) { Actor_Kill(&this->actor); return; diff --git a/src/overlays/actors/ovl_player_actor/z_player.c b/src/overlays/actors/ovl_player_actor/z_player.c index 57322fb0f..d04907e50 100644 --- a/src/overlays/actors/ovl_player_actor/z_player.c +++ b/src/overlays/actors/ovl_player_actor/z_player.c @@ -10661,7 +10661,7 @@ void Player_Init(Actor* thisx, PlayState* play) { if (this->actor.shape.rot.x != 0) { this->transformation = this->actor.shape.rot.x - 1; - objBankIndex = Object_GetIndex(&play->objectCtx, gPlayerFormObjectIndices[this->transformation]); + objBankIndex = Object_GetSlot(&play->objectCtx, gPlayerFormObjectIndices[this->transformation]); this->actor.objBankIndex = objBankIndex; if (objBankIndex < 0) { Actor_Kill(&this->actor); @@ -12380,7 +12380,7 @@ void Player_Update(Actor* thisx, PlayState* play) { // This block is a leftover dog-following mechanic from OoT if (gSaveContext.dogParams < 0) { - if (Object_GetIndex(&play->objectCtx, OBJECT_DOG) < 0) { + if (Object_GetSlot(&play->objectCtx, OBJECT_DOG) < 0) { gSaveContext.dogParams = 0; } else { Actor* dog; diff --git a/src/overlays/effects/ovl_Effect_En_Ice_Block/z_eff_en_ice_block.c b/src/overlays/effects/ovl_Effect_En_Ice_Block/z_eff_en_ice_block.c index e63d414d9..a7161d37e 100644 --- a/src/overlays/effects/ovl_Effect_En_Ice_Block/z_eff_en_ice_block.c +++ b/src/overlays/effects/ovl_Effect_En_Ice_Block/z_eff_en_ice_block.c @@ -25,7 +25,7 @@ EffectSsInit Effect_En_Ice_Block_InitVars = { #define rRotVel regs[3] u32 EffectEnIceBlock_CheckIceBlockObject(EffectSs* this, PlayState* play) { - if (((this->rObjId = Object_GetIndex(&play->objectCtx, OBJECT_ICE_BLOCK)) < 0) || + if (((this->rObjId = Object_GetSlot(&play->objectCtx, OBJECT_ICE_BLOCK)) < 0) || (!Object_IsLoaded(&play->objectCtx, this->rObjId))) { this->life = -1; this->draw = NULL; @@ -63,7 +63,7 @@ void EffectEnIceBlock_Draw(PlayState* play, u32 index, EffectSs* this) { OPEN_DISPS(gfxCtx); gSPSegment(POLY_XLU_DISP++, 0x06, - play->objectCtx.status[this->rObjId].segment); // object: OBJECT_ICE_BLOCK + play->objectCtx.slots[this->rObjId].segment); // object: OBJECT_ICE_BLOCK Gfx_SetupDL25_Xlu(play->state.gfxCtx); Matrix_Translate(this->pos.x, this->pos.y, this->pos.z, MTXMODE_NEW); diff --git a/src/overlays/effects/ovl_Effect_Ss_D_Fire/z_eff_ss_d_fire.c b/src/overlays/effects/ovl_Effect_Ss_D_Fire/z_eff_ss_d_fire.c index 87e50fb5f..5febef413 100644 --- a/src/overlays/effects/ovl_Effect_Ss_D_Fire/z_eff_ss_d_fire.c +++ b/src/overlays/effects/ovl_Effect_Ss_D_Fire/z_eff_ss_d_fire.c @@ -29,7 +29,7 @@ EffectSsInit Effect_Ss_D_Fire_InitVars = { static TexturePtr sFireTextures[] = { gDodongoFire0Tex, gDodongoFire1Tex, gDodongoFire2Tex, gDodongoFire3Tex }; s32 EffectSsDFire_CheckForObject(EffectSs* this, PlayState* play) { - if (((this->rObjectIndex = Object_GetIndex(&play->objectCtx, OBJECT_DODONGO)) < 0) || + if (((this->rObjectIndex = Object_GetSlot(&play->objectCtx, OBJECT_DODONGO)) < 0) || !Object_IsLoaded(&play->objectCtx, this->rObjectIndex)) { this->life = -1; this->draw = NULL; @@ -69,7 +69,7 @@ void EffectSsDFire_Draw(PlayState* play, u32 index, EffectSs* this) { f32 scale; if (EffectSsDFire_CheckForObject(this, play)) { - object = play->objectCtx.status[this->rObjectIndex].segment; + object = play->objectCtx.slots[this->rObjectIndex].segment; OPEN_DISPS(gfxCtx); diff --git a/src/overlays/effects/ovl_Effect_Ss_Extra/z_eff_ss_extra.c b/src/overlays/effects/ovl_Effect_Ss_Extra/z_eff_ss_extra.c index e3daa2530..e15e58f25 100644 --- a/src/overlays/effects/ovl_Effect_Ss_Extra/z_eff_ss_extra.c +++ b/src/overlays/effects/ovl_Effect_Ss_Extra/z_eff_ss_extra.c @@ -33,11 +33,11 @@ u32 EffectSsExtra_Init(PlayState* play, u32 index, EffectSs* this, void* initPar EffectSsExtraInitParams* params = PARAMS; s32 objIndex; - objIndex = Object_GetIndex(&play->objectCtx, OBJECT_YABUSAME_POINT); + objIndex = Object_GetSlot(&play->objectCtx, OBJECT_YABUSAME_POINT); if ((objIndex >= 0) && (Object_IsLoaded(&play->objectCtx, objIndex))) { void* segBackup = gSegments[6]; - gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[objIndex].segment); + gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.slots[objIndex].segment); this->pos = params->pos; this->velocity = params->velocity; @@ -62,7 +62,7 @@ void EffectSsExtra_Draw(PlayState* play, u32 index, EffectSs* this) { void* storedSegment; scale = this->rScale / 100.0f; - storedSegment = play->objectCtx.status[this->rObjId].segment; + storedSegment = play->objectCtx.slots[this->rObjId].segment; OPEN_DISPS(play->state.gfxCtx); diff --git a/src/overlays/effects/ovl_Effect_Ss_Hahen/z_eff_ss_hahen.c b/src/overlays/effects/ovl_Effect_Ss_Hahen/z_eff_ss_hahen.c index 15444ad47..828570685 100644 --- a/src/overlays/effects/ovl_Effect_Ss_Hahen/z_eff_ss_hahen.c +++ b/src/overlays/effects/ovl_Effect_Ss_Hahen/z_eff_ss_hahen.c @@ -27,7 +27,7 @@ EffectSsInit Effect_Ss_Hahen_InitVars = { }; void EffectSsHahen_CheckForObject(EffectSs* this, PlayState* play) { - if (((this->rObjBankIndex = Object_GetIndex(&play->objectCtx, this->rObjId)) < 0) || + if (((this->rObjBankIndex = Object_GetSlot(&play->objectCtx, this->rObjId)) < 0) || !Object_IsLoaded(&play->objectCtx, this->rObjBankIndex)) { this->life = -1; this->draw = NULL; @@ -69,7 +69,7 @@ void EffectSsHahen_DrawOpa(PlayState* play, EffectSs* this) { OPEN_DISPS(gfxCtx); if (this->rObjId != HAHEN_OBJECT_DEFAULT) { - gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.status[this->rObjBankIndex].segment); + gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.slots[this->rObjBankIndex].segment); } gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); Gfx_SetupDL25_Opa(play->state.gfxCtx); @@ -85,7 +85,7 @@ void EffectSsHahen_DrawXlu(PlayState* play, EffectSs* this) { OPEN_DISPS(gfxCtx); if (this->rObjId != -1) { - gSPSegment(POLY_XLU_DISP++, 0x06, play->objectCtx.status[this->rObjBankIndex].segment); + gSPSegment(POLY_XLU_DISP++, 0x06, play->objectCtx.slots[this->rObjBankIndex].segment); } gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); Gfx_SetupDL25_Xlu(play->state.gfxCtx); diff --git a/src/overlays/effects/ovl_Effect_Ss_Kakera/z_eff_ss_kakera.c b/src/overlays/effects/ovl_Effect_Ss_Kakera/z_eff_ss_kakera.c index c552e7c50..bde2227d2 100644 --- a/src/overlays/effects/ovl_Effect_Ss_Kakera/z_eff_ss_kakera.c +++ b/src/overlays/effects/ovl_Effect_Ss_Kakera/z_eff_ss_kakera.c @@ -95,9 +95,9 @@ void EffectSsKakera_Draw(PlayState* play, u32 index, EffectSs* this) { OPEN_DISPS(gfxCtx); if (this->rObjId != KAKERA_OBJECT_DEFAULT) { if ((((this->rReg4 >> 7) & 1) << 7) == 0x80) { - gSPSegment(POLY_XLU_DISP++, 0x06, play->objectCtx.status[this->rObjBankIndex].segment); + gSPSegment(POLY_XLU_DISP++, 0x06, play->objectCtx.slots[this->rObjBankIndex].segment); } else { - gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.status[this->rObjBankIndex].segment); + gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.slots[this->rObjBankIndex].segment); } } @@ -127,7 +127,7 @@ void EffectSsKakera_Draw(PlayState* play, u32 index, EffectSs* this) { } void EffectSsKakera_CheckForObject(EffectSs* this, PlayState* play) { - this->rObjBankIndex = Object_GetIndex(&play->objectCtx, this->rObjId); + this->rObjBankIndex = Object_GetSlot(&play->objectCtx, this->rObjId); if ((this->rObjBankIndex < 0) || (!Object_IsLoaded(&play->objectCtx, this->rObjBankIndex))) { this->life = 0; this->draw = NULL; diff --git a/src/overlays/effects/ovl_Effect_Ss_Stick/z_eff_ss_stick.c b/src/overlays/effects/ovl_Effect_Ss_Stick/z_eff_ss_stick.c index c1615e2bf..fcdca875f 100644 --- a/src/overlays/effects/ovl_Effect_Ss_Stick/z_eff_ss_stick.c +++ b/src/overlays/effects/ovl_Effect_Ss_Stick/z_eff_ss_stick.c @@ -25,7 +25,7 @@ u32 EffectSsStick_Init(PlayState* play, u32 index, EffectSs* this, void* initPar EffectSsStickInitParams* initParams = PARAMS; Vec3f pos; - this->rObjBankIndex = Object_GetIndex(&play->objectCtx, GAMEPLAY_KEEP); + this->rObjBankIndex = Object_GetSlot(&play->objectCtx, GAMEPLAY_KEEP); pos = initParams->pos; this->pos = pos; this->vec = pos; @@ -51,7 +51,7 @@ void EffectSsStick_Draw(PlayState* play, u32 index, EffectSs* this) { Matrix_RotateZYX(0, this->rYaw, 0, MTXMODE_APPLY); gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); Gfx_SetupDL25_Opa(gfxCtx); - gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.status[this->rObjBankIndex].segment); + gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.slots[this->rObjBankIndex].segment); gSPSegment(POLY_OPA_DISP++, 0x0C, gCullBackDList); gSPDisplayList(POLY_OPA_DISP++, gDekuStickDL); diff --git a/tools/disasm/functions.txt b/tools/disasm/functions.txt index 79ab56b45..0d5c950c6 100644 --- a/tools/disasm/functions.txt +++ b/tools/disasm/functions.txt @@ -2415,10 +2415,10 @@ 0x8012F1BC:("Inventory_IncrementSkullTokenCount",), 0x8012F22C:("Inventory_GetSkullTokenCount",), 0x8012F278:("Inventory_SaveLotteryCodeGuess",), - 0x8012F2E0:("Object_Spawn",), - 0x8012F3D0:("Object_InitBank",), - 0x8012F4FC:("Object_UpdateBank",), - 0x8012F608:("Object_GetIndex",), + 0x8012F2E0:("Object_SpawnPersistent",), + 0x8012F3D0:("Object_InitContext",), + 0x8012F4FC:("Object_UpdateEntries",), + 0x8012F608:("Object_GetSlot",), 0x8012F668:("Object_IsLoaded",), 0x8012F698:("Object_LoadAll",), 0x8012F73C:("func_8012F73C",), diff --git a/tools/namefixer.py b/tools/namefixer.py index 43e554975..1fe4ce07f 100755 --- a/tools/namefixer.py +++ b/tools/namefixer.py @@ -774,6 +774,9 @@ wordReplace = { "func_80133038": "Schedule_RunScript", + "Object_GetIndex": "Object_GetSlot", + "Object_Spawn": "Object_SpawnPersistent", + "EffectSsKiraKira_SpawnSmallYellow": "EffectSsKirakira_SpawnSmallYellow", "EffectSsKiraKira_SpawnSmall": "EffectSsKirakira_SpawnSmall", "EffectSsKiraKira_SpawnDispersed": "EffectSsKirakira_SpawnDispersed", @@ -1156,6 +1159,7 @@ wordReplace = { "play->roomCtx.curRoom.unk3": "play->roomCtx.curRoom.behaviorType1", "play->roomCtx.curRoom.unk2": "play->roomCtx.curRoom.behaviorType2", "play->roomCtx.unk31": "play->roomCtx.status", + "play->objectCtx.status": "play->objectCtx.slots", "actorCtx.unkC": "actorCtx.halfDaysBit", "actorCtx.unk1F4": "actorCtx.playerImpact.type", diff --git a/tools/sizes/code_functions.csv b/tools/sizes/code_functions.csv index 762334814..02e1bf9cd 100644 --- a/tools/sizes/code_functions.csv +++ b/tools/sizes/code_functions.csv @@ -1929,10 +1929,10 @@ asm/non_matchings/code/code_8012EC80/Inventory_SaveDekuPlaygroundHighScore.s,Inv asm/non_matchings/code/code_8012EC80/Inventory_IncrementSkullTokenCount.s,Inventory_IncrementSkullTokenCount,0x8012F1BC,0x1C asm/non_matchings/code/code_8012EC80/Inventory_GetSkullTokenCount.s,Inventory_GetSkullTokenCount,0x8012F22C,0x13 asm/non_matchings/code/code_8012EC80/Inventory_SaveLotteryCodeGuess.s,Inventory_SaveLotteryCodeGuess,0x8012F278,0x16 -asm/non_matchings/code/z_scene/Object_Spawn.s,Object_Spawn,0x8012F2E0,0x3C -asm/non_matchings/code/z_scene/Object_InitBank.s,Object_InitBank,0x8012F3D0,0x4B -asm/non_matchings/code/z_scene/Object_UpdateBank.s,Object_UpdateBank,0x8012F4FC,0x43 -asm/non_matchings/code/z_scene/Object_GetIndex.s,Object_GetIndex,0x8012F608,0x18 +asm/non_matchings/code/z_scene/Object_SpawnPersistent.s,Object_SpawnPersistent,0x8012F2E0,0x3C +asm/non_matchings/code/z_scene/Object_InitContext.s,Object_InitContext,0x8012F3D0,0x4B +asm/non_matchings/code/z_scene/Object_UpdateEntries.s,Object_UpdateEntries,0x8012F4FC,0x43 +asm/non_matchings/code/z_scene/Object_GetSlot.s,Object_GetSlot,0x8012F608,0x18 asm/non_matchings/code/z_scene/Object_IsLoaded.s,Object_IsLoaded,0x8012F668,0xC asm/non_matchings/code/z_scene/Object_LoadAll.s,Object_LoadAll,0x8012F698,0x29 asm/non_matchings/code/z_scene/func_8012F73C.s,func_8012F73C,0x8012F73C,0x18