diff --git a/Makefile b/Makefile
index 892d0355b..8782c02ad 100644
--- a/Makefile
+++ b/Makefile
@@ -102,7 +102,7 @@ endif
# Check code syntax with host compiler
ifneq ($(RUN_CC_CHECK),0)
- CHECK_WARNINGS := -Wall -Wextra -Wno-format-security -Wno-unknown-pragmas -Wno-unused-parameter -Wno-unused-variable -Wno-missing-braces -Wno-int-conversion -Wno-unused-but-set-variable -Wno-unused-label
+ CHECK_WARNINGS := -Wall -Wextra -Wno-format-security -Wno-unknown-pragmas -Wno-unused-parameter -Wno-unused-variable -Wno-missing-braces -Wno-int-conversion -Wno-unused-but-set-variable -Wno-unused-label -Wno-sign-compare -Wno-tautological-compare
CC_CHECK := gcc -fno-builtin -fsyntax-only -funsigned-char -fdiagnostics-color -std=gnu89 -D _LANGUAGE_C -D NON_MATCHING $(IINC) -nostdinc $(CHECK_WARNINGS)
ifneq ($(WERROR), 0)
CC_CHECK += -Werror
diff --git a/assets/xml/objects/object_and.xml b/assets/xml/objects/object_and.xml
index a076a1c07..69ffebc7b 100644
--- a/assets/xml/objects/object_and.xml
+++ b/assets/xml/objects/object_and.xml
@@ -1,79 +1,80 @@
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_oF1d_map.xml b/assets/xml/objects/object_oF1d_map.xml
index 0f331cbce..a241eac13 100644
--- a/assets/xml/objects/object_oF1d_map.xml
+++ b/assets/xml/objects/object_oF1d_map.xml
@@ -47,16 +47,16 @@
-
-
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_spot11_obj.xml b/assets/xml/objects/object_spot11_obj.xml
index c049bb337..58d146203 100644
--- a/assets/xml/objects/object_spot11_obj.xml
+++ b/assets/xml/objects/object_spot11_obj.xml
@@ -1,13 +1,13 @@
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/overlays/ovl_Arrow_fire.xml b/assets/xml/overlays/ovl_Arrow_Fire.xml
similarity index 100%
rename from assets/xml/overlays/ovl_Arrow_fire.xml
rename to assets/xml/overlays/ovl_Arrow_Fire.xml
diff --git a/assets/xml/objects/object_fbdemo_triforce.xml b/assets/xml/overlays/ovl_fbdemo_triforce.xml
similarity index 100%
rename from assets/xml/objects/object_fbdemo_triforce.xml
rename to assets/xml/overlays/ovl_fbdemo_triforce.xml
diff --git a/assets/xml/overlays/ovl_fbdemo_wipe1.xml b/assets/xml/overlays/ovl_fbdemo_wipe1.xml
new file mode 100644
index 000000000..281c8ebfb
--- /dev/null
+++ b/assets/xml/overlays/ovl_fbdemo_wipe1.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/diff_settings.py b/diff_settings.py
old mode 100755
new mode 100644
diff --git a/docs/tutorial/advanced_control_flow.md b/docs/tutorial/advanced_control_flow.md
index 43e9e6d46..aa4ba3621 100644
--- a/docs/tutorial/advanced_control_flow.md
+++ b/docs/tutorial/advanced_control_flow.md
@@ -136,7 +136,7 @@ void EnMs_Update(Actor* thisx, PlayState* play) {
void EnMs_Draw(Actor* thisx, PlayState* play) {
EnMs* this = THIS;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount, NULL,
NULL, &this->actor);
}
diff --git a/docs/tutorial/documenting.md b/docs/tutorial/documenting.md
index 71f3347e3..11d8b3546 100644
--- a/docs/tutorial/documenting.md
+++ b/docs/tutorial/documenting.md
@@ -244,7 +244,7 @@ void EnRecepgirl_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, D_80C106B0[this->unk_2AC]);
diff --git a/docs/tutorial/draw_functions.md b/docs/tutorial/draw_functions.md
index ccc738219..43fe8579c 100644
--- a/docs/tutorial/draw_functions.md
+++ b/docs/tutorial/draw_functions.md
@@ -29,7 +29,7 @@ void EnRecepgirl_Draw(Actor* thisx, PlayState* play) {
temp_a0 = play->state.gfxCtx;
sp30 = temp_a0;
- func_8012C28C(temp_a0);
+ Gfx_SetupDL25_Opa(temp_a0);
temp_v1 = sp30->polyOpa.p;
sp30->polyOpa.p = temp_v1 + 8;
temp_v1->words.w0 = 0xDB060020;
@@ -105,7 +105,7 @@ void EnRecepgirl_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, D_80C106B0[this->unk_2AC]);
@@ -217,7 +217,7 @@ void ObjTree_Draw(Actor* thisx, PlayState* play) {
sp34 = (s16) (s32) (f32) thisx->shape.rot.z;
temp_a0 = play->state.gfxCtx;
temp_s0 = temp_a0;
- func_8012C28C(temp_a0);
+ Gfx_SetupDL25_Opa(temp_a0);
temp_v0 = temp_s0->polyOpa.p;
temp_s0->polyOpa.p = temp_v0 + 8;
temp_v0->words.w0 = 0xDA380003;
@@ -309,7 +309,7 @@ void ObjTree_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, D_06000680);
diff --git a/include/functions.h b/include/functions.h
index e120f0c11..518a11275 100644
--- a/include/functions.h
+++ b/include/functions.h
@@ -128,12 +128,8 @@ void MtxConv_L2F(MtxF* mtx, Mtx* mf);
void __assert(const char* file, u32 lineNum);
// void func_800862B4(void);
-void* SystemArena_MallocMin1(u32 size);
-void SystemArena_FreeNullCheck(void* ptr);
-void SystemArena_RunInits(void);
-void SystemArena_Init(void* start, size_t size);
s32 func_80086620(OSMesgQueue* param_1, PadMgr* param_2, OSContStatus* param_3);
-// void func_80086760(void);
+f32 func_80086760(f32 x);
// void func_80086794(void);
// void func_800867B4(void);
// void func_800867D4(void);
@@ -328,7 +324,7 @@ OSTime osGetTime(void);
void guRotateF(float m[4][4], f32 a, f32 x, f32 y, f32 z);
void guRotate(Mtx* m, f32 a, f32 x, f32 y, f32 z);
void __osSetGlobalIntMask(u32 mask);
-// void osVoiceInit(void);
+s32 osVoiceInit(OSMesgQueue* mq, OSVoiceHandle* handle, s32 channel);
s32 __osContChannelReset(OSMesgQueue* mq, s32 channel);
// void __osVoiceSetADConverter(void);
s32 osAiSetFrequency(u32 frequency);
@@ -609,8 +605,8 @@ void Flags_SetCollectible(PlayState* play, s32 flag);
void TitleCard_InitBossName(GameState* gameState, TitleCardContext* titleCtx, TexturePtr texture, s16 x, s16 y, u8 width, u8 height);
-s32 func_800B648C(PlayState* play, s32 arg1, s32 timer, f32 arg3, Vec3f* arg4);
-f32 func_800B64FC(PlayState* play, f32 arg1, Vec3f* arg2, u32* arg3);
+s32 Actor_SetPlayerImpact(PlayState* play, PlayerImpactType type, s32 timer, f32 dist, Vec3f* pos);
+f32 Actor_GetPlayerImpact(PlayState* play, f32 range, Vec3f* pos, PlayerImpactType* type);
void* func_800B6584(PlayState* play, s16 id, void* arg2, size_t size);
void* func_800B6608(PlayState* play, s16 id);
void* func_800B6680(PlayState* play, s16 id);
@@ -726,8 +722,9 @@ Actor* Actor_SpawnAsChildAndCutscene(ActorContext* actorCtx, PlayState* play, s1
Actor* Actor_SpawnAsChild(ActorContext* actorCtx, Actor* parent, PlayState* play, s16 actorId, f32 posX, f32 posY, f32 posZ, s16 rotX, s16 rotY, s16 rotZ, s32 params);
void Actor_SpawnTransitionActors(PlayState* play, ActorContext* actorCtx);
void Enemy_StartFinishingBlow(PlayState* play, Actor* actor);
-s16 func_800BBAC0(s16 arg0[2], s16 arg1, s16 arg2, s16 arg3);
-s16 func_800BBB74(s16 arg0[2], s16 arg1, s16 arg2, s16 arg3);
+s16 func_800BBAC0(BlinkInfo* info, s16 arg1, s16 arg2, s16 arg3);
+s16 func_800BBB74(BlinkInfo* info, s16 arg1, s16 arg2, s16 arg3);
+s16 func_800BBC20(BlinkInfo* info, s16 arg1, s16 arg2, s16 arg3);
void Actor_SpawnBodyParts(Actor* actor, PlayState* play, s32 partParams, Gfx** dList);
void Actor_SpawnFloorDustRing(PlayState* play, Actor* actor, Vec3f* posXZ, f32 radius, s32 countMinusOne, f32 randAccelWeight, s16 scale, s16 scaleStep, u8 useLighting);
void func_800BBFB0(PlayState* play, Vec3f* position, f32 arg2, s32 arg3, s16 arg4, s16 scaleStep, u8 arg6);
@@ -739,9 +736,9 @@ s16 Actor_TestFloorInDirection(Actor* actor, PlayState* play, f32 distance, s16
s32 Actor_IsTargeted(PlayState* play, Actor* actor);
s32 Actor_OtherIsTargeted(PlayState* play, Actor* actor);
void func_800BC620(Vec3f* pos, Vec3f* scale, u8 alpha, PlayState* play);
-void Actor_AddQuake(PlayState* play, s16 verticalMag, s16 countdown);
-void Actor_AddQuakeWithSpeed(PlayState* play, s16 verticalMag, s16 countdown, s16 speed);
-void func_800BC848(Actor* actor, PlayState* play, s16 y, s16 countdown);
+void Actor_RequestQuake(PlayState* play, s16 y, s16 duration);
+void Actor_RequestQuakeWithSpeed(PlayState* play, s16 y, s16 duration, s16 speed);
+void Actor_RequestQuakeAndRumble(Actor* actor, PlayState* play, s16 quakeY, s16 quakeDuration);
void Actor_DrawDoorLock(PlayState* play, s32 frame, s32 type);
void Actor_SetColorFilter(Actor* actor, u16 colorFlag, u16 colorIntensityMax, u16 bufFlag, u16 duration);
Hilite* func_800BCBF4(Vec3f* arg0, PlayState* play);
@@ -797,47 +794,45 @@ s32 DynaPolyActor_IsSwitchPressed(DynaPolyActor* dynaActor);
s32 DynaPolyActor_IsHeavySwitchPressed(DynaPolyActor* dynaActor);
s32 DynaPolyActor_ValidateMove(PlayState* play, DynaPolyActor* dynaActor, s16 startRadius, s16 endRadius, s16 startHeight);
-Camera* Camera_Alloc(View* view, CollisionContext* bg, PlayState* play);
-void Camera_Free(Camera* camera);
-void Camera_Init(Camera* camera, View* view, CollisionContext* bg, PlayState* play);
-// void func_800DDFE0(void);
-void Camera_InitPlayerSettings(Camera* camera, Player* player);
+Camera* Camera_Create(View* view, CollisionContext* colCtx, PlayState* play);
+void Camera_Destroy(Camera* camera);
+void Camera_Init(Camera* camera, View* view, CollisionContext* colCtx, PlayState* play);
+void func_800DDFE0(Camera* camera);
+void Camera_InitFocalActorSettings(Camera* camera, Actor* focalActor);
s32 Camera_ChangeStatus(Camera* camera, s16 status);
-// void func_800DE324(void);
-// void func_800DE62C(void);
-// void func_800DE840(void);
-// void func_800DE890(void);
-// UNK_TYPE4 func_800DE954(Camera* camera);
-Vec3s* Camera_Update(Vec3s* param_1, Camera* camera);
-// void func_800DF498(void);
-u32 Camera_SetMode(Camera* camera, s16 mode, s8 param_3);
+s32 Camera_UpdateWater(Camera* camera);
+void Camera_EarthquakeDay3(Camera* camera);
+s32 Camera_UpdateHotRoom(Camera* camera);
+s32 Camera_SetSwordDistortion(Camera* camera);
+s32 Camera_RequestGiantsMaskSetting(Camera* camera);
+Vec3s* Camera_Update(Vec3s* inputDir, Camera* camera);
+s32 func_800DF498(Camera* camera);
+s32 Camera_ChangeModeFlags(Camera* camera, s16 mode, u8 forceChange);
s32 Camera_ChangeMode(Camera* camera, s16 mode);
-s32 func_800DF86C(Camera* camera, s16 arg1);
-// void func_800DF8EC(void);
+s32 Camera_CheckValidMode(Camera* camera, s16 mode);
+s16 Camera_ChangeSettingFlags(Camera* camera, s16 setting, s16 flags);
s32 Camera_ChangeSetting(Camera* camera, s16 setting);
-s32 Camera_ChangeDataIdx(Camera* camera, s32 camDataIdx);
-// void func_800DFC1C(void);
-// void func_800DFC40(void);
-s32 Camera_GetInputDirYaw(Camera* camera);
-void Camera_GetCamDir(Vec3s* dst, Camera* camera);
+s32 Camera_ChangeActorCsCamIndex(Camera* camera, s32 bgCamIndex);
+Vec3s* Camera_GetInputDir(Vec3s* dst, Camera* camera);
+s16 Camera_GetInputDirPitch(Camera* camera);
+s16 Camera_GetInputDirYaw(Camera* camera);
+Vec3s* Camera_GetCamDir(Vec3s* dst, Camera* camera);
s16 Camera_GetCamDirPitch(Camera* camera);
s16 Camera_GetCamDirYaw(Camera* camera);
-void Camera_AddQuake(Camera* camera, s32 arg1, s16 y, s32 countdown);
+s32 Camera_AddQuake(Camera* camera, s32 arg1, s16 y, s32 countdown);
s32 Camera_SetViewParam(Camera* camera, s32 viewFlag, void* param);
-// UNK_TYPE4 func_800DFEF0(s32 param_1, u16 param_2);
-void func_800DFF18(Camera* camera, s32 arg1);
-// UNK_TYPE4 func_800DFF34(s32 param_1);
-// UNK_TYPE4 func_800DFF44(void);
-s16 Camera_SetFlags(Camera* iParm1, s16 flags);
-s16 Camera_ClearFlags(Camera* camera, s16 flags);
+s32 Camera_UnsetViewFlag(Camera* camera, s16 viewFlag);
+s32 Camera_OverwriteStateFlags(Camera* camera, s16 stateFlags);
+s16 Camera_SetStateFlag(Camera* camera, s16 flags);
+s16 Camera_UnsetStateFlag(Camera* camera, s16 flags);
s32 Camera_ChangeDoorCam(Camera* camera, Actor* doorActor, s16 bgCamIndex, f32 arg3, s16 timer1, s16 timer2, s16 timer3);
-s32 Camera_Copy(Camera* dstCamera, Camera* srcCamera);
-// UNK_TYPE4 func_800E01AC(void);
-Vec3f* Camera_GetQuakeOffset(Vec3f* dst, Camera* camera);
-// void func_800E01DC(s32 param_1, u32 param_2, UNK_TYPE4 param_3, UNK_TYPE4 param_4, UNK_TYPE2 param_5, UNK_TYPE2 param_6);
-// UNK_TYPE4 func_800E0228(void);
-void func_800E0238(Camera* camera);
-void Camera_SetToTrackActor(Camera* camera, Actor* actor);
+s32 Camera_Copy(Camera* dstCam, Camera* srcCam);
+s32 Camera_IsDbgCamEnabled(void);
+Vec3f* Camera_GetQuakeOffset(Vec3f* quakeOffset, Camera* camera);
+void Camera_SetCameraData(Camera* camera, s16 setDataFlags, void* data0, void* data1, s16 data2, s16 data3);
+s32 Camera_GetNegOne(void);
+s16 func_800E0238(Camera* camera);
+void Camera_SetFocalActor(Camera* camera, Actor* actor);
void Camera_SetTargetActor(Camera* camera, Actor* actor);
f32 Camera_GetWaterYPos(Camera* camera);
void func_800E0348(Camera* camera);
@@ -1343,7 +1338,7 @@ void* func_801068FC(PlayState* play, void* arg1, size_t size);
void func_80108AF8(PlayState* play);
s32 func_801090B0(s32 arg0);
s32 func_80109124(s16 arg0);
-// void func_801091F0(void);
+void func_801091F0(PlayState* play);
void func_80109428(PlayState* play);
// void func_801094A0(void);
// void func_801094C8(void);
@@ -1462,17 +1457,17 @@ f32 OLib_ClampMinDist(f32 val, f32 min);
f32 OLib_ClampMaxDist(f32 val, f32 max);
Vec3f* OLib_Vec3fDistNormalize(Vec3f* dest, Vec3f* a, Vec3f* b);
Vec3f* OLib_VecSphToVec3f(Vec3f* dest, VecSph* sph);
-Vec3f* OLib_VecSphGeoToVec3f(Vec3f* dest, VecSph* sph);
+Vec3f* OLib_VecGeoToVec3f(Vec3f* dest, VecGeo* geo);
VecSph* OLib_Vec3fToVecSph(VecSph* dest, Vec3f* vec);
-VecSph* OLib_Vec3fToVecSphGeo(VecSph* dest, Vec3f* vec);
+VecGeo* OLib_Vec3fToVecGeo(VecGeo* dest, Vec3f* vec);
VecSph* OLib_Vec3fDiffToVecSph(VecSph* dest, Vec3f* a, Vec3f* b);
-VecSph* OLib_Vec3fDiffToVecSphGeo(VecSph* dest, Vec3f* a, Vec3f* b);
-Vec3f* OLib_VecSphAddToVec3f(Vec3f* dest, Vec3f* a, VecSph* sph);
+VecGeo* OLib_Vec3fDiffToVecGeo(VecGeo* dest, Vec3f* a, Vec3f* b);
+Vec3f* OLib_AddVecGeoToVec3f(Vec3f* dest, Vec3f* a, VecGeo* geo);
Vec3f* OLib_Vec3fDiffRad(Vec3f* dest, Vec3f* a, Vec3f* b);
Vec3f* OLib_Vec3fDiffDegF(Vec3f* dest, Vec3f* a, Vec3f* b);
Vec3s* OLib_Vec3fDiffBinAng(Vec3s* dest, Vec3f* a, Vec3f* b);
-void OLib_DbCameraVec3fDiff(PosRot* a, Vec3f* b, Vec3f* dest, s16 mode);
-void OLib_DbCameraVec3fSum(PosRot* a, Vec3f* b, Vec3f* dest, s16 mode);
+void OLib_Vec3fDiff(PosRot* a, Vec3f* b, Vec3f* dest, s16 mode);
+void OLib_Vec3fAdd(PosRot* a, Vec3f* b, Vec3f* dest, s16 mode);
Gfx* Gfx_DrawTexRectRGBA16(Gfx* gfx, TexturePtr texture, s16 textureWidth, s16 textureHeight, s16 rectLeft, s16 rectTop, s16 rectWidth, s16 rectHeight, u16 dsdx, u16 dtdy);
Gfx* Gfx_DrawTexRectIA8(Gfx* gfx, TexturePtr texture, s16 textureWidth, s16 textureHeight, s16 rectLeft, s16 rectTop, s16 rectWidth, s16 rectHeight, u16 dsdx, u16 dtdy);
@@ -1599,87 +1594,6 @@ s32 func_80128640(PlayState* play, Player* player, Gfx* dlist);
void Player_SetFeetPos(PlayState* play, Player* player, s32 limbIndex);
void Player_PostLimbDrawGameplay(PlayState* play, s32 limbIndex, Gfx** dList1, Gfx** dList2, Vec3s* rot, Actor* actor);
-Gfx* Gfx_SetFog(Gfx* gfx, s32 r, s32 g, s32 b, s32 a, s32 n, s32 f);
-Gfx* Gfx_SetFogWithSync(Gfx* gfx, s32 r, s32 g, s32 b, s32 a, s32 n, s32 f);
-Gfx* Gfx_SetFog2(Gfx* gfx, s32 r, s32 g, s32 b, s32 a, s32 n, s32 f);
-Gfx* Gfx_CallSetupDLImpl(Gfx* gfx, u32 i);
-Gfx* Gfx_CallSetupDL(Gfx* gfx, u32 i);
-void Gfx_CallSetupDLAtPtr(Gfx** gfxp, u32 i);
-Gfx* func_8012BFC4(Gfx* gfx);
-Gfx* func_8012BFEC(Gfx* gfx);
-Gfx* func_8012C014(Gfx* gfx);
-void func_8012C058(GraphicsContext* gfxCtx);
-void func_8012C080(GraphicsContext* gfxCtx);
-void func_8012C0A8(GraphicsContext* gfxCtx);
-void func_8012C0D0(GraphicsContext* gfxCtx);
-void func_8012C0F8(GraphicsContext* gfxCtx);
-void func_8012C120(GraphicsContext* gfxCtx);
-void func_8012C148(GraphicsContext* gfxCtx);
-void func_8012C170(GraphicsContext* gfxCtx);
-Gfx* func_8012C198(Gfx* gfx);
-void func_8012C1C0(GraphicsContext* gfxCtx);
-Gfx* func_8012C1EC(Gfx* gfx);
-void func_8012C214(GraphicsContext* gfxCtx);
-void func_8012C240(GraphicsContext* gfxCtx);
-void func_8012C268(PlayState* play);
-void func_8012C28C(GraphicsContext* gfxCtx);
-Gfx* func_8012C2B4(Gfx* gfx);
-void func_8012C2DC(GraphicsContext* gfxCtx);
-Gfx* func_8012C304(Gfx* gfx);
-void func_8012C32C(GraphicsContext* gfxCtx);
-void func_8012C354(GraphicsContext* gfxCtx);
-void func_8012C37C(GraphicsContext* gfxCtx);
-Gfx* func_8012C3A4(Gfx* gfx);
-Gfx* func_8012C3CC(Gfx* gfx);
-void func_8012C3F4(GraphicsContext* gfxCtx);
-void func_8012C420(GraphicsContext* gfxCtx);
-void func_8012C448(GraphicsContext* gfxCtx);
-void func_8012C470(GraphicsContext* gfxCtx);
-Gfx* func_8012C498(Gfx* gfx);
-void func_8012C4C0(GraphicsContext* gfxCtx);
-void func_8012C4E8(GraphicsContext* gfxCtx);
-void func_8012C510(GraphicsContext* gfxCtx);
-void func_8012C538(GraphicsContext* gfxCtx);
-void func_8012C560(GraphicsContext* gfxCtx);
-void func_8012C588(GraphicsContext* gfxCtx);
-void func_8012C5B0(GraphicsContext* gfxCtx);
-void func_8012C5D8(GraphicsContext* gfxCtx);
-Gfx* func_8012C600(Gfx* gfx);
-void func_8012C628(GraphicsContext* gfxCtx);
-void func_8012C654(GraphicsContext* gfxCtx);
-void func_8012C680(Gfx** gfxp);
-void func_8012C6AC(GraphicsContext* gfxCtx);
-void func_8012C6D4(GraphicsContext* gfxCtx);
-void func_8012C6FC(GraphicsContext* gfxCtx);
-Gfx* func_8012C724(Gfx* gfx);
-Gfx* func_8012C74C(Gfx* gfx);
-Gfx* func_8012C774(Gfx* gfx);
-Gfx* func_8012C7B8(Gfx* gfx);
-Gfx* func_8012C7FC(Gfx* gfx);
-Gfx* func_8012C840(Gfx* gfx);
-Gfx* func_8012C868(Gfx* gfx);
-void func_8012C8AC(GraphicsContext* gfxCtx);
-void func_8012C8D4(GraphicsContext* gfxCtx);
-void func_8012C8FC(GraphicsContext* gfxCtx);
-void func_8012C924(GraphicsContext* gfxCtx);
-void func_8012C94C(GraphicsContext* gfxCtx);
-void func_8012C974(GraphicsContext* gfxCtx);
-void func_8012C9BC(GraphicsContext* gfxCtx);
-void func_8012C9E4(GraphicsContext* gfxCtx);
-void func_8012CA0C(Gfx** gfxp);
-void func_8012CA38(GraphicsContext* gfxCtx);
-Gfx* Gfx_BranchTexScroll(Gfx** gfxp, u32 x, u32 y, s32 width, s32 height);
-void func_8012CB04(Gfx** gfxp, u32 x, u32 y);
-Gfx* func_8012CB28(GraphicsContext* gfxCtx, u32 x, u32 y);
-Gfx* Gfx_TexScroll(GraphicsContext* gfxCtx, u32 x, u32 y, s32 width, s32 height);
-Gfx* Gfx_TwoTexScroll(GraphicsContext* gfxCtx, s32 tile1, u32 x1, u32 y1, s32 width1, s32 height1, s32 tile2, u32 x2, u32 y2, s32 width2, s32 height2);
-Gfx* Gfx_TwoTexScrollEnvColor(GraphicsContext* gfxCtx, s32 tile1, u32 x1, u32 y1, s32 width1, s32 height1, s32 tile2, u32 x2, u32 y2, s32 width2, s32 height2, s32 r, s32 g, s32 b, s32 a);
-Gfx* Gfx_EnvColor(GraphicsContext* gfxCtx, s32 r, s32 g, s32 b, s32 a);
-Gfx* Gfx_PrimColor(GraphicsContext* gfxCtx, s32 lodfrac, s32 r, s32 g, s32 b, s32 a);
-void func_8012CF0C(GraphicsContext* gfxCtx, s32 clearFb, s32 clearZb, u8 r, u8 g, u8 b);
-void func_8012D374(GraphicsContext* gfxCtx, u8 r, u8 g, u8 b);
-void func_8012D40C(f32* param_1, f32* param_2, s16* param_3);
-
void Room_Noop(PlayState* play, Room* room, Input* input, s32 arg3);
void Room_Init(PlayState* play, RoomContext* roomCtx);
size_t Room_AllocateAndLoad(PlayState* play, RoomContext* roomCtx);
@@ -2100,34 +2014,6 @@ ListAlloc* ListAlloc_Init(ListAlloc* this);
// void ListAlloc_Free(void);
void ListAlloc_FreeAll(ListAlloc* this);
void Main(void* arg);
-u32 Padmgr_GetControllerBitmask(void);
-void func_80174F24(void (*arg0)(void*), void* arg1);
-void func_80174F44(void (*arg0)(void*), void* arg1);
-void func_80174F7C(void (*arg0)(s32), void* arg1);
-void func_80174F9C(void (*arg0)(s32), void* arg1);
-// OSMesgQueue* Padmgr_GetEventCallback(void);
-// void func_80175008(void);
-void Padmgr_SetEventCallback(OSMesg pvParm1);
-// void func_8017506C(void);
-// void Padmgr_Lock(void);
-// void Padmgr_Unlock(void);
-// void func_801750FC(void);
-// void func_80175364(void);
-void func_80175434(void);
-void func_8017544C(s32 port, s32 rumbleOn);
-void PadMgr_RumbleSet(u8 rumbleEnabled[MAXCONTROLLERS]);
-s32 PadMgr_ControllerHasRumblePak(s32 port);
-void Padmgr_CalcStickEdges(Input* input);
-// void Padmgr_ParseState(void);
-// void func_801759BC(void);
-// void func_80175AE0(void);
-// void Padmgr_Update(void);
-// void Padmgr_Stop(void);
-void func_80175E68(Input* input, s32 param_2);
-void Padmgr_GetInput(Input* input, s32 param_2);
-void Padmgr_GetInput2(Input* input, s32 param_2);
-void Padmgr_ThreadEntry(PadMgr* padmgr);
-void PadMgr_Init(OSMesgQueue* siEventCallbackQueue, IrqMgr* irqmgr, OSId threadId, OSPri threadPri, void* stack);
void Sched_SwapFramebuffer(CfbInfo* cfbInfo);
void Sched_RetraceUpdateFramebuffer(SchedContext* sched, CfbInfo* cfbInfo);
void Sched_HandleReset(SchedContext* sched);
@@ -2191,8 +2077,8 @@ f32 randPlusMinusPoint5Scaled(f32 scale);
f32 Math3D_Normalize(Vec3f* vec);
s32 Math3D_PlaneVsLineSegClosestPoint(f32 planeAA, f32 planeAB, f32 planeAC, f32 planeADist, f32 planeBA, f32 planeBB, f32 planeBC, f32 planeBDist, Vec3f* linePointA, Vec3f* linePointB, Vec3f* closestPoint);
s32 func_80179798(Vec3f* param_1, Vec3f* param_2, Vec3f* param_3, Vec3f* param_4, Vec3f* param_5, Vec3f* param_6);
-// void func_80179A44(void);
-void func_80179B34(float fParm1, f32 fParm2, f32 fParm5, f32 fParm6, f32 param_5, f32 param_6, f32 param_7, float* param_8, float* param_9);
+void func_80179A44(Vec3f* arg0, PosRot* arg1, Vec3f* arg2);
+void func_80179B34(f32 arg0, f32 arg1, f32 arg2, f32 arg3, f32 arg4, f32 arg5, f32 arg6, f32* arg7, f32* arg8);
// UNK_TYPE4 func_80179B94(f32 fParm1, f32 fParm2, f32 fParm5, f32 param_4, f32 param_5, f32 param_6, f32 param_7, f32 param_8, Vec3f* param_9);
// void func_80179D74(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5, UNK_TYPE4 param_6, UNK_TYPE4 param_7, UNK_TYPE4 param_8, UNK_TYPE4 param_9, UNK_TYPE4 param_10);
void Math3D_ScaleAndAdd(Vec3f* a, Vec3f* b, f32 scale, Vec3f* dst);
@@ -2616,7 +2502,7 @@ void Audio_ResetForAudioHeapStep3(void);
void Audio_ResetForAudioHeapStep2(void);
void Audio_ResetForAudioHeapStep1(s32 specId);
-// void func_801A4EB0(void);
+void func_801A4EB0(void);
// void func_801A4EB8(void);
void func_801A4FD8(void);
void func_801A5080(u16 arg0);
diff --git a/include/gfx.h b/include/gfx.h
new file mode 100644
index 000000000..dfbd78d74
--- /dev/null
+++ b/include/gfx.h
@@ -0,0 +1,274 @@
+#ifndef GFX_H
+#define GFX_H
+
+#include "ultra64.h"
+#include "PR/sched.h"
+#include "thga.h"
+#include "alignment.h"
+
+struct GameState;
+
+typedef enum SetupDL {
+ /* 0x00 */ SETUPDL_0,
+ /* 0x01 */ SETUPDL_1,
+ /* 0x02 */ SETUPDL_2,
+ /* 0x03 */ SETUPDL_3,
+ /* 0x04 */ SETUPDL_4,
+ /* 0x05 */ SETUPDL_5,
+ /* 0x06 */ SETUPDL_6,
+ /* 0x07 */ SETUPDL_7,
+ /* 0x08 */ SETUPDL_8,
+ /* 0x09 */ SETUPDL_9,
+ /* 0x0A */ SETUPDL_10,
+ /* 0x0B */ SETUPDL_11,
+ /* 0x0C */ SETUPDL_12,
+ /* 0x0D */ SETUPDL_13,
+ /* 0x0E */ SETUPDL_14,
+ /* 0x0F */ SETUPDL_15,
+ /* 0x10 */ SETUPDL_16,
+ /* 0x11 */ SETUPDL_17,
+ /* 0x12 */ SETUPDL_18,
+ /* 0x13 */ SETUPDL_19,
+ /* 0x14 */ SETUPDL_20,
+ /* 0x15 */ SETUPDL_21,
+ /* 0x16 */ SETUPDL_22,
+ /* 0x17 */ SETUPDL_23,
+ /* 0x18 */ SETUPDL_24,
+ /* 0x19 */ SETUPDL_25,
+ /* 0x1A */ SETUPDL_26,
+ /* 0x1B */ SETUPDL_27,
+ /* 0x1C */ SETUPDL_28,
+ /* 0x1D */ SETUPDL_29,
+ /* 0x1E */ SETUPDL_30,
+ /* 0x1F */ SETUPDL_31,
+ /* 0x20 */ SETUPDL_32,
+ /* 0x21 */ SETUPDL_33,
+ /* 0x22 */ SETUPDL_34,
+ /* 0x23 */ SETUPDL_35,
+ /* 0x24 */ SETUPDL_36,
+ /* 0x25 */ SETUPDL_37,
+ /* 0x26 */ SETUPDL_38,
+ /* 0x27 */ SETUPDL_39,
+ /* 0x28 */ SETUPDL_40,
+ /* 0x29 */ SETUPDL_41,
+ /* 0x2A */ SETUPDL_42,
+ /* 0x2B */ SETUPDL_43,
+ /* 0x2C */ SETUPDL_44,
+ /* 0x2D */ SETUPDL_45,
+ /* 0x2E */ SETUPDL_46,
+ /* 0x2F */ SETUPDL_47,
+ /* 0x30 */ SETUPDL_48,
+ /* 0x31 */ SETUPDL_49,
+ /* 0x32 */ SETUPDL_50,
+ /* 0x33 */ SETUPDL_51,
+ /* 0x34 */ SETUPDL_52,
+ /* 0x35 */ SETUPDL_53,
+ /* 0x36 */ SETUPDL_54,
+ /* 0x37 */ SETUPDL_55,
+ /* 0x38 */ SETUPDL_56,
+ /* 0x39 */ SETUPDL_57,
+ /* 0x3A */ SETUPDL_58,
+ /* 0x3B */ SETUPDL_59,
+ /* 0x3C */ SETUPDL_60,
+ /* 0x3D */ SETUPDL_61,
+ /* 0x3E */ SETUPDL_62,
+ /* 0x3F */ SETUPDL_63,
+ /* 0x40 */ SETUPDL_64,
+ /* 0x41 */ SETUPDL_65,
+ /* 0x42 */ SETUPDL_66,
+ /* 0x43 */ SETUPDL_67,
+ /* 0x44 */ SETUPDL_68,
+ /* 0x45 */ SETUPDL_69,
+ /* 0x46 */ SETUPDL_70,
+ /* 0x47 */ SETUPDL_71,
+ /* 0x48 */ SETUPDL_72,
+ /* 0x49 */ SETUPDL_MAX
+} SetupDL;
+
+typedef struct {
+ /* 0x000 */ Gfx taskStart[9];
+ /* 0x048 */ Gfx clearZBuffer[8]; // original name: clear_zb_dl
+ /* 0x088 */ Gfx clearFrameBuffer[5]; // original name: clear_fb_dl
+ /* 0x0B0 */ Gfx setupBuffers[6]; // setup framebuffer and zbuffer
+ /* 0x0E0 */ Gfx unk_E0[12]; // unused
+ /* 0x140 */ Gfx syncSegments[17];
+ /* 0x1C8 */ Gfx setScissor[2];
+ /* 0x1D8 */ Gfx unk_1D8[25]; // unused
+ /* 0x2A0 */ Gfx disps[5];
+ /* 0x2C8 */ Gfx clearFillRect[3]; // fillrect for clearing buffers
+ /* 0x2E0 */ Gfx fillRect[3]; // fillrect for general purpose
+ /* 0x2F8 */ Gfx debugDisp[1];
+} GfxMasterList; // size = 0x300
+
+#define GFXPOOL_HEAD_MAGIC 0x1234
+#define GFXPOOL_TAIL_MAGIC 0x5678
+
+typedef struct GfxPool {
+ /* 0x00000 */ u16 headMagic; // GFXPOOL_HEAD_MAGIC
+ /* 0x00008 */ GfxMasterList master;
+ /* 0x00308 */ Gfx polyXluBuffer[0x800];
+ /* 0x04308 */ Gfx overlayBuffer[0x400];
+ /* 0x06308 */ Gfx workBuffer[0x40];
+ /* 0x06508 */ Gfx debugBuffer[0x40];
+ /* 0x06708 */ Gfx polyOpaBuffer[0x3380];
+ /* 0x20308 */ u16 tailMagic; // GFXPOOL_TAIL_MAGIC
+} GfxPool; // size = 0x20310
+
+typedef struct GraphicsContext {
+ /* 0x000 */ Gfx* polyOpaBuffer; // Pointer to "Zelda 0"
+ /* 0x004 */ Gfx* polyXluBuffer; // Pointer to "Zelda 1"
+ /* 0x008 */ char unk_8[0x8]; // Unused, could this be pointers to "Zelda 2" / "Zelda 3"
+ /* 0x010 */ Gfx* overlayBuffer; // Pointer to "Zelda 4"
+ /* 0x014 */ u32 unk_14;
+ /* 0x018 */ char unk_18[0x20];
+ /* 0x038 */ OSMesg msgBuff[8];
+ /* 0x058 */ OSMesgQueue* schedMsgQ;
+ /* 0x05C */ OSMesgQueue queue;
+ /* 0x074 */ char unk_74[0x04];
+ /* 0x078 */ OSScTask task;
+ /* 0x0E0 */ char unk_E0[0xD0];
+ /* 0x1B0 */ Gfx* workBuffer;
+ /* 0x1B4 */ TwoHeadGfxArena work;
+ /* 0x1C4 */ Gfx* debugBuffer;
+ /* 0x1C8 */ TwoHeadGfxArena debug;
+ /* 0x1D8 */ UNK_TYPE1 unk_1D8[0xAC];
+ /* 0x284 */ OSViMode* viMode;
+ /* 0x288 */ void* zbuffer;
+ /* 0x28C */ char unk_28C[0x1C];
+ /* 0x2A8 */ TwoHeadGfxArena overlay; // "Zelda 4"
+ /* 0x2B8 */ TwoHeadGfxArena polyOpa; // "Zelda 0"
+ /* 0x2C8 */ TwoHeadGfxArena polyXlu; // "Zelda 1"
+ /* 0x2D8 */ u32 gfxPoolIdx;
+ /* 0x2DC */ u16* curFrameBuffer;
+ /* 0x2E0 */ char unk_2E0[0x4];
+ /* 0x2E4 */ u32 viConfigFeatures;
+ /* 0x2E8 */ char unk_2E8[0x2];
+ /* 0x2EA */ u8 updateViMode;
+ /* 0x2EB */ u8 framebufferIndex;
+ /* 0x2EC */ void (*callback)(struct GraphicsContext*, u32);
+ /* 0x2F0 */ u32 callbackArg;
+ /* 0x2F4 */ f32 xScale;
+ /* 0x2F8 */ f32 yScale;
+ /* 0x2FC */ GfxMasterList* masterList;
+} GraphicsContext; // size = 0x300
+
+Gfx* Gfx_SetFog(Gfx* gfx, s32 r, s32 g, s32 b, s32 a, s32 n, s32 f);
+Gfx* Gfx_SetFogWithSync(Gfx* gfx, s32 r, s32 g, s32 b, s32 a, s32 n, s32 f);
+Gfx* Gfx_SetFog2(Gfx* gfx, s32 r, s32 g, s32 b, s32 a, s32 n, s32 f);
+Gfx* Gfx_SetupDLImpl(Gfx* gfx, u32 i);
+Gfx* Gfx_SetupDL(Gfx* gfx, u32 i);
+void Gfx_SetupDLAtPtr(Gfx** gfxp, u32 i);
+Gfx* Gfx_SetupDL57(Gfx* gfx);
+Gfx* Gfx_SetupDL57_b(Gfx* gfx);
+Gfx* Gfx_SetupDL52_NoCD(Gfx* gfx);
+void Gfx_SetupDL58_Opa(GraphicsContext* gfxCtx);
+void Gfx_SetupDL57_Opa(GraphicsContext* gfxCtx);
+void Gfx_SetupDL50_Opa(GraphicsContext* gfxCtx);
+void Gfx_SetupDL51_Opa(GraphicsContext* gfxCtx);
+void Gfx_SetupDL52_Xlu(GraphicsContext* gfxCtx);
+void Gfx_SetupDL53_Opa(GraphicsContext* gfxCtx);
+void Gfx_SetupDL54_Opa(GraphicsContext* gfxCtx);
+void Gfx_SetupDL55_Xlu(GraphicsContext* gfxCtx);
+Gfx* Gfx_SetupDL26(Gfx* gfx);
+void Gfx_SetupDL26_Opa(GraphicsContext* gfxCtx);
+Gfx* Gfx_SetupDL23(Gfx* gfx);
+void Gfx_SetupDL23_Opa(GraphicsContext* gfxCtx);
+void Gfx_SetupDL25_Xlu2(GraphicsContext* gfxCtx);
+void func_8012C268(struct GameState* gameState);
+void Gfx_SetupDL25_Opa(GraphicsContext* gfxCtx);
+Gfx* Gfx_SetupDL71(Gfx* gfx);
+void Gfx_SetupDL25_Xlu(GraphicsContext* gfxCtx);
+Gfx* Gfx_SetupDL72(Gfx* gfx);
+void Gfx_SetupDL31_Opa(GraphicsContext* gfxCtx);
+void Gfx_SetupDL32_Opa(GraphicsContext* gfxCtx);
+void Gfx_SetupDL33_Opa(GraphicsContext* gfxCtx);
+Gfx* Gfx_SetupDL64(Gfx* gfx);
+Gfx* Gfx_SetupDL34(Gfx* gfx);
+void Gfx_SetupDL34_Opa(GraphicsContext* gfxCtx);
+void Gfx_SetupDL35_Opa(GraphicsContext* gfxCtx);
+void Gfx_SetupDL44_Xlu(GraphicsContext* gfxCtx);
+void Gfx_SetupDL36_Opa(GraphicsContext* gfxCtx);
+Gfx* Gfx_SetupDL28(Gfx* gfx);
+void Gfx_SetupDL28_Opa(GraphicsContext* gfxCtx);
+void Gfx_SetupDL43_Opa(GraphicsContext* gfxCtx);
+void Gfx_SetupDL45_Opa(GraphicsContext* gfxCtx);
+void Gfx_SetupDL46_Overlay(GraphicsContext* gfxCtx);
+void Gfx_SetupDL38_Xlu(GraphicsContext* gfxCtx);
+void Gfx_SetupDL4_Xlu(GraphicsContext* gfxCtx);
+void Gfx_SetupDL37_Opa(GraphicsContext* gfxCtx);
+void Gfx_SetupDL2_Opa(GraphicsContext* gfxCtx);
+Gfx* Gfx_SetupDL39(Gfx* gfx);
+void Gfx_SetupDL39_Opa(GraphicsContext* gfxCtx);
+void Gfx_SetupDL39_Overlay(GraphicsContext* gfxCtx);
+void Gfx_SetupDL39_Ptr(Gfx** gfxp);
+void Gfx_SetupDL40_Opa(GraphicsContext* gfxCtx);
+void Gfx_SetupDL41_Opa(GraphicsContext* gfxCtx);
+void Gfx_SetupDL47_Xlu(GraphicsContext* gfxCtx);
+Gfx* Gfx_SetupDL66(Gfx* gfx);
+Gfx* Gfx_SetupDL67(Gfx* gfx);
+Gfx* Gfx_SetupDL68_NoCD(Gfx* gfx);
+Gfx* Gfx_SetupDL69_NoCD(Gfx* gfx);
+Gfx* Gfx_SetupDL65_NoCD(Gfx* gfx);
+Gfx* Gfx_SetupDL70(Gfx* gfx);
+Gfx* Gfx_SetupDL20_NoCD(Gfx* gfx);
+void Gfx_SetupDL42_Opa(GraphicsContext* gfxCtx);
+void Gfx_SetupDL42_Overlay(GraphicsContext* gfxCtx);
+void Gfx_SetupDL48_Opa(GraphicsContext* gfxCtx);
+void Gfx_SetupDL49_Xlu(GraphicsContext* gfxCtx);
+void Gfx_SetupDL27_Xlu(GraphicsContext* gfxCtx);
+void Gfx_SetupDL60_XluNoCD(GraphicsContext* gfxCtx);
+void Gfx_SetupDL61_Xlu(GraphicsContext* gfxCtx);
+void Gfx_SetupDL56_Opa(GraphicsContext* gfxCtx);
+void Gfx_SetupDL56_Ptr(Gfx** gfxp);
+void Gfx_SetupDL59_Opa(GraphicsContext* gfxCtx);
+Gfx* Gfx_BranchTexScroll(Gfx** gfxp, u32 x, u32 y, s32 width, s32 height);
+void func_8012CB04(Gfx** gfxp, u32 x, u32 y);
+Gfx* func_8012CB28(GraphicsContext* gfxCtx, u32 x, u32 y);
+Gfx* Gfx_TexScroll(GraphicsContext* gfxCtx, u32 x, u32 y, s32 width, s32 height);
+Gfx* Gfx_TwoTexScroll(GraphicsContext* gfxCtx, s32 tile1, u32 x1, u32 y1, s32 width1, s32 height1, s32 tile2, u32 x2, u32 y2, s32 width2, s32 height2);
+Gfx* Gfx_TwoTexScrollEnvColor(GraphicsContext* gfxCtx, s32 tile1, u32 x1, u32 y1, s32 width1, s32 height1, s32 tile2, u32 x2, u32 y2, s32 width2, s32 height2, s32 r, s32 g, s32 b, s32 a);
+Gfx* Gfx_EnvColor(GraphicsContext* gfxCtx, s32 r, s32 g, s32 b, s32 a);
+Gfx* Gfx_PrimColor(GraphicsContext* gfxCtx, s32 lodfrac, s32 r, s32 g, s32 b, s32 a);
+void func_8012CF0C(GraphicsContext* gfxCtx, s32 clearFb, s32 clearZb, u8 r, u8 g, u8 b);
+void func_8012D374(GraphicsContext* gfxCtx, u8 r, u8 g, u8 b);
+void func_8012D40C(f32* param_1, f32* param_2, s16* param_3);
+
+extern Gfx gSetupDLs[SETUPDL_MAX][6];
+extern Gfx gEmptyDL[];
+
+#define WORK_DISP __gfxCtx->work.p
+#define POLY_OPA_DISP __gfxCtx->polyOpa.p
+#define POLY_XLU_DISP __gfxCtx->polyXlu.p
+#define OVERLAY_DISP __gfxCtx->overlay.p
+#define DEBUG_DISP __gfxCtx->debug.p
+
+// __gfxCtx shouldn't be used directly.
+// Use the DISP macros defined above when writing to display buffers.
+#define OPEN_DISPS(gfxCtx) \
+ { \
+ GraphicsContext* __gfxCtx = gfxCtx; \
+ s32 __dispPad
+
+#define CLOSE_DISPS(gfxCtx) \
+ (void)0; \
+ } \
+ (void)0
+
+#define GRAPH_ALLOC(gfxCtx, size) ((void*)((gfxCtx)->polyOpa.d = (Gfx*)((u8*)(gfxCtx)->polyOpa.d - ALIGN16(size))))
+
+// Custom gbi macro
+#define gDPSetTileCustom(pkt, fmt, siz, width, height, pal, cms, cmt, masks, maskt, shifts, shiftt) \
+ { \
+ gDPPipeSync(pkt); \
+ gDPTileSync(pkt); \
+ gDPSetTile(pkt, fmt, siz, (((width)*siz##_TILE_BYTES) + 7) >> 3, 0, G_TX_LOADTILE, 0, cmt, maskt, shiftt, cms, \
+ masks, shifts); \
+ gDPTileSync(pkt); \
+ gDPSetTile(pkt, fmt, siz, (((width)*siz##_TILE_BYTES) + 7) >> 3, 0, G_TX_RENDERTILE, pal, cmt, maskt, shiftt, \
+ cms, masks, shifts); \
+ gDPSetTileSize(pkt, G_TX_RENDERTILE, 0, 0, ((width)-1) << G_TEXTURE_IMAGE_FRAC, \
+ ((height)-1) << G_TEXTURE_IMAGE_FRAC); \
+ } \
+ (void)0
+
+#endif
diff --git a/include/io/controller.h b/include/io/controller.h
index 4321df096..b588b4198 100644
--- a/include/io/controller.h
+++ b/include/io/controller.h
@@ -35,10 +35,6 @@
#define CONT_CMD_WRITE_EEPROM_RX 1
#define CONT_CMD_RESET_RX 3
-#define CONT_CMD_NOP 0xFF
-#define CONT_CMD_END 0xFE // Indicates end of a command
-#define CONT_CMD_EXE 1 // Set pif ram status byte to this to do a command
-
#define CONT_ERR_NO_CONTROLLER PFS_ERR_NOPACK /* 1 */
#define CONT_ERR_CONTRFAIL CONT_OVERRUN_ERROR /* 4 */
#define CONT_ERR_INVALID PFS_ERR_INVALID /* 5 */
@@ -48,6 +44,52 @@
#define CONT_ERR_VOICE_WORD 14
#define CONT_ERR_VOICE_NO_RESPONSE 15
+// Joybus commands
+#define CONT_CMD_REQUEST_STATUS 0
+#define CONT_CMD_READ_BUTTON 1
+#define CONT_CMD_READ_PAK 2
+#define CONT_CMD_WRITE_PAK 3
+#define CONT_CMD_READ_EEPROM 4
+#define CONT_CMD_WRITE_EEPROM 5
+#define CONT_CMD_READ36_VOICE 9
+#define CONT_CMD_WRITE20_VOICE 10
+#define CONT_CMD_READ2_VOICE 11
+#define CONT_CMD_WRITE4_VOICE 12
+#define CONT_CMD_SWRITE_VOICE 13
+#define CONT_CMD_CHANNEL_RESET 0xFD
+#define CONT_CMD_RESET 0xFF
+
+// Bytes transmitted for each joybus command
+#define CONT_CMD_REQUEST_STATUS_TX 1
+#define CONT_CMD_READ_BUTTON_TX 1
+#define CONT_CMD_READ_PAK_TX 3
+#define CONT_CMD_WRITE_PAK_TX 35
+#define CONT_CMD_READ_EEPROM_TX 2
+#define CONT_CMD_WRITE_EEPROM_TX 10
+#define CONT_CMD_READ36_VOICE_TX 3
+#define CONT_CMD_WRITE20_VOICE_TX 23
+#define CONT_CMD_READ2_VOICE_TX 3
+#define CONT_CMD_WRITE4_VOICE_TX 7
+#define CONT_CMD_SWRITE_VOICE_TX 3
+#define CONT_CMD_RESET_TX 1
+
+// Bytes received for each joybus command
+#define CONT_CMD_REQUEST_STATUS_RX 3
+#define CONT_CMD_READ_BUTTON_RX 4
+#define CONT_CMD_READ_PAK_RX 33
+#define CONT_CMD_WRITE_PAK_RX 1
+#define CONT_CMD_READ_EEPROM_RX 8
+#define CONT_CMD_WRITE_EEPROM_RX 1
+#define CONT_CMD_READ36_VOICE_RX 37
+#define CONT_CMD_WRITE20_VOICE_RX 1
+#define CONT_CMD_READ2_VOICE_RX 3
+#define CONT_CMD_WRITE4_VOICE_RX 1
+#define CONT_CMD_SWRITE_VOICE_RX 1
+#define CONT_CMD_RESET_RX 3
+
+#define CONT_CMD_NOP 0xFF
+#define CONT_CMD_END 0xFE // Indicates end of a command
+#define CONT_CMD_EXE 1 // Set pif ram status byte to this to do a command
#define DIR_STATUS_EMPTY 0
#define DIR_STATUS_UNKNOWN 1
@@ -81,6 +123,26 @@
#define CONT_ADDR_CRC_ER 0x04
#define CONT_EEPROM_BUSY 0x80
+// Accessory detection
+#define CONT_ADDR_DETECT 0x8000
+// Rumble
+#define CONT_ADDR_RUMBLE 0xC000
+// Controller Pak
+// Transfer Pak
+#define CONT_ADDR_GB_POWER 0x8000 // Same as the detection address, but semantically different
+#define CONT_ADDR_GB_BANK 0xA000
+#define CONT_ADDR_GB_STATUS 0xB000
+
+// Addresses sent to controller accessories are in blocks, not bytes
+#define CONT_BLOCKS(x) ((x) / BLOCKSIZE)
+
+// Block addresses of the above
+#define CONT_BLOCK_DETECT CONT_BLOCKS(CONT_ADDR_DETECT)
+#define CONT_BLOCK_RUMBLE CONT_BLOCKS(CONT_ADDR_RUMBLE)
+#define CONT_BLOCK_GB_POWER CONT_BLOCKS(CONT_ADDR_GB_POWER)
+#define CONT_BLOCK_GB_BANK CONT_BLOCKS(CONT_ADDR_GB_BANK)
+#define CONT_BLOCK_GB_STATUS CONT_BLOCKS(CONT_ADDR_GB_STATUS)
+
/* Buttons */
#define BTN_CRIGHT 0x0001
#define BTN_CLEFT 0x0002
@@ -88,6 +150,7 @@
#define BTN_CUP 0x0008
#define BTN_R 0x0010
#define BTN_L 0x0020
+#define BTN_RESET 0x0080
#define BTN_DRIGHT 0x0100
#define BTN_DLEFT 0x0200
#define BTN_DDOWN 0x0400
@@ -146,6 +209,8 @@ typedef struct {
/* 0x26 */ u8 datacrc;
} __OSContRamReadFormat;
+#define READFORMAT(ptr) ((__OSContRamReadFormat*)(ptr))
+
extern OSPifRam __osContPifRam;
// extern UNK_TYPE1 D_8009CF0C;
extern u8 __osContLastPoll;
@@ -153,11 +218,4 @@ extern u8 __osMaxControllers;
// extern OSMesgQueue D_8009CF38;
// extern OSMesg D_8009CF50;
-typedef struct {
- /* 0x00 */ OSContPad cur;
- /* 0x06 */ OSContPad prev;
- /* 0x0C */ OSContPad press; // X/Y store delta from last frame
- /* 0x12 */ OSContPad rel; // X/Y store adjusted
-} Input; // size = 0x18
-
#endif
diff --git a/include/irqmgr.h b/include/irqmgr.h
index 40ed322d1..ac2c74960 100644
--- a/include/irqmgr.h
+++ b/include/irqmgr.h
@@ -1,9 +1,14 @@
#ifndef IRQMGR_H
#define IRQMGR_H
-#include "PR/ultratypes.h"
#include "PR/sched.h"
-#include "ultra64/message.h"
+#include "os.h"
+#include "ultra64.h"
+
+#define OS_SC_RETRACE_MSG 1
+#define OS_SC_DONE_MSG 2
+#define OS_SC_NMI_MSG 3 // name is made up, 3 is OS_SC_RDP_DONE_MSG in the original sched.c
+#define OS_SC_PRE_NMI_MSG 4
typedef struct IrqMgrClient {
/* 0x0 */ struct IrqMgrClient* next;
diff --git a/include/macros.h b/include/macros.h
index 70e07259f..f2bcb07dd 100644
--- a/include/macros.h
+++ b/include/macros.h
@@ -17,6 +17,8 @@
#define ARRAY_COUNT(arr) (s32)(sizeof(arr) / sizeof(arr[0]))
#define ARRAY_COUNTU(arr) (u32)(sizeof(arr) / sizeof(arr[0]))
+#define ARRAY_COUNT_2D(arr) (ARRAY_COUNT(arr) * ARRAY_COUNT(arr[0]))
+
// TODO: After uintptr_t cast change should have an AVOID_UB target that just toggles the KSEG0 bit in the address rather than add/sub 0x80000000
#define PHYSICAL_TO_VIRTUAL(addr) ((uintptr_t)(addr) + RDRAM_CACHED)
#define VIRTUAL_TO_PHYSICAL(addr) (uintptr_t)((u8*)(addr) - RDRAM_CACHED)
@@ -77,26 +79,6 @@
#define ALIGN64(val) (((val) + 0x3F) & ~0x3F)
#define ALIGN256(val) (((val) + 0xFF) & ~0xFF)
-extern GraphicsContext* __gfxCtx;
-
-#define WORK_DISP __gfxCtx->work.p
-#define POLY_OPA_DISP __gfxCtx->polyOpa.p
-#define POLY_XLU_DISP __gfxCtx->polyXlu.p
-#define OVERLAY_DISP __gfxCtx->overlay.p
-#define DEBUG_DISP __gfxCtx->debug.p
-
-// __gfxCtx shouldn't be used directly.
-// Use the DISP macros defined above when writing to display buffers.
-#define OPEN_DISPS(gfxCtx) \
- { \
- GraphicsContext* __gfxCtx = gfxCtx; \
- s32 __dispPad
-
-#define CLOSE_DISPS(gfxCtx) \
- (void)0; \
- } \
- (void)0
-
/**
* `x` vertex x
* `y` vertex y
@@ -114,23 +96,6 @@ extern GraphicsContext* __gfxCtx;
#define VTX_T(x, y, z, s, t, cr, cg, cb, a) \
{ { x, y, z }, 0, { s, t }, { cr, cg, cb, a }, }
-#define GRAPH_ALLOC(gfxCtx, size) ((void*)((gfxCtx)->polyOpa.d = (Gfx*)((u8*)(gfxCtx)->polyOpa.d - ALIGN16(size))))
-
-// Custom gbi macro
-#define gDPSetTileCustom(pkt, fmt, siz, width, height, pal, cms, cmt, masks, maskt, shifts, shiftt) \
- { \
- gDPPipeSync(pkt); \
- gDPTileSync(pkt); \
- gDPSetTile(pkt, fmt, siz, (((width)*siz##_TILE_BYTES) + 7) >> 3, 0, G_TX_LOADTILE, 0, cmt, maskt, shiftt, cms, \
- masks, shifts); \
- gDPTileSync(pkt); \
- gDPSetTile(pkt, fmt, siz, (((width)*siz##_TILE_BYTES) + 7) >> 3, 0, G_TX_RENDERTILE, pal, cmt, maskt, shiftt, \
- cms, masks, shifts); \
- gDPSetTileSize(pkt, G_TX_RENDERTILE, 0, 0, ((width)-1) << G_TEXTURE_IMAGE_FRAC, \
- ((height)-1) << G_TEXTURE_IMAGE_FRAC); \
- } \
- (void)0
-
#define SQ(x) ((x) * (x))
#define ABS(x) ((x) >= 0 ? (x) : -(x))
#define ABS_ALT(x) ((x) < 0 ? -(x) : (x))
diff --git a/include/padmgr.h b/include/padmgr.h
new file mode 100644
index 000000000..674c9bc4e
--- /dev/null
+++ b/include/padmgr.h
@@ -0,0 +1,97 @@
+#ifndef PADMGR_H
+#define PADMGR_H
+
+#include "libc/stdbool.h"
+#include "io/controller.h"
+#include "irqmgr.h"
+
+typedef struct {
+ /* 0x00 */ OSContPad cur;
+ /* 0x06 */ OSContPad prev;
+ /* 0x0C */ OSContPad press; // X/Y store delta from last frame
+ /* 0x12 */ OSContPad rel; // X/Y store adjusted
+} Input; // size = 0x18
+
+typedef enum {
+ /* 0 */ PADMGR_CONT_NONE,
+ /* 1 */ PADMGR_CONT_NORMAL,
+ /* 3 */ PADMGR_CONT_MOUSE = 3,
+ /* 4 */ PADMGR_CONT_VOICE_PLUGGED, // VRU plugged but not initialized
+ /* 5 */ PADMGR_CONT_VOICE,
+ /* -1 */ PADMGR_CONT_UNK = 0xFF
+} ControllerDeviceType;
+
+typedef enum {
+ /* 0 */ CONT_PAK_NONE,
+ /* 1 */ CONT_PAK_RUMBLE,
+ /* 2 */ CONT_PAK_OTHER
+} ControllerPakType;
+
+typedef struct {
+ /* 0x000 */ u8 validCtrlrsMask;
+ /* 0x004 */ void (*rumbleRetraceCallback)(void*);
+ /* 0x008 */ void* rumbleRetraceArg;
+ /* 0x00C */ void (*inputRetraceCallback)(void*);
+ /* 0x010 */ void* inputRetraceArg;
+ /* 0x014 */ OSContStatus padStatus[MAXCONTROLLERS];
+ /* 0x024 */ OSMesg serialMsg;
+ /* 0x028 */ OSMesg lockMsg;
+ /* 0x02C */ OSMesg interruptMsgBuf[8];
+ /* 0x04C */ OSMesgQueue serialLockQueue;
+ /* 0x064 */ OSMesgQueue lockQueue;
+ /* 0x07C */ OSMesgQueue interruptQueue;
+ /* 0x094 */ IrqMgrClient irqClient;
+ /* 0x09C */ IrqMgr* irqMgr;
+ /* 0x0A0 */ OSThread thread;
+ /* 0x250 */ Input inputs[MAXCONTROLLERS];
+ /* 0x2B0 */ OSContPad pads[MAXCONTROLLERS];
+ /* 0x2C8 */ u8 nControllers;
+ /* 0x2C9 */ u8 ctrlrType[MAXCONTROLLERS]; // type of controller currently connected to each port
+ /* 0x2CD */ u8 pakType[MAXCONTROLLERS]; // type of controller pak for each port (if applicable)
+ /* 0x2D1 */ u8 rumbleEnable[MAXCONTROLLERS]; // whether rumble is active for each port
+ /* 0x2D5 */ u8 rumbleTimer[MAXCONTROLLERS];
+ /* 0x2DC */ OSPfs rumblePfs[MAXCONTROLLERS];
+ /* 0x47C */ vu8 rumbleOffTimer; // amount of VI retraces to not rumble for, takes priority over rumbleOnTimer
+ /* 0x47D */ vu8 rumbleOnTimer; // amount of VI retraces to rumble for
+ /* 0x47E */ u8 isResetting;
+} PadMgr; // size = 0x480
+
+extern PadMgr gPadMgr;
+
+// Initialization
+
+s32 PadSetup_Init(OSMesgQueue* mq, u8* outMask, OSContStatus* status);
+void PadMgr_Init(OSMesgQueue* siEvtQ, IrqMgr* irqMgr, OSId threadId, OSPri pri, void* stack);
+
+// Fetching inputs
+
+void PadMgr_GetInputNoLock(Input* inputs, s32 gameRequest);
+void PadMgr_GetInput(Input* inputs, s32 gameRequest);
+void PadMgr_GetInput2(Input* inputs, s32 gameRequest);
+
+// Callbacks
+
+void PadMgr_SetRumbleRetraceCallback(void (*callback)(void*), void* arg);
+void PadMgr_UnsetRumbleRetraceCallback(void (*callback)(void*), void* arg);
+
+void PadMgr_SetInputRetraceCallback(void (*callback)(void*), void* arg);
+void PadMgr_UnsetInputRetraceCallback(void (*callback)(void*), void* arg);
+
+// Valid controllers
+
+u8 PadMgr_GetValidControllersMask(void);
+
+// Voice queue
+
+OSMesgQueue* PadMgr_VoiceAcquireSerialEventQueue(void);
+void PadMgr_VoiceReleaseSerialEventQueue(OSMesgQueue* serialEventQueue);
+
+// Rumble
+
+void PadMgr_RumbleStop(void);
+void PadMgr_RumblePause(void);
+void PadMgr_RumbleSetSingle(s32 port, s32 enable);
+void PadMgr_RumbleSet(u8 enable[MAXCONTROLLERS]);
+s32 PadMgr_ControllerHasRumblePak(s32 port);
+
+#endif
diff --git a/include/system_heap.h b/include/system_heap.h
new file mode 100644
index 000000000..e0864cca6
--- /dev/null
+++ b/include/system_heap.h
@@ -0,0 +1,11 @@
+#ifndef SYSTEM_HEAP_H
+#define SYSTEM_HEAP_H
+
+#include "libc/stddef.h"
+#include "PR/ultratypes.h"
+
+void* SystemHeap_Malloc(size_t size);
+void SystemHeap_Free(void* ptr);
+void SystemHeap_Init(void* start, size_t size);
+
+#endif
diff --git a/include/system_malloc.h b/include/system_malloc.h
index e92eaf89f..cf91899ef 100644
--- a/include/system_malloc.h
+++ b/include/system_malloc.h
@@ -1,5 +1,5 @@
-#ifndef SYSTEM_MALLOC
-#define SYSTEM_MALLOC
+#ifndef SYSTEM_MALLOC_H
+#define SYSTEM_MALLOC_H
#include "PR/ultratypes.h"
#include "os_malloc.h"
@@ -11,7 +11,7 @@ void SystemArena_Free(void* ptr);
void* SystemArena_Calloc(u32 elements, size_t size);
void SystemArena_GetSizes(size_t* maxFreeBlock, size_t* bytesFree, size_t* bytesAllocated);
u32 SystemArena_CheckArena(void);
-void SystemArena_InitArena(void* start, size_t size);
+void SystemArena_Init(void* start, size_t size);
void SystemArena_Cleanup(void);
u8 SystemArena_IsInitialized(void);
diff --git a/include/ultra64/motor.h b/include/ultra64/motor.h
index ad6828132..ed969b3de 100644
--- a/include/ultra64/motor.h
+++ b/include/ultra64/motor.h
@@ -5,13 +5,14 @@
#include "PR/pfs.h"
#include "ultra64/message.h"
-#define MOTOR_START 1
-#define MOTOR_STOP 0
+#define MOTOR_START 1
+#define MOTOR_STOP 0
-#define osMotorStart(x) __osMotorAccess((x), MOTOR_START)
-#define osMotorStop(x) __osMotorAccess((x), MOTOR_STOP)
+#define osMotorStart(x) __osMotorAccess((x), MOTOR_START)
+#define osMotorStop(x) __osMotorAccess((x), MOTOR_STOP)
-s32 __osMotorAccess(OSPfs* pfs, u32 vibrate);
-s32 osMotorInit(OSMesgQueue* ctrlrqueue, OSPfs* pfs, s32 channel);
+s32 __osMotorAccess(OSPfs* pfs, s32 flag);
+
+s32 osMotorInit(OSMesgQueue* mq, OSPfs* pfs, s32 channel);
#endif
diff --git a/include/ultra64/rcp.h b/include/ultra64/rcp.h
index 6bd778ccf..7a336be28 100644
--- a/include/ultra64/rcp.h
+++ b/include/ultra64/rcp.h
@@ -11,4 +11,12 @@
#define DEVICE_TYPE_SRAM 3 /* SRAM */
#define DEVICE_TYPE_INIT 7 /* initial value */
+
+#define CHNL_ERR_NORESP 0x80 /* Bit 7 (Rx): No response error */
+#define CHNL_ERR_OVERRUN 0x40 /* Bit 6 (Rx): Overrun error */
+#define CHNL_ERR_FRAME 0x80 /* Bit 7 (Tx): Frame error */
+#define CHNL_ERR_COLLISION 0x40 /* Bit 6 (Tx): Collision error */
+
+#define CHNL_ERR_MASK 0xC0 /* Bit 6-7: channel errors */
+
#endif
diff --git a/include/variables.h b/include/variables.h
index c44dda1b6..0979bf26d 100644
--- a/include/variables.h
+++ b/include/variables.h
@@ -384,23 +384,6 @@ extern BgCheckSceneSubdivisionEntry sSceneSubdivisionList[];
extern BgSpecialSceneMaxObjects sCustomDynapolyMem[];
// extern UNK_TYPE1 D_801B4708;
-// extern UNK_TYPE4 D_801B9E0C;
-// extern UNK_TYPE4 D_801B9E10;
-// extern UNK_TYPE4 D_801B9E14;
-// extern UNK_TYPE2 D_801B9E18;
-// extern UNK_TYPE2 D_801B9E34;
-// extern UNK_TYPE4 D_801B9E50;
-// extern UNK_TYPE4 D_801B9E54;
-// extern UNK_TYPE4 D_801B9E58;
-// extern UNK_TYPE4 D_801B9E5C;
-// extern UNK_TYPE4 D_801B9E60;
-// extern UNK_TYPE1 D_801B9E64;
-// extern UNK_TYPE1 D_801B9E84;
-// extern UNK_TYPE4 D_801B9EB4;
-// extern UNK_TYPE4 D_801B9ED4;
-// extern UNK_TYPE4 sEarthquakeFreq;
-// extern UNK_TYPE2 sEarthquakeTimer;
-extern UNK_TYPE4 D_801B9F10;
extern DamageTable sDamageTablePresets[23];
extern f32 damageMultipliers[16];
extern Collider defaultCollider;
@@ -578,9 +561,6 @@ extern struct_80124618 D_801C0490[];
extern Gfx gCullBackDList[];
extern Gfx gCullFrontDList[];
-extern Gfx sSetupDL[438];
-extern Gfx sFillSetupDL[12];
-extern Gfx gEmptyDL[1];
extern u32 gBitFlags[32];
extern u16 gEquipMasks[];
extern u16 gEquipNegMasks[];
@@ -812,9 +792,6 @@ extern u32 cfbIdx[3];
extern s32 gScreenWidth;
extern s32 gScreenHeight;
extern u32 startHeapSize;
-extern PadMgr* padmgrContext;
-// extern UNK_TYPE4 controllerInputsCaptured;
-// extern UNK_TYPE4 D_801D1538;
extern UNK_PTR D_801D1540;
// extern f32 sFactorialTbl[13];
extern Vec3f gZeroVec3f;
@@ -2240,7 +2217,7 @@ extern f32 D_801ED8D0;
// extern UNK_TYPE1 D_801ED8D8;
// extern UNK_TYPE1 D_801ED8DC;
extern Mtx D_801ED8E0;
-// extern UNK_TYPE1 D_801ED920;
+extern Actor* D_801ED920;
extern FaultClient sActorOverlayTableFaultClient;
extern FaultAddrConvClient sActorOverlayTableFaultAddrConvClient;
extern char D_801ED950[80];
@@ -2256,20 +2233,6 @@ extern Vec3f D_801EDB70[3];
extern Plane D_801EDB98;
extern Sphere16 D_801EDBA8;
extern TriNorm D_801EDBB0;
-// extern UNK_TYPE1 D_801EDBD4;
-// extern UNK_TYPE1 D_801EDBD8;
-// extern UNK_TYPE1 D_801EDBDC;
-// extern UNK_TYPE1 D_801EDBE0;
-
-// extern s16 D_801EDBF0;
-// extern f32 D_801EDBF4;
-// extern f32 D_801EDBF8;
-// extern CameraCollision D_801EDC00;
-// extern PlayState* sCamPlayState;
-// extern SwingAnimation D_801EDC30[4];
-// extern Vec3f D_801EDDD0;
-// extern Vec3f D_801EDDE0;
-// extern Vec3f D_801EDDF0;
extern Vec3f D_801EDE00;
extern Vec3f D_801EDE10;
@@ -2441,7 +2404,6 @@ extern u32 gSegments[NUM_SEGMENTS];
extern SchedContext gSchedContext;
extern OSThread gGraphThread;
-extern PadMgr gPadMgr;
extern FaultClient sSchedFaultClient;
extern OSTime sRSPGFXStartTime;
@@ -2647,7 +2609,7 @@ extern s32 D_801FD120;
// extern UNK_TYPE1 D_801FD598;
// extern UNK_TYPE1 D_801FD5A0;
// extern UNK_TYPE1 D_801FD5A4;
-// extern UNK_TYPE1 D_801FD5B8;
+extern OSVoiceHandle gVoiceHandle;
// extern UNK_TYPE1 D_801FD5C4;
// extern UNK_TYPE1 D_801FD5C8;
// extern UNK_TYPE1 D_801FD5E8;
diff --git a/include/z64.h b/include/z64.h
index c18682c66..2bb2653ea 100644
--- a/include/z64.h
+++ b/include/z64.h
@@ -14,6 +14,7 @@
#include "osint.h"
#include "os.h"
#include "irqmgr.h"
+#include "padmgr.h"
#include "scheduler.h"
#include "xstdio.h"
@@ -24,6 +25,7 @@
#include "sfx.h"
#include "message_data_static.h"
+#include "gfx.h"
#include "gfxprint.h"
#include "sys_matrix.h"
#include "tha.h"
@@ -80,11 +82,12 @@
#define Z_PRIORITY_IRQMGR 18
typedef enum {
- /* 0 */ EQUIP_SLOT_B,
- /* 1 */ EQUIP_SLOT_C_LEFT,
- /* 2 */ EQUIP_SLOT_C_DOWN,
- /* 3 */ EQUIP_SLOT_C_RIGHT,
- /* 4 */ EQUIP_SLOT_A
+ /* -1 */ EQUIP_SLOT_NONE = -1,
+ /* 0 */ EQUIP_SLOT_B,
+ /* 1 */ EQUIP_SLOT_C_LEFT,
+ /* 2 */ EQUIP_SLOT_C_DOWN,
+ /* 3 */ EQUIP_SLOT_C_RIGHT,
+ /* 4 */ EQUIP_SLOT_A
} EquipSlot;
typedef struct {
@@ -107,89 +110,6 @@ typedef struct {
/* 0x8 */ void* end;
} PolygonType2; // size = 0xC
-typedef struct {
- /* 0x000 */ Gfx taskStart[9];
- /* 0x048 */ Gfx clearZBuffer[8]; // original name: clear_zb_dl
- /* 0x088 */ Gfx clearFrameBuffer[5]; // original name: clear_fb_dl
- /* 0x0B0 */ Gfx setupBuffers[6]; // setup framebuffer and zbuffer
- /* 0x0E0 */ Gfx unk_E0[12]; // unused
- /* 0x140 */ Gfx syncSegments[17];
- /* 0x1C8 */ Gfx setScissor[2];
- /* 0x1D8 */ Gfx unk_1D8[25]; // unused
- /* 0x2A0 */ Gfx disps[5];
- /* 0x2C8 */ Gfx clearFillRect[3]; // fillrect for clearing buffers
- /* 0x2E0 */ Gfx fillRect[3]; // fillrect for general purpose
- /* 0x2F8 */ Gfx debugDisp[1];
-} GfxMasterList; // size = 0x300
-
-#define GFXPOOL_HEAD_MAGIC 0x1234
-#define GFXPOOL_TAIL_MAGIC 0x5678
-
-typedef struct {
- /* 0x00000 */ u16 headMagic; // 1234
- /* 0x00008 */ GfxMasterList master;
- /* 0x00308 */ Gfx polyXluBuffer[2048];
- /* 0x04308 */ Gfx overlayBuffer[1024];
- /* 0x06308 */ Gfx workBuffer[64];
- /* 0x06508 */ Gfx debugBuffer[64];
- /* 0x06708 */ Gfx polyOpaBuffer[13184];
- /* 0x20308 */ u16 tailMagic; // 5678
-} GfxPool; // size = 0x20310
-
-typedef struct GraphicsContext {
- /* 0x000 */ Gfx* polyOpaBuffer; // Pointer to "Zelda 0"
- /* 0x004 */ Gfx* polyXluBuffer; // Pointer to "Zelda 1"
- /* 0x008 */ char unk_8[0x8]; // Unused, could this be pointers to "Zelda 2" / "Zelda 3"
- /* 0x010 */ Gfx* overlayBuffer; // Pointer to "Zelda 4"
- /* 0x014 */ u32 unk_14;
- /* 0x018 */ char unk_18[0x20];
- /* 0x038 */ OSMesg msgBuff[8];
- /* 0x058 */ OSMesgQueue* schedMsgQ;
- /* 0x05C */ OSMesgQueue queue;
- /* 0x074 */ char unk_74[0x04];
- /* 0x078 */ OSScTask task;
- /* 0x0E0 */ char unk_E0[0xD0];
- /* 0x1B0 */ Gfx* workBuffer;
- /* 0x1B4 */ TwoHeadGfxArena work;
- /* 0x1C4 */ Gfx* debugBuffer;
- /* 0x1C8 */ TwoHeadGfxArena debug;
- /* 0x1D8 */ char unk_1D8[0xAC];
- /* 0x284 */ OSViMode* viMode;
- /* 0x288 */ void* zbuffer;
- /* 0x28C */ char unk_28C[0x1C];
- /* 0x2A8 */ TwoHeadGfxArena overlay; // "Zelda 4"
- /* 0x2B8 */ TwoHeadGfxArena polyOpa; // "Zelda 0"
- /* 0x2C8 */ TwoHeadGfxArena polyXlu; // "Zelda 1"
- /* 0x2D8 */ u32 gfxPoolIdx;
- /* 0x2DC */ u16* curFrameBuffer;
- /* 0x2E0 */ char unk_2E0[0x4];
- /* 0x2E4 */ u32 viConfigFeatures;
- /* 0x2E8 */ char unk_2E8[0x2];
- /* 0x2EA */ u8 updateViMode;
- /* 0x2EB */ u8 framebufferIndex;
- /* 0x2EC */ void (*callback)(struct GraphicsContext*, u32);
- /* 0x2F0 */ u32 callbackArg;
- /* 0x2F4 */ f32 xScale;
- /* 0x2F8 */ f32 yScale;
- /* 0x2FC */ GfxMasterList* masterList;
-} GraphicsContext; // size = 0x300
-
-typedef enum IRQ_MSG_TYPE {
- IRQ_VERTICAL_RETRACE_MSG = 0x1,
- IRQ_PRENMI_2_MSG = 0x3,
- IRQ_PRENMI_1_MSG = 0x4
-} IRQ_MSG_TYPE;
-
-typedef enum IRQ_TYPE {
- IRQ_VERTICAL_RETRACE = 0x29A,
- IRQ_SP = 0x29B,
- IRQ_DP = 0x29C,
- IRQ_PRENMI_1 = 0x29D,
- IRQ_PRENMI_2 = 0x29F,
- IRQ_PRENMI_3 = 0x2A0,
- IRQ_PRENMI_4 = 0x2A1
-} IRQ_TYPE;
-
typedef struct {
/* 0x00 */ u32 resetting;
/* 0x04 */ u32 resetCount;
@@ -261,11 +181,11 @@ typedef struct {
/* 0x188 */ Vtx* questPageVtx;
/* 0x18C */ Vtx* maskPageVtx;
/* 0x190 */ Vtx* itemVtx;
- /* 0x194 */ Vtx* mapVtx;
+ /* 0x194 */ Vtx* mapVtx; // inferred
/* 0x198 */ Vtx* questVtx;
/* 0x19C */ Vtx* maskVtx;
- /* 0x1A0 */ Vtx* unk_1A0;
- /* 0x1A4 */ Vtx* unk_1A4;
+ /* 0x1A0 */ Vtx* promptPageVtx;
+ /* 0x1A4 */ Vtx* infoPanelVtx;
/* 0x1A8 */ Vtx* cursorVtx;
/* 0x1AC */ OcarinaStaff* ocarinaStaff;
/* 0x1B0 */ UNK_TYPE1 unk_1B0[0x20];
@@ -281,10 +201,10 @@ typedef struct {
/* 0x206 */ u16 switchPageTimer;
/* 0x208 */ u16 savePromptState;
/* 0x20C */ f32 unk_20C;
- /* 0x210 */ f32 itemPageRoll; // rotation (-z) of the item page into the screen
- /* 0x214 */ f32 mapPageRoll; // rotation (+x) of the map page into the screen
- /* 0x218 */ f32 questPageRoll; // rotation (+z) of the quest page into the screen
- /* 0x21C */ f32 maskPageRoll; // rotation (-z) of the mask page into the screen
+ /* 0x210 */ f32 itemPageRoll; // rotation (-z) of the item page into the screen
+ /* 0x214 */ f32 mapPageRoll; // rotation (+x) of the map page into the screen
+ /* 0x218 */ f32 questPageRoll; // rotation (+z) of the quest page into the screen
+ /* 0x21C */ f32 maskPageRoll; // rotation (-z) of the mask page into the screen
/* 0x220 */ f32 roll;
/* 0x224 */ u16 alpha;
/* 0x226 */ s16 offsetY;
@@ -481,7 +401,7 @@ typedef struct {
/* 0x7D8 */ FaultClient* clients;
/* 0x7DC */ FaultAddrConvClient* addrConvClients;
/* 0x7E0 */ UNK_TYPE1 pad7E0[0x4];
- /* 0x7E4 */ Input padInput[4];
+ /* 0x7E4 */ Input padInput[MAXCONTROLLERS];
/* 0x844 */ void* fb;
} FaultThreadStruct; // size = 0x848
@@ -522,7 +442,7 @@ typedef struct GameState {
/* 0x08 */ GameStateFunc destroy;
/* 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[4];
+ /* 0x14 */ Input input[MAXCONTROLLERS];
/* 0x74 */ TwoHeadArena heap;
/* 0x84 */ GameAlloc alloc;
/* 0x98 */ UNK_TYPE1 pad98[0x3];
@@ -541,34 +461,6 @@ typedef void (*ColChkApplyFunc)(struct PlayState*, CollisionCheckContext*, Colli
typedef void (*ColChkVsFunc)(struct PlayState*, CollisionCheckContext*, Collider*, Collider*);
typedef s32 (*ColChkLineFunc)(struct PlayState*, CollisionCheckContext*, Collider*, Vec3f*, Vec3f*);
-typedef struct {
- /* 0x000 */ u8 controllers; // bit 0 is set if controller 1 is plugged in, etc.
- /* 0x001 */ UNK_TYPE1 pad1[0x13];
- /* 0x014 */ OSContStatus statuses[4];
- /* 0x024 */ UNK_TYPE4 unk24;
- /* 0x028 */ OSMesg lockMesg[1];
- /* 0x02C */ OSMesg interrupts[8];
- /* 0x04C */ OSMesgQueue sSiIntMsgQ;
- /* 0x064 */ OSMesgQueue lock;
- /* 0x07C */ OSMesgQueue irqmgrCallbackQueue;
- /* 0x094 */ IrqMgrClient irqmgrCallbackQueueNode;
- /* 0x09C */ IrqMgr* irqmgr;
- /* 0x0A0 */ OSThread thread;
- /* 0x250 */ Input input[4];
- /* 0x2B0 */ OSContPad controllerState1[4];
- /* 0x2C8 */ u8 maxNumControllers;
- /* 0x2C9 */ UNK_TYPE1 pad2C9[0x1B3];
- /* 0x47C */ u8 unk47C;
- /* 0x47D */ u8 unk47D;
- /* 0x47E */ u8 hasStopped;
- /* 0x47F */ UNK_TYPE1 pad47F[0x1];
-} PadMgr; // size = 0x480
-
-#define OS_SC_RETRACE_MSG 1
-#define OS_SC_DONE_MSG 2
-#define OS_SC_NMI_MSG 3 // name is made up, 3 is OS_SC_RDP_DONE_MSG in the original sched.c
-#define OS_SC_PRE_NMI_MSG 4
-
typedef struct {
/* 0x000 */ IrqMgr* irqMgr;
/* 0x004 */ SchedContext* sched;
@@ -626,7 +518,7 @@ typedef struct PlayState {
/* 0x18770 */ void (*unk_18770)(struct PlayState* play, Player* player);
/* 0x18774 */ s32 (*startPlayerFishing)(struct PlayState* play);
/* 0x18778 */ s32 (*grabPlayer)(struct PlayState* play, Player* player);
- /* 0x1877C */ s32 (*startPlayerCutscene)(struct PlayState* play, Player* player, s32 mode);
+ /* 0x1877C */ s32 (*startPlayerCutscene)(struct PlayState* play, Player* player, PlayerCsMode csMode);
/* 0x18780 */ void (*func_18780)(Player* player, struct PlayState* play);
/* 0x18784 */ s32 (*damagePlayer)(struct PlayState* play, s32 damage);
/* 0x18788 */ void (*talkWithPlayer)(struct PlayState* play, Actor* actor);
diff --git a/include/z64actor.h b/include/z64actor.h
index 7cc4275ac..f58716401 100644
--- a/include/z64actor.h
+++ b/include/z64actor.h
@@ -389,12 +389,18 @@ typedef struct {
/* 0xE */ s16 intensity;
} TitleCardContext; // size = 0x10
-typedef struct ActorContext_unk_1F4 {
- /* 0x00 */ u8 unk_00;
+typedef enum {
+ /* 0 */ PLAYER_IMPACT_GORON_GROUND_POUND,
+ /* 1 */ PLAYER_IMPACT_ZORA_BARRIER,
+ /* 2 */ PLAYER_IMPACT_BONK // also activated by goron attack
+} PlayerImpactType;
+
+typedef struct PlayerImpact {
+ /* 0x00 */ u8 type;
/* 0x01 */ u8 timer;
- /* 0x04 */ f32 unk_04;
- /* 0x08 */ Vec3f unk_08;
-} ActorContext_unk_1F4; // size = 0x14
+ /* 0x04 */ f32 dist;
+ /* 0x08 */ Vec3f pos;
+} PlayerImpact; // size = 0x14
typedef struct ActorContext_unk_20C {
/* 0x0 */ s16 id;
@@ -458,7 +464,7 @@ typedef struct ActorContext {
/* 0x120 */ TargetContext targetContext;
/* 0x1B8 */ ActorContextSceneFlags sceneFlags;
/* 0x1E4 */ TitleCardContext titleCtxt;
- /* 0x1F4 */ ActorContext_unk_1F4 unk_1F4;
+ /* 0x1F4 */ PlayerImpact playerImpact;
/* 0x208 */ UNK_TYPE1 unk_208[0x4];
/* 0x20C */ ActorContext_unk_20C unk_20C[8];
/* 0x24C */ UNK_TYPE1 unk_24C[0x4];
@@ -526,8 +532,8 @@ typedef enum {
#define ACTOR_FLAG_400 (1 << 10)
//
#define ACTOR_FLAG_800 (1 << 11)
-//
-#define ACTOR_FLAG_1000 (1 << 12)
+// Actor will not shake when a quake occurs
+#define ACTOR_FLAG_IGNORE_QUAKE (1 << 12)
//
#define ACTOR_FLAG_2000 (1 << 13)
//
@@ -733,6 +739,11 @@ typedef struct NpcInteractInfo {
/* 0x24 */ UNK_TYPE1 unk_24[0x4];
} NpcInteractInfo; // size = 0x28
+typedef struct BlinkInfo {
+ /* 0x0 */ s16 eyeTexIndex;
+ /* 0x2 */ s16 blinkTimer;
+} BlinkInfo; // size = 0x4
+
extern TargetRangeParams gTargetRanges[];
extern s16 D_801AED48[8];
extern Gfx D_801AEF88[];
diff --git a/include/z64animation.h b/include/z64animation.h
index 44c35312d..316dfe341 100644
--- a/include/z64animation.h
+++ b/include/z64animation.h
@@ -14,9 +14,13 @@ struct PlayerAnimationFrame;
#define LIMB_DONE 0xFF
#define ANIM_FLAG_1 (1 << 0)
-#define ANIM_FLAG_UPDATEY (1 << 1)
+#define ANIM_FLAG_UPDATE_Y (1 << 1)
#define ANIM_FLAG_4 (1 << 2)
+#define ANIM_FLAG_8 (1 << 3)
#define ANIM_FLAG_NOMOVE (1 << 4)
+#define ANIM_FLAG_80 (1 << 7)
+#define ANIM_FLAG_100 (1 << 8)
+#define ANIM_FLAG_200 (1 << 9)
typedef enum AnimationMode {
/* 0 */ ANIMMODE_LOOP,
@@ -326,6 +330,7 @@ void AnimationContext_Update(struct PlayState* play, AnimationContext* animation
void SkelAnime_InitPlayer(struct PlayState* play, SkelAnime* skelAnime, FlexSkeletonHeader* skeletonHeaderSeg, PlayerAnimationHeader* animation, s32 flags, void* jointTableBuffer, void* morphTableBuffer, s32 limbBufCount);
void PlayerAnimation_SetUpdateFunction(SkelAnime* skelAnime);
s32 PlayerAnimation_Update(struct PlayState* play, SkelAnime* skelAnime);
+void PlayerAnimation_AnimateFrame(struct PlayState* play, SkelAnime* skelAnime);
void Animation_SetMorph(struct PlayState* play, SkelAnime* skelAnime, f32 morphFrames);
void PlayerAnimation_Change(struct PlayState* play, SkelAnime* skelAnime, PlayerAnimationHeader* animation, f32 playSpeed, f32 startFrame, f32 endFrame, u8 mode, f32 morphFrames);
void PlayerAnimation_PlayOnce(struct PlayState* play, SkelAnime* skelAnime, PlayerAnimationHeader* animation);
diff --git a/include/z64bgcheck.h b/include/z64bgcheck.h
index a5effefca..91a892e03 100644
--- a/include/z64bgcheck.h
+++ b/include/z64bgcheck.h
@@ -255,7 +255,7 @@ typedef struct {
/* 0x14 */ u16 numPolygons;
/* 0x18 */ CollisionPoly* polyList;
/* 0x1C */ SurfaceType* surfaceTypeList;
- /* 0x20 */ CamData* bgCamList;
+ /* 0x20 */ BgCamInfo* bgCamList;
/* 0x24 */ u16 numWaterBoxes;
/* 0x28 */ WaterBox* waterBoxes;
} CollisionHeader; // size = 0x2C
diff --git a/include/z64camera.h b/include/z64camera.h
index 3205496e7..54cf748ac 100644
--- a/include/z64camera.h
+++ b/include/z64camera.h
@@ -90,18 +90,18 @@
#define CAM_BEHAVIOR_SETTING_2 (1 << 4)
// Mode (0x2, 0x20)
#define CAM_BEHAVIOR_MODE_1 (1 << 1)
-#define CAM_BEHAVIOR_MODE_2 (1 << 5)
+#define CAM_BEHAVIOR_MODE_VALID (1 << 5)
// bgCam (0x4, 0x40)
#define CAM_BEHAVIOR_BGCAM_1 (1 << 2)
#define CAM_BEHAVIOR_BGCAM_2 (1 << 6)
// Camera stateFlags. Variety of generic flags
#define CAM_STATE_0 (1 << 0) // Must be set for the camera from changing settings based on the bg surface
-#define CAM_STATE_1 (1 << 1)
+#define CAM_STATE_CHECK_WATER (1 << 1)
#define CAM_STATE_2 (1 << 2)
#define CAM_STATE_3 (1 << 3)
#define CAM_STATE_4 (1 << 4)
-#define CAM_STATE_5 (1 << 5)
+#define CAM_STATE_DISABLE_MODE_CHANGE (1 << 5)
#define CAM_STATE_6 (1 << 6)
#define CAM_STATE_7 (1 << 7)
#define CAM_STATE_UNDERWATER (1 << 8)
@@ -110,7 +110,7 @@
#define CAM_STATE_11 (1 << 11)
#define CAM_STATE_12 (1 << 12)
#define CAM_STATE_13 (1 << 13)
-#define CAM_STATE_14 (1 << 14)
+#define CAM_STATE_INITIALIZED (1 << 14)
#define CAM_STATE_15 ((s16)(1 << 15))
// Camera viewFlags. Set params related to view
@@ -340,13 +340,13 @@ typedef enum {
} CameraFuncType;
typedef enum {
- /* 0x00 */ CAM_DATA_00,
+ /* 0x00 */ CAM_DATA_Y_OFFSET,
/* 0x01 */ CAM_DATA_01,
/* 0x02 */ CAM_DATA_02,
- /* 0x03 */ CAM_DATA_03,
+ /* 0x03 */ CAM_DATA_PITCH_TARGET,
/* 0x04 */ CAM_DATA_04,
/* 0x05 */ CAM_DATA_05,
- /* 0x06 */ CAM_DATA_06,
+ /* 0x06 */ CAM_DATA_YAW_DIFF_RANGE,
/* 0x07 */ CAM_DATA_FOV,
/* 0x08 */ CAM_DATA_08,
/* 0x09 */ CAM_DATA_INTERFACE_FLAGS,
@@ -374,7 +374,7 @@ typedef struct {
/* 0x00 */ Vec3f pos;
/* 0x0C */ Vec3f norm;
/* 0x18 */ CollisionPoly* poly;
- /* 0x1C */ VecSph sphNorm;
+ /* 0x1C */ VecGeo geoNorm;
/* 0x24 */ s32 bgId;
} CameraCollision; // size = 0x28
@@ -405,13 +405,13 @@ typedef struct {
*/
#define CAM_FUNCDATA_NORM1(yOffset, data01, data02, pitchTarget, eyeStepScale, posStepScale, yawDiffRange, fov, data08, interfaceFlags) \
- { yOffset, CAM_DATA_00 }, \
+ { yOffset, CAM_DATA_Y_OFFSET }, \
{ data01, CAM_DATA_01 }, \
{ data02, CAM_DATA_02 }, \
- { pitchTarget, CAM_DATA_03 }, \
+ { pitchTarget, CAM_DATA_PITCH_TARGET }, \
{ eyeStepScale, CAM_DATA_04 }, \
{ posStepScale, CAM_DATA_05 }, \
- { yawDiffRange, CAM_DATA_06 }, \
+ { yawDiffRange, CAM_DATA_YAW_DIFF_RANGE }, \
{ fov, CAM_DATA_FOV }, \
{ data08, CAM_DATA_08 }, \
{ interfaceFlags, CAM_DATA_INTERFACE_FLAGS }
@@ -462,10 +462,10 @@ typedef struct {
// Unused Camera RemoteBomb Setting
#define CAM_FUNCDATA_NORM2(yOffset, data01, data02, pitchTarget, data04, fov, data08, interfaceFlags) \
- { yOffset, CAM_DATA_00 }, \
+ { yOffset, CAM_DATA_Y_OFFSET }, \
{ data01, CAM_DATA_01 }, \
{ data02, CAM_DATA_02 }, \
- { pitchTarget, CAM_DATA_03 }, \
+ { pitchTarget, CAM_DATA_PITCH_TARGET }, \
{ data04, CAM_DATA_04 }, \
{ fov, CAM_DATA_FOV }, \
{ data08, CAM_DATA_08 }, \
@@ -480,10 +480,10 @@ typedef struct {
*/
#define CAM_FUNCDATA_NORM3(yOffset, data01, data02, pitchTarget, eyeStepScale, posStepScale, fov, data08, interfaceFlags) \
- { yOffset, CAM_DATA_00 }, \
+ { yOffset, CAM_DATA_Y_OFFSET }, \
{ data01, CAM_DATA_01 }, \
{ data02, CAM_DATA_02 }, \
- { pitchTarget, CAM_DATA_03 }, \
+ { pitchTarget, CAM_DATA_PITCH_TARGET }, \
{ eyeStepScale, CAM_DATA_04 }, \
{ posStepScale, CAM_DATA_05 }, \
{ fov, CAM_DATA_FOV }, \
@@ -530,12 +530,12 @@ typedef struct {
*/
#define CAM_FUNCDATA_NORM0(yOffset, data01, data02, data21, data04, yawDiffRange, fov, data08, interfaceFlags) \
- { yOffset, CAM_DATA_00 }, \
+ { yOffset, CAM_DATA_Y_OFFSET }, \
{ data01, CAM_DATA_01 }, \
{ data02, CAM_DATA_02 }, \
{ data21, CAM_DATA_21 }, \
{ data04, CAM_DATA_04 }, \
- { yawDiffRange, CAM_DATA_06 }, \
+ { yawDiffRange, CAM_DATA_YAW_DIFF_RANGE }, \
{ fov, CAM_DATA_FOV }, \
{ data08, CAM_DATA_08 }, \
{ interfaceFlags, CAM_DATA_INTERFACE_FLAGS }
@@ -581,10 +581,10 @@ typedef struct {
*/
#define CAM_FUNCDATA_PARA1(yOffset, data01, data02, pitchTarget, data10, data04, data05, fov, data08, interfaceFlags, data11, data12) \
- { yOffset, CAM_DATA_00 }, \
+ { yOffset, CAM_DATA_Y_OFFSET }, \
{ data01, CAM_DATA_01 }, \
{ data02, CAM_DATA_02 }, \
- { pitchTarget, CAM_DATA_03 }, \
+ { pitchTarget, CAM_DATA_PITCH_TARGET }, \
{ data10, CAM_DATA_10 }, \
{ data04, CAM_DATA_04 }, \
{ data05, CAM_DATA_05 }, \
@@ -596,10 +596,10 @@ typedef struct {
// Same as above but with extra unused entry
#define CAM_FUNCDATA_PARA1_ALT(yOffset, data01, data02, pitchTarget, data10, data04, data05, fov, data08, interfaceFlags, data11, data12, data18) \
- { yOffset, CAM_DATA_00 }, \
+ { yOffset, CAM_DATA_Y_OFFSET }, \
{ data01, CAM_DATA_01 }, \
{ data02, CAM_DATA_02 }, \
- { pitchTarget, CAM_DATA_03 }, \
+ { pitchTarget, CAM_DATA_PITCH_TARGET }, \
{ data10, CAM_DATA_10 }, \
{ data04, CAM_DATA_04 }, \
{ data05, CAM_DATA_05 }, \
@@ -662,10 +662,10 @@ typedef struct {
// Unused Camera Maze Setting
#define CAM_FUNCDATA_PARA2(yOffset, data02, data01, pitchTarget, data04, fov, data08, interfaceFlags) \
- { yOffset, CAM_DATA_00 }, \
+ { yOffset, CAM_DATA_Y_OFFSET }, \
{ data02, CAM_DATA_02 }, \
{ data01, CAM_DATA_01 }, \
- { pitchTarget, CAM_DATA_03 }, \
+ { pitchTarget, CAM_DATA_PITCH_TARGET }, \
{ data04, CAM_DATA_04 }, \
{ fov, CAM_DATA_FOV }, \
{ data08, CAM_DATA_08 }, \
@@ -680,7 +680,7 @@ typedef struct {
*/
#define CAM_FUNCDATA_JUMP2(yOffset, data01, data02, data20, data04, data05, fov, data08, interfaceFlags) \
- { yOffset, CAM_DATA_00 }, \
+ { yOffset, CAM_DATA_Y_OFFSET }, \
{ data01, CAM_DATA_01 }, \
{ data02, CAM_DATA_02 }, \
{ data20, CAM_DATA_20 }, \
@@ -729,13 +729,13 @@ typedef struct {
*/
#define CAM_FUNCDATA_JUMP3(yOffset, data01, data02, pitchTarget, data04, data05, yawDiffRange, fov, data08, interfaceFlags) \
- { yOffset, CAM_DATA_00 }, \
+ { yOffset, CAM_DATA_Y_OFFSET }, \
{ data01, CAM_DATA_01 }, \
{ data02, CAM_DATA_02 }, \
- { pitchTarget, CAM_DATA_03 }, \
+ { pitchTarget, CAM_DATA_PITCH_TARGET }, \
{ data04, CAM_DATA_04 }, \
{ data05, CAM_DATA_05 }, \
- { yawDiffRange, CAM_DATA_06 }, \
+ { yawDiffRange, CAM_DATA_YAW_DIFF_RANGE }, \
{ fov, CAM_DATA_FOV }, \
{ data08, CAM_DATA_08 }, \
{ interfaceFlags, CAM_DATA_INTERFACE_FLAGS }
@@ -785,7 +785,7 @@ typedef struct {
*/
#define CAM_FUNCDATA_BATT1(yOffset, data01, data02, data13, data14, data15, data16, data17, fov, data08, interfaceFlags, data11, data18) \
- { yOffset, CAM_DATA_00 }, \
+ { yOffset, CAM_DATA_Y_OFFSET }, \
{ data01, CAM_DATA_01 }, \
{ data02, CAM_DATA_02 }, \
{ data13, CAM_DATA_13 }, \
@@ -845,7 +845,7 @@ typedef struct {
*/
#define CAM_FUNCDATA_KEEP1(yOffset, data01, data02, data13, data14, data15, data16, data17, fov, data08, interfaceFlags, data11) \
- { yOffset, CAM_DATA_00 }, \
+ { yOffset, CAM_DATA_Y_OFFSET }, \
{ data01, CAM_DATA_01 }, \
{ data02, CAM_DATA_02 }, \
{ data13, CAM_DATA_13 }, \
@@ -902,7 +902,7 @@ typedef struct {
*/
#define CAM_FUNCDATA_KEEP3(yOffset, data01, data02, data13, data14, data15, data16, data17, fov, data08, timer, interfaceFlags, data18) \
- { yOffset, CAM_DATA_00 }, \
+ { yOffset, CAM_DATA_Y_OFFSET }, \
{ data01, CAM_DATA_01 }, \
{ data02, CAM_DATA_02 }, \
{ data13, CAM_DATA_13 }, \
@@ -957,9 +957,9 @@ typedef struct {
*/
#define CAM_FUNCDATA_KEEP4(yOffset, data01, pitchTarget, data10, data18, fov, interfaceFlags, data04, timer) \
- { yOffset, CAM_DATA_00 }, \
+ { yOffset, CAM_DATA_Y_OFFSET }, \
{ data01, CAM_DATA_01 }, \
- { pitchTarget, CAM_DATA_03 }, \
+ { pitchTarget, CAM_DATA_PITCH_TARGET }, \
{ data10, CAM_DATA_10 }, \
{ data18, CAM_DATA_18 }, \
{ fov, CAM_DATA_FOV }, \
@@ -1008,7 +1008,7 @@ typedef struct {
*/
#define CAM_FUNCDATA_FIXD1(yOffset, data04, fov, interfaceFlags) \
- { yOffset, CAM_DATA_00 }, \
+ { yOffset, CAM_DATA_Y_OFFSET }, \
{ data04, CAM_DATA_04 }, \
{ fov, CAM_DATA_FOV }, \
{ interfaceFlags, CAM_DATA_INTERFACE_FLAGS }
@@ -1040,7 +1040,7 @@ typedef struct {
*/
#define CAM_FUNCDATA_FIXD2(yOffset, data01, data02, data04, data05, fov, interfaceFlags) \
- { yOffset, CAM_DATA_00 }, \
+ { yOffset, CAM_DATA_Y_OFFSET }, \
{ data01, CAM_DATA_01 }, \
{ data02, CAM_DATA_02 }, \
{ data04, CAM_DATA_04 }, \
@@ -1097,7 +1097,7 @@ typedef struct {
*/
#define CAM_FUNCDATA_SUBJ1(yOffset, data01, data02, data04, data19, data17, data18, fov, interfaceFlags) \
- { yOffset, CAM_DATA_00 }, \
+ { yOffset, CAM_DATA_Y_OFFSET }, \
{ data01, CAM_DATA_01 }, \
{ data02, CAM_DATA_02 }, \
{ data04, CAM_DATA_04 }, \
@@ -1140,7 +1140,7 @@ typedef struct {
*/
#define CAM_FUNCDATA_UNIQ2(yOffset, data01, fov, interfaceFlags) \
- { yOffset, CAM_DATA_00 }, \
+ { yOffset, CAM_DATA_Y_OFFSET }, \
{ data01, CAM_DATA_01 }, \
{ fov, CAM_DATA_FOV }, \
{ interfaceFlags, CAM_DATA_INTERFACE_FLAGS }
@@ -1175,7 +1175,7 @@ typedef struct {
*/
#define CAM_FUNCDATA_UNIQ0(yOffset, data04, interfaceFlags) \
- { yOffset, CAM_DATA_00 }, \
+ { yOffset, CAM_DATA_Y_OFFSET }, \
{ data04, CAM_DATA_04 }, \
{ interfaceFlags, CAM_DATA_INTERFACE_FLAGS }
@@ -1244,8 +1244,8 @@ typedef struct {
typedef struct {
/* 0x00 */ Vec3f unk_00;
- /* 0x0C */ VecSph unk_0C;
- /* 0x14 */ VecSph unk_14;
+ /* 0x0C */ VecGeo unk_0C;
+ /* 0x14 */ VecGeo unk_14;
/* 0x1C */ s16 unk_1C;
} Demo1ReadWriteData; // size = 0x20
@@ -1319,7 +1319,7 @@ typedef struct {
/* 0x0C */ f32 unk_0C;
/* 0x10 */ f32 unk_10;
/* 0x14 */ f32 unk_14;
- /* 0x18 */ VecSph unk_18;
+ /* 0x18 */ VecGeo unk_18;
/* 0x20 */ s16 unk_20;
/* 0x22 */ s16 timer;
} Demo4ReadWriteData; // size = 0x24
@@ -1345,7 +1345,7 @@ typedef struct {
/* 0x10 */ f32 unk_10;
/* 0x14 */ f32 unk_14;
/* 0x18 */ f32 unk_18;
- /* 0x1C */ VecSph unk_1C;
+ /* 0x1C */ VecGeo unk_1C;
/* 0x24 */ s16 unk_24;
/* 0x26 */ s16 timer;
} Demo5ReadWriteData; // size = 0x28
@@ -1367,8 +1367,8 @@ typedef struct {
typedef struct {
/* 0x00 */ f32 unk_00;
- /* 0x04 */ VecSph subAtToEye;
- /* 0x0C */ VecSph atToEye;
+ /* 0x04 */ VecGeo subAtToEye;
+ /* 0x0C */ VecGeo atToEye;
/* 0x14 */ s16 unk_14;
/* 0x16 */ s16 unk_16;
/* 0x18 */ s16 unk_18;
@@ -1387,10 +1387,10 @@ typedef struct {
*/
#define CAM_FUNCDATA_SPEC5(yOffset, eyeDist, minDistForRot, fov, atMaxLERPScale, timerInit, pitch, interfaceFlags) \
- { yOffset, CAM_DATA_00 }, \
+ { yOffset, CAM_DATA_Y_OFFSET }, \
{ eyeDist, CAM_DATA_01 }, \
{ minDistForRot, CAM_DATA_02 }, \
- { fov, CAM_DATA_03 }, \
+ { fov, CAM_DATA_PITCH_TARGET }, \
{ atMaxLERPScale, CAM_DATA_FOV }, \
{ timerInit, CAM_DATA_08 }, \
{ pitch, CAM_DATA_12 }, \
@@ -1446,7 +1446,7 @@ typedef struct {
*/
#define CAM_FUNCDATA_SPEC8(yOffset, eyeStepScale, posStepScale, fov, spiralDoorCsLength, interfaceFlags) \
- { yOffset, CAM_DATA_00 }, \
+ { yOffset, CAM_DATA_Y_OFFSET }, \
{ eyeStepScale, CAM_DATA_04 }, \
{ posStepScale, CAM_DATA_05 }, \
{ fov, CAM_DATA_FOV }, \
@@ -1483,7 +1483,7 @@ typedef struct {
*/
#define CAM_FUNCDATA_SPEC9(yOffset, fov, interfaceFlags) \
- { yOffset, CAM_DATA_00 }, \
+ { yOffset, CAM_DATA_Y_OFFSET }, \
{ fov, CAM_DATA_FOV }, \
{ interfaceFlags, CAM_DATA_INTERFACE_FLAGS }
@@ -1565,11 +1565,11 @@ typedef struct Camera {
/* 0x0D8 */ f32 xzSpeed;
/* 0x0DC */ f32 dist;
/* 0x0E0 */ f32 speedRatio;
- /* 0x0E4 */ Vec3f atActorOffset;
- /* 0x0F0 */ Vec3f focalActorOffset;
+ /* 0x0E4 */ Vec3f focalActorAtOffset; // Offset between the camera's at Pos and the focalActor's Pos
+ /* 0x0F0 */ Vec3f unk_0F0; // Offset between the focalActor's Pos and the camera's focalActor's Pos from the previous frame
/* 0x0FC */ f32 fov;
/* 0x100 */ f32 atLerpStepScale;
- /* 0x104 */ f32 playerFloorHeight;
+ /* 0x104 */ f32 focalActorFloorHeight;
/* 0x108 */ Vec3f floorNorm;
/* 0x114 */ f32 waterYPos;
/* 0x118 */ s32 waterPrevBgCamDataId;
@@ -1588,11 +1588,11 @@ typedef struct Camera {
/* 0x142 */ s16 setting;
/* 0x144 */ s16 mode;
/* 0x146 */ s16 bgId;
- /* 0x148 */ s16 bgCamDataId;
+ /* 0x148 */ s16 bgCamIndex;
/* 0x14A */ s16 behaviorFlags;
/* 0x14C */ s16 stateFlags;
/* 0x14E */ s16 childCamId;
- /* 0x150 */ s16 doorTimer1; // a door timer used when door cam is indexed from bgCamDataId
+ /* 0x150 */ s16 doorTimer1; // a door timer used when door cam is indexed from bgCamIndex
/* 0x152 */ s16 unk152;
/* 0x154 */ s16 prevSetting;
/* 0x156 */ s16 nextCamSceneDataId;
@@ -1600,8 +1600,8 @@ typedef struct Camera {
/* 0x15A */ s16 roll;
/* 0x15C */ s16 viewFlags;
/* 0x15E */ s16 animState; // Determines the current state of the current camera behavior function
- /* 0x160 */ s16 unk160;
- /* 0x162 */ s16 doorTimer2; // a door timer used when door cam is indexed from bgCamDataId
+ /* 0x160 */ s16 timer; // Unused remnant of OoT: originally destoryed subCamera when timer ran out
+ /* 0x162 */ s16 doorTimer2; // a door timer used when door cam is indexed from bgCamIndex
/* 0x164 */ s16 camId;
/* 0x166 */ s16 prevBgCamDataId;
/* 0x168 */ s16 unk168;
diff --git a/include/z64door.h b/include/z64door.h
new file mode 100644
index 000000000..26653c308
--- /dev/null
+++ b/include/z64door.h
@@ -0,0 +1,24 @@
+#ifndef Z64_DOOR_H
+#define Z64_DOOR_H
+
+#include "ultra64.h"
+#include "z64actor.h"
+
+typedef struct KnobDoorActor {
+ /* 0x000 */ DynaPolyActor dyna;
+ /* 0x15C */ SkelAnime skelAnime;
+ /* 0x1A0 */ u8 animIndex;
+ /* 0x1A1 */ u8 playOpenAnim;
+ /* 0x1A2 */ s8 requiredObjBankIndex;
+ /* 0x1A3 */ s8 dlIndex;
+} KnobDoorActor; // size = 0x1A4
+
+typedef struct SlidingDoorActor {
+ /* 0x000 */ DynaPolyActor dyna;
+ /* 0x15C */ s16 unk_15C;
+ /* 0x15E */ s16 unk_15E;
+} SlidingDoorActor; // size = 0x160
+
+#define DOOR_GET_TRANSITION_ID(thisx) ((u16)(thisx)->params >> 10)
+
+#endif
diff --git a/include/z64effect.h b/include/z64effect.h
index d6ab8b3b5..71ad80510 100644
--- a/include/z64effect.h
+++ b/include/z64effect.h
@@ -118,10 +118,10 @@ typedef struct {
/* 0x188 */ u16 flags;
/* 0x18A */ s16 addAngleChange;
/* 0x18C */ s16 addAngle;
- /* 0x18E */ Color_RGBA8 p1StartColor;
- /* 0x192 */ Color_RGBA8 p2StartColor;
- /* 0x196 */ Color_RGBA8 p1EndColor;
- /* 0x19A */ Color_RGBA8 p2EndColor;
+ /* 0x18E */ u8 p1StartColor[4];
+ /* 0x192 */ u8 p2StartColor[4];
+ /* 0x196 */ u8 p1EndColor[4];
+ /* 0x19A */ u8 p2EndColor[4];
/* 0x19E */ u8 numElements; // "now_edge_num"
/* 0x19F */ u8 elemDuration;
/* 0x1A0 */ u8 unkFlag;
diff --git a/include/z64frameadvance.h b/include/z64frameadvance.h
index c0feaed59..179a1adba 100644
--- a/include/z64frameadvance.h
+++ b/include/z64frameadvance.h
@@ -1,8 +1,7 @@
#ifndef Z64FRAMEADVANCE_H
#define Z64FRAMEADVANCE_H
-#include "ultra64.h"
-#include "io/controller.h"
+#include "padmgr.h"
typedef struct FrameAdvanceContext {
/* 0x0 */ s32 enabled;
diff --git a/include/z64interface.h b/include/z64interface.h
index 8933ac08b..0f2e01e17 100644
--- a/include/z64interface.h
+++ b/include/z64interface.h
@@ -55,7 +55,10 @@ typedef enum {
/* 0x27 */ DO_ACTION_POUND,
/* 0x28 */ DO_ACTION_HOOK,
/* 0x29 */ DO_ACTION_SHOOT,
- /* 0x2A */ DO_ACTION_MAX
+ /* 0x2A */ DO_ACTION_MAX,
+ /* 0x2A */ TATL_STATE_2A = DO_ACTION_MAX,
+ /* 0x2B */ TATL_STATE_2B,
+ /* 0x2C */ TATL_STATE_2C
} DoAction;
typedef enum {
diff --git a/include/z64item.h b/include/z64item.h
index d1d36ebba..345a22897 100644
--- a/include/z64item.h
+++ b/include/z64item.h
@@ -332,12 +332,16 @@ typedef enum GetItemId {
/* 0x08 */ GI_WALLET_ADULT,
/* 0x09 */ GI_WALLET_GIANT,
/* 0x0A */ GI_RECOVERY_HEART,
- /* 0x0C */ GI_HEART_PIECE = 0x0C,
+ /* 0x0B */ GI_0B,
+ /* 0x0C */ GI_HEART_PIECE,
/* 0x0D */ GI_HEART_CONTAINER,
/* 0x0E */ GI_MAGIC_SMALL,
/* 0x0F */ GI_MAGIC_LARGE,
- /* 0x11 */ GI_STRAY_FAIRY = 0x11,
- /* 0x14 */ GI_BOMBS_1 = 0x14,
+ /* 0x10 */ GI_10,
+ /* 0x11 */ GI_STRAY_FAIRY,
+ /* 0x12 */ GI_12,
+ /* 0x13 */ GI_13,
+ /* 0x14 */ GI_BOMBS_1,
/* 0x15 */ GI_BOMBS_5,
/* 0x16 */ GI_BOMBS_10,
/* 0x17 */ GI_BOMBS_20,
@@ -360,8 +364,14 @@ typedef enum GetItemId {
/* 0x28 */ GI_NUTS_1,
/* 0x29 */ GI_NUTS_5,
/* 0x2A */ GI_NUTS_10,
- /* 0x2E */ GI_BOMBCHUS_20 = 0x2E,
- /* 0x32 */ GI_SHIELD_HERO = 0x32,
+ /* 0x2B */ GI_2B,
+ /* 0x2C */ GI_2C,
+ /* 0x2D */ GI_2D,
+ /* 0x2E */ GI_BOMBCHUS_20,
+ /* 0x2F */ GI_2F,
+ /* 0x30 */ GI_30,
+ /* 0x31 */ GI_31,
+ /* 0x32 */ GI_SHIELD_HERO,
/* 0x33 */ GI_SHIELD_MIRROR,
/* 0x34 */ GI_POWDER_KEG,
/* 0x35 */ GI_MAGIC_BEANS,
@@ -379,10 +389,24 @@ typedef enum GetItemId {
/* 0x41 */ GI_HOOKSHOT,
/* 0x42 */ GI_LENS,
/* 0x43 */ GI_PICTO_BOX,
- /* 0x4C */ GI_OCARINA = 0x4C,
- /* 0x50 */ GI_BOMBERS_NOTEBOOK = 0x50,
- /* 0x52 */ GI_SKULL_TOKEN = 0x52,
- /* 0x55 */ GI_REMAINS_ODOLWA = 0x55,
+ /* 0x44 */ GI_44,
+ /* 0x45 */ GI_45,
+ /* 0x46 */ GI_46,
+ /* 0x47 */ GI_47,
+ /* 0x48 */ GI_48,
+ /* 0x49 */ GI_49,
+ /* 0x4A */ GI_4A,
+ /* 0x4B */ GI_4B,
+ /* 0x4C */ GI_OCARINA,
+ /* 0x4D */ GI_4D,
+ /* 0x4E */ GI_4E,
+ /* 0x4F */ GI_4F,
+ /* 0x50 */ GI_BOMBERS_NOTEBOOK,
+ /* 0x51 */ GI_51,
+ /* 0x52 */ GI_SKULL_TOKEN,
+ /* 0x53 */ GI_53,
+ /* 0x54 */ GI_54,
+ /* 0x55 */ GI_REMAINS_ODOLWA,
/* 0x56 */ GI_REMAINS_GOHT,
/* 0x57 */ GI_REMAINS_GYORG,
/* 0x58 */ GI_REMAINS_TWINMOLD,
@@ -410,9 +434,14 @@ typedef enum GetItemId {
/* 0x6E */ GI_SEAHORSE,
/* 0x6F */ GI_CHATEAU_BOTTLE,
/* 0x70 */ GI_HYLIAN_LOACH,
- /* 0x75 */ GI_75 = 0x75,
+ /* 0x71 */ GI_71,
+ /* 0x72 */ GI_72,
+ /* 0x73 */ GI_73,
+ /* 0x74 */ GI_74,
+ /* 0x75 */ GI_75,
/* 0x76 */ GI_ICE_TRAP,
- /* 0x78 */ GI_MASK_DEKU = 0x78,
+ /* 0x77 */ GI_77,
+ /* 0x78 */ GI_MASK_DEKU,
/* 0x79 */ GI_MASK_GORON,
/* 0x7A */ GI_MASK_ZORA,
/* 0x7B */ GI_MASK_FIERCE_DEITY,
@@ -436,7 +465,8 @@ typedef enum GetItemId {
/* 0x8D */ GI_MASK_BLAST,
/* 0x8E */ GI_MASK_SCENTS,
/* 0x8F */ GI_MASK_KAFEIS_MASK,
- /* 0x91 */ GI_CHATEAU = 0x91,
+ /* 0x90 */ GI_90,
+ /* 0x91 */ GI_CHATEAU,
/* 0x92 */ GI_MILK,
/* 0x93 */ GI_GOLD_DUST_2,
/* 0x94 */ GI_HYLIAN_LOACH_2, // Unused bottled eel
@@ -463,7 +493,15 @@ typedef enum GetItemId {
/* 0xA9 */ GI_BOTTLE_STOLEN, // buy back stolen bottle
/* 0xAA */ GI_LETTER_TO_KAFEI,
/* 0xAB */ GI_PENDANT_OF_MEMORIES,
- /* 0xB4 */ GI_TINGLE_MAP_CLOCK_TOWN = 0xB4,
+ /* 0xAC */ GI_AC,
+ /* 0xAD */ GI_AD,
+ /* 0xAE */ GI_AE,
+ /* 0xAF */ GI_AF,
+ /* 0xB0 */ GI_B0,
+ /* 0xB1 */ GI_B1,
+ /* 0xB2 */ GI_B2,
+ /* 0xB3 */ GI_B3,
+ /* 0xB4 */ GI_TINGLE_MAP_CLOCK_TOWN,
/* 0xB5 */ GI_TINGLE_MAP_WOODFALL,
/* 0xB6 */ GI_TINGLE_MAP_SNOWHEAD,
/* 0xB7 */ GI_TINGLE_MAP_ROMANI_RANCH,
diff --git a/include/z64math.h b/include/z64math.h
index d47a01a64..8df81454a 100644
--- a/include/z64math.h
+++ b/include/z64math.h
@@ -87,12 +87,32 @@ typedef struct {
/* 0x0C */ Vec3f b;
} LineSegment; // size = 0x18
-// Defines a point in the spherical coordinate system
typedef struct {
- /* 0x0 */ f32 r; // radius
- /* 0x4 */ s16 pitch; // polar (zenith) angle
- /* 0x6 */ s16 yaw; // azimuthal angle
-} VecSph; // size = 0x8
+ /* 0x0 */ f32 r; // radius
+ /* 0x4 */ s16 pitch; // depends on coordinate system. See below.
+ /* 0x6 */ s16 yaw; // azimuthal angle
+} VecSphGeo; // size = 0x8
+
+// Defines a point in the spherical coordinate system.
+// Pitch is 0 along the positive y-axis (up)
+typedef VecSphGeo VecSph;
+
+// Defines a point in the geographic coordinate system.
+// Pitch is 0 along the xz-plane (horizon)
+typedef VecSphGeo VecGeo;
+
+// To be used with OLib_Vec3fAdd()
+typedef enum {
+ /* 0 */ OLIB_ADD_COPY, // Copy `b` to dest
+ /* 1 */ OLIB_ADD_OFFSET, // Add `a` and `b` to dest, and also add the yaw of `a` to the dest
+ /* 2 */ OLIB_ADD, // Add `a` and `b` to dest
+} OlibVec3fAdd;
+
+typedef enum {
+ /* 0 */ OLIB_DIFF_COPY, // Copy `b` to dest
+ /* 1 */ OLIB_DIFF_OFFSET, // Sub `a` and `b` to dest, and also subs the yaw of `a` to the dest
+ /* 2 */ OLIB_DIFF, // Sub `a` and `b` to dest
+} OlibVec3fDiff;
#define LERPIMP(v0, v1, t) ((v0) + (((v1) - (v0)) * (t)))
#define F32_LERP(v0, v1, t) ((1.0f - (t)) * (f32)(v0) + (t) * (f32)(v1))
diff --git a/include/z64player.h b/include/z64player.h
index 54894893f..d9c80384f 100644
--- a/include/z64player.h
+++ b/include/z64player.h
@@ -43,35 +43,6 @@ typedef enum PlayerTransformation {
/* 5 */ PLAYER_FORM_MAX
} PlayerTransformation;
-typedef enum PlayerMask {
- /* 0x00 */ PLAYER_MASK_NONE,
- /* 0x01 */ PLAYER_MASK_TRUTH,
- /* 0x02 */ PLAYER_MASK_KAFEIS_MASK,
- /* 0x03 */ PLAYER_MASK_ALL_NIGHT,
- /* 0x04 */ PLAYER_MASK_BUNNY,
- /* 0x05 */ PLAYER_MASK_KEATON,
- /* 0x06 */ PLAYER_MASK_GARO,
- /* 0x07 */ PLAYER_MASK_ROMANI,
- /* 0x08 */ PLAYER_MASK_CIRCUS_LEADER,
- /* 0x09 */ PLAYER_MASK_POSTMAN,
- /* 0x0A */ PLAYER_MASK_COUPLE,
- /* 0x0B */ PLAYER_MASK_GREAT_FAIRY,
- /* 0x0C */ PLAYER_MASK_GIBDO,
- /* 0x0D */ PLAYER_MASK_DON_GERO,
- /* 0x0E */ PLAYER_MASK_KAMARO,
- /* 0x0F */ PLAYER_MASK_CAPTAIN,
- /* 0x10 */ PLAYER_MASK_STONE,
- /* 0x11 */ PLAYER_MASK_BREMEN,
- /* 0x12 */ PLAYER_MASK_BLAST,
- /* 0x13 */ PLAYER_MASK_SCENTS,
- /* 0x14 */ PLAYER_MASK_GIANT,
- /* 0x15 */ PLAYER_MASK_FIERCE_DEITY,
- /* 0x16 */ PLAYER_MASK_GORON,
- /* 0x17 */ PLAYER_MASK_ZORA,
- /* 0x18 */ PLAYER_MASK_DEKU,
- /* 0x19 */ PLAYER_MASK_MAX
-} PlayerMask;
-
typedef enum {
/* 0 */ PLAYER_ENV_HAZARD_NONE,
/* 1 */ PLAYER_ENV_HAZARD_HOTROOM,
@@ -89,7 +60,7 @@ typedef enum PlayerItemAction {
/* 0x03 */ PLAYER_IA_SWORD_KOKIRI = PLAYER_IA_SWORD_MIN,
/* 0x04 */ PLAYER_IA_SWORD_RAZOR,
/* 0x05 */ PLAYER_IA_SWORD_GILDED,
- /* 0x06 */ PLAYER_IA_SWORD_GREAT_FAIRY,
+ /* 0x06 */ PLAYER_IA_SWORD_TWO_HANDED,
/* 0x07 */ PLAYER_IA_STICK,
/* 0x08 */ PLAYER_IA_ZORA_FINS,
/* 0x09 */ PLAYER_IA_BOW,
@@ -143,7 +114,8 @@ typedef enum PlayerItemAction {
/* 0x37 */ PLAYER_IA_37,
/* 0x38 */ PLAYER_IA_38,
/* 0x39 */ PLAYER_IA_39,
- /* 0x3A */ PLAYER_IA_MASK_TRUTH,
+ /* 0x3A */ PLAYER_IA_MASK_MIN,
+ /* 0x3A */ PLAYER_IA_MASK_TRUTH = PLAYER_IA_MASK_MIN,
/* 0x3B */ PLAYER_IA_MASK_KAFEIS_MASK,
/* 0x3C */ PLAYER_IA_MASK_ALL_NIGHT,
/* 0x3D */ PLAYER_IA_MASK_BUNNY,
@@ -163,10 +135,12 @@ typedef enum PlayerItemAction {
/* 0x4B */ PLAYER_IA_MASK_BLAST,
/* 0x4C */ PLAYER_IA_MASK_SCENTS,
/* 0x4D */ PLAYER_IA_MASK_GIANT,
- /* 0x4E */ PLAYER_IA_MASK_FIERCE_DEITY,
+ /* 0x4E */ PLAYER_IA_MASK_TRANSFORMATION_MIN,
+ /* 0x4E */ PLAYER_IA_MASK_FIERCE_DEITY = PLAYER_IA_MASK_TRANSFORMATION_MIN,
/* 0x4F */ PLAYER_IA_MASK_GORON,
/* 0x50 */ PLAYER_IA_MASK_ZORA,
/* 0x51 */ PLAYER_IA_MASK_DEKU,
+ /* 0x51 */ PLAYER_IA_MASK_MAX = PLAYER_IA_MASK_DEKU,
/* 0x52 */ PLAYER_IA_LENS,
/* 0x53 */ PLAYER_IA_MAX
} PlayerItemAction;
@@ -190,12 +164,45 @@ typedef enum PlayerMeleeWeapon {
/* 1 */ PLAYER_MELEEWEAPON_SWORD_KOKIRI = GET_MELEE_WEAPON_FROM_IA(PLAYER_IA_SWORD_KOKIRI),
/* 2 */ PLAYER_MELEEWEAPON_SWORD_RAZOR = GET_MELEE_WEAPON_FROM_IA(PLAYER_IA_SWORD_RAZOR),
/* 3 */ PLAYER_MELEEWEAPON_SWORD_GILDED = GET_MELEE_WEAPON_FROM_IA(PLAYER_IA_SWORD_GILDED),
- /* 4 */ PLAYER_MELEEWEAPON_SWORD_GREAT_FAIRY = GET_MELEE_WEAPON_FROM_IA(PLAYER_IA_SWORD_GREAT_FAIRY),
+ /* 4 */ PLAYER_MELEEWEAPON_SWORD_TWO_HANDED = GET_MELEE_WEAPON_FROM_IA(PLAYER_IA_SWORD_TWO_HANDED),
/* 5 */ PLAYER_MELEEWEAPON_STICK = GET_MELEE_WEAPON_FROM_IA(PLAYER_IA_STICK),
/* 6 */ PLAYER_MELEEWEAPON_ZORA_FINS = GET_MELEE_WEAPON_FROM_IA(PLAYER_IA_ZORA_FINS),
/* 7 */ PLAYER_MELEEWEAPON_MAX
} PlayerMeleeWeapon;
+// Relies on mask item actions to be contiguous
+#define GET_MASK_FROM_IA(itemAction) ((itemAction) - (PLAYER_IA_MASK_MIN - 1))
+#define GET_IA_FROM_MASK(mask) ((mask) + (PLAYER_IA_MASK_MIN - 1))
+
+typedef enum PlayerMask {
+ /* 0x00 */ PLAYER_MASK_NONE,
+ /* 0x01 */ PLAYER_MASK_TRUTH = GET_MASK_FROM_IA(PLAYER_IA_MASK_TRUTH),
+ /* 0x02 */ PLAYER_MASK_KAFEIS_MASK = GET_MASK_FROM_IA(PLAYER_IA_MASK_KAFEIS_MASK),
+ /* 0x03 */ PLAYER_MASK_ALL_NIGHT = GET_MASK_FROM_IA(PLAYER_IA_MASK_ALL_NIGHT),
+ /* 0x04 */ PLAYER_MASK_BUNNY = GET_MASK_FROM_IA(PLAYER_IA_MASK_BUNNY),
+ /* 0x05 */ PLAYER_MASK_KEATON = GET_MASK_FROM_IA(PLAYER_IA_MASK_KEATON),
+ /* 0x06 */ PLAYER_MASK_GARO = GET_MASK_FROM_IA(PLAYER_IA_MASK_GARO),
+ /* 0x07 */ PLAYER_MASK_ROMANI = GET_MASK_FROM_IA(PLAYER_IA_MASK_ROMANI),
+ /* 0x08 */ PLAYER_MASK_CIRCUS_LEADER = GET_MASK_FROM_IA(PLAYER_IA_MASK_CIRCUS_LEADER),
+ /* 0x09 */ PLAYER_MASK_POSTMAN = GET_MASK_FROM_IA(PLAYER_IA_MASK_POSTMAN),
+ /* 0x0A */ PLAYER_MASK_COUPLE = GET_MASK_FROM_IA(PLAYER_IA_MASK_COUPLE),
+ /* 0x0B */ PLAYER_MASK_GREAT_FAIRY = GET_MASK_FROM_IA(PLAYER_IA_MASK_GREAT_FAIRY),
+ /* 0x0C */ PLAYER_MASK_GIBDO = GET_MASK_FROM_IA(PLAYER_IA_MASK_GIBDO),
+ /* 0x0D */ PLAYER_MASK_DON_GERO = GET_MASK_FROM_IA(PLAYER_IA_MASK_DON_GERO),
+ /* 0x0E */ PLAYER_MASK_KAMARO = GET_MASK_FROM_IA(PLAYER_IA_MASK_KAMARO),
+ /* 0x0F */ PLAYER_MASK_CAPTAIN = GET_MASK_FROM_IA(PLAYER_IA_MASK_CAPTAIN),
+ /* 0x10 */ PLAYER_MASK_STONE = GET_MASK_FROM_IA(PLAYER_IA_MASK_STONE),
+ /* 0x11 */ PLAYER_MASK_BREMEN = GET_MASK_FROM_IA(PLAYER_IA_MASK_BREMEN),
+ /* 0x12 */ PLAYER_MASK_BLAST = GET_MASK_FROM_IA(PLAYER_IA_MASK_BLAST),
+ /* 0x13 */ PLAYER_MASK_SCENTS = GET_MASK_FROM_IA(PLAYER_IA_MASK_SCENTS),
+ /* 0x14 */ PLAYER_MASK_GIANT = GET_MASK_FROM_IA(PLAYER_IA_MASK_GIANT),
+ /* 0x15 */ PLAYER_MASK_FIERCE_DEITY = GET_MASK_FROM_IA(PLAYER_IA_MASK_FIERCE_DEITY),
+ /* 0x16 */ PLAYER_MASK_GORON = GET_MASK_FROM_IA(PLAYER_IA_MASK_GORON),
+ /* 0x17 */ PLAYER_MASK_ZORA = GET_MASK_FROM_IA(PLAYER_IA_MASK_ZORA),
+ /* 0x18 */ PLAYER_MASK_DEKU = GET_MASK_FROM_IA(PLAYER_IA_MASK_DEKU),
+ /* 0x19 */ PLAYER_MASK_MAX
+} PlayerMask;
+
// Relies on bottle-related item actions to be contiguous
#define GET_BOTTLE_FROM_IA(itemAction) ((itemAction) - PLAYER_IA_BOTTLE_MIN)
@@ -244,7 +251,7 @@ typedef enum PlayerSword {
/* 0 */ PLAYER_SWORD_KOKIRI = GET_SWORD_FROM_IA(PLAYER_IA_SWORD_KOKIRI),
/* 1 */ PLAYER_SWORD_RAZOR = GET_SWORD_FROM_IA(PLAYER_IA_SWORD_RAZOR),
/* 2 */ PLAYER_SWORD_GILDED = GET_SWORD_FROM_IA(PLAYER_IA_SWORD_GILDED),
- /* 3 */ PLAYER_SWORD_GREAT_FAIRY = GET_SWORD_FROM_IA(PLAYER_IA_SWORD_GREAT_FAIRY),
+ /* 3 */ PLAYER_SWORD_TWO_HANDED = GET_SWORD_FROM_IA(PLAYER_IA_SWORD_TWO_HANDED),
/* 4 */ PLAYER_SWORD_MAX
} PlayerSword;
@@ -287,6 +294,12 @@ typedef enum PlayerMeleeWeaponAnimation {
/* 34 */ PLAYER_MWA_MAX
} PlayerMeleeWeaponAnimation;
+typedef enum PlayerMeleeWeaponState {
+ /* -1 */ PLAYER_MELEE_WEAPON_STATE_MINUS_1 = -1,
+ /* 0 */ PLAYER_MELEE_WEAPON_STATE_0,
+ /* 1 */ PLAYER_MELEE_WEAPON_STATE_1
+} PlayerMeleeWeaponState;
+
typedef enum PlayerDoorType {
/* -1 */ PLAYER_DOORTYPE_TALKING = -1, // Displays a message instead of opening
/* 0 */ PLAYER_DOORTYPE_NONE,
@@ -300,13 +313,61 @@ typedef enum PlayerDoorType {
typedef enum PlayerAnimType {
/* 0 */ PLAYER_ANIMTYPE_DEFAULT, // DEFAULT
/* 1 */ PLAYER_ANIMTYPE_1,
- /* 2 */ PLAYER_ANIMTYPE_2,
+ /* 2 */ PLAYER_ANIMTYPE_2, // Shield but no sword?
/* 3 */ PLAYER_ANIMTYPE_3, // Two hand weapon
/* 4 */ PLAYER_ANIMTYPE_4,
/* 5 */ PLAYER_ANIMTYPE_5,
/* 6 */ PLAYER_ANIMTYPE_MAX
} PlayerAnimType;
+typedef enum PlayerAnimGroup {
+ /* 0 */ PLAYER_ANIMGROUP_0, // STANDING_IDLE
+ /* 1 */ PLAYER_ANIMGROUP_1, // WALKING
+ /* 2 */ PLAYER_ANIMGROUP_2, // RUNNING
+ /* 3 */ PLAYER_ANIMGROUP_3,
+ /* 4 */ PLAYER_ANIMGROUP_4,
+ /* 5 */ PLAYER_ANIMGROUP_5, // Z-Targeting ?
+ /* 6 */ PLAYER_ANIMGROUP_6, // Start or finishing some animation
+ /* 7 */ PLAYER_ANIMGROUP_7, // DRAW_MELEE_WEAPON
+ /* 8 */ PLAYER_ANIMGROUP_8, // OPEN_DOOR_LEFT_FIERCE_DEITY
+ /* 9 */ PLAYER_ANIMGROUP_9, // OPEN_DOOR_LEFT_HUMAN
+ /* 10 */ PLAYER_ANIMGROUP_10, // OPEN_DOOR_RIGHT_FIERCE_DEITY
+ /* 11 */ PLAYER_ANIMGROUP_11, // OPEN_DOOR_RIGHT_HUMAN
+ /* 12 */ PLAYER_ANIMGROUP_12, // GRABBING
+ /* 13 */ PLAYER_ANIMGROUP_13, // FALLING/LANDING?
+ /* 14 */ PLAYER_ANIMGROUP_14, // landing from short distances?
+ /* 15 */ PLAYER_ANIMGROUP_15, // ROLLING
+ /* 16 */ PLAYER_ANIMGROUP_16, // BONK/BONKING
+ /* 17 */ PLAYER_ANIMGROUP_17,
+ /* 18 */ PLAYER_ANIMGROUP_18,
+ /* 19 */ PLAYER_ANIMGROUP_19, // START_SHIELDING
+ /* 20 */ PLAYER_ANIMGROUP_20, // SHIELDING
+ /* 21 */ PLAYER_ANIMGROUP_21, // STOP_SHIELDING/END_SHIELDING
+ /* 22 */ PLAYER_ANIMGROUP_22, // SLOW_SIDE_WALK?
+ /* 23 */ PLAYER_ANIMGROUP_23, // SIDE_WALK
+ /* 24 */ PLAYER_ANIMGROUP_24, // SIDE_WALK_RIGHT
+ /* 25 */ PLAYER_ANIMGROUP_25,
+ /* 26 */ PLAYER_ANIMGROUP_26,
+ /* 27 */ PLAYER_ANIMGROUP_27,
+ /* 28 */ PLAYER_ANIMGROUP_28, // THROWING
+ /* 29 */ PLAYER_ANIMGROUP_29, // PUT_DOWN_OBJECT?
+ /* 30 */ PLAYER_ANIMGROUP_30, // back walking slow?
+ /* 31 */ PLAYER_ANIMGROUP_31,
+ /* 32 */ PLAYER_ANIMGROUP_32,
+ /* 33 */ PLAYER_ANIMGROUP_33,
+ /* 34 */ PLAYER_ANIMGROUP_34, // PULLING_START
+ /* 35 */ PLAYER_ANIMGROUP_35, // PULLING
+ /* 36 */ PLAYER_ANIMGROUP_36, // PULLING_END
+ /* 37 */ PLAYER_ANIMGROUP_37, // climbing from a ledge?
+ /* 38 */ PLAYER_ANIMGROUP_38, // ledge
+ /* 39 */ PLAYER_ANIMGROUP_39, // ledge
+ /* 40 */ PLAYER_ANIMGROUP_40, // climbing from a ledge
+ /* 41 */ PLAYER_ANIMGROUP_41,
+ /* 42 */ PLAYER_ANIMGROUP_42,
+ /* 43 */ PLAYER_ANIMGROUP_43,
+ /* 44 */ PLAYER_ANIMGROUP_MAX
+} PlayerAnimGroup;
+
typedef enum PlayerModelType {
// left hand
/* 0 */ PLAYER_MODELTYPE_LH_OPEN,
@@ -464,7 +525,7 @@ typedef struct PlayerAnimationFrame {
#define GET_RIGHT_HAND_INDEX_FROM_JOINT_TABLE(jointTable) (GET_APPEARANCE_FROM_JOINT_TABLE(jointTable) & 0x0F00)
typedef struct PlayerAgeProperties {
- /* 0x00 */ f32 unk_00; // ceilingCheckHeight?
+ /* 0x00 */ f32 unk_00; // ceilingCheckHeight
/* 0x04 */ f32 shadowScale;
/* 0x08 */ f32 unk_08;
/* 0x0C */ f32 unk_0C;
@@ -478,7 +539,7 @@ typedef struct PlayerAgeProperties {
/* 0x2C */ f32 unk_2C; // water stuff // depthInWater
/* 0x30 */ f32 unk_30; // water stuff // depthInWater
/* 0x34 */ f32 unk_34;
- /* 0x38 */ f32 unk_38; // wallCheckHeight?
+ /* 0x38 */ f32 unk_38; // wallCheckHeight
/* 0x3C */ f32 unk_3C;
/* 0x40 */ f32 unk_40;
/* 0x44 */ Vec3s unk_44;
@@ -489,9 +550,9 @@ typedef struct PlayerAgeProperties {
/* 0x94 */ u16 surfaceSfxIdOffset;
/* 0x98 */ f32 unk_98;
/* 0x9C */ f32 unk_9C;
- /* 0xA0 */ PlayerAnimationHeader* unk_A0;
- /* 0xA4 */ PlayerAnimationHeader* unk_A4;
- /* 0xA8 */ PlayerAnimationHeader* unk_A8;
+ /* 0xA0 */ PlayerAnimationHeader* openChestAnim;
+ /* 0xA4 */ PlayerAnimationHeader* unk_A4; // OoT leftovers to interact with the Master Sword
+ /* 0xA8 */ PlayerAnimationHeader* unk_A8; // OoT leftovers to interact with the Master Sword
/* 0xAC */ PlayerAnimationHeader* unk_AC;
/* 0xB0 */ PlayerAnimationHeader* unk_B0;
/* 0xB4 */ PlayerAnimationHeader* unk_B4[4];
@@ -547,7 +608,7 @@ typedef enum PlayerCsMode {
/* 0x0F */ PLAYER_CSMODE_15,
/* 0x10 */ PLAYER_CSMODE_16,
/* 0x11 */ PLAYER_CSMODE_17,
- /* 0x12 */ PLAYER_CSMODE_18,
+ /* 0x12 */ PLAYER_CSMODE_18, // Strangled by Wallmaster
/* 0x13 */ PLAYER_CSMODE_19,
/* 0x14 */ PLAYER_CSMODE_20,
/* 0x15 */ PLAYER_CSMODE_21,
@@ -555,7 +616,7 @@ typedef enum PlayerCsMode {
/* 0x17 */ PLAYER_CSMODE_23,
/* 0x18 */ PLAYER_CSMODE_24,
/* 0x19 */ PLAYER_CSMODE_25,
- /* 0x1A */ PLAYER_CSMODE_26,
+ /* 0x1A */ PLAYER_CSMODE_26, // Halt!
/* 0x1B */ PLAYER_CSMODE_27,
/* 0x1C */ PLAYER_CSMODE_28,
/* 0x1D */ PLAYER_CSMODE_29,
@@ -613,7 +674,7 @@ typedef enum PlayerCsMode {
/* 0x51 */ PLAYER_CSMODE_81,
/* 0x52 */ PLAYER_CSMODE_82,
/* 0x53 */ PLAYER_CSMODE_83,
- /* 0x54 */ PLAYER_CSMODE_84,
+ /* 0x54 */ PLAYER_CSMODE_84, // Sucked by the moon
/* 0x55 */ PLAYER_CSMODE_85,
/* 0x56 */ PLAYER_CSMODE_86,
/* 0x57 */ PLAYER_CSMODE_87,
@@ -677,7 +738,7 @@ typedef enum PlayerCsMode {
#define PLAYER_STATE1_1 (1 << 0)
//
#define PLAYER_STATE1_2 (1 << 1)
-//
+// Climbing ledge
#define PLAYER_STATE1_4 (1 << 2)
//
#define PLAYER_STATE1_8 (1 << 3)
@@ -697,7 +758,7 @@ typedef enum PlayerCsMode {
#define PLAYER_STATE1_400 (1 << 10)
//
#define PLAYER_STATE1_800 (1 << 11)
-//
+// charging spin attack
#define PLAYER_STATE1_1000 (1 << 12)
//
#define PLAYER_STATE1_2000 (1 << 13)
@@ -731,7 +792,7 @@ typedef enum PlayerCsMode {
#define PLAYER_STATE1_8000000 (1 << 27)
//
#define PLAYER_STATE1_10000000 (1 << 28)
-//
+// Time is stopped but Link & NPC animations continue
#define PLAYER_STATE1_20000000 (1 << 29)
//
#define PLAYER_STATE1_40000000 (1 << 30)
@@ -761,7 +822,7 @@ typedef enum PlayerCsMode {
#define PLAYER_STATE2_200 (1 << 9)
//
#define PLAYER_STATE2_400 (1 << 10)
-//
+// Diving
#define PLAYER_STATE2_800 (1 << 11)
//
#define PLAYER_STATE2_1000 (1 << 12)
@@ -773,7 +834,7 @@ typedef enum PlayerCsMode {
#define PLAYER_STATE2_8000 (1 << 15)
//
#define PLAYER_STATE2_10000 (1 << 16)
-//
+// A non-magic spin attack
#define PLAYER_STATE2_20000 (1 << 17)
//
#define PLAYER_STATE2_40000 (1 << 18)
@@ -821,7 +882,7 @@ typedef enum PlayerCsMode {
#define PLAYER_STATE3_40 (1 << 6)
//
#define PLAYER_STATE3_80 (1 << 7)
-// Related to form Deku
+// Deku flower dive
#define PLAYER_STATE3_100 (1 << 8)
//
#define PLAYER_STATE3_200 (1 << 9)
@@ -867,10 +928,11 @@ typedef enum PlayerCsMode {
#define PLAYER_STATE3_20000000 (1 << 29)
//
#define PLAYER_STATE3_40000000 (1 << 30)
-//
+// TARGETING_HOSTILE?
#define PLAYER_STATE3_80000000 (1 << 31)
+#define PLAYER_GET_BG_CAM_INDEX(thisx) ((thisx)->params & 0xFF)
#define PLAYER_GET_INITMODE(thisx) (((thisx)->params & 0xF00) >> 8)
typedef enum PlayerInitMode {
@@ -894,6 +956,15 @@ typedef enum PlayerInitMode {
#define PLAYER_PARAMS(startBgCamIndex, initMode) ((startBgCamIndex & 0xFF) | ((initMode & 0xF) << 8))
+typedef enum PlayerUnkAA5 {
+ /* 0 */ PLAYER_UNKAA5_0,
+ /* 1 */ PLAYER_UNKAA5_1,
+ /* 2 */ PLAYER_UNKAA5_2,
+ /* 3 */ PLAYER_UNKAA5_3,
+ /* 4 */ PLAYER_UNKAA5_4,
+ /* 5 */ PLAYER_UNKAA5_5,
+} PlayerUnkAA5;
+
typedef void (*PlayerActionFunc)(struct Player* this, struct PlayState* play);
typedef s32 (*PlayerFuncAC4)(struct Player* this, struct PlayState* play);
typedef void (*PlayerFuncD58)(struct PlayState* play, struct Player* this);
@@ -917,31 +988,13 @@ typedef struct Player {
/* 0x151 */ u8 rightHandType;
/* 0x152 */ u8 sheathType;
/* 0x153 */ u8 currentMask; // PlayerMask enum
- /* 0x154 */ s8 unk_154;
+ /* 0x154 */ s8 unk_154; // EquipSlot enum // Last pressed equip slot?
/* 0x155 */ u8 prevMask;
/* 0x158 */ Gfx** rightHandDLists;
/* 0x15C */ Gfx** leftHandDLists;
/* 0x160 */ Gfx** sheathDLists;
/* 0x164 */ Gfx** waistDLists;
- /* 0x168 */ f32 unk_168;
- /* 0x16C */ f32 unk_16C;
- /* 0x170 */ f32 unk_170;
- /* 0x174 */ f32 unk_174;
- /* 0x178 */ f32 unk_178;
- /* 0x17C */ f32 unk_17C;
- /* 0x180 */ f32 unk_180;
- /* 0x184 */ f32 unk_184;
- /* 0x188 */ f32 unk_188;
- /* 0x18C */ f32 unk_18C;
- /* 0x190 */ f32 unk_190;
- /* 0x194 */ f32 unk_194;
- /* 0x198 */ f32 unk_198;
- /* 0x19C */ f32 unk_19C;
- /* 0x1A0 */ f32 unk_1A0;
- /* 0x1A4 */ f32 unk_1A4;
- /* 0x1A8 */ f32 unk_1A8;
- /* 0x1AC */ f32 unk_1AC;
- /* 0x1B0 */ f32 unk_1B0;
+ /* 0x168 */ UNK_TYPE1 unk_168[0x4C];
/* 0x1B4 */ s16 unk_1B4;
/* 0x1B6 */ char unk_1B6[2];
/* 0x1B8 */ u8 giObjectLoading;
@@ -960,8 +1013,7 @@ typedef struct Player {
/* 0x2C8 */ SkelAnime unk_2C8;
/* 0x30C */ Vec3s jointTable[5];
/* 0x32A */ Vec3s morphTable[5];
- /* 0x348 */ s16 eyeTexId;
- /* 0x34A */ s16 eyeAnimTimer;
+ /* 0x348 */ BlinkInfo blinkInfo;
/* 0x34C */ Actor* heldActor;
/* 0x350 */ PosRot leftHandWorld;
/* 0x364 */ Actor* rightHandActor;
@@ -980,12 +1032,12 @@ typedef struct Player {
/* 0x395 */ u8 prevCsMode; // PlayerCsMode enum
/* 0x396 */ u8 unk_396; // currentActorActionId?
/* 0x397 */ u8 unk_397; // PlayerDoorType enum
- /* 0x398 */ Actor* unk_398;
+ /* 0x398 */ Actor* unk_398; // csActor?
/* 0x39C */ UNK_TYPE1 unk_39C[0x4];
/* 0x3A0 */ Vec3f unk_3A0;
/* 0x3AC */ Vec3f unk_3AC;
/* 0x3B8 */ u16 unk_3B8;
- /* 0x3BA */ s16 unk_3BA;
+ /* 0x3BA */ s16 doorBgCamIndex;
/* 0x3BC */ s16 subCamId;
/* 0x3BE */ char unk_3BE[2];
/* 0x3C0 */ Vec3f unk_3C0;
@@ -1028,7 +1080,7 @@ typedef struct Player {
/* 0xA9C */ f32 secretRumbleCharge; // builds per frame until discharges with a rumble request
/* 0xAA0 */ f32 closestSecretDistSq; // Used to augment `secretRumbleCharge`. Cleared every frame
/* 0xAA4 */ s8 unk_AA4;
- /* 0xAA5 */ u8 unk_AA5;
+ /* 0xAA5 */ u8 unk_AA5; // PlayerUnkAA5 enum
/* 0xAA6 */ u16 unk_AA6; // flags of some kind
/* 0xAA8 */ s16 unk_AA8;
/* 0xAAA */ s16 unk_AAA;
@@ -1049,20 +1101,21 @@ typedef struct Player {
/* 0xADA */ s8 meleeWeaponAnimation;
/* 0xADB */ s8 meleeWeaponState;
/* 0xADC */ s8 unk_ADC;
- /* 0xADD */ s8 unk_ADD;
+ /* 0xADD */ s8 unk_ADD; // Some sort of combo counter
/* 0xADE */ u8 unk_ADE;
/* 0xADF */ s8 unk_ADF[4]; // Circular buffer used for testing for triggering a quickspin
/* 0xAE3 */ s8 unk_AE3[4]; // Circular buffer used for ?
- /* 0xAE7 */ s8 unk_AE7; // a timer
+ /* 0xAE7 */ s8 unk_AE7; // a timer, used as an index for multiple kinds of animations too, room index?, etc
/* 0xAE8 */ s16 unk_AE8; // multipurpose timer
/* 0xAEC */ f32 unk_AEC;
- /* 0xAF0 */ union { // TODO: this may be an union of two structs
+ /* 0xAF0 */ union {
Vec3f unk_AF0[2];
f32 arr_AF0[6];
};
- /* 0xB08 */ f32 unk_B08[2]; // TODO: Investigate if this member actually is an array
+ /* 0xB08 */ f32 unk_B08;
+ /* 0xB0C */ f32 unk_B0C;
/* 0xB10 */ f32 unk_B10[6];
- /* 0xB28 */ s16 unk_B28; //Burning stick timer?
+ /* 0xB28 */ s16 unk_B28; // Burning stick timer?
/* 0xB2A */ s8 getItemDrawIdPlusOne;
/* 0xB2B */ s8 unk_B2B;
/* 0xB2C */ f32 windSpeed;
@@ -1088,7 +1141,7 @@ typedef struct Player {
/* 0xB64 */ u8 unk_B64;
/* 0xB65 */ u8 shockTimer;
/* 0xB66 */ u8 unk_B66;
- /* 0xB67 */ u8 unk_B67; // deku remaining hops counter
+ /* 0xB67 */ u8 remainingHopsCounter; // Deku hopping on water
/* 0xB68 */ s16 fallStartHeight; // last truncated Y position before falling
/* 0xB6A */ s16 fallDistance; // truncated Y distance the player has fallen so far (positive is down)
/* 0xB6C */ s16 unk_B6C;
@@ -1100,8 +1153,8 @@ typedef struct Player {
/* 0xB76 */ s16 unk_B76;
/* 0xB78 */ f32 unk_B78;
/* 0xB7C */ f32 unk_B7C;
- /* 0xB80 */ f32 unk_B80;
- /* 0xB84 */ s16 unk_B84;
+ /* 0xB80 */ f32 pushedSpeed; // Pushing player, examples include water currents, floor conveyors, climbing sloped surfaces
+ /* 0xB84 */ s16 pushedYaw; // Yaw of direction in which player is being pushed
/* 0xB86 */ s16 unk_B86[2]; // unknown length
/* 0xB8A */ s16 unk_B8A;
/* 0xB8C */ s16 unk_B8C;
@@ -1112,7 +1165,7 @@ typedef struct Player {
/* 0xB96 */ s16 unk_B96;
/* 0xB98 */ WeaponInfo meleeWeaponInfo[3];
/* 0xBEC */ Vec3f bodyPartsPos[PLAYER_BODYPART_MAX];
- /* 0xCC4 */ MtxF mf_CC4;
+ /* 0xCC4 */ MtxF leftHandMf;
/* 0xD04 */ MtxF shieldMf;
/* 0xD44 */ u8 isBurning;
/* 0xD45 */ u8 flameTimers[PLAYER_BODYPART_MAX]; // one flame per body part
@@ -1120,8 +1173,7 @@ typedef struct Player {
/* 0xD58 */ PlayerFuncD58 unk_D58;
/* 0xD5C */ s8 invincibilityTimer; // prevents damage when nonzero (positive = visible, counts towards zero each frame)
/* 0xD5D */ u8 unk_D5D;
- /* 0xD5E */ u8 unk_D5E;
- /* 0xD5F */ u8 unk_D5F;
+ /* 0xD5E */ u8 floorProperty; // FloorProperty enum
/* 0xD60 */ f32 unk_D60;
/* 0xD64 */ s16 unk_D64;
/* 0xD66 */ u16 unk_D66; // sfx
diff --git a/include/z64quake.h b/include/z64quake.h
index f0bd401fc..0150b5404 100644
--- a/include/z64quake.h
+++ b/include/z64quake.h
@@ -1,68 +1,64 @@
#ifndef Z64QUAKE_H
#define Z64QUAKE_H
+#include "z64camera.h"
#include "z64math.h"
struct PlayState;
-struct Camera;
typedef struct {
/* 0x00 */ Vec3f atOffset;
/* 0x0C */ Vec3f eyeOffset;
- /* 0x18 */ s16 rollOffset;
- /* 0x1A */ s16 zoom;
- /* 0x1C */ f32 max; // Set to scaled max data of struct (mag for Vec3f), never used
-} QuakeCamCalc; // size = 0x20
-
-#define QUAKE_SPEED (1 << 0)
-#define QUAKE_VERTICAL_MAG (1 << 1)
-#define QUAKE_HORIZONTAL_MAG (1 << 2)
-#define QUAKE_ZOOM (1 << 3)
-#define QUAKE_ROLL_OFFSET (1 << 4)
-#define QUAKE_SHAKE_PLANE_OFFSET_X (1 << 5)
-#define QUAKE_SHAKE_PLANE_OFFSET_Y (1 << 6)
-#define QUAKE_SHAKE_PLANE_OFFSET_Z (1 << 7)
-#define QUAKE_COUNTDOWN (1 << 8)
-#define QUAKE_IS_SHAKE_PERPENDICULAR (1 << 9)
+ /* 0x18 */ s16 upRollOffset;
+ /* 0x1A */ s16 fovOffset;
+ /* 0x1C */ f32 maxOffset; // Set to scaled max data of struct (mag for Vec3f), never used
+} ShakeInfo; // size = 0x20
typedef enum {
- /* 1 */ QUAKE_TYPE_1 = 1,
- /* 2 */ QUAKE_TYPE_2,
- /* 3 */ QUAKE_TYPE_3,
- /* 4 */ QUAKE_TYPE_4,
- /* 5 */ QUAKE_TYPE_5,
- /* 6 */ QUAKE_TYPE_6
+ /* 0 */ QUAKE_TYPE_NONE,
+ /* 1 */ QUAKE_TYPE_1, // Periodic, sustaining, random X perturbations
+ /* 2 */ QUAKE_TYPE_2, // Aperiodic, sustaining, random X perturbations
+ /* 3 */ QUAKE_TYPE_3, // Periodic, decaying
+ /* 4 */ QUAKE_TYPE_4, // Aperiodic, decaying, random X perturbations
+ /* 5 */ QUAKE_TYPE_5, // Periodic, sustaining
+ /* 6 */ QUAKE_TYPE_6 // See below
} QuakeType;
-u32 Quake_SetValue(s16 quakeIndex, s16 valueType, s16 value);
-u32 Quake_SetSpeed(s16 quakeIndex, s16 speed);
-u32 Quake_SetCountdown(s16 quakeIndex, s16 countdown);
-s16 Quake_GetCountdown(s16 quakeIndex);
-u32 Quake_SetQuakeValues(s16 quakeIndex, s16 verticalMag, s16 horizontalMag, s16 zoom, s16 rollOffset);
-u32 Quake_SetQuakeValues2(s16 quakeIndex, s16 isShakePerpendicular, Vec3s shakePlaneOffset);
-s16 Quake_Add(Camera* camera, u32 type);
-s16 Quake_Calc(Camera* camera, QuakeCamCalc* camData);
-u32 Quake_Remove(s16 index);
-s32 Quake_NumActiveQuakes(void);
+s16 Quake_Request(Camera* camera, u32 type);
+
+u32 Quake_SetSpeed(s16 index, s16 speed);
+u32 Quake_SetPerturbations(s16 index, s16 y, s16 x, s16 fov, s16 roll);
+u32 Quake_SetDuration(s16 index, s16 duration);
+u32 Quake_SetOrientation(s16 index, s16 isRelativeToScreen, Vec3s orientation);
+
+s16 Quake_GetTimeLeft(s16 index);
+s32 Quake_GetNumActiveQuakes(void);
+u32 Quake_RemoveRequest(s16 index);
+
void Quake_Init(void);
+s16 Quake_Update(Camera* camera, ShakeInfo* camShake);
-#define DISTORTION_TYPE_0 (1 << 0)
-#define DISTORTION_TYPE_NON_ZORA_SWIMMING (1 << 2)
-#define DISTORTION_TYPE_ZORA_SWIMMING (1 << 3)
-#define DISTORTION_TYPE_UNDERWATER_ENTRY (1 << 4)
-#define DISTORTION_TYPE_5 (1 << 5)
-#define DISTORTION_TYPE_6 (1 << 6)
-#define DISTORTION_TYPE_7 (1 << 7)
-#define DISTORTION_TYPE_8 (1 << 8)
-#define DISTORTION_TYPE_9 (1 << 9)
-#define DISTORTION_TYPE_A (1 << 10)
-#define DISTORTION_TYPE_B (1 << 11)
+#define DISTORTION_TYPE_HOT_ROOM (1 << 0) // Hot Room
+#define DISTORTION_TYPE_NON_ZORA_SWIMMING (1 << 2) // Non-Zora swimming
+#define DISTORTION_TYPE_ZORA_SWIMMING (1 << 3) // Zora swimming, also used for boss warp pad part 1
-void Distortion_SetCountdown(s16 countdown);
-s16 Distortion_GetCountdown(void);
+#define DISTORTION_TYPE_UNDERWATER_ENTRY (1 << 4) // Entering water, also used for boss warp pad part 2
+#define DISTORTION_TYPE_SONG_OF_TIME (1 << 5) // Song of Time effects
+#define DISTORTION_TYPE_ZORA_KICK (1 << 6) // PLAYER_MWA_ZORA_PUNCH_KICK
+#define DISTORTION_TYPE_UNK_ATTACK (1 << 7) // Impossible to achieve, inferred to be another `PLAYER_MWA_`,
+
+#define DISTORTION_TYPE_GORON_BUTT (1 << 8) // PLAYER_MWA_GORON_PUNCH_BUTT
+#define DISTORTION_TYPE_MASK_TRANSFORM_1 (1 << 9) // Mask transformation part 1
+#define DISTORTION_TYPE_BOSS_WARP (1 << 10) // Boss warp pad part 3
+#define DISTORTION_TYPE_MASK_TRANSFORM_2 (1 << 11) // Mask transformation part 2
+
+void Distortion_Request(s32 type);
+void Distortion_SetDuration(s16 duration);
+
+s16 Distortion_GetTimeLeft(void);
s16 Distortion_GetType(void);
-void Distortion_SetType(s32 type);
-void Distortion_ClearType(s32 type);
+void Distortion_RemoveRequest(s32 type);
+
void Distortion_Init(PlayState* play);
void Distortion_Update(void);
diff --git a/include/z64save.h b/include/z64save.h
index f6b08bccc..20f7db40e 100644
--- a/include/z64save.h
+++ b/include/z64save.h
@@ -339,7 +339,7 @@ typedef struct SaveContext {
/* 0x3DB8 */ u16 entranceSound; // "player_wipe_door_SE"
/* 0x3DBA */ u8 unk_3DBA; // "player_wipe_item"
/* 0x3DBB */ u8 unk_3DBB; // "next_walk"
- /* 0x3DBC */ s16 dogParams; // "dog_flag"
+ /* 0x3DBC */ s16 dogParams; // OoT leftover. "dog_flag"
/* 0x3DBE */ u8 envHazardTextTriggerFlags; // "guide_status"
/* 0x3DBF */ u8 showTitleCard; // "name_display"
/* 0x3DC0 */ s16 unk_3DC0; // "shield_magic_timer"
@@ -595,7 +595,7 @@ typedef enum {
#define WEEKEVENTREG_08_04 PACK_WEEKEVENTREG_FLAG(8, 0x04)
#define WEEKEVENTREG_08_08 PACK_WEEKEVENTREG_FLAG(8, 0x08)
#define WEEKEVENTREG_08_10 PACK_WEEKEVENTREG_FLAG(8, 0x10)
-#define WEEKEVENTREG_08_20 PACK_WEEKEVENTREG_FLAG(8, 0x20)
+#define WEEKEVENTREG_RECEIVED_DOGGY_RACETRACK_HEART_PIECE PACK_WEEKEVENTREG_FLAG(8, 0x20)
// Related to final hours
#define WEEKEVENTREG_08_40 PACK_WEEKEVENTREG_FLAG(8, 0x40)
@@ -858,7 +858,7 @@ typedef enum {
#define WEEKEVENTREG_34_02 PACK_WEEKEVENTREG_FLAG(34, 0x02)
#define WEEKEVENTREG_34_04 PACK_WEEKEVENTREG_FLAG(34, 0x04)
-#define WEEKEVENTREG_SWAMP_SPIDER_HOUSE_TALKED PACK_WEEKEVENTREG_FLAG(34, 0x08)
+#define WEEKEVENTREG_TALKED_SWAMP_SPIDER_HOUSE_MAN PACK_WEEKEVENTREG_FLAG(34, 0x08)
#define WEEKEVENTREG_34_10 PACK_WEEKEVENTREG_FLAG(34, 0x10)
#define WEEKEVENTREG_34_20 PACK_WEEKEVENTREG_FLAG(34, 0x20)
#define WEEKEVENTREG_RECEIVED_MASK_OF_TRUTH PACK_WEEKEVENTREG_FLAG(34, 0x40)
@@ -925,62 +925,11 @@ typedef enum {
#define WEEKEVENTREG_41_20 PACK_WEEKEVENTREG_FLAG(41, 0x20)
#define WEEKEVENTREG_41_40 PACK_WEEKEVENTREG_FLAG(41, 0x40)
#define WEEKEVENTREG_41_80 PACK_WEEKEVENTREG_FLAG(41, 0x80)
-#define WEEKEVENTREG_42_01 PACK_WEEKEVENTREG_FLAG(42, 0x01)
-#define WEEKEVENTREG_42_02 PACK_WEEKEVENTREG_FLAG(42, 0x02)
-#define WEEKEVENTREG_42_04 PACK_WEEKEVENTREG_FLAG(42, 0x04)
-#define WEEKEVENTREG_42_08 PACK_WEEKEVENTREG_FLAG(42, 0x08)
-#define WEEKEVENTREG_42_10 PACK_WEEKEVENTREG_FLAG(42, 0x10)
-#define WEEKEVENTREG_42_20 PACK_WEEKEVENTREG_FLAG(42, 0x20)
-#define WEEKEVENTREG_42_40 PACK_WEEKEVENTREG_FLAG(42, 0x40)
-#define WEEKEVENTREG_42_80 PACK_WEEKEVENTREG_FLAG(42, 0x80)
-#define WEEKEVENTREG_43_01 PACK_WEEKEVENTREG_FLAG(43, 0x01)
-#define WEEKEVENTREG_43_02 PACK_WEEKEVENTREG_FLAG(43, 0x02)
-#define WEEKEVENTREG_43_04 PACK_WEEKEVENTREG_FLAG(43, 0x04)
-#define WEEKEVENTREG_43_08 PACK_WEEKEVENTREG_FLAG(43, 0x08)
-#define WEEKEVENTREG_43_10 PACK_WEEKEVENTREG_FLAG(43, 0x10)
-#define WEEKEVENTREG_43_20 PACK_WEEKEVENTREG_FLAG(43, 0x20)
-#define WEEKEVENTREG_43_40 PACK_WEEKEVENTREG_FLAG(43, 0x40)
-#define WEEKEVENTREG_43_80 PACK_WEEKEVENTREG_FLAG(43, 0x80)
-#define WEEKEVENTREG_44_01 PACK_WEEKEVENTREG_FLAG(44, 0x01)
-#define WEEKEVENTREG_44_02 PACK_WEEKEVENTREG_FLAG(44, 0x02)
-#define WEEKEVENTREG_44_04 PACK_WEEKEVENTREG_FLAG(44, 0x04)
-#define WEEKEVENTREG_44_08 PACK_WEEKEVENTREG_FLAG(44, 0x08)
-#define WEEKEVENTREG_44_10 PACK_WEEKEVENTREG_FLAG(44, 0x10)
-#define WEEKEVENTREG_44_20 PACK_WEEKEVENTREG_FLAG(44, 0x20)
-#define WEEKEVENTREG_44_40 PACK_WEEKEVENTREG_FLAG(44, 0x40)
-#define WEEKEVENTREG_44_80 PACK_WEEKEVENTREG_FLAG(44, 0x80)
-#define WEEKEVENTREG_45_01 PACK_WEEKEVENTREG_FLAG(45, 0x01)
-#define WEEKEVENTREG_45_02 PACK_WEEKEVENTREG_FLAG(45, 0x02)
-#define WEEKEVENTREG_45_04 PACK_WEEKEVENTREG_FLAG(45, 0x04)
-#define WEEKEVENTREG_45_08 PACK_WEEKEVENTREG_FLAG(45, 0x08)
-#define WEEKEVENTREG_45_10 PACK_WEEKEVENTREG_FLAG(45, 0x10)
-#define WEEKEVENTREG_45_20 PACK_WEEKEVENTREG_FLAG(45, 0x20)
-#define WEEKEVENTREG_45_40 PACK_WEEKEVENTREG_FLAG(45, 0x40)
-#define WEEKEVENTREG_45_80 PACK_WEEKEVENTREG_FLAG(45, 0x80)
-#define WEEKEVENTREG_46_01 PACK_WEEKEVENTREG_FLAG(46, 0x01)
-#define WEEKEVENTREG_46_02 PACK_WEEKEVENTREG_FLAG(46, 0x02)
-#define WEEKEVENTREG_46_04 PACK_WEEKEVENTREG_FLAG(46, 0x04)
-#define WEEKEVENTREG_46_08 PACK_WEEKEVENTREG_FLAG(46, 0x08)
-#define WEEKEVENTREG_46_10 PACK_WEEKEVENTREG_FLAG(46, 0x10)
-#define WEEKEVENTREG_46_20 PACK_WEEKEVENTREG_FLAG(46, 0x20)
-#define WEEKEVENTREG_46_40 PACK_WEEKEVENTREG_FLAG(46, 0x40)
-#define WEEKEVENTREG_46_80 PACK_WEEKEVENTREG_FLAG(46, 0x80)
-#define WEEKEVENTREG_47_01 PACK_WEEKEVENTREG_FLAG(47, 0x01)
-#define WEEKEVENTREG_47_02 PACK_WEEKEVENTREG_FLAG(47, 0x02)
-#define WEEKEVENTREG_47_04 PACK_WEEKEVENTREG_FLAG(47, 0x04)
-#define WEEKEVENTREG_47_08 PACK_WEEKEVENTREG_FLAG(47, 0x08)
-#define WEEKEVENTREG_47_10 PACK_WEEKEVENTREG_FLAG(47, 0x10)
-#define WEEKEVENTREG_47_20 PACK_WEEKEVENTREG_FLAG(47, 0x20)
-#define WEEKEVENTREG_47_40 PACK_WEEKEVENTREG_FLAG(47, 0x40)
-#define WEEKEVENTREG_47_80 PACK_WEEKEVENTREG_FLAG(47, 0x80)
-#define WEEKEVENTREG_48_01 PACK_WEEKEVENTREG_FLAG(48, 0x01)
-#define WEEKEVENTREG_48_02 PACK_WEEKEVENTREG_FLAG(48, 0x02)
-#define WEEKEVENTREG_48_04 PACK_WEEKEVENTREG_FLAG(48, 0x04)
-#define WEEKEVENTREG_48_08 PACK_WEEKEVENTREG_FLAG(48, 0x08)
-#define WEEKEVENTREG_48_10 PACK_WEEKEVENTREG_FLAG(48, 0x10)
-#define WEEKEVENTREG_48_20 PACK_WEEKEVENTREG_FLAG(48, 0x20)
-#define WEEKEVENTREG_48_40 PACK_WEEKEVENTREG_FLAG(48, 0x40)
-#define WEEKEVENTREG_48_80 PACK_WEEKEVENTREG_FLAG(48, 0x80)
+
+// Used for storing the text ID offsets for the dogs in the Doggy Racetrack (56 entries)
+// The number of weekEventRegs used needs to be kept in sync with RACEDOG_COUNT in z_en_aob_01.h
+// PACK_WEEKEVENTREG_FLAG(42, 0x01) to PACK_WEEKEVENTREG_FLAG(48, 0x80)
+
#define WEEKEVENTREG_49_01 PACK_WEEKEVENTREG_FLAG(49, 0x01)
#define WEEKEVENTREG_49_02 PACK_WEEKEVENTREG_FLAG(49, 0x02)
#define WEEKEVENTREG_49_04 PACK_WEEKEVENTREG_FLAG(49, 0x04)
@@ -1014,10 +963,7 @@ typedef enum {
#define WEEKEVENTREG_52_04 PACK_WEEKEVENTREG_FLAG(52, 0x04)
#define WEEKEVENTREG_52_08 PACK_WEEKEVENTREG_FLAG(52, 0x08)
#define WEEKEVENTREG_52_10 PACK_WEEKEVENTREG_FLAG(52, 0x10)
-
-// cleared Stone Tower Temple
#define WEEKEVENTREG_CLEARED_STONE_TOWER_TEMPLE PACK_WEEKEVENTREG_FLAG(52, 0x20)
-
#define WEEKEVENTREG_52_40 PACK_WEEKEVENTREG_FLAG(52, 0x40)
#define WEEKEVENTREG_52_80 PACK_WEEKEVENTREG_FLAG(52, 0x80)
#define WEEKEVENTREG_53_01 PACK_WEEKEVENTREG_FLAG(53, 0x01)
@@ -1131,12 +1077,12 @@ typedef enum {
#define WEEKEVENTREG_64_10 PACK_WEEKEVENTREG_FLAG(64, 0x10)
#define WEEKEVENTREG_64_20 PACK_WEEKEVENTREG_FLAG(64, 0x20)
#define WEEKEVENTREG_64_40 PACK_WEEKEVENTREG_FLAG(64, 0x40)
-#define WEEKEVENTREG_64_80 PACK_WEEKEVENTREG_FLAG(64, 0x80)
-#define WEEKEVENTREG_65_01 PACK_WEEKEVENTREG_FLAG(65, 0x01)
-#define WEEKEVENTREG_65_02 PACK_WEEKEVENTREG_FLAG(65, 0x02)
-#define WEEKEVENTREG_65_04 PACK_WEEKEVENTREG_FLAG(65, 0x04)
-#define WEEKEVENTREG_65_08 PACK_WEEKEVENTREG_FLAG(65, 0x08)
-#define WEEKEVENTREG_65_10 PACK_WEEKEVENTREG_FLAG(65, 0x10)
+#define WEEKEVENTREG_TALKED_DOGGY_RACETRACK_OWNER_DAY_1 PACK_WEEKEVENTREG_FLAG(64, 0x80)
+#define WEEKEVENTREG_TALKED_DOGGY_RACETRACK_OWNER_NIGHT_1 PACK_WEEKEVENTREG_FLAG(65, 0x01)
+#define WEEKEVENTREG_TALKED_DOGGY_RACETRACK_OWNER_DAY_2 PACK_WEEKEVENTREG_FLAG(65, 0x02)
+#define WEEKEVENTREG_TALKED_DOGGY_RACETRACK_OWNER_NIGHT_2 PACK_WEEKEVENTREG_FLAG(65, 0x04)
+#define WEEKEVENTREG_TALKED_DOGGY_RACETRACK_OWNER_DAY_3 PACK_WEEKEVENTREG_FLAG(65, 0x08)
+#define WEEKEVENTREG_TALKED_DOGGY_RACETRACK_OWNER_NIGHT_3 PACK_WEEKEVENTREG_FLAG(65, 0x10)
#define WEEKEVENTREG_65_20 PACK_WEEKEVENTREG_FLAG(65, 0x20)
#define WEEKEVENTREG_65_40 PACK_WEEKEVENTREG_FLAG(65, 0x40)
#define WEEKEVENTREG_65_80 PACK_WEEKEVENTREG_FLAG(65, 0x80)
@@ -1386,10 +1332,8 @@ typedef enum {
#define WEEKEVENTREG_91_40 PACK_WEEKEVENTREG_FLAG(91, 0x40)
#define WEEKEVENTREG_91_80 PACK_WEEKEVENTREG_FLAG(91, 0x80)
-// RACE_FLAGS
-//#define WEEKEVENTREG_92_01 PACK_WEEKEVENTREG_FLAG(92, 0x01)
-//#define WEEKEVENTREG_92_02 PACK_WEEKEVENTREG_FLAG(92, 0x02)
-//#define WEEKEVENTREG_92_04 PACK_WEEKEVENTREG_FLAG(92, 0x04)
+// HORSE_RACE_STATE (3 entries)
+// WEEKEVENTREG_92_01 to WEEKEVENTREG_92_04
#define WEEKEVENTREG_92_08 PACK_WEEKEVENTREG_FLAG(92, 0x08)
#define WEEKEVENTREG_92_10 PACK_WEEKEVENTREG_FLAG(92, 0x10)
@@ -1461,34 +1405,52 @@ typedef enum {
#define SET_WEEKEVENTREG(flag) (WEEKEVENTREG((flag) >> 8) = GET_WEEKEVENTREG((flag) >> 8) | ((flag) & 0xFF))
#define CLEAR_WEEKEVENTREG(flag) (WEEKEVENTREG((flag) >> 8) = GET_WEEKEVENTREG((flag) >> 8) & (u8)~((flag) & 0xFF))
-#define WEEKEVENTREG_RACE_FLAG_END 0
-#define WEEKEVENTREG_RACE_FLAG_START 1
-#define WEEKEVENTREG_RACE_FLAG_2 2
-#define WEEKEVENTREG_RACE_FLAG_3 3
-#define WEEKEVENTREG_RACE_FLAG_4 4
-#define WEEKEVENTREG_RACE_FLAGS 7
+typedef enum {
+ /* 0 */ WEEKEVENTREG_HORSE_RACE_STATE_END,
+ /* 1 */ WEEKEVENTREG_HORSE_RACE_STATE_START,
+ /* 2 */ WEEKEVENTREG_HORSE_RACE_STATE_2,
+ /* 3 */ WEEKEVENTREG_HORSE_RACE_STATE_3,
+ /* 4 */ WEEKEVENTREG_HORSE_RACE_STATE_4,
+ /* 7 */ WEEKEVENTREG_HORSE_RACE_STATE_MAX = 7
+} WeekEventRegHorseRaceState;
-#define GET_WEEKEVENTREG_RACE_FLAGS (WEEKEVENTREG(92) & WEEKEVENTREG_RACE_FLAGS)
+#define GET_WEEKEVENTREG_HORSE_RACE_STATE (WEEKEVENTREG(92) & WEEKEVENTREG_HORSE_RACE_STATE_MAX)
-#define SET_WEEKEVENTREG_RACE_FLAGS(flag) \
- { \
- WEEKEVENTREG(92) &= (u8)~WEEKEVENTREG_RACE_FLAGS; \
- WEEKEVENTREG(92) = WEEKEVENTREG(92) | (u8)((WEEKEVENTREG(92) & ~WEEKEVENTREG_RACE_FLAGS) | (flag)); \
- } \
+#define SET_WEEKEVENTREG_HORSE_RACE_STATE(state) \
+ { \
+ WEEKEVENTREG(92) &= (u8)~WEEKEVENTREG_HORSE_RACE_STATE_MAX; \
+ WEEKEVENTREG(92) = WEEKEVENTREG(92) | (u8)((WEEKEVENTREG(92) & ~WEEKEVENTREG_HORSE_RACE_STATE_MAX) | (state)); \
+ } \
(void)0
+#define GET_WEEKEVENTREG_DOG_RACE_TEXT(index, baseTextId) \
+ (index % 2) ? (baseTextId + (((WEEKEVENTREG(42 + (index / 2))) & 0xF0) >> 4)) \
+ : (baseTextId + ((WEEKEVENTREG(42 + (index / 2))) & 0x0F));
+
+#define SET_WEEKEVENTREG_DOG_RACE_TEXT_OFFSETS(index, packedOffsets) \
+ { \
+ WEEKEVENTREG(42 + index) = ((void)0, WEEKEVENTREG(42 + index)) | packedOffsets; \
+ }
+
+#define CLEAR_WEEKEVENTREG_DOG_RACE_TEXT_OFFSETS(index) \
+ { \
+ WEEKEVENTREG(42 + index) = 0; \
+ }
+
/**
* gSaveContext.eventInf
*/
-#define EVENTINF_00 0x00
-#define EVENTINF_01 0x01
-#define EVENTINF_02 0x02
-#define EVENTINF_03 0x03
-#define EVENTINF_04 0x04
-#define EVENTINF_05 0x05
-#define EVENTINF_06 0x06
-#define EVENTINF_07 0x07
+// gSaveContext.eventInf[0] is used to dog race information
+// #define EVENTINF_00 0x00
+// #define EVENTINF_01 0x01
+// #define EVENTINF_02 0x02
+// #define EVENTINF_03 0x03
+// #define EVENTINF_04 0x04
+// #define EVENTINF_05 0x05
+// #define EVENTINF_06 0x06
+// #define EVENTINF_07 0x07
+
#define EVENTINF_10 0x10
#define EVENTINF_11 0x11
#define EVENTINF_12 0x12
@@ -1562,6 +1524,25 @@ typedef enum {
#define CLEAR_EVENTINF(flag) (gSaveContext.eventInf[(flag) >> 4] &= (u8)~(1 << ((flag) & 0xF)))
#define CLEAR_EVENTINF_ALT(flag) (gSaveContext.eventInf[(flag) >> 4] &= ~(1 << ((flag) & 0xF)))
+typedef enum {
+ /* 0 */ EVENTINF_DOG_RACE_STATE_NOT_STARTED,
+ /* 2 */ EVENTINF_DOG_RACE_STATE_STARTED = 2,
+ /* 3 */ EVENTINF_DOG_RACE_STATE_ENDED,
+ /* 7 */ EVENTINF_DOG_RACE_STATE_MAX = 7
+} EventInfDogRaceState;
+
+#define GET_EVENTINF_DOG_RACE_STATE (gSaveContext.eventInf[0] & EVENTINF_DOG_RACE_STATE_MAX)
+#define SET_EVENTINF_DOG_RACE_STATE(state) \
+ (gSaveContext.eventInf[0] = ((gSaveContext.eventInf[0] & (u8)~EVENTINF_DOG_RACE_STATE_MAX) | (state)))
+
+#define GET_EVENTINF_DOG_RACE_SELECTED_DOG_INDEX ((gSaveContext.eventInf[0] & (u8)~EVENTINF_DOG_RACE_STATE_MAX) >> 3)
+#define SET_EVENTINF_DOG_RACE_SELECTED_DOG_INDEX(selectedDogIndex) \
+ (gSaveContext.eventInf[0] = (gSaveContext.eventInf[0] & EVENTINF_DOG_RACE_STATE_MAX) | (selectedDogIndex << 3))
+
+// This is exactly the same as the selected dog index; they never need both of them at the same time.
+#define GET_EVENTINF_DOG_RACE_RACE_STANDING ((gSaveContext.eventInf[0] & (u8)~EVENTINF_DOG_RACE_STATE_MAX) >> 3)
+#define SET_EVENTINF_DOG_RACE_RACE_STANDING(raceStanding) \
+ (gSaveContext.eventInf[0] = (gSaveContext.eventInf[0] & EVENTINF_DOG_RACE_STATE_MAX) | (raceStanding << 3))
typedef enum {
/* 0 */ DUNGEON_INDEX_WOODFALL_TEMPLE,
diff --git a/spec b/spec
index 358a061ab..9bfbc750c 100644
--- a/spec
+++ b/spec
@@ -36,7 +36,7 @@ beginseg
include "build/data/boot/gfxprint.data.o"
include "build/src/boot_O2/mtxuty-cvt.o"
include "build/src/boot_O2/assert.o"
- include "build/src/boot_O2/boot_800862E0.o"
+ include "build/src/boot_O2/system_heap.o"
include "build/src/boot_O2/padsetup.o"
include "build/src/boot_O2/boot_80086760.o"
include "build/asm/boot/fp.text.o"
@@ -567,7 +567,6 @@ beginseg
include "build/data/code/main.data.o"
include "build/data/code/main.bss.o"
include "build/src/code/padmgr.o"
- include "build/data/code/padmgr.data.o"
include "build/src/code/sched.o"
include "build/src/code/speed_meter.o"
include "build/data/code/speed_meter.data.o"
@@ -701,9 +700,7 @@ beginseg
name "ovl_player_actor"
compress
include "build/src/overlays/actors/ovl_player_actor/z_player.o"
- include "build/data/ovl_player_actor/ovl_player_actor.data.o"
- include "build/data/ovl_player_actor/ovl_player_actor.bss.o"
- include "build/data/ovl_player_actor/ovl_player_actor.reloc.o"
+ include "build/src/overlays/actors/ovl_player_actor/ovl_player_actor_reloc.o"
endseg
beginseg
@@ -998,8 +995,7 @@ beginseg
name "ovl_Item_B_Heart"
compress
include "build/src/overlays/actors/ovl_Item_B_Heart/z_item_b_heart.o"
- include "build/data/ovl_Item_B_Heart/ovl_Item_B_Heart.data.o"
- include "build/data/ovl_Item_B_Heart/ovl_Item_B_Heart.reloc.o"
+ include "build/src/overlays/actors/ovl_Item_B_Heart/ovl_Item_B_Heart_reloc.o"
endseg
beginseg
@@ -3195,8 +3191,7 @@ beginseg
name "ovl_fbdemo_wipe1"
compress
include "build/src/overlays/fbdemos/ovl_fbdemo_wipe1/z_fbdemo_wipe1.o"
- include "build/data/ovl_fbdemo_wipe1/ovl_fbdemo_wipe1.data.o"
- include "build/data/ovl_fbdemo_wipe1/ovl_fbdemo_wipe1.reloc.o"
+ include "build/src/overlays/fbdemos/ovl_fbdemo_wipe1/ovl_fbdemo_wipe1_reloc.o"
endseg
beginseg
@@ -3591,8 +3586,7 @@ beginseg
name "ovl_Bg_Tobira01"
compress
include "build/src/overlays/actors/ovl_Bg_Tobira01/z_bg_tobira01.o"
- include "build/data/ovl_Bg_Tobira01/ovl_Bg_Tobira01.data.o"
- include "build/data/ovl_Bg_Tobira01/ovl_Bg_Tobira01.reloc.o"
+ include "build/src/overlays/actors/ovl_Bg_Tobira01/ovl_Bg_Tobira01_reloc.o"
endseg
beginseg
@@ -4884,8 +4878,7 @@ beginseg
name "ovl_En_And"
compress
include "build/src/overlays/actors/ovl_En_And/z_en_and.o"
- include "build/data/ovl_En_And/ovl_En_And.data.o"
- include "build/data/ovl_En_And/ovl_En_And.reloc.o"
+ include "build/src/overlays/actors/ovl_En_And/ovl_En_And_reloc.o"
endseg
beginseg
diff --git a/src/audio/code_8019AF00.c b/src/audio/code_8019AF00.c
index d107e65b7..287149c91 100644
--- a/src/audio/code_8019AF00.c
+++ b/src/audio/code_8019AF00.c
@@ -2058,11 +2058,11 @@ const char sAudioOcarinaUnusedText6[] = "last key step is too short !!! %d:%d %d
const char sAudioOcarinaUnusedText7[] = "check is over!!! %d %d %d\n";
void AudioOcarina_ReadControllerInput(void) {
- Input inputs[4];
+ Input inputs[MAXCONTROLLERS];
Input* input = &inputs[0];
u32 ocarinaInputButtonPrev = sOcarinaInputButtonCur;
- Padmgr_GetInput2(inputs, 0);
+ PadMgr_GetInput2(inputs, false);
sOcarinaInputButtonCur = input->cur.button;
sOcarinaInputButtonPrev = ocarinaInputButtonPrev;
sOcarinaInputStickRel.x = input->rel.stick_x;
diff --git a/src/boot_O2/boot_800862E0.c b/src/boot_O2/system_heap.c
similarity index 66%
rename from src/boot_O2/boot_800862E0.c
rename to src/boot_O2/system_heap.c
index 5774af9da..66e53dc12 100644
--- a/src/boot_O2/boot_800862E0.c
+++ b/src/boot_O2/system_heap.c
@@ -1,3 +1,10 @@
+/**
+ * @file system_heap.c
+ *
+ * @note:
+ * Only SystemHeap_Init() is used, and is essentially just a wrapper for SystemArena_Init().
+ *
+ */
#include "global.h"
#include "system_malloc.h"
@@ -6,20 +13,20 @@ typedef void (*BlockFunc1)(void*, u32);
typedef void (*BlockFunc8)(void*, u32, u32, u32, u32, u32, u32, u32, u32);
typedef struct InitFunc {
- uintptr_t nextOffset;
- void (*func)(void);
-} InitFunc;
+ /* 0x0 */ uintptr_t nextOffset;
+ /* 0x4 */ void (*func)(void);
+} InitFunc; // size = 0x8
void* sInitFuncs = NULL;
-char sNew[] = { 0x00, 0x00, 0x00, 0x00 };
+char sNew[] = "";
-char D_80097508[] = {
+UNK_TYPE1 D_80097508[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x00,
0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00,
};
-void* SystemArena_MallocMin1(size_t size) {
+void* SystemHeap_Malloc(size_t size) {
if (size == 0) {
size = 1;
}
@@ -27,13 +34,13 @@ void* SystemArena_MallocMin1(size_t size) {
return __osMalloc(&gSystemArena, size);
}
-void SystemArena_FreeNullCheck(void* ptr) {
+void SystemHeap_Free(void* ptr) {
if (ptr != NULL) {
__osFree(&gSystemArena, ptr);
}
}
-void SystemArena_RunBlockFunc(void* blk, size_t nBlk, size_t blkSize, BlockFunc blockFunc) {
+void SystemHeap_RunBlockFunc(void* blk, size_t nBlk, size_t blkSize, BlockFunc blockFunc) {
uintptr_t pos = blk;
for (; pos < (uintptr_t)blk + (nBlk * blkSize); pos += (blkSize & ~0)) {
@@ -41,7 +48,7 @@ void SystemArena_RunBlockFunc(void* blk, size_t nBlk, size_t blkSize, BlockFunc
}
}
-void SystemArena_RunBlockFunc1(void* blk, size_t nBlk, size_t blkSize, BlockFunc1 blockFunc) {
+void SystemHeap_RunBlockFunc1(void* blk, size_t nBlk, size_t blkSize, BlockFunc1 blockFunc) {
uintptr_t pos = blk;
for (; pos < (uintptr_t)blk + (nBlk * blkSize); pos += (blkSize & ~0)) {
@@ -49,9 +56,9 @@ void SystemArena_RunBlockFunc1(void* blk, size_t nBlk, size_t blkSize, BlockFunc
}
}
-void* SystemArena_RunBlockFunc8(void* blk, size_t nBlk, size_t blkSize, BlockFunc8 blockFunc) {
+void* SystemHeap_RunBlockFunc8(void* blk, size_t nBlk, size_t blkSize, BlockFunc8 blockFunc) {
if (blk == NULL) {
- blk = SystemArena_MallocMin1(nBlk * blkSize);
+ blk = SystemHeap_Malloc(nBlk * blkSize);
}
if (blk != NULL && blockFunc != NULL) {
@@ -65,7 +72,7 @@ void* SystemArena_RunBlockFunc8(void* blk, size_t nBlk, size_t blkSize, BlockFun
return blk;
}
-void SystemArena_RunBlockFunc1Reverse(void* blk, size_t nBlk, size_t blkSize, BlockFunc1 blockFunc, s32 shouldFree) {
+void SystemHeap_RunBlockFunc1Reverse(void* blk, size_t nBlk, size_t blkSize, BlockFunc1 blockFunc, s32 shouldFree) {
uintptr_t pos;
uintptr_t start;
size_t maskedBlkSize;
@@ -86,11 +93,11 @@ void SystemArena_RunBlockFunc1Reverse(void* blk, size_t nBlk, size_t blkSize, Bl
}
if (shouldFree) {
- SystemArena_FreeNullCheck(blk);
+ SystemHeap_Free(blk);
}
}
-void SystemArena_RunInits(void) {
+void SystemHeap_RunInits(void) {
InitFunc* initFunc = (InitFunc*)&sInitFuncs;
u32 nextOffset = initFunc->nextOffset;
InitFunc* prev = NULL;
@@ -110,7 +117,7 @@ void SystemArena_RunInits(void) {
sInitFuncs = prev;
}
-void SystemArena_Init(void* start, size_t size) {
- SystemArena_InitArena(start, size);
- SystemArena_RunInits();
+void SystemHeap_Init(void* start, size_t size) {
+ SystemArena_Init(start, size);
+ SystemHeap_RunInits();
}
diff --git a/src/boot_O2/system_malloc.c b/src/boot_O2/system_malloc.c
index 56608166c..cea017b38 100644
--- a/src/boot_O2/system_malloc.c
+++ b/src/boot_O2/system_malloc.c
@@ -38,7 +38,7 @@ u32 SystemArena_CheckArena(void) {
return __osCheckArena(&gSystemArena);
}
-void SystemArena_InitArena(void* start, size_t size) {
+void SystemArena_Init(void* start, size_t size) {
__osMallocInit(&gSystemArena, start, size);
}
diff --git a/src/boot_O2_g3/fault.c b/src/boot_O2_g3/fault.c
index 2c8f4a667..6e1656170 100644
--- a/src/boot_O2_g3/fault.c
+++ b/src/boot_O2_g3/fault.c
@@ -204,7 +204,7 @@ void Fault_Sleep(u32 duration) {
}
void Fault_PadCallback(Input* input) {
- Padmgr_GetInput2(input, 0);
+ PadMgr_GetInput2(input, false);
}
void Fault_UpdatePadImpl() {
@@ -474,7 +474,7 @@ void Fault_WaitForButtonCombo(void) {
do {
Fault_Sleep(0x10);
Fault_UpdatePadImpl();
- } while (!CHECK_BTN_ALL(input->press.button, 0x80));
+ } while (!CHECK_BTN_ALL(input->press.button, BTN_RESET));
} while (!CHECK_BTN_ALL(input->cur.button, BTN_DLEFT | BTN_L | BTN_R | BTN_CRIGHT));
}
@@ -763,7 +763,7 @@ void Fault_SetOptionsFromController3(void) {
u32 graphRA;
u32 graphSP;
- if (CHECK_BTN_ALL(input3->press.button, 0x80)) {
+ if (CHECK_BTN_ALL(input3->press.button, BTN_RESET)) {
faultCustomOptions = !faultCustomOptions;
}
diff --git a/src/boot_O2_g3/z_std_dma.c b/src/boot_O2_g3/z_std_dma.c
index bbf8e4bed..00d894f74 100644
--- a/src/boot_O2_g3/z_std_dma.c
+++ b/src/boot_O2_g3/z_std_dma.c
@@ -1,3 +1,4 @@
+#include "prevent_bss_reordering.h"
#include "global.h"
#include "stack.h"
#include "stackcheck.h"
diff --git a/src/code/cutscene_camera.c b/src/code/cutscene_camera.c
index d5f028b94..d92d119dd 100644
--- a/src/code/cutscene_camera.c
+++ b/src/code/cutscene_camera.c
@@ -119,23 +119,23 @@ u8 CutsceneCamera_ProcessSpline(CutsceneCamera* csCamera) {
switch (csCamera->atCmd[csCamera->eyeInterp.curPoint].relativeTo) {
case CS_CAM_REL_2:
- OLib_DbCameraVec3fDiff(&player->actor.world, &csCamera->camera->at, &csCamera->camera->at, 2);
+ OLib_Vec3fDiff(&player->actor.world, &csCamera->camera->at, &csCamera->camera->at, OLIB_DIFF);
break;
case CS_CAM_REL_3:
- OLib_DbCameraVec3fDiff(&player->actor.world, &csCamera->camera->at, &csCamera->camera->at, 1);
+ OLib_Vec3fDiff(&player->actor.world, &csCamera->camera->at, &csCamera->camera->at, OLIB_DIFF_OFFSET);
break;
case CS_CAM_REL_1:
- OLib_DbCameraVec3fDiff(&player->actor.world, &csCamera->camera->at, &csCamera->camera->at, 1);
+ OLib_Vec3fDiff(&player->actor.world, &csCamera->camera->at, &csCamera->camera->at, OLIB_DIFF_OFFSET);
break;
case CS_CAM_REL_4:
- OLib_DbCameraVec3fDiff(&target->world, &csCamera->camera->at, &csCamera->camera->at, 1);
+ OLib_Vec3fDiff(&target->world, &csCamera->camera->at, &csCamera->camera->at, OLIB_DIFF_OFFSET);
break;
case CS_CAM_REL_5:
- OLib_DbCameraVec3fDiff(&target->world, &csCamera->camera->at, &csCamera->camera->at, 2);
+ OLib_Vec3fDiff(&target->world, &csCamera->camera->at, &csCamera->camera->at, OLIB_DIFF);
break;
default: // CS_CAM_REL_0
@@ -147,24 +147,24 @@ u8 CutsceneCamera_ProcessSpline(CutsceneCamera* csCamera) {
switch (csCamera->atCmd[csCamera->eyeInterp.curPoint].relativeTo) {
case CS_CAM_REL_2:
- OLib_DbCameraVec3fSum(&player->actor.world, &csCamera->camera->at, &csCamera->camera->at, 2);
+ OLib_Vec3fAdd(&player->actor.world, &csCamera->camera->at, &csCamera->camera->at, OLIB_ADD);
break;
case CS_CAM_REL_3:
- OLib_DbCameraVec3fSum(&player->actor.world, &csCamera->camera->at, &csCamera->camera->at, 1);
+ OLib_Vec3fAdd(&player->actor.world, &csCamera->camera->at, &csCamera->camera->at, OLIB_ADD_OFFSET);
csCamera->camera->at.y += func_80163660(&player->actor);
break;
case CS_CAM_REL_1:
- OLib_DbCameraVec3fSum(&player->actor.world, &csCamera->camera->at, &csCamera->camera->at, 1);
+ OLib_Vec3fAdd(&player->actor.world, &csCamera->camera->at, &csCamera->camera->at, OLIB_ADD_OFFSET);
break;
case CS_CAM_REL_4:
- OLib_DbCameraVec3fSum(&target->world, &csCamera->camera->at, &csCamera->camera->at, 1);
+ OLib_Vec3fAdd(&target->world, &csCamera->camera->at, &csCamera->camera->at, OLIB_ADD_OFFSET);
break;
case CS_CAM_REL_5:
- OLib_DbCameraVec3fSum(&target->world, &csCamera->camera->at, &csCamera->camera->at, 2);
+ OLib_Vec3fAdd(&target->world, &csCamera->camera->at, &csCamera->camera->at, OLIB_ADD);
break;
default: // CS_CAM_REL_0
@@ -189,23 +189,23 @@ u8 CutsceneCamera_ProcessSpline(CutsceneCamera* csCamera) {
switch (csCamera->eyeCmd[csCamera->atInterp.curPoint].relativeTo) {
case CS_CAM_REL_2:
- OLib_DbCameraVec3fDiff(&player->actor.world, &csCamera->camera->eye, &csCamera->camera->eye, 2);
+ OLib_Vec3fDiff(&player->actor.world, &csCamera->camera->eye, &csCamera->camera->eye, OLIB_DIFF);
break;
case CS_CAM_REL_3:
- OLib_DbCameraVec3fDiff(&player->actor.world, &csCamera->camera->eye, &csCamera->camera->eye, 1);
+ OLib_Vec3fDiff(&player->actor.world, &csCamera->camera->eye, &csCamera->camera->eye, OLIB_DIFF_OFFSET);
break;
case CS_CAM_REL_1:
- OLib_DbCameraVec3fDiff(&player->actor.world, &csCamera->camera->eye, &csCamera->camera->eye, 1);
+ OLib_Vec3fDiff(&player->actor.world, &csCamera->camera->eye, &csCamera->camera->eye, OLIB_DIFF_OFFSET);
break;
case CS_CAM_REL_4:
- OLib_DbCameraVec3fDiff(&target->world, &csCamera->camera->eye, &csCamera->camera->eye, 1);
+ OLib_Vec3fDiff(&target->world, &csCamera->camera->eye, &csCamera->camera->eye, OLIB_DIFF_OFFSET);
break;
case CS_CAM_REL_5:
- OLib_DbCameraVec3fDiff(&target->world, &csCamera->camera->eye, &csCamera->camera->eye, 2);
+ OLib_Vec3fDiff(&target->world, &csCamera->camera->eye, &csCamera->camera->eye, OLIB_DIFF);
break;
default: // CS_CAM_REL_0
@@ -217,24 +217,24 @@ u8 CutsceneCamera_ProcessSpline(CutsceneCamera* csCamera) {
switch (csCamera->eyeCmd[csCamera->atInterp.curPoint].relativeTo) {
case CS_CAM_REL_2:
- OLib_DbCameraVec3fSum(&player->actor.world, &csCamera->camera->eye, &csCamera->camera->eye, 2);
+ OLib_Vec3fAdd(&player->actor.world, &csCamera->camera->eye, &csCamera->camera->eye, OLIB_ADD);
break;
case CS_CAM_REL_3:
- OLib_DbCameraVec3fSum(&player->actor.world, &csCamera->camera->eye, &csCamera->camera->eye, 1);
+ OLib_Vec3fAdd(&player->actor.world, &csCamera->camera->eye, &csCamera->camera->eye, OLIB_ADD_OFFSET);
csCamera->camera->eye.y += func_80163660(&player->actor);
break;
case CS_CAM_REL_1:
- OLib_DbCameraVec3fSum(&player->actor.world, &csCamera->camera->eye, &csCamera->camera->eye, 1);
+ OLib_Vec3fAdd(&player->actor.world, &csCamera->camera->eye, &csCamera->camera->eye, OLIB_ADD_OFFSET);
break;
case CS_CAM_REL_4:
- OLib_DbCameraVec3fSum(&target->world, &csCamera->camera->eye, &csCamera->camera->eye, 1);
+ OLib_Vec3fAdd(&target->world, &csCamera->camera->eye, &csCamera->camera->eye, OLIB_ADD_OFFSET);
break;
case CS_CAM_REL_5:
- OLib_DbCameraVec3fSum(&target->world, &csCamera->camera->eye, &csCamera->camera->eye, 2);
+ OLib_Vec3fAdd(&target->world, &csCamera->camera->eye, &csCamera->camera->eye, OLIB_ADD);
break;
default: // CS_CAM_REL_0
diff --git a/src/code/game.c b/src/code/game.c
index 3ff4f9962..bc8b9e39f 100644
--- a/src/code/game.c
+++ b/src/code/game.c
@@ -128,7 +128,7 @@ void func_801736DC(GraphicsContext* gfxCtx) {
}
void Game_UpdateInput(GameState* gameState) {
- Padmgr_GetInput(gameState->input, 1);
+ PadMgr_GetInput(gameState->input, true);
}
void Game_Update(GameState* gameState) {
diff --git a/src/code/main.c b/src/code/main.c
index 7fbb5ba39..186240489 100644
--- a/src/code/main.c
+++ b/src/code/main.c
@@ -8,6 +8,7 @@
#include "buffers.h"
#include "stack.h"
#include "stackcheck.h"
+#include "system_heap.h"
extern OSMesgQueue sSiIntMsgQ;
extern OSMesg sSiIntMsgBuf[1];
@@ -26,7 +27,6 @@ extern StackEntry sSchedStackInfo;
extern StackEntry sAudioStackInfo;
extern StackEntry sPadMgrStackInfo;
extern AudioMgr sAudioMgr;
-extern PadMgr gPadMgr;
void Main(void* arg) {
intptr_t fb;
@@ -45,7 +45,7 @@ void Main(void* arg) {
sysHeap = gSystemHeap;
fb = 0x80780000;
startHeapSize = fb - sysHeap;
- SystemArena_Init(sysHeap, startHeapSize);
+ SystemHeap_Init(sysHeap, startHeapSize);
Regs_Init();
diff --git a/src/code/padmgr.c b/src/code/padmgr.c
index 077ef1b2b..a04a14f57 100644
--- a/src/code/padmgr.c
+++ b/src/code/padmgr.c
@@ -1,58 +1,797 @@
+/**
+ * @file padmgr.c
+ *
+ * This file implements communicating with joybus devices at a high level and serving the results to other threads.
+ *
+ * Any device that can be plugged into one of the four controller ports such as a standard N64 controller is a joybus
+ * device. Some joybus devices are also located inside the cartridge such as EEPROM for save data or the Real-Time
+ * Clock, however neither of these are used in Zelda64 and so this type of communication is unimplemented. Unlike the
+ * padmgr implementation in OoT, there are three controller types supported:
+ * - Standard N64 Controller
+ * - N64 Mouse
+ * - Voice Recognition Unit
+ *
+ * Communicating with these devices is broken down into various layers:
+ *
+ * Other threads : The rest of the program that will use the polled data
+ * |
+ * PadMgr : Manages devices, submits polling commands at vertical retrace
+ * |
+ * Libultra osCont* routines : Interface for building commands and safely using the Serial Interface
+ * |
+ * Serial Interface : Hardware unit for sending joybus commands and receiving data via DMA
+ * |
+ * PIF : Forwards joybus commands and receives response data from the devices
+ * |---¬---¬---¬-------¬
+ * 1 2 3 4 5 : The joybus devices plugged into the four controller ports or on the cartridge
+ *
+ * Joybus communication is handled on another thread as polling and receiving controller data is a slow process; the
+ * N64 programming manual section 26.2.4.1 quotes 2 milliseconds as the expected delay from calling
+ * `osContStartReadData` to receiving the data. By running this on a separate thread to the game state, work can be
+ * done while waiting for this operation to complete.
+ */
#include "global.h"
+#include "io/controller.h"
#include "ultra64/motor.h"
-#pragma GLOBAL_ASM("asm/non_matchings/code/padmgr/Padmgr_GetControllerBitmask.s")
+#define PADMGR_RETRACE_MSG (1 << 0)
+#define PADMGR_PRE_NMI_MSG (1 << 1)
+#define PADMGR_NMI_MSG (1 << 2)
-#pragma GLOBAL_ASM("asm/non_matchings/code/padmgr/func_80174F24.s")
+typedef enum {
+ /* 0 */ VOICE_INIT_FAILED, // voice initialization failed
+ /* 1 */ VOICE_INIT_TRY, // try to initialize voice
+ /* 2 */ VOICE_INIT_SUCCESS // voice initialized
+} VoiceInitStatus;
-#pragma GLOBAL_ASM("asm/non_matchings/code/padmgr/func_80174F44.s")
+PadMgr* sPadMgrInstance = &gPadMgr;
-#pragma GLOBAL_ASM("asm/non_matchings/code/padmgr/func_80174F7C.s")
+s32 sPadMgrRetraceCount = 0;
-#pragma GLOBAL_ASM("asm/non_matchings/code/padmgr/func_80174F9C.s")
+s32 sVoiceInitStatus = VOICE_INIT_TRY;
-#pragma GLOBAL_ASM("asm/non_matchings/code/padmgr/Padmgr_GetEventCallback.s")
+/**
+ * Returns the bitmask of valid controllers.
+ *
+ * bit n set = controller (n+1) available.
+ */
+u8 PadMgr_GetValidControllersMask(void) {
+ return sPadMgrInstance->validCtrlrsMask;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/padmgr/func_80175008.s")
+/**
+ * Sets the callback function intended to be used to modify the rumble pak state on each VI with
+ * calls to `PadMgr_RumbleSetSingle`. The callback may be passed a single user-provided argument.
+ *
+ * @param callback callback to run before rumble state is updated for the current VI
+ * @param arg the argument to pass to the callback
+ *
+ * @see PadMgr_RumbleSetSingle
+ * @see PadMgr_UnsetRumbleRetraceCallback
+ */
+void PadMgr_SetRumbleRetraceCallback(void (*callback)(void*), void* arg) {
+ sPadMgrInstance->rumbleRetraceCallback = callback;
+ sPadMgrInstance->rumbleRetraceArg = arg;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/padmgr/Padmgr_SetEventCallback.s")
+/**
+ * Unsets the rumble retrace callback if the provided function and argument are the same as those already registered.
+ *
+ * @param callback the callback to test against
+ * @param arg the argument to test against
+ *
+ * @see PadMgr_SetRumbleRetraceCallback
+ */
+void PadMgr_UnsetRumbleRetraceCallback(void (*callback)(void*), void* arg) {
+ if ((sPadMgrInstance->rumbleRetraceCallback == callback) && (sPadMgrInstance->rumbleRetraceArg == arg)) {
+ sPadMgrInstance->rumbleRetraceCallback = NULL;
+ sPadMgrInstance->rumbleRetraceArg = NULL;
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/padmgr/func_8017506C.s")
+/**
+ * Sets the callback function intended to be used to test for particular inputs on each VI, immediately after new
+ * inputs have been polled.
+ *
+ * This is useful for the rare cases where additional resolution is needed in the timings of player inputs,
+ * while the game is still updating comparatively slower.
+ *
+ * @param callback callback to run as soon as new inputs are obtained
+ * @param arg the argument to pass to the callback
+ *
+ * @see PadMgr_UnsetInputRetraceCallback
+ */
+void PadMgr_SetInputRetraceCallback(void (*callback)(void*), void* arg) {
+ sPadMgrInstance->inputRetraceCallback = callback;
+ sPadMgrInstance->inputRetraceArg = arg;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/padmgr/Padmgr_Lock.s")
+/**
+ * Unsets the input retrace callback if the provided function and argument are the same as those already registered.
+ *
+ * @param callback the callback to test against
+ * @param arg the argument to test against
+ *
+ * @see PadMgr_SetInputRetraceCallback
+ */
+void PadMgr_UnsetInputRetraceCallback(void (*callback)(void*), void* arg) {
+ if ((sPadMgrInstance->inputRetraceCallback == callback) && (sPadMgrInstance->inputRetraceArg == arg)) {
+ sPadMgrInstance->inputRetraceCallback = NULL;
+ sPadMgrInstance->inputRetraceArg = NULL;
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/padmgr/Padmgr_Unlock.s")
+/**
+ * Acquires exclusive access to the serial event queue.
+ *
+ * When a DMA to/from PIF RAM completes, an SI interrupt is generated to notify the process that the DMA has completed
+ * and a message is posted to the serial event queue. If multiple processes are trying to use the SI at the same time
+ * it becomes ambiguous as to which DMA has completed, so a locking system is required to arbitrate access to the SI.
+ *
+ * Once the task requiring the serial event queue is complete, it should be released with a call to
+ * `PadMgr_ReleaseSerialEventQueue()`.
+ *
+ * If another process tries to acquire the event queue, the current thread will be blocked until the event queue is
+ * released. Note the possibility for a deadlock, if the thread that already holds the serial event queue attempts to
+ * acquire it again it will block forever.
+ *
+ * @return The message queue to which SI interrupt events are posted.
+ *
+ * @see PadMgr_ReleaseSerialEventQueue
+ */
+OSMesgQueue* PadMgr_AcquireSerialEventQueue(void) {
+ OSMesgQueue* serialEventQueue;
-#pragma GLOBAL_ASM("asm/non_matchings/code/padmgr/func_801750FC.s")
+ osRecvMesg(&sPadMgrInstance->serialLockQueue, (OSMesg*)&serialEventQueue, OS_MESG_BLOCK);
+ return serialEventQueue;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/padmgr/func_80175364.s")
+/**
+ * Like `PadMgr_AcquireSerialEventQueue` but for Voice access.
+ *
+ * @see PadMgr_AcquireSerialEventQueue
+ * @see PadMgr_VoiceReleaseSerialEventQueue
+ */
+OSMesgQueue* PadMgr_VoiceAcquireSerialEventQueue(void) {
+ OSMesgQueue* serialEventQueue;
-#pragma GLOBAL_ASM("asm/non_matchings/code/padmgr/func_80175434.s")
+ osRecvMesg(&sPadMgrInstance->serialLockQueue, (OSMesg*)&serialEventQueue, OS_MESG_BLOCK);
+ return serialEventQueue;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/padmgr/func_8017544C.s")
+/**
+ * Relinquishes access to the serial message queue, allowing another process to acquire and use it.
+ *
+ * @param serialEventQueue The serial message queue acquired by `PadMgr_AcquireSerialEventQueue`
+ *
+ * @see PadMgr_AcquireSerialEventQueue
+ */
+void PadMgr_ReleaseSerialEventQueue(OSMesgQueue* serialEventQueue) {
+ osSendMesg(&sPadMgrInstance->serialLockQueue, (OSMesg)serialEventQueue, OS_MESG_BLOCK);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/padmgr/PadMgr_RumbleSet.s")
+/**
+ * Like `PadMgr_ReleaseSerialEventQueue` but for Voice access.
+ *
+ * @see PadMgr_VoiceAcquireSerialEventQueue
+ */
+void PadMgr_VoiceReleaseSerialEventQueue(OSMesgQueue* serialEventQueue) {
+ osSendMesg(&sPadMgrInstance->serialLockQueue, (OSMesg)serialEventQueue, OS_MESG_BLOCK);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/padmgr/PadMgr_ControllerHasRumblePak.s")
+/**
+ * Locks controller input data while padmgr is reading new inputs or another thread is using the current inputs.
+ * This prevents new inputs overwriting the current inputs while they are in use.
+ *
+ * @see PadMgr_UnlockPadData
+ */
+void PadMgr_LockPadData(void) {
+ osRecvMesg(&sPadMgrInstance->lockQueue, NULL, OS_MESG_BLOCK);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/padmgr/Padmgr_CalcStickEdges.s")
+/**
+ * Unlocks controller input data, allowing padmgr to read new inputs or another thread to access the most recently
+ * polled inputs.
+ *
+ * @see PadMgr_LockPadData
+ */
+void PadMgr_UnlockPadData(void) {
+ osSendMesg(&sPadMgrInstance->lockQueue, NULL, OS_MESG_BLOCK);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/padmgr/Padmgr_ParseState.s")
+/**
+ * Activates the rumble pak for all controllers it is enabled on, stops it for all controllers it is disabled on and
+ * attempts to initialize it for a controller if it is not already initialized.
+ */
+void PadMgr_UpdateRumble(void) {
+ s32 i;
+ s32 ret;
+ OSMesgQueue* serialEventQueue = PadMgr_AcquireSerialEventQueue();
+ s32 triedRumbleComm = false;
-#pragma GLOBAL_ASM("asm/non_matchings/code/padmgr/func_801759BC.s")
+ for (i = 0; i < MAXCONTROLLERS; i++) {
+ if (sPadMgrInstance->ctrlrType[i] == PADMGR_CONT_NORMAL) {
+ // Check status for whether a controller pak is connected
+ if (sPadMgrInstance->padStatus[i].status & CONT_CARD_ON) {
+ if (sPadMgrInstance->pakType[i] == CONT_PAK_RUMBLE) {
+ if (sPadMgrInstance->rumbleEnable[i]) {
+ if (sPadMgrInstance->rumbleTimer[i] < 3) {
+ // Rumble pak start
-#pragma GLOBAL_ASM("asm/non_matchings/code/padmgr/func_80175AE0.s")
+ if (osMotorStart(&sPadMgrInstance->rumblePfs[i]) != 0) {
+ // error
+ sPadMgrInstance->pakType[i] = CONT_PAK_NONE;
+ } else {
+ sPadMgrInstance->rumbleTimer[i] = 3;
+ }
+ triedRumbleComm = true;
+ }
+ } else {
+ if (sPadMgrInstance->rumbleTimer[i] != 0) {
+ // Rumble Pak stop
-#pragma GLOBAL_ASM("asm/non_matchings/code/padmgr/Padmgr_Update.s")
+ if (osMotorStop(&sPadMgrInstance->rumblePfs[i]) != 0) {
+ // error
+ sPadMgrInstance->pakType[i] = CONT_PAK_NONE;
+ } else {
+ sPadMgrInstance->rumbleTimer[i]--;
+ }
+ triedRumbleComm = true;
+ }
+ }
+ }
+ } else if (sPadMgrInstance->pakType[i] != CONT_PAK_NONE) {
+ sPadMgrInstance->pakType[i] = CONT_PAK_NONE;
+ }
+ }
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/code/padmgr/Padmgr_Stop.s")
+ if (!triedRumbleComm) {
+ // Try to initialize the rumble pak for controller port `i` if a controller pak is connected and not already
+ // known to be an initialized a rumble pak
+ i = sPadMgrRetraceCount % MAXCONTROLLERS;
-#pragma GLOBAL_ASM("asm/non_matchings/code/padmgr/func_80175E68.s")
+ if ((sPadMgrInstance->ctrlrType[i] == PADMGR_CONT_NORMAL) &&
+ (sPadMgrInstance->padStatus[i].status & CONT_CARD_ON) && (sPadMgrInstance->pakType[i] != CONT_PAK_RUMBLE)) {
+ ret = osMotorInit(serialEventQueue, &sPadMgrInstance->rumblePfs[i], i);
-#pragma GLOBAL_ASM("asm/non_matchings/code/padmgr/Padmgr_GetInput.s")
+ if (ret == 0) {
+ // Got rumble pak
+ sPadMgrInstance->pakType[i] = CONT_PAK_RUMBLE;
+ sPadMgrInstance->rumbleTimer[i] = 2;
+ } else if (ret == PFS_ERR_DEVICE) {
+ // Not a rumble pak
+ if (sPadMgrInstance->pakType[i] != CONT_PAK_OTHER) {
+ sPadMgrInstance->pakType[i] = CONT_PAK_OTHER;
+ }
+ } else if (ret == PFS_ERR_CONTRFAIL) {
+ // Pak communication error
+ } else if (ret == PFS_ERR_NOPACK) {
+ // No controller pak
+ } else {
+ // Unrecognized return code
+ Fault_AddHungupAndCrash("../padmgr.c", 594);
+ }
+ }
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/code/padmgr/Padmgr_GetInput2.s")
+ PadMgr_ReleaseSerialEventQueue(serialEventQueue);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/padmgr/Padmgr_ThreadEntry.s")
+/**
+ * Immediately stops rumble on all controllers
+ */
+void PadMgr_RumbleStop(void) {
+ OSMesgQueue* serialEventQueue = PadMgr_AcquireSerialEventQueue();
+ s32 i;
-#pragma GLOBAL_ASM("asm/non_matchings/code/padmgr/PadMgr_Init.s")
+ for (i = 0; i < MAXCONTROLLERS; i++) {
+ if ((sPadMgrInstance->ctrlrType[i] == PADMGR_CONT_NORMAL) &&
+ (osMotorInit(serialEventQueue, &sPadMgrInstance->rumblePfs[i], i) == 0)) {
+ // If there is a rumble pak attached to this controller, stop it
+ osMotorStop(&sPadMgrInstance->rumblePfs[i]);
+ }
+ }
+ PadMgr_ReleaseSerialEventQueue(serialEventQueue);
+}
+
+/**
+ * Prevents rumble for 12 VI, ~0.2 seconds at 60 VI/sec
+ */
+void PadMgr_RumblePause(void) {
+ sPadMgrInstance->rumbleOffTimer = 12;
+}
+
+/**
+ * Enables or disables rumble on controller port `port` for 24 VI,
+ * ~0.4 seconds at 60 VI/sec and ~0.48 seconds at 50 VI/sec
+ */
+void PadMgr_RumbleSetSingle(s32 port, s32 enable) {
+ sPadMgrInstance->rumbleEnable[port] = enable;
+ sPadMgrInstance->rumbleOnTimer = 24;
+}
+
+/**
+ * Enables or disables rumble on all controller ports for 24 VI,
+ * ~0.4 seconds at 60 VI/sec and ~0.48 seconds at 50 VI/sec
+ *
+ * @param enable Array of u8 of length MAXCONTROLLERS containing either true or false to enable or disable rumble
+ * for that controller
+ */
+void PadMgr_RumbleSet(u8 enable[MAXCONTROLLERS]) {
+ s32 i;
+
+ for (i = 0; i < MAXCONTROLLERS; i++) {
+ sPadMgrInstance->rumbleEnable[i] = enable[i];
+ }
+ sPadMgrInstance->rumbleOnTimer = 24;
+}
+
+s32 PadMgr_ControllerHasRumblePak(s32 port) {
+ return sPadMgrInstance->pakType[port] == CONT_PAK_RUMBLE;
+}
+
+void PadMgr_AdjustInput(Input* input) {
+ s32 plus;
+ s32 minus;
+ s32 pressX;
+ s32 pressX2;
+ s32 pressY;
+ s32 pressY2;
+ s32 pad1;
+ s32 pad2;
+ s32 pad3;
+ f32 pad4;
+ f32 newX;
+ f32 newY;
+ f32 magnitude;
+ f32 angle;
+ s8 curX = input->cur.stick_x;
+ s8 curY = input->cur.stick_y;
+
+ if (CHECK_BTN_ANY(input->press.button, BTN_RESET) || (input->press.stick_x == 0)) {
+ input->press.stick_x = 61;
+ input->press.errno = -61;
+ input->press.stick_y = 63;
+ input->rel.errno = -63;
+ }
+ pressX = input->press.stick_x;
+ pressX2 = (s8)input->press.errno;
+ pressY = input->press.stick_y;
+ pressY2 = (s8)input->rel.errno;
+
+ if (CHECK_BTN_ANY(input->cur.button, BTN_RESET)) {
+ minus = curX - 7;
+ plus = curX + 7;
+
+ if (minus > 0) {
+ if (pressX < minus - 3) {
+ pressX = minus - 3;
+ input->press.stick_x = minus - 3;
+ }
+ } else if (plus < 0) {
+ if (pressX2 > plus + 3) {
+ pressX2 = plus + 3;
+ input->press.errno = plus + 3;
+ }
+ }
+
+ minus = curY - 7;
+ plus = curY + 7;
+
+ if (minus > 0) {
+ if (pressY < minus - 3) {
+ pressY = minus - 3;
+ input->press.stick_y = minus - 3;
+ }
+ } else if (plus < 0) {
+ if (pressY2 > plus + 3) {
+ pressY2 = plus + 3;
+ input->rel.errno = plus + 3;
+ }
+ }
+ }
+
+ minus = curX - 7;
+ plus = curX + 7;
+
+ if (minus > 0) {
+ newX = (pressX < minus) ? 1.0f : (f32)minus / pressX;
+ } else if (plus < 0) {
+ newX = (pressX2 > plus) ? -1.0f : -(f32)plus / pressX2;
+ } else {
+ newX = 0.0f;
+ }
+
+ minus = curY - 7;
+ plus = curY + 7;
+
+ if (minus > 0) {
+ newY = (pressY < minus) ? 1.0f : (f32)minus / pressY;
+ } else if (plus < 0) {
+ newY = (pressY2 > plus) ? -1.0f : -(f32)plus / pressY2;
+ } else {
+ newY = 0.0f;
+ }
+
+ if (1) {
+ s32 pad;
+
+ magnitude = sqrtf(SQ(newX) + SQ(newY));
+ if (magnitude > 1.0f) {
+ magnitude = 1.0f;
+ }
+ angle = Math_Atan2F_XY(curY, -curX);
+ newX = -sinf(angle) * magnitude;
+ newY = cosf(angle) * magnitude;
+ }
+ input->rel.stick_x = newX * 60.5f;
+ input->rel.stick_y = newY * 60.5f;
+}
+
+/**
+ * Updates `sPadMgrInstance->inputs` based on the error response of each controller
+ */
+void PadMgr_UpdateInputs(void) {
+ s32 diff;
+ Input* input = &sPadMgrInstance->inputs[0];
+ s32 i;
+ OSContPad* pad = &sPadMgrInstance->pads[0];
+
+ for (i = 0; i < sPadMgrInstance->nControllers; i++, input++, pad++) {
+ s32 isStandardController;
+
+ input->prev = input->cur;
+ isStandardController = sPadMgrInstance->ctrlrType[i] == PADMGR_CONT_NORMAL;
+ if (isStandardController) {
+ switch (pad->errno) {
+ case 0:
+ // No error, copy inputs
+ input->cur = *pad;
+ break;
+
+ case CHNL_ERR_OVERRUN >> 4:
+ // Overrun error, reuse previous inputs
+ input->cur = input->prev;
+ break;
+
+ case CHNL_ERR_NORESP >> 4:
+ // No response error, take inputs as 0
+ input->cur.button = 0;
+ input->cur.stick_x = 0;
+ input->cur.stick_y = 0;
+ input->cur.errno = pad->errno;
+ if (sPadMgrInstance->ctrlrType[i] != PADMGR_CONT_NONE) {
+ // If we get no response, consider the controller disconnected
+ sPadMgrInstance->ctrlrType[i] = PADMGR_CONT_NONE;
+ sPadMgrInstance->pakType[i] = CONT_PAK_NONE;
+ sPadMgrInstance->rumbleTimer[i] = 0xFF;
+ }
+ break;
+
+ default:
+ // Unknown error response
+ Fault_AddHungupAndCrash("../padmgr.c", 1098);
+ break;
+ }
+ } else {
+ input->cur.button = 0;
+ input->cur.stick_x = 0;
+ input->cur.stick_y = 0;
+ input->cur.errno = pad->errno;
+ }
+
+ // If opposed directions on the D-Pad are pressed at the same time, mask both out
+ if ((input->cur.button & (BTN_DDOWN | BTN_DUP)) == (BTN_DDOWN | BTN_DUP)) {
+ input->cur.button &= ~(BTN_DDOWN | BTN_DUP);
+ }
+ if ((input->cur.button & (BTN_DRIGHT | BTN_DLEFT)) == (BTN_DRIGHT | BTN_DLEFT)) {
+ input->cur.button &= ~(BTN_DRIGHT | BTN_DLEFT);
+ }
+
+ // Calculate pressed and relative inputs
+ diff = input->prev.button ^ input->cur.button;
+ input->press.button |= (u16)(diff & input->cur.button);
+ input->rel.button |= (u16)(diff & input->prev.button);
+
+ if (1) {}
+ PadMgr_AdjustInput(input);
+ }
+}
+
+/**
+ * Looks for plugged in voice recognition units and initializes them.
+ *
+ * This runs only on startup, there will be no attempts to initialize
+ * a VRU other than on the first VI retrace.
+ */
+void PadMgr_InitVoice(void) {
+ s32 i;
+ OSMesgQueue* serialEventQueue;
+ s32 ret;
+
+ for (i = 0; i < sPadMgrInstance->nControllers; i++) {
+ if (sPadMgrInstance->ctrlrType[i] == PADMGR_CONT_VOICE_PLUGGED) {
+ serialEventQueue = PadMgr_AcquireSerialEventQueue();
+
+ ret = osVoiceInit(serialEventQueue, &gVoiceHandle, i);
+
+ PadMgr_ReleaseSerialEventQueue(serialEventQueue);
+
+ if (ret != 0) {
+ // error
+ } else {
+ sPadMgrInstance->ctrlrType[i] = PADMGR_CONT_VOICE;
+ sVoiceInitStatus = VOICE_INIT_SUCCESS;
+ func_801A4EB0();
+ }
+ }
+ }
+ // If sVoiceInitStatus is still VOICE_INIT_TRY after the first attempt to initialize a VRU, don't try again
+ if (sVoiceInitStatus == VOICE_INIT_TRY) {
+ sVoiceInitStatus = VOICE_INIT_FAILED;
+ }
+}
+
+/**
+ * Update the state of connected controllers
+ */
+void PadMgr_UpdateConnections(void) {
+ s32 ctrlrMask = 0;
+ s32 i;
+ char msg[50];
+
+ for (i = 0; i < MAXCONTROLLERS; i++) {
+ if (sPadMgrInstance->padStatus[i].errno == 0) {
+ switch (sPadMgrInstance->padStatus[i].type & CONT_TYPE_MASK) {
+ case CONT_TYPE_NORMAL:
+ // Standard N64 Controller
+ ctrlrMask |= (1 << i);
+ if (sPadMgrInstance->ctrlrType[i] == PADMGR_CONT_NONE) {
+ sPadMgrInstance->ctrlrType[i] = PADMGR_CONT_NORMAL;
+ }
+ break;
+
+ case CONT_TYPE_MOUSE:
+ // N64 Mouse
+ if (sPadMgrInstance->ctrlrType[i] == PADMGR_CONT_NONE) {
+ sPadMgrInstance->ctrlrType[i] = PADMGR_CONT_MOUSE;
+ }
+ break;
+
+ case CONT_TYPE_VOICE:
+ // Voice Recognition Unit
+ if (sPadMgrInstance->ctrlrType[i] == PADMGR_CONT_NONE) {
+ sPadMgrInstance->ctrlrType[i] = PADMGR_CONT_VOICE_PLUGGED;
+ sPadMgrInstance->pakType[i] = CONT_PAK_NONE;
+ }
+ break;
+
+ default:
+ // Other/Unrecognized
+ if (sPadMgrInstance->ctrlrType[i] == PADMGR_CONT_NONE) {
+ sPadMgrInstance->ctrlrType[i] = PADMGR_CONT_UNK;
+ // "Recognized an unknown type of controller (%04x)"
+ sprintf(msg, "知らない種類のコントローラ(%04x)を認識しました",
+ sPadMgrInstance->padStatus[i].type);
+ }
+ // Missing break required for matching
+ }
+ } else if (sPadMgrInstance->ctrlrType[i] != PADMGR_CONT_NONE) {
+ // Plugged controller errored
+ sPadMgrInstance->ctrlrType[i] = PADMGR_CONT_NONE;
+ sPadMgrInstance->pakType[i] = CONT_PAK_NONE;
+ sPadMgrInstance->rumbleTimer[i] = 0xFF;
+ }
+ }
+ sPadMgrInstance->validCtrlrsMask = ctrlrMask;
+}
+
+void PadMgr_HandleRetrace(void) {
+ OSMesgQueue* serialEventQueue = PadMgr_AcquireSerialEventQueue();
+
+ // Begin reading controller data
+ osContStartReadData(serialEventQueue);
+
+ // Execute rumble callback
+ if (sPadMgrInstance->rumbleRetraceCallback != NULL) {
+ sPadMgrInstance->rumbleRetraceCallback(sPadMgrInstance->rumbleRetraceArg);
+ }
+
+ // Wait for controller data
+ osRecvMesg(serialEventQueue, NULL, OS_MESG_BLOCK);
+ osContGetReadData(sPadMgrInstance->pads);
+
+ // Clear all but controller 1
+ bzero(&sPadMgrInstance->pads[1], sizeof(*sPadMgrInstance->pads) * (MAXCONTROLLERS - 1));
+
+ // If in PreNMI, clear all controllers
+ if (sPadMgrInstance->isResetting) {
+ bzero(sPadMgrInstance->pads, sizeof(sPadMgrInstance->pads));
+ }
+
+ // Query controller statuses
+ osContStartQuery(serialEventQueue);
+ osRecvMesg(serialEventQueue, NULL, OS_MESG_BLOCK);
+ osContGetQuery(sPadMgrInstance->padStatus);
+
+ // Lock serial message queue
+ PadMgr_ReleaseSerialEventQueue(serialEventQueue);
+
+ // Update connections
+ PadMgr_UpdateConnections();
+
+ // Lock input data
+ PadMgr_LockPadData();
+
+ // Update input data
+ PadMgr_UpdateInputs();
+
+ // Execute input callback
+ if (sPadMgrInstance->inputRetraceCallback != NULL) {
+ sPadMgrInstance->inputRetraceCallback(sPadMgrInstance->inputRetraceArg);
+ }
+
+ // Unlock input data
+ PadMgr_UnlockPadData();
+
+ // Try and initialize a Voice Recognition Unit if not already attempted
+ if (sVoiceInitStatus != VOICE_INIT_FAILED) {
+ PadMgr_InitVoice();
+ }
+
+ // Rumble Pak
+ if (gFaultStruct.msgId != 0) {
+ // If fault is active, no rumble
+ PadMgr_RumbleStop();
+ } else if (sPadMgrInstance->rumbleOffTimer > 0) {
+ // If the rumble off timer is active, no rumble
+ --sPadMgrInstance->rumbleOffTimer;
+ PadMgr_RumbleStop();
+ } else if (sPadMgrInstance->rumbleOnTimer == 0) {
+ // If the rumble on timer is inactive, no rumble
+ PadMgr_RumbleStop();
+ } else if (!sPadMgrInstance->isResetting) {
+ // If not resetting, update rumble
+ PadMgr_UpdateRumble();
+ --sPadMgrInstance->rumbleOnTimer;
+ }
+
+ sPadMgrRetraceCount++;
+}
+
+void PadMgr_HandlePreNMI(void) {
+ sPadMgrInstance->isResetting = true;
+ PadMgr_RumblePause();
+}
+
+/**
+ * Fetches the most recently polled inputs from padmgr.
+ *
+ * NOTE: This function does not lock the inputs while reading them.
+ * The padmgr thread may interrupt this function and poll new inputs while the thread running this function is
+ * currently copying the old inputs potentially resulting in a mix of newly polled and old inputs being used.
+ * It is preferable to use `PadMgr_GetInput` or `PadMgr_GetInput2`.
+ *
+ * @param inputs Array of Input of length MAXCONTROLLERS to copy inputs into
+ * @param gameRequest True if polling inputs for updating the game state
+ */
+void PadMgr_GetInputNoLock(Input* inputs, s32 gameRequest) {
+ s32 i;
+ Input* input = &sPadMgrInstance->inputs[0];
+ Input* inputOut = &inputs[0];
+ s32 buttonDiff;
+
+ for (i = 0; i < MAXCONTROLLERS; i++) {
+ if (gameRequest) {
+ // Copy inputs as-is, press and rel are calculated prior in `PadMgr_UpdateInputs`
+ *inputOut = *input;
+ // Zero parts of the press and rel inputs in the polled inputs so they are not read more than once
+ input->press.button = 0;
+ input->rel.button = 0;
+ } else {
+ // Take as the previous inputs the inputs that are currently in the destination array
+ inputOut->prev = inputOut->cur;
+ // Copy current inputs from the polled inputs
+ inputOut->cur = input->cur;
+ // Calculate press and rel from these
+ buttonDiff = inputOut->prev.button ^ inputOut->cur.button;
+ inputOut->press.button = inputOut->cur.button & buttonDiff;
+ inputOut->rel.button = inputOut->prev.button & buttonDiff;
+ PadUtils_UpdateRelXY(inputOut);
+ }
+ input++;
+ inputOut++;
+ }
+}
+
+/**
+ * Fetches the most recently polled inputs from padmgr.
+ *
+ * @param inputs Array of Input of length MAXCONTROLLERS to copy inputs into
+ * @param gameRequest True if polling inputs for updating the game state
+ */
+void PadMgr_GetInput(Input* inputs, s32 gameRequest) {
+ PadMgr_LockPadData();
+ PadMgr_GetInputNoLock(inputs, gameRequest);
+ PadMgr_UnlockPadData();
+}
+
+/**
+ * Copy of `PadMgr_GetInput`
+ *
+ * @see PadMgr_GetInput
+ */
+void PadMgr_GetInput2(Input* inputs, s32 gameRequest) {
+ PadMgr_LockPadData();
+ PadMgr_GetInputNoLock(inputs, gameRequest);
+ PadMgr_UnlockPadData();
+}
+
+void PadMgr_ThreadEntry() {
+ s16* interruptMsg = NULL;
+ s32 actionBits;
+ s32 exit;
+
+ osCreateMesgQueue(&sPadMgrInstance->interruptQueue, sPadMgrInstance->interruptMsgBuf,
+ ARRAY_COUNT(sPadMgrInstance->interruptMsgBuf));
+ IrqMgr_AddClient(sPadMgrInstance->irqMgr, &sPadMgrInstance->irqClient, &sPadMgrInstance->interruptQueue);
+
+ actionBits = 0;
+ exit = false;
+
+ while (!exit) {
+ // Process all messages currently in the queue, instead of only a single mssage.
+ // Deduplicates the same message.
+ do {
+ osRecvMesg(&sPadMgrInstance->interruptQueue, (OSMesg*)&interruptMsg, OS_MESG_BLOCK);
+ switch (*interruptMsg) {
+ case OS_SC_RETRACE_MSG:
+ actionBits |= PADMGR_RETRACE_MSG;
+ break;
+
+ case OS_SC_PRE_NMI_MSG:
+ actionBits |= PADMGR_PRE_NMI_MSG;
+ break;
+
+ case OS_SC_NMI_MSG:
+ actionBits |= PADMGR_NMI_MSG;
+ break;
+ }
+ } while (!MQ_IS_EMPTY(&sPadMgrInstance->interruptQueue));
+
+ // Act on received messages
+ while (actionBits != 0) {
+ if (actionBits & PADMGR_NMI_MSG) {
+ actionBits &= ~PADMGR_NMI_MSG;
+ exit = true;
+ } else if (actionBits & PADMGR_PRE_NMI_MSG) {
+ actionBits &= ~PADMGR_PRE_NMI_MSG;
+ PadMgr_HandlePreNMI();
+ } else if (actionBits & PADMGR_RETRACE_MSG) {
+ actionBits &= ~PADMGR_RETRACE_MSG;
+ PadMgr_HandleRetrace();
+ }
+ }
+ }
+
+ IrqMgr_RemoveClient(sPadMgrInstance->irqMgr, &sPadMgrInstance->irqClient);
+}
+
+void PadMgr_Init(OSMesgQueue* siEvtQ, IrqMgr* irqMgr, OSId threadId, OSPri pri, void* stack) {
+ bzero(sPadMgrInstance, sizeof(PadMgr));
+ sPadMgrInstance->irqMgr = irqMgr;
+
+ // These are unique access tokens, there should only ever be room for one OSMesg in these queues
+ osCreateMesgQueue(&sPadMgrInstance->serialLockQueue, &sPadMgrInstance->serialMsg, 1);
+ osCreateMesgQueue(&sPadMgrInstance->lockQueue, &sPadMgrInstance->lockMsg, 1);
+
+ PadMgr_UnlockPadData();
+ PadSetup_Init(siEvtQ, &sPadMgrInstance->validCtrlrsMask, sPadMgrInstance->padStatus);
+ sPadMgrInstance->nControllers = MAXCONTROLLERS;
+ osContSetCh(sPadMgrInstance->nControllers);
+ PadMgr_ReleaseSerialEventQueue(siEvtQ);
+
+ osCreateThread(&sPadMgrInstance->thread, threadId, PadMgr_ThreadEntry, sPadMgrInstance, stack, pri);
+ osStartThread(&sPadMgrInstance->thread);
+}
diff --git a/src/code/sys_rumble.c b/src/code/sys_rumble.c
index 4101758be..06bef6e34 100644
--- a/src/code/sys_rumble.c
+++ b/src/code/sys_rumble.c
@@ -24,12 +24,12 @@ void RumbleManager_Update(RumbleManager* rumbleMgr) {
if (D_801D1E70) {
for (i = 0; i < MAXCONTROLLERS; i++) {
- func_8017544C(i, false);
+ PadMgr_RumbleSetSingle(i, false);
}
}
D_801D1E70 = rumbleMgr->updateEnabled;
- func_80175434();
+ PadMgr_RumblePause();
return;
}
@@ -39,7 +39,7 @@ void RumbleManager_Update(RumbleManager* rumbleMgr) {
// Start up the manager by wiping old requests
if (rumbleMgr->state == RUMBLEMANAGER_STATE_INITIAL) {
for (i = 0; i < MAXCONTROLLERS; i++) {
- func_8017544C(i, false);
+ PadMgr_RumbleSetSingle(i, false);
}
for (i = 0; i < RUMBLE_REQUEST_BUFFER_SIZE; i++) {
@@ -59,7 +59,7 @@ void RumbleManager_Update(RumbleManager* rumbleMgr) {
rumbleMgr->state = RUMBLEMANAGER_STATE_RUNNING;
- func_80175434();
+ PadMgr_RumblePause();
}
if (rumbleMgr->state != RUMBLEMANAGER_STATE_WIPE) {
@@ -146,7 +146,7 @@ void RumbleManager_Update(RumbleManager* rumbleMgr) {
rumbleMgr->overrideDecayStep = 0;
rumbleMgr->overrideAccumulator = 0;
- func_80175434();
+ PadMgr_RumblePause();
}
}
diff --git a/src/code/z_actor.c b/src/code/z_actor.c
index 84501dcbb..e86a341fd 100644
--- a/src/code/z_actor.c
+++ b/src/code/z_actor.c
@@ -76,7 +76,7 @@ void ActorShadow_Draw(Actor* actor, Lights* lights, PlayState* play, Gfx* dlist,
OPEN_DISPS(play->state.gfxCtx);
- POLY_OPA_DISP = Gfx_CallSetupDL(POLY_OPA_DISP, 0x2C);
+ POLY_OPA_DISP = Gfx_SetupDL(POLY_OPA_DISP, SETUPDL_44);
gDPSetCombineLERP(POLY_OPA_DISP++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, COMBINED, 0, 0, 0,
COMBINED);
@@ -218,7 +218,7 @@ void ActorShadow_DrawFeet(Actor* actor, Lights* mapper, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- POLY_OPA_DISP = Gfx_CallSetupDL(POLY_OPA_DISP, 0x2C);
+ POLY_OPA_DISP = Gfx_SetupDL(POLY_OPA_DISP, SETUPDL_44);
actor->shape.feetFloorFlags = 0;
spB8 = 2;
@@ -360,7 +360,7 @@ void func_800B4B50(Actor* actor, Lights* mapper, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- POLY_OPA_DISP = Gfx_CallSetupDL(POLY_OPA_DISP, 0x2C);
+ POLY_OPA_DISP = Gfx_SetupDL(POLY_OPA_DISP, SETUPDL_44);
func_800C0094(actor->floorPoly, actor->world.pos.x, actor->floorHeight, actor->world.pos.z, &sp94);
temp_f22 = (f32)actor->shape.shadowAlpha * (1.0f - (spEC * (1.0f / 30.0f)));
@@ -522,7 +522,7 @@ void Actor_DrawZTarget(TargetContext* targetCtx, PlayState* play) {
Target_SetPos(targetCtx, targetCtx->unk4C, projectedPos.x, projectedPos.y, projectedPos.z);
if ((!(player->stateFlags1 & PLAYER_STATE1_40)) || (actor != player->targetedActor)) {
- OVERLAY_DISP = Gfx_CallSetupDL(OVERLAY_DISP, 0x39);
+ OVERLAY_DISP = Gfx_SetupDL(OVERLAY_DISP, SETUPDL_57);
for (spB0 = 0, spAC = targetCtx->unk4C; spB0 < spB8; spB0++, spAC = (spAC + 1) % 3) {
entry = &targetCtx->unk50[spAC];
@@ -564,7 +564,7 @@ void Actor_DrawZTarget(TargetContext* targetCtx, PlayState* play) {
if ((actor != NULL) && !(actor->flags & ACTOR_FLAG_CANT_LOCK_ON)) {
TatlColor* color = &sTatlColorList[actor->category];
- POLY_XLU_DISP = Gfx_CallSetupDL(POLY_XLU_DISP, 0x07);
+ POLY_XLU_DISP = Gfx_SetupDL(POLY_XLU_DISP, SETUPDL_7);
Matrix_Translate(actor->focus.pos.x,
actor->focus.pos.y + (actor->targetArrowOffset * actor->scale.y) + 17.0f,
@@ -869,7 +869,7 @@ void TitleCard_Draw(GameState* gameState, TitleCardContext* titleCtx) {
spB4 = spB8 + (height * 4);
- OVERLAY_DISP = func_8012C014(OVERLAY_DISP);
+ OVERLAY_DISP = Gfx_SetupDL52_NoCD(OVERLAY_DISP);
gDPSetPrimColor(OVERLAY_DISP++, 0, 0, (u8)titleCtx->intensity, (u8)titleCtx->intensity, (u8)titleCtx->intensity,
(u8)titleCtx->alpha);
@@ -908,41 +908,38 @@ s32 func_800B6434(PlayState* play, TitleCardContext* titleCtx) {
return true;
}
-// ActorContext_1F4 Init
-void func_800B6468(PlayState* play) {
- play->actorCtx.unk_1F4.timer = 0;
+void Actor_InitPlayerImpact(PlayState* play) {
+ play->actorCtx.playerImpact.timer = 0;
}
-// ActorContext_1F4 Update
-void func_800B6474(PlayState* play) {
- DECR(play->actorCtx.unk_1F4.timer);
+void Actor_UpdatePlayerImpact(PlayState* play) {
+ DECR(play->actorCtx.playerImpact.timer);
}
-// ActorContext_1F4 setter something
-s32 func_800B648C(PlayState* play, s32 arg1, s32 timer, f32 arg3, Vec3f* arg4) {
- if ((play->actorCtx.unk_1F4.timer != 0) && (arg3 < play->actorCtx.unk_1F4.unk_04)) {
+s32 Actor_SetPlayerImpact(PlayState* play, PlayerImpactType type, s32 timer, f32 dist, Vec3f* pos) {
+ if ((play->actorCtx.playerImpact.timer != 0) && (dist < play->actorCtx.playerImpact.dist)) {
return false;
}
- play->actorCtx.unk_1F4.unk_00 = arg1;
- play->actorCtx.unk_1F4.timer = timer;
- play->actorCtx.unk_1F4.unk_04 = arg3;
- Math_Vec3f_Copy(&play->actorCtx.unk_1F4.unk_08, arg4);
+ play->actorCtx.playerImpact.type = type;
+ play->actorCtx.playerImpact.timer = timer;
+ play->actorCtx.playerImpact.dist = dist;
+ Math_Vec3f_Copy(&play->actorCtx.playerImpact.pos, pos);
return true;
}
-// ActorContext_1F4 getter something
-f32 func_800B64FC(PlayState* play, f32 arg1, Vec3f* arg2, u32* arg3) {
- f32 temp_f8;
+f32 Actor_GetPlayerImpact(PlayState* play, f32 range, Vec3f* pos, PlayerImpactType* type) {
+ f32 dist;
- if ((play->actorCtx.unk_1F4.timer == 0) || (arg1 == 0.0f)) {
+ if ((play->actorCtx.playerImpact.timer == 0) || (range == 0.0f)) {
return -1.0f;
}
- temp_f8 = Math_Vec3f_DistXYZ(&play->actorCtx.unk_1F4.unk_08, arg2) / arg1;
- *arg3 = play->actorCtx.unk_1F4.unk_00;
- return play->actorCtx.unk_1F4.unk_04 - temp_f8;
+ dist = Math_Vec3f_DistXYZ(&play->actorCtx.playerImpact.pos, pos) / range;
+ *type = play->actorCtx.playerImpact.type;
+
+ return play->actorCtx.playerImpact.dist - dist;
}
/**
@@ -1377,7 +1374,7 @@ s32 func_800B724C(PlayState* play, Actor* actor, u8 csMode) {
player->csMode = csMode;
player->unk_398 = actor;
- player->unk_3BA = 0;
+ player->doorBgCamIndex = 0;
return true;
}
@@ -1385,7 +1382,7 @@ s32 func_800B7298(PlayState* play, Actor* actor, u8 csMode) {
Player* player = GET_PLAYER(play);
if (func_800B724C(play, actor, csMode)) {
- player->unk_3BA = 1;
+ player->doorBgCamIndex = 1;
return true;
}
return false;
@@ -2303,7 +2300,7 @@ void Actor_InitContext(PlayState* play, ActorContext* actorCtx, ActorEntry* acto
actorCtx->sceneFlags.clearedRoom = cycleFlags->clearedRoom;
TitleCard_ContextInit(&play->state, &actorCtx->titleCtxt);
- func_800B6468(play);
+ Actor_InitPlayerImpact(play);
actorCtx->absoluteSpace = NULL;
@@ -2559,7 +2556,7 @@ void Actor_UpdateAll(PlayState* play, ActorContext* actorCtx) {
}
TitleCard_Update(&play->state, &actorCtx->titleCtxt);
- func_800B6474(play);
+ Actor_UpdatePlayerImpact(play);
DynaPoly_UpdateBgActorTransforms(play, &play->colCtx.dyna);
}
@@ -2577,7 +2574,7 @@ void Actor_Draw(PlayState* play, Actor* actor) {
(actor->flags & (ACTOR_FLAG_10000000 | ACTOR_FLAG_400000)) ? NULL : &actor->world.pos, play);
Lights_Draw(light, play->state.gfxCtx);
- if (actor->flags & ACTOR_FLAG_1000) {
+ if (actor->flags & ACTOR_FLAG_IGNORE_QUAKE) {
Matrix_SetTranslateRotateYXZ(actor->world.pos.x + play->mainCamera.quakeOffset.x,
actor->world.pos.y +
((actor->shape.yOffset * actor->scale.y) + play->mainCamera.quakeOffset.y),
@@ -2656,11 +2653,11 @@ void func_800B9D1C(Actor* actor) {
if (sfxId) {}
if (actor->audioFlags & 0x40) {
- func_801A1FB4(3, &actor->projectedPos, NA_BGM_MUSIC_BOX_HOUSE, 1500.0f);
+ func_801A1FB4(SEQ_PLAYER_BGM_SUB, &actor->projectedPos, NA_BGM_MUSIC_BOX_HOUSE, 1500.0f);
}
if (actor->audioFlags & 0x20) {
- func_801A1FB4(0, &actor->projectedPos, NA_BGM_KAMARO_DANCE, 900.0f);
+ func_801A1FB4(SEQ_PLAYER_BGM_MAIN, &actor->projectedPos, NA_BGM_KAMARO_DANCE, 900.0f);
}
}
@@ -3493,49 +3490,50 @@ void Enemy_StartFinishingBlow(PlayState* play, Actor* actor) {
}
// blinking routine
-s16 func_800BBAC0(s16 arg0[2], s16 arg1, s16 arg2, s16 arg3) {
- if (DECR(arg0[1]) == 0) {
- arg0[1] = Rand_S16Offset(arg1, arg2);
+s16 func_800BBAC0(BlinkInfo* info, s16 arg1, s16 arg2, s16 arg3) {
+ if (DECR(info->blinkTimer) == 0) {
+ info->blinkTimer = Rand_S16Offset(arg1, arg2);
}
- if (arg0[1] - arg3 > 0) {
- arg0[0] = 0;
- } else if ((arg0[1] - arg3 >= -1) || (arg0[1] < 2)) {
- arg0[0] = 1;
+ if (info->blinkTimer - arg3 > 0) {
+ info->eyeTexIndex = 0;
+ } else if ((info->blinkTimer - arg3 >= -1) || (info->blinkTimer < 2)) {
+ info->eyeTexIndex = 1;
} else {
- arg0[0] = 2;
+ info->eyeTexIndex = 2;
}
- return arg0[0];
+ return info->eyeTexIndex;
}
// blinking routine
-s16 func_800BBB74(s16 arg0[2], s16 arg1, s16 arg2, s16 arg3) {
- if (DECR(arg0[1]) == 0) {
- arg0[1] = Rand_S16Offset(arg1, arg2);
+s16 func_800BBB74(BlinkInfo* info, s16 arg1, s16 arg2, s16 arg3) {
+ if (DECR(info->blinkTimer) == 0) {
+ info->blinkTimer = Rand_S16Offset(arg1, arg2);
}
- if (arg0[1] - arg3 > 0) {
- arg0[0] = 0;
- } else if (arg0[1] - arg3 == 0) {
- arg0[0] = 1;
+ if (info->blinkTimer - arg3 > 0) {
+ info->eyeTexIndex = 0;
+ } else if (info->blinkTimer - arg3 == 0) {
+ info->eyeTexIndex = 1;
} else {
- arg0[0] = 2;
+ info->eyeTexIndex = 2;
}
- return arg0[0];
+ return info->eyeTexIndex;
}
// unused blinking routine
-s16 func_800BBC20(s16 arg0[2], s16 arg1, s16 arg2, s16 arg3) {
- if (DECR(arg0[1]) == 0) {
- arg0[1] = Rand_S16Offset(arg1, arg2);
- arg0[0]++;
- if ((arg0[0] % 3) == 0) {
- arg0[0] = (s32)(Rand_ZeroOne() * arg3) * 3;
+s16 func_800BBC20(BlinkInfo* info, s16 arg1, s16 arg2, s16 arg3) {
+ if (DECR(info->blinkTimer) == 0) {
+ info->blinkTimer = Rand_S16Offset(arg1, arg2);
+ info->eyeTexIndex++;
+ if ((info->eyeTexIndex % 3) == 0) {
+ info->eyeTexIndex = (s32)(Rand_ZeroOne() * arg3) * 3;
}
}
- return arg0[0];
+
+ return info->eyeTexIndex;
}
void Actor_SpawnBodyParts(Actor* actor, PlayState* play, s32 partParams, Gfx** dList) {
@@ -3617,15 +3615,15 @@ void func_800BC154(PlayState* play, ActorContext* actorCtx, Actor* actor, u8 act
// Damage flags for EnArrow
u32 sArrowDmgFlags[] = {
- DMG_FIRE_ARROW, // ENARROW_0
- DMG_NORMAL_ARROW, // ENARROW_1
- DMG_NORMAL_ARROW, // ENARROW_2
- DMG_FIRE_ARROW, // ENARROW_3
- DMG_ICE_ARROW, // ENARROW_4
- DMG_LIGHT_ARROW, // ENARROW_5
- DMG_DEKU_NUT, // ENARROW_6
- DMG_DEKU_BUBBLE, // ENARROW_7
- DMG_DEKU_NUT, // ENARROW_8
+ DMG_FIRE_ARROW, // ARROW_TYPE_NORMAL_LIT
+ DMG_NORMAL_ARROW, // ARROW_TYPE_NORMAL_HORSE
+ DMG_NORMAL_ARROW, // ARROW_TYPE_NORMAL
+ DMG_FIRE_ARROW, // ARROW_TYPE_FIRE
+ DMG_ICE_ARROW, // ARROW_TYPE_ICE
+ DMG_LIGHT_ARROW, // ARROW_TYPE_LIGHT
+ DMG_DEKU_NUT, // ARROW_TYPE_SLINGSHOT
+ DMG_DEKU_BUBBLE, // ARROW_TYPE_DEKU_BUBBLE
+ DMG_DEKU_NUT, // ARROW_TYPE_DEKU_NUT
};
u32 Actor_GetArrowDmgFlags(s32 params) {
@@ -3771,7 +3769,7 @@ void func_800BC620(Vec3f* pos, Vec3f* scale, u8 alpha, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- POLY_OPA_DISP = Gfx_CallSetupDL(POLY_OPA_DISP, 0x2C);
+ POLY_OPA_DISP = Gfx_SetupDL(POLY_OPA_DISP, SETUPDL_44);
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 0, 0, 0, alpha);
adjustedPos.x = pos->x;
@@ -3794,30 +3792,29 @@ void func_800BC620(Vec3f* pos, Vec3f* scale, u8 alpha, PlayState* play) {
CLOSE_DISPS(play->state.gfxCtx);
}
-void Actor_AddQuake(PlayState* play, s16 verticalMag, s16 countdown) {
- s16 quakeIndex = Quake_Add(&play->mainCamera, QUAKE_TYPE_3);
+void Actor_RequestQuake(PlayState* play, s16 y, s16 duration) {
+ s16 quakeIndex = Quake_Request(&play->mainCamera, QUAKE_TYPE_3);
Quake_SetSpeed(quakeIndex, 20000);
- Quake_SetQuakeValues(quakeIndex, verticalMag, 0, 0, 0);
- Quake_SetCountdown(quakeIndex, countdown);
+ Quake_SetPerturbations(quakeIndex, y, 0, 0, 0);
+ Quake_SetDuration(quakeIndex, duration);
}
-void Actor_AddQuakeWithSpeed(PlayState* play, s16 verticalMag, s16 countdown, s16 speed) {
- s16 quakeIndex = Quake_Add(&play->mainCamera, QUAKE_TYPE_3);
+void Actor_RequestQuakeWithSpeed(PlayState* play, s16 y, s16 duration, s16 speed) {
+ s16 quakeIndex = Quake_Request(&play->mainCamera, QUAKE_TYPE_3);
Quake_SetSpeed(quakeIndex, speed);
- Quake_SetQuakeValues(quakeIndex, verticalMag, 0, 0, 0);
- Quake_SetCountdown(quakeIndex, countdown);
+ Quake_SetPerturbations(quakeIndex, y, 0, 0, 0);
+ Quake_SetDuration(quakeIndex, duration);
}
-// Actor_RequestRumble?
-void func_800BC848(Actor* actor, PlayState* play, s16 y, s16 countdown) {
- if (y >= 5) {
+void Actor_RequestQuakeAndRumble(Actor* actor, PlayState* play, s16 quakeY, s16 quakeDuration) {
+ if (quakeY >= 5) {
Rumble_Request(actor->xyzDistToPlayerSq, 255, 20, 150);
} else {
Rumble_Request(actor->xyzDistToPlayerSq, 180, 20, 100);
}
- Actor_AddQuake(play, y, countdown);
+ Actor_RequestQuake(play, quakeY, quakeDuration);
}
typedef struct {
@@ -4376,26 +4373,30 @@ Gfx* func_800BD9A0(GraphicsContext* gfxCtx) {
void func_800BD9E0(PlayState* play, SkelAnime* skelAnime, OverrideLimbDraw overrideLimbDraw, PostLimbDraw postLimbDraw,
Actor* actor, s16 alpha) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, alpha);
gSPSegment(POLY_OPA_DISP++, 0x0C, gEmptyDL);
POLY_OPA_DISP = SkelAnime_DrawFlex(play, skelAnime->skeleton, skelAnime->jointTable, skelAnime->dListCount,
overrideLimbDraw, postLimbDraw, actor, POLY_OPA_DISP);
+
CLOSE_DISPS(play->state.gfxCtx);
}
void func_800BDAA0(PlayState* play, SkelAnime* skelAnime, OverrideLimbDraw overrideLimbDraw, PostLimbDraw postLimbDraw,
Actor* actor, s16 alpha) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gDPSetEnvColor(POLY_XLU_DISP++, 0, 0, 0, alpha);
gSPSegment(POLY_XLU_DISP++, 0x0C, func_800BD9A0(play->state.gfxCtx));
POLY_XLU_DISP = SkelAnime_DrawFlex(play, skelAnime->skeleton, skelAnime->jointTable, skelAnime->dListCount,
overrideLimbDraw, postLimbDraw, actor, POLY_XLU_DISP);
+
CLOSE_DISPS(play->state.gfxCtx);
}
@@ -4480,7 +4481,7 @@ s32 func_800BE184(PlayState* play, Actor* actor, f32 xzDist, s16 arg3, s16 arg4,
s16 phi_v0 = BINANG_SUB(BINANG_ROT180(actor->yawTowardsPlayer), player->actor.shape.rot.y);
s16 temp_t0 = actor->yawTowardsPlayer - arg5;
- if ((actor->xzDistToPlayer <= xzDist) && (player->meleeWeaponState != 0)) {
+ if ((actor->xzDistToPlayer <= xzDist) && (player->meleeWeaponState != PLAYER_MELEE_WEAPON_STATE_0)) {
if ((arg4 >= ABS_ALT(phi_v0)) && (arg3 >= ABS_ALT(temp_t0))) {
return true;
}
@@ -4657,7 +4658,7 @@ void Actor_DrawDamageEffects(PlayState* play, Actor* actor, Vec3f limbPos[], s16
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
switch (type) {
case ACTOR_DRAW_DMGEFF_FROZEN_NO_SFX:
diff --git a/src/code/z_camera.c b/src/code/z_camera.c
index f54fc93da..89b148942 100644
--- a/src/code/z_camera.c
+++ b/src/code/z_camera.c
@@ -1,22 +1,96 @@
+/**
+ * @file camera.c
+ * Implements the camera system. Camera functionality depends on the current combination of
+ * setting and mode.
+ *
+ * When working with the camera, you should be familiar with MM's coordinate system.
+ * Relative to the camera, the coordinate system follows the right hand rule:
+ * +X points right.
+ * +Y points up.
+ * +Z points out of the screen.
+ *
+ * You should also be familiar with Euler angles: 'pitch', 'yaw', and 'roll'.
+ * pitch: rotation about the X-axis, measured from +Y.
+ * Unlike yaw and roll, pitch is bounded in +-0x4000 (90 degrees).
+ * Pitch is 0 when the camera points parallel to the xz-plane (+Y points straight up).
+ *
+ * yaw: rotation about the Y-axis, measured from (absolute) +Z.
+ * Positive yaw rotates clockwise, towards +X.
+ *
+ * roll: rotation about the Z-axis, measured from the camera's right direction.
+ * Unfortunately, it's weird: For some reason, roll is flipped. Positive roll makes the camera
+ * rotate counterclockwise, which means the WORLD rotates clockwise. Luckily roll is rarely
+ * used.
+ *
+ * Remember the right hand rule: make a thumbs-up with your right hand, stick your thumb in the
+ * +direction (except for roll), and the angle follows the rotation of your curled fingers.
+ *
+ * Illustrations:
+ * Following the right hand rule, each hidden axis's positive direction points out of the screen.
+ *
+ * YZ-Plane (pitch) XZ-Plane (yaw) XY-Plane (roll -- Note flipped)
+ * +Y -Z +Y
+ * ^ ^ (into the ^
+ * --|-- | screen) |<-
+ * +pitch / | \ -pitch | | \ -roll
+ * v | v | | |
+ * +Z <------O------> -Z -X <------O------> +X -X <------O------> +X
+ * | ^ | ^ | |
+ * | \ | / | / +roll
+ * | -yaw --|-- +yaw |<-
+ * v v v
+ * -Y +Z -Y
+ *
+ */
#include "global.h"
#include "z64quake.h"
#include "z64shrink_window.h"
#include "z64view.h"
+#include "overlays/actors/ovl_En_Horse/z_en_horse.h"
+
+void func_800DDFE0(Camera* camera);
+s32 Camera_ChangeMode(Camera* camera, s16 mode);
+s16 Camera_ChangeSettingFlags(Camera* camera, s16 setting, s16 flags);
+s16 Camera_UnsetStateFlag(Camera* camera, s16 flags);
#include "z_camera_data.inc.c"
-// BSS
-s16 D_801EDBF0;
-f32 D_801EDBF4;
-f32 D_801EDBF8;
-CameraCollision D_801EDC00;
-
PlayState* sCamPlayState;
SwingAnimation D_801EDC30[4];
Vec3f D_801EDDD0;
Vec3f D_801EDDE0;
Vec3f D_801EDDF0;
+// Camera will reload its paramData. Usually that means setting the read-only data from what is stored in
+// CameraModeValue arrays. Although sometimes some read-write data is reset as well
+#define RELOAD_PARAMS(camera) ((camera->animState == 0) || (camera->animState == 10) || (camera->animState == 20))
+
+/**
+ * Camera data is stored in both read-only data and OREG as s16, and then converted to the appropriate type during
+ * runtime. If a small f32 is being stored as an s16, it is common to store that value 100 times larger than the
+ * original value. This is then scaled back down during runtime with the CAM_RODATA_UNSCALE macro.
+ */
+#define CAM_RODATA_SCALE(x) ((x)*100.0f)
+#define CAM_RODATA_UNSCALE(x) ((x)*0.01f)
+
+// Load the next value from camera read-only data stored in CameraModeValue
+#define GET_NEXT_RO_DATA(values) ((values++)->val)
+// Load the next value and scale down from camera read-only data stored in CameraModeValue
+#define GET_NEXT_SCALED_RO_DATA(values) CAM_RODATA_UNSCALE(GET_NEXT_RO_DATA(values))
+
+// Camera bg surface flags
+#define FLG_ADJSLOPE (1 << 0)
+#define FLG_OFFGROUND (1 << 7)
+
+#define CAM_CHANGE_SETTING_0 (1 << 0)
+#define CAM_CHANGE_SETTING_1 (1 << 1)
+#define CAM_CHANGE_SETTING_2 (1 << 2)
+#define CAM_CHANGE_SETTING_3 (1 << 3)
+
+/*===============================================================*/
+/* Camera Internal Functions */
+/*===============================================================*/
+
/**
* Returns the absolute value for floats
*/
@@ -81,47 +155,63 @@ f32 Camera_QuadraticAttenuation(f32 xRange, f32 x) {
return y;
}
-/*
- * Performs linear interpoloation between `cur` and `target`. If `cur` is within
- * `minDiff` units, the result is rounded up to `target`
+/**
+ * @param[in] target target value
+ * @param[in] cur current value
+ * @param[in] stepScale fraction of (target - cur) to step towards target
+ * @param[in] minDiff minimum value of (target - cur) perform a step. Otherwise, return `target`
+ *
+ * @return new current value
*/
-f32 Camera_LerpCeilF(f32 target, f32 cur, f32 stepScale, f32 minDiff) {
+f32 Camera_ScaledStepToCeilF(f32 target, f32 cur, f32 stepScale, f32 minDiff) {
f32 diff = target - cur;
f32 step = diff * stepScale;
return (Camera_fabsf(diff) >= minDiff) ? cur + step : target;
}
-/*
- * Performs linear interpoloation between `cur` and `target`. If `cur` is within
- * `minDiff` units, the result is rounded up to `target`
+/**
+ * @param[in] target target value
+ * @param[in] cur current value
+ * @param[in] stepScale fraction of (target - cur) to step towards target
+ * @param[in] minDiff minimum value of (target - cur) perform a step. Otherwise, return `target`
+ *
+ * @return new current value
*/
-s16 Camera_LerpCeilS(s16 target, s16 cur, f32 stepScale, s16 minDiff) {
+s16 Camera_ScaledStepToCeilS(s16 target, s16 cur, f32 stepScale, s16 minDiff) {
s16 diff = target - cur;
s16 step = diff * stepScale + 0.5f;
return (ABS(diff) >= minDiff) ? cur + step : target;
}
-/*
- * Performs linear interpoloation between `cur` and `target`. If `cur` is within
- * `minDiff` units, the result is rounded down to `cur`
+/**
+ * @param[in] target target value
+ * @param[in] cur current value
+ * @param[in] stepScale fraction of (target - cur) to step towards target
+ * @param[in] minDiff minimum value of (target - cur) perform a step. Otherwise, return `current`
+ *
+ * @return new current value
*/
-s16 Camera_LerpFloorS(s16 target, s16 cur, f32 stepScale, s16 minDiff) {
+s16 Camera_ScaledStepToFloorS(s16 target, s16 cur, f32 stepScale, s16 minDiff) {
s16 diff = target - cur;
s16 step = diff * stepScale + 0.5f;
return (ABS(diff) >= minDiff) ? cur + step : cur;
}
-/*
- * Performs linear interpoloation between `cur` and `target`. If `cur` is within
- * `minDiff` units, the result is rounded up to `target`. Output is written to `cur`
+/**
+ * @param[in] target target value
+ * @param[in] cur current value
+ * @param[in] stepScale fraction of (target - cur) to step towards target
+ * @param[in] minDiff minimum value of (target - cur) perform a step. Otherwise, return `target`
+ *
+ * @return new current value
*/
-void Camera_LerpCeilVec3f(Vec3f* target, Vec3f* cur, f32 xzStepScale, f32 yStepScale, f32 minDiff) {
- cur->x = Camera_LerpCeilF(target->x, cur->x, xzStepScale, minDiff);
- cur->y = Camera_LerpCeilF(target->y, cur->y, yStepScale, minDiff);
- cur->z = Camera_LerpCeilF(target->z, cur->z, xzStepScale, minDiff);
+void Camera_ScaledStepToCeilVec3f(Vec3f* target, Vec3f* cur, f32 xzStepScale, f32 yStepScale, f32 minDiff) {
+ cur->x = Camera_ScaledStepToCeilF(target->x, cur->x, xzStepScale, minDiff);
+ cur->y = Camera_ScaledStepToCeilF(target->y, cur->y, yStepScale, minDiff);
+ cur->z = Camera_ScaledStepToCeilF(target->z, cur->z, xzStepScale, minDiff);
}
void Camera_SetUpdateRatesFastPitch(Camera* camera) {
@@ -149,14 +239,11 @@ void Camera_SetUpdateRatesSlow(Camera* camera) {
camera->rUpdateRateInv = 1800.0f;
camera->yawUpdateRateInv = 1800.0f;
camera->pitchUpdateRateInv = 1800.0f;
- camera->yOffsetUpdateRate = 0.01;
- camera->xzOffsetUpdateRate = 0.01;
- camera->fovUpdateRate = 0.01;
+ camera->yOffsetUpdateRate = 0.01f;
+ camera->xzOffsetUpdateRate = 0.01f;
+ camera->fovUpdateRate = 0.01f;
}
-/**
- * Converts a 3D s16 vector into a 3D f32 vector
- */
Vec3f* Camera_Vec3sToVec3f(Vec3f* dest, Vec3s* src) {
Vec3f copy;
@@ -176,29 +263,29 @@ s16 Camera_AngleDiffAndScale(s16 angle1, s16 angle2, f32 scale) {
}
/**
- * Calculates the current offset between the camera's at-coordinates and the centered actor's coordinates
+ * Calculates the current offset between the camera's at-coordinates and the focal actors coordinates
*/
-void Camera_UpdateAtActorOffset(Camera* camera, Vec3f* actorOffset) {
- camera->atActorOffset.x = camera->at.x - actorOffset->x;
- camera->atActorOffset.y = camera->at.y - actorOffset->y;
- camera->atActorOffset.z = camera->at.z - actorOffset->z;
+void Camera_SetFocalActorAtOffset(Camera* camera, Vec3f* focalActorPos) {
+ camera->focalActorAtOffset.x = camera->at.x - focalActorPos->x;
+ camera->focalActorAtOffset.y = camera->at.y - focalActorPos->y;
+ camera->focalActorAtOffset.z = camera->at.z - focalActorPos->z;
}
f32 Camera_GetFocalActorHeight(Camera* camera) {
- PosRot actorFocus;
+ PosRot focalActorFocus;
Actor* focalActor = camera->focalActor;
- f32 focalHeight;
+ f32 focalActorHeight;
if (focalActor == &GET_PLAYER(camera->play)->actor) {
- focalHeight = Player_GetHeight((Player*)focalActor);
+ focalActorHeight = Player_GetHeight((Player*)focalActor);
} else {
- Actor_GetFocus(&actorFocus, focalActor);
- focalHeight = actorFocus.pos.y - camera->focalActorPosRot.pos.y;
- if (focalHeight == 0.0f) {
- focalHeight = 10.0f;
+ Actor_GetFocus(&focalActorFocus, focalActor);
+ focalActorHeight = focalActorFocus.pos.y - camera->focalActorPosRot.pos.y;
+ if (focalActorHeight == 0.0f) {
+ focalActorHeight = 10.0f;
}
}
- return focalHeight;
+ return focalActorHeight;
}
f32 Camera_GetRunSpeedLimit(Camera* camera) {
@@ -223,6 +310,7 @@ s32 func_800CB7CC(Camera* camera) {
return 0;
}
}
+
s32 Camera_IsMountedOnHorse(Camera* camera) {
Actor* focalActor = camera->focalActor;
@@ -310,7 +398,7 @@ s32 func_800CB950(Camera* camera) {
f32 yDiff;
if (camera->focalActor == &GET_PLAYER(camera->play)->actor) {
- yDiff = Camera_fabsf(camera->focalActorPosRot.pos.y - camera->playerFloorHeight);
+ yDiff = Camera_fabsf(camera->focalActorPosRot.pos.y - camera->focalActorFloorHeight);
phi_v0 = false;
if (yDiff < 11.0f) {
@@ -377,13 +465,13 @@ s32 func_800CBA7C(Camera* camera) {
}
}
-s32 func_800CBAAC(Camera* camera) {
+PlayerMeleeWeaponState func_800CBAAC(Camera* camera) {
Actor* focalActor = camera->focalActor;
if (camera->focalActor == &GET_PLAYER(camera->play)->actor) {
return ((Player*)focalActor)->meleeWeaponState;
} else {
- return 0;
+ return PLAYER_MELEE_WEAPON_STATE_0;
}
}
@@ -418,13 +506,13 @@ s32 func_800CBB88(Camera* camera) {
Actor* focalActor = camera->focalActor;
if (camera->focalActor == &GET_PLAYER(camera->play)->actor) {
- if ((((Player*)focalActor)->meleeWeaponState != 0) &&
+ if ((((Player*)focalActor)->meleeWeaponState != PLAYER_MELEE_WEAPON_STATE_0) &&
(((Player*)focalActor)->meleeWeaponAnimation == PLAYER_MWA_GORON_PUNCH_BUTT)) {
return 3;
}
if ((((Player*)focalActor)->stateFlags2 & PLAYER_STATE2_20000) ||
- ((((Player*)focalActor)->meleeWeaponState != 0) &&
+ ((((Player*)focalActor)->meleeWeaponState != PLAYER_MELEE_WEAPON_STATE_0) &&
(((Player*)focalActor)->meleeWeaponAnimation == PLAYER_MWA_ZORA_PUNCH_KICK))) {
return 1;
}
@@ -444,7 +532,7 @@ s32 Camera_IsUsingZoraFins(Camera* camera) {
}
s32 func_800CBC30(Camera* camera, f32 waterYMax, f32 waterYMin) {
- if ((camera->playerFloorHeight != camera->waterYPos) && (camera->waterYPos < waterYMax) &&
+ if ((camera->focalActorFloorHeight != camera->waterYPos) && (camera->waterYPos < waterYMax) &&
(camera->waterYPos > waterYMin)) {
return true;
} else {
@@ -452,23 +540,258 @@ s32 func_800CBC30(Camera* camera, f32 waterYMax, f32 waterYMin) {
}
}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CBC84.s")
+s32 func_800CBC84(Camera* camera, Vec3f* from, CameraCollision* to, s32 arg3) {
+ CollisionContext* colCtx = &camera->play->colCtx;
+ Vec3f toNewPos;
+ Vec3f toPoint;
+ Vec3f fromToNorm;
+ f32 floorPolyY;
+ CollisionPoly** floorPoly;
+ s32 floorBgId;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CBFA4.s")
+ OLib_Vec3fDistNormalize(&fromToNorm, from, &to->pos);
+ toPoint.x = to->pos.x + fromToNorm.x;
+ toPoint.y = to->pos.y + fromToNorm.y;
+ toPoint.z = to->pos.z + fromToNorm.z;
+ floorPoly = &to->poly;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CC000.s")
+ if (!BgCheck_CameraLineTest1(colCtx, from, &toPoint, &toNewPos, floorPoly, (arg3 & 1) ? 0 : 1, 1,
+ (arg3 & 2) ? 0 : 1, -1, &floorBgId)) {
+ toNewPos = to->pos;
+ //! FAKE
+ if (1) {}
+ if (1) {}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CC128.s")
+ toNewPos.y += 5.0f;
+ if ((arg3 != 0) && func_800CB7CC(camera)) {
+ to->poly = camera->focalActor->floorPoly;
+ floorBgId = camera->focalActor->floorBgId;
+ to->norm.x = COLPOLY_GET_NORMAL(to->poly->normal.x);
+ to->norm.y = COLPOLY_GET_NORMAL(to->poly->normal.y);
+ to->norm.z = COLPOLY_GET_NORMAL(to->poly->normal.z);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CC1C4.s")
+ if (!Math3D_LineSegVsPlane(to->norm.x, to->norm.y, to->norm.z, to->poly->dist, from, &toPoint, &toNewPos,
+ 1)) {
+ floorPolyY = to->pos.y - 20.0f;
+ } else {
+ toNewPos.y += 5.0f;
+ floorPolyY = to->pos.y;
+ }
+ } else {
+ floorPolyY = BgCheck_CameraRaycastFloor2(colCtx, floorPoly, &floorBgId, &toNewPos);
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CC260.s")
+ if ((to->pos.y - floorPolyY) > 5.0f) {
+ to->norm.x = -fromToNorm.x;
+ to->norm.y = -fromToNorm.y;
+ to->norm.z = -fromToNorm.z;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CC488.s")
+ return 0;
+ }
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CC56C.s")
+ to->bgId = floorBgId;
+ to->norm.x = COLPOLY_GET_NORMAL(to->poly->normal.x);
+ to->norm.y = COLPOLY_GET_NORMAL(to->poly->normal.y);
+ to->norm.z = COLPOLY_GET_NORMAL(to->poly->normal.z);
+ to->pos.x = to->norm.x + toNewPos.x;
+ to->pos.y = to->norm.y + toNewPos.y;
+ to->pos.z = to->norm.z + toNewPos.z;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CC5C8.s")
+ return floorBgId + 1;
+}
+
+void func_800CBFA4(Camera* camera, Vec3f* arg1, Vec3f* arg2, s32 arg3) {
+ CameraCollision sp20;
+ s32 pad;
+
+ sp20.pos = *arg2;
+ func_800CBC84(camera, arg1, &sp20, arg3);
+ *arg2 = sp20.pos;
+}
+
+/**
+ * Detects the collision poly between `from` and `to`, places collision info in `to`
+ */
+s32 Camera_BgCheckInfo(Camera* camera, Vec3f* from, CameraCollision* to) {
+ CollisionPoly* floorPoly;
+ Vec3f toNewPos;
+ Vec3f fromToNorm;
+
+ if (BgCheck_CameraLineTest1(&camera->play->colCtx, from, &to->pos, &toNewPos, &to->poly, 1, 1, 1, -1, &to->bgId)) {
+ floorPoly = to->poly;
+ to->norm.x = COLPOLY_GET_NORMAL(floorPoly->normal.x);
+ to->norm.y = COLPOLY_GET_NORMAL(floorPoly->normal.y);
+ to->norm.z = COLPOLY_GET_NORMAL(floorPoly->normal.z);
+ to->pos = toNewPos;
+
+ return to->bgId + 1;
+ }
+
+ OLib_Vec3fDistNormalize(&fromToNorm, from, &to->pos);
+ to->norm.x = -fromToNorm.x;
+ to->norm.y = -fromToNorm.y;
+ to->norm.z = -fromToNorm.z;
+
+ return 0;
+}
+
+/**
+ * Detects if there is collision between `from` and `to`
+ */
+s32 Camera_BgCheck(Camera* camera, Vec3f* from, Vec3f* to) {
+ CollisionContext* colCtx = &camera->play->colCtx;
+ Vec3f intersect;
+ s32 bgId;
+ CollisionPoly* poly = NULL;
+
+ if (BgCheck_CameraLineTest1(colCtx, from, to, &intersect, &poly, 1, 1, 1, -1, &bgId)) {
+ *to = intersect;
+ return true;
+ }
+
+ return false;
+}
+
+/**
+ * Checks if `from` to `to` is looking from the outside of a poly towards the front
+ */
+s32 Camera_CheckOOB(Camera* camera, Vec3f* from, Vec3f* to) {
+ s32 pad;
+ Vec3f intersect;
+ s32 pad2;
+ s32 bgId;
+ CollisionPoly* poly;
+ CollisionContext* colCtx = &camera->play->colCtx;
+
+ poly = NULL;
+ if ((BgCheck_CameraLineTest1(colCtx, from, to, &intersect, &poly, 1, 1, 1, 0, &bgId)) &&
+ (CollisionPoly_GetPointDistanceFromPlane(poly, from) < 0.0f)) {
+ return true;
+ }
+
+ return false;
+}
+
+s16 func_800CC260(Camera* camera, Vec3f* arg1, Vec3f* arg2, VecGeo* arg3, Actor** exclusions, s16 numExclusions) {
+ VecGeo sp90;
+ s32 ret;
+ s32 angleCount;
+ f32 rand;
+ PosRot playerFocus;
+ Vec3f sp64;
+ Player* player = GET_PLAYER(camera->play);
+ s32 i;
+
+ sp64 = *arg2;
+ Actor_GetFocus(&playerFocus, &player->actor); // playerFocus unused
+ sp90 = *arg3;
+
+ angleCount = ARRAY_COUNT(D_801B9E18);
+
+ for (i = 0; i < angleCount; i++) {
+ OLib_AddVecGeoToVec3f(arg1, arg2, &sp90);
+
+ if (!Camera_CheckOOB(camera, arg1, &sp64) && !func_800CBC30(camera, arg2->y, arg1->y) &&
+ !CollisionCheck_LineOCCheck(camera->play, &camera->play->colChkCtx, arg2, arg1, exclusions,
+ numExclusions)) {
+ break;
+ }
+
+ sp90.yaw = D_801B9E18[i] + arg3->yaw;
+ rand = Rand_ZeroOne();
+ sp90.pitch = D_801B9E34[i] + (s16)(arg3->pitch * rand);
+
+ if (sp90.pitch > 0x36B0) { // 76.9 degrees
+ sp90.pitch -= 0x3E80; // -87.9 degrees
+ }
+ if (sp90.pitch < -0x36B0) { // -76.9 degrees
+ sp90.pitch += 0x3A98; // 82.4 degrees
+ }
+
+ sp90.r *= 0.9f;
+ sp64 = *arg2;
+ }
+
+ *arg3 = sp90;
+
+ if (i == angleCount) {
+ ret = -1;
+ } else {
+ ret = i;
+ }
+
+ return ret;
+}
+
+/**
+ * Gets the floor position underneath `chkPos`, and returns the normal of the floor to `floorNorm`,
+ * and bgId to `bgId`. If no floor is found, then the normal is a flat surface pointing upwards.
+ */
+f32 Camera_GetFloorYNorm(Camera* camera, Vec3f* floorNorm, Vec3f* chkPos, s32* bgId) {
+ CollisionContext* colCtx = &camera->play->colCtx;
+ CollisionPoly* floorPoly;
+ f32 floorY = BgCheck_EntityRaycastFloor3(colCtx, &floorPoly, bgId, chkPos);
+
+ if (floorY == BGCHECK_Y_MIN) {
+ // no floor
+ floorNorm->x = 0.0f;
+ floorNorm->y = 1.0f;
+ floorNorm->z = 0.0f;
+ } else {
+ floorNorm->x = COLPOLY_GET_NORMAL(floorPoly->normal.x);
+ floorNorm->y = COLPOLY_GET_NORMAL(floorPoly->normal.y);
+ floorNorm->z = COLPOLY_GET_NORMAL(floorPoly->normal.z);
+ }
+
+ return floorY;
+}
+
+/**
+ * Gets the position of the floor from `pos`
+ */
+f32 Camera_GetFloorY(Camera* camera, Vec3f* pos) {
+ Vec3f posCheck;
+ Vec3f floorNorm;
+ s32 bgId;
+
+ posCheck = *pos;
+ posCheck.y += 80.0f;
+
+ return Camera_GetFloorYNorm(camera, &floorNorm, &posCheck, &bgId);
+}
+
+/**
+ * Gets the position of the floor from `pos`, and if the floor is considered not solid,
+ * it checks the next floor below that. Returns the normal of the floor into `norm`
+ */
+f32 Camera_GetFloorYLayer(Camera* camera, Vec3f* norm, Vec3f* pos, s32* bgId) {
+ CollisionPoly* floorPoly;
+ CollisionContext* colCtx = &camera->play->colCtx;
+ f32 floorY;
+
+ if (camera->focalActor != NULL) {
+ floorY = BgCheck_EntityRaycastFloor5_3(camera->play, &camera->play->colCtx, &floorPoly, bgId,
+ camera->focalActor, pos);
+ } else {
+ floorY = BgCheck_CameraRaycastFloor2(colCtx, &floorPoly, bgId, pos);
+ }
+
+ if ((floorY == BGCHECK_Y_MIN) ||
+ ((camera->focalActorFloorHeight < floorY) && !(COLPOLY_GET_NORMAL(floorPoly->normal.y) > 0.5f))) {
+ // no floor, or player is below the floor and floor is not considered steep
+ norm->x = 0.0f;
+ norm->y = 1.0f;
+ norm->z = 0.0f;
+ floorY = BGCHECK_Y_MIN;
+ } else {
+ norm->x = COLPOLY_GET_NORMAL(floorPoly->normal.x);
+ norm->y = COLPOLY_GET_NORMAL(floorPoly->normal.y);
+ norm->z = COLPOLY_GET_NORMAL(floorPoly->normal.z);
+ }
+
+ return floorY;
+}
#define CAM_DATA_IS_BG (1 << 12) // if not set, then cam data is for actor cutscenes
@@ -543,163 +866,5087 @@ s32 Camera_GetWaterBoxBgCamSetting(Camera* camera, f32* waterY) {
return (camSetting == CAM_SET_NONE) ? -2 : camSetting;
}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CC938.s")
+void func_800CC938(Camera* camera) {
+ func_800DDFE0(camera);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CC958.s")
+/**
+ * Calculates the angle between points `from` and `to`
+ */
+s16 Camera_CalcXZAngle(Vec3f* to, Vec3f* from) {
+ return CAM_DEG_TO_BINANG(RAD_TO_DEG(func_80086B30(from->x - to->x, from->z - to->z)));
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CC9C0.s")
+// BSS
+s16 D_801EDBF0;
-s32 D_801B9E5C = 0;
-f32 D_801B9E60 = 0.0f;
+/**
+ * Calculates a pitch adjustment by sampling a position in front of the focal actor and testing the floor height.
+ * Used to detect if the focal actor is near a slope, edge, or cliff.
+ *
+ * @param camera
+ * @param viewYaw The yaw the camera is facing, gives a direction to sample a position
+ * @param shouldInit
+ *
+ * @return pitchOffset resulting pitch adjustment
+ */
+s16 Camera_GetPitchAdjFromFloorHeightDiffs(Camera* camera, s16 viewYaw, s16 shouldInit) {
+ static f32 sFloorYNear;
+ static f32 sFloorYFar;
+ static CameraCollision sFarColChk;
+ Vec3f focalActorPos;
+ Vec3f nearPos;
+ Vec3f floorNorm;
+ f32 checkOffsetY;
+ s16 pitchNear;
+ s16 pitchFar;
+ f32 floorYDiffFar;
+ f32 viewForwardsUnitX;
+ f32 viewForwardsUnitZ;
+ s32 bgId;
+ f32 nearDist;
+ f32 farDist;
+ f32 floorYDiffNear;
+ f32 focalActorHeight;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CCCEC.s")
+ viewForwardsUnitX = Math_SinS(viewYaw);
+ viewForwardsUnitZ = Math_CosS(viewYaw);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CD04C.s")
+ focalActorHeight = Camera_GetFocalActorHeight(camera);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CD288.s")
+ checkOffsetY = focalActorHeight * 1.2f;
+ nearDist = focalActorHeight * 1.0f;
+ farDist = focalActorHeight * 2.5f;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CD2E0.s")
+ focalActorPos.x = camera->focalActorPosRot.pos.x;
+ focalActorPos.y = camera->focalActorFloorHeight + checkOffsetY;
+ focalActorPos.z = camera->focalActorPosRot.pos.z;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CD2F0.s")
+ nearPos.x = focalActorPos.x + (nearDist * viewForwardsUnitX);
+ nearPos.y = focalActorPos.y;
+ nearPos.z = focalActorPos.z + (nearDist * viewForwardsUnitZ);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CD3E4.s")
+ if (shouldInit || ((camera->play->state.frames % 2) == 0)) {
+ sFarColChk.pos.x = focalActorPos.x + (farDist * viewForwardsUnitX);
+ sFarColChk.pos.y = focalActorPos.y;
+ sFarColChk.pos.z = focalActorPos.z + (farDist * viewForwardsUnitZ);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CD44C.s")
+ Camera_BgCheckInfo(camera, &focalActorPos, &sFarColChk);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CD634.s")
+ if (shouldInit) {
+ sFloorYNear = sFloorYFar = camera->focalActorFloorHeight;
+ }
+ } else {
+ farDist = OLib_Vec3fDistXZ(&focalActorPos, &sFarColChk.pos);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CD6CC.s")
+ sFarColChk.pos.x += sFarColChk.norm.x * 5.0f;
+ sFarColChk.pos.y += sFarColChk.norm.y * 5.0f;
+ sFarColChk.pos.z += sFarColChk.norm.z * 5.0f;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CD6F8.s")
+ if (nearDist > farDist) {
+ nearDist = farDist;
+ sFloorYNear = sFloorYFar = Camera_GetFloorYLayer(camera, &floorNorm, &sFarColChk.pos, &bgId);
+ } else {
+ sFloorYNear = Camera_GetFloorYLayer(camera, &floorNorm, &nearPos, &bgId);
+ sFloorYFar = Camera_GetFloorYLayer(camera, &floorNorm, &sFarColChk.pos, &bgId);
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CD834.s")
+ if (sFloorYNear == BGCHECK_Y_MIN) {
+ sFloorYNear = camera->focalActorFloorHeight;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CDA14.s")
+ if (sFloorYFar == BGCHECK_Y_MIN) {
+ sFloorYFar = sFloorYNear;
+ }
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CDB6C.s")
+ floorYDiffNear = (sFloorYNear - camera->focalActorFloorHeight) * 0.8f;
+ floorYDiffFar = (sFloorYFar - camera->focalActorFloorHeight) * (20.0f * 0.01f);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CDE6C.s")
+ pitchNear = CAM_DEG_TO_BINANG(RAD_TO_DEG(func_80086B30(floorYDiffNear, nearDist)));
+ pitchFar = CAM_DEG_TO_BINANG(RAD_TO_DEG(func_80086B30(floorYDiffFar, farDist)));
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CE2B8.s")
+ return pitchNear + pitchFar;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CE5E0.s")
+f32 func_800CCCEC(Camera* camera, s16 reset) {
+ static s32 D_801B9E5C = 0;
+ static f32 D_801B9E60 = 0.0f;
+ Vec3f offsetForwards;
+ Vec3f angledOffsetForwards;
+ PosRot focalActorPosRot;
+ CameraCollision camCollision;
+ f32 forwardsUnitZ;
+ f32 focalActorHeight;
+ f32 forwardsUnitX;
+ f32 distResult;
+ s16 yawForwardsOffset;
+ f32 distResultAdj;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CE79C.s")
+ focalActorHeight = Camera_GetFocalActorHeight(camera);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CE930.s")
+ if (reset) {
+ D_801B9E5C = 0;
+ D_801B9E60 = 0.0f;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CEAD8.s")
+ focalActorPosRot = camera->focalActorPosRot;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CEC38.s")
+ forwardsUnitX = Math_SinS(focalActorPosRot.rot.y);
+ forwardsUnitZ = Math_CosS(focalActorPosRot.rot.y);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CED90.s")
+ offsetForwards.x = focalActorPosRot.pos.x + (30.0f * forwardsUnitX);
+ offsetForwards.y = focalActorPosRot.pos.y + focalActorHeight;
+ offsetForwards.z = focalActorPosRot.pos.z + (30.0f * forwardsUnitZ);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Noop.s")
+ camCollision.pos.x = focalActorPosRot.pos.x + (12.0f * forwardsUnitX);
+ camCollision.pos.y = offsetForwards.y;
+ camCollision.pos.z = focalActorPosRot.pos.z + (12.0f * forwardsUnitZ);
+ if ((camera->play->state.frames % 2) != 0) {
+ // Turn and project 65.92 degrees left
+ yawForwardsOffset = focalActorPosRot.rot.y + DEG_TO_BINANG(65.92f);
+
+ angledOffsetForwards.x = (Math_SinS(yawForwardsOffset) * 50.0f) + offsetForwards.x;
+ angledOffsetForwards.y = offsetForwards.y;
+ angledOffsetForwards.z = (Math_CosS(yawForwardsOffset) * 50.0f) + offsetForwards.z;
+
+ if ((Camera_BgCheckInfo(camera, &angledOffsetForwards, &camCollision) != 0) &&
+ Camera_CheckOOB(camera, &offsetForwards, &angledOffsetForwards)) {
+ // Always going to result in 28.0f?
+ distResult = OLib_Vec3fDistXZ(&offsetForwards, &camCollision.pos);
+
+ // (-D_801B9E60 < (50.0f - distResult))
+ if (!((D_801B9E5C == 2) && (-D_801B9E60 >= (50.0f - distResult)))) {
+ D_801B9E5C = 1;
+ distResult = 50.0f - distResult; // 22.0f
+ D_801B9E60 = distResult;
+
+ // if (distResult == 0.0f)
+ if (distResult == -distResult) {
+ distResultAdj = 0.0f;
+ } else {
+ distResultAdj = distResult;
+ }
+
+ return distResultAdj;
+ }
+ }
+ } else {
+ // Turn and project 90 degrees right
+ yawForwardsOffset = focalActorPosRot.rot.y - DEG_TO_BINANG(90);
+
+ angledOffsetForwards.x = (Math_SinS(yawForwardsOffset) * 50.0f) + offsetForwards.x;
+ angledOffsetForwards.y = offsetForwards.y;
+ angledOffsetForwards.z = (Math_CosS(yawForwardsOffset) * 50.0f) + offsetForwards.z;
+
+ if ((Camera_BgCheckInfo(camera, &angledOffsetForwards, &camCollision) != 0) &&
+ Camera_CheckOOB(camera, &offsetForwards, &angledOffsetForwards)) {
+ // Always going to result in 28.0f?
+ distResult = OLib_Vec3fDistXZ(&offsetForwards, &camCollision.pos);
+
+ if (!((D_801B9E5C == 1) && (D_801B9E60 >= -(distResult - 50.0f)))) {
+ D_801B9E5C = 2;
+ distResult = distResult - 50.0f;
+ D_801B9E60 = distResult;
+ if (distResult == -distResult) {
+ distResultAdj = 0.0f;
+ } else {
+ distResultAdj = distResult;
+ }
+ return distResultAdj;
+ }
+ }
+ }
+
+ if (D_801B9E5C != 0) {
+ distResult = D_801B9E60;
+ } else {
+ distResult = 0.0f;
+ }
+
+ D_801B9E5C = 0;
+ D_801B9E60 = 0.0f;
+
+ return distResult;
+}
+
+/**
+ * Calculates a new Up vector from the pitch, yaw, roll
+ */
+Vec3f* Camera_CalcUpVec(Vec3f* viewUp, s16 pitch, s16 yaw, s16 roll) {
+ f32 sinP = Math_SinS(pitch);
+ f32 cosP = Math_CosS(pitch);
+ f32 sinY = Math_SinS(yaw);
+ f32 cosY = Math_CosS(yaw);
+ f32 sinR = Math_SinS(-roll);
+ f32 cosR = Math_CosS(-roll);
+ Vec3f up;
+ Vec3f baseUp;
+ Vec3f u;
+ Vec3f rollMtxRow1;
+ Vec3f rollMtxRow2;
+ Vec3f rollMtxRow3;
+ f32 pad;
+
+ // Axis to roll around
+ u.x = cosP * sinY;
+ u.y = sinP;
+ u.z = cosP * cosY;
+
+ // Matrix to apply the roll to the Up vector without roll
+ rollMtxRow1.x = ((1.0f - SQ(u.x)) * cosR) + SQ(u.x);
+ rollMtxRow1.y = ((u.x * u.y) * (1.0f - cosR)) - (u.z * sinR);
+ rollMtxRow1.z = ((u.z * u.x) * (1.0f - cosR)) + (u.y * sinR);
+
+ rollMtxRow2.x = ((u.x * u.y) * (1.0f - cosR)) + (u.z * sinR);
+ rollMtxRow2.y = ((1.0f - SQ(u.y)) * cosR) + SQ(u.y);
+ rollMtxRow2.z = ((u.y * u.z) * (1.0f - cosR)) - (u.x * sinR);
+
+ rollMtxRow3.x = ((u.z * u.x) * (1.0f - cosR)) - (u.y * sinR);
+ rollMtxRow3.y = ((u.y * u.z) * (1.0f - cosR)) + (u.x * sinR);
+ rollMtxRow3.z = ((1.0f - SQ(u.z)) * cosR) + SQ(u.z);
+
+ // Up without roll
+ baseUp.x = -sinP * sinY;
+ baseUp.y = cosP;
+ baseUp.z = -sinP * cosY;
+
+ // rollMtx * baseUp
+ up.x = DOTXYZ(baseUp, rollMtxRow1);
+ up.y = DOTXYZ(baseUp, rollMtxRow2);
+ up.z = DOTXYZ(baseUp, rollMtxRow3);
+
+ *viewUp = up;
+
+ return viewUp;
+}
+
+f32 Camera_ClampLerpScale(Camera* camera, f32 maxLerpScale) {
+ f32 ret;
+
+ if (camera->atLerpStepScale < 0.12f) {
+ ret = 0.12f;
+ } else if (camera->atLerpStepScale >= maxLerpScale) {
+ ret = maxLerpScale;
+ } else {
+ ret = 1.1f * camera->atLerpStepScale;
+ }
+
+ return ret;
+}
+
+void Camera_ResetActionFuncState(Camera* camera, s32 mode) {
+ camera->animState = 0;
+}
+
+void Camera_UpdateInterface(s32 interfaceFlags) {
+ s32 hudVisibility;
+
+ if ((interfaceFlags & CAM_LETTERBOX_MASK) != CAM_LETTERBOX_IGNORE) {
+ switch (interfaceFlags & CAM_LETTERBOX_SIZE_MASK) {
+ case CAM_LETTERBOX_SMALL:
+ sCameraLetterboxSize = 26;
+ break;
+
+ case CAM_LETTERBOX_MEDIUM:
+ sCameraLetterboxSize = 27;
+ break;
+
+ case CAM_LETTERBOX_LARGE:
+ sCameraLetterboxSize = 32;
+ break;
+
+ default:
+ sCameraLetterboxSize = 0;
+ break;
+ }
+
+ if (interfaceFlags & CAM_LETTERBOX_INSTANT) {
+ ShrinkWindow_Letterbox_SetSize(sCameraLetterboxSize);
+ } else {
+ ShrinkWindow_Letterbox_SetSizeTarget(sCameraLetterboxSize);
+ }
+ }
+
+ if ((interfaceFlags & CAM_HUD_VISIBILITY_MASK) != CAM_HUD_VISIBILITY_IGNORE) {
+ hudVisibility = (interfaceFlags & CAM_HUD_VISIBILITY_MASK) >> CAM_HUD_VISIBILITY_SHIFT;
+ if (hudVisibility == (CAM_HUD_VISIBILITY_ALL >> CAM_HUD_VISIBILITY_SHIFT)) {
+ hudVisibility = 50;
+ }
+ if (hudVisibility != sCameraHudVisibility) {
+ sCameraHudVisibility = hudVisibility;
+ Interface_SetHudVisibility(sCameraHudVisibility);
+ }
+ }
+}
+
+Vec3f* Camera_BgCheckCorner(Vec3f* dst, Vec3f* linePointA, Vec3f* linePointB, CameraCollision* pointAColChk,
+ CameraCollision* pointBColChk) {
+ Vec3f closestPoint;
+
+ func_800CAA14(pointAColChk->poly, pointBColChk->poly, linePointA, linePointB, &closestPoint);
+ *dst = closestPoint;
+
+ return dst;
+}
+
+/**
+ * Checks collision between at and eyeNext, if `checkEye` is set, if there is no collsion between
+ * eyeNext->at, then eye->at is also checked.
+ * Returns:
+ * 0 if no collsion is found between at->eyeNext
+ * 1 if the angle between the polys is between 60 degrees and 120 degrees
+ * 3 ?
+ * 6 if the angle between the polys is greater than 120 degrees
+ */
+s32 func_800CD44C(Camera* camera, VecGeo* diffGeo, CameraCollision* camEyeCollision, CameraCollision* camAtCollision,
+ s16 checkEye) {
+ Vec3f* at = &camera->at;
+ s32 pad[2];
+ s32 atEyeBgId;
+ s32 eyeAtBgId;
+ s32 ret;
+ f32 cosEyeAt;
+ CameraCollision camCollision;
+
+ camEyeCollision->pos = camera->eyeNext;
+
+ ret = 0;
+
+ atEyeBgId = func_800CBC84(camera, at, camEyeCollision, 0);
+ if (atEyeBgId != 0) {
+ // collision found between at->ey
+ camAtCollision->pos = *at;
+
+ OLib_Vec3fToVecGeo(&camEyeCollision->geoNorm, &camEyeCollision->norm);
+
+ if (camEyeCollision->geoNorm.pitch > 0x2EE0) { // 65.9 degrees
+ camEyeCollision->geoNorm.yaw = diffGeo->yaw;
+ }
+
+ if (checkEye & 1) {
+ memcpy(&camCollision, camAtCollision, sizeof(CameraCollision));
+ }
+
+ eyeAtBgId = Camera_BgCheckInfo(camera, &camera->eye, camAtCollision);
+
+ if (eyeAtBgId == 0) {
+ // no collision from eyeNext->at
+ if (checkEye & 1) {
+ memcpy(camAtCollision, &camCollision, sizeof(CameraCollision));
+ } else {
+ return 3;
+ }
+ }
+
+ if (camEyeCollision->poly == camAtCollision->poly) {
+ // at->eyeNext and eyeNext->at is the same poly
+ return 3;
+ }
+
+ OLib_Vec3fToVecGeo(&camAtCollision->geoNorm, &camAtCollision->norm);
+
+ if (camAtCollision->geoNorm.pitch > 0x2EE0) { // 65.9 degrees
+ camAtCollision->geoNorm.yaw = BINANG_ROT180(diffGeo->yaw);
+ }
+
+ if (atEyeBgId != eyeAtBgId) {
+ // different bgIds for at->eye[Next] and eye[Next]->at
+ ret = 3;
+ } else {
+ cosEyeAt = Math3D_Parallel(&camEyeCollision->norm, &camAtCollision->norm);
+ if (cosEyeAt < -0.5f) {
+ ret = 6;
+ } else if ((cosEyeAt > 0.5f) || (checkEye & 2)) {
+ ret = 3;
+ } else {
+ ret = 1;
+ }
+ }
+ }
+ return ret;
+}
+
+/**
+ * Calculates how much to adjust the camera at's y value when on a slope.
+ */
+f32 Camera_CalcSlopeYAdj(Vec3f* floorNorm, s16 playerYRot, s16 eyeAtYaw, f32 adjAmt) {
+ f32 tmp;
+ VecGeo floorNormGeo;
+
+ OLib_Vec3fToVecGeo(&floorNormGeo, floorNorm);
+
+ tmp = Math_CosS(floorNormGeo.pitch) * Math_CosS(playerYRot - floorNormGeo.yaw);
+
+ return (Camera_fabsf(tmp) * adjAmt) * Math_CosS(playerYRot - eyeAtYaw);
+}
+
+f32 func_800CD6CC(Actor* actor) {
+ return sqrtf(gTargetRanges[actor->targetMode].rangeSq / gTargetRanges[actor->targetMode].leashScale);
+}
+
+/**
+ * Calculates new at vector for the camera pointing in `eyeAtDir`
+ */
+s32 Camera_CalcAtDefault(Camera* camera, VecGeo* eyeAtDir, f32 yOffset, s16 calcSlope) {
+ Vec3f* at = &camera->at;
+ Vec3f focalActorAtOffsetTarget;
+ Vec3f atTarget;
+ s32 pad;
+ PosRot* focalActorPosRot = &camera->focalActorPosRot;
+ f32 focalActorHeight = Camera_GetFocalActorHeight(camera);
+
+ focalActorAtOffsetTarget.y = focalActorHeight + yOffset;
+ focalActorAtOffsetTarget.x = 0.0f;
+ focalActorAtOffsetTarget.z = 0.0f;
+
+ if (calcSlope) {
+ focalActorAtOffsetTarget.y -= OLib_ClampMaxDist(
+ Camera_CalcSlopeYAdj(&camera->floorNorm, focalActorPosRot->rot.y, eyeAtDir->yaw, 25.0f), focalActorHeight);
+ }
+
+ Camera_ScaledStepToCeilVec3f(&focalActorAtOffsetTarget, &camera->focalActorAtOffset, camera->xzOffsetUpdateRate,
+ camera->yOffsetUpdateRate, 0.1f);
+
+ atTarget.x = focalActorPosRot->pos.x + camera->focalActorAtOffset.x;
+ atTarget.y = focalActorPosRot->pos.y + camera->focalActorAtOffset.y;
+ atTarget.z = focalActorPosRot->pos.z + camera->focalActorAtOffset.z;
+
+ if (atTarget.y < (camera->focalActorFloorHeight + 10.0f)) {
+ atTarget.y = camera->focalActorFloorHeight + 10.0f;
+ }
+
+ Camera_ScaledStepToCeilVec3f(&atTarget, at, camera->atLerpStepScale, camera->atLerpStepScale, 0.2f);
+
+ return 1;
+}
+
+s32 Camera_CalcAtForScreen(Camera* camera, VecGeo* eyeAtDir, f32 yOffset, f32* focalActorPosY, f32 deltaYMax) {
+ f32 deltaY;
+ Vec3f focalActorAtOffsetTarget;
+ Vec3f atTarget;
+ s32 pad;
+ f32 clampedDeltaY;
+ f32 clampedAbsScreenY;
+ s16 absScreenY;
+ s16 screenY;
+ PosRot* focalActorPosRot = &camera->focalActorPosRot;
+ f32 focalActorHeight = Camera_GetFocalActorHeight(camera);
+
+ focalActorAtOffsetTarget.y = focalActorHeight + yOffset;
+ focalActorAtOffsetTarget.x = 0.0f;
+ focalActorAtOffsetTarget.z = 0.0f;
+
+ Actor_GetScreenPos(camera->play, camera->focalActor, &absScreenY, &screenY);
+ screenY -= SCREEN_HEIGHT / 2;
+ absScreenY = ABS(screenY);
+
+ // result unused
+ clampedAbsScreenY = OLib_ClampMaxDist(absScreenY / (f32)(SCREEN_HEIGHT / 2), 1.0f);
+
+ deltaY = focalActorPosRot->pos.y - *focalActorPosY;
+ clampedDeltaY = OLib_ClampMaxDist(deltaY, deltaYMax);
+
+ if (absScreenY > (SCREEN_HEIGHT / 4)) {
+ absScreenY = SCREEN_HEIGHT / 4;
+ }
+
+ clampedAbsScreenY = OLib_ClampMaxDist(absScreenY / (f32)(SCREEN_HEIGHT / 4), 1.0f);
+
+ focalActorAtOffsetTarget.y -= clampedDeltaY * clampedAbsScreenY * clampedAbsScreenY;
+ Camera_ScaledStepToCeilVec3f(&focalActorAtOffsetTarget, &camera->focalActorAtOffset, camera->xzOffsetUpdateRate,
+ camera->yOffsetUpdateRate, 0.1f);
+
+ atTarget.x = focalActorPosRot->pos.x + camera->focalActorAtOffset.x;
+ atTarget.y = focalActorPosRot->pos.y + camera->focalActorAtOffset.y;
+ atTarget.z = focalActorPosRot->pos.z + camera->focalActorAtOffset.z;
+ atTarget.y = CLAMP_MIN(atTarget.y, camera->focalActorFloorHeight + 10.0f);
+
+ Camera_ScaledStepToCeilVec3f(&atTarget, &camera->at, camera->atLerpStepScale, camera->atLerpStepScale, 0.1f);
+
+ return 1;
+}
+
+s32 Camera_CalcAtForNormal1(Camera* camera, VecGeo* arg1, f32 yOffset, f32 forwardDist) {
+ PosRot* focalActorPosRot = &camera->focalActorPosRot;
+ Vec3f focalActorAtOffsetTarget;
+ Vec3f atTarget;
+ Vec3f collisionFromPos;
+ s32 pad;
+ f32 focalActorHeight = Camera_GetFocalActorHeight(camera);
+
+ focalActorAtOffsetTarget.x = Math_SinS(focalActorPosRot->rot.y) * forwardDist;
+ focalActorAtOffsetTarget.z = Math_CosS(focalActorPosRot->rot.y) * forwardDist;
+ focalActorAtOffsetTarget.y = focalActorHeight + yOffset;
+
+ Camera_ScaledStepToCeilVec3f(&focalActorAtOffsetTarget, &camera->focalActorAtOffset, camera->xzOffsetUpdateRate,
+ camera->yOffsetUpdateRate, 0.1f);
+
+ atTarget.x = focalActorPosRot->pos.x + camera->focalActorAtOffset.x;
+ atTarget.y = focalActorPosRot->pos.y + camera->focalActorAtOffset.y;
+ atTarget.z = focalActorPosRot->pos.z + camera->focalActorAtOffset.z;
+
+ collisionFromPos.x = focalActorPosRot->pos.x;
+ collisionFromPos.y = atTarget.y;
+ collisionFromPos.z = focalActorPosRot->pos.z;
+
+ if (Camera_BgCheck(camera, &collisionFromPos, &atTarget)) {
+ atTarget.x -= camera->focalActorAtOffset.x - (atTarget.x - collisionFromPos.x);
+ atTarget.z -= camera->focalActorAtOffset.z - (atTarget.z - collisionFromPos.z);
+ }
+
+ Camera_ScaledStepToCeilVec3f(&atTarget, &camera->at, camera->atLerpStepScale, camera->atLerpStepScale, 0.2f);
+
+ return 1;
+}
+
+/**
+ * Adjusts the camera's at position for Camera_Parallel1
+ */
+s32 Camera_CalcAtForParallel(Camera* camera, VecGeo* arg1, f32 yOffset, f32 xzOffsetMax, f32* focalActorPosY,
+ s16 flags) {
+ f32 pad;
+ Vec3f focalActorAtOffsetTarget;
+ Vec3f atTarget;
+ f32 fovHeight;
+ Vec3f* at = &camera->at;
+ f32 deltaY;
+ f32 eyeAtDistXZ;
+ PosRot* focalActorPosRot = &camera->focalActorPosRot;
+ f32 focalActorHeight = Camera_GetFocalActorHeight(camera);
+ VecGeo focalActorAtOffsetTargetGeo;
+
+ // Calculate the `focalActorAtOffsetTarget`
+ // @TODO: Only uses `PARALLEL1_FLAG_` flags, but may need separate flags for `CalcAt` system
+ if (flags & 0x40) {
+ focalActorAtOffsetTargetGeo.r = func_800CCCEC(camera, flags & 0x10);
+ focalActorAtOffsetTargetGeo.yaw = focalActorPosRot->rot.y + 0x4000;
+ focalActorAtOffsetTargetGeo.pitch = 0;
+ OLib_VecGeoToVec3f(&focalActorAtOffsetTarget, &focalActorAtOffsetTargetGeo);
+ } else {
+ f32 xOffset = camera->focalActorAtOffset.x + camera->unk_0F0.x;
+ f32 zOffset = camera->focalActorAtOffset.z + camera->unk_0F0.z;
+
+ if (sqrtf(SQ(xOffset) + SQ(zOffset)) < xzOffsetMax) {
+ focalActorAtOffsetTarget.x = xOffset;
+ focalActorAtOffsetTarget.z = zOffset;
+ } else {
+ focalActorAtOffsetTarget.x = camera->focalActorAtOffset.x;
+ focalActorAtOffsetTarget.z = camera->focalActorAtOffset.z;
+ }
+ }
+
+ focalActorAtOffsetTarget.y = focalActorHeight + yOffset;
+
+ // focalActorAtOffsetTarget.y based on slope
+ if (PREG(76) && flags) {
+ focalActorAtOffsetTarget.y -=
+ Camera_CalcSlopeYAdj(&camera->floorNorm, focalActorPosRot->rot.y, arg1->yaw, 25.0f);
+ }
+
+ // Adjust posOffsetTarget.y based on something
+ if (func_800CB950(camera)) {
+ *focalActorPosY = Camera_ScaledStepToCeilF(focalActorPosRot->pos.y, *focalActorPosY, 0.4f, 0.1f);
+ deltaY = focalActorPosRot->pos.y - *focalActorPosY;
+ focalActorAtOffsetTarget.y -= deltaY;
+ Camera_ScaledStepToCeilVec3f(&focalActorAtOffsetTarget, &camera->focalActorAtOffset, camera->xzOffsetUpdateRate,
+ camera->yOffsetUpdateRate, 0.1f);
+ } else {
+ deltaY = focalActorPosRot->pos.y - *focalActorPosY;
+ eyeAtDistXZ = OLib_Vec3fDistXZ(at, &camera->eye);
+
+ // Math_FTanF
+ // Get the height based on 80% of the fov
+ fovHeight = func_80086760(DEG_TO_RAD(camera->fov * (0.8f * 0.5f))) * eyeAtDistXZ;
+
+ if (deltaY > fovHeight) {
+ //! FAKE
+ if (1) {}
+ *focalActorPosY += deltaY - fovHeight;
+ deltaY = fovHeight;
+ } else if (deltaY < -fovHeight) {
+ *focalActorPosY += deltaY + fovHeight;
+ deltaY = -fovHeight;
+ }
+
+ focalActorAtOffsetTarget.y -= deltaY;
+ Camera_ScaledStepToCeilVec3f(&focalActorAtOffsetTarget, &camera->focalActorAtOffset, 0.3f, 0.2f, 0.1f);
+ camera->xzOffsetUpdateRate = 0.3f;
+ camera->yOffsetUpdateRate = 0.2f;
+ }
+
+ atTarget.x = focalActorPosRot->pos.x + camera->focalActorAtOffset.x;
+ atTarget.y = focalActorPosRot->pos.y + camera->focalActorAtOffset.y;
+ atTarget.z = focalActorPosRot->pos.z + camera->focalActorAtOffset.z;
+ Camera_ScaledStepToCeilVec3f(&atTarget, at, camera->atLerpStepScale, camera->atLerpStepScale, 0.2f);
+
+ return 1;
+}
+
+s32 Camera_CalcAtForFriendlyLockOn(Camera* camera, VecGeo* eyeAtDir, Vec3f* targetPos, f32 yOffset, f32 distance,
+ f32* yPosOffset, VecGeo* outPlayerToTargetDir, s16 flags) {
+ Vec3f* at = &camera->at;
+ Vec3f focalActorAtOffsetTarget;
+ Vec3f atTarget;
+ Vec3f sp68;
+ f32 temp_f0_6;
+ VecGeo sp5C;
+ f32 deltaY;
+ f32 fovHeight;
+ f32 phi_f16;
+ f32 focalActorHeight = Camera_GetFocalActorHeight(camera);
+ f32 sp50;
+ PosRot* focalActorPosRot = &camera->focalActorPosRot;
+
+ focalActorAtOffsetTarget.y = focalActorHeight + yOffset;
+ focalActorAtOffsetTarget.x = 0.0f;
+ focalActorAtOffsetTarget.z = 0.0f;
+
+ if (PREG(76) && (flags & FLG_ADJSLOPE)) {
+ focalActorAtOffsetTarget.y -=
+ Camera_CalcSlopeYAdj(&camera->floorNorm, camera->focalActorPosRot.rot.y, eyeAtDir->yaw, 25.0f);
+ }
+
+ atTarget = focalActorPosRot->pos;
+ atTarget.y += focalActorHeight;
+
+ OLib_Vec3fDiffToVecGeo(outPlayerToTargetDir, &atTarget, targetPos);
+
+ sp5C = *outPlayerToTargetDir;
+ sp5C.r = (distance < sp5C.r) ? (sp5C.r * 0.2f) : ((sp5C.r * 0.9f) - (sp5C.r * 0.7f * (sp5C.r / distance)));
+
+ if (flags & FLG_OFFGROUND) {
+ sp5C.r *= 0.2f;
+ camera->yOffsetUpdateRate = camera->xzOffsetUpdateRate = 0.01f;
+ }
+
+ OLib_VecGeoToVec3f(&sp68, &sp5C);
+
+ focalActorAtOffsetTarget.x += sp68.x;
+ focalActorAtOffsetTarget.y += sp68.y;
+ focalActorAtOffsetTarget.z += sp68.z;
+
+ if (func_800CB950(camera)) {
+ *yPosOffset = Camera_ScaledStepToCeilF(focalActorPosRot->pos.y, *yPosOffset, 0.4f, 0.1f);
+ deltaY = focalActorPosRot->pos.y - *yPosOffset;
+ focalActorAtOffsetTarget.y -= deltaY;
+ Camera_ScaledStepToCeilVec3f(&focalActorAtOffsetTarget, &camera->focalActorAtOffset, camera->xzOffsetUpdateRate,
+ camera->yOffsetUpdateRate, 0.1f);
+ } else {
+ if (!(flags & 0x80)) {
+ deltaY = focalActorPosRot->pos.y - *yPosOffset;
+ sp50 = OLib_Vec3fDistXZ(at, &camera->eye);
+ phi_f16 = sp50;
+ func_80086B30(deltaY, sp50);
+ fovHeight = func_80086760(DEG_TO_RAD(camera->fov * 0.4f)) * phi_f16;
+
+ if (fovHeight < deltaY) {
+ *yPosOffset += deltaY - fovHeight;
+ deltaY = fovHeight;
+ } else if (deltaY < -fovHeight) {
+ *yPosOffset += deltaY + fovHeight;
+ deltaY = -fovHeight;
+ }
+ focalActorAtOffsetTarget.y -= deltaY;
+ } else {
+ deltaY = focalActorPosRot->pos.y - *yPosOffset;
+ temp_f0_6 = func_80086B30(deltaY, OLib_Vec3fDistXZ(at, &camera->eye));
+
+ if (temp_f0_6 > 0.34906584f) { // (M_PI / 9)
+ phi_f16 = 1.0f - sin_rad(temp_f0_6 - 0.34906584f);
+ } else if (temp_f0_6 < -0.17453292f) { // (M_PI / 18)
+ phi_f16 = 1.0f - sin_rad(-0.17453292f - temp_f0_6);
+ } else {
+ phi_f16 = 1.0f;
+ }
+
+ focalActorAtOffsetTarget.y -= deltaY * phi_f16;
+ }
+
+ Camera_ScaledStepToCeilVec3f(&focalActorAtOffsetTarget, &camera->focalActorAtOffset, 0.5f, 0.5f, 0.1f);
+ camera->xzOffsetUpdateRate = 0.5f;
+ camera->yOffsetUpdateRate = 0.5f;
+ }
+
+ atTarget.x = focalActorPosRot->pos.x + camera->focalActorAtOffset.x;
+ atTarget.y = focalActorPosRot->pos.y + camera->focalActorAtOffset.y;
+ atTarget.z = focalActorPosRot->pos.z + camera->focalActorAtOffset.z;
+ Camera_ScaledStepToCeilVec3f(&atTarget, at, camera->atLerpStepScale, camera->atLerpStepScale, 0.2f);
+
+ return 1;
+}
+
+s32 Camera_CalcAtForEnemyLockOn(Camera* camera, f32* arg1, s32 arg2, f32 yOffset, f32 arg4, f32 arg5, f32* arg6,
+ VecGeo* arg7, s16 flags) {
+ PosRot* focalActorPosRot = &camera->focalActorPosRot;
+ Vec3f focalActorAtOffsetTarget;
+ Vec3f atTarget;
+ Vec3f sp60;
+ VecGeo sp58;
+ f32 temp_f0_3;
+ f32 deltaY;
+ f32 new_var2;
+ f32 sp4C;
+ f32 phi_f14;
+ f32 fovHeight;
+
+ focalActorAtOffsetTarget.y = Camera_GetFocalActorHeight(camera) + yOffset;
+ focalActorAtOffsetTarget.x = 0.0f;
+ focalActorAtOffsetTarget.z = 0.0f;
+
+ sp58 = *arg7;
+ sp58.r = arg7->r * (arg5 * arg4);
+
+ if (flags & 0x80) {
+ camera->yOffsetUpdateRate = 0.01f;
+ camera->xzOffsetUpdateRate = 0.01f;
+ }
+
+ OLib_VecGeoToVec3f(&sp60, &sp58);
+
+ focalActorAtOffsetTarget.x += sp60.x;
+ focalActorAtOffsetTarget.y += sp60.y;
+ focalActorAtOffsetTarget.z += sp60.z;
+
+ if (func_800CB950(camera)) {
+ phi_f14 = *arg6;
+ *arg6 = Camera_ScaledStepToCeilF(focalActorPosRot->pos.y, phi_f14, 0.4f, 0.1f);
+ deltaY = focalActorPosRot->pos.y - *arg6;
+ focalActorAtOffsetTarget.y -= deltaY;
+ Camera_ScaledStepToCeilVec3f(&focalActorAtOffsetTarget, &camera->focalActorAtOffset, camera->xzOffsetUpdateRate,
+ camera->yOffsetUpdateRate, 0.1f);
+ } else {
+ //! FAKE:
+ if (focalActorPosRot->pos.x) {}
+
+ //! FAKE: unnecessary temp?
+ new_var2 = *arg1;
+ sp4C = new_var2;
+ deltaY = focalActorPosRot->pos.y - *arg6;
+ temp_f0_3 = func_80086B30(deltaY, sp4C);
+
+ if (!(flags & 0x80)) {
+ fovHeight = func_80086760(DEG_TO_RAD(camera->fov * 0.4f)) * sp4C;
+
+ if (fovHeight < deltaY) {
+ *arg6 += deltaY - fovHeight;
+ deltaY = fovHeight;
+ } else if (deltaY < -fovHeight) {
+ *arg6 += deltaY + fovHeight;
+ deltaY = -fovHeight;
+ }
+
+ focalActorAtOffsetTarget.y -= deltaY;
+ } else {
+ if (temp_f0_3 > 0.34906584f) { // (M_PI / 9)
+ phi_f14 = 1.0f - sin_rad(temp_f0_3 - 0.34906584f);
+ } else if (temp_f0_3 < -0.17453292f) { // (M_PI / 18)
+ phi_f14 = 1.0f - sin_rad(-0.17453292f - temp_f0_3);
+ } else {
+ phi_f14 = 1.0f;
+ }
+
+ focalActorAtOffsetTarget.y -= deltaY * phi_f14;
+ }
+ Camera_ScaledStepToCeilVec3f(&focalActorAtOffsetTarget, &camera->focalActorAtOffset, 0.5f, 0.5f, 0.1f);
+ camera->xzOffsetUpdateRate = 0.5f;
+ camera->yOffsetUpdateRate = 0.5f;
+ }
+
+ atTarget.x = focalActorPosRot->pos.x + camera->focalActorAtOffset.x;
+ atTarget.y = focalActorPosRot->pos.y + camera->focalActorAtOffset.y;
+ atTarget.z = focalActorPosRot->pos.z + camera->focalActorAtOffset.z;
+ Camera_ScaledStepToCeilVec3f(&atTarget, &camera->at, camera->atLerpStepScale, camera->atLerpStepScale, 0.2f);
+
+ return true;
+}
+
+s32 Camera_CalcAtForHorse(Camera* camera, VecGeo* eyeAtDir, f32 yOffset, f32* yPosOffset, s16 calcSlope) {
+ Vec3f* at = &camera->at;
+ Vec3f posOffsetTarget;
+ Vec3f atTarget;
+ s32 pad[2];
+ f32 focalActorHeight = Camera_GetFocalActorHeight(camera);
+ Player* player = (Player*)camera->focalActor;
+ PosRot horsePosRot;
+
+ Actor_GetWorld(&horsePosRot, player->rideActor);
+
+ if (EN_HORSE_CHECK_JUMPING((EnHorse*)player->rideActor)) {
+ horsePosRot.pos.y -= 49.0f;
+ *yPosOffset = Camera_ScaledStepToCeilF(horsePosRot.pos.y, *yPosOffset, 0.1f, 0.1f);
+ camera->atLerpStepScale = Camera_ScaledStepToCeilF(0.4f, camera->atLerpStepScale, 0.2f, 0.02f);
+ } else {
+ *yPosOffset = Camera_ScaledStepToCeilF(horsePosRot.pos.y, *yPosOffset, 0.5f, 0.1f);
+ }
+
+ posOffsetTarget.x = 0.0f;
+ posOffsetTarget.y = focalActorHeight + yOffset;
+ posOffsetTarget.z = 0.0f;
+
+ if (calcSlope) {
+ posOffsetTarget.y -=
+ Camera_CalcSlopeYAdj(&camera->floorNorm, camera->focalActorPosRot.rot.y, eyeAtDir->yaw, 25.0f);
+ }
+
+ Camera_ScaledStepToCeilVec3f(&posOffsetTarget, &camera->focalActorAtOffset, camera->xzOffsetUpdateRate,
+ camera->yOffsetUpdateRate, 0.1f);
+
+ atTarget.x = camera->focalActorAtOffset.x + horsePosRot.pos.x;
+ atTarget.y = camera->focalActorAtOffset.y + horsePosRot.pos.y;
+ atTarget.z = camera->focalActorAtOffset.z + horsePosRot.pos.z;
+ Camera_ScaledStepToCeilVec3f(&atTarget, at, camera->atLerpStepScale, camera->atLerpStepScale, 0.2f);
+
+ return true;
+}
+
+f32 Camera_ClampDist1(Camera* camera, f32 dist, f32 minDist, f32 maxDist, s16 timer) {
+ f32 distTarget;
+
+ if ((dist / maxDist) > 1.2f) {
+ distTarget = maxDist;
+
+ camera->rUpdateRateInv = 20.0f / (dist / maxDist);
+ if ((20.0f / (dist / maxDist)) < 10) {
+ camera->rUpdateRateInv = 10;
+ }
+ } else if (dist < minDist) {
+ distTarget = minDist;
+
+ camera->rUpdateRateInv =
+ Camera_ScaledStepToCeilF((timer != 0) ? 10.0f : 20.0f, camera->rUpdateRateInv, 0.5f, 0.1f);
+ } else if (maxDist < dist) {
+ distTarget = maxDist;
+
+ camera->rUpdateRateInv =
+ Camera_ScaledStepToCeilF((timer != 0) ? 10.0f : 20.0f, camera->rUpdateRateInv, 0.5f, 0.1f);
+ } else {
+ distTarget = dist;
+
+ camera->rUpdateRateInv =
+ Camera_ScaledStepToCeilF((timer != 0) ? 20.0f : 1.0f, camera->rUpdateRateInv, 0.5f, 0.1f);
+ }
+
+ return Camera_ScaledStepToCeilF(distTarget, camera->dist, 1.0f / camera->rUpdateRateInv, 0.1f);
+}
+
+f32 Camera_ClampDist2(Camera* camera, f32 dist, f32 minDist, f32 maxDist, s16 timer) {
+ f32 distTarget;
+
+ if (timer == 0) {
+ distTarget = ((maxDist * 0.25f) > 80.0f) ? maxDist * 0.25f : 80.0f;
+
+ camera->rUpdateRateInv = Camera_ScaledStepToCeilF(1000.0f, camera->rUpdateRateInv, 0.5f, 0.1f);
+ } else if ((dist / maxDist) > 1.2f) {
+ distTarget = maxDist;
+
+ camera->rUpdateRateInv = 20.0f / (dist / maxDist);
+ if ((20.0f / (dist / maxDist)) < 10.0f) {
+ camera->rUpdateRateInv = 10.0f;
+ }
+ } else if (dist < minDist) {
+ distTarget = minDist;
+
+ camera->rUpdateRateInv = Camera_ScaledStepToCeilF(20.0f, camera->rUpdateRateInv, 0.5f, 0.1f);
+ } else if (maxDist < dist) {
+ distTarget = maxDist;
+
+ camera->rUpdateRateInv = Camera_ScaledStepToCeilF(20.0f, camera->rUpdateRateInv, 0.5f, 0.1f);
+ } else {
+ distTarget = dist;
+
+ camera->rUpdateRateInv = Camera_ScaledStepToCeilF(1.0f, camera->rUpdateRateInv, 0.5f, 0.1f);
+ }
+
+ return Camera_ScaledStepToCeilF(distTarget, camera->dist, 1.0f / camera->rUpdateRateInv, 0.1f);
+}
+
+/**
+ * Calculates the camera pitch to update to as player moves around
+ * The pitch target starts with a default value on a flat surface, then standing on a sloped surface will create an
+ * offset in default pitch Camera "AI" for pitch
+ */
+s16 Camera_CalcDefaultPitch(Camera* camera, s16 pitch, s16 flatSurfacePitchTarget, s16 slopePitchAdj) {
+ f32 attenuation;
+ f32 pitchStepScale;
+ f32 t;
+ s16 slopePitchAdjAttenuated;
+ s16 pitchMag = ABS(pitch);
+ s16 pitchTarget;
+
+ // if slopePitchAdj is positive, then it is attenuated by a factor of Math_CosS(slopePitchAdj)
+ slopePitchAdjAttenuated = (slopePitchAdj > 0) ? (s16)(Math_CosS(slopePitchAdj) * slopePitchAdj) : slopePitchAdj;
+ pitchTarget = flatSurfacePitchTarget - slopePitchAdjAttenuated;
+
+ if (ABS(pitchTarget) < pitchMag) {
+ // pitch is decreasing
+ pitchStepScale = (1.0f / camera->pitchUpdateRateInv) * 3.0f;
+ } else {
+ // pitch is increasing
+ t = pitchMag * (1.0f / DEG_TO_BINANG(79.655f));
+ attenuation =
+ Camera_QuadraticAttenuation(0.8f, 1.0f - t); // attenuation starts above pitch = 0xB54 (16 degrees)
+ pitchStepScale = (1.0f / camera->pitchUpdateRateInv) * attenuation;
+ }
+
+ return Camera_ScaledStepToCeilS(pitchTarget, pitch, pitchStepScale, 5);
+}
+
+/**
+ * Calculates the camera pitch to update to as player moves around
+ * The yaw target starts with a default value, but will only update to that target yaw in proportion to players velocity
+ * No velocity means yaw does not update
+ * Camera "AI" for yaw
+ */
+s16 Camera_CalcDefaultYaw(Camera* camera, s16 yaw, s16 target, f32 attenuationYawDiffRange,
+ f32 attenuationYawDiffInterpParam) {
+ f32 attenuationYawDiffAdj;
+ f32 attenuationYawDiff;
+ f32 attenuationYawDiffParam;
+ f32 attenuationSpeedRatio;
+ f32 yawUpdRate;
+ s16 yawDiffToTarget;
+
+ if (camera->xzSpeed > 0.001f) {
+ yawDiffToTarget = target - BINANG_ROT180(yaw);
+ attenuationYawDiffParam = BINANG_ROT180(yawDiffToTarget) / (f32)0x8000;
+ } else {
+ yawDiffToTarget = target - BINANG_ROT180(yaw);
+ attenuationYawDiffParam = 0.3f;
+ }
+
+ // Attenuation 1 based on YawDiffToTarget.
+ attenuationYawDiff = Camera_QuadraticAttenuation(attenuationYawDiffRange, attenuationYawDiffParam);
+ attenuationYawDiffAdj = LERPIMP(attenuationYawDiff, 1.0f, attenuationYawDiffInterpParam);
+ attenuationYawDiffAdj = CLAMP_MIN(attenuationYawDiffAdj, 0.0f);
+
+ // attenuation 2 based on SpeedRatio
+ attenuationSpeedRatio = Camera_QuadraticAttenuation(0.5f, camera->speedRatio);
+
+ yawUpdRate = 1.0f / camera->yawUpdateRateInv;
+ return yaw + (s16)(yawDiffToTarget * attenuationYawDiffAdj * attenuationSpeedRatio * yawUpdRate);
+}
+
+void Camera_CalcDefaultSwing(Camera* camera, VecGeo* arg1, VecGeo* arg2, f32 arg3, f32 arg4, SwingAnimation* swing2,
+ s16* flags) {
+ SwingAnimation* swing = swing2;
+ Vec3f* eye = &camera->eye;
+ Vec3f* at = &camera->at;
+ Vec3f peekAroundPoint;
+ s32 sp8C = 0;
+ f32 sp88;
+ s32 checkEyeBit1;
+ s32 checkEyeBit2;
+ CameraCollision sp58;
+ VecGeo sp50;
+ Vec3f* sp30;
+
+ if (swing->unk_64 == 1) {
+ if (arg3 < (sp88 = OLib_Vec3fDist(at, &swing->collisionClosePoint))) {
+ //! FAKE:
+ dummy:;
+ swing->unk_64 = 0;
+ } else if ((sp88 = Math3D_SignedDistanceFromPlane(swing->eyeAtColChk.norm.x, swing->eyeAtColChk.norm.y,
+ swing->eyeAtColChk.norm.z, swing->eyeAtColChk.poly->dist,
+ at)) > 0.0f) {
+ swing->unk_64 = 0;
+ } else if ((sp88 = OLib_Vec3fDist(eye, &swing->eyeAtColChk.pos)) < 10.0f) {
+ swing->unk_64 = 0;
+ } else if ((sp88 = Math3D_SignedDistanceFromPlane(swing->atEyeColChk.norm.x, swing->atEyeColChk.norm.y,
+ swing->atEyeColChk.norm.z, swing->atEyeColChk.poly->dist,
+ eye)) > 0.0f) {
+ swing->unk_64 = 0;
+ } else if (swing->atEyeColChk.norm.y > 0.50f) {
+ swing->unk_64 = 0;
+ } else {
+ Math3D_AngleBetweenVectors(&camera->unk_0F0, &swing->eyeAtColChk.norm, &sp88);
+ if (sp88 > 0.0f) {
+ swing->unk_64 = 0;
+ }
+ }
+
+ if (swing->unk_64 == 1) {
+ sp8C = 2;
+ }
+ } else if (swing->unk_64 == 2) {
+ swing->unk_64 = 0;
+ }
+
+ if (sp8C == 0) {
+ if (*flags & 2) {
+ checkEyeBit1 = 1 << 1;
+ } else {
+ checkEyeBit1 = 0;
+ }
+
+ if (swing->unk_64 != 1) {
+ checkEyeBit2 = 1 << 0;
+ } else {
+ checkEyeBit2 = 0;
+ }
+
+ sp8C =
+ func_800CD44C(camera, arg1, &swing->atEyeColChk, &swing->eyeAtColChk, ((s16)checkEyeBit2 | checkEyeBit1));
+ }
+
+ switch (sp8C) {
+ case 1:
+ Camera_BgCheckCorner(&swing->collisionClosePoint, &camera->at, &camera->eyeNext, &swing->atEyeColChk,
+ &swing->eyeAtColChk);
+ // fallthrough
+ case 2:
+ peekAroundPoint.x = swing->collisionClosePoint.x + (swing->atEyeColChk.norm.x + swing->eyeAtColChk.norm.x);
+ peekAroundPoint.y = swing->collisionClosePoint.y + (swing->atEyeColChk.norm.y + swing->eyeAtColChk.norm.y);
+ peekAroundPoint.z = swing->collisionClosePoint.z + (swing->atEyeColChk.norm.z + swing->eyeAtColChk.norm.z);
+
+ sp30 = &camera->eyeNext;
+ OLib_Vec3fDiffToVecGeo(&sp50, at, &peekAroundPoint);
+ sp50.r = arg1->r;
+ swing->unk_64 = 1;
+ swing->swingUpdateRate = 1.5f;
+ OLib_AddVecGeoToVec3f(&sp58.pos, at, &sp50);
+
+ if (func_800CBC84(camera, &swing->eyeAtColChk.pos, &sp58, 0) == 0) {
+ sp50.yaw =
+ Camera_AngleDiffAndScale(arg1->yaw, arg2->yaw, (camera->speedRatio * 0.5f) + 0.5f) + arg2->yaw;
+ sp50.pitch = Camera_AngleDiffAndScale(arg1->pitch, arg2->pitch, (camera->speedRatio * 0.5f) + 0.5f) +
+ arg2->pitch;
+ if (swing->atEyeColChk.geoNorm.pitch < 0x2AA8) { // 60 degrees
+ swing->yaw = sp50.yaw;
+ swing->pitch = sp50.pitch;
+ } else {
+ swing->yaw = arg1->yaw;
+ swing->pitch = arg1->pitch;
+ }
+ }
+ *eye = *sp30 = sp58.pos;
+ break;
+
+ case 3:
+ case 6:
+ sp30 = &swing->atEyeColChk.pos;
+ sp88 = OLib_Vec3fDist(at, sp30);
+ if (sp88 < 60.0f) {
+ sp50.yaw = Camera_AngleDiffAndScale(arg1->yaw, arg2->yaw, camera->speedRatio) + arg2->yaw;
+ if (*flags & 0x1000) {
+ sp50.pitch = arg2->pitch;
+ } else {
+ sp50.pitch = Math_CosS(swing->atEyeColChk.geoNorm.pitch) * 0x3FFC;
+ }
+ sp50.r = 60.0f - sp88;
+ OLib_AddVecGeoToVec3f(&sp58.pos, sp30, &sp50);
+ } else {
+ sp50.yaw = Camera_AngleDiffAndScale(arg1->yaw, arg2->yaw, camera->speedRatio) + arg2->yaw;
+ sp50.pitch = Camera_AngleDiffAndScale(arg1->pitch, arg2->pitch, camera->speedRatio) + arg2->pitch;
+ sp50.r = arg1->r;
+ OLib_AddVecGeoToVec3f(&sp58.pos, at, &sp50);
+ }
+ func_800CBC84(camera, at, &sp58, 0);
+ *eye = sp58.pos;
+ break;
+
+ default:
+ sp30 = &swing->atEyeColChk.pos;
+ *flags &= ~0x1000;
+ swing->swingUpdateRate = arg4;
+ *eye = *sp30;
+ break;
+ }
+}
+
+/*===============================================================*/
+/* Camera Update Functions (Chosen by Settings & Modes) */
+/*===============================================================*/
+
+s32 Camera_Noop(Camera* camera) {
+ return 1;
+}
+
+// SP, FLOATS - Many temps reused to get the stack pointer down, even though it doesn't seem logical
+// https://decomp.me/scratch/zVOSG
+#ifdef NON_EQUIVALENT
+s32 Camera_Normal1(Camera* camera) {
+ CameraModeValue* values;
+ f32 phi_f16_2;
+ Vec3f spD8; // D8-DC-E0
+ f32 spD4;
+ f32 spD0;
+ f32 spC8;
+ f32 spC4;
+ f32 spC0;
+ VecGeo spB4; // B4-B8-BA
+ VecGeo spAC; // AC-B0-B2
+ VecGeo spA4; // A4-A8-AA
+ VecGeo sp9C; // 9C-A0-A2
+ VecGeo sp74; // 74-78-7A
+ s16 sp72;
+ f32 sp6C;
+ VecGeo sp64; // 64-68-6A
+ CollisionPoly* sp60;
+ f32 sp88 = Camera_GetFocalActorHeight(camera);
+ s32 sp5C; // BgID
+ f32 sp58;
+ f32 phi_f2;
+ // Vec3f *sp48;
+ // Vec3f *sp44;
+
+ // f32 phi_f0;
+ f32 phi_f2_2;
+ f32 phi_f0_4;
+ s32 phi_v1_2;
+ Vec3f* sp4C = &camera->eye;
+ PosRot* sp40 = &camera->focalActorPosRot;
+ // f32 phi_f16_5;
+
+ s16 phi_a0;
+ s16 temp_a0_3; // May be fake
+ Vec3f* new_var3;
+
+ Normal1ReadOnlyData* roData = &camera->paramData.norm1.roData;
+ Normal1ReadWriteData* rwData = &camera->paramData.norm1.rwData;
+
+ // sp48 = &camera->at;
+ // sp4C;/
+ // sp44 = &camera->eyeNext;
+ // sp40;
+ // sp88;
+
+ values = sCameraSettings[camera->setting].cameraModes[camera->mode].values;
+ roData->unk_00 = GET_NEXT_RO_DATA(values) * (sp88 * 0.01f * (0.8f - ((68.0f / sp88) * -0.2f)));
+ roData->unk_04 = GET_NEXT_RO_DATA(values) * (sp88 * 0.01f * (0.8f - ((68.0f / sp88) * -0.2f)));
+ roData->unk_08 = GET_NEXT_RO_DATA(values) * (sp88 * 0.01f * (0.8f - ((68.0f / sp88) * -0.2f)));
+ roData->unk_04 = roData->unk_08 - (roData->unk_08 - roData->unk_04);
+
+ if (RELOAD_PARAMS(camera)) {
+ roData->unk_20 = (s16)((GET_NEXT_RO_DATA(values) * 182.04167f) + .5f);
+ roData->unk_0C = GET_NEXT_RO_DATA(values);
+ roData->unk_0C = 40.0f - (40.0f - roData->unk_0C);
+ roData->unk_10 = GET_NEXT_RO_DATA(values);
+ roData->unk_14 = GET_NEXT_RO_DATA(values) * 0.01f;
+ roData->unk_14 = 1.0f - (1.0f - roData->unk_14);
+ roData->unk_18 = GET_NEXT_RO_DATA(values);
+ roData->unk_1C = GET_NEXT_RO_DATA(values) * 0.01f;
+ roData->interfaceFlags = GET_NEXT_RO_DATA(values);
+ }
+
+ sCameraInterfaceFlags = roData->interfaceFlags;
+ OLib_Vec3fDiffToVecGeo(&spA4, &camera->at, sp4C);
+ OLib_Vec3fDiffToVecGeo(&sp9C, &camera->at, &camera->eyeNext);
+
+ switch (camera->animState) {
+ case 20:
+ Camera_SetUpdateRatesFastYaw(camera);
+ // fallthrough?
+ case 0:
+ rwData->unk_0C = 1;
+ if (!(roData->interfaceFlags & NORMAL1_FLAG_3) && (camera->animState != 20)) {
+ rwData->unk_0C |= 0x1000;
+ }
+ // fallthrough?
+ case 10:
+ if (camera->animState == 10) {
+ rwData->unk_0C = 0;
+ }
+ rwData->unk_08 = 0;
+ D_801EDC30[camera->camId].yaw = D_801EDC30[camera->camId].pitch = D_801EDC30[camera->camId].unk_64 = 0;
+ rwData->unk_0A = 0x514;
+ D_801EDC30[camera->camId].swingUpdateRate = roData->unk_0C;
+ rwData->unk_00 = camera->focalActorPosRot.pos.y;
+ rwData->unk_04 = camera->xzSpeed;
+ D_801EDC30[camera->camId].timer = 0;
+ sUpdateCameraDirection = false;
+ rwData->unk_10 = 120.0f;
+ break;
+ }
+
+ camera->animState = 1;
+ sUpdateCameraDirection = true;
+
+ if ((camera->speedRatio < 0.01f) || (rwData->unk_0A > 0x4B0)) {
+ if (rwData->unk_0A > -0x4B0) {
+ rwData->unk_0A--;
+ }
+ } else {
+ rwData->unk_0A = 0x4B0;
+ }
+
+ if (func_800CB950(camera)) {
+ rwData->unk_00 = camera->focalActorPosRot.pos.y;
+ }
+
+ if (rwData->unk_0C & 0x1000) {
+ spC8 = camera->speedRatio;
+ } else {
+ spC8 = ((camera->speedRatio * 3.0f) + 1.0f) * 0.25f;
+ }
+
+ spD8 = camera->focalActorAtOffset;
+ spD8.y -= sp88 + roData->unk_00;
+ spC4 = Camera_Vec3fMagnitude(&spD8);
+
+ if ((roData->unk_04 + roData->unk_08) < spC4) {
+ spC4 = 1.0f;
+ } else {
+ spC4 = spC4 / (roData->unk_04 + roData->unk_08);
+ }
+
+ // Everything above matches except stack pointers
+ // PERM_RANDOMIZE(
+
+ phi_f16_2 = 0.2f;
+
+ phi_f2 = (camera->xzSpeed - rwData->unk_04) * 0.2f;
+ phi_f0_4 = phi_f2;
+ if (phi_f2 < 0.0f) {
+ phi_f0_4 = 0.0f;
+ }
+
+ spC0 = OLib_ClampMaxDist(SQ(phi_f0_4), 1.0f);
+ camera->yOffsetUpdateRate =
+ Camera_ScaledStepToCeilF(0.05f, camera->yOffsetUpdateRate, (0.5f * spC8) + (0.5f * spC4), 0.0001f);
+ camera->xzOffsetUpdateRate =
+ Camera_ScaledStepToCeilF(0.05f, camera->xzOffsetUpdateRate, (0.5f * spC8) + (0.5f * spC4), 0.0001f);
+ camera->fovUpdateRate =
+ Camera_ScaledStepToCeilF(0.05f, camera->fovUpdateRate, (0.5f * spC8) + (0.5f * spC4), 0.0001f);
+
+ if (D_801EDC30[camera->camId].unk_64 == 1) {
+ phi_f2 = 0.5f;
+ } else {
+ phi_f2 = (0.5f * spC8) + (0.5f * spC4);
+ }
+
+ rwData->unk_04 = camera->xzSpeed;
+
+ if (D_801EDC30[camera->camId].timer != 0) {
+ camera->yawUpdateRateInv =
+ Camera_ScaledStepToCeilF((D_801EDC30[camera->camId].timer * 2) + D_801EDC30[camera->camId].swingUpdateRate,
+ camera->yawUpdateRateInv, phi_f2, 0.1f);
+ if (roData->interfaceFlags & NORMAL1_FLAG_3) {
+ camera->pitchUpdateRateInv = Camera_ScaledStepToCeilF(100.0f, camera->pitchUpdateRateInv, 0.5f, 0.1f);
+ } else {
+ camera->pitchUpdateRateInv = Camera_ScaledStepToCeilF((D_801EDC30[camera->camId].timer * 2) + 16.0f,
+ camera->pitchUpdateRateInv, 0.2f, 0.1f);
+ }
+ D_801EDC30[camera->camId].timer--;
+ } else {
+ camera->yawUpdateRateInv = Camera_ScaledStepToCeilF(
+ D_801EDC30[camera->camId].swingUpdateRate - (D_801EDC30[camera->camId].swingUpdateRate * 0.7f * spC0),
+ camera->yawUpdateRateInv, phi_f2, 0.1f);
+ if ((roData->interfaceFlags & NORMAL1_FLAG_3) && (camera->speedRatio > 0.01f)) {
+ camera->pitchUpdateRateInv = Camera_ScaledStepToCeilF(100.0f, camera->pitchUpdateRateInv, 0.5f, 0.1f);
+ } else if (D_801ED920 != NULL) {
+ camera->pitchUpdateRateInv = Camera_ScaledStepToCeilF(32.0f, camera->pitchUpdateRateInv, 0.5f, 0.1f);
+ } else {
+ camera->pitchUpdateRateInv = Camera_ScaledStepToCeilF(16.0f, camera->pitchUpdateRateInv, 0.2f, 0.1f);
+ }
+ }
+
+ if (roData->interfaceFlags & NORMAL1_FLAG_0) {
+ //! FAKE
+ if (!spC8) {}
+ temp_a0_3 = Camera_GetPitchAdjFromFloorHeightDiffs(camera, spA4.yaw + 0x8000, rwData->unk_0C & 1);
+ phi_f2 = (1.0f / roData->unk_10) * 0.7f;
+ phi_f16_2 = (1.0f / roData->unk_10) * 0.3f * (1.0f - camera->speedRatio);
+ spD0 = phi_f16_2;
+ rwData->unk_08 = Camera_ScaledStepToCeilS(temp_a0_3, rwData->unk_08, phi_f2 + phi_f16_2, 5);
+ } else {
+ rwData->unk_08 = 0;
+ }
+
+ if ((D_801EDC30[camera->camId].unk_64 == 1) && (roData->unk_00 > -40.0f)) {
+ phi_f0_4 = Math_SinS(D_801EDC30[camera->camId].pitch);
+ phi_f2 = roData->unk_00;
+ phi_f2 = phi_f2 * (1.0f - phi_f0_4); // TODO: phi_f2 should not be on the LHS and RHS
+ // phi_f2 = roData->unk_00 * (1.0f - phi_f0_4);
+ camera->yawUpdateRateInv = 80.0f;
+ camera->pitchUpdateRateInv = 80.0f;
+ phi_f2_2 = ((-40.0f) * phi_f0_4) + phi_f2;
+ phi_f16_2 = phi_f0_4;
+ } else {
+ phi_f2_2 = roData->unk_00;
+ }
+
+ if (roData->interfaceFlags & (NORMAL1_FLAG_6 | NORMAL1_FLAG_5)) {
+ if (camera->dist < roData->unk_04) {
+ phi_f16_2 = 0.0f;
+ } else if (roData->unk_08 < camera->dist) {
+ phi_f16_2 = 1.0f;
+ } else if (roData->unk_08 == roData->unk_04) {
+ phi_f16_2 = 1.0f;
+ } else {
+ // phi_f16_2 = camera->dist - roData->unk_04;
+ spD4 = (camera->dist - roData->unk_04) / (roData->unk_08 - roData->unk_04);
+ phi_f16_2 = spD4;
+ }
+
+ Camera_CalcAtForNormal1(camera, &sp9C, phi_f2_2, 25.0f * phi_f16_2 * camera->speedRatio);
+ rwData->unk_10 = 120.0f;
+ spD0 = phi_f16_2;
+ } else if ((roData->interfaceFlags & NORMAL1_FLAG_7) && (rwData->unk_0A < 0)) {
+ phi_f0_4 = rwData->unk_0A / -1200.0f; // May be used to swap $f registers
+ Camera_CalcAtForNormal1(
+ camera, &sp9C,
+ phi_f2_2 - ((phi_f2_2 - ((0.8f - ((68.0f / sp88) * -0.2f)) * sp88 * -0.45f)) * phi_f0_4 * 0.75f),
+ 10.0f * phi_f0_4);
+ rwData->unk_10 = 120.0f;
+ spD0 = phi_f16_2;
+ //! FAKE
+ if (0) {}
+ } else if (roData->interfaceFlags & NORMAL1_FLAG_3) {
+ spD0 = phi_f16_2;
+ Camera_CalcAtForScreen(camera, &sp9C, roData->unk_00, &rwData->unk_00, rwData->unk_10);
+ if (rwData->unk_10 > 20.0f) {
+ rwData->unk_10 -= 0.2f;
+ }
+ } else {
+ spD0 = phi_f16_2;
+ Camera_CalcAtDefault(camera, &sp9C, phi_f2_2, roData->interfaceFlags & NORMAL1_FLAG_0);
+ rwData->unk_10 = 120.0f;
+ }
+
+ phi_f16_2 = spD0;
+ OLib_Vec3fDiffToVecGeo(&spB4, &camera->at, &camera->eyeNext);
+ if ((roData->interfaceFlags & NORMAL1_FLAG_7) && (rwData->unk_0A < 0)) {
+ if (camera->focalActor == &GET_PLAYER(camera->play)->actor) {
+ switch (((Player*)camera->focalActor)->transformation) {
+ case PLAYER_FORM_HUMAN:
+ phi_f16_2 = 66.0f;
+ break;
+
+ case PLAYER_FORM_DEKU:
+ phi_f16_2 = 66.0f;
+ break;
+
+ case PLAYER_FORM_ZORA:
+ phi_f16_2 = 115.0f;
+ break;
+
+ case PLAYER_FORM_GORON:
+ phi_f16_2 = 115.0f;
+ break;
+
+ case PLAYER_FORM_FIERCE_DEITY:
+ phi_f16_2 = roData->unk_04;
+ break;
+
+ default:
+ phi_f16_2 = roData->unk_04;
+ break;
+ }
+ }
+ phi_f0_4 = Camera_ClampDist2(camera, spB4.r, phi_f16_2, phi_f16_2, 0);
+ } else if (roData->interfaceFlags & NORMAL1_FLAG_7) {
+ phi_f0_4 = Camera_ClampDist2(camera, spB4.r, roData->unk_04, roData->unk_08, 1);
+ } else {
+ phi_f0_4 = Camera_ClampDist1(camera, spB4.r, roData->unk_04, roData->unk_08, rwData->unk_0A > 0);
+ }
+
+ camera->dist = spB4.r = phi_f0_4;
+
+ if (D_801EDC30[camera->camId].unk_64 != 0) {
+ //! FAKE
+ if (phi_v1_2) {}
+ spB4.pitch =
+ Camera_ScaledStepToCeilS(D_801EDC30[camera->camId].pitch, sp9C.pitch, 1.0f / camera->yawUpdateRateInv, 5);
+ spB4.yaw =
+ Camera_ScaledStepToCeilS(D_801EDC30[camera->camId].yaw, sp9C.yaw, 1.0f / camera->yawUpdateRateInv, 5);
+ } else {
+ if (roData->interfaceFlags & NORMAL1_FLAG_5) {
+ spB4.yaw = sp9C.yaw;
+ spB4.pitch = sp9C.pitch;
+ camera->animState = 20;
+ } else {
+ if (D_801ED920 != NULL) {
+ //! FAKE
+ if (sp40) {}
+ new_var3 = &D_801ED920->world.pos;
+ OLib_Vec3fDiffToVecGeo(&sp74, &sp40->pos, new_var3); // TODO: arg0 & arg1 swapped
+ sp72 = sp40->rot.y - sp74.yaw;
+ // Interface and shrink-window flags
+ if ((roData->interfaceFlags & 0xFF00) == 0xFF00) {
+ sp6C = 1.0f;
+ } else {
+ sp6C = 1.0f - (ABS(sp72) / 10922.0f);
+ }
+
+ if (ABS((s16)(sp9C.yaw - sp74.yaw)) < 0x4000) {
+ sp74.yaw += 0x8000;
+ }
+
+ if (!(roData->interfaceFlags & NORMAL1_FLAG_3) || !func_800CB924(camera)) {
+ spB4.yaw = Camera_CalcDefaultYaw(camera, sp9C.yaw, (s16)(sp40->rot.y - (s16)(sp72 * sp6C)),
+ roData->unk_14, spC0);
+ }
+
+ if (!(roData->interfaceFlags & NORMAL1_FLAG_3) || (camera->speedRatio < 0.01f)) {
+ spB4.pitch = Camera_CalcDefaultPitch(
+ camera, sp9C.pitch, roData->unk_20 + (s16)((roData->unk_20 - sp74.pitch) * sp6C * 0.75f),
+ rwData->unk_08);
+ }
+ dummy:; // TODO: Will this be needed?
+ } else if (roData->interfaceFlags & NORMAL1_FLAG_1) {
+ if ((camera->speedRatio > 0.1f) || (rwData->unk_0A > 0x4B0)) {
+ OLib_Vec3fToVecGeo(&sp64, &camera->unk_0F0);
+ if (!(roData->interfaceFlags & NORMAL1_FLAG_3) || !func_800CB924(camera)) {
+ spB4.yaw = Camera_CalcDefaultYaw(camera, sp9C.yaw, sp64.yaw, roData->unk_14, spC0);
+ }
+ if (!(roData->interfaceFlags & NORMAL1_FLAG_3)) {
+ spB4.pitch = Camera_CalcDefaultPitch(camera, sp9C.pitch, roData->unk_20, rwData->unk_08);
+ } else if ((camera->unk_0F0.y > 0.0f) && func_800CB924(camera)) {
+ spB4.pitch = Camera_CalcDefaultPitch(camera, sp9C.pitch, roData->unk_20, rwData->unk_08);
+ }
+ } else {
+ spB4.yaw = sp9C.yaw;
+ spB4.pitch = sp9C.pitch;
+ dummy4:; // TODO: Will this be needed?
+ }
+ } else {
+ spB4.yaw = Camera_CalcDefaultYaw(camera, sp9C.yaw, sp40->rot.y, roData->unk_14, spC0);
+ if (!(roData->interfaceFlags & NORMAL1_FLAG_3) || (camera->speedRatio < 0.1f)) {
+ spB4.pitch = Camera_CalcDefaultPitch(camera, sp9C.pitch, roData->unk_20, rwData->unk_08);
+ }
+ }
+ }
+ }
+
+ // 76.9 degrees
+ if (spB4.pitch > 0x36B0) {
+ spB4.pitch = 0x36B0;
+ }
+
+ // -76.9 degrees
+ if (spB4.pitch < -0x36B0) {
+ spB4.pitch = -0x36B0;
+ }
+
+ OLib_AddVecGeoToVec3f(&camera->eyeNext, &camera->at, &spB4);
+ if ((camera->status == CAM_STATUS_ACTIVE) && !(roData->interfaceFlags & NORMAL1_FLAG_4) && (spC4 <= 0.9f)) {
+
+ if (func_800CBA7C(camera) == 0) {
+ Camera_CalcDefaultSwing(camera, &spB4, &sp9C, roData->unk_04, roData->unk_0C, &D_801EDC30[camera->camId],
+ &rwData->unk_0C);
+ sp58 = BgCheck_CameraRaycastFloor2(&camera->play->colCtx, &sp60, &sp5C, sp4C);
+ if ((roData->interfaceFlags & NORMAL1_FLAG_3) && func_800CB924(camera)) {
+ phi_f16_2 = 25.0f;
+ } else {
+ phi_f16_2 = 5.0f;
+ }
+ spD0 = sp4C->y; // TODO: another fake reuse of temp
+ phi_f0_4 = sp4C->y;
+ phi_f0_4 -= sp58;
+ // new_var2 = sp4C->y;
+ if ((sp58 != BGCHECK_Y_MIN) && (phi_f0_4 < phi_f16_2)) {
+ sp4C->y = sp58 + phi_f16_2;
+ } else if ((camera->waterYPos != camera->focalActorFloorHeight) && ((spD0 - camera->waterYPos) < 5.0f) &&
+ ((spD0 - camera->waterYPos) > -5.0f)) {
+ sp4C->y = camera->waterYPos + 5.0f;
+ }
+ }
+
+ OLib_Vec3fDiffToVecGeo(&spAC, sp4C, &camera->at);
+ camera->inputDir.x = spAC.pitch;
+ camera->inputDir.y = spAC.yaw;
+ camera->inputDir.z = 0;
+ if (gSaveContext.save.saveInfo.playerData.health < 17) {
+ phi_v1_2 = (camera->play->state.frames << 0x18);
+ phi_v1_2 = (s16)((phi_v1_2 >> 0x15) & 0xFD68);
+ camera->inputDir.y += phi_v1_2;
+ }
+ } else {
+ D_801EDC30[camera->camId].swingUpdateRate = roData->unk_0C;
+ D_801EDC30[camera->camId].unk_64 = 0;
+ sUpdateCameraDirection = false;
+ *sp4C = camera->eyeNext;
+ }
+
+ // Everything below OLib_Vec3fDiffToVecGeo matches except stack pointers
+ // )
+
+ phi_f2 = (gSaveContext.save.saveInfo.playerData.health <= 16) ? 0.8f : 1.0f;
+ camera->fov = Camera_ScaledStepToCeilF(roData->unk_18 * phi_f2, camera->fov, camera->fovUpdateRate, 0.1f);
+
+ if (roData->interfaceFlags & NORMAL1_FLAG_2) {
+ spD4 = Math_SinS((s16)(spA4.yaw - spB4.yaw));
+ camera->roll = Camera_ScaledStepToCeilS(((Rand_ZeroOne() - 0.5f) * 500.0f * camera->speedRatio) +
+ (spD4 * spD4 * spD4 * 10000.0f),
+ camera->roll, 0.1f, 5);
+ } else {
+ if (gSaveContext.save.saveInfo.playerData.health <= 16) {
+ phi_a0 = (Rand_ZeroOne() - 0.5f) * 100.0f * camera->speedRatio;
+ } else {
+ phi_a0 = 0.0f;
+ }
+ camera->roll = Camera_ScaledStepToCeilS(phi_a0, camera->roll, 0.2f, 5);
+ }
+
+ camera->atLerpStepScale = Camera_ClampLerpScale(camera, roData->unk_1C);
+ rwData->unk_0C &= ~1;
+
+ return true;
+}
+#else
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Normal1.s")
+#endif
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Normal2.s")
+/**
+ * Unused Camera RemoteBomb Setting
+ */
+s32 Camera_Normal2(Camera* camera) {
+ return Camera_Noop(camera);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Normal3.s")
+#define NORMAL3_RW_FLAG (1 << 0)
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Normal4.s")
+/**
+ * Riding Epona and Zora
+ */
+s32 Camera_Normal3(Camera* camera) {
+ Normal3ReadOnlyData* roData = &camera->paramData.norm3.roData;
+ Normal3ReadWriteData* rwData = &camera->paramData.norm3.rwData;
+ f32 sp8C;
+ f32 sp90;
+ f32 temp_f2; // multi-use temp
+ f32 sp88;
+ VecGeo sp80;
+ VecGeo sp78;
+ VecGeo sp70;
+ VecGeo sp68;
+ f32 phi_f2;
+ s16 sp62;
+ s16 phi_v1_2;
+ Player* player = (Player*)camera->focalActor;
+ Vec3f* eye = &camera->eye;
+ Vec3f* at = &camera->at;
+ Vec3f* eyeNext = &camera->eyeNext;
+ PosRot* focalActorPosRot = &camera->focalActorPosRot;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Normal0.s")
+ temp_f2 = Camera_GetFocalActorHeight(camera);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Parallel1.s")
+ if ((camera->setting == CAM_SET_HORSE) && (player->rideActor == NULL)) {
+ Camera_ChangeSettingFlags(camera, camera->prevSetting, CAM_CHANGE_SETTING_1);
+ return 1;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Parallel2.s")
+ if (RELOAD_PARAMS(camera)) {
+ CameraModeValue* values = sCameraSettings[camera->setting].cameraModes[camera->mode].values;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Parallel3.s")
+ temp_f2 = CAM_RODATA_UNSCALE(temp_f2);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Parallel4.s")
+ roData->yOffset = GET_NEXT_RO_DATA(values) * temp_f2;
+ roData->distMin = GET_NEXT_RO_DATA(values) * temp_f2;
+ roData->distMax = GET_NEXT_RO_DATA(values) * temp_f2;
+ roData->pitchTarget = CAM_DEG_TO_BINANG(GET_NEXT_RO_DATA(values));
+ roData->yawUpdateRateInv = GET_NEXT_RO_DATA(values);
+ roData->pitchUpdateRateInv = GET_NEXT_RO_DATA(values);
+ roData->fovTarget = GET_NEXT_RO_DATA(values);
+ roData->maxAtLERPScale = GET_NEXT_SCALED_RO_DATA(values);
+ roData->interfaceFlags = GET_NEXT_RO_DATA(values);
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Parallel0.s")
+ OLib_Vec3fDiffToVecGeo(&sp70, at, eye);
+ OLib_Vec3fDiffToVecGeo(&sp68, at, eyeNext);
+ sUpdateCameraDirection = true;
+ sCameraInterfaceFlags = roData->interfaceFlags;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Jump1.s")
+ //! FAKE: fake temp
+ phi_v1_2 = camera->animState;
+ if (!(((phi_v1_2 == 0) || (phi_v1_2 == 10)) || (phi_v1_2 == 20))) {
+ } else {
+ rwData->isZero = 0;
+ rwData->curPitch = 0;
+ rwData->yPosOffset = camera->focalActorFloorHeight;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Jump2.s")
+ D_801EDC30[camera->camId].yaw = D_801EDC30[camera->camId].pitch = D_801EDC30[camera->camId].unk_64 = 0;
+ D_801EDC30[camera->camId].swingUpdateRate = roData->yawUpdateRateInv;
+ rwData->yawUpdateRate = BINANG_SUB(BINANG_ROT180(camera->focalActorPosRot.rot.y), sp70.yaw) * (1.0f / 6.0f);
+ rwData->distTimer = 0;
+ rwData->is1200 = 1200;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Jump3.s")
+ if (roData->interfaceFlags & NORMAL3_FLAG_1) {
+ rwData->yawTimer = 6;
+ Camera_SetStateFlag(camera, CAM_STATE_DISABLE_MODE_CHANGE);
+ } else {
+ rwData->yawTimer = 0;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Jump4.s")
+ camera->animState = 1;
+ D_801EDC30[camera->camId].timer = 0;
+ rwData->flag = NORMAL3_RW_FLAG;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Jump0.s")
+ if (rwData->distTimer != 0) {
+ rwData->distTimer--;
+ }
+ sp90 = ((camera->speedRatio * 3.0f) + 1.0f) * 0.25f * 0.5f;
+ sp8C = temp_f2 = camera->speedRatio * 0.2f;
+
+ if (D_801EDC30[camera->camId].timer != 0) {
+ camera->yawUpdateRateInv = Camera_ScaledStepToCeilF(
+ (D_801EDC30[camera->camId].timer * 2) + roData->yawUpdateRateInv, camera->yawUpdateRateInv, sp90, 0.1f);
+ camera->pitchUpdateRateInv = Camera_ScaledStepToCeilF((D_801EDC30[camera->camId].timer * 2) + 16.0f,
+ camera->pitchUpdateRateInv, sp8C, 0.1f);
+ D_801EDC30[camera->camId].timer--;
+ } else {
+ camera->yawUpdateRateInv =
+ Camera_ScaledStepToCeilF(roData->yawUpdateRateInv, camera->yawUpdateRateInv, sp90, 0.1f);
+ camera->pitchUpdateRateInv = Camera_ScaledStepToCeilF(16.0f, camera->pitchUpdateRateInv, sp8C, 0.1f);
+ }
+
+ camera->yOffsetUpdateRate = Camera_ScaledStepToCeilF(0.05f, camera->yOffsetUpdateRate, sp90, 0.001f);
+ camera->xzOffsetUpdateRate = Camera_ScaledStepToCeilF(0.05f, camera->xzOffsetUpdateRate, sp8C, 0.0001f);
+ camera->fovUpdateRate = Camera_ScaledStepToCeilF(0.05f, camera->fovUpdateRate, sp8C, 0.0001f);
+
+ phi_v1_2 = Camera_GetPitchAdjFromFloorHeightDiffs(camera, BINANG_ROT180(sp70.yaw), rwData->flag & NORMAL3_RW_FLAG);
+ temp_f2 = ((1.0f / roData->pitchUpdateRateInv) * 0.5f) * (1.0f - camera->speedRatio);
+ rwData->curPitch =
+ Camera_ScaledStepToCeilS(phi_v1_2, rwData->curPitch, ((1.0f / roData->pitchUpdateRateInv) * 0.5f) + temp_f2, 5);
+
+ if ((roData->interfaceFlags & NORMAL3_FLAG_6) || (player->rideActor == NULL)) {
+ Camera_CalcAtDefault(camera, &sp68, roData->yOffset, 1);
+ } else {
+ Camera_CalcAtForHorse(camera, &sp68, roData->yOffset, &rwData->yPosOffset, 1);
+ }
+
+ sp88 = (roData->distMax + roData->distMin) * 0.5f;
+ OLib_Vec3fDiffToVecGeo(&sp80, at, eyeNext);
+ temp_f2 = Camera_ClampDist1(camera, sp80.r, roData->distMin, roData->distMax, rwData->distTimer);
+
+ phi_f2 = sp88 - temp_f2;
+ phi_f2 *= 0.002f;
+ camera->dist = sp80.r = temp_f2 + phi_f2;
+
+ if (roData->interfaceFlags & NORMAL3_FLAG_7) {
+ sp80.pitch = Camera_ScaledStepToCeilS(camera->focalActor->focus.rot.x - rwData->curPitch, sp68.pitch, 0.25f, 5);
+ } else {
+ sp62 = roData->pitchTarget - rwData->curPitch;
+ sp80.pitch = Camera_ScaledStepToCeilS(sp62, sp68.pitch, 1.0f / camera->pitchUpdateRateInv, 5);
+ }
+
+ sp80.pitch = CLAMP_MAX(sp80.pitch, DEG_TO_BINANG(79.655f));
+
+ if (sp80.pitch < -DEG_TO_BINANG(29.995f)) {
+ sp80.pitch = -DEG_TO_BINANG(29.995f);
+ }
+
+ if (roData->interfaceFlags & NORMAL3_FLAG_7) {
+ sp62 = BINANG_SUB(camera->focalActor->focus.rot.y, BINANG_ROT180(sp68.yaw));
+ temp_f2 = 1.0f;
+ } else {
+ sp62 = BINANG_SUB(focalActorPosRot->rot.y, BINANG_ROT180(sp68.yaw));
+ OLib_Vec3fToVecGeo(&sp78, &camera->unk_0F0);
+ phi_v1_2 = focalActorPosRot->rot.y - sp78.yaw;
+ if (phi_v1_2 < 0) {
+ phi_v1_2 *= -1;
+ }
+
+ if (phi_v1_2 < 0x555A) {
+ temp_f2 = 1.0f;
+ } else {
+ temp_f2 = ((f32)0x8000 - phi_v1_2) / (f32)0x2AA6;
+ }
+ }
+
+ sp90 = (sp62 * ((SQ(camera->speedRatio) * 0.8f) + 0.2f) * temp_f2) / camera->yawUpdateRateInv;
+ if ((Camera_fabsf(sp90) > 150.0f) && (camera->speedRatio > 0.05f)) {
+ sp80.yaw = sp68.yaw + sp90;
+ }
+
+ if (rwData->yawTimer > 0) {
+ sp80.yaw += rwData->yawUpdateRate;
+ rwData->yawTimer--;
+ if (rwData->yawTimer == 0) {
+ Camera_UnsetStateFlag(camera, CAM_STATE_DISABLE_MODE_CHANGE);
+ }
+ }
+
+ OLib_AddVecGeoToVec3f(eyeNext, at, &sp80);
+
+ if (camera->status == CAM_STATUS_ACTIVE) {
+ *eye = *eyeNext;
+ func_800CBFA4(camera, at, eye, 0);
+ } else {
+ *eye = *eyeNext;
+ }
+
+ camera->fov = Camera_ScaledStepToCeilF(roData->fovTarget, camera->fov, camera->fovUpdateRate, 0.1f);
+
+ if (roData->interfaceFlags & NORMAL3_FLAG_5) {
+ camera->roll = Camera_ScaledStepToCeilS(0, camera->roll, 0.05f, 5);
+ } else {
+ camera->roll = Camera_ScaledStepToCeilS(0, camera->roll, 0.1f, 5);
+ }
+
+ camera->atLerpStepScale = Camera_ClampLerpScale(camera, roData->maxAtLERPScale);
+ rwData->flag &= ~NORMAL3_RW_FLAG;
+
+ return 1;
+}
+
+/**
+ * Used for the unknown Naname setting.
+ * Identical to Normal1 except reads camera scene data to apply a camera roll
+ */
+s32 Camera_Normal4(Camera* camera) {
+ BgCamFuncData* bgCamFuncData;
+ s16 roll;
+
+ if (RELOAD_PARAMS(camera)) {
+ bgCamFuncData = (BgCamFuncData*)Camera_GetBgCamOrActorCsCamFuncData(camera, camera->bgCamIndex);
+ D_801EDBF0 = bgCamFuncData->rot.z;
+ }
+
+ roll = camera->roll;
+ Camera_Normal1(camera);
+ camera->roll = Camera_ScaledStepToCeilS(D_801EDBF0, roll, 0.05f, 5);
+
+ return 1;
+}
+
+s32 Camera_Normal0(Camera* camera) {
+ f32 phi_f0;
+ f32 yNormal;
+ s32 pad;
+ f32 playerHeight;
+ f32 spA4;
+ f32 spA0;
+ VecGeo sp98;
+ VecGeo sp90;
+ VecGeo sp88;
+ VecGeo sp80;
+ VecGeo sp78;
+ Vec3f* eye = &camera->eye;
+ Vec3f* at = &camera->at;
+ Vec3f* eyeNext = &camera->eyeNext;
+ PosRot* focalActorPosRot = &camera->focalActorPosRot;
+ s16 temp_v1_2;
+ s16 phi_a1;
+ s16 phi_a0;
+ BgCamFuncData* bgCamFuncData;
+ f32 new_var;
+ Normal0ReadOnlyData* roData = &camera->paramData.norm0.roData;
+ Normal0ReadWriteData* rwData = &camera->paramData.norm0.rwData;
+
+ playerHeight = Player_GetHeight((Player*)camera->focalActor);
+ yNormal = 0.8f - ((68.0f / playerHeight) * -0.2f);
+
+ if (!RELOAD_PARAMS(camera)) {
+ } else {
+ CameraModeValue* values = sCameraSettings[camera->setting].cameraModes[camera->mode].values;
+
+ roData->unk_00 = GET_NEXT_SCALED_RO_DATA(values) * playerHeight * yNormal;
+ roData->unk_04 = GET_NEXT_SCALED_RO_DATA(values) * playerHeight * yNormal;
+ roData->unk_08 = GET_NEXT_SCALED_RO_DATA(values) * playerHeight * yNormal;
+ roData->unk_1C = CAM_DEG_TO_BINANG(GET_NEXT_RO_DATA(values));
+ roData->unk_0C = GET_NEXT_RO_DATA(values);
+ roData->unk_10 = GET_NEXT_SCALED_RO_DATA(values);
+ roData->unk_14 = GET_NEXT_RO_DATA(values);
+ roData->unk_18 = GET_NEXT_SCALED_RO_DATA(values);
+ roData->interfaceFlags = GET_NEXT_RO_DATA(values);
+ }
+
+ sCameraInterfaceFlags = roData->interfaceFlags;
+
+ if (RELOAD_PARAMS(camera)) {
+ bgCamFuncData = (BgCamFuncData*)Camera_GetBgCamOrActorCsCamFuncData(camera, camera->bgCamIndex);
+ Camera_Vec3sToVec3f(&rwData->unk_00, &bgCamFuncData->pos);
+ rwData->unk_20 = bgCamFuncData->rot.x;
+ rwData->unk_22 = bgCamFuncData->rot.y;
+ rwData->unk_24 = focalActorPosRot->pos.y;
+ if (bgCamFuncData->fov == -1) {
+ rwData->unk_1C = roData->unk_14;
+ } else {
+ if (bgCamFuncData->fov > 360) {
+ phi_f0 = CAM_RODATA_UNSCALE(bgCamFuncData->fov);
+ } else {
+ phi_f0 = bgCamFuncData->fov;
+ }
+ rwData->unk_1C = phi_f0;
+ }
+
+ if (bgCamFuncData->unk_0E == -1) {
+ rwData->unk_2C = 0;
+ } else {
+ rwData->unk_2C = bgCamFuncData->unk_0E;
+ }
+
+ rwData->unk_18 = 0.0f;
+ rwData->unk_28 = 120.0f;
+
+ if (roData->interfaceFlags & NORMAL0_FLAG_2) {
+ sp88.pitch = rwData->unk_20;
+ sp88.yaw = rwData->unk_22;
+ sp88.r = 100.0f;
+ OLib_VecGeoToVec3f(&rwData->unk_0C, &sp88);
+ }
+ camera->animState = 1;
+ camera->yawUpdateRateInv = 50.0f;
+ } else {
+ if (func_800CB950(camera)) {
+ rwData->unk_24 = focalActorPosRot->pos.y;
+ }
+ //! FAKE:
+ if (1) {}
+ }
+
+ OLib_Vec3fDiffToVecGeo(&sp80, at, eye);
+ OLib_Vec3fDiffToVecGeo(&sp78, at, eyeNext);
+
+ camera->speedRatio *= 0.50f;
+ spA4 = camera->speedRatio * 0.5f;
+ spA0 = camera->speedRatio * 0.2f;
+
+ camera->yawUpdateRateInv =
+ Camera_ScaledStepToCeilF(roData->unk_0C, camera->yawUpdateRateInv * camera->speedRatio, 0.5f, 0.1f);
+ camera->pitchUpdateRateInv = Camera_ScaledStepToCeilF(16.0f, camera->pitchUpdateRateInv, spA0, 0.1f);
+ camera->yOffsetUpdateRate = Camera_ScaledStepToCeilF(0.05f, camera->yOffsetUpdateRate, spA4, 0.0001f);
+ camera->xzOffsetUpdateRate = Camera_ScaledStepToCeilF(0.05f, camera->xzOffsetUpdateRate, spA0, 0.0001f);
+ camera->fovUpdateRate = Camera_ScaledStepToCeilF(0.05, camera->fovUpdateRate, camera->speedRatio * 0.05f, 0.0001f);
+
+ if (!(roData->interfaceFlags & NORMAL0_FLAG_7)) {
+ Camera_CalcAtDefault(camera, &sp78, roData->unk_00, roData->interfaceFlags & NORMAL0_FLAG_0);
+ rwData->unk_28 = 120.0f;
+ } else {
+ Camera_CalcAtForScreen(camera, &sp78, roData->unk_00, &rwData->unk_24, rwData->unk_28);
+ if (rwData->unk_28 > 20.0f) {
+ rwData->unk_28 -= 0.2f;
+ }
+ }
+
+ if (roData->interfaceFlags & NORMAL0_FLAG_2) {
+ rwData->unk_00.x = focalActorPosRot->pos.x + rwData->unk_0C.x;
+ rwData->unk_00.z = focalActorPosRot->pos.z + rwData->unk_0C.z;
+ }
+
+ rwData->unk_00.y = focalActorPosRot->pos.y;
+ OLib_Vec3fDiffToVecGeo(&sp88, &rwData->unk_00, at);
+ OLib_Vec3fDiffToVecGeo(&sp90, at, eyeNext);
+
+ if (rwData->unk_2C & 2) {
+ phi_a1 = rwData->unk_22;
+ } else {
+ phi_a1 = roData->unk_1C;
+ }
+
+ temp_v1_2 = sp90.yaw - sp88.yaw;
+ if (((phi_a1 <= 0x4000) && (phi_a1 < ABS(temp_v1_2))) || ((phi_a1 > 0x4000) && (ABS(temp_v1_2) < phi_a1))) {
+ //! FAKE: Needed to swap v0/v1
+ if (1) {}
+ if (1) {}
+ if (1) {}
+ if (1) {}
+
+ //! FAKE: Needed because the *1.0f isn't being multiplied
+ new_var = 1.0f;
+
+ if (temp_v1_2 < 0) {
+ phi_a0 = -phi_a1;
+ } else {
+ phi_a0 = phi_a1;
+ }
+
+ phi_a0 += sp88.yaw;
+ sp98.yaw = Camera_ScaledStepToCeilS(phi_a0, sp80.yaw,
+ (1.0f / camera->yawUpdateRateInv) * new_var * camera->speedRatio, 5);
+ if (rwData->unk_2C & 1) {
+ sp98.pitch = Camera_CalcDefaultPitch(camera, sp78.pitch, rwData->unk_20, 0);
+ } else {
+ sp98.pitch = sp80.pitch;
+ }
+ } else {
+ sp98 = sp90;
+ }
+
+ camera->dist = sp98.r = Camera_ClampDist1(camera, sp90.r, roData->unk_04, roData->unk_08, 0);
+ if (!(rwData->unk_2C & 1)) {
+ if (sp98.pitch > 0xE38) { // 20 degrees
+ sp98.pitch += ((s16)(0xE38 - sp98.pitch) >> 2);
+ }
+ if (sp98.pitch < 0) {
+ sp98.pitch += ((s16)(-0x38E - sp98.pitch) >> 2);
+ }
+ }
+ OLib_AddVecGeoToVec3f(eyeNext, at, &sp98);
+
+ *eye = *eyeNext;
+
+ if (camera->status == CAM_STATUS_ACTIVE) {
+ if ((camera->play->envCtx.skyboxDisabled == 0) || (roData->interfaceFlags & NORMAL0_FLAG_4)) {
+ Camera_BgCheck(camera, at, eye);
+ } else {
+ func_800CBFA4(camera, at, eye, 3);
+ OLib_Vec3fDiffToVecGeo(&sp98, eye, at);
+ camera->inputDir.x = sp98.pitch;
+ camera->inputDir.y = sp98.yaw;
+ camera->inputDir.z = 0;
+ }
+ }
+
+ camera->fov = Camera_ScaledStepToCeilF(rwData->unk_1C, camera->fov, camera->fovUpdateRate, 0.1f);
+ camera->roll = Camera_ScaledStepToCeilS(0, camera->roll, 0.5f, 5);
+ camera->atLerpStepScale = Camera_ClampLerpScale(camera, roData->unk_18);
+
+ return 1;
+}
+
+/**
+ * Used for targeting
+ */
+s32 Camera_Parallel1(Camera* camera) {
+ Vec3f* eye = &camera->eye;
+ Vec3f* at = &camera->at;
+ Vec3f* eyeNext = &camera->eyeNext;
+ Vec3f spB0;
+ Vec3f spA4;
+ f32 spA0;
+ f32 sp9C;
+ PosRot* focalActorPosRot = &camera->focalActorPosRot;
+ VecGeo sp90;
+ VecGeo sp88;
+ VecGeo sp80;
+ VecGeo sp78;
+ BgCamFuncData* bgCamFuncData;
+ s16 sp72;
+ s16 tangle;
+ Parallel1ReadOnlyData* roData = &camera->paramData.para1.roData;
+ Parallel1ReadWriteData* rwData = &camera->paramData.para1.rwData;
+ s32 parallelFlagCond;
+ f32 focalActorHeight = Camera_GetFocalActorHeight(camera);
+ s16 new_var2;
+ s16 phi_a0;
+ s32 phi_a0_2;
+ CameraModeValue* values;
+ f32 yNormal;
+
+ if (!RELOAD_PARAMS(camera)) {
+ } else {
+ values = sCameraSettings[camera->setting].cameraModes[camera->mode].values;
+ roData->unk_00 =
+ GET_NEXT_SCALED_RO_DATA(values) * focalActorHeight * (0.8f - ((68.0f / focalActorHeight) * -0.2f));
+ roData->unk_04 =
+ GET_NEXT_SCALED_RO_DATA(values) * focalActorHeight * (0.8f - ((68.0f / focalActorHeight) * -0.2f));
+ roData->unk_08 =
+ GET_NEXT_SCALED_RO_DATA(values) * focalActorHeight * (0.8f - ((68.0f / focalActorHeight) * -0.2f));
+ roData->unk_20 = CAM_DEG_TO_BINANG(GET_NEXT_RO_DATA(values));
+ roData->unk_22 = CAM_DEG_TO_BINANG(GET_NEXT_RO_DATA(values));
+ roData->unk_0C = GET_NEXT_RO_DATA(values);
+ roData->unk_10 = GET_NEXT_RO_DATA(values);
+ roData->unk_14 = GET_NEXT_RO_DATA(values);
+ roData->unk_18 = GET_NEXT_SCALED_RO_DATA(values);
+ roData->interfaceFlags = GET_NEXT_RO_DATA(values);
+ roData->unk_1C = GET_NEXT_SCALED_RO_DATA(values);
+ roData->unk_24 = GET_NEXT_RO_DATA(values);
+ rwData->unk_00 = roData->unk_04;
+ }
+
+ OLib_Vec3fDiffToVecGeo(&sp80, at, eye);
+ OLib_Vec3fDiffToVecGeo(&sp78, at, eyeNext);
+ Camera_GetFocalActorPos(&spA4, camera);
+
+ switch (camera->animState) {
+ case 20:
+ if ((roData->interfaceFlags & (PARALLEL1_FLAG_3 | PARALLEL1_FLAG_2 | PARALLEL1_FLAG_1)) == 0) {
+ Camera_SetUpdateRatesFastYaw(camera);
+ }
+ // fallthrough
+ case 0:
+ case 10:
+ if ((roData->interfaceFlags & (PARALLEL1_FLAG_3 | PARALLEL1_FLAG_2 | PARALLEL1_FLAG_1)) ==
+ (PARALLEL1_FLAG_2 | PARALLEL1_FLAG_1)) {
+ rwData->unk_10 = focalActorPosRot->pos;
+ } else {
+ camera->xzOffsetUpdateRate = 0.5f;
+ camera->yOffsetUpdateRate = 0.5f;
+ }
+
+ if ((roData->interfaceFlags & (PARALLEL1_FLAG_3 | PARALLEL1_FLAG_2 | PARALLEL1_FLAG_1)) ==
+ PARALLEL1_FLAG_3) {
+ rwData->unk_10 = camera->focalActorPosRot.pos;
+ }
+
+ rwData->timer1 = 200.0f;
+
+ if ((2.0f * roData->unk_04) < camera->dist) {
+ camera->dist = 2.0f * roData->unk_04;
+ sp78.r = camera->dist;
+ sp80.r = sp78.r;
+ OLib_AddVecGeoToVec3f(eye, at, &sp80);
+ *eyeNext = *eye;
+ }
+
+ rwData->unk_1C = 0;
+
+ if (roData->interfaceFlags & PARALLEL1_FLAG_2) {
+ rwData->timer2 = 20;
+ } else {
+ rwData->timer2 = 6;
+ }
+
+ if ((camera->focalActor == &GET_PLAYER(camera->play)->actor) && (camera->mode == CAM_MODE_CHARGE)) {
+ rwData->timer2 = 30;
+ if (((Player*)camera->focalActor)->transformation == PLAYER_FORM_DEKU) {
+ roData->unk_24 = -1;
+ }
+ }
+
+ if ((roData->interfaceFlags & (PARALLEL1_FLAG_3 | PARALLEL1_FLAG_2 | PARALLEL1_FLAG_1)) ==
+ (PARALLEL1_FLAG_3 | PARALLEL1_FLAG_1)) {
+ rwData->timer2 = 1;
+ yNormal = 0.8f - ((68.0f / focalActorHeight) * -0.2f);
+
+ bgCamFuncData = (BgCamFuncData*)Camera_GetBgCamOrActorCsCamFuncData(camera, camera->bgCamIndex);
+
+ rwData->unk_20 = bgCamFuncData->rot.x;
+ rwData->unk_1E = bgCamFuncData->rot.y;
+ rwData->unk_08 = (bgCamFuncData->fov == -1) ? roData->unk_14
+ : (bgCamFuncData->fov > 360) ? CAM_RODATA_UNSCALE(bgCamFuncData->fov)
+ : bgCamFuncData->fov;
+ rwData->unk_00 = (bgCamFuncData->unk_0E == -1)
+ ? roData->unk_04
+ : CAM_RODATA_UNSCALE(bgCamFuncData->unk_0E) * focalActorHeight * yNormal;
+ //! FAKE
+ dummy:;
+ } else {
+ rwData->unk_08 = roData->unk_14;
+ rwData->unk_00 = roData->unk_04;
+ }
+
+ rwData->timer3 = roData->unk_24;
+ rwData->unk_04 = focalActorPosRot->pos.y - camera->unk_0F0.y;
+ rwData->unk_26 = 1;
+ camera->animState = 1;
+ sCameraInterfaceFlags = roData->interfaceFlags;
+ break;
+ }
+
+ if (rwData->timer2 != 0) {
+ switch (roData->interfaceFlags & (PARALLEL1_FLAG_3 | PARALLEL1_FLAG_2 | PARALLEL1_FLAG_1)) {
+ case PARALLEL1_FLAG_1:
+ case (PARALLEL1_FLAG_3 | PARALLEL1_FLAG_2 | PARALLEL1_FLAG_1):
+ rwData->unk_1E = BINANG_ROT180(camera->focalActorPosRot.rot.y) + roData->unk_22;
+ rwData->unk_20 = roData->unk_20;
+ break;
+
+ case PARALLEL1_FLAG_2:
+ rwData->unk_1E = roData->unk_22;
+ rwData->unk_20 = roData->unk_20;
+ break;
+
+ case (PARALLEL1_FLAG_2 | PARALLEL1_FLAG_1):
+ if (rwData->timer3 == 1) {
+ OLib_Vec3fDiffToVecGeo(&sp88, &rwData->unk_10, &spA4);
+ rwData->unk_1E = ((ABS(BINANG_SUB(sp88.yaw, sp80.yaw)) < 0x3A98) || Camera_IsClimbingLedge(camera))
+ ? sp80.yaw
+ : sp80.yaw + (s16)((BINANG_SUB(sp88.yaw, sp80.yaw) >> 2) * 3);
+ }
+ rwData->unk_20 = roData->unk_20;
+ break;
+
+ case PARALLEL1_FLAG_3:
+ rwData->unk_1E = sp80.yaw;
+ rwData->unk_20 = roData->unk_20;
+ break;
+
+ case (PARALLEL1_FLAG_3 | PARALLEL1_FLAG_1):
+ break;
+
+ default:
+ rwData->unk_1E = sp78.yaw + roData->unk_22;
+ rwData->unk_20 = roData->unk_20;
+ break;
+ }
+ } else if (roData->interfaceFlags & PARALLEL1_FLAG_5) {
+ rwData->unk_1E = BINANG_ROT180(camera->focalActorPosRot.rot.y) + roData->unk_22;
+ }
+
+ if (camera->animState == 21) {
+ camera->animState = 1;
+ } else if (camera->animState == 11) {
+ camera->animState = 1;
+ }
+
+ spA0 = camera->speedRatio * 0.5f;
+ sp9C = camera->speedRatio * 0.2f;
+
+ if (((roData->interfaceFlags & (PARALLEL1_FLAG_3 | PARALLEL1_FLAG_2 | PARALLEL1_FLAG_1)) ==
+ (PARALLEL1_FLAG_2 | PARALLEL1_FLAG_1)) ||
+ ((roData->interfaceFlags & (PARALLEL1_FLAG_3 | PARALLEL1_FLAG_2 | PARALLEL1_FLAG_1)) == PARALLEL1_FLAG_3) ||
+ (roData->interfaceFlags & PARALLEL1_FLAG_5)) {
+ camera->rUpdateRateInv = Camera_ScaledStepToCeilF(20.0f, camera->rUpdateRateInv, 0.5f, 0.1f);
+ camera->yawUpdateRateInv = Camera_ScaledStepToCeilF(roData->unk_0C, camera->yawUpdateRateInv, 0.5f, 0.1f);
+ camera->pitchUpdateRateInv = Camera_ScaledStepToCeilF(20.0f, camera->pitchUpdateRateInv, 0.5f, 0.1f);
+ } else {
+ camera->rUpdateRateInv = Camera_ScaledStepToCeilF(20.0f, camera->rUpdateRateInv, spA0, 0.1f);
+ camera->yawUpdateRateInv = Camera_ScaledStepToCeilF(roData->unk_0C, camera->yawUpdateRateInv, spA0, 0.1f);
+ camera->pitchUpdateRateInv = Camera_ScaledStepToCeilF(2.0f, camera->pitchUpdateRateInv, sp9C, 0.1f);
+ }
+
+ if ((roData->interfaceFlags & (PARALLEL1_FLAG_3 | PARALLEL1_FLAG_2 | PARALLEL1_FLAG_1)) ==
+ (PARALLEL1_FLAG_3 | PARALLEL1_FLAG_2 | PARALLEL1_FLAG_1)) {
+ camera->yOffsetUpdateRate = Camera_ScaledStepToCeilF(0.1f, camera->yOffsetUpdateRate, spA0, 0.0001f);
+ camera->xzOffsetUpdateRate = Camera_ScaledStepToCeilF(0.1f, camera->xzOffsetUpdateRate, sp9C, 0.0001f);
+ } else if (roData->interfaceFlags & PARALLEL1_FLAG_7) {
+ camera->yOffsetUpdateRate = Camera_ScaledStepToCeilF(0.5f, camera->yOffsetUpdateRate, spA0, 0.0001f);
+ camera->xzOffsetUpdateRate = Camera_ScaledStepToCeilF(0.5f, camera->xzOffsetUpdateRate, sp9C, 0.0001f);
+ } else {
+ camera->yOffsetUpdateRate = Camera_ScaledStepToCeilF(0.05f, camera->yOffsetUpdateRate, spA0, 0.0001f);
+ camera->xzOffsetUpdateRate = Camera_ScaledStepToCeilF(0.05f, camera->xzOffsetUpdateRate, sp9C, 0.0001f);
+ }
+
+ // TODO: Extra trailing 0 in 0.050f needed?
+ camera->fovUpdateRate =
+ Camera_ScaledStepToCeilF(0.050f, camera->fovUpdateRate, camera->speedRatio * 0.05f, 0.0001f);
+
+ if (roData->interfaceFlags & PARALLEL1_FLAG_0) {
+ tangle = Camera_GetPitchAdjFromFloorHeightDiffs(camera, BINANG_ROT180(sp80.yaw), rwData->unk_26 = 1);
+ spA0 = ((1.0f / roData->unk_10));
+ spA0 *= 0.6f;
+ sp9C = ((1.0f / roData->unk_10) * 0.4f) * (1.0f - camera->speedRatio);
+ rwData->unk_1C = Camera_ScaledStepToCeilS(tangle, rwData->unk_1C, spA0 + sp9C, 5);
+ } else {
+ rwData->unk_1C = 0;
+ }
+
+ if (func_800CB950(camera) || (((Player*)camera->focalActor)->stateFlags1 & PLAYER_STATE1_1000) ||
+ (((Player*)camera->focalActor)->stateFlags3 & PLAYER_STATE3_100)) {
+ rwData->unk_04 = camera->focalActorPosRot.pos.y;
+ sp72 = false;
+ } else {
+ sp72 = true;
+ }
+
+ if ((((Player*)camera->focalActor)->stateFlags1 & PLAYER_STATE1_4000) ||
+ (((Player*)camera->focalActor)->stateFlags1 & PLAYER_STATE1_4) ||
+ ((roData->interfaceFlags & (PARALLEL1_FLAG_3 | PARALLEL1_FLAG_2 | PARALLEL1_FLAG_1)) ==
+ (PARALLEL1_FLAG_2 | PARALLEL1_FLAG_1))) {
+ spB0 = spA4;
+ spB0.y += ((focalActorHeight * 0.6f) + roData->unk_00);
+ Camera_ScaledStepToCeilVec3f(&spB0, at, camera->xzOffsetUpdateRate, camera->yOffsetUpdateRate, 0.0001f);
+ Camera_SetFocalActorAtOffset(camera, &focalActorPosRot->pos);
+ } else if ((roData->interfaceFlags & (PARALLEL1_FLAG_3 | PARALLEL1_FLAG_2 | PARALLEL1_FLAG_1)) ==
+ (PARALLEL1_FLAG_3 | PARALLEL1_FLAG_2 | PARALLEL1_FLAG_1)) {
+ spB0 = focalActorPosRot->pos;
+ spB0.y += focalActorHeight + roData->unk_00;
+ Camera_ScaledStepToCeilVec3f(&spB0, at, camera->xzOffsetUpdateRate, camera->yOffsetUpdateRate, 0.0001f);
+ Camera_SetFocalActorAtOffset(camera, &focalActorPosRot->pos);
+ } else if (rwData->timer2 != 0) {
+ Camera_CalcAtDefault(camera, &sp78, roData->unk_00, 0);
+ rwData->timer1 = 200.0f;
+ } else if (!(roData->interfaceFlags & PARALLEL1_FLAG_7) && !sp72) {
+ Camera_CalcAtForParallel(camera, &sp78, roData->unk_00, roData->unk_08, &rwData->unk_04,
+ roData->interfaceFlags & (PARALLEL1_FLAG_6 | PARALLEL1_FLAG_0));
+ rwData->timer1 = 200.0f;
+ } else {
+ Camera_CalcAtForScreen(camera, &sp78, roData->unk_00, &rwData->unk_04, rwData->timer1);
+ if (rwData->timer1 > 10.0f) {
+ rwData->timer1--;
+ }
+ }
+
+ camera->dist = Camera_ScaledStepToCeilF(rwData->unk_00, camera->dist, 1.0f / camera->rUpdateRateInv, 0.1f);
+
+ if (rwData->timer2 != 0) {
+ if (rwData->timer3 <= 0) {
+ if (rwData->timer3 == 0) {
+ Camera_SetStateFlag(camera, CAM_STATE_DISABLE_MODE_CHANGE);
+ }
+
+ tangle = ((rwData->timer2 + 1) * rwData->timer2) >> 1;
+ sp90.yaw = sp80.yaw + ((BINANG_SUB(rwData->unk_1E, sp80.yaw) / tangle) * rwData->timer2);
+ phi_a0 = ((roData->interfaceFlags & PARALLEL1_FLAG_0) ? BINANG_SUB(rwData->unk_20, rwData->unk_1C)
+ : rwData->unk_20);
+ new_var2 = BINANG_SUB(phi_a0, sp80.pitch);
+ sp90.pitch = sp80.pitch + ((new_var2 / tangle) * rwData->timer2);
+ sp90.r = camera->dist;
+ rwData->timer2--;
+ } else {
+ sp90 = sp80;
+ sp90.r = camera->dist;
+ }
+ } else {
+ OLib_Vec3fDiffToVecGeo(&sp90, at, eyeNext);
+ sp90.r = camera->dist;
+
+ if (roData->interfaceFlags & PARALLEL1_FLAG_1) {
+ sp90.yaw = Camera_ScaledStepToCeilS(rwData->unk_1E, sp78.yaw, 1.0f / camera->yawUpdateRateInv, 0xC8);
+ }
+
+ parallelFlagCond = (roData->interfaceFlags & (PARALLEL1_FLAG_3 | PARALLEL1_FLAG_2 | PARALLEL1_FLAG_1));
+
+ if (roData->interfaceFlags & PARALLEL1_FLAG_0) {
+ phi_a0 = (rwData->unk_20 - rwData->unk_1C);
+ } else {
+ phi_a0 = rwData->unk_20;
+ }
+
+ if (parallelFlagCond == (PARALLEL1_FLAG_3 | PARALLEL1_FLAG_2 | PARALLEL1_FLAG_1)) {
+ spA0 = CLAMP_MAX(camera->speedRatio, 1.0f);
+ phi_a0 = (sp90.pitch * spA0) + (phi_a0 * (1.0f - spA0));
+ sp90.pitch = Camera_ScaledStepToCeilS(phi_a0, sp78.pitch, 1.0f / camera->pitchUpdateRateInv, 5);
+ } else if (parallelFlagCond != PARALLEL1_FLAG_3) {
+ sp90.pitch = Camera_ScaledStepToCeilS(phi_a0, sp78.pitch, 1.0f / camera->pitchUpdateRateInv, 5);
+ }
+
+ if (sp90.pitch > DEG_TO_BINANG(79.655f)) {
+ sp90.pitch = DEG_TO_BINANG(79.655f);
+ }
+
+ if (sp90.pitch < -DEG_TO_BINANG(29.995f)) {
+ sp90.pitch = -DEG_TO_BINANG(29.995f);
+ }
+ }
+
+ if (rwData->timer3 > 0) {
+ rwData->timer3--;
+ }
+
+ OLib_AddVecGeoToVec3f(eyeNext, at, &sp90);
+
+ if (camera->status == CAM_STATUS_ACTIVE) {
+ if ((camera->play->envCtx.skyboxDisabled == 0) || (roData->interfaceFlags & PARALLEL1_FLAG_4)) {
+ spB0 = *at;
+ if ((((Player*)camera->focalActor)->stateFlags1 & PLAYER_STATE1_4000) ||
+ (((Player*)camera->focalActor)->stateFlags1 & PLAYER_STATE1_4) ||
+ ((roData->interfaceFlags & (PARALLEL1_FLAG_3 | PARALLEL1_FLAG_2 | PARALLEL1_FLAG_1)) ==
+ (PARALLEL1_FLAG_2 | PARALLEL1_FLAG_1))) {
+ spB0.y += focalActorHeight;
+ }
+ *eye = *eyeNext;
+ func_800CBFA4(camera, &spB0, eye, 0);
+ } else {
+ *eye = *eyeNext;
+ func_800CBFA4(camera, at, eye, 3);
+ }
+
+ if (rwData->timer2 != 0) {
+ sUpdateCameraDirection = true;
+ } else {
+ sUpdateCameraDirection = false;
+ }
+ }
+
+ camera->fov = Camera_ScaledStepToCeilF(rwData->unk_08, camera->fov, camera->fovUpdateRate, 0.1f);
+ camera->roll = Camera_ScaledStepToCeilS(0, camera->roll, 0.5f, 5);
+ camera->atLerpStepScale = Camera_ClampLerpScale(camera, sp72 ? roData->unk_1C : roData->unk_18);
+ rwData->unk_26 &= ~1;
+
+ return 1;
+}
+
+/**
+ * Unused Camera Maze Setting
+ */
+s32 Camera_Parallel2(Camera* camera) {
+ return Camera_Noop(camera);
+}
+
+s32 Camera_Parallel3(Camera* camera) {
+ return Camera_Noop(camera);
+}
+
+s32 Camera_Parallel4(Camera* camera) {
+ return Camera_Noop(camera);
+}
+
+s32 Camera_Parallel0(Camera* camera) {
+ return Camera_Noop(camera);
+}
+
+s32 Camera_Jump1(Camera* camera) {
+ return Camera_Noop(camera);
+}
+
+/**
+ * Camera for climbing structures
+ */
+s32 Camera_Jump2(Camera* camera) {
+ Vec3f* eye = &camera->eye;
+ Vec3f* at = &camera->at;
+ Vec3f* eyeNext = &camera->eyeNext;
+ Vec3f spC8;
+ Vec3f spBC;
+ VecGeo spB4;
+ VecGeo spAC;
+ VecGeo spA4;
+ VecGeo sp9C;
+ s16 temp_t2;
+ s16 yawDiff;
+ s32 pad;
+ f32 sp90;
+ f32 sp8C;
+ s32 sp88;
+ CameraCollision sp60;
+ PosRot* focalActorPosRot = &camera->focalActorPosRot;
+ Jump2ReadOnlyData* roData = &camera->paramData.jump2.roData;
+ Jump2ReadWriteData* rwData = &camera->paramData.jump2.rwData;
+ f32 phi_f2;
+ f32 yNormal; // used twice
+ f32 focalActorHeight = Camera_GetFocalActorHeight(camera);
+ f32 temp_f16;
+
+ if (RELOAD_PARAMS(camera)) {
+ CameraModeValue* values = sCameraSettings[camera->setting].cameraModes[camera->mode].values;
+
+ yNormal = 0.8f - (-0.2f * (68.0f / focalActorHeight));
+
+ if (camera->unk_0F0.y > 0.0f) {
+ phi_f2 = -10.0f;
+ } else {
+ phi_f2 = 10.0f;
+ }
+
+ roData->unk_00 = CAM_RODATA_UNSCALE(phi_f2 + GET_NEXT_RO_DATA(values)) * focalActorHeight * yNormal;
+ roData->unk_04 = GET_NEXT_SCALED_RO_DATA(values) * focalActorHeight * yNormal;
+ roData->unk_08 = GET_NEXT_SCALED_RO_DATA(values) * focalActorHeight * yNormal;
+ roData->unk_0C = GET_NEXT_SCALED_RO_DATA(values);
+ roData->unk_10 = GET_NEXT_RO_DATA(values);
+ roData->unk_14 = GET_NEXT_SCALED_RO_DATA(values);
+ roData->unk_18 = GET_NEXT_RO_DATA(values);
+ roData->unk_1C = GET_NEXT_SCALED_RO_DATA(values);
+ roData->interfaceFlags = GET_NEXT_RO_DATA(values);
+ }
+
+ OLib_Vec3fDiffToVecGeo(&sp9C, at, eye);
+ OLib_Vec3fDiffToVecGeo(&spA4, at, eyeNext);
+
+ sCameraInterfaceFlags = roData->interfaceFlags;
+
+ if (RELOAD_PARAMS(camera)) {
+ spC8 = focalActorPosRot->pos;
+ rwData->unk_00 = Camera_GetFloorY(camera, &spC8);
+ rwData->unk_04 = spA4.yaw;
+ rwData->unk_06 = 0;
+
+ if (rwData->unk_00 == BGCHECK_Y_MIN) {
+ rwData->unk_0A = -1;
+ rwData->unk_00 = focalActorPosRot->pos.y - 1000.0f;
+ } else if ((focalActorPosRot->pos.y - rwData->unk_00) < focalActorHeight) {
+ rwData->unk_0A = 1;
+ } else {
+ rwData->unk_0A = -1;
+ }
+
+ yawDiff = BINANG_SUB(BINANG_ROT180(focalActorPosRot->rot.y), spA4.yaw);
+ rwData->unk_06 = ((yawDiff / 6) / 4) * 3;
+
+ if (roData->interfaceFlags & JUMP2_FLAG_1) {
+ rwData->unk_08 = 10;
+ } else {
+ rwData->unk_08 = 10000;
+ }
+
+ focalActorPosRot->pos.x -= camera->unk_0F0.x;
+ focalActorPosRot->pos.y -= camera->unk_0F0.y;
+ focalActorPosRot->pos.z -= camera->unk_0F0.z;
+
+ rwData->timer = 6;
+ camera->animState++;
+ camera->atLerpStepScale = roData->unk_1C;
+ }
+
+ sp90 = camera->speedRatio * 0.5f;
+ sp8C = camera->speedRatio * 0.2f;
+
+ camera->yawUpdateRateInv = Camera_ScaledStepToCeilF(roData->unk_10, camera->yawUpdateRateInv, sp90, 0.1f);
+ camera->yOffsetUpdateRate = Camera_ScaledStepToCeilF(roData->unk_14, camera->yOffsetUpdateRate, sp90, 0.0001f);
+ camera->xzOffsetUpdateRate = Camera_ScaledStepToCeilF(0.05f, camera->xzOffsetUpdateRate, sp8C, 0.0001f);
+ camera->fovUpdateRate = Camera_ScaledStepToCeilF(0.05f, camera->fovUpdateRate, camera->speedRatio * .05f, 0.0001f);
+ camera->rUpdateRateInv = 1800.0f;
+
+ Camera_CalcAtDefault(camera, &spA4, roData->unk_00, 0);
+ OLib_Vec3fDiffToVecGeo(&spB4, at, eye);
+
+ //! FAKE: Unused
+ yNormal = roData->unk_04;
+
+ phi_f2 = roData->unk_08 + (roData->unk_08 * roData->unk_0C);
+ temp_f16 = roData->unk_04 - (roData->unk_04 * roData->unk_0C);
+
+ if (spB4.r > phi_f2) {
+ spB4.r = phi_f2;
+ } else if (spB4.r < temp_f16) {
+ spB4.r = temp_f16;
+ }
+
+ yawDiff = BINANG_SUB(BINANG_ROT180(focalActorPosRot->rot.y), spB4.yaw);
+ if (rwData->timer != 0) {
+ rwData->unk_04 = BINANG_ROT180(focalActorPosRot->rot.y);
+ rwData->timer--;
+ spB4.yaw = Camera_ScaledStepToCeilS(rwData->unk_04, spA4.yaw, 0.5f, 5);
+ } else if (rwData->unk_08 < ABS(yawDiff)) {
+ temp_t2 = BINANG_ROT180(focalActorPosRot->rot.y);
+ spB4.yaw = Camera_ScaledStepToFloorS((yawDiff < 0) ? (temp_t2 + rwData->unk_08) : (temp_t2 - rwData->unk_08),
+ spA4.yaw, 0.1f, 1);
+ } else {
+ spB4.yaw = Camera_ScaledStepToCeilS(spB4.yaw, spA4.yaw, 0.25f, 5);
+ }
+
+ spC8.x = focalActorPosRot->pos.x + (Math_SinS(focalActorPosRot->rot.y) * 25.0f);
+ spC8.y = focalActorPosRot->pos.y + (focalActorHeight * 2.2f);
+ spC8.z = focalActorPosRot->pos.z + (Math_CosS(focalActorPosRot->rot.y) * 25.0f);
+
+ yNormal = Camera_GetFloorYNorm(camera, &spBC, &spC8, &sp88);
+ if (camera->focalActor->bgCheckFlags & 0x10) {
+ camera->pitchUpdateRateInv = Camera_ScaledStepToCeilF(20.0f, camera->pitchUpdateRateInv, 0.2f, 0.1f);
+ camera->rUpdateRateInv = Camera_ScaledStepToCeilF(20.0f, camera->rUpdateRateInv, 0.2f, 0.1f);
+ spB4.pitch = Camera_ScaledStepToCeilS(-DEG_TO_BINANG(27.47f), spA4.pitch, 0.2f, 5);
+ } else if ((yNormal != BGCHECK_Y_MIN) && (focalActorPosRot->pos.y < yNormal)) {
+ camera->pitchUpdateRateInv = Camera_ScaledStepToCeilF(20.0f, camera->pitchUpdateRateInv, 0.2f, 0.1f);
+ camera->rUpdateRateInv = Camera_ScaledStepToCeilF(20.0f, camera->rUpdateRateInv, 0.2f, 0.1f);
+ if (camera->unk_0F0.y > 1.0f) {
+ spB4.pitch = Camera_ScaledStepToCeilS(0x1F4, spA4.pitch, 1.0f / camera->pitchUpdateRateInv, 5);
+ }
+ } else if ((focalActorPosRot->pos.y - rwData->unk_00) < focalActorHeight) {
+ camera->pitchUpdateRateInv = Camera_ScaledStepToCeilF(20.0f, camera->pitchUpdateRateInv, 0.2f, 0.1f);
+ camera->rUpdateRateInv = Camera_ScaledStepToCeilF(20.0f, camera->rUpdateRateInv, 0.2f, 0.1f);
+ if (camera->unk_0F0.y > 1.0f) {
+ spB4.pitch = Camera_ScaledStepToCeilS(0x1F4, spA4.pitch, 1.0f / camera->pitchUpdateRateInv, 5);
+ }
+ } else {
+ camera->pitchUpdateRateInv = 100.0f;
+ camera->rUpdateRateInv = 100.0f;
+ }
+
+ spB4.pitch = CLAMP_MAX(spB4.pitch, DEG_TO_BINANG(60.43f));
+ spB4.pitch = CLAMP_MIN(spB4.pitch, -DEG_TO_BINANG(60.43f));
+
+ OLib_AddVecGeoToVec3f(eyeNext, at, &spB4);
+ sp60.pos = *eyeNext;
+
+ if (func_800CBC84(camera, at, &sp60, 0) != 0) {
+ spC8 = sp60.pos;
+ spAC.pitch = 0;
+ spAC.r = spB4.r;
+ spAC.yaw = spB4.yaw;
+ OLib_AddVecGeoToVec3f(&sp60.pos, at, &spAC);
+ if (func_800CBC84(camera, at, &sp60, 0) != 0) {
+ *eye = spC8;
+ } else {
+ spB4.pitch = Camera_ScaledStepToCeilS(0, spB4.pitch, 0.2f, 5);
+ OLib_AddVecGeoToVec3f(eye, at, &spB4);
+ func_800CBFA4(camera, at, eye, 0);
+ }
+ } else {
+ *eye = *eyeNext;
+ }
+
+ camera->dist = spB4.r;
+ camera->fov = Camera_ScaledStepToCeilF(roData->unk_18, camera->fov, camera->fovUpdateRate, 0.1f);
+ camera->roll = Camera_ScaledStepToCeilS(0, camera->roll, 0.5f, 5);
+
+ return true;
+}
+
+/**
+ * Used for water-based camera settings
+ * e.g. Gyorg, Pinnacle Rock, whirlpool, water
+ */
+s32 Camera_Jump3(Camera* camera) {
+ Vec3f* sp48 = &camera->eye;
+ Vec3f* sp44 = &camera->at;
+ Vec3f* sp40 = &camera->eyeNext;
+ f32 spD0;
+ f32 spCC;
+ PosRot* focalActorPosRot = &camera->focalActorPosRot;
+ f32 phi_f0;
+ f32 spC0;
+ Vec3f spB4;
+ VecGeo spAC;
+ CameraModeValue* values;
+ f32 phi_f14;
+ VecGeo sp9C;
+ VecGeo sp94;
+ f32 phi_f2_2;
+ f32 temp_f0;
+ f32 temp1;
+ f32 pad;
+ Jump3ReadOnlyData* roData = &camera->paramData.jump3.roData;
+ Jump3ReadWriteData* rwData = &camera->paramData.jump3.rwData;
+ f32 focalActorHeight;
+ PosRot focalActorFocus;
+ f32 sp60;
+ f32 sp5C;
+ s32 sp58;
+
+ focalActorHeight = Camera_GetFocalActorHeight(camera);
+ Actor_GetFocus(&focalActorFocus, camera->focalActor);
+ sp60 = camera->waterYPos - sp48->y;
+
+ sp58 = false;
+
+ if (RELOAD_PARAMS(camera)) {
+ rwData->unk_0A = camera->mode;
+ rwData->timer2 = 0;
+ }
+
+ if (camera->mode == CAM_MODE_NORMAL) {
+ if ((camera->focalActor->bgCheckFlags & 0x10) || (rwData->timer2 != 0)) {
+ if (rwData->unk_0A != 0xF) {
+ rwData->unk_0A = 0xF;
+ sp58 = true;
+ rwData->timer2 = 10;
+ }
+ } else if (sp60 < 50.0f) {
+ if (rwData->unk_0A != 0) {
+ rwData->unk_0A = 0;
+ sp58 = true;
+ }
+ } else if (Camera_fabsf(camera->focalActorPosRot.pos.y - camera->focalActorFloorHeight) < 11.0f) {
+ if (rwData->unk_0A != 5) {
+ rwData->unk_0A = 5;
+ sp58 = true;
+ }
+ } else if ((sp60 > 250.0f) && (rwData->unk_0A != 0x1A)) {
+ rwData->unk_0A = 0x1A;
+ sp58 = true;
+ }
+ }
+
+ if (rwData->timer2 != 0) {
+ rwData->timer2--;
+ }
+
+ OLib_Vec3fDiffToVecGeo(&sp9C, sp44, sp48);
+ OLib_Vec3fDiffToVecGeo(&sp94, sp44, sp40);
+
+ if (!RELOAD_PARAMS(camera) && !sp58) {
+ } else {
+ values = sCameraSettings[camera->setting].cameraModes[rwData->unk_0A].values;
+
+ sp5C = 0.8f - (-0.2f * (68.0f / focalActorHeight));
+ spD0 = focalActorHeight * 0.01f * sp5C;
+
+ roData->unk_00 = GET_NEXT_RO_DATA(values) * spD0;
+ roData->unk_04 = GET_NEXT_RO_DATA(values) * spD0;
+ roData->unk_08 = GET_NEXT_RO_DATA(values) * spD0;
+ roData->unk_20 = CAM_DEG_TO_BINANG(GET_NEXT_RO_DATA(values));
+ roData->unk_0C = GET_NEXT_RO_DATA(values);
+ roData->unk_10 = GET_NEXT_RO_DATA(values);
+ roData->unk_14 = GET_NEXT_SCALED_RO_DATA(values);
+ roData->unk_18 = GET_NEXT_RO_DATA(values);
+ roData->unk_1C = GET_NEXT_SCALED_RO_DATA(values);
+ roData->interfaceFlags = GET_NEXT_RO_DATA(values);
+ }
+
+ sCameraInterfaceFlags = roData->interfaceFlags;
+
+ switch (camera->animState) {
+ case 0:
+ rwData->unk_10 = 0x1000;
+ // fallthrough
+ case 10:
+ case 20:
+ rwData->unk_00 = camera->focalActorFloorHeight;
+ D_801EDC30[camera->camId].yaw = D_801EDC30[camera->camId].pitch = D_801EDC30[camera->camId].unk_64 = 0;
+ rwData->timer1 = 10;
+ D_801EDC30[camera->camId].swingUpdateRate = roData->unk_0C;
+ camera->animState++;
+ D_801EDC30[camera->camId].timer = 0;
+ break;
+
+ default:
+ if (rwData->timer1 != 0) {
+ rwData->timer1--;
+ }
+ break;
+ }
+
+ spC0 = focalActorFocus.pos.y - focalActorPosRot->pos.y;
+ spB4 = *sp48;
+
+ spD0 = camera->speedRatio * 0.5f;
+ spCC = camera->speedRatio * 0.2f;
+
+ temp_f0 = (D_801EDC30[camera->camId].unk_64 == 1) ? 0.5f : spD0;
+
+ if (D_801EDC30[camera->camId].timer != 0) {
+ camera->yawUpdateRateInv =
+ Camera_ScaledStepToCeilF((D_801EDC30[camera->camId].swingUpdateRate + D_801EDC30[camera->camId].timer * 2),
+ camera->yawUpdateRateInv, spD0, 0.1f);
+ camera->pitchUpdateRateInv = Camera_ScaledStepToCeilF((40.0f + D_801EDC30[camera->camId].timer * 2),
+ camera->pitchUpdateRateInv, spCC, 0.1f);
+ D_801EDC30[camera->camId].timer--;
+ } else {
+ camera->yawUpdateRateInv = Camera_ScaledStepToCeilF(D_801EDC30[camera->camId].swingUpdateRate,
+ camera->yawUpdateRateInv, temp_f0, 0.1f);
+ camera->pitchUpdateRateInv = Camera_ScaledStepToCeilF(40.0f, camera->pitchUpdateRateInv, spCC, 0.1f);
+ }
+
+ if (roData->interfaceFlags & JUMP3_FLAG_7) {
+ camera->yOffsetUpdateRate = Camera_ScaledStepToCeilF(0.01f, camera->yOffsetUpdateRate, spD0, 0.0001f);
+ sp5C = sqrtf((camera->unk_0F0.x * camera->unk_0F0.x) + (camera->unk_0F0.z * camera->unk_0F0.z)) /
+ Camera_GetRunSpeedLimit(camera);
+ camera->speedRatio = OLib_ClampMaxDist(sp5C / Camera_GetRunSpeedLimit(camera), 1.8f);
+ spCC = camera->speedRatio * 0.2f;
+ } else {
+ camera->yOffsetUpdateRate = Camera_ScaledStepToCeilF(0.05f, camera->yOffsetUpdateRate, spD0, 0.0001f);
+ }
+
+ camera->xzOffsetUpdateRate = Camera_ScaledStepToCeilF(0.05f, camera->xzOffsetUpdateRate, spCC, 0.0001f);
+ camera->fovUpdateRate =
+ Camera_ScaledStepToCeilF(0.050f, camera->fovUpdateRate, camera->speedRatio * 0.05f, 0.0001f);
+
+ if (sp60 < 50.0f) {
+ sp5C = camera->waterYPos - spC0;
+
+ Camera_CalcAtForScreen(camera, &sp94, roData->unk_00, &sp5C,
+ ((sp60 < 0.0f) ? 1.0f : 1.0f - (sp60 / 50.0f)) * 50.0f);
+ } else {
+ Camera_CalcAtDefault(camera, &sp94, roData->unk_00, roData->interfaceFlags);
+ }
+
+ OLib_Vec3fDiffToVecGeo(&spAC, sp44, sp40);
+ spAC.r = Camera_ClampDist1(camera, spAC.r, roData->unk_04, roData->unk_08, rwData->timer1);
+ camera->dist = spAC.r;
+
+ if (!(Camera_fabsf(focalActorPosRot->pos.y - camera->focalActorFloorHeight) < 10.0f) &&
+ !(Camera_fabsf(focalActorFocus.pos.y - camera->waterYPos) < 50.f)) {
+ camera->pitchUpdateRateInv = 100.0f;
+ }
+
+ if (roData->interfaceFlags & JUMP3_FLAG_5) {
+ spD0 = CLAMP_MAX(camera->speedRatio * 1.3f, 0.6f);
+
+ //! FAKE: spCC =
+ spAC.pitch = Camera_ScaledStepToCeilS(
+ (spAC.pitch * spD0) + (roData->unk_20 * (1.0f - spD0)), sp94.pitch,
+ 1.0f / (spCC = ((camera->pitchUpdateRateInv + 1.0f) - (camera->pitchUpdateRateInv * spD0))), 5);
+ } else if (D_801EDC30[camera->camId].unk_64 == 1) {
+ spAC.yaw =
+ Camera_ScaledStepToCeilS(D_801EDC30[camera->camId].yaw, sp94.yaw, 1.0f / camera->yawUpdateRateInv, 5);
+
+ // Bug? Should be pitchUpdateRateInv
+ spAC.pitch =
+ Camera_ScaledStepToCeilS(D_801EDC30[camera->camId].pitch, sp94.pitch, 1.0f / camera->yawUpdateRateInv, 5);
+ } else if (roData->interfaceFlags & (JUMP3_FLAG_7 | JUMP3_FLAG_3)) {
+ spAC.yaw = Camera_CalcDefaultYaw(camera, sp94.yaw, focalActorPosRot->rot.y, roData->unk_14, 0.0f);
+
+ spD0 = CLAMP_MAX(camera->speedRatio * 1.3f, 1.0f);
+
+ //! FAKE: spCC =
+ spAC.pitch = Camera_ScaledStepToCeilS(
+ (spAC.pitch * spD0) + (roData->unk_20 * (1.0f - spD0)), sp94.pitch,
+ 1.0f / (spCC = (camera->pitchUpdateRateInv + 1.0f) - (camera->pitchUpdateRateInv * spD0)), 5);
+ } else {
+ spAC.yaw = Camera_CalcDefaultYaw(camera, sp94.yaw, focalActorPosRot->rot.y, roData->unk_14, 0.0f);
+ spAC.pitch = Camera_CalcDefaultPitch(camera, sp94.pitch, roData->unk_20, 0);
+ }
+
+ if (spAC.pitch > DEG_TO_BINANG(79.655f)) {
+ spAC.pitch = DEG_TO_BINANG(79.655f);
+ }
+
+ if (spAC.pitch < -DEG_TO_BINANG(29.995f)) {
+ spAC.pitch = -DEG_TO_BINANG(29.995f);
+ }
+
+ OLib_AddVecGeoToVec3f(sp40, sp44, &spAC);
+
+ if ((camera->status == CAM_STATUS_ACTIVE) && !(roData->interfaceFlags & JUMP3_FLAG_6)) {
+ if (func_800CBA7C(camera) == 0) {
+ Camera_CalcDefaultSwing(camera, &spAC, &sp9C, roData->unk_04, roData->unk_0C, &D_801EDC30[camera->camId],
+ &rwData->unk_10);
+ }
+
+ if (roData->interfaceFlags & JUMP3_FLAG_2) {
+ camera->inputDir.x = -sp9C.pitch;
+ camera->inputDir.y = sp9C.yaw + 0x8000;
+ camera->inputDir.z = 0;
+ } else {
+ OLib_Vec3fDiffToVecGeo(&spAC, sp48, sp44);
+ camera->inputDir.x = spAC.pitch;
+ camera->inputDir.y = spAC.yaw;
+ camera->inputDir.z = 0;
+ }
+ } else {
+ D_801EDC30[camera->camId].swingUpdateRate = roData->unk_0C;
+ D_801EDC30[camera->camId].unk_64 = 0;
+ sUpdateCameraDirection = false;
+ *sp48 = *sp40;
+ }
+
+ camera->fov = Camera_ScaledStepToCeilF(roData->unk_18, camera->fov, camera->fovUpdateRate, 0.1f);
+ camera->roll = Camera_ScaledStepToCeilS(0, camera->roll, .5f, 5);
+ camera->atLerpStepScale = Camera_ClampLerpScale(camera, roData->unk_1C);
+
+ return 1;
+}
+
+s32 Camera_Jump4(Camera* camera) {
+ return Camera_Noop(camera);
+}
+
+s32 Camera_Jump0(Camera* camera) {
+ return Camera_Noop(camera);
+}
+
+#ifdef NON_EQUIVALENT
+s32 Camera_Battle1(Camera* camera) {
+ Battle1ReadOnlyData* roData = &camera->paramData.batt1.roData;
+ Battle1ReadWriteData* rwData = &camera->paramData.batt1.rwData;
+ Vec3f sp120;
+ Vec3f sp114;
+ f32 sp104;
+ f32 spFC;
+ f32 spF8;
+ f32 spF8_2;
+ f32 spF4;
+ s32 spF0; // bool
+ f32 spEC;
+ Vec3f spC4;
+ VecGeo spBC;
+ VecGeo spB4;
+ VecGeo spAC;
+ VecGeo spA4;
+ VecGeo sp9C;
+ VecGeo sp94;
+ PosRot* sp8C;
+ s16 sp8A;
+ s16 sp88;
+ s16 sp86;
+ s16 sp84;
+ f32 sp80;
+ f32 sp7C;
+ f32 sp78;
+ f32 sp68;
+ s16 sp5E;
+ s16 sp5C;
+ Vec3f* sp50;
+ Vec3f* sp4C;
+ Vec3f* sp48;
+ PosRot* sp40;
+
+ f32 temp_f12;
+ f32 temp_f14;
+ f32 temp_f2_3;
+ s16 temp_v0_5;
+ s16 temp_v0_6;
+ s32 temp_f4;
+ f32 phi_f0_3;
+ f32 phi_f12;
+
+ f32 new_var;
+ f32 new_var2;
+ f32 new_var3;
+ f32 new_var5;
+ f32 new_var4;
+
+ sp50 = &camera->eye;
+ sp4C = &camera->at;
+ sp48 = &camera->eyeNext;
+ sp40 = &camera->targetPosRot;
+
+ spF0 = false;
+ sp8C = &camera->focalActor->focus;
+ sp68 = Camera_GetFocalActorHeight(camera);
+
+ if ((camera->animState != 0) && (camera->animState != 0xA) && (camera->animState != 0x14)) {
+ } else {
+ CameraModeValue* values = sCameraSettings[camera->setting].cameraModes[camera->mode].values;
+
+ roData->unk_00 = GET_NEXT_RO_DATA(values) * 0.01f * sp68 * (0.8f - ((68.0f / sp68) * -0.2f));
+ roData->unk_04 = GET_NEXT_RO_DATA(values);
+ roData->unk_08 = GET_NEXT_RO_DATA(values);
+ roData->unk_0C = GET_NEXT_RO_DATA(values);
+ roData->unk_0C = 80.0f - (80.0f - roData->unk_0C);
+ roData->unk_10 = GET_NEXT_RO_DATA(values);
+ roData->unk_10 = 0.0f - (0.0f - roData->unk_10);
+ roData->unk_14 = GET_NEXT_RO_DATA(values);
+ roData->unk_14 = 40.0f - (40.0f - roData->unk_14);
+ roData->unk_18 = GET_NEXT_RO_DATA(values);
+ roData->unk_18 = 20.0f - (20.0f - roData->unk_18);
+ roData->unk_1C = GET_NEXT_RO_DATA(values) * 0.01f;
+ roData->unk_1C = 1.0f - (1.0f - roData->unk_1C);
+ roData->unk_20 = GET_NEXT_RO_DATA(values);
+ roData->unk_24 = GET_NEXT_RO_DATA(values) * 0.01f;
+ roData->unk_24 = 1.0f - (1.0f - roData->unk_24);
+ roData->interfaceFlags = GET_NEXT_RO_DATA(values);
+ roData->unk_28 = GET_NEXT_RO_DATA(values) * 0.01f;
+ roData->unk_28 = 0.2f - (0.2f - roData->unk_28);
+ roData->unk_2C = GET_NEXT_RO_DATA(values) * 0.01f;
+ if ((camera->animState != 0) && (camera->animState != 0xA) && (camera->animState != 0x14)) {
+ } else {
+ rwData->unk_18 = 0x28;
+ camera->pitchUpdateRateInv = 9.0f;
+ }
+ }
+
+ sp80 = roData->unk_14;
+ sp7C = roData->unk_18;
+ sp78 = roData->unk_20;
+
+ if (Camera_IsChargingSwordOrDekuFlowerDive(camera)) {
+ camera->pitchUpdateRateInv = Camera_ScaledStepToCeilF(18.0f, camera->pitchUpdateRateInv, 0.5f, 0.1f);
+ camera->yOffsetUpdateRate = Camera_ScaledStepToCeilF(0.2f, camera->yOffsetUpdateRate, 0.5f, 0.0001f);
+ camera->xzOffsetUpdateRate = Camera_ScaledStepToCeilF(0.2f, camera->xzOffsetUpdateRate, 0.5f, 0.0001f);
+ if (rwData->unk_18 >= -0x13) {
+ rwData->unk_18--;
+ } else {
+ sp80 = 50.0f;
+ sp7C = 40.0f;
+ sp78 = 60.0f;
+ }
+ } else {
+ if (rwData->unk_18 < 0) {
+ sp80 = 50.0f;
+ sp7C = 40.0f;
+ sp78 = 60.0f;
+ rwData->unk_18++;
+ } else {
+ rwData->unk_18 = 0x28;
+ camera->pitchUpdateRateInv = Camera_ScaledStepToCeilF(9.0f, camera->pitchUpdateRateInv, 0.5f, 0.1f);
+ camera->yOffsetUpdateRate =
+ Camera_ScaledStepToCeilF(0.6f, camera->yOffsetUpdateRate, camera->speedRatio * 0.5f, 0.0001f);
+ camera->xzOffsetUpdateRate =
+ Camera_ScaledStepToCeilF(0.6f, camera->xzOffsetUpdateRate, camera->speedRatio * 0.2f, 0.0001f);
+ }
+ }
+
+ camera->fovUpdateRate =
+ Camera_ScaledStepToCeilF(0.050f, camera->fovUpdateRate, camera->speedRatio * 0.05f, 0.0001f);
+ sp68 += roData->unk_00;
+ OLib_Vec3fDiffToVecGeo(&sp9C, sp4C, sp50);
+ OLib_Vec3fDiffToVecGeo(&sp94, sp4C, sp48);
+ if ((camera->target == NULL) || (camera->target->update == NULL)) {
+ camera->target = NULL;
+ Camera_ChangeMode(camera, CAM_MODE_TARGET);
+ return true;
+ }
+
+ sCameraInterfaceFlags = roData->interfaceFlags;
+
+ if ((camera->animState == 0) || (camera->animState == 0xA) || (camera->animState == 0x14)) {
+ rwData->unk_10 = 0;
+ rwData->unk_1A = 0;
+ rwData->unk_08 = camera->target;
+ camera->animState++;
+ rwData->unk_16 = 7;
+ rwData->unk_12 = sp9C.yaw;
+ rwData->unk_14 = sp9C.pitch;
+ rwData->unk_00 = sp9C.r;
+ rwData->unk_04 = camera->focalActorPosRot.pos.y - camera->unk_0F0.y;
+ if ((2.0f * roData->unk_04) < camera->dist) {
+ camera->dist = 2.0f * roData->unk_04;
+ sp94.r = camera->dist;
+ sp9C.r = sp94.r;
+ OLib_AddVecGeoToVec3f(sp50, sp4C, &sp9C);
+ *sp48 = *sp50;
+ }
+ }
+
+ if (camera->status == CAM_STATUS_ACTIVE) {
+ sUpdateCameraDirection = true;
+ camera->inputDir.x = -sp9C.pitch;
+ camera->inputDir.y = sp9C.yaw + 0x8000;
+ camera->inputDir.z = 0;
+ }
+
+ if (func_800CB950(camera)) {
+ rwData->unk_04 = camera->focalActorPosRot.pos.y;
+ sp84 = 0;
+ } else {
+ sp84 = 1;
+ }
+
+ if (rwData->unk_16 == 0) {
+ camera->atLerpStepScale = Camera_ClampLerpScale(camera, sp84 ? roData->unk_28 : roData->unk_24);
+ }
+
+ Actor_GetFocus(&sp40->pos, camera->target);
+
+ if (rwData->unk_08 != camera->target) {
+ camera->animState = 0;
+ return true;
+ }
+
+ sp120 = camera->focalActorPosRot.pos;
+ sp120.y += sp68;
+ OLib_Vec3fDiffToVecGeo(&spA4, &sp120, &sp40->pos);
+ sp104 = func_800CD6CC(camera->target);
+ if (PREG(86) + 800.0f < sp104) {
+ sp104 = PREG(86) + 800.0f;
+ }
+
+ // new_var5 = sp104; // TODO: Fake temp but helps when used?
+ // sp104 = new_var5;
+
+ // Above is down to SP and Floats
+
+ if ((sp104 < spA4.r) || Camera_IsChargingSwordOrDekuFlowerDive(camera)) {
+ spEC = 1.0f;
+ spF8 = 10.0f;
+ // dummy:; // Helps?
+ // sp80 = roData->unk_14; // Fake & Non-equivalent but helps?
+ } else {
+ spEC = spA4.r / sp104;
+ spF8 = 2.0f;
+ }
+ // spF8 should be set with swc1 twice, not once
+
+ // sp94 is loading in too early
+ Camera_CalcAtForEnemyLockOn(camera, &sp94.r, sp40, roData->unk_00, roData->unk_2C, 1.0f - spEC, &rwData->unk_04,
+ &spA4,
+ (sp84 ? (BATTLE1_FLAG_7 | BATTLE1_FLAG_0) : BATTLE1_FLAG_0) | roData->interfaceFlags);
+
+ sp88 = spA4.yaw;
+ OLib_Vec3fDiffToVecGeo(&spBC, sp4C, sp48);
+ spF4 = roData->unk_04 + ((roData->unk_08 - roData->unk_04) * spEC);
+ camera->rUpdateRateInv = Camera_ScaledStepToCeilF(spF8, camera->rUpdateRateInv, 0.5f, 0.1f);
+ spBC.r = camera->dist = Camera_ScaledStepToCeilF(spF4, camera->dist, 1.0f / camera->rUpdateRateInv, 0.1f);
+ OLib_Vec3fDiffToVecGeo(&spAC, sp4C, &sp40->pos);
+
+ spAC.r = spBC.r - (((spAC.r >= spBC.r) ? spBC.r : spAC.r) * 0.5f);
+
+ if (rwData->unk_1A & 0x1000) {
+ spFC = 15.0f;
+ } else {
+ spFC = roData->unk_0C + ((roData->unk_10 - roData->unk_0C) * (1.1f - spEC));
+ }
+ spBC.yaw = sp94.yaw;
+ temp_v0_5 = (sp94.yaw + 0x8000);
+ temp_v0_5 = spAC.yaw - temp_v0_5;
+ if (rwData->unk_16 != 0) {
+ if (rwData->unk_16 > 0) {
+ sp86 = rwData->unk_16 - 1;
+ OLib_Vec3fDiffToVecGeo(&spB4, sp4C, sp50);
+ spB4.yaw = sp88 + 0x8000;
+ new_var = (rwData->unk_00 - spB4.r) * 0.16666667f;
+ sp8A = (s16)(rwData->unk_12 - spB4.yaw) * 0.16666667f;
+ sp88 = (s16)(rwData->unk_14 - spB4.pitch) * 0.16666667f;
+ spBC.r = Camera_ScaledStepToCeilF((sp86 * new_var) + spB4.r, sp9C.r, 0.5f,
+ 1.0f); // TODO: extra float calcs going on here
+ spBC.yaw = Camera_ScaledStepToCeilS(spB4.yaw + (sp8A * sp86), sp9C.yaw, 0.5f, 5);
+ spBC.pitch = Camera_ScaledStepToCeilS(spB4.pitch + (sp88 * sp86), sp9C.pitch, 0.5f, 5);
+ } else {
+ spF0 = true;
+ }
+ rwData->unk_16--;
+ } else {
+ // s32 phi_v0_2 = ABS(temp_v0_5);
+ temp_f4 = (s16)((spFC * 182.04167f) + .5f);
+ if ((temp_f4 < ABS(temp_v0_5)) && (sp84 == 0)) {
+
+ sp8A = temp_v0_5;
+ sp104 = temp_v0_5 * 0.00549325f;
+
+ temp_f2_3 = ((OLib_ClampMaxDist(spAC.r, spBC.r) / spBC.r) * ((spFC + 10.0f) - spFC)) + spFC;
+ temp_f12 = (SQ(temp_f2_3) - 2.0f) / (temp_f2_3 - 360.0f);
+ new_var3 = temp_f12 * sp104;
+ temp_f14 = SQ(sp104) / (new_var3 + (2.0f - (360.0f * temp_f12)));
+
+ if (sp8A >= 0) {
+ sp88 = CAM_DEG_TO_BINANG(temp_f14);
+ } else {
+ sp88 = -CAM_DEG_TO_BINANG(temp_f14);
+ }
+
+ spBC.yaw = (s16)(sp94.yaw + 0x8000) + (s16)(sp88 + 0x8000);
+ } else {
+ new_var2 = (1.0f - camera->speedRatio) * 0.05f;
+ if (temp_v0_5 >= 0) {
+ sp88 = temp_f4 & 0xFFFFu; // TODO: Is this needed?
+ } else {
+ sp88 = -temp_f4;
+ }
+ spBC.yaw = sp94.yaw - (s16)((sp88 - temp_v0_5) * new_var2);
+ }
+ }
+
+ if (spF0 == false) {
+ new_var4 = spAC.pitch * roData->unk_1C;
+ temp_v0_6 = ((s16)(((((sp7C - sp80) * spEC) + sp80) * 182.04167f) + .5f) -
+ (s16)((spA4.pitch * (0.5f + (spEC * 0.5f))) + 0.5f));
+ temp_v0_6 += (s16)new_var4;
+
+ if (temp_v0_6 < -0x2AA8) {
+ temp_v0_6 = -0x2AA8;
+ } else if (temp_v0_6 > 0x2AA8) {
+ temp_v0_6 = 0x2AA8;
+ }
+
+ spBC.pitch = Camera_ScaledStepToCeilS(temp_v0_6, sp94.pitch, 1.0f / camera->pitchUpdateRateInv, 5);
+ OLib_AddVecGeoToVec3f(sp48, sp4C, &spBC);
+ spC4 = *sp48;
+ if (camera->status == CAM_STATUS_ACTIVE) {
+ if (!(roData->interfaceFlags & BATTLE1_FLAG_4)) {
+ if ((camera->play->envCtx.skyboxDisabled == 0) || (roData->interfaceFlags & BATTLE1_FLAG_0)) {
+ if (func_800CBC84(camera, sp4C, &spC4, 0) != 0) {
+ rwData->unk_1A |= 0x1000;
+ } else {
+ rwData->unk_1A &= ~0x1000;
+ }
+ } else if (roData->interfaceFlags & BATTLE1_FLAG_1) {
+ func_800CBC84(camera, sp4C, &spC4, 3);
+ } else {
+ OLib_Vec3fDistNormalize(&sp114, sp4C, &spC4);
+ spC4.x -= sp114.x;
+ spC4.y -= sp114.y;
+ spC4.z -= sp114.z;
+ }
+ *sp50 = spC4;
+ ;
+ rwData->unk_1A &= ~0x10;
+ } else if ((camera->play->envCtx.skyboxDisabled == 0) || (roData->interfaceFlags & BATTLE1_FLAG_0)) {
+ if (func_800CBC84(camera, sp4C, &spC4, 0) != 0) {
+ rwData->unk_1A |= 0x1000;
+ spF8 = OLib_Vec3fDist(sp4C, sp8C);
+ spF4 = OLib_Vec3fDist(sp4C, &spC4);
+ phi_f0_3 = (rwData->unk_1A & 0x10) ? 40.0f : 0.0f;
+ spF8 = spF8 + phi_f0_3;
+ Actor_GetScreenPos(camera->play, camera->focalActor, &sp5E, &sp5C);
+ if ((spF4 < spF8) || ((sp5E >= 0) && (sp5E < 0x141) && (sp5C >= 0) && (sp5C < 0xF1))) {
+ rwData->unk_1A |= 0x10;
+ spB4.yaw = spA4.yaw + 0x8000;
+ spB4.pitch = -spA4.pitch;
+ spB4.r = 40.0f;
+ sp114 = sp8C->pos;
+ sp114.y += 40.0f;
+ OLib_AddVecGeoToVec3f(&sp120, &sp114, &spB4);
+ Camera_ScaledStepToCeilVec3f(&sp120, sp50, 0.15f, 0.15f, 0.2f);
+ } else if (rwData->unk_1A & 0x10) {
+ if (OLib_Vec3fDist(&spC4, sp50) < 20.0f) {
+ rwData->unk_1A &= ~0x10;
+ *sp50 = spC4;
+ } else {
+ Camera_ScaledStepToCeilVec3f(&spC4, sp50, 0.15f, 0.15f, 0.2f);
+ }
+ } else {
+ rwData->unk_1A &= ~0x10;
+ *sp50 = spC4;
+ }
+ dummy:; // TODO: Is Needed?
+ } else {
+ if (rwData->unk_1A & 0x10) {
+ if (OLib_Vec3fDist(&spC4, sp50) < 20.0f) {
+ rwData->unk_1A &= ~0x10;
+ *sp50 = spC4;
+ } else {
+ Camera_ScaledStepToCeilVec3f(&spC4, sp50, 0.15f, 0.15f, 0.2f);
+ }
+ } else {
+ rwData->unk_1A &= ~0x10;
+ *sp50 = spC4;
+ }
+ rwData->unk_1A &= ~0x1000;
+ }
+ } else if (roData->interfaceFlags & BATTLE1_FLAG_1) {
+ rwData->unk_1A &= ~0x10;
+ if (func_800CBC84(camera, sp4C, &spC4, 3) != 0) {
+ *sp50 = spC4;
+ } else {
+ *sp50 = spC4;
+ }
+ } else {
+ rwData->unk_1A &= ~0x10;
+ OLib_Vec3fDistNormalize(&sp114, sp4C, &spC4);
+ spC4.x -= sp114.x;
+ spC4.y -= sp114.y;
+ spC4.z -= sp114.z;
+ *sp50 = spC4;
+ }
+ } else {
+ rwData->unk_1A &= ~0x10;
+ *sp50 = *sp48;
+ }
+ }
+
+ if (rwData->unk_16 != 0) {
+ sp88 = 0;
+ } else {
+ sp88 = (s16)(sp94.yaw - spBC.yaw) * 0.50f;
+ }
+
+ camera->roll = Camera_ScaledStepToCeilS(sp88, camera->roll, 0.06f, 5);
+ if (func_800CBAAC(camera) != PLAYER_MELEE_WEAPON_STATE_0) {
+ phi_f12 = ((camera->play->state.frames & 8) != 0) ? roData->unk_20 - (roData->unk_20 * 0.5f) : roData->unk_20;
+ } else {
+ phi_f12 = ((gSaveContext.save.saveInfo.playerData.health <= 16) ? 0.8f : 1.0f) * (sp78 - (sp78 * 0.05f * spEC));
+ }
+ camera->fov = Camera_ScaledStepToCeilF(phi_f12, camera->fov, camera->fovUpdateRate, 0.1f);
+
+ return true;
+}
+#else
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Battle1.s")
+#endif
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Battle2.s")
+s32 Camera_Battle2(Camera* camera) {
+ return Camera_Noop(camera);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Battle3.s")
+s32 Camera_Battle3(Camera* camera) {
+ return Camera_Noop(camera);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Battle4.s")
+s32 Camera_Battle4(Camera* camera) {
+ return Camera_Noop(camera);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Battle0.s")
+s32 Camera_Battle0(Camera* camera) {
+ return Camera_Noop(camera);
+}
+/**
+ * Used for following a secondary target such as zora fins or a z-target
+ */
+// Very non-equivalent, many fakes. May need to restart from scratch (mips2c)
+#ifdef NON_EQUIVALENT
+s32 Camera_KeepOn1(Camera* camera) {
+ f32 pad1;
+ f32* pad2;
+ Vec3f* sp48 = &camera->eye;
+ Vec3f* sp44 = &camera->at;
+ Vec3f* sp40 = &camera->eyeNext;
+ Vec3f sp130;
+ Vec3f sp124;
+ Vec3f sp118;
+ f32 sp114;
+ PosRot* sp3C = &camera->focalActorPosRot;
+ PosRot* sp30 = &camera->targetPosRot;
+ f32 sp104;
+ f32 temp_f2_3;
+ f32 new_var;
+ f32 spFC;
+ f32 spF8;
+ f32 spF4;
+ s16 spF2;
+ s16 spF0;
+ VecGeo spE8;
+ VecGeo spE0;
+ VecGeo spD8;
+ VecGeo spD0;
+ VecGeo spC8;
+ VecGeo spC0;
+ f32 new_var2;
+ s32 new_var3;
+ f32 temp_f0;
+ Vec3f spA8;
+ PosRot* spA4;
+ CameraCollision sp7C;
+
+ s32 sp78;
+ f32 sp74;
+ s16 sp72;
+ s16 sp70;
+ f32 sp60;
+ s16 sp56;
+ s16 sp54;
+
+ s16 phi_v1_3;
+ s16 phi_a0;
+ KeepOn1ReadOnlyData* roData = &camera->paramData.keep1.roData;
+ KeepOn1ReadWriteData* rwData = &camera->paramData.keep1.rwData;
+ s16 temp_v0_3;
+ s16 new_var4;
+
+ spA4 = &camera->focalActor->focus;
+ //! FAKE
+ if (temp_v0_3) {}
+ sp78 = 0;
+ temp_f0 = Camera_GetFocalActorHeight(camera);
+ // temp_a1 = camera->target;
+
+ if ((camera->target == NULL) || (camera->target->update == NULL)) {
+ camera->target = NULL;
+ Camera_ChangeMode(camera, CAM_MODE_TARGET);
+ return 1;
+ }
+
+ if (RELOAD_PARAMS(camera)) {
+ CameraModeValue* values = sCameraSettings[camera->setting].cameraModes[camera->mode].values;
+
+ roData->unk_00 = GET_NEXT_SCALED_RO_DATA(values) * temp_f0 * (0.8f - ((68.0f / temp_f0) * -0.2f));
+ roData->unk_04 = GET_NEXT_RO_DATA(values);
+ roData->unk_08 = GET_NEXT_RO_DATA(values);
+ roData->unk_0C = GET_NEXT_RO_DATA(values);
+ roData->unk_10 = GET_NEXT_RO_DATA(values);
+ roData->unk_14 = GET_NEXT_RO_DATA(values);
+ roData->unk_14 = 40.0f - (40.0f - roData->unk_14);
+ roData->unk_18 = GET_NEXT_RO_DATA(values);
+ roData->unk_18 = 20.0f - (20.0f - roData->unk_18);
+ // roData->unk_18 = roData->unk_18; // TODO: Fake
+ // if (!roData->unk_08) {}
+ roData->unk_1C = GET_NEXT_SCALED_RO_DATA(values);
+ roData->unk_1C = 1.000f - (1.00f - roData->unk_1C); // TODO: Necessary?
+ roData->unk_20 = GET_NEXT_RO_DATA(values);
+ roData->unk_24 = GET_NEXT_SCALED_RO_DATA(values);
+ roData->unk_24 = 1.0f - (1.0f - roData->unk_24);
+ roData->interfaceFlags = GET_NEXT_RO_DATA(values);
+ roData->unk_28 = GET_NEXT_SCALED_RO_DATA(values);
+ roData->unk_28 = 0.2f - (0.2f - roData->unk_28);
+ }
+
+ sp60 = temp_f0;
+ sp114 = roData->unk_00; // TODO: likely fake temp
+ sp60 += sp114;
+ OLib_Vec3fDiffToVecGeo(&spC8, sp44, sp48);
+ OLib_Vec3fDiffToVecGeo(&spC0, sp44, sp40);
+ sCameraInterfaceFlags = roData->interfaceFlags;
+
+ if (RELOAD_PARAMS(camera)) {
+ camera->animState++;
+ rwData->unk_18 = 0;
+ rwData->unk_10 = 0;
+ rwData->unk_04 = 0.0f;
+ rwData->unk_0C = camera->target;
+ rwData->unk_16 = 7;
+ rwData->unk_12 = spC8.yaw;
+ rwData->unk_14 = spC8.pitch;
+ rwData->unk_00 = spC8.r;
+ rwData->unk_08 = sp3C->pos.y - camera->unk_0F0.y;
+ if ((2.0f * roData->unk_04) < camera->dist) {
+ camera->dist = 2.0f * roData->unk_04;
+ spC0.r = camera->dist;
+ spC8.r = spC0.r;
+ OLib_AddVecGeoToVec3f(sp48, sp44, &spC8);
+ *sp40 = *sp48;
+ }
+ }
+
+ if (camera->status == CAM_STATUS_ACTIVE) {
+ sUpdateCameraDirection = true;
+ camera->inputDir.x = -spC8.pitch;
+ camera->inputDir.y = spC8.yaw + 0x8000;
+ camera->inputDir.z = 0;
+ }
+
+ if (func_800CB950(camera)) {
+ rwData->unk_08 = sp3C->pos.y;
+ }
+
+ sp114 = roData->unk_04;
+
+ if (camera->target->id != ACTOR_EN_BOOM) {
+ Actor_GetWorldPosShapeRot(sp30, camera->target);
+ Actor_GetFocus(&spA8, camera->target);
+ camera->targetPosRot.pos.y = spA8.y;
+ } else {
+ Actor_GetFocus(sp30, camera->target);
+ }
+ if (rwData->unk_0C != camera->target) {
+ rwData->unk_0C = camera->target;
+ camera->atLerpStepScale = 0.0f;
+ }
+
+ camera->yOffsetUpdateRate =
+ Camera_ScaledStepToCeilF(1.0f, camera->yOffsetUpdateRate, camera->speedRatio * 0.5f, 0.0001f);
+ camera->xzOffsetUpdateRate =
+ Camera_ScaledStepToCeilF(1.0f, camera->xzOffsetUpdateRate, camera->speedRatio * 0.2f, 0.0001f);
+ // TODO: No f on 0.05?
+ camera->fovUpdateRate = Camera_ScaledStepToCeilF(0.05, camera->fovUpdateRate, camera->speedRatio * 0.05f, 0.0001f);
+
+ if (func_800CB950(camera)) {
+ rwData->unk_08 = sp3C->pos.y;
+ sp70 = false;
+ } else {
+ sp70 = true;
+ }
+
+ Camera_CalcAtForFriendlyLockOn(camera, &spC0, sp30, roData->unk_00, roData->unk_08, &rwData->unk_08, &spD0,
+ roData->interfaceFlags | (sp70 ? KEEPON1_FLAG_7 : 0));
+ sp124 = sp3C->pos;
+ sp124.y += sp60;
+ OLib_Vec3fDiffToVecGeo(&spD0, &sp124, sp30);
+
+ if (sp114 < spD0.r) {
+ sp74 = 1.0f;
+ } else {
+ sp74 = spD0.r / sp114;
+ }
+
+ OLib_Vec3fDiffToVecGeo(&spE8, sp44, sp40);
+
+ if (spE8.r < roData->unk_04) {
+ sp114 = roData->unk_04;
+ spF8 = 20.0f;
+ } else if (roData->unk_08 < spE8.r) {
+ sp114 = roData->unk_08;
+ spF8 = 20.0f;
+ } else {
+ sp114 = spE8.r;
+ spF8 = 1.0f;
+ }
+
+ camera->rUpdateRateInv = Camera_ScaledStepToCeilF(spF8, camera->rUpdateRateInv, 0.5f, 0.1f);
+ camera->dist = Camera_ScaledStepToCeilF(sp114, camera->dist, 1.0f / camera->rUpdateRateInv, 0.1f);
+ spF8 = camera->dist;
+ spE8.r = camera->dist;
+ sp118 = sp30->pos;
+ OLib_Vec3fDiffToVecGeo(&spD8, sp44, &sp118);
+ //! FAKE
+ if (1) {}
+ if (1) {}
+ if (1) {} // TODO: Is needed?
+ pad1 = spD8.r; // TODO: Fake temp?
+ spD8.r = spF8 - (((pad1 <= spF8) ? spD8.r : spF8) * .5f);
+ camera->dist = Camera_ScaledStepToCeilF(pad1, camera->dist, 0.06f, 0.1f);
+ spE8.r = camera->dist;
+ spFC = roData->unk_0C + ((roData->unk_10 - roData->unk_0C) * (1.1f - sp74));
+ spE8.yaw = spC0.yaw;
+ temp_v0_3 = (s16)(spD8.yaw - (s16)(spC0.yaw + 0x8000));
+ if (rwData->unk_16 != 0) {
+ if (rwData->unk_16 > 0) {
+ sp72 = rwData->unk_16 - 1;
+ spF2 = spD0.yaw;
+ OLib_Vec3fDiffToVecGeo(&spD0, sp44, sp48);
+ spD0.yaw = (s16)(spF2 + 0x8000);
+ sp60 = (rwData->unk_00 - spD0.r) * 0.16666667f;
+ spF2 = (s16)(rwData->unk_12 - (s16)(spF2 + 0x8000)) * 0.16666667f;
+ spF0 = ((s16)(rwData->unk_14 - (s64)spD0.pitch)); // TODO: s16 cast on F0
+ spF0 = (s16)(spF0 * 0.16666667f);
+ spE8.r = Camera_ScaledStepToCeilF(spD0.r + (sp60 * sp72), spC8.r, .5f, 0.1f);
+ spE8.yaw = Camera_ScaledStepToCeilS(spD0.yaw + (spF2 * sp72), spC8.yaw, .5f, 5);
+ spE8.pitch = Camera_ScaledStepToCeilS(spD0.pitch + (spF0 * sp72), spC8.pitch, .5f, 5);
+ }
+ sp78 = 1;
+ rwData->unk_16--;
+ } else {
+ new_var3 = ABS(temp_v0_3); // TODO: Fake temp?
+ if ((s16)((spFC * 182.04167f) + .5f) < new_var3) {
+ spF2 = temp_v0_3;
+ sp104 = temp_v0_3 * 0.00549325f;
+ temp_f2_3 = ((OLib_ClampMaxDist(spD8.r, spE8.r) / spE8.r) * ((spFC + 10.0f) - spFC)) + spFC;
+ pad2 = &sp104; // TODO: Fake temp
+ temp_f2_3 = ((temp_f2_3 * temp_f2_3) - 2.0f) / (temp_f2_3 - 360.0f);
+ temp_f2_3 = (sp104 * (*pad2)) / ((temp_f2_3 * (*pad2)) + (2.0f - (360.0f * temp_f2_3)));
+
+ if (spF2 >= 0) {
+ phi_v1_3 = (s16)((temp_f2_3 * 182.04167f) + .5f);
+ } else {
+ phi_v1_3 = -(s16)((temp_f2_3 * 182.04167f) + .5f);
+ }
+ spE8.yaw = (s16)(spC0.yaw + 0x8000) + (s16)(phi_v1_3 + 0x8000);
+ } else {
+ new_var = (1.0f - camera->speedRatio) * 0.05f; // TODO: Fake temp?
+ phi_v1_3 = (temp_v0_3 >= 0) ? CAM_DEG_TO_BINANG(spFC) : -CAM_DEG_TO_BINANG(spFC);
+ //! FAKE
+ if (phi_a0) {} // TODO: Fake to shaft a registers
+ spE8.yaw = (s16)(spC0.yaw - (s16)((phi_v1_3 - temp_v0_3) * new_var));
+ }
+ }
+
+ //! FAKE
+ if (!spF0) {} // TODO: Is needed?
+ if (sp78 == 0) {
+ // TODO: extra 0 on 0.050f needed?
+ phi_a0 = (s16)(((roData->unk_14 + ((roData->unk_18 - roData->unk_14) * sp74)) * 182.04167f) + .5f);
+ phi_a0 -= (s16)((spD0.pitch * (0.5f + (sp74 * 0.5f))) + 0.5f);
+ //! FAKE
+ if (1) {} // TODO: Needed?
+ sp60 = spD8.pitch * roData->unk_1C; // TODO: Fake sp60 temp?
+ phi_a0 += (s16)sp60;
+
+ if (phi_a0 < -0x3200) {
+ phi_a0 = -0x3200;
+ } else if (phi_a0 > 0x3200) {
+ phi_a0 = 0x3200;
+ }
+
+ spE8.pitch = Camera_ScaledStepToCeilS(phi_a0, spC0.pitch, 0.11111111f, 5);
+ OLib_AddVecGeoToVec3f(sp40, sp44, &spE8);
+ sp7C.pos = *sp40;
+ if (camera->status == CAM_STATUS_ACTIVE) {
+ if (!(roData->interfaceFlags & KEEPON1_FLAG_4)) {
+ if ((camera->play->envCtx.skyboxDisabled == 0) || (roData->interfaceFlags & KEEPON1_FLAG_0)) {
+ if (func_800CBC84(camera, sp44, &sp7C, 0) != 0) {
+ rwData->unk_18 |= 0x1000;
+ } else {
+ rwData->unk_18 &= ~0x1000;
+ }
+ } else if (roData->interfaceFlags & KEEPON1_FLAG_1) {
+ func_800CBC84(camera, sp44, &sp7C, 3);
+ } else {
+ OLib_Vec3fDistNormalize(&sp130, sp44, &sp7C.pos);
+ sp7C.pos.x -= sp130.x;
+ sp7C.pos.y -= sp130.y;
+ sp7C.pos.z -= sp130.z;
+ }
+ *sp48 = sp7C.pos;
+ rwData->unk_18 &= ~0x10;
+ } else if ((camera->play->envCtx.skyboxDisabled == 0) || (roData->interfaceFlags & KEEPON1_FLAG_0)) {
+ if (func_800CBC84(camera, sp44, &sp7C, 0) != 0) {
+ rwData->unk_18 |= 0x1000;
+ spF8 = OLib_Vec3fDist(sp44, spA4);
+ spF4 = OLib_Vec3fDist(sp44, &sp7C.pos);
+ spF8 += (rwData->unk_18 & 0x10) ? 40 : 0.0f; // TODO: 40.0f?
+ Actor_GetScreenPos(camera->play, camera->focalActor, &sp56, &sp54);
+ if ((spF4 < spF8) || ((sp56 >= 0) && (sp56 <= 320) && (sp54 >= 0) && (sp54 <= 240))) {
+ rwData->unk_18 |= 0x10;
+ spE0.yaw = (s16)(spD0.yaw + 0x8000);
+ spE0.pitch = -spD0.pitch;
+ spE0.r = 40.0f;
+ sp130 = spA4->pos;
+ sp130.y += 40.0f;
+ OLib_AddVecGeoToVec3f(&sp124, &sp130, &spE0);
+ Camera_ScaledStepToCeilVec3f(&sp124, sp48, 0.15f, 0.15f, 0.2f);
+ } else if (rwData->unk_18 & 0x10) {
+ if (OLib_Vec3fDist(&sp7C.pos, sp48) < 20.0f) {
+ rwData->unk_18 &= ~0x10;
+ *sp48 = sp7C.pos;
+ } else {
+ Camera_ScaledStepToCeilVec3f(&sp7C.pos, sp48, 0.15f, 0.15f, 0.2f);
+ }
+ } else {
+ rwData->unk_18 &= ~0x10;
+ *sp48 = sp7C.pos;
+ }
+ dummy:; // TODO: Is this needed?
+ } else {
+ if (rwData->unk_18 & 0x10) {
+ if (OLib_Vec3fDist(&sp7C.pos, sp48) < 20.0f) {
+ rwData->unk_18 &= ~0x10;
+ *sp48 = sp7C.pos;
+ } else {
+ Camera_ScaledStepToCeilVec3f(&sp7C.pos, sp48, 0.15f, 0.15f, 0.2f);
+ }
+ } else {
+ rwData->unk_18 &= ~0x10;
+ *sp48 = sp7C.pos;
+ // if (sp104) {} // TODO: Is this needed?
+ }
+ rwData->unk_18 &= ~0x1000;
+ }
+ } else if (roData->interfaceFlags & KEEPON1_FLAG_1) {
+ rwData->unk_18 &= ~0x10;
+ if (func_800CBC84(camera, sp44, &sp7C, 3) != 0) {
+ *sp48 = sp7C.pos;
+ } else {
+ *sp48 = sp7C.pos;
+ ;
+ }
+ } else {
+ rwData->unk_18 &= ~0x10;
+ OLib_Vec3fDistNormalize(&sp130, sp44, &sp7C.pos);
+ sp7C.pos.x -= sp130.x;
+ sp7C.pos.y -= sp130.y;
+ sp7C.pos.z -= sp130.z;
+ *sp48 = sp7C.pos;
+ }
+ } else {
+ rwData->unk_18 &= ~0x10;
+ *sp48 = *sp40;
+ }
+ }
+
+ // TODO: spF8 temp needed?
+ camera->fov = Camera_ScaledStepToCeilF(spF8 = roData->unk_20, camera->fov, camera->fovUpdateRate, 0.1f);
+ camera->roll = Camera_ScaledStepToCeilS(0, camera->roll, 0.2f, 5);
+ camera->atLerpStepScale = Camera_ClampLerpScale(camera, sp70 ? roData->unk_28 : roData->unk_24);
+
+ return true;
+}
+#else
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_KeepOn1.s")
+#endif
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_KeepOn2.s")
+s32 Camera_KeepOn2(Camera* camera) {
+ return Camera_Noop(camera);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_KeepOn3.s")
+/**
+ * Talking to an NPC
+ */
+s32 Camera_KeepOn3(Camera* camera) {
+ Vec3f* eye = &camera->eye;
+ s32 temp_f0;
+ Vec3f* eyeNext = &camera->eyeNext;
+ Vec3f spD8;
+ Vec3f spCC;
+ Vec3f spC0;
+ f32 timer;
+ f32 spB8;
+ f32 spB4;
+ f32 swingAngle;
+ Actor* spA8[2];
+ VecGeo spA0;
+ VecGeo sp98;
+ VecGeo sp90;
+ VecGeo sp88;
+ VecGeo sp80;
+ Vec3f* at = &camera->at;
+ s32 sp78;
+ f32 phi_f14;
+ PosRot* sp70;
+ s16 sp6E;
+ s16 sp6C;
+ s16 sp6A;
+ s16 phi_a3;
+ PosRot* focalActorPosRot = &camera->focalActorPosRot;
+ KeepOn3ReadOnlyData* roData = &camera->paramData.keep3.roData;
+ KeepOn3ReadWriteData* rwData = &camera->paramData.keep3.rwData;
+ f32 focalActorHeight;
+ s32 i;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_KeepOn4.s")
+ sp70 = &camera->focalActor->focus; // TODO: Move above?
+ sp6A = 0;
+ focalActorHeight = Camera_GetFocalActorHeight(camera);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_KeepOn0.s")
+ if ((camera->target == NULL) || (camera->target->update == NULL)) {
+ camera->target = NULL;
+ Camera_ChangeMode(camera, CAM_MODE_TARGET);
+ return 1;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Fixed1.s")
+ if (RELOAD_PARAMS(camera)) {
+ if (camera->play->view.unk164 == 0) {
+ Camera_SetStateFlag(camera, CAM_STATE_DISABLE_MODE_CHANGE);
+ camera->play->view.unk164 = camera->camId | 0x50;
+ return 1;
+ }
+ Camera_UnsetStateFlag(camera, CAM_STATE_DISABLE_MODE_CHANGE);
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Fixed2.s")
+ Camera_UnsetStateFlag(camera, CAM_STATE_4);
+ if (RELOAD_PARAMS(camera)) {
+ CameraModeValue* values = sCameraSettings[camera->setting].cameraModes[camera->mode].values;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Fixed3.s")
+ roData->unk_00 =
+ GET_NEXT_SCALED_RO_DATA(values) * focalActorHeight * (0.8f - ((68.0f / focalActorHeight) * -0.2f));
+ roData->unk_04 = GET_NEXT_RO_DATA(values);
+ roData->unk_08 = GET_NEXT_RO_DATA(values);
+ roData->unk_0C = GET_NEXT_RO_DATA(values);
+ roData->unk_10 = GET_NEXT_RO_DATA(values);
+ roData->unk_14 = GET_NEXT_RO_DATA(values);
+ roData->unk_18 = GET_NEXT_RO_DATA(values);
+ roData->unk_1C = GET_NEXT_SCALED_RO_DATA(values);
+ roData->unk_20 = GET_NEXT_RO_DATA(values);
+ roData->unk_24 = GET_NEXT_SCALED_RO_DATA(values);
+ roData->timer = GET_NEXT_RO_DATA(values);
+ roData->interfaceFlags = GET_NEXT_RO_DATA(values);
+ roData->unk_28 = GET_NEXT_SCALED_RO_DATA(values);
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Fixed4.s")
+ if (camera->animState == 10) {
+ roData->timer >>= 1;
+ if (roData->timer < 20) {
+ roData->timer = 20;
+ }
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Fixed0.s")
+ OLib_Vec3fDiffToVecGeo(&sp88, at, eye);
+ OLib_Vec3fDiffToVecGeo(&sp80, at, eyeNext);
+ Actor_GetFocus(&camera->targetPosRot, camera->target);
+ spD8 = focalActorPosRot->pos;
+ spD8.y += focalActorHeight;
+ OLib_Vec3fDiffToVecGeo(&spA0, &spD8, &camera->targetPosRot.pos);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Subject1.s")
+ if (RELOAD_PARAMS(camera)) {
+ camera->animState++;
+ spA8[0] = camera->target;
+ spA8[1] = camera->focalActor;
+ rwData->unk_0C = camera->target;
+ phi_f14 = (roData->unk_08 < spA0.r) ? 1.0f : (spA0.r / roData->unk_08);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Subject2.s")
+ rwData->timer = roData->timer;
+ spB8 = ((1.0f - phi_f14) * spA0.r) / rwData->timer;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Subject3.s")
+ if (roData->interfaceFlags & KEEPON3_FLAG_6) {
+ spA0.pitch = 0;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Subject4.s")
+ swingAngle = LERPIMP(roData->unk_14, roData->unk_18, phi_f14);
+ sp98.pitch = CAM_DEG_TO_BINANG(swingAngle) + ((s16) - (spA0.pitch * roData->unk_1C));
+ swingAngle = LERPIMP(roData->unk_0C, roData->unk_10, phi_f14);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Subject0.s")
+ phi_a3 = CAM_DEG_TO_BINANG(swingAngle);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Data0.s")
+ sp78 = 1;
+ if ((camera->target->category == ACTORCAT_DOOR) || (camera->target->id == ACTOR_EN_TALK)) {
+ if ((s16)(camera->targetPosRot.rot.y - sp80.yaw) > 0) {
+ phi_a3 = -phi_a3;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Data1.s")
+ if (ABS(spA0.pitch) < 0x157C) { // 30.2 degrees
+ sp98.yaw = BINANG_ROT180(spA0.yaw) + phi_a3;
+ sp6A = (s16)(BINANG_ROT180(spA0.yaw) - phi_a3);
+ } else {
+ sp78 = 0;
+ sp90.r = 30.0f;
+ sp90.yaw = BINANG_ROT180(spA0.yaw) + (phi_a3 >> 2);
+ sp90.pitch = -spA0.pitch;
+ spCC = sp70->pos;
+ spCC.y += 30.0f;
+ OLib_AddVecGeoToVec3f(&spC0, &spCC, &sp90);
+ spCC.x = (camera->targetPosRot.pos.x + spD8.x) * 0.5f;
+ spCC.y = (camera->targetPosRot.pos.y + spD8.y) * 0.5f;
+ spCC.z = (camera->targetPosRot.pos.z + spD8.z) * 0.5f;
+ OLib_Vec3fDiffToVecGeo(&sp98, &spCC, &spC0);
+ if (sp98.pitch < -0x2328) { // 49.4 degrees
+ sp98.pitch = -0x2328;
+ }
+ }
+ } else if (!(roData->interfaceFlags & KEEPON3_FLAG_5) && (ABS((s16)(spA0.yaw - sp80.yaw)) < 0x4000)) {
+ if ((s16)(spA0.yaw - sp80.yaw) > 0) {
+ phi_a3 = -phi_a3;
+ }
+ sp98.yaw = (s16)(spA0.yaw + phi_a3);
+ sp6A = (s16)(spA0.yaw - phi_a3);
+ } else {
+ if ((s16)(BINANG_ROT180(spA0.yaw) - sp80.yaw) < 0) {
+ phi_a3 = -phi_a3;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Data2.s")
+ sp98.yaw = BINANG_ROT180(spA0.yaw) + phi_a3;
+ sp6A = BINANG_ROT180(spA0.yaw) - phi_a3;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Data3.s")
+ sp6C = sp98.yaw;
+ sp6E = sp98.pitch;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Data4.s")
+ //! FAKE
+ if (roData->unk_28) {}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Unique1.s")
+ spB4 = spA0.r;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Unique2.s")
+ phi_f14 = roData->unk_28;
+ spA0.r = spB8 * phi_f14 + (spB4 * (1.0f - phi_f14));
+ spD8 = focalActorPosRot->pos;
+ spD8.y += focalActorHeight;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Unique3.s")
+ OLib_AddVecGeoToVec3f(&rwData->unk_10, &spD8, &spA0);
+ rwData->unk_10.y += roData->unk_00;
+ spA0.r = spB4;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Unique4.s")
+ if (sp78 != 0) {
+ sp98.r = ((roData->unk_04 + (spA0.r * 0.5f)) - sp80.r) + sp80.r;
+ i = 0;
+ sp78 = 14;
+ OLib_AddVecGeoToVec3f(&spCC, &rwData->unk_10, &sp98);
+ if (!(roData->interfaceFlags & KEEPON3_FLAG_7)) {
+ if (CollisionCheck_LineOCCheck(camera->play, &camera->play->colChkCtx, &rwData->unk_10, &spCC, spA8,
+ 2) ||
+ Camera_BgCheck(camera, &rwData->unk_10, &spCC)) {
+ sp98.yaw = sp6A;
+ OLib_AddVecGeoToVec3f(&spCC, &rwData->unk_10, &sp98);
+ }
+ while (i < sp78) {
+ if (!CollisionCheck_LineOCCheck(camera->play, &camera->play->colChkCtx, &rwData->unk_10, &spCC,
+ spA8, 2) &&
+ !Camera_BgCheck(camera, &rwData->unk_10, &spCC)) {
+ break;
+ }
+ sp98.yaw = sp6C + D_801B9E18[i];
+ sp98.pitch = sp6E + D_801B9E34[i];
+ OLib_AddVecGeoToVec3f(&spCC, &rwData->unk_10, &sp98);
+ i++;
+ }
+ }
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Unique5.s")
+ Camera_UnsetStateFlag(camera, CAM_STATE_3 | CAM_STATE_2);
+ temp_f0 = ((rwData->timer + 1) * rwData->timer) >> 1;
+ rwData->unk_04 = (f32)(s16)(sp98.yaw - sp80.yaw) / temp_f0;
+ rwData->unk_08 = (f32)(s16)(sp98.pitch - sp80.pitch) / temp_f0;
+ rwData->unk_00 = (sp98.r - sp80.r) / temp_f0;
+ sCameraInterfaceFlags = CAM_INTERFACE_FLAGS(CAM_LETTERBOX_IGNORE, CAM_HUD_VISIBILITY_IGNORE, 0);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Unique0.s")
+ return 1;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Unique6.s")
+ sCameraInterfaceFlags = roData->interfaceFlags;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Unique7.s")
+ if (rwData->timer != 0) {
+ timer = rwData->timer;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Unique8.s")
+ at->x += (rwData->unk_10.x - at->x) / timer;
+ at->y += (rwData->unk_10.y - at->y) / timer;
+ at->z += (rwData->unk_10.z - at->z) / timer;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Unique9.s")
+ sp98.r = (rwData->unk_00 * timer) + sp80.r + 1.0f;
+ sp98.yaw = sp80.yaw + (s16)(rwData->unk_04 * timer);
+ sp98.pitch = sp80.pitch + (s16)(rwData->unk_08 * timer);
+ OLib_AddVecGeoToVec3f(eyeNext, at, &sp98);
+ *eye = *eyeNext;
+ camera->fov = Camera_ScaledStepToCeilF(roData->unk_20, camera->fov, 0.5f, 0.1f);
+ camera->roll = Camera_ScaledStepToCeilS(0, camera->roll, 0.5f, 5);
+ camera->atLerpStepScale = Camera_ClampLerpScale(camera, roData->unk_24);
+ func_800CBFA4(camera, at, eye, 3);
+ rwData->timer--;
+ } else {
+ Camera_SetStateFlag(camera, CAM_STATE_10 | CAM_STATE_4);
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Demo1.s")
+ Camera_SetFocalActorAtOffset(camera, &focalActorPosRot->pos);
+ camera->dist = OLib_Vec3fDist(at, eye);
+ if (camera->stateFlags & CAM_STATE_3) {
+ sCameraInterfaceFlags = CAM_INTERFACE_FLAGS(CAM_LETTERBOX_NONE, CAM_HUD_VISIBILITY_ALL, 0);
+ Camera_SetUpdateRatesSlow(camera);
+ camera->atLerpStepScale = 0.0f;
+
+ if ((camera->xzSpeed > 0.001f) || CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_A) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_B) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_CUP) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_CDOWN) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_CLEFT) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_CRIGHT) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_Z) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_L) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_R)) {
+ Camera_SetStateFlag(camera, CAM_STATE_2);
+ Camera_UnsetStateFlag(camera, CAM_STATE_3);
+ }
+ }
+
+ if (rwData->unk_0C != camera->target) {
+ rwData->unk_0C = camera->target;
+ camera->animState = 10;
+ }
+
+ return 1;
+}
+
+/**
+ * Used for settings where camera turns around and faces player
+ * eg. all item-based settings, elegy shell cutscene, death cutscene, ...
+ */
+s32 Camera_KeepOn4(Camera* camera) {
+ Vec3f* eye = &camera->eye;
+ Vec3f* at = &camera->at;
+ Vec3f* eyeNext = &camera->eyeNext;
+ Actor* spCC[2];
+ f32 temp_f0_2;
+ f32 new_var;
+ CollisionPoly* spC0;
+ VecGeo spB8;
+ VecGeo spB0;
+ VecGeo spA8;
+ s16* sp44 = &camera->data2;
+ s16 spA2;
+ s16 spA0;
+ s16 sp9E;
+ s16 sp9C;
+ s16 pad1;
+ PosRot* focalActorPosRot = &camera->focalActorPosRot;
+ KeepOn4ReadOnlyData* roData = &camera->paramData.keep4.roData;
+ KeepOn4ReadWriteData* rwData = &camera->paramData.keep4.rwData;
+ f32 focalActorHeight;
+ s32 bgId;
+ s16 camMode;
+ Player* player;
+ Vec3f* data;
+ CameraModeValue* values;
+ PosRot sp60;
+ PosRot sp4C;
+
+ if (RELOAD_PARAMS(camera)) {
+ if (camera->play->view.unk164 == 0) {
+ Camera_SetStateFlag(camera, CAM_STATE_DISABLE_MODE_CHANGE);
+ Camera_UnsetStateFlag(camera, CAM_STATE_2 | CAM_STATE_CHECK_WATER);
+ camera->play->view.unk164 = camera->camId | 0x50;
+ return true;
+ }
+ rwData->unk_18 = *sp44;
+ Camera_UnsetStateFlag(camera, CAM_STATE_DISABLE_MODE_CHANGE);
+ }
+
+ if (camera->focalActor == &GET_PLAYER(camera->play)->actor) {
+ player = (Player*)camera->focalActor;
+
+ switch (((Player*)camera->focalActor)->transformation) {
+ case PLAYER_FORM_DEKU:
+ camMode = CAM_MODE_DEKUSHOOT;
+ break;
+
+ case PLAYER_FORM_GORON:
+ camMode = CAM_MODE_GORONDASH;
+ break;
+
+ case PLAYER_FORM_ZORA:
+ camMode = CAM_MODE_DEKUFLY;
+ break;
+
+ case PLAYER_FORM_FIERCE_DEITY:
+ camMode = CAM_MODE_JUMP;
+ break;
+
+ default:
+ camMode = CAM_MODE_NORMAL;
+ break;
+ }
+
+ focalActorHeight = Camera_GetFocalActorHeight(camera) - (player->unk_AB8 * camera->focalActor->scale.y);
+ } else {
+ camMode = CAM_MODE_NORMAL;
+ focalActorHeight = Camera_GetFocalActorHeight(camera);
+ }
+
+ if (rwData->unk_18 != *sp44) {
+ camera->animState = 20;
+ Camera_SetStateFlag(camera, CAM_STATE_DISABLE_MODE_CHANGE);
+ Camera_UnsetStateFlag(camera, CAM_STATE_2 | CAM_STATE_CHECK_WATER);
+ camera->play->view.unk164 = camera->camId | 0x50;
+ return true;
+ }
+
+ Camera_UnsetStateFlag(camera, CAM_STATE_4);
+ if (RELOAD_PARAMS(camera)) {
+ values = sCameraSettings[camera->setting].cameraModes[camMode].values;
+ new_var = -0.5f;
+ roData->unk_00 = GET_NEXT_SCALED_RO_DATA(values) * focalActorHeight *
+ ((1.0f + new_var) - ((68.0f / focalActorHeight) * new_var));
+ roData->unk_04 = GET_NEXT_SCALED_RO_DATA(values) * focalActorHeight *
+ ((1.0f + new_var) - ((68.0f / focalActorHeight) * new_var));
+ roData->unk_08 = GET_NEXT_RO_DATA(values);
+ roData->unk_0C = GET_NEXT_RO_DATA(values);
+ roData->unk_10 = GET_NEXT_RO_DATA(values);
+ roData->unk_18 = GET_NEXT_RO_DATA(values);
+ roData->interfaceFlags = GET_NEXT_RO_DATA(values);
+ roData->unk_14 = GET_NEXT_SCALED_RO_DATA(values);
+ roData->timer = GET_NEXT_RO_DATA(values);
+ }
+
+ sUpdateCameraDirection = true;
+ sCameraInterfaceFlags = roData->interfaceFlags;
+
+ OLib_Vec3fDiffToVecGeo(&spB0, at, eye);
+ data = &D_801EDDD0;
+ OLib_Vec3fDiffToVecGeo(&spA8, at, eyeNext);
+ D_801EDDD0 = focalActorPosRot->pos;
+ D_801EDDD0.y = data->y + focalActorHeight;
+ temp_f0_2 = BgCheck_CameraRaycastFloor2(&camera->play->colCtx, &spC0, &bgId, &D_801EDDD0);
+
+ if ((roData->unk_00 + data->y) < temp_f0_2) {
+ D_801EDDD0.y = temp_f0_2 + 10.0f;
+ } else {
+ D_801EDDD0.y = roData->unk_00 + data->y;
+ }
+
+ if (roData->unk_10 != 0.0f) {
+ D_801EDDE0 = (*data);
+ spB8.r = roData->unk_10;
+ spB8.pitch = 0;
+ spB8.yaw = focalActorPosRot->rot.y;
+ OLib_AddVecGeoToVec3f(&D_801EDDD0, &D_801EDDD0, &spB8);
+ }
+
+ sp9C = 0;
+
+ switch (camera->animState) {
+ case 0:
+ case 20:
+ spCC[sp9C] = camera->focalActor;
+ sp9C++;
+ Camera_SetUpdateRatesFastPitch(camera);
+ Camera_UnsetStateFlag(camera, CAM_STATE_2 | CAM_STATE_CHECK_WATER);
+ rwData->timer = roData->timer;
+ rwData->unk_08 = focalActorPosRot->pos.y - camera->unk_0F0.y;
+
+ switch (roData->interfaceFlags & (KEEPON4_FLAG_3 | KEEPON4_FLAG_2 | KEEPON4_FLAG_1)) {
+ case KEEPON4_FLAG_1:
+ spA2 = CAM_DEG_TO_BINANG(roData->unk_08);
+ spA0 = BINANG_SUB(BINANG_ROT180(focalActorPosRot->rot.y), spA8.yaw) < 0
+ ? BINANG_ROT180(focalActorPosRot->rot.y) + CAM_DEG_TO_BINANG(roData->unk_0C)
+ : BINANG_ROT180(focalActorPosRot->rot.y) - CAM_DEG_TO_BINANG(roData->unk_0C);
+ break;
+
+ case (KEEPON4_FLAG_3 | KEEPON4_FLAG_2):
+ spA2 = CAM_DEG_TO_BINANG(roData->unk_08);
+ pad1 = BINANG_ROT180(focalActorPosRot->rot.y);
+ spA0 = pad1 + CAM_DEG_TO_BINANG(roData->unk_0C);
+ break;
+
+ case KEEPON4_FLAG_2:
+ spA2 = CAM_DEG_TO_BINANG(roData->unk_08);
+ spA0 = CAM_DEG_TO_BINANG(roData->unk_0C);
+ break;
+
+ case (KEEPON4_FLAG_2 | KEEPON4_FLAG_1):
+ spA2 = spA8.pitch + CAM_DEG_TO_BINANG(roData->unk_08);
+ spA0 = spA8.yaw + CAM_DEG_TO_BINANG(roData->unk_0C);
+ break;
+
+ case KEEPON4_FLAG_3:
+ if (camera->target != NULL) {
+ Actor_GetWorldPosShapeRot(&sp60, camera->target);
+ spA2 = CAM_DEG_TO_BINANG(roData->unk_08) - sp60.rot.x;
+ spA0 = (BINANG_SUB(BINANG_ROT180(sp60.rot.y), spA8.yaw) > 0)
+ ? BINANG_ROT180(sp60.rot.y) + CAM_DEG_TO_BINANG(roData->unk_0C)
+ : BINANG_ROT180(sp60.rot.y) - CAM_DEG_TO_BINANG(roData->unk_0C);
+
+ spCC[1] = camera->target;
+ sp9C++;
+ break;
+ }
+ // fallthrough
+ case (KEEPON4_FLAG_3 | KEEPON4_FLAG_1):
+ if (camera->target != 0) {
+ Actor_GetWorld(&sp4C, camera->target);
+ spA2 = CAM_DEG_TO_BINANG(roData->unk_08);
+ sp9E = Camera_CalcXZAngle(&sp4C.pos, &focalActorPosRot->pos);
+ spA0 = (BINANG_SUB(sp9E, spA8.yaw) > 0) ? sp9E + CAM_DEG_TO_BINANG(roData->unk_0C)
+ : sp9E - CAM_DEG_TO_BINANG(roData->unk_0C);
+ spCC[1] = camera->target;
+ sp9C++;
+ break;
+ }
+ // fallthrough
+ case (KEEPON4_FLAG_3 | KEEPON4_FLAG_2 | KEEPON4_FLAG_1):
+ spA2 = CAM_DEG_TO_BINANG(roData->unk_08);
+ spA0 = spA8.yaw;
+ break;
+
+ default:
+ spA2 = spA8.pitch;
+ spA0 = spA8.yaw;
+ break;
+ }
+
+ spB8.pitch = spA2;
+ spB8.yaw = spA0;
+ spB8.r = roData->unk_04;
+ // Odd that the return is set to bgId and remains unused
+ bgId = func_800CC260(camera, &D_801EDDF0, &D_801EDDD0, &spB8, spCC, sp9C);
+ rwData->unk_04 = (f32)(s16)(spB8.pitch - spA8.pitch) / rwData->timer;
+ rwData->unk_00 = (f32)(s16)(spB8.yaw - spA8.yaw) / rwData->timer;
+ rwData->unk_10 = spA8.yaw;
+ rwData->unk_12 = spA8.pitch;
+ camera->animState++;
+ rwData->unk_16 = 1;
+ break;
+
+ case 10:
+ rwData->unk_08 = focalActorPosRot->pos.y - camera->unk_0F0.y;
+ break;
+ }
+
+ if (roData->interfaceFlags & KEEPON4_FLAG_6) {
+ if (rwData->timer != 0) {
+ at->x += ((data->x - at->x) / rwData->timer);
+ at->y += ((data->y - at->y) / rwData->timer);
+ at->z += ((data->z - at->z) / rwData->timer);
+ Camera_SetFocalActorAtOffset(camera, &focalActorPosRot->pos);
+ }
+ camera->yOffsetUpdateRate = 0.25f;
+ camera->xzOffsetUpdateRate = 0.25f;
+ camera->atLerpStepScale = 0.0f;
+ } else {
+ camera->yOffsetUpdateRate = 0.25f;
+ camera->xzOffsetUpdateRate = 0.25f;
+ camera->atLerpStepScale = 0.75f;
+ Camera_ScaledStepToCeilVec3f(data, at, 0.2f, 0.2f, 0.2f);
+ camera->atLerpStepScale = 0.0f;
+ Camera_SetFocalActorAtOffset(camera, &focalActorPosRot->pos);
+ }
+
+ camera->dist = Camera_ScaledStepToCeilF(roData->unk_04, camera->dist, 0.25f, 1.0f);
+ spB8.r = camera->dist;
+
+ if (rwData->timer != 0) {
+ Camera_SetStateFlag(camera, CAM_STATE_DISABLE_MODE_CHANGE);
+ rwData->unk_10 += (s16)rwData->unk_00;
+ rwData->unk_12 += (s16)rwData->unk_04;
+ rwData->timer--;
+ } else {
+ Camera_SetStateFlag(camera, CAM_STATE_10 | CAM_STATE_4);
+ }
+
+ spB8.yaw = Camera_ScaledStepToCeilS(rwData->unk_10, spA8.yaw, roData->unk_14, 5);
+ spB8.pitch = Camera_ScaledStepToCeilS(rwData->unk_12, spA8.pitch, roData->unk_14, 5);
+ OLib_AddVecGeoToVec3f(eyeNext, at, &spB8);
+ *eye = *eyeNext;
+ func_800CBFA4(camera, at, eye, 3);
+
+ camera->fov = Camera_ScaledStepToCeilF(roData->unk_18, camera->fov, camera->fovUpdateRate, 0.1f);
+ camera->roll = Camera_ScaledStepToCeilS(0, camera->roll, 0.5f, 5);
+
+ return 1;
+}
+
+s32 Camera_KeepOn0(Camera* camera) {
+ return Camera_Noop(camera);
+}
+
+/**
+ * Used for many fixed-based camera settings i.e. camera is fixed in rotation, and often position (but not always)
+ */
+s32 Camera_Fixed1(Camera* camera) {
+ s32 pad[2];
+ s32 yawDiff;
+ VecGeo eyeOffset;
+ VecGeo eyeAtOffset;
+ VecGeo sp7C;
+ u32 negOne;
+ Vec3f adjustedPos;
+ BgCamFuncData* bgCamFuncData;
+ Vec3f* eye = &camera->eye;
+ Vec3f* at = &camera->at;
+ PosRot* focalActorPosRot = &camera->focalActorPosRot;
+ f32 focalActorHeight = Camera_GetFocalActorHeight(camera);
+ CameraModeValue* values;
+ PosRot* targetHome;
+ PosRot* targetWorld;
+ VecGeo sp44;
+ Fixed1ReadOnlyData* roData = &camera->paramData.fixd1.roData;
+ Fixed1ReadWriteData* rwData = &camera->paramData.fixd1.rwData;
+
+ OLib_Vec3fDiffToVecGeo(&sp7C, at, eye);
+
+ if (!RELOAD_PARAMS(camera)) {
+ } else {
+ values = sCameraSettings[camera->setting].cameraModes[camera->mode].values;
+ bgCamFuncData = (BgCamFuncData*)Camera_GetBgCamOrActorCsCamFuncData(camera, camera->bgCamIndex);
+ Camera_Vec3sToVec3f(&rwData->eyePosRotTarget.pos, &bgCamFuncData->pos);
+
+ rwData->eyePosRotTarget.rot = bgCamFuncData->rot;
+ rwData->fov = bgCamFuncData->fov;
+ rwData->focalActor = camera->focalActor;
+
+ roData->unk_00 = GET_NEXT_SCALED_RO_DATA(values) * focalActorHeight;
+ roData->unk_04 = GET_NEXT_SCALED_RO_DATA(values);
+ roData->fov = GET_NEXT_RO_DATA(values);
+ roData->interfaceFlags = GET_NEXT_RO_DATA(values);
+
+ if (roData->interfaceFlags & FIXED1_FLAG_4) {
+ if (camera->target == NULL) {
+ return false;
+ }
+
+ targetHome = &camera->target->home;
+ targetWorld = &camera->target->world;
+
+ OLib_Vec3fDiffToVecGeo(&sp44, &targetHome->pos, &rwData->eyePosRotTarget.pos);
+ sp44.yaw = targetWorld->rot.y + (s16)(sp44.yaw - targetHome->rot.y);
+ OLib_AddVecGeoToVec3f(&rwData->eyePosRotTarget.pos, &targetWorld->pos, &sp44);
+ yawDiff = (s16)(rwData->eyePosRotTarget.rot.y - targetHome->rot.y);
+ rwData->eyePosRotTarget.rot.y = targetWorld->rot.y + yawDiff;
+ }
+ }
+
+ negOne = -1;
+
+ if (rwData->focalActor != camera->focalActor) {
+ camera->animState = 20;
+ }
+
+ if (rwData->fov == (s32)negOne) {
+ rwData->fov = roData->fov * 100;
+ } else if (rwData->fov <= 360) {
+ rwData->fov *= 100;
+ }
+
+ sCameraInterfaceFlags = roData->interfaceFlags;
+
+ if (camera->animState == 0) {
+ camera->animState++;
+ Camera_SetUpdateRatesSlow(camera);
+ if (rwData->fov != (s32)negOne) {
+ roData->fov = CAM_RODATA_UNSCALE(rwData->fov);
+ }
+
+ if (bgCamFuncData->unk_0E != (s32)negOne) {
+ roData->unk_04 = CAM_RODATA_UNSCALE(bgCamFuncData->unk_0E);
+ }
+ }
+
+ OLib_Vec3fDiffToVecGeo(&eyeAtOffset, eye, at);
+ Camera_ScaledStepToCeilVec3f(&rwData->eyePosRotTarget.pos, eye, roData->unk_04, roData->unk_04, 0.2f);
+ adjustedPos = focalActorPosRot->pos;
+ adjustedPos.y += focalActorHeight;
+ camera->dist = OLib_Vec3fDist(&adjustedPos, eye);
+ eyeOffset.r = camera->dist;
+ eyeOffset.pitch =
+ Camera_ScaledStepToCeilS(rwData->eyePosRotTarget.rot.x * -1, eyeAtOffset.pitch, roData->unk_04, 5);
+ eyeOffset.yaw = Camera_ScaledStepToCeilS(rwData->eyePosRotTarget.rot.y, eyeAtOffset.yaw, roData->unk_04, 5);
+ OLib_AddVecGeoToVec3f(at, eye, &eyeOffset);
+ camera->eyeNext = *eye;
+ Camera_BgCheck(camera, eye, at);
+
+ camera->fov = Camera_ScaledStepToCeilF(roData->fov, camera->fov, roData->unk_04, 0.1f);
+ camera->roll = 0;
+ camera->atLerpStepScale = 0.0f;
+ Camera_SetFocalActorAtOffset(camera, &focalActorPosRot->pos);
+ camera->roll = Camera_ScaledStepToCeilS(rwData->eyePosRotTarget.rot.z, camera->roll, roData->unk_04, 5);
+
+ return 1;
+}
+
+/**
+ * Used for many pivot-based camera settings i.e. camera fixed in position but free to rotate
+ */
+s32 Camera_Fixed2(Camera* camera) {
+ Vec3f* eye = &camera->eye;
+ Vec3f* at = &camera->at;
+ Vec3f* eyeNext = &camera->eyeNext;
+ Vec3f spB0;
+ Vec3f spA4;
+ Vec3f sp98;
+ PosRot* focalActorPosRot = &camera->focalActorPosRot;
+ f32 temp_f0_3;
+ f32 new_var;
+ BgCamFuncData* bgCamFuncData;
+ VecGeo sp80;
+ PosRot* sp7C;
+ PosRot* sp78;
+ VecGeo sp70;
+ Vec3f* new_var1;
+ Vec3f* new_var2;
+ Player* player;
+ f32 focalActorHeight = Camera_GetFocalActorHeight(camera);
+ Actor* actor;
+ Fixed2ReadOnlyData* roData = &camera->paramData.fixd2.roData;
+ Fixed2ReadWriteData* rwData = &camera->paramData.fixd2.rwData;
+ CameraModeValue* values;
+ Vec3f sp44;
+
+ if (!RELOAD_PARAMS(camera)) {
+ } else {
+ //! FAKE
+ if (new_var2) {}
+
+ values = sCameraSettings[camera->setting].cameraModes[camera->mode].values;
+ roData->unk_00 =
+ GET_NEXT_SCALED_RO_DATA(values) * focalActorHeight * (0.8f - ((68.0f / focalActorHeight) * -0.2f));
+ roData->unk_04 = GET_NEXT_RO_DATA(values);
+ roData->unk_08 = GET_NEXT_RO_DATA(values);
+ roData->unk_0C = GET_NEXT_SCALED_RO_DATA(values);
+ roData->unk_10 = GET_NEXT_SCALED_RO_DATA(values);
+ roData->unk_14 = GET_NEXT_RO_DATA(values);
+ roData->interfaceFlags = GET_NEXT_RO_DATA(values);
+ rwData->unk_1C = roData->unk_14 * 100.0f;
+ bgCamFuncData = (BgCamFuncData*)Camera_GetBgCamOrActorCsCamFuncData(camera, camera->bgCamIndex);
+ if (bgCamFuncData != NULL) {
+ if (!(roData->interfaceFlags & FIXED2_FLAG_1)) {
+ Camera_Vec3sToVec3f(&rwData->unk_00, &bgCamFuncData->pos);
+ } else {
+ if (camera->focalActor != &GET_PLAYER(camera->play)->actor) {
+ player = GET_PLAYER(camera->play);
+ OLib_Vec3fDiffToVecGeo(&sp70, &player->actor.focus.pos, eye);
+ if (sp70.r < roData->unk_04) {
+ sp70.r = roData->unk_04;
+ if (sp70.pitch < 0xBB8) { // 16.5 degrees
+ sp70.pitch = 0xBB8;
+ }
+
+ new_var1 = &player->actor.focus.pos;
+
+ OLib_AddVecGeoToVec3f(&rwData->unk_00, new_var1, &sp70);
+ } else {
+ rwData->unk_00 = *eye;
+ //! FAKE:
+ dummy:;
+ }
+ } else {
+ rwData->unk_00 = camera->eye;
+ }
+ }
+
+ if (bgCamFuncData->fov != -1) {
+ if (roData->interfaceFlags & FIXED2_FLAG_7) {
+ rwData->unk_1C = (bgCamFuncData->fov >> 1) + (bgCamFuncData->fov >> 2);
+ if (rwData->unk_1C < 0x1E) {
+ rwData->unk_1C = 0x1E;
+ }
+ } else {
+ rwData->unk_1C = bgCamFuncData->fov;
+ }
+ }
+
+ if (bgCamFuncData->unk_0E != -1) {
+ rwData->unk_0C = bgCamFuncData->unk_0E;
+ } else {
+ rwData->unk_0C = roData->unk_08;
+ }
+
+ if (bgCamFuncData->unk_10 != -1) {
+ if (roData->interfaceFlags & FIXED2_FLAG_2) {
+ rwData->unk_14 = bgCamFuncData->unk_10 * 0.01f;
+ rwData->unk_18 = roData->unk_0C;
+ } else {
+ temp_f0_3 = bgCamFuncData->unk_10 * 0.01f;
+ rwData->unk_18 = temp_f0_3;
+ rwData->unk_14 = temp_f0_3;
+ }
+ } else {
+ rwData->unk_14 = roData->unk_10;
+ rwData->unk_18 = roData->unk_0C;
+ }
+ if (roData->interfaceFlags & FIXED2_FLAG_4) {
+ if (camera->target == 0) {
+ return 0;
+ }
+ sp7C = &camera->target->home;
+ sp78 = &camera->target->world;
+ OLib_Vec3fDiffToVecGeo(&sp70, &sp7C->pos, &rwData->unk_00);
+ sp70.yaw = sp78->rot.y + (s16)(sp70.yaw - sp7C->rot.y);
+ OLib_AddVecGeoToVec3f(&rwData->unk_00, &sp78->pos, &sp70);
+ }
+ } else {
+ rwData->unk_00 = camera->eye;
+ rwData->unk_0C = roData->unk_08;
+ rwData->unk_14 = roData->unk_10;
+ rwData->unk_18 = roData->unk_0C;
+ }
+ if (rwData->unk_1C <= 360) {
+ rwData->unk_1C *= 100;
+ }
+ if (camera->animState == 20) {
+ rwData->unk_14 = 0.2f;
+ }
+ //! FAKE:
+ if (1) {}
+ }
+
+ sCameraInterfaceFlags = roData->interfaceFlags;
+ //! FAKE:
+ new_var = 0.0f;
+
+ if (roData->interfaceFlags & FIXED2_FLAG_3) {
+ if (camera->target == NULL) {
+ return false;
+ }
+
+ spB0.x = camera->target->focus.pos.x;
+ spB0.y = camera->target->focus.pos.y;
+ spB0.z = camera->target->focus.pos.z;
+
+ camera->focalActorAtOffset.x = spB0.x - focalActorPosRot->pos.x;
+ camera->focalActorAtOffset.y = spB0.y - focalActorPosRot->pos.y;
+ camera->focalActorAtOffset.z = spB0.z - focalActorPosRot->pos.z;
+ } else if (roData->interfaceFlags & FIXED2_FLAG_6) {
+ sp98.x = new_var;
+ sp98.y = roData->unk_00 + focalActorHeight;
+ sp98.z = new_var;
+
+ if (camera->target != NULL) {
+ new_var1 = &camera->focalActor->focus.pos;
+ new_var2 = &camera->target->focus.pos;
+ //! FAKE:
+ sp98.x = ((void)0, new_var) + ((new_var2->x - new_var1->x) * 0.4f);
+ sp98.y += (new_var2->y - new_var1->y) * 0.4f;
+ sp98.z = ((void)0, new_var) + ((new_var2->z - new_var1->z) * 0.4f);
+ }
+
+ Camera_ScaledStepToCeilVec3f(&sp98, &camera->focalActorAtOffset, 0.25f, 0.25f, 0.1f);
+ spB0.x = focalActorPosRot->pos.x + camera->focalActorAtOffset.x;
+ spB0.y = focalActorPosRot->pos.y + camera->focalActorAtOffset.y;
+ spB0.z = focalActorPosRot->pos.z + camera->focalActorAtOffset.z;
+ } else if (roData->interfaceFlags & FIXED2_FLAG_7) {
+ sp98.x = new_var;
+ sp98.y = roData->unk_00 + focalActorHeight;
+ sp98.z = new_var;
+
+ if (camera->target != NULL) {
+ new_var1 = &camera->focalActor->focus.pos;
+ new_var2 = &camera->target->focus.pos;
+ //! FAKE:
+ sp98.x = ((void)0, new_var) + ((new_var2->x - new_var1->x) * 0.7f);
+ sp98.y += (new_var2->y - new_var1->y) * 0.7f;
+ sp98.z = ((void)0, new_var) + ((new_var2->z - new_var1->z) * 0.7f);
+ }
+
+ Camera_ScaledStepToCeilVec3f(&sp98, &camera->focalActorAtOffset, 0.25f, 0.25f, 0.1f);
+ spB0.x = focalActorPosRot->pos.x + camera->focalActorAtOffset.x;
+ spB0.y = focalActorPosRot->pos.y + camera->focalActorAtOffset.y;
+ spB0.z = focalActorPosRot->pos.z + camera->focalActorAtOffset.z;
+ } else {
+ sp98.x = new_var;
+ sp98.z = new_var;
+
+ if ((((Player*)camera->focalActor)->stateFlags1 & PLAYER_STATE1_4000) ||
+ (((Player*)camera->focalActor)->stateFlags1 & PLAYER_STATE1_4)) {
+ sp98.y = roData->unk_00;
+ } else {
+ sp98.y = roData->unk_00 + focalActorHeight;
+ }
+
+ Camera_ScaledStepToCeilVec3f(&sp98, &camera->focalActorAtOffset, rwData->unk_14, rwData->unk_14, 0.1f);
+ spB0.x = focalActorPosRot->pos.x + camera->focalActorAtOffset.x;
+ spB0.y = focalActorPosRot->pos.y + camera->focalActorAtOffset.y;
+ spB0.z = focalActorPosRot->pos.z + camera->focalActorAtOffset.z;
+ }
+
+ if (camera->animState == 0) {
+ Camera_SetUpdateRatesSlow(camera);
+ if (!(roData->interfaceFlags & FIXED2_FLAG_0)) {
+ *at = spB0;
+ OLib_Vec3fDiffToVecGeo(&sp80, at, &rwData->unk_00);
+ if ((rwData->unk_0C < sp80.r) || (roData->interfaceFlags & FIXED2_FLAG_5)) {
+ sp80.r = rwData->unk_0C;
+ OLib_AddVecGeoToVec3f(&spA4, at, &sp80);
+ } else {
+ if (sp80.r < roData->unk_04) {
+ sp80.r = roData->unk_04;
+ OLib_AddVecGeoToVec3f(&spA4, at, &sp80);
+ } else {
+ spA4 = rwData->unk_00;
+ }
+ }
+ sp44 = spA4;
+ camera->eyeNext = sp44;
+ *eye = sp44;
+ camera->fov = rwData->unk_1C * 0.01f;
+ }
+ }
+
+ Camera_ScaledStepToCeilVec3f(&spB0, at, rwData->unk_14, rwData->unk_14, 1.0f);
+ OLib_Vec3fDiffToVecGeo(&sp80, at, &rwData->unk_00);
+ if ((rwData->unk_0C < sp80.r) || (roData->interfaceFlags & FIXED2_FLAG_5)) {
+ sp80.r = rwData->unk_0C;
+ OLib_AddVecGeoToVec3f(&spA4, at, &sp80);
+ } else if (sp80.r < roData->unk_04) {
+ sp80.r = roData->unk_04;
+ OLib_AddVecGeoToVec3f(&spA4, at, &sp80);
+ } else {
+ spA4 = rwData->unk_00;
+ }
+
+ Camera_ScaledStepToCeilVec3f(&spA4, eyeNext, rwData->unk_18, rwData->unk_18, 0.1f);
+ *eye = *eyeNext;
+ camera->dist = OLib_Vec3fDist(at, eye);
+ camera->roll = 0;
+ camera->xzSpeed = 0;
+ rwData->unk_10 = rwData->unk_1C * 0.01f;
+ camera->fov = Camera_ScaledStepToCeilF(rwData->unk_10, camera->fov, rwData->unk_14, 0.1f);
+ camera->atLerpStepScale = Camera_ClampLerpScale(camera, 1.0f);
+ Camera_SetFocalActorAtOffset(camera, &focalActorPosRot->pos);
+ camera->animState = 1;
+
+ return true;
+}
+
+/**
+ * Used by the unused PREREND_FIXED Camera Setting. Remnant of OoT
+ */
+s32 Camera_Fixed3(Camera* camera) {
+ return Camera_Noop(camera);
+}
+
+s32 Camera_Fixed4(Camera* camera) {
+ return Camera_Noop(camera);
+}
+
+s32 Camera_Fixed0(Camera* camera) {
+ return Camera_Noop(camera);
+}
+
+/**
+ * First person view
+ */
+s32 Camera_Subject1(Camera* camera) {
+ Vec3f* eye = &camera->eye;
+ Vec3f* at = &camera->at;
+ Vec3f* eyeNext = &camera->eyeNext;
+ Vec3f sp90;
+ Vec3f sp84;
+ VecGeo sp7C;
+ VecGeo sp74;
+ VecGeo tgeo;
+ PosRot sp58;
+ f32 sp54;
+ f32 temp_f0_2;
+ s16 sp4E;
+ s16 sp4C;
+ Subject1ReadOnlyData* roData = &camera->paramData.subj1.roData;
+ Subject1ReadWriteData* rwData = &camera->paramData.subj1.rwData;
+ CameraModeValue* values;
+ f32 temp_f0;
+ f32 focalActorHeight;
+
+ Actor_GetFocus(&sp58, camera->focalActor);
+ focalActorHeight = Camera_GetFocalActorHeight(camera);
+ Camera_SetUpdateRatesFastPitch(camera);
+
+ values = sCameraSettings[camera->setting].cameraModes[camera->mode].values;
+ roData->unk_00 = GET_NEXT_SCALED_RO_DATA(values) * focalActorHeight;
+ roData->unk_04 = GET_NEXT_RO_DATA(values);
+ roData->unk_08 = GET_NEXT_RO_DATA(values);
+ roData->unk_0C = GET_NEXT_RO_DATA(values);
+ roData->unk_10 = GET_NEXT_RO_DATA(values) * 0.1f;
+ roData->unk_14 = GET_NEXT_RO_DATA(values) * 0.1f;
+ roData->unk_18 = GET_NEXT_RO_DATA(values) * 0.1f;
+ roData->unk_1C = GET_NEXT_RO_DATA(values);
+ roData->interfaceFlags = GET_NEXT_RO_DATA(values);
+
+ sp7C.r = roData->unk_08;
+ sp7C.yaw = BINANG_ROT180(sp58.rot.y);
+ sp7C.pitch = sp58.rot.x;
+ sp90 = sp58.pos;
+ sp90.y += roData->unk_00;
+
+ OLib_AddVecGeoToVec3f(&sp84, &sp90, &sp7C);
+ OLib_Vec3fDiffToVecGeo(&sp74, &camera->at, eye);
+ sCameraInterfaceFlags = roData->interfaceFlags;
+
+ if (camera->play->view.unk164 == 0) {
+ camera->play->view.unk164 = camera->camId | 0x50;
+ return true;
+ }
+
+ if (RELOAD_PARAMS(camera)) {
+ rwData->unk_00 = sp74.r;
+ rwData->unk_04 = sp74.yaw;
+ rwData->unk_06 = sp74.pitch;
+
+ if (roData->interfaceFlags & SUBJECT1_FLAG_4) {
+ camera->fov = roData->unk_1C;
+ rwData->timer = 0;
+ } else {
+ rwData->timer = 6;
+ }
+ camera->dist = roData->unk_08;
+ camera->rUpdateRateInv = 1.0f;
+ camera->animState++;
+ camera->dist = roData->unk_08;
+ }
+
+ tgeo.r = rwData->unk_00;
+ tgeo.pitch = rwData->unk_04;
+ tgeo.yaw = rwData->unk_06;
+
+ if (rwData->timer != 0) {
+ temp_f0 = (1.0f / rwData->timer);
+
+ VEC3F_LERPIMPDST(at, at, &sp90, temp_f0);
+
+ sp54 = ((tgeo.r - sp7C.r) * (1.0f / 6.0f));
+ sp4E = BINANG_SUB(tgeo.pitch, sp7C.yaw) * (1.0f / 6.0f);
+ sp4C = BINANG_SUB(tgeo.yaw, sp7C.pitch) * (1.0f / 6.0f);
+
+ sp74.r = Camera_ScaledStepToCeilF((rwData->timer * sp54) + sp7C.r, sp74.r, 0.5f, 1.0f);
+ sp74.yaw = Camera_ScaledStepToCeilS(sp7C.yaw + (sp4E * rwData->timer), sp74.yaw, 0.5f, 5);
+ sp74.pitch = Camera_ScaledStepToCeilS(sp7C.pitch + (sp4C * rwData->timer), sp74.pitch, 0.5f, 5);
+
+ OLib_AddVecGeoToVec3f(eyeNext, at, &sp74);
+ *eye = *eyeNext;
+ rwData->timer--;
+ } else {
+ sp54 = Math_SinS(-sp58.rot.x);
+ temp_f0_2 = Math_CosS(-sp58.rot.x);
+
+ sp90.x = roData->unk_10;
+ sp90.y = (roData->unk_14 * temp_f0_2) - (roData->unk_18 * sp54);
+ sp90.z = (roData->unk_14 * sp54) + (roData->unk_18 * temp_f0_2);
+
+ sp54 = Math_SinS(BINANG_ROT180(sp58.rot.y));
+ temp_f0_2 = Math_CosS(BINANG_ROT180(sp58.rot.y));
+
+ roData->unk_10 = (sp90.z * sp54) + (sp90.x * temp_f0_2);
+ roData->unk_14 = sp90.y;
+ roData->unk_18 = (sp90.z * temp_f0_2) - (sp90.x * sp54);
+
+ at->x = roData->unk_10 + sp58.pos.x;
+ at->y = roData->unk_14 + sp58.pos.y;
+ at->z = roData->unk_18 + sp58.pos.z;
+
+ sp74.r = roData->unk_08;
+ sp74.yaw = BINANG_ROT180(sp58.rot.y);
+ sp74.pitch = sp58.rot.x;
+
+ OLib_AddVecGeoToVec3f(&camera->eyeNext, at, &sp74);
+ sp74.r = roData->unk_04;
+ OLib_AddVecGeoToVec3f(eye, at, &sp74);
+ }
+
+ // TODO: is skyboxDisabled accurate here?
+ if (camera->play->envCtx.skyboxDisabled == 0) {
+ Camera_BgCheck(camera, at, eye);
+ } else {
+ func_800CBFA4(camera, at, eye, 3);
+ }
+
+ camera->fov = Camera_ScaledStepToCeilF(roData->unk_1C, camera->fov, 0.25f, 0.1f);
+ camera->roll = 0;
+ camera->atLerpStepScale = 0.0f;
+
+ return true;
+}
+
+s32 Camera_Subject2(Camera* camera) {
+ return Camera_Noop(camera);
+}
+
+s32 Camera_Subject3(Camera* camera) {
+ return Camera_Noop(camera);
+}
+
+s32 Camera_Subject4(Camera* camera) {
+ return Camera_Noop(camera);
+}
+
+s32 Camera_Subject0(Camera* camera) {
+ return Camera_Noop(camera);
+}
+
+s32 Camera_Data0(Camera* camera) {
+ return Camera_Noop(camera);
+}
+
+s32 Camera_Data1(Camera* camera) {
+ return Camera_Normal1(camera);
+}
+
+s32 Camera_Data2(Camera* camera) {
+ return Camera_Noop(camera);
+}
+
+s32 Camera_Data3(Camera* camera) {
+ return Camera_Noop(camera);
+}
+
+s32 Camera_Data4(Camera* camera) {
+ return Camera_Noop(camera);
+}
+
+s32 Camera_Unique1(Camera* camera) {
+ return Camera_Noop(camera);
+}
+
+/**
+ * Player diving from the surface of the water to underwater not as zora
+ * Also used when using a door to leave a scene
+ */
+s32 Camera_Unique2(Camera* camera) {
+ Vec3f* eye = &camera->eye;
+ Vec3f* at = &camera->at;
+ f32 phi_f16;
+ Vec3f sp70;
+ VecGeo sp68;
+ VecGeo sp60;
+ s32 pad[3];
+ Unique2ReadOnlyData* roData = &camera->paramData.uniq2.roData;
+ Unique2ReadWriteData* rwData = &camera->paramData.uniq2.rwData;
+ f32 focalActorHeight = Camera_GetFocalActorHeight(camera);
+ Vec3f* eyeNext = &camera->eyeNext;
+ CameraModeValue* values;
+
+ OLib_Vec3fDiffToVecGeo(&sp60, at, eye);
+
+ if (RELOAD_PARAMS(camera)) {
+ values = sCameraSettings[camera->setting].cameraModes[camera->mode].values;
+ roData->unk_00 =
+ GET_NEXT_SCALED_RO_DATA(values) * focalActorHeight * (0.8f - ((68.0f / focalActorHeight) * -0.2f));
+ roData->unk_04 = GET_NEXT_RO_DATA(values);
+ roData->unk_08 = 0.25f;
+ roData->unk_0C = GET_NEXT_RO_DATA(values);
+ roData->interfaceFlags = GET_NEXT_RO_DATA(values);
+ }
+
+ sCameraInterfaceFlags = roData->interfaceFlags;
+
+ if ((camera->animState == 0) || (rwData->unk_04 != roData->interfaceFlags)) {
+ rwData->unk_04 = roData->interfaceFlags;
+ }
+
+ if (camera->animState == 0) {
+ camera->animState = 1;
+ Camera_SetUpdateRatesSlow(camera);
+ rwData->unk_00 = 200.0f;
+ }
+
+ if (roData->interfaceFlags & UNIQUE2_FLAG_4) {
+ *eyeNext = *eye;
+ Camera_UnsetStateFlag(camera, CAM_STATE_2);
+ }
+
+ sp70 = camera->focalActorPosRot.pos;
+
+ if (roData->interfaceFlags & UNIQUE2_FLAG_0) {
+ phi_f16 = 1.0f;
+ } else {
+ phi_f16 = camera->speedRatio;
+ }
+
+ at->x += (sp70.x - at->x) * phi_f16 * 0.3f;
+ at->y += ((sp70.y + focalActorHeight + roData->unk_00) - at->y) * 0.2f;
+ at->z += (sp70.z - at->z) * phi_f16 * 0.3f;
+
+ rwData->unk_00 = rwData->unk_00 + ((2.0f - rwData->unk_00) * 0.05f);
+
+ if (roData->interfaceFlags & UNIQUE2_FLAG_0) {
+ OLib_Vec3fDiffToVecGeo(&sp68, at, eyeNext);
+ sp68.r = roData->unk_04;
+ OLib_AddVecGeoToVec3f(&sp70, at, &sp68);
+ Camera_ScaledStepToCeilVec3f(&sp70, eye, roData->unk_08, roData->unk_08, 0.2f);
+ } else if (roData->interfaceFlags & UNIQUE2_FLAG_1) {
+ if (OLib_Vec3fDistXZ(at, eyeNext) < roData->unk_04) {
+ OLib_Vec3fDiffToVecGeo(&sp68, at, eyeNext);
+ sp68.yaw = Camera_ScaledStepToCeilS(sp68.yaw, sp60.yaw, 0.1f, 5);
+ sp68.r = roData->unk_04;
+ sp68.pitch = 0;
+ OLib_AddVecGeoToVec3f(eye, at, &sp68);
+ eye->y = eyeNext->y;
+ } else {
+ Camera_ScaledStepToCeilVec3f(eyeNext, eye, roData->unk_08, roData->unk_08, 0.2f);
+ }
+ }
+
+ if (!(roData->interfaceFlags & UNIQUE2_FLAG_5)) {
+ Camera_BgCheck(camera, at, eye);
+ }
+
+ camera->dist = OLib_Vec3fDist(at, eye);
+ camera->roll = 0;
+ camera->fov = Camera_ScaledStepToCeilF(roData->unk_0C, camera->fov, 0.2f, 0.1f);
+ camera->atLerpStepScale = Camera_ClampLerpScale(camera, 1.0f);
+
+ return true;
+}
+
+/**
+ * Woodfall inside the Swamp, used for normal camModes and derivative modes
+ */
+s32 Camera_Unique3(Camera* camera) {
+ s32 ret = Camera_Normal1(camera);
+
+ if ((camera->play->sceneId == SCENE_21MITURINMAE) && (camera->eye.y < 5.0f)) {
+ camera->eye.y = 5.0f;
+ }
+ return ret;
+}
+
+/**
+ * Woodfall inside the Swamp, used for parallel camModes and derivative modes
+ */
+s32 Camera_Unique4(Camera* camera) {
+ s32 ret = Camera_Parallel1(camera);
+
+ if ((camera->play->sceneId == SCENE_21MITURINMAE) && (camera->eye.y < 5.0f)) {
+ camera->eye.y = 5.0f;
+ }
+ return ret;
+}
+
+/**
+ * Woodfall inside the Swamp, used for battle camMode
+ */
+s32 Camera_Unique5(Camera* camera) {
+ s32 ret = Camera_Battle1(camera);
+
+ if ((camera->play->sceneId == SCENE_21MITURINMAE) && (camera->eye.y < 5.0f)) {
+ camera->eye.y = 5.0f;
+ }
+ return ret;
+}
+
+/**
+ * Entering a room or scene (camera settings START0/START1/START2)
+ */
+s32 Camera_Unique0(Camera* camera) {
+ f32 playerHeight;
+ PosRot* focalActorPosRot = &camera->focalActorPosRot;
+ PosRot sp9C;
+ Player* player;
+ Vec3f sp8C;
+ VecGeo sp84;
+ VecGeo sp7C;
+ BgCamFuncData* bgCamFuncData;
+ f32 sp74;
+ s32 pad;
+ s16 temp_v1;
+ Unique0ReadOnlyData* roData = &camera->paramData.uniq0.roData;
+ Unique0ReadWriteData* rwData = &camera->paramData.uniq0.rwData;
+ CameraModeValue* values;
+ Vec3f sp54;
+
+ playerHeight = Player_GetHeight((Player*)camera->focalActor);
+ player = (Player*)camera->focalActor;
+
+ if (RELOAD_PARAMS(camera)) {
+ values = sCameraSettings[camera->setting].cameraModes[camera->mode].values;
+ roData->unk_00 = GET_NEXT_RO_DATA(values);
+ roData->unk_04 = GET_NEXT_RO_DATA(values);
+ roData->interfaceFlags = GET_NEXT_RO_DATA(values);
+ }
+
+ OLib_Vec3fDiffToVecGeo(&sp7C, &camera->at, &camera->eye);
+
+ if (player->rideActor != NULL) {
+ Actor_GetWorld(&sp9C, player->rideActor);
+ sp8C = sp9C.pos;
+ sp8C.y += playerHeight + 20.0f;
+ } else {
+ sp8C = camera->focalActorPosRot.pos;
+ sp8C.y += playerHeight;
+ }
+
+ sCameraInterfaceFlags = roData->interfaceFlags;
+
+ switch (camera->animState) {
+ case 0:
+ bgCamFuncData = (BgCamFuncData*)Camera_GetBgCamOrActorCsCamFuncData(camera, camera->bgCamIndex);
+ Camera_Vec3sToVec3f(&rwData->unk_1C, &bgCamFuncData->pos);
+ camera->eye = camera->eyeNext = rwData->unk_1C;
+ rwData->unk_34 = bgCamFuncData->rot;
+
+ temp_v1 = bgCamFuncData->fov;
+ if (temp_v1 != -1) {
+ if (temp_v1 <= 360) {
+ camera->fov = temp_v1;
+ } else {
+ camera->fov = temp_v1 * 0.01f;
+ }
+ }
+
+ rwData->timer = bgCamFuncData->unk_0E;
+ if (rwData->timer == -1) {
+ rwData->timer = 60;
+ }
+
+ if (bgCamFuncData->unk_10 != -1) {
+ rwData->unk_18 = bgCamFuncData->unk_10 * 0.01f;
+ } else {
+ rwData->unk_18 = roData->unk_04 * 0.01f;
+ }
+
+ rwData->unk_00 = focalActorPosRot->pos;
+ if (roData->interfaceFlags & UNIQUE0_FLAG_4) {
+ rwData->unk_0C.x = focalActorPosRot->pos.x;
+ rwData->unk_0C.y = focalActorPosRot->pos.y + playerHeight + roData->unk_00;
+ rwData->unk_0C.z = focalActorPosRot->pos.z;
+ }
+ rwData->unk_3A = camera->focalActor->world.rot.y;
+ rwData->unk_3E = 0;
+ camera->eye = camera->eyeNext = rwData->unk_1C;
+ Camera_UnsetStateFlag(camera, CAM_STATE_2);
+ camera->animState++;
+ // fallthrough
+ case 1:
+ sp84.r = OLib_Vec3fDist(&sp8C, &camera->eye);
+ sp84.yaw = rwData->unk_34.y;
+ sp84.pitch = -rwData->unk_34.x;
+ OLib_VecGeoToVec3f(&rwData->unk_28, &sp84);
+ func_80179A44(&rwData->unk_1C, focalActorPosRot, &rwData->unk_0C);
+ camera->at = rwData->unk_0C;
+
+ if (player->stateFlags1 & PLAYER_STATE1_20000000) {
+ rwData->unk_00 = focalActorPosRot->pos;
+ }
+
+ if (roData->interfaceFlags & UNIQUE0_FLAG_4) {
+ sp54.x = focalActorPosRot->pos.x;
+ sp54.y = focalActorPosRot->pos.y + playerHeight + roData->unk_00;
+ sp54.z = focalActorPosRot->pos.z;
+ Camera_ScaledStepToCeilVec3f(&sp54, &camera->at, camera->xzOffsetUpdateRate, camera->yOffsetUpdateRate,
+ 0.1f);
+ camera->yOffsetUpdateRate =
+ Camera_ScaledStepToCeilF(rwData->unk_18, camera->yOffsetUpdateRate, 0.1f, 0.0001f);
+ camera->xzOffsetUpdateRate =
+ Camera_ScaledStepToCeilF(rwData->unk_18, camera->xzOffsetUpdateRate, 0.1f, 0.0001f);
+ }
+
+ if ((camera->animState == 999) || (camera->animState == 666)) {
+ rwData->unk_3E = 2;
+ }
+
+ if (roData->interfaceFlags & UNIQUE0_FLAG_0) {
+ if (rwData->timer > 0) {
+ rwData->timer--;
+ rwData->unk_00 = focalActorPosRot->pos;
+ } else if (!(player->stateFlags1 & PLAYER_STATE1_20000000) &&
+ ((OLib_Vec3fDistXZ(&focalActorPosRot->pos, &rwData->unk_00) >= 10.0f) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_A) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_B) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_CUP) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_CDOWN) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_CLEFT) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_CRIGHT) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_Z) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_L) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_R) ||
+ (roData->interfaceFlags & UNIQUE0_FLAG_1))) {
+ rwData->unk_3E = 1;
+ }
+ } else {
+ if (rwData->timer > 0) {
+ rwData->timer--;
+ if (rwData->timer == 0) {
+ sCameraInterfaceFlags = CAM_INTERFACE_FLAGS(CAM_LETTERBOX_NONE, CAM_HUD_VISIBILITY_ALL, 0);
+ }
+ } else {
+ rwData->unk_00 = focalActorPosRot->pos;
+ }
+
+ if (!(player->stateFlags1 & PLAYER_STATE1_20000000)) { // TODO: Merge into 1 if-statement
+ if ((rwData->unk_3A != camera->focalActor->world.rot.y) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_A) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_B) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_CUP) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_CDOWN) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_CLEFT) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_CRIGHT) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_Z) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_L) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_R) ||
+ (roData->interfaceFlags & UNIQUE0_FLAG_1)) {
+ rwData->unk_3E = 1;
+ }
+ }
+ }
+ break;
+
+ case 3:
+ sp74 = 1.0f / rwData->timer;
+ sp8C.y -= playerHeight * 0.2f;
+
+ Camera_ScaledStepToCeilVec3f(&sp8C, &camera->at, sp74, sp74, 0.001f);
+
+ sp84.r = OLib_Vec3fDist(&camera->at, &camera->eye);
+ sp84.pitch = sp7C.pitch;
+ sp84.yaw = sp7C.yaw;
+ sp84.r = Camera_ScaledStepToCeilF(100.0f, sp84.r, sp74, 1.0f);
+
+ OLib_AddVecGeoToVec3f(&sp8C, &camera->at, &sp84);
+
+ sp74 = (QREG(64) * 0.01f) + 0.2f;
+
+ Camera_ScaledStepToCeilVec3f(&sp8C, &camera->eye, sp74, sp74, 0.001f);
+
+ rwData->timer--;
+ if (rwData->timer == 0) {
+ rwData->unk_3E = 9;
+ }
+ break;
+ }
+
+ if ((rwData->unk_3E == 1) || (rwData->unk_3E == 2) || (rwData->unk_3E == 9)) {
+ camera->dist = OLib_Vec3fDist(&camera->at, &camera->eye);
+ camera->atLerpStepScale = Camera_ClampLerpScale(camera, 1.0f);
+
+ Camera_SetFocalActorAtOffset(camera, &focalActorPosRot->pos);
+
+ camera->atLerpStepScale = 0.0f;
+
+ Camera_ChangeSettingFlags(camera, camera->prevSetting, CAM_CHANGE_SETTING_1);
+ Camera_SetStateFlag(camera, CAM_STATE_2);
+
+ camera->yawUpdateRateInv = 1200.0f;
+ camera->pitchUpdateRateInv = 1200.0f;
+ camera->yOffsetUpdateRate = 0.001f;
+ camera->xzOffsetUpdateRate = 0.001f;
+ camera->fovUpdateRate = 0.01f;
+ }
+
+ return true;
+}
+
+/**
+ * Does the minimal amount of camera update.
+ * Allows for manual control of camera parameters without interference from update
+ */
+s32 Camera_Unique6(Camera* camera) {
+ f32 focalActorHeight;
+ CameraModeValue* values;
+ Vec3f playerPosDisp;
+ PosRot* focalActorPosRot = &camera->focalActorPosRot;
+ Unique6ReadOnlyData* roData = &camera->paramData.uniq6.roData;
+
+ if (RELOAD_PARAMS(camera)) {
+ values = sCameraSettings[camera->setting].cameraModes[camera->mode].values;
+ roData->interfaceFlags = GET_NEXT_RO_DATA(values);
+ }
+
+ sCameraInterfaceFlags = roData->interfaceFlags;
+
+ if (camera->animState == 0) {
+ camera->animState++;
+ Camera_SetUpdateRatesFastPitch(camera);
+ }
+
+ if (camera->focalActor != NULL) {
+ focalActorHeight = Camera_GetFocalActorHeight(camera);
+ playerPosDisp = focalActorPosRot->pos;
+ playerPosDisp.y += focalActorHeight;
+ camera->dist = OLib_Vec3fDist(&playerPosDisp, &camera->eye);
+ Camera_SetFocalActorAtOffset(camera, &focalActorPosRot->pos);
+ } else {
+ camera->dist = OLib_Vec3fDist(&camera->at, &camera->eye);
+ }
+
+ if (roData->interfaceFlags & UNIQUE6_FLAG_0) {
+ if (camera->timer > 0) {
+ camera->timer--;
+ }
+ }
+
+ return true;
+}
+
+/**
+ * Used by the unused PREREND_PIVOT Camera Setting. Remnant of OoT
+ */
+s32 Camera_Unique7(Camera* camera) {
+ return Camera_Noop(camera);
+}
+
+s32 Camera_Unique8(Camera* camera) {
+ return Camera_Noop(camera);
+}
+
+s32 Camera_Unique9(Camera* camera) {
+ return Camera_Noop(camera);
+}
+
+/**
+ * Used by unknown settings DEMO0 and ATTENTION
+ */
+s32 Camera_Demo1(Camera* camera) {
+ Vec3f* eye = &camera->eye;
+ Vec3f* at = &camera->at;
+ Vec3f* eyeNext = &camera->eyeNext;
+ PosRot* targetPosRot = &camera->targetPosRot;
+ f32 temp_f0;
+ Actor* sp98[1];
+ s16 screenX;
+ s16 screenY;
+ s32 phi_v0;
+ VecGeo sp88;
+ PosRot sp74;
+ PosRot targetHead;
+ Demo1ReadOnlyData* roData = &camera->paramData.demo1.roData;
+ Demo1ReadWriteData* rwData = &camera->paramData.demo1.rwData;
+ s32 pad;
+
+ if (camera->animState == 0) {
+ CameraModeValue* values = sCameraSettings[camera->setting].cameraModes[camera->mode].values;
+
+ roData->interfaceFlags = GET_NEXT_RO_DATA(values);
+ }
+
+ if (camera->animState == 0) {
+ rwData->unk_1C = 0;
+ OLib_Vec3fDiffToVecGeo(&rwData->unk_0C, &camera->targetPosRot.pos, eye);
+ OLib_Vec3fDiffToVecGeo(&rwData->unk_14, &camera->at, eye);
+ Actor_GetFocus(&targetHead, camera->target);
+ Actor_GetWorld(&sp74, camera->target);
+ camera->targetPosRot.pos.x = (sp74.pos.x + targetHead.pos.x) * 0.5f;
+ camera->targetPosRot.pos.y = (sp74.pos.y + targetHead.pos.y) * 0.5f;
+ camera->targetPosRot.pos.z = (sp74.pos.z + targetHead.pos.z) * 0.5f;
+ camera->targetPosRot.rot = targetHead.rot;
+ camera->animState++;
+ }
+
+ Actor_GetScreenPos(camera->play, camera->target, &screenX, &screenY);
+
+ temp_f0 = rwData->unk_0C.r;
+ if ((screenX > 20) && (screenX < (SCREEN_WIDTH - 20)) && (screenY > 40) && (screenY < (SCREEN_HEIGHT - 40))) {
+ if (temp_f0 < 700.0f) {
+ phi_v0 = 0;
+ } else {
+ phi_v0 = 1;
+ }
+ } else if (temp_f0 < 50.0f) {
+ phi_v0 = 2;
+ } else if (temp_f0 < 300.0f) {
+ phi_v0 = 3;
+ } else if (temp_f0 < 700.0f) {
+ phi_v0 = 4;
+ } else {
+ phi_v0 = 5;
+ }
+
+ if (camera->target->category == ACTORCAT_DOOR) {
+ if ((phi_v0 > 0) && (phi_v0 < 5)) {
+ phi_v0 = 6;
+ } else if (phi_v0 >= 5) {
+ phi_v0 = 7;
+ }
+ }
+
+ if (camera->target->category == ACTORCAT_CHEST) {
+ if ((phi_v0 > 1) && (phi_v0 < 5)) {
+ phi_v0 = 8;
+ }
+ }
+
+ switch (phi_v0) {
+ Vec3f sp44;
+
+ case 1:
+ Camera_ScaledStepToCeilVec3f(&camera->targetPosRot.pos, at, 0.1f, 0.1f, 0.1f);
+ OLib_Vec3fDiffToVecGeo(&sp88, at, eye);
+ sp88.r = rwData->unk_0C.r;
+ OLib_AddVecGeoToVec3f(eyeNext, at, &sp88);
+ *eye = *eyeNext;
+ Camera_BgCheck(camera, at, eye);
+ break;
+
+ case 2:
+ Camera_ScaledStepToCeilVec3f(&camera->targetPosRot.pos, &camera->at, 0.1f, 0.1f, 0.1f);
+ break;
+
+ case 3:
+ eyeNext = &targetPosRot->pos;
+ if (rwData->unk_1C == 0) {
+ sp98[0] = camera->target;
+ func_800CC260(camera, &rwData->unk_00, &targetPosRot->pos, &rwData->unk_14, sp98, 1);
+ }
+ Camera_ScaledStepToCeilVec3f(eyeNext, at, 0.1f, 0.1f, 0.1f);
+ eyeNext = &camera->eyeNext;
+ Camera_ScaledStepToCeilVec3f(&rwData->unk_00, eyeNext, 0.1f, 0.1f, 0.1f);
+ *eye = *eyeNext;
+ Camera_BgCheck(camera, at, eye);
+ break;
+
+ case 4:
+ if (rwData->unk_1C == 0) {
+ sp98[0] = camera->target;
+ rwData->unk_14.r = rwData->unk_0C.r;
+ func_800CC260(camera, &rwData->unk_00, &targetPosRot->pos, &rwData->unk_14, sp98, 1);
+ }
+ Camera_ScaledStepToCeilVec3f(&targetPosRot->pos, at, 0.1f, 0.1f, 0.1f);
+ Camera_ScaledStepToCeilVec3f(&rwData->unk_00, eyeNext, 0.1f, 0.1f, 0.1f);
+ *eye = *eyeNext;
+ Camera_BgCheck(camera, at, eye);
+ break;
+
+ case 5:
+ eyeNext = &targetPosRot->pos;
+ if (rwData->unk_1C == 0) {
+ sp98[0] = camera->target;
+ func_800CC260(camera, &rwData->unk_00, &targetPosRot->pos, &rwData->unk_0C, sp98, 1);
+ }
+ *at = *eyeNext;
+ sp44 = rwData->unk_00;
+ camera->eyeNext = sp44;
+ *eye = sp44;
+ break;
+
+ case 6:
+ if (rwData->unk_1C == 0) {
+ rwData->unk_0C.yaw = camera->target->shape.rot.y;
+ sp98[0] = camera->target;
+ rwData->unk_0C.r = rwData->unk_14.r;
+ func_800CC260(camera, &rwData->unk_00, &targetPosRot->pos, &rwData->unk_0C, sp98, 1);
+ }
+ Camera_ScaledStepToCeilVec3f(&targetPosRot->pos, at, 0.1f, 0.1f, 0.1f);
+ Camera_ScaledStepToCeilVec3f(&rwData->unk_00, eyeNext, 0.1f, 0.1f, 0.1f);
+ *eye = *eyeNext;
+ Camera_BgCheck(camera, at, eye);
+ break;
+
+ case 7:
+ if (rwData->unk_1C == 0) {
+ rwData->unk_0C.yaw = camera->target->shape.rot.y;
+ sp98[0] = camera->target;
+ func_800CC260(camera, &rwData->unk_00, &targetPosRot->pos, &rwData->unk_0C, sp98, 1);
+ }
+ *at = targetPosRot->pos;
+ sp44 = rwData->unk_00;
+ camera->eyeNext = sp44;
+ *eye = sp44;
+ break;
+
+ case 8:
+ if (rwData->unk_1C == 0) {
+ rwData->unk_0C.yaw = camera->target->shape.rot.y;
+ sp98[0] = camera->target;
+ func_800CC260(camera, &rwData->unk_00, &targetPosRot->pos, &rwData->unk_0C, sp98, 1);
+ }
+ Camera_ScaledStepToCeilVec3f(&targetPosRot->pos, at, 0.1f, 0.1f, 0.1f);
+ Camera_ScaledStepToCeilVec3f(&rwData->unk_00, eyeNext, 0.1f, 0.1f, 0.1f);
+ *eye = *eyeNext;
+ Camera_BgCheck(camera, at, eye);
+ break;
+ }
+
+ rwData->unk_1C++;
+
+ return true;
+}
// Data for opening chests (default)
-VecSph D_801B9E64[] = {
+VecGeo D_801B9E64[] = {
{ 50.0f, 0xEE3A, 0xD558 },
{ 75.0f, 0x0000, 0x8008 },
{ 80.0f, 0xEE3A, 0x8008 },
@@ -713,7 +5960,7 @@ Vec3f D_801B9E84[] = {
};
// Data for opening chests (goron)
-VecSph D_801B9EB4[] = {
+VecGeo D_801B9EB4[] = {
{ 60.0f, 0xEE3A, 0xD558 },
{ 95.0f, 0x0000, 0x8008 },
{ 90.0f, 0xEE3A, 0x8008 },
@@ -726,140 +5973,2308 @@ Vec3f D_801B9ED4[] = {
{ 0.0f, 3.0f, -3.0f },
};
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Demo2.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Demo3.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Demo4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Demo5.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Demo6.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Demo7.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Demo8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Demo9.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Demo0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Special0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Special1.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Special2.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Special3.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Special4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Special5.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Special6.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Special7.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Special8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Special9.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Alloc.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Free.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Init.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800DDFE0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800DE0E0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_InitPlayerSettings.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ChangeStatus.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800DE324.s")
-
-s16 sEarthquakeFreq[] = {
- 0xFFC, // 1 Large Earthquake between CLOCK_TIME(0, 00) to CLOCK_TIME(1, 30)
- 0x7FC, // 2 Large Earthquakes between CLOCK_TIME(1, 30) to CLOCK_TIME(3, 00)
- 0x3FC, // 4 Large Earthquakes between CLOCK_TIME(3, 00) to CLOCK_TIME(4, 30)
- 0x1FC, // 8 Large Earthquakes between CLOCK_TIME(4, 30) to CLOCK_TIME(6, 00)
-};
-s16 sEarthquakeTimer = 0;
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800DE62C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800DE840.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800DE890.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800DE954.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Update.s")
-
-s32 sModeChangeFlags = 0;
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800DF498.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_SetMode.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ChangeMode.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800DF86C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800DF8EC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ChangeSetting.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ChangeDataIdx.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800DFC1C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800DFC40.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_GetInputDirYaw.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_GetCamDir.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_GetCamDirPitch.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_GetCamDirYaw.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_AddQuake.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_SetViewParam.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800DFEF0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800DFF18.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800DFF34.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800DFF44.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_SetFlags.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ClearFlags.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ChangeDoorCam.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Copy.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800E01AC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_GetQuakeOffset.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800E01DC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800E0228.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800E0238.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_SetToTrackActor.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_SetTargetActor.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_GetWaterYPos.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800E0348.s")
+/**
+ * Opening large chests.
+ * The camera position will be at a fixed point, and rotate around at different intervals.
+ * The direction, and initial position is dependent on when the camera was started.
+ */
+s32 Camera_Demo2(Camera* camera) {
+ Vec3f* eye = &camera->eye;
+ Vec3f* at = &camera->at;
+ Vec3f* eyeNext = &camera->eyeNext;
+ PosRot* focalActorPosRot = &camera->focalActorPosRot;
+ VecGeo atToEye;
+ VecGeo eyeOffset;
+ VecGeo atOffset;
+ Vec3f sp7C;
+ Vec3f sp70;
+ Vec3f sp64;
+ f32 sp60;
+ s32 pad;
+ u8 skipUpdateEye = false;
+ f32 playerHeight = Player_GetHeight((Player*)camera->focalActor);
+ s16 angle;
+ VecGeo* sp4C = D_801B9E64;
+ Vec3f* sp48 = D_801B9E84;
+ Actor* focalActor = camera->focalActor;
+ Demo2ReadOnlyData* roData = &camera->paramData.demo2.roData;
+ Demo2ReadWriteData* rwData = &camera->paramData.demo2.rwData;
+
+ if (((focalActor == &GET_PLAYER(camera->play)->actor) &&
+ (((Player*)focalActor)->transformation == PLAYER_FORM_GORON))) {
+ sp4C = D_801B9EB4;
+ sp48 = D_801B9ED4;
+ }
+
+ Camera_UnsetStateFlag(camera, CAM_STATE_4);
+
+ if (RELOAD_PARAMS(camera)) {
+ CameraModeValue* values = sCameraSettings[camera->setting].cameraModes[camera->mode].values;
+
+ roData->fov = GET_NEXT_RO_DATA(values);
+ roData->unk_04 = GET_NEXT_RO_DATA(values);
+ roData->interfaceFlags = GET_NEXT_RO_DATA(values);
+ }
+
+ OLib_Vec3fDiffToVecGeo(&atToEye, at, eye);
+
+ sCameraInterfaceFlags = roData->interfaceFlags;
+
+ switch (camera->animState) {
+ case 0:
+ Camera_UnsetStateFlag(camera, CAM_STATE_3 | CAM_STATE_2);
+ Camera_SetUpdateRatesSlow(camera);
+ camera->fov = roData->fov;
+ camera->roll = rwData->animFrame = 0;
+ rwData->initialAt = focalActorPosRot->pos;
+ if (camera->focalActorFloorHeight != BGCHECK_Y_MIN) {
+ rwData->initialAt.y = camera->focalActorFloorHeight;
+ }
+ angle = focalActorPosRot->rot.y;
+ sp70.x = rwData->initialAt.x + (Math_SinS(angle) * 40.0f);
+ sp70.y = rwData->initialAt.y + 40.0f;
+ sp70.z = rwData->initialAt.z + (Math_CosS(angle) * 40.0f);
+ if (camera->play->state.frames & 2) {
+ angle -= 0x4000;
+ rwData->yawDir = 1;
+ } else {
+ angle += 0x4000;
+ rwData->yawDir = -1;
+ }
+
+ sp7C.x = sp70.x + (sp4C[1].r * Math_SinS(angle));
+ sp7C.y = rwData->initialAt.y + 5.0f;
+ sp7C.z = sp70.z + (sp4C[1].r * Math_CosS(angle));
+ if (Camera_BgCheck(camera, &sp70, &sp7C)) {
+ rwData->yawDir = -rwData->yawDir;
+ }
+
+ OLib_Vec3fToVecGeo(&atOffset, &sp48[0]);
+ atOffset.yaw += focalActorPosRot->rot.y;
+ OLib_AddVecGeoToVec3f(at, &rwData->initialAt, &atOffset);
+
+ eyeOffset.r = sp4C[0].r;
+ eyeOffset.pitch = sp4C[0].pitch;
+ eyeOffset.yaw = (sp4C[0].yaw * rwData->yawDir) + focalActorPosRot->rot.y;
+
+ rwData->unk_0C = 1.0f;
+ break;
+
+ case 1:
+ // This is the case taken for nearly the entire cutscene
+ sp60 = (rwData->animFrame - 2) * (1.0f / 146.0f);
+
+ VEC3F_LERPIMPDST(&sp64, &sp48[0], &sp48[1], sp60);
+
+ OLib_Vec3fToVecGeo(&atOffset, &sp64);
+ atOffset.yaw = (atOffset.yaw * rwData->yawDir) + focalActorPosRot->rot.y;
+ OLib_AddVecGeoToVec3f(at, &rwData->initialAt, &atOffset);
+
+ atOffset.r = LERPIMP(sp4C[0].r, sp4C[1].r, sp60);
+ atOffset.pitch = BINANG_LERPIMP(sp4C[0].pitch, sp4C[1].pitch, sp60);
+ atOffset.yaw = BINANG_LERPIMP(sp4C[0].yaw, sp4C[1].yaw, sp60);
+
+ eyeOffset.r = atOffset.r;
+ eyeOffset.pitch = atOffset.pitch;
+ eyeOffset.yaw = (atOffset.yaw * rwData->yawDir) + focalActorPosRot->rot.y;
+
+ rwData->unk_0C -= (1.0f / 365.0f);
+ break;
+
+ case 2:
+ sp60 = (rwData->animFrame - 148) * 0.1f;
+
+ sp64.x = LERPIMP(sp48[1].x, sp48[2].x, sp60);
+ sp64.y = LERPIMP((sp48[1].y - playerHeight), sp48[2].y, sp60);
+ sp64.y += playerHeight;
+ sp64.z = LERPIMP(sp48[1].z, sp48[2].z, sp60);
+
+ OLib_Vec3fToVecGeo(&atOffset, &sp64);
+ atOffset.yaw = (atOffset.yaw * rwData->yawDir) + focalActorPosRot->rot.y;
+ OLib_AddVecGeoToVec3f(at, &rwData->initialAt, &atOffset);
+
+ atOffset.r = LERPIMP(sp4C[1].r, sp4C[2].r, sp60);
+ atOffset.pitch = BINANG_LERPIMP(sp4C[1].pitch, sp4C[2].pitch, sp60);
+ atOffset.yaw = BINANG_LERPIMP(sp4C[1].yaw, sp4C[2].yaw, sp60);
+
+ eyeOffset.r = atOffset.r;
+ eyeOffset.pitch = atOffset.pitch;
+ eyeOffset.yaw = (atOffset.yaw * rwData->yawDir) + focalActorPosRot->rot.y;
+
+ rwData->unk_0C -= 0.04f;
+ break;
+
+ case 3:
+ sp60 = (rwData->animFrame - 159) * (1.0f / 9.0f);
+
+ sp64.x = LERPIMP(sp48[2].x, sp48[3].x, sp60);
+ sp64.y = LERPIMP(sp48[2].y, sp48[3].y, sp60);
+ sp64.y += playerHeight;
+ sp64.z = LERPIMP(sp48[2].z, sp48[3].z, sp60);
+
+ OLib_Vec3fToVecGeo(&atOffset, &sp64);
+ atOffset.yaw = (atOffset.yaw * rwData->yawDir) + focalActorPosRot->rot.y;
+ OLib_AddVecGeoToVec3f(at, &rwData->initialAt, &atOffset);
+
+ atOffset.r = LERPIMP(sp4C[2].r, sp4C[3].r, sp60);
+ atOffset.pitch = BINANG_LERPIMP(sp4C[2].pitch, sp4C[3].pitch, sp60);
+ atOffset.yaw = BINANG_LERPIMP(sp4C[2].yaw, sp4C[3].yaw, sp60);
+
+ eyeOffset.r = atOffset.r;
+ eyeOffset.pitch = atOffset.pitch;
+ eyeOffset.yaw = (atOffset.yaw * rwData->yawDir) + focalActorPosRot->rot.y;
+
+ rwData->unk_0C += (4.0f / 45.0f);
+ break;
+
+ case 30:
+ Camera_SetStateFlag(camera, CAM_STATE_10);
+ if (camera->stateFlags & CAM_STATE_3) {
+ camera->animState = 4;
+ }
+ // fallthrough
+ case 10:
+ case 20:
+ // Taken on the 1st and 158th animation frame
+ skipUpdateEye = true;
+ break;
+ case 4:
+ eyeOffset.r = 80.0f;
+ eyeOffset.pitch = 0;
+ eyeOffset.yaw = atToEye.yaw;
+ rwData->unk_0C = 0.1f;
+ sCameraInterfaceFlags = CAM_INTERFACE_FLAGS(CAM_LETTERBOX_LARGE, CAM_HUD_VISIBILITY_A, 0);
+
+ if (!(((rwData->animFrame < 0) || (camera->xzSpeed > 0.001f) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_A) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_B) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_CUP) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_CDOWN) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_CLEFT) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_CRIGHT) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_Z) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_L) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_R)) &&
+ (camera->stateFlags & CAM_STATE_3))) {
+ goto skipeyeUpdate;
+ }
+ // fallthrough
+ default:
+ Camera_SetStateFlag(camera, CAM_STATE_4 | CAM_STATE_2);
+ Camera_UnsetStateFlag(camera, CAM_STATE_3);
+ func_800CC938(camera);
+ sCameraInterfaceFlags = CAM_INTERFACE_FLAGS(CAM_LETTERBOX_NONE, CAM_HUD_VISIBILITY_ALL, 0);
+ skipeyeUpdate:
+ skipUpdateEye = true;
+ break;
+ }
+
+ rwData->animFrame++;
+
+ /**
+ * Opening a large chest only lasts 135 frames
+ *
+ * So for one frame, the animState is set to 10,
+ * allowing the static data to be loaded into the subCamera mini-heap
+ *
+ * For the remainder of the cutscene, animState is set to 1
+ */
+ if (rwData->animFrame == 1) {
+ camera->animState = 10;
+ } else if (rwData->animFrame == 2) {
+ camera->animState = 1;
+ } else if (rwData->animFrame == 148) {
+ camera->animState = 2;
+ } else if (rwData->animFrame == 158) {
+ camera->animState = 20;
+ } else if (rwData->animFrame == 159) {
+ camera->animState = 3;
+ } else if (rwData->animFrame == 168) {
+ camera->animState = 30;
+ } else if (rwData->animFrame == 228) {
+ camera->animState = 4;
+ }
+
+ if (!skipUpdateEye) {
+ eyeOffset.r = Camera_ScaledStepToCeilF(eyeOffset.r, atToEye.r, rwData->unk_0C, 1.0f);
+ eyeOffset.pitch = Camera_ScaledStepToCeilS(eyeOffset.pitch, atToEye.pitch, rwData->unk_0C, 5);
+ eyeOffset.yaw = Camera_ScaledStepToCeilS(eyeOffset.yaw, atToEye.yaw, rwData->unk_0C, 5);
+ OLib_AddVecGeoToVec3f(eyeNext, at, &eyeOffset);
+ *eye = *eyeNext;
+ }
+
+ camera->dist = OLib_Vec3fDist(at, eye);
+ camera->atLerpStepScale = 0.1f;
+ Camera_SetFocalActorAtOffset(camera, &focalActorPosRot->pos);
+
+ return true;
+}
+
+/**
+ * Taking the warp pad from the start of a dungeon to the boss-room
+ */
+s32 Camera_Demo3(Camera* camera) {
+ s32 pad2;
+ f32 temp;
+ CameraModeValue* values;
+ VecGeo atToEye;
+ PosRot focalActorFocus;
+ Vec3f* eye = &camera->eye;
+ Vec3f* at = &camera->at;
+ Vec3f* eyeNext = &camera->eyeNext;
+ Demo3ReadOnlyData* roData = &camera->paramData.demo3.roData;
+ Demo3ReadWriteData* rwData = &camera->paramData.demo3.rwData;
+
+ OLib_Vec3fDiffToVecGeo(&atToEye, at, eye);
+ Actor_GetFocus(&focalActorFocus, camera->focalActor);
+ focalActorFocus.pos.x = camera->focalActorPosRot.pos.x;
+ focalActorFocus.pos.z = camera->focalActorPosRot.pos.z;
+ focalActorFocus.pos.y -= (focalActorFocus.pos.y - camera->focalActorPosRot.pos.y) * 0.4f;
+ Camera_ScaledStepToCeilVec3f(&focalActorFocus.pos, at, 0.1f, 0.1f, 0.1f);
+
+ if (RELOAD_PARAMS(camera)) {
+ values = sCameraSettings[camera->setting].cameraModes[camera->mode].values;
+ roData->interfaceFlags = GET_NEXT_RO_DATA(values);
+ camera->animState = 0;
+ }
+
+ sCameraInterfaceFlags = roData->interfaceFlags;
+
+ switch (camera->animState) {
+ case 0:
+ // Init Data
+ camera->animState++;
+ rwData->timer = 125;
+ Distortion_Request(DISTORTION_TYPE_ZORA_SWIMMING);
+ Distortion_SetDuration(60);
+ break;
+
+ case 1:
+ // Zoom into player, start to rise
+ temp = 1.0f / rwData->timer;
+ atToEye.r = Camera_ScaledStepToCeilF(140.0f, atToEye.r, temp, 0.1f);
+ rwData->timer--;
+ camera->fov = Camera_ScaledStepToCeilF(50.0f, camera->fov, 0.1f, 0.1f);
+ if (rwData->timer <= 0) {
+ rwData->timer = 20;
+ camera->animState++;
+ Distortion_Request(DISTORTION_TYPE_UNDERWATER_ENTRY);
+ Distortion_SetDuration(80);
+ }
+ break;
+
+ case 2:
+ // continue rising
+ rwData->timer--;
+ if (rwData->timer <= 0) {
+ rwData->unk_04 = 120;
+ rwData->timer = 0;
+ rwData->unk_00 = (175.0f - camera->fov) / rwData->unk_04;
+ camera->animState++;
+ Distortion_Request(DISTORTION_TYPE_BOSS_WARP);
+ Distortion_SetDuration(15);
+ }
+ break;
+
+ case 3:
+ rwData->timer++;
+ camera->fov += rwData->unk_00 * rwData->timer;
+ if (rwData->timer >= 15) {
+ Distortion_RemoveRequest(DISTORTION_TYPE_BOSS_WARP);
+ Distortion_RemoveRequest(DISTORTION_TYPE_UNDERWATER_ENTRY);
+ Distortion_RemoveRequest(DISTORTION_TYPE_ZORA_SWIMMING);
+ camera->animState++;
+ }
+ break;
+ }
+
+ OLib_AddVecGeoToVec3f(eyeNext, at, &atToEye);
+ *eye = *eyeNext;
+ return true;
+}
+
+/**
+ * Mask Transformation Cutscene 0:
+ * starting as a human and transforming into anything else
+ */
+s32 Camera_Demo4(Camera* camera) {
+ Vec3f* eye = &camera->eye;
+ Vec3f* at = &camera->at;
+ PosRot* focalActorPosRot = &camera->focalActorPosRot;
+ VecGeo atToEye;
+ CameraModeValue* values;
+ PosRot focalActorFocus;
+ f32 sp58;
+ f32 sin;
+ Demo4ReadOnlyData* roData = &camera->paramData.demo4.roData;
+ Demo4ReadWriteData* rwData = &camera->paramData.demo4.rwData;
+ s32 pad[2];
+
+ OLib_Vec3fDiffToVecGeo(&atToEye, at, eye);
+
+ if (RELOAD_PARAMS(camera)) {
+ values = sCameraSettings[camera->setting].cameraModes[camera->mode].values;
+ roData->interfaceFlags = GET_NEXT_RO_DATA(values);
+ camera->animState = 0;
+ rwData->unk_00 = *at;
+ rwData->unk_18 = atToEye;
+ rwData->unk_14 = camera->fov;
+ }
+
+ Actor_GetFocus(&focalActorFocus, camera->focalActor);
+ sCameraInterfaceFlags = roData->interfaceFlags;
+
+ switch (camera->animState) {
+ //! FAKE:
+ if (1) {}
+ case 0:
+ camera->animState++;
+ rwData->timer = 0;
+
+ if (!(atToEye.r < 40.0f)) {
+ atToEye.r = 40.0f;
+ }
+
+ camera->fov = 80.0f;
+ rwData->unk_10 = (Rand_ZeroOne() - 0.5f) * 40.0f;
+ // fallthrough
+ case 1:
+ // Camera fixed on human player as the mask moves from the pocket to the face
+ // Camera rolls left and right
+ if (rwData->timer >= 12) {
+ rwData->unk_0C = (rwData->timer - 12) * 10.384615f;
+ sin = sin_rad(DEG_TO_RAD(rwData->unk_0C));
+ rwData->unk_0C = ((rwData->unk_10 < 0.0f) ? -1.0f : 1.0f) * sin;
+ if (rwData->timer == 12) {
+ Distortion_Request(DISTORTION_TYPE_MASK_TRANSFORM_1);
+ Distortion_SetDuration(26);
+ }
+ } else {
+ rwData->unk_0C = 0.0f;
+ }
+
+ sp58 = rwData->timer * (6.0f / 19.0f);
+ rwData->unk_20 = focalActorPosRot->rot.y + 0x4000;
+ focalActorFocus.pos.x = (Math_SinS(rwData->unk_20) * sp58 * rwData->unk_0C) + focalActorPosRot->pos.x;
+ focalActorFocus.pos.z = (Math_CosS(rwData->unk_20) * sp58 * rwData->unk_0C) + focalActorPosRot->pos.z;
+ focalActorFocus.pos.y -= (focalActorFocus.pos.y - focalActorPosRot->pos.y) * 0.099999994f;
+ Camera_ScaledStepToCeilVec3f(&focalActorFocus.pos, at, 0.2f, 0.2f, 0.1f);
+
+ sp58 = (rwData->timer * (30.0f / 19.0f));
+ camera->roll = CAM_DEG_TO_BINANG(sp58 * rwData->unk_0C);
+
+ sp58 = 1.0f / (38 - rwData->timer);
+ rwData->timer++;
+ atToEye.r = Camera_ScaledStepToCeilF(30.0f, atToEye.r, sp58, 0.1f);
+ atToEye.pitch = 0;
+
+ if (rwData->timer >= 38) {
+ rwData->timer = 24;
+ camera->animState++;
+ rwData->unk_0C = (32.0f - camera->fov) / 24.0f;
+ Distortion_Request(DISTORTION_TYPE_MASK_TRANSFORM_2);
+ }
+ break;
+
+ case 2:
+ // Camera steadies as human player is fully croutched down and hiding face
+ if (rwData->timer == 24) {
+ at->x = (Math_SinS(focalActorPosRot->rot.y) * -7.0f) + focalActorPosRot->pos.x;
+ at->y = focalActorFocus.pos.y - ((focalActorFocus.pos.y - focalActorPosRot->pos.y) * 0.1f);
+ at->z = (Math_CosS(focalActorPosRot->rot.y) * -7.0f) + focalActorPosRot->pos.z;
+ } else {
+ focalActorFocus.pos.x = (Math_SinS(focalActorPosRot->rot.y) * -7.0f) + focalActorPosRot->pos.x;
+ focalActorFocus.pos.y -= (focalActorFocus.pos.y - camera->focalActorPosRot.pos.y) * 0.1f;
+ focalActorFocus.pos.z = (Math_CosS(focalActorPosRot->rot.y) * -7.0f) + focalActorPosRot->pos.z;
+ Camera_ScaledStepToCeilVec3f(&focalActorFocus.pos, at, 0.25f, 0.25f, 0.1f);
+ }
+
+ if (rwData->timer > 0) {
+ camera->fov += rwData->unk_0C;
+ }
+
+ rwData->timer--;
+
+ atToEye.r = 35.0f;
+ atToEye.pitch = 0x2000;
+ camera->roll = Camera_ScaledStepToCeilS(0, camera->roll, 0.1f, 5);
+
+ if (rwData->timer <= 0) {
+ rwData->unk_20 = 630;
+ rwData->timer = 0;
+ rwData->unk_0C = (60.0f - camera->fov) / rwData->unk_20;
+ camera->animState = 3;
+ }
+ break;
+
+ case 3:
+ // Camera zooms into human players face with bulging eyes
+ focalActorFocus.pos.x = focalActorPosRot->pos.x;
+ focalActorFocus.pos.y -= (focalActorFocus.pos.y - camera->focalActorPosRot.pos.y) * 0.1f;
+ focalActorFocus.pos.z = focalActorPosRot->pos.z;
+
+ Camera_ScaledStepToCeilVec3f(&focalActorFocus.pos, at, 0.25f, 0.25f, 0.1f);
+
+ camera->roll = Camera_ScaledStepToCeilS(0, camera->roll, 0.1f, 5);
+ rwData->timer++;
+ camera->fov += rwData->unk_0C * rwData->timer;
+ atToEye.pitch = 0x2000;
+ atToEye.r = 35.0f;
+
+ if (rwData->timer >= 35) {
+ Distortion_RemoveRequest(DISTORTION_TYPE_MASK_TRANSFORM_1);
+ Distortion_RemoveRequest(DISTORTION_TYPE_MASK_TRANSFORM_2);
+ camera->animState = 4;
+ }
+ break;
+
+ case 999:
+ Actor_GetFocus(&focalActorFocus, camera->focalActor);
+ Distortion_RemoveRequest(DISTORTION_TYPE_MASK_TRANSFORM_1);
+ Distortion_RemoveRequest(DISTORTION_TYPE_MASK_TRANSFORM_2);
+ camera->animState = 4;
+ break;
+
+ case 4:
+ // Camera backs up as player is now in a transformed state
+ focalActorFocus.pos.y -= (focalActorFocus.pos.y - camera->focalActorPosRot.pos.y) * 0.1f;
+ Camera_ScaledStepToCeilVec3f(&focalActorFocus.pos, at, 0.1f, 0.1f, 0.1f);
+ atToEye = rwData->unk_18;
+ camera->fov = rwData->unk_14;
+ camera->roll = 0;
+ break;
+ }
+
+ OLib_AddVecGeoToVec3f(&camera->eyeNext, at, &atToEye);
+ *eye = camera->eyeNext;
+
+ return true;
+}
+
+/**
+ * Mask Transformation Cutscene 1:
+ * starting as non-human/fierce diety and transforming into anything else
+ */
+s32 Camera_Demo5(Camera* camera) {
+ Vec3f* eye = &camera->eye;
+ Vec3f* at = &camera->at;
+ Vec3f* eyeNext = &camera->eyeNext;
+ VecGeo atToEye;
+ PosRot* focalActorPosRot = &camera->focalActorPosRot;
+ PosRot focalActorFocus;
+ f32 new_var;
+ f32 sp58;
+ f32 sin;
+ Demo5ReadOnlyData* roData = &camera->paramData.demo5.roData;
+ Demo5ReadWriteData* rwData = &camera->paramData.demo5.rwData;
+ CameraModeValue* values;
+
+ OLib_Vec3fDiffToVecGeo(&atToEye, at, eye);
+
+ if (RELOAD_PARAMS(camera)) {
+ values = sCameraSettings[camera->setting].cameraModes[camera->mode].values;
+ roData->interfaceFlags = GET_NEXT_RO_DATA(values);
+ camera->animState = 0;
+ rwData->unk_00 = *at;
+ rwData->unk_1C = atToEye;
+ rwData->unk_18 = camera->fov;
+ }
+
+ Actor_GetFocus(&focalActorFocus, camera->focalActor);
+
+ sCameraInterfaceFlags = roData->interfaceFlags;
+
+ switch (camera->animState) {
+ case 0:
+ camera->animState++;
+ atToEye.pitch = 0;
+ rwData->timer = 0x12;
+ rwData->unk_14 = 80.0f;
+ atToEye.r = 30.0f;
+ camera->fov = 80.0f;
+ rwData->unk_10 = (Rand_ZeroOne() - 0.5f) * 40.0f;
+ camera->roll = 0;
+ focalActorFocus.pos.x = focalActorPosRot->pos.x;
+ focalActorFocus.pos.z = focalActorPosRot->pos.z;
+ *at = focalActorFocus.pos;
+ // fallthrough
+ case 1:
+ // Camera remains still as player moves hands to face
+ rwData->timer--;
+ if (rwData->timer <= 0) {
+ rwData->timer = 0;
+ camera->animState = 2;
+ rwData->unk_24 = camera->focalActorPosRot.rot.y + 0x4000;
+ rwData->timer = 46;
+ Distortion_Request(DISTORTION_TYPE_MASK_TRANSFORM_1);
+ Distortion_SetDuration(46);
+ }
+ break;
+
+ case 2:
+ // Camera zooms out while rolling back and forth
+ rwData->unk_0C = rwData->timer * (180.0f / 23.0f);
+ sp58 = DEG_TO_RAD(rwData->unk_0C);
+ sin = sin_rad(sp58);
+ rwData->unk_0C = ((rwData->unk_10 < 0.0f) ? -1.0f : 1.0f) * sin;
+ new_var = (46 - rwData->timer) * (5.0f / 46.0f);
+ focalActorFocus.pos.x = (Math_SinS(rwData->unk_24) * new_var * rwData->unk_0C) + focalActorPosRot->pos.x;
+ focalActorFocus.pos.z = (Math_CosS(rwData->unk_24) * new_var * rwData->unk_0C) + focalActorPosRot->pos.z;
+ focalActorFocus.pos.y -= (focalActorFocus.pos.y - camera->focalActorPosRot.pos.y) * 0.2f;
+ Camera_ScaledStepToCeilVec3f(&focalActorFocus.pos, at, 0.1f, 0.1f, 0.1f);
+ new_var = rwData->timer * (10.0f / 23.0f);
+ camera->roll = CAM_DEG_TO_BINANG(rwData->unk_0C * new_var);
+ new_var = 1.0f / rwData->timer;
+ atToEye.r = Camera_ScaledStepToCeilF(rwData->unk_14, atToEye.r, new_var, 0.1f);
+ rwData->timer--;
+ atToEye.pitch = 0;
+ if (rwData->timer <= 0) {
+ camera->animState = 3;
+ Distortion_RemoveRequest(DISTORTION_TYPE_MASK_TRANSFORM_1);
+ }
+ break;
+
+ case 999:
+ Actor_GetFocus(&focalActorFocus, camera->focalActor);
+ camera->animState = 3;
+ Distortion_RemoveRequest(DISTORTION_TYPE_MASK_TRANSFORM_1);
+ break;
+
+ case 3:
+ // Player is in new form
+ focalActorFocus.pos.y -= (focalActorFocus.pos.y - camera->focalActorPosRot.pos.y) * 0.1f;
+ Camera_ScaledStepToCeilVec3f(&focalActorFocus.pos, at, 0.1f, 0.1f, 0.1f);
+ camera->roll = 0;
+ atToEye = rwData->unk_1C;
+ camera->fov = rwData->unk_18;
+ break;
+ }
+
+ OLib_AddVecGeoToVec3f(eyeNext, at, &atToEye);
+ *eye = *eyeNext;
+
+ return true;
+}
+
+s32 Camera_Demo6(Camera* camera) {
+ return Camera_Noop(camera);
+}
+
+s32 Camera_Demo7(Camera* camera) {
+ return Camera_Noop(camera);
+}
+
+s32 Camera_Demo8(Camera* camera) {
+ return Camera_Noop(camera);
+}
+
+s32 Camera_Demo9(Camera* camera) {
+ return Camera_Noop(camera);
+}
+
+/**
+ * Smoothly and gradually return camera to Player after a cutscene
+ * Used for global actorCsId = 0x7E (Connect Camera Setting)
+ */
+s32 Camera_Demo0(Camera* camera) {
+ s32 pad;
+ f32 timer;
+ s16 phi_v1;
+ Camera* subCam = &camera->play->subCameras[2];
+ Vec3f* eye = &camera->eye;
+ Vec3f* subEye = &subCam->eye;
+ Vec3f* at = &camera->at;
+ Demo0ReadOnlyData* roData = &camera->paramData.demo0.roData;
+ Demo0ReadWriteData* rwData = &camera->paramData.demo0.rwData;
+
+ // Initialize
+ if (camera->animState == 0) {
+ CameraModeValue* values = sCameraSettings[camera->setting].cameraModes[camera->mode].values;
+
+ roData->interfaceFlags = GET_NEXT_RO_DATA(values);
+ }
+
+ // Initialize
+ if (camera->animState == 0) {
+ OLib_Vec3fDiffToVecGeo(&rwData->subAtToEye, &subCam->at, subEye);
+ OLib_Vec3fDiffToVecGeo(&rwData->atToEye, &camera->at, eye);
+ if (rwData->subAtToEye.r < 50.0f) {
+ rwData->subAtToEye.r = 50.0f;
+ if (rwData->subAtToEye.pitch < 0x7D0) { // 11 degrees
+ rwData->subAtToEye.pitch = 0x7D0;
+ }
+ }
+
+ rwData->unk_00 = OLib_Vec3fDist(eye, subEye);
+ if (rwData->unk_00 < 300.0f) {
+ rwData->timer = 0;
+ } else {
+ rwData->timer = sqrtf(rwData->unk_00 - 200.0f);
+ }
+
+ rwData->unk_14 = subCam->inputDir.x - camera->inputDir.x;
+ if (rwData->unk_14 >= 0) {
+ phi_v1 = rwData->unk_14;
+ } else {
+ phi_v1 = -rwData->unk_14;
+ }
+
+ if (phi_v1 > 10000) {
+ phi_v1 /= 1000;
+ if (rwData->timer < phi_v1) {
+ rwData->timer = phi_v1;
+ }
+ }
+
+ rwData->unk_16 = subCam->inputDir.y - camera->inputDir.y;
+ if (rwData->unk_16 >= 0) {
+ phi_v1 = rwData->unk_16;
+ } else {
+ phi_v1 = -rwData->unk_16;
+ }
+
+ if (phi_v1 > 10000) {
+ phi_v1 /= 1000;
+ if (rwData->timer < phi_v1) {
+ rwData->timer = phi_v1;
+ }
+ }
+
+ rwData->unk_18 = subCam->inputDir.z - camera->inputDir.z;
+ if (rwData->unk_18 >= 0) {
+ phi_v1 = rwData->unk_18;
+ } else {
+ phi_v1 = -rwData->unk_18;
+ }
+
+ if (phi_v1 > 10000) {
+ phi_v1 /= 1000;
+ if (rwData->timer < phi_v1) {
+ rwData->timer = phi_v1;
+ }
+ }
+
+ if (rwData->timer != 0) {
+ rwData->unk_00 = (rwData->subAtToEye.r - rwData->atToEye.r) / rwData->timer;
+ rwData->unk_14 = (s16)(rwData->subAtToEye.pitch - rwData->atToEye.pitch) / rwData->timer;
+ rwData->unk_16 = (s16)(rwData->subAtToEye.yaw - rwData->atToEye.yaw) / rwData->timer;
+ rwData->unk_18 = (s16)(subCam->roll - camera->roll) / rwData->timer;
+ }
+ camera->animState++;
+ }
+
+ if (rwData->timer != 0) {
+ timer = rwData->timer;
+
+ // Update At (Inverse Interpolation)
+ at->x += (subCam->at.x - camera->at.x) / timer;
+ at->y += (subCam->at.y - camera->at.y) / timer;
+ at->z += (subCam->at.z - camera->at.z) / timer;
+
+ rwData->atToEye.r += rwData->unk_00;
+ rwData->atToEye.pitch += rwData->unk_14;
+ rwData->atToEye.yaw += rwData->unk_16;
+
+ camera->roll += rwData->unk_18;
+
+ // Update Eye
+ OLib_AddVecGeoToVec3f(eye, at, &rwData->atToEye);
+ camera->eyeNext = *eye;
+
+ rwData->timer--;
+ }
+
+ if (rwData->timer == 0) {
+ CutsceneManager_Stop(0x7E);
+ }
+
+ return true;
+}
+
+s32 Camera_Special0(Camera* camera) {
+ return Camera_Noop(camera);
+}
+
+s32 Camera_Special1(Camera* camera) {
+ return Camera_Noop(camera);
+}
+
+s32 Camera_Special2(Camera* camera) {
+ return Camera_Noop(camera);
+}
+
+s32 Camera_Special3(Camera* camera) {
+ return Camera_Noop(camera);
+}
+
+s32 Camera_Special4(Camera* camera) {
+ return Camera_Noop(camera);
+}
+
+/**
+ * Flying with hookshot
+ */
+s32 Camera_Special5(Camera* camera) {
+ Vec3f* eye = &camera->eye;
+ Vec3f* at = &camera->at;
+ Vec3f* eyeNext = &camera->eyeNext;
+ PosRot spA8;
+ s16 pad1;
+ s16 spA4;
+ CameraCollision sp7C;
+ VecGeo sp74;
+ VecGeo sp6C;
+ VecGeo atToEye;
+ VecGeo atToEyeNext;
+ PosRot* focalActorPosRot = &camera->focalActorPosRot;
+ Special5ReadOnlyData* roData = &camera->paramData.spec5.roData;
+ Special5ReadWriteData* rwData = &camera->paramData.spec5.rwData;
+ f32 rand;
+ f32 focalActorHeight = Camera_GetFocalActorHeight(camera);
+
+ if (RELOAD_PARAMS(camera)) {
+ CameraModeValue* values = sCameraSettings[camera->setting].cameraModes[camera->mode].values;
+ f32 yNormal = (0.8f - ((68.0f / focalActorHeight) * -0.2f));
+
+ roData->yOffset = (GET_NEXT_SCALED_RO_DATA(values) * focalActorHeight) * yNormal;
+ roData->eyeDist = GET_NEXT_RO_DATA(values);
+ roData->minDistForRot = GET_NEXT_RO_DATA(values);
+ roData->pitch = CAM_DEG_TO_BINANG(GET_NEXT_RO_DATA(values));
+ roData->fovTarget = GET_NEXT_RO_DATA(values);
+ roData->atMaxLERPScale = GET_NEXT_SCALED_RO_DATA(values);
+ roData->timerInit = GET_NEXT_RO_DATA(values);
+ roData->interfaceFlags = GET_NEXT_RO_DATA(values);
+ }
+
+ OLib_Vec3fDiffToVecGeo(&atToEye, at, eye);
+ OLib_Vec3fDiffToVecGeo(&atToEyeNext, at, eyeNext);
+ Actor_GetWorld(&spA8, camera->target);
+
+ sCameraInterfaceFlags = roData->interfaceFlags;
+
+ if (camera->animState == 0) {
+ camera->animState++;
+ rwData->animTimer = roData->timerInit;
+ }
+
+ if (rwData->animTimer > 0) {
+ rwData->animTimer--;
+ } else if (rwData->animTimer == 0) {
+ if ((camera->target == NULL) || (camera->target->update == NULL)) {
+ camera->target = NULL;
+ return true;
+ }
+
+ rwData->animTimer--;
+ if (roData->minDistForRot < OLib_Vec3fDist(&spA8.pos, &focalActorPosRot->pos)) {
+ sp6C.yaw = focalActorPosRot->rot.y;
+ sp6C.pitch = -focalActorPosRot->rot.x;
+ sp6C.r = 20.0f;
+ OLib_AddVecGeoToVec3f(&sp7C.pos, &spA8.pos, &sp6C);
+ func_800CBC84(camera, at, &sp7C, 0);
+ OLib_Vec3fToVecGeo(&sp6C, &sp7C.norm);
+ spA4 = BINANG_SUB(focalActorPosRot->rot.y, sp6C.yaw);
+ sp74.r = roData->eyeDist;
+ rand = Rand_ZeroOne();
+ sp74.yaw = BINANG_ROT180(focalActorPosRot->rot.y) +
+ (s16)(spA4 < 0 ? -(s16)(0x1553 + (s16)(rand * 2730.0f)) : (s16)(0x1553 + (s16)(rand * 2730.0f)));
+ sp74.pitch = roData->pitch;
+ OLib_AddVecGeoToVec3f(eyeNext, &spA8.pos, &sp74);
+ *eye = *eyeNext;
+ Camera_BgCheck(camera, &spA8.pos, eye);
+ }
+ }
+
+ Camera_CalcAtDefault(camera, &atToEyeNext, roData->yOffset, 0);
+ camera->fov = Camera_ScaledStepToCeilF(roData->fovTarget, camera->fov, camera->atLerpStepScale * 0.05f, 0.1f);
+ camera->roll = Camera_ScaledStepToCeilS(0, camera->roll, 0.5f, 5);
+ camera->atLerpStepScale = Camera_ClampLerpScale(camera, roData->atMaxLERPScale);
+
+ return true;
+}
+
+s32 Camera_Special6(Camera* camera) {
+ return Camera_Noop(camera);
+}
+
+s32 Camera_Special7(Camera* camera) {
+ return Camera_Noop(camera);
+}
+
+/**
+ * Exiting a spiral staircase cutscene.
+ * Camera remains fixed at given position, and tracks player for the duration of the cutscene
+ */
+s32 Camera_Special8(Camera* camera) {
+ Vec3f* at = &camera->at;
+ Vec3f* eyeNext = &camera->eyeNext;
+ PosRot* focalActorPosRot = &camera->focalActorPosRot;
+ Vec3f atTarget;
+ Vec3f posOffsetTarget;
+ f32 yNormal;
+ f32 focalActorHeight = Camera_GetFocalActorHeight(camera);
+ DoorParams* doorParams = &camera->paramData.doorParams;
+ Special8ReadOnlyData* roData = &camera->paramData.spec8.roData;
+ Special8ReadWriteData* rwData = &camera->paramData.spec8.rwData;
+ s32 pad[2];
+
+ Camera_UnsetStateFlag(camera, CAM_STATE_4);
+ yNormal = (0.8f - ((68.0f / focalActorHeight) * -0.2f));
+
+ if (!RELOAD_PARAMS(camera)) {
+ } else {
+ CameraModeValue* values = sCameraSettings[camera->setting].cameraModes[camera->mode].values;
+
+ // Initialize data
+ roData->yOffset = GET_NEXT_SCALED_RO_DATA(values) * focalActorHeight * yNormal;
+ roData->eyeStepScale = GET_NEXT_SCALED_RO_DATA(values);
+ roData->posStepScale = GET_NEXT_SCALED_RO_DATA(values);
+ roData->fov = GET_NEXT_RO_DATA(values);
+ roData->spiralDoorCsLength = GET_NEXT_RO_DATA(values) * 5;
+ roData->interfaceFlags = GET_NEXT_RO_DATA(values);
+ rwData->fov = roData->fov * 100.0f;
+ rwData->spiralDoorCsFrame = 0;
+ Camera_UnsetStateFlag(camera, CAM_STATE_2 | CAM_STATE_CHECK_WATER);
+ rwData->eye.x = doorParams->eye.x;
+ rwData->eye.y = doorParams->eye.y;
+ rwData->eye.z = doorParams->eye.z;
+ }
+
+ // Check if cutscene is still playing
+ if (rwData->spiralDoorCsFrame < roData->spiralDoorCsLength) {
+ rwData->spiralDoorCsFrame++;
+ sCameraInterfaceFlags = roData->interfaceFlags;
+ posOffsetTarget.x = 0.0f;
+ posOffsetTarget.y = roData->yOffset + focalActorHeight;
+ posOffsetTarget.z = 0.0f;
+ Camera_ScaledStepToCeilVec3f(&posOffsetTarget, &camera->focalActorAtOffset, roData->posStepScale,
+ roData->posStepScale, 0.1f);
+
+ // Camera follows player as they exit the stairwell
+ atTarget.x = focalActorPosRot->pos.x + camera->focalActorAtOffset.x;
+ atTarget.y = focalActorPosRot->pos.y + camera->focalActorAtOffset.y;
+ atTarget.z = focalActorPosRot->pos.z + camera->focalActorAtOffset.z;
+ if (camera->animState == 0) {
+ camera->animState++;
+ if (!(roData->interfaceFlags & SPECIAL8_FLAG_0)) {
+ camera->eyeNext = rwData->eye;
+ camera->at = atTarget;
+ }
+ }
+
+ // Update at to look at player
+ Camera_ScaledStepToCeilVec3f(&atTarget, at, roData->posStepScale, roData->posStepScale, 10.0f);
+
+ // Move camera position &rwData->eye and remain there for the entire cutscen
+ Camera_ScaledStepToCeilVec3f(&rwData->eye, eyeNext, roData->eyeStepScale, roData->eyeStepScale, 0.1f);
+ camera->eye = *eyeNext;
+ camera->dist = OLib_Vec3fDist(at, &camera->eye);
+ camera->roll = 0;
+ camera->xzSpeed = 0.0f;
+ camera->fov = CAM_RODATA_UNSCALE(rwData->fov);
+ camera->atLerpStepScale = Camera_ClampLerpScale(camera, 1.0f);
+ Camera_SetFocalActorAtOffset(camera, &focalActorPosRot->pos);
+ } else {
+ // Cutscene is finished
+ Camera_SetStateFlag(camera, CAM_STATE_10 | CAM_STATE_4);
+ sCameraInterfaceFlags = CAM_INTERFACE_FLAGS(CAM_LETTERBOX_NONE, CAM_HUD_VISIBILITY_ALL, 0);
+
+ // Wait for user input to move to the next camera update function
+ if ((camera->xzSpeed > 0.001f) || CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_A) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_B) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_CUP) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_CDOWN) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_CLEFT) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_CRIGHT) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_Z) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_L) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_R) ||
+ (roData->interfaceFlags & SPECIAL8_FLAG_3)) {
+ func_800CC938(camera);
+ Camera_SetStateFlag(camera, CAM_STATE_2 | CAM_STATE_CHECK_WATER);
+ Camera_UnsetStateFlag(camera, CAM_STATE_10);
+ }
+ }
+ return true;
+}
+
+/**
+ * Entering and exiting a door between rooms (eg. sliding doors)
+ * Camera closely follows player on both the front and the back room
+ */
+s32 Camera_Special9(Camera* camera) {
+ Vec3f* eye = &camera->eye;
+ Vec3f* at = &camera->at;
+ s32 rand1;
+ Vec3f spB8;
+ VecGeo spB0;
+ VecGeo spA8;
+ f32 focalActorHeight;
+ s32 phi_v1_2;
+ s16 actorCsId;
+ f32 yNormal;
+ PosRot sp84;
+ Vec3f* eyeNext = &camera->eyeNext;
+ PosRot* focalActorPosRot = &camera->focalActorPosRot;
+ DoorParams* doorParams = &camera->paramData.doorParams;
+ Special9ReadOnlyData* roData = &camera->paramData.spec9.roData;
+ Special9ReadWriteData* rwData = &camera->paramData.spec9.rwData;
+ s32 sp50[1];
+ BgCamFuncData* bgCamFuncData;
+
+ focalActorHeight = Camera_GetFocalActorHeight(camera);
+ actorCsId = CutsceneManager_GetCurrentCsId();
+
+ if ((actorCsId != -1) && (actorCsId != 0x7D)) {
+ func_800E0348(camera);
+ }
+
+ Camera_UnsetStateFlag(camera, CAM_STATE_4);
+ yNormal = 0.8f - ((68.0f / focalActorHeight) * -0.2f);
+
+ if (!RELOAD_PARAMS(camera)) {
+ } else {
+ CameraModeValue* values = sCameraSettings[camera->setting].cameraModes[camera->mode].values;
+
+ roData->yOffset = GET_NEXT_SCALED_RO_DATA(values) * focalActorHeight * yNormal;
+ roData->fov = GET_NEXT_RO_DATA(values);
+ roData->interfaceFlags = GET_NEXT_RO_DATA(values);
+ }
+
+ if (doorParams->doorActor != NULL) {
+ Actor_GetWorldPosShapeRot(&sp84, doorParams->doorActor);
+ } else {
+ sp84 = *focalActorPosRot;
+ sp84.pos.y += focalActorHeight + roData->yOffset;
+ sp84.rot.x = 0;
+ }
+
+ OLib_Vec3fDiffToVecGeo(&spA8, at, eye);
+
+ sCameraInterfaceFlags = roData->interfaceFlags;
+
+ switch (camera->animState) {
+ case 0:
+ // Init
+ Camera_UnsetStateFlag(camera, CAM_STATE_2 | CAM_STATE_CHECK_WATER);
+ camera->animState++;
+ if (ABS((s16)(focalActorPosRot->rot.y - sp84.rot.y)) > 0x4000) {
+ rwData->unk_00 = BINANG_ROT180(sp84.rot.y);
+ } else {
+ rwData->unk_00 = sp84.rot.y;
+ }
+ // fallthrough
+ case 1:
+ // Camera is fixed in front of the door
+ doorParams->timer1--;
+ if (doorParams->timer1 > 0) {
+ break;
+ }
+
+ camera->animState++;
+
+ // Setup for the camera moving behind the door
+ if (roData->interfaceFlags & SPECIAL9_FLAG_0) {
+ bgCamFuncData = (BgCamFuncData*)Camera_GetBgCamOrActorCsCamFuncData(camera, camera->bgCamIndex);
+ Camera_Vec3sToVec3f(eyeNext, &bgCamFuncData->pos);
+ spB8 = *eye = *eyeNext;
+ } else {
+ s16 camEyeSide;
+ s16 randFloat;
+
+ spB0.pitch = ((s16)(Rand_ZeroOne() * 0x280) + 0xBB8);
+ randFloat = ((s16)(Rand_ZeroOne() * 0x4CE) + 0x5DC);
+
+ // The camera will either position itself either to the left or to the right
+ // of the door when it jumps behind it. It's effectively 50/50 percent chance
+ camEyeSide = (s16)(randFloat * ((camera->play->state.frames % 2) ? 1 : -1));
+
+ spB0.yaw = rwData->unk_00 + camEyeSide;
+ spB0.r = 200.0f * yNormal;
+ OLib_AddVecGeoToVec3f(eyeNext, at, &spB0);
+ spB8 = *eye = *eyeNext;
+
+ // If the side chosen moves the camera out-of-bounds, move to the other side
+ if (Camera_CheckOOB(camera, &spB8, &focalActorPosRot->pos)) {
+ camEyeSide = (s16)-camEyeSide;
+ spB0.yaw = rwData->unk_00 + camEyeSide;
+ OLib_AddVecGeoToVec3f(eyeNext, at, &spB0);
+ *eye = *eyeNext;
+ }
+ }
+ // fallthrough
+ case 2:
+ // Camera is behind the door looking at player
+ spB8 = focalActorPosRot->pos;
+ spB8.y += focalActorHeight + roData->yOffset;
+ // Update camera at to follow the player
+ Camera_ScaledStepToCeilVec3f(&spB8, at, 0.25f, 0.25f, 0.1f);
+
+ doorParams->timer2--;
+ if (doorParams->timer2 > 0) {
+ break;
+ }
+
+ // Setup for the camera turning around to look in front of player
+ camera->animState++;
+ rwData->unk_00 = BINANG_ROT180(rwData->unk_00);
+ // fallthrough
+ case 3:
+ // Camera turns around to look in front of player
+ spB8 = focalActorPosRot->pos;
+ spB8.y += focalActorHeight + roData->yOffset;
+ Camera_ScaledStepToCeilVec3f(&spB8, at, 0.5f, 0.5f, 0.1f);
+ spB0.pitch = Camera_ScaledStepToCeilS(0xAAA, spA8.pitch, 0.3f, 5);
+ spB0.yaw = Camera_ScaledStepToCeilS(rwData->unk_00, spA8.yaw, 0.3f, 5);
+ spB0.r = Camera_ScaledStepToCeilF(60.0f, spA8.r, 0.3f, 1.0f);
+ OLib_AddVecGeoToVec3f(eyeNext, at, &spB0);
+
+ *eye = *eyeNext;
+
+ doorParams->timer3--;
+ if (doorParams->timer3 > 0) {
+ break;
+ }
+
+ camera->animState++;
+ // fallthrough
+ case 4:
+ camera->animState++;
+ // fallthrough
+ case 999:
+ default:
+ // Door is closed and is waiting for user input to toggle to a new setting
+ Camera_SetStateFlag(camera, CAM_STATE_10 | CAM_STATE_4);
+ sCameraInterfaceFlags = CAM_INTERFACE_FLAGS(CAM_LETTERBOX_NONE, CAM_HUD_VISIBILITY_ALL, 0);
+
+ if ((camera->xzSpeed > 0.001f) || CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_A) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_B) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_CUP) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_CDOWN) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_CLEFT) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_CRIGHT) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_Z) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_L) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_R) ||
+ (roData->interfaceFlags & SPECIAL9_FLAG_3)) {
+
+ func_800CC938(camera);
+ Camera_SetStateFlag(camera, CAM_STATE_2 | CAM_STATE_CHECK_WATER);
+ Camera_UnsetStateFlag(camera, CAM_STATE_10);
+ }
+ break;
+ }
+
+ spB8 = focalActorPosRot->pos;
+ spB8.y += focalActorHeight;
+ camera->dist = OLib_Vec3fDist(&spB8, eye);
+ Camera_SetFocalActorAtOffset(camera, &focalActorPosRot->pos);
+
+ return true;
+}
+
+/*===============================================================*/
+/* Camera Public Functions */
+/*===============================================================*/
+
+Camera* Camera_Create(View* view, CollisionContext* colCtx, PlayState* play) {
+ Camera* newCamera = ZeldaArena_Malloc(sizeof(Camera));
+
+ if (newCamera != NULL) {
+ Camera_Init(newCamera, view, colCtx, play);
+ }
+ return newCamera;
+}
+
+void Camera_Destroy(Camera* camera) {
+ if (camera != NULL) {
+ ZeldaArena_Free(camera);
+ }
+}
+
+void Camera_Init(Camera* camera, View* view, CollisionContext* colCtx, PlayState* play) {
+ Camera* cameraPtr;
+ s32 i;
+ s16 curUID;
+ s16 j;
+
+ __osMemset(camera, 0, sizeof(Camera));
+
+ camera->play = sCamPlayState = play;
+ curUID = sCameraNextUID;
+ sCameraNextUID++;
+ while (curUID != 0) {
+ if (curUID == 0) {
+ sCameraNextUID++;
+ }
+
+ for (j = 0; j < NUM_CAMS; j++) {
+ cameraPtr = camera->play->cameraPtrs[j];
+ if ((cameraPtr != NULL) && (curUID == cameraPtr->uid)) {
+ break;
+ }
+ }
+
+ if (j == NUM_CAMS) {
+ break;
+ }
+
+ curUID = sCameraNextUID++;
+ }
+
+ camera->inputDir.y = 0x4000;
+ camera->uid = curUID;
+ camera->camDir = camera->inputDir;
+ camera->nextCamSceneDataId = -1;
+ camera->up.z = camera->up.x = 0.0f;
+ camera->up.y = 1.0f;
+ camera->fov = 60.0f;
+ camera->yOffsetUpdateRate = 0.05f;
+ camera->xzOffsetUpdateRate = 0.05f;
+ camera->fovUpdateRate = 0.05f;
+ camera->rUpdateRateInv = 10.0f;
+ camera->yawUpdateRateInv = 10.0f;
+ camera->pitchUpdateRateInv = 16.0f;
+
+ sCameraLetterboxSize = 32;
+ sCameraHudVisibility = 0;
+
+ camera->setting = camera->prevSetting = CAM_SET_FREE0;
+ camera->bgCamIndex = camera->prevBgCamDataId = -1;
+ camera->stateFlags = 0;
+ camera->mode = CAM_MODE_NORMAL;
+ camera->bgId = BGCHECK_SCENE;
+ camera->unk168 = 0xF;
+ camera->timer = -1;
+ camera->focalActor = NULL;
+ camera->target = NULL;
+ Camera_SetStateFlag(camera, CAM_STATE_INITIALIZED);
+ camera->quakeOffset.z = camera->quakeOffset.y = camera->quakeOffset.x = 0;
+ camera->up.z = camera->up.x = 0.0f;
+ camera->atLerpStepScale = 1;
+ camera->up.y = 1.0f;
+ sCameraInterfaceFlags = CAM_INTERFACE_FLAGS(CAM_LETTERBOX_IGNORE, CAM_HUD_VISIBILITY_IGNORE, 0);
+ sCameraInitSceneTimer = 3;
+}
+
+void func_800DDFE0(Camera* camera) {
+ if (camera != &camera->play->mainCamera) {
+ camera->prevSetting = camera->setting = CAM_SET_FREE0;
+ Camera_UnsetStateFlag(camera, CAM_STATE_2);
+ } else {
+ switch (camera->play->roomCtx.curRoom.behaviorType1) {
+ case ROOM_BEHAVIOR_TYPE1_1:
+ camera->prevSetting = CAM_SET_DUNGEON0;
+ Camera_ChangeSettingFlags(camera, CAM_SET_DUNGEON0, CAM_CHANGE_SETTING_1);
+ break;
+
+ case ROOM_BEHAVIOR_TYPE1_0:
+ camera->prevSetting = CAM_SET_NORMAL0;
+ Camera_ChangeSettingFlags(camera, CAM_SET_NORMAL0, CAM_CHANGE_SETTING_1);
+ break;
+
+ case ROOM_BEHAVIOR_TYPE1_2:
+ camera->prevSetting = CAM_SET_ROOM0;
+ Camera_ChangeSettingFlags(camera, CAM_SET_ROOM0, CAM_CHANGE_SETTING_1);
+ break;
+
+ default:
+ camera->prevSetting = CAM_SET_NORMAL0;
+ Camera_ChangeSettingFlags(camera, CAM_SET_NORMAL0, CAM_CHANGE_SETTING_1);
+ break;
+ }
+ Camera_SetStateFlag(camera, CAM_STATE_2);
+ }
+}
+
+/**
+ * Unused empty function
+ */
+void Camera_Stub800DE0E0(Camera* camera) {
+}
+
+void Camera_InitFocalActorSettings(Camera* camera, Actor* focalActor) {
+ PosRot focalActorPosRot;
+ VecGeo eyeNextAtOffset;
+ s32 bgId;
+ Vec3f floorPos;
+ s32 upXZ;
+ f32 focalActorHeight;
+ Vec3f* eye = &camera->eye;
+
+ Actor_GetWorldPosShapeRot(&focalActorPosRot, focalActor);
+
+ camera->focalActor = focalActor;
+ focalActorHeight = Camera_GetFocalActorHeight(camera);
+ camera->focalActorPosRot = focalActorPosRot;
+ camera->dist = eyeNextAtOffset.r = 180.0f;
+ camera->inputDir.y = focalActorPosRot.rot.y;
+ eyeNextAtOffset.yaw = BINANG_ROT180(camera->inputDir.y);
+ camera->inputDir.x = eyeNextAtOffset.pitch = 0x71C;
+ camera->inputDir.z = 0;
+ camera->camDir = camera->inputDir;
+ camera->xzSpeed = 0.0f;
+ camera->unk_0F0.y = 0.0f;
+ camera->at = focalActorPosRot.pos;
+ camera->at.y += focalActorHeight;
+
+ camera->focalActorAtOffset.x = 0;
+ camera->focalActorAtOffset.y = focalActorHeight;
+ camera->focalActorAtOffset.z = 0;
+
+ OLib_AddVecGeoToVec3f(&camera->eyeNext, &camera->at, &eyeNextAtOffset);
+ *eye = camera->eyeNext;
+ camera->roll = 0;
+
+ upXZ = 0;
+ camera->up.z = upXZ;
+ camera->up.y = 1.0f;
+ camera->up.x = upXZ;
+
+ {
+ s32 pad;
+
+ if (Camera_GetFloorYNorm(camera, &floorPos, &camera->at, &bgId) != BGCHECK_Y_MIN) {
+ camera->bgId = bgId;
+ }
+ }
+
+ camera->waterPrevBgCamDataId = -1;
+ camera->waterPrevCamSetting = -1;
+ camera->waterQuakeId = -1;
+
+ {
+ s32 pad;
+
+ func_800DDFE0(camera);
+ }
+
+ Camera_SetStateFlag(camera, CAM_STATE_2);
+
+ camera->viewFlags = 0;
+ camera->nextCamSceneDataId = -1;
+ camera->yOffsetUpdateRate = 0.01f;
+ camera->xzOffsetUpdateRate = 0.01f;
+ camera->fovUpdateRate = 0.01f;
+ camera->atLerpStepScale = 1;
+ Camera_ResetActionFuncState(camera, camera->mode);
+
+ if (camera == &camera->play->mainCamera) {
+ sCameraInterfaceFlags =
+ CAM_INTERFACE_FLAGS(CAM_LETTERBOX_LARGE | CAM_LETTERBOX_INSTANT, CAM_HUD_VISIBILITY_NONE_ALT, 0);
+ CutsceneManager_StoreCamera(camera);
+ } else {
+ sCameraInterfaceFlags = CAM_INTERFACE_FLAGS(CAM_LETTERBOX_LARGE, CAM_HUD_VISIBILITY_NONE_ALT, 0);
+ }
+ Camera_UpdateWater(camera);
+}
+
+/**
+ * Updates the camera status
+ */
+s32 Camera_ChangeStatus(Camera* camera, s16 status) {
+ camera->status = status;
+ return camera->status;
+}
+
+s32 Camera_UpdateWater(Camera* camera) {
+ f32 waterY;
+ s16 camSetting;
+ s32 pad[2];
+ s32* waterPrevCamSetting = &camera->waterPrevCamSetting;
+ s16 prevBgId;
+
+ if (!(camera->stateFlags & CAM_STATE_CHECK_WATER) || (sCameraSettings[camera->setting].flags & 0x40000000)) {
+ return false;
+ }
+
+ if (camera->stateFlags & CAM_STATE_9) {
+ if (Camera_IsDiving(camera)) {
+ if (!Camera_IsPlayerFormZora(camera)) {
+ Camera_ChangeSettingFlags(camera, CAM_SET_PIVOT_DIVING, CAM_CHANGE_SETTING_2 | CAM_CHANGE_SETTING_1);
+ } else {
+ Camera_ChangeSettingFlags(camera, CAM_SET_ZORA_DIVING, CAM_CHANGE_SETTING_2 | CAM_CHANGE_SETTING_1);
+ }
+ Camera_SetStateFlag(camera, CAM_STATE_15);
+ } else if (camera->stateFlags & CAM_STATE_15) {
+ Camera_ChangeSettingFlags(camera, *waterPrevCamSetting, CAM_CHANGE_SETTING_2 | CAM_CHANGE_SETTING_1);
+ Camera_UnsetStateFlag(camera, CAM_STATE_15);
+ }
+ }
+
+ if (!(camera->stateFlags & CAM_STATE_15)) {
+ camSetting = Camera_GetWaterBoxBgCamSetting(camera, &waterY);
+ if (camSetting == -2) {
+ // CAM_SET_NONE
+ if (!(camera->stateFlags & CAM_STATE_9)) {
+ Camera_SetStateFlag(camera, CAM_STATE_9);
+ camera->waterPrevBgCamDataId = camera->bgCamIndex;
+ camera->waterQuakeId = -1;
+ }
+
+ if (!(Camera_fabsf(camera->focalActorPosRot.pos.y - camera->focalActorFloorHeight) < 11.0f) ||
+ (Camera_IsSwimming(camera) && !Camera_IsUnderwaterAsZora(camera))) {
+ prevBgId = camera->bgId;
+ camera->bgId = BGCHECK_SCENE;
+ waterPrevCamSetting = &camera->waterPrevCamSetting;
+ Camera_ChangeSettingFlags(camera, CAM_SET_NORMAL3, CAM_CHANGE_SETTING_1);
+ *waterPrevCamSetting = camera->setting;
+ camera->bgId = prevBgId;
+ camera->bgCamIndex = -2;
+ }
+
+ } else if (camSetting != -1) {
+ // player is in a water box
+ if (!(camera->stateFlags & CAM_STATE_9)) {
+ Camera_SetStateFlag(camera, CAM_STATE_9);
+ camera->waterPrevBgCamDataId = camera->bgCamIndex;
+ camera->waterQuakeId = -1;
+ }
+
+ if (!(Camera_fabsf(camera->focalActorPosRot.pos.y - camera->focalActorFloorHeight) < 11.0f) ||
+ (Camera_IsSwimming(camera) && !Camera_IsUnderwaterAsZora(camera))) {
+ prevBgId = camera->bgId;
+ camera->bgId = BGCHECK_SCENE;
+ waterPrevCamSetting = &camera->waterPrevCamSetting;
+ Camera_ChangeSettingFlags(camera, camSetting, CAM_CHANGE_SETTING_1);
+ *waterPrevCamSetting = camera->setting;
+ camera->bgId = prevBgId;
+ }
+
+ } else if (camera->stateFlags & CAM_STATE_9) {
+ // player is out of a water box.
+ Camera_UnsetStateFlag(camera, CAM_STATE_9);
+ prevBgId = camera->bgId;
+ camera->bgId = BGCHECK_SCENE;
+ if (camera->waterPrevBgCamDataId < 0) {
+ func_800DDFE0(camera);
+ camera->bgCamIndex = -1;
+ } else {
+ Camera_ChangeActorCsCamIndex(camera, camera->waterPrevBgCamDataId);
+ }
+ camera->bgId = prevBgId;
+ }
+ camera->waterYPos = waterY;
+ }
+ return true;
+}
+
+void Camera_EarthquakeDay3(Camera* camera) {
+ static s16 sEarthquakeTimer = 0;
+ u16 time;
+ s16 quakeIndex;
+ s32 timeSpeedOffset;
+ s16 sEarthquakeFreq[] = {
+ 0xFFC, // 1 Large Earthquake between CLOCK_TIME(0, 00) to CLOCK_TIME(1, 30)
+ 0x7FC, // 2 Large Earthquakes between CLOCK_TIME(1, 30) to CLOCK_TIME(3, 00)
+ 0x3FC, // 4 Large Earthquakes between CLOCK_TIME(3, 00) to CLOCK_TIME(4, 30)
+ 0x1FC, // 8 Large Earthquakes between CLOCK_TIME(4, 30) to CLOCK_TIME(6, 00)
+ };
+
+ if ((CURRENT_DAY == 3) && (CutsceneManager_GetCurrentCsId() == -1)) {
+ time = gSaveContext.save.time;
+ timeSpeedOffset = gSaveContext.save.timeSpeedOffset;
+
+ // Large earthquake created
+ // Times based on sEarthquakeFreq
+ if ((time > CLOCK_TIME(0, 0)) && (time < CLOCK_TIME(6, 0)) && ((sEarthquakeFreq[time >> 12] & time) == 0) &&
+ (Quake_GetNumActiveQuakes() < 2)) {
+ quakeIndex = Quake_Request(camera, QUAKE_TYPE_4);
+ if (quakeIndex != 0) {
+ Quake_SetSpeed(quakeIndex, 30000);
+ Quake_SetPerturbations(quakeIndex, (time >> 12) + 2, 1, 5, 60);
+ sEarthquakeTimer = ((time >> 10) - timeSpeedOffset) + 80;
+ Quake_SetDuration(quakeIndex, sEarthquakeTimer);
+ }
+ }
+
+ // Small earthquake created
+ // Around CLOCK_TIME(17, 33) || Around CLOCK_TIME(20, 33) || Every 1024 frames (around every 51s)
+ if (((((time + 0x4D2) & 0xDFFC) == 0xC000) || ((camera->play->state.frames % 1024) == 0)) &&
+ (Quake_GetNumActiveQuakes() < 2)) {
+ quakeIndex = Quake_Request(camera, QUAKE_TYPE_3);
+ if (quakeIndex != 0) {
+ Quake_SetSpeed(quakeIndex, 16000);
+ Quake_SetPerturbations(quakeIndex, 1, 0, 0, time & 0x3F); // %64
+ sEarthquakeTimer = 120 - timeSpeedOffset;
+ Quake_SetDuration(quakeIndex, sEarthquakeTimer);
+ }
+ }
+
+ if (sEarthquakeTimer != 0) {
+ sEarthquakeTimer--;
+ func_8019F128(NA_SE_SY_EARTHQUAKE_OUTDOOR - SFX_FLAG);
+ }
+ }
+}
+
+/**
+ * Sets the distortion to type 1 for a hot room
+ * Remnant of OoT as no room in any MM scene is set to a hot-room
+ */
+s32 Camera_UpdateHotRoom(Camera* camera) {
+ Distortion_RemoveRequest(DISTORTION_TYPE_HOT_ROOM);
+ if (camera->play->roomCtx.curRoom.behaviorType2 == ROOM_BEHAVIOR_TYPE2_HOT) {
+ Distortion_Request(DISTORTION_TYPE_HOT_ROOM);
+ }
+ return true;
+}
+
+s32 Camera_SetSwordDistortion(Camera* camera) {
+ switch (func_800CBB88(camera)) {
+ case 1:
+ // non-magic spin attack
+ if (Distortion_GetType() != DISTORTION_TYPE_ZORA_KICK) {
+ Distortion_Request(DISTORTION_TYPE_ZORA_KICK);
+ Distortion_SetDuration(12);
+ }
+ break;
+
+ case 2:
+ // Unused: case 2 is impossible to achieve
+ if (Distortion_GetType() != DISTORTION_TYPE_UNK_ATTACK) {
+ Distortion_Request(DISTORTION_TYPE_UNK_ATTACK);
+ Distortion_SetDuration(5);
+ }
+ break;
+
+ case 3:
+ if (Distortion_GetType() != DISTORTION_TYPE_GORON_BUTT) {
+ Distortion_Request(DISTORTION_TYPE_GORON_BUTT);
+ Distortion_SetDuration(15);
+ }
+ break;
+ }
+ return true;
+}
+
+s32 Camera_RequestGiantsMaskSetting(Camera* camera) {
+ Player* player = GET_PLAYER(camera->play);
+
+ if ((camera->camId == CAM_ID_MAIN) && (camera->focalActor == &GET_PLAYER(camera->play)->actor) &&
+ (player->currentMask == PLAYER_MASK_GIANT)) {
+ Camera_ChangeSettingFlags(camera, CAM_SET_GIANT, CAM_CHANGE_SETTING_1);
+ return true;
+ } else {
+ return false;
+ }
+}
+
+Vec3s* Camera_Update(Vec3s* inputDir, Camera* camera) {
+ Vec3f viewAt;
+ Vec3f viewEye;
+ Vec3f viewUp;
+ Vec3f focalActorPos;
+ s32 bgId;
+ s32 sp98;
+ s32 changeCamSceneDataType;
+ CollisionPoly* sp90;
+ CollisionPoly* sp8C;
+ f32 runSpeedLimit;
+ f32 speed;
+ f32 viewFov;
+ DynaPolyActor* meshActor;
+ PosRot focalActorPosRot;
+ ShakeInfo camShake;
+ Actor* focalActor = camera->focalActor;
+ VecGeo sp3C;
+ s16 bgCamIndex;
+ s16 numQuakesApplied;
+ f32 focalActorFloorHeight;
+
+ // Camera of status CUT only updates to this point
+ if (camera->status == CAM_STATUS_CUT) {
+ *inputDir = camera->inputDir;
+ return inputDir;
+ }
+
+ sUpdateCameraDirection = false;
+ sIsFalse = false;
+
+ if (camera->play->view.unk164 == 0) {
+ if (camera->focalActor != NULL) {
+ // Updates camera info on the actor it's tracking
+
+ if (camera->focalActor == &GET_PLAYER(camera->play)->actor) {
+ Actor_GetWorldPosShapeRot(&focalActorPosRot, camera->focalActor);
+ } else {
+ Actor_GetWorld(&focalActorPosRot, camera->focalActor);
+ }
+ camera->unk_0F0.x = focalActorPosRot.pos.x - camera->focalActorPosRot.pos.x;
+ camera->unk_0F0.y = focalActorPosRot.pos.y - camera->focalActorPosRot.pos.y;
+ camera->unk_0F0.z = focalActorPosRot.pos.z - camera->focalActorPosRot.pos.z;
+
+ // bg related to tracked actor
+ sp98 = 0;
+ if (Camera_IsMountedOnHorse(camera)) {
+ if (((Player*)focalActor)->rideActor->floorPoly != NULL) {
+ sp90 = ((Player*)focalActor)->rideActor->floorPoly;
+ camera->bgId = ((Player*)focalActor)->rideActor->floorBgId;
+ camera->focalActorFloorHeight = ((Player*)focalActor)->rideActor->floorHeight;
+ sp98 = 3;
+ }
+ } else if (func_800CB7CC(camera)) {
+ if (camera->focalActor->floorPoly != NULL) {
+ sp90 = camera->focalActor->floorPoly;
+ camera->bgId = camera->focalActor->floorBgId;
+ camera->focalActorFloorHeight = camera->focalActor->floorHeight;
+ sp98 = 1;
+ }
+ } else {
+ focalActorPos = focalActorPosRot.pos;
+ focalActorPos.y += Camera_GetFocalActorHeight(camera);
+ focalActorFloorHeight = BgCheck_EntityRaycastFloor5_3(camera->play, &camera->play->colCtx, &sp90, &bgId,
+ camera->focalActor, &focalActorPos);
+ if (focalActorFloorHeight != BGCHECK_Y_MIN) {
+ camera->bgId = bgId;
+ camera->focalActorFloorHeight = focalActorFloorHeight;
+ sp98 = 2;
+ }
+ }
+
+ if ((sp98 != 0) && (Camera_fabsf(camera->focalActorPosRot.pos.y - camera->focalActorFloorHeight) < 11.0f)) {
+ meshActor = DynaPoly_GetActor(&camera->play->colCtx, camera->bgId);
+ if (meshActor != NULL) {
+ camera->floorNorm.x = COLPOLY_GET_NORMAL(sp90->normal.x);
+ camera->floorNorm.y = COLPOLY_GET_NORMAL(sp90->normal.y);
+ camera->floorNorm.z = COLPOLY_GET_NORMAL(sp90->normal.z);
+ camera->unk_0F0.x -= meshActor->actor.world.pos.x - camera->meshActorPos.x;
+ camera->unk_0F0.y -= meshActor->actor.world.pos.y - camera->meshActorPos.y;
+ camera->unk_0F0.z -= meshActor->actor.world.pos.z - camera->meshActorPos.z;
+ camera->meshActorPos = meshActor->actor.world.pos;
+ }
+ }
+
+ // Set camera speed
+ runSpeedLimit = Camera_GetRunSpeedLimit(camera) * 1.5f;
+ speed = Camera_Vec3fMagnitude(&camera->unk_0F0);
+ camera->xzSpeed = OLib_ClampMaxDist(speed, runSpeedLimit);
+ camera->speedRatio = OLib_ClampMaxDist(speed / runSpeedLimit, 1.8f);
+ camera->focalActorPosRot = focalActorPosRot;
+
+ if (camera->camId == CAM_ID_MAIN) {
+ Camera_UpdateWater(camera);
+ Camera_UpdateHotRoom(camera);
+ Camera_EarthquakeDay3(camera);
+ Camera_SetSwordDistortion(camera);
+ }
+
+ /**
+ * This section is about updating the camera setting based on the camera scene data
+ *
+ */
+
+ // If doorTimer1 is active, set CAM_STATE_10 which suppresses bg camera scene data from being read
+ if (camera->doorTimer1 != 0) {
+ Camera_SetStateFlag(camera, CAM_STATE_10);
+ } else if (!(camera->stateFlags & CAM_STATE_2)) {
+ camera->nextCamSceneDataId = -1;
+ }
+
+ changeCamSceneDataType = 0; // default to no change in the cam scene data
+ bgId = camera->bgId;
+
+ // Sets the next cam scene data Index based on the bg surface
+ if ((camera->stateFlags & CAM_STATE_0) && (camera->stateFlags & CAM_STATE_2) &&
+ !(camera->stateFlags & CAM_STATE_10) &&
+ (!(camera->stateFlags & CAM_STATE_9) || Camera_IsUnderwaterAsZora(camera)) &&
+ !(camera->stateFlags & CAM_STATE_15) && !Camera_IsMountedOnHorse(camera) &&
+ !Camera_RequestGiantsMaskSetting(camera) && !Camera_IsDekuHovering(camera) && (sp98 != 0)) {
+
+ bgCamIndex = Camera_GetBgCamIndex(camera, &bgId, sp90);
+ if ((bgCamIndex != -1) && (camera->bgId == BGCHECK_SCENE)) {
+ if (Camera_IsUsingZoraFins(camera) == 0) {
+ camera->nextCamSceneDataId = bgCamIndex | CAM_DATA_IS_BG;
+ }
+ }
+
+ focalActorPos = focalActorPosRot.pos;
+ focalActorPos.y += Camera_GetFocalActorHeight(camera);
+ focalActorFloorHeight =
+ BgCheck_CameraRaycastFloor2(&camera->play->colCtx, &sp8C, &bgId, &focalActorPos);
+
+ if ((focalActorFloorHeight != BGCHECK_Y_MIN) && (sp8C != sp90) && (bgId == BGCHECK_SCENE) &&
+ ((camera->focalActorFloorHeight - 2.0f) < focalActorFloorHeight)) {
+ bgCamIndex = Camera_GetBgCamIndex(camera, &bgId, sp8C);
+ if ((bgCamIndex != -1) && (bgId == BGCHECK_SCENE)) {
+ camera->nextCamSceneDataId = bgCamIndex | CAM_DATA_IS_BG;
+ changeCamSceneDataType = 1; // change cam scene data based on the bg cam data
+ }
+ }
+ }
+
+ if (camera->doorTimer1 != 0) {
+ camera->doorTimer1--;
+ if (camera->doorTimer1 == 0) {
+ Camera_UnsetStateFlag(camera, CAM_STATE_10);
+ changeCamSceneDataType = 5; // change cam scene data based on the cutscene cam data
+ }
+ }
+
+ if (((camera->camId == CAM_ID_MAIN) || (camera->stateFlags & CAM_STATE_6)) &&
+ ((camera->bgId == BGCHECK_SCENE) || ((bgId == BGCHECK_SCENE) && (changeCamSceneDataType != 0))) &&
+ (camera->nextCamSceneDataId != -1) && (camera->doorTimer1 == 0) &&
+ ((Camera_fabsf(camera->focalActorPosRot.pos.y - camera->focalActorFloorHeight) < 11.0f) ||
+ (changeCamSceneDataType != 0)) &&
+ (!(camera->stateFlags & CAM_STATE_9) || Camera_IsUnderwaterAsZora(camera))) {
+
+ Camera_ChangeActorCsCamIndex(camera, camera->nextCamSceneDataId);
+ camera->nextCamSceneDataId = -1;
+ if (camera->doorTimer2 != 0) {
+ camera->doorTimer1 = camera->doorTimer2;
+ camera->doorTimer2 = 0;
+ }
+ }
+ }
+
+ // Camera of status WAIT only updates to this point
+ if (camera->status == CAM_STATUS_WAIT) {
+ *inputDir = camera->inputDir;
+ return inputDir;
+ }
+
+ camera->behaviorFlags = 0;
+ Camera_UnsetStateFlag(camera, CAM_STATE_10 | CAM_STATE_DISABLE_MODE_CHANGE);
+ Camera_SetStateFlag(camera, CAM_STATE_4);
+ }
+
+ // Call the camera update function
+ sCameraUpdateHandlers[sCameraSettings[camera->setting].cameraModes[camera->mode].funcId](camera);
+
+ // Update the interface
+ if (sCameraInitSceneTimer != 0) {
+ sCameraInitSceneTimer--;
+ }
+ if (camera->status == CAM_STATUS_ACTIVE) {
+ if (((sCameraInitSceneTimer != 0) || func_800CB854(camera)) && (camera->camId == CAM_ID_MAIN)) {
+ // Surpresses the interface for the first few frames of a scene
+ sCameraInterfaceFlags = CAM_INTERFACE_FLAGS(CAM_LETTERBOX_LARGE, CAM_HUD_VISIBILITY_NONE_ALT, 0);
+ Camera_UpdateInterface(sCameraInterfaceFlags);
+ } else if ((camera->play->transitionMode != TRANS_MODE_OFF) && (camera->camId != CAM_ID_MAIN)) {
+ sCameraInterfaceFlags = CAM_INTERFACE_FLAGS(CAM_LETTERBOX_IGNORE, CAM_HUD_VISIBILITY_IGNORE, 0);
+ Camera_UpdateInterface(sCameraInterfaceFlags);
+ } else {
+ Camera_UpdateInterface(sCameraInterfaceFlags);
+ }
+ }
+
+ // Camera of status UNK3 only updates to this point
+ if (camera->status == CAM_STATUS_UNK3) {
+ *inputDir = camera->inputDir;
+ return inputDir;
+ }
+
+ /**
+ * This section is about updating view structs from the active camera,
+ * which view uses to calculate the viewing/projection matrices
+ */
+ numQuakesApplied = Quake_Update(camera, &camShake);
+
+ bgId = numQuakesApplied; // required to match
+
+ if (numQuakesApplied != 0) {
+ viewAt.x = camera->at.x + camShake.atOffset.x;
+ viewAt.y = camera->at.y + camShake.atOffset.y;
+ viewAt.z = camera->at.z + camShake.atOffset.z;
+ viewEye.x = camera->eye.x + camShake.eyeOffset.x;
+ viewEye.y = camera->eye.y + camShake.eyeOffset.y;
+ viewEye.z = camera->eye.z + camShake.eyeOffset.z;
+ OLib_Vec3fDiffToVecGeo(&sp3C, &viewEye, &viewAt);
+ Camera_CalcUpVec(&viewUp, sp3C.pitch, sp3C.yaw, camera->roll + camShake.upRollOffset);
+ viewFov = camera->fov + CAM_BINANG_TO_DEG(camShake.fovOffset);
+ } else if (sIsFalse) {
+ //! condition is impossible to achieve
+ viewAt = camera->at;
+ viewEye = camera->eye;
+ OLib_Vec3fDiffToVecGeo(&sp3C, &viewEye, &viewAt);
+ viewUp = camera->up;
+ viewFov = camera->fov;
+ } else {
+ viewAt = camera->at;
+ viewEye = camera->eye;
+ OLib_Vec3fDiffToVecGeo(&sp3C, &viewEye, &viewAt);
+ Camera_CalcUpVec(&viewUp, sp3C.pitch, sp3C.yaw, camera->roll);
+ viewFov = camera->fov;
+ }
+
+ // set view up
+ if (camera->viewFlags & CAM_VIEW_UP) {
+ camera->viewFlags &= ~CAM_VIEW_UP;
+ viewUp = camera->up;
+ } else {
+ camera->up = viewUp;
+ }
+
+ camera->quakeOffset = camShake.eyeOffset;
+ View_SetScale(&camera->play->view, (OREG(67) * 0.01f) + 1.0f);
+ camera->play->view.fovy = viewFov;
+ View_LookAt(&camera->play->view, &viewEye, &viewAt, &viewUp);
+ camera->camDir.x = sp3C.pitch;
+ camera->camDir.y = sp3C.yaw;
+ camera->camDir.z = 0;
+
+ if (!sUpdateCameraDirection) {
+ camera->inputDir.x = sp3C.pitch;
+ camera->inputDir.y = sp3C.yaw;
+ camera->inputDir.z = 0;
+ }
+
+ *inputDir = camera->inputDir;
+
+ return inputDir;
+}
+
+s32 func_800DF498(Camera* camera) {
+ Camera_SetStateFlag(camera, CAM_STATE_3 | CAM_STATE_2); // CAM_STATE_3 is set only immediately to be unset
+ Camera_UnsetStateFlag(camera, CAM_STATE_12 | CAM_STATE_3);
+ return true;
+}
+
+#define CAM_CHANGE_MODE_0 (1 << 0)
+#define CAM_CHANGE_MODE_1 (1 << 1)
+#define CAM_CHANGE_MODE_BATTLE (1 << 2)
+#define CAM_CHANGE_MODE_FOLLOW_TARGET (1 << 3)
+#define CAM_CHANGE_MODE_4 (1 << 4)
+#define CAM_CHANGE_MODE_FIRST_PERSON (1 << 5)
+
+s32 Camera_ChangeModeFlags(Camera* camera, s16 mode, u8 forceChange) {
+ static s32 sModeChangeFlags = 0;
+
+ if ((camera->setting == CAM_SET_TELESCOPE) && ((mode == CAM_MODE_FIRSTPERSON) || (mode == CAM_MODE_DEKUHIDE))) {
+ forceChange = true;
+ }
+
+ // Mode change rejected by flag
+ if ((camera->stateFlags & CAM_STATE_DISABLE_MODE_CHANGE) && !forceChange) {
+ camera->behaviorFlags |= CAM_BEHAVIOR_MODE_VALID;
+ return -1;
+ }
+
+ // Mode change rejected by validModes
+ if (!(sCameraSettings[camera->setting].validModes & (1 << mode))) {
+ if (camera->mode != CAM_MODE_NORMAL) {
+ camera->mode = CAM_MODE_NORMAL;
+ Camera_ResetActionFuncState(camera, camera->mode);
+ func_800DF498(camera);
+ return mode | 0xC0000000;
+ } else {
+ camera->behaviorFlags |= CAM_BEHAVIOR_MODE_VALID;
+ camera->behaviorFlags |= CAM_BEHAVIOR_MODE_1;
+ return 0;
+ }
+ }
+
+ // Mode change rejected due to mode already being set. (otherwise, reset mode)
+ if ((mode == camera->mode) && !forceChange) {
+ camera->behaviorFlags |= CAM_BEHAVIOR_MODE_VALID;
+ return -1;
+ }
+
+ camera->behaviorFlags |= CAM_BEHAVIOR_MODE_VALID;
+ camera->behaviorFlags |= CAM_BEHAVIOR_MODE_1;
+
+ Camera_ResetActionFuncState(camera, mode);
+
+ sModeChangeFlags = 0;
+
+ // Process Requested Camera Mode
+ switch (mode) {
+ case CAM_MODE_FIRSTPERSON:
+ sModeChangeFlags = CAM_CHANGE_MODE_FIRST_PERSON;
+ break;
+
+ case CAM_MODE_BATTLE:
+ sModeChangeFlags = CAM_CHANGE_MODE_BATTLE;
+ break;
+
+ case CAM_MODE_FOLLOWTARGET:
+ if (camera->target != NULL && camera->target->id != ACTOR_EN_BOOM) {
+ sModeChangeFlags = CAM_CHANGE_MODE_FOLLOW_TARGET;
+ }
+ break;
+
+ case CAM_MODE_BOWARROWZ:
+ case CAM_MODE_TARGET:
+ case CAM_MODE_TALK:
+ case CAM_MODE_HANGZ:
+ case CAM_MODE_PUSHPULL:
+ sModeChangeFlags = CAM_CHANGE_MODE_1;
+ break;
+
+ case CAM_MODE_NORMAL:
+ case CAM_MODE_HANG:
+ sModeChangeFlags = CAM_CHANGE_MODE_4;
+ break;
+ }
+
+ // Process Current Camera Mode
+ switch (camera->mode) {
+ case CAM_MODE_FIRSTPERSON:
+ if (sModeChangeFlags & CAM_CHANGE_MODE_FIRST_PERSON) {
+ camera->animState = 10;
+ }
+ break;
+
+ case CAM_MODE_JUMP:
+ case CAM_MODE_HANG:
+ if (sModeChangeFlags & CAM_CHANGE_MODE_4) {
+ camera->animState = 20;
+ }
+ sModeChangeFlags |= CAM_CHANGE_MODE_0;
+ break;
+
+ case CAM_MODE_CHARGE:
+ if (sModeChangeFlags & CAM_CHANGE_MODE_4) {
+ camera->animState = 20;
+ }
+ sModeChangeFlags |= CAM_CHANGE_MODE_0;
+ break;
+
+ case CAM_MODE_FOLLOWTARGET:
+ if (sModeChangeFlags & CAM_CHANGE_MODE_FOLLOW_TARGET) {
+ camera->animState = 10;
+ }
+ sModeChangeFlags |= CAM_CHANGE_MODE_0;
+ break;
+
+ case CAM_MODE_BATTLE:
+ if (sModeChangeFlags & CAM_CHANGE_MODE_BATTLE) {
+ camera->animState = 10;
+ }
+ sModeChangeFlags |= 1;
+ break;
+
+ case CAM_MODE_BOWARROWZ:
+ case CAM_MODE_HANGZ:
+ case CAM_MODE_PUSHPULL:
+ sModeChangeFlags |= CAM_CHANGE_MODE_0;
+ break;
+
+ case CAM_MODE_NORMAL:
+ if (sModeChangeFlags & CAM_CHANGE_MODE_4) {
+ camera->animState = 20;
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ sModeChangeFlags &= ~CAM_CHANGE_MODE_4;
+
+ // Z-Pressing Sfx
+ if (camera->status == CAM_STATUS_ACTIVE) {
+ switch (sModeChangeFlags) {
+ case CAM_CHANGE_MODE_0:
+ play_sound(0);
+ break;
+
+ case CAM_CHANGE_MODE_1:
+ if (camera->play->roomCtx.curRoom.behaviorType1 == ROOM_BEHAVIOR_TYPE1_1) {
+ play_sound(NA_SE_SY_ATTENTION_URGENCY);
+ } else {
+
+ play_sound(NA_SE_SY_ATTENTION_ON);
+ }
+ break;
+
+ case CAM_CHANGE_MODE_BATTLE:
+ play_sound(NA_SE_SY_ATTENTION_URGENCY);
+ break;
+
+ case CAM_CHANGE_MODE_FOLLOW_TARGET:
+ play_sound(NA_SE_SY_ATTENTION_ON);
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ func_800DF498(camera);
+ camera->mode = mode;
+
+ return mode | 0x80000000;
+}
+
+s32 Camera_ChangeMode(Camera* camera, s16 mode) {
+ return Camera_ChangeModeFlags(camera, mode, false);
+}
+
+s32 Camera_CheckValidMode(Camera* camera, s16 mode) {
+ if (camera->stateFlags & CAM_STATE_DISABLE_MODE_CHANGE) {
+ return 0;
+ } else if (!(sCameraSettings[camera->setting].validModes & (1 << mode))) {
+ return 0;
+ } else if (mode == camera->mode) {
+ return -1;
+ } else {
+ return mode | 0x80000000;
+ }
+}
+
+s16 Camera_ChangeSettingFlags(Camera* camera, s16 setting, s16 flags) {
+ // Reject settings change based on priority
+ if ((camera->behaviorFlags & CAM_BEHAVIOR_SETTING_USE_PRIORITY) &&
+ ((sCameraSettings[camera->setting].flags & 0xF) >= (sCameraSettings[setting].flags & 0xF))) {
+ camera->behaviorFlags |= CAM_BEHAVIOR_SETTING_2;
+ if (!(flags & CAM_CHANGE_SETTING_1)) {
+ camera->behaviorFlags |= CAM_BEHAVIOR_SETTING_USE_PRIORITY;
+ }
+ return -2;
+ }
+
+ // Reject settings change based on NONE setting
+ if (setting == CAM_SET_NONE) {
+ return 0;
+ }
+
+ // Reject settings change based on an invalid setting
+ if (setting >= CAM_SET_MAX) {
+ return -99;
+ }
+
+ // Reject settings change based on setting already set (and flags)
+ if ((setting == camera->setting) && !(flags & CAM_CHANGE_SETTING_0)) {
+ camera->behaviorFlags |= CAM_BEHAVIOR_SETTING_2;
+ if (!(flags & CAM_CHANGE_SETTING_1)) {
+ camera->behaviorFlags |= CAM_BEHAVIOR_SETTING_USE_PRIORITY;
+ }
+ return -1;
+ }
+
+ camera->behaviorFlags |= CAM_BEHAVIOR_SETTING_2;
+
+ if (!(flags & CAM_CHANGE_SETTING_1)) {
+ camera->behaviorFlags |= CAM_BEHAVIOR_SETTING_USE_PRIORITY;
+ }
+
+ func_800DF498(camera);
+
+ if (!(sCameraSettings[camera->setting].flags & 0x40000000)) {
+ camera->prevSetting = camera->setting;
+ }
+
+ if (flags & CAM_CHANGE_SETTING_3) {
+ camera->bgCamIndex = camera->prevBgCamDataId;
+ camera->prevBgCamDataId = -1;
+ } else if (!(flags & CAM_CHANGE_SETTING_2)) {
+ if (!(sCameraSettings[camera->setting].flags & 0x40000000)) {
+ camera->prevBgCamDataId = camera->bgCamIndex;
+ }
+ camera->bgCamIndex = -1;
+ }
+
+ camera->setting = setting;
+
+ if (Camera_ChangeModeFlags(camera, camera->mode, true) >= 0) {
+ Camera_ResetActionFuncState(camera, camera->mode);
+ }
+
+ return setting;
+}
+
+s32 Camera_ChangeSetting(Camera* camera, s16 setting) {
+ s32 settingChangeSuccessful = Camera_ChangeSettingFlags(camera, setting, 0);
+
+ if (settingChangeSuccessful >= 0) {
+ camera->bgCamIndex = -1;
+ }
+ return settingChangeSuccessful;
+}
+
+s32 Camera_ChangeActorCsCamIndex(Camera* camera, s32 bgCamIndex) {
+ s16 setting;
+
+ if ((bgCamIndex == -1) || (bgCamIndex == camera->bgCamIndex)) {
+ camera->behaviorFlags |= CAM_BEHAVIOR_BGCAM_2;
+ return -1;
+ }
+
+ if (bgCamIndex < 0) {
+ setting = sGlobalCamDataSettingsPtr[bgCamIndex];
+ } else if (!(camera->behaviorFlags & CAM_BEHAVIOR_BGCAM_2)) {
+ setting = Camera_GetBgCamOrActorCsCamSetting(camera, bgCamIndex);
+ } else {
+ return -1;
+ }
+
+ camera->behaviorFlags |= CAM_BEHAVIOR_BGCAM_2;
+
+ // Sets camera setting based on bg/scene data
+ if ((Camera_ChangeSettingFlags(camera, setting, CAM_CHANGE_SETTING_2 | CAM_CHANGE_SETTING_0) >= 0) ||
+ (sCameraSettings[camera->setting].flags & 0x80000000)) {
+ camera->bgCamIndex = bgCamIndex;
+ camera->behaviorFlags |= CAM_BEHAVIOR_BGCAM_1;
+ Camera_ResetActionFuncState(camera, camera->mode);
+ }
+
+ return bgCamIndex | 0x80000000;
+}
+
+Vec3s* Camera_GetInputDir(Vec3s* dst, Camera* camera) {
+ *dst = camera->inputDir;
+ return dst;
+}
+
+s16 Camera_GetInputDirPitch(Camera* camera) {
+ Vec3s dir;
+
+ Camera_GetInputDir(&dir, camera);
+ return dir.x;
+}
+
+s16 Camera_GetInputDirYaw(Camera* camera) {
+ Vec3s dir;
+
+ Camera_GetInputDir(&dir, camera);
+ return dir.y;
+}
+
+Vec3s* Camera_GetCamDir(Vec3s* dst, Camera* camera) {
+ *dst = camera->camDir;
+ return dst;
+}
+
+s16 Camera_GetCamDirPitch(Camera* camera) {
+ Vec3s camDir;
+
+ Camera_GetCamDir(&camDir, camera);
+ return camDir.x;
+}
+
+s16 Camera_GetCamDirYaw(Camera* camera) {
+ Vec3s camDir;
+
+ Camera_GetCamDir(&camDir, camera);
+ return camDir.y;
+}
+
+s32 Camera_AddQuake(Camera* camera, s32 arg1, s16 y, s32 countdown) {
+ s16 quakeIndex = Quake_Request(camera, QUAKE_TYPE_3);
+
+ if (quakeIndex == 0) {
+ return false;
+ }
+
+ Quake_SetSpeed(quakeIndex, 25000);
+ Quake_SetPerturbations(quakeIndex, y, 0, 0, 0);
+ Quake_SetDuration(quakeIndex, countdown);
+ return true;
+}
+
+s32 Camera_SetViewParam(Camera* camera, s32 viewFlag, void* param) {
+ s32 pad[3];
+
+ if (param != NULL) {
+ switch (viewFlag) {
+ case CAM_VIEW_AT:
+ camera->viewFlags &= ~(CAM_VIEW_TARGET_POS | CAM_VIEW_TARGET | CAM_VIEW_AT);
+ camera->at = *(Vec3f*)param;
+ break;
+
+ case CAM_VIEW_TARGET_POS:
+ camera->viewFlags &= ~(CAM_VIEW_TARGET_POS | CAM_VIEW_TARGET | CAM_VIEW_AT);
+ camera->targetPosRot.pos = *(Vec3f*)param;
+ break;
+
+ case CAM_VIEW_TARGET:
+ camera->target = (Actor*)param;
+ camera->viewFlags &= ~(CAM_VIEW_TARGET_POS | CAM_VIEW_TARGET | CAM_VIEW_AT);
+ break;
+
+ case CAM_VIEW_EYE:
+ camera->eye = camera->eyeNext = *(Vec3f*)param;
+ break;
+
+ case CAM_VIEW_UP:
+ camera->up = *(Vec3f*)param;
+ break;
+
+ case CAM_VIEW_ROLL:
+ camera->roll = CAM_DEG_TO_BINANG(*(f32*)param);
+ break;
+
+ case CAM_VIEW_FOV:
+ camera->fov = *(f32*)param;
+ break;
+
+ default:
+ return false;
+ }
+ camera->viewFlags |= viewFlag;
+ } else {
+ return false;
+ }
+ return true;
+}
+
+s32 Camera_UnsetViewFlag(Camera* camera, s16 viewFlag) {
+ camera->viewFlags &= ~viewFlag;
+ return true;
+}
+
+s32 Camera_OverwriteStateFlags(Camera* camera, s16 stateFlags) {
+ camera->stateFlags = stateFlags;
+ return true;
+}
+
+s32 Camera_ResetActionFuncStateUnused(Camera* camera) {
+ camera->animState = 0;
+ return true;
+}
+
+/**
+ * Unused Remnant of OoT. `CutsceneCameraPoint` struct no longer exists.
+ */
+s32 Camera_SetCsParams(Camera* camera, void* atPoints, void* eyePoints, Player* player, s16 relativeToPlayer) {
+ return true;
+}
+
+s16 Camera_SetStateFlag(Camera* camera, s16 flags) {
+ camera->stateFlags |= flags;
+ return camera->stateFlags;
+}
+
+s16 Camera_UnsetStateFlag(Camera* camera, s16 flags) {
+ camera->stateFlags &= ~flags;
+ return camera->stateFlags;
+}
+
+s32 Camera_ChangeDoorCam(Camera* camera, Actor* doorActor, s16 bgCamIndex, f32 arg3, s16 timer1, s16 timer2,
+ s16 timer3) {
+ DoorParams* doorParams = &camera->paramData.doorParams;
+
+ if (camera->setting == CAM_SET_DOORC) {
+ return 0;
+ }
+
+ doorParams->doorActor = doorActor;
+ doorParams->timer1 = timer1;
+ doorParams->timer2 = timer2;
+ doorParams->timer3 = timer3;
+ doorParams->bgCamIndex = bgCamIndex;
+
+ if (bgCamIndex == -99) {
+ Camera_ResetActionFuncState(camera, camera->mode);
+ return -99;
+ }
+
+ if (bgCamIndex == -1) {
+ Camera_ChangeSettingFlags(camera, CAM_SET_DOORC, 0);
+ } else if (bgCamIndex == -2) {
+ Camera_ChangeSettingFlags(camera, CAM_SET_SPIRAL_DOOR, 0);
+ } else {
+ camera->nextCamSceneDataId = bgCamIndex;
+ camera->doorTimer1 = timer1;
+ camera->doorTimer2 = timer2 + timer3;
+ }
+
+ Camera_ResetActionFuncState(camera, camera->mode);
+ return -1;
+}
+
+s32 Camera_Copy(Camera* dstCam, Camera* srcCam) {
+ s32 pad;
+
+ dstCam->focalActorAtOffset.z = 0.0f;
+ dstCam->focalActorAtOffset.y = 0.0f;
+ dstCam->focalActorAtOffset.x = 0.0f;
+ dstCam->atLerpStepScale = 0.1f;
+ dstCam->at = srcCam->at;
+
+ dstCam->eye = dstCam->eyeNext = srcCam->eye;
+
+ dstCam->dist = OLib_Vec3fDist(&dstCam->at, &dstCam->eye);
+ dstCam->fov = srcCam->fov;
+ dstCam->roll = srcCam->roll;
+ Camera_SetUpdateRatesSlow(dstCam);
+
+ if (dstCam->focalActor != NULL) {
+ if (dstCam->focalActor == &GET_PLAYER(dstCam->play)->actor) {
+ Actor_GetWorldPosShapeRot(&dstCam->focalActorPosRot, dstCam->focalActor);
+ } else {
+ Actor_GetWorld(&dstCam->focalActorPosRot, dstCam->focalActor);
+ }
+ Camera_SetFocalActorAtOffset(dstCam, &dstCam->focalActorPosRot.pos);
+ }
+ return true;
+}
+
+/**
+ * Unused Remnant of OoT/Debug
+ */
+s32 Camera_IsDbgCamEnabled(void) {
+ return false;
+}
+
+Vec3f* Camera_GetQuakeOffset(Vec3f* quakeOffset, Camera* camera) {
+ *quakeOffset = camera->quakeOffset;
+
+ return quakeOffset;
+}
+
+void Camera_SetCameraData(Camera* camera, s16 setDataFlags, void* data0, void* data1, s16 data2, s16 data3) {
+ if (setDataFlags & 1) {
+ camera->data0 = data0;
+ }
+
+ if (setDataFlags & 2) {
+ camera->data1 = data1;
+ }
+
+ if (setDataFlags & 4) {
+ camera->data2 = data2;
+ }
+
+ if (setDataFlags & 8) {
+ camera->data3 = data3;
+ }
+}
+
+s32 Camera_GetNegOne(void) {
+ return sCameraNegOne;
+}
+
+s16 func_800E0238(Camera* camera) {
+ Camera_SetStateFlag(camera, CAM_STATE_3);
+ if ((camera->camId == CAM_ID_MAIN) && (camera->play->activeCamId != CAM_ID_MAIN)) {
+ Camera_SetStateFlag(GET_ACTIVE_CAM(camera->play), CAM_STATE_3);
+ return camera->play->activeCamId;
+ } else {
+ return camera->camId;
+ }
+}
+
+void Camera_SetFocalActor(Camera* camera, Actor* actor) {
+ camera->focalActor = actor;
+ if (actor == &GET_PLAYER(camera->play)->actor) {
+ Actor_GetWorldPosShapeRot(&camera->focalActorPosRot, actor);
+ } else {
+ Actor_GetWorld(&camera->focalActorPosRot, camera->focalActor);
+ }
+
+ camera->animState = 0;
+}
+
+void Camera_SetTargetActor(Camera* camera, Actor* actor) {
+ camera->target = actor;
+ camera->animState = 20;
+}
+
+f32 Camera_GetWaterYPos(Camera* camera) {
+ if (camera->stateFlags & CAM_STATE_UNDERWATER) {
+ return camera->waterYPos;
+ } else {
+ return BGCHECK_Y_MIN;
+ }
+}
+
+void func_800E0348(Camera* camera) {
+ if (!RELOAD_PARAMS(camera)) {
+ camera->animState = 999;
+ Camera_SetStateFlag(camera, CAM_STATE_10 | CAM_STATE_4 | CAM_STATE_2 | CAM_STATE_CHECK_WATER);
+ } else {
+ camera->animState = 666;
+ }
+}
diff --git a/src/code/z_camera_data.inc.c b/src/code/z_camera_data.inc.c
index 3df77c0c4..6e1501fd8 100644
--- a/src/code/z_camera_data.inc.c
+++ b/src/code/z_camera_data.inc.c
@@ -3795,12 +3795,12 @@ s32 sCameraHudVisibility = 2;
s32 sCameraLetterboxSize = 32;
s32 sCameraNegOne = -1;
-// VecSph yaw data
+// VecGeo yaw data
s16 D_801B9E18[] = {
0x0AAA, 0xF556, 0x1555, 0xEAAB, 0x2AAA, 0xD556, 0x3FFF, 0xC001, 0x5555, 0xAAAB, 0x6AAA, 0x9556, 0x7FFF, 0x0000,
};
-// VecSph pitch data
+// VecGeo pitch data
s16 D_801B9E34[] = {
0x0000, 0x02C6, 0x058C, 0x0000, 0x0000, 0xFD3A, 0x0000, 0x0852, 0x0000, 0x0000, 0x0B18, 0x02C6, 0xFA74, 0x0000,
};
diff --git a/src/code/z_cheap_proc.c b/src/code/z_cheap_proc.c
index 2b4f67cae..82303a172 100644
--- a/src/code/z_cheap_proc.c
+++ b/src/code/z_cheap_proc.c
@@ -10,7 +10,7 @@ void Gfx_DrawDListOpa(PlayState* play, Gfx* dlist) {
dl = POLY_OPA_DISP;
- gSPDisplayList(&dl[0], &sSetupDL[6 * 0x19]);
+ gSPDisplayList(&dl[0], gSetupDLs[SETUPDL_25]);
gSPMatrix(&dl[1], Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(&dl[2], dlist);
@@ -29,7 +29,7 @@ void Gfx_DrawDListXlu(PlayState* play, Gfx* dlist) {
dl = POLY_XLU_DISP;
- gSPDisplayList(&dl[0], &sSetupDL[6 * 0x19]);
+ gSPDisplayList(&dl[0], gSetupDLs[SETUPDL_25]);
gSPMatrix(&dl[1], Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(&dl[2], dlist);
diff --git a/src/code/z_debug_display.c b/src/code/z_debug_display.c
index d9f20d72b..9dd4d86b2 100644
--- a/src/code/z_debug_display.c
+++ b/src/code/z_debug_display.c
@@ -67,7 +67,7 @@ void DebugDisplay_DrawObjects(PlayState* play) {
void DebugDisplay_DrawSpriteI8(DebugDispObject* dispObj, void* texture, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C6FC(play->state.gfxCtx);
+ Gfx_SetupDL47_Xlu(play->state.gfxCtx);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, dispObj->color.r, dispObj->color.g, dispObj->color.b, dispObj->color.a);
Matrix_Translate(dispObj->pos.x, dispObj->pos.y, dispObj->pos.z, MTXMODE_NEW);
@@ -90,7 +90,7 @@ Lights1 sDebugDisplayLight1 = gdSPDefLights1(128, 128, 128, 255, 255, 255, 73, 7
void DebugDisplay_DrawPolygon(DebugDispObject* dispObj, void* dList, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C588(play->state.gfxCtx);
+ Gfx_SetupDL4_Xlu(play->state.gfxCtx);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, dispObj->color.r, dispObj->color.g, dispObj->color.b, dispObj->color.a);
@@ -113,7 +113,7 @@ void DebugDisplay_DrawPath(PlayState* play, Path* path) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C560(play->state.gfxCtx);
+ Gfx_SetupDL38_Xlu(play->state.gfxCtx);
gSPMatrix(POLY_XLU_DISP++, &gIdentityMtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_XLU_DISP++, DebugDisplay_PathDisplayList(play->state.gfxCtx, path));
diff --git a/src/code/z_demo.c b/src/code/z_demo.c
index 79270adce..da965969f 100644
--- a/src/code/z_demo.c
+++ b/src/code/z_demo.c
@@ -202,10 +202,10 @@ void CutsceneCmd_Misc(PlayState* play, CutsceneContext* csCtx, CsCmdMisc* cmd) {
case CS_MISC_EARTHQUAKE_MEDIUM:
func_8019F128(NA_SE_EV_EARTHQUAKE_LAST - SFX_FLAG);
if (isFirstFrame) {
- sCutsceneQuakeIndex = Quake_Add(GET_ACTIVE_CAM(play), QUAKE_TYPE_6);
+ sCutsceneQuakeIndex = Quake_Request(GET_ACTIVE_CAM(play), QUAKE_TYPE_6);
Quake_SetSpeed(sCutsceneQuakeIndex, 22000);
- Quake_SetQuakeValues(sCutsceneQuakeIndex, 6, 4, 0, 0);
- Quake_SetCountdown(sCutsceneQuakeIndex, 800);
+ Quake_SetPerturbations(sCutsceneQuakeIndex, 6, 4, 0, 0);
+ Quake_SetDuration(sCutsceneQuakeIndex, 800);
}
break;
@@ -310,10 +310,10 @@ void CutsceneCmd_Misc(PlayState* play, CutsceneContext* csCtx, CsCmdMisc* cmd) {
case CS_MISC_EARTHQUAKE_STRONG:
func_8019F128(NA_SE_EV_EARTHQUAKE_LAST2 - SFX_FLAG);
if (isFirstFrame) {
- sCutsceneQuakeIndex = Quake_Add(GET_ACTIVE_CAM(play), QUAKE_TYPE_6);
+ sCutsceneQuakeIndex = Quake_Request(GET_ACTIVE_CAM(play), QUAKE_TYPE_6);
Quake_SetSpeed(sCutsceneQuakeIndex, 30000);
- Quake_SetQuakeValues(sCutsceneQuakeIndex, 20, 10, 0, 0);
- Quake_SetCountdown(sCutsceneQuakeIndex, 800);
+ Quake_SetPerturbations(sCutsceneQuakeIndex, 20, 10, 0, 0);
+ Quake_SetDuration(sCutsceneQuakeIndex, 800);
}
break;
@@ -372,10 +372,10 @@ void CutsceneCmd_Misc(PlayState* play, CutsceneContext* csCtx, CsCmdMisc* cmd) {
case CS_MISC_EARTHQUAKE_WEAK:
func_8019F128(NA_SE_EV_EARTHQUAKE_LAST - SFX_FLAG);
if (isFirstFrame) {
- sCutsceneQuakeIndex = Quake_Add(GET_ACTIVE_CAM(play), QUAKE_TYPE_6);
+ sCutsceneQuakeIndex = Quake_Request(GET_ACTIVE_CAM(play), QUAKE_TYPE_6);
Quake_SetSpeed(sCutsceneQuakeIndex, 22000);
- Quake_SetQuakeValues(sCutsceneQuakeIndex, 2, 1, 0, 0);
- Quake_SetCountdown(sCutsceneQuakeIndex, 800);
+ Quake_SetPerturbations(sCutsceneQuakeIndex, 2, 1, 0, 0);
+ Quake_SetDuration(sCutsceneQuakeIndex, 800);
}
break;
diff --git a/src/code/z_draw.c b/src/code/z_draw.c
index a2686be8e..ace56a965 100644
--- a/src/code/z_draw.c
+++ b/src/code/z_draw.c
@@ -386,7 +386,7 @@ void GetItem_DrawBombchu(PlayState* play, s16 drawId) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C214(play->state.gfxCtx);
+ Gfx_SetupDL23_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, sDrawItemTable[drawId].drawResources[0]);
@@ -399,12 +399,12 @@ void GetItem_DrawPoes(PlayState* play, s16 drawId) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, sDrawItemTable[drawId].drawResources[0]);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_XLU_DISP++, sDrawItemTable[drawId].drawResources[1]);
@@ -430,12 +430,12 @@ void GetItem_DrawFairyBottle(PlayState* play, s16 drawId) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, sDrawItemTable[drawId].drawResources[0]);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_XLU_DISP++, sDrawItemTable[drawId].drawResources[1]);
@@ -459,12 +459,12 @@ void GetItem_DrawSkullToken(PlayState* play, s16 drawId) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, sDrawItemTable[drawId].drawResources[0]);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPSegment(POLY_XLU_DISP++, 0x08,
Gfx_TwoTexScroll(play->state.gfxCtx, G_TX_RENDERTILE, play->state.frames * 0, -(play->state.frames * 5),
@@ -480,12 +480,12 @@ void GetItem_DrawCompass(PlayState* play, s16 drawId) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, sDrawItemTable[drawId].drawResources[0]);
- POLY_XLU_DISP = Gfx_CallSetupDL(POLY_XLU_DISP, 5);
+ POLY_XLU_DISP = Gfx_SetupDL(POLY_XLU_DISP, SETUPDL_5);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_XLU_DISP++, sDrawItemTable[drawId].drawResources[1]);
@@ -498,7 +498,7 @@ void GetItem_DrawPotion(PlayState* play, s16 drawId) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08,
Gfx_TwoTexScroll(play->state.gfxCtx, G_TX_RENDERTILE, -play->state.frames, play->state.frames, 32, 32, 1,
@@ -509,7 +509,7 @@ void GetItem_DrawPotion(PlayState* play, s16 drawId) {
gSPDisplayList(POLY_OPA_DISP++, sDrawItemTable[drawId].drawResources[2]);
gSPDisplayList(POLY_OPA_DISP++, sDrawItemTable[drawId].drawResources[3]);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_XLU_DISP++, sDrawItemTable[drawId].drawResources[4]);
@@ -523,7 +523,7 @@ void GetItem_DrawGoronSword(PlayState* play, s16 drawId) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08,
Gfx_TwoTexScroll(play->state.gfxCtx, G_TX_RENDERTILE, play->state.frames * 1, play->state.frames * 0, 32,
@@ -539,7 +539,7 @@ void GetItem_DrawDekuNuts(PlayState* play, s16 drawId) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08,
Gfx_TwoTexScroll(play->state.gfxCtx, G_TX_RENDERTILE, play->state.frames * 6, play->state.frames * 6, 32,
@@ -555,7 +555,7 @@ void GetItem_DrawRecoveryHeart(PlayState* play, s16 drawId) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPSegment(POLY_XLU_DISP++, 0x08,
Gfx_TwoTexScroll(play->state.gfxCtx, G_TX_RENDERTILE, play->state.frames * 0, -(play->state.frames * 3),
@@ -571,7 +571,7 @@ void GetItem_DrawFish(PlayState* play, s16 drawId) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPSegment(POLY_XLU_DISP++, 0x08,
Gfx_TwoTexScroll(play->state.gfxCtx, G_TX_RENDERTILE, play->state.frames * 0, play->state.frames * 1, 32,
@@ -590,7 +590,7 @@ void GetItem_DrawOpa0(PlayState* play, s16 drawId) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, sDrawItemTable[drawId].drawResources[0]);
@@ -606,12 +606,12 @@ void GetItem_DrawOpa0Xlu1(PlayState* play, s16 drawId) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, sDrawItemTable[drawId].drawResources[0]);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_XLU_DISP++, sDrawItemTable[drawId].drawResources[1]);
@@ -627,7 +627,7 @@ void GetItem_DrawOpa01(PlayState* play, s16 drawId) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, sDrawItemTable[drawId].drawResources[0]);
@@ -644,7 +644,7 @@ void GetItem_DrawXlu01(PlayState* play, s16 drawId) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_XLU_DISP++, sDrawItemTable[drawId].drawResources[0]);
@@ -659,12 +659,12 @@ void GetItem_DrawSeahorse(PlayState* play, s16 drawId) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, sDrawItemTable[drawId].drawResources[0]);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_XLU_DISP++, sDrawItemTable[drawId].drawResources[1]);
@@ -685,8 +685,8 @@ void GetItem_DrawFairyContainer(PlayState* play, s16 drawId) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
AnimatedMat_Draw(play, Lib_SegmentedToVirtual(gGiFairyBottleTexAnim));
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
@@ -710,8 +710,8 @@ void GetItem_DrawMoonsTear(PlayState* play, s16 drawId) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
AnimatedMat_Draw(play, Lib_SegmentedToVirtual(gGiMoonsTearTexAnim));
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
@@ -730,12 +730,12 @@ void GetItem_DrawMagicArrow(PlayState* play, s16 drawId) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, sDrawItemTable[drawId].drawResources[0]);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_XLU_DISP++, sDrawItemTable[drawId].drawResources[1]);
@@ -749,7 +749,7 @@ void GetItem_DrawUpgrades(PlayState* play, s16 drawId) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, sDrawItemTable[drawId].drawResources[1]);
@@ -765,13 +765,13 @@ void GetItem_DrawRupee(PlayState* play, s16 drawId) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, sDrawItemTable[drawId].drawResources[1]);
gSPDisplayList(POLY_OPA_DISP++, sDrawItemTable[drawId].drawResources[0]);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_XLU_DISP++, sDrawItemTable[drawId].drawResources[3]);
@@ -786,13 +786,13 @@ void GetItem_DrawSmallRupee(PlayState* play, s16 drawId) {
OPEN_DISPS(play->state.gfxCtx);
Matrix_Scale(0.7f, 0.7f, 0.7f, MTXMODE_APPLY);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, sDrawItemTable[drawId].drawResources[1]);
gSPDisplayList(POLY_OPA_DISP++, sDrawItemTable[drawId].drawResources[0]);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_XLU_DISP++, sDrawItemTable[drawId].drawResources[3]);
@@ -806,7 +806,7 @@ void GetItem_DrawWallet(PlayState* play, s16 drawId) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, sDrawItemTable[drawId].drawResources[1]);
@@ -831,7 +831,7 @@ void GetItem_DrawRemains(PlayState* play, s16 drawId) {
gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.status[objectIndex].segment);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
Matrix_Scale(0.02f, 0.02f, 0.02f, MTXMODE_APPLY);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
diff --git a/src/code/z_eff_blure.c b/src/code/z_eff_blure.c
index 5f0221969..f25273279 100644
--- a/src/code/z_eff_blure.c
+++ b/src/code/z_eff_blure.c
@@ -114,23 +114,17 @@ void EffectBlure_Init1(void* thisx, void* initParamsx) {
EffectBlureInit1* initParams = (EffectBlureInit1*)initParamsx;
if ((this != NULL) && (initParams != NULL)) {
+ s32 i;
+
EffectBlure_InitElements(this);
- this->p1StartColor.r = initParams->p1StartColor[0];
- this->p2StartColor.r = initParams->p2StartColor[0];
- this->p1EndColor.r = initParams->p1EndColor[0];
- this->p2EndColor.r = initParams->p2EndColor[0];
- this->p1StartColor.g = initParams->p1StartColor[1];
- this->p2StartColor.g = initParams->p2StartColor[1];
- this->p1EndColor.g = initParams->p1EndColor[1];
- this->p2EndColor.g = initParams->p2EndColor[1];
- this->p1StartColor.b = initParams->p1StartColor[2];
- this->p2StartColor.b = initParams->p2StartColor[2];
- this->p1EndColor.b = initParams->p1EndColor[2];
- this->p2EndColor.b = initParams->p2EndColor[2];
- this->p1StartColor.a = initParams->p1StartColor[3];
- this->p2StartColor.a = initParams->p2StartColor[3];
- this->p1EndColor.a = initParams->p1EndColor[3];
- this->p2EndColor.a = initParams->p2EndColor[3];
+
+ for (i = 0; i < 4; i++) {
+ this->p1StartColor[i] = initParams->p1StartColor[i];
+ this->p2StartColor[i] = initParams->p2StartColor[i];
+ this->p1EndColor[i] = initParams->p1EndColor[i];
+ this->p2EndColor[i] = initParams->p2EndColor[i];
+ }
+
this->elemDuration = initParams->elemDuration;
this->unkFlag = initParams->unkFlag;
this->calcMode = initParams->calcMode;
@@ -155,23 +149,17 @@ void EffectBlure_Init2(void* thisx, void* initParamsx) {
EffectBlureInit2* initParams = (EffectBlureInit2*)initParamsx;
if ((this != NULL) && (initParams != NULL)) {
+ s32 i;
+
EffectBlure_InitElements(this);
- this->p1StartColor.r = initParams->p1StartColor[0];
- this->p2StartColor.r = initParams->p2StartColor[0];
- this->p1EndColor.r = initParams->p1EndColor[0];
- this->p2EndColor.r = initParams->p2EndColor[0];
- this->p1StartColor.g = initParams->p1StartColor[1];
- this->p2StartColor.g = initParams->p2StartColor[1];
- this->p1EndColor.g = initParams->p1EndColor[1];
- this->p2EndColor.g = initParams->p2EndColor[1];
- this->p1StartColor.b = initParams->p1StartColor[2];
- this->p2StartColor.b = initParams->p2StartColor[2];
- this->p1EndColor.b = initParams->p1EndColor[2];
- this->p2EndColor.b = initParams->p2EndColor[2];
- this->p1StartColor.a = initParams->p1StartColor[3];
- this->p2StartColor.a = initParams->p2StartColor[3];
- this->p1EndColor.a = initParams->p1EndColor[3];
- this->p2EndColor.a = initParams->p2EndColor[3];
+
+ for (i = 0; i < 4; i++) {
+ this->p1StartColor[i] = initParams->p1StartColor[i];
+ this->p2StartColor[i] = initParams->p2StartColor[i];
+ this->p1EndColor[i] = initParams->p1EndColor[i];
+ this->p2EndColor[i] = initParams->p2EndColor[i];
+ }
+
this->elemDuration = initParams->elemDuration;
this->unkFlag = initParams->unkFlag;
this->calcMode = initParams->calcMode;
@@ -372,21 +360,21 @@ void EffectBlure_GetComputedValues(EffectBlure* this, s32 index, f32 ratio, Vec3
color1->r = color1->g = color1->b = color1->a = 255;
color2->r = color2->g = color2->b = color2->a = 255;
} else {
- color1->r = func_800B0A24(this->p1StartColor.r, this->p1EndColor.r, ratio);
- color1->g = func_800B0A24(this->p1StartColor.g, this->p1EndColor.g, ratio);
- color1->b = func_800B0A24(this->p1StartColor.b, this->p1EndColor.b, ratio);
- color1->a = func_800B0A24(this->p1StartColor.a, this->p1EndColor.a, ratio);
- color2->r = func_800B0A24(this->p2StartColor.r, this->p2EndColor.r, ratio);
- color2->g = func_800B0A24(this->p2StartColor.g, this->p2EndColor.g, ratio);
- color2->b = func_800B0A24(this->p2StartColor.b, this->p2EndColor.b, ratio);
- color2->a = func_800B0A24(this->p2StartColor.a, this->p2EndColor.a, ratio);
+ color1->r = func_800B0A24(this->p1StartColor[0], this->p1EndColor[0], ratio);
+ color1->g = func_800B0A24(this->p1StartColor[1], this->p1EndColor[1], ratio);
+ color1->b = func_800B0A24(this->p1StartColor[2], this->p1EndColor[2], ratio);
+ color1->a = func_800B0A24(this->p1StartColor[3], this->p1EndColor[3], ratio);
+ color2->r = func_800B0A24(this->p2StartColor[0], this->p2EndColor[0], ratio);
+ color2->g = func_800B0A24(this->p2StartColor[1], this->p2EndColor[1], ratio);
+ color2->b = func_800B0A24(this->p2StartColor[2], this->p2EndColor[2], ratio);
+ color2->a = func_800B0A24(this->p2StartColor[3], this->p2EndColor[3], ratio);
}
}
void EffectBlure_SetupSmooth(EffectBlure* this, GraphicsContext* gfxCtx) {
OPEN_DISPS(gfxCtx);
- POLY_XLU_DISP = Gfx_CallSetupDL(POLY_XLU_DISP, 0x26);
+ POLY_XLU_DISP = Gfx_SetupDL(POLY_XLU_DISP, SETUPDL_38);
CLOSE_DISPS(gfxCtx);
}
@@ -705,7 +693,7 @@ void EffectBlure_DrawSmooth(EffectBlure* this2, GraphicsContext* gfxCtx) {
void EffectBlure_SetupSimple(GraphicsContext* gfxCtx, EffectBlure* this, Vtx* vtx) {
OPEN_DISPS(gfxCtx);
- POLY_XLU_DISP = Gfx_CallSetupDL(POLY_XLU_DISP, 0x26);
+ POLY_XLU_DISP = Gfx_SetupDL(POLY_XLU_DISP, SETUPDL_38);
CLOSE_DISPS(gfxCtx);
}
@@ -714,7 +702,7 @@ void EffectBlure_SetupSimpleAlt(GraphicsContext* gfxCtx, EffectBlure* this, Vtx*
OPEN_DISPS(gfxCtx);
gDPPipeSync(POLY_XLU_DISP++);
- POLY_XLU_DISP = Gfx_CallSetupDL(POLY_XLU_DISP, 0x26);
+ POLY_XLU_DISP = Gfx_SetupDL(POLY_XLU_DISP, SETUPDL_38);
gDPSetCycleType(POLY_XLU_DISP++, G_CYC_2CYCLE);
gDPSetTextureLUT(POLY_XLU_DISP++, G_TT_NONE);
@@ -938,7 +926,7 @@ void EffectBlure_Draw(void* thisx, GraphicsContext* gfxCtx) {
if (this->numElements != 0) {
if (this->flags == 0) {
- func_8012C560(gfxCtx);
+ Gfx_SetupDL38_Xlu(gfxCtx);
gDPPipeSync(POLY_XLU_DISP++);
vtx = GRAPH_ALLOC(gfxCtx, 32 * sizeof(Vtx));
@@ -992,19 +980,19 @@ void EffectBlure_Draw(void* thisx, GraphicsContext* gfxCtx) {
vtx[j].v.flag = 0;
vtx[j].v.tc[0] = 0;
vtx[j].v.tc[1] = 0;
- vtx[j].v.cn[0] = func_800B0A24(this->p1StartColor.r, this->p1EndColor.r, ratio);
- vtx[j].v.cn[1] = func_800B0A24(this->p1StartColor.g, this->p1EndColor.g, ratio);
- vtx[j].v.cn[2] = func_800B0A24(this->p1StartColor.b, this->p1EndColor.b, ratio);
- vtx[j].v.cn[3] = func_800B0A24(this->p1StartColor.a, this->p1EndColor.a, ratio);
+ vtx[j].v.cn[0] = func_800B0A24(this->p1StartColor[0], this->p1EndColor[0], ratio);
+ vtx[j].v.cn[1] = func_800B0A24(this->p1StartColor[1], this->p1EndColor[1], ratio);
+ vtx[j].v.cn[2] = func_800B0A24(this->p1StartColor[2], this->p1EndColor[2], ratio);
+ vtx[j].v.cn[3] = func_800B0A24(this->p1StartColor[3], this->p1EndColor[3], ratio);
j++;
vtx[j].v.flag = 0;
vtx[j].v.tc[0] = 0;
vtx[j].v.tc[1] = 0;
- vtx[j].v.cn[0] = func_800B0A24(this->p2StartColor.r, this->p2EndColor.r, ratio);
- vtx[j].v.cn[1] = func_800B0A24(this->p2StartColor.g, this->p2EndColor.g, ratio);
- vtx[j].v.cn[2] = func_800B0A24(this->p2StartColor.b, this->p2EndColor.b, ratio);
- vtx[j].v.cn[3] = func_800B0A24(this->p2StartColor.a, this->p2EndColor.a, ratio);
+ vtx[j].v.cn[0] = func_800B0A24(this->p2StartColor[0], this->p2EndColor[0], ratio);
+ vtx[j].v.cn[1] = func_800B0A24(this->p2StartColor[1], this->p2EndColor[1], ratio);
+ vtx[j].v.cn[2] = func_800B0A24(this->p2StartColor[2], this->p2EndColor[2], ratio);
+ vtx[j].v.cn[3] = func_800B0A24(this->p2StartColor[3], this->p2EndColor[3], ratio);
j++;
}
}
diff --git a/src/code/z_eff_footmark.c b/src/code/z_eff_footmark.c
index bcf6ff824..806cc45e0 100644
--- a/src/code/z_eff_footmark.c
+++ b/src/code/z_eff_footmark.c
@@ -105,7 +105,7 @@ void EffFootmark_Draw(PlayState* play) {
s32 i;
GraphicsContext* gfxCtx = play->state.gfxCtx;
- func_8012C448(play->state.gfxCtx);
+ Gfx_SetupDL44_Xlu(play->state.gfxCtx);
gSPDisplayList(gfxCtx->polyXlu.p++, gEffFootprintMaterialDL);
diff --git a/src/code/z_eff_shield_particle.c b/src/code/z_eff_shield_particle.c
index 90833947b..e15874a78 100644
--- a/src/code/z_eff_shield_particle.c
+++ b/src/code/z_eff_shield_particle.c
@@ -149,7 +149,7 @@ void EffectShieldParticle_Draw(void* thisx, GraphicsContext* gfxCtx) {
OPEN_DISPS(gfxCtx);
if (this != NULL) {
- POLY_XLU_DISP = Gfx_CallSetupDL(POLY_XLU_DISP, 0x26);
+ POLY_XLU_DISP = Gfx_SetupDL(POLY_XLU_DISP, SETUPDL_38);
gDPSetCycleType(POLY_XLU_DISP++, G_CYC_2CYCLE);
gDPPipeSync(POLY_XLU_DISP++);
diff --git a/src/code/z_eff_spark.c b/src/code/z_eff_spark.c
index fdd25a6b4..77b40e3ed 100644
--- a/src/code/z_eff_spark.c
+++ b/src/code/z_eff_spark.c
@@ -148,7 +148,7 @@ void EffectSpark_Draw(void* thisx, GraphicsContext* gfxCtx) {
if (this != NULL) {
gSPMatrix(POLY_XLU_DISP++, &gIdentityMtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- POLY_XLU_DISP = Gfx_CallSetupDL(POLY_XLU_DISP, 0x26);
+ POLY_XLU_DISP = Gfx_SetupDL(POLY_XLU_DISP, SETUPDL_38);
gDPSetCycleType(POLY_XLU_DISP++, G_CYC_2CYCLE);
gDPPipeSync(POLY_XLU_DISP++);
diff --git a/src/code/z_eff_tire_mark.c b/src/code/z_eff_tire_mark.c
index d7754c5a7..d14d6926c 100644
--- a/src/code/z_eff_tire_mark.c
+++ b/src/code/z_eff_tire_mark.c
@@ -231,7 +231,7 @@ void EffectTireMark_Draw(void* thisx, GraphicsContext* gfxCtx) {
if (vtx != NULL) {
gSPMatrix(POLY_OPA_DISP++, &gIdentityMtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- POLY_OPA_DISP = Gfx_CallSetupDL(POLY_OPA_DISP++, 0x2C);
+ POLY_OPA_DISP = Gfx_SetupDL(POLY_OPA_DISP++, SETUPDL_44);
gDPSetRenderMode(POLY_OPA_DISP++, G_RM_PASS, G_RM_ZB_CLD_SURF2);
gDPLoadTextureBlock(POLY_OPA_DISP++, gameplay_keep_Tex_014570, G_IM_FMT_I, G_IM_SIZ_8b, 64, 32, 0,
diff --git a/src/code/z_effect_soft_sprite_old_init.c b/src/code/z_effect_soft_sprite_old_init.c
index 0b08f4dd0..17852c4c1 100644
--- a/src/code/z_effect_soft_sprite_old_init.c
+++ b/src/code/z_effect_soft_sprite_old_init.c
@@ -58,7 +58,7 @@ void EffectSs_DrawGEffect(PlayState* play, EffectSs* this, TexturePtr texture) {
if (mtx != NULL) {
gSPMatrix(POLY_XLU_DISP++, mtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(texture));
- func_8012C9BC(gfxCtx);
+ Gfx_SetupDL61_Xlu(gfxCtx);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, this->rgPrimColorR, this->rgPrimColorG, this->rgPrimColorB,
this->rgPrimColorA);
gDPSetEnvColor(POLY_XLU_DISP++, this->rgEnvColorR, this->rgEnvColorG, this->rgEnvColorB, this->rgEnvColorA);
diff --git a/src/code/z_en_hy_code.c b/src/code/z_en_hy_code.c
index 674f4bfa4..b5992dec4 100644
--- a/src/code/z_en_hy_code.c
+++ b/src/code/z_en_hy_code.c
@@ -69,13 +69,13 @@ EnDoor* EnHy_FindNearestDoor(Actor* actor, PlayState* play) {
do {
doorIter = SubS_FindActor(play, doorIter, ACTORCAT_DOOR, ACTOR_EN_DOOR);
door = (EnDoor*)doorIter;
- dist = Actor_WorldDistXYZToActor(actor, &door->dyna.actor);
+ dist = Actor_WorldDistXYZToActor(actor, &door->knobDoor.dyna.actor);
if (!isSetup || (dist < minDist)) {
nearestDoor = door;
minDist = dist;
isSetup = true;
}
- doorIter = door->dyna.actor.next;
+ doorIter = door->knobDoor.dyna.actor.next;
} while (doorIter != NULL);
if (1) {}
@@ -134,16 +134,16 @@ void func_800F0BB4(EnHy* enHy, PlayState* play, EnDoor* door, s16 arg3, s16 arg4
Vec3f offset;
f32 phi_f0;
- Actor_OffsetOfPointInActorCoords(&door->dyna.actor, &offset, &enHy->actor.world.pos);
+ Actor_OffsetOfPointInActorCoords(&door->knobDoor.dyna.actor, &offset, &enHy->actor.world.pos);
phi_f0 = (offset.z >= 0.0f) ? 1.0f : -1.0f;
animIndex = ((s8)phi_f0 < 0) ? 0 : 2;
EnHy_ChangeObjectAndAnim(enHy, play, (animIndex == 0) ? arg3 : arg4);
enHy->skelAnime.baseTransl = *enHy->skelAnime.jointTable;
enHy->skelAnime.prevTransl = *enHy->skelAnime.jointTable;
- enHy->skelAnime.moveFlags |= (ANIM_FLAG_UPDATEY | ANIM_FLAG_1);
+ enHy->skelAnime.moveFlags |= (ANIM_FLAG_UPDATE_Y | ANIM_FLAG_1);
AnimationContext_SetMoveActor(play, &enHy->actor, &enHy->skelAnime, 1.0f);
- door->unk_1A1 = 1;
- door->animIndex = animIndex;
+ door->knobDoor.playOpenAnim = true;
+ door->knobDoor.animIndex = animIndex;
}
s32 func_800F0CE4(EnHy* enHy, PlayState* play, ActorFunc draw, s16 arg3, s16 arg4, f32 arg5) {
@@ -157,7 +157,7 @@ s32 func_800F0CE4(EnHy* enHy, PlayState* play, ActorFunc draw, s16 arg3, s16 arg
if (door != NULL) {
ret = true;
func_800F0BB4(enHy, play, door, arg3, arg4);
- yaw = Math_Vec3f_Yaw(&enHy->actor.world.pos, &door->dyna.actor.world.pos);
+ yaw = Math_Vec3f_Yaw(&enHy->actor.world.pos, &door->knobDoor.dyna.actor.world.pos);
enHy->actor.world.pos.x += arg5 * Math_SinS(yaw);
enHy->actor.world.pos.z += arg5 * Math_CosS(yaw);
enHy->actor.world.rot.y = -yaw;
@@ -179,7 +179,7 @@ s32 func_800F0DD4(EnHy* enHy, PlayState* play, s16 arg2, s16 arg3) {
if (door != NULL) {
ret = true;
func_800F0BB4(enHy, play, door, arg2, arg3);
- enHy->actor.shape.rot.y = Math_Vec3f_Yaw(&enHy->actor.world.pos, &door->dyna.actor.world.pos);
+ enHy->actor.shape.rot.y = Math_Vec3f_Yaw(&enHy->actor.world.pos, &door->knobDoor.dyna.actor.world.pos);
enHy->actor.world.rot.y = enHy->actor.shape.rot.y;
enHy->actor.gravity = 0.0f;
enHy->actor.flags &= ~ACTOR_FLAG_1;
diff --git a/src/code/z_en_item00.c b/src/code/z_en_item00.c
index 44e8703a2..7b9e2ca34 100644
--- a/src/code/z_en_item00.c
+++ b/src/code/z_en_item00.c
@@ -783,7 +783,7 @@ void EnItem00_DrawRupee(EnItem00* this, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
func_800B8050(&this->actor, play, 0);
if (this->actor.params <= ITEM00_RUPEE_RED) {
@@ -834,7 +834,7 @@ void EnItem00_DrawSprite(EnItem00* this, PlayState* play) {
}
}
- POLY_OPA_DISP = func_8012C724(POLY_OPA_DISP);
+ POLY_OPA_DISP = Gfx_SetupDL66(POLY_OPA_DISP);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sItemDropTextures[texIndex]));
@@ -851,7 +851,7 @@ void EnItem00_DrawHeartContainer(EnItem00* this, PlayState* play) {
if (Object_GetIndex(&play->objectCtx, OBJECT_GI_HEARTS) == this->actor.objBankIndex) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
Matrix_Scale(20.0f, 20.0f, 20.0f, MTXMODE_APPLY);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_MODELVIEW | G_MTX_LOAD);
@@ -868,7 +868,7 @@ void EnItem00_DrawHeartPiece(EnItem00* this, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
func_800B8118(&this->actor, play, 0);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_MODELVIEW | G_MTX_LOAD);
diff --git a/src/code/z_eventmgr.c b/src/code/z_eventmgr.c
index 2575899ca..aec6fdbb0 100644
--- a/src/code/z_eventmgr.c
+++ b/src/code/z_eventmgr.c
@@ -402,13 +402,13 @@ s16 CutsceneManager_Start(s16 csId, Actor* actor) {
if (CutsceneManager_FindEntranceCsId() != csId) {
func_800E0348(retCam);
} else {
- Camera_ClearFlags(retCam, CAM_STATE_2);
+ Camera_UnsetStateFlag(retCam, CAM_STATE_2);
}
}
memcpy(subCam, retCam, sizeof(Camera));
subCam->camId = sCutsceneMgr.subCamId;
- Camera_ClearFlags(subCam, CAM_STATE_6 | CAM_STATE_0);
+ Camera_UnsetStateFlag(subCam, CAM_STATE_6 | CAM_STATE_0);
Play_ChangeCameraStatus(sCutsceneMgr.play, sCutsceneMgr.retCamId, CAM_STATUS_WAIT);
Play_ChangeCameraStatus(sCutsceneMgr.play, sCutsceneMgr.subCamId, CAM_STATUS_ACTIVE);
@@ -422,7 +422,7 @@ s16 CutsceneManager_Start(s16 csId, Actor* actor) {
sCutsceneMgr.length = csEntry->length;
} else {
if (csEntry->csCamId != CS_CAM_ID_NONE) {
- Camera_ChangeDataIdx(subCam, csEntry->csCamId);
+ Camera_ChangeActorCsCamIndex(subCam, csEntry->csCamId);
} else {
Camera_ChangeSetting(subCam, CAM_SET_FREE0);
}
diff --git a/src/code/z_fireobj.c b/src/code/z_fireobj.c
index 114e62cc7..5e93e1187 100644
--- a/src/code/z_fireobj.c
+++ b/src/code/z_fireobj.c
@@ -142,7 +142,7 @@ void FireObj_Draw(PlayState* play, FireObj* fire) {
Vec3s vec;
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPSegment(POLY_XLU_DISP++, 0x08,
Gfx_TwoTexScroll(play->state.gfxCtx, 0, 0, 0, 32, 64, 1, 0, (fire->timer * -20) % 512U, 32, 128));
diff --git a/src/code/z_lifemeter.c b/src/code/z_lifemeter.c
index d6f2edf2a..c6c1501ba 100644
--- a/src/code/z_lifemeter.c
+++ b/src/code/z_lifemeter.c
@@ -340,13 +340,13 @@ void LifeMeter_Draw(PlayState* play) {
if ((ddCount < 0) || (i > ddCount)) {
if (curCombineModeSet != 1) {
curCombineModeSet = 1;
- func_8012C654(gfxCtx);
+ Gfx_SetupDL39_Overlay(gfxCtx);
gDPSetCombineLERP(OVERLAY_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE,
0, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0);
}
} else if (curCombineModeSet != 3) {
curCombineModeSet = 3;
- func_8012C654(gfxCtx);
+ Gfx_SetupDL39_Overlay(gfxCtx);
gDPSetCombineLERP(OVERLAY_DISP++, ENVIRONMENT, PRIMITIVE, TEXEL0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0,
ENVIRONMENT, PRIMITIVE, TEXEL0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0);
}
@@ -366,7 +366,7 @@ void LifeMeter_Draw(PlayState* play) {
if ((ddCount < 0) || (ddCount < i)) {
if (curCombineModeSet != 2) {
curCombineModeSet = 2;
- func_8012C8D4(gfxCtx);
+ Gfx_SetupDL42_Overlay(gfxCtx);
gDPSetCombineLERP(OVERLAY_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE,
0, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0);
gDPSetAlphaCompare(OVERLAY_DISP++, G_AC_THRESHOLD);
@@ -374,7 +374,7 @@ void LifeMeter_Draw(PlayState* play) {
} else {
if (curCombineModeSet != 4) {
curCombineModeSet = 4;
- func_8012C8D4(gfxCtx);
+ Gfx_SetupDL42_Overlay(gfxCtx);
gDPSetCombineLERP(OVERLAY_DISP++, ENVIRONMENT, PRIMITIVE, TEXEL0, PRIMITIVE, TEXEL0, 0, PRIMITIVE,
0, ENVIRONMENT, PRIMITIVE, TEXEL0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0);
gDPSetAlphaCompare(OVERLAY_DISP++, G_AC_THRESHOLD);
diff --git a/src/code/z_lights.c b/src/code/z_lights.c
index 6a31c7e94..860d04ae9 100644
--- a/src/code/z_lights.c
+++ b/src/code/z_lights.c
@@ -414,7 +414,7 @@ void Lights_DrawGlow(PlayState* play) {
if (light != NULL) {
OPEN_DISPS(play->state.gfxCtx);
- dl = func_8012C7FC(POLY_XLU_DISP);
+ dl = Gfx_SetupDL65_NoCD(POLY_XLU_DISP);
gDPSetDither(dl++, G_CD_NOISE);
diff --git a/src/code/z_olib.c b/src/code/z_olib.c
index ad0c2b35c..754857014 100644
--- a/src/code/z_olib.c
+++ b/src/code/z_olib.c
@@ -100,16 +100,16 @@ Vec3f* OLib_VecSphToVec3f(Vec3f* dest, VecSph* sph) {
}
/**
- * Takes the geographic point `sph` and converts it into a x,y,z position
+ * Takes the geographic point `geo` and converts it into a x,y,z position
*/
-Vec3f* OLib_VecSphGeoToVec3f(Vec3f* dest, VecSph* sph) {
- VecSph geo;
+Vec3f* OLib_VecGeoToVec3f(Vec3f* dest, VecGeo* geo) {
+ VecSph sph;
- geo.r = sph->r;
- geo.pitch = 0x4000 - sph->pitch;
- geo.yaw = sph->yaw;
+ sph.r = geo->r;
+ sph.pitch = 0x4000 - geo->pitch;
+ sph.yaw = geo->yaw;
- return OLib_VecSphToVec3f(dest, &geo);
+ return OLib_VecSphToVec3f(dest, &sph);
}
/**
@@ -117,16 +117,16 @@ Vec3f* OLib_VecSphGeoToVec3f(Vec3f* dest, VecSph* sph) {
*/
VecSph* OLib_Vec3fToVecSph(VecSph* dest, Vec3f* vec) {
VecSph sph;
- f32 distSquared = SQ(vec->x) + SQ(vec->z);
- f32 dist = sqrtf(distSquared);
+ f32 distXZSq = SQ(vec->x) + SQ(vec->z);
+ f32 distXZ = sqrtf(distXZSq);
- if ((dist == 0.0f) && (vec->y == 0.0f)) {
+ if ((distXZ == 0.0f) && (vec->y == 0.0f)) {
sph.pitch = 0;
} else {
- sph.pitch = CAM_DEG_TO_BINANG(RAD_TO_DEG(func_80086B30(dist, vec->y)));
+ sph.pitch = CAM_DEG_TO_BINANG(RAD_TO_DEG(func_80086B30(distXZ, vec->y)));
}
- sph.r = sqrtf(SQ(vec->y) + distSquared);
+ sph.r = sqrtf(SQ(vec->y) + distXZSq);
if ((vec->x == 0.0f) && (vec->z == 0.0f)) {
sph.yaw = 0;
} else {
@@ -141,7 +141,7 @@ VecSph* OLib_Vec3fToVecSph(VecSph* dest, Vec3f* vec) {
/**
* Takes the point `vec`, and converts it to a geographic coordinate
*/
-VecSph* OLib_Vec3fToVecSphGeo(VecSph* dest, Vec3f* vec) {
+VecGeo* OLib_Vec3fToVecGeo(VecGeo* dest, Vec3f* vec) {
VecSph sph;
OLib_Vec3fToVecSph(&sph, vec);
@@ -156,42 +156,42 @@ VecSph* OLib_Vec3fToVecSphGeo(VecSph* dest, Vec3f* vec) {
* Takes the differences of positions `a` and `b`, and converts them to spherical coordinates
*/
VecSph* OLib_Vec3fDiffToVecSph(VecSph* dest, Vec3f* a, Vec3f* b) {
- Vec3f sph;
+ Vec3f diff;
- sph.x = b->x - a->x;
- sph.y = b->y - a->y;
- sph.z = b->z - a->z;
+ diff.x = b->x - a->x;
+ diff.y = b->y - a->y;
+ diff.z = b->z - a->z;
- return OLib_Vec3fToVecSph(dest, &sph);
+ return OLib_Vec3fToVecSph(dest, &diff);
}
/**
* Takes the difference of positions `a` and `b`, and converts them to geographic coordinates
*/
-VecSph* OLib_Vec3fDiffToVecSphGeo(VecSph* dest, Vec3f* a, Vec3f* b) {
- Vec3f sph;
+VecGeo* OLib_Vec3fDiffToVecGeo(VecGeo* dest, Vec3f* a, Vec3f* b) {
+ Vec3f diff;
- sph.x = b->x - a->x;
- sph.y = b->y - a->y;
- sph.z = b->z - a->z;
+ diff.x = b->x - a->x;
+ diff.y = b->y - a->y;
+ diff.z = b->z - a->z;
- return OLib_Vec3fToVecSphGeo(dest, &sph);
+ return OLib_Vec3fToVecGeo(dest, &diff);
}
/**
- * Takes the sum of positions `a` (x,y,z coordinates) and `sph` (geographic coordinates), result is in x,y,z position
+ * Takes the sum of positions `a` (x,y,z coordinates) and `geo` (geographic coordinates), result is in x,y,z position
* Identical to Quake_AddVec from OoT
*/
-Vec3f* OLib_VecSphAddToVec3f(Vec3f* dest, Vec3f* a, VecSph* sph) {
- Vec3f vec;
+Vec3f* OLib_AddVecGeoToVec3f(Vec3f* dest, Vec3f* a, VecGeo* geo) {
+ Vec3f sum;
Vec3f b;
- OLib_VecSphGeoToVec3f(&b, sph);
- vec.x = a->x + b.x;
- vec.y = a->y + b.y;
- vec.z = a->z + b.z;
+ OLib_VecGeoToVec3f(&b, geo);
+ sum.x = a->x + b.x;
+ sum.y = a->y + b.y;
+ sum.z = a->z + b.z;
- *dest = vec;
+ *dest = sum;
return dest;
}
@@ -248,46 +248,50 @@ Vec3s* OLib_Vec3fDiffBinAng(Vec3s* dest, Vec3f* a, Vec3f* b) {
}
/**
- * Gets a x,y,z position diff depending on the dbCamera mode
+ * Gets a x,y,z position diff depending on the mode
*/
-void OLib_DbCameraVec3fDiff(PosRot* a, Vec3f* b, Vec3f* dest, s16 mode) {
- VecSph sph;
+void OLib_Vec3fDiff(PosRot* a, Vec3f* b, Vec3f* dest, s16 mode) {
+ VecGeo geo;
switch (mode) {
- case 1:
- OLib_Vec3fDiffToVecSphGeo(&sph, &a->pos, b);
- sph.yaw -= a->rot.y;
- OLib_VecSphGeoToVec3f(dest, &sph);
+ case OLIB_DIFF_OFFSET:
+ OLib_Vec3fDiffToVecGeo(&geo, &a->pos, b);
+ geo.yaw -= a->rot.y;
+ OLib_VecGeoToVec3f(dest, &geo);
break;
- case 2:
+
+ case OLIB_DIFF:
dest->x = b->x - a->pos.x;
dest->y = b->y - a->pos.y;
dest->z = b->z - a->pos.z;
break;
- default:
+
+ default: // OLIB_DIFF_COPY
*dest = *b;
break;
}
}
/**
- * Gets a x,y,z position sum depending on the dbCamera mode
+ * Gets a x,y,z position sum depending on the mode
*/
-void OLib_DbCameraVec3fSum(PosRot* a, Vec3f* b, Vec3f* dest, s16 mode) {
- VecSph sph;
+void OLib_Vec3fAdd(PosRot* a, Vec3f* b, Vec3f* dest, s16 mode) {
+ VecGeo geo;
switch (mode) {
- case 1:
- OLib_Vec3fToVecSphGeo(&sph, b);
- sph.yaw += a->rot.y;
- OLib_VecSphAddToVec3f(dest, &a->pos, &sph);
+ case OLIB_ADD_OFFSET:
+ OLib_Vec3fToVecGeo(&geo, b);
+ geo.yaw += a->rot.y;
+ OLib_AddVecGeoToVec3f(dest, &a->pos, &geo);
break;
- case 2:
+
+ case OLIB_ADD:
dest->x = a->pos.x + b->x;
dest->y = a->pos.y + b->y;
dest->z = a->pos.z + b->z;
break;
- default:
+
+ default: // OLIB_ADD_COPY
*dest = *b;
break;
}
diff --git a/src/code/z_parameter.c b/src/code/z_parameter.c
index 9f1a53df9..558b39a80 100644
--- a/src/code/z_parameter.c
+++ b/src/code/z_parameter.c
@@ -29,7 +29,7 @@ typedef struct {
/* 0x03 */ u8 flags3;
} RestrictionFlags;
-Input sPostmanTimerInput[4];
+Input sPostmanTimerInput[MAXCONTROLLERS];
#define RESTRICTIONS_TABLE_END 0xFF
@@ -886,10 +886,10 @@ void Interface_SetVertices(PlayState* play) {
s32 sPostmanTimerInputBtnAPressed = false;
-void Interface_PostmanTimerCallback(s32 arg0) {
+void Interface_PostmanTimerCallback(void* arg) {
s32 btnAPressed;
- func_80175E68(&sPostmanTimerInput[0], 0);
+ PadMgr_GetInputNoLock(sPostmanTimerInput, false);
btnAPressed = CHECK_BTN_ALL(sPostmanTimerInput[0].cur.button, BTN_A);
if ((btnAPressed != sPostmanTimerInputBtnAPressed) && btnAPressed) {
gSaveContext.postmanTimerStopOsTime = osGetTime();
@@ -3413,18 +3413,18 @@ void Interface_SetBButtonDoAction(PlayState* play, s16 bButtonDoAction) {
void Interface_SetTatlCall(PlayState* play, u16 tatlCallState) {
InterfaceContext* interfaceCtx = &play->interfaceCtx;
- if (((tatlCallState == 0x2A) || (tatlCallState == 0x2B)) && !interfaceCtx->tatlCalling &&
- (play->csCtx.state == 0)) {
- if (tatlCallState == 0x2B) {
+ if (((tatlCallState == TATL_STATE_2A) || (tatlCallState == TATL_STATE_2B)) && !interfaceCtx->tatlCalling &&
+ (play->csCtx.state == CS_STATE_IDLE)) {
+ if (tatlCallState == TATL_STATE_2B) {
play_sound(NA_SE_VO_NAVY_CALL);
}
- if (tatlCallState == 0x2A) {
+ if (tatlCallState == TATL_STATE_2A) {
func_8019FDC8(&gSfxDefaultPos, NA_SE_VO_NA_HELLO_2, 0x20);
}
interfaceCtx->tatlCalling = true;
sCUpInvisible = 0;
sCUpTimer = 10;
- } else if (tatlCallState == 0x2C) {
+ } else if (tatlCallState == TATL_STATE_2C) {
if (interfaceCtx->tatlCalling) {
interfaceCtx->tatlCalling = false;
}
@@ -3946,7 +3946,7 @@ void Magic_DrawMeter(PlayState* play) {
magicBarY = 34; // one row of hearts
}
- func_8012C654(play->state.gfxCtx);
+ Gfx_SetupDL39_Overlay(play->state.gfxCtx);
gDPSetEnvColor(OVERLAY_DISP++, 100, 50, 50, 255);
@@ -4383,7 +4383,7 @@ void Interface_DrawAButton(PlayState* play) {
aAlpha = 100;
}
- func_8012C8D4(play->state.gfxCtx);
+ Gfx_SetupDL42_Overlay(play->state.gfxCtx);
Interface_SetPerspectiveView(play, 25 + R_A_BTN_Y_OFFSET, 70 + R_A_BTN_Y_OFFSET, 192, 237);
@@ -4458,7 +4458,7 @@ void Interface_DrawPauseMenuEquippingIcons(PlayState* play) {
(pauseCtx->mainState == PAUSE_MAIN_STATE_EQUIP_MASK))) {
// Inventory Equip Effects
gSPSegment(OVERLAY_DISP++, 0x08, pauseCtx->iconItemSegment);
- func_8012C8D4(play->state.gfxCtx);
+ Gfx_SetupDL42_Overlay(play->state.gfxCtx);
gDPSetCombineMode(OVERLAY_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
gDPSetAlphaCompare(OVERLAY_DISP++, G_AC_THRESHOLD);
gSPMatrix(OVERLAY_DISP++, &gIdentityMtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
@@ -4621,7 +4621,7 @@ void Interface_DrawClock(PlayState* play) {
if ((play->pauseCtx.state == PAUSE_STATE_OFF) && (play->pauseCtx.debugEditor == DEBUG_EDITOR_NONE)) {
- func_8012C654(play->state.gfxCtx);
+ Gfx_SetupDL39_Overlay(play->state.gfxCtx);
/**
* Draw Clock's Hour Lines
@@ -4652,7 +4652,7 @@ void Interface_DrawClock(PlayState* play) {
if (((CURRENT_DAY >= 4) || ((CURRENT_DAY == 3) && (((void)0, gSaveContext.save.time) >= 5) &&
(((void)0, gSaveContext.save.time) < CLOCK_TIME(6, 0))))) {
- func_8012C8D4(play->state.gfxCtx);
+ Gfx_SetupDL42_Overlay(play->state.gfxCtx);
gSPMatrix(OVERLAY_DISP++, &gIdentityMtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
} else {
/**
@@ -4763,7 +4763,7 @@ void Interface_DrawClock(PlayState* play) {
timeInSeconds = TIME_TO_SECONDS_F(gSaveContext.save.time);
timeInSeconds -= ((s16)(timeInSeconds / 3600.0f)) * 3600.0f;
- func_8012C8D4(play->state.gfxCtx);
+ Gfx_SetupDL42_Overlay(play->state.gfxCtx);
gSPMatrix(OVERLAY_DISP++, &gIdentityMtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
@@ -4960,7 +4960,7 @@ void Interface_DrawClock(PlayState* play) {
sp1E6 = 255;
}
- func_8012C654(play->state.gfxCtx);
+ Gfx_SetupDL39_Overlay(play->state.gfxCtx);
/**
* Draws Final-Hours Clock's Frame
@@ -5595,7 +5595,7 @@ void Interface_DrawPerfectLetters(PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C8D4(play->state.gfxCtx);
+ Gfx_SetupDL42_Overlay(play->state.gfxCtx);
gSPMatrix(OVERLAY_DISP++, &gIdentityMtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gDPSetCombineLERP(OVERLAY_DISP++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE, TEXEL0, 0,
@@ -5750,7 +5750,7 @@ void Interface_DrawTimers(PlayState* play) {
}
gSaveContext.timerStates[TIMER_ID_POSTMAN] = TIMER_STATE_POSTMAN_COUNTING;
sPostmanTimerInputBtnAPressed = true;
- func_80174F7C(Interface_PostmanTimerCallback, NULL);
+ PadMgr_SetInputRetraceCallback(Interface_PostmanTimerCallback, NULL);
break;
case TIMER_STATE_POSTMAN_STOP:
@@ -5759,7 +5759,7 @@ void Interface_DrawTimers(PlayState* play) {
postmanTimerStopOsTime - ((void)0, gSaveContext.timerStartOsTimes[TIMER_ID_POSTMAN]) -
((void)0, gSaveContext.timerPausedOsTimes[TIMER_ID_POSTMAN]));
gSaveContext.timerStates[TIMER_ID_POSTMAN] = TIMER_STATE_POSTMAN_END;
- func_80174F9C(Interface_PostmanTimerCallback, NULL);
+ PadMgr_UnsetInputRetraceCallback(Interface_PostmanTimerCallback, NULL);
break;
case TIMER_STATE_POSTMAN_COUNTING:
@@ -6232,7 +6232,7 @@ void Interface_DrawMinigameIcons(PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C654(play->state.gfxCtx);
+ Gfx_SetupDL39_Overlay(play->state.gfxCtx);
if ((play->pauseCtx.state == PAUSE_STATE_OFF) && (play->pauseCtx.debugEditor == DEBUG_EDITOR_NONE)) {
// Carrots rendering if the action corresponds to riding a horse
@@ -6407,7 +6407,7 @@ void Interface_Draw(PlayState* play) {
// Draw Grandma's Story
if (interfaceCtx->storyDmaStatus == STORY_DMA_DONE) {
gSPSegment(OVERLAY_DISP++, 0x07, interfaceCtx->storySegment);
- func_8012C628(play->state.gfxCtx);
+ Gfx_SetupDL39_Opa(play->state.gfxCtx);
gDPSetTextureFilter(POLY_OPA_DISP++, G_TF_POINT);
gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 255, pauseCtx->alpha);
@@ -6432,7 +6432,7 @@ void Interface_Draw(PlayState* play) {
LifeMeter_Draw(play);
- func_8012C654(play->state.gfxCtx);
+ Gfx_SetupDL39_Overlay(play->state.gfxCtx);
// Draw Rupee Icon
gDPSetPrimColor(OVERLAY_DISP++, 0, 0, sRupeeCounterIconPrimColors[CUR_UPG_VALUE(UPG_WALLET)].r,
@@ -6617,7 +6617,7 @@ void Interface_Draw(PlayState* play) {
Actor_DrawZTarget(&play->actorCtx.targetContext, play);
}
- func_8012C654(play->state.gfxCtx);
+ Gfx_SetupDL39_Overlay(play->state.gfxCtx);
Interface_DrawItemButtons(play);
@@ -6649,7 +6649,7 @@ void Interface_Draw(PlayState* play) {
interfaceCtx->actionVtx[40 + 2].v.tc[1] = interfaceCtx->actionVtx[40 + 3].v.tc[1] = 32 << 5;
- func_8012C8D4(play->state.gfxCtx);
+ Gfx_SetupDL42_Overlay(play->state.gfxCtx);
gDPSetCombineMode(OVERLAY_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
gDPSetAlphaCompare(OVERLAY_DISP++, G_AC_THRESHOLD);
@@ -6684,7 +6684,7 @@ void Interface_Draw(PlayState* play) {
// Draw pictograph focus icons
if (sPictoState == PICTO_BOX_STATE_LENS) {
- func_8012C654(play->state.gfxCtx);
+ Gfx_SetupDL39_Overlay(play->state.gfxCtx);
gDPSetAlphaCompare(OVERLAY_DISP++, G_AC_THRESHOLD);
gDPSetRenderMode(OVERLAY_DISP++, G_RM_XLU_SURF, G_RM_XLU_SURF2);
@@ -6752,7 +6752,7 @@ void Interface_Draw(PlayState* play) {
gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 200, 200, 200, 250);
gDPFillRectangle(OVERLAY_DISP++, 70, 22, 251, 151);
- func_8012C654(play->state.gfxCtx);
+ Gfx_SetupDL39_Overlay(play->state.gfxCtx);
gDPSetRenderMode(OVERLAY_DISP++, G_RM_OPA_SURF, G_RM_OPA_SURF2);
gDPSetCombineMode(OVERLAY_DISP++, G_CC_MODULATEI_PRIM, G_CC_MODULATEI_PRIM);
@@ -7307,7 +7307,7 @@ void Interface_Update(PlayState* play) {
void Interface_Destroy(PlayState* play) {
Map_Destroy(play);
- func_80174F9C(Interface_PostmanTimerCallback, NULL);
+ PadMgr_UnsetInputRetraceCallback(Interface_PostmanTimerCallback, NULL);
}
void Interface_Init(PlayState* play) {
diff --git a/src/code/z_play.c b/src/code/z_play.c
index 57386c97c..e25b50b4b 100644
--- a/src/code/z_play.c
+++ b/src/code/z_play.c
@@ -1,4 +1,3 @@
-#include "prevent_bss_reordering.h"
#include "global.h"
#include "buffers.h"
#include "z64debug_display.h"
@@ -506,41 +505,41 @@ void Play_UpdateWaterCamera(PlayState* this, Camera* camera) {
sIsCameraUnderwater = camera->stateFlags & CAM_STATE_UNDERWATER;
if (Play_GetWaterSurface(this, &camera->eye, &lightIndex) != BGCHECK_Y_MIN) {
if (!sIsCameraUnderwater) {
- Camera_SetFlags(camera, CAM_STATE_UNDERWATER);
+ Camera_SetStateFlag(camera, CAM_STATE_UNDERWATER);
sQuakeIndex = -1;
- Distortion_SetType(DISTORTION_TYPE_UNDERWATER_ENTRY);
- Distortion_SetCountdown(80);
+ Distortion_Request(DISTORTION_TYPE_UNDERWATER_ENTRY);
+ Distortion_SetDuration(80);
}
func_801A3EC0(0x20);
func_800F6834(this, lightIndex);
- if ((sQuakeIndex == -1) || (Quake_GetCountdown(sQuakeIndex) == 10)) {
- s16 quakeIndex = Quake_Add(camera, QUAKE_TYPE_5);
+ if ((sQuakeIndex == -1) || (Quake_GetTimeLeft(sQuakeIndex) == 10)) {
+ s16 quakeIndex = Quake_Request(camera, QUAKE_TYPE_5);
sQuakeIndex = quakeIndex;
if (quakeIndex != 0) {
Quake_SetSpeed(sQuakeIndex, 550);
- Quake_SetQuakeValues(sQuakeIndex, 1, 1, 180, 0);
- Quake_SetCountdown(sQuakeIndex, 1000);
+ Quake_SetPerturbations(sQuakeIndex, 1, 1, 180, 0);
+ Quake_SetDuration(sQuakeIndex, 1000);
}
}
if (player->stateFlags3 & PLAYER_STATE3_8000) {
- Distortion_SetType(DISTORTION_TYPE_ZORA_SWIMMING);
- Distortion_ClearType(DISTORTION_TYPE_NON_ZORA_SWIMMING);
+ Distortion_Request(DISTORTION_TYPE_ZORA_SWIMMING);
+ Distortion_RemoveRequest(DISTORTION_TYPE_NON_ZORA_SWIMMING);
} else {
- Distortion_SetType(DISTORTION_TYPE_NON_ZORA_SWIMMING);
- Distortion_ClearType(DISTORTION_TYPE_ZORA_SWIMMING);
+ Distortion_Request(DISTORTION_TYPE_NON_ZORA_SWIMMING);
+ Distortion_RemoveRequest(DISTORTION_TYPE_ZORA_SWIMMING);
}
} else {
if (sIsCameraUnderwater) {
- Camera_ClearFlags(camera, CAM_STATE_UNDERWATER);
+ Camera_UnsetStateFlag(camera, CAM_STATE_UNDERWATER);
}
- Distortion_ClearType(DISTORTION_TYPE_NON_ZORA_SWIMMING);
- Distortion_ClearType(DISTORTION_TYPE_UNDERWATER_ENTRY);
- Distortion_ClearType(DISTORTION_TYPE_ZORA_SWIMMING);
+ Distortion_RemoveRequest(DISTORTION_TYPE_NON_ZORA_SWIMMING);
+ Distortion_RemoveRequest(DISTORTION_TYPE_UNDERWATER_ENTRY);
+ Distortion_RemoveRequest(DISTORTION_TYPE_ZORA_SWIMMING);
if (sQuakeIndex != 0) {
- Quake_Remove(sQuakeIndex);
+ Quake_RemoveRequest(sQuakeIndex);
}
func_800F694C(this);
func_801A3EC0(0);
@@ -1682,11 +1681,11 @@ s32 Play_SetCameraAtEye(PlayState* this, s16 camId, Vec3f* at, Vec3f* eye) {
camera->dist = Math3D_Distance(at, eye);
if (camera->focalActor != NULL) {
- camera->atActorOffset.x = at->x - camera->focalActor->world.pos.x;
- camera->atActorOffset.y = at->y - camera->focalActor->world.pos.y;
- camera->atActorOffset.z = at->z - camera->focalActor->world.pos.z;
+ camera->focalActorAtOffset.x = at->x - camera->focalActor->world.pos.x;
+ camera->focalActorAtOffset.y = at->y - camera->focalActor->world.pos.y;
+ camera->focalActorAtOffset.z = at->z - camera->focalActor->world.pos.z;
} else {
- camera->atActorOffset.x = camera->atActorOffset.y = camera->atActorOffset.z = 0.0f;
+ camera->focalActorAtOffset.x = camera->focalActorAtOffset.y = camera->focalActorAtOffset.z = 0.0f;
}
camera->atLerpStepScale = 0.01f;
@@ -1711,11 +1710,11 @@ s32 Play_SetCameraAtEyeUp(PlayState* this, s16 camId, Vec3f* at, Vec3f* eye, Vec
camera->dist = Math3D_Distance(at, eye);
if (camera->focalActor != NULL) {
- camera->atActorOffset.x = at->x - camera->focalActor->world.pos.x;
- camera->atActorOffset.y = at->y - camera->focalActor->world.pos.y;
- camera->atActorOffset.z = at->z - camera->focalActor->world.pos.z;
+ camera->focalActorAtOffset.x = at->x - camera->focalActor->world.pos.x;
+ camera->focalActorAtOffset.y = at->y - camera->focalActor->world.pos.y;
+ camera->focalActorAtOffset.z = at->z - camera->focalActor->world.pos.z;
} else {
- camera->atActorOffset.x = camera->atActorOffset.y = camera->atActorOffset.z = 0.0f;
+ camera->focalActorAtOffset.x = camera->focalActorAtOffset.y = camera->focalActorAtOffset.z = 0.0f;
}
camera->atLerpStepScale = 0.01f;
@@ -1749,13 +1748,13 @@ void Play_CopyCamera(PlayState* this, s16 destCamId, s16 srcCamId) {
Camera_Copy(this->cameraPtrs[destCamId1], this->cameraPtrs[srcCamId2]);
}
-// Same as Play_ChangeCameraSetting but also calls Camera_InitPlayerSettings
+// Same as Play_ChangeCameraSetting but also calls Camera_InitFocalActorSettings
s32 func_80169A50(PlayState* this, s16 camId, Player* player, s16 setting) {
Camera* camera;
s16 camIdx = (camId == CAM_ID_NONE) ? this->activeCamId : camId;
camera = this->cameraPtrs[camIdx];
- Camera_InitPlayerSettings(camera, player);
+ Camera_InitFocalActorSettings(camera, &player->actor);
return Camera_ChangeSetting(camera, setting);
}
@@ -2180,7 +2179,8 @@ void Play_Init(GameState* thisx) {
this->cameraPtrs[CAM_ID_MAIN]->uid = CAM_ID_MAIN;
this->activeCamId = CAM_ID_MAIN;
- func_800DFF18(&this->mainCamera, 0x7F);
+ Camera_OverwriteStateFlags(&this->mainCamera, CAM_STATE_0 | CAM_STATE_CHECK_WATER | CAM_STATE_2 | CAM_STATE_3 |
+ CAM_STATE_4 | CAM_STATE_DISABLE_MODE_CHANGE | CAM_STATE_6);
Sram_Alloc(&this->state, &this->sramCtx);
Regs_InitData(this);
Message_Init(this);
@@ -2324,11 +2324,11 @@ void Play_Init(GameState* thisx) {
player = GET_PLAYER(this);
- Camera_InitPlayerSettings(&this->mainCamera, player);
+ Camera_InitFocalActorSettings(&this->mainCamera, &player->actor);
gDbgCamEnabled = false;
- if ((player->actor.params & 0xFF) != 0xFF) {
- Camera_ChangeDataIdx(&this->mainCamera, player->actor.params & 0xFF);
+ if (PLAYER_GET_BG_CAM_INDEX(&player->actor) != 0xFF) {
+ Camera_ChangeActorCsCamIndex(&this->mainCamera, PLAYER_GET_BG_CAM_INDEX(&player->actor));
}
CutsceneManager_StoreCamera(&this->mainCamera);
diff --git a/src/code/z_player_lib.c b/src/code/z_player_lib.c
index 2b9e13b48..59f76b1d8 100644
--- a/src/code/z_player_lib.c
+++ b/src/code/z_player_lib.c
@@ -472,7 +472,7 @@ void func_80123140(PlayState* play, Player* player) {
REG(39) = bootRegs[8];
REG(43) = bootRegs[9];
R_RUN_SPEED_LIMIT = bootRegs[10];
- REG(68) = bootRegs[11];
+ REG(68) = bootRegs[11]; // gravity
REG(69) = bootRegs[12];
IREG(66) = bootRegs[13];
IREG(67) = bootRegs[14];
@@ -503,7 +503,7 @@ s32 Player_InBlockingCsMode(PlayState* play, Player* player) {
s32 Player_InCsMode(PlayState* play) {
Player* player = GET_PLAYER(play);
- return Player_InBlockingCsMode(play, player) || player->unk_AA5 == 5;
+ return Player_InBlockingCsMode(play, player) || (player->unk_AA5 == PLAYER_UNKAA5_5);
}
s32 func_80123420(Player* player) {
@@ -556,8 +556,8 @@ s32 func_801235DC(PlayState* play, f32 arg1, s16 arg2) {
Player* player = GET_PLAYER(play);
if (player->stateFlags3 & PLAYER_STATE3_1000) {
- player->unk_B08[0] = arg1;
- player->unk_B08[1] += arg1 * 0.05f;
+ player->unk_B08 = arg1;
+ player->unk_B0C += arg1 * 0.05f;
player->currentYaw = arg2;
player->actor.home.rot.y = arg2;
player->actor.shape.rot.y = arg2;
@@ -659,7 +659,7 @@ u8 sActionModelGroups[PLAYER_IA_MAX] = {
PLAYER_MODELGROUP_ONE_HAND_SWORD, // PLAYER_IA_SWORD_KOKIRI
PLAYER_MODELGROUP_ONE_HAND_SWORD, // PLAYER_IA_SWORD_RAZOR
PLAYER_MODELGROUP_ONE_HAND_SWORD, // PLAYER_IA_SWORD_GILDED
- PLAYER_MODELGROUP_TWO_HAND_SWORD, // PLAYER_IA_SWORD_GREAT_FAIRY
+ PLAYER_MODELGROUP_TWO_HAND_SWORD, // PLAYER_IA_SWORD_TWO_HANDED
PLAYER_MODELGROUP_STICK, // PLAYER_IA_STICK
PLAYER_MODELGROUP_ZORA_FINS, // PLAYER_IA_ZORA_FINS
PLAYER_MODELGROUP_BOW, // PLAYER_IA_BOW
@@ -1316,6 +1316,7 @@ void Player_UpdateBottleHeld(PlayState* play, Player* player, ItemId itemId, Pla
player->itemAction = itemAction;
}
+// Player_Untarget / Player_StopTargeting?
void func_80123DA4(Player* player) {
player->targetedActor = NULL;
player->stateFlags2 &= ~PLAYER_STATE2_2000;
@@ -1445,7 +1446,7 @@ PlayerMeleeWeapon Player_GetMeleeWeaponHeld(Player* player) {
s32 Player_IsHoldingTwoHandedWeapon(Player* player) {
// Relies on the itemActions for two-handed weapons being contiguous.
- if ((player->heldItemAction >= PLAYER_IA_SWORD_GREAT_FAIRY) && (player->heldItemAction <= PLAYER_IA_STICK)) {
+ if ((player->heldItemAction >= PLAYER_IA_SWORD_TWO_HANDED) && (player->heldItemAction <= PLAYER_IA_STICK)) {
return true;
}
@@ -1854,7 +1855,7 @@ void Player_DrawHookshotReticle(PlayState* play, Player* player, f32 hookshotDis
OPEN_DISPS(play->state.gfxCtx);
- OVERLAY_DISP = Gfx_CallSetupDL(OVERLAY_DISP, 7);
+ OVERLAY_DISP = Gfx_SetupDL(OVERLAY_DISP, SETUPDL_7);
SkinMatrix_Vec3fMtxFMultXYZW(&play->viewProjectionMtxF, &pos, &sp58, &sp54);
@@ -2038,7 +2039,7 @@ s32 Player_OverrideLimbDrawGameplayCommon(PlayState* play, s32 limbIndex, Gfx**
pos->x *= player->ageProperties->unk_08;
pos->z *= player->ageProperties->unk_08;
}
- if (!(player->skelAnime.moveFlags & ANIM_FLAG_4) || (player->skelAnime.moveFlags & ANIM_FLAG_UPDATEY)) {
+ if (!(player->skelAnime.moveFlags & ANIM_FLAG_4) || (player->skelAnime.moveFlags & ANIM_FLAG_UPDATE_Y)) {
pos->y *= player->ageProperties->unk_08;
}
}
@@ -2552,14 +2553,16 @@ void func_8012669C(PlayState* play, Player* player, Vec3f* arg2, Vec3f* arg3) {
Matrix_MultVec3f(arg2, &sp3C);
Matrix_MultVec3f(arg3, &sp30);
- if (player->meleeWeaponState != 0) {
+ if (player->meleeWeaponState != PLAYER_MELEE_WEAPON_STATE_0) {
if (func_80126440(play, NULL, &player->meleeWeaponInfo[0], &sp3C, &sp30) &&
(player->transformation != PLAYER_FORM_GORON) && (!(player->stateFlags1 & PLAYER_STATE1_400000))) {
EffectBlure_AddVertex(Effect_GetByIndex(player->meleeWeaponEffectIndex[0]), &player->meleeWeaponInfo[0].tip,
&player->meleeWeaponInfo[0].base);
}
- if ((player->meleeWeaponState > 0) && ((player->meleeWeaponAnimation < PLAYER_MWA_SPIN_ATTACK_1H) ||
- (player->stateFlags2 & PLAYER_STATE2_20000))) {
+
+ if ((player->meleeWeaponState >= PLAYER_MELEE_WEAPON_STATE_1) &&
+ ((player->meleeWeaponAnimation < PLAYER_MWA_SPIN_ATTACK_1H) ||
+ (player->stateFlags2 & PLAYER_STATE2_20000))) {
Matrix_MultVec3f(&arg2[1], &sp3C);
Matrix_MultVec3f(&arg3[1], &sp30);
func_80126440(play, &player->meleeWeaponQuads[0], &player->meleeWeaponInfo[1], &sp3C, &sp30);
@@ -2714,7 +2717,7 @@ void func_80126BD0(PlayState* play, Player* player, s32 arg2) {
gSPDisplayList(POLY_OPA_DISP++, D_801C0AB4[arg2]);
- if (player->meleeWeaponState != 0) {
+ if (player->meleeWeaponState != PLAYER_MELEE_WEAPON_STATE_0) {
if ((((player->meleeWeaponAnimation == PLAYER_MWA_ZORA_PUNCH_LEFT)) && (arg2 == 0)) ||
((player->meleeWeaponAnimation == PLAYER_MWA_ZORA_PUNCH_COMBO) && (arg2 != 0))) {
func_8012669C(play, player, D_801C0A00, D_801C09DC);
@@ -3296,7 +3299,7 @@ s32 func_80128640(PlayState* play, Player* player, Gfx* dlist) {
Matrix_Push();
Matrix_Translate(-428.26f, 267.2f, -33.82f, MTXMODE_APPLY);
Matrix_RotateZYX(-0x8000, 0, 0x4000, MTXMODE_APPLY);
- Matrix_Scale(1.0f, player->unk_B08[1], 1.0f, MTXMODE_APPLY);
+ Matrix_Scale(1.0f, player->unk_B0C, 1.0f, MTXMODE_APPLY);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, gDekuStickDL);
@@ -3413,7 +3416,7 @@ void Player_PostLimbDrawGameplay(PlayState* play, s32 limbIndex, Gfx** dList1, G
3000.0f, // PLAYER_MELEEWEAPON_SWORD_KOKIRI
3000.0f, // PLAYER_MELEEWEAPON_SWORD_RAZOR
4000.0f, // PLAYER_MELEEWEAPON_SWORD_GILDED
- 5500.0f, // PLAYER_MELEEWEAPON_SWORD_GREAT_FAIRY
+ 5500.0f, // PLAYER_MELEEWEAPON_SWORD_TWO_HANDED
-1.0f, // PLAYER_MELEEWEAPON_STICK
2500.0f, // PLAYER_MELEEWEAPON_ZORA_FINS
};
@@ -3421,19 +3424,19 @@ void Player_PostLimbDrawGameplay(PlayState* play, s32 limbIndex, Gfx** dList1, G
if ((player->transformation == PLAYER_FORM_FIERCE_DEITY) ||
((player->transformation != PLAYER_FORM_ZORA) &&
((player->itemAction == PLAYER_IA_STICK) ||
- ((player->meleeWeaponState != 0) &&
+ ((player->meleeWeaponState != PLAYER_MELEE_WEAPON_STATE_0) &&
(player->meleeWeaponAnimation != PLAYER_MWA_GORON_PUNCH_RIGHT) &&
(player->meleeWeaponAnimation != PLAYER_MWA_GORON_PUNCH_BUTT))))) {
if (player->itemAction == PLAYER_IA_STICK) {
- D_801C0994->x = player->unk_B08[1] * 5000.0f;
+ D_801C0994->x = player->unk_B0C * 5000.0f;
} else {
D_801C0994->x = sMeleeWeaponLengths[Player_GetMeleeWeaponHeld(player)];
}
func_80126B8C(play, player);
}
- Matrix_Get(&player->mf_CC4);
- Matrix_MtxFToYXZRot(&player->mf_CC4, &player->leftHandWorld.rot, false);
+ Matrix_Get(&player->leftHandMf);
+ Matrix_MtxFToYXZRot(&player->leftHandMf, &player->leftHandWorld.rot, false);
}
}
} else if (limbIndex == PLAYER_LIMB_RIGHT_HAND) {
@@ -3458,18 +3461,18 @@ void Player_PostLimbDrawGameplay(PlayState* play, s32 limbIndex, Gfx** dList1, G
Matrix_MultZero(&sp20C);
temp_fv0 = Math_Vec3f_DistXYZ(sPlayerCurBodyPartPos, &sp20C);
- player->unk_B08[0] = temp_fv0 - 3.0f;
+ player->unk_B08 = temp_fv0 - 3.0f;
if (temp_fv0 < 3.0f) {
- player->unk_B08[0] = 0.0f;
+ player->unk_B08 = 0.0f;
} else {
- player->unk_B08[0] *= 1.6f;
- if (player->unk_B08[0] > 1.0f) {
- player->unk_B08[0] = 1.0f;
+ player->unk_B08 *= 1.6f;
+ if (player->unk_B08 > 1.0f) {
+ player->unk_B08 = 1.0f;
}
}
- player->unk_B08[1] = -0.5f;
+ player->unk_B0C = -0.5f;
}
- Matrix_Scale(1.0f, player->unk_B08[0], 1.0f, MTXMODE_APPLY);
+ Matrix_Scale(1.0f, player->unk_B08, 1.0f, MTXMODE_APPLY);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx),
G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
@@ -3518,7 +3521,7 @@ void Player_PostLimbDrawGameplay(PlayState* play, s32 limbIndex, Gfx** dList1, G
Player_DrawHookshotReticle(play, player, 77600.0f);
}
}
- } else if (player->meleeWeaponState != 0) {
+ } else if (player->meleeWeaponState != PLAYER_MELEE_WEAPON_STATE_0) {
if (player->meleeWeaponAnimation == PLAYER_MWA_GORON_PUNCH_RIGHT) {
func_80126B8C(play, player);
}
@@ -3590,6 +3593,7 @@ void Player_PostLimbDrawGameplay(PlayState* play, s32 limbIndex, Gfx** dList1, G
for (i = 0; i < ARRAY_COUNT(sp178); i++) {
Matrix_Push();
Matrix_Scale(sp178[i].x, sp178[i].y, sp178[i].z, MTXMODE_APPLY);
+
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx),
G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
@@ -3811,7 +3815,7 @@ void Player_PostLimbDrawGameplay(PlayState* play, s32 limbIndex, Gfx** dList1, G
&player->meleeWeaponInfo[0].base);
}
} else if (limbIndex == PLAYER_LIMB_RIGHT_SHIN) {
- if (player->meleeWeaponState != 0) {
+ if (player->meleeWeaponState != PLAYER_MELEE_WEAPON_STATE_0) {
if ((player->meleeWeaponAnimation == PLAYER_MWA_ZORA_PUNCH_KICK) ||
(player->meleeWeaponAnimation == PLAYER_MWA_ZORA_JUMPKICK_START) ||
(player->meleeWeaponAnimation == PLAYER_MWA_ZORA_JUMPKICK_FINISH)) {
@@ -3819,7 +3823,7 @@ void Player_PostLimbDrawGameplay(PlayState* play, s32 limbIndex, Gfx** dList1, G
}
}
} else if (limbIndex == PLAYER_LIMB_WAIST) {
- if (player->meleeWeaponState != 0) {
+ if (player->meleeWeaponState != PLAYER_MELEE_WEAPON_STATE_0) {
if (player->meleeWeaponAnimation == PLAYER_MWA_GORON_PUNCH_BUTT) {
Math_Vec3f_Copy(&player->unk_AF0[1], &player->meleeWeaponInfo[0].base);
func_8012669C(play, player, D_801C0A90, D_801C0A6C);
diff --git a/src/code/z_prenmi.c b/src/code/z_prenmi.c
index e0381153a..94d235a37 100644
--- a/src/code/z_prenmi.c
+++ b/src/code/z_prenmi.c
@@ -22,7 +22,7 @@ void PreNMI_Draw(PreNMIState* this) {
OPEN_DISPS(gfxCtx);
- func_8012C470(gfxCtx);
+ Gfx_SetupDL36_Opa(gfxCtx);
gDPSetFillColor(POLY_OPA_DISP++, (GPACK_RGBA5551(255, 255, 255, 1) << 16) | GPACK_RGBA5551(255, 255, 255, 1));
gDPFillRectangle(POLY_OPA_DISP++, 0, this->timer + 100, SCREEN_WIDTH - 1, this->timer + 100);
diff --git a/src/code/z_quake.c b/src/code/z_quake.c
index d8d526ca3..c5115375c 100644
--- a/src/code/z_quake.c
+++ b/src/code/z_quake.c
@@ -3,35 +3,28 @@
#include "z64view.h"
typedef struct {
- /* 0x00 */ s16 randIndex;
- /* 0x02 */ s16 countdownMax;
+ /* 0x00 */ s16 index;
+ /* 0x02 */ s16 duration;
/* 0x04 */ Camera* camera;
/* 0x08 */ u32 type;
- /* 0x0C */ s16 verticalMag;
- /* 0x0E */ s16 horizontalMag;
- /* 0x10 */ s16 zoom;
- /* 0x12 */ s16 rollOffset;
- /* 0x14 */ Vec3s shakePlaneOffset; // angle deviations from shaking in the perpendicular plane
+ /* 0x0C */ s16 y;
+ /* 0x0E */ s16 x;
+ /* 0x10 */ s16 fov;
+ /* 0x12 */ s16 upRollOffset;
+ /* 0x14 */ Vec3s orientation; // alters the orientation of the xy perturbation. Only x (pitch) and y (yaw) are used
/* 0x1A */ s16 speed;
- /* 0x1C */ s16 isShakePerpendicular;
- /* 0x1E */ s16 countdown;
+ /* 0x1C */ s16 isRelativeToScreen; // is the quake relative to the screen or on world coordinates
+ /* 0x1E */ s16 timer;
/* 0x20 */ s16 camId;
} QuakeRequest; // size = 0x24
typedef struct {
/* 0x0 */ PlayState* play;
/* 0x4 */ s32 type; // bitfield, highest set bit determines type
- /* 0x8 */ s16 countdown;
+ /* 0x8 */ s16 timer;
/* 0xA */ s16 state;
} DistortionRequest; // size = 0xC
-typedef struct {
- /* 0x00 */ Vec3f atOffset;
- /* 0x0C */ Vec3f eyeOffset;
- /* 0x18 */ s16 rollOffset;
- /* 0x1A */ s16 zoom;
-} ShakeInfo; // size = 0x1C
-
typedef s16 (*QuakeCallbackFunc)(QuakeRequest*, ShakeInfo*);
typedef enum {
@@ -40,230 +33,257 @@ typedef enum {
/* 2 */ DISTORTION_SETUP
} DistortionState;
-QuakeRequest sQuakeRequest[4];
+QuakeRequest sQuakeRequests[4];
DistortionRequest sDistortionRequest;
-static s16 sIsQuakeInitialized = true;
+static s16 sQuakeUnused = 1;
static s16 sQuakeRequestCount = 0;
f32 Quake_Random(void) {
return 2.0f * (Rand_ZeroOne() - 0.5f);
}
-void Quake_UpdateShakeInfo(QuakeRequest* req, ShakeInfo* shake, f32 verticalPertubation, f32 horizontalPertubation) {
+void Quake_UpdateShakeInfo(QuakeRequest* req, ShakeInfo* shake, f32 yOffset, f32 xOffset) {
Vec3f* at = &req->camera->at;
Vec3f* eye = &req->camera->eye;
Vec3f atEyeOffset;
- VecSph atEyeOffsetSph2;
- VecSph eyeAtAngle;
+ VecSph geo;
+ VecSph eyeToAtGeo;
- // isShakePerpendicular is always set to 1 before reaching this conditional
- // alternative is an unused fixed vertical shake
- if (req->isShakePerpendicular) {
+ if (req->isRelativeToScreen) {
atEyeOffset.x = 0;
atEyeOffset.y = 0;
atEyeOffset.z = 0;
- OLib_Vec3fDiffToVecSphGeo(&eyeAtAngle, eye, at);
+ OLib_Vec3fDiffToVecGeo(&eyeToAtGeo, eye, at);
- atEyeOffsetSph2.r = req->verticalMag * verticalPertubation;
- atEyeOffsetSph2.pitch = eyeAtAngle.pitch + req->shakePlaneOffset.x + 0x4000;
- atEyeOffsetSph2.yaw = eyeAtAngle.yaw + req->shakePlaneOffset.y;
- OLib_VecSphAddToVec3f(&atEyeOffset, &atEyeOffset, &atEyeOffsetSph2);
+ // y shake
+ geo.r = req->y * yOffset;
+ // point unit vector up, then add on `req->orientation`
+ geo.pitch = eyeToAtGeo.pitch + req->orientation.x + 0x4000;
+ geo.yaw = eyeToAtGeo.yaw + req->orientation.y;
+ // apply y shake
+ OLib_AddVecGeoToVec3f(&atEyeOffset, &atEyeOffset, &geo);
- atEyeOffsetSph2.r = req->horizontalMag * horizontalPertubation;
- atEyeOffsetSph2.pitch = eyeAtAngle.pitch + req->shakePlaneOffset.x;
- atEyeOffsetSph2.yaw = eyeAtAngle.yaw + req->shakePlaneOffset.y + 0x4000;
- OLib_VecSphAddToVec3f(&atEyeOffset, &atEyeOffset, &atEyeOffsetSph2);
+ // x shake
+ geo.r = req->x * xOffset;
+ // point unit vector left, then add on `req->orientation`
+ geo.pitch = eyeToAtGeo.pitch + req->orientation.x;
+ geo.yaw = eyeToAtGeo.yaw + req->orientation.y + 0x4000;
+ // apply x shake
+ OLib_AddVecGeoToVec3f(&atEyeOffset, &atEyeOffset, &geo);
} else {
atEyeOffset.x = 0;
- atEyeOffset.y = req->verticalMag * verticalPertubation;
+ atEyeOffset.y = req->y * yOffset;
atEyeOffset.z = 0;
- atEyeOffsetSph2.r = req->horizontalMag * horizontalPertubation;
- atEyeOffsetSph2.pitch = req->shakePlaneOffset.x;
- atEyeOffsetSph2.yaw = req->shakePlaneOffset.y;
+ geo.r = req->x * xOffset;
+ geo.pitch = req->orientation.x;
+ geo.yaw = req->orientation.y;
- OLib_VecSphAddToVec3f(&atEyeOffset, &atEyeOffset, &atEyeOffsetSph2);
+ OLib_AddVecGeoToVec3f(&atEyeOffset, &atEyeOffset, &geo);
}
shake->atOffset = shake->eyeOffset = atEyeOffset;
- shake->rollOffset = req->rollOffset * verticalPertubation;
- shake->zoom = req->zoom * verticalPertubation;
+ shake->upRollOffset = req->upRollOffset * yOffset;
+ shake->fovOffset = req->fov * yOffset;
}
s16 Quake_CallbackType1(QuakeRequest* req, ShakeInfo* shake) {
- if (req->countdown > 0) {
- f32 perpendicularPertubation = Math_SinS(req->speed * req->countdown);
+ if (req->timer > 0) {
+ f32 xyOffset = Math_SinS(req->speed * req->timer);
- Quake_UpdateShakeInfo(req, shake, perpendicularPertubation, Rand_ZeroOne() * perpendicularPertubation);
- req->countdown--;
+ Quake_UpdateShakeInfo(req, shake, xyOffset, Rand_ZeroOne() * xyOffset);
+ req->timer--;
}
- return req->countdown;
+ return req->timer;
}
s16 Quake_CallbackType5(QuakeRequest* req, ShakeInfo* shake) {
- if (req->countdown > 0) {
- f32 perpendicularPertubation = Math_SinS(req->speed * req->countdown);
+ if (req->timer > 0) {
+ f32 xyOffset = Math_SinS(req->speed * req->timer);
- Quake_UpdateShakeInfo(req, shake, perpendicularPertubation, perpendicularPertubation);
- req->countdown--;
+ Quake_UpdateShakeInfo(req, shake, xyOffset, xyOffset);
+ req->timer--;
}
- return req->countdown;
+ return req->timer;
}
s16 Quake_CallbackType6(QuakeRequest* req, ShakeInfo* shake) {
- f32 perpendicularPertubation;
+ f32 xyOffset;
- req->countdown--;
- perpendicularPertubation = Math_SinS(req->speed * ((req->countdown & 0xF) + 500));
- Quake_UpdateShakeInfo(req, shake, perpendicularPertubation, Rand_ZeroOne() * perpendicularPertubation);
+ req->timer--;
+ xyOffset = Math_SinS(req->speed * ((req->timer & 0xF) + 500));
+ Quake_UpdateShakeInfo(req, shake, xyOffset, Rand_ZeroOne() * xyOffset);
+
+ // Not returning the timer ensures quake type 6 continues indefinitely until manually removed
return 1;
}
s16 Quake_CallbackType3(QuakeRequest* req, ShakeInfo* shake) {
- if (req->countdown > 0) {
- f32 perpendicularPertubation =
- Math_SinS(req->speed * req->countdown) * ((f32)req->countdown / (f32)req->countdownMax);
+ if (req->timer > 0) {
+ f32 xyOffset = Math_SinS(req->speed * req->timer) * ((f32)req->timer / req->duration);
- Quake_UpdateShakeInfo(req, shake, perpendicularPertubation, perpendicularPertubation);
- req->countdown--;
+ Quake_UpdateShakeInfo(req, shake, xyOffset, xyOffset);
+ req->timer--;
}
- return req->countdown;
+ return req->timer;
}
s16 Quake_CallbackType2(QuakeRequest* req, ShakeInfo* shake) {
- if (req->countdown > 0) {
- f32 perpendicularPertubation = Quake_Random();
+ if (req->timer > 0) {
+ f32 xyOffset = Quake_Random();
- Quake_UpdateShakeInfo(req, shake, perpendicularPertubation, Rand_ZeroOne() * perpendicularPertubation);
- req->countdown--;
+ Quake_UpdateShakeInfo(req, shake, xyOffset, Rand_ZeroOne() * xyOffset);
+ req->timer--;
}
- return req->countdown;
+ return req->timer;
}
s16 Quake_CallbackType4(QuakeRequest* req, ShakeInfo* shake) {
- if (req->countdown > 0) {
- f32 perpendicularPertubation = Quake_Random() * ((f32)req->countdown / (f32)req->countdownMax);
+ if (req->timer > 0) {
+ f32 xyOffset = Quake_Random() * ((f32)req->timer / req->duration);
- Quake_UpdateShakeInfo(req, shake, perpendicularPertubation, Rand_ZeroOne() * perpendicularPertubation);
- req->countdown--;
+ Quake_UpdateShakeInfo(req, shake, xyOffset, Rand_ZeroOne() * xyOffset);
+ req->timer--;
}
- return req->countdown;
+ return req->timer;
}
s16 Quake_GetFreeIndex(void) {
s32 i;
- s32 ret = 0;
- s32 min = 0x10000;
+ s32 index = 0;
+ s32 timerMin = UINT16_MAX + 1; // timer is a short, so start with a value beyond its range
- for (i = 0; i < ARRAY_COUNT(sQuakeRequest); i++) {
- if (sQuakeRequest[i].type == 0) {
- ret = i;
+ for (i = 0; i < ARRAY_COUNT(sQuakeRequests); i++) {
+ if (sQuakeRequests[i].type == QUAKE_TYPE_NONE) {
+ index = i;
break;
}
- if (sQuakeRequest[i].countdown < min) {
- min = sQuakeRequest[i].countdown;
- ret = i;
+ if (timerMin > sQuakeRequests[i].timer) {
+ timerMin = sQuakeRequests[i].timer;
+ index = i;
}
}
- return ret;
+ return index;
}
-QuakeRequest* Quake_AddImpl(Camera* camera, u32 type) {
+QuakeRequest* Quake_RequestImpl(Camera* camera, u32 type) {
s16 index = Quake_GetFreeIndex();
- QuakeRequest* req = &sQuakeRequest[index];
+ QuakeRequest* req = &sQuakeRequests[index];
__osMemset(req, 0, sizeof(QuakeRequest));
+
req->camera = camera;
req->camId = camera->camId;
req->type = type;
- req->isShakePerpendicular = true;
- req->randIndex = ((s16)(Rand_ZeroOne() * 0x10000) & ~3) + index;
+ req->isRelativeToScreen = true;
+
+ // Add a unique random identifier to the upper bits of the index
+ // The `~3` assumes there are only 4 requests
+ req->index = index + ((s16)(Rand_ZeroOne() * 0x10000) & ~3);
+
sQuakeRequestCount++;
return req;
}
-void Quake_RemoveRequest(QuakeRequest* req) {
- req->type = 0;
- req->countdown = -1;
+void Quake_Remove(QuakeRequest* req) {
+ req->type = QUAKE_TYPE_NONE;
+ req->timer = -1;
sQuakeRequestCount--;
}
-QuakeRequest* Quake_GetRequest(s16 quakeIndex) {
- QuakeRequest* req = &sQuakeRequest[quakeIndex & 3];
+QuakeRequest* Quake_GetRequest(s16 index) {
+ QuakeRequest* req = &sQuakeRequests[index & 3];
- if (req->type == 0) {
+ if (req->type == QUAKE_TYPE_NONE) {
return NULL;
}
- if (quakeIndex != req->randIndex) {
+ if (index != req->index) {
return NULL;
}
return req;
}
-u32 Quake_SetValue(s16 quakeIndex, s16 valueType, s16 value) {
- QuakeRequest* req = Quake_GetRequest(quakeIndex);
+// valueType for Quake_SetValue()
+#define QUAKE_SPEED (1 << 0)
+#define QUAKE_Y_OFFSET (1 << 1)
+#define QUAKE_X_OFFSET (1 << 2)
+#define QUAKE_FOV (1 << 3)
+#define QUAKE_ROLL (1 << 4)
+#define QUAKE_ORIENTATION_PITCH (1 << 5)
+#define QUAKE_ORIENTATION_YAW (1 << 6)
+#define QUAKE_ORIENTATION_ROLL (1 << 7)
+#define QUAKE_DURATION (1 << 8)
+#define QUAKE_IS_RELATIVE_TO_SCREEN (1 << 9)
+
+u32 Quake_SetValue(s16 index, s16 valueType, s16 value) {
+ QuakeRequest* req = Quake_GetRequest(index);
if (req == NULL) {
return false;
- } else {
- switch (valueType) {
- case QUAKE_SPEED:
- req->speed = value;
- break;
-
- case QUAKE_VERTICAL_MAG:
- req->verticalMag = value;
- break;
-
- case QUAKE_HORIZONTAL_MAG:
- req->horizontalMag = value;
- break;
-
- case QUAKE_ZOOM:
- req->zoom = value;
- break;
-
- case QUAKE_ROLL_OFFSET:
- req->rollOffset = value;
- break;
-
- case QUAKE_SHAKE_PLANE_OFFSET_X:
- req->shakePlaneOffset.x = value;
- break;
-
- case QUAKE_SHAKE_PLANE_OFFSET_Y:
- req->shakePlaneOffset.y = value;
- break;
-
- case QUAKE_SHAKE_PLANE_OFFSET_Z:
- req->shakePlaneOffset.z = value;
- break;
-
- case QUAKE_COUNTDOWN:
- req->countdown = value;
- req->countdownMax = req->countdown;
- break;
-
- case QUAKE_IS_SHAKE_PERPENDICULAR:
- req->isShakePerpendicular = value;
- break;
-
- default:
- break;
- }
-
- return true;
}
+
+ switch (valueType) {
+ case QUAKE_SPEED:
+ req->speed = value;
+ break;
+
+ case QUAKE_Y_OFFSET:
+ req->y = value;
+ break;
+
+ case QUAKE_X_OFFSET:
+ req->x = value;
+ break;
+
+ case QUAKE_FOV:
+ req->fov = value;
+ break;
+
+ case QUAKE_ROLL:
+ req->upRollOffset = value;
+ break;
+
+ case QUAKE_ORIENTATION_PITCH:
+ req->orientation.x = value;
+ break;
+
+ case QUAKE_ORIENTATION_YAW:
+ req->orientation.y = value;
+ break;
+
+ case QUAKE_ORIENTATION_ROLL:
+ req->orientation.z = value;
+ break;
+
+ case QUAKE_DURATION:
+ req->timer = value;
+ req->duration = req->timer;
+ break;
+
+ case QUAKE_IS_RELATIVE_TO_SCREEN:
+ req->isRelativeToScreen = value;
+ break;
+
+ default:
+ break;
+ }
+
+ return true;
}
-u32 Quake_SetSpeed(s16 quakeIndex, s16 speed) {
- QuakeRequest* req = Quake_GetRequest(quakeIndex);
+/**
+ * @param index
+ * @param speed for periodic types only, the angular frequency of the sine wave (binang / frame)
+ * @return true if successfully applied, false if the request does not exist
+ */
+u32 Quake_SetSpeed(s16 index, s16 speed) {
+ QuakeRequest* req = Quake_GetRequest(index);
if (req != NULL) {
req->speed = speed;
@@ -272,45 +292,67 @@ u32 Quake_SetSpeed(s16 quakeIndex, s16 speed) {
return false;
}
-u32 Quake_SetCountdown(s16 quakeIndex, s16 countdown) {
- QuakeRequest* req = Quake_GetRequest(quakeIndex);
+/**
+ * @param index quake request index to apply
+ * @param duration number of frames to apply the quake
+ * @return true if successfully applied, false if the request does not exist
+ */
+u32 Quake_SetDuration(s16 index, s16 duration) {
+ QuakeRequest* req = Quake_GetRequest(index);
if (req != NULL) {
- req->countdown = countdown;
- req->countdownMax = req->countdown;
+ req->duration = req->timer = duration;
return true;
}
return false;
}
-s16 Quake_GetCountdown(s16 quakeIndex) {
- QuakeRequest* req = Quake_GetRequest(quakeIndex);
+/**
+ * @param index quake request index to get
+ * @return number of frames until the quake is finished
+ */
+s16 Quake_GetTimeLeft(s16 index) {
+ QuakeRequest* req = Quake_GetRequest(index);
if (req != NULL) {
- return req->countdown;
+ return req->timer;
}
return 0;
}
-u32 Quake_SetQuakeValues(s16 quakeIndex, s16 verticalMag, s16 horizontalMag, s16 zoom, s16 rollOffset) {
- QuakeRequest* req = Quake_GetRequest(quakeIndex);
+/**
+ * @param index quake request index to apply
+ * @param y apply up/down shake
+ * @param x apply left/right shake
+ * @param fov apply zooming in/out shake (binang)
+ * @param roll apply rolling shake (binang)
+ * @return true if successfully applied, false if the request does not exist
+ */
+u32 Quake_SetPerturbations(s16 index, s16 y, s16 x, s16 fov, s16 roll) {
+ QuakeRequest* req = Quake_GetRequest(index);
if (req != NULL) {
- req->verticalMag = verticalMag;
- req->horizontalMag = horizontalMag;
- req->zoom = zoom;
- req->rollOffset = rollOffset;
+ req->y = y;
+ req->x = x;
+ req->fov = fov;
+ req->upRollOffset = roll;
return true;
}
return false;
}
-u32 Quake_SetQuakeValues2(s16 quakeIndex, s16 isShakePerpendicular, Vec3s shakePlaneOffset) {
- QuakeRequest* req = Quake_GetRequest(quakeIndex);
+/**
+ * @param index quake request index to apply
+ * @param isRelativeToScreen is the quake applied relative to the screen or in absolute world coordinates
+ * @param orientation orient the x/y shake to a different direction
+ * @return true if successfully applied, false if the request does not exist
+ */
+u32 Quake_SetOrientation(s16 index, s16 isRelativeToScreen, Vec3s orientation) {
+ QuakeRequest* req = Quake_GetRequest(index);
if (req != NULL) {
- req->isShakePerpendicular = isShakePerpendicular;
- req->shakePlaneOffset = shakePlaneOffset;
+ req->isRelativeToScreen = isRelativeToScreen;
+ req->orientation = orientation;
return true;
}
return false;
@@ -319,156 +361,167 @@ u32 Quake_SetQuakeValues2(s16 quakeIndex, s16 isShakePerpendicular, Vec3s shakeP
void Quake_Init(void) {
s16 i;
- for (i = 0; i < ARRAY_COUNT(sQuakeRequest); i++) {
- sQuakeRequest[i].type = 0;
- sQuakeRequest[i].countdown = 0;
+ for (i = 0; i < ARRAY_COUNT(sQuakeRequests); i++) {
+ sQuakeRequests[i].type = QUAKE_TYPE_NONE;
+ sQuakeRequests[i].timer = 0;
}
- sIsQuakeInitialized = true;
+ sQuakeUnused = 1;
sQuakeRequestCount = 0;
}
-s16 Quake_Add(Camera* camera, u32 type) {
- return Quake_AddImpl(camera, type)->randIndex;
+s16 Quake_Request(Camera* camera, u32 type) {
+ return Quake_RequestImpl(camera, type)->index;
}
-u32 Quake_Remove(s16 index) {
+u32 Quake_RemoveRequest(s16 index) {
QuakeRequest* req = Quake_GetRequest(index);
if (req != NULL) {
- Quake_RemoveRequest(req);
+ Quake_Remove(req);
return true;
}
return false;
}
static QuakeCallbackFunc sQuakeCallbacks[] = {
- NULL,
- Quake_CallbackType1,
- Quake_CallbackType2,
- Quake_CallbackType3,
- Quake_CallbackType4,
- Quake_CallbackType5,
- Quake_CallbackType6,
+ NULL, // QUAKE_TYPE_NONE
+ Quake_CallbackType1, // QUAKE_TYPE_1
+ Quake_CallbackType2, // QUAKE_TYPE_2
+ Quake_CallbackType3, // QUAKE_TYPE_3
+ Quake_CallbackType4, // QUAKE_TYPE_4
+ Quake_CallbackType5, // QUAKE_TYPE_5
+ Quake_CallbackType6, // QUAKE_TYPE_6
};
-s16 Quake_Calc(Camera* camera, QuakeCamCalc* camData) {
- s32 pad;
- QuakeRequest* req;
- ShakeInfo shake;
+s16 Quake_Update(Camera* camera, ShakeInfo* camShake) {
f32 absSpeedDiv;
+ ShakeInfo shake;
+ QuakeRequest* req;
f32 maxCurr;
f32 maxNext;
s32 index;
- s32 ret;
- u32 eq;
- Vec3f originVec;
+ s32 numQuakesApplied;
+ u32 isDifferentCamId;
+ Vec3f zeroVec;
PlayState* play = camera->play;
- originVec.x = 0.0f;
- originVec.y = 0.0f;
- originVec.z = 0.0f;
- camData->atOffset.x = 0.0f;
- camData->atOffset.y = 0.0f;
- camData->atOffset.z = 0.0f;
- camData->eyeOffset.x = 0.0f;
- camData->eyeOffset.y = 0.0f;
- camData->eyeOffset.z = 0.0f;
- camData->rollOffset = 0;
- camData->zoom = 0;
- camData->max = 0.0f;
+ zeroVec.x = 0.0f;
+ zeroVec.y = 0.0f;
+ zeroVec.z = 0.0f;
+
+ camShake->atOffset.x = 0.0f;
+ camShake->atOffset.y = 0.0f;
+ camShake->atOffset.z = 0.0f;
+
+ camShake->eyeOffset.x = 0.0f;
+ camShake->eyeOffset.y = 0.0f;
+ camShake->eyeOffset.z = 0.0f;
+
+ camShake->upRollOffset = 0;
+ camShake->fovOffset = 0;
+ camShake->maxOffset = 0.0f;
if (sQuakeRequestCount == 0) {
return 0;
}
- ret = 0;
- for (index = 0; index < ARRAY_COUNT(sQuakeRequest); index++) {
- req = &sQuakeRequest[index];
- if (req->type != 0) {
- if (play->cameraPtrs[req->camId] == NULL) {
- Quake_RemoveRequest(req);
- } else {
- eq = (camera->camId != req->camera->camId);
- absSpeedDiv = ABS(req->speed) / (f32)0x8000;
- if (sQuakeCallbacks[req->type](req, &shake) == 0) {
- Quake_RemoveRequest(req);
- } else if (eq == 0) {
- if (fabsf(camData->atOffset.x) < fabsf(shake.atOffset.x)) {
- camData->atOffset.x = shake.atOffset.x;
- }
- if (fabsf(camData->atOffset.y) < fabsf(shake.atOffset.y)) {
- camData->atOffset.y = shake.atOffset.y;
- }
- if (fabsf(camData->atOffset.z) < fabsf(shake.atOffset.z)) {
- camData->atOffset.z = shake.atOffset.z;
- }
- if (fabsf(camData->eyeOffset.x) < fabsf(shake.eyeOffset.x)) {
- camData->eyeOffset.x = shake.eyeOffset.x;
- }
- if (fabsf(camData->eyeOffset.y) < fabsf(shake.eyeOffset.y)) {
- camData->eyeOffset.y = shake.eyeOffset.y;
- }
- if (fabsf(camData->eyeOffset.z) < fabsf(shake.eyeOffset.z)) {
- camData->eyeOffset.z = shake.eyeOffset.z;
- }
- if (camData->rollOffset < shake.rollOffset) {
- camData->rollOffset = shake.rollOffset;
- }
- if (camData->zoom < shake.zoom) {
- camData->zoom = shake.zoom;
- }
-
- maxCurr = OLib_Vec3fDist(&shake.atOffset, &originVec) * absSpeedDiv;
-
- maxNext = OLib_Vec3fDist(&shake.eyeOffset, &originVec) * absSpeedDiv;
- maxCurr = CLAMP_MIN(maxCurr, maxNext);
-
- maxNext = (camData->rollOffset * (7.0f / 2500.0f)) * absSpeedDiv;
- maxCurr = CLAMP_MIN(maxCurr, maxNext);
-
- maxNext = (camData->zoom * (7.0f / 2500.0f)) * absSpeedDiv;
- maxCurr = CLAMP_MIN(maxCurr, maxNext);
-
- if (camData->max < maxCurr) {
- camData->max = maxCurr;
- }
-
- ret++;
- }
- }
+ numQuakesApplied = 0;
+ for (index = 0; index < ARRAY_COUNT(sQuakeRequests); index++) {
+ req = &sQuakeRequests[index];
+ if (req->type == QUAKE_TYPE_NONE) {
+ continue;
}
+
+ if (play->cameraPtrs[req->camId] == NULL) {
+ Quake_Remove(req);
+ continue;
+ }
+
+ isDifferentCamId = (camera->camId != req->camera->camId);
+ absSpeedDiv = (f32)ABS(req->speed) / 0x8000;
+ if (sQuakeCallbacks[req->type](req, &shake) == 0) {
+ // Quake has reached the end of its timer.
+ Quake_Remove(req);
+ continue;
+ }
+
+ if (isDifferentCamId) {
+ // Quake is attached to a different camId
+ continue;
+ }
+
+ if (fabsf(camShake->atOffset.x) < fabsf(shake.atOffset.x)) {
+ camShake->atOffset.x = shake.atOffset.x;
+ }
+ if (fabsf(camShake->atOffset.y) < fabsf(shake.atOffset.y)) {
+ camShake->atOffset.y = shake.atOffset.y;
+ }
+ if (fabsf(camShake->atOffset.z) < fabsf(shake.atOffset.z)) {
+ camShake->atOffset.z = shake.atOffset.z;
+ }
+ if (fabsf(camShake->eyeOffset.x) < fabsf(shake.eyeOffset.x)) {
+ camShake->eyeOffset.x = shake.eyeOffset.x;
+ }
+ if (fabsf(camShake->eyeOffset.y) < fabsf(shake.eyeOffset.y)) {
+ camShake->eyeOffset.y = shake.eyeOffset.y;
+ }
+ if (fabsf(camShake->eyeOffset.z) < fabsf(shake.eyeOffset.z)) {
+ camShake->eyeOffset.z = shake.eyeOffset.z;
+ }
+ if (camShake->upRollOffset < shake.upRollOffset) {
+ camShake->upRollOffset = shake.upRollOffset;
+ }
+ if (camShake->fovOffset < shake.fovOffset) {
+ camShake->fovOffset = shake.fovOffset;
+ }
+
+ maxCurr = OLib_Vec3fDist(&shake.atOffset, &zeroVec) * absSpeedDiv;
+ maxNext = OLib_Vec3fDist(&shake.eyeOffset, &zeroVec) * absSpeedDiv;
+ maxCurr = CLAMP_MIN(maxCurr, maxNext);
+
+ maxNext = (camShake->upRollOffset * (7.0f / 2500.0f)) * absSpeedDiv;
+ maxCurr = CLAMP_MIN(maxCurr, maxNext);
+
+ maxNext = (camShake->fovOffset * (7.0f / 2500.0f)) * absSpeedDiv;
+ maxCurr = CLAMP_MIN(maxCurr, maxNext);
+
+ if (camShake->maxOffset < maxCurr) {
+ camShake->maxOffset = maxCurr;
+ }
+
+ numQuakesApplied++;
}
- return ret;
+ return numQuakesApplied;
}
void Distortion_Init(PlayState* play) {
sDistortionRequest.play = play;
View_ClearDistortion(&play->view);
sDistortionRequest.type = 0;
- sDistortionRequest.countdown = 0;
+ sDistortionRequest.timer = 0;
sDistortionRequest.state = DISTORTION_INACTIVE;
}
-void Distortion_SetCountdown(s16 countdown) {
- sDistortionRequest.countdown = countdown;
+void Distortion_SetDuration(s16 duration) {
+ sDistortionRequest.timer = duration;
sDistortionRequest.state = DISTORTION_SETUP;
}
-s16 Distortion_GetCountdown(void) {
- return sDistortionRequest.countdown;
+s16 Distortion_GetTimeLeft(void) {
+ return sDistortionRequest.timer;
}
s16 Distortion_GetType(void) {
return sDistortionRequest.type;
}
-void Distortion_SetType(s32 type) {
+void Distortion_Request(s32 type) {
if (sDistortionRequest.type < type) {
sDistortionRequest.type = type;
}
}
-void Distortion_ClearType(s32 type) {
+void Distortion_RemoveRequest(s32 type) {
if (sDistortionRequest.type == type) {
sDistortionRequest.type = 0;
}
@@ -489,7 +542,7 @@ ConveyorSpeed Distortion_GetUnderwaterCurrentSpeed(Player* player) {
void Distortion_Update(void) {
static s16 depthPhase = 0x3F0;
static s16 screenPlanePhase = 0x156;
- static s16 countdownMax = 1;
+ static s16 duration = 1;
f32 xyScaleFactor;
f32 zScaleFactor;
f32 speedScaleFactor;
@@ -511,8 +564,8 @@ void Distortion_Update(void) {
f32 speedRatio = CLAMP_MAX(camera->speedRatio, 1.0f);
if (sDistortionRequest.type != 0) {
- if (sDistortionRequest.type & DISTORTION_TYPE_B) {
- sDistortionRequest.countdown = 2;
+ if (sDistortionRequest.type & DISTORTION_TYPE_MASK_TRANSFORM_2) {
+ sDistortionRequest.timer = 2;
depthPhase = 0x3F0;
screenPlanePhase = 0x156;
@@ -528,17 +581,17 @@ void Distortion_Update(void) {
zScale = 0.0f;
speed = 0.6f;
- xyScaleFactor = zScaleFactor = sDistortionRequest.countdown / 60.0f;
+ xyScaleFactor = zScaleFactor = sDistortionRequest.timer / 60.0f;
speedScaleFactor = 1.0f;
- } else if (sDistortionRequest.type & DISTORTION_TYPE_A) {
+ } else if (sDistortionRequest.type & DISTORTION_TYPE_BOSS_WARP) {
if (sDistortionRequest.state == DISTORTION_SETUP) {
- countdownMax = sDistortionRequest.countdown;
+ duration = sDistortionRequest.timer;
depthPhase = 0x3F0;
screenPlanePhase = 0x156;
}
depthPhaseStep = 0.0f;
- screenPlanePhaseStep = 50.0f / countdownMax;
+ screenPlanePhaseStep = 50.0f / duration;
rotX = 0.0f;
rotY = 0.0f;
@@ -549,11 +602,11 @@ void Distortion_Update(void) {
zScale = 0.0f;
speed = 0.4f;
- xyScaleFactor = zScaleFactor = ((f32)countdownMax - sDistortionRequest.countdown) / (f32)countdownMax;
+ xyScaleFactor = zScaleFactor = ((f32)duration - sDistortionRequest.timer) / (f32)duration;
speedScaleFactor = 0.5f;
- } else if (sDistortionRequest.type & DISTORTION_TYPE_9) {
+ } else if (sDistortionRequest.type & DISTORTION_TYPE_MASK_TRANSFORM_1) {
if (sDistortionRequest.state == DISTORTION_SETUP) {
- countdownMax = sDistortionRequest.countdown;
+ duration = sDistortionRequest.timer;
depthPhase = 0x1FC;
screenPlanePhase = 0x156;
}
@@ -570,11 +623,11 @@ void Distortion_Update(void) {
zScale = 0.0f;
speed = 0.1f;
- xyScaleFactor = zScaleFactor = ((f32)countdownMax - sDistortionRequest.countdown) / (f32)countdownMax;
+ xyScaleFactor = zScaleFactor = ((f32)duration - sDistortionRequest.timer) / (f32)duration;
speedScaleFactor = 1.0f;
- } else if (sDistortionRequest.type & DISTORTION_TYPE_8) {
+ } else if (sDistortionRequest.type & DISTORTION_TYPE_GORON_BUTT) {
if (sDistortionRequest.state == DISTORTION_SETUP) {
- countdownMax = sDistortionRequest.countdown;
+ duration = sDistortionRequest.timer;
depthPhase = 0x2710;
screenPlanePhase = 0x3E8;
}
@@ -591,15 +644,15 @@ void Distortion_Update(void) {
zScale = 0.01f;
speed = 1.5f;
- if (sDistortionRequest.countdown < 5) {
- xyScaleFactor = zScaleFactor = ((f32)countdownMax - sDistortionRequest.countdown) / (f32)countdownMax;
+ if (sDistortionRequest.timer < 5) {
+ xyScaleFactor = zScaleFactor = ((f32)duration - sDistortionRequest.timer) / (f32)duration;
} else {
xyScaleFactor = zScaleFactor = 0.0f;
}
speedScaleFactor = 1.0f;
- } else if (sDistortionRequest.type & DISTORTION_TYPE_7) {
+ } else if (sDistortionRequest.type & DISTORTION_TYPE_UNK_ATTACK) {
if (sDistortionRequest.state == DISTORTION_SETUP) {
- countdownMax = sDistortionRequest.countdown;
+ duration = sDistortionRequest.timer;
depthPhase = 0x4B0;
screenPlanePhase = 0x7D0;
}
@@ -616,11 +669,11 @@ void Distortion_Update(void) {
zScale = 0.01f;
speed = 1.5f;
- xyScaleFactor = zScaleFactor = sDistortionRequest.countdown / (f32)countdownMax;
+ xyScaleFactor = zScaleFactor = sDistortionRequest.timer / (f32)duration;
speedScaleFactor = 1.0f;
- } else if (sDistortionRequest.type & DISTORTION_TYPE_6) {
+ } else if (sDistortionRequest.type & DISTORTION_TYPE_ZORA_KICK) {
if (sDistortionRequest.state == DISTORTION_SETUP) {
- countdownMax = sDistortionRequest.countdown;
+ duration = sDistortionRequest.timer;
depthPhase = 0x9C4;
screenPlanePhase = 0xBB8;
}
@@ -637,14 +690,14 @@ void Distortion_Update(void) {
zScale = 0.01f;
speed = 1.3f;
- if (sDistortionRequest.countdown < 4) {
- xyScaleFactor = zScaleFactor = sDistortionRequest.countdown / (f32)countdownMax;
+ if (sDistortionRequest.timer < 4) {
+ xyScaleFactor = zScaleFactor = sDistortionRequest.timer / (f32)duration;
} else {
xyScaleFactor = zScaleFactor = 0.0f;
}
speedScaleFactor = 1.0f;
- } else if (sDistortionRequest.type & DISTORTION_TYPE_5) {
- sDistortionRequest.countdown = 2;
+ } else if (sDistortionRequest.type & DISTORTION_TYPE_SONG_OF_TIME) {
+ sDistortionRequest.timer = 2;
if (sDistortionRequest.state == DISTORTION_SETUP) {
depthPhase = 0x9C4;
screenPlanePhase = 0xBB8;
@@ -670,7 +723,7 @@ void Distortion_Update(void) {
speedScaleFactor = 1.0f;
} else if (sDistortionRequest.type & DISTORTION_TYPE_UNDERWATER_ENTRY) {
if (sDistortionRequest.state == DISTORTION_SETUP) {
- countdownMax = sDistortionRequest.countdown;
+ duration = sDistortionRequest.timer;
depthPhase = 0x760;
screenPlanePhase = 0x1BC;
}
@@ -687,14 +740,14 @@ void Distortion_Update(void) {
zScale = 0.2f;
speed = 0.25f;
- countdownRatio = sDistortionRequest.countdown / (f32)countdownMax;
+ countdownRatio = sDistortionRequest.timer / (f32)duration;
zScaleFactor = xyScaleFactor = countdownRatio;
speedScaleFactor = 1.0f;
} else if (sDistortionRequest.type & DISTORTION_TYPE_ZORA_SWIMMING) {
depthPhase = 0x3F0;
screenPlanePhase = 0x156;
- sDistortionRequest.countdown = 2;
+ sDistortionRequest.timer = 2;
player = GET_PLAYER(play);
if (player != NULL) {
@@ -749,7 +802,7 @@ void Distortion_Update(void) {
depthPhase = 0x3F0;
screenPlanePhase = 0x156;
- sDistortionRequest.countdown = 2;
+ sDistortionRequest.timer = 2;
player = GET_PLAYER(play);
depthPhaseStep = 359.2f;
@@ -796,12 +849,12 @@ void Distortion_Update(void) {
xyScaleFactor = speedScaleFactor = (waterYScaleFactor * 0.15f) + 0.35f + (speedRatio * 0.4f);
zScaleFactor = 0.9f - xyScaleFactor;
- } else if (sDistortionRequest.type & DISTORTION_TYPE_0) {
+ } else if (sDistortionRequest.type & DISTORTION_TYPE_HOT_ROOM) {
// Gives a small mirage-like appearance
depthPhase = 0x3F0;
screenPlanePhase = 0x156;
- sDistortionRequest.countdown = 2;
+ sDistortionRequest.timer = 2;
depthPhaseStep = 0.0f;
screenPlanePhaseStep = 150.0f;
@@ -840,32 +893,25 @@ void Distortion_Update(void) {
View_ClearDistortion(&play->view);
sDistortionRequest.state = DISTORTION_INACTIVE;
- sDistortionRequest.countdown = 0;
+ sDistortionRequest.timer = 0;
}
- if (sDistortionRequest.countdown != 0) {
- sDistortionRequest.countdown--;
- if (sDistortionRequest.countdown == 0) {
+ if (sDistortionRequest.timer != 0) {
+ sDistortionRequest.timer--;
+ if (sDistortionRequest.timer == 0) {
sDistortionRequest.type = 0;
}
}
}
-s32 Quake_NumActiveQuakes(void) {
- QuakeRequest* req = sQuakeRequest;
+s32 Quake_GetNumActiveQuakes(void) {
s32 numActiveQuakes = 0;
+ s32 i;
- if (req[0].type != 0) {
- numActiveQuakes++;
- }
- if (req[1].type != 0) {
- numActiveQuakes++;
- }
- if (req[2].type != 0) {
- numActiveQuakes++;
- }
- if (req[3].type != 0) {
- numActiveQuakes++;
+ for (i = 0; i < ARRAY_COUNT(sQuakeRequests); i++) {
+ if (sQuakeRequests[i].type != QUAKE_TYPE_NONE) {
+ numActiveQuakes++;
+ }
}
return numActiveQuakes;
diff --git a/src/code/z_rcp.c b/src/code/z_rcp.c
index b4bb6ea7d..299639e98 100644
--- a/src/code/z_rcp.c
+++ b/src/code/z_rcp.c
@@ -1,758 +1,834 @@
#include "global.h"
#include "overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope.h"
-Gfx sSetupDL[438] = {
- /* 0x00 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineLERP(PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, PRIMITIVE, 0, TEXEL0, 0, 0, 0, 0, COMBINED, 0, 0, 0,
- COMBINED),
- gsDPSetOtherMode(G_AD_NOISE | G_CD_NOISE | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_FOG_SHADE_A | G_RM_ZB_CLD_SURF2),
- gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_FOG | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x01 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_OFF),
- gsDPSetCombineMode(G_CC_SHADE, G_CC_PASS2),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_FOG_SHADE_A | G_RM_AA_OPA_SURF2),
- gsSPLoadGeometryMode(G_SHADE | G_CULL_BACK | G_FOG | G_LIGHTING | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x02 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_OFF),
- gsDPSetCombineMode(G_CC_SHADE, G_CC_SHADE),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_AA_ZB_OPA_SURF | G_RM_AA_ZB_OPA_SURF2),
- gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_LIGHTING | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x03 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_OFF),
- gsDPSetCombineMode(G_CC_SHADE, G_CC_PASS2),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_FOG_SHADE_A | G_RM_AA_ZB_OPA_SURF2),
- gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_FOG | G_LIGHTING | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x04 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_OFF),
- gsDPSetCombineLERP(PRIMITIVE, 0, SHADE, 0, 0, 0, 0, PRIMITIVE, PRIMITIVE, 0, SHADE, 0, 0, 0, 0, PRIMITIVE),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_AA_ZB_XLU_SURF | G_RM_AA_ZB_XLU_SURF2),
- gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_LIGHTING | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x05 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_MODULATEI_PRIM, G_CC_MODULATEI_PRIM),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_AA_ZB_XLU_SURF | G_RM_AA_ZB_XLU_SURF2),
- gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_LIGHTING | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x06 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_DECALRGBA, G_CC_PASS2),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_FOG_SHADE_A | G_RM_AA_TEX_EDGE2),
- gsSPLoadGeometryMode(G_SHADE | G_FOG | G_LIGHTING | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x07 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_AA_XLU_SURF | G_RM_AA_XLU_SURF2),
- gsSPLoadGeometryMode(G_SHADE | G_LIGHTING | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x08 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_OFF),
- gsDPSetCombineMode(G_CC_SHADE, G_CC_SHADE),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_AA_OPA_SURF | G_RM_AA_OPA_SURF2),
- gsSPLoadGeometryMode(G_SHADE | G_CULL_BACK | G_LIGHTING | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x09 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_MODULATEIA, G_CC_MODULATEIA2),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_FOG_SHADE_A | G_RM_AA_XLU_SURF2),
- gsSPLoadGeometryMode(G_SHADE | G_FOG | G_LIGHTING | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x0A */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_MODULATEIDECALA, G_CC_MODULATEIDECALA),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_AA_OPA_SURF | G_RM_AA_OPA_SURF2),
- gsSPLoadGeometryMode(G_SHADE | G_CULL_BACK | G_LIGHTING | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x0B */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_MODULATEIDECALA, G_CC_MODULATEIA_PRIM2),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_FOG_SHADE_A | G_RM_AA_OPA_SURF2),
- gsSPLoadGeometryMode(G_SHADE | G_CULL_BACK | G_FOG | G_LIGHTING | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x0C */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_MODULATEI_PRIM, G_CC_MODULATEI_PRIM),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_AA_OPA_SURF | G_RM_AA_OPA_SURF2),
- gsSPLoadGeometryMode(G_SHADE | G_CULL_BACK | G_LIGHTING | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x0D */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_XLU_SURF | G_RM_XLU_SURF2),
- gsSPLoadGeometryMode(G_SHADE | G_CULL_BACK | G_LIGHTING | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x0E */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_DECALRGBA, G_CC_DECALRGBA),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_AA_ZB_TEX_EDGE | G_RM_AA_ZB_TEX_EDGE2),
- gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_LIGHTING | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x0F */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_DECALRGBA, G_CC_PASS2),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_FOG_SHADE_A | G_RM_AA_ZB_TEX_EDGE2),
- gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_FOG | G_LIGHTING | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x10 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM2),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_FOG_SHADE_A | G_RM_AA_ZB_XLU_SURF2),
- gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_FOG | G_LIGHTING | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x11 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_MODULATEIDECALA, G_CC_MODULATEIDECALA),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_AA_ZB_TEX_EDGE | G_RM_AA_ZB_TEX_EDGE2),
- gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_LIGHTING | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x12 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_MODULATEIDECALA, G_CC_PASS2),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_FOG_SHADE_A | G_RM_AA_ZB_TEX_EDGE2),
- gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_FOG | G_LIGHTING | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x13 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | AA_EN | Z_CMP | IM_RD | CVG_DST_FULL | ZMODE_OPA | CVG_X_ALPHA |
- FORCE_BL | GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) |
- GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)),
- gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_LIGHTING | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x14 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_THRESHOLD | G_ZS_PIXEL | G_RM_ZB_CLD_SURF | G_RM_ZB_CLD_SURF2),
- gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x15 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_MODULATEIA, G_CC_MODULATEIA),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_AA_ZB_XLU_SURF | G_RM_AA_ZB_XLU_SURF2),
- gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_LIGHTING | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x16 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_MODULATEIA, G_CC_MODULATEIA2),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_FOG_SHADE_A | G_RM_AA_ZB_XLU_SURF2),
- gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_LIGHTING | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x17 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_MODULATEIDECALA, G_CC_MODULATEIDECALA),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_AA_ZB_OPA_SURF | G_RM_AA_ZB_OPA_SURF2),
- gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_LIGHTING | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x18 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_MODULATEIDECALA, G_CC_MODULATEIA2),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_FOG_SHADE_A | G_RM_AA_ZB_OPA_SURF2),
- gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_FOG | G_LIGHTING | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x19 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_MODULATEIDECALA, G_CC_MODULATEIA_PRIM2),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_FOG_SHADE_A | G_RM_AA_ZB_OPA_SURF2),
- gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_FOG | G_LIGHTING | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x1A */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_MODULATEIDECALA, G_CC_MODULATEIA_PRIM2),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_PASS | G_RM_AA_ZB_OPA_SURF2),
- gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_LIGHTING | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x1B */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_MODULATEI_PRIM, G_CC_MODULATEI_PRIM),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_AA_ZB_XLU_SURF | G_RM_AA_ZB_XLU_SURF2),
- gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x1C */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_MODULATEIDECALA_PRIM, G_CC_MODULATEIDECALA_PRIM),
- gsDPSetOtherMode(G_AD_DISABLE | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_RGBA16 | G_TL_TILE |
- G_TD_CLAMP | G_TP_NONE | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_THRESHOLD | G_ZS_PIXEL | G_RM_AA_TEX_EDGE | G_RM_AA_TEX_EDGE2),
- gsSPLoadGeometryMode(G_SHADE | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x1D */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineLERP(TEXEL0, 0, SHADE, 0, TEXEL0, 0, SHADE, 0, NOISE, 0, COMBINED, 0, 0, 0, 0, COMBINED),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_PASS | G_RM_AA_ZB_OPA_SURF2),
- gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_LIGHTING | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x1E */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_OFF),
- gsDPSetCombineMode(G_CC_PRIMITIVE, G_CC_PRIMITIVE),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_AA_ZB_XLU_LINE | G_RM_AA_ZB_XLU_LINE2),
- gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x1F */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_HILITERGBA, G_CC_HILITERGBA),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_AA_ZB_OPA_SURF | G_RM_AA_ZB_OPA_SURF2),
- gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_LIGHTING | G_TEXTURE_GEN | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x20 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_HILITERGBA, G_CC_HILITERGBA),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_AA_ZB_OPA_SURF | G_RM_AA_ZB_OPA_SURF2),
- gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR |
- G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x21 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineLERP(TEXEL0, 0, PRIMITIVE, SHADE, 1, 0, TEXEL0, SHADE, ENVIRONMENT, COMBINED, TEXEL0, COMBINED,
- ENVIRONMENT, COMBINED, TEXEL0, COMBINED),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_PASS | G_RM_AA_ZB_OPA_SURF2),
- gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR |
- G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x22 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_DECALRGB, G_CC_DECALRGB),
- gsDPSetOtherMode(G_AD_DISABLE | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_NONE | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_THRESHOLD | G_ZS_PIXEL | G_RM_OPA_SURF | G_RM_OPA_SURF2),
- gsSPLoadGeometryMode(G_SHADE | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x23 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_DECALRGBA, G_CC_DECALRGBA),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_AA_ZB_XLU_DECAL | G_RM_AA_ZB_XLU_DECAL2),
- gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x24 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_OFF),
- gsDPSetCombineMode(G_CC_SHADE, G_CC_SHADE),
- gsDPSetOtherMode(G_AD_DISABLE | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_NONE | G_CYC_FILL | G_PM_NPRIMITIVE,
- G_AC_THRESHOLD | G_ZS_PIXEL | G_RM_NOOP | G_RM_NOOP2),
- gsSPLoadGeometryMode(G_SHADE | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x25 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_OFF),
- gsDPSetCombineLERP(PRIMITIVE, 0, SHADE, 0, 0, 0, 0, PRIMITIVE, 0, 0, 0, COMBINED, 0, 0, 0, COMBINED),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_FOG_SHADE_A | G_RM_AA_ZB_OPA_SURF2),
- gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_FOG | G_LIGHTING | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x26 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_OFF),
- gsDPSetCombineMode(G_CC_SHADE, G_CC_SHADE),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_AA_ZB_XLU_SURF | G_RM_AA_ZB_XLU_SURF2),
- gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x27 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM),
- gsDPSetOtherMode(G_AD_DISABLE | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_NONE | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_THRESHOLD | G_ZS_PIXEL | G_RM_XLU_SURF | G_RM_XLU_SURF2),
- gsSPLoadGeometryMode(G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x28 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineLERP(TEXEL1, TEXEL0, PRIMITIVE_ALPHA, TEXEL0, TEXEL1, TEXEL0, PRIMITIVE, TEXEL0, 0, 0, 0, COMBINED, 0,
- 0, 0, COMBINED),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_OPA_SURF | G_RM_OPA_SURF2),
- gsSPLoadGeometryMode(G_SHADE | G_CULL_FRONT | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x29 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_MODULATEIA, G_CC_MODULATEIA),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_ZB_XLU_SURF | G_RM_ZB_XLU_SURF2),
- gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x2A */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_MODULATEIDECALA, G_CC_MODULATEIDECALA),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_XLU_SURF | G_RM_XLU_SURF2),
- gsSPLoadGeometryMode(G_SHADE | G_CULL_BACK | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x2B */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_MODULATEIDECALA_PRIM, G_CC_MODULATEIDECALA_PRIM),
- gsDPSetOtherMode(G_AD_DISABLE | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_RGBA16 | G_TL_TILE |
- G_TD_CLAMP | G_TP_NONE | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_THRESHOLD | G_ZS_PIXEL | G_RM_XLU_SURF | G_RM_XLU_SURF2),
- gsSPLoadGeometryMode(G_SHADE | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x2C */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_MODULATEIA_PRIM, G_CC_PASS2),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_FOG_SHADE_A | G_RM_ZB_OVL_SURF2),
- gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_FOG | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x2D */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineLERP(0, 0, 0, PRIMITIVE, 0, 0, 0, TEXEL0, 0, 0, 0, PRIMITIVE, 0, 0, 0, TEXEL0),
- gsDPSetOtherMode(G_AD_DISABLE | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_NONE | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_THRESHOLD | G_ZS_PIXEL | G_RM_XLU_SURF | G_RM_XLU_SURF2),
- gsSPLoadGeometryMode(G_SHADE | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x2E */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineLERP(0, 0, 0, PRIMITIVE, 0, 0, 0, TEXEL0, 0, 0, 0, PRIMITIVE, 0, 0, 0, TEXEL0),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_XLU_SURF | G_RM_XLU_SURF2),
- gsSPLoadGeometryMode(G_SHADE | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x2F */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_MODULATEI_PRIM, G_CC_MODULATEI_PRIM),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_ZB_XLU_SURF | G_RM_ZB_XLU_SURF2),
- gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x30 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_OFF),
- gsDPSetCombineMode(G_CC_PRIMITIVE, G_CC_PRIMITIVE),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_AA_XLU_SURF | G_RM_AA_XLU_SURF2),
- gsSPLoadGeometryMode(G_SHADE | G_CULL_BACK | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x31 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_OFF),
- gsDPSetCombineLERP(PRIMITIVE, 0, SHADE, 0, 0, 0, 0, PRIMITIVE, PRIMITIVE, 0, SHADE, 0, 0, 0, 0, PRIMITIVE),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_AA_XLU_SURF | G_RM_AA_XLU_SURF2),
- gsSPLoadGeometryMode(G_SHADE | G_CULL_BACK | G_LIGHTING | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x32 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM),
- gsDPSetOtherMode(G_AD_DISABLE | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_NONE | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_THRESHOLD | G_ZS_PIXEL | G_RM_OPA_SURF | G_RM_OPA_SURF2),
- gsSPLoadGeometryMode(G_CULL_BACK),
- gsSPEndDisplayList(),
-
- /* 0x33 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_XLU_SURF | G_RM_XLU_SURF2),
- gsSPLoadGeometryMode(G_CULL_BACK),
- gsSPEndDisplayList(),
-
- /* 0x34 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM),
- gsDPSetOtherMode(G_AD_DISABLE | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_NONE | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_THRESHOLD | G_ZS_PIXEL | G_RM_XLU_SURF | G_RM_XLU_SURF2),
- gsSPLoadGeometryMode(G_CULL_BACK),
- gsSPEndDisplayList(),
-
- /* 0x35 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineLERP(TEXEL1, TEXEL0, ENV_ALPHA, TEXEL0, TEXEL1, TEXEL0, ENVIRONMENT, TEXEL0, PRIMITIVE, ENVIRONMENT,
- COMBINED, ENVIRONMENT, COMBINED, 0, PRIMITIVE, 0),
- gsDPSetOtherMode(G_AD_DISABLE | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_NONE | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
- G_AC_THRESHOLD | G_ZS_PIXEL | G_RM_OPA_SURF | G_RM_OPA_SURF2),
- gsSPLoadGeometryMode(G_CULL_BACK),
- gsSPEndDisplayList(),
-
- /* 0x36 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineLERP(TEXEL1, TEXEL0, ENV_ALPHA, TEXEL0, TEXEL1, TEXEL0, ENVIRONMENT, TEXEL0, PRIMITIVE, ENVIRONMENT,
- COMBINED, ENVIRONMENT, COMBINED, 0, PRIMITIVE, 0),
- gsDPSetOtherMode(G_AD_DISABLE | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_NONE | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
- G_AC_THRESHOLD | G_ZS_PIXEL | G_RM_PASS | G_RM_XLU_SURF2),
- gsSPLoadGeometryMode(G_CULL_BACK),
- gsSPEndDisplayList(),
-
- /* 0x37 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineLERP(TEXEL1, TEXEL0, ENV_ALPHA, TEXEL0, TEXEL1, TEXEL0, ENVIRONMENT, TEXEL0, PRIMITIVE, ENVIRONMENT,
- COMBINED, ENVIRONMENT, COMBINED, 0, PRIMITIVE, 0),
- gsDPSetOtherMode(G_AD_DISABLE | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_NONE | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
- G_AC_THRESHOLD | G_ZS_PIXEL | G_RM_PASS | G_RM_XLU_SURF2),
- gsSPLoadGeometryMode(G_CULL_BACK),
- gsSPEndDisplayList(),
-
- /* 0x38 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM),
- gsDPSetOtherMode(G_AD_DISABLE | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_POINT | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_NONE | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_THRESHOLD | G_ZS_PIXEL | G_RM_XLU_SURF | G_RM_XLU_SURF2),
- gsSPLoadGeometryMode(G_SHADE | G_CULL_BACK | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x39 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_OFF),
- gsDPSetCombineMode(G_CC_PRIMITIVE, G_CC_PRIMITIVE),
- gsDPSetOtherMode(G_AD_DISABLE | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_NONE | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_THRESHOLD | G_ZS_PIXEL | G_RM_CLD_SURF | G_RM_CLD_SURF2),
- gsSPLoadGeometryMode(G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x3A */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_OFF),
- gsDPSetCombineLERP(PRIMITIVE, 0, SHADE, 0, PRIMITIVE, 0, SHADE, 0, PRIMITIVE, 0, SHADE, 0, PRIMITIVE, 0, SHADE, 0),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_CLD_SURF | G_RM_CLD_SURF2),
- gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x3B */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineLERP(TEXEL0, 0, PRIMITIVE, SHADE, 1, 0, TEXEL0, SHADE, ENVIRONMENT, COMBINED, TEXEL0, COMBINED,
- ENVIRONMENT, COMBINED, TEXEL0, COMBINED),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_PASS | G_RM_AA_OPA_SURF2),
- gsSPLoadGeometryMode(G_SHADE | G_CULL_BACK | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x3C */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineLERP(PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, PRIMITIVE, 0, TEXEL0, 0, PRIMITIVE, ENVIRONMENT,
- TEXEL0, ENVIRONMENT, PRIMITIVE, 0, TEXEL0, 0),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_ZB_CLD_SURF | G_RM_ZB_CLD_SURF2),
- gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x3D */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineLERP(PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, PRIMITIVE, 0, TEXEL0, 0, PRIMITIVE, ENVIRONMENT,
- TEXEL0, ENVIRONMENT, PRIMITIVE, 0, TEXEL0, 0),
- gsDPSetOtherMode(G_AD_NOISE | G_CD_NOISE | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_ZB_CLD_SURF | G_RM_ZB_CLD_SURF2),
- gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x3E */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_MODULATEIDECALA, G_CC_MODULATEIA_PRIM2),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_DISABLE | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_FOG_SHADE_A | G_RM_AA_ZB_OPA_SURF2),
- gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_FOG | G_LIGHTING | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x3F */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM),
- gsDPSetOtherMode(G_AD_DISABLE | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_NONE | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_THRESHOLD | G_ZS_PIXEL | Z_UPD | IM_RD | CVG_DST_SAVE | ZMODE_OPA | FORCE_BL |
- GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) |
- GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)),
- gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x40 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_OFF),
- gsDPSetCombineMode(G_CC_DECALRGBA, G_CC_PASS2),
- gsDPSetOtherMode(G_AD_DISABLE | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_NONE | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
- G_AC_THRESHOLD | G_ZS_PIXEL | G_RM_PASS | G_RM_XLU_SURF2),
- gsSPLoadGeometryMode(G_SHADE | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x41 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_THRESHOLD | G_ZS_PIXEL | G_RM_CLD_SURF | G_RM_CLD_SURF2),
- gsSPLoadGeometryMode(G_SHADE | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x42 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_DECALRGBA, G_CC_DECALRGBA),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_THRESHOLD | G_ZS_PIXEL | Z_CMP | Z_UPD | CVG_DST_FULL | ZMODE_OPA | CVG_X_ALPHA |
- ALPHA_CVG_SEL | G_RM_PASS | GBL_c2(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1)),
- gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x43 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_THRESHOLD | G_ZS_PIXEL | Z_CMP | Z_UPD | CVG_DST_FULL | ZMODE_OPA | CVG_X_ALPHA |
- ALPHA_CVG_SEL | G_RM_PASS | GBL_c2(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1)),
- gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x44 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_DECALRGBA, G_CC_DECALRGBA),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_THRESHOLD | G_ZS_PIXEL | Z_CMP | Z_UPD | IM_RD | CVG_DST_FULL | ZMODE_OPA | CVG_X_ALPHA |
- ALPHA_CVG_SEL | GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) |
- GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM)),
- gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x45 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_THRESHOLD | G_ZS_PIXEL | Z_CMP | Z_UPD | IM_RD | CVG_DST_FULL | ZMODE_OPA | CVG_X_ALPHA |
- ALPHA_CVG_SEL | GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) |
- GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM)),
- gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x46 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_DECALRGBA, G_CC_DECALRGBA),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_THRESHOLD | G_ZS_PIXEL | Z_CMP | Z_UPD | CVG_DST_FULL | ZMODE_OPA | CVG_X_ALPHA |
- ALPHA_CVG_SEL | G_RM_PASS | GBL_c2(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1)),
- gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_FOG | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x47 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_MODULATEIDECALA, G_CC_MODULATEIA_PRIM2),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_BAYER | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_FOG_SHADE_A | G_RM_AA_ZB_XLU_SURF2),
- gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_FOG | G_LIGHTING | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x48 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_MODULATEIDECALA, G_CC_MODULATEIA_PRIM2),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_BAYER | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_FOG_SHADE_A | G_RM_ZB_CLD_SURF2),
- gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_FOG | G_LIGHTING | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
+Gfx gSetupDLs[SETUPDL_MAX][6] = {
+ {
+ /* SETUPDL_0 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineLERP(PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, PRIMITIVE, 0, TEXEL0, 0, 0, 0, 0, COMBINED, 0,
+ 0, 0, COMBINED),
+ gsDPSetOtherMode(G_AD_NOISE | G_CD_NOISE | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_FOG_SHADE_A | G_RM_ZB_CLD_SURF2),
+ gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_FOG | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_1 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_OFF),
+ gsDPSetCombineMode(G_CC_SHADE, G_CC_PASS2),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_FOG_SHADE_A | G_RM_AA_OPA_SURF2),
+ gsSPLoadGeometryMode(G_SHADE | G_CULL_BACK | G_FOG | G_LIGHTING | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_2 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_OFF),
+ gsDPSetCombineMode(G_CC_SHADE, G_CC_SHADE),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_AA_ZB_OPA_SURF | G_RM_AA_ZB_OPA_SURF2),
+ gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_LIGHTING | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_3 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_OFF),
+ gsDPSetCombineMode(G_CC_SHADE, G_CC_PASS2),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_FOG_SHADE_A | G_RM_AA_ZB_OPA_SURF2),
+ gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_FOG | G_LIGHTING | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_4 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_OFF),
+ gsDPSetCombineLERP(PRIMITIVE, 0, SHADE, 0, 0, 0, 0, PRIMITIVE, PRIMITIVE, 0, SHADE, 0, 0, 0, 0, PRIMITIVE),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_AA_ZB_XLU_SURF | G_RM_AA_ZB_XLU_SURF2),
+ gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_LIGHTING | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_5 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_MODULATEI_PRIM, G_CC_MODULATEI_PRIM),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_AA_ZB_XLU_SURF | G_RM_AA_ZB_XLU_SURF2),
+ gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_LIGHTING | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_6 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_DECALRGBA, G_CC_PASS2),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_FOG_SHADE_A | G_RM_AA_TEX_EDGE2),
+ gsSPLoadGeometryMode(G_SHADE | G_FOG | G_LIGHTING | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_7 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_AA_XLU_SURF | G_RM_AA_XLU_SURF2),
+ gsSPLoadGeometryMode(G_SHADE | G_LIGHTING | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_8 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_OFF),
+ gsDPSetCombineMode(G_CC_SHADE, G_CC_SHADE),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_AA_OPA_SURF | G_RM_AA_OPA_SURF2),
+ gsSPLoadGeometryMode(G_SHADE | G_CULL_BACK | G_LIGHTING | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_9 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_MODULATEIA, G_CC_MODULATEIA2),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_FOG_SHADE_A | G_RM_AA_XLU_SURF2),
+ gsSPLoadGeometryMode(G_SHADE | G_FOG | G_LIGHTING | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_10 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_MODULATEIDECALA, G_CC_MODULATEIDECALA),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_AA_OPA_SURF | G_RM_AA_OPA_SURF2),
+ gsSPLoadGeometryMode(G_SHADE | G_CULL_BACK | G_LIGHTING | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_11 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_MODULATEIDECALA, G_CC_MODULATEIA_PRIM2),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_FOG_SHADE_A | G_RM_AA_OPA_SURF2),
+ gsSPLoadGeometryMode(G_SHADE | G_CULL_BACK | G_FOG | G_LIGHTING | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_12 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_MODULATEI_PRIM, G_CC_MODULATEI_PRIM),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_AA_OPA_SURF | G_RM_AA_OPA_SURF2),
+ gsSPLoadGeometryMode(G_SHADE | G_CULL_BACK | G_LIGHTING | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_13 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_XLU_SURF | G_RM_XLU_SURF2),
+ gsSPLoadGeometryMode(G_SHADE | G_CULL_BACK | G_LIGHTING | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_14 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_DECALRGBA, G_CC_DECALRGBA),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_AA_ZB_TEX_EDGE | G_RM_AA_ZB_TEX_EDGE2),
+ gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_LIGHTING | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_15 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_DECALRGBA, G_CC_PASS2),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_FOG_SHADE_A | G_RM_AA_ZB_TEX_EDGE2),
+ gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_FOG | G_LIGHTING | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_16 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM2),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_FOG_SHADE_A | G_RM_AA_ZB_XLU_SURF2),
+ gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_FOG | G_LIGHTING | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_17 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_MODULATEIDECALA, G_CC_MODULATEIDECALA),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_AA_ZB_TEX_EDGE | G_RM_AA_ZB_TEX_EDGE2),
+ gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_LIGHTING | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_18 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_MODULATEIDECALA, G_CC_PASS2),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_FOG_SHADE_A | G_RM_AA_ZB_TEX_EDGE2),
+ gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_FOG | G_LIGHTING | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_19 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | AA_EN | Z_CMP | IM_RD | CVG_DST_FULL | ZMODE_OPA | CVG_X_ALPHA |
+ FORCE_BL | GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) |
+ GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)),
+ gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_LIGHTING | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_20 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_THRESHOLD | G_ZS_PIXEL | G_RM_ZB_CLD_SURF | G_RM_ZB_CLD_SURF2),
+ gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_21 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_MODULATEIA, G_CC_MODULATEIA),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_AA_ZB_XLU_SURF | G_RM_AA_ZB_XLU_SURF2),
+ gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_LIGHTING | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_22 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_MODULATEIA, G_CC_MODULATEIA2),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_FOG_SHADE_A | G_RM_AA_ZB_XLU_SURF2),
+ gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_LIGHTING | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_23 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_MODULATEIDECALA, G_CC_MODULATEIDECALA),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_AA_ZB_OPA_SURF | G_RM_AA_ZB_OPA_SURF2),
+ gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_LIGHTING | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_24 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_MODULATEIDECALA, G_CC_MODULATEIA2),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_FOG_SHADE_A | G_RM_AA_ZB_OPA_SURF2),
+ gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_FOG | G_LIGHTING | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_25 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_MODULATEIDECALA, G_CC_MODULATEIA_PRIM2),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_FOG_SHADE_A | G_RM_AA_ZB_OPA_SURF2),
+ gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_FOG | G_LIGHTING | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_26 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_MODULATEIDECALA, G_CC_MODULATEIA_PRIM2),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_PASS | G_RM_AA_ZB_OPA_SURF2),
+ gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_LIGHTING | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_27 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_MODULATEI_PRIM, G_CC_MODULATEI_PRIM),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_AA_ZB_XLU_SURF | G_RM_AA_ZB_XLU_SURF2),
+ gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_28 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_MODULATEIDECALA_PRIM, G_CC_MODULATEIDECALA_PRIM),
+ gsDPSetOtherMode(G_AD_DISABLE | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_RGBA16 | G_TL_TILE |
+ G_TD_CLAMP | G_TP_NONE | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_THRESHOLD | G_ZS_PIXEL | G_RM_AA_TEX_EDGE | G_RM_AA_TEX_EDGE2),
+ gsSPLoadGeometryMode(G_SHADE | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_29 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineLERP(TEXEL0, 0, SHADE, 0, TEXEL0, 0, SHADE, 0, NOISE, 0, COMBINED, 0, 0, 0, 0, COMBINED),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_PASS | G_RM_AA_ZB_OPA_SURF2),
+ gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_LIGHTING | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_30 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_OFF),
+ gsDPSetCombineMode(G_CC_PRIMITIVE, G_CC_PRIMITIVE),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_AA_ZB_XLU_LINE | G_RM_AA_ZB_XLU_LINE2),
+ gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_31 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_HILITERGBA, G_CC_HILITERGBA),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_AA_ZB_OPA_SURF | G_RM_AA_ZB_OPA_SURF2),
+ gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_LIGHTING | G_TEXTURE_GEN | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_32 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_HILITERGBA, G_CC_HILITERGBA),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_AA_ZB_OPA_SURF | G_RM_AA_ZB_OPA_SURF2),
+ gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR |
+ G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_33 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineLERP(TEXEL0, 0, PRIMITIVE, SHADE, 1, 0, TEXEL0, SHADE, ENVIRONMENT, COMBINED, TEXEL0, COMBINED,
+ ENVIRONMENT, COMBINED, TEXEL0, COMBINED),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_PASS | G_RM_AA_ZB_OPA_SURF2),
+ gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR |
+ G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_34 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_DECALRGB, G_CC_DECALRGB),
+ gsDPSetOtherMode(G_AD_DISABLE | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_NONE | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_THRESHOLD | G_ZS_PIXEL | G_RM_OPA_SURF | G_RM_OPA_SURF2),
+ gsSPLoadGeometryMode(G_SHADE | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_35 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_DECALRGBA, G_CC_DECALRGBA),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_AA_ZB_XLU_DECAL | G_RM_AA_ZB_XLU_DECAL2),
+ gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_36 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_OFF),
+ gsDPSetCombineMode(G_CC_SHADE, G_CC_SHADE),
+ gsDPSetOtherMode(G_AD_DISABLE | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_NONE | G_CYC_FILL | G_PM_NPRIMITIVE,
+ G_AC_THRESHOLD | G_ZS_PIXEL | G_RM_NOOP | G_RM_NOOP2),
+ gsSPLoadGeometryMode(G_SHADE | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_37 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_OFF),
+ gsDPSetCombineLERP(PRIMITIVE, 0, SHADE, 0, 0, 0, 0, PRIMITIVE, 0, 0, 0, COMBINED, 0, 0, 0, COMBINED),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_FOG_SHADE_A | G_RM_AA_ZB_OPA_SURF2),
+ gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_FOG | G_LIGHTING | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_38 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_OFF),
+ gsDPSetCombineMode(G_CC_SHADE, G_CC_SHADE),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_AA_ZB_XLU_SURF | G_RM_AA_ZB_XLU_SURF2),
+ gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_39 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM),
+ gsDPSetOtherMode(G_AD_DISABLE | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_NONE | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_THRESHOLD | G_ZS_PIXEL | G_RM_XLU_SURF | G_RM_XLU_SURF2),
+ gsSPLoadGeometryMode(G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_40 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineLERP(TEXEL1, TEXEL0, PRIMITIVE_ALPHA, TEXEL0, TEXEL1, TEXEL0, PRIMITIVE, TEXEL0, 0, 0, 0,
+ COMBINED, 0, 0, 0, COMBINED),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_OPA_SURF | G_RM_OPA_SURF2),
+ gsSPLoadGeometryMode(G_SHADE | G_CULL_FRONT | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_41 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_MODULATEIA, G_CC_MODULATEIA),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_ZB_XLU_SURF | G_RM_ZB_XLU_SURF2),
+ gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_42 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_MODULATEIDECALA, G_CC_MODULATEIDECALA),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_XLU_SURF | G_RM_XLU_SURF2),
+ gsSPLoadGeometryMode(G_SHADE | G_CULL_BACK | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_43 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_MODULATEIDECALA_PRIM, G_CC_MODULATEIDECALA_PRIM),
+ gsDPSetOtherMode(G_AD_DISABLE | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_RGBA16 | G_TL_TILE |
+ G_TD_CLAMP | G_TP_NONE | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_THRESHOLD | G_ZS_PIXEL | G_RM_XLU_SURF | G_RM_XLU_SURF2),
+ gsSPLoadGeometryMode(G_SHADE | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_44 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_MODULATEIA_PRIM, G_CC_PASS2),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_FOG_SHADE_A | G_RM_ZB_OVL_SURF2),
+ gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_FOG | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_45 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineLERP(0, 0, 0, PRIMITIVE, 0, 0, 0, TEXEL0, 0, 0, 0, PRIMITIVE, 0, 0, 0, TEXEL0),
+ gsDPSetOtherMode(G_AD_DISABLE | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_NONE | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_THRESHOLD | G_ZS_PIXEL | G_RM_XLU_SURF | G_RM_XLU_SURF2),
+ gsSPLoadGeometryMode(G_SHADE | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_46 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineLERP(0, 0, 0, PRIMITIVE, 0, 0, 0, TEXEL0, 0, 0, 0, PRIMITIVE, 0, 0, 0, TEXEL0),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_XLU_SURF | G_RM_XLU_SURF2),
+ gsSPLoadGeometryMode(G_SHADE | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_47 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_MODULATEI_PRIM, G_CC_MODULATEI_PRIM),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_ZB_XLU_SURF | G_RM_ZB_XLU_SURF2),
+ gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_48 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_OFF),
+ gsDPSetCombineMode(G_CC_PRIMITIVE, G_CC_PRIMITIVE),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_AA_XLU_SURF | G_RM_AA_XLU_SURF2),
+ gsSPLoadGeometryMode(G_SHADE | G_CULL_BACK | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_49 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_OFF),
+ gsDPSetCombineLERP(PRIMITIVE, 0, SHADE, 0, 0, 0, 0, PRIMITIVE, PRIMITIVE, 0, SHADE, 0, 0, 0, 0, PRIMITIVE),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_AA_XLU_SURF | G_RM_AA_XLU_SURF2),
+ gsSPLoadGeometryMode(G_SHADE | G_CULL_BACK | G_LIGHTING | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_50 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM),
+ gsDPSetOtherMode(G_AD_DISABLE | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_NONE | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_THRESHOLD | G_ZS_PIXEL | G_RM_OPA_SURF | G_RM_OPA_SURF2),
+ gsSPLoadGeometryMode(G_CULL_BACK),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_51 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_XLU_SURF | G_RM_XLU_SURF2),
+ gsSPLoadGeometryMode(G_CULL_BACK),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_52 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM),
+ gsDPSetOtherMode(G_AD_DISABLE | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_NONE | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_THRESHOLD | G_ZS_PIXEL | G_RM_XLU_SURF | G_RM_XLU_SURF2),
+ gsSPLoadGeometryMode(G_CULL_BACK),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_53 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineLERP(TEXEL1, TEXEL0, ENV_ALPHA, TEXEL0, TEXEL1, TEXEL0, ENVIRONMENT, TEXEL0, PRIMITIVE,
+ ENVIRONMENT, COMBINED, ENVIRONMENT, COMBINED, 0, PRIMITIVE, 0),
+ gsDPSetOtherMode(G_AD_DISABLE | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_NONE | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
+ G_AC_THRESHOLD | G_ZS_PIXEL | G_RM_OPA_SURF | G_RM_OPA_SURF2),
+ gsSPLoadGeometryMode(G_CULL_BACK),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_54 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineLERP(TEXEL1, TEXEL0, ENV_ALPHA, TEXEL0, TEXEL1, TEXEL0, ENVIRONMENT, TEXEL0, PRIMITIVE,
+ ENVIRONMENT, COMBINED, ENVIRONMENT, COMBINED, 0, PRIMITIVE, 0),
+ gsDPSetOtherMode(G_AD_DISABLE | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_NONE | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
+ G_AC_THRESHOLD | G_ZS_PIXEL | G_RM_PASS | G_RM_XLU_SURF2),
+ gsSPLoadGeometryMode(G_CULL_BACK),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_55 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineLERP(TEXEL1, TEXEL0, ENV_ALPHA, TEXEL0, TEXEL1, TEXEL0, ENVIRONMENT, TEXEL0, PRIMITIVE,
+ ENVIRONMENT, COMBINED, ENVIRONMENT, COMBINED, 0, PRIMITIVE, 0),
+ gsDPSetOtherMode(G_AD_DISABLE | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_NONE | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
+ G_AC_THRESHOLD | G_ZS_PIXEL | G_RM_PASS | G_RM_XLU_SURF2),
+ gsSPLoadGeometryMode(G_CULL_BACK),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_56 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM),
+ gsDPSetOtherMode(G_AD_DISABLE | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_POINT | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_NONE | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_THRESHOLD | G_ZS_PIXEL | G_RM_XLU_SURF | G_RM_XLU_SURF2),
+ gsSPLoadGeometryMode(G_SHADE | G_CULL_BACK | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_57 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_OFF),
+ gsDPSetCombineMode(G_CC_PRIMITIVE, G_CC_PRIMITIVE),
+ gsDPSetOtherMode(G_AD_DISABLE | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_NONE | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_THRESHOLD | G_ZS_PIXEL | G_RM_CLD_SURF | G_RM_CLD_SURF2),
+ gsSPLoadGeometryMode(G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_58 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_OFF),
+ gsDPSetCombineLERP(PRIMITIVE, 0, SHADE, 0, PRIMITIVE, 0, SHADE, 0, PRIMITIVE, 0, SHADE, 0, PRIMITIVE, 0, SHADE,
+ 0),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_CLD_SURF | G_RM_CLD_SURF2),
+ gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_59 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineLERP(TEXEL0, 0, PRIMITIVE, SHADE, 1, 0, TEXEL0, SHADE, ENVIRONMENT, COMBINED, TEXEL0, COMBINED,
+ ENVIRONMENT, COMBINED, TEXEL0, COMBINED),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_PASS | G_RM_AA_OPA_SURF2),
+ gsSPLoadGeometryMode(G_SHADE | G_CULL_BACK | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR |
+ G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_60 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineLERP(PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, PRIMITIVE, 0, TEXEL0, 0, PRIMITIVE, ENVIRONMENT,
+ TEXEL0, ENVIRONMENT, PRIMITIVE, 0, TEXEL0, 0),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_ZB_CLD_SURF | G_RM_ZB_CLD_SURF2),
+ gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_61 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineLERP(PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, PRIMITIVE, 0, TEXEL0, 0, PRIMITIVE, ENVIRONMENT,
+ TEXEL0, ENVIRONMENT, PRIMITIVE, 0, TEXEL0, 0),
+ gsDPSetOtherMode(G_AD_NOISE | G_CD_NOISE | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_ZB_CLD_SURF | G_RM_ZB_CLD_SURF2),
+ gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_62 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_MODULATEIDECALA, G_CC_MODULATEIA_PRIM2),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_DISABLE | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_FOG_SHADE_A | G_RM_AA_ZB_OPA_SURF2),
+ gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_FOG | G_LIGHTING | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_63 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM),
+ gsDPSetOtherMode(G_AD_DISABLE | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_NONE | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_THRESHOLD | G_ZS_PIXEL | Z_UPD | IM_RD | CVG_DST_SAVE | ZMODE_OPA | FORCE_BL |
+ GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) |
+ GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)),
+ gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_64 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_OFF),
+ gsDPSetCombineMode(G_CC_DECALRGBA, G_CC_PASS2),
+ gsDPSetOtherMode(G_AD_DISABLE | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_NONE | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
+ G_AC_THRESHOLD | G_ZS_PIXEL | G_RM_PASS | G_RM_XLU_SURF2),
+ gsSPLoadGeometryMode(G_SHADE | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_65 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_THRESHOLD | G_ZS_PIXEL | G_RM_CLD_SURF | G_RM_CLD_SURF2),
+ gsSPLoadGeometryMode(G_SHADE | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_66 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_DECALRGBA, G_CC_DECALRGBA),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_THRESHOLD | G_ZS_PIXEL | Z_CMP | Z_UPD | CVG_DST_FULL | ZMODE_OPA | CVG_X_ALPHA |
+ ALPHA_CVG_SEL | G_RM_PASS | GBL_c2(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1)),
+ gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_67 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_THRESHOLD | G_ZS_PIXEL | Z_CMP | Z_UPD | CVG_DST_FULL | ZMODE_OPA | CVG_X_ALPHA |
+ ALPHA_CVG_SEL | G_RM_PASS | GBL_c2(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1)),
+ gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_68 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_DECALRGBA, G_CC_DECALRGBA),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_THRESHOLD | G_ZS_PIXEL | Z_CMP | Z_UPD | IM_RD | CVG_DST_FULL | ZMODE_OPA | CVG_X_ALPHA |
+ ALPHA_CVG_SEL | GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) |
+ GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM)),
+ gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_69 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_THRESHOLD | G_ZS_PIXEL | Z_CMP | Z_UPD | IM_RD | CVG_DST_FULL | ZMODE_OPA | CVG_X_ALPHA |
+ ALPHA_CVG_SEL | GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) |
+ GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM)),
+ gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_70 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_DECALRGBA, G_CC_DECALRGBA),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_THRESHOLD | G_ZS_PIXEL | Z_CMP | Z_UPD | CVG_DST_FULL | ZMODE_OPA | CVG_X_ALPHA |
+ ALPHA_CVG_SEL | G_RM_PASS | GBL_c2(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1)),
+ gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_FOG | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_71 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_MODULATEIDECALA, G_CC_MODULATEIA_PRIM2),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_BAYER | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_FOG_SHADE_A | G_RM_AA_ZB_XLU_SURF2),
+ gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_FOG | G_LIGHTING | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_72 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_MODULATEIDECALA, G_CC_MODULATEIA_PRIM2),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_BAYER | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_FOG_SHADE_A | G_RM_ZB_CLD_SURF2),
+ gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_FOG | G_LIGHTING | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
};
Gfx sFillSetupDL[] = {
@@ -814,297 +890,470 @@ Gfx* Gfx_SetFog2(Gfx* gfx, s32 r, s32 g, s32 b, s32 a, s32 n, s32 f) {
return Gfx_SetFog(gfx, r, g, b, a, n, f);
}
-Gfx* Gfx_CallSetupDLImpl(Gfx* gfx, u32 i) {
- gSPDisplayList(gfx++, &sSetupDL[6 * i]);
+Gfx* Gfx_SetupDLImpl(Gfx* gfx, u32 i) {
+ s32 dListIndex = i * ARRAY_COUNT(gSetupDLs[i]);
+
+ // Equivalent to gSPDisplayList(gfx++, gSetupDLs[i])
+ gSPDisplayList(gfx++, &((Gfx*)gSetupDLs)[dListIndex]);
return gfx;
}
-Gfx* Gfx_CallSetupDL(Gfx* gfx, u32 i) {
- return Gfx_CallSetupDLImpl(gfx, i);
+Gfx* Gfx_SetupDL(Gfx* gfx, u32 i) {
+ return Gfx_SetupDLImpl(gfx, i);
}
-void Gfx_CallSetupDLAtPtr(Gfx** gfxp, u32 i) {
- *gfxp = Gfx_CallSetupDL(*gfxp, i);
+void Gfx_SetupDLAtPtr(Gfx** gfxp, u32 i) {
+ *gfxp = Gfx_SetupDL(*gfxp, i);
}
-Gfx* func_8012BFC4(Gfx* gfx) {
- gSPDisplayList(gfx++, &sSetupDL[6 * 0x39]);
+Gfx* Gfx_SetupDL57(Gfx* gfx) {
+ gSPDisplayList(gfx++, gSetupDLs[SETUPDL_57]);
return gfx;
}
-Gfx* func_8012BFEC(Gfx* gfx) {
- gSPDisplayList(gfx++, &sSetupDL[6 * 0x39]);
+Gfx* Gfx_SetupDL57_b(Gfx* gfx) {
+ gSPDisplayList(gfx++, gSetupDLs[SETUPDL_57]);
return gfx;
}
-Gfx* func_8012C014(Gfx* gfx) {
- gSPDisplayList(gfx++, &sSetupDL[6 * 0x34]);
+Gfx* Gfx_SetupDL52_NoCD(Gfx* gfx) {
+ gSPDisplayList(gfx++, gSetupDLs[SETUPDL_52]);
gDPSetColorDither(gfx++, G_CD_DISABLE);
return gfx;
}
-void func_8012C058(GraphicsContext* gfxCtx) {
- gSPDisplayList(gfxCtx->polyOpa.p++, &sSetupDL[6 * 0x3A]);
+void Gfx_SetupDL58_Opa(GraphicsContext* gfxCtx) {
+ OPEN_DISPS(gfxCtx);
+
+ gSPDisplayList(POLY_OPA_DISP++, gSetupDLs[SETUPDL_58]);
+
+ CLOSE_DISPS(gfxCtx);
}
-void func_8012C080(GraphicsContext* gfxCtx) {
- gSPDisplayList(gfxCtx->polyOpa.p++, &sSetupDL[6 * 0x39]);
+void Gfx_SetupDL57_Opa(GraphicsContext* gfxCtx) {
+ OPEN_DISPS(gfxCtx);
+
+ gSPDisplayList(POLY_OPA_DISP++, gSetupDLs[SETUPDL_57]);
+
+ CLOSE_DISPS(gfxCtx);
}
-void func_8012C0A8(GraphicsContext* gfxCtx) {
- gSPDisplayList(gfxCtx->polyOpa.p++, &sSetupDL[6 * 0x32]);
+void Gfx_SetupDL50_Opa(GraphicsContext* gfxCtx) {
+ OPEN_DISPS(gfxCtx);
+
+ gSPDisplayList(POLY_OPA_DISP++, gSetupDLs[SETUPDL_50]);
+
+ CLOSE_DISPS(gfxCtx);
}
-void func_8012C0D0(GraphicsContext* gfxCtx) {
- gSPDisplayList(gfxCtx->polyOpa.p++, &sSetupDL[6 * 0x33]);
+void Gfx_SetupDL51_Opa(GraphicsContext* gfxCtx) {
+ OPEN_DISPS(gfxCtx);
+
+ gSPDisplayList(POLY_OPA_DISP++, gSetupDLs[SETUPDL_51]);
+
+ CLOSE_DISPS(gfxCtx);
}
-void func_8012C0F8(GraphicsContext* gfxCtx) {
- gSPDisplayList(gfxCtx->polyXlu.p++, &sSetupDL[6 * 0x34]);
+void Gfx_SetupDL52_Xlu(GraphicsContext* gfxCtx) {
+ OPEN_DISPS(gfxCtx);
+
+ gSPDisplayList(POLY_XLU_DISP++, gSetupDLs[SETUPDL_52]);
+
+ CLOSE_DISPS(gfxCtx);
}
-void func_8012C120(GraphicsContext* gfxCtx) {
- gSPDisplayList(gfxCtx->polyOpa.p++, &sSetupDL[6 * 0x35]);
+void Gfx_SetupDL53_Opa(GraphicsContext* gfxCtx) {
+ OPEN_DISPS(gfxCtx);
+
+ gSPDisplayList(POLY_OPA_DISP++, gSetupDLs[SETUPDL_53]);
+
+ CLOSE_DISPS(gfxCtx);
}
-void func_8012C148(GraphicsContext* gfxCtx) {
- gSPDisplayList(gfxCtx->polyOpa.p++, &sSetupDL[6 * 0x36]);
+void Gfx_SetupDL54_Opa(GraphicsContext* gfxCtx) {
+ OPEN_DISPS(gfxCtx);
+
+ gSPDisplayList(POLY_OPA_DISP++, gSetupDLs[SETUPDL_54]);
+
+ CLOSE_DISPS(gfxCtx);
}
-void func_8012C170(GraphicsContext* gfxCtx) {
- gSPDisplayList(gfxCtx->polyXlu.p++, &sSetupDL[6 * 0x37]);
+void Gfx_SetupDL55_Xlu(GraphicsContext* gfxCtx) {
+ OPEN_DISPS(gfxCtx);
+
+ gSPDisplayList(POLY_XLU_DISP++, gSetupDLs[SETUPDL_55]);
+
+ CLOSE_DISPS(gfxCtx);
}
-Gfx* func_8012C198(Gfx* gfx) {
- gSPDisplayList(gfx++, &sSetupDL[6 * 0x1A]);
+Gfx* Gfx_SetupDL26(Gfx* gfx) {
+ gSPDisplayList(gfx++, gSetupDLs[SETUPDL_26]);
return gfx;
}
-void func_8012C1C0(GraphicsContext* gfxCtx) {
- gfxCtx->polyOpa.p = func_8012C198(gfxCtx->polyOpa.p);
+void Gfx_SetupDL26_Opa(GraphicsContext* gfxCtx) {
+ OPEN_DISPS(gfxCtx);
+
+ POLY_OPA_DISP = Gfx_SetupDL26(POLY_OPA_DISP);
+
+ CLOSE_DISPS(gfxCtx);
}
-Gfx* func_8012C1EC(Gfx* gfx) {
- gSPDisplayList(gfx++, &sSetupDL[6 * 0x17]);
+Gfx* Gfx_SetupDL23(Gfx* gfx) {
+ gSPDisplayList(gfx++, gSetupDLs[SETUPDL_23]);
return gfx;
}
-void func_8012C214(GraphicsContext* gfxCtx) {
- gfxCtx->polyOpa.p = func_8012C1EC(gfxCtx->polyOpa.p);
+void Gfx_SetupDL23_Opa(GraphicsContext* gfxCtx) {
+ OPEN_DISPS(gfxCtx);
+
+ POLY_OPA_DISP = Gfx_SetupDL23(POLY_OPA_DISP);
+
+ CLOSE_DISPS(gfxCtx);
}
-void func_8012C240(GraphicsContext* gfxCtx) {
- gSPDisplayList(gfxCtx->polyXlu.p++, &sSetupDL[6 * 0x19]);
+void Gfx_SetupDL25_Xlu2(GraphicsContext* gfxCtx) {
+ OPEN_DISPS(gfxCtx);
+
+ gSPDisplayList(POLY_XLU_DISP++, gSetupDLs[SETUPDL_25]);
+
+ CLOSE_DISPS(gfxCtx);
}
-void func_8012C268(PlayState* play) {
- func_8012C28C(play->state.gfxCtx);
+void func_8012C268(GameState* gameState) {
+ Gfx_SetupDL25_Opa(gameState->gfxCtx);
}
-void func_8012C28C(GraphicsContext* gfxCtx) {
- gSPDisplayList(gfxCtx->polyOpa.p++, &sSetupDL[6 * 0x19]);
+void Gfx_SetupDL25_Opa(GraphicsContext* gfxCtx) {
+ OPEN_DISPS(gfxCtx);
+
+ gSPDisplayList(POLY_OPA_DISP++, gSetupDLs[SETUPDL_25]);
+
+ CLOSE_DISPS(gfxCtx);
}
-Gfx* func_8012C2B4(Gfx* gfx) {
- gSPDisplayList(gfx++, &sSetupDL[6 * 0x47]);
+Gfx* Gfx_SetupDL71(Gfx* gfx) {
+ gSPDisplayList(gfx++, gSetupDLs[SETUPDL_71]);
return gfx;
}
-void func_8012C2DC(GraphicsContext* gfxCtx) {
- gSPDisplayList(gfxCtx->polyXlu.p++, &sSetupDL[6 * 0x19]);
+void Gfx_SetupDL25_Xlu(GraphicsContext* gfxCtx) {
+ OPEN_DISPS(gfxCtx);
+
+ gSPDisplayList(POLY_XLU_DISP++, gSetupDLs[SETUPDL_25]);
+
+ CLOSE_DISPS(gfxCtx);
}
-Gfx* func_8012C304(Gfx* gfx) {
- gSPDisplayList(gfx++, &sSetupDL[6 * 0x48]);
+Gfx* Gfx_SetupDL72(Gfx* gfx) {
+ gSPDisplayList(gfx++, gSetupDLs[SETUPDL_72]);
return gfx;
}
-void func_8012C32C(GraphicsContext* gfxCtx) {
- gSPDisplayList(gfxCtx->polyOpa.p++, &sSetupDL[6 * 0x1F]);
+void Gfx_SetupDL31_Opa(GraphicsContext* gfxCtx) {
+ OPEN_DISPS(gfxCtx);
+
+ gSPDisplayList(POLY_OPA_DISP++, gSetupDLs[SETUPDL_31]);
+
+ CLOSE_DISPS(gfxCtx);
}
-void func_8012C354(GraphicsContext* gfxCtx) {
- gSPDisplayList(gfxCtx->polyOpa.p++, &sSetupDL[6 * 0x20]);
+void Gfx_SetupDL32_Opa(GraphicsContext* gfxCtx) {
+ OPEN_DISPS(gfxCtx);
+
+ gSPDisplayList(POLY_OPA_DISP++, gSetupDLs[SETUPDL_32]);
+
+ CLOSE_DISPS(gfxCtx);
}
-void func_8012C37C(GraphicsContext* gfxCtx) {
- gSPDisplayList(gfxCtx->polyOpa.p++, &sSetupDL[6 * 0x21]);
+void Gfx_SetupDL33_Opa(GraphicsContext* gfxCtx) {
+ OPEN_DISPS(gfxCtx);
+
+ gSPDisplayList(POLY_OPA_DISP++, gSetupDLs[SETUPDL_33]);
+
+ CLOSE_DISPS(gfxCtx);
}
-Gfx* func_8012C3A4(Gfx* gfx) {
- gSPDisplayList(gfx++, &sSetupDL[6 * 0x40]);
+Gfx* Gfx_SetupDL64(Gfx* gfx) {
+ gSPDisplayList(gfx++, gSetupDLs[SETUPDL_64]);
return gfx;
}
-Gfx* func_8012C3CC(Gfx* gfx) {
- gSPDisplayList(gfx++, &sSetupDL[6 * 0x22]);
+Gfx* Gfx_SetupDL34(Gfx* gfx) {
+ gSPDisplayList(gfx++, gSetupDLs[SETUPDL_34]);
return gfx;
}
-void func_8012C3F4(GraphicsContext* gfxCtx) {
- gfxCtx->polyOpa.p = func_8012C3CC(gfxCtx->polyOpa.p);
+void Gfx_SetupDL34_Opa(GraphicsContext* gfxCtx) {
+ OPEN_DISPS(gfxCtx);
+
+ POLY_OPA_DISP = Gfx_SetupDL34(POLY_OPA_DISP);
+
+ CLOSE_DISPS(gfxCtx);
}
-void func_8012C420(GraphicsContext* gfxCtx) {
- gSPDisplayList(gfxCtx->polyOpa.p++, &sSetupDL[6 * 0x23]);
+void Gfx_SetupDL35_Opa(GraphicsContext* gfxCtx) {
+ OPEN_DISPS(gfxCtx);
+
+ gSPDisplayList(POLY_OPA_DISP++, gSetupDLs[SETUPDL_35]);
+
+ CLOSE_DISPS(gfxCtx);
}
-void func_8012C448(GraphicsContext* gfxCtx) {
- gSPDisplayList(gfxCtx->polyXlu.p++, &sSetupDL[6 * 0x2C]);
+void Gfx_SetupDL44_Xlu(GraphicsContext* gfxCtx) {
+ OPEN_DISPS(gfxCtx);
+
+ gSPDisplayList(POLY_XLU_DISP++, gSetupDLs[SETUPDL_44]);
+
+ CLOSE_DISPS(gfxCtx);
}
-void func_8012C470(GraphicsContext* gfxCtx) {
- gSPDisplayList(gfxCtx->polyOpa.p++, &sSetupDL[6 * 0x24]);
+void Gfx_SetupDL36_Opa(GraphicsContext* gfxCtx) {
+ OPEN_DISPS(gfxCtx);
+
+ gSPDisplayList(POLY_OPA_DISP++, gSetupDLs[SETUPDL_36]);
+
+ CLOSE_DISPS(gfxCtx);
}
-Gfx* func_8012C498(Gfx* gfx) {
- gSPDisplayList(gfx++, &sSetupDL[6 * 0x1C]);
+Gfx* Gfx_SetupDL28(Gfx* gfx) {
+ gSPDisplayList(gfx++, gSetupDLs[SETUPDL_28]);
return gfx;
}
-void func_8012C4C0(GraphicsContext* gfxCtx) {
- gSPDisplayList(gfxCtx->polyOpa.p++, &sSetupDL[6 * 0x1C]);
+void Gfx_SetupDL28_Opa(GraphicsContext* gfxCtx) {
+ OPEN_DISPS(gfxCtx);
+
+ gSPDisplayList(POLY_OPA_DISP++, gSetupDLs[SETUPDL_28]);
+
+ CLOSE_DISPS(gfxCtx);
}
-void func_8012C4E8(GraphicsContext* gfxCtx) {
- gSPDisplayList(gfxCtx->polyOpa.p++, &sSetupDL[6 * 0x2B]);
+void Gfx_SetupDL43_Opa(GraphicsContext* gfxCtx) {
+ OPEN_DISPS(gfxCtx);
+
+ gSPDisplayList(POLY_OPA_DISP++, gSetupDLs[SETUPDL_43]);
+
+ CLOSE_DISPS(gfxCtx);
}
-void func_8012C510(GraphicsContext* gfxCtx) {
- gSPDisplayList(gfxCtx->polyOpa.p++, &sSetupDL[6 * 0x2D]);
+void Gfx_SetupDL45_Opa(GraphicsContext* gfxCtx) {
+ OPEN_DISPS(gfxCtx);
+
+ gSPDisplayList(POLY_OPA_DISP++, gSetupDLs[SETUPDL_45]);
+
+ CLOSE_DISPS(gfxCtx);
}
-void func_8012C538(GraphicsContext* gfxCtx) {
- gSPDisplayList(gfxCtx->overlay.p++, &sSetupDL[6 * 0x2E]);
+void Gfx_SetupDL46_Overlay(GraphicsContext* gfxCtx) {
+ OPEN_DISPS(gfxCtx);
+
+ gSPDisplayList(OVERLAY_DISP++, gSetupDLs[SETUPDL_46]);
+
+ CLOSE_DISPS(gfxCtx);
}
-void func_8012C560(GraphicsContext* gfxCtx) {
- gSPDisplayList(gfxCtx->polyXlu.p++, &sSetupDL[6 * 0x26]);
+void Gfx_SetupDL38_Xlu(GraphicsContext* gfxCtx) {
+ OPEN_DISPS(gfxCtx);
+
+ gSPDisplayList(POLY_XLU_DISP++, gSetupDLs[SETUPDL_38]);
+
+ CLOSE_DISPS(gfxCtx);
}
-void func_8012C588(GraphicsContext* gfxCtx) {
- gSPDisplayList(gfxCtx->polyXlu.p++, &sSetupDL[6 * 0x4]);
+void Gfx_SetupDL4_Xlu(GraphicsContext* gfxCtx) {
+ OPEN_DISPS(gfxCtx);
+
+ gSPDisplayList(POLY_XLU_DISP++, gSetupDLs[SETUPDL_4]);
+
+ CLOSE_DISPS(gfxCtx);
}
-void func_8012C5B0(GraphicsContext* gfxCtx) {
- gSPDisplayList(gfxCtx->polyOpa.p++, &sSetupDL[6 * 0x25]);
+void Gfx_SetupDL37_Opa(GraphicsContext* gfxCtx) {
+ OPEN_DISPS(gfxCtx);
+
+ gSPDisplayList(POLY_OPA_DISP++, gSetupDLs[SETUPDL_37]);
+
+ CLOSE_DISPS(gfxCtx);
}
-void func_8012C5D8(GraphicsContext* gfxCtx) {
- gSPDisplayList(gfxCtx->polyOpa.p++, &sSetupDL[6 * 0x2]);
+void Gfx_SetupDL2_Opa(GraphicsContext* gfxCtx) {
+ OPEN_DISPS(gfxCtx);
+
+ gSPDisplayList(POLY_OPA_DISP++, gSetupDLs[SETUPDL_2]);
+
+ CLOSE_DISPS(gfxCtx);
}
-Gfx* func_8012C600(Gfx* gfx) {
- gSPDisplayList(gfx++, &sSetupDL[6 * 0x27]);
+Gfx* Gfx_SetupDL39(Gfx* gfx) {
+ gSPDisplayList(gfx++, gSetupDLs[SETUPDL_39]);
return gfx;
}
-void func_8012C628(GraphicsContext* gfxCtx) {
- gfxCtx->polyOpa.p = func_8012C600(gfxCtx->polyOpa.p);
+void Gfx_SetupDL39_Opa(GraphicsContext* gfxCtx) {
+ OPEN_DISPS(gfxCtx);
+
+ POLY_OPA_DISP = Gfx_SetupDL39(POLY_OPA_DISP);
+
+ CLOSE_DISPS(gfxCtx);
}
-void func_8012C654(GraphicsContext* gfxCtx) {
- gfxCtx->overlay.p = func_8012C600(gfxCtx->overlay.p);
+void Gfx_SetupDL39_Overlay(GraphicsContext* gfxCtx) {
+ OPEN_DISPS(gfxCtx);
+
+ OVERLAY_DISP = Gfx_SetupDL39(OVERLAY_DISP);
+
+ CLOSE_DISPS(gfxCtx);
}
-void func_8012C680(Gfx** gfxp) {
+void Gfx_SetupDL39_Ptr(Gfx** gfxp) {
Gfx* gfx = *gfxp;
- gSPDisplayList(gfx++, &sSetupDL[6 * 0x27]);
+
+ gSPDisplayList(gfx++, gSetupDLs[SETUPDL_39]);
*gfxp = gfx;
}
-void func_8012C6AC(GraphicsContext* gfxCtx) {
- gSPDisplayList(gfxCtx->polyOpa.p++, &sSetupDL[6 * 0x28]);
+void Gfx_SetupDL40_Opa(GraphicsContext* gfxCtx) {
+ OPEN_DISPS(gfxCtx);
+
+ gSPDisplayList(POLY_OPA_DISP++, gSetupDLs[SETUPDL_40]);
+
+ CLOSE_DISPS(gfxCtx);
}
-void func_8012C6D4(GraphicsContext* gfxCtx) {
- gSPDisplayList(gfxCtx->polyOpa.p++, &sSetupDL[6 * 0x29]);
+void Gfx_SetupDL41_Opa(GraphicsContext* gfxCtx) {
+ OPEN_DISPS(gfxCtx);
+
+ gSPDisplayList(POLY_OPA_DISP++, gSetupDLs[SETUPDL_41]);
+
+ CLOSE_DISPS(gfxCtx);
}
-void func_8012C6FC(GraphicsContext* gfxCtx) {
- gSPDisplayList(gfxCtx->polyXlu.p++, &sSetupDL[6 * 0x2F]);
+void Gfx_SetupDL47_Xlu(GraphicsContext* gfxCtx) {
+ OPEN_DISPS(gfxCtx);
+
+ gSPDisplayList(POLY_XLU_DISP++, gSetupDLs[SETUPDL_47]);
+
+ CLOSE_DISPS(gfxCtx);
}
-Gfx* func_8012C724(Gfx* gfx) {
- gSPDisplayList(gfx++, &sSetupDL[6 * 0x42]);
+Gfx* Gfx_SetupDL66(Gfx* gfx) {
+ gSPDisplayList(gfx++, gSetupDLs[SETUPDL_66]);
return gfx;
}
-Gfx* func_8012C74C(Gfx* gfx) {
- gSPDisplayList(gfx++, &sSetupDL[6 * 0x43]);
+Gfx* Gfx_SetupDL67(Gfx* gfx) {
+ gSPDisplayList(gfx++, gSetupDLs[SETUPDL_67]);
return gfx;
}
-Gfx* func_8012C774(Gfx* gfx) {
- gSPDisplayList(gfx++, &sSetupDL[6 * 0x44]);
+Gfx* Gfx_SetupDL68_NoCD(Gfx* gfx) {
+ gSPDisplayList(gfx++, gSetupDLs[SETUPDL_68]);
gDPSetColorDither(gfx++, G_CD_DISABLE);
return gfx;
}
-Gfx* func_8012C7B8(Gfx* gfx) {
- gSPDisplayList(gfx++, &sSetupDL[6 * 0x45]);
+Gfx* Gfx_SetupDL69_NoCD(Gfx* gfx) {
+ gSPDisplayList(gfx++, gSetupDLs[SETUPDL_69]);
gDPSetColorDither(gfx++, G_CD_DISABLE);
return gfx;
}
-Gfx* func_8012C7FC(Gfx* gfx) {
- gSPDisplayList(gfx++, &sSetupDL[6 * 0x41]);
+Gfx* Gfx_SetupDL65_NoCD(Gfx* gfx) {
+ gSPDisplayList(gfx++, gSetupDLs[SETUPDL_65]);
gDPSetColorDither(gfx++, G_CD_DISABLE);
return gfx;
}
-Gfx* func_8012C840(Gfx* gfx) {
- gSPDisplayList(gfx++, &sSetupDL[6 * 0x46]);
+Gfx* Gfx_SetupDL70(Gfx* gfx) {
+ gSPDisplayList(gfx++, gSetupDLs[SETUPDL_70]);
return gfx;
}
-Gfx* func_8012C868(Gfx* gfx) {
- gSPDisplayList(gfx++, &sSetupDL[6 * 0x14]);
+Gfx* Gfx_SetupDL20_NoCD(Gfx* gfx) {
+ gSPDisplayList(gfx++, gSetupDLs[SETUPDL_20]);
gDPSetColorDither(gfx++, G_CD_DISABLE);
return gfx;
}
-void func_8012C8AC(GraphicsContext* gfxCtx) {
- gSPDisplayList(gfxCtx->polyOpa.p++, &sSetupDL[6 * 0x2A]);
+void Gfx_SetupDL42_Opa(GraphicsContext* gfxCtx) {
+ OPEN_DISPS(gfxCtx);
+
+ gSPDisplayList(POLY_OPA_DISP++, gSetupDLs[SETUPDL_42]);
+
+ CLOSE_DISPS(gfxCtx);
}
-void func_8012C8D4(GraphicsContext* gfxCtx) {
- gSPDisplayList(gfxCtx->overlay.p++, &sSetupDL[6 * 0x2A]);
+void Gfx_SetupDL42_Overlay(GraphicsContext* gfxCtx) {
+ OPEN_DISPS(gfxCtx);
+
+ gSPDisplayList(OVERLAY_DISP++, gSetupDLs[SETUPDL_42]);
+
+ CLOSE_DISPS(gfxCtx);
}
-void func_8012C8FC(GraphicsContext* gfxCtx) {
- gSPDisplayList(gfxCtx->polyOpa.p++, &sSetupDL[6 * 0x30]);
+void Gfx_SetupDL48_Opa(GraphicsContext* gfxCtx) {
+ OPEN_DISPS(gfxCtx);
+
+ gSPDisplayList(POLY_OPA_DISP++, gSetupDLs[SETUPDL_48]);
+
+ CLOSE_DISPS(gfxCtx);
}
-void func_8012C924(GraphicsContext* gfxCtx) {
- gSPDisplayList(gfxCtx->polyXlu.p++, &sSetupDL[6 * 0x31]);
+void Gfx_SetupDL49_Xlu(GraphicsContext* gfxCtx) {
+ OPEN_DISPS(gfxCtx);
+
+ gSPDisplayList(POLY_XLU_DISP++, gSetupDLs[SETUPDL_49]);
+
+ CLOSE_DISPS(gfxCtx);
}
-void func_8012C94C(GraphicsContext* gfxCtx) {
- gSPDisplayList(gfxCtx->polyXlu.p++, &sSetupDL[6 * 0x1B]);
+void Gfx_SetupDL27_Xlu(GraphicsContext* gfxCtx) {
+ OPEN_DISPS(gfxCtx);
+
+ gSPDisplayList(POLY_XLU_DISP++, gSetupDLs[SETUPDL_27]);
+
+ CLOSE_DISPS(gfxCtx);
}
-void func_8012C974(GraphicsContext* gfxCtx) {
- gSPDisplayList(gfxCtx->polyXlu.p++, &sSetupDL[6 * 0x3C]);
- gDPSetColorDither(gfxCtx->polyXlu.p++, G_CD_DISABLE);
+void Gfx_SetupDL60_XluNoCD(GraphicsContext* gfxCtx) {
+ OPEN_DISPS(gfxCtx);
+
+ gSPDisplayList(POLY_XLU_DISP++, gSetupDLs[SETUPDL_60]);
+ gDPSetColorDither(POLY_XLU_DISP++, G_CD_DISABLE);
+
+ CLOSE_DISPS(gfxCtx);
}
-void func_8012C9BC(GraphicsContext* gfxCtx) {
- gSPDisplayList(gfxCtx->polyXlu.p++, &sSetupDL[6 * 0x3D]);
+void Gfx_SetupDL61_Xlu(GraphicsContext* gfxCtx) {
+ OPEN_DISPS(gfxCtx);
+
+ gSPDisplayList(POLY_XLU_DISP++, gSetupDLs[SETUPDL_61]);
+
+ CLOSE_DISPS(gfxCtx);
}
-void func_8012C9E4(GraphicsContext* gfxCtx) {
- gSPDisplayList(gfxCtx->polyOpa.p++, &sSetupDL[6 * 0x38]);
+void Gfx_SetupDL56_Opa(GraphicsContext* gfxCtx) {
+ OPEN_DISPS(gfxCtx);
+
+ gSPDisplayList(POLY_OPA_DISP++, gSetupDLs[SETUPDL_56]);
+
+ CLOSE_DISPS(gfxCtx);
}
-void func_8012CA0C(Gfx** gfxp) {
+void Gfx_SetupDL56_Ptr(Gfx** gfxp) {
Gfx* gfx = *gfxp;
- gSPDisplayList(gfx++, &sSetupDL[6 * 0x38]);
+
+ gSPDisplayList(gfx++, gSetupDLs[SETUPDL_56]);
*gfxp = gfx;
}
-void func_8012CA38(GraphicsContext* gfxCtx) {
- gSPDisplayList(gfxCtx->polyOpa.p++, &sSetupDL[6 * 0x3B]);
+void Gfx_SetupDL59_Opa(GraphicsContext* gfxCtx) {
+ OPEN_DISPS(gfxCtx);
+
+ gSPDisplayList(POLY_OPA_DISP++, gSetupDLs[SETUPDL_59]);
+
+ CLOSE_DISPS(gfxCtx);
}
Gfx* Gfx_BranchTexScroll(Gfx** gfxp, u32 x, u32 y, s32 width, s32 height) {
diff --git a/src/code/z_room.c b/src/code/z_room.c
index 22db1035f..89cf47935 100644
--- a/src/code/z_room.c
+++ b/src/code/z_room.c
@@ -18,14 +18,14 @@ void Room_DrawNormal(PlayState* play, Room* room, u32 flags) {
if (flags & ROOM_DRAW_OPA) {
func_800BCBF4(&sZeroVec, play);
gSPSegment(POLY_OPA_DISP++, 0x03, room->segment);
- func_8012C268(play);
+ func_8012C268(&play->state);
gSPMatrix(POLY_OPA_DISP++, &gIdentityMtx, G_MTX_MODELVIEW | G_MTX_LOAD);
}
if (flags & ROOM_DRAW_XLU) {
func_800BCC68(&sZeroVec, play);
gSPSegment(POLY_XLU_DISP++, 0x03, room->segment);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPMatrix(POLY_XLU_DISP++, &gIdentityMtx, G_MTX_MODELVIEW | G_MTX_LOAD);
}
@@ -85,7 +85,7 @@ void Room_DrawCullable(PlayState* play, Room* room, u32 flags) {
if (play->roomCtx.unk74 != NULL) {
gSPSegment(POLY_OPA_DISP++, 0x06, play->roomCtx.unk74);
}
- func_8012C268(play);
+ func_8012C268(&play->state);
gSPMatrix(POLY_OPA_DISP++, &gIdentityMtx, G_MTX_MODELVIEW | G_MTX_LOAD);
}
@@ -95,7 +95,7 @@ void Room_DrawCullable(PlayState* play, Room* room, u32 flags) {
if (play->roomCtx.unk74 != NULL) {
gSPSegment(POLY_XLU_DISP++, 0x06, play->roomCtx.unk74);
}
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPMatrix(POLY_XLU_DISP++, &gIdentityMtx, G_MTX_MODELVIEW | G_MTX_LOAD);
}
@@ -317,7 +317,7 @@ void Room_DrawImageSingle(PlayState* play, Room* room, u32 flags) {
gSPSegment(POLY_OPA_DISP++, 0x03, room->segment);
if (drawOpa) {
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, &gIdentityMtx, G_MTX_MODELVIEW | G_MTX_LOAD);
gSPDisplayList(POLY_OPA_DISP++, entry->opa);
}
@@ -347,7 +347,7 @@ void Room_DrawImageSingle(PlayState* play, Room* room, u32 flags) {
if (drawXlu) {
gSPSegment(POLY_XLU_DISP++, 0x03, room->segment);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPMatrix(POLY_XLU_DISP++, &gIdentityMtx, G_MTX_MODELVIEW | G_MTX_LOAD);
gSPDisplayList(POLY_XLU_DISP++, entry->xlu);
}
@@ -357,7 +357,7 @@ void Room_DrawImageSingle(PlayState* play, Room* room, u32 flags) {
RoomShapeImageMultiBgEntry* Room_GetImageMultiBgEntry(RoomShapeImageMulti* roomShapeImageMulti, PlayState* play) {
Camera* activeCam = GET_ACTIVE_CAM(play);
- s32 bgCamIndex = activeCam->bgCamDataId;
+ s32 bgCamIndex = activeCam->bgCamIndex;
s16 overrideBgCamIndex;
Player* player;
RoomShapeImageMultiBgEntry* bgEntry;
@@ -416,7 +416,7 @@ void Room_DrawImageMulti(PlayState* play, Room* room, u32 flags) {
gSPSegment(POLY_OPA_DISP++, 0x03, room->segment);
if (drawOpa) {
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, &gIdentityMtx, G_MTX_MODELVIEW | G_MTX_LOAD);
gSPDisplayList(POLY_OPA_DISP++, dListsEntry->opa);
}
@@ -445,7 +445,7 @@ void Room_DrawImageMulti(PlayState* play, Room* room, u32 flags) {
if (drawXlu) {
gSPSegment(POLY_XLU_DISP++, 0x03, room->segment);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPMatrix(POLY_XLU_DISP++, &gIdentityMtx, G_MTX_MODELVIEW | G_MTX_LOAD);
gSPDisplayList(POLY_XLU_DISP++, dListsEntry->xlu);
}
diff --git a/src/code/z_rumble.c b/src/code/z_rumble.c
index ce5cc16b4..3cca1d432 100644
--- a/src/code/z_rumble.c
+++ b/src/code/z_rumble.c
@@ -68,11 +68,11 @@ void Rumble_Request(f32 distSq, u8 sourceIntensity, u8 decayTimer, u8 decayStep)
void Rumble_Init(void) {
RumbleManager_Init(&gRumbleMgr);
- func_80174F24(Rumble_Update, NULL);
+ PadMgr_SetRumbleRetraceCallback(Rumble_Update, NULL);
}
void Rumble_Destroy(void) {
- func_80174F44(Rumble_Update, NULL);
+ PadMgr_UnsetRumbleRetraceCallback(Rumble_Update, NULL);
RumbleManager_Destroy(&gRumbleMgr);
}
diff --git a/src/code/z_skelanime.c b/src/code/z_skelanime.c
index 085cb4de2..cff66dacb 100644
--- a/src/code/z_skelanime.c
+++ b/src/code/z_skelanime.c
@@ -1944,7 +1944,7 @@ void SkelAnime_UpdateTranslation(SkelAnime* skelAnime, Vec3f* diff, s16 angle) {
skelAnime->jointTable->x = skelAnime->baseTransl.x;
skelAnime->prevTransl.z = skelAnime->jointTable->z;
skelAnime->jointTable->z = skelAnime->baseTransl.z;
- if (skelAnime->moveFlags & ANIM_FLAG_UPDATEY) {
+ if (skelAnime->moveFlags & ANIM_FLAG_UPDATE_Y) {
if (skelAnime->moveFlags & ANIM_FLAG_NOMOVE) {
diff->y = 0.0f;
} else {
diff --git a/src/code/z_sub_s.c b/src/code/z_sub_s.c
index a4d95af64..09897fbb9 100644
--- a/src/code/z_sub_s.c
+++ b/src/code/z_sub_s.c
@@ -15,7 +15,7 @@ Vec3f gOneVec3f = { 1.0f, 1.0f, 1.0f };
s32 D_801C5DBC[] = { 0, 1 }; // Unused
/**
- * Finds the first EnDoor instance with unk_1A4 == 5 and the specified switchFlag.
+ * Finds the first EnDoor instance with doorType == ENDOOR_TYPE_5 and the specified switchFlag.
*/
EnDoor* SubS_FindDoor(PlayState* play, s32 switchFlag) {
Actor* actor = NULL;
@@ -29,7 +29,7 @@ EnDoor* SubS_FindDoor(PlayState* play, s32 switchFlag) {
break;
}
- if ((door->unk_1A4 == 5) && (door->switchFlag == (u8)switchFlag)) {
+ if ((door->doorType == ENDOOR_TYPE_5) && (door->switchFlag == (u8)switchFlag)) {
break;
}
@@ -994,7 +994,7 @@ void SubS_DrawShadowTex(Actor* actor, GameState* gameState, u8* tex) {
OPEN_DISPS(gfxCtx);
- func_8012C28C(gfxCtx);
+ Gfx_SetupDL25_Opa(gfxCtx);
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 0, 0, 0, 100);
gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 0);
Matrix_Translate(actor->world.pos.x, 0.0f, actor->world.pos.z, MTXMODE_NEW);
diff --git a/src/code/z_vr_box_draw.c b/src/code/z_vr_box_draw.c
index 489f596e5..656f6cad3 100644
--- a/src/code/z_vr_box_draw.c
+++ b/src/code/z_vr_box_draw.c
@@ -23,7 +23,7 @@ void Skybox_SetColors(SkyboxContext* skyboxCtx, u8 primR, u8 primG, u8 primB, u8
void Skybox_Draw(SkyboxContext* skyboxCtx, GraphicsContext* gfxCtx, s16 skyboxId, s16 blend, f32 x, f32 y, f32 z) {
OPEN_DISPS(gfxCtx);
- func_8012C6AC(gfxCtx);
+ Gfx_SetupDL40_Opa(gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x0B, skyboxCtx->paletteStaticSegment);
gSPTexture(POLY_OPA_DISP++, 0x8000, 0x8000, 0, G_TX_RENDERTILE, G_ON);
diff --git a/src/libultra/io/motor.c b/src/libultra/io/motor.c
index 649a8b368..9e0eb127e 100644
--- a/src/libultra/io/motor.c
+++ b/src/libultra/io/motor.c
@@ -6,40 +6,40 @@
#define BANK_ADDR 0x400
#define MOTOR_ID 0x80
-OSPifRam osPifBuffers[MAXCONTROLLERS];
+OSPifRam __MotorDataBuf[MAXCONTROLLERS];
s32 __osPfsSelectBank(OSPfs* pfs, u8 bank);
-s32 __osMotorAccess(OSPfs* pfs, u32 vibrate) {
+s32 __osMotorAccess(OSPfs* pfs, s32 flag) {
s32 i;
s32 ret;
- u8* buf = (u8*)&osPifBuffers[pfs->channel];
+ u8* ptr = (u8*)&__MotorDataBuf[pfs->channel];
- if (!(pfs->status & 8)) {
- return 5;
+ if (!(pfs->status & PFS_MOTOR_INITIALIZED)) {
+ return PFS_ERR_INVALID;
}
__osSiGetAccess();
- osPifBuffers[pfs->channel].status = 1;
- buf += pfs->channel;
+ __MotorDataBuf[pfs->channel].status = CONT_CMD_EXE;
+ ptr += pfs->channel;
for (i = 0; i < BLOCKSIZE; i++) {
- ((__OSContRamReadFormat*)buf)->data[i] = vibrate;
+ READFORMAT(ptr)->data[i] = flag;
}
__osContLastPoll = CONT_CMD_END;
- __osSiRawStartDma(OS_WRITE, &osPifBuffers[pfs->channel]);
+ __osSiRawStartDma(OS_WRITE, &__MotorDataBuf[pfs->channel]);
osRecvMesg(pfs->queue, NULL, OS_MESG_BLOCK);
- __osSiRawStartDma(OS_READ, &osPifBuffers[pfs->channel]);
+ __osSiRawStartDma(OS_READ, &__MotorDataBuf[pfs->channel]);
osRecvMesg(pfs->queue, NULL, OS_MESG_BLOCK);
- ret = ((__OSContRamReadFormat*)buf)->rxsize & 0xC0;
+ ret = READFORMAT(ptr)->rxsize & CHNL_ERR_MASK;
if (!ret) {
- if (!vibrate) {
- if (((__OSContRamReadFormat*)buf)->datacrc != 0) {
+ if (!flag) {
+ if (READFORMAT(ptr)->datacrc != 0) {
ret = PFS_ERR_CONTRFAIL;
}
} else {
- if (((__OSContRamReadFormat*)buf)->datacrc != 0xEB) {
+ if (READFORMAT(ptr)->datacrc != 0xEB) {
ret = PFS_ERR_CONTRFAIL;
}
}
@@ -50,76 +50,75 @@ s32 __osMotorAccess(OSPfs* pfs, u32 vibrate) {
return ret;
}
-void _MakeMotorData(s32 channel, OSPifRam* buf) {
- u8* bufptr = (u8*)buf;
- __OSContRamReadFormat mempakwr;
+void _MakeMotorData(s32 channel, OSPifRam* mdata) {
+ u8* ptr = (u8*)mdata->ramarray;
+ __OSContRamReadFormat ramreadformat;
s32 i;
- mempakwr.dummy = 0xFF;
- mempakwr.txsize = 0x23;
- mempakwr.rxsize = 1;
- mempakwr.cmd = 3; // write mempak
- mempakwr.hi = 0x600 >> 3;
- mempakwr.lo = (u8)(__osContAddressCrc(0x600) | (0x600 << 5));
+ ramreadformat.dummy = CONT_CMD_NOP;
+ ramreadformat.txsize = CONT_CMD_WRITE_PAK_TX;
+ ramreadformat.rxsize = CONT_CMD_WRITE_PAK_RX;
+ ramreadformat.cmd = CONT_CMD_WRITE_PAK;
+ ramreadformat.hi = CONT_BLOCK_RUMBLE >> 3;
+ ramreadformat.lo = (u8)(__osContAddressCrc(CONT_BLOCK_RUMBLE) | (CONT_BLOCK_RUMBLE << 5));
if (channel != 0) {
for (i = 0; i < channel; i++) {
- *bufptr++ = 0;
+ *ptr++ = 0;
}
}
- *(__OSContRamReadFormat*)bufptr = mempakwr;
- bufptr += sizeof(mempakwr);
- *bufptr = 0xFE;
+ *READFORMAT(ptr) = ramreadformat;
+ ptr += sizeof(ramreadformat);
+ *ptr = CONT_CMD_END;
}
-s32 osMotorInit(OSMesgQueue* ctrlrqueue, OSPfs* pfs, s32 channel) {
+s32 osMotorInit(OSMesgQueue* mq, OSPfs* pfs, s32 channel) {
s32 ret;
- u8 sp24[BLOCKSIZE];
+ u8 temp[BLOCKSIZE];
- pfs->queue = ctrlrqueue;
+ pfs->queue = mq;
pfs->channel = channel;
pfs->activebank = 0xFF;
pfs->status = 0;
ret = __osPfsSelectBank(pfs, 0xFE);
- if (ret == 2) {
+ if (ret == PFS_ERR_NEW_PACK) {
ret = __osPfsSelectBank(pfs, MOTOR_ID);
}
if (ret != 0) {
return ret;
}
- ret = __osContRamRead(ctrlrqueue, channel, 0x400, sp24);
- if (ret == 2) {
- ret = 4; // "Controller pack communication error"
+ ret = __osContRamRead(mq, channel, CONT_BLOCK_DETECT, temp);
+ if (ret == PFS_ERR_NEW_PACK) {
+ ret = PFS_ERR_CONTRFAIL;
}
if (ret != 0) {
return ret;
}
- if (sp24[BLOCKSIZE - 1] == 0xFE) {
- return 0xB;
+ if (temp[BLOCKSIZE - 1] == 0xFE) {
+ return PFS_ERR_DEVICE;
}
ret = __osPfsSelectBank(pfs, MOTOR_ID);
if (ret == 2) {
- ret = 4; // "Controller pack communication error"
+ ret = PFS_ERR_CONTRFAIL;
}
if (ret != 0) {
return ret;
}
- ret = __osContRamRead(ctrlrqueue, channel, BANK_ADDR, sp24);
- if (ret == 2) {
- ret = 4; // "Controller pack communication error"
+ ret = __osContRamRead(mq, channel, BANK_ADDR, temp);
+ if (ret == PFS_ERR_NEW_PACK) {
+ ret = PFS_ERR_CONTRFAIL;
}
if (ret != 0) {
return ret;
}
- if (sp24[BLOCKSIZE - 1] != MOTOR_ID) {
- return 0xB;
+ if (temp[BLOCKSIZE - 1] != MOTOR_ID) {
+ return PFS_ERR_DEVICE;
}
if (!(pfs->status & PFS_MOTOR_INITIALIZED)) {
- _MakeMotorData(channel, &osPifBuffers[channel]);
+ _MakeMotorData(channel, &__MotorDataBuf[channel]);
}
pfs->status = PFS_MOTOR_INITIALIZED;
-
- return 0; // "Recognized rumble pak"
+ return 0;
}
diff --git a/src/overlays/actors/ovl_Arms_Hook/z_arms_hook.c b/src/overlays/actors/ovl_Arms_Hook/z_arms_hook.c
index e271449b5..e06d51313 100644
--- a/src/overlays/actors/ovl_Arms_Hook/z_arms_hook.c
+++ b/src/overlays/actors/ovl_Arms_Hook/z_arms_hook.c
@@ -141,6 +141,7 @@ void ArmsHook_Shoot(ArmsHook* this, PlayState* play) {
if (this->timer != 0 && (this->collider.base.atFlags & AT_HIT) &&
(this->collider.info.atHitInfo->elemType != ELEMTYPE_UNK4)) {
Actor* touchedActor = this->collider.base.at;
+
if ((touchedActor->update != NULL) && (touchedActor->flags & (ACTOR_FLAG_200 | ACTOR_FLAG_400))) {
if (this->collider.info.atHitInfo->bumperFlags & BUMP_HOOKABLE) {
ArmsHook_AttachHookToActor(this, touchedActor);
@@ -314,7 +315,7 @@ void ArmsHook_Draw(Actor* thisx, PlayState* play) {
Matrix_MultVec3f(&D_808C1C4C, &sp50);
}
func_80126440(play, &this->collider, &this->weaponInfo, &sp5C, &sp50);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
func_80122868(play, player);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
diff --git a/src/overlays/actors/ovl_Arms_Hook/z_arms_hook.h b/src/overlays/actors/ovl_Arms_Hook/z_arms_hook.h
index 31b675f41..bde007da1 100644
--- a/src/overlays/actors/ovl_Arms_Hook/z_arms_hook.h
+++ b/src/overlays/actors/ovl_Arms_Hook/z_arms_hook.h
@@ -15,7 +15,7 @@ typedef struct ArmsHook {
/* 0x1EC */ Vec3f unk1EC;
/* 0x1F8 */ Actor* grabbed;
/* 0x1FC */ Vec3f unk1FC;
- /* 0x208 */ UNK_TYPE1 unk208[0x2];
+ /* 0x208 */ s8 unk_208;
/* 0x20A */ s16 timer;
/* 0x20C */ ArmsHookActionFunc actionFunc;
} ArmsHook; // size = 0x210
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 971b778be..7af684201 100644
--- a/src/overlays/actors/ovl_Arrow_Fire/z_arrow_fire.c
+++ b/src/overlays/actors/ovl_Arrow_Fire/z_arrow_fire.c
@@ -19,7 +19,7 @@ void ArrowFire_Draw(Actor* thisx, PlayState* play);
void FireArrow_ChargeAndWait(ArrowFire* this, PlayState* play);
void FireArrow_Fly(ArrowFire* this, PlayState* play);
-#include "overlays/ovl_Arrow_fire/ovl_Arrow_Fire.c"
+#include "overlays/ovl_Arrow_Fire/ovl_Arrow_Fire.c"
ActorInit Arrow_Fire_InitVars = {
ACTOR_ARROW_FIRE,
@@ -256,7 +256,7 @@ void ArrowFire_Draw(Actor* thisx, PlayState* play) {
Matrix_Scale(0.01f, 0.01f, 0.01f, MTXMODE_APPLY);
if (this->screenFillIntensity > 0.0f) {
- POLY_XLU_DISP = func_8012BFC4(POLY_XLU_DISP);
+ POLY_XLU_DISP = Gfx_SetupDL57(POLY_XLU_DISP);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, (s32)(this->screenFillIntensity * 40.0f) & 0xFF, 0, 0,
(s32)(150.0f * this->screenFillIntensity) & 0xFF);
@@ -266,7 +266,7 @@ void ArrowFire_Draw(Actor* thisx, PlayState* play) {
gSPDisplayList(POLY_XLU_DISP++, D_0E000000.fillRect);
}
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gDPSetPrimColor(POLY_XLU_DISP++, 0x80, 0x80, 255, 200, 0, this->alpha);
gDPSetEnvColor(POLY_XLU_DISP++, 255, 0, 0, 128);
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 62c97ccde..83c37fa6c 100644
--- a/src/overlays/actors/ovl_Arrow_Ice/z_arrow_ice.c
+++ b/src/overlays/actors/ovl_Arrow_Ice/z_arrow_ice.c
@@ -204,7 +204,7 @@ void ArrowIce_Draw(Actor* thisx, PlayState* play) {
// Draw blue effect over the screen when arrow hits
if (this->blueingEffectMagnitude > 0.0f) {
- POLY_XLU_DISP = func_8012BFC4(POLY_XLU_DISP);
+ POLY_XLU_DISP = Gfx_SetupDL57(POLY_XLU_DISP);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 0, (s32)(this->blueingEffectMagnitude * 10.0f) & 0xFF,
(s32)(50.0f * this->blueingEffectMagnitude) & 0xFF,
(s32)(150.0f * this->blueingEffectMagnitude) & 0xFF);
@@ -214,7 +214,7 @@ void ArrowIce_Draw(Actor* thisx, PlayState* play) {
}
// Draw ice on the arrow
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gDPSetPrimColor(POLY_XLU_DISP++, 0x80, 0x80, 170, 255, 255, (s32)(this->alpha * 0.5f) & 0xFF);
gDPSetEnvColor(POLY_XLU_DISP++, 0, 0, 255, 128);
Matrix_RotateZYX(0x4000, 0, 0, MTXMODE_APPLY);
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 360afa4ac..b650533da 100644
--- a/src/overlays/actors/ovl_Arrow_Light/z_arrow_light.c
+++ b/src/overlays/actors/ovl_Arrow_Light/z_arrow_light.c
@@ -196,7 +196,7 @@ void ArrowLight_Draw(Actor* thisx, PlayState* play) {
Matrix_RotateZS(transform->shape.rot.z, MTXMODE_APPLY);
Matrix_Scale(0.01f, 0.01f, 0.01f, MTXMODE_APPLY);
if (this->screenFillIntensity > 0.0f) {
- POLY_XLU_DISP = func_8012BFC4(POLY_XLU_DISP);
+ POLY_XLU_DISP = Gfx_SetupDL57(POLY_XLU_DISP);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, (s32)(this->screenFillIntensity * 30.0f) & 0xFF,
(s32)(40.0f * this->screenFillIntensity) & 0xFF, 0,
(s32)(150.0f * this->screenFillIntensity) & 0xFF);
@@ -205,7 +205,7 @@ void ArrowLight_Draw(Actor* thisx, PlayState* play) {
gSPDisplayList(POLY_XLU_DISP++, D_0E000000.fillRect);
}
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gDPSetPrimColor(POLY_XLU_DISP++, 0x80, 0x80, 255, 255, 170, this->alpha);
gDPSetEnvColor(POLY_XLU_DISP++, 255, 255, 0, 128);
diff --git a/src/overlays/actors/ovl_Bg_Astr_Bombwall/z_bg_astr_bombwall.c b/src/overlays/actors/ovl_Bg_Astr_Bombwall/z_bg_astr_bombwall.c
index 59348962a..18e2eb5d0 100644
--- a/src/overlays/actors/ovl_Bg_Astr_Bombwall/z_bg_astr_bombwall.c
+++ b/src/overlays/actors/ovl_Bg_Astr_Bombwall/z_bg_astr_bombwall.c
@@ -203,7 +203,7 @@ void BgAstrBombwall_Draw(Actor* thixs, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
opa = POLY_OPA_DISP;
- gSPDisplayList(&opa[0], &sSetupDL[25 * 6]);
+ gSPDisplayList(&opa[0], gSetupDLs[SETUPDL_25]);
gSPMatrix(&opa[1], Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPSetGeometryMode(&opa[2], G_LIGHTING_POSITIONAL);
gSPDisplayList(&opa[3], object_astr_obj_DL_002380);
@@ -215,7 +215,7 @@ void BgAstrBombwall_Draw(Actor* thixs, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
xlu = POLY_XLU_DISP;
- gSPDisplayList(&xlu[0], &sSetupDL[25 * 6]);
+ gSPDisplayList(&xlu[0], gSetupDLs[SETUPDL_25]);
gSPMatrix(&xlu[1], Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPSetGeometryMode(&xlu[2], G_LIGHTING_POSITIONAL);
gSPDisplayList(&xlu[3], object_astr_obj_DL_0022E0);
diff --git a/src/overlays/actors/ovl_Bg_Botihasira/z_bg_botihasira.c b/src/overlays/actors/ovl_Bg_Botihasira/z_bg_botihasira.c
index a5168eb24..f1394a32e 100644
--- a/src/overlays/actors/ovl_Bg_Botihasira/z_bg_botihasira.c
+++ b/src/overlays/actors/ovl_Bg_Botihasira/z_bg_botihasira.c
@@ -95,7 +95,7 @@ void BgBotihasira_Update(Actor* thisx, PlayState* play2) {
void BgBotihasira_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, object_botihasira_DL_000638);
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 b2e59a51b..ef35a34ed 100644
--- a/src/overlays/actors/ovl_Bg_Breakwall/z_bg_breakwall.c
+++ b/src/overlays/actors/ovl_Bg_Breakwall/z_bg_breakwall.c
@@ -84,8 +84,7 @@ BgBreakwallStruct D_808B8140[] = {
func_808B77D0, NULL },
{ OBJECT_IKNINSIDE_OBJ, NULL, object_ikninside_obj_DL_00AEC0, object_ikninside_obj_Matanimheader_00BCB8, NULL,
func_808B751C, func_808B7A10, func_808B7D34 },
- { OBJECT_SPOT11_OBJ, object_spot11_obj_DL_0013F0, NULL, NULL, &object_spot11_obj_Colheader_001EB8, func_808B736C,
- func_808B77D0, NULL },
+ { OBJECT_SPOT11_OBJ, gWoodStepDL, NULL, NULL, &gWoodStepCol, func_808B736C, func_808B77D0, NULL },
};
static InitChainEntry sInitChain[] = {
@@ -355,7 +354,7 @@ void func_808B7B54(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
@@ -423,14 +422,14 @@ void BgBreakwall_Draw(Actor* thisx, PlayState* play) {
}
if (temp_s2->unk_04 != NULL) {
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, temp_s2->unk_04);
}
if (temp_s2->unk_08 != NULL) {
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_XLU_DISP++, temp_s2->unk_08);
diff --git a/src/overlays/actors/ovl_Bg_Ctower_Gear/z_bg_ctower_gear.c b/src/overlays/actors/ovl_Bg_Ctower_Gear/z_bg_ctower_gear.c
index adf9b3c96..22998a34e 100644
--- a/src/overlays/actors/ovl_Bg_Ctower_Gear/z_bg_ctower_gear.c
+++ b/src/overlays/actors/ovl_Bg_Ctower_Gear/z_bg_ctower_gear.c
@@ -191,10 +191,10 @@ void BgCtowerGear_Draw(Actor* thisx, PlayState* play) {
void BgCtowerGear_DrawOrgan(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, gClockTowerOrganDL);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_XLU_DISP++, gClockTowerOrganPipesDL);
CLOSE_DISPS(play->state.gfxCtx);
diff --git a/src/overlays/actors/ovl_Bg_Dblue_Balance/z_bg_dblue_balance.c b/src/overlays/actors/ovl_Bg_Dblue_Balance/z_bg_dblue_balance.c
index 2a59a9b8f..79ed63188 100644
--- a/src/overlays/actors/ovl_Bg_Dblue_Balance/z_bg_dblue_balance.c
+++ b/src/overlays/actors/ovl_Bg_Dblue_Balance/z_bg_dblue_balance.c
@@ -663,7 +663,7 @@ void BgDblueBalance_Draw(Actor* thisx, PlayState* play) {
gfx = POLY_XLU_DISP;
- gSPDisplayList(gfx++, &sSetupDL[6 * 25]);
+ gSPDisplayList(gfx++, gSetupDLs[SETUPDL_25]);
gSPMatrix(gfx++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gDPSetEnvColor(gfx++, 0, 0, 0, this->unk_183);
gSPDisplayList(gfx++, gGreatBayTempleObjectSeesawSplashDL);
@@ -705,7 +705,7 @@ void func_80B83758(Actor* thisx, PlayState* play) {
gfx = POLY_XLU_DISP;
- gSPDisplayList(gfx++, &sSetupDL[6 * 25]);
+ gSPDisplayList(gfx++, gSetupDLs[SETUPDL_25]);
for (i = 0, ptr = &this->unk_188[0]; i < ARRAY_COUNT(this->unk_188); i++, ptr++) {
if (ptr->unk_0E != 0) {
diff --git a/src/overlays/actors/ovl_Bg_Dblue_Movebg/z_bg_dblue_movebg.c b/src/overlays/actors/ovl_Bg_Dblue_Movebg/z_bg_dblue_movebg.c
index 570369f07..de7e7eb32 100644
--- a/src/overlays/actors/ovl_Bg_Dblue_Movebg/z_bg_dblue_movebg.c
+++ b/src/overlays/actors/ovl_Bg_Dblue_Movebg/z_bg_dblue_movebg.c
@@ -752,7 +752,7 @@ void func_80A2B308(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, this->opaDList);
@@ -778,7 +778,7 @@ void BgDblueMovebg_Draw(Actor* thisx, PlayState* play2) {
}
if ((this->opaDList != NULL) || (this->unk_160 == 6)) {
- gfx2 = Gfx_CallSetupDL(POLY_OPA_DISP, 0x19);
+ gfx2 = Gfx_SetupDL(POLY_OPA_DISP, SETUPDL_25);
gSPMatrix(&gfx2[0], Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
@@ -797,7 +797,7 @@ void BgDblueMovebg_Draw(Actor* thisx, PlayState* play2) {
}
if (this->xluDList != NULL) {
- gfx = func_8012C2B4(POLY_XLU_DISP);
+ gfx = Gfx_SetupDL71(POLY_XLU_DISP);
gSPMatrix(&gfx[0], Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(&gfx[1], this->xluDList);
@@ -820,7 +820,7 @@ void BgDblueMovebg_Draw(Actor* thisx, PlayState* play2) {
Matrix_RotateYS(this->dyna.actor.shape.rot.y, MTXMODE_APPLY);
Matrix_RotateXS(this->dyna.actor.shape.rot.x, MTXMODE_APPLY);
Matrix_RotateZS(this->dyna.actor.shape.rot.z, MTXMODE_APPLY);
- gfx = func_8012C2B4(POLY_XLU_DISP);
+ gfx = Gfx_SetupDL71(POLY_XLU_DISP);
for (i = 0; i < ARRAY_COUNT(this->unk_1D8[0]); i++) {
for (j = 0; j < ARRAY_COUNT(this->unk_1D8); j++) {
diff --git a/src/overlays/actors/ovl_Bg_Dblue_Waterfall/z_bg_dblue_waterfall.c b/src/overlays/actors/ovl_Bg_Dblue_Waterfall/z_bg_dblue_waterfall.c
index 8f3de2b2e..d0d0f0c3c 100644
--- a/src/overlays/actors/ovl_Bg_Dblue_Waterfall/z_bg_dblue_waterfall.c
+++ b/src/overlays/actors/ovl_Bg_Dblue_Waterfall/z_bg_dblue_waterfall.c
@@ -321,8 +321,8 @@ void func_80B84610(BgDblueWaterfall* this, PlayState* play) {
player->actor.world.pos.x += sp34.x;
player->actor.world.pos.z += sp34.z;
if (this && this && this) {}
- player->unk_B80 = 8.0f;
- player->unk_B84 = this->actor.yawTowardsPlayer;
+ player->pushedSpeed = 8.0f;
+ player->pushedYaw = this->actor.yawTowardsPlayer;
}
static InitChainEntry sInitChain[] = {
@@ -590,7 +590,7 @@ void BgDblueWaterfall_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
@@ -609,7 +609,7 @@ void BgDblueWaterfall_Draw(Actor* thisx, PlayState* play) {
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0x9B, 255, 255, 255, this->unk_19F);
gSPDisplayList(POLY_XLU_DISP++, gGreatBayTempleObjectIceStalactiteDL);
} else {
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x09, D_801AEFA0);
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0x9B, 255, 255, 255, 255);
diff --git a/src/overlays/actors/ovl_Bg_Dkjail_Ivy/z_bg_dkjail_ivy.c b/src/overlays/actors/ovl_Bg_Dkjail_Ivy/z_bg_dkjail_ivy.c
index e9f8916d0..70bc5931f 100644
--- a/src/overlays/actors/ovl_Bg_Dkjail_Ivy/z_bg_dkjail_ivy.c
+++ b/src/overlays/actors/ovl_Bg_Dkjail_Ivy/z_bg_dkjail_ivy.c
@@ -200,7 +200,7 @@ void BgDkjailIvy_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0xFF, 255, 255, 255, this->alpha);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
diff --git a/src/overlays/actors/ovl_Bg_Fire_Wall/z_bg_fire_wall.c b/src/overlays/actors/ovl_Bg_Fire_Wall/z_bg_fire_wall.c
index 40b8c78a7..e15c87f42 100644
--- a/src/overlays/actors/ovl_Bg_Fire_Wall/z_bg_fire_wall.c
+++ b/src/overlays/actors/ovl_Bg_Fire_Wall/z_bg_fire_wall.c
@@ -205,7 +205,7 @@ void BgFireWall_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- POLY_XLU_DISP = Gfx_CallSetupDL(POLY_XLU_DISP, 20);
+ POLY_XLU_DISP = Gfx_SetupDL(POLY_XLU_DISP, SETUPDL_20);
gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(sFlameTextures[this->texIndex]));
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0x01, 255, 255, 0, 150);
gDPSetEnvColor(POLY_XLU_DISP++, 255, 0, 0, 255);
diff --git a/src/overlays/actors/ovl_Bg_Fu_Kaiten/z_bg_fu_kaiten.c b/src/overlays/actors/ovl_Bg_Fu_Kaiten/z_bg_fu_kaiten.c
index bec649b57..7b63081c0 100644
--- a/src/overlays/actors/ovl_Bg_Fu_Kaiten/z_bg_fu_kaiten.c
+++ b/src/overlays/actors/ovl_Bg_Fu_Kaiten/z_bg_fu_kaiten.c
@@ -77,7 +77,7 @@ void BgFuKaiten_Update(Actor* thisx, PlayState* play) {
void BgFuKaiten_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, object_fu_kaiten_DL_0005D0);
diff --git a/src/overlays/actors/ovl_Bg_Fu_Mizu/z_bg_fu_mizu.c b/src/overlays/actors/ovl_Bg_Fu_Mizu/z_bg_fu_mizu.c
index 7f485be1d..9da3cc5f6 100644
--- a/src/overlays/actors/ovl_Bg_Fu_Mizu/z_bg_fu_mizu.c
+++ b/src/overlays/actors/ovl_Bg_Fu_Mizu/z_bg_fu_mizu.c
@@ -87,7 +87,7 @@ void BgFuMizu_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_XLU_DISP++, object_fu_kaiten_DL_002FC0);
diff --git a/src/overlays/actors/ovl_Bg_Goron_Oyu/z_bg_goron_oyu.c b/src/overlays/actors/ovl_Bg_Goron_Oyu/z_bg_goron_oyu.c
index 7d0ed6a1a..fd46e16e5 100644
--- a/src/overlays/actors/ovl_Bg_Goron_Oyu/z_bg_goron_oyu.c
+++ b/src/overlays/actors/ovl_Bg_Goron_Oyu/z_bg_goron_oyu.c
@@ -183,10 +183,12 @@ void BgGoronOyu_Update(Actor* thisx, PlayState* play) {
void BgGoronOyu_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
AnimatedMat_Draw(play, Lib_SegmentedToVirtual(object_oyu_Matanimheader_000968));
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_XLU_DISP++, &object_oyu_DL_000158);
gSPDisplayList(POLY_XLU_DISP++, &object_oyu_DL_000080);
+
CLOSE_DISPS(play->state.gfxCtx);
}
diff --git a/src/overlays/actors/ovl_Bg_Hakugin_Elvpole/z_bg_hakugin_elvpole.c b/src/overlays/actors/ovl_Bg_Hakugin_Elvpole/z_bg_hakugin_elvpole.c
index 7cd94bd86..10f045617 100644
--- a/src/overlays/actors/ovl_Bg_Hakugin_Elvpole/z_bg_hakugin_elvpole.c
+++ b/src/overlays/actors/ovl_Bg_Hakugin_Elvpole/z_bg_hakugin_elvpole.c
@@ -126,7 +126,7 @@ void BgHakuginElvpole_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPDisplayList(POLY_OPA_DISP++, object_hakugin_obj_DL_00ACB8);
CLOSE_DISPS(play->state.gfxCtx);
diff --git a/src/overlays/actors/ovl_Bg_Hakugin_Post/z_bg_hakugin_post.c b/src/overlays/actors/ovl_Bg_Hakugin_Post/z_bg_hakugin_post.c
index a8b6ce702..7bddd548f 100644
--- a/src/overlays/actors/ovl_Bg_Hakugin_Post/z_bg_hakugin_post.c
+++ b/src/overlays/actors/ovl_Bg_Hakugin_Post/z_bg_hakugin_post.c
@@ -522,10 +522,10 @@ void func_80A9C058(BgHakuginPost* this, PlayState* play, BgHakuginPostUnkStruct*
sp44.z = this->dyna.actor.home.pos.z + unkStruct1->unk_14.z;
Rumble_Request(Math3D_Vec3fDistSq(&sp44, &GET_PLAYER(play)->actor.world.pos), 255, 20, 150);
- quakeIndex = Quake_Add(GET_ACTIVE_CAM(play), QUAKE_TYPE_3);
+ quakeIndex = Quake_Request(GET_ACTIVE_CAM(play), QUAKE_TYPE_3);
Quake_SetSpeed(quakeIndex, 20000);
- Quake_SetQuakeValues(quakeIndex, 7, 0, 0, 0);
- Quake_SetCountdown(quakeIndex, 12);
+ Quake_SetPerturbations(quakeIndex, 7, 0, 0, 0);
+ Quake_SetDuration(quakeIndex, 12);
if (this->unk_179 <= 0) {
func_8019F128(NA_SE_EV_STONEDOOR_STOP);
@@ -537,7 +537,7 @@ void func_80A9C058(BgHakuginPost* this, PlayState* play, BgHakuginPostUnkStruct*
}
}
-void func_80A9C18C(BgHakuginPost* this, PlayState* play) {
+void BgHakuginPost_RequestQuakeAndRumble(BgHakuginPost* this, PlayState* play) {
s32 pad;
Player* player = GET_PLAYER(play);
Camera* activeCam = GET_ACTIVE_CAM(play);
@@ -547,10 +547,10 @@ void func_80A9C18C(BgHakuginPost* this, PlayState* play) {
this->dyna.actor.home.pos.x, this->dyna.actor.home.pos.z),
255, 20, 150);
- quakeIndex = Quake_Add(activeCam, QUAKE_TYPE_3);
+ quakeIndex = Quake_Request(activeCam, QUAKE_TYPE_3);
Quake_SetSpeed(quakeIndex, 17232);
- Quake_SetQuakeValues(quakeIndex, 6, 0, 0, 0);
- Quake_SetCountdown(quakeIndex, 20);
+ Quake_SetPerturbations(quakeIndex, 6, 0, 0, 0);
+ Quake_SetDuration(quakeIndex, 20);
}
void func_80A9C228(BgHakuginPost* this, PlayState* play, BgHakuginPostUnkStruct* unkStruct) {
@@ -798,7 +798,7 @@ void func_80A9CD14(BgHakuginPost* this, PlayState* play) {
temp_f12 = CLAMP_MAX(temp_f12, 40.0f);
this->unk_16C += temp_f12;
if (this->unk_168 <= this->unk_16C) {
- func_80A9C18C(this, play);
+ BgHakuginPost_RequestQuakeAndRumble(this, play);
func_8019F128(NA_SE_EV_STONEDOOR_STOP);
func_80A9CE00(this);
} else {
@@ -876,7 +876,7 @@ void func_80A9D0B4(BgHakuginPost* this, PlayState* play) {
func_80A9C634(this, play);
func_80A9B160(&D_80A9E028, play);
this->unk_16C = this->unk_164;
- func_80A9C18C(this, play);
+ BgHakuginPost_RequestQuakeAndRumble(this, play);
func_8019F128(NA_SE_EV_STONEDOOR_STOP);
func_80A9CC84(this);
} else {
@@ -1012,7 +1012,7 @@ void func_80A9D61C(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
Matrix_SetTranslateRotateYXZ(this->dyna.actor.world.pos.x, this->dyna.actor.world.pos.y,
this->dyna.actor.world.pos.z, &this->dyna.actor.shape.rot);
Matrix_Scale(0.1f, 0.1f, 0.1f, MTXMODE_APPLY);
diff --git a/src/overlays/actors/ovl_Bg_Ikana_Block/z_bg_ikana_block.c b/src/overlays/actors/ovl_Bg_Ikana_Block/z_bg_ikana_block.c
index 401d3543e..93d605320 100644
--- a/src/overlays/actors/ovl_Bg_Ikana_Block/z_bg_ikana_block.c
+++ b/src/overlays/actors/ovl_Bg_Ikana_Block/z_bg_ikana_block.c
@@ -375,7 +375,7 @@ void func_80B7F564(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
AnimatedMat_DrawStep(play, this->unk_15C, 0);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
diff --git a/src/overlays/actors/ovl_Bg_Ikana_Dharma/z_bg_ikana_dharma.c b/src/overlays/actors/ovl_Bg_Ikana_Dharma/z_bg_ikana_dharma.c
index 44f81da9c..f853fdfc5 100644
--- a/src/overlays/actors/ovl_Bg_Ikana_Dharma/z_bg_ikana_dharma.c
+++ b/src/overlays/actors/ovl_Bg_Ikana_Dharma/z_bg_ikana_dharma.c
@@ -228,11 +228,11 @@ void BgIkanaDharma_Update(Actor* thisx, PlayState* play) {
Actor_MoveWithGravity(&this->dyna.actor);
Actor_UpdateBgCheckInfo(play, &this->dyna.actor, 0.0f, 0.0f, 0.0f, UPDBGCHECKINFO_FLAG_4);
if (this->dyna.actor.bgCheckFlags & BGCHECKFLAG_GROUND_TOUCH) {
- s16 quakeIndex = Quake_Add(GET_ACTIVE_CAM(play), QUAKE_TYPE_3);
+ s16 quakeIndex = Quake_Request(GET_ACTIVE_CAM(play), QUAKE_TYPE_3);
Quake_SetSpeed(quakeIndex, 21536);
- Quake_SetQuakeValues(quakeIndex, 4, 0, 0, 0);
- Quake_SetCountdown(quakeIndex, 12);
+ Quake_SetPerturbations(quakeIndex, 4, 0, 0, 0);
+ Quake_SetDuration(quakeIndex, 12);
Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_BLOCK_BOUND);
}
diff --git a/src/overlays/actors/ovl_Bg_Ikana_Mirror/z_bg_ikana_mirror.c b/src/overlays/actors/ovl_Bg_Ikana_Mirror/z_bg_ikana_mirror.c
index 5fc28c5a5..02ba3b1f4 100644
--- a/src/overlays/actors/ovl_Bg_Ikana_Mirror/z_bg_ikana_mirror.c
+++ b/src/overlays/actors/ovl_Bg_Ikana_Mirror/z_bg_ikana_mirror.c
@@ -380,8 +380,9 @@ void BgIkanaMirror_Draw(Actor* thisx, PlayState* play) {
BgIkanaMirror* this = THIS;
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, gStoneTowerTempleMirrorDL);
diff --git a/src/overlays/actors/ovl_Bg_Ikana_Rotaryroom/z_bg_ikana_rotaryroom.c b/src/overlays/actors/ovl_Bg_Ikana_Rotaryroom/z_bg_ikana_rotaryroom.c
index 7398dbfd9..8a90a6809 100644
--- a/src/overlays/actors/ovl_Bg_Ikana_Rotaryroom/z_bg_ikana_rotaryroom.c
+++ b/src/overlays/actors/ovl_Bg_Ikana_Rotaryroom/z_bg_ikana_rotaryroom.c
@@ -832,11 +832,11 @@ void func_80B81A80(Actor* thisx, PlayState* play) {
func_80B81B84(this);
} else if (this->unk_584 == 15) {
- s16 quakeIndex = Quake_Add(GET_ACTIVE_CAM(play), QUAKE_TYPE_3);
+ s16 quakeIndex = Quake_Request(GET_ACTIVE_CAM(play), QUAKE_TYPE_3);
Quake_SetSpeed(quakeIndex, 31536);
- Quake_SetQuakeValues(quakeIndex, 6, 0, 100, 0);
- Quake_SetCountdown(quakeIndex, 22);
+ Quake_SetPerturbations(quakeIndex, 6, 0, 100, 0);
+ Quake_SetDuration(quakeIndex, 22);
}
}
@@ -859,11 +859,11 @@ void func_80B81BA0(Actor* thisx, PlayState* play) {
thisx->shape.rot.x += 0x1F4;
if (!(this->unk_584 & 7)) {
- s16 quakeIndex = Quake_Add(GET_ACTIVE_CAM(play), QUAKE_TYPE_3);
+ s16 quakeIndex = Quake_Request(GET_ACTIVE_CAM(play), QUAKE_TYPE_3);
Quake_SetSpeed(quakeIndex, 31536);
- Quake_SetQuakeValues(quakeIndex, (s32)(Rand_ZeroOne() * 2.5f) + 3, 0, 10, 0);
- Quake_SetCountdown(quakeIndex, 15);
+ Quake_SetPerturbations(quakeIndex, (s32)(Rand_ZeroOne() * 2.5f) + 3, 0, 10, 0);
+ Quake_SetDuration(quakeIndex, 15);
}
if (Flags_GetSwitch(play, BGIKANAROTARYROOM_GET_FE(&this->dyna.actor))) {
@@ -929,11 +929,11 @@ void func_80B81DC8(Actor* thisx, PlayState* play) {
CutsceneManager_Stop(this->dyna.actor.csId);
func_80B818B4(this);
} else if (this->unk_584 == 19) {
- s16 quakeIndex = Quake_Add(GET_ACTIVE_CAM(play), QUAKE_TYPE_3);
+ s16 quakeIndex = Quake_Request(GET_ACTIVE_CAM(play), QUAKE_TYPE_3);
Quake_SetSpeed(quakeIndex, 20000);
- Quake_SetQuakeValues(quakeIndex, 5, 0, 40, 60);
- Quake_SetCountdown(quakeIndex, 17);
+ Quake_SetPerturbations(quakeIndex, 5, 0, 40, 60);
+ Quake_SetDuration(quakeIndex, 17);
}
}
diff --git a/src/overlays/actors/ovl_Bg_Ikana_Shutter/z_bg_ikana_shutter.c b/src/overlays/actors/ovl_Bg_Ikana_Shutter/z_bg_ikana_shutter.c
index f39ca3b8c..4a0abb472 100644
--- a/src/overlays/actors/ovl_Bg_Ikana_Shutter/z_bg_ikana_shutter.c
+++ b/src/overlays/actors/ovl_Bg_Ikana_Shutter/z_bg_ikana_shutter.c
@@ -151,10 +151,10 @@ void func_80BD5A18(BgIkanaShutter* this, PlayState* play) {
this->dyna.actor.velocity.y *= 0.978f;
this->dyna.actor.world.pos.y += this->dyna.actor.velocity.y;
if (this->dyna.actor.world.pos.y <= this->dyna.actor.home.pos.y) {
- quakeIndex = Quake_Add(GET_ACTIVE_CAM(play), QUAKE_TYPE_3);
+ quakeIndex = Quake_Request(GET_ACTIVE_CAM(play), QUAKE_TYPE_3);
Quake_SetSpeed(quakeIndex, 21536);
- Quake_SetQuakeValues(quakeIndex, 4, 0, 0, 0);
- Quake_SetCountdown(quakeIndex, 12);
+ Quake_SetPerturbations(quakeIndex, 4, 0, 0, 0);
+ Quake_SetDuration(quakeIndex, 12);
func_80BD5828(this);
}
diff --git a/src/overlays/actors/ovl_Bg_Iknin_Susceil/z_bg_iknin_susceil.c b/src/overlays/actors/ovl_Bg_Iknin_Susceil/z_bg_iknin_susceil.c
index 5a69e3ca7..48045527f 100644
--- a/src/overlays/actors/ovl_Bg_Iknin_Susceil/z_bg_iknin_susceil.c
+++ b/src/overlays/actors/ovl_Bg_Iknin_Susceil/z_bg_iknin_susceil.c
@@ -69,19 +69,20 @@ void func_80C0A838(BgIkninSusceil* this, PlayState* play) {
DynaPoly_DisableCollision(play, &play->colCtx.dyna, this->dyna.bgId);
}
-void func_80C0A86C(BgIkninSusceil* this, PlayState* play, s16 verticalMag, s16 countdown, s32 arg4) {
+void BgIkninSusceil_RequestQuakeAndRumble(BgIkninSusceil* this, PlayState* play, s16 quakeY, s16 quakeDuration,
+ s32 rumbleType) {
s32 pad;
- s16 quakeIndex = Quake_Add(GET_ACTIVE_CAM(play), QUAKE_TYPE_3);
+ s16 quakeIndex = Quake_Request(GET_ACTIVE_CAM(play), QUAKE_TYPE_3);
Quake_SetSpeed(quakeIndex, 31536);
- Quake_SetQuakeValues(quakeIndex, verticalMag, 0, 0, 0);
- Quake_SetCountdown(quakeIndex, countdown);
+ Quake_SetPerturbations(quakeIndex, quakeY, 0, 0, 0);
+ Quake_SetDuration(quakeIndex, quakeDuration);
- if (arg4 == 1) {
+ if (rumbleType == 1) {
Rumble_Request(SQ(100.0f), 255, 20, 150);
- } else if (arg4 == 2) {
+ } else if (rumbleType == 2) {
Rumble_Request(SQ(100.0f), 180, 20, 100);
- } else if (arg4 == 3) {
+ } else if (rumbleType == 3) {
Rumble_Request(SQ(100.0f), 120, 20, 10);
}
}
@@ -154,7 +155,7 @@ void func_80C0ABA8(BgIkninSusceil* this, PlayState* play) {
this->dyna.actor.velocity.y *= 0.93f;
this->dyna.actor.world.pos.y += this->dyna.actor.velocity.y;
if (this->dyna.actor.world.pos.y <= this->dyna.actor.home.pos.y) {
- func_80C0A86C(this, play, 4, 14, 1);
+ BgIkninSusceil_RequestQuakeAndRumble(this, play, 4, 14, 1);
Flags_UnsetSwitch(play, SUSCEIL_GET_SWITCHFLAG(&this->dyna.actor));
Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_BIGWALL_BOUND);
func_80C0AC74(this);
@@ -197,7 +198,7 @@ void func_80C0AD64(BgIkninSusceil* this, PlayState* play) {
this->dyna.actor.velocity.y *= 0.98f;
if (Math_SmoothStepToF(&this->dyna.actor.world.pos.y, this->dyna.actor.home.pos.y + 365.0f, 0.5f,
this->dyna.actor.velocity.y, 1.0f) < 0.1f) {
- func_80C0A86C(this, play, 1, 14, 3);
+ BgIkninSusceil_RequestQuakeAndRumble(this, play, 1, 14, 3);
CutsceneManager_Stop(this->dyna.actor.csId);
func_80C0AB14(this);
} else {
@@ -216,7 +217,7 @@ void func_80C0AE5C(BgIkninSusceil* this, PlayState* play) {
this->dyna.actor.velocity.y = CLAMP_MIN(this->dyna.actor.velocity.y, 1.0f);
this->dyna.actor.world.pos.y = this->dyna.actor.world.pos.y + this->dyna.actor.velocity.y;
if ((this->dyna.actor.home.pos.y + 365.0f) < this->dyna.actor.world.pos.y) {
- func_80C0A86C(this, play, 3, 14, 2);
+ BgIkninSusceil_RequestQuakeAndRumble(this, play, 3, 14, 2);
func_80C0AB14(this);
}
}
diff --git a/src/overlays/actors/ovl_Bg_Ikninside/z_bg_ikninside.c b/src/overlays/actors/ovl_Bg_Ikninside/z_bg_ikninside.c
index 36f8e94fc..07968e801 100644
--- a/src/overlays/actors/ovl_Bg_Ikninside/z_bg_ikninside.c
+++ b/src/overlays/actors/ovl_Bg_Ikninside/z_bg_ikninside.c
@@ -150,7 +150,7 @@ void BgIkninside_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPDisplayList(POLY_OPA_DISP++, object_ikninside_obj_DL_00CC78);
CLOSE_DISPS(play->state.gfxCtx);
diff --git a/src/overlays/actors/ovl_Bg_Iknv_Doukutu/z_bg_iknv_doukutu.c b/src/overlays/actors/ovl_Bg_Iknv_Doukutu/z_bg_iknv_doukutu.c
index 2c24a5580..84bdc4169 100644
--- a/src/overlays/actors/ovl_Bg_Iknv_Doukutu/z_bg_iknv_doukutu.c
+++ b/src/overlays/actors/ovl_Bg_Iknv_Doukutu/z_bg_iknv_doukutu.c
@@ -172,8 +172,8 @@ void BgIknvDoukutu_Draw(Actor* thisx, PlayState* play) {
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- func_8012C28C(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 255);
gSPDisplayList(POLY_OPA_DISP++, object_iknv_obj_DL_00DDD8);
@@ -205,9 +205,9 @@ void func_80BD7538(Actor* thisx, PlayState* play) {
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- func_8012C304(POLY_XLU_DISP++);
+ Gfx_SetupDL72(POLY_XLU_DISP++);
Scene_SetRenderModeXlu(play, 1, 2);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gDPSetEnvColor(POLY_XLU_DISP++, 0, 0, 0, (s32)(255.0f * sp54));
gSPDisplayList(POLY_XLU_DISP++, object_iknv_obj_DL_00DDD8);
@@ -226,7 +226,7 @@ void func_80BD7768(Actor* thisx, PlayState* play) {
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 255);
gSPDisplayList(POLY_OPA_DISP++, object_iknv_obj_DL_010D98);
@@ -243,7 +243,7 @@ void func_80BD7820(Actor* thisx, PlayState* play) {
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPDisplayList(POLY_XLU_DISP++, object_iknv_obj_DL_012700);
@@ -261,7 +261,7 @@ void func_80BD78C4(Actor* thisx, PlayState* play) {
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0x80, 255, 255, 255, (s32)(140.0f * sp30));
diff --git a/src/overlays/actors/ovl_Bg_Iknv_Obj/z_bg_iknv_obj.c b/src/overlays/actors/ovl_Bg_Iknv_Obj/z_bg_iknv_obj.c
index cca6b17ee..de6be9266 100644
--- a/src/overlays/actors/ovl_Bg_Iknv_Obj/z_bg_iknv_obj.c
+++ b/src/overlays/actors/ovl_Bg_Iknv_Obj/z_bg_iknv_obj.c
@@ -211,8 +211,10 @@ void BgIknvObj_Draw(Actor* thisx, PlayState* play) {
BgIknvObj* this = THIS;
OPEN_DISPS(play->state.gfxCtx);
+
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPDisplayList(POLY_OPA_DISP++, this->displayListPtr);
+
CLOSE_DISPS(play->state.gfxCtx);
}
diff --git a/src/overlays/actors/ovl_Bg_Ingate/z_bg_ingate.c b/src/overlays/actors/ovl_Bg_Ingate/z_bg_ingate.c
index ab2d6646d..2fa47169b 100644
--- a/src/overlays/actors/ovl_Bg_Ingate/z_bg_ingate.c
+++ b/src/overlays/actors/ovl_Bg_Ingate/z_bg_ingate.c
@@ -384,7 +384,7 @@ void BgIngate_Update(Actor* thisx, PlayState* play) {
void BgIngate_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, gSichitaiBoat);
diff --git a/src/overlays/actors/ovl_Bg_Keikoku_Saku/z_bg_keikoku_saku.c b/src/overlays/actors/ovl_Bg_Keikoku_Saku/z_bg_keikoku_saku.c
index 282a43925..ff0227f70 100644
--- a/src/overlays/actors/ovl_Bg_Keikoku_Saku/z_bg_keikoku_saku.c
+++ b/src/overlays/actors/ovl_Bg_Keikoku_Saku/z_bg_keikoku_saku.c
@@ -94,7 +94,7 @@ void BgKeikokuSaku_Update(Actor* thisx, PlayState* play) {
void BgKeikokuSaku_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_XLU_DISP++, object_keikoku_obj_DL_001640);
diff --git a/src/overlays/actors/ovl_Bg_Ladder/z_bg_ladder.c b/src/overlays/actors/ovl_Bg_Ladder/z_bg_ladder.c
index 208babf77..63e7b5974 100644
--- a/src/overlays/actors/ovl_Bg_Ladder/z_bg_ladder.c
+++ b/src/overlays/actors/ovl_Bg_Ladder/z_bg_ladder.c
@@ -143,7 +143,7 @@ void BgLadder_Draw(Actor* thisx, PlayState* play) {
gfx = POLY_XLU_DISP;
}
- gSPDisplayList(&gfx[0], &sSetupDL[6 * 0x19]);
+ gSPDisplayList(&gfx[0], gSetupDLs[SETUPDL_25]);
gDPSetEnvColor(&gfx[1], 255, 255, 255, this->alpha);
gSPMatrix(&gfx[2], Matrix_NewMtx(play->state.gfxCtx), G_MTX_LOAD);
gSPDisplayList(&gfx[3], sLadderDLists[this->dyna.actor.params]);
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 3a11a2fdf..2e924efd3 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
@@ -383,7 +383,7 @@ void BgNumaHana_Draw(Actor* thisx, PlayState* play2) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, gWoodenFlowerStalkDL);
diff --git a/src/overlays/actors/ovl_Bg_Open_Shutter/z_bg_open_shutter.c b/src/overlays/actors/ovl_Bg_Open_Shutter/z_bg_open_shutter.c
index 6acbc8aa8..119c3854a 100644
--- a/src/overlays/actors/ovl_Bg_Open_Shutter/z_bg_open_shutter.c
+++ b/src/overlays/actors/ovl_Bg_Open_Shutter/z_bg_open_shutter.c
@@ -68,10 +68,10 @@ s8 func_80ACABA8(BgOpenShutter* this, PlayState* play) {
f32 temp_fv0;
s16 temp_v0;
- if (!Player_InCsMode(play) && (this->dyna.actor.xzDistToPlayer < 100.0f)) {
- temp_fv0 = func_80ACAB10(play, &this->dyna.actor, 0.0f, 65.0f, 15.0f);
+ if (!Player_InCsMode(play) && (this->slidingDoor.dyna.actor.xzDistToPlayer < 100.0f)) {
+ temp_fv0 = func_80ACAB10(play, &this->slidingDoor.dyna.actor, 0.0f, 65.0f, 15.0f);
if (fabsf(temp_fv0) < 50.0f) {
- temp_v0 = player->actor.shape.rot.y - this->dyna.actor.shape.rot.y;
+ temp_v0 = player->actor.shape.rot.y - this->slidingDoor.dyna.actor.shape.rot.y;
if (temp_fv0 > 0.0f) {
temp_v0 = (0x8000 - temp_v0);
}
@@ -91,31 +91,32 @@ s8 func_80ACABA8(BgOpenShutter* this, PlayState* play) {
void BgOpenShutter_Init(Actor* thisx, PlayState* play) {
BgOpenShutter* this = THIS;
- Actor_ProcessInitChain(&this->dyna.actor, sInitChain);
- DynaPolyActor_Init(&this->dyna, DYNA_TRANSFORM_POS);
- DynaPolyActor_LoadMesh(play, &this->dyna, &object_open_obj_Colheader_001640);
+ Actor_ProcessInitChain(&this->slidingDoor.dyna.actor, sInitChain);
+ DynaPolyActor_Init(&this->slidingDoor.dyna, DYNA_TRANSFORM_POS);
+ DynaPolyActor_LoadMesh(play, &this->slidingDoor.dyna, &object_open_obj_Colheader_001640);
this->actionFunc = func_80ACAD88;
}
void BgOpenShutter_Destroy(Actor* thisx, PlayState* play) {
BgOpenShutter* this = THIS;
- s32 params = BGOPENSHUTTER_GET_A(thisx);
+ s32 transition = DOOR_GET_TRANSITION_ID(thisx);
- play->doorCtx.transitionActorList[params].id = -play->doorCtx.transitionActorList[params].id;
- DynaPoly_DeleteBgActor(play, &play->colCtx.dyna, this->dyna.bgId);
+ play->doorCtx.transitionActorList[transition].id = -play->doorCtx.transitionActorList[transition].id;
+ DynaPoly_DeleteBgActor(play, &play->colCtx.dyna, this->slidingDoor.dyna.bgId);
}
void func_80ACAD88(BgOpenShutter* this, PlayState* play) {
s32 doorDirection;
- if (this->unk_15C != 0) {
+ if (this->slidingDoor.unk_15C != 0) {
Player* player = GET_PLAYER(play);
- Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_SLIDE_DOOR_OPEN);
- Camera_ChangeDoorCam(play->cameraPtrs[CAM_ID_MAIN], &this->dyna.actor, player->unk_3BA, 0.0f, 12, 15, 10);
+ Actor_PlaySfx(&this->slidingDoor.dyna.actor, NA_SE_EV_SLIDE_DOOR_OPEN);
+ Camera_ChangeDoorCam(play->cameraPtrs[CAM_ID_MAIN], &this->slidingDoor.dyna.actor, player->doorBgCamIndex, 0.0f,
+ 12, 15, 10);
this->unk_164 = 0;
this->actionFunc = func_80ACAE5C;
- this->dyna.actor.velocity.y = 0.0f;
+ this->slidingDoor.dyna.actor.velocity.y = 0.0f;
} else {
Player* player = GET_PLAYER(play);
@@ -123,20 +124,20 @@ void func_80ACAD88(BgOpenShutter* this, PlayState* play) {
if (doorDirection > 0) {
player->doorType = PLAYER_DOORTYPE_SLIDING;
player->doorDirection = doorDirection;
- player->doorActor = &this->dyna.actor;
+ player->doorActor = &this->slidingDoor.dyna.actor;
func_80122F28(player);
}
}
}
void func_80ACAE5C(BgOpenShutter* this, PlayState* play) {
- Math_StepToF(&this->dyna.actor.velocity.y, 15.0f, 3.0f);
- if (Math_StepToF(&this->dyna.actor.world.pos.y, this->dyna.actor.home.pos.y + 120.0f,
- this->dyna.actor.velocity.y)) {
+ Math_StepToF(&this->slidingDoor.dyna.actor.velocity.y, 15.0f, 3.0f);
+ if (Math_StepToF(&this->slidingDoor.dyna.actor.world.pos.y, this->slidingDoor.dyna.actor.home.pos.y + 120.0f,
+ this->slidingDoor.dyna.actor.velocity.y)) {
this->unk_164++;
}
if (this->unk_164 >= 10) {
- Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_SLIDE_DOOR_CLOSE);
+ Actor_PlaySfx(&this->slidingDoor.dyna.actor, NA_SE_EV_SLIDE_DOOR_CLOSE);
this->actionFunc = func_80ACAEF0;
}
}
@@ -145,20 +146,22 @@ void func_80ACAEF0(BgOpenShutter* this, PlayState* play) {
s32 pad;
s16 quakeIndex;
- Math_StepToF(&this->dyna.actor.velocity.y, 20.0f, 8.0f);
- if (Math_StepToF(&this->dyna.actor.world.pos.y, this->dyna.actor.home.pos.y, this->dyna.actor.velocity.y)) {
- this->dyna.actor.floorHeight = this->dyna.actor.home.pos.y;
- Actor_SpawnFloorDustRing(play, &this->dyna.actor, &this->dyna.actor.world.pos, 60.0f, 10, 8.0f, 500, 10, true);
- Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_BIGWALL_BOUND);
+ Math_StepToF(&this->slidingDoor.dyna.actor.velocity.y, 20.0f, 8.0f);
+ if (Math_StepToF(&this->slidingDoor.dyna.actor.world.pos.y, this->slidingDoor.dyna.actor.home.pos.y,
+ this->slidingDoor.dyna.actor.velocity.y)) {
+ this->slidingDoor.dyna.actor.floorHeight = this->slidingDoor.dyna.actor.home.pos.y;
+ Actor_SpawnFloorDustRing(play, &this->slidingDoor.dyna.actor, &this->slidingDoor.dyna.actor.world.pos, 60.0f,
+ 10, 8.0f, 500, 10, true);
+ Actor_PlaySfx(&this->slidingDoor.dyna.actor, NA_SE_EV_BIGWALL_BOUND);
- quakeIndex = Quake_Add(Play_GetCamera(play, CAM_ID_MAIN), QUAKE_TYPE_3);
+ quakeIndex = Quake_Request(Play_GetCamera(play, CAM_ID_MAIN), QUAKE_TYPE_3);
Quake_SetSpeed(quakeIndex, -32536);
- Quake_SetQuakeValues(quakeIndex, 2, 0, 0, 0);
- Quake_SetCountdown(quakeIndex, 10);
+ Quake_SetPerturbations(quakeIndex, 2, 0, 0, 0);
+ Quake_SetDuration(quakeIndex, 10);
- Rumble_Request(this->dyna.actor.xyzDistToPlayerSq, 180, 20, 100);
+ Rumble_Request(this->slidingDoor.dyna.actor.xyzDistToPlayerSq, 180, 20, 100);
- this->unk_15C = 0;
+ this->slidingDoor.unk_15C = 0;
this->actionFunc = func_80ACAD88;
}
}
@@ -172,14 +175,14 @@ void BgOpenShutter_Update(Actor* thisx, PlayState* play2) {
cueChannel = Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_124);
if (play->csCtx.actorCues[cueChannel]->id == BGOPENSHUTTER_DOOR_OPEN) {
if (this->actionFunc == func_80ACAD88) {
- Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_SLIDE_DOOR_OPEN);
+ Actor_PlaySfx(&this->slidingDoor.dyna.actor, NA_SE_EV_SLIDE_DOOR_OPEN);
this->actionFunc = func_80ACAE5C;
- this->dyna.actor.velocity.y = 0.0f;
+ this->slidingDoor.dyna.actor.velocity.y = 0.0f;
}
this->unk_164 = 0;
} else if (play->csCtx.actorCues[cueChannel]->id == BGOPENSHUTTER_DOOR_CLOSED) {
if (this->actionFunc == func_80ACAE5C) {
- Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_SLIDE_DOOR_CLOSE);
+ Actor_PlaySfx(&this->slidingDoor.dyna.actor, NA_SE_EV_SLIDE_DOOR_CLOSE);
this->actionFunc = func_80ACAEF0;
}
}
diff --git a/src/overlays/actors/ovl_Bg_Open_Shutter/z_bg_open_shutter.h b/src/overlays/actors/ovl_Bg_Open_Shutter/z_bg_open_shutter.h
index f6c6067d4..c035606b1 100644
--- a/src/overlays/actors/ovl_Bg_Open_Shutter/z_bg_open_shutter.h
+++ b/src/overlays/actors/ovl_Bg_Open_Shutter/z_bg_open_shutter.h
@@ -2,16 +2,14 @@
#define Z_BG_OPEN_SHUTTER_H
#include "global.h"
-
-#define BGOPENSHUTTER_GET_A(thisx) ((u16)((thisx)->params) >> 0xA)
+#include "z64door.h"
struct BgOpenShutter;
typedef void (*BgOpenShutterActionFunc)(struct BgOpenShutter*, PlayState*);
typedef struct BgOpenShutter {
- /* 0x000 */ DynaPolyActor dyna;
- /* 0x15C */ s16 unk_15C;
+ /* 0x000 */ SlidingDoorActor slidingDoor;
/* 0x160 */ BgOpenShutterActionFunc actionFunc;
/* 0x164 */ s32 unk_164;
} BgOpenShutter; // size = 0x168
diff --git a/src/overlays/actors/ovl_Bg_Open_Spot/z_bg_open_spot.c b/src/overlays/actors/ovl_Bg_Open_Spot/z_bg_open_spot.c
index 275b1b565..ffb260bf3 100644
--- a/src/overlays/actors/ovl_Bg_Open_Spot/z_bg_open_spot.c
+++ b/src/overlays/actors/ovl_Bg_Open_Spot/z_bg_open_spot.c
@@ -66,7 +66,7 @@ void BgOpenSpot_Draw(Actor* thisx, PlayState* play) {
AnimatedMat_Draw(play, this->texScrolls);
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_MODELVIEW | G_MTX_LOAD);
gDPSetColorDither(POLY_XLU_DISP++, G_CD_BAYER);
gSPDisplayList(POLY_XLU_DISP++, gSpotlightLeftDL);
diff --git a/src/overlays/actors/ovl_Bg_Spdweb/z_bg_spdweb.c b/src/overlays/actors/ovl_Bg_Spdweb/z_bg_spdweb.c
index 0ebae5c1e..fa80cbf90 100644
--- a/src/overlays/actors/ovl_Bg_Spdweb/z_bg_spdweb.c
+++ b/src/overlays/actors/ovl_Bg_Spdweb/z_bg_spdweb.c
@@ -496,7 +496,7 @@ void BgSpdweb_Draw(Actor* thisx, PlayState* play) {
gfx = POLY_XLU_DISP;
- gSPDisplayList(&gfx[0], &sSetupDL[6 * 25]);
+ gSPDisplayList(&gfx[0], gSetupDLs[SETUPDL_25]);
if (thisx->params == BGSPDWEB_FF_1) {
gSPMatrix(&gfx[1], Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
diff --git a/src/overlays/actors/ovl_Bg_Spout_Fire/z_bg_spout_fire.c b/src/overlays/actors/ovl_Bg_Spout_Fire/z_bg_spout_fire.c
index fdf56d87c..9349b8188 100644
--- a/src/overlays/actors/ovl_Bg_Spout_Fire/z_bg_spout_fire.c
+++ b/src/overlays/actors/ovl_Bg_Spout_Fire/z_bg_spout_fire.c
@@ -189,7 +189,7 @@ void BgSpoutFire_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- gfx = Gfx_CallSetupDL(POLY_XLU_DISP, 0x14);
+ gfx = Gfx_SetupDL(POLY_XLU_DISP, SETUPDL_20);
POLY_XLU_DISP = gfx;
gSPSegment(&gfx[0], 0x08, sFlameTextures[this->flameTexIndex]);
gDPSetPrimColor(&gfx[1], 0, 1, 255, 255, 0, 150);
diff --git a/src/overlays/actors/ovl_Bg_Tobira01/z_bg_tobira01.c b/src/overlays/actors/ovl_Bg_Tobira01/z_bg_tobira01.c
index 17722bda2..920842b0b 100644
--- a/src/overlays/actors/ovl_Bg_Tobira01/z_bg_tobira01.c
+++ b/src/overlays/actors/ovl_Bg_Tobira01/z_bg_tobira01.c
@@ -16,7 +16,6 @@ void BgTobira01_Destroy(Actor* thisx, PlayState* play);
void BgTobira01_Update(Actor* thisx, PlayState* play);
void BgTobira01_Draw(Actor* thisx, PlayState* play);
-/*
const ActorInit Bg_Tobira01_InitVars = {
ACTOR_BG_TOBIRA01,
ACTORCAT_PROP,
@@ -28,14 +27,80 @@ const ActorInit Bg_Tobira01_InitVars = {
(ActorFunc)BgTobira01_Update,
(ActorFunc)BgTobira01_Draw,
};
-*/
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Tobira01/func_80B12430.s")
+void BgTobira01_Action(BgTobira01* this, PlayState* play) {
+ Player* player = GET_PLAYER(play);
+ s16 csId = this->dyna.actor.csId;
+ s16 prevPosYTick;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Tobira01/BgTobira01_Init.s")
+ if (this->cutsceneRequested) {
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
+ } else if (CutsceneManager_IsNext(csId)) {
+ CutsceneManager_StartWithPlayerCs(csId, &this->dyna.actor);
+ SET_WEEKEVENTREG(WEEKEVENTREG_88_40);
+ this->cutsceneRequested = false;
+ } else {
+ CutsceneManager_Queue(csId);
+ }
+ } else if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_88_40) && (this->posYTick == 0) &&
+ (play->actorCtx.playerImpact.timer != 0) &&
+ (play->actorCtx.playerImpact.type == PLAYER_IMPACT_GORON_GROUND_POUND) &&
+ (SurfaceType_GetSceneExitIndex(&play->colCtx, player->actor.floorPoly, player->actor.floorBgId) == 6)) {
+ this->cutsceneRequested = true;
+ this->unk16C = 0;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Tobira01/BgTobira01_Destroy.s")
+ prevPosYTick = this->posYTick;
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_88_40)) {
+ this->posYTick++;
+ } else {
+ this->posYTick--;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Tobira01/BgTobira01_Update.s")
+ this->posYTick = CLAMP(this->posYTick, 0, 60);
+ if (prevPosYTick != this->posYTick) {
+ Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_STONEDOOR_OPEN_S - SFX_FLAG);
+ this->dyna.actor.world.pos.y = this->posY = (this->posYTick * (5.0f / 3.0f)) + this->dyna.actor.home.pos.y;
+ this->timer = 180;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Tobira01/BgTobira01_Draw.s")
+ if (!(player->stateFlags1 & PLAYER_STATE1_40) && CHECK_WEEKEVENTREG(WEEKEVENTREG_88_40) &&
+ (DECR(this->timer) == 0)) {
+ CLEAR_WEEKEVENTREG(WEEKEVENTREG_88_40);
+ }
+}
+
+void BgTobira01_Init(Actor* thisx, PlayState* play) {
+ BgTobira01* this = THIS;
+
+ DynaPolyActor_Init(&this->dyna, DYNA_TRANSFORM_POS);
+ DynaPolyActor_LoadMesh(play, &this->dyna, &gGoronDoorCol);
+ CLEAR_WEEKEVENTREG(WEEKEVENTREG_88_40);
+ Actor_SetScale(&this->dyna.actor, 1.0f);
+ this->timer = gSaveContext.save.isNight;
+ this->posYTick = 0;
+ this->actionFunc = BgTobira01_Action;
+}
+
+void BgTobira01_Destroy(Actor* thisx, PlayState* play) {
+ BgTobira01* this = THIS;
+
+ DynaPoly_DeleteBgActor(play, &play->colCtx.dyna, this->dyna.bgId);
+}
+
+void BgTobira01_Update(Actor* thisx, PlayState* play) {
+ BgTobira01* this = THIS;
+
+ this->actionFunc(this, play);
+}
+
+void BgTobira01_Draw(Actor* thisx, PlayState* play) {
+ OPEN_DISPS(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, gGoronDoorDL);
+
+ CLOSE_DISPS(play->state.gfxCtx);
+}
diff --git a/src/overlays/actors/ovl_Bg_Tobira01/z_bg_tobira01.h b/src/overlays/actors/ovl_Bg_Tobira01/z_bg_tobira01.h
index 9ddd0233d..b53c2302e 100644
--- a/src/overlays/actors/ovl_Bg_Tobira01/z_bg_tobira01.h
+++ b/src/overlays/actors/ovl_Bg_Tobira01/z_bg_tobira01.h
@@ -5,9 +5,16 @@
struct BgTobira01;
+typedef void (*BgTobira01ActionFunc)(struct BgTobira01*, PlayState*);
+
typedef struct BgTobira01 {
- /* 0x000 */ Actor actor;
- /* 0x144 */ char unk_144[0x2C];
+ /* 0x000 */ DynaPolyActor dyna;
+ /* 0x15C */ BgTobira01ActionFunc actionFunc;
+ /* 0x160 */ s16 posYTick;
+ /* 0x162 */ s16 timer;
+ /* 0x164 */ f32 posY;
+ /* 0x168 */ s32 cutsceneRequested;
+ /* 0x16C */ s32 unk16C;
} BgTobira01; // size = 0x170
#endif // Z_BG_TOBIRA01_H
diff --git a/src/overlays/actors/ovl_Boss_02/z_boss_02.c b/src/overlays/actors/ovl_Boss_02/z_boss_02.c
index eae9fe0b3..7220b5d06 100644
--- a/src/overlays/actors/ovl_Boss_02/z_boss_02.c
+++ b/src/overlays/actors/ovl_Boss_02/z_boss_02.c
@@ -553,7 +553,7 @@ void Boss02_Init(Actor* thisx, PlayState* play) {
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_STONE_TOWER_TEMPLE) && (this->actor.params == TWINMOLD_RED)) {
sBlueWarp = (DoorWarp1*)Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, ACTOR_DOOR_WARP1, 0.0f, 60.0f,
0.0f, 0, 0, 0, 1);
- Actor_Spawn(&play->actorCtx, play, ACTOR_ITEM_B_HEART, 0.0f, 30.0f, -150.0f, 0, 1, 0, 0);
+ Actor_Spawn(&play->actorCtx, play, ACTOR_ITEM_B_HEART, 0.0f, 30.0f, -150.0f, 0, 1, 0, BHEART_PARAM_NORMAL);
}
this->actor.targetMode = 10;
@@ -1349,7 +1349,7 @@ void Boss02_Twinmold_Draw(Actor* thisx, PlayState* play2) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
if (this->actor.params == 0) {
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(gTwinmoldRedSkinTex));
@@ -1521,8 +1521,8 @@ void Boss02_DrawEffects(PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
for (i = 0; i < ARRAY_COUNT(sEffects); i++, effect++) {
if (effect->type == TWINMOLD_EFFECT_SAND) {
@@ -1971,7 +1971,7 @@ void func_809DD934(Boss02* this, PlayState* play) {
temp_a0_5->scale.z *= phi_f0_2;
if (temp_a0_5->id == ACTOR_ITEM_B_HEART) {
- ((ItemBHeart*)temp_a0_5)->unk_168 *= phi_f0_2;
+ ((ItemBHeart*)temp_a0_5)->baseScale *= phi_f0_2;
}
}
temp_a0_5 = temp_a0_5->next;
@@ -2210,10 +2210,12 @@ void func_809DEAC4(Boss02* this, PlayState* play) {
this->unk_1D7E = 0;
if (!sIsInGiantMode) {
- Actor_Spawn(&play->actorCtx, play, ACTOR_ITEM_B_HEART, 0.0f, 30.0f, -150.0f, 0, 1, 0, 0);
+ Actor_Spawn(&play->actorCtx, play, ACTOR_ITEM_B_HEART, 0.0f, 30.0f, -150.0f, 0, 1, 0,
+ BHEART_PARAM_NORMAL);
phi_f0 = 60.0f;
} else {
- Actor_Spawn(&play->actorCtx, play, ACTOR_ITEM_B_HEART, 0.0f, 3153.0f, -15.0f, 0, 1, 0, 35);
+ Actor_Spawn(&play->actorCtx, play, ACTOR_ITEM_B_HEART, 0.0f, 3153.0f, -15.0f, 0, 1, 0,
+ BHEART_PARAM_SMALL);
phi_f0 = 3155.0f;
}
sBlueWarp = (DoorWarp1*)Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, ACTOR_DOOR_WARP1,
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 c4c38982e..ddd9d4830 100644
--- a/src/overlays/actors/ovl_Boss_03/z_boss_03.c
+++ b/src/overlays/actors/ovl_Boss_03/z_boss_03.c
@@ -51,6 +51,7 @@
#include "z_boss_03.h"
#include "overlays/actors/ovl_Door_Warp1/z_door_warp1.h"
#include "overlays/actors/ovl_En_Water_Effect/z_en_water_effect.h"
+#include "overlays/actors/ovl_Item_B_Heart/z_item_b_heart.h"
#include "objects/gameplay_keep/gameplay_keep.h"
#include "objects/object_water_effect/object_water_effect.h"
@@ -451,7 +452,8 @@ void Boss03_Init(Actor* thisx, PlayState* play2) {
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_GREAT_BAY_TEMPLE)) {
Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, ACTOR_DOOR_WARP1, 0.0f, PLATFORM_HEIGHT, 200.0f, 0, 0,
0, ENDOORWARP1_FF_1);
- Actor_Spawn(&play->actorCtx, play, ACTOR_ITEM_B_HEART, 0.0f, PLATFORM_HEIGHT, 0.0f, 0, 0, 0, 0);
+ Actor_Spawn(&play->actorCtx, play, ACTOR_ITEM_B_HEART, 0.0f, PLATFORM_HEIGHT, 0.0f, 0, 0, 0,
+ BHEART_PARAM_NORMAL);
Actor_Kill(&this->actor);
return;
}
@@ -1050,7 +1052,7 @@ void Boss03_Charge(Boss03* this, PlayState* play) {
// Attack platform
if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
play_sound(NA_SE_IT_BIG_BOMB_EXPLOSION);
- func_800BC848(&this->actor, play, 20, 15);
+ Actor_RequestQuakeAndRumble(&this->actor, play, 20, 15);
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_WATER_EFFECT, 0.0f, this->waterHeight, 0.0f, 0, 0, 0x96,
ENWATEREFFECT_TYPE_GYORG_SHOCKWAVE);
@@ -1610,7 +1612,7 @@ void Boss03_DeathCutscene(Boss03* this, PlayState* play) {
Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, ACTOR_DOOR_WARP1, 0.0f, PLATFORM_HEIGHT, 200.0f,
0, 0, 0, ENDOORWARP1_FF_1);
Actor_Spawn(&play->actorCtx, play, ACTOR_ITEM_B_HEART, this->actor.focus.pos.x, PLATFORM_HEIGHT,
- this->actor.focus.pos.z, 0, 0, 0, 0);
+ this->actor.focus.pos.z, 0, 0, 0, BHEART_PARAM_NORMAL);
this->csTimer = 0;
Actor_SetScale(&this->actor, 0.0f);
AudioSfx_StopByPos(&this->actor.projectedPos);
@@ -1773,7 +1775,7 @@ void Boss03_Stunned(Boss03* this, PlayState* play) {
Actor_MoveWithGravity(&this->actor);
if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND_TOUCH) {
play_sound(NA_SE_IT_WALL_HIT_HARD);
- func_800BC848(&this->actor, play, 10, 10);
+ Actor_RequestQuakeAndRumble(&this->actor, play, 10, 10);
}
} else {
Math_ApproachS(&this->actor.shape.rot.z, -0x6000, 0xA, 0x900);
@@ -1842,16 +1844,16 @@ void Boss03_UpdateCollision(Boss03* this, PlayState* play) {
for (i = 0; i < ARRAY_COUNT(sHeadJntSphElementsInit); i++) {
if (this->headCollider.elements[i].info.toucherFlags & TOUCH_HIT) {
this->headCollider.elements[i].info.toucherFlags &= ~TOUCH_HIT;
- player->unk_B84 = this->actor.shape.rot.y;
- player->unk_B80 = 20.0f;
+ player->pushedYaw = this->actor.shape.rot.y;
+ player->pushedSpeed = 20.0f;
}
}
for (i = 0; i < ARRAY_COUNT(sBodyJntSphElementsInit); i++) {
if (this->bodyCollider.elements[i].info.toucherFlags & TOUCH_HIT) {
this->bodyCollider.elements[i].info.toucherFlags &= ~TOUCH_HIT;
- player->unk_B84 = this->actor.shape.rot.y;
- player->unk_B80 = 20.0f;
+ player->pushedYaw = this->actor.shape.rot.y;
+ player->pushedSpeed = 20.0f;
}
}
}
@@ -2263,7 +2265,7 @@ void Boss03_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
if (!this->unk_2D5) {
if ((this->unk_25E % 2) != 0) {
@@ -2394,8 +2396,8 @@ void Boss03_DrawEffects(PlayState* play) {
OPEN_DISPS(gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
- func_8012C28C(gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(gfxCtx);
for (i = 0; i < GYORG_EFFECT_COUNT; i++, eff++) {
if (eff->type == GYORG_EFFECT_BUBBLE) {
@@ -2426,7 +2428,7 @@ void Boss03_DrawEffects(PlayState* play) {
if ((eff->type == GYORG_EFFECT_DROPLET) || (eff->type == GYORG_EFFECT_SPLASH)) {
if (!flag) {
- POLY_XLU_DISP = Gfx_CallSetupDL(POLY_XLU_DISP, 0);
+ POLY_XLU_DISP = Gfx_SetupDL(POLY_XLU_DISP, SETUPDL_0);
gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(gEffDust1Tex));
gSPDisplayList(POLY_XLU_DISP++, object_water_effect_DL_004260);
@@ -2460,7 +2462,7 @@ void Boss03_DrawEffects(PlayState* play) {
for (i = 0; i < GYORG_EFFECT_COUNT; i++, eff++) {
if (eff->type == GYORG_EFFECT_WET_SPOT) {
if (!flag) {
- func_8012C448(gfxCtx);
+ Gfx_SetupDL44_Xlu(gfxCtx);
gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(gEffDust1Tex));
gDPSetEnvColor(POLY_XLU_DISP++, 250, 250, 255, 0);
@@ -2597,7 +2599,7 @@ void Boss03_SeaweedDraw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x0D, mtx);
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 a39b10143..bf250ca18 100644
--- a/src/overlays/actors/ovl_Boss_04/z_boss_04.c
+++ b/src/overlays/actors/ovl_Boss_04/z_boss_04.c
@@ -481,7 +481,7 @@ void func_809ECF58(Boss04* this, PlayState* play) {
if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
play_sound(NA_SE_IT_BIG_BOMB_EXPLOSION);
- func_800BC848(&this->actor, play, 15, 10);
+ Actor_RequestQuakeAndRumble(&this->actor, play, 15, 10);
this->unk_6F4 = 15;
sp3C.x = this->actor.focus.pos.x;
sp3C.y = this->actor.focus.pos.y;
@@ -818,7 +818,7 @@ void Boss04_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
if (this->unk_200 & 1) {
POLY_OPA_DISP = Gfx_SetFog(POLY_OPA_DISP, 255, 0, 0, 255, 900, 1099);
@@ -832,7 +832,7 @@ void Boss04_Draw(Actor* thisx, PlayState* play) {
POLY_OPA_DISP = Play_SetFog(play, POLY_OPA_DISP);
if (this->actionFunc != func_809EC568) {
- func_8012C448(play->state.gfxCtx);
+ Gfx_SetupDL44_Xlu(play->state.gfxCtx);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 0, 0, 0, 150);
gSPDisplayList(POLY_XLU_DISP++, gWartShadowMaterialDL);
diff --git a/src/overlays/actors/ovl_Boss_06/z_boss_06.c b/src/overlays/actors/ovl_Boss_06/z_boss_06.c
index 3d8beb79d..aa6291aae 100644
--- a/src/overlays/actors/ovl_Boss_06/z_boss_06.c
+++ b/src/overlays/actors/ovl_Boss_06/z_boss_06.c
@@ -516,8 +516,8 @@ void Boss06_Draw(Actor* thisx, PlayState* play2) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
temp_v0 = gSaveContext.save.time;
if (temp_v0 > CLOCK_TIME(12, 0)) {
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 cb34f8ff8..cba240947 100644
--- a/src/overlays/actors/ovl_Demo_Effect/z_demo_effect.c
+++ b/src/overlays/actors/ovl_Demo_Effect/z_demo_effect.c
@@ -258,7 +258,7 @@ s32 func_808CDE78(PlayState* play, SkelCurve* skelCurve, s32 limbIndex, Actor* t
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0x80, 170, 255, 255, 255);
gDPSetEnvColor(POLY_XLU_DISP++, this->envXluColor[0], this->envXluColor[1], this->envXluColor[2], 255);
@@ -284,7 +284,7 @@ void func_808CDFF8(Actor* thisx, PlayState* play) {
OPEN_DISPS(gfxCtx);
- POLY_XLU_DISP = Gfx_CallSetupDL(POLY_XLU_DISP, 25);
+ 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);
@@ -299,7 +299,7 @@ void func_808CE078(Actor* thisx, PlayState* play2) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gDPSetPrimColor(POLY_XLU_DISP++, 0x80, 0x80, 255, 255, 255, 255);
gDPSetEnvColor(POLY_XLU_DISP++, this->envXluColor[0], this->envXluColor[1], this->envXluColor[2], 255);
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 629f49398..1ee2b1c9d 100644
--- a/src/overlays/actors/ovl_Demo_Kankyo/z_demo_kankyo.c
+++ b/src/overlays/actors/ovl_Demo_Kankyo/z_demo_kankyo.c
@@ -506,7 +506,7 @@ void DemoKakyo_DrawLostWoodsSparkle(Actor* thisx, PlayState* play2) {
if (!(play->cameraPtrs[CAM_ID_MAIN]->stateFlags & CAM_STATE_UNDERWATER)) {
OPEN_DISPS(play->state.gfxCtx);
- POLY_XLU_DISP = Gfx_CallSetupDL(POLY_XLU_DISP, 20);
+ POLY_XLU_DISP = Gfx_SetupDL(POLY_XLU_DISP, SETUPDL_20);
gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(gSun1Tex));
gSPDisplayList(POLY_XLU_DISP++, gSunSparkleMaterialDL);
@@ -598,7 +598,8 @@ void DemoKankyo_DrawMoonAndGiant(Actor* thisx, PlayState* play2) {
GraphicsContext* gfxCtx = play->state.gfxCtx;
OPEN_DISPS(gfxCtx);
- func_8012C2DC(gfxCtx);
+
+ Gfx_SetupDL25_Xlu(gfxCtx);
for (i = 0; i < play->envCtx.unk_F2[3]; i++) {
worldPos.x = this->effects[i].posBase.x + this->effects[i].posOffset.x;
diff --git a/src/overlays/actors/ovl_Demo_Syoten/z_demo_syoten.c b/src/overlays/actors/ovl_Demo_Syoten/z_demo_syoten.c
index 111ce284f..2d0aa27cd 100644
--- a/src/overlays/actors/ovl_Demo_Syoten/z_demo_syoten.c
+++ b/src/overlays/actors/ovl_Demo_Syoten/z_demo_syoten.c
@@ -487,7 +487,7 @@ void func_80C173B4(Actor* thisx, PlayState* play) {
mtx = GRAPH_ALLOC(play->state.gfxCtx, this->unk_144.unk_18->unk_1 * sizeof(Mtx));
if (mtx != NULL) {
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
Matrix_Mult(&play->billboardMtxF, MTXMODE_APPLY);
func_8018450C(play, &this->unk_144, mtx, (void*)func_80C170F8, 0, &this->actor);
}
@@ -514,7 +514,7 @@ void DemoSyoten_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
if (this->unk_3E4 & 4) {
Matrix_RotateZS(-this->actor.shape.rot.z, MTXMODE_APPLY);
@@ -553,7 +553,7 @@ void func_80C17690(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
Matrix_RotateYS(BINANG_ROT180(Camera_GetCamDirYaw(GET_ACTIVE_CAM(play))), MTXMODE_APPLY);
if (this->unk_3E4 & 8) {
diff --git a/src/overlays/actors/ovl_Demo_Tre_Lgt/z_demo_tre_lgt.c b/src/overlays/actors/ovl_Demo_Tre_Lgt/z_demo_tre_lgt.c
index b2b8e0077..56bc60a4d 100644
--- a/src/overlays/actors/ovl_Demo_Tre_Lgt/z_demo_tre_lgt.c
+++ b/src/overlays/actors/ovl_Demo_Tre_Lgt/z_demo_tre_lgt.c
@@ -168,10 +168,12 @@ void DemoTreLgt_Draw(Actor* thisx, PlayState* play) {
DemoTreLgt* this = THIS;
OPEN_DISPS(gfxCtx);
+
if (this->action == DEMO_TRE_LGT_ACTION_ANIMATE) {
- func_8012C2DC(gfxCtx);
+ Gfx_SetupDL25_Xlu(gfxCtx);
gDPSetEnvColor(POLY_XLU_DISP++, 200, 255, 0, 0);
SkelCurve_Draw(&this->actor, play, &this->skelCurve, DemoTreLgt_OverrideLimbDraw, NULL, 1, &this->actor);
}
+
CLOSE_DISPS(gfxCtx);
}
diff --git a/src/overlays/actors/ovl_Dm_Ah/z_dm_ah.c b/src/overlays/actors/ovl_Dm_Ah/z_dm_ah.c
index 12815a044..721d1de60 100644
--- a/src/overlays/actors/ovl_Dm_Ah/z_dm_ah.c
+++ b/src/overlays/actors/ovl_Dm_Ah/z_dm_ah.c
@@ -245,7 +245,7 @@ void DmAh_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(D_80C1DE28[this->unk_284]));
gSPSegment(POLY_OPA_DISP++, 0x09, Lib_SegmentedToVirtual(D_80C1DE20[0]));
diff --git a/src/overlays/actors/ovl_Dm_Al/z_dm_al.c b/src/overlays/actors/ovl_Dm_Al/z_dm_al.c
index 43ca006f2..a7e3e4993 100644
--- a/src/overlays/actors/ovl_Dm_Al/z_dm_al.c
+++ b/src/overlays/actors/ovl_Dm_Al/z_dm_al.c
@@ -152,7 +152,7 @@ void DmAl_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawTransformFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable,
this->skelAnime.dListCount, DmAl_OverrideLimbDraw, DmAl_PostLimbDraw,
DmAl_TransformLimbDraw, &this->actor);
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 2d474d111..2d8175bda 100644
--- a/src/overlays/actors/ovl_Dm_An/z_dm_an.c
+++ b/src/overlays/actors/ovl_Dm_An/z_dm_an.c
@@ -356,7 +356,7 @@ void func_80C1D0B0(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(D_80C1D2F4[this->unk_2B8]));
gSPSegment(POLY_OPA_DISP++, 0x09, Lib_SegmentedToVirtual(D_80C1D2E8[0]));
diff --git a/src/overlays/actors/ovl_Dm_Bal/z_dm_bal.c b/src/overlays/actors/ovl_Dm_Bal/z_dm_bal.c
index 9e5ffed89..c6d93945b 100644
--- a/src/overlays/actors/ovl_Dm_Bal/z_dm_bal.c
+++ b/src/overlays/actors/ovl_Dm_Bal/z_dm_bal.c
@@ -195,9 +195,11 @@ void DmBal_Draw(Actor* thisx, PlayState* play) {
DmBal* this = THIS;
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, SEGMENTED_TO_VIRTUAL(sEyeTextures[this->eyeIndex]));
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
DmBal_OverrideLimbDraw, DmBal_PostLimbDraw, &this->actor);
+
CLOSE_DISPS(play->state.gfxCtx);
}
diff --git a/src/overlays/actors/ovl_Dm_Char00/z_dm_char00.c b/src/overlays/actors/ovl_Dm_Char00/z_dm_char00.c
index 8657a9dc9..fe4a83a91 100644
--- a/src/overlays/actors/ovl_Dm_Char00/z_dm_char00.c
+++ b/src/overlays/actors/ovl_Dm_Char00/z_dm_char00.c
@@ -922,7 +922,7 @@ void DmChar00_Draw(Actor* thisx, PlayState* play2) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C94C(play->state.gfxCtx);
+ Gfx_SetupDL27_Xlu(play->state.gfxCtx);
do {
phi_a0 = (this->unk_262 * 50) & 511;
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 7b700f4eb..767d4c827 100644
--- a/src/overlays/actors/ovl_Dm_Char01/z_dm_char01.c
+++ b/src/overlays/actors/ovl_Dm_Char01/z_dm_char01.c
@@ -423,7 +423,7 @@ void DmChar01_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
if ((u8)this->unk_348 == 255) {
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gDPSetRenderMode(POLY_OPA_DISP++, G_RM_FOG_SHADE_A, G_RM_AA_ZB_OPA_SURF2);
gDPPipeSync(POLY_OPA_DISP++);
@@ -435,7 +435,7 @@ void DmChar01_Draw(Actor* thisx, PlayState* play) {
G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, gWoodfallSceneryDynamicPoisonWaterDL);
} else {
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gDPSetRenderMode(POLY_XLU_DISP++, G_RM_FOG_SHADE_A, G_RM_AA_ZB_XLU_SURF2);
gDPPipeSync(POLY_XLU_DISP++);
@@ -482,7 +482,7 @@ void DmChar01_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gDPPipeSync(POLY_XLU_DISP++);
gDPSetEnvColor(POLY_XLU_DISP++, 0, 0, 0, (u8)this->unk_348);
diff --git a/src/overlays/actors/ovl_Dm_Char02/z_dm_char02.c b/src/overlays/actors/ovl_Dm_Char02/z_dm_char02.c
index ec1e12a8f..f49820f03 100644
--- a/src/overlays/actors/ovl_Dm_Char02/z_dm_char02.c
+++ b/src/overlays/actors/ovl_Dm_Char02/z_dm_char02.c
@@ -185,7 +185,7 @@ void DmChar02_Draw(Actor* thisx, PlayState* play) {
}
if (shouldDraw) {
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawTransformFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable,
this->skelAnime.dListCount, DmChar02_OverrideLimbDraw, DmChar02_PostLimbDraw,
DmChar02_TransformLimbDraw, &this->actor);
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 21b9f94df..aa3a8b0e6 100644
--- a/src/overlays/actors/ovl_Dm_Char03/z_dm_char03.c
+++ b/src/overlays/actors/ovl_Dm_Char03/z_dm_char03.c
@@ -165,7 +165,7 @@ void DmChar03_Draw(Actor* thisx, PlayState* play) {
if (!this->unk_18E) {
if ((Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_136)) &&
(play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_136)]->id != 1)) {
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawTransformFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable,
this->skelAnime.dListCount, DmChar03_OverrideLimbDraw, DmChar03_PostLimbDraw,
DmChar03_TransformLimbDraw, &this->actor);
diff --git a/src/overlays/actors/ovl_Dm_Char04/z_dm_char04.c b/src/overlays/actors/ovl_Dm_Char04/z_dm_char04.c
index ac479344d..3375b522d 100644
--- a/src/overlays/actors/ovl_Dm_Char04/z_dm_char04.c
+++ b/src/overlays/actors/ovl_Dm_Char04/z_dm_char04.c
@@ -136,7 +136,7 @@ void DmChar04_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C94C(play->state.gfxCtx);
+ Gfx_SetupDL27_Xlu(play->state.gfxCtx);
alpha = (this->timer * 50) & 0x1FF;
if (alpha > 255) {
alpha = 511 - alpha;
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 6b85df5d3..e3dcec911 100644
--- a/src/overlays/actors/ovl_Dm_Char05/z_dm_char05.c
+++ b/src/overlays/actors/ovl_Dm_Char05/z_dm_char05.c
@@ -611,7 +611,7 @@ void func_80AAD998(Actor* thisx, PlayState* play) {
(play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_109)]->id != 1)) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
POLY_OPA_DISP = Gfx_SetFog(POLY_OPA_DISP, this->unk_19C, this->unk_1A0, this->unk_1A4, this->unk_1A8,
this->unk_1AC, this->unk_1B0);
SkelAnime_DrawOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, DmChar05_OverrideLimbDraw,
@@ -630,7 +630,7 @@ void func_80AADA90(Actor* thisx, PlayState* play) {
if (this->unk_18E == 0) {
if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_473) &&
(play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_473)]->id != 1)) {
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, DmChar05_OverrideLimbDraw,
DmChar05_PostLimbDraw, &this->actor);
}
@@ -645,7 +645,7 @@ void func_80AADB4C(Actor* thisx, PlayState* play) {
if (this->unk_18E == 0) {
if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_518) &&
(play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_518)]->id != 1)) {
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable,
this->skelAnime.dListCount, NULL, NULL, &this->actor);
}
@@ -663,7 +663,7 @@ void func_80AADC00(Actor* thisx, PlayState* play) {
cueChannel = Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_559);
if ((play->csCtx.actorCues[cueChannel]->id != 1) && (play->csCtx.actorCues[cueChannel]->id != 4)) {
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, DmChar05_OverrideLimbDraw,
DmChar05_PostLimbDraw, &this->actor);
}
diff --git a/src/overlays/actors/ovl_Dm_Char06/z_dm_char06.c b/src/overlays/actors/ovl_Dm_Char06/z_dm_char06.c
index 747b2e0c9..591249c77 100644
--- a/src/overlays/actors/ovl_Dm_Char06/z_dm_char06.c
+++ b/src/overlays/actors/ovl_Dm_Char06/z_dm_char06.c
@@ -78,7 +78,7 @@ void DmChar06_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
Scene_SetRenderModeXlu(play, 1, 2);
gDPPipeSync(POLY_XLU_DISP++);
gDPSetEnvColor(POLY_XLU_DISP++, 0, 0, 0, this->alpha);
diff --git a/src/overlays/actors/ovl_Dm_Char07/z_dm_char07.c b/src/overlays/actors/ovl_Dm_Char07/z_dm_char07.c
index 844be223e..c5c06958e 100644
--- a/src/overlays/actors/ovl_Dm_Char07/z_dm_char07.c
+++ b/src/overlays/actors/ovl_Dm_Char07/z_dm_char07.c
@@ -75,7 +75,7 @@ void DmChar07_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
switch (this->dyna.actor.params) {
case DMCHAR07_STAGE:
@@ -112,7 +112,7 @@ void DmChar07_Draw(Actor* thisx, PlayState* play) {
break;
}
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
switch (this->dyna.actor.params) {
case DMCHAR07_STAGE:
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 35611375b..9bd85db3a 100644
--- a/src/overlays/actors/ovl_Dm_Char08/z_dm_char08.c
+++ b/src/overlays/actors/ovl_Dm_Char08/z_dm_char08.c
@@ -1093,7 +1093,8 @@ void DmChar08_Draw(Actor* thisx, PlayState* play) {
DmChar08* this = THIS;
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sBigTurtleEyeTextures[this->eyeIndex]));
gSPSegment(POLY_OPA_DISP++, 0x09, Lib_SegmentedToVirtual(sBigTurtleEyeTextures[this->eyeIndex]));
@@ -1113,11 +1114,12 @@ void DmChar08_Draw(Actor* thisx, PlayState* play) {
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, gTurtleAsleepDL);
} else if (this->unk_1FF == 1) {
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
Scene_SetRenderModeXlu(play, 2, 2);
gDPSetEnvColor(POLY_XLU_DISP++, 0, 0, 0, this->alpha);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_XLU_DISP++, gTurtleAsleepDL);
}
+
CLOSE_DISPS(play->state.gfxCtx);
}
diff --git a/src/overlays/actors/ovl_Dm_Char09/z_dm_char09.c b/src/overlays/actors/ovl_Dm_Char09/z_dm_char09.c
index 93fa0e94c..0f53193d1 100644
--- a/src/overlays/actors/ovl_Dm_Char09/z_dm_char09.c
+++ b/src/overlays/actors/ovl_Dm_Char09/z_dm_char09.c
@@ -218,8 +218,8 @@ void DmChar09_Draw(Actor* thisx, PlayState* play) {
DmChar09* this = THIS;
if ((play->csCtx.state != CS_STATE_IDLE) && this->unk_22E) {
- func_8012C28C(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
SkelAnime_DrawOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, DmChar09_OverrideLimbDraw, NULL,
&this->actor);
}
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 2cdddbf19..9f8cd237f 100644
--- a/src/overlays/actors/ovl_Dm_Gm/z_dm_gm.c
+++ b/src/overlays/actors/ovl_Dm_Gm/z_dm_gm.c
@@ -356,7 +356,7 @@ void func_80C25000(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(D_80C25244[this->unk_2B8]));
gSPSegment(POLY_OPA_DISP++, 0x09, Lib_SegmentedToVirtual(D_80C25238[0]));
diff --git a/src/overlays/actors/ovl_Dm_Nb/z_dm_nb.c b/src/overlays/actors/ovl_Dm_Nb/z_dm_nb.c
index c42ad3c2b..0eb622b49 100644
--- a/src/overlays/actors/ovl_Dm_Nb/z_dm_nb.c
+++ b/src/overlays/actors/ovl_Dm_Nb/z_dm_nb.c
@@ -96,7 +96,7 @@ void DmNb_TransformLimbDraw(PlayState* play, s32 limbIndex, Actor* thisx) {
void DmNb_Draw(Actor* thisx, PlayState* play) {
DmNb* this = THIS;
- func_8012C5B0(play->state.gfxCtx);
+ Gfx_SetupDL37_Opa(play->state.gfxCtx);
SkelAnime_DrawTransformFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable,
this->skelAnime.dListCount, NULL, NULL, DmNb_TransformLimbDraw, &this->actor);
}
diff --git a/src/overlays/actors/ovl_Dm_Sa/z_dm_sa.c b/src/overlays/actors/ovl_Dm_Sa/z_dm_sa.c
index dc6d8bcef..83f635777 100644
--- a/src/overlays/actors/ovl_Dm_Sa/z_dm_sa.c
+++ b/src/overlays/actors/ovl_Dm_Sa/z_dm_sa.c
@@ -108,7 +108,7 @@ void DmSa_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
if (this->alpha < 0xFF) {
gSPSegment(POLY_OPA_DISP++, 0x0C, func_80A2EB58(play->state.gfxCtx, this->alpha));
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 9a9e14dbc..66f70d9c6 100644
--- a/src/overlays/actors/ovl_Dm_Stk/z_dm_stk.c
+++ b/src/overlays/actors/ovl_Dm_Stk/z_dm_stk.c
@@ -2033,10 +2033,10 @@ void DmStk_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
this->alpha = this->alpha;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
if (this->alpha < 255) {
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
Scene_SetRenderModeXlu(play, 1, 2);
gDPPipeSync(POLY_XLU_DISP++);
diff --git a/src/overlays/actors/ovl_Dm_Zl/z_dm_zl.c b/src/overlays/actors/ovl_Dm_Zl/z_dm_zl.c
index 4d2b4a54a..e875d8ab8 100644
--- a/src/overlays/actors/ovl_Dm_Zl/z_dm_zl.c
+++ b/src/overlays/actors/ovl_Dm_Zl/z_dm_zl.c
@@ -289,7 +289,7 @@ void DmZl_Draw(Actor* thisx, PlayState* play) {
gSPSegment(POLY_OPA_DISP++, 0x0A, Lib_SegmentedToVirtual(sMouthTextures[this->mouthTextureIndex]));
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
DmZl_OverrideLimbDraw, DmZl_PostLimbDraw, &this->actor);
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 36b82cc04..88129eddc 100644
--- a/src/overlays/actors/ovl_Door_Shutter/z_door_shutter.c
+++ b/src/overlays/actors/ovl_Door_Shutter/z_door_shutter.c
@@ -139,15 +139,17 @@ void DoorShutter_SetupAction(DoorShutter* this, DoorShutterActionFunc actionFunc
}
s32 func_808A0900(DoorShutter* this, PlayState* play) {
- TransitionActorEntry* transitionEntry = &play->doorCtx.transitionActorList[DOORSHUTTER_GET_FC00(&this->actor)];
+ TransitionActorEntry* transitionEntry =
+ &play->doorCtx.transitionActorList[DOOR_GET_TRANSITION_ID(&this->slidingDoor.dyna.actor)];
s8 frontRoom = transitionEntry->sides[0].room;
if (frontRoom == transitionEntry->sides[1].room) {
- if (ABS_ALT(BINANG_SUB(this->actor.shape.rot.y, this->actor.yawTowardsPlayer)) < 0x4000) {
+ if (ABS_ALT(BINANG_SUB(this->slidingDoor.dyna.actor.shape.rot.y,
+ this->slidingDoor.dyna.actor.yawTowardsPlayer)) < 0x4000) {
frontRoom = -1;
}
}
- return frontRoom == this->actor.room;
+ return frontRoom == this->slidingDoor.dyna.actor.room;
}
s32 DoorShutter_SetupDoor(DoorShutter* this, PlayState* play) {
@@ -173,13 +175,13 @@ s32 DoorShutter_SetupDoor(DoorShutter* this, PlayState* play) {
}
if (doorType == 1) {
- if (!Flags_GetClear(play, this->actor.room)) {
+ if (!Flags_GetClear(play, this->slidingDoor.dyna.actor.room)) {
DoorShutter_SetupAction(this, func_808A0F88);
this->unk_168 = 1.0f;
return true;
}
} else if ((doorType == 2) || (doorType == 7)) {
- if (!Flags_GetSwitch(play, DOORSHUTTER_GET_7F(&this->actor))) {
+ if (!Flags_GetSwitch(play, DOORSHUTTER_GET_7F(&this->slidingDoor.dyna.actor))) {
DoorShutter_SetupAction(this, func_808A1548);
this->unk_168 = 1.0f;
return true;
@@ -201,8 +203,8 @@ void DoorShutter_Init(Actor* thisx, PlayState* play2) {
s32 sp24;
s32 i;
- Actor_ProcessInitChain(&this->actor, sInitChain);
- this->doorType = DOORSHUTTER_GET_380(&this->actor);
+ Actor_ProcessInitChain(&this->slidingDoor.dyna.actor, sInitChain);
+ this->doorType = DOORSHUTTER_GET_380(&this->slidingDoor.dyna.actor);
sp24 = D_808A2240[this->doorType];
if (sp24 < 0) {
@@ -216,7 +218,7 @@ void DoorShutter_Init(Actor* thisx, PlayState* play2) {
sp24 = shutterSceneInfo->index;
if (sp24 == 6) {
- this->actor.flags |= ACTOR_FLAG_10000000;
+ this->slidingDoor.dyna.actor.flags |= ACTOR_FLAG_10000000;
}
} else if (sp24 == 0) {
BossDoorInfo* bossDoorInfo = &D_808A22A0[0];
@@ -227,13 +229,13 @@ void DoorShutter_Init(Actor* thisx, PlayState* play2) {
}
}
- this->unk_15E = bossDoorInfo->index;
+ this->slidingDoor.unk_15E = bossDoorInfo->index;
} else {
- this->actor.room = -1;
+ this->slidingDoor.dyna.actor.room = -1;
}
if ((this->requiredObjBankIndex = Object_GetIndex(&play->objectCtx, D_808A2180[sp24].objectId)) < 0) {
- Actor_Kill(&this->actor);
+ Actor_Kill(&this->slidingDoor.dyna.actor);
return;
}
@@ -241,19 +243,19 @@ void DoorShutter_Init(Actor* thisx, PlayState* play2) {
this->unk_163 = sp24;
if ((this->doorType == 4) || (this->doorType == 5)) {
- if (!Flags_GetSwitch(play, DOORSHUTTER_GET_7F(&this->actor))) {
+ if (!Flags_GetSwitch(play, DOORSHUTTER_GET_7F(&this->slidingDoor.dyna.actor))) {
this->unk_166 = 10;
}
}
- Actor_SetFocus(&this->actor, 60.0f);
+ Actor_SetFocus(&this->slidingDoor.dyna.actor, 60.0f);
}
void DoorShutter_Destroy(Actor* thisx, PlayState* play) {
DoorShutter* this = THIS;
- if (this->actor.room >= 0) {
- s32 transitionActorId = DOORSHUTTER_GET_FC00(&this->actor);
+ if (this->slidingDoor.dyna.actor.room >= 0) {
+ s32 transitionActorId = DOOR_GET_TRANSITION_ID(&this->slidingDoor.dyna.actor);
play->doorCtx.transitionActorList[transitionActorId].id =
-play->doorCtx.transitionActorList[transitionActorId].id;
@@ -263,8 +265,8 @@ void DoorShutter_Destroy(Actor* thisx, PlayState* play) {
void DoorShutter_SetupType(DoorShutter* this, PlayState* play) {
if (Object_IsLoaded(&play->objectCtx, this->requiredObjBankIndex) &&
(!R_PLAY_FILL_SCREEN_ON || (R_PLAY_FILL_SCREEN_ALPHA == 0))) {
- this->actor.objBankIndex = this->requiredObjBankIndex;
- this->actor.draw = DoorShutter_Draw;
+ this->slidingDoor.dyna.actor.objBankIndex = this->requiredObjBankIndex;
+ this->slidingDoor.dyna.actor.draw = DoorShutter_Draw;
DoorShutter_SetupDoor(this, play);
}
}
@@ -278,7 +280,7 @@ f32 func_808A0D90(PlayState* play, DoorShutter* this, f32 arg2, f32 arg3, f32 ar
sp28.y = player->actor.world.pos.y + arg2;
sp28.z = player->actor.world.pos.z;
- Actor_OffsetOfPointInActorCoords(&this->actor, &sp1C, &sp28);
+ Actor_OffsetOfPointInActorCoords(&this->slidingDoor.dyna.actor, &sp1C, &sp28);
if ((arg3 < fabsf(sp1C.x)) || (arg4 < fabsf(sp1C.y))) {
return FLT_MAX;
@@ -294,7 +296,7 @@ s32 func_808A0E28(DoorShutter* this, PlayState* play) {
f32 temp_f0 = func_808A0D90(play, this, 0.0f, shutterInfo->unk_0A, shutterInfo->unk_0B);
if (fabsf(temp_f0) < 50.0f) {
- s16 temp_v0_2 = BINANG_SUB(player->actor.shape.rot.y, this->actor.shape.rot.y);
+ s16 temp_v0_2 = BINANG_SUB(player->actor.shape.rot.y, this->slidingDoor.dyna.actor.shape.rot.y);
if (temp_f0 > 0.0f) {
temp_v0_2 = 0x8000 - temp_v0_2;
@@ -309,8 +311,9 @@ s32 func_808A0E28(DoorShutter* this, PlayState* play) {
}
void func_808A0F88(DoorShutter* this, PlayState* play) {
- if (Flags_GetClear(play, this->actor.room) || Flags_GetClearTemp(play, this->actor.room)) {
- this->csId = this->actor.csId;
+ if (Flags_GetClear(play, this->slidingDoor.dyna.actor.room) ||
+ Flags_GetClearTemp(play, this->slidingDoor.dyna.actor.room)) {
+ this->csId = this->slidingDoor.dyna.actor.csId;
if (this->doorType == 7) {
if (this->csId != CS_ID_NONE) {
this->csId = CutsceneManager_GetAdditionalCsId(this->csId);
@@ -318,8 +321,8 @@ void func_808A0F88(DoorShutter* this, PlayState* play) {
}
if (CutsceneManager_IsNext(this->csId)) {
- CutsceneManager_StartWithPlayerCs(this->csId, &this->actor);
- Flags_SetClear(play, this->actor.room);
+ CutsceneManager_StartWithPlayerCs(this->csId, &this->slidingDoor.dyna.actor);
+ Flags_SetClear(play, this->slidingDoor.dyna.actor.room);
DoorShutter_SetupAction(this, func_808A1784);
this->unk_167 = -1;
} else {
@@ -329,8 +332,8 @@ void func_808A0F88(DoorShutter* this, PlayState* play) {
Player* player = GET_PLAYER(play);
player->doorType = PLAYER_DOORTYPE_TALKING;
- player->doorActor = &this->actor;
- this->actor.textId = 0x1801;
+ player->doorActor = &this->slidingDoor.dyna.actor;
+ this->slidingDoor.dyna.actor.textId = 0x1801;
func_80122F28(player);
}
}
@@ -339,16 +342,16 @@ void func_808A1080(DoorShutter* this, PlayState* play) {
}
void func_808A1090(DoorShutter* this, PlayState* play) {
- if (this->unk_15C != 0) {
+ if (this->slidingDoor.unk_15C != 0) {
DoorShutter_SetupAction(this, func_808A1684);
- this->actor.velocity.y = 0.0f;
+ this->slidingDoor.dyna.actor.velocity.y = 0.0f;
if (this->unk_166 != 0) {
- Flags_SetSwitch(play, DOORSHUTTER_GET_7F(&this->actor));
+ Flags_SetSwitch(play, DOORSHUTTER_GET_7F(&this->slidingDoor.dyna.actor));
if (this->doorType != 5) {
DUNGEON_KEY_COUNT(gSaveContext.mapIndex) = DUNGEON_KEY_COUNT(gSaveContext.mapIndex) - 1;
- Actor_PlaySfx(&this->actor, NA_SE_EV_CHAIN_KEY_UNLOCK);
+ Actor_PlaySfx(&this->slidingDoor.dyna.actor, NA_SE_EV_CHAIN_KEY_UNLOCK);
} else {
- Actor_PlaySfx(&this->actor, NA_SE_EV_CHAIN_KEY_UNLOCK_B);
+ Actor_PlaySfx(&this->slidingDoor.dyna.actor, NA_SE_EV_CHAIN_KEY_UNLOCK_B);
}
}
} else {
@@ -359,7 +362,7 @@ void func_808A1090(DoorShutter* this, PlayState* play) {
player->doorType = PLAYER_DOORTYPE_SLIDING;
player->doorDirection = doorDirection;
- player->doorActor = &this->actor;
+ player->doorActor = &this->slidingDoor.dyna.actor;
if (this->unk_163 == 7) {
player->doorTimer = 12;
@@ -368,20 +371,21 @@ void func_808A1090(DoorShutter* this, PlayState* play) {
}
if (this->doorType == 6) {
- if (gSaveContext.save.saveInfo.playerData.healthCapacity < (DOORSHUTTER_GET_1F(&this->actor) * 0x10)) {
+ if (gSaveContext.save.saveInfo.playerData.healthCapacity <
+ (DOORSHUTTER_GET_1F(&this->slidingDoor.dyna.actor) * 0x10)) {
player->doorType = PLAYER_DOORTYPE_TALKING;
- this->actor.textId = 0x14FC;
+ this->slidingDoor.dyna.actor.textId = 0x14FC;
}
} else if (this->unk_166 != 0) {
if (this->doorType == 5) {
if (!CHECK_DUNGEON_ITEM(DUNGEON_BOSS_KEY, gSaveContext.mapIndex)) {
player->doorType = PLAYER_DOORTYPE_TALKING;
- this->actor.textId = 0x1803;
+ this->slidingDoor.dyna.actor.textId = 0x1803;
}
player->doorTimer += 10;
} else if (DUNGEON_KEY_COUNT(gSaveContext.mapIndex) <= 0) {
player->doorType = PLAYER_DOORTYPE_TALKING;
- this->actor.textId = 0x1802;
+ this->slidingDoor.dyna.actor.textId = 0x1802;
} else {
player->doorTimer += 10;
}
@@ -392,7 +396,7 @@ void func_808A1090(DoorShutter* this, PlayState* play) {
}
void func_808A1288(DoorShutter* this, PlayState* play) {
- if (this->actor.category == ACTORCAT_DOOR) {
+ if (this->slidingDoor.dyna.actor.category == ACTORCAT_DOOR) {
Player* player = GET_PLAYER(play);
s32 sp38 = this->unk_164;
s32 sp34 = 0xF;
@@ -406,17 +410,18 @@ void func_808A1288(DoorShutter* this, PlayState* play) {
this->unk_164 = sp38;
this->unk_168 = 0.0f;
- Camera_ChangeDoorCam(play->cameraPtrs[CAM_ID_MAIN], &this->actor, player->unk_3BA, this->unk_168, 12, sp34, 10);
+ Camera_ChangeDoorCam(play->cameraPtrs[CAM_ID_MAIN], &this->slidingDoor.dyna.actor, player->doorBgCamIndex,
+ this->unk_168, 12, sp34, 10);
}
}
s32 func_808A1340(DoorShutter* this, PlayState* play) {
Vec3f sp2C;
- if (this->actor.velocity.y == 0.0f) {
+ if (this->slidingDoor.dyna.actor.velocity.y == 0.0f) {
func_808A1288(this, play);
if (this->unk_163 != 7) {
- Actor_PlaySfx(&this->actor, NA_SE_EV_SLIDE_DOOR_OPEN);
+ Actor_PlaySfx(&this->slidingDoor.dyna.actor, NA_SE_EV_SLIDE_DOOR_OPEN);
}
}
@@ -424,20 +429,22 @@ s32 func_808A1340(DoorShutter* this, PlayState* play) {
s32 pad;
if (this->unk_163 == 7) {
- func_800B9010(&this->actor, NA_SE_EV_IKANA_DOOR_OPEN - SFX_FLAG);
+ func_800B9010(&this->slidingDoor.dyna.actor, NA_SE_EV_IKANA_DOOR_OPEN - SFX_FLAG);
}
- Lib_Vec3f_TranslateAndRotateY(&this->actor.home.pos, this->actor.shape.rot.y,
+ Lib_Vec3f_TranslateAndRotateY(&this->slidingDoor.dyna.actor.home.pos, this->slidingDoor.dyna.actor.shape.rot.y,
(this->unk_163 == 7) ? &D_808A22C4 : &D_808A22D0, &sp2C);
- Math_StepToF(&this->actor.velocity.y, 5.0f, 0.5f);
+ Math_StepToF(&this->slidingDoor.dyna.actor.velocity.y, 5.0f, 0.5f);
- if (Math_Vec3f_StepToXZ(&this->actor.world.pos, &sp2C, this->actor.velocity.y) == 0.0f) {
+ if (Math_Vec3f_StepToXZ(&this->slidingDoor.dyna.actor.world.pos, &sp2C,
+ this->slidingDoor.dyna.actor.velocity.y) == 0.0f) {
return true;
}
} else {
- Math_StepToF(&this->actor.velocity.y, 15.0f, 3.0f);
+ Math_StepToF(&this->slidingDoor.dyna.actor.velocity.y, 15.0f, 3.0f);
- if (Math_StepToF(&this->actor.world.pos.y, this->actor.home.pos.y + 200.0f, this->actor.velocity.y)) {
+ if (Math_StepToF(&this->slidingDoor.dyna.actor.world.pos.y, this->slidingDoor.dyna.actor.home.pos.y + 200.0f,
+ this->slidingDoor.dyna.actor.velocity.y)) {
return true;
}
}
@@ -449,13 +456,13 @@ s32 func_808A1478(DoorShutter* this, PlayState* play, f32 arg2) {
if (temp == this->unk_168) {
if (arg2 == 1.0f) {
- Actor_PlaySfx(&this->actor, NA_SE_EV_METALDOOR_CLOSE);
+ Actor_PlaySfx(&this->slidingDoor.dyna.actor, NA_SE_EV_METALDOOR_CLOSE);
} else {
- Actor_PlaySfx(&this->actor, NA_SE_EV_METALDOOR_OPEN);
+ Actor_PlaySfx(&this->slidingDoor.dyna.actor, NA_SE_EV_METALDOOR_OPEN);
}
if ((this->csId != CS_ID_NONE) && (CutsceneManager_GetCurrentCsId() == this->csId)) {
- func_800B724C(play, &this->actor, PLAYER_CSMODE_1);
+ func_800B724C(play, &this->slidingDoor.dyna.actor, PLAYER_CSMODE_1);
}
}
@@ -467,10 +474,10 @@ s32 func_808A1478(DoorShutter* this, PlayState* play, f32 arg2) {
void func_808A1548(DoorShutter* this, PlayState* play) {
if (func_808A1478(this, play, 1.0f)) {
- if (Flags_GetSwitch(play, DOORSHUTTER_GET_7F(&this->actor))) {
- this->csId = this->actor.csId;
+ if (Flags_GetSwitch(play, DOORSHUTTER_GET_7F(&this->slidingDoor.dyna.actor))) {
+ this->csId = this->slidingDoor.dyna.actor.csId;
if (CutsceneManager_IsNext(this->csId)) {
- CutsceneManager_StartWithPlayerCs(this->csId, &this->actor);
+ CutsceneManager_StartWithPlayerCs(this->csId, &this->slidingDoor.dyna.actor);
DoorShutter_SetupAction(this, func_808A1784);
this->unk_167 = -1;
} else {
@@ -480,15 +487,15 @@ void func_808A1548(DoorShutter* this, PlayState* play) {
Player* player = GET_PLAYER(play);
player->doorType = PLAYER_DOORTYPE_TALKING;
- player->doorActor = &this->actor;
- this->actor.textId = 0x1800;
+ player->doorActor = &this->slidingDoor.dyna.actor;
+ this->slidingDoor.dyna.actor.textId = 0x1800;
func_80122F28(player);
}
}
}
void func_808A1618(DoorShutter* this, PlayState* play) {
- if ((this->unk_15C == 0) && !Flags_GetSwitch(play, DOORSHUTTER_GET_7F(&this->actor))) {
+ if ((this->slidingDoor.unk_15C == 0) && !Flags_GetSwitch(play, DOORSHUTTER_GET_7F(&this->slidingDoor.dyna.actor))) {
DoorShutter_SetupAction(this, func_808A1548);
} else {
func_808A1090(this, play);
@@ -505,14 +512,14 @@ void func_808A1684(DoorShutter* this, PlayState* play) {
phi_f0 = 50.0f;
}
- if (phi_f0 < this->actor.xzDistToPlayer) {
+ if (phi_f0 < this->slidingDoor.dyna.actor.xzDistToPlayer) {
if (this->unk_163 == 7) {
- this->actor.velocity.y = 0.0f;
+ this->slidingDoor.dyna.actor.velocity.y = 0.0f;
} else {
if (DoorShutter_SetupDoor(this, play)) {
- this->actor.velocity.y = 30.0f;
+ this->slidingDoor.dyna.actor.velocity.y = 30.0f;
}
- Actor_PlaySfx(&this->actor, NA_SE_EV_SLIDE_DOOR_CLOSE);
+ Actor_PlaySfx(&this->slidingDoor.dyna.actor, NA_SE_EV_SLIDE_DOOR_CLOSE);
}
DoorShutter_SetupAction(this, func_808A1B48);
}
@@ -521,7 +528,7 @@ void func_808A1684(DoorShutter* this, PlayState* play) {
void func_808A1784(DoorShutter* this, PlayState* play) {
if (this->unk_167 != 0) {
- if (func_800F22C4(this->csId, &this->actor) != 0) {
+ if (func_800F22C4(this->csId, &this->slidingDoor.dyna.actor) != 0) {
if (this->unk_167 < 0) {
if ((play->state.frames % 2) != 0) {
this->unk_167++;
@@ -545,16 +552,18 @@ void func_808A1784(DoorShutter* this, PlayState* play) {
void func_808A1884(DoorShutter* this, PlayState* play) {
Player* player = GET_PLAYER(play);
- s8 room = this->actor.room;
+ s8 room = this->slidingDoor.dyna.actor.room;
Vec3f sp44;
- if (this->actor.room >= 0) {
- Actor_OffsetOfPointInActorCoords(&this->actor, &sp44, &player->actor.world.pos);
+ if (this->slidingDoor.dyna.actor.room >= 0) {
+ Actor_OffsetOfPointInActorCoords(&this->slidingDoor.dyna.actor, &sp44, &player->actor.world.pos);
- this->actor.room =
- play->doorCtx.transitionActorList[DOORSHUTTER_GET_FC00(&this->actor)].sides[(sp44.z < 0.0f) ? 0 : 1].room;
+ this->slidingDoor.dyna.actor.room =
+ play->doorCtx.transitionActorList[DOOR_GET_TRANSITION_ID(&this->slidingDoor.dyna.actor)]
+ .sides[(sp44.z < 0.0f) ? 0 : 1]
+ .room;
- if (room != this->actor.room) {
+ if (room != this->slidingDoor.dyna.actor.room) {
Room temp = play->roomCtx.curRoom;
play->roomCtx.curRoom = play->roomCtx.prevRoom;
@@ -564,8 +573,8 @@ void func_808A1884(DoorShutter* this, PlayState* play) {
func_8012EBF8(play, &play->roomCtx);
}
- this->unk_15C = 0;
- this->actor.velocity.y = 0.0f;
+ this->slidingDoor.unk_15C = 0;
+ this->slidingDoor.dyna.actor.velocity.y = 0.0f;
if (DoorShutter_SetupDoor(this, play) && !(player->stateFlags1 & PLAYER_STATE1_800)) {
DoorShutter_SetupAction(this, func_808A1C50);
@@ -580,20 +589,22 @@ void func_808A1884(DoorShutter* this, PlayState* play) {
s32 func_808A1A70(DoorShutter* this) {
if (this->unk_163 == 7) {
if (this->unk_163 == 7) {
- func_800B9010(&this->actor, NA_SE_EV_IKANA_DOOR_CLOSE - SFX_FLAG);
+ func_800B9010(&this->slidingDoor.dyna.actor, NA_SE_EV_IKANA_DOOR_CLOSE - SFX_FLAG);
}
- Math_StepToF(&this->actor.velocity.y, 5.0f, 0.5f);
+ Math_StepToF(&this->slidingDoor.dyna.actor.velocity.y, 5.0f, 0.5f);
- if (Math_Vec3f_StepToXZ(&this->actor.world.pos, &this->actor.home.pos, this->actor.velocity.y) == 0.0f) {
+ if (Math_Vec3f_StepToXZ(&this->slidingDoor.dyna.actor.world.pos, &this->slidingDoor.dyna.actor.home.pos,
+ this->slidingDoor.dyna.actor.velocity.y) == 0.0f) {
return true;
}
} else {
- if (this->actor.velocity.y < 20.0f) {
- Math_StepToF(&this->actor.velocity.y, 20.0f, 8.0f);
+ if (this->slidingDoor.dyna.actor.velocity.y < 20.0f) {
+ Math_StepToF(&this->slidingDoor.dyna.actor.velocity.y, 20.0f, 8.0f);
}
- if (Math_StepToF(&this->actor.world.pos.y, this->actor.home.pos.y, this->actor.velocity.y)) {
+ if (Math_StepToF(&this->slidingDoor.dyna.actor.world.pos.y, this->slidingDoor.dyna.actor.home.pos.y,
+ this->slidingDoor.dyna.actor.velocity.y)) {
return true;
}
}
@@ -604,18 +615,19 @@ void func_808A1B48(DoorShutter* this, PlayState* play) {
s16 quakeIndex;
if (func_808A1A70(this)) {
- if (this->actor.velocity.y > 20.0f) {
- this->actor.floorHeight = this->actor.home.pos.y;
- Actor_SpawnFloorDustRing(play, &this->actor, &this->actor.world.pos, 45.0f, 10, 8.0f, 500, 10, 0);
+ if (this->slidingDoor.dyna.actor.velocity.y > 20.0f) {
+ this->slidingDoor.dyna.actor.floorHeight = this->slidingDoor.dyna.actor.home.pos.y;
+ Actor_SpawnFloorDustRing(play, &this->slidingDoor.dyna.actor, &this->slidingDoor.dyna.actor.world.pos,
+ 45.0f, 10, 8.0f, 500, 10, 0);
}
- Actor_PlaySfx(&this->actor, NA_SE_EV_BIGWALL_BOUND);
+ Actor_PlaySfx(&this->slidingDoor.dyna.actor, NA_SE_EV_BIGWALL_BOUND);
- quakeIndex = Quake_Add(Play_GetCamera(play, CAM_ID_MAIN), QUAKE_TYPE_3);
+ quakeIndex = Quake_Request(Play_GetCamera(play, CAM_ID_MAIN), QUAKE_TYPE_3);
Quake_SetSpeed(quakeIndex, -32536);
- Quake_SetQuakeValues(quakeIndex, 2, 0, 0, 0);
- Quake_SetCountdown(quakeIndex, 10);
+ Quake_SetPerturbations(quakeIndex, 2, 0, 0, 0);
+ Quake_SetDuration(quakeIndex, 10);
- Rumble_Request(this->actor.xyzDistToPlayerSq, 180, 20, 100);
+ Rumble_Request(this->slidingDoor.dyna.actor.xyzDistToPlayerSq, 180, 20, 100);
func_808A1884(this, play);
}
@@ -639,7 +651,9 @@ void DoorShutter_Update(Actor* thisx, PlayState* play) {
this->actionFunc(this, play);
if (this->unk_163 == 7) {
- this->actor.home.rot.z = Math_Vec3f_DistXZ(&this->actor.home.pos, &this->actor.world.pos) * -100.0f;
+ this->slidingDoor.dyna.actor.home.rot.z =
+ Math_Vec3f_DistXZ(&this->slidingDoor.dyna.actor.home.pos, &this->slidingDoor.dyna.actor.world.pos) *
+ -100.0f;
}
}
}
@@ -652,8 +666,9 @@ s32 func_808A1D68(DoorShutter* this, PlayState* play) {
return true;
}
- temp_a0 = BINANG_SUB(Actor_WorldYawTowardPoint(&this->actor, &play->view.eye), this->actor.shape.rot.y);
- temp_a1 = BINANG_SUB(this->actor.yawTowardsPlayer, this->actor.shape.rot.y);
+ temp_a0 = BINANG_SUB(Actor_WorldYawTowardPoint(&this->slidingDoor.dyna.actor, &play->view.eye),
+ this->slidingDoor.dyna.actor.shape.rot.y);
+ temp_a1 = BINANG_SUB(this->slidingDoor.dyna.actor.yawTowardsPlayer, this->slidingDoor.dyna.actor.shape.rot.y);
temp_a0 = ABS_ALT(temp_a0);
temp_a1 = ABS_ALT(temp_a1);
@@ -674,30 +689,31 @@ void DoorShutter_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
if (this->unk_164 == 7) {
Matrix_Translate(0.0f, 64.96f, 0.0f, MTXMODE_APPLY);
- Matrix_RotateZS(this->actor.home.rot.z, MTXMODE_APPLY);
+ Matrix_RotateZS(this->slidingDoor.dyna.actor.home.rot.z, MTXMODE_APPLY);
Matrix_Translate(0.0f, -64.96f, 0.0f, MTXMODE_APPLY);
}
if (sp44->unk_04 != 0) {
TransitionActorEntry* transitionEntry =
- &play->doorCtx.transitionActorList[DOORSHUTTER_GET_FC00(&this->actor)];
+ &play->doorCtx.transitionActorList[DOOR_GET_TRANSITION_ID(&this->slidingDoor.dyna.actor)];
if ((play->roomCtx.prevRoom.num >= 0) ||
(transitionEntry->sides[0].room == transitionEntry->sides[1].room)) {
- s16 yaw = this->actor.shape.rot.y - Math_Vec3f_Yaw(&play->view.eye, &this->actor.world.pos);
+ s16 yaw = this->slidingDoor.dyna.actor.shape.rot.y -
+ Math_Vec3f_Yaw(&play->view.eye, &this->slidingDoor.dyna.actor.world.pos);
if (ABS_ALT(yaw) < 0x4000) {
Matrix_RotateYF(M_PI, MTXMODE_APPLY);
}
- } else if (this->actor.room == transitionEntry->sides[0].room) {
+ } else if (this->slidingDoor.dyna.actor.room == transitionEntry->sides[0].room) {
Matrix_RotateYF(M_PI, MTXMODE_APPLY);
}
} else if (this->doorType == 5) {
- gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(D_808A22DC[this->unk_15E]));
+ gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(D_808A22DC[this->slidingDoor.unk_15E]));
}
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
diff --git a/src/overlays/actors/ovl_Door_Shutter/z_door_shutter.h b/src/overlays/actors/ovl_Door_Shutter/z_door_shutter.h
index 7f18e0546..abdf0ce84 100644
--- a/src/overlays/actors/ovl_Door_Shutter/z_door_shutter.h
+++ b/src/overlays/actors/ovl_Door_Shutter/z_door_shutter.h
@@ -2,6 +2,7 @@
#define Z_DOOR_SHUTTER_H
#include "global.h"
+#include "z64door.h"
struct DoorShutter;
@@ -10,14 +11,10 @@ typedef void (*DoorShutterActionFunc)(struct DoorShutter*, PlayState*);
#define DOORSHUTTER_GET_1F(thisx) ((thisx)->params & 0x1F)
#define DOORSHUTTER_GET_7F(thisx) ((thisx)->params & 0x7F)
#define DOORSHUTTER_GET_380(thisx) (((thisx)->params >> 7) & 7)
-#define DOORSHUTTER_GET_FC00(thisx) ((u16)(thisx)->params >> 0xA)
typedef struct DoorShutter {
- /* 0x0000 */ Actor actor;
- /* 0x0144 */ UNK_TYPE1 unk144[0x18];
- /* 0x015C */ s16 unk_15C;
- /* 0x015E */ s16 unk_15E;
- /* 0x0160 */ s16 csId;
+ /* 0x000 */ SlidingDoorActor slidingDoor;
+ /* 0x160 */ s16 csId;
/* 0x0162 */ u8 doorType;
/* 0x0163 */ u8 unk_163;
/* 0x0164 */ u8 unk_164;
diff --git a/src/overlays/actors/ovl_Door_Spiral/z_door_spiral.h b/src/overlays/actors/ovl_Door_Spiral/z_door_spiral.h
index 701b38639..af4f27aea 100644
--- a/src/overlays/actors/ovl_Door_Spiral/z_door_spiral.h
+++ b/src/overlays/actors/ovl_Door_Spiral/z_door_spiral.h
@@ -7,7 +7,8 @@ struct DoorSpiral;
typedef struct DoorSpiral {
/* 0x000 */ Actor actor;
- /* 0x144 */ char unk_144[0xC];
+ /* 0x144 */ u8 shouldClimb;
+ /* 0x145 */ UNK_TYPE1 unk_145[0xB];
} DoorSpiral; // size = 0x150
#endif // Z_DOOR_SPIRAL_H
diff --git a/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c b/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c
index 0b4b59f1c..64899a807 100644
--- a/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c
+++ b/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c
@@ -931,7 +931,7 @@ void func_808BACCC(DoorWarp1* this, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gDPSetPrimColor(POLY_XLU_DISP++, 0xFF, 0xFF, 200, 255, 255, (u8)this->unk_1B8);
gDPSetEnvColor(POLY_XLU_DISP++, 0, 100, 255, (u8)this->unk_1B8);
@@ -969,7 +969,7 @@ void func_808BAE9C(DoorWarp1* this, PlayState* play) {
sp84 = 1.0f - ((2.0f - this->unk_1A4) / 1.7f);
this->unk_1AC += sp84 * 15.0f;
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0x80, 255.0f * sp84, 255, 255, (u8)this->unk_1B4);
gDPSetEnvColor(POLY_XLU_DISP++, 0, 255.0f * sp84, 255, 255);
@@ -1059,7 +1059,7 @@ void func_808BB4F4(DoorWarp1* this, PlayState* play2) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gDPSetEnvColor(POLY_XLU_DISP++, sp64[sp60].r, sp64[sp60].g, sp64[sp60].b, 255);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0x80, 255, 255, 255, 255);
@@ -1076,7 +1076,7 @@ void func_808BB4F4(DoorWarp1* this, PlayState* play2) {
Matrix_RotateYS(this->dyna.actor.world.rot.y, MTXMODE_APPLY);
Matrix_Scale(1.0f, 0.0f, 1.0f, MTXMODE_APPLY);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gDPSetEnvColor(POLY_XLU_DISP++, sp64[sp60].r, sp64[sp60].g, sp64[sp60].b, 255);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0x80, 255, 255, 255, this->unk_203);
diff --git a/src/overlays/actors/ovl_Eff_Change/z_eff_change.c b/src/overlays/actors/ovl_Eff_Change/z_eff_change.c
index 65fb8da2f..bc95d4312 100644
--- a/src/overlays/actors/ovl_Eff_Change/z_eff_change.c
+++ b/src/overlays/actors/ovl_Eff_Change/z_eff_change.c
@@ -133,7 +133,7 @@ void EffChange_Draw(Actor* thisx, PlayState* play) {
mtx = GRAPH_ALLOC(play->state.gfxCtx, this->skeletonInfo.unk_18->unk_1 * sizeof(Mtx));
if (mtx != NULL) {
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
Matrix_RotateYS((Camera_GetCamDirYaw(GET_ACTIVE_CAM(play)) + 0x8000), MTXMODE_APPLY);
OPEN_DISPS(play->state.gfxCtx);
diff --git a/src/overlays/actors/ovl_Eff_Dust/z_eff_dust.c b/src/overlays/actors/ovl_Eff_Dust/z_eff_dust.c
index 2833477e4..0cf8d76d1 100644
--- a/src/overlays/actors/ovl_Eff_Dust/z_eff_dust.c
+++ b/src/overlays/actors/ovl_Eff_Dust/z_eff_dust.c
@@ -268,7 +268,8 @@ void func_80919768(Actor* thisx, PlayState* play2) {
sp92 = Math_Vec3f_Yaw(&activeCamEye, &thisx->world.pos);
OPEN_DISPS(gfxCtx);
- func_8012C28C(gfxCtx);
+
+ Gfx_SetupDL25_Opa(gfxCtx);
gDPPipeSync(POLY_XLU_DISP++);
@@ -318,7 +319,7 @@ void func_809199FC(Actor* thisx, PlayState* play2) {
Player* player = GET_PLAYER(play);
OPEN_DISPS(gfxCtx);
- func_8012C28C(gfxCtx);
+ Gfx_SetupDL25_Opa(gfxCtx);
gDPPipeSync(POLY_XLU_DISP++);
@@ -326,7 +327,7 @@ void func_809199FC(Actor* thisx, PlayState* play2) {
distanceTraveled = this->distanceTraveled;
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 255, 255);
- if (player->unk_B08[0] >= 0.85f) {
+ if (player->unk_B08 >= 0.85f) {
gDPSetEnvColor(POLY_XLU_DISP++, 255, 0, 0, 0);
} else {
gDPSetEnvColor(POLY_XLU_DISP++, 0, 0, 255, 0);
@@ -339,7 +340,7 @@ void func_809199FC(Actor* thisx, PlayState* play2) {
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 255, (*distanceTraveled * 255.0f));
aux = 1.0f - SQ(*distanceTraveled);
- Matrix_Mult(&player->mf_CC4, MTXMODE_NEW);
+ Matrix_Mult(&player->leftHandMf, MTXMODE_NEW);
Matrix_Translate(initialPositions->x * ((this->dx * aux) + (1.0f - this->dx)),
(initialPositions->y * (1.0f - *distanceTraveled)) + 320.0f,
(initialPositions->z * (1.0f - *distanceTraveled)) + -20.0f, MTXMODE_APPLY);
diff --git a/src/overlays/actors/ovl_Eff_Kamejima_Wave/z_eff_kamejima_wave.c b/src/overlays/actors/ovl_Eff_Kamejima_Wave/z_eff_kamejima_wave.c
index fbe4c27cf..d45d669a7 100644
--- a/src/overlays/actors/ovl_Eff_Kamejima_Wave/z_eff_kamejima_wave.c
+++ b/src/overlays/actors/ovl_Eff_Kamejima_Wave/z_eff_kamejima_wave.c
@@ -4,7 +4,6 @@
* Description: Wave Created by Turtle Awakening
*/
-#include "prevent_bss_reordering.h"
#include "z_eff_kamejima_wave.h"
#include "objects/object_kamejima/object_kamejima.h"
@@ -160,7 +159,7 @@ void EffKamejimaWave_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
Matrix_Scale(6.0f, 5.0f, 5.0f, MTXMODE_APPLY);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
AnimatedMat_Draw(play, D_80BCF1C4);
diff --git a/src/overlays/actors/ovl_Eff_Zoraband/z_eff_zoraband.c b/src/overlays/actors/ovl_Eff_Zoraband/z_eff_zoraband.c
index 2b1c01c59..3a57149a7 100644
--- a/src/overlays/actors/ovl_Eff_Zoraband/z_eff_zoraband.c
+++ b/src/overlays/actors/ovl_Eff_Zoraband/z_eff_zoraband.c
@@ -79,7 +79,7 @@ void EffZoraband_Draw(Actor* thisx, PlayState* play2) {
if (this->alpha != 0) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
Matrix_RotateYS((Camera_GetCamDirYaw(GET_ACTIVE_CAM(play)) + 0x8000), MTXMODE_APPLY);
AnimatedMat_DrawXlu(play, Lib_SegmentedToVirtual(object_zoraband_Matanimheader_000F38));
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
diff --git a/src/overlays/actors/ovl_En_Ah/z_en_ah.c b/src/overlays/actors/ovl_En_Ah/z_en_ah.c
index d9fbeb6f0..61f493b83 100644
--- a/src/overlays/actors/ovl_En_Ah/z_en_ah.c
+++ b/src/overlays/actors/ovl_En_Ah/z_en_ah.c
@@ -619,7 +619,7 @@ void EnAh_Draw(Actor* thisx, PlayState* play) {
if (this->unk_1DC != 0) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(D_80BD3F14[this->unk_2FA]));
gSPSegment(POLY_OPA_DISP++, 0x09, Lib_SegmentedToVirtual(D_80BD3F0C[this->unk_2FC]));
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 41dba0aab..839022d2c 100644
--- a/src/overlays/actors/ovl_En_Akindonuts/z_en_akindonuts.c
+++ b/src/overlays/actors/ovl_En_Akindonuts/z_en_akindonuts.c
@@ -1705,7 +1705,7 @@ void EnAkindonuts_TransformLimbDraw(PlayState* play, s32 limbIndex, Actor* thisx
void EnAkindonuts_Draw(Actor* thisx, PlayState* play) {
EnAkindonuts* this = THIS;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawTransformFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable,
this->skelAnime.dListCount, EnAkindonuts_OverrideLimbDraw, EnAkindonuts_PostLimbDraw,
EnAkindonuts_TransformLimbDraw, &this->actor);
diff --git a/src/overlays/actors/ovl_En_Al/z_en_al.c b/src/overlays/actors/ovl_En_Al/z_en_al.c
index 87b83e670..0bbb53686 100644
--- a/src/overlays/actors/ovl_En_Al/z_en_al.c
+++ b/src/overlays/actors/ovl_En_Al/z_en_al.c
@@ -907,7 +907,7 @@ void EnAl_Draw(Actor* thisx, PlayState* play) {
if (this->unk_35C != 0) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
Matrix_Translate(0.0f, 0.0f, 850.0f, MTXMODE_APPLY);
SkelAnime_DrawTransformFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable,
this->skelAnime.dListCount, EnAl_OverrideLimbDraw, EnAl_PostLimbDraw,
diff --git a/src/overlays/actors/ovl_En_Am/z_en_am.c b/src/overlays/actors/ovl_En_Am/z_en_am.c
index 31d137299..b6d32f6ec 100644
--- a/src/overlays/actors/ovl_En_Am/z_en_am.c
+++ b/src/overlays/actors/ovl_En_Am/z_en_am.c
@@ -422,8 +422,9 @@ void func_808B0894(EnAm* this, PlayState* play) {
this->armosYaw = this->actor.yawTowardsPlayer;
func_808B0208(this, play);
if (this->explodeTimer == 1) {
- EnBom* bomb = (EnBom*)Actor_Spawn(&play->actorCtx, play, ACTOR_EN_BOM, this->actor.world.pos.x,
- this->actor.world.pos.y, this->actor.world.pos.z, 0, 0, 2, 0);
+ EnBom* bomb =
+ (EnBom*)Actor_Spawn(&play->actorCtx, play, ACTOR_EN_BOM, this->actor.world.pos.x, this->actor.world.pos.y,
+ this->actor.world.pos.z, BOMB_EXPLOSIVE_TYPE_BOMB, 0, 2, BOMB_TYPE_BODY);
if (bomb != NULL) {
bomb->timer = 0;
}
@@ -563,13 +564,15 @@ void EnAm_Draw(Actor* thisx, PlayState* play) {
EnAm* this = THIS;
OPEN_DISPS(play->state.gfxCtx);
+
gfx = POLY_OPA_DISP;
- gSPDisplayList(&gfx[0], &sSetupDL[6 * 25]);
+ gSPDisplayList(&gfx[0], gSetupDLs[SETUPDL_25]);
gDPSetEnvColor(&gfx[1], 0, 0, 0, this->textureBlend);
POLY_OPA_DISP = &gfx[2];
SkelAnime_DrawOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, NULL, EnAm_PostLimbDraw,
&this->actor);
Actor_DrawDamageEffects(play, &this->actor, this->limbPos, ARRAY_COUNT(this->limbPos), this->drawDmgEffScale, 0.0f,
this->drawDmgEffAlpha, ACTOR_DRAW_DMGEFF_LIGHT_ORBS);
+
CLOSE_DISPS(play->state.gfxCtx);
}
diff --git a/src/overlays/actors/ovl_En_And/z_en_and.c b/src/overlays/actors/ovl_En_And/z_en_and.c
index 5c888ba45..d3c9adcec 100644
--- a/src/overlays/actors/ovl_En_And/z_en_and.c
+++ b/src/overlays/actors/ovl_En_And/z_en_and.c
@@ -10,14 +10,13 @@
#define THIS ((EnAnd*)thisx)
+#define EYE_TEXTURES_COUNT 4
+
void EnAnd_Init(Actor* thisx, PlayState* play);
void EnAnd_Destroy(Actor* thisx, PlayState* play);
void EnAnd_Update(Actor* thisx, PlayState* play);
void EnAnd_Draw(Actor* thisx, PlayState* play);
-void func_80C18C50(EnAnd* this, PlayState* play);
-
-#if 0
ActorInit En_And_InitVars = {
ACTOR_EN_AND,
ACTORCAT_NPC,
@@ -30,22 +29,163 @@ ActorInit En_And_InitVars = {
(ActorFunc)EnAnd_Draw,
};
-#endif
+static AnimationInfoS sAnimationInfo[] = {
+ { &gAndStaticAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gAndIdleAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gAndWalkAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gAndRaiseHeadAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
+ { &gAndRaisedHeadLoopAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gAndRaiseHandAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
+ { &gAndRaisedHandLoopAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gAndRaisedHandWalkAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
+};
-extern UNK_TYPE D_0600B380;
+s32 EnAnd_ChangeAnim(EnAnd* this, s32 animIndex) {
+ s32 ret = false;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_And/func_80C18B90.s")
+ if (this->animIndex != animIndex) {
+ this->animIndex = animIndex;
+ ret = SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, animIndex);
+ }
+ return ret;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_And/func_80C18BD8.s")
+void EnAnd_Blink(EnAnd* this) {
+ if (DECR(this->blinkTimer) == 0) {
+ this->eyeTexIndex++;
+ if (this->eyeTexIndex >= EYE_TEXTURES_COUNT) {
+ this->blinkTimer = Rand_S16Offset(30, 30);
+ this->eyeTexIndex = 0;
+ }
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_And/func_80C18C50.s")
+void EnAnd_HandleCutscene(EnAnd* this, PlayState* play) {
+ s32 csAnimations[] = { 0, 1, 2, 3, 5, 7 };
+ u16 cueType;
+ s32 cueChannel;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_And/EnAnd_Init.s")
+ if (play->csCtx.state != CS_STATE_IDLE) {
+ if (!this->isCutscenePlaying) {
+ // Cutscene is starting
+ this->cueId = 255;
+ this->isCutscenePlaying = true;
+ this->prevAnimIndex = this->animIndex;
+ }
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_565)) {
+ cueChannel = Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_565);
+ cueType = play->csCtx.actorCues[cueChannel]->id;
+ if (this->cueId != (u8)cueType) {
+ this->cueId = cueType;
+ EnAnd_ChangeAnim(this, csAnimations[cueType]);
+ }
+ switch (this->cueId) {
+ case 3:
+ case 4:
+ if ((this->animIndex == 3) || (this->animIndex == 5)) {
+ if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
+ EnAnd_ChangeAnim(this, this->animIndex + 1);
+ }
+ }
+ break;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_And/EnAnd_Destroy.s")
+ default:
+ break;
+ }
+ Cutscene_ActorTranslateAndYaw(&this->actor, play, cueChannel);
+ }
+ } else if (this->isCutscenePlaying) {
+ this->isCutscenePlaying = false;
+ EnAnd_ChangeAnim(this, this->prevAnimIndex);
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_And/EnAnd_Update.s")
+void EnAnd_Init(Actor* thisx, PlayState* play) {
+ EnAnd* this = THIS;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_And/func_80C18ED0.s")
+ ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 14.0f);
+ SkelAnime_InitFlex(play, &this->skelAnime, &gAndSkel, NULL, this->jointTable, this->morphTable,
+ OBJECT_AND_LIMB_MAX);
+ this->animIndex = -1;
+ EnAnd_ChangeAnim(this, 0);
+ Actor_SetScale(&this->actor, 0.01f);
+ this->actor.flags &= ~ACTOR_FLAG_1;
+ this->flags |= 8;
+ this->actionFunc = EnAnd_HandleCutscene;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_And/EnAnd_Draw.s")
+void EnAnd_Destroy(Actor* thisx, PlayState* play) {
+}
+
+void EnAnd_Update(Actor* thisx, PlayState* play) {
+ EnAnd* this = THIS;
+
+ this->actionFunc(this, play);
+ SkelAnime_Update(&this->skelAnime);
+ EnAnd_Blink(this);
+}
+
+void EnAnd_TransformLimbDraw(PlayState* play, s32 limbIndex, Actor* thisx) {
+ EnAnd* this = THIS;
+ s32 stepRot;
+ s32 overrideRot;
+
+ stepRot = this->flags & 8 ? false : true;
+ overrideRot = this->flags & 2 ? true : false;
+ if (!stepRot) {
+ overrideRot = false;
+ }
+
+ switch (limbIndex) {
+ case OBJECT_AND_LIMB_HEAD:
+ SubS_UpdateLimb(this->headRotZ + this->torsoRotZ + 0x4000,
+ this->headRotY + this->torsoRotY + this->actor.shape.rot.y + 0x4000, &this->headComputedPos,
+ &this->headComputedRot, stepRot, overrideRot);
+ Matrix_Pop();
+ Matrix_Translate(this->headComputedPos.x, this->headComputedPos.y, this->headComputedPos.z, MTXMODE_NEW);
+ Matrix_Scale(this->actor.scale.x, this->actor.scale.y, this->actor.scale.z, MTXMODE_APPLY);
+ Matrix_RotateYS(this->headComputedRot.y, MTXMODE_APPLY);
+ Matrix_RotateXS(this->headComputedRot.x, MTXMODE_APPLY);
+ Matrix_RotateZS(this->headComputedRot.z, MTXMODE_APPLY);
+ Matrix_Push();
+ break;
+
+ case OBJECT_AND_LIMB_TORSO:
+ SubS_UpdateLimb(this->torsoRotZ + 0x4000, this->torsoRotY + this->actor.shape.rot.y + 0x4000,
+ &this->torsoComputedPos, &this->torsoComputedRot, stepRot, overrideRot);
+ Matrix_Pop();
+ Matrix_Translate(this->torsoComputedPos.x, this->torsoComputedPos.y, this->torsoComputedPos.z, MTXMODE_NEW);
+ Matrix_Scale(this->actor.scale.x, this->actor.scale.y, this->actor.scale.z, MTXMODE_APPLY);
+ Matrix_RotateYS(this->torsoComputedRot.y, MTXMODE_APPLY);
+ Matrix_RotateXS(this->torsoComputedRot.x, MTXMODE_APPLY);
+ Matrix_RotateZS(this->torsoComputedRot.z, MTXMODE_APPLY);
+ Matrix_Push();
+ break;
+
+ default:
+ break;
+ }
+}
+
+void EnAnd_Draw(Actor* thisx, PlayState* play) {
+ static TexturePtr sMouthTextures[] = { gAndMouthNeutralTex, gAndMouthSmileTex };
+ static TexturePtr sEyeTextures[EYE_TEXTURES_COUNT] = {
+ gAndEyeOpenTex,
+ gAndEyeClosingTex,
+ gAndEyeClosedTex,
+ gAndEyeOpeningTex,
+ };
+ EnAnd* this = THIS;
+
+ OPEN_DISPS(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+
+ gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sEyeTextures[this->eyeTexIndex]));
+ gSPSegment(POLY_OPA_DISP++, 0x09, Lib_SegmentedToVirtual(sMouthTextures[0]));
+
+ SkelAnime_DrawTransformFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable,
+ this->skelAnime.dListCount, NULL, NULL, EnAnd_TransformLimbDraw, &this->actor);
+
+ CLOSE_DISPS(play->state.gfxCtx);
+}
diff --git a/src/overlays/actors/ovl_En_And/z_en_and.h b/src/overlays/actors/ovl_En_And/z_en_and.h
index a0610a408..6b5a0bb7d 100644
--- a/src/overlays/actors/ovl_En_And/z_en_and.h
+++ b/src/overlays/actors/ovl_En_And/z_en_and.h
@@ -2,6 +2,7 @@
#define Z_EN_AND_H
#include "global.h"
+#include "objects/object_and/object_and.h"
struct EnAnd;
@@ -9,9 +10,29 @@ typedef void (*EnAndActionFunc)(struct EnAnd*, PlayState*);
typedef struct EnAnd {
/* 0x000 */ Actor actor;
- /* 0x144 */ char unk_144[0x44];
+ /* 0x144 */ SkelAnime skelAnime;
/* 0x188 */ EnAndActionFunc actionFunc;
- /* 0x18C */ char unk_18C[0x188];
+ /* 0x18C */ u8 cueId;
+ /* 0x18D */ UNK_TYPE1 pad18D[0x7];
+ /* 0x194 */ Vec3f headComputedPos;
+ /* 0x1A0 */ Vec3f torsoComputedPos;
+ /* 0x1AC */ Vec3s headComputedRot;
+ /* 0x1B2 */ Vec3s torsoComputedRot;
+ /* 0x1B8 */ Vec3s jointTable[OBJECT_AND_LIMB_MAX];
+ /* 0x254 */ Vec3s morphTable[OBJECT_AND_LIMB_MAX];
+ /* 0x2F0 */ u16 flags;
+ /* 0x2F2 */ UNK_TYPE1 pad2F2[0x4];
+ /* 0x2F6 */ s16 headRotZ;
+ /* 0x2F8 */ s16 headRotY;
+ /* 0x2FA */ s16 torsoRotZ;
+ /* 0x2FC */ s16 torsoRotY;
+ /* 0x2FE */ UNK_TYPE1 pad2FE[0x2];
+ /* 0x300 */ s16 blinkTimer;
+ /* 0x302 */ s16 eyeTexIndex;
+ /* 0x304 */ s32 animIndex;
+ /* 0x308 */ s32 prevAnimIndex;
+ /* 0x30C */ s32 isCutscenePlaying;
+ /* 0x310 */ UNK_TYPE1 pad310[4];
} EnAnd; // size = 0x314
#endif // Z_EN_AND_H
diff --git a/src/overlays/actors/ovl_En_Ani/z_en_ani.c b/src/overlays/actors/ovl_En_Ani/z_en_ani.c
index d4c980055..90d31b601 100644
--- a/src/overlays/actors/ovl_En_Ani/z_en_ani.c
+++ b/src/overlays/actors/ovl_En_Ani/z_en_ani.c
@@ -220,10 +220,10 @@ void EnAni_FallToGround(EnAni* this, PlayState* play) {
Animation_Change(&this->skelAnime, &gAniLandingThenStandingUpAnim, 1.0f, 0.0f, 16.0f, ANIMMODE_ONCE, 0.0f);
this->stateFlags |= ANI_STATE_WRITHING;
- quakeIndex = Quake_Add(play->cameraPtrs[CAM_ID_MAIN], QUAKE_TYPE_3);
+ quakeIndex = Quake_Request(play->cameraPtrs[CAM_ID_MAIN], QUAKE_TYPE_3);
Quake_SetSpeed(quakeIndex, 27000);
- Quake_SetQuakeValues(quakeIndex, 7, 0, 0, 0);
- Quake_SetCountdown(quakeIndex, 20);
+ Quake_SetPerturbations(quakeIndex, 7, 0, 0, 0);
+ Quake_SetDuration(quakeIndex, 20);
Actor_PlaySfx(&this->actor, NA_SE_IT_HAMMER_HIT);
}
@@ -310,8 +310,8 @@ void EnAni_Update(Actor* thisx, PlayState* play) {
} else if (CutsceneManager_IsNext(this->actor.csId)) {
CutsceneManager_StartWithPlayerCs(this->actor.csId, &this->actor);
this->actor.csId = CutsceneManager_GetAdditionalCsId(this->actor.csId);
- Camera_SetToTrackActor(Play_GetCamera(play, CutsceneManager_GetCurrentSubCamId(this->actor.csId)),
- &this->actor);
+ Camera_SetFocalActor(Play_GetCamera(play, CutsceneManager_GetCurrentSubCamId(this->actor.csId)),
+ &this->actor);
} else {
CutsceneManager_Queue(this->actor.csId);
}
@@ -345,7 +345,7 @@ void EnAni_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
Matrix_Translate(0.0f, 0.0f, -1000.0f, MTXMODE_APPLY);
- func_8012C5B0(play->state.gfxCtx);
+ Gfx_SetupDL37_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sEyeTextures[this->eyeState]));
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 5aa746298..64adaa49b 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
@@ -12,27 +12,25 @@
#define THIS ((EnAob01*)thisx)
-//! TODO: this file require macros for its uses of weekEventReg
-
void EnAob01_Init(Actor* thisx, PlayState* play);
void EnAob01_Destroy(Actor* thisx, PlayState* play);
void EnAob01_Update(Actor* thisx, PlayState* play);
void EnAob01_Draw(Actor* thisx, PlayState* play);
-void func_809C1C9C(EnAob01* this, PlayState* play);
-void func_809C1D64(EnAob01* this, PlayState* play);
-void func_809C2060(EnAob01* this, PlayState* play);
-void func_809C21E0(EnAob01* this, PlayState* play);
-void func_809C26E4(EnAob01* this, PlayState* play);
-void func_809C2730(EnAob01* this, PlayState* play);
-void func_809C2788(EnAob01* this, PlayState* play);
-void func_809C2824(EnAob01* this, PlayState* play);
-void func_809C28B8(EnAob01* this, PlayState* play);
-void func_809C2A64(EnAob01* this, PlayState* play);
-void func_809C2BE4(EnAob01* this, PlayState* play);
-void func_809C2C9C(EnAob01* this, PlayState* play);
-void func_809C2D0C(EnAob01* this, PlayState* play);
-s32 func_809C2EC4(EnAob01* this, PlayState* play);
+void EnAob01_BeforeRace_StartRace(EnAob01* this, PlayState* play);
+void EnAob01_BeforeRace_RespondToPlayAgainQuestion(EnAob01* this, PlayState* play);
+void EnAob01_BeforeRace_Idle(EnAob01* this, PlayState* play);
+void EnAob01_BeforeRace_Talk(EnAob01* this, PlayState* play);
+void EnAob01_Race_SkipNonRaceCutscene(EnAob01* this, PlayState* play);
+void EnAob01_Race_HandleRaceCutscene(EnAob01* this, PlayState* play);
+void EnAob01_Race_HandleRaceEndCutscene(EnAob01* this, PlayState* play);
+void EnAob01_Race_StartCutscene(EnAob01* this, PlayState* play);
+void EnAob01_AfterRace_GiveRaceResult(EnAob01* this, PlayState* play);
+void EnAob01_AfterRace_GiveReward(EnAob01* this, PlayState* play);
+void EnAob01_AfterRace_AfterGivingReward(EnAob01* this, PlayState* play);
+void EnAob01_AfterRace_AskToPlayAgain(EnAob01* this, PlayState* play);
+void EnAob01_AfterRace_Talk(EnAob01* this, PlayState* play);
+s32 EnAob01_PlayerIsHoldingDog(EnAob01* this, PlayState* play);
ActorInit En_Aob_01_InitVars = {
ACTOR_EN_AOB_01,
@@ -46,6 +44,22 @@ ActorInit En_Aob_01_InitVars = {
(ActorFunc)EnAob01_Draw,
};
+typedef enum {
+ /* 0 */ EN_AOB01_ANIM_IDLE_1,
+ /* 1 */ EN_AOB01_ANIM_LAUGH_START,
+ /* 2 */ EN_AOB01_ANIM_LAUGH_LOOP,
+ /* 3 */ EN_AOB01_ANIM_SURPRISE_START,
+ /* 4 */ EN_AOB01_ANIM_SURPRISE_LOOP,
+ /* 5 */ EN_AOB01_ANIM_IDLE_2,
+} EnAob01Animation;
+
+typedef enum {
+ /* 0 */ EN_AOB01_EYE_OPEN,
+ /* 1 */ EN_AOB01_EYE_HALF,
+ /* 2 */ EN_AOB01_EYE_CLOSED,
+ /* 3 */ EN_AOB01_EYE_MAX,
+} EnAob01EyeTexture;
+
static AnimationInfo sAnimationInfo[] = {
{ &gMamamuYanIdleAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f },
{ &gMamamuYanLaughStartAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, 0.0f },
@@ -76,12 +90,16 @@ static ColliderCylinderInit sCylinderInit = {
};
typedef struct {
- Vec3f unk_00;
- s16 unk_04;
- s16 unk_06;
-} EnAobStruct;
+ /* 0x0 */ Vec3f pos;
+ /* 0xC */ s16 rotY;
+ /* 0xE */ s16 pathIndex;
+} DogInfo; // size = 0x10
-static EnAobStruct D_809C384C[] = {
+/**
+ * Stores the starting position, y-rotation, and path index for all 14 dogs in the racetrack.
+ * This actor is responsible for spawning these dogs; they are not spawned as part of the scene.
+ */
+static DogInfo sDogInfo[RACEDOG_COUNT] = {
{ { -4130.0f, 150.0f, 1367.0f }, 84, 0 }, { { -4861.0f, 172.0f, 1606.0f }, 94, 4 },
{ { -4139.0f, 155.0f, 2133.0f }, 73, 6 }, { { -4406.0f, 144.0f, 1416.0f }, 88, 2 },
{ { -4156.0f, 155.0f, 1731.0f }, 42, 0 }, { { -4033.0f, 157.0f, 1994.0f }, -65, 1 },
@@ -91,105 +109,137 @@ static EnAobStruct D_809C384C[] = {
{ { -4827.0f, 168.0f, 1328.0f }, 115, 4 }, { { -4130.0f, 150.0f, 1367.0f }, 112, 0 },
};
-void func_809C10B0(EnAob01* this, s32 arg1) {
+void EnAob01_Blink(EnAob01* this, s32 maxEyeIndex) {
if (DECR(this->blinkTimer) == 0) {
this->eyeIndex++;
- if (this->eyeIndex >= arg1) {
- this->eyeIndex = 0;
+ if (this->eyeIndex >= maxEyeIndex) {
+ this->eyeIndex = EN_AOB01_EYE_OPEN;
this->blinkTimer = Rand_S16Offset(30, 30);
}
}
}
-void func_809C1124(void) {
+/**
+ * Called every frame during the race in order to make in-game time pass.
+ */
+void EnAob01_AdvanceTime(void) {
gSaveContext.save.time = ((void)0, gSaveContext.save.time) + (u16)R_TIME_SPEED;
gSaveContext.save.time = ((void)0, gSaveContext.save.time) + (u16)((void)0, gSaveContext.save.timeSpeedOffset);
}
-void func_809C1158(EnAob01* this, PlayState* play) {
- s32 temp_s0 = ENAOB01_GET_7E00_2(&this->actor);
+/**
+ * Initializes all the paths that the dogs follow.
+ */
+void EnAob01_InitializeDogPaths(EnAob01* this, PlayState* play) {
+ s32 pathIndex = ENAOB01_GET_STARTING_DOG_PATH_INDEX(&this->actor);
s16 i = 0;
- if (temp_s0 != 0x3F) {
+ if (pathIndex != 0x3F) {
do {
- this->unk_1D8[i] = SubS_GetPathByIndex(play, temp_s0, 0x3F);
- temp_s0 = this->unk_1D8[i]->unk1;
+ this->dogPaths[i] = SubS_GetPathByIndex(play, pathIndex, 0x3F);
+ pathIndex = this->dogPaths[i]->unk1;
i++;
- } while (temp_s0 != 0xFF);
+ } while (pathIndex != 0xFF);
}
}
-void func_809C11EC(EnAob01* this, PlayState* play) {
+/**
+ * Spawns the dogs that mill about the racetrack before and after each race.
+ */
+void EnAob01_SpawnDogs(EnAob01* this, PlayState* play) {
s32 enDgParams;
s16 i;
- func_809C1158(this, play);
+ EnAob01_InitializeDogPaths(this, play);
- for (i = 0; i < ARRAY_COUNT(D_809C384C); i++) {
- enDgParams = ENDG_PARAMS(this->unk_1D8[D_809C384C[i].unk_06]->unk1, i);
+ for (i = 0; i < RACEDOG_COUNT; i++) {
+ enDgParams = ENDG_PARAMS(this->dogPaths[sDogInfo[i].pathIndex]->unk1, i);
- this->unk_3F8[i] = Actor_SpawnAsChildAndCutscene(
- &play->actorCtx, play, ACTOR_EN_DG, D_809C384C[i].unk_00.x, D_809C384C[i].unk_00.y, D_809C384C[i].unk_00.z,
- 0, DEG_TO_BINANG(D_809C384C[i].unk_04), 0, enDgParams, (u16)CS_ID_NONE, this->actor.halfDaysBits, NULL);
+ this->dogs[i] = Actor_SpawnAsChildAndCutscene(
+ &play->actorCtx, play, ACTOR_EN_DG, sDogInfo[i].pos.x, sDogInfo[i].pos.y, sDogInfo[i].pos.z, 0,
+ DEG_TO_BINANG(sDogInfo[i].rotY), 0, enDgParams, (u16)CS_ID_NONE, this->actor.halfDaysBits, NULL);
}
}
-void func_809C1304(EnAob01* this, PlayState* play) {
+/**
+ * Spawns the dogs that run around the track during each race.
+ */
+void EnAob01_SpawnRacedogs(EnAob01* this, PlayState* play) {
s16 i;
- for (i = 0; i < ARRAY_COUNT(this->unk_3F8); i++) {
- this->unk_3F8[i] = Actor_SpawnAsChildAndCutscene(
- &play->actorCtx, play, ACTOR_EN_RACEDOG, (i * 15.0f) + -3897.0f, 130.0f, 1290.0f - (i * 10.0f), 0, 0x1555,
- 0, (i << 5) | ENAOB01_GET_7E00_1(&this->actor), (u16)CS_ID_NONE, this->actor.halfDaysBits, NULL);
+ for (i = 0; i < RACEDOG_COUNT; i++) {
+ this->dogs[i] = Actor_SpawnAsChildAndCutscene(&play->actorCtx, play, ACTOR_EN_RACEDOG, (i * 15.0f) + -3897.0f,
+ 130.0f, 1290.0f - (i * 10.0f), 0, 0x1555, 0,
+ ENRACEDOG_PARAMS(i, ENAOB01_GET_RACEDOG_PATH_INDEX(&this->actor)),
+ (u16)CS_ID_NONE, this->actor.halfDaysBits, NULL);
}
}
-s32 func_809C1424(EnAob01* this) {
+/**
+ * If the racetrack owner is at the end of her laugh start animation, this function will
+ * transition her to her laugh loop animation. This function will return true if she is
+ * *either* in her laugh start or laugh loop animation, false otherwise.
+ */
+s32 EnAob01_ProcessLaughAnim(EnAob01* this) {
s16 curFrame = this->skelAnime.curFrame;
- s16 lastFrame = Animation_GetLastFrame(sAnimationInfo[this->unk_43C].animation);
+ s16 lastFrame = Animation_GetLastFrame(sAnimationInfo[this->animIndex].animation);
- if (this->unk_43C == 1) {
+ if (this->animIndex == EN_AOB01_ANIM_LAUGH_START) {
if (curFrame == lastFrame) {
- this->unk_43C = 2;
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 2);
+ this->animIndex = EN_AOB01_ANIM_LAUGH_LOOP;
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, EN_AOB01_ANIM_LAUGH_LOOP);
return true;
}
- } else if (this->unk_43C == 2) {
+ } else if (this->animIndex == EN_AOB01_ANIM_LAUGH_LOOP) {
return true;
}
+
return false;
}
-s32 func_809C14D0(EnAob01* this) {
+/**
+ * If the racetrack owner is at the end of her idle animation, this function will
+ * transition her to her surprise start animation. If the racetrack owner is at the
+ * end of her surprise start animation, this function will transition her to her
+ * surprise loop animation. This function will return true if she is *either* in
+ * her surprise start or surprise loop animation, false otherwise.
+ */
+s32 EnAob01_ProcessSurpriseAnim(EnAob01* this) {
s16 curFrame = this->skelAnime.curFrame;
- s16 lastFrame = Animation_GetLastFrame(sAnimationInfo[this->unk_43C].animation);
+ s16 lastFrame = Animation_GetLastFrame(sAnimationInfo[this->animIndex].animation);
- if ((this->unk_43C == 0) || (this->unk_43C == 5)) {
+ if ((this->animIndex == EN_AOB01_ANIM_IDLE_1) || (this->animIndex == EN_AOB01_ANIM_IDLE_2)) {
if (curFrame == lastFrame) {
- this->unk_43C = 3;
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 3);
+ this->animIndex = EN_AOB01_ANIM_SURPRISE_START;
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, EN_AOB01_ANIM_SURPRISE_START);
return true;
}
- } else if (this->unk_43C == 3) {
+ } else if (this->animIndex == EN_AOB01_ANIM_SURPRISE_START) {
if (curFrame == lastFrame) {
- this->unk_43C = 4;
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 4);
+ this->animIndex = EN_AOB01_ANIM_SURPRISE_LOOP;
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, EN_AOB01_ANIM_SURPRISE_LOOP);
return true;
}
- } else if (this->unk_43C == 4) {
+ } else if (this->animIndex == EN_AOB01_ANIM_SURPRISE_LOOP) {
return true;
}
+
return false;
}
-s32 func_809C15BC(EnAob01* this) {
+/**
+ * If the racetrack owner is at the end of her current animation, this function will
+ * transition her to her the idle animation. This function will return true if she is
+ * in her idle animation, false otherwise.
+ */
+s32 EnAob01_ProcessIdleAnim(EnAob01* this) {
s16 curFrame = this->skelAnime.curFrame;
- s16 lastFrame = Animation_GetLastFrame(sAnimationInfo[this->unk_43C].animation);
+ s16 lastFrame = Animation_GetLastFrame(sAnimationInfo[this->animIndex].animation);
- if ((this->unk_43C != 0) && (this->unk_43C != 5)) {
+ if ((this->animIndex != EN_AOB01_ANIM_IDLE_1) && (this->animIndex != EN_AOB01_ANIM_IDLE_2)) {
if (curFrame == lastFrame) {
- this->unk_43C = 5;
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 5);
+ this->animIndex = EN_AOB01_ANIM_IDLE_2;
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, EN_AOB01_ANIM_IDLE_2);
return true;
}
} else {
@@ -199,7 +249,7 @@ s32 func_809C15BC(EnAob01* this) {
return false;
}
-void func_809C165C(EnAob01* this, PlayState* play) {
+void EnAob01_UpdateCollision(EnAob01* this, PlayState* play) {
this->collider.dim.pos.x = this->actor.world.pos.x;
this->collider.dim.pos.y = this->actor.world.pos.y;
this->collider.dim.pos.z = this->actor.world.pos.z;
@@ -207,227 +257,238 @@ void func_809C165C(EnAob01* this, PlayState* play) {
CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
}
-void func_809C16DC(EnAob01* this, PlayState* play) {
+/**
+ * Handles all parts of the conversation with the racetrack owner before the race begins.
+ */
+void EnAob01_BeforeRace_HandleConversation(EnAob01* this, PlayState* play) {
Player* player = GET_PLAYER(play);
- switch (this->unk_210) {
+ switch (this->textId) {
case 0:
- case 0x3524:
- case 0x3535:
- case 0x3548:
- case 0x3549:
- case 0x354A:
+ case 0x3524: // You can't play if you can't pay!
+ case 0x3535: // Really?
+ case 0x3548: // I can't let you play. (Goron)
+ case 0x3549: // I can't let you play. (Zora)
+ case 0x354A: // I can't let you play. (Deku)
switch (gSaveContext.save.day) {
case 1:
if (!gSaveContext.save.isNight) {
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_64_80)) {
- SET_WEEKEVENTREG(WEEKEVENTREG_64_80);
- this->unk_210 = 0x3520;
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_TALKED_DOGGY_RACETRACK_OWNER_DAY_1)) {
+ SET_WEEKEVENTREG(WEEKEVENTREG_TALKED_DOGGY_RACETRACK_OWNER_DAY_1);
+ this->textId = 0x3520; // This is the Doggy Racetrack. (Day 1)
} else {
- this->unk_210 = 0x352F;
+ this->textId = 0x352F; // What do you want?
}
} else {
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_65_01)) {
- SET_WEEKEVENTREG(WEEKEVENTREG_65_01);
- this->unk_210 = 0x3530;
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_TALKED_DOGGY_RACETRACK_OWNER_NIGHT_1)) {
+ SET_WEEKEVENTREG(WEEKEVENTREG_TALKED_DOGGY_RACETRACK_OWNER_NIGHT_1);
+ this->textId = 0x3530; // This is the Doggy Racetrack. (Night 1)
} else {
- this->unk_210 = 0x352F;
+ this->textId = 0x352F; // What do you want?
}
}
break;
case 2:
if (!gSaveContext.save.isNight) {
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_65_02)) {
- SET_WEEKEVENTREG(WEEKEVENTREG_65_02);
- this->unk_210 = 0x3531;
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_TALKED_DOGGY_RACETRACK_OWNER_DAY_2)) {
+ SET_WEEKEVENTREG(WEEKEVENTREG_TALKED_DOGGY_RACETRACK_OWNER_DAY_2);
+ this->textId = 0x3531; // This is the Doggy Racetrack. (Day 2)
} else {
- this->unk_210 = 0x352F;
+ this->textId = 0x352F; // What do you want?
}
} else {
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_65_04)) {
- SET_WEEKEVENTREG(WEEKEVENTREG_65_04);
- this->unk_210 = 0x3532;
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_TALKED_DOGGY_RACETRACK_OWNER_NIGHT_2)) {
+ SET_WEEKEVENTREG(WEEKEVENTREG_TALKED_DOGGY_RACETRACK_OWNER_NIGHT_2);
+ this->textId = 0x3532; // This is the Doggy Racetrack. (Night 2)
} else {
- this->unk_210 = 0x352F;
+ this->textId = 0x352F; // What do you want?
}
}
break;
case 3:
if (!gSaveContext.save.isNight) {
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_65_08)) {
- SET_WEEKEVENTREG(WEEKEVENTREG_65_08);
- this->unk_210 = 0x3533;
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_TALKED_DOGGY_RACETRACK_OWNER_DAY_3)) {
+ SET_WEEKEVENTREG(WEEKEVENTREG_TALKED_DOGGY_RACETRACK_OWNER_DAY_3);
+ this->textId = 0x3533; // This is the Doggy Racetrack. (Day 3)
} else {
- this->unk_210 = 0x352F;
+ this->textId = 0x352F; // What do you want?
}
} else {
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_65_10)) {
- SET_WEEKEVENTREG(WEEKEVENTREG_65_10);
- this->unk_210 = 0x3534;
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_TALKED_DOGGY_RACETRACK_OWNER_NIGHT_3)) {
+ SET_WEEKEVENTREG(WEEKEVENTREG_TALKED_DOGGY_RACETRACK_OWNER_NIGHT_3);
+ this->textId = 0x3534; // This is the Doggy Racetrack. (Night 3)
} else {
- this->unk_210 = 0x352F;
+ this->textId = 0x352F; // What do you want?
}
}
break;
}
break;
- case 0x3520:
- case 0x352F:
- case 0x3530:
- case 0x3531:
- case 0x3532:
- case 0x3533:
- case 0x3534:
- this->unk_210 = 0x3521;
+ case 0x3520: // This is the Doggy Racetrack. (Day 1)
+ case 0x352F: // What do you want?
+ case 0x3530: // This is the Doggy Racetrack. (Night 1)
+ case 0x3531: // This is the Doggy Racetrack. (Day 2)
+ case 0x3532: // This is the Doggy Racetrack. (Night 2)
+ case 0x3533: // This is the Doggy Racetrack. (Day 3)
+ case 0x3534: // This is the Doggy Racetrack. (Night 3)
+ this->textId = 0x3521; // Do you want to try the dog race?
break;
- case 0x3521:
- if (this->unk_2D2 & 2) {
- this->unk_2D2 &= ~2;
+ case 0x3521: // Do you want to try the dog race?
+ if (this->stateFlags & ENAOB01_FLAG_PLAYER_CONFIRMED_CHOICE) {
+ this->stateFlags &= ~ENAOB01_FLAG_PLAYER_CONFIRMED_CHOICE;
switch (player->transformation) {
case PLAYER_FORM_GORON:
- this->unk_210 = 0x3548;
- this->unk_2D2 |= 0x10;
+ this->textId = 0x3548; // I can't let you play. (Goron)
+ this->stateFlags |= ENAOB01_FLAG_CONVERSATION_OVER;
break;
case PLAYER_FORM_ZORA:
- this->unk_210 = 0x3549;
- this->unk_2D2 |= 0x10;
+ this->textId = 0x3549; // I can't let you play. (Zora)
+ this->stateFlags |= ENAOB01_FLAG_CONVERSATION_OVER;
break;
case PLAYER_FORM_DEKU:
- this->unk_210 = 0x354A;
- this->unk_2D2 |= 0x10;
+ this->textId = 0x354A; // I can't let you play. (Deku)
+ this->stateFlags |= ENAOB01_FLAG_CONVERSATION_OVER;
break;
case PLAYER_FORM_HUMAN:
if (gSaveContext.save.saveInfo.playerData.rupees < 10) {
- this->unk_210 = 0x3524;
- this->unk_2D2 |= 0x10;
+ this->textId = 0x3524; // You can't play if you can't pay!
+ this->stateFlags |= ENAOB01_FLAG_CONVERSATION_OVER;
} else {
- this->unk_210 = 0x3522;
- this->unk_2D2 |= 4;
- this->unk_2D2 |= 0x10;
+ this->textId = 0x3522; // Bring me the fastest dog!
+ this->stateFlags |= ENAOB01_FLAG_PLAYER_TOLD_TO_PICK_A_DOG;
+ this->stateFlags |= ENAOB01_FLAG_CONVERSATION_OVER;
}
}
} else {
- this->unk_2D2 |= 0x10;
- this->unk_210 = 0x3535;
+ this->stateFlags |= ENAOB01_FLAG_CONVERSATION_OVER;
+ this->textId = 0x3535; // Is that dog fine?
}
break;
- case 0x3522:
- case 0x3523:
- if (this->unk_2D2 & 8) {
- this->unk_210 = 0x3525;
+ case 0x3522: // Bring me the fastest dog!
+ case 0x3523: // Hurry up and bring me a dog!
+ if (this->stateFlags & ENAOB01_FLAG_TALKING_TO_PLAYER_HOLDING_DOG) {
+ this->textId = 0x3525; // Is that dog okay?
break;
}
- this->unk_210 = 0x3523;
- this->unk_2D2 |= 0x40;
- this->unk_2D2 |= 0x10;
- this->unk_43C = 1;
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 1);
+ this->textId = 0x3523; // Hurry up and bring me a dog!
+ this->stateFlags |= ENAOB01_FLAG_LAUGH;
+ this->stateFlags |= ENAOB01_FLAG_CONVERSATION_OVER;
+ this->animIndex = EN_AOB01_ANIM_LAUGH_START;
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, EN_AOB01_ANIM_LAUGH_START);
break;
- case 0x3525:
- case 0x3526:
- if (this->unk_2D2 & 4) {
- if (this->unk_2D2 & 8) {
- this->unk_210 = 0x3525;
+ case 0x3525: // Is that dog okay?
+ case 0x3526: // Don't wait! Hurry up and choose!
+ if (this->stateFlags & ENAOB01_FLAG_PLAYER_TOLD_TO_PICK_A_DOG) {
+ if (this->stateFlags & ENAOB01_FLAG_TALKING_TO_PLAYER_HOLDING_DOG) {
+ this->textId = 0x3525; // Is that dog okay?
break;
}
- this->unk_210 = 0x3523;
- this->unk_2D2 |= 0x40;
- this->unk_2D2 |= 0x10;
- this->unk_43C = 1;
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 1);
+ this->textId = 0x3523; // Hurry up and bring me a dog!
+ this->stateFlags |= ENAOB01_FLAG_LAUGH;
+ this->stateFlags |= ENAOB01_FLAG_CONVERSATION_OVER;
+ this->animIndex = EN_AOB01_ANIM_LAUGH_START;
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, EN_AOB01_ANIM_LAUGH_START);
break;
}
- if (this->unk_2D2 & 2) {
- this->unk_2D2 &= ~2;
- this->unk_210 = 0x3527;
+ if (this->stateFlags & ENAOB01_FLAG_PLAYER_CONFIRMED_CHOICE) {
+ this->stateFlags &= ~ENAOB01_FLAG_PLAYER_CONFIRMED_CHOICE;
+ this->textId = 0x3527; // If you win, you'll get more than you bet.
break;
}
- this->unk_210 = 0x3526;
- this->unk_2D2 |= 0x40;
- this->unk_2D2 |= 4;
- this->unk_2D2 |= 0x10;
- this->unk_43C = 1;
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 1);
+ this->textId = 0x3526; // Don't wait! Hurry up and choose!
+ this->stateFlags |= ENAOB01_FLAG_LAUGH;
+ this->stateFlags |= ENAOB01_FLAG_PLAYER_TOLD_TO_PICK_A_DOG;
+ this->stateFlags |= ENAOB01_FLAG_CONVERSATION_OVER;
+ this->animIndex = EN_AOB01_ANIM_LAUGH_START;
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, EN_AOB01_ANIM_LAUGH_START);
break;
- case 0x3527:
- this->unk_210 = 0x3528;
+ case 0x3527: // If you win, you'll get more than you bet.
+ this->textId = 0x3528; // How much will you bet?
break;
- case 0x3528:
- if (gSaveContext.save.saveInfo.playerData.rupees < this->unk_434) {
- this->unk_210 = 0x3536;
- this->unk_2D2 |= 0x40;
- this->unk_43C = 1;
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 1);
+ case 0x3528: // How much will you bet?
+ if (gSaveContext.save.saveInfo.playerData.rupees < this->rupeesBet) {
+ this->textId = 0x3536; // You don't have enough rupees for that bet.
+ this->stateFlags |= ENAOB01_FLAG_LAUGH;
+ this->animIndex = EN_AOB01_ANIM_LAUGH_START;
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, EN_AOB01_ANIM_LAUGH_START);
break;
}
- if (this->unk_434 == 0) {
- this->unk_210 = 0x3537;
- this->unk_2D2 |= 0x40;
- this->unk_43C = 1;
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 1);
+ if (this->rupeesBet == 0) {
+ this->textId = 0x3537; // You can't race if you don't bet.
+ this->stateFlags |= ENAOB01_FLAG_LAUGH;
+ this->animIndex = EN_AOB01_ANIM_LAUGH_START;
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, EN_AOB01_ANIM_LAUGH_START);
break;
}
- gSaveContext.unk_3F5C = this->unk_434;
- play->msgCtx.bankRupees = this->unk_434;
- this->unk_210 = 0x3529;
+ gSaveContext.unk_3F5C = this->rupeesBet;
+ play->msgCtx.bankRupees = this->rupeesBet;
+ this->textId = 0x3529; // Is that bet okay?
break;
- case 0x3529:
- if (this->unk_2D2 & 2) {
- this->unk_2D2 &= ~2;
- Rupees_ChangeBy(-this->unk_434);
+ case 0x3529: // Is that bet okay?
+ if (this->stateFlags & ENAOB01_FLAG_PLAYER_CONFIRMED_CHOICE) {
+ this->stateFlags &= ~ENAOB01_FLAG_PLAYER_CONFIRMED_CHOICE;
+ Rupees_ChangeBy(-this->rupeesBet);
func_800B7298(play, NULL, PLAYER_CSMODE_WAIT);
play->msgCtx.msgMode = 0x43;
play->msgCtx.stateTimer = 4;
- this->actionFunc = func_809C1C9C;
+ this->actionFunc = EnAob01_BeforeRace_StartRace;
return;
}
- this->unk_210 = 0x3528;
+ this->textId = 0x3528; // How much will you bet?
break;
- case 0x3536:
- case 0x3537:
- this->unk_210 = 0x3528;
+ case 0x3536: // You don't have enough rupees for that bet.
+ case 0x3537: // You can't race if you don't bet.
+ this->textId = 0x3528; // How much will you bet?
break;
}
- Message_StartTextbox(play, this->unk_210, &this->actor);
+ Message_StartTextbox(play, this->textId, &this->actor);
}
-void func_809C1C9C(EnAob01* this, PlayState* play) {
+/**
+ * Once the player's rupees are done counting down, this function will
+ * reload the racetrack to start the race.
+ */
+void EnAob01_BeforeRace_StartRace(EnAob01* this, PlayState* play) {
if (gSaveContext.rupeeAccumulator == 0) {
SET_WEEKEVENTREG(WEEKEVENTREG_KICKOUT_WAIT);
CLEAR_WEEKEVENTREG(WEEKEVENTREG_KICKOUT_TIME_PASSED);
- this->unk_2D2 |= 0x20;
- func_800FD750(0x40);
+ this->stateFlags |= ENAOB01_FLAG_STARTED_RACE;
+ func_800FD750(NA_BGM_HORSE);
play->nextEntrance = ENTRANCE(DOGGY_RACETRACK, 1);
play->transitionType = TRANS_TYPE_64;
gSaveContext.nextTransitionType = TRANS_TYPE_64;
- gSaveContext.eventInf[0] = (gSaveContext.eventInf[0] & (u8)~7) | 2;
- gSaveContext.eventInf[0] = (gSaveContext.eventInf[0] & 7) | (this->unk_432 * 8);
+ SET_EVENTINF_DOG_RACE_STATE(EVENTINF_DOG_RACE_STATE_STARTED);
+ SET_EVENTINF_DOG_RACE_SELECTED_DOG_INDEX(this->selectedDogIndex);
play->transitionTrigger = TRANS_TRIGGER_START;
}
}
-void func_809C1D64(EnAob01* this, PlayState* play) {
+/**
+ * Handles the player's response to the question of whether or not they want to play again.
+ * Once the textbox closes, the racetrack owner will go back to being idle.
+ */
+void EnAob01_BeforeRace_RespondToPlayAgainQuestion(EnAob01* this, PlayState* play) {
u8 talkState = Message_GetState(&play->msgCtx);
if (talkState == TEXT_STATE_CHOICE) {
@@ -436,34 +497,38 @@ void func_809C1D64(EnAob01* this, PlayState* play) {
case 0:
if (gSaveContext.save.saveInfo.playerData.rupees < 10) {
play_sound(NA_SE_SY_ERROR);
- this->unk_210 = 0x3524;
- Message_StartTextbox(play, this->unk_210, &this->actor);
+ this->textId = 0x3524; // You can't play if you can't pay!
+ Message_StartTextbox(play, this->textId, &this->actor);
} else {
func_8019F208();
- this->unk_2D2 |= 4;
- this->unk_2D2 |= 0x10;
- this->unk_210 = 0x3522;
- Message_StartTextbox(play, this->unk_210, &this->actor);
- this->actionFunc = func_809C21E0;
+ this->stateFlags |= ENAOB01_FLAG_PLAYER_TOLD_TO_PICK_A_DOG;
+ this->stateFlags |= ENAOB01_FLAG_CONVERSATION_OVER;
+ this->textId = 0x3522; // Bring me the fastest dog!
+ Message_StartTextbox(play, this->textId, &this->actor);
+ this->actionFunc = EnAob01_BeforeRace_Talk;
}
break;
case 1:
func_8019F230();
- this->unk_210 = 0x3535;
- Message_StartTextbox(play, this->unk_210, &this->actor);
+ this->textId = 0x3535; // Really?
+ Message_StartTextbox(play, this->textId, &this->actor);
break;
}
}
} else if ((talkState == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
play->msgCtx.msgMode = 0x43;
play->msgCtx.stateTimer = 4;
- this->unk_210 = 0;
- this->actionFunc = func_809C2060;
+ this->textId = 0;
+ this->actionFunc = EnAob01_BeforeRace_Idle;
}
}
-void func_809C1EC8(EnAob01* this, PlayState* play) {
+/**
+ * Handles various things that are common to all action functions, like tracking the
+ * player, blinking, handling collision, etc.
+ */
+void EnAob01_UpdateCommon(EnAob01* this, PlayState* play) {
static TrackOptionsSet sTrackOptions = {
{ 0xFA0, 4, 1, 3 },
{ 0x1770, 4, 1, 6 },
@@ -474,6 +539,7 @@ void func_809C1EC8(EnAob01* this, PlayState* play) {
Vec3f point;
SkelAnime_Update(&this->skelAnime);
+
if (SubS_AngleDiffLessEqual(this->actor.shape.rot.y, 0x36B0, this->actor.yawTowardsPlayer)) {
point.x = player->actor.world.pos.x;
point.y = player->bodyPartsPos[PLAYER_BODYPART_HEAD].y + 3.0f;
@@ -488,124 +554,152 @@ void func_809C1EC8(EnAob01* this, PlayState* play) {
Math_SmoothStepToS(&this->torsoRot.x, 0, 4, 0x3E8, 1);
Math_SmoothStepToS(&this->torsoRot.y, 0, 4, 0x3E8, 1);
}
- func_809C10B0(this, 3);
- SubS_FillLimbRotTables(play, this->unk_2F8, this->unk_318, ARRAY_COUNT(this->unk_2F8));
- func_809C165C(this, play);
+
+ EnAob01_Blink(this, EN_AOB01_EYE_MAX);
+ SubS_FillLimbRotTables(play, this->limbRotTableY, this->limbRotTableZ, ARRAY_COUNT(this->limbRotTableY));
+ EnAob01_UpdateCollision(this, play);
+
+ // This specific code ensures that in-game time passes during the race.
if (player->stateFlags1 & PLAYER_STATE1_20) {
- func_809C1124();
+ EnAob01_AdvanceTime();
}
}
-void func_809C2060(EnAob01* this, PlayState* play) {
- if (func_809C15BC(this)) {
- if (func_809C2EC4(this, play) && !(this->unk_2D2 & 0x100)) {
+/**
+ * Stand around and wait until either the player talks to the racetrack owner or until
+ * the player bumps into them while holding a dog. In either case, the racetrack owner
+ * will then start talking with the player.
+ */
+void EnAob01_BeforeRace_Idle(EnAob01* this, PlayState* play) {
+ if (EnAob01_ProcessIdleAnim(this)) {
+ if (EnAob01_PlayerIsHoldingDog(this, play) && !(this->stateFlags & ENAOB01_FLAG_PLAYER_CAN_TALK)) {
if (this->collider.base.ocFlags2 & OC2_HIT_PLAYER) {
this->actor.flags |= ACTOR_FLAG_10000;
func_800B8614(&this->actor, play, 100.0f);
- this->unk_2D2 |= 8;
- this->actionFunc = func_809C21E0;
+ this->stateFlags |= ENAOB01_FLAG_TALKING_TO_PLAYER_HOLDING_DOG;
+ this->actionFunc = EnAob01_BeforeRace_Talk;
}
- } else if (Actor_ProcessTalkRequest(&this->actor, &play->state) && (this->unk_2D2 & 0x100)) {
- this->unk_2D2 &= ~0x100;
- this->unk_2E6 = this->trackTarget;
- this->unk_2EC = this->headRot;
- this->unk_2F2 = this->torsoRot;
- func_809C16DC(this, play);
- this->actionFunc = func_809C21E0;
+ } else if (Actor_ProcessTalkRequest(&this->actor, &play->state) &&
+ (this->stateFlags & ENAOB01_FLAG_PLAYER_CAN_TALK)) {
+ this->stateFlags &= ~ENAOB01_FLAG_PLAYER_CAN_TALK;
+ this->prevTrackTarget = this->trackTarget;
+ this->prevHeadRot = this->headRot;
+ this->prevTorsoRot = this->torsoRot;
+ EnAob01_BeforeRace_HandleConversation(this, play);
+ this->actionFunc = EnAob01_BeforeRace_Talk;
} else {
- this->unk_2D2 &= ~0x100;
+ this->stateFlags &= ~ENAOB01_FLAG_PLAYER_CAN_TALK;
if ((this->actor.xzDistToPlayer < 100.0f) && !(this->collider.base.ocFlags2 & OC2_HIT_PLAYER)) {
- this->unk_2D2 |= 0x100;
+ this->stateFlags |= ENAOB01_FLAG_PLAYER_CAN_TALK;
func_800B8614(&this->actor, play, 100.0f);
}
}
}
}
-void func_809C21E0(EnAob01* this, PlayState* play) {
+/**
+ * Handles the actual action of talking with the player before the race begins.
+ */
+void EnAob01_BeforeRace_Talk(EnAob01* this, PlayState* play) {
u8 talkState = Message_GetState(&play->msgCtx);
Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 4, 4000, 1);
- if ((this->unk_2D2 & 8) && !func_809C2EC4(this, play)) {
- if ((this->unk_210 != 0) && (this->unk_210 != 0x3535) && (this->unk_210 != 0x3524) &&
- (this->unk_210 != 0x3548) && (this->unk_210 != 0x3549) && (this->unk_210 != 0x354A)) {
- this->unk_210 = 0x3523;
+ //! @bug: This block of code acts as a failsafe for when the player triggered this conversation by
+ //! bumping into the racetrack owner while holding the dog and, at the same time, threw or dropped
+ //! the dog frame-perfectly by pressing A. In this case, the code successfully returns the racetrack
+ //! owner to her idle state. Unfortunately, the player can also drop the dog by shielding. If this
+ //! shield drop is done frame-perfectly, then the below code will not function properly and will
+ //! instead softlock the game.
+ if ((this->stateFlags & ENAOB01_FLAG_TALKING_TO_PLAYER_HOLDING_DOG) && !EnAob01_PlayerIsHoldingDog(this, play)) {
+ if ((this->textId != 0) && (this->textId != 0x3535) && (this->textId != 0x3524) && (this->textId != 0x3548) &&
+ (this->textId != 0x3549) && (this->textId != 0x354A)) {
+ this->textId = 0x3523; // Hurry up and bring me a dog!
}
+
this->actor.textId = 0;
- this->unk_2D2 &= ~8;
+ this->stateFlags &= ~ENAOB01_FLAG_TALKING_TO_PLAYER_HOLDING_DOG;
this->actor.flags &= ~ACTOR_FLAG_10000;
- this->actionFunc = func_809C2060;
+ this->actionFunc = EnAob01_BeforeRace_Idle;
return;
}
- if (this->unk_2D2 & 0x40) {
- if (!func_809C1424(this)) {
+ if (this->stateFlags & ENAOB01_FLAG_LAUGH) {
+ if (!EnAob01_ProcessLaughAnim(this)) {
return;
}
- } else if (!func_809C15BC(this)) {
+ } else if (!EnAob01_ProcessIdleAnim(this)) {
return;
}
- if (this->unk_2D2 & 8) {
+ if (this->stateFlags & ENAOB01_FLAG_TALKING_TO_PLAYER_HOLDING_DOG) {
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
this->actor.flags &= ~ACTOR_FLAG_10000;
func_80123E90(play, &this->actor);
- if (this->unk_2D2 & 4) {
- func_809C16DC(this, play);
- this->unk_2D2 &= ~4;
+ if (this->stateFlags & ENAOB01_FLAG_PLAYER_TOLD_TO_PICK_A_DOG) {
+ EnAob01_BeforeRace_HandleConversation(this, play);
+ this->stateFlags &= ~ENAOB01_FLAG_PLAYER_TOLD_TO_PICK_A_DOG;
} else {
- this->unk_2D2 |= 0x10;
- this->unk_2D2 |= 0x40;
- this->unk_43C = 1;
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 1);
+ this->stateFlags |= ENAOB01_FLAG_CONVERSATION_OVER;
+ this->stateFlags |= ENAOB01_FLAG_LAUGH;
+ this->animIndex = EN_AOB01_ANIM_LAUGH_START;
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, EN_AOB01_ANIM_LAUGH_START);
+ // Put my dog down!
Message_StartTextbox(play, 0x354B, &this->actor);
}
- this->unk_2D2 &= ~8;
+
+ this->stateFlags &= ~ENAOB01_FLAG_TALKING_TO_PLAYER_HOLDING_DOG;
}
} else if (talkState == TEXT_STATE_CHOICE) {
if (Message_ShouldAdvance(play)) {
- this->unk_2D2 &= ~0x40;
+ this->stateFlags &= ~ENAOB01_FLAG_LAUGH;
switch (play->msgCtx.choiceIndex) {
case 0:
func_8019F208();
- this->unk_2D2 |= 2;
- func_809C16DC(this, play);
+ this->stateFlags |= ENAOB01_FLAG_PLAYER_CONFIRMED_CHOICE;
+ EnAob01_BeforeRace_HandleConversation(this, play);
break;
case 1:
func_8019F230();
- func_809C16DC(this, play);
+ EnAob01_BeforeRace_HandleConversation(this, play);
break;
}
}
} else if (talkState == TEXT_STATE_5) {
if (Message_ShouldAdvance(play)) {
- this->unk_2D2 &= ~0x40;
- if (this->unk_2D2 & 0x10) {
- this->unk_2D2 &= ~0x10;
+ this->stateFlags &= ~ENAOB01_FLAG_LAUGH;
+ if (this->stateFlags & ENAOB01_FLAG_CONVERSATION_OVER) {
+ this->stateFlags &= ~ENAOB01_FLAG_CONVERSATION_OVER;
play->msgCtx.msgMode = 0x43;
play->msgCtx.stateTimer = 4;
- this->actionFunc = func_809C2060;
+ this->actionFunc = EnAob01_BeforeRace_Idle;
} else {
- func_809C16DC(this, play);
+ EnAob01_BeforeRace_HandleConversation(this, play);
}
}
} else if ((talkState == TEXT_STATE_14) && Message_ShouldAdvance(play)) {
- this->unk_2D2 &= ~0x40;
- this->unk_434 = play->msgCtx.bankRupeesSelected;
- func_809C16DC(this, play);
+ this->stateFlags &= ~ENAOB01_FLAG_LAUGH;
+ this->rupeesBet = play->msgCtx.bankRupeesSelected;
+ EnAob01_BeforeRace_HandleConversation(this, play);
}
}
-s32 func_809C2504(EnAob01* this, PlayState* play) {
+/**
+ * Checks all dog instances to see if any of them have reached a certain point along the racetrack,
+ * as specified by the cutscene's custom value. Once one of them has reached that point, this function
+ * will switch to following that dog and set the csId to correspond to the next cutscene in the race
+ * sequence; this usually appears to the user as a cut to a different camera angle. Returns true if any
+ * dog has reached the specified point, false otherwise.
+ */
+s32 EnAob01_Race_DogHasReachedNextCutsceneTrigger(EnAob01* this, PlayState* play) {
Actor* npc = play->actorCtx.actorLists[ACTORCAT_NPC].first;
while (npc != NULL) {
if ((npc->id == ACTOR_EN_RACEDOG) &&
(CutsceneManager_GetCutsceneCustomValue(this->csId) == ((EnRacedog*)npc)->currentPoint)) {
CutsceneManager_Stop(this->csId);
- this->unk_3F4 = npc;
+ this->dogToFollow = npc;
this->csId = CutsceneManager_GetAdditionalCsId(this->csId);
return true;
}
@@ -615,12 +709,17 @@ s32 func_809C2504(EnAob01* this, PlayState* play) {
return false;
}
-s32 func_809C2594(EnAob01* this, PlayState* play) {
+/**
+ * Finds the dog that the player selected and starts following it. Returns true if it finds the player's
+ * selected dog and false otherwise, though nothing actually cares about this return value, and it should
+ * always be true in normal function (it is impossible to start a race without selecting a dog).
+ */
+s32 EnAob01_Race_FollowSelectedDog(EnAob01* this, PlayState* play) {
Actor* npc = play->actorCtx.actorLists[ACTORCAT_NPC].first;
while (npc != NULL) {
if ((npc->id == ACTOR_EN_RACEDOG) && (((EnRacedog*)npc)->index == ((EnRacedog*)npc)->selectedDogIndex)) {
- this->unk_3F4 = npc;
+ this->dogToFollow = npc;
return true;
}
npc = npc->next;
@@ -629,28 +728,41 @@ s32 func_809C2594(EnAob01* this, PlayState* play) {
return false;
}
-s32 func_809C25E4(EnAob01* this, PlayState* play) {
+/**
+ * Returns true if the race should be ended, which can happen in either of the following circumstances:
+ * - All `RACEDOG_COUNT` dogs have finished the race.
+ * - At least 10 dogs have finished the race, and at least 500 frames have passed since the 10th place
+ * dog finished. This is controlled by the forceRaceEndTimer, which is set in EnAob01_Init.
+ */
+s32 EnAob01_Race_IsRaceOver(EnAob01* this, PlayState* play) {
Actor* npc = play->actorCtx.actorLists[ACTORCAT_NPC].first;
- s16 count = 0;
+ s16 finishedCount = 0;
while (npc != NULL) {
if ((npc->id == ACTOR_EN_RACEDOG) && (((EnRacedog*)npc)->raceStatus == RACEDOG_RACE_STATUS_FINISHED)) {
- count++;
+ finishedCount++;
}
npc = npc->next;
}
- if (count >= 14) {
+ if (finishedCount >= RACEDOG_COUNT) {
return true;
}
- if ((count >= 10) && (DECR(this->unk_440) == 0)) {
+ if ((finishedCount >= 10) && (DECR(this->forceRaceEndTimer) == 0)) {
return true;
}
+
return false;
}
-s32 func_809C2680(EnAob01* this) {
+/**
+ * If the current cutscene has a positive length, and if the current cutscene is over (in other words,
+ * if the length has elapsed), this function will set the csId to the next cutscene in the race sequence
+ * and return true. In all other cases, it will return false. Note that *all* of the race cutscenes have
+ * a length of -1, so in practice, this function never does anything and always returns false.
+ */
+s32 EnAob01_Race_CurrentCutsceneHasEnded(EnAob01* this) {
if ((CutsceneManager_GetLength(this->csId) > 0) && (CutsceneManager_GetCurrentCsId() != this->csId)) {
this->csId = CutsceneManager_GetAdditionalCsId(this->csId);
return true;
@@ -658,25 +770,40 @@ s32 func_809C2680(EnAob01* this) {
return false;
}
-void func_809C26E4(EnAob01* this, PlayState* play) {
+/**
+ * The only way we end up inside this function is if we tried to start a cutscene with a custom
+ * value of 255. This does not correspond to a point on the racetrack, nor is it the special value
+ * of 99, which is used to signal the race ending cutscene. Thus, whatever cutscene we're trying
+ * to play here is almost certainly not a race cutscene, so this function just skips it and tries
+ * to play the next cutscene.
+ */
+void EnAob01_Race_SkipNonRaceCutscene(EnAob01* this, PlayState* play) {
CutsceneManager_Stop(this->csId);
this->csId = CutsceneManager_GetAdditionalCsId(this->csId);
- this->actionFunc = func_809C2824;
+ this->actionFunc = EnAob01_Race_StartCutscene;
}
-void func_809C2730(EnAob01* this, PlayState* play) {
- if (func_809C2504(this, play) || func_809C2680(this)) {
+/**
+ * Wait around doing nothing until the next cutscene is triggered (in practice, this only happens
+ * when a dog reaches the next cutscene trigger), at which point we queue up the next cutscene.
+ */
+void EnAob01_Race_HandleRaceCutscene(EnAob01* this, PlayState* play) {
+ if (EnAob01_Race_DogHasReachedNextCutsceneTrigger(this, play) || EnAob01_Race_CurrentCutsceneHasEnded(this)) {
CutsceneManager_Queue(this->csId);
- this->actionFunc = func_809C2824;
+ this->actionFunc = EnAob01_Race_StartCutscene;
}
}
-void func_809C2788(EnAob01* this, PlayState* play) {
- this->unk_2D2 |= 0x20;
- if (func_809C25E4(this, play)) {
+/**
+ * Waits until the race is over, then reloads the racetrack to return it
+ * to its regular playable state.
+ */
+void EnAob01_Race_HandleRaceEndCutscene(EnAob01* this, PlayState* play) {
+ this->stateFlags |= ENAOB01_FLAG_STARTED_RACE;
+ if (EnAob01_Race_IsRaceOver(this, play)) {
if (AudioSeq_GetActiveSeqId(SEQ_PLAYER_BGM_MAIN) != NA_BGM_HORSE_GOAL) {
play->nextEntrance = ENTRANCE(DOGGY_RACETRACK, 1);
- gSaveContext.eventInf[0] = (gSaveContext.eventInf[0] & (u8)~7) | 3;
+ SET_EVENTINF_DOG_RACE_STATE(EVENTINF_DOG_RACE_STATE_ENDED);
play->transitionType = TRANS_TYPE_64;
gSaveContext.nextTransitionType = TRANS_TYPE_FADE_WHITE;
play->transitionTrigger = TRANS_TRIGGER_START;
@@ -684,93 +811,109 @@ void func_809C2788(EnAob01* this, PlayState* play) {
}
}
-void func_809C2824(EnAob01* this, PlayState* play) {
+/**
+ * Starts the cutscene specified by the csId and switches to an appropriate
+ * action function based on the cutscene's custom value.
+ */
+void EnAob01_Race_StartCutscene(EnAob01* this, PlayState* play) {
if (CutsceneManager_IsNext(this->csId)) {
- CutsceneManager_Start(this->csId, this->unk_3F4);
+ CutsceneManager_Start(this->csId, this->dogToFollow);
switch (CutsceneManager_GetCutsceneCustomValue(this->csId)) {
case 255:
- this->actionFunc = func_809C26E4;
+ this->actionFunc = EnAob01_Race_SkipNonRaceCutscene;
break;
case 99:
- this->actionFunc = func_809C2788;
+ this->actionFunc = EnAob01_Race_HandleRaceEndCutscene;
break;
default:
- this->actionFunc = func_809C2730;
+ this->actionFunc = EnAob01_Race_HandleRaceCutscene;
}
} else {
CutsceneManager_Queue(this->csId);
}
}
-void func_809C28B8(EnAob01* this, PlayState* play) {
+/**
+ * Tells the player how their selected dog did in the race and gives the player
+ * rupees depending on their performance. If their dog placed 1st, they will
+ * receive triple the rupees they bet. If their dog places 2nd, they will receive
+ * double the rupees they bet. If their dog places 3rd through 5th, they will
+ * receive the same number of rupees they bet.
+ */
+void EnAob01_AfterRace_GiveRaceResult(EnAob01* this, PlayState* play) {
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
this->actor.flags &= ~ACTOR_FLAG_10000;
func_80123E90(play, &this->actor);
- this->unk_434 = gSaveContext.unk_3F5C;
- switch ((gSaveContext.eventInf[0] & 0xF8) >> 3) {
+ this->rupeesBet = gSaveContext.unk_3F5C;
+ switch (GET_EVENTINF_DOG_RACE_RACE_STANDING) {
case 1:
- this->unk_210 = 0x352A;
- this->unk_2D2 |= 0x80;
- this->unk_434 *= 3;
- Rupees_ChangeBy(this->unk_434);
- play->msgCtx.bankRupees = this->unk_434;
+ this->textId = 0x352A; // You took 1st place!
+ this->stateFlags |= ENAOB01_FLAG_SURPRISE;
+ this->rupeesBet *= 3;
+ Rupees_ChangeBy(this->rupeesBet);
+ play->msgCtx.bankRupees = this->rupeesBet;
break;
case 2:
- this->unk_210 = 0x352B;
- this->unk_2D2 |= 0x80;
- this->unk_434 *= 2;
- Rupees_ChangeBy(this->unk_434);
- play->msgCtx.bankRupees = this->unk_434;
+ this->textId = 0x352B; // You took 2nd place!
+ this->stateFlags |= ENAOB01_FLAG_SURPRISE;
+ this->rupeesBet *= 2;
+ Rupees_ChangeBy(this->rupeesBet);
+ play->msgCtx.bankRupees = this->rupeesBet;
break;
case 3:
case 4:
case 5:
- this->unk_210 = 0x352C;
- Rupees_ChangeBy(this->unk_434);
+ this->textId = 0x352C; // I'll give you back what you bet.
+ Rupees_ChangeBy(this->rupeesBet);
break;
default:
- this->unk_210 = 0x352D;
- this->unk_2D2 |= 0x40;
- this->unk_43C = 1;
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 1);
+ this->textId = 0x352D; // Bad choice!
+ this->stateFlags |= ENAOB01_FLAG_LAUGH;
+ this->animIndex = EN_AOB01_ANIM_LAUGH_START;
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, EN_AOB01_ANIM_LAUGH_START);
break;
}
- Message_StartTextbox(play, this->unk_210, &this->actor);
- this->actionFunc = func_809C2D0C;
+ Message_StartTextbox(play, this->textId, &this->actor);
+ this->actionFunc = EnAob01_AfterRace_Talk;
} else if (this->actor.xzDistToPlayer < 100.0f) {
func_800B8614(&this->actor, play, 100.0f);
}
}
-void func_809C2A64(EnAob01* this, PlayState* play) {
+/**
+ * Gives the player the reward for winning 150 or more rupees from the dog race. The first
+ * time this happens, the player will receive a Heart Piece; any other time, they will
+ * instead receive a Red Rupee.
+ */
+void EnAob01_AfterRace_GiveReward(EnAob01* this, PlayState* play) {
u8 talkState = Message_GetState(&play->msgCtx);
- if (func_809C15BC(this)) {
+ if (EnAob01_ProcessIdleAnim(this)) {
if ((talkState == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
- this->unk_434 = 0;
+ this->rupeesBet = 0;
play->msgCtx.msgMode = 0x43;
play->msgCtx.stateTimer = 4;
}
if (Actor_HasParent(&this->actor, play)) {
- this->trackTarget = this->unk_2E6;
- this->headRot = this->unk_2EC;
- this->torsoRot = this->unk_2F2;
+ this->trackTarget = this->prevTrackTarget;
+ this->headRot = this->prevHeadRot;
+ this->torsoRot = this->prevTorsoRot;
this->actor.parent = NULL;
this->actor.shape.rot.y = this->actor.world.rot.y;
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_08_20)) {
- this->actionFunc = func_809C2BE4;
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_RECEIVED_DOGGY_RACETRACK_HEART_PIECE)) {
+ this->actionFunc = EnAob01_AfterRace_AfterGivingReward;
} else {
- SET_WEEKEVENTREG(WEEKEVENTREG_08_20);
- this->actionFunc = func_809C2BE4;
+ SET_WEEKEVENTREG(WEEKEVENTREG_RECEIVED_DOGGY_RACETRACK_HEART_PIECE);
+ this->actionFunc = EnAob01_AfterRace_AfterGivingReward;
}
- } else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_08_20)) {
+ } else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_RECEIVED_DOGGY_RACETRACK_HEART_PIECE)) {
Actor_OfferGetItem(&this->actor, play, GI_RUPEE_RED, 300.0f, 300.0f);
} else {
Actor_OfferGetItem(&this->actor, play, GI_HEART_PIECE, 300.0f, 300.0f);
@@ -778,7 +921,12 @@ void func_809C2A64(EnAob01* this, PlayState* play) {
}
}
-void func_809C2BE4(EnAob01* this, PlayState* play) {
+/**
+ * If the current time is after the racetrack closes, kick the player out.
+ * Otherwise, ask the player if they want to play again. This function is
+ * only used when the player has won the 150 rupee reward.
+ */
+void EnAob01_AfterRace_AfterGivingReward(EnAob01* this, PlayState* play) {
u8 talkState = Message_GetState(&play->msgCtx);
if (((talkState == TEXT_STATE_5) || (talkState == TEXT_STATE_DONE)) && Message_ShouldAdvance(play)) {
@@ -790,51 +938,63 @@ void func_809C2BE4(EnAob01* this, PlayState* play) {
CLEAR_WEEKEVENTREG(WEEKEVENTREG_KICKOUT_WAIT);
}
- this->unk_210 = 0;
+ this->textId = 0;
func_800B85E0(&this->actor, play, 400.0f, PLAYER_IA_MINUS1);
- gSaveContext.eventInf[0] &= (u8)~7;
- this->actionFunc = func_809C2C9C;
+ SET_EVENTINF_DOG_RACE_STATE(EVENTINF_DOG_RACE_STATE_NOT_STARTED);
+ this->actionFunc = EnAob01_AfterRace_AskToPlayAgain;
}
}
-void func_809C2C9C(EnAob01* this, PlayState* play) {
+/**
+ * Ask if the player wants to play again. This function is only used when
+ * the player has won the 150 rupee reward.
+ */
+void EnAob01_AfterRace_AskToPlayAgain(EnAob01* this, PlayState* play) {
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
- this->unk_210 = 0x354C;
- Message_ContinueTextbox(play, this->unk_210);
- this->actionFunc = func_809C1D64;
+ this->textId = 0x354C; // Want to play again?
+ Message_ContinueTextbox(play, this->textId);
+ this->actionFunc = EnAob01_BeforeRace_RespondToPlayAgainQuestion;
} else {
func_800B85E0(&this->actor, play, 400.0f, PLAYER_IA_MINUS1);
}
}
-void func_809C2D0C(EnAob01* this, PlayState* play) {
+/**
+ * Handles the conversation the racetrack owner has with the player after the race
+ * is over. If the player won 150 or more rupees, this function will transition to
+ * the action function that gives them the reward. If the player did *not* win 150
+ * or more rupees, then if the current time is after the racetrack closes, this
+ * kicks the player out. Otherwise, this asks the player if they want to play again.
+ * Much of the logic here is duplicated in the above two functions.
+ */
+void EnAob01_AfterRace_Talk(EnAob01* this, PlayState* play) {
u8 talkState = Message_GetState(&play->msgCtx);
Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 4, 4000, 1);
- if (this->unk_2D2 & 0x40) {
- if (!func_809C1424(this)) {
+ if (this->stateFlags & ENAOB01_FLAG_LAUGH) {
+ if (!EnAob01_ProcessLaughAnim(this)) {
return;
}
- } else if (this->unk_2D2 & 0x80) {
- if (!func_809C14D0(this)) {
+ } else if (this->stateFlags & ENAOB01_FLAG_SURPRISE) {
+ if (!EnAob01_ProcessSurpriseAnim(this)) {
return;
}
}
if ((talkState == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
- this->unk_2D2 &= ~0x40;
- this->unk_2D2 &= ~0x80;
- if (this->unk_434 >= 150) {
- this->unk_210 = 0x352E;
- Message_StartTextbox(play, this->unk_210, &this->actor);
- this->actionFunc = func_809C2A64;
+ this->stateFlags &= ~ENAOB01_FLAG_LAUGH;
+ this->stateFlags &= ~ENAOB01_FLAG_SURPRISE;
+ if (this->rupeesBet >= 150) {
+ this->textId = 0x352E; // You won over 150 rupees!
+ Message_StartTextbox(play, this->textId, &this->actor);
+ this->actionFunc = EnAob01_AfterRace_GiveReward;
} else {
- this->trackTarget = this->unk_2E6;
- this->headRot = this->unk_2EC;
- this->torsoRot = this->unk_2F2;
+ this->trackTarget = this->prevTrackTarget;
+ this->headRot = this->prevHeadRot;
+ this->torsoRot = this->prevTorsoRot;
- this->unk_434 = 0;
+ this->rupeesBet = 0;
this->actor.shape.rot.y = this->actor.world.rot.y;
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_KICKOUT_TIME_PASSED)) {
CLEAR_WEEKEVENTREG(WEEKEVENTREG_KICKOUT_TIME_PASSED);
@@ -844,35 +1004,40 @@ void func_809C2D0C(EnAob01* this, PlayState* play) {
CLEAR_WEEKEVENTREG(WEEKEVENTREG_KICKOUT_WAIT);
}
- this->unk_210 = 0x354C;
- Message_StartTextbox(play, this->unk_210, &this->actor);
- this->actionFunc = func_809C1D64;
- gSaveContext.eventInf[0] &= (u8)~7;
+ this->textId = 0x354C; // Want to play again?
+ Message_StartTextbox(play, this->textId, &this->actor);
+ this->actionFunc = EnAob01_BeforeRace_RespondToPlayAgainQuestion;
+ SET_EVENTINF_DOG_RACE_STATE(EVENTINF_DOG_RACE_STATE_NOT_STARTED);
}
}
}
-s32 func_809C2EC4(EnAob01* this, PlayState* play) {
+s32 EnAob01_PlayerIsHoldingDog(EnAob01* this, PlayState* play) {
Actor* dog = play->actorCtx.actorLists[ACTORCAT_ENEMY].first;
while (dog != NULL) {
if (dog->id == ACTOR_EN_DG) {
- this->unk_432 = ((EnDg*)dog)->selectedDogIndex;
- if (this->unk_432 == -1) {
+ this->selectedDogIndex = ((EnDg*)dog)->selectedDogIndex;
+ if (this->selectedDogIndex == -1) {
return false;
}
- if (this->unk_432 == ENDG_GET_INDEX(dog)) {
+ if (this->selectedDogIndex == ENDG_GET_INDEX(dog)) {
return true;
}
}
+
dog = dog->next;
}
return false;
}
-void func_809C2F34(EnAob01* this, PlayState* play) {
+/**
+ * Moves the player and racetrack owner to the center of the racetrack
+ * (out of the way of the dogs) and stops drawing the player.
+ */
+void EnAob01_Race_HidePlayer(EnAob01* this, PlayState* play) {
Player* player = GET_PLAYER(play);
player->actor.world.pos.x = -4134.0f;
@@ -885,40 +1050,48 @@ void func_809C2F34(EnAob01* this, PlayState* play) {
this->actor.prevPos = this->actor.world.pos;
}
-void func_809C2FA0(void) {
+/**
+ * Generates a randomized list of dog text offsets and stores them in weekEventRegs.
+ * EnDg uses these text offsets to determine what text to show when the player picks
+ * the dog up while equipped with the Mask of Truth, and EnRacedog uses them to
+ * determine what condition the dog is in.
+ */
+void EnAob01_InitializeDogTextOffsets(void) {
u8 i;
u8 rand;
- u8 index;
- u8 orig;
- u8 orig2;
- u8 sp44[7];
- u8 sp34[] = {
+ u8 dogTextOffsetsTemp;
+ u8 packedDogTextOffsets[(RACEDOG_COUNT + 1) / 2];
+ u8 dogTextOffsets[RACEDOG_COUNT] = {
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
};
- for (i = 0; i < ARRAY_COUNT(sp34); i++) {
- rand = Rand_ZeroFloat(14.0f);
- orig = sp34[i];
+ // Swap around the dog text offsets randomly 14 times.
+ for (i = 0; i < RACEDOG_COUNT; i++) {
+ rand = Rand_ZeroFloat(RACEDOG_COUNT);
- sp34[i] = sp34[rand];
- sp34[rand] = orig;
+ dogTextOffsetsTemp = dogTextOffsets[i];
+ dogTextOffsets[i] = dogTextOffsets[rand];
+ dogTextOffsets[rand] = dogTextOffsetsTemp;
}
- for (i = 0; i < ARRAY_COUNT(sp44); i++) {
- gSaveContext.save.saveInfo.weekEventReg[42 + i] = 0;
- sp44[i] = 0;
+ // Clear out all weekEventRegs related to the dog text offsets.
+ for (i = 0; i < ARRAY_COUNT(packedDogTextOffsets); i++) {
+ CLEAR_WEEKEVENTREG_DOG_RACE_TEXT_OFFSETS(i);
+ packedDogTextOffsets[i] = 0;
}
- for (i = 0; i < ARRAY_COUNT(sp34); i++) {
- orig2 = sp34[i];
- index = i / 2;
+ // Go through all the dog text offsets and pack them into weekEventRegs.
+ for (i = 0; i < RACEDOG_COUNT; i++) {
+ u8 dogTextOffsetsTemp = dogTextOffsets[i];
+ u8 j = i / 2;
if (i % 2) {
- sp44[index] |= orig2 << 0x4;
- gSaveContext.save.saveInfo.weekEventReg[42 + index] =
- ((void)0, gSaveContext.save.saveInfo.weekEventReg[42 + index]) | sp44[index];
+ //! @note sets text offsets for both even and odd entry.
+ //! Requires `RACEDOG_COUNT` to be even to work properly.
+ packedDogTextOffsets[j] |= dogTextOffsetsTemp << 4;
+ SET_WEEKEVENTREG_DOG_RACE_TEXT_OFFSETS(j, packedDogTextOffsets[j]);
} else {
- sp44[index] |= orig2;
+ packedDogTextOffsets[j] |= dogTextOffsetsTemp;
}
}
}
@@ -932,36 +1105,36 @@ void EnAob01_Init(Actor* thisx, PlayState* play) {
MAMAMU_YAN_LIMB_MAX);
Collider_InitCylinder(play, &this->collider);
Collider_SetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
- this->unk_43C = 0;
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 0);
+ this->animIndex = EN_AOB01_ANIM_IDLE_1;
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, EN_AOB01_ANIM_IDLE_1);
Actor_SetScale(&this->actor, 0.01f);
- switch (gSaveContext.eventInf[0] & 7) {
- case 0:
- func_809C2FA0();
- func_809C11EC(this, play);
+ switch (GET_EVENTINF_DOG_RACE_STATE) {
+ case EVENTINF_DOG_RACE_STATE_NOT_STARTED:
+ EnAob01_InitializeDogTextOffsets();
+ EnAob01_SpawnDogs(this, play);
this->actor.flags |= ACTOR_FLAG_1;
- this->actionFunc = func_809C2060;
+ this->actionFunc = EnAob01_BeforeRace_Idle;
break;
- case 2:
- this->unk_440 = 500;
- func_809C1304(this, play);
+ case EVENTINF_DOG_RACE_STATE_STARTED:
+ this->forceRaceEndTimer = 500;
+ EnAob01_SpawnRacedogs(this, play);
this->actor.draw = NULL;
this->csId = this->actor.csId;
- func_809C2594(this, play);
+ EnAob01_Race_FollowSelectedDog(this, play);
CutsceneManager_Queue(this->csId);
this->actor.flags &= ~ACTOR_FLAG_1;
- func_809C2F34(this, play);
- this->actionFunc = func_809C2824;
+ EnAob01_Race_HidePlayer(this, play);
+ this->actionFunc = EnAob01_Race_StartCutscene;
break;
- case 3:
- func_809C2FA0();
- func_809C11EC(this, play);
+ case EVENTINF_DOG_RACE_STATE_ENDED:
+ EnAob01_InitializeDogTextOffsets();
+ EnAob01_SpawnDogs(this, play);
this->actor.flags |= ACTOR_FLAG_1;
this->actor.flags |= ACTOR_FLAG_10000;
- this->actionFunc = func_809C28B8;
+ this->actionFunc = EnAob01_AfterRace_GiveRaceResult;
break;
}
}
@@ -969,9 +1142,10 @@ void EnAob01_Init(Actor* thisx, PlayState* play) {
void EnAob01_Destroy(Actor* thisx, PlayState* play) {
EnAob01* this = THIS;
- if (!(this->unk_2D2 & 0x20)) {
+ if (!(this->stateFlags & ENAOB01_FLAG_STARTED_RACE)) {
CLEAR_WEEKEVENTREG(WEEKEVENTREG_KICKOUT_WAIT);
}
+
Collider_DestroyCylinder(play, &this->collider);
}
@@ -979,7 +1153,7 @@ void EnAob01_Update(Actor* thisx, PlayState* play) {
EnAob01* this = THIS;
this->actionFunc(this, play);
- func_809C1EC8(this, play);
+ EnAob01_UpdateCommon(this, play);
}
s32 EnAob01_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) {
@@ -1014,18 +1188,19 @@ s32 EnAob01_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f*
if ((limbIndex == MAMAMU_YAN_LIMB_TORSO) || (limbIndex == MAMAMU_YAN_LIMB_LEFT_UPPER_ARM) ||
(limbIndex == MAMAMU_YAN_LIMB_RIGHT_UPPER_ARM)) {
- rot->y += (s16)Math_SinS(this->unk_2F8[limbIndex]) * 200;
- rot->z += (s16)Math_CosS(this->unk_318[limbIndex]) * 200;
+ rot->y += (s16)Math_SinS(this->limbRotTableY[limbIndex]) * 200;
+ rot->z += (s16)Math_CosS(this->limbRotTableZ[limbIndex]) * 200;
}
+
return false;
}
void EnAob01_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) {
- static Vec3f D_809C3968 = { 0.0f, 0.0f, 0.0f };
+ static Vec3f sFocusOffset = { 0.0f, 0.0f, 0.0f };
EnAob01* this = THIS;
if (limbIndex == MAMAMU_YAN_LIMB_HEAD) {
- Matrix_MultVec3f(&D_809C3968, &this->actor.focus.pos);
+ Matrix_MultVec3f(&sFocusOffset, &this->actor.focus.pos);
}
}
@@ -1040,7 +1215,7 @@ void EnAob01_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Gfx_EnvColor(play->state.gfxCtx, 50, 80, 0, 0));
gSPSegment(POLY_OPA_DISP++, 0x09, Gfx_EnvColor(play->state.gfxCtx, 50, 80, 0, 0));
@@ -1051,7 +1226,7 @@ void EnAob01_Draw(Actor* thisx, PlayState* play) {
EnAob01_TransformLimbDraw, &this->actor);
if (this->actor.draw != NULL) {
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
pos = this->actor.world.pos;
scale.x = 0.5f;
scale.y = 0.5f;
diff --git a/src/overlays/actors/ovl_En_Aob_01/z_en_aob_01.h b/src/overlays/actors/ovl_En_Aob_01/z_en_aob_01.h
index 5432f74ae..a550fd0d3 100644
--- a/src/overlays/actors/ovl_En_Aob_01/z_en_aob_01.h
+++ b/src/overlays/actors/ovl_En_Aob_01/z_en_aob_01.h
@@ -8,38 +8,56 @@ struct EnAob01;
typedef void (*EnAob01ActionFunc)(struct EnAob01*, PlayState*);
-#define ENAOB01_GET_7E00_1(thisx) ((thisx)->params & 0x7E00)
-#define ENAOB01_GET_7E00_2(thisx) (((thisx)->params & 0x7E00) >> 9)
+// This needs to be kept in sync with the number of weekEventRegs used to store the text ID offsets for
+// the race dogs. In particular, there needs to be one weekEventReg for every two dogs. This needs to be
+// an even number to ensure that all text ID offsets are created (see EnAob01_InitializeDogTextOffsets).
+#define RACEDOG_COUNT 14
+
+#define ENAOB01_GET_STARTING_DOG_PATH_INDEX(thisx) (((thisx)->params & 0x7E00) >> 9)
+
+//! @bug This should be shifted up by 1 to match how EnRacedog expects the path index to be supplied.
+//! It doesn't cause any problems in the final game because every time EnAob01 is spawned, all the
+//! bits here are zero.
+#define ENAOB01_GET_RACEDOG_PATH_INDEX(thisx) ((thisx)->params & 0x7E00)
+
+#define ENAOB01_FLAG_PLAYER_CONFIRMED_CHOICE (1 << 1)
+#define ENAOB01_FLAG_PLAYER_TOLD_TO_PICK_A_DOG (1 << 2)
+#define ENAOB01_FLAG_TALKING_TO_PLAYER_HOLDING_DOG (1 << 3)
+#define ENAOB01_FLAG_CONVERSATION_OVER (1 << 4)
+#define ENAOB01_FLAG_STARTED_RACE (1 << 5)
+#define ENAOB01_FLAG_LAUGH (1 << 6)
+#define ENAOB01_FLAG_SURPRISE (1 << 7)
+#define ENAOB01_FLAG_PLAYER_CAN_TALK (1 << 8)
typedef struct EnAob01 {
/* 0x000 */ Actor actor;
/* 0x144 */ EnAob01ActionFunc actionFunc;
/* 0x148 */ SkelAnime skelAnime;
/* 0x18C */ ColliderCylinder collider;
- /* 0x1D8 */ Path* unk_1D8[14];
- /* 0x210 */ u16 unk_210;
+ /* 0x1D8 */ Path* dogPaths[RACEDOG_COUNT];
+ /* 0x210 */ u16 textId;
/* 0x212 */ Vec3s jointTable[MAMAMU_YAN_LIMB_MAX];
/* 0x272 */ Vec3s morphTable[MAMAMU_YAN_LIMB_MAX];
- /* 0x2D2 */ u16 unk_2D2;
+ /* 0x2D2 */ u16 stateFlags;
/* 0x2D4 */ Vec3s trackTarget;
/* 0x2DA */ Vec3s headRot;
/* 0x2E0 */ Vec3s torsoRot;
- /* 0x2E6 */ Vec3s unk_2E6;
- /* 0x2EC */ Vec3s unk_2EC;
- /* 0x2F2 */ Vec3s unk_2F2;
- /* 0x2F8 */ s16 unk_2F8[MAMAMU_YAN_LIMB_MAX];
- /* 0x318 */ s16 unk_318[MAMAMU_YAN_LIMB_MAX];
+ /* 0x2E6 */ Vec3s prevTrackTarget;
+ /* 0x2EC */ Vec3s prevHeadRot;
+ /* 0x2F2 */ Vec3s prevTorsoRot;
+ /* 0x2F8 */ s16 limbRotTableY[MAMAMU_YAN_LIMB_MAX];
+ /* 0x318 */ s16 limbRotTableZ[MAMAMU_YAN_LIMB_MAX];
/* 0x338 */ UNK_TYPE1 unk338[0xB6];
/* 0x3EE */ s16 eyeIndex;
/* 0x3F0 */ s16 blinkTimer;
- /* 0x3F4 */ Actor* unk_3F4;
- /* 0x3F8 */ Actor* unk_3F8[14];
+ /* 0x3F4 */ Actor* dogToFollow;
+ /* 0x3F8 */ Actor* dogs[RACEDOG_COUNT];
/* 0x430 */ s16 csId;
- /* 0x432 */ s16 unk_432;
- /* 0x434 */ s32 unk_434;
+ /* 0x432 */ s16 selectedDogIndex;
+ /* 0x434 */ s32 rupeesBet; // Also used for determining how many rupees to give to the player if they place 1st-5th in the race.
/* 0x438 */ UNK_TYPE1 unk438[4];
- /* 0x43C */ s32 unk_43C;
- /* 0x440 */ s16 unk_440;
+ /* 0x43C */ s32 animIndex;
+ /* 0x440 */ s16 forceRaceEndTimer;
} EnAob01; // size = 0x444
#endif // Z_EN_AOB_01_H
diff --git a/src/overlays/actors/ovl_En_Arrow/z_en_arrow.c b/src/overlays/actors/ovl_En_Arrow/z_en_arrow.c
index b94e3ecb5..e4a83a6d0 100644
--- a/src/overlays/actors/ovl_En_Arrow/z_en_arrow.c
+++ b/src/overlays/actors/ovl_En_Arrow/z_en_arrow.c
@@ -78,26 +78,26 @@ void EnArrow_Init(Actor* thisx, PlayState* play) {
EnArrow* this = THIS;
Actor_ProcessInitChain(&this->actor, sInitChain);
- if (this->actor.params == -ENARROW_8) {
+ if (this->actor.params == -ARROW_TYPE_DEKU_NUT) {
this->unk_263 = 1;
- this->actor.params = ENARROW_8;
+ this->actor.params = ARROW_TYPE_DEKU_NUT;
}
- if (this->actor.params < ENARROW_6) {
+ if (ARROW_IS_ARROW(this->actor.params)) {
SkelAnime_Init(play, &this->arrow.skelAnime, &gameplay_keep_Skel_014560, &gameplay_keep_Anim_0128BC,
this->arrow.jointTable, this->arrow.jointTable, 5);
- if (this->actor.params < ENARROW_3) {
- if (this->actor.params == ENARROW_1) {
+ if (this->actor.params < ARROW_TYPE_FIRE) {
+ if (this->actor.params == ARROW_TYPE_NORMAL_HORSE) {
D_8088C234.elemDuration = 4;
} else {
D_8088C234.elemDuration = 16;
}
Effect_Add(play, &this->unk_240, EFFECT_BLURE2, 0, 0, &D_8088C234);
- } else if (this->actor.params == ENARROW_3) {
+ } else if (this->actor.params == ARROW_TYPE_FIRE) {
Effect_Add(play, &this->unk_240, EFFECT_BLURE2, 0, 0, &D_8088C258);
- } else if (this->actor.params == ENARROW_4) {
+ } else if (this->actor.params == ARROW_TYPE_ICE) {
Effect_Add(play, &this->unk_240, EFFECT_BLURE2, 0, 0, &D_8088C27C);
- } else if (this->actor.params == ENARROW_5) {
+ } else if (this->actor.params == ARROW_TYPE_LIGHT) {
Effect_Add(play, &this->unk_240, EFFECT_BLURE2, 0, 0, &D_8088C2A0);
}
}
@@ -105,20 +105,20 @@ void EnArrow_Init(Actor* thisx, PlayState* play) {
Collider_InitQuad(play, &this->collider);
Collider_SetQuad(play, &this->collider, &this->actor, &sQuadInit);
- if (this->actor.params < ENARROW_6) {
+ if (ARROW_IS_ARROW(this->actor.params)) {
this->collider.info.toucherFlags &= ~(TOUCH_SFX_WOOD | TOUCH_SFX_HARD);
this->collider.info.toucherFlags |= 0;
}
- if (this->actor.params < ENARROW_0) {
+ if (this->actor.params < ARROW_TYPE_NORMAL_LIT) {
this->collider.base.atFlags = (AT_TYPE_ENEMY | AT_ON);
} else {
this->collider.info.toucher.dmgFlags = Actor_GetArrowDmgFlags(this->actor.params);
- if (this->actor.params == ENARROW_8) {
+ if (this->actor.params == ARROW_TYPE_DEKU_NUT) {
this->collider.info.toucher.damage = 1;
}
- if (this->actor.params == ENARROW_7) {
+ if (this->actor.params == ARROW_TYPE_DEKU_BUBBLE) {
Actor_SetScale(&this->actor, 1.0f);
}
}
@@ -128,7 +128,7 @@ void EnArrow_Init(Actor* thisx, PlayState* play) {
void EnArrow_Destroy(Actor* thisx, PlayState* play) {
EnArrow* this = THIS;
- if (this->actor.params < ENARROW_6) {
+ if (ARROW_IS_ARROW(this->actor.params)) {
Effect_Destroy(play, this->unk_240);
}
@@ -138,7 +138,7 @@ void EnArrow_Destroy(Actor* thisx, PlayState* play) {
this->unk_264->flags &= ~ACTOR_FLAG_8000;
}
- if ((this->actor.params >= ENARROW_3) && (this->actor.params < ENARROW_6) && (this->actor.child == NULL)) {
+ if (ARROW_IS_MAGICAL(this->actor.params) && (this->actor.child == NULL)) {
Magic_Reset(play);
}
}
@@ -153,7 +153,7 @@ void func_8088A594(EnArrow* this, PlayState* play) {
Player* player = GET_PLAYER(play);
if (this->actor.parent != NULL) {
- if (this->actor.params == ENARROW_7) {
+ if (this->actor.params == ARROW_TYPE_DEKU_BUBBLE) {
if (Math_SmoothStepToF(&this->bubble.unk_144, 16.0f, 0.07f, 1.8f, 0.0f) > 0.5f) {
func_800B9010(&this->actor, NA_SE_PL_DEKUNUTS_BUBLE_BREATH - SFX_FLAG);
return;
@@ -166,8 +166,8 @@ void func_8088A594(EnArrow* this, PlayState* play) {
}
}
} else {
- if ((this->actor.params != ENARROW_8) && (player->unk_D57 == 0)) {
- if (this->actor.params == ENARROW_7) {
+ if ((this->actor.params != ARROW_TYPE_DEKU_NUT) && (player->unk_D57 == 0)) {
+ if (this->actor.params == ARROW_TYPE_DEKU_BUBBLE) {
Magic_Reset(play);
}
Actor_Kill(&this->actor);
@@ -175,22 +175,22 @@ void func_8088A594(EnArrow* this, PlayState* play) {
}
switch (this->actor.params) {
- case ENARROW_6:
+ case ARROW_TYPE_SLINGSHOT:
Player_PlaySfx(player, NA_SE_IT_SLING_SHOT);
break;
- case ENARROW_0:
- case ENARROW_1:
- case ENARROW_2:
+ case ARROW_TYPE_NORMAL_LIT:
+ case ARROW_TYPE_NORMAL_HORSE:
+ case ARROW_TYPE_NORMAL:
Player_PlaySfx(player, NA_SE_IT_ARROW_SHOT);
break;
- case ENARROW_3:
- case ENARROW_4:
- case ENARROW_5:
+ case ARROW_TYPE_FIRE:
+ case ARROW_TYPE_ICE:
+ case ARROW_TYPE_LIGHT:
Player_PlaySfx(player, NA_SE_IT_MAGIC_ARROW_SHOT);
- case ENARROW_7:
+ case ARROW_TYPE_DEKU_BUBBLE:
Player_PlaySfx(player, NA_SE_PL_DEKUNUTS_FIRE);
break;
}
@@ -198,13 +198,13 @@ void func_8088A594(EnArrow* this, PlayState* play) {
this->actionFunc = func_8088ACE0;
Math_Vec3f_Copy(&this->unk_228, &this->actor.world.pos);
- if (this->actor.params == ENARROW_7) {
+ if (this->actor.params == ARROW_TYPE_DEKU_BUBBLE) {
this->bubble.unk_144 = CLAMP_MIN(this->bubble.unk_144, 3.5f);
func_8088A514(this);
this->unk_260 = 99;
Magic_Reset(play);
- } else if (this->actor.params >= ENARROW_6) {
- if ((this->actor.params == ENARROW_8) && (this->actor.world.rot.x < 0)) {
+ } else if (!ARROW_IS_ARROW(this->actor.params)) {
+ if ((this->actor.params == ARROW_TYPE_DEKU_NUT) && (this->actor.world.rot.x < 0)) {
Actor_SetScale(&this->actor, 0.009f);
this->unk_260 = 40;
} else {
@@ -295,14 +295,14 @@ void func_8088AA98(EnArrow* this, PlayState* play) {
EffectSsGRipple_Spawn(play, &sp44, 100, 500, 4);
EffectSsGRipple_Spawn(play, &sp44, 100, 500, 8);
- if ((this->actor.params == ENARROW_4) || (this->actor.params == ENARROW_3)) {
- if ((this->actor.params == ENARROW_4) && (func_8088B6B0 != this->actionFunc)) {
+ if ((this->actor.params == ARROW_TYPE_ICE) || (this->actor.params == ARROW_TYPE_FIRE)) {
+ if ((this->actor.params == ARROW_TYPE_ICE) && (func_8088B6B0 != this->actionFunc)) {
Actor_Spawn(&play->actorCtx, play, ACTOR_BG_ICEFLOE, sp44.x, sp44.y, sp44.z, 0, 0, 0, 300);
Actor_Kill(&this->actor);
return;
}
- this->actor.params = ENARROW_2;
+ this->actor.params = ARROW_TYPE_NORMAL;
this->collider.info.toucher.dmgFlags = 0x20;
if (this->actor.child != NULL) {
@@ -329,9 +329,9 @@ void func_8088ACE0(EnArrow* this, PlayState* play) {
s32 sp50;
if ((DECR(this->unk_260) == 0) ||
- ((this->actor.params == ENARROW_7) &&
+ ((this->actor.params == ARROW_TYPE_DEKU_BUBBLE) &&
((this->unk_262 != 0) || (phi_a2 = (this->collider.base.atFlags & AT_HIT) != 0)))) {
- if (this->actor.params == ENARROW_7) {
+ if (this->actor.params == ARROW_TYPE_DEKU_BUBBLE) {
if (phi_a2 && (this->collider.info.atHitInfo->elemType != ELEMTYPE_UNK4) &&
(this->collider.base.atFlags & AT_BOUNCED)) {
if ((this->collider.base.at != NULL) && (this->collider.base.at->id != ACTOR_OBJ_SYOKUDAI)) {
@@ -361,18 +361,18 @@ void func_8088ACE0(EnArrow* this, PlayState* play) {
return;
}
- sp50 =
- (this->actor.params != ENARROW_0) && (this->actor.params < ENARROW_8) && (this->collider.base.atFlags & AT_HIT);
+ sp50 = (this->actor.params != ARROW_TYPE_NORMAL_LIT) && (this->actor.params < ARROW_TYPE_DEKU_NUT) &&
+ (this->collider.base.atFlags & AT_HIT);
if (sp50 || (this->unk_262 != 0)) {
- if (this->actor.params >= ENARROW_6) {
+ if (!ARROW_IS_ARROW(this->actor.params)) {
if (sp50) {
this->actor.world.pos.x = (this->actor.world.pos.x + this->actor.prevPos.x) * 0.5f;
this->actor.world.pos.y = (this->actor.world.pos.y + this->actor.prevPos.y) * 0.5f;
this->actor.world.pos.z = (this->actor.world.pos.z + this->actor.prevPos.z) * 0.5f;
}
- if (this->actor.params == ENARROW_8) {
+ if (this->actor.params == ARROW_TYPE_DEKU_NUT) {
R_TRANS_FADE_FLASH_ALPHA_STEP = -1;
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_M_FIRE1, this->actor.world.pos.x, this->actor.world.pos.y,
this->actor.world.pos.z, 0, 0, 0, this->actor.speed == 0.0f);
@@ -408,12 +408,12 @@ void func_8088ACE0(EnArrow* this, PlayState* play) {
} else if (this->unk_262 != 0) {
this->actionFunc = func_8088B630;
Animation_PlayOnce(&this->arrow.skelAnime, &gameplay_keep_Anim_0128BC);
- if (this->actor.params >= ENARROW_0) {
+ if (this->actor.params >= ARROW_TYPE_NORMAL_LIT) {
this->unk_260 = 60;
} else {
this->unk_260 = 20;
}
- if ((this->actor.params >= ENARROW_3) && (this->actor.params < ENARROW_6)) {
+ if (ARROW_IS_MAGICAL(this->actor.params)) {
this->actor.draw = NULL;
}
Actor_PlaySfx(&this->actor, NA_SE_IT_ARROW_STICK_OBJ);
@@ -422,7 +422,7 @@ void func_8088ACE0(EnArrow* this, PlayState* play) {
}
} else {
func_8088AA98(this, play);
- if (this->actor.params == ENARROW_7) {
+ if (this->actor.params == ARROW_TYPE_DEKU_BUBBLE) {
if (this->bubble.unk_149 == 0) {
sp78 = sqrtf(SQ(this->actor.speed) + SQ(this->actor.velocity.y));
sp74 = Math_SinS(this->actor.world.rot.y) * this->actor.speed;
@@ -473,7 +473,7 @@ void func_8088ACE0(EnArrow* this, PlayState* play) {
this->actor.wallBgId = spA8;
}
- if (this->actor.params < ENARROW_6) {
+ if (ARROW_IS_ARROW(this->actor.params)) {
this->actor.shape.rot.x = Math_Atan2S_XY(this->actor.speed, -this->actor.velocity.y);
}
}
@@ -540,21 +540,27 @@ void EnArrow_Update(Actor* thisx, PlayState* play) {
Player* player = GET_PLAYER(play);
if ((this->unk_263 != 0) ||
- ((this->actor.params >= ENARROW_0) && ((this->actor.params == ENARROW_7) || (player->unk_D57 != 0))) ||
+ ((this->actor.params >= ARROW_TYPE_NORMAL_LIT) &&
+ ((this->actor.params == ARROW_TYPE_DEKU_BUBBLE) || (player->unk_D57 != 0))) ||
!Player_InBlockingCsMode(play, player)) {
this->actionFunc(this, play);
}
- if ((this->actor.params >= ENARROW_3) && (this->actor.params < ENARROW_6)) {
- s16 sp44[] = { ACTOR_ARROW_FIRE, ACTOR_ARROW_ICE, ACTOR_ARROW_LIGHT };
+ if (ARROW_IS_MAGICAL(this->actor.params)) {
+ s16 sp44[] = {
+ ACTOR_ARROW_FIRE, // ARROW_MAGIC_FIRE
+ ACTOR_ARROW_ICE, // ARROW_MAGIC_ICE
+ ACTOR_ARROW_LIGHT, // ARROW_MAGIC_LIGHT
+ };
if (this->actor.child == NULL) {
- Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, sp44[this->actor.params - ENARROW_3],
+ Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, sp44[ARROW_GET_MAGIC_FROM_TYPE(this->actor.params)],
this->actor.world.pos.x, this->actor.world.pos.y, this->actor.world.pos.z, 0, 0, 0, 0);
}
- } else if (this->actor.params == ENARROW_0) {
+ } else if (this->actor.params == ARROW_TYPE_NORMAL_LIT) {
func_800B0EB0(play, &this->unk_234, &D_8088C2CC, &D_8088C2D8, &D_8088C2E4, &D_8088C2E8, 100, 0, 8);
}
+
Math_Vec3f_Copy(&this->actor.home.pos, &this->actor.prevPos);
}
@@ -579,8 +585,8 @@ void func_8088B88C(PlayState* play, EnArrow* this, EnArrowUnkStruct* arg2) {
}
Matrix_MultVec3f(&sp4C[0], &sp40);
Matrix_MultVec3f(&sp4C[1], &sp34);
- if (this->actor.params < ENARROW_8) {
- sp30 = this->actor.params < ENARROW_6;
+ if (this->actor.params < ARROW_TYPE_DEKU_NUT) {
+ sp30 = ARROW_IS_ARROW(this->actor.params);
if (this->unk_264 == NULL) {
sp30 &= func_80126440(play, &this->collider, &this->unk_244, &sp40, &sp34);
} else if (sp30 && (sp40.x == this->unk_244.tip.x) && (sp40.y == this->unk_244.tip.y) &&
@@ -635,11 +641,11 @@ void EnArrow_Draw(Actor* thisx, PlayState* play) {
EnArrow* this = THIS;
s32 phi_v0;
- if (this->actor.params < ENARROW_6) {
- func_8012C28C(play->state.gfxCtx);
+ if (ARROW_IS_ARROW(this->actor.params)) {
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawLod(play, this->arrow.skelAnime.skeleton, this->arrow.skelAnime.jointTable, NULL, NULL,
&this->actor, this->actor.projectedPos.z < 160.0f ? 0 : 1);
- } else if (this->actor.params == ENARROW_7) {
+ } else if (this->actor.params == ARROW_TYPE_DEKU_BUBBLE) {
s32 spA4 = 255 - (s32)(this->bubble.unk_144 * 4.0f);
f32 spA0 = (this->actor.speed * 0.1f) + 1.0f;
f32 sp9C = (1.0f / spA0);
@@ -693,11 +699,11 @@ void EnArrow_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C240(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu2(play->state.gfxCtx);
gSPClearGeometryMode(POLY_XLU_DISP++, G_FOG | G_LIGHTING);
- if (this->actor.params == ENARROW_6) {
+ if (this->actor.params == ARROW_TYPE_SLINGSHOT) {
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 255, 255);
gDPSetEnvColor(POLY_XLU_DISP++, 0, 255, 255, sp63);
sp5C = 50.0f;
@@ -729,7 +735,7 @@ void EnArrow_Draw(Actor* thisx, PlayState* play) {
} else if (this->actor.velocity.y != 0.0f) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
Matrix_Mult(&play->billboardMtxF, MTXMODE_APPLY);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
@@ -737,5 +743,6 @@ void EnArrow_Draw(Actor* thisx, PlayState* play) {
CLOSE_DISPS(play->state.gfxCtx);
}
+
func_8088B88C(play, this, &D_8088C2EC[0]);
}
diff --git a/src/overlays/actors/ovl_En_Arrow/z_en_arrow.h b/src/overlays/actors/ovl_En_Arrow/z_en_arrow.h
index 313dd86bb..14d5bef94 100644
--- a/src/overlays/actors/ovl_En_Arrow/z_en_arrow.h
+++ b/src/overlays/actors/ovl_En_Arrow/z_en_arrow.h
@@ -7,17 +7,30 @@ struct EnArrow;
typedef void (*EnArrowActionFunc)(struct EnArrow*, PlayState*);
-enum {
- /* 0 */ ENARROW_0, // Lit arrow
- /* 1 */ ENARROW_1, // Horse arrow
- /* 2 */ ENARROW_2, // Normal arrow
- /* 3 */ ENARROW_3, // Fire arrow
- /* 4 */ ENARROW_4, // Ice arrow
- /* 5 */ ENARROW_5, // Light arrow
- /* 6 */ ENARROW_6, // ?
- /* 7 */ ENARROW_7, // Deku bubble
- /* 8 */ ENARROW_8, // Deku Nut
-};
+typedef enum ArrowType {
+ /* 0 */ ARROW_TYPE_NORMAL_LIT, // Normal arrow lit on fire
+ /* 1 */ ARROW_TYPE_NORMAL_HORSE, // Normal arrow shot while riding a horse
+ /* 2 */ ARROW_TYPE_NORMAL,
+ /* 3 */ ARROW_TYPE_FIRE,
+ /* 4 */ ARROW_TYPE_ICE,
+ /* 5 */ ARROW_TYPE_LIGHT,
+ /* 6 */ ARROW_TYPE_SLINGSHOT,
+ /* 7 */ ARROW_TYPE_DEKU_BUBBLE,
+ /* 8 */ ARROW_TYPE_DEKU_NUT
+} ArrowType;
+
+#define ARROW_IS_MAGICAL(arrowType) (((arrowType) >= ARROW_TYPE_FIRE) && ((arrowType) <= ARROW_TYPE_LIGHT))
+#define ARROW_GET_MAGIC_FROM_TYPE(arrowType) (s32)((arrowType) - ARROW_TYPE_FIRE)
+#define ARROW_IS_ARROW(arrowType) ((arrowType) < ARROW_TYPE_SLINGSHOT)
+
+typedef enum ArrowMagic {
+ /* -1 */ ARROW_MAGIC_INVALID = -1,
+ /* 0 */ ARROW_MAGIC_FIRE = ARROW_GET_MAGIC_FROM_TYPE(ARROW_TYPE_FIRE),
+ /* 1 */ ARROW_MAGIC_ICE = ARROW_GET_MAGIC_FROM_TYPE(ARROW_TYPE_ICE),
+ /* 2 */ ARROW_MAGIC_LIGHT = ARROW_GET_MAGIC_FROM_TYPE(ARROW_TYPE_LIGHT),
+ /* 3 */ ARROW_MAGIC_DEKU_BUBBLE // Only used in Player. Does not map to ARROW_TYPE_SLINGSHOT
+} ArrowMagic;
+
typedef struct {
/* 0x144 */ SkelAnime skelAnime;
diff --git a/src/overlays/actors/ovl_En_Attack_Niw/z_en_attack_niw.c b/src/overlays/actors/ovl_En_Attack_Niw/z_en_attack_niw.c
index bb3e2f23a..5eb0d0351 100644
--- a/src/overlays/actors/ovl_En_Attack_Niw/z_en_attack_niw.c
+++ b/src/overlays/actors/ovl_En_Attack_Niw/z_en_attack_niw.c
@@ -446,7 +446,7 @@ s32 EnAttackNiw_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Ve
void EnAttackNiw_Draw(Actor* thisx, PlayState* play) {
EnAttackNiw* this = THIS;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnAttackNiw_OverrideLimbDraw, NULL, &this->actor);
}
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 1c2cdf533..96a4fed1c 100644
--- a/src/overlays/actors/ovl_En_Az/z_en_az.c
+++ b/src/overlays/actors/ovl_En_Az/z_en_az.c
@@ -1784,7 +1784,9 @@ void EnAz_Draw(Actor* thisx, PlayState* play2) {
EnAz* this = THIS;
OPEN_DISPS(play->state.gfxCtx);
- POLY_OPA_DISP = Gfx_CallSetupDL(POLY_OPA_DISP, 0x19);
+
+ POLY_OPA_DISP = Gfx_SetupDL(POLY_OPA_DISP, SETUPDL_25);
+
CLOSE_DISPS(play->state.gfxCtx);
if (this->unk_374 & 2) {
@@ -1806,7 +1808,7 @@ void EnAz_Draw(Actor* thisx, PlayState* play2) {
Matrix_RotateZS(this->actor.shape.rot.z, MTXMODE_APPLY);
Matrix_RotateXS(this->unk_39E, MTXMODE_APPLY);
Matrix_Scale(this->actor.scale.x, this->actor.scale.y, this->actor.scale.z, MTXMODE_APPLY);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
if (this->unk_374 & 2) {
s32 i;
Vec3f sp98;
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 5296260f9..e303fe1c5 100644
--- a/src/overlays/actors/ovl_En_Baba/z_en_baba.c
+++ b/src/overlays/actors/ovl_En_Baba/z_en_baba.c
@@ -810,7 +810,7 @@ void EnBaba_Draw(Actor* thisx, PlayState* play) {
if (this->stateFlags & BOMB_SHOP_LADY_STATE_VISIBLE) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C5B0(play->state.gfxCtx);
+ Gfx_SetupDL37_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(gBbaEyeTex));
@@ -821,7 +821,7 @@ void EnBaba_Draw(Actor* thisx, PlayState* play) {
if (this->stateFlags & BOMB_SHOP_LADY_STATE_DRAW_SHADOW) {
if ((this->animIndex == BOMB_SHOP_LADY_ANIM_KNOCKED_OVER) ||
(this->animIndex == BOMB_SHOP_LADY_ANIM_LYING_DOWN)) {
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
pos.x = this->actor.world.pos.x + 20.0f;
pos.y = this->actor.world.pos.y;
pos.z = this->actor.world.pos.z + 20.0f;
diff --git a/src/overlays/actors/ovl_En_Baguo/z_en_baguo.c b/src/overlays/actors/ovl_En_Baguo/z_en_baguo.c
index 14f4112eb..df47a5f67 100644
--- a/src/overlays/actors/ovl_En_Baguo/z_en_baguo.c
+++ b/src/overlays/actors/ovl_En_Baguo/z_en_baguo.c
@@ -419,7 +419,7 @@ void EnBaguo_DrawBody(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gfx = POLY_OPA_DISP;
@@ -496,7 +496,7 @@ void EnBaguo_DrawEffects(EnBaguo* this, PlayState* play) {
OPEN_DISPS(gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
for (i = 0; i < ARRAY_COUNT(this->effects); i++, effect++) {
if (effect->isEnabled) {
Matrix_Translate(effect->pos.x, effect->pos.y, effect->pos.z, MTXMODE_NEW);
diff --git a/src/overlays/actors/ovl_En_Baisen/z_en_baisen.c b/src/overlays/actors/ovl_En_Baisen/z_en_baisen.c
index 5479d6c1e..7ff5da288 100644
--- a/src/overlays/actors/ovl_En_Baisen/z_en_baisen.c
+++ b/src/overlays/actors/ovl_En_Baisen/z_en_baisen.c
@@ -281,7 +281,7 @@ s32 EnBaisen_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f
void EnBaisen_Draw(Actor* thisx, PlayState* play) {
EnBaisen* this = THIS;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnBaisen_OverrideLimbDraw, NULL, &this->actor);
}
diff --git a/src/overlays/actors/ovl_En_Bat/z_en_bat.c b/src/overlays/actors/ovl_En_Bat/z_en_bat.c
index 963bc4104..549a2c4bd 100644
--- a/src/overlays/actors/ovl_En_Bat/z_en_bat.c
+++ b/src/overlays/actors/ovl_En_Bat/z_en_bat.c
@@ -4,11 +4,10 @@
* Description: Bad Bat
*/
-#include "prevent_bss_reordering.h"
#include "z_en_bat.h"
#include "objects/object_bat/object_bat.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_1000 | ACTOR_FLAG_4000)
+#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_IGNORE_QUAKE | ACTOR_FLAG_4000)
#define THIS ((EnBat*)thisx)
@@ -531,7 +530,7 @@ void EnBat_Draw(Actor* thisx, PlayState* play) {
gfx = POLY_OPA_DISP;
- gSPDisplayList(&gfx[0], &sSetupDL[6 * 25]);
+ gSPDisplayList(&gfx[0], gSetupDLs[SETUPDL_25]);
gSPMatrix(&gfx[1], Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(&gfx[2], gBadBatSetupDL);
gSPDisplayList(&gfx[3], gBadBatBodyDL);
diff --git a/src/overlays/actors/ovl_En_Bb/z_en_bb.c b/src/overlays/actors/ovl_En_Bb/z_en_bb.c
index 071515919..048fbfc95 100644
--- a/src/overlays/actors/ovl_En_Bb/z_en_bb.c
+++ b/src/overlays/actors/ovl_En_Bb/z_en_bb.c
@@ -682,14 +682,14 @@ void EnBb_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
gfx = POLY_OPA_DISP;
- gSPDisplayList(&gfx[0], &sSetupDL[6 * 25]);
+ gSPDisplayList(&gfx[0], gSetupDLs[SETUPDL_25]);
POLY_OPA_DISP = &gfx[1];
SkelAnime_DrawOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, EnBb_OverrideLimbDraw,
EnBb_PostLimbDraw, &this->actor);
if (this->flameScaleX > 0.0f) {
currentMatrixState = Matrix_GetCurrent();
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
Matrix_RotateYS(((Camera_GetCamDirYaw(GET_ACTIVE_CAM(play)) - this->actor.shape.rot.y) + 0x8000),
MTXMODE_APPLY);
Matrix_Scale(this->flameScaleX, this->flameScaleY, 1.0f, MTXMODE_APPLY);
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 b751a50d5..2653fb685 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
@@ -318,7 +318,7 @@ void EnBba01_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Gfx_EnvColor(play->state.gfxCtx, 255, 255, 255, 0));
gSPSegment(POLY_OPA_DISP++, 0x09, Gfx_EnvColor(play->state.gfxCtx, 55, 55, 255, 0));
gDPPipeSync(POLY_OPA_DISP++);
diff --git a/src/overlays/actors/ovl_En_Bbfall/z_en_bbfall.c b/src/overlays/actors/ovl_En_Bbfall/z_en_bbfall.c
index a1e2798df..11dace3a5 100644
--- a/src/overlays/actors/ovl_En_Bbfall/z_en_bbfall.c
+++ b/src/overlays/actors/ovl_En_Bbfall/z_en_bbfall.c
@@ -718,13 +718,13 @@ void EnBbfall_Draw(Actor* thisx, PlayState* play2) {
OPEN_DISPS(play->state.gfxCtx);
gfx = POLY_OPA_DISP;
- gSPDisplayList(&gfx[0], &sSetupDL[6 * 25]);
+ gSPDisplayList(&gfx[0], gSetupDLs[SETUPDL_25]);
POLY_OPA_DISP = &gfx[1];
SkelAnime_DrawOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, EnBbfall_OverrideLimbDraw,
EnBbfall_PostLimbDraw, &this->actor);
if (this->flameOpacity > 0) {
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
Matrix_RotateYS(((Camera_GetCamDirYaw(GET_ACTIVE_CAM(play)) - this->actor.shape.rot.y) + 0x8000),
MTXMODE_APPLY);
Matrix_Scale(this->flameScaleX, this->flameScaleY, 1.0f, MTXMODE_APPLY);
diff --git a/src/overlays/actors/ovl_En_Bee/z_en_bee.c b/src/overlays/actors/ovl_En_Bee/z_en_bee.c
index f93d18bf5..c03cc005d 100644
--- a/src/overlays/actors/ovl_En_Bee/z_en_bee.c
+++ b/src/overlays/actors/ovl_En_Bee/z_en_bee.c
@@ -284,7 +284,7 @@ void EnBee_Update(Actor* thisx, PlayState* play) {
void EnBee_Draw(Actor* thisx, PlayState* play) {
EnBee* this = THIS;
- func_8012C28C(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
SkelAnime_DrawOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, NULL, NULL, &this->actor);
}
diff --git a/src/overlays/actors/ovl_En_Bh/z_en_bh.c b/src/overlays/actors/ovl_En_Bh/z_en_bh.c
index da6bc06a3..cdd7abee3 100644
--- a/src/overlays/actors/ovl_En_Bh/z_en_bh.c
+++ b/src/overlays/actors/ovl_En_Bh/z_en_bh.c
@@ -114,7 +114,7 @@ void EnBh_Update(Actor* thisx, PlayState* play) {
void EnBh_Draw(Actor* thisx, PlayState* play) {
EnBh* this = THIS;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
Matrix_RotateZS(this->unk1E2, MTXMODE_APPLY);
SkelAnime_DrawFlexOpa(play, this->skelanime.skeleton, this->skelanime.jointTable, this->skelanime.dListCount, NULL,
NULL, &this->actor);
diff --git a/src/overlays/actors/ovl_En_Bigokuta/z_en_bigokuta.c b/src/overlays/actors/ovl_En_Bigokuta/z_en_bigokuta.c
index f331666d3..887fb68d5 100644
--- a/src/overlays/actors/ovl_En_Bigokuta/z_en_bigokuta.c
+++ b/src/overlays/actors/ovl_En_Bigokuta/z_en_bigokuta.c
@@ -660,7 +660,7 @@ void EnBigokuta_Draw(Actor* thisx, PlayState* play) {
if ((this->actionFunc != EnBigokuta_PlayDeathEffects) || (this->timer != 0)) {
Scene_SetRenderModeXlu(play, 0, 1);
gfx = POLY_OPA_DISP;
- gSPDisplayList(&gfx[0], &sSetupDL[6 * 25]);
+ gSPDisplayList(&gfx[0], gSetupDLs[SETUPDL_25]);
gDPSetEnvColor(&gfx[1], 255, 255, 255, 255);
POLY_OPA_DISP =
SkelAnime_DrawFlex(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
@@ -668,7 +668,7 @@ void EnBigokuta_Draw(Actor* thisx, PlayState* play) {
} else {
Scene_SetRenderModeXlu(play, 1, 2);
gfx = POLY_XLU_DISP;
- gSPDisplayList(&gfx[0], &sSetupDL[6 * 25]);
+ gSPDisplayList(&gfx[0], gSetupDLs[SETUPDL_25]);
gDPSetEnvColor(&gfx[1], 0, 0, 0, (this->picto.actor.scale.y * 7727.273f));
POLY_XLU_DISP =
SkelAnime_DrawFlex(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
diff --git a/src/overlays/actors/ovl_En_Bigpamet/z_en_bigpamet.c b/src/overlays/actors/ovl_En_Bigpamet/z_en_bigpamet.c
index a78731e29..a77733d31 100644
--- a/src/overlays/actors/ovl_En_Bigpamet/z_en_bigpamet.c
+++ b/src/overlays/actors/ovl_En_Bigpamet/z_en_bigpamet.c
@@ -540,13 +540,13 @@ void func_80A287E8(EnBigpamet* this, PlayState* play) {
}
if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
- quakeIndex = Quake_Add(GET_ACTIVE_CAM(play), QUAKE_TYPE_3);
+ quakeIndex = Quake_Request(GET_ACTIVE_CAM(play), QUAKE_TYPE_3);
this->actor.velocity.y = this->unk_29E * 0.375f;
Quake_SetSpeed(quakeIndex, 20000);
- Quake_SetQuakeValues(quakeIndex, 15, 0, 0, 0);
- Quake_SetCountdown(quakeIndex, 10);
+ Quake_SetPerturbations(quakeIndex, 15, 0, 0, 0);
+ Quake_SetDuration(quakeIndex, 10);
Rumble_Request(this->actor.xyzDistToPlayerSq, 180, 20, 100);
@@ -790,7 +790,7 @@ void func_80A292A8(EnBigpamet* this, PlayState* play) {
if (this->unk_2A2 > 0) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0x80, 255, 255, 255, 255);
gDPSetEnvColor(POLY_OPA_DISP++, 255, 255, 255, 255);
@@ -834,7 +834,7 @@ void EnBigpamet_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, D_80A29754[this->unk_29C]);
@@ -874,7 +874,7 @@ void EnBigpamet_PostLimbDraw1(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s
void func_80A2966C(Actor* thisx, PlayState* play) {
EnBigpamet* this = THIS;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawFlexOpa(play, this->skelAnime1.skeleton, this->skelAnime1.jointTable, this->skelAnime1.dListCount,
EnBigpamet_OverrideLimbDraw1, EnBigpamet_PostLimbDraw1, &this->actor);
func_80A292A8(this, play);
diff --git a/src/overlays/actors/ovl_En_Bigpo/z_en_bigpo.c b/src/overlays/actors/ovl_En_Bigpo/z_en_bigpo.c
index c360681e8..06bcd3b84 100644
--- a/src/overlays/actors/ovl_En_Bigpo/z_en_bigpo.c
+++ b/src/overlays/actors/ovl_En_Bigpo/z_en_bigpo.c
@@ -8,7 +8,7 @@
#include "objects/object_bigpo/object_bigpo.h"
#include "objects/gameplay_keep/gameplay_keep.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_10 | ACTOR_FLAG_200 | ACTOR_FLAG_1000)
+#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_10 | ACTOR_FLAG_200 | ACTOR_FLAG_IGNORE_QUAKE)
#define THIS ((EnBigpo*)thisx)
@@ -1291,7 +1291,7 @@ void EnBigpo_DrawMainBigpo(Actor* thisx, PlayState* play) {
if ((this->mainColor.a == 255) || (this->mainColor.a == 0)) {
// fully visible OR fully transparent
dispHead = POLY_OPA_DISP;
- gSPDisplayList(dispHead, &sSetupDL[6 * 0x19]);
+ gSPDisplayList(dispHead, gSetupDLs[SETUPDL_25]);
gSPSegment(&dispHead[1], 0x0C, &D_801AEFA0); // empty display list for no transparency
gSPSegment(&dispHead[2], 0x08,
Gfx_EnvColor(play->state.gfxCtx, this->mainColor.r, this->mainColor.g, this->mainColor.b,
@@ -1301,7 +1301,7 @@ void EnBigpo_DrawMainBigpo(Actor* thisx, PlayState* play) {
} else {
dispHead = POLY_XLU_DISP;
- gSPDisplayList(dispHead, &sSetupDL[6 * 0x19]);
+ gSPDisplayList(dispHead, gSetupDLs[SETUPDL_25]);
gSPSegment(&dispHead[1], 0x0C, &D_801AEF88); // transparency display list
gSPSegment(&dispHead[2], 0x08,
Gfx_EnvColor(play->state.gfxCtx, this->mainColor.r, this->mainColor.g, this->mainColor.b,
@@ -1330,7 +1330,7 @@ void EnBigpo_DrawScoopSoul(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPSegment(POLY_XLU_DISP++, 0x08,
Gfx_TwoTexScroll(play->state.gfxCtx, 0, 0, 0, 0x20, 0x40, 1, 0, (play->gameplayFrames * -15) % 512, 0x20,
@@ -1382,7 +1382,7 @@ void EnBigpo_DrawLantern(Actor* thisx, PlayState* play) {
dispHead = POLY_XLU_DISP;
}
- gSPDisplayList(&dispHead[0], &sSetupDL[6 * 0x19]);
+ gSPDisplayList(&dispHead[0], gSetupDLs[SETUPDL_25]);
gSPSegment(&dispHead[1], 0x0A, Gfx_EnvColor(play->state.gfxCtx, 160, 0, 255, this->mainColor.a));
@@ -1418,7 +1418,7 @@ void EnBigpo_DrawCircleFlames(Actor* thisx, PlayState* play) {
mtfxPtr = Matrix_GetCurrent();
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
Matrix_RotateYS(BINANG_ROT180(Camera_GetCamDirYaw(GET_ACTIVE_CAM(play))), MTXMODE_NEW);
if (this->actionFunc == EnBigpo_SpawnCutsceneStage6) {
Matrix_Scale(0.01f, 0.01f, 0.01f, MTXMODE_APPLY);
@@ -1458,7 +1458,7 @@ void EnBigpo_RevealedFire(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPSegment(POLY_XLU_DISP++, 0x08,
Gfx_TwoTexScroll(play->state.gfxCtx, 0, 0, 0, 0x20, 0x40, 1, 0, (play->gameplayFrames * -20) % 512, 0x20,
diff --git a/src/overlays/actors/ovl_En_Bigslime/z_en_bigslime.c b/src/overlays/actors/ovl_En_Bigslime/z_en_bigslime.c
index c9b31571f..75e6fa38e 100644
--- a/src/overlays/actors/ovl_En_Bigslime/z_en_bigslime.c
+++ b/src/overlays/actors/ovl_En_Bigslime/z_en_bigslime.c
@@ -742,11 +742,11 @@ void EnBigslime_EndThrowMinislime(EnBigslime* this) {
void EnBigslime_BreakIntoMinislime(EnBigslime* this, PlayState* play) {
s32 i;
- s16 quakeIndex = Quake_Add(GET_ACTIVE_CAM(play), QUAKE_TYPE_3);
+ s16 quakeIndex = Quake_Request(GET_ACTIVE_CAM(play), QUAKE_TYPE_3);
Quake_SetSpeed(quakeIndex, 20000);
- Quake_SetQuakeValues(quakeIndex, 15, 0, 0, 0);
- Quake_SetCountdown(quakeIndex, 15);
+ Quake_SetPerturbations(quakeIndex, 15, 0, 0, 0);
+ Quake_SetDuration(quakeIndex, 15);
Rumble_Request(this->actor.xyzDistToPlayerSq, 180, 20, 100);
@@ -2884,7 +2884,8 @@ void EnBigslime_SetSysMatrix(Vec3f* pos, PlayState* play, Gfx* shadowDList, f32
zx = 1.0f - (yDistMinY * (1.0f / 1550.0f));
OPEN_DISPS(play->state.gfxCtx);
- POLY_OPA_DISP = Gfx_CallSetupDL(POLY_OPA_DISP, 0x2C);
+
+ POLY_OPA_DISP = Gfx_SetupDL(POLY_OPA_DISP, SETUPDL_44);
sysMatrix->xx = zx;
sysMatrix->yy = 1.0f;
sysMatrix->zz = zx;
@@ -2907,6 +2908,7 @@ void EnBigslime_SetSysMatrix(Vec3f* pos, PlayState* play, Gfx* shadowDList, f32
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 0, 0, 0, (u8)(alpha * zx));
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, shadowDList);
+
CLOSE_DISPS(play->state.gfxCtx);
}
@@ -2936,12 +2938,13 @@ void EnBigslime_DrawMinislime(EnBigslime* this, PlayState* play2) {
}
OPEN_DISPS(play->state.gfxCtx);
+
for (i = 0; i < MINISLIME_NUM_SPAWN; i++) {
minislime = this->minislime[indices[i]];
lights = LightContext_NewLights(&play->lightCtx, play->state.gfxCtx);
Lights_BindAll(lights, play->lightCtx.listHead, &minislime->actor.world.pos, play);
Lights_Draw(lights, play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
func_800B8118(&minislime->actor, play, 0);
Matrix_SetTranslateRotateYXZ(minislime->actor.world.pos.x, minislime->actor.world.pos.y,
minislime->actor.world.pos.z, &minislime->actor.shape.rot);
@@ -2963,6 +2966,7 @@ void EnBigslime_DrawMinislime(EnBigslime* this, PlayState* play2) {
minislime->actor.scale.y * 400.0f, minislime->actor.shape.rot.y,
minislime->actor.shape.shadowAlpha * (175.0f / 255.0f));
}
+
CLOSE_DISPS(play->state.gfxCtx);
}
@@ -2980,8 +2984,9 @@ void EnBigslime_DrawBigslime(Actor* thisx, PlayState* play) {
MtxF* billboardMtxF;
s32 i;
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
func_800B8118(&this->actor, play, 0);
+
OPEN_DISPS(play->state.gfxCtx);
// Draw Bigslime
@@ -3018,6 +3023,7 @@ void EnBigslime_DrawBigslime(Actor* thisx, PlayState* play) {
gSPDisplayList(POLY_XLU_DISP++, gBigslimeBubbleDL);
}
}
+
CLOSE_DISPS(play->state.gfxCtx);
EnBigslime_SetSysMatrix(&this->actor.world.pos, play, gBigslimeShadowDL, this->vtxScaleX, this->vtxScaleZ,
@@ -3070,7 +3076,7 @@ void EnBigslime_DrawGekko(Actor* thisx, PlayState* play) {
EnBigslime* this = THIS;
s32 pad;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
if (this->actionFunc == EnBigslime_DamageGekko) {
func_800AE434(play, &gekkoDamageColor, this->damageSpinTimer, 20);
} else if ((this->actionFunc == EnBigslime_CutsceneDefeat) || (this->actionFunc == EnBigslime_GekkoDespawn)) {
@@ -3123,7 +3129,7 @@ void EnBigslime_DrawShatteringEffects(EnBigslime* this, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
// Draw Shockwave
if (this->shockwaveAlpha > 0) {
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 43e87a90a..745e3b3e7 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
@@ -434,9 +434,11 @@ void EnBji01_Draw(Actor* thisx, PlayState* play) {
EnBji01* this = THIS;
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sEyeTextures[this->eyeTexIndex]));
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnBji01_OverrideLimbDraw, EnBji01_PostLimbDraw, &this->actor);
+
CLOSE_DISPS(play->state.gfxCtx);
}
diff --git a/src/overlays/actors/ovl_En_Bjt/z_en_bjt.c b/src/overlays/actors/ovl_En_Bjt/z_en_bjt.c
index 5ebfca40f..6aa9f9e35 100644
--- a/src/overlays/actors/ovl_En_Bjt/z_en_bjt.c
+++ b/src/overlays/actors/ovl_En_Bjt/z_en_bjt.c
@@ -456,7 +456,7 @@ void EnBjt_Draw(Actor* thisx, PlayState* play) {
EnBjt* this = THIS;
if (this->scheduleResult != TOILET_HAND_SCH_NONE) {
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
NULL, NULL, &this->actor);
}
diff --git a/src/overlays/actors/ovl_En_Bom/z_en_bom.c b/src/overlays/actors/ovl_En_Bom/z_en_bom.c
index 4ebdbe916..b388421b7 100644
--- a/src/overlays/actors/ovl_En_Bom/z_en_bom.c
+++ b/src/overlays/actors/ovl_En_Bom/z_en_bom.c
@@ -348,7 +348,7 @@ void EnBom_Explode(EnBom* this, PlayState* play) {
this->collider2.elements->dim.worldSphere.radius = D_80872E8C[this->isPowderKeg];
if (this->timer == 7) {
- this->collider2.base.atFlags &= ~OC1_TYPE_1;
+ this->collider2.base.atFlags &= ~AT_TYPE_ENEMY;
}
if (this->actor.params == BOMB_TYPE_EXPLOSION) {
@@ -423,8 +423,8 @@ void EnBom_Explode(EnBom* this, PlayState* play) {
}
}
-static s16 D_80872E98[] = { 3, 5 };
-static s16 D_80872E9C[] = { 10, 15 };
+static s16 sQuakeY[] = { 3, 5 };
+static s16 sQuakeDurations[] = { 10, 15 };
void EnBom_Update(Actor* thisx, PlayState* play) {
Vec3f effVelocity = { 0.0f, 0.0f, 0.0f };
@@ -545,7 +545,8 @@ void EnBom_Update(Actor* thisx, PlayState* play) {
}
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_CLEAR_TAG, effPos.x, effPos.y - 10.0f, effPos.z, 0, 0, 0,
this->isPowderKeg);
- func_800BC848(thisx, play, D_80872E98[this->isPowderKeg], D_80872E9C[this->isPowderKeg]);
+ Actor_RequestQuakeAndRumble(thisx, play, sQuakeY[this->isPowderKeg],
+ sQuakeDurations[this->isPowderKeg]);
play->envCtx.lightSettings.diffuseColor1[0] = play->envCtx.lightSettings.diffuseColor1[1] =
play->envCtx.lightSettings.diffuseColor1[2] = 250;
play->envCtx.lightSettings.ambientColor[0] = play->envCtx.lightSettings.ambientColor[1] =
@@ -615,7 +616,7 @@ void EnBom_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
if (this->actor.params == BOMB_TYPE_BODY) {
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
Collider_UpdateSpheres(0, &this->collider2);
diff --git a/src/overlays/actors/ovl_En_Bom/z_en_bom.h b/src/overlays/actors/ovl_En_Bom/z_en_bom.h
index bf568cd6a..40558a919 100644
--- a/src/overlays/actors/ovl_En_Bom/z_en_bom.h
+++ b/src/overlays/actors/ovl_En_Bom/z_en_bom.h
@@ -11,11 +11,17 @@ typedef void (*EnBomActionFunc)(struct EnBom*, PlayState*);
#define ENBOM_GETZ_80(thisx) ((thisx)->shape.rot.z & 0x80)
#define ENBOM_GETZ_FF00(thisx) (((thisx)->shape.rot.z & 0xFF00) >> 8)
-typedef enum {
+typedef enum BombType {
/* 0 */ BOMB_TYPE_BODY,
/* 1 */ BOMB_TYPE_EXPLOSION,
} BombType;
+// Passed via x rotation
+typedef enum EnBomExplosiveType {
+ /* 0 */ BOMB_EXPLOSIVE_TYPE_BOMB,
+ /* 1 */ BOMB_EXPLOSIVE_TYPE_POWDER_KEG,
+} EnBomExplosiveType;
+
typedef struct EnBom {
/* 0x000 */ Actor actor;
/* 0x144 */ ColliderCylinder collider1;
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 ae45b0cc5..8d104842a 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
@@ -678,8 +678,8 @@ void EnBomBowlMan_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(D_809C6214[this->unk_2F0]));
gSPSegment(POLY_OPA_DISP++, 0x09, Lib_SegmentedToVirtual(D_809C6220[this->unk_2F4]));
diff --git a/src/overlays/actors/ovl_En_Bom_Chu/z_en_bom_chu.c b/src/overlays/actors/ovl_En_Bom_Chu/z_en_bom_chu.c
index a2246b442..4355759c7 100644
--- a/src/overlays/actors/ovl_En_Bom_Chu/z_en_bom_chu.c
+++ b/src/overlays/actors/ovl_En_Bom_Chu/z_en_bom_chu.c
@@ -326,7 +326,7 @@ void EnBomChu_Explode(EnBomChu* this, PlayState* play) {
s32 i;
bomb = (EnBom*)Actor_Spawn(&play->actorCtx, play, ACTOR_EN_BOM, this->actor.world.pos.x, this->actor.world.pos.y,
- this->actor.world.pos.z, 0, 0, 0, 0);
+ this->actor.world.pos.z, BOMB_EXPLOSIVE_TYPE_BOMB, 0, 0, BOMB_TYPE_BODY);
this->shouldTimerCountDown = true;
this->isMoving = false;
@@ -542,7 +542,7 @@ void EnBomChu_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
func_800B8050(&this->actor, play, 0);
if (this->timer >= 40) {
diff --git a/src/overlays/actors/ovl_En_Bombal/z_en_bombal.c b/src/overlays/actors/ovl_En_Bombal/z_en_bombal.c
index b67ca6820..ef30692e6 100644
--- a/src/overlays/actors/ovl_En_Bombal/z_en_bombal.c
+++ b/src/overlays/actors/ovl_En_Bombal/z_en_bombal.c
@@ -249,15 +249,15 @@ void EnBombal_DrawEffects(EnBombal* this, PlayState* play) {
OPEN_DISPS(gfxCtx);
- func_8012C28C(gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
for (i = 0; i < ARRAY_COUNT(this->effects); i++, sPtr++) {
if (sPtr->isEnabled != 0) {
Matrix_Translate(sPtr->pos.x, sPtr->pos.y, sPtr->pos.z, MTXMODE_NEW);
Matrix_Scale(sPtr->scale, sPtr->scale, sPtr->scale, MTXMODE_APPLY);
- POLY_XLU_DISP = Gfx_CallSetupDL(POLY_XLU_DISP, 0x14);
+ POLY_XLU_DISP = Gfx_SetupDL(POLY_XLU_DISP, SETUPDL_20);
gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(&gSun1Tex));
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 64f900f32..86cad7219 100644
--- a/src/overlays/actors/ovl_En_Bombers/z_en_bombers.c
+++ b/src/overlays/actors/ovl_En_Bombers/z_en_bombers.c
@@ -519,8 +519,8 @@ void EnBombers_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(D_80C0482C[this->unk_2B8]));
gSPSegment(POLY_OPA_DISP++, 0x09, Lib_SegmentedToVirtual(D_80C04838[this->unk_2BE]));
diff --git a/src/overlays/actors/ovl_En_Bombers2/z_en_bombers2.c b/src/overlays/actors/ovl_En_Bombers2/z_en_bombers2.c
index b47a9630f..81e8723e0 100644
--- a/src/overlays/actors/ovl_En_Bombers2/z_en_bombers2.c
+++ b/src/overlays/actors/ovl_En_Bombers2/z_en_bombers2.c
@@ -425,12 +425,12 @@ s32 func_80C056D4(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s
}
void EnBombers2_Draw(Actor* thisx, PlayState* play) {
-
EnBombers2* this = THIS;
+
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sEyeTextures[this->eyeIndex]));
gSPSegment(POLY_OPA_DISP++, 0x09, Lib_SegmentedToVirtual(D_80C05920));
gSPSegment(POLY_OPA_DISP++, 0x0A, Lib_SegmentedToVirtual(sSetPrimColorDlPtr));
diff --git a/src/overlays/actors/ovl_En_Bombf/z_en_bombf.c b/src/overlays/actors/ovl_En_Bombf/z_en_bombf.c
index 2493d819b..cc9ac1e2c 100644
--- a/src/overlays/actors/ovl_En_Bombf/z_en_bombf.c
+++ b/src/overlays/actors/ovl_En_Bombf/z_en_bombf.c
@@ -473,7 +473,7 @@ void EnBombf_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
if (ENBOMBF_GET(&this->actor) <= ENBOMBF_0) {
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
if (ENBOMBF_GET(&this->actor) != ENBOMBF_0) {
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
diff --git a/src/overlays/actors/ovl_En_Bomjima/z_en_bomjima.c b/src/overlays/actors/ovl_En_Bomjima/z_en_bomjima.c
index aad6d9bc3..8260386df 100644
--- a/src/overlays/actors/ovl_En_Bomjima/z_en_bomjima.c
+++ b/src/overlays/actors/ovl_En_Bomjima/z_en_bomjima.c
@@ -1098,8 +1098,8 @@ void EnBomjima_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(D_80C00B3C[this->unk_2E0]));
gSPSegment(POLY_OPA_DISP++, 0x09, Lib_SegmentedToVirtual(D_80C00B48[this->unk_2E4]));
diff --git a/src/overlays/actors/ovl_En_Bomjimb/z_en_bomjimb.c b/src/overlays/actors/ovl_En_Bomjimb/z_en_bomjimb.c
index 58f2131fb..687937e2a 100644
--- a/src/overlays/actors/ovl_En_Bomjimb/z_en_bomjimb.c
+++ b/src/overlays/actors/ovl_En_Bomjimb/z_en_bomjimb.c
@@ -912,8 +912,8 @@ void EnBomjimb_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(D_80C03274[this->unk_2C2]));
gSPSegment(POLY_OPA_DISP++, 0x09, Lib_SegmentedToVirtual(D_80C03280[this->unk_2C8]));
diff --git a/src/overlays/actors/ovl_En_Boom/z_en_boom.c b/src/overlays/actors/ovl_En_Boom/z_en_boom.c
index 4abfad7b1..e18751369 100644
--- a/src/overlays/actors/ovl_En_Boom/z_en_boom.c
+++ b/src/overlays/actors/ovl_En_Boom/z_en_boom.c
@@ -164,7 +164,7 @@ void EnBoom_Destroy(Actor* thisx, PlayState* play) {
}
void func_808A2918(EnBoom* this, PlayState* play) {
- Actor* sp7C;
+ Actor* targetActor;
Player* player = GET_PLAYER(play);
s32 sp74;
s16 sp72;
@@ -175,25 +175,26 @@ void func_808A2918(EnBoom* this, PlayState* play) {
f32 sp64;
f32 distXYZ;
- sp7C = this->player;
+ targetActor = this->moveTo;
- if (sp7C != NULL) {
- sp72 = Actor_WorldYawTowardPoint(&this->actor, &sp7C->focus.pos);
+ if (targetActor != NULL) {
+ sp72 = Actor_WorldYawTowardPoint(&this->actor, &targetActor->focus.pos);
sp70 = this->actor.world.rot.y - sp72;
- sp6E = Actor_WorldPitchTowardPoint(&this->actor, &sp7C->focus.pos);
+ sp6E = Actor_WorldPitchTowardPoint(&this->actor, &targetActor->focus.pos);
sp6C = this->actor.world.rot.x - sp6E;
- sp64 = (200.0f - Math_Vec3f_DistXYZ(&this->actor.world.pos, &sp7C->focus.pos)) * 0.005f;
+ sp64 = (200.0f - Math_Vec3f_DistXYZ(&this->actor.world.pos, &targetActor->focus.pos)) * 0.005f;
if (sp64 < 0.12f) {
sp64 = 0.12f;
}
- if ((&player->actor != sp7C) && ((sp7C->update == NULL) || ((this->unk_1CF < 0) && (ABS_ALT(sp70) > 0x4000)))) {
- this->player = NULL;
+ if ((&player->actor != targetActor) &&
+ ((targetActor->update == NULL) || ((this->unk_1CF < 0) && (ABS_ALT(sp70) > 0x4000)))) {
+ this->moveTo = NULL;
} else {
if (this->unk_1CE != 0) {
this->unk_1CE--;
- this->actor.world.rot.y += (this->actor.params == 0) ? 0x190 : -0x190;
+ this->actor.world.rot.y += (this->actor.params == ZORA_BOOMERANG_LEFT) ? 0x190 : -0x190;
} else {
if (this->unk_1CF > 0) {
this->unk_1CF--;
@@ -242,7 +243,7 @@ void func_808A2918(EnBoom* this, PlayState* play) {
if (sp74 != 0) {
this->actor.world.rot.x = -this->actor.world.rot.x;
this->actor.world.rot.y += 0x8000;
- this->player = &player->actor;
+ this->moveTo = &player->actor;
this->unk_1CC = 0;
}
}
@@ -250,34 +251,34 @@ void func_808A2918(EnBoom* this, PlayState* play) {
if (this->unk_1CC <= 16) {
distXYZ = Math_Vec3f_DistXYZ(&this->actor.world.pos, &player->actor.focus.pos);
- if (&player->actor != this->player) {
- if (this->player == 0) {
+ if (&player->actor != this->moveTo) {
+ if (this->moveTo == 0) {
this->unk_1CE = 8;
}
- this->player = &player->actor;
+ this->moveTo = &player->actor;
}
if (distXYZ < 40.0f) {
- sp7C = this->unk_1C8;
- if (sp7C != NULL) {
- Math_Vec3f_Copy(&sp7C->world.pos, &player->actor.world.pos);
- if (sp7C->id == ACTOR_EN_ITEM00) {
- sp7C->gravity = -0.9f;
- sp7C->bgCheckFlags &= ~(BGCHECKFLAG_GROUND | BGCHECKFLAG_GROUND_TOUCH);
+ targetActor = this->unk_1C8;
+ if (targetActor != NULL) {
+ Math_Vec3f_Copy(&targetActor->world.pos, &player->actor.world.pos);
+ if (targetActor->id == ACTOR_EN_ITEM00) {
+ targetActor->gravity = -0.9f;
+ targetActor->bgCheckFlags &= ~(BGCHECKFLAG_GROUND | BGCHECKFLAG_GROUND_TOUCH);
} else {
- sp7C->flags &= ~ACTOR_FLAG_2000;
+ targetActor->flags &= ~ACTOR_FLAG_2000;
}
}
Actor_Kill(&this->actor);
}
}
- sp7C = this->unk_1C8;
- if (sp7C != NULL) {
- if (sp7C->update == NULL) {
+ targetActor = this->unk_1C8;
+ if (targetActor != NULL) {
+ if (targetActor->update == NULL) {
this->unk_1C8 = NULL;
} else {
- Math_Vec3f_Copy(&sp7C->world.pos, &this->actor.world.pos);
+ Math_Vec3f_Copy(&targetActor->world.pos, &this->actor.world.pos);
}
}
}
@@ -298,7 +299,7 @@ void EnBoom_Update(Actor* thisx, PlayState* play) {
Actor_SetFocus(&this->actor, 0.0f);
}
- if (this->actor.params != 0) {
+ if (this->actor.params != ZORA_BOOMERANG_LEFT) {
this->unk_1CD--;
} else {
this->unk_1CD++;
@@ -326,7 +327,7 @@ void EnBoom_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
Matrix_RotateYS(this->actor.world.rot.y, MTXMODE_APPLY);
- Matrix_RotateZS((this->actor.params != 0) ? 0x1F40 : -0x1F40, MTXMODE_APPLY);
+ Matrix_RotateZS((this->actor.params != ZORA_BOOMERANG_LEFT) ? 0x1F40 : -0x1F40, MTXMODE_APPLY);
Matrix_RotateXS(this->actor.world.rot.x, MTXMODE_APPLY);
Matrix_MultVec3f(&sp58->unk_04, &sp4C);
Matrix_MultVec3f(&sp58->unk_10, &sp40);
@@ -335,7 +336,7 @@ void EnBoom_Draw(Actor* thisx, PlayState* play) {
EffectBlure_AddVertex(Effect_GetByIndex(this->effectIndex), &sp4C, &sp40);
}
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
Matrix_RotateYS(this->unk_1CD * 0x2EE0, MTXMODE_APPLY);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
diff --git a/src/overlays/actors/ovl_En_Boom/z_en_boom.h b/src/overlays/actors/ovl_En_Boom/z_en_boom.h
index e5e3fa2b3..7bae2b150 100644
--- a/src/overlays/actors/ovl_En_Boom/z_en_boom.h
+++ b/src/overlays/actors/ovl_En_Boom/z_en_boom.h
@@ -3,6 +3,11 @@
#include "global.h"
+typedef enum {
+ /* 0 */ ZORA_BOOMERANG_LEFT,
+ /* 1 */ ZORA_BOOMERANG_RIGHT
+} EnBoomType;
+
struct EnBoom;
typedef void (*EnBoomActionFunc)(struct EnBoom*, PlayState*);
@@ -10,7 +15,7 @@ typedef void (*EnBoomActionFunc)(struct EnBoom*, PlayState*);
typedef struct EnBoom {
/* 0x000 */ Actor actor;
/* 0x144 */ ColliderQuad collider;
- /* 0x1C4 */ Actor* player;
+ /* 0x1C4 */ Actor* moveTo;
/* 0x1C8 */ Actor* unk_1C8;
/* 0x1CC */ u8 unk_1CC;
/* 0x1CD */ u8 unk_1CD;
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 302547c26..a32f2f410 100644
--- a/src/overlays/actors/ovl_En_Box/z_en_box.c
+++ b/src/overlays/actors/ovl_En_Box/z_en_box.c
@@ -143,7 +143,7 @@ void func_80867C8C(struct_80867BDC_a0* arg0, PlayState* play) {
Matrix_Scale(temp_f26, temp_f26, temp_f26, MTXMODE_APPLY);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0x80, 255, 255, 255, 255);
gDPSetEnvColor(POLY_XLU_DISP++, 255, 150, 0, 255);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
Matrix_Mult(&play->billboardMtxF, MTXMODE_APPLY);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_XLU_DISP++, gEffFlash1DL);
@@ -704,12 +704,12 @@ void EnBox_Draw(Actor* thisx, PlayState* play) {
gDPPipeSync(POLY_OPA_DISP++);
gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 255);
gSPSegment(POLY_OPA_DISP++, 0x08, EnBox_SetRenderMode1(play->state.gfxCtx));
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
POLY_OPA_DISP = SkelAnime_Draw(play, this->skelAnime.skeleton, this->skelAnime.jointTable, NULL,
EnBox_PostLimbDraw, &this->dyna.actor, POLY_OPA_DISP);
} else if (this->alpha != 0) {
gDPPipeSync(POLY_XLU_DISP++);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gDPSetEnvColor(POLY_XLU_DISP++, 0, 0, 0, this->alpha);
if ((this->type == ENBOX_TYPE_BIG_INVISIBLE) || (this->type == ENBOX_TYPE_SMALL_INVISIBLE)) {
gSPSegment(POLY_XLU_DISP++, 0x08, EnBox_SetRenderMode3(play->state.gfxCtx));
diff --git a/src/overlays/actors/ovl_En_Bubble/z_en_bubble.c b/src/overlays/actors/ovl_En_Bubble/z_en_bubble.c
index 1c0c2cfc4..92d56eec5 100644
--- a/src/overlays/actors/ovl_En_Bubble/z_en_bubble.c
+++ b/src/overlays/actors/ovl_En_Bubble/z_en_bubble.c
@@ -405,7 +405,7 @@ void EnBubble_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
if (this->actionFunc != EnBubble_Disappear) {
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
Math_SmoothStepToF(&this->modelRotSpeed, 16.0f, 0.2f, 1000.0f, 0.0f);
Math_SmoothStepToF(&this->modelEllipticity, 0.08f, 0.2f, 1000.0f, 0.0f);
Matrix_ReplaceRotation(&play->billboardMtxF);
diff --git a/src/overlays/actors/ovl_En_Butte/z_en_butte.c b/src/overlays/actors/ovl_En_Butte/z_en_butte.c
index 05072da72..ce859ad53 100644
--- a/src/overlays/actors/ovl_En_Butte/z_en_butte.c
+++ b/src/overlays/actors/ovl_En_Butte/z_en_butte.c
@@ -139,7 +139,7 @@ void func_8091C178(EnButte* this, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C240(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu2(play->state.gfxCtx);
sp48 = Math_SinS(D_8091D3A0) * 250.0f;
sp48 = CLAMP(sp48, 0, 255);
@@ -416,7 +416,7 @@ void EnButte_Update(Actor* thisx, PlayState* play) {
this->unk_258 += 0x600;
if (ENBUTTE_GET_1(&this->actor) == ENBUTTE_1) {
- if (GET_PLAYER(play)->meleeWeaponState == 0) {
+ if (GET_PLAYER(play)->meleeWeaponState == PLAYER_MELEE_WEAPON_STATE_0) {
if (this->unk_252 > 0) {
this->unk_252--;
}
@@ -446,7 +446,7 @@ void EnButte_Draw(Actor* thisx, PlayState* play) {
EnButte* this = THIS;
if (this->unk_250 != 0) {
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, NULL, NULL, NULL);
}
diff --git a/src/overlays/actors/ovl_En_Clear_Tag/z_en_clear_tag.c b/src/overlays/actors/ovl_En_Clear_Tag/z_en_clear_tag.c
index 21278af9f..7666f8e12 100644
--- a/src/overlays/actors/ovl_En_Clear_Tag/z_en_clear_tag.c
+++ b/src/overlays/actors/ovl_En_Clear_Tag/z_en_clear_tag.c
@@ -807,8 +807,9 @@ void EnClearTag_DrawEffects(Actor* thisx, PlayState* play) {
EnClearTagEffect* firstEffect = this->effect;
OPEN_DISPS(gfxCtx);
- func_8012C28C(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
// Draw all Debris effects.
for (i = 0; i < ARRAY_COUNT(this->effect); i++, effect++) {
@@ -981,7 +982,7 @@ void EnClearTag_DrawEffects(Actor* thisx, PlayState* play) {
gDPSetEnvColor(POLY_XLU_DISP++, 255, 255, 255, 200);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 255, 200);
gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(sWaterSplashTextures[effect->actionTimer]));
- func_8012C9BC(gfxCtx);
+ Gfx_SetupDL61_Xlu(gfxCtx);
gSPClearGeometryMode(POLY_XLU_DISP++, G_CULL_BACK);
isMaterialApplied++;
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 7fc741ebe..8d841fdd2 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
@@ -310,7 +310,7 @@ void EnCne01_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Gfx_EnvColor(play->state.gfxCtx, 160, 180, 255, 0));
gSPSegment(POLY_OPA_DISP++, 0x09, Gfx_EnvColor(play->state.gfxCtx, 160, 180, 255, 0));
gSPSegment(POLY_OPA_DISP++, 0x0A, Gfx_EnvColor(play->state.gfxCtx, 160, 180, 255, 0));
diff --git a/src/overlays/actors/ovl_En_Col_Man/z_en_col_man.c b/src/overlays/actors/ovl_En_Col_Man/z_en_col_man.c
index 6f7d32de1..703585dd4 100644
--- a/src/overlays/actors/ovl_En_Col_Man/z_en_col_man.c
+++ b/src/overlays/actors/ovl_En_Col_Man/z_en_col_man.c
@@ -203,7 +203,8 @@ void func_80AFE25C(EnColMan* this, PlayState* play) {
CLEAR_TAG_SMALL_EXPLOSION);
} else {
EnBom* bomb = (EnBom*)Actor_Spawn(&play->actorCtx, play, ACTOR_EN_BOM, this->actor.world.pos.x,
- this->actor.world.pos.y, this->actor.world.pos.z, 0, 0, 0, 0);
+ this->actor.world.pos.y, this->actor.world.pos.z,
+ BOMB_EXPLOSIVE_TYPE_BOMB, 0, 0, BOMB_TYPE_BODY);
if (bomb != NULL) {
bomb->timer = 0;
@@ -233,45 +234,56 @@ void func_80AFE414(Actor* thisx, PlayState* play) {
EnColMan* this = THIS;
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
func_800B8118(&this->actor, play, 0);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_XLU_DISP++, gHeartPieceInteriorDL);
+
CLOSE_DISPS(play->state.gfxCtx);
}
void func_80AFE4AC(Actor* thisx, PlayState* play) {
EnColMan* this = THIS;
- func_8012C2DC(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+
OPEN_DISPS(play->state.gfxCtx);
+
POLY_OPA_DISP = Play_SetFog(play, POLY_OPA_DISP);
- POLY_OPA_DISP = func_8012C724(POLY_OPA_DISP);
+ POLY_OPA_DISP = Gfx_SetupDL66(POLY_OPA_DISP);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(gDropRecoveryHeartTex));
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, gItemDropDL);
+
CLOSE_DISPS(play->state.gfxCtx);
}
void func_80AFE584(Actor* thisx, PlayState* play) {
- func_8012C2DC(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+
OPEN_DISPS(play->state.gfxCtx);
+
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0x80, 255, 255, 255, 255);
gDPSetEnvColor(POLY_OPA_DISP++, 255, 255, 255, 255);
gSPDisplayList(POLY_OPA_DISP++, gameplay_keep_DL_06AB30);
+
CLOSE_DISPS(play->state.gfxCtx);
}
void func_80AFE650(Actor* thisx, PlayState* play) {
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+
OPEN_DISPS(play->state.gfxCtx);
+
POLY_OPA_DISP = Play_SetFog(play, POLY_OPA_DISP);
- POLY_OPA_DISP = func_8012C724(POLY_OPA_DISP);
+ POLY_OPA_DISP = Gfx_SetupDL66(POLY_OPA_DISP);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(gDropBombTex));
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, gItemDropDL);
+
CLOSE_DISPS(play->state.gfxCtx);
}
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 beed3fb26..677c029cb 100644
--- a/src/overlays/actors/ovl_En_Cow/z_en_cow.c
+++ b/src/overlays/actors/ovl_En_Cow/z_en_cow.c
@@ -421,7 +421,7 @@ void EnCow_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
void EnCow_Draw(Actor* thisx, PlayState* play) {
EnCow* this = THIS;
- func_8012C5B0(play->state.gfxCtx);
+ Gfx_SetupDL37_Opa(play->state.gfxCtx);
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnCow_OverrideLimbDraw, EnCow_PostLimbDraw, &this->actor);
}
@@ -429,7 +429,7 @@ void EnCow_Draw(Actor* thisx, PlayState* play) {
void EnCow_DrawTail(Actor* thisx, PlayState* play) {
EnCow* this = THIS;
- func_8012C5B0(play->state.gfxCtx);
+ Gfx_SetupDL37_Opa(play->state.gfxCtx);
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount, NULL,
NULL, &this->actor);
}
diff --git a/src/overlays/actors/ovl_En_Crow/z_en_crow.c b/src/overlays/actors/ovl_En_Crow/z_en_crow.c
index 623d12f0e..f524e6d5e 100644
--- a/src/overlays/actors/ovl_En_Crow/z_en_crow.c
+++ b/src/overlays/actors/ovl_En_Crow/z_en_crow.c
@@ -6,7 +6,7 @@
#include "z_en_crow.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_1000 | ACTOR_FLAG_4000)
+#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_IGNORE_QUAKE | ACTOR_FLAG_4000)
#define THIS ((EnCrow*)thisx)
@@ -574,7 +574,7 @@ void EnCrow_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot
void EnCrow_Draw(Actor* thisx, PlayState* play) {
EnCrow* this = THIS;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnCrow_OverrideLimbDraw, EnCrow_PostLimbDraw, &this->actor);
Actor_DrawDamageEffects(play, &this->actor, this->bodyPartsPos, ARRAY_COUNT(this->bodyPartsPos),
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 7b3f97ded..25013327a 100644
--- a/src/overlays/actors/ovl_En_Dai/z_en_dai.c
+++ b/src/overlays/actors/ovl_En_Dai/z_en_dai.c
@@ -62,7 +62,7 @@ void func_80B3E168(EnDaiEffect* effect, PlayState* play2) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
for (i = 0; i < EN_DAI_EFFECT_COUNT; i++, effect++) {
if (effect->isEnabled == true) {
@@ -649,7 +649,7 @@ void func_80B3F78C(EnDai* this, PlayState* play) {
this->unk_1CE &= ~0x40;
}
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
OPEN_DISPS(play->state.gfxCtx);
@@ -683,7 +683,7 @@ void func_80B3F920(EnDai* this, PlayState* play) {
this->unk_1CE |= 0x40;
if (this->unk_1CD == 0xFF) {
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
OPEN_DISPS(play->state.gfxCtx);
@@ -701,7 +701,7 @@ void func_80B3F920(EnDai* this, PlayState* play) {
CLOSE_DISPS(play->state.gfxCtx);
} else {
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
OPEN_DISPS(play->state.gfxCtx);
diff --git a/src/overlays/actors/ovl_En_Daiku/z_en_daiku.c b/src/overlays/actors/ovl_En_Daiku/z_en_daiku.c
index b988155c7..558824ad8 100644
--- a/src/overlays/actors/ovl_En_Daiku/z_en_daiku.c
+++ b/src/overlays/actors/ovl_En_Daiku/z_en_daiku.c
@@ -324,7 +324,7 @@ void EnDaiku_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
switch (this->unk_278) {
case 0:
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 d8a8a78e8..be45cfac6 100644
--- a/src/overlays/actors/ovl_En_Daiku2/z_en_daiku2.c
+++ b/src/overlays/actors/ovl_En_Daiku2/z_en_daiku2.c
@@ -466,7 +466,7 @@ void EnDaiku2_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* r
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
if (limbIndex == 14) {
Matrix_Scale(this->unk_260, this->unk_260, this->unk_260, MTXMODE_APPLY);
@@ -486,7 +486,7 @@ void EnDaiku2_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gDPSetEnvColor(POLY_OPA_DISP++, 245, 155, 0, 255);
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount, NULL,
EnDaiku2_PostLimbDraw, &this->actor);
@@ -544,7 +544,7 @@ void func_80BE7718(EnDaiku2* this, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
objectIdx = Object_GetIndex(&play->objectCtx, OBJECT_BOMBIWA);
if ((objectIdx >= 0) && Object_IsLoaded(&play->objectCtx, objectIdx)) {
diff --git a/src/overlays/actors/ovl_En_Death/z_en_death.c b/src/overlays/actors/ovl_En_Death/z_en_death.c
index dd05c2d48..de02f44ad 100644
--- a/src/overlays/actors/ovl_En_Death/z_en_death.c
+++ b/src/overlays/actors/ovl_En_Death/z_en_death.c
@@ -7,7 +7,7 @@
#include "z_en_death.h"
#include "z64rumble.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_10 | ACTOR_FLAG_20 | ACTOR_FLAG_1000)
+#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_10 | ACTOR_FLAG_20 | ACTOR_FLAG_IGNORE_QUAKE)
#define THIS ((EnDeath*)thisx)
diff --git a/src/overlays/actors/ovl_En_Dekubaba/z_en_dekubaba.c b/src/overlays/actors/ovl_En_Dekubaba/z_en_dekubaba.c
index e969abffa..186494268 100644
--- a/src/overlays/actors/ovl_En_Dekubaba/z_en_dekubaba.c
+++ b/src/overlays/actors/ovl_En_Dekubaba/z_en_dekubaba.c
@@ -1319,7 +1319,7 @@ void EnDekubaba_DrawShadow(EnDekubaba* this, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C448(play->state.gfxCtx);
+ Gfx_SetupDL44_Xlu(play->state.gfxCtx);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 0, 0, 0, 255);
@@ -1347,7 +1347,7 @@ void EnDekubaba_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
Math_Vec3f_Copy(&this->bodyPartsPos[0], &this->actor.world.pos);
if (this->actionFunc != EnDekubaba_DeadStickDrop) {
diff --git a/src/overlays/actors/ovl_En_Demo_heishi/z_en_demo_heishi.c b/src/overlays/actors/ovl_En_Demo_heishi/z_en_demo_heishi.c
index 986953d0f..5b5857c94 100644
--- a/src/overlays/actors/ovl_En_Demo_heishi/z_en_demo_heishi.c
+++ b/src/overlays/actors/ovl_En_Demo_heishi/z_en_demo_heishi.c
@@ -188,7 +188,7 @@ s32 EnDemoheishi_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, V
void EnDemoheishi_Draw(Actor* thisx, PlayState* play) {
EnDemoheishi* this = THIS;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnDemoheishi_OverrideLimbDraw, NULL, &this->actor);
}
diff --git a/src/overlays/actors/ovl_En_Dg/z_en_dg.c b/src/overlays/actors/ovl_En_Dg/z_en_dg.c
index 360cf2c49..0c84f91bc 100644
--- a/src/overlays/actors/ovl_En_Dg/z_en_dg.c
+++ b/src/overlays/actors/ovl_En_Dg/z_en_dg.c
@@ -5,13 +5,12 @@
*/
#include "z_en_dg.h"
+#include "overlays/actors/ovl_En_Aob_01/z_en_aob_01.h"
#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10 | ACTOR_FLAG_800000)
#define THIS ((EnDg*)thisx)
-//! TODO: this file require macros for its uses of weekEventReg
-
void EnDg_Init(Actor* thisx, PlayState* play);
void EnDg_Destroy(Actor* thisx, PlayState* play);
void EnDg_Update(Actor* thisx, PlayState* play);
@@ -417,20 +416,13 @@ void EnDg_SetupIdleMove(EnDg* this, PlayState* play) {
/**
* Updates the text ID in sRacetrackDogInfo based on what was set in the weekEventRegs by
- * En_Aob_01. This makes it sp the proper message can be displayed when the player picks up
+ * En_Aob_01. This makes it so the proper message can be displayed when the player picks up
* the dog with the Mask of Truth equipped.
*/
void EnDg_UpdateTextId(EnDg* this) {
- if (this->index < 14) {
- // Assuming that the weekEventRegs haven't been tampered with, then this will produce a text ID in
- // the range of 0x3538 to 0x3545.
- if (this->index % 2) {
- sRacetrackDogInfo[this->index].textId =
- 0x3538 + ((gSaveContext.save.saveInfo.weekEventReg[42 + (this->index / 2)] & 0xF0) >> 4);
- } else {
- sRacetrackDogInfo[this->index].textId =
- 0x3538 + (gSaveContext.save.saveInfo.weekEventReg[42 + (this->index / 2)] & 0x0F);
- }
+ if (this->index < RACEDOG_COUNT) {
+ // This will produce a text ID in the range of 0x3538 to 0x3545.
+ sRacetrackDogInfo[this->index].textId = GET_WEEKEVENTREG_DOG_RACE_TEXT(this->index, 0x3538);
} else {
Actor_Kill(&this->actor);
}
@@ -1387,7 +1379,7 @@ void EnDg_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gDPPipeSync(POLY_OPA_DISP++);
diff --git a/src/overlays/actors/ovl_En_Dinofos/z_en_dinofos.c b/src/overlays/actors/ovl_En_Dinofos/z_en_dinofos.c
index 535b0d65f..5b268f1f8 100644
--- a/src/overlays/actors/ovl_En_Dinofos/z_en_dinofos.c
+++ b/src/overlays/actors/ovl_En_Dinofos/z_en_dinofos.c
@@ -438,8 +438,9 @@ s32 func_8089AE00(EnDinofos* this, PlayState* play) {
return true;
}
- if ((this->actor.xzDistToPlayer < 100.0f) && (player->meleeWeaponState != 0) && this->actor.isTargeted &&
- (Rand_ZeroOne() < 0.5f) && func_8089A968(this) && Player_IsFacingActor(&this->actor, 0x2000, play)) {
+ if ((this->actor.xzDistToPlayer < 100.0f) && (player->meleeWeaponState != PLAYER_MELEE_WEAPON_STATE_0) &&
+ this->actor.isTargeted && (Rand_ZeroOne() < 0.5f) && func_8089A968(this) &&
+ Player_IsFacingActor(&this->actor, 0x2000, play)) {
if (Rand_ZeroOne() < 0.5f) {
func_8089C024(this, 2);
} else {
@@ -1474,7 +1475,7 @@ void EnDinofos_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
if (this->unk_288 == 255) {
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
func_800B8050(&this->actor, play, 0);
gSPSegment(POLY_OPA_DISP++, 0x08, D_8089E33C[this->unk_289]);
@@ -1485,7 +1486,7 @@ void EnDinofos_Draw(Actor* thisx, PlayState* play) {
SkelAnime_DrawFlex(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
func_8089DC4C, func_8089DC84, &this->actor, POLY_OPA_DISP);
} else {
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
func_800B8118(&this->actor, play, 0);
gSPSegment(POLY_XLU_DISP++, 0x08, D_8089E33C[this->unk_289]);
diff --git a/src/overlays/actors/ovl_En_Dnb/z_en_dnb.c b/src/overlays/actors/ovl_En_Dnb/z_en_dnb.c
index 8edd1b580..2a5198d1f 100644
--- a/src/overlays/actors/ovl_En_Dnb/z_en_dnb.c
+++ b/src/overlays/actors/ovl_En_Dnb/z_en_dnb.c
@@ -156,7 +156,7 @@ void func_80A50510(EnDnb* this, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
for (i = 0; i < ARRAY_COUNT(this->effects); i++) {
Matrix_Push();
@@ -180,7 +180,7 @@ void func_80A5063C(EnDnb* this, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
for (i = 0; i < ARRAY_COUNT(this->effects); i++) {
Matrix_Push();
@@ -263,12 +263,12 @@ s32 func_80A50950(EnDnbUnkStruct* arg0, PlayState* play2) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
for (i = 0; i < 256; i++, arg0++) {
if (arg0->isEnabled == 1) {
if (!isGfxSetup) {
- POLY_XLU_DISP = Gfx_CallSetupDL(POLY_XLU_DISP, 0);
+ POLY_XLU_DISP = Gfx_SetupDL(POLY_XLU_DISP, SETUPDL_0);
gSPDisplayList(POLY_XLU_DISP++, object_hanareyama_obj_DL_000000);
gDPSetEnvColor(POLY_XLU_DISP++, 255, 255, 255, 0);
isGfxSetup = true;
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 7d59ebeec..216ca0031 100644
--- a/src/overlays/actors/ovl_En_Dnk/z_en_dnk.c
+++ b/src/overlays/actors/ovl_En_Dnk/z_en_dnk.c
@@ -334,7 +334,7 @@ void func_80A51CB8(EnDnk* this, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(D_80A5245C[this->unk_2A0]));
gDPPipeSync(POLY_OPA_DISP++);
@@ -402,7 +402,7 @@ void func_80A51DA4(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Acto
}
void func_80A51FC0(EnDnk* this, PlayState* play) {
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, func_80A51D78, func_80A51DA4,
&this->actor);
}
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 a9128b1bd..b7eb08743 100644
--- a/src/overlays/actors/ovl_En_Dno/z_en_dno.c
+++ b/src/overlays/actors/ovl_En_Dno/z_en_dno.c
@@ -1032,7 +1032,7 @@ void EnDno_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
if (phi_v0 == true) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
if (limbIndex == 13) {
Matrix_Scale(this->unk_454, this->unk_454, this->unk_454, MTXMODE_APPLY);
Matrix_RotateXS(this->unk_45C, MTXMODE_APPLY);
@@ -1058,7 +1058,7 @@ void EnDno_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
Matrix_ReplaceRotation(&play->billboardMtxF);
Matrix_Scale(0.15f, 0.15f, 1.0f, MTXMODE_APPLY);
Matrix_Translate(0.0f, -3200.0f, 0.0f, MTXMODE_APPLY);
- gfxXlu = func_8012C2B4(POLY_XLU_DISP);
+ gfxXlu = Gfx_SetupDL71(POLY_XLU_DISP);
gSPMatrix(gfxXlu, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPSegment(&gfxXlu[1], 0x08,
diff --git a/src/overlays/actors/ovl_En_Dnp/z_en_dnp.c b/src/overlays/actors/ovl_En_Dnp/z_en_dnp.c
index fd1557e3f..0b3c5ac85 100644
--- a/src/overlays/actors/ovl_En_Dnp/z_en_dnp.c
+++ b/src/overlays/actors/ovl_En_Dnp/z_en_dnp.c
@@ -542,7 +542,7 @@ void EnDnp_Draw(Actor* thisx, PlayState* play) {
if (this->unk_322 & 0x100) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sEyeTextures[this->eyeIndex]));
diff --git a/src/overlays/actors/ovl_En_Dnq/z_en_dnq.c b/src/overlays/actors/ovl_En_Dnq/z_en_dnq.c
index c328b02d6..667f1eafb 100644
--- a/src/overlays/actors/ovl_En_Dnq/z_en_dnq.c
+++ b/src/overlays/actors/ovl_En_Dnq/z_en_dnq.c
@@ -469,7 +469,7 @@ void EnDnq_Update(Actor* thisx, PlayState* play) {
void EnDnq_Draw(Actor* thisx, PlayState* play) {
EnDnq* this = THIS;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount, NULL,
NULL, &this->picto.actor);
}
diff --git a/src/overlays/actors/ovl_En_Dns/z_en_dns.c b/src/overlays/actors/ovl_En_Dns/z_en_dns.c
index 1f754f1d5..f481f3d6b 100644
--- a/src/overlays/actors/ovl_En_Dns/z_en_dns.c
+++ b/src/overlays/actors/ovl_En_Dns/z_en_dns.c
@@ -377,7 +377,7 @@ s32 func_8092D068(EnDns* this) {
void func_8092D108(EnDns* this, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
Matrix_SetTranslateRotateYXZ(this->actor.home.pos.x, this->actor.home.pos.y, this->actor.home.pos.z,
&this->actor.home.rot);
@@ -640,7 +640,7 @@ void EnDns_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sEyeTextures[this->eyeIndex]));
gDPPipeSync(POLY_OPA_DISP++);
diff --git a/src/overlays/actors/ovl_En_Dodongo/z_en_dodongo.c b/src/overlays/actors/ovl_En_Dodongo/z_en_dodongo.c
index a57814337..3f149049a 100644
--- a/src/overlays/actors/ovl_En_Dodongo/z_en_dodongo.c
+++ b/src/overlays/actors/ovl_En_Dodongo/z_en_dodongo.c
@@ -914,7 +914,8 @@ void func_808787B0(EnDodongo* this, PlayState* play) {
if (SkelAnime_Update(&this->skelAnime)) {
if (this->timer == 0) {
EnBom* bomb = (EnBom*)Actor_Spawn(&play->actorCtx, play, ACTOR_EN_BOM, this->actor.world.pos.x,
- this->actor.world.pos.y, this->actor.world.pos.z, 0, 0, 0, 0);
+ this->actor.world.pos.y, this->actor.world.pos.z,
+ BOMB_EXPLOSIVE_TYPE_BOMB, 0, 0, BOMB_TYPE_BODY);
if (bomb != NULL) {
bomb->timer = 0;
}
@@ -1102,7 +1103,7 @@ void EnDodongo_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s*
void EnDodongo_Draw(Actor* thisx, PlayState* play) {
EnDodongo* this = THIS;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, EnDodongo_OverrideLimbDraw,
EnDodongo_PostLimbDraw, &this->actor);
Actor_DrawDamageEffects(play, &this->actor, this->limbPos, ARRAY_COUNT(this->limbPos),
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 45119c390..132680094 100644
--- a/src/overlays/actors/ovl_En_Door/z_en_door.c
+++ b/src/overlays/actors/ovl_En_Door/z_en_door.c
@@ -15,7 +15,6 @@
#include "objects/object_wdor03/object_wdor03.h"
#include "objects/object_wdor04/object_wdor04.h"
#include "objects/object_wdor05/object_wdor05.h"
-#include "objects/gameplay_keep/gameplay_keep.h"
#include "objects/object_numa_obj/object_numa_obj.h"
#include "objects/object_kaizoku_obj/object_kaizoku_obj.h"
#include "objects/gameplay_field_keep/gameplay_field_keep.h"
@@ -387,21 +386,22 @@ static Gfx* D_808679A4[14][2] = {
void EnDoor_Init(Actor* thisx, PlayState* play2) {
PlayState* play = play2;
s32 objectBankIndex;
- EnDoorInfo* objectInfo = sObjInfo;
+ EnDoorInfo* objectInfo = &sObjInfo[0];
EnDoor* this = THIS;
s32 i;
- Actor_ProcessInitChain(&this->dyna.actor, sInitChain);
+ Actor_ProcessInitChain(&this->knobDoor.dyna.actor, sInitChain);
- this->unk_1A4 = ENDOOR_GET_PARAMS_7(thisx);
+ this->doorType = ENDOOR_GET_TYPE(thisx);
this->switchFlag = ENDOOR_GET_PARAMS_7F(thisx);
- if ((this->unk_1A4 == 7) && (this->switchFlag == 0)) {
- DynaPolyActor_Init(&this->dyna, 0);
- DynaPolyActor_LoadMesh(play, &this->dyna, &gDoorCol);
+ if ((this->doorType == ENDOOR_TYPE_7) && (this->switchFlag == 0)) {
+ DynaPolyActor_Init(&this->knobDoor.dyna, 0);
+ DynaPolyActor_LoadMesh(play, &this->knobDoor.dyna, &gDoorCol);
}
- SkelAnime_Init(play, &this->skelAnime, &gDoorSkel, &gameplay_keep_Anim_020658, this->limbTable, this->limbTable, 5);
- if (this->unk_1A4 == 5) {
+ SkelAnime_Init(play, &this->knobDoor.skelAnime, &gDoorSkel, &gameplay_keep_Anim_020658, this->limbTable,
+ this->limbTable, DOOR_LIMB_MAX);
+ if (this->doorType == ENDOOR_TYPE_5) {
objectInfo = &sObjInfo[17 + this->switchFlag];
} else {
for (i = 0; i < ARRAY_COUNT(sObjInfo) - 34; i++, objectInfo++) {
@@ -414,52 +414,53 @@ void EnDoor_Init(Actor* thisx, PlayState* play2) {
}
}
- this->dlIndex = objectInfo->dListIndex;
+ this->knobDoor.dlIndex = objectInfo->dListIndex;
objectBankIndex = Object_GetIndex(&play->objectCtx, objectInfo->objectId);
if (objectBankIndex < 0) {
objectInfo = &sObjInfo[15];
objectBankIndex = Object_GetIndex(&play->objectCtx, objectInfo->objectId);
if (objectBankIndex != 0) {
- Actor_Kill(&this->dyna.actor);
+ Actor_Kill(&this->knobDoor.dyna.actor);
return;
}
}
- this->requiredObjBankIndex = objectBankIndex;
- this->dlIndex = objectInfo->dListIndex; // Set twice?
- if (this->dyna.actor.objBankIndex == this->requiredObjBankIndex) {
+ this->knobDoor.requiredObjBankIndex = objectBankIndex;
+ this->knobDoor.dlIndex = objectInfo->dListIndex; // Set twice?
+ if (this->knobDoor.dyna.actor.objBankIndex == this->knobDoor.requiredObjBankIndex) {
func_80866A5C(this, play);
} else {
this->actionFunc = func_80866A5C;
}
- Actor_SetFocus(&this->dyna.actor, 35.0f);
+ Actor_SetFocus(&this->knobDoor.dyna.actor, 35.0f);
}
void EnDoor_Destroy(Actor* thisx, PlayState* play) {
EnDoor* this = (EnDoor*)thisx;
- if (this->unk_1A4 != 7) {
- TransitionActorEntry* transitionEntry = &play->doorCtx.transitionActorList[(u16)this->dyna.actor.params >> 0xA];
+ if (this->doorType != ENDOOR_TYPE_7) {
+ TransitionActorEntry* transitionEntry =
+ &play->doorCtx.transitionActorList[DOOR_GET_TRANSITION_ID(&this->knobDoor.dyna.actor)];
if (transitionEntry->id < 0) {
transitionEntry->id = -transitionEntry->id;
}
} else if (this->switchFlag == 0) {
- DynaPoly_DeleteBgActor(play, &play->colCtx.dyna, this->dyna.bgId);
+ DynaPoly_DeleteBgActor(play, &play->colCtx.dyna, this->knobDoor.dyna.bgId);
}
}
void func_80866A5C(EnDoor* this, PlayState* play) {
- if (Object_IsLoaded(&play->objectCtx, this->requiredObjBankIndex)) {
- this->dyna.actor.objBankIndex = this->requiredObjBankIndex;
+ if (Object_IsLoaded(&play->objectCtx, this->knobDoor.requiredObjBankIndex)) {
+ this->knobDoor.dyna.actor.objBankIndex = this->knobDoor.requiredObjBankIndex;
this->actionFunc = func_80866B20;
- this->dyna.actor.world.rot.y = 0;
- if (this->unk_1A4 == 1) {
+ this->knobDoor.dyna.actor.world.rot.y = 0;
+ if (this->doorType == ENDOOR_TYPE_1) {
if (!Flags_GetSwitch(play, this->switchFlag)) {
this->unk_1A6 = 10;
}
- } else if ((this->unk_1A4 == 4) &&
- (Actor_WorldDistXZToActor(&this->dyna.actor, &GET_PLAYER(play)->actor) > 120.0f)) {
+ } else if ((this->doorType == ENDOOR_TYPE_4) &&
+ (Actor_WorldDistXZToActor(&this->knobDoor.dyna.actor, &GET_PLAYER(play)->actor) > 120.0f)) {
this->actionFunc = func_8086704C;
- this->dyna.actor.world.rot.y = -0x1800;
+ this->knobDoor.dyna.actor.world.rot.y = -0x1800;
}
}
}
@@ -468,28 +469,29 @@ void func_80866B20(EnDoor* this, PlayState* play) {
static s32 D_80867BC0;
Player* player = GET_PLAYER(play);
- if (Actor_ProcessTalkRequest(&this->dyna.actor, &play->state) && (this->dyna.actor.textId == 0x1821)) {
+ if (Actor_ProcessTalkRequest(&this->knobDoor.dyna.actor, &play->state) &&
+ (this->knobDoor.dyna.actor.textId == 0x1821)) {
D_80867BC0 = true;
}
- if (this->unk_1A1 != 0) {
+ if (this->knobDoor.playOpenAnim) {
this->actionFunc = func_80867144;
- Animation_PlayOnceSetSpeed(&this->skelAnime, sAnimations[this->animIndex],
+ Animation_PlayOnceSetSpeed(&this->knobDoor.skelAnime, sAnimations[this->knobDoor.animIndex],
(player->stateFlags1 & PLAYER_STATE1_8000000) ? 0.75f : 1.5f);
if (this->unk_1A6 != 0) {
DUNGEON_KEY_COUNT(gSaveContext.mapIndex) = DUNGEON_KEY_COUNT(gSaveContext.mapIndex) - 1;
Flags_SetSwitch(play, this->switchFlag);
- Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_CHAIN_KEY_UNLOCK);
+ Actor_PlaySfx(&this->knobDoor.dyna.actor, NA_SE_EV_CHAIN_KEY_UNLOCK);
}
} else if (this->unk_1A7 != 0) {
this->actionFunc = func_80866F94;
- Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_DOOR_OPEN);
+ Actor_PlaySfx(&this->knobDoor.dyna.actor, NA_SE_EV_DOOR_OPEN);
} else if (!Player_InCsMode(play)) {
Vec3f playerPosRelToDoor;
- Actor_OffsetOfPointInActorCoords(&this->dyna.actor, &playerPosRelToDoor, &player->actor.world.pos);
+ Actor_OffsetOfPointInActorCoords(&this->knobDoor.dyna.actor, &playerPosRelToDoor, &player->actor.world.pos);
if (D_80867BC0 || ((fabsf(playerPosRelToDoor.y) < 20.0f) && (fabsf(playerPosRelToDoor.x) < 20.0f) &&
(fabsf(playerPosRelToDoor.z) < 50.0f))) {
- s16 yawDiff = player->actor.shape.rot.y - this->dyna.actor.shape.rot.y;
+ s16 yawDiff = player->actor.shape.rot.y - this->knobDoor.dyna.actor.shape.rot.y;
if (playerPosRelToDoor.z > 0.0f) {
yawDiff = (0x8000 - yawDiff);
@@ -497,51 +499,52 @@ void func_80866B20(EnDoor* this, PlayState* play) {
if (ABS_ALT(yawDiff) < 0x3000) {
player->doorType = PLAYER_DOORTYPE_HANDLE;
player->doorDirection = playerPosRelToDoor.z >= 0.0f ? 1.0f : -1.0f;
- player->doorActor = &this->dyna.actor;
+ player->doorActor = &this->knobDoor.dyna.actor;
if (this->unk_1A6 != 0) {
if (DUNGEON_KEY_COUNT(gSaveContext.mapIndex) <= 0) {
player->doorType = PLAYER_DOORTYPE_TALKING;
- this->dyna.actor.textId = 0x1802;
+ this->knobDoor.dyna.actor.textId = 0x1802;
} else {
player->doorTimer = 10;
}
- } else if (this->unk_1A4 == 4) {
+ } else if (this->doorType == ENDOOR_TYPE_4) {
player->doorType = PLAYER_DOORTYPE_TALKING;
- this->dyna.actor.textId = 0x1800;
- } else if ((this->unk_1A4 == 0) || (this->unk_1A4 == 2) || (this->unk_1A4 == 3)) {
+ this->knobDoor.dyna.actor.textId = 0x1800;
+ } else if ((this->doorType == ENDOOR_TYPE_0) || (this->doorType == ENDOOR_TYPE_2) ||
+ (this->doorType == ENDOOR_TYPE_3)) {
s32 halfDaysDayBit = (play->actorCtx.halfDaysBit & HALFDAYBIT_DAWNS) >> 1;
s32 halfDaysNightBit = play->actorCtx.halfDaysBit & HALFDAYBIT_NIGHTS;
s16 temp_a2 = D_801AED48[this->switchFlag & 7];
s32 textIdOffset = (this->switchFlag >> 3) & 0xF;
- if (((this->unk_1A4 == 0) && !((halfDaysDayBit | halfDaysNightBit) & temp_a2)) ||
- ((this->unk_1A4 == 2) && !(halfDaysNightBit & temp_a2)) ||
- ((this->unk_1A4 == 3) && !(halfDaysDayBit & temp_a2))) {
+ if (((this->doorType == ENDOOR_TYPE_0) && !((halfDaysDayBit | halfDaysNightBit) & temp_a2)) ||
+ ((this->doorType == ENDOOR_TYPE_2) && !(halfDaysNightBit & temp_a2)) ||
+ ((this->doorType == ENDOOR_TYPE_3) && !(halfDaysDayBit & temp_a2))) {
s16 baseTextId = 0x182D;
- if (this->unk_1A4 == 3) {
+ if (this->doorType == ENDOOR_TYPE_3) {
baseTextId = 0x180D;
- } else if (this->unk_1A4 == 2) {
+ } else if (this->doorType == ENDOOR_TYPE_2) {
baseTextId = 0x181D;
}
player->doorType = PLAYER_DOORTYPE_TALKING;
- this->dyna.actor.textId = baseTextId + textIdOffset;
+ this->knobDoor.dyna.actor.textId = baseTextId + textIdOffset;
}
- } else if ((this->unk_1A4 == 5) && (playerPosRelToDoor.z > 0.0f)) {
+ } else if ((this->doorType == ENDOOR_TYPE_5) && (playerPosRelToDoor.z > 0.0f)) {
ScheduleOutput scheduleOutput;
if (Schedule_RunScript(play, D_8086778C[this->switchFlag], &scheduleOutput)) {
- this->dyna.actor.textId = scheduleOutput.result + 0x1800;
+ this->knobDoor.dyna.actor.textId = scheduleOutput.result + 0x1800;
- player->doorType = ((this->dyna.actor.textId == 0x1821) && D_80867BC0)
+ player->doorType = ((this->knobDoor.dyna.actor.textId == 0x1821) && D_80867BC0)
? PLAYER_DOORTYPE_PROXIMITY
: PLAYER_DOORTYPE_TALKING;
}
}
func_80122F28(player);
}
- } else if ((this->unk_1A4 == 4) && (this->dyna.actor.xzDistToPlayer > 240.0f)) {
- Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_DOOR_OPEN);
+ } else if ((this->doorType == ENDOOR_TYPE_4) && (this->knobDoor.dyna.actor.xzDistToPlayer > 240.0f)) {
+ Actor_PlaySfx(&this->knobDoor.dyna.actor, NA_SE_EV_DOOR_OPEN);
this->actionFunc = func_80867080;
}
}
@@ -556,34 +559,34 @@ void func_80866F94(EnDoor* this, PlayState* play) {
} else {
direction = -1;
}
- if (Math_ScaledStepToS(&this->dyna.actor.world.rot.y, direction * 0x3E80, 0x7D0)) {
+ if (Math_ScaledStepToS(&this->knobDoor.dyna.actor.world.rot.y, direction * 0x3E80, 0x7D0)) {
Math_StepToC(&this->unk_1A7, 0, 1);
}
} else {
- if (Math_ScaledStepToS(&this->dyna.actor.world.rot.y, 0, 0x7D0)) {
+ if (Math_ScaledStepToS(&this->knobDoor.dyna.actor.world.rot.y, 0, 0x7D0)) {
this->actionFunc = func_80866B20;
- Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_AUTO_DOOR_CLOSE);
+ Actor_PlaySfx(&this->knobDoor.dyna.actor, NA_SE_EV_AUTO_DOOR_CLOSE);
}
}
}
void func_8086704C(EnDoor* this, PlayState* play) {
- if (this->dyna.actor.xzDistToPlayer < 120.0f) {
+ if (this->knobDoor.dyna.actor.xzDistToPlayer < 120.0f) {
this->actionFunc = func_808670F0;
}
}
void func_80867080(EnDoor* this, PlayState* play) {
- if (this->dyna.actor.xzDistToPlayer < 120.0f) {
+ if (this->knobDoor.dyna.actor.xzDistToPlayer < 120.0f) {
this->actionFunc = func_808670F0;
- } else if (Math_ScaledStepToS(&this->dyna.actor.world.rot.y, -0x1800, 0x100)) {
+ } else if (Math_ScaledStepToS(&this->knobDoor.dyna.actor.world.rot.y, -0x1800, 0x100)) {
this->actionFunc = func_8086704C;
}
}
void func_808670F0(EnDoor* this, PlayState* play) {
- if (Math_ScaledStepToS(&this->dyna.actor.world.rot.y, 0, 0x700)) {
- Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_DOOR_CLOSE);
+ if (Math_ScaledStepToS(&this->knobDoor.dyna.actor.world.rot.y, 0, 0x700)) {
+ Actor_PlaySfx(&this->knobDoor.dyna.actor, NA_SE_EV_DOOR_CLOSE);
this->actionFunc = func_80866B20;
}
}
@@ -593,19 +596,19 @@ void func_80867144(EnDoor* this, PlayState* play) {
s32 i;
if (DECR(this->unk_1A6) == 0) {
- if (SkelAnime_Update(&this->skelAnime) != 0) {
+ if (SkelAnime_Update(&this->knobDoor.skelAnime)) {
this->actionFunc = func_80866B20;
- this->unk_1A1 = 0;
- } else if (Animation_OnFrame(&this->skelAnime, sAnimOpenFrames[this->animIndex])) {
- Actor_PlaySfx(&this->dyna.actor, NA_SE_OC_DOOR_OPEN);
- if (this->skelAnime.playSpeed < 1.5f) {
+ this->knobDoor.playOpenAnim = false;
+ } else if (Animation_OnFrame(&this->knobDoor.skelAnime, sAnimOpenFrames[this->knobDoor.animIndex])) {
+ Actor_PlaySfx(&this->knobDoor.dyna.actor, NA_SE_OC_DOOR_OPEN);
+ if (this->knobDoor.skelAnime.playSpeed < 1.5f) {
numEffects = (s32)(Rand_ZeroOne() * 30.0f) + 50;
for (i = 0; i < numEffects; i++) {
- EffectSsBubble_Spawn(play, &this->dyna.actor.world.pos, 60.0, 100.0f, 50.0f, 0.15f);
+ EffectSsBubble_Spawn(play, &this->knobDoor.dyna.actor.world.pos, 60.0, 100.0f, 50.0f, 0.15f);
}
}
- } else if (Animation_OnFrame(&this->skelAnime, sAnimCloseFrames[this->animIndex])) {
- Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_DOOR_CLOSE);
+ } else if (Animation_OnFrame(&this->knobDoor.skelAnime, sAnimCloseFrames[this->knobDoor.animIndex])) {
+ Actor_PlaySfx(&this->knobDoor.dyna.actor, NA_SE_EV_DOOR_CLOSE);
}
}
}
@@ -620,28 +623,28 @@ s32 EnDoor_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f*
TransitionActorEntry* transitionEntry;
EnDoor* this = THIS;
- if (limbIndex == 4) {
- Gfx** dl = D_808679A4[this->dlIndex];
+ if (limbIndex == DOOR_LIMB_4) {
+ Gfx** dl = D_808679A4[this->knobDoor.dlIndex];
s16 temp;
s32 dlIndex;
transitionEntry = NULL;
- if (this->unk_1A4 != 7) {
- transitionEntry = &play->doorCtx.transitionActorList[(u16)this->dyna.actor.params >> 0xA];
+ if (this->doorType != ENDOOR_TYPE_7) {
+ transitionEntry = &play->doorCtx.transitionActorList[DOOR_GET_TRANSITION_ID(&this->knobDoor.dyna.actor)];
}
- rot->z += this->dyna.actor.world.rot.y;
- if ((this->unk_1A4 == 7) || (play->roomCtx.prevRoom.num >= 0) ||
+ rot->z += this->knobDoor.dyna.actor.world.rot.y;
+ if ((this->doorType == ENDOOR_TYPE_7) || (play->roomCtx.prevRoom.num >= 0) ||
(transitionEntry->sides[0].room == transitionEntry->sides[1].room)) {
s32 pad;
- temp = (this->dyna.actor.shape.rot.y + this->skelAnime.jointTable[3].z + rot->z) -
- Math_Vec3f_Yaw(&play->view.eye, &this->dyna.actor.world.pos);
+ temp = (this->knobDoor.dyna.actor.shape.rot.y + this->knobDoor.skelAnime.jointTable[3].z + rot->z) -
+ Math_Vec3f_Yaw(&play->view.eye, &this->knobDoor.dyna.actor.world.pos);
*dList = (ABS_ALT(temp) < 0x4000) ? dl[0] : dl[1];
} else {
dlIndex = 0;
- if (transitionEntry->sides[0].room != this->dyna.actor.room) {
+ if (transitionEntry->sides[0].room != this->knobDoor.dyna.actor.room) {
dlIndex = 1;
}
*dList = dl[dlIndex];
@@ -653,17 +656,17 @@ s32 EnDoor_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f*
void EnDoor_Draw(Actor* thisx, PlayState* play) {
EnDoor* this = THIS;
- if (this->dyna.actor.objBankIndex == this->requiredObjBankIndex) {
+ if (this->knobDoor.dyna.actor.objBankIndex == this->knobDoor.requiredObjBankIndex) {
OPEN_DISPS(play->state.gfxCtx);
- if ((this->unk_1A4 == 7) && (this->switchFlag == 0)) {
+ if ((this->doorType == ENDOOR_TYPE_7) && (this->switchFlag == 0)) {
Gfx_DrawDListOpa(play, gameplay_keep_DL_0221B8);
} else {
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
}
- SkelAnime_DrawOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, EnDoor_OverrideLimbDraw, NULL,
- &this->dyna.actor);
- if (this->dyna.actor.world.rot.y != 0) {
- if (this->dyna.actor.world.rot.y > 0) {
+ SkelAnime_DrawOpa(play, this->knobDoor.skelAnime.skeleton, this->knobDoor.skelAnime.jointTable,
+ EnDoor_OverrideLimbDraw, NULL, &this->knobDoor.dyna.actor);
+ if (this->knobDoor.dyna.actor.world.rot.y != 0) {
+ if (this->knobDoor.dyna.actor.world.rot.y > 0) {
gSPDisplayList(POLY_OPA_DISP++, gDoorRightDL);
} else {
gSPDisplayList(POLY_OPA_DISP++, gDoorLeftDL);
diff --git a/src/overlays/actors/ovl_En_Door/z_en_door.h b/src/overlays/actors/ovl_En_Door/z_en_door.h
index bea44a122..b6fc7c254 100644
--- a/src/overlays/actors/ovl_En_Door/z_en_door.h
+++ b/src/overlays/actors/ovl_En_Door/z_en_door.h
@@ -2,27 +2,34 @@
#define Z_EN_DOOR_H
#include "global.h"
+#include "z64door.h"
+#include "objects/gameplay_keep/gameplay_keep.h"
struct EnDoor;
typedef void (*EnDoorActionFunc)(struct EnDoor*, PlayState*);
-#define ENDOOR_GET_PARAMS_7(thisx) (((thisx)->params >> 7) & 7)
+#define ENDOOR_GET_TYPE(thisx) (((thisx)->params >> 7) & 7)
#define ENDOOR_GET_PARAMS_7F(thisx) (((thisx)->params) & 0x7F)
+typedef enum EnDoorType {
+ /* 0 */ ENDOOR_TYPE_0,
+ /* 1 */ ENDOOR_TYPE_1,
+ /* 2 */ ENDOOR_TYPE_2,
+ /* 3 */ ENDOOR_TYPE_3,
+ /* 4 */ ENDOOR_TYPE_4,
+ /* 5 */ ENDOOR_TYPE_5,
+ /* 6 */ ENDOOR_TYPE_6,
+ /* 7 */ ENDOOR_TYPE_7
+} EnDoorType;
typedef struct EnDoor {
- /* 0x000 */ DynaPolyActor dyna;
- /* 0x15C */ SkelAnime skelAnime;
- /* 0x1A0 */ u8 animIndex;
- /* 0x1A1 */ u8 unk_1A1;
- /* 0x1A2 */ s8 requiredObjBankIndex;
- /* 0x1A3 */ s8 dlIndex;
- /* 0x1A4 */ u8 unk_1A4;
+ /* 0x000 */ KnobDoorActor knobDoor;
+ /* 0x1A4 */ u8 doorType;
/* 0x1A5 */ u8 switchFlag;
/* 0x1A6 */ u8 unk_1A6;
/* 0x1A7 */ s8 unk_1A7;
- /* 0x1A8 */ Vec3s limbTable[5];
+ /* 0x1A8 */ Vec3s limbTable[DOOR_LIMB_MAX];
/* 0x1C8 */ EnDoorActionFunc actionFunc;
} EnDoor;
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 8959dde7a..d48bfd359 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
@@ -92,9 +92,9 @@ void EnDoorEtc_Init(Actor* thisx, PlayState* play2) {
s32 i;
EnDoorEtc* this = THIS;
- Actor_ProcessInitChain(&this->actor, sInitChain);
- Actor_SetScale(&this->actor, 0.01f);
- this->actor.shape.rot.x = -0x4000;
+ Actor_ProcessInitChain(&this->knobDoor.dyna.actor, sInitChain);
+ Actor_SetScale(&this->knobDoor.dyna.actor, 0.01f);
+ this->knobDoor.dyna.actor.shape.rot.x = -0x4000;
this->angle = 0;
for (i = 0; i < 15; i++, objectInfo++) {
if (play->sceneId == objectInfo->sceneId) {
@@ -106,19 +106,19 @@ void EnDoorEtc_Init(Actor* thisx, PlayState* play2) {
}
objectIndex = Object_GetIndex(&play->objectCtx, objectInfo->objectId);
if (objectIndex < 0) {
- Actor_Kill(&this->actor);
+ Actor_Kill(&this->knobDoor.dyna.actor);
} else {
- this->objectIndex = objectIndex;
- this->dListIndex = objectInfo->dListIndex;
- if (this->actor.objBankIndex == this->objectIndex) {
+ this->knobDoor.requiredObjBankIndex = objectIndex;
+ this->knobDoor.dlIndex = objectInfo->dListIndex;
+ if (this->knobDoor.dyna.actor.objBankIndex == this->knobDoor.requiredObjBankIndex) {
EnDoorEtc_WaitForObject(this, play);
} else {
this->actionFunc = EnDoorEtc_WaitForObject;
}
}
Collider_InitCylinder(play, &this->collider);
- Collider_SetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
- this->actor.colChkInfo.mass = MASS_IMMOVABLE;
+ Collider_SetCylinder(play, &this->collider, &this->knobDoor.dyna.actor, &sCylinderInit);
+ this->knobDoor.dyna.actor.colChkInfo.mass = MASS_IMMOVABLE;
}
void EnDoorEtc_Destroy(Actor* thisx, PlayState* play) {
@@ -139,11 +139,11 @@ s32 EnDoorEtc_IsDistanceGreater(Vec3f* a, Vec3f* b, f32 c) {
}
void EnDoorEtc_WaitForObject(EnDoorEtc* this, PlayState* play) {
- if (Object_IsLoaded(&play->objectCtx, this->objectIndex)) {
- this->actor.flags &= ~ACTOR_FLAG_10;
- this->actor.objBankIndex = this->objectIndex;
+ if (Object_IsLoaded(&play->objectCtx, this->knobDoor.requiredObjBankIndex)) {
+ this->knobDoor.dyna.actor.flags &= ~ACTOR_FLAG_10;
+ this->knobDoor.dyna.actor.objBankIndex = this->knobDoor.requiredObjBankIndex;
this->actionFunc = func_80AC2354;
- this->actor.draw = EnDoorEtc_Draw;
+ this->knobDoor.dyna.actor.draw = EnDoorEtc_Draw;
}
}
@@ -175,27 +175,28 @@ void func_80AC21A0(EnDoorEtc* this, PlayState* play) {
s16 yawDiff;
s32 yawDiffAbs;
- Actor_OffsetOfPointInActorCoords(&this->actor, &playerOffsetFromDoor, &player->actor.world.pos);
- if (this->unk_1A1 == 0) {
+ Actor_OffsetOfPointInActorCoords(&this->knobDoor.dyna.actor, &playerOffsetFromDoor, &player->actor.world.pos);
+ if (!this->knobDoor.playOpenAnim) {
if ((!Player_InCsMode(play)) &&
((fabsf(playerOffsetFromDoor.y) < 20.0f) && fabsf(playerOffsetFromDoor.x) < 20.0f) &&
(fabsf(playerOffsetFromDoor.z) < 50.0f)) {
- yawDiff = player->actor.shape.rot.y - this->actor.shape.rot.y;
+ yawDiff = player->actor.shape.rot.y - this->knobDoor.dyna.actor.shape.rot.y;
if (playerOffsetFromDoor.z > 0.0f) {
yawDiff = 0x8000 - yawDiff;
}
yawDiffAbs = ABS_ALT(yawDiff);
if (yawDiffAbs < 0x3000) {
player->doorDirection = (playerOffsetFromDoor.z >= 0.0f) ? 1.0f : -1.0f;
- player->doorActor = &this->actor;
- player->doorType = -1;
+ player->doorActor = &this->knobDoor.dyna.actor;
+ player->doorType = PLAYER_DOORTYPE_TALKING;
}
}
}
- if ((this->actor.textId == 0x239B) && Flags_GetSwitch(play, ENDOORETC_GET_SWITCHFLAG(&this->actor))) {
- Flags_UnsetSwitch(play, ENDOORETC_GET_SWITCHFLAG(&this->actor));
+ if ((this->knobDoor.dyna.actor.textId == 0x239B) &&
+ Flags_GetSwitch(play, ENDOORETC_GET_SWITCHFLAG(&this->knobDoor.dyna.actor))) {
+ Flags_UnsetSwitch(play, ENDOORETC_GET_SWITCHFLAG(&this->knobDoor.dyna.actor));
this->actionFunc = func_80AC2154;
- this->actor.textId = 0x1800; // "It won't budge!"
+ this->knobDoor.dyna.actor.textId = 0x1800; // "It won't budge!"
this->unk_1F4 |= 1;
this->timer = 0x5A;
}
@@ -206,18 +207,18 @@ void func_80AC2354(EnDoorEtc* this, PlayState* play) {
while (door != NULL) {
if ((door->id != ACTOR_EN_DOOR) ||
- !EnDoorEtc_IsDistanceGreater(&door->world.pos, &this->actor.world.pos, 10.0f)) {
+ !EnDoorEtc_IsDistanceGreater(&door->world.pos, &this->knobDoor.dyna.actor.world.pos, 10.0f)) {
door = door->next;
} else {
- this->actor.world.pos.x = door->world.pos.x;
- this->actor.world.pos.y = door->world.pos.y;
- this->actor.world.pos.z = door->world.pos.z;
- this->actor.shape.rot.y = door->shape.rot.y;
- this->actor.world.rot.y = door->world.rot.y;
+ this->knobDoor.dyna.actor.world.pos.x = door->world.pos.x;
+ this->knobDoor.dyna.actor.world.pos.y = door->world.pos.y;
+ this->knobDoor.dyna.actor.world.pos.z = door->world.pos.z;
+ this->knobDoor.dyna.actor.shape.rot.y = door->shape.rot.y;
+ this->knobDoor.dyna.actor.world.rot.y = door->world.rot.y;
Actor_Kill(door);
this->actionFunc = func_80AC21A0;
- this->actor.textId = 0x239B;
- Actor_SetFocus(&this->actor, 70.0f);
+ this->knobDoor.dyna.actor.textId = 0x239B;
+ Actor_SetFocus(&this->knobDoor.dyna.actor, 70.0f);
break;
}
}
@@ -229,7 +230,7 @@ void EnDoorEtc_Update(Actor* thisx, PlayState* play) {
this->actionFunc(this, play);
if (this->unk_1F4 & 1) {
- Collider_UpdateCylinder(&this->actor, &this->collider);
+ Collider_UpdateCylinder(&this->knobDoor.dyna.actor, &this->collider);
CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
}
}
@@ -239,7 +240,7 @@ void EnDoorEtc_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
Matrix_Translate(-2900.0f, 0.0f, 0.0f, MTXMODE_APPLY);
Matrix_RotateZS(this->angle, MTXMODE_APPLY);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
diff --git a/src/overlays/actors/ovl_En_Door_Etc/z_en_door_etc.h b/src/overlays/actors/ovl_En_Door_Etc/z_en_door_etc.h
index 49ca83f2a..9cd63248f 100644
--- a/src/overlays/actors/ovl_En_Door_Etc/z_en_door_etc.h
+++ b/src/overlays/actors/ovl_En_Door_Etc/z_en_door_etc.h
@@ -2,6 +2,7 @@
#define Z_EN_DOOR_ETC_H
#include "global.h"
+#include "z64door.h"
struct EnDoorEtc;
@@ -10,11 +11,7 @@ struct EnDoorEtc;
typedef void (*EnDoorEtcActionFunc)(struct EnDoorEtc*, PlayState*);
typedef struct EnDoorEtc {
- /* 0x000 */ Actor actor;
- /* 0x144 */ char pad_144[0x5D];
- /* 0x1A1 */ u8 unk_1A1;
- /* 0x1A2 */ s8 objectIndex;
- /* 0x1A3 */ u8 dListIndex; // Never read, inferred from ovl_En_Door
+ /* 0x000 */ KnobDoorActor knobDoor;
/* 0x1A4 */ s16 angle;
/* 0x1A6 */ s16 timer;
/* 0x1A8 */ ColliderCylinder collider;
diff --git a/src/overlays/actors/ovl_En_Dragon/z_en_dragon.c b/src/overlays/actors/ovl_En_Dragon/z_en_dragon.c
index 605d0d807..f03b2702e 100644
--- a/src/overlays/actors/ovl_En_Dragon/z_en_dragon.c
+++ b/src/overlays/actors/ovl_En_Dragon/z_en_dragon.c
@@ -725,7 +725,7 @@ void EnDragon_Dead(EnDragon* this, PlayState* play) {
void EnDragon_UpdateDamage(EnDragon* this, PlayState* play) {
Player* player = GET_PLAYER(play);
- u32 sp30;
+ PlayerImpactType playerImpactType;
if (this->action == DEEP_PYTHON_ACTION_EXTEND) {
if ((this->collider.elements[2].info.bumperFlags & BUMP_HIT) ||
@@ -753,7 +753,8 @@ void EnDragon_UpdateDamage(EnDragon* this, PlayState* play) {
if ((this->action == DEEP_PYTHON_ACTION_EXTEND) && (this->grabWaitTimer == 0) &&
(player->invincibilityTimer == 0) && (this->collider.elements[0].info.ocElemFlags & OCELEM_HIT) &&
- (!(func_800B64FC(play, 1000.0f, &this->actor.world.pos, &sp30) >= 0.0f) || (sp30 != 1))) {
+ !((Actor_GetPlayerImpact(play, 1000.0f, &this->actor.world.pos, &playerImpactType) >= 0.0f) &&
+ (playerImpactType == PLAYER_IMPACT_ZORA_BARRIER))) {
this->actor.speed = 0.0f;
this->action = DEEP_PYTHON_ACTION_GRAB;
this->actor.flags |= ACTOR_FLAG_100000;
@@ -834,8 +835,8 @@ void EnDragon_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* r
void EnDragon_Draw(Actor* thisx, PlayState* play) {
EnDragon* this = THIS;
- func_8012C28C(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnDragon_OverrideLimbDraw, EnDragon_PostLimbDraw, &this->actor);
}
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 7e232d5bd..d5dc8d250 100644
--- a/src/overlays/actors/ovl_En_Drs/z_en_drs.c
+++ b/src/overlays/actors/ovl_En_Drs/z_en_drs.c
@@ -120,7 +120,7 @@ void EnDrs_PostLimbDraw(PlayState* play2, s32 limbIndex, Gfx** dList, Vec3s* rot
void EnDrs_Draw(Actor* thisx, PlayState* play) {
EnDrs* this = THIS;
- func_8012C5B0(play->state.gfxCtx);
+ Gfx_SetupDL37_Opa(play->state.gfxCtx);
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount, NULL,
EnDrs_PostLimbDraw, &this->actor);
}
diff --git a/src/overlays/actors/ovl_En_Ds2n/z_en_ds2n.c b/src/overlays/actors/ovl_En_Ds2n/z_en_ds2n.c
index 67dff9c41..6c6b40318 100644
--- a/src/overlays/actors/ovl_En_Ds2n/z_en_ds2n.c
+++ b/src/overlays/actors/ovl_En_Ds2n/z_en_ds2n.c
@@ -121,7 +121,7 @@ void EnDs2n_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C5B0(play->state.gfxCtx);
+ Gfx_SetupDL37_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sEyeTextures[this->blinkState]));
gSPSegment(POLY_OPA_DISP++, 0x09, Lib_SegmentedToVirtual(sEyeTextures[this->blinkState]));
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 b25e4eb47..50e9303d7 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
@@ -114,7 +114,7 @@ void EnDyExtra_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPSegment(POLY_XLU_DISP++, 0x08,
Gfx_TwoTexScroll(play->state.gfxCtx, 0, play->state.frames * 2, 0, 0x20, 0x40, 1, play->state.frames,
play->state.frames * -8, 0x10, 0x10));
diff --git a/src/overlays/actors/ovl_En_Egblock/z_en_egblock.c b/src/overlays/actors/ovl_En_Egblock/z_en_egblock.c
index 509e4fa9a..6f67950ab 100644
--- a/src/overlays/actors/ovl_En_Egblock/z_en_egblock.c
+++ b/src/overlays/actors/ovl_En_Egblock/z_en_egblock.c
@@ -110,7 +110,7 @@ void EnEgblock_Draw(Actor* thisx, PlayState* play2) {
PlayState* play = play2;
EnEgblock* this = THIS;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
if (this->inactive != true) {
OPEN_DISPS(play->state.gfxCtx);
@@ -193,7 +193,7 @@ void EnEgblock_DrawEffects(EnEgblock* this, PlayState* play) {
OPEN_DISPS(gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
for (i = 0; i < ARRAY_COUNT(this->effects); i++, effect++) {
if (effect->isActive) {
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 6f9c0e73a..2d03fccf2 100644
--- a/src/overlays/actors/ovl_En_Egol/z_en_egol.c
+++ b/src/overlays/actors/ovl_En_Egol/z_en_egol.c
@@ -328,19 +328,19 @@ void EnEgol_FootstepEffects(EnEgol* this, PlayState* play, f32 leftFootFrame, f3
if (Animation_OnFrame(&this->skelAnime, leftFootFrame) || Animation_OnFrame(&this->skelAnime, rightFootFrame)) {
Vec3f spawnPos;
Player* player = GET_PLAYER(play);
- s32 quakeSize;
+ s32 quakeYOffset;
s32 pad;
Actor_PlaySfx(&this->actor, NA_SE_EN_EYEGOLE_WALK);
- quakeSize = 4 - (s32)(fabsf(player->actor.world.pos.y - this->actor.world.pos.y) * 0.02f);
- if (quakeSize > 4) {
- quakeSize = 4;
- } else if (quakeSize < 1) {
- quakeSize = 1;
+ quakeYOffset = 4 - (s32)(fabsf(player->actor.world.pos.y - this->actor.world.pos.y) * 0.02f);
+ if (quakeYOffset > 4) {
+ quakeYOffset = 4;
+ } else if (quakeYOffset < 1) {
+ quakeYOffset = 1;
}
if (player->stateFlags3 != PLAYER_STATE3_1000000) {
- func_800BC848(&this->actor, play, quakeSize, 2);
+ Actor_RequestQuakeAndRumble(&this->actor, play, quakeYOffset, 2);
}
if (Animation_OnFrame(&this->skelAnime, leftFootFrame)) {
Math_Vec3f_Copy(&spawnPos, &this->leftFootPos);
@@ -755,7 +755,7 @@ void EnEgol_Laser(EnEgol* this, PlayState* play) {
f32 nz;
s32 pad3;
s32 i;
- s32 quakeSize;
+ s32 quakeYOffset;
Player* player = GET_PLAYER(play);
nx = COLPOLY_GET_NORMAL(colPoly->normal.x);
@@ -773,14 +773,14 @@ void EnEgol_Laser(EnEgol* this, PlayState* play) {
if ((this->actor.world.pos.y - 50.0f) <= player->actor.world.pos.y) {
EnEgol_SpawnEffect(this, &hitPos, &rotToNorm, 100, 0.02f, EYEGORE_EFFECT_IMPACT);
}
- quakeSize = 4 - (s32)(fabsf(player->actor.world.pos.y - this->actor.world.pos.y) * 0.02f);
- if (quakeSize > 4) {
- quakeSize = 4;
- } else if (quakeSize < 1) {
- quakeSize = 1;
+ quakeYOffset = 4 - (s32)(fabsf(player->actor.world.pos.y - this->actor.world.pos.y) * 0.02f);
+ if (quakeYOffset > 4) {
+ quakeYOffset = 4;
+ } else if (quakeYOffset < 1) {
+ quakeYOffset = 1;
}
if (player->stateFlags3 != PLAYER_STATE3_1000000) {
- func_800BC848(&this->actor, play, quakeSize, 2);
+ Actor_RequestQuakeAndRumble(&this->actor, play, quakeYOffset, 2);
}
Actor_PlaySfx(&this->actor, NA_SE_EV_EXPLOSION);
func_800B31BC(play, &hitPos, 40, -2, 255, 20);
@@ -880,16 +880,16 @@ void EnEgol_Slam(EnEgol* this, PlayState* play) {
Player* player = GET_PLAYER(play);
Vec3f spawnPos;
f32 dyToPlayer = fabsf(player->actor.world.pos.y - this->actor.world.pos.y);
- s32 quakeSize;
+ s32 quakeYOffset;
Actor_PlaySfx(&this->actor, NA_SE_EV_EXPLOSION);
- quakeSize = 4 - (s32)(dyToPlayer * 0.02f);
- if (quakeSize > 4) {
- quakeSize = 4;
- } else if (quakeSize < 1) {
- quakeSize = 1;
+ quakeYOffset = 4 - (s32)(dyToPlayer * 0.02f);
+ if (quakeYOffset > 4) {
+ quakeYOffset = 4;
+ } else if (quakeYOffset < 1) {
+ quakeYOffset = 1;
}
- func_800BC848(&this->actor, play, quakeSize, 2);
+ Actor_RequestQuakeAndRumble(&this->actor, play, quakeYOffset, 2);
if (this->actor.floorBgId == BGCHECK_SCENE) {
Math_Vec3f_Copy(&spawnPos, &this->actor.world.pos);
spawnPos.x += Math_SinS(this->actor.world.rot.y) * 60.0f;
@@ -1064,7 +1064,7 @@ void EnEgol_Death(EnEgol* this, PlayState* play) {
this->subCamAt.y = 60.0f;
this->subCamAt.z = 260.0f;
Math_Vec3f_Copy(&atOffset, &this->subCamAt);
- OLib_DbCameraVec3fSum(&this->actor.world, &atOffset, &this->subCamAt, 1);
+ OLib_Vec3fAdd(&this->actor.world, &atOffset, &this->subCamAt, OLIB_ADD_OFFSET);
this->subCamEye.x = this->actor.world.pos.x;
this->subCamEye.y = this->actor.world.pos.y + 70.0f;
this->subCamEye.z = this->actor.world.pos.z;
@@ -1080,7 +1080,7 @@ void EnEgol_Death(EnEgol* this, PlayState* play) {
} else {
if (Animation_OnFrame(&this->skelAnime, 46.0f)) {
Actor_PlaySfx(&this->actor, NA_SE_EV_EXPLOSION);
- func_800BC848(&this->actor, play, 10, 5);
+ Actor_RequestQuakeAndRumble(&this->actor, play, 10, 5);
}
if ((curFrame >= this->animEndFrame) && (this->action != EYEGORE_ACTION_DEAD)) {
s32 i;
@@ -1268,7 +1268,8 @@ void EnEgol_Update(Actor* thisx, PlayState* play) {
// last argument is DMG_ZORA_BOOMERANG | DMG_HOOKSHOT | DMG_NORMAL_ARROW | DMG_FIRE_ARROW | DMG_ICE_ARROW |
// DMG_LIGHT_ARROW | DMG_DEKU_BUBBLE
- if ((projectile != NULL) && !((projectile->id == ACTOR_EN_ARROW) && (projectile->params == ENARROW_5))) {
+ if ((projectile != NULL) &&
+ !((projectile->id == ACTOR_EN_ARROW) && (projectile->params == ARROW_TYPE_LIGHT))) {
this->eyelidRotTarget = 0xFA0;
this->eyeShutTimer = 20;
if (this->action == EYEGORE_ACTION_LASER) {
@@ -1451,7 +1452,7 @@ void EnEgol_Draw(Actor* thisx, PlayState* play2) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
if (this->action != EYEGORE_ACTION_DEAD) {
AnimatedMat_Draw(play, Lib_SegmentedToVirtual(gEyegoreEyeLaserTexAnim));
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
@@ -1476,7 +1477,7 @@ void EnEgol_Draw(Actor* thisx, PlayState* play2) {
gSPDisplayList(POLY_OPA_DISP++, gEyegoreLaserDL);
}
if (((this->action == EYEGORE_ACTION_LASER) && (this->laserState >= EYEGORE_LASER_FIRE)) || this->chargingLaser) {
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPDisplayList(POLY_XLU_DISP++, gLightOrbMaterial1DL);
if (!this->chargingLaser) {
s32 i;
@@ -1599,7 +1600,7 @@ void EnEgol_DrawEffects(EnEgol* this, PlayState* play) {
OPEN_DISPS(gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
for (i = 0; i < ARRAY_COUNT(this->effects); i++, effect++) {
if (effect->isActive) {
Matrix_Push();
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 615d59196..503ce584e 100644
--- a/src/overlays/actors/ovl_En_Elf/z_en_elf.c
+++ b/src/overlays/actors/ovl_En_Elf/z_en_elf.c
@@ -1588,7 +1588,7 @@ void EnElf_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C94C(play->state.gfxCtx);
+ Gfx_SetupDL27_Xlu(play->state.gfxCtx);
envAlpha = (this->timer * 50) & 0x1FF;
envAlpha = (envAlpha >= 0x100) ? 511 - envAlpha : envAlpha;
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 12026b8b9..e2a5f69e3 100644
--- a/src/overlays/actors/ovl_En_Elfbub/z_en_elfbub.c
+++ b/src/overlays/actors/ovl_En_Elfbub/z_en_elfbub.c
@@ -151,7 +151,7 @@ void EnElfbub_Draw(Actor* thisx, PlayState* play2) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
Matrix_Translate(0.0f, 0.0f, 1.0f, MTXMODE_APPLY);
Matrix_ReplaceRotation(&play->billboardMtxF);
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 871665cc6..e19e8d522 100644
--- a/src/overlays/actors/ovl_En_Elforg/z_en_elforg.c
+++ b/src/overlays/actors/ovl_En_Elforg/z_en_elforg.c
@@ -626,7 +626,7 @@ void EnElforg_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
switch (this->area) {
case STRAY_FAIRY_AREA_WOODFALL:
AnimatedMat_Draw(play, Lib_SegmentedToVirtual(gStrayFairyWoodfallTexAnim));
diff --git a/src/overlays/actors/ovl_En_Encount1/z_en_encount1.c b/src/overlays/actors/ovl_En_Encount1/z_en_encount1.c
index a39a03567..834a6449f 100644
--- a/src/overlays/actors/ovl_En_Encount1/z_en_encount1.c
+++ b/src/overlays/actors/ovl_En_Encount1/z_en_encount1.c
@@ -5,6 +5,9 @@
*/
#include "z_en_encount1.h"
+#include "overlays/actors/ovl_En_Grasshopper/z_en_grasshopper.h"
+#include "overlays/actors/ovl_En_Wallmas/z_en_wallmas.h"
+#include "overlays/actors/ovl_En_Pr2/z_en_pr2.h"
#define FLAGS (ACTOR_FLAG_10 | ACTOR_FLAG_100000 | ACTOR_FLAG_CANT_LOCK_ON)
@@ -13,7 +16,7 @@
void EnEncount1_Init(Actor* thisx, PlayState* play);
void EnEncount1_Update(Actor* thisx, PlayState* play);
-void func_808E0954(EnEncount1* this, PlayState* play);
+void EnEncount1_SpawnActor(EnEncount1* this, PlayState* play);
ActorInit En_Encount1_InitVars = {
ACTOR_EN_ENCOUNT1,
@@ -27,14 +30,19 @@ ActorInit En_Encount1_InitVars = {
(ActorFunc)NULL,
};
-static s16 sActorList[] = {
- ACTOR_EN_GRASSHOPPER,
- ACTOR_EN_WALLMAS,
- ACTOR_EN_PR2,
- ACTOR_EN_PR2,
+static s16 sActorIds[] = {
+ ACTOR_EN_GRASSHOPPER, // EN_ENCOUNT1_GRASSHOPPER
+ ACTOR_EN_WALLMAS, // EN_ENCOUNT1_WALLMASTER
+ ACTOR_EN_PR2, // EN_ENCOUNT1_SKULLFISH
+ ACTOR_EN_PR2, // EN_ENCOUNT1_SKULLFISH_2
};
-static s16 sActorParams[] = { 1, 0, 1, 3 };
+static s16 sActorParams[] = {
+ EN_GRASSHOPPER_PARAMS(EN_GRASSHOPPER_TYPE_GROWS_WHEN_SPAWNED), // EN_ENCOUNT1_GRASSHOPPER
+ WALLMASTER_PARAMS(WALLMASTER_TYPE_TIMER_ONLY, 0, false), // EN_ENCOUNT1_WALLMASTER
+ ENPR2_PARAMS(1, 0), // EN_ENCOUNT1_SKULLFISH
+ ENPR2_PARAMS(3, 0) // EN_ENCOUNT1_SKULLFISH_2
+};
void EnEncount1_Init(Actor* thisx, PlayState* play) {
EnEncount1* this = THIS;
@@ -44,69 +52,72 @@ void EnEncount1_Init(Actor* thisx, PlayState* play) {
return;
}
- this->actorType = ENENCOUNT1_GET_TYPE(&this->actor);
- this->unk_14C = ENENCOUNT1_GET_7C0(&this->actor);
- this->unk_154 = ENENCOUNT1_GET_PATH(&this->actor);
- this->unk_158 = this->actor.world.rot.x;
- this->unk_15C = this->actor.world.rot.y;
- this->unk_160 = (this->actor.world.rot.z * 40.0f) + 120.0f;
+ this->type = ENENCOUNT1_GET_TYPE(&this->actor);
+ this->spawnActiveMax = ENENCOUNT1_GET_SPAWN_ACTIVE_MAX(&this->actor);
+ this->spawnTotalMax = ENENCOUNT1_GET_SPAWN_TOTAL_MAX(&this->actor);
+ this->spawnTimeMin = ENENCOUNT1_GET_SPAWN_TIME_MIN(&this->actor);
+ this->spawnUnusedProp = ENENCOUNT1_GET_SPAWN_UNUSED_PROP(&this->actor);
+ this->spawnDistanceMax = (ENENCOUNT1_GET_SPAWN_DISTANCE_MAX(&this->actor) * 40.0f) + 120.0f;
- if (this->unk_154 >= 0x3F) {
- this->unk_154 = -1;
+ if (this->spawnTotalMax >= ENENCOUNT1_SPAWNS_TOTAL_MAX_INFINITE) {
+ this->spawnTotalMax = -1;
}
- if (this->actor.world.rot.z < 0) {
- this->unk_160 = -1.0f;
+ if (ENENCOUNT1_GET_SPAWN_DISTANCE_MAX(&this->actor) < 0) {
+ this->spawnDistanceMax = -1.0f;
}
- if (this->actorType == EN_ENCOUNT1_SKULLFISH_2) {
- this->unk_15A = ENENCOUNT1_GET_PATH(&this->actor);
- this->path = SubS_GetPathByIndex(play, this->unk_15A, 0x3F);
- this->unk_154 = -1;
- this->unk_160 = -1.0f;
+ if (this->type == EN_ENCOUNT1_SKULLFISH_2) {
+ this->pathIndex = ENENCOUNT1_GET_PATH_INDEX(&this->actor);
+ this->path = SubS_GetPathByIndex(play, this->pathIndex, 0x3F);
+ this->spawnTotalMax = -1;
+ this->spawnDistanceMax = -1.0f;
}
this->actor.flags &= ~ACTOR_FLAG_1;
- this->actionFunc = func_808E0954;
+ this->actionFunc = EnEncount1_SpawnActor;
}
-void func_808E0954(EnEncount1* this, PlayState* play) {
+void EnEncount1_SpawnActor(EnEncount1* this, PlayState* play) {
Player* player = GET_PLAYER(play);
Vec3f spawnPos;
- f32 sp64;
- f32 temp_fv0_2;
- s16 sp5E;
- s16 actorList;
+ f32 scale;
+ f32 floorHeight;
+ s16 rotY;
+ s16 actorId;
s32 actorParams;
- CollisionPoly* sp54;
- s32 sp50;
+ CollisionPoly* floorPoly;
+ s32 bgId;
- if (((this->unk_14E >= this->unk_14C) || ((this->unk_160 > 0.0f) && (this->unk_160 < this->actor.xzDistToPlayer)) ||
- ((this->unk_154 > 0) && (this->unk_154 <= this->unk_152)))) {
+ if (((this->spawnActiveCount >= this->spawnActiveMax) ||
+ ((this->spawnDistanceMax > 0.0f) && (this->spawnDistanceMax < this->actor.xzDistToPlayer)) ||
+ ((this->spawnTotalMax > 0) && (this->spawnTotalMax <= this->spawnTotalCount)))) {
return;
- } else if (this->unk_156 != 0) {
- this->unk_156++;
- if (this->unk_156 < this->unk_158) {
+ }
+
+ if (this->timer != 0) {
+ this->timer++;
+ if (this->timer < this->spawnTimeMin) {
return;
}
}
- this->unk_156 = 0;
- switch (this->actorType) {
+ this->timer = 0;
+ switch (this->type) {
case EN_ENCOUNT1_GRASSHOPPER:
- sp64 = randPlusMinusPoint5Scaled(40.0f) + 200.0f;
- sp5E = player->actor.shape.rot.y;
- if (this->unk_14E & 1) {
- sp5E = -sp5E;
- sp64 = randPlusMinusPoint5Scaled(20.0f) + 100.0f;
+ scale = randPlusMinusPoint5Scaled(40.0f) + 200.0f;
+ rotY = player->actor.shape.rot.y;
+ if (this->spawnActiveCount & 1) {
+ rotY = -rotY;
+ scale = randPlusMinusPoint5Scaled(20.0f) + 100.0f;
}
- spawnPos.x = player->actor.world.pos.x + (Math_SinS(sp5E) * sp64) + randPlusMinusPoint5Scaled(40.0f);
+ spawnPos.x = player->actor.world.pos.x + (Math_SinS(rotY) * scale) + randPlusMinusPoint5Scaled(40.0f);
spawnPos.y = player->actor.floorHeight + 120.0f;
- spawnPos.z = player->actor.world.pos.z + (Math_CosS(sp5E) * sp64) + randPlusMinusPoint5Scaled(40.0f);
- temp_fv0_2 = BgCheck_EntityRaycastFloor5(&play->colCtx, &sp54, &sp50, &this->actor, &spawnPos);
- if ((temp_fv0_2 <= BGCHECK_Y_MIN) ||
+ spawnPos.z = player->actor.world.pos.z + (Math_CosS(rotY) * scale) + randPlusMinusPoint5Scaled(40.0f);
+ floorHeight = BgCheck_EntityRaycastFloor5(&play->colCtx, &floorPoly, &bgId, &this->actor, &spawnPos);
+ if ((floorHeight <= BGCHECK_Y_MIN) ||
((player->actor.depthInWater != BGCHECK_Y_MIN) &&
- (temp_fv0_2 < (player->actor.world.pos.y - player->actor.depthInWater)))) {
+ (floorHeight < (player->actor.world.pos.y - player->actor.depthInWater)))) {
return;
}
- spawnPos.y = temp_fv0_2;
+ spawnPos.y = floorHeight;
break;
case EN_ENCOUNT1_WALLMASTER:
@@ -114,36 +125,36 @@ void func_808E0954(EnEncount1* this, PlayState* play) {
break;
case EN_ENCOUNT1_SKULLFISH:
- sp64 = randPlusMinusPoint5Scaled(250.0f) + 500.0f;
- sp5E = player->actor.shape.rot.y;
- spawnPos.x = player->actor.world.pos.x + Math_SinS(sp5E) * sp64 + randPlusMinusPoint5Scaled(40.0f);
+ scale = randPlusMinusPoint5Scaled(250.0f) + 500.0f;
+ rotY = player->actor.shape.rot.y;
+ spawnPos.x = player->actor.world.pos.x + (Math_SinS(rotY) * scale) + randPlusMinusPoint5Scaled(40.0f);
spawnPos.y = player->actor.world.pos.y - Rand_ZeroFloat(20.0f);
- spawnPos.z = player->actor.world.pos.z + (Math_CosS(sp5E) * sp64) + randPlusMinusPoint5Scaled(40.0f);
- temp_fv0_2 = BgCheck_EntityRaycastFloor5(&play->colCtx, &sp54, &sp50, &this->actor, &spawnPos);
- if ((!(player->stateFlags1 & 0x8000000) || (temp_fv0_2 <= (BGCHECK_Y_MIN)) ||
- (player->actor.depthInWater < temp_fv0_2))) {
+ spawnPos.z = player->actor.world.pos.z + (Math_CosS(rotY) * scale) + randPlusMinusPoint5Scaled(40.0f);
+ floorHeight = BgCheck_EntityRaycastFloor5(&play->colCtx, &floorPoly, &bgId, &this->actor, &spawnPos);
+ if (!(player->stateFlags1 & PLAYER_STATE1_8000000) || (floorHeight <= BGCHECK_Y_MIN) ||
+ (player->actor.depthInWater < floorHeight)) {
return;
}
break;
case EN_ENCOUNT1_SKULLFISH_2:
- if ((this->path != NULL) && (!SubS_CopyPointFromPath(this->path, 0, &spawnPos))) {
+ if ((this->path != NULL) && !SubS_CopyPointFromPath(this->path, 0, &spawnPos)) {
Actor_Kill(&this->actor);
}
break;
}
- actorList = sActorList[this->actorType];
- actorParams = sActorParams[this->actorType];
- if (Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, actorList, spawnPos.x, spawnPos.y, spawnPos.z, 0, 0, 0,
+ actorId = sActorIds[this->type];
+ actorParams = sActorParams[this->type];
+ if (Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, actorId, spawnPos.x, spawnPos.y, spawnPos.z, 0, 0, 0,
actorParams) != NULL) {
- this->unk_14E++;
- if (this->unk_154 > 0) {
- this->unk_152++;
+ this->spawnActiveCount++;
+ if (this->spawnTotalMax > 0) {
+ this->spawnTotalCount++;
}
- if ((this->unk_14E >= this->unk_14C) && (this->unk_158 != 0)) {
- this->unk_156 = 1;
+ if ((this->spawnActiveCount >= this->spawnActiveMax) && (this->spawnTimeMin != 0)) {
+ this->timer = 1;
}
}
}
diff --git a/src/overlays/actors/ovl_En_Encount1/z_en_encount1.h b/src/overlays/actors/ovl_En_Encount1/z_en_encount1.h
index 52e0fb30c..5c8e6db83 100644
--- a/src/overlays/actors/ovl_En_Encount1/z_en_encount1.h
+++ b/src/overlays/actors/ovl_En_Encount1/z_en_encount1.h
@@ -3,15 +3,22 @@
#include "global.h"
+#define ENENCOUNT1_SPAWNS_TOTAL_MAX_INFINITE 63 // aka 0x3F, All bits set
+
#define ENENCOUNT1_GET_TYPE(thisx) (((thisx)->params >> 11) & 0x1F)
-#define ENENCOUNT1_GET_7C0(thisx) (((thisx)->params >> 6) & 0x1F)
-#define ENENCOUNT1_GET_PATH(thisx) ((thisx)->params & 0x3F)
+#define ENENCOUNT1_GET_SPAWN_ACTIVE_MAX(thisx) (((thisx)->params >> 6) & 0x1F)
+#define ENENCOUNT1_GET_SPAWN_TOTAL_MAX(thisx) ((thisx)->params & 0x3F)
+#define ENENCOUNT1_GET_PATH_INDEX(thisx) ((thisx)->params & 0x3F) // Used only by EN_ENCOUNT1_SKULLFISH_2 which doesn't use SpawnTotalMax
+
+#define ENENCOUNT1_GET_SPAWN_TIME_MIN(thisx) ((thisx)->world.rot.x) // Time to wait between spawning
+#define ENENCOUNT1_GET_SPAWN_UNUSED_PROP(thisx) ((thisx)->world.rot.y) // Unused spawn property
+#define ENENCOUNT1_GET_SPAWN_DISTANCE_MAX(thisx) ((thisx)->world.rot.z) // Negative means infinite distance
typedef enum EnEncount1Enemy {
- /* 0x0 */ EN_ENCOUNT1_GRASSHOPPER,
- /* 0x1 */ EN_ENCOUNT1_WALLMASTER,
- /* 0x2 */ EN_ENCOUNT1_SKULLFISH,
- /* 0x3 */ EN_ENCOUNT1_SKULLFISH_2,
+ /* 0 */ EN_ENCOUNT1_GRASSHOPPER,
+ /* 1 */ EN_ENCOUNT1_WALLMASTER,
+ /* 2 */ EN_ENCOUNT1_SKULLFISH,
+ /* 3 */ EN_ENCOUNT1_SKULLFISH_2,
} EnEncount1Enemy;
struct EnEncount1;
@@ -22,16 +29,16 @@ typedef struct EnEncount1 {
/* 0x000 */ Actor actor;
/* 0x144 */ EnEncount1ActionFunc actionFunc;
/* 0x148 */ Path* path;
- /* 0x14C */ s16 unk_14C;
- /* 0x14E */ s16 unk_14E;
- /* 0x150 */ s16 actorType;
- /* 0x152 */ s16 unk_152;
- /* 0x154 */ s16 unk_154;
- /* 0x156 */ s16 unk_156;
- /* 0x158 */ s16 unk_158;
- /* 0x15A */ s16 unk_15A;
- /* 0x15C */ s32 unk_15C;
- /* 0x160 */ f32 unk_160;
+ /* 0x14C */ s16 spawnActiveMax;
+ /* 0x14E */ s16 spawnActiveCount;
+ /* 0x150 */ s16 type;
+ /* 0x152 */ s16 spawnTotalCount;
+ /* 0x154 */ s16 spawnTotalMax;
+ /* 0x156 */ s16 timer;
+ /* 0x158 */ s16 spawnTimeMin;
+ /* 0x15A */ s16 pathIndex;
+ /* 0x15C */ s32 spawnUnusedProp;
+ /* 0x160 */ f32 spawnDistanceMax;
} EnEncount1; // size = 0x164
#endif // Z_EN_ENCOUNT1_H
diff --git a/src/overlays/actors/ovl_En_Encount2/z_en_encount2.c b/src/overlays/actors/ovl_En_Encount2/z_en_encount2.c
index 7450e3427..ad2f48c7f 100644
--- a/src/overlays/actors/ovl_En_Encount2/z_en_encount2.c
+++ b/src/overlays/actors/ovl_En_Encount2/z_en_encount2.c
@@ -270,14 +270,15 @@ void EnEncount2_DrawEffects(EnEncount2* this, PlayState* play) {
GraphicsContext* gfxCtx = play->state.gfxCtx;
OPEN_DISPS(gfxCtx);
+
sPtr = this->effects;
- func_8012C28C(gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
for (i = 0; i < ARRAY_COUNT(this->effects); i++, sPtr++) {
if (sPtr->isEnabled) {
Matrix_Translate(sPtr->pos.x, sPtr->pos.y, sPtr->pos.z, MTXMODE_NEW);
Matrix_Scale(sPtr->scale, sPtr->scale, sPtr->scale, MTXMODE_APPLY);
- POLY_XLU_DISP = Gfx_CallSetupDL(POLY_XLU_DISP, 20);
+ POLY_XLU_DISP = Gfx_SetupDL(POLY_XLU_DISP, SETUPDL_20);
gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(gSun1Tex));
gSPDisplayList(POLY_XLU_DISP++, gSunSparkleMaterialDL);
gDPPipeSync(POLY_XLU_DISP++);
@@ -289,5 +290,6 @@ void EnEncount2_DrawEffects(EnEncount2* this, PlayState* play) {
gSPDisplayList(POLY_XLU_DISP++, gSunSparkleModelDL);
}
}
+
CLOSE_DISPS(gfxCtx);
}
diff --git a/src/overlays/actors/ovl_En_Ending_Hero/z_en_ending_hero.c b/src/overlays/actors/ovl_En_Ending_Hero/z_en_ending_hero.c
index 2996ccc23..6121cce9d 100644
--- a/src/overlays/actors/ovl_En_Ending_Hero/z_en_ending_hero.c
+++ b/src/overlays/actors/ovl_En_Ending_Hero/z_en_ending_hero.c
@@ -87,8 +87,9 @@ void EnEndingHero_Draw(Actor* thisx, PlayState* play) {
s32 index = 0;
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sEyeTextures[this->unk242]));
diff --git a/src/overlays/actors/ovl_En_Ending_Hero2/z_en_ending_hero2.c b/src/overlays/actors/ovl_En_Ending_Hero2/z_en_ending_hero2.c
index 0cc20358a..604bcd583 100644
--- a/src/overlays/actors/ovl_En_Ending_Hero2/z_en_ending_hero2.c
+++ b/src/overlays/actors/ovl_En_Ending_Hero2/z_en_ending_hero2.c
@@ -69,8 +69,8 @@ void EnEndingHero2_Update(Actor* thisx, PlayState* play) {
void EnEndingHero2_Draw(Actor* thisx, PlayState* play) {
EnEndingHero2* this = THIS;
- func_8012C28C(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount, NULL,
NULL, &this->actor);
}
diff --git a/src/overlays/actors/ovl_En_Ending_Hero3/z_en_ending_hero3.c b/src/overlays/actors/ovl_En_Ending_Hero3/z_en_ending_hero3.c
index aba7c4488..e95d8a6a7 100644
--- a/src/overlays/actors/ovl_En_Ending_Hero3/z_en_ending_hero3.c
+++ b/src/overlays/actors/ovl_En_Ending_Hero3/z_en_ending_hero3.c
@@ -69,8 +69,8 @@ void EnEndingHero3_Update(Actor* thisx, PlayState* play) {
void EnEndingHero3_Draw(Actor* thisx, PlayState* play) {
EnEndingHero3* this = THIS;
- func_8012C28C(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount, NULL,
NULL, &this->actor);
}
diff --git a/src/overlays/actors/ovl_En_Ending_Hero4/z_en_ending_hero4.c b/src/overlays/actors/ovl_En_Ending_Hero4/z_en_ending_hero4.c
index 39e920b9e..39fd515b1 100644
--- a/src/overlays/actors/ovl_En_Ending_Hero4/z_en_ending_hero4.c
+++ b/src/overlays/actors/ovl_En_Ending_Hero4/z_en_ending_hero4.c
@@ -69,8 +69,8 @@ void EnEndingHero4_Update(Actor* thisx, PlayState* play) {
void EnEndingHero4_Draw(Actor* thisx, PlayState* play) {
EnEndingHero4* this = THIS;
- func_8012C28C(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount, NULL,
NULL, &this->actor);
}
diff --git a/src/overlays/actors/ovl_En_Ending_Hero5/z_en_ending_hero5.c b/src/overlays/actors/ovl_En_Ending_Hero5/z_en_ending_hero5.c
index ddf866f94..03eb40786 100644
--- a/src/overlays/actors/ovl_En_Ending_Hero5/z_en_ending_hero5.c
+++ b/src/overlays/actors/ovl_En_Ending_Hero5/z_en_ending_hero5.c
@@ -85,8 +85,9 @@ void EnEndingHero5_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec
void EnEndingHero5_Draw(Actor* thisx, PlayState* play) {
EnEndingHero5* this = THIS;
- func_8012C28C(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
+
OPEN_DISPS(play->state.gfxCtx);
switch (this->unk25C) {
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 5324518de..6a7e96b81 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
@@ -133,8 +133,8 @@ void EnEndingHero6_Draw(Actor* thisx, PlayState* play) {
if (this->isIdle == 1) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ 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);
diff --git a/src/overlays/actors/ovl_En_Estone/z_en_estone.c b/src/overlays/actors/ovl_En_Estone/z_en_estone.c
index 4081bd8e7..85d0527fa 100644
--- a/src/overlays/actors/ovl_En_Estone/z_en_estone.c
+++ b/src/overlays/actors/ovl_En_Estone/z_en_estone.c
@@ -266,7 +266,7 @@ void EnEstone_DrawEffects(EnEstone* this, PlayState* play) {
OPEN_DISPS(gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
for (i = 0; i < ARRAY_COUNT(this->effects); i++, effect++) {
if (effect->isActive) {
Matrix_Translate(effect->pos.x, effect->pos.y, effect->pos.z, MTXMODE_NEW);
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 a43d39c7c..d21b30b60 100644
--- a/src/overlays/actors/ovl_En_Fall/z_en_fall.c
+++ b/src/overlays/actors/ovl_En_Fall/z_en_fall.c
@@ -736,7 +736,7 @@ void EnFall_Moon_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
Matrix_MultVec3f(sFocusOffset, &this->actor.focus.pos);
@@ -754,7 +754,7 @@ void EnFall_OpenMouthMoon_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
primColor = (this->eyeGlowIntensity * 200.0f) + 40.0f;
@@ -772,7 +772,7 @@ void EnFall_LodMoon_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
POLY_OPA_DISP = Gfx_SetFog(POLY_OPA_DISP, 20, 25, 30, 0, 0x3E7, 0x3200);
@@ -826,7 +826,7 @@ void EnFall_Fireball_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
this->fireballYTexScroll1 += (s32)(4.0f + (this->fireballIntensity * 12.0f));
this->fireballYTexScroll2 += (s32)(2.0f + (this->fireballIntensity * 6.0f));
@@ -864,7 +864,7 @@ void EnFall_RisingDebris_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPDisplayList(POLY_OPA_DISP++, gMoonDebrisMaterialDL);
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, 255);
gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 255);
@@ -894,7 +894,7 @@ void EnFall_FireRing_Draw(Actor* thisx, PlayState* play) {
AnimatedMat_DrawXlu(play, Lib_SegmentedToVirtual(gMoonFireRingTexAnim));
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gDPSetColorDither(POLY_XLU_DISP++, G_CD_NOISE);
gDPSetAlphaDither(POLY_XLU_DISP++, G_AD_NOISE);
@@ -914,13 +914,13 @@ void EnFall_MoonsTear_Draw(Actor* thisx, PlayState* play) {
AnimatedMat_Draw(play, Lib_SegmentedToVirtual(gFallingMoonsTearTexAnim));
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPDisplayList(POLY_OPA_DISP++, gFallingMoonsTearDL);
Matrix_Scale(3.0f, 3.0f, 6.0f, MTXMODE_APPLY);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPDisplayList(POLY_XLU_DISP++, gFallingMoonsTearFireDL);
diff --git a/src/overlays/actors/ovl_En_Fall2/z_en_fall2.c b/src/overlays/actors/ovl_En_Fall2/z_en_fall2.c
index 28a6cc74c..bdf742ec3 100644
--- a/src/overlays/actors/ovl_En_Fall2/z_en_fall2.c
+++ b/src/overlays/actors/ovl_En_Fall2/z_en_fall2.c
@@ -153,13 +153,13 @@ void EnFall2_Draw(Actor* thisx, PlayState* play) {
Mtx* mtx;
if (!(this->alphaLevel <= 0.0f)) {
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
AnimatedMat_DrawXlu(play, Lib_SegmentedToVirtual(object_fall2_Matanimheader_008840));
mtx = GRAPH_ALLOC(play->state.gfxCtx, this->skeletonInfo.unk_18->unk_1 * sizeof(Mtx));
if (mtx != NULL) {
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
Matrix_RotateYS((s16)(Camera_GetCamDirYaw(GET_ACTIVE_CAM(play)) + 0x8000), MTXMODE_APPLY);
func_8018450C(play, &this->skeletonInfo, mtx, NULL, NULL, &this->actor);
}
diff --git a/src/overlays/actors/ovl_En_Famos/z_en_famos.c b/src/overlays/actors/ovl_En_Famos/z_en_famos.c
index 3d68d34d7..d23e6b9ee 100644
--- a/src/overlays/actors/ovl_En_Famos/z_en_famos.c
+++ b/src/overlays/actors/ovl_En_Famos/z_en_famos.c
@@ -489,7 +489,7 @@ void EnFamos_SetupChase(EnFamos* this) {
void EnFamos_Chase(EnFamos* this, PlayState* play) {
Player* player = GET_PLAYER(play);
Vec3f abovePlayerPos;
- u32 surfaceType;
+ FloorProperty surfaceType;
EnFamos_UpdateBobbingHeight(this);
Math_ScaledStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 0x800);
@@ -502,7 +502,7 @@ void EnFamos_Chase(EnFamos* this, PlayState* play) {
surfaceType = SurfaceType_GetFloorProperty2(&play->colCtx, this->actor.floorPoly, this->actor.floorBgId);
if ((this->actor.xzDistToPlayer < 30.0f) && (this->actor.floorHeight > BGCHECK_Y_MIN) && // close enough
- (surfaceType != 0xC && surfaceType != 0xD)) {
+ (surfaceType != FLOOR_PROPERTY_12 && surfaceType != FLOOR_PROPERTY_13)) {
EnFamos_SetupAttackAim(this);
} else if ((Player_GetMask(play) == PLAYER_MASK_STONE) ||
@@ -689,9 +689,9 @@ void EnFamos_DeathExplosion(EnFamos* this, PlayState* play) {
this->actor.world.pos.x = randPlusMinusPoint5Scaled(5.0f) + this->targetDest.x;
this->actor.world.pos.z = randPlusMinusPoint5Scaled(5.0f) + this->targetDest.z;
if (this->stateTimer == 1) {
- EnBom* explosion =
- (EnBom*)Actor_Spawn(&play->actorCtx, play, ACTOR_EN_BOM, this->actor.world.pos.x,
- this->actor.world.pos.y + 40.0f, this->actor.world.pos.z, 0, 0, 0, BOMB_TYPE_BODY);
+ EnBom* explosion = (EnBom*)Actor_Spawn(&play->actorCtx, play, ACTOR_EN_BOM, this->actor.world.pos.x,
+ this->actor.world.pos.y + 40.0f, this->actor.world.pos.z,
+ BOMB_EXPLOSIVE_TYPE_BOMB, 0, 0, BOMB_TYPE_BODY);
if (explosion != NULL) {
explosion->timer = 0; // instant explosion
}
@@ -829,9 +829,10 @@ void EnFamos_DrawDebris(EnFamos* this, PlayState* play) {
EnFamosRock* rock;
OPEN_DISPS(play->state.gfxCtx);
+
dispOpa = POLY_OPA_DISP;
- gSPDisplayList(&dispOpa[0], &sSetupDL[6 * 0x19]);
+ gSPDisplayList(&dispOpa[0], gSetupDLs[SETUPDL_25]);
gDPSetPrimColor(&dispOpa[1], 0, 0x80, 255, 255, 255, 255);
@@ -858,7 +859,7 @@ void EnFamos_DrawDebris(EnFamos* this, PlayState* play) {
void EnFamos_Draw(Actor* thisx, PlayState* play) {
EnFamos* this = THIS;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
if (this->actionFunc != EnFamos_DeathFade) {
AnimatedMat_Draw(play, sEmblemAnimatedMats[this->animatedMaterialIndex]);
SkelAnime_DrawOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, EnFamos_OverrideLimbDraw,
diff --git a/src/overlays/actors/ovl_En_Fg/z_en_fg.c b/src/overlays/actors/ovl_En_Fg/z_en_fg.c
index 868c43533..925dc93df 100644
--- a/src/overlays/actors/ovl_En_Fg/z_en_fg.c
+++ b/src/overlays/actors/ovl_En_Fg/z_en_fg.c
@@ -403,7 +403,8 @@ void EnFg_Draw(Actor* thisx, PlayState* play) {
Matrix_Pop();
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gDPPipeSync(POLY_OPA_DISP++);
gDPSetEnvColor(POLY_OPA_DISP++, envColor[this->actor.params].r, envColor[this->actor.params].g,
envColor[this->actor.params].b, envColor[this->actor.params].a);
@@ -411,6 +412,7 @@ void EnFg_Draw(Actor* thisx, PlayState* play) {
gSPSegment(POLY_OPA_DISP++, 0x09, Lib_SegmentedToVirtual(object_fr_Tex_0059A0));
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnFg_OverrideLimbDraw, EnFg_PostLimbDraw, &this->actor);
+
CLOSE_DISPS(play->state.gfxCtx);
}
@@ -456,12 +458,12 @@ void EnFg_DrawDust(PlayState* play, EnFgEffectDust* dustEffect) {
s16 firstDone = false;
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
for (i = 0; i < 10; i++, dustEffect++) {
if (dustEffect->type) {
if (!firstDone) {
- POLY_XLU_DISP = Gfx_CallSetupDL(POLY_XLU_DISP, 0);
+ POLY_XLU_DISP = Gfx_SetupDL(POLY_XLU_DISP, SETUPDL_0);
gSPDisplayList(POLY_XLU_DISP++, object_fr_DL_00B328);
gDPSetEnvColor(POLY_XLU_DISP++, 0, 0, 0, 0);
firstDone = true;
diff --git a/src/overlays/actors/ovl_En_Firefly/z_en_firefly.c b/src/overlays/actors/ovl_En_Firefly/z_en_firefly.c
index bc4e3d743..b26592ac0 100644
--- a/src/overlays/actors/ovl_En_Firefly/z_en_firefly.c
+++ b/src/overlays/actors/ovl_En_Firefly/z_en_firefly.c
@@ -8,7 +8,7 @@
#include "overlays/actors/ovl_Obj_Syokudai/z_obj_syokudai.h"
#include "objects/object_firefly/object_firefly.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_1000 | ACTOR_FLAG_4000)
+#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_IGNORE_QUAKE | ACTOR_FLAG_4000)
#define THIS ((EnFirefly*)thisx)
@@ -828,7 +828,7 @@ void EnFirefly_Draw(Actor* thisx, PlayState* play) {
gfx = POLY_OPA_DISP;
}
- gSPDisplayList(gfx, &sSetupDL[6 * 25]);
+ gSPDisplayList(gfx, gSetupDLs[SETUPDL_25]);
if (this->currentType == KEESE_FIRE) {
gDPSetEnvColor(&gfx[1], 0, 0, 0, 0);
diff --git a/src/overlays/actors/ovl_En_Firefly2/z_en_firefly2.c b/src/overlays/actors/ovl_En_Firefly2/z_en_firefly2.c
index 6c105caa2..00a0d4d9d 100644
--- a/src/overlays/actors/ovl_En_Firefly2/z_en_firefly2.c
+++ b/src/overlays/actors/ovl_En_Firefly2/z_en_firefly2.c
@@ -6,7 +6,7 @@
#include "z_en_firefly2.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_10 | ACTOR_FLAG_1000 | ACTOR_FLAG_4000)
+#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_10 | ACTOR_FLAG_IGNORE_QUAKE | ACTOR_FLAG_4000)
#define THIS ((EnFirefly2*)thisx)
diff --git a/src/overlays/actors/ovl_En_Fish/z_en_fish.c b/src/overlays/actors/ovl_En_Fish/z_en_fish.c
index b70ce1ae7..0331ec347 100644
--- a/src/overlays/actors/ovl_En_Fish/z_en_fish.c
+++ b/src/overlays/actors/ovl_En_Fish/z_en_fish.c
@@ -948,7 +948,7 @@ void EnFish_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, colour->r, colour->g, colour->b, 255);
diff --git a/src/overlays/actors/ovl_En_Fish2/z_en_fish2.c b/src/overlays/actors/ovl_En_Fish2/z_en_fish2.c
index b7952c1bc..ac3a4246b 100644
--- a/src/overlays/actors/ovl_En_Fish2/z_en_fish2.c
+++ b/src/overlays/actors/ovl_En_Fish2/z_en_fish2.c
@@ -1078,8 +1078,8 @@ void EnFish2_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* ro
void EnFish2_Draw(Actor* thisx, PlayState* play) {
EnFish2* this = THIS;
- func_8012C28C(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnFish2_OverrideLimbDraw, EnFish2_PostLimbDraw, &this->actor);
func_80B2B180(this, play);
@@ -1157,7 +1157,7 @@ void func_80B2B180(EnFish2* this, PlayState* play) {
OPEN_DISPS(gfxCtx);
ptr = &this->unk_3F8[0];
- func_8012C28C(gfxCtx);
+ Gfx_SetupDL25_Opa(gfxCtx);
for (i = 0; i < ARRAY_COUNT(this->unk_3F8); i++, ptr++) {
if (ptr->unk_00) {
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 306f1d94d..ef15c27a9 100644
--- a/src/overlays/actors/ovl_En_Fishing/z_en_fishing.c
+++ b/src/overlays/actors/ovl_En_Fishing/z_en_fishing.c
@@ -1252,7 +1252,7 @@ void EnFishing_DrawEffects(FishingEffect* effect, PlayState* play) {
for (i = 30; i < EFFECT_COUNT; i++) {
if (effect->type == FS_EFF_RAIN_DROP) {
if (flag == 0) {
- POLY_XLU_DISP = Gfx_CallSetupDL(POLY_XLU_DISP, 0x14);
+ POLY_XLU_DISP = Gfx_SetupDL(POLY_XLU_DISP, SETUPDL_20);
gDPSetCombineMode(POLY_XLU_DISP++, G_CC_PRIMITIVE, G_CC_PRIMITIVE);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 150, 255, 255, 30);
flag++;
@@ -1271,7 +1271,7 @@ void EnFishing_DrawEffects(FishingEffect* effect, PlayState* play) {
effect++;
}
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
effect = firstEffect + 30;
flag = 0;
@@ -1708,7 +1708,7 @@ void EnFishing_DrawSinkingLure(PlayState* play) {
EnFishing_UpdateSinkingLure(play);
if (sLurePos.y < WATER_SURFACE_Y(play)) {
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPDisplayList(POLY_OPA_DISP++, gFishingSinkingLureSegmentMaterialDL);
@@ -1725,7 +1725,7 @@ void EnFishing_DrawSinkingLure(PlayState* play) {
}
}
} else {
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPDisplayList(POLY_XLU_DISP++, gFishingSinkingLureSegmentMaterialDL);
@@ -1757,7 +1757,7 @@ void EnFishing_DrawLureAndLine(PlayState* play, Vec3f* linePos, Vec3f* lineRot)
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
Matrix_Push();
if (D_8090CD54 != 0) {
@@ -1800,7 +1800,7 @@ void EnFishing_DrawLureAndLine(PlayState* play, Vec3f* linePos, Vec3f* lineRot)
Matrix_RotateZF(M_PI / 2, MTXMODE_APPLY);
Matrix_RotateYF(M_PI / 2, MTXMODE_APPLY);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, gFishingLureFloatDL);
@@ -1821,7 +1821,7 @@ void EnFishing_DrawLureAndLine(PlayState* play, Vec3f* linePos, Vec3f* lineRot)
EnFishing_DrawLureHook(play, &hookPos[1], &sLureHookRefPos[1], 1);
}
- POLY_XLU_DISP = Gfx_CallSetupDL(POLY_XLU_DISP, 0x14);
+ POLY_XLU_DISP = Gfx_SetupDL(POLY_XLU_DISP, SETUPDL_20);
gDPSetCombineMode(POLY_XLU_DISP++, G_CC_PRIMITIVE, G_CC_PRIMITIVE);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 255, 55);
@@ -1893,7 +1893,7 @@ void EnFishing_DrawLureAndLine(PlayState* play, Vec3f* linePos, Vec3f* lineRot)
}
Matrix_Pop();
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
CLOSE_DISPS(play->state.gfxCtx);
}
@@ -1949,25 +1949,25 @@ void EnFishing_DrawRod(PlayState* play) {
D_8090CD34 = 0.0f;
}
- spC8 = player->unk_B08[1];
- Math_SmoothStepToF(&player->unk_B08[1], input->rel.stick_y * 0.02f, 0.3f, 5.0f, 0.0f);
- spC8 = player->unk_B08[1] - spC8;
+ spC8 = player->unk_B0C;
+ Math_SmoothStepToF(&player->unk_B0C, input->rel.stick_y * 0.02f, 0.3f, 5.0f, 0.0f);
+ spC8 = player->unk_B0C - spC8;
- spC4 = player->unk_B08[0];
- Math_SmoothStepToF(&player->unk_B08[0], input->rel.stick_x * 0.02f, 0.3f, 5.0f, 0.0f);
- spC4 = player->unk_B08[0] - spC4;
+ spC4 = player->unk_B08;
+ Math_SmoothStepToF(&player->unk_B08, input->rel.stick_x * 0.02f, 0.3f, 5.0f, 0.0f);
+ spC4 = player->unk_B08 - spC4;
- if (player->unk_B08[0] > 1.0f) {
- player->unk_B08[0] = 1.0f;
+ if (player->unk_B08 > 1.0f) {
+ player->unk_B08 = 1.0f;
}
- if (player->unk_B08[1] > 1.0f) {
- player->unk_B08[1] = 1.0f;
+ if (player->unk_B0C > 1.0f) {
+ player->unk_B0C = 1.0f;
}
- if (player->unk_B08[0] < -1.0f) {
- player->unk_B08[0] = -1.0f;
+ if (player->unk_B08 < -1.0f) {
+ player->unk_B08 = -1.0f;
}
- if (player->unk_B08[1] < -1.0f) {
- player->unk_B08[1] = -1.0f;
+ if (player->unk_B0C < -1.0f) {
+ player->unk_B0C = -1.0f;
}
Math_ApproachF(&D_8090CD28, spC4 * 70.0f * -0.01f, 1.0f, D_8090CD30);
@@ -1976,8 +1976,8 @@ void EnFishing_DrawRod(PlayState* play) {
Math_ApproachF(&D_8090CD34, 1.0f, 1.0f, 0.1f);
Math_ApproachZeroF(&D_8090CD38, 1.0f, 0.05f);
} else {
- Math_ApproachZeroF(&player->unk_B08[1], 1.0f, 0.1f);
- Math_ApproachZeroF(&player->unk_B08[0], 1.0f, 0.1f);
+ Math_ApproachZeroF(&player->unk_B0C, 1.0f, 0.1f);
+ Math_ApproachZeroF(&player->unk_B08, 1.0f, 0.1f);
Math_ApproachF(&D_8090CD2C, (Math_SinS(D_809171FE * 3000) * 0.025f) + -0.03f, 1.0f, 0.05f);
Math_ApproachZeroF(&D_8090CD28, 1.0f, 0.05f);
@@ -1988,13 +1988,13 @@ void EnFishing_DrawRod(PlayState* play) {
}
}
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPDisplayList(POLY_OPA_DISP++, gFishingRodSetupDL);
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 155, 0, 255);
- Matrix_Mult(&player->mf_CC4, MTXMODE_NEW);
+ Matrix_Mult(&player->leftHandMf, MTXMODE_NEW);
if (sLinkAge != 1) {
Matrix_Translate(0.0f, 400.0f, 0.0f, MTXMODE_APPLY);
@@ -2009,11 +2009,11 @@ void EnFishing_DrawRod(PlayState* play) {
}
Matrix_RotateXFApply(-0.6283185f);
- Matrix_RotateZF((player->unk_B08[0] * 0.5f) + 0.4712389f, MTXMODE_APPLY);
+ Matrix_RotateZF((player->unk_B08 * 0.5f) + 0.4712389f, MTXMODE_APPLY);
Matrix_RotateXFApply((D_8090CD40 + 20.0f) * 0.01f * M_PI);
Matrix_Scale(0.70000005f, 0.70000005f, 0.70000005f, MTXMODE_APPLY);
- spC0 = (D_8090CD3C * (((player->unk_B08[1] - 1.0f) * -0.25f) + 0.5f)) + (D_8090CD2C + D_8090CD38);
+ spC0 = (D_8090CD3C * (((player->unk_B0C - 1.0f) * -0.25f) + 0.5f)) + (D_8090CD2C + D_8090CD38);
Matrix_Translate(0.0f, 0.0f, -1300.0f, MTXMODE_APPLY);
@@ -4225,7 +4225,7 @@ void EnFishing_LoachPostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Ve
void EnFishing_DrawFish(Actor* thisx, PlayState* play) {
EnFishing* this = THIS;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
Matrix_Translate(this->actor.world.pos.x, this->actor.world.pos.y, this->actor.world.pos.z, MTXMODE_NEW);
Matrix_RotateYF(BINANG_TO_RAD_ALT(this->unk_15A + this->actor.shape.rot.y), MTXMODE_APPLY);
@@ -5618,8 +5618,8 @@ void EnFishing_DrawOwner(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
if ((this->actor.projectedPos.z < 1500.0f) &&
(fabsf(this->actor.projectedPos.x) < (100.0f + this->actor.projectedPos.z))) {
diff --git a/src/overlays/actors/ovl_En_Floormas/z_en_floormas.c b/src/overlays/actors/ovl_En_Floormas/z_en_floormas.c
index ffd456af4..3cf6385e0 100644
--- a/src/overlays/actors/ovl_En_Floormas/z_en_floormas.c
+++ b/src/overlays/actors/ovl_En_Floormas/z_en_floormas.c
@@ -1188,7 +1188,7 @@ void EnFloormas_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
if (this->collider.base.colType == COLTYPE_HARD) {
func_800AE2A0(play, &D_808D3958, this->unk_190 % 40, 40);
}
@@ -1213,7 +1213,7 @@ void func_808D3754(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
if (this->collider.base.colType == COLTYPE_HARD) {
func_800AE5E4(play, &D_808D3958, this->unk_190 % 40, 40);
}
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 dc56f50c9..3cf468a88 100644
--- a/src/overlays/actors/ovl_En_Fsn/z_en_fsn.c
+++ b/src/overlays/actors/ovl_En_Fsn/z_en_fsn.c
@@ -1470,7 +1470,7 @@ void EnFsn_DrawCursor(EnFsn* this, PlayState* play, f32 x, f32 y, f32 z, u8 draw
OPEN_DISPS(play->state.gfxCtx);
if (drawCursor != 0) {
- func_8012C654(play->state.gfxCtx);
+ Gfx_SetupDL39_Overlay(play->state.gfxCtx);
gDPSetPrimColor(OVERLAY_DISP++, 0, 0, this->cursorColor.r, this->cursorColor.g, this->cursorColor.b,
this->cursorColor.a);
gDPLoadTextureBlock_4b(OVERLAY_DISP++, gSelectionCursorTex, G_IM_FMT_IA, 16, 16, 0, G_TX_MIRROR | G_TX_WRAP,
@@ -1527,7 +1527,7 @@ void EnFsn_DrawStickDirectionPrompts(EnFsn* this, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
if (drawStickRightPrompt || drawStickLeftPrompt) {
- func_8012C654(play->state.gfxCtx);
+ Gfx_SetupDL39_Overlay(play->state.gfxCtx);
gDPSetCombineMode(OVERLAY_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
gDPLoadTextureBlock(OVERLAY_DISP++, gArrowCursorTex, G_IM_FMT_IA, G_IM_SIZ_8b, 16, 24, 0,
G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, 4, G_TX_NOMASK, G_TX_NOLOD,
@@ -1622,7 +1622,7 @@ void EnFsn_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C5B0(play->state.gfxCtx);
+ Gfx_SetupDL37_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sEyeTextures[this->eyeTexIndex]));
gSPSegment(POLY_OPA_DISP++, 0x09, Lib_SegmentedToVirtual(sEyeTextures[this->eyeTexIndex]));
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
diff --git a/src/overlays/actors/ovl_En_Fu/z_en_fu.c b/src/overlays/actors/ovl_En_Fu/z_en_fu.c
index 7435d0ddc..3866c4fb1 100644
--- a/src/overlays/actors/ovl_En_Fu/z_en_fu.c
+++ b/src/overlays/actors/ovl_En_Fu/z_en_fu.c
@@ -728,8 +728,8 @@ void func_80962D60(EnFu* this, PlayState* play) {
void func_80962EBC(EnFu* this, PlayState* play) {
if (this->unk_542 != 0) {
if (this->actor.csId != CS_ID_NONE) {
- Camera_ChangeDataIdx(play->cameraPtrs[CAM_ID_MAIN],
- CutsceneManager_GetCutsceneEntry(this->actor.csId)->csCamId);
+ Camera_ChangeActorCsCamIndex(play->cameraPtrs[CAM_ID_MAIN],
+ CutsceneManager_GetCutsceneEntry(this->actor.csId)->csCamId);
}
}
}
@@ -1385,7 +1385,7 @@ void EnFu_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gDPPipeSync(POLY_OPA_DISP++);
gSPSegment(POLY_OPA_DISP++, 0x08, Gfx_EnvColor(play->state.gfxCtx, 0, 50, 160, 0));
@@ -1449,7 +1449,7 @@ void func_80964950(PlayState* play, EnFuUnkStruct* ptr, s32 len) {
OPEN_DISPS(play->state.gfxCtx);
POLY_OPA_DISP = Play_SetFog(play, POLY_OPA_DISP);
- POLY_OPA_DISP = func_8012C724(POLY_OPA_DISP);
+ POLY_OPA_DISP = Gfx_SetupDL66(POLY_OPA_DISP);
for (i = 0; i < len; i++, ptr++) {
if (ptr->unk_36 == 1) {
diff --git a/src/overlays/actors/ovl_En_Fu_Kago/z_en_fu_kago.c b/src/overlays/actors/ovl_En_Fu_Kago/z_en_fu_kago.c
index e976e01dc..576e307b2 100644
--- a/src/overlays/actors/ovl_En_Fu_Kago/z_en_fu_kago.c
+++ b/src/overlays/actors/ovl_En_Fu_Kago/z_en_fu_kago.c
@@ -364,7 +364,7 @@ void func_80AD0340(EnFuKago* this, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
for (i = 0; i < ARRAY_COUNT(D_80AD061C); i++, ptr++) {
Matrix_Push();
@@ -390,7 +390,7 @@ void EnFuKago_Draw(Actor* thisx, PlayState* play) {
if (this->unk_33A == 0) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, object_fu_mato_DL_0006A0);
diff --git a/src/overlays/actors/ovl_En_Fu_Mato/z_en_fu_mato.c b/src/overlays/actors/ovl_En_Fu_Mato/z_en_fu_mato.c
index c42278805..52e947dbd 100644
--- a/src/overlays/actors/ovl_En_Fu_Mato/z_en_fu_mato.c
+++ b/src/overlays/actors/ovl_En_Fu_Mato/z_en_fu_mato.c
@@ -406,7 +406,7 @@ void func_80ACF1F4(EnFuMato* this, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
for (i = 0; i < 2; i++) {
Matrix_Push();
@@ -449,7 +449,7 @@ void func_80ACF3F4(EnFuMato* this, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
for (i = 0; i < ARRAY_COUNT(D_80ACF63C); i++, ptr++) {
Matrix_Push();
@@ -471,7 +471,7 @@ void EnFuMato_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
diff --git a/src/overlays/actors/ovl_En_Fz/z_en_fz.c b/src/overlays/actors/ovl_En_Fz/z_en_fz.c
index fe4e6636b..150f3c8c1 100644
--- a/src/overlays/actors/ovl_En_Fz/z_en_fz.c
+++ b/src/overlays/actors/ovl_En_Fz/z_en_fz.c
@@ -846,7 +846,7 @@ void EnFz_Draw(Actor* thisx, PlayState* play) {
if (this->unk_BD7 != 0) {
func_800B8118(&this->actor, play, 0);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPSegment(POLY_XLU_DISP++, 0x08,
Gfx_TwoTexScroll(play->state.gfxCtx, 0, 0, play->state.frames % 128, 0x20, 0x20, 1, 0,
@@ -993,7 +993,7 @@ void func_80934464(EnFz* this, PlayState* play) {
OPEN_DISPS(gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gDPSetColorDither(POLY_XLU_DISP++, G_CD_BAYER);
gDPSetAlphaDither(POLY_XLU_DISP++, G_AD_PATTERN);
diff --git a/src/overlays/actors/ovl_En_Gamelupy/z_en_gamelupy.c b/src/overlays/actors/ovl_En_Gamelupy/z_en_gamelupy.c
index 9f45748df..b9936c53c 100644
--- a/src/overlays/actors/ovl_En_Gamelupy/z_en_gamelupy.c
+++ b/src/overlays/actors/ovl_En_Gamelupy/z_en_gamelupy.c
@@ -181,7 +181,7 @@ void EnGamelupy_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
func_800B8050(&this->actor, play, 0);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sRupeeTextures[this->rupeeIndex]));
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 b949cf408..11fa876d4 100644
--- a/src/overlays/actors/ovl_En_Gb2/z_en_gb2.c
+++ b/src/overlays/actors/ovl_En_Gb2/z_en_gb2.c
@@ -355,7 +355,7 @@ void func_80B0FD8C(EnGb2* this, PlayState* play) {
}
void func_80B0FE18(PlayState* play) {
- func_800FD750(0x38);
+ func_800FD750(NA_BGM_MINI_BOSS);
play->nextEntrance = ENTRANCE(GHOST_HUT, 1);
play->transitionType = TRANS_TYPE_64;
gSaveContext.nextTransitionType = TRANS_TYPE_64;
@@ -1007,7 +1007,7 @@ void EnGb2_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
if (this->unk_28A == 255) {
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gDPSetEnvColor(POLY_OPA_DISP++, 255, 255, 255, 255);
@@ -1016,7 +1016,7 @@ void EnGb2_Draw(Actor* thisx, PlayState* play) {
SkelAnime_DrawFlex(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnGb2_OverrideLimbDraw, EnGb2_PostLimbDraw, &this->actor, POLY_OPA_DISP);
} else {
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gDPSetEnvColor(POLY_OPA_DISP++, 255, 255, 255, this->unk_28A);
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 6cfbb4718..99a2808f5 100644
--- a/src/overlays/actors/ovl_En_Ge1/z_en_ge1.c
+++ b/src/overlays/actors/ovl_En_Ge1/z_en_ge1.c
@@ -457,7 +457,7 @@ void EnGe1_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C5B0(play->state.gfxCtx);
+ Gfx_SetupDL37_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sEyeTextures[this->eyeIndex]));
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnGe1_OverrideLimbDraw, EnGe1_PostLimbDraw, &this->picto.actor);
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 922472f9a..15c151789 100644
--- a/src/overlays/actors/ovl_En_Ge2/z_en_ge2.c
+++ b/src/overlays/actors/ovl_En_Ge2/z_en_ge2.c
@@ -767,7 +767,7 @@ void EnGe2_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C5B0(play->state.gfxCtx);
+ Gfx_SetupDL37_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, SEGMENTED_TO_VIRTUAL(sEyeTextures[this->eyeIndex]));
func_800B8050(&this->picto.actor, play, 0);
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
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 4b5e8e311..0362fb4e3 100644
--- a/src/overlays/actors/ovl_En_Geg/z_en_geg.c
+++ b/src/overlays/actors/ovl_En_Geg/z_en_geg.c
@@ -951,7 +951,7 @@ void EnGeg_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
if (limbIndex == 17) {
if (!(this->unk_230 & 0x40)) {
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
OPEN_DISPS(play->state.gfxCtx);
@@ -1045,7 +1045,7 @@ void func_80BB3BE0(EnGeg* this, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(D_80BB4088[this->unk_23E]));
gDPPipeSync(POLY_OPA_DISP++);
@@ -1062,7 +1062,7 @@ void func_80BB3CB4(EnGeg* this, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
Matrix_Translate(this->actor.world.pos.x, this->actor.world.pos.y + this->actor.shape.yOffset,
this->actor.world.pos.z, MTXMODE_NEW);
Matrix_RotateYS(this->actor.shape.rot.y, MTXMODE_APPLY);
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 81d1c6bb6..e9e37ddb4 100644
--- a/src/overlays/actors/ovl_En_Gg/z_en_gg.c
+++ b/src/overlays/actors/ovl_En_Gg/z_en_gg.c
@@ -527,7 +527,7 @@ void func_80B35C84(EnGgStruct* ptr, PlayState* play) {
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0x80, 255, 255, 255, 255);
gDPSetEnvColor(POLY_XLU_DISP++, 255, 150, 0, 255);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
Matrix_Mult(&play->billboardMtxF, MTXMODE_APPLY);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
@@ -551,7 +551,7 @@ void func_80B35C84(EnGgStruct* ptr, PlayState* play) {
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0x80, 255, 255, 255, 255);
gDPSetEnvColor(POLY_XLU_DISP++, 255, 150, 0, 255);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
Matrix_Mult(&play->billboardMtxF, MTXMODE_APPLY);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
@@ -604,7 +604,7 @@ void func_80B3610C(EnGgStruct* ptr, PlayState* play) {
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0x80, 255, 255, 255, 255);
gDPSetEnvColor(POLY_XLU_DISP++, 255, 150, 0, 255);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
Matrix_Mult(&play->billboardMtxF, MTXMODE_APPLY);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
@@ -791,7 +791,7 @@ void EnGg_Draw(Actor* thisx, PlayState* play) {
}
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_19_80)) {
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(D_80B36DFC[this->unk_2E2]));
@@ -799,7 +799,7 @@ void EnGg_Draw(Actor* thisx, PlayState* play) {
SkelAnime_DrawFlex(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnGg_OverrideLimbDraw, EnGg_PostLimbDraw, &this->actor, POLY_OPA_DISP);
} else if (CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_REACT_TO_LENS) || (this->unk_308 == 1)) {
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(D_80B36DFC[this->unk_2E2]));
@@ -807,7 +807,7 @@ void EnGg_Draw(Actor* thisx, PlayState* play) {
SkelAnime_DrawFlex(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnGg_OverrideLimbDraw, EnGg_PostLimbDraw, &this->actor, POLY_XLU_DISP);
}
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
CLOSE_DISPS(play->state.gfxCtx);
}
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 fdd099fff..76e3d69da 100644
--- a/src/overlays/actors/ovl_En_Gg2/z_en_gg2.c
+++ b/src/overlays/actors/ovl_En_Gg2/z_en_gg2.c
@@ -479,7 +479,7 @@ void EnGg2_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
if (CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_REACT_TO_LENS) || (this->unk_2F0 == 1)) {
gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(D_80B3C0AC[this->unk_2EA]));
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 07c01b288..cc15fcbce 100644
--- a/src/overlays/actors/ovl_En_Giant/z_en_giant.c
+++ b/src/overlays/actors/ovl_En_Giant/z_en_giant.c
@@ -509,7 +509,7 @@ void EnGiant_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
if (this->alpha >= 255) {
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sFaceTextures[this->faceIndex]));
gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 255);
Scene_SetRenderModeXlu(play, 0, 1);
@@ -517,10 +517,10 @@ void EnGiant_Draw(Actor* thisx, PlayState* play) {
this->skelAnime.dListCount, NULL, EnGiant_PostLimbDrawOpa, thisx);
} else if (this->alpha > 0) {
if (this->alpha >= 129) {
- func_8012C2B4(POLY_XLU_DISP++);
+ Gfx_SetupDL71(POLY_XLU_DISP++);
Scene_SetRenderModeXlu(play, 2, 2);
} else {
- func_8012C304(POLY_XLU_DISP++);
+ Gfx_SetupDL72(POLY_XLU_DISP++);
Scene_SetRenderModeXlu(play, 1, 2);
}
gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(sFaceTextures[this->faceIndex]));
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 fba0c1118..a76d89e7b 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
@@ -668,7 +668,7 @@ void EnGinkoMan_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Gfx_EnvColor(play->state.gfxCtx, 50, 80, 0, 0));
gSPSegment(POLY_OPA_DISP++, 0x09, Gfx_EnvColor(play->state.gfxCtx, 50, 80, 0, 0));
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 40cf72a98..c561035aa 100644
--- a/src/overlays/actors/ovl_En_Gk/z_en_gk.c
+++ b/src/overlays/actors/ovl_En_Gk/z_en_gk.c
@@ -1233,7 +1233,7 @@ void EnGk_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
if ((ENGK_GET_F(&this->actor) == ENGK_F_0) && CHECK_WEEKEVENTREG(WEEKEVENTREG_22_04)) {
Matrix_RotateXS(-0x4000, MTXMODE_APPLY);
@@ -1242,7 +1242,7 @@ void EnGk_Draw(Actor* thisx, PlayState* play) {
gSPDisplayList(POLY_OPA_DISP++, object_gk_DL_006688);
gSPDisplayList(POLY_OPA_DISP++, object_gk_DL_006680);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
pos = this->actor.world.pos;
scale.x = 0.2f;
@@ -1258,7 +1258,7 @@ void EnGk_Draw(Actor* thisx, PlayState* play) {
EnGk_TransformLimbDraw, &this->actor);
if (ENGK_GET_F(&this->actor) != ENGK_F_2) {
- func_8012C2DC(play->state.gfxCtx);
+ 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)) {
pos.x = this->actor.world.pos.x - 15.0f;
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 f31dd7cd2..4c4aa474b 100644
--- a/src/overlays/actors/ovl_En_Gm/z_en_gm.c
+++ b/src/overlays/actors/ovl_En_Gm/z_en_gm.c
@@ -1019,7 +1019,7 @@ s32 func_8094F904(EnGm* this, PlayState* play, ScheduleOutput* scheduleOutput) {
this->timePath = SubS_GetAdditionalPath(play, sp55, D_80951A0C[scheduleOutput->result]);
}
- if ((door != NULL) && (door->dyna.actor.update != NULL)) {
+ if ((door != NULL) && (door->knobDoor.dyna.actor.update != NULL)) {
if (this->timePath != NULL) {
sp4C = Lib_SegmentedToVirtual(this->timePath->points);
Math_Vec3s_ToVec3f(&sp40, &sp4C[0]);
@@ -1029,7 +1029,7 @@ s32 func_8094F904(EnGm* this, PlayState* play, ScheduleOutput* scheduleOutput) {
this->actor.world.rot.y = Math_Vec3f_Yaw(&sp40, &sp34);
Math_Vec3f_Copy(&this->actor.world.pos, &sp40);
- if (ABS_ALT(BINANG_SUB(this->actor.world.rot.y, door->dyna.actor.shape.rot.y)) <= 0x4000) {
+ if (ABS_ALT(BINANG_SUB(this->actor.world.rot.y, door->knobDoor.dyna.actor.shape.rot.y)) <= 0x4000) {
this->unk_261 = -75;
} else {
this->unk_261 = 75;
@@ -1450,7 +1450,7 @@ s32 func_80950804(EnGm* this, PlayState* play) {
door = func_8094DF90(play, this->unk_258);
if (!SubS_InCsMode(play) && (this->timePathTimeSpeed != 0)) {
- if ((door != NULL) && (door->dyna.actor.update != NULL)) {
+ if ((door != NULL) && (door->knobDoor.dyna.actor.update != NULL)) {
if ((this->unk_3BA / (f32)this->unk_3B8) <= 0.9f) {
door->unk_1A7 = this->unk_261;
} else {
@@ -1832,7 +1832,7 @@ void EnGm_Draw(Actor* thisx, PlayState* play) {
if ((this->unk_258 != 0) && (this->unk_262 >= 0)) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(D_80951E30[this->unk_3CE]));
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 a0c7e3180..67cbf327a 100644
--- a/src/overlays/actors/ovl_En_Go/z_en_go.c
+++ b/src/overlays/actors/ovl_En_Go/z_en_go.c
@@ -6,6 +6,7 @@
#include "z_en_go.h"
#include "z64quake.h"
+#include "overlays/actors/ovl_En_Bom/z_en_bom.h"
#include "objects/object_oF1d_map/object_oF1d_map.h"
#include "objects/object_hakugin_demo/object_hakugin_demo.h"
#include "objects/object_taisou/object_taisou.h"
@@ -242,7 +243,7 @@ void func_80A11144(EnGoStruct* ptr, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
for (i = 0; i < 32; i++, ptr++) {
@@ -319,12 +320,12 @@ void func_80A115B4(EnGoStruct* ptr, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
for (i = 0; i < 32; i++, ptr++) {
if ((ptr->unk_00 >= 4) && (ptr->unk_00 < 7)) {
if (!flag) {
- POLY_XLU_DISP = Gfx_CallSetupDL(POLY_XLU_DISP, 0);
+ POLY_XLU_DISP = Gfx_SetupDL(POLY_XLU_DISP, SETUPDL_0);
gSPDisplayList(POLY_XLU_DISP++, gGoronDustMaterialDL);
flag = true;
}
@@ -455,7 +456,7 @@ void func_80A11EC0(EnGoStruct* ptr, PlayState* play, Gfx* arg2, Gfx* arg3, u8 ar
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
for (i = 0; i < 16; i++, ptr++) {
if (ptr->unk_00 == arg4) {
@@ -1046,16 +1047,16 @@ s32 func_80A13564(EnGo* this, f32 arg1, f32 arg2, s32 arg3) {
return ret;
}
-void func_80A136B8(PlayState* play, s16 speed, s16 verticalMag, s16 countdown) {
- s16 quakeIndex = Quake_Add(Play_GetCamera(play, CAM_ID_MAIN), QUAKE_TYPE_3);
+void EnGo_RequestQuake(PlayState* play, s16 speed, s16 y, s16 duration) {
+ s16 quakeIndex = Quake_Request(Play_GetCamera(play, CAM_ID_MAIN), QUAKE_TYPE_3);
- Quake_SetCountdown(quakeIndex, countdown);
+ Quake_SetDuration(quakeIndex, duration);
Quake_SetSpeed(quakeIndex, speed);
- Quake_SetQuakeValues(quakeIndex, verticalMag, 0, 0, 0);
+ Quake_SetPerturbations(quakeIndex, y, 0, 0, 0);
}
void func_80A13728(EnGo* this, PlayState* play) {
- func_80A136B8(play, 27767, 7, 20);
+ EnGo_RequestQuake(play, 27767, 7, 20);
play->actorCtx.unk2 = 4;
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_TEST, this->actor.world.pos.x, this->actor.world.pos.y,
this->actor.world.pos.z, 0, 0, 0, 0);
@@ -1071,7 +1072,7 @@ void func_80A137C0(EnGo* this, PlayState* play, f32 arg2, f32 arg3) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ 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);
Matrix_Scale(arg2 * 0.7f, arg2 * 0.8f, arg2, MTXMODE_APPLY);
@@ -1249,7 +1250,8 @@ s32 func_80A13E80(EnGo* this, PlayState* play) {
func_80A12C48(this, play, 1);
Lib_Vec3f_TranslateAndRotateY(&this->actor.world.pos, this->actor.shape.rot.y, &D_80A166A4, &sp48);
gSaveContext.powderKegTimer = 2400;
- Actor_Spawn(&play->actorCtx, play, ACTOR_EN_BOM, sp48.x, sp48.y, sp48.z, 1, 0, 0, 0);
+ Actor_Spawn(&play->actorCtx, play, ACTOR_EN_BOM, sp48.x, sp48.y, sp48.z, BOMB_EXPLOSIVE_TYPE_POWDER_KEG,
+ 0, 0, BOMB_TYPE_BODY);
func_80A134B0(this, play, 1);
this->unk_3C2 = 0;
this->unk_3C0++;
@@ -1950,7 +1952,7 @@ void func_80A15B80(EnGo* this, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
Matrix_Translate(this->actor.world.pos.x, this->actor.world.pos.y + this->actor.shape.yOffset,
this->actor.world.pos.z, MTXMODE_NEW);
@@ -2068,7 +2070,7 @@ void func_80A15FEC(Actor* thisx, PlayState* play) {
if (!(this->unk_390 & 0x300)) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(D_80A1670C[this->unk_3BE]));
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 b07d1f2c7..148b2d116 100644
--- a/src/overlays/actors/ovl_En_Goroiwa/z_en_goroiwa.c
+++ b/src/overlays/actors/ovl_En_Goroiwa/z_en_goroiwa.c
@@ -451,11 +451,11 @@ s32 func_8093F6F8(EnGoroiwa* this, PlayState* play) {
if ((this->actor.velocity.y < 0.0f) && (this->actor.world.pos.y <= sp7C)) {
if (this->unk_1CA == 0) {
if (this->actor.xzDistToPlayer < 400.0f) {
- s16 quakeIndex = Quake_Add(GET_ACTIVE_CAM(play), QUAKE_TYPE_3);
+ s16 quakeIndex = Quake_Request(GET_ACTIVE_CAM(play), QUAKE_TYPE_3);
Quake_SetSpeed(quakeIndex, 17232);
- Quake_SetQuakeValues(quakeIndex, 3, 0, 0, 0);
- Quake_SetCountdown(quakeIndex, 7);
+ Quake_SetPerturbations(quakeIndex, 3, 0, 0, 0);
+ Quake_SetDuration(quakeIndex, 7);
}
this->unk_1C4 = 0.0f;
@@ -1575,7 +1575,7 @@ void func_80942B1C(EnGoroiwa* this, PlayState* play) {
if ((ptr->unk_28 != 0) && (ptr->unk_2C > 0)) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C448(play->state.gfxCtx);
+ Gfx_SetupDL44_Xlu(play->state.gfxCtx);
gDPSetCombineLERP(POLY_XLU_DISP++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, COMBINED, 0, 0,
0, COMBINED);
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 2bd6fec69..c4ff0959c 100644
--- a/src/overlays/actors/ovl_En_Grasshopper/z_en_grasshopper.c
+++ b/src/overlays/actors/ovl_En_Grasshopper/z_en_grasshopper.c
@@ -1007,7 +1007,7 @@ void EnGrasshopper_Draw(Actor* thisx, PlayState* play) {
u8* shadowTex = GRAPH_ALLOC(play->state.gfxCtx, SUBS_SHADOW_TEX_SIZE);
u8* shadowTexIter;
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
SkelAnime_DrawOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, NULL, EnGrasshopper_PostLimbDraw,
&this->actor);
if ((this->type != EN_GRASSHOPPER_TYPE_WOODFALL_TEMPLE_FINAL_ROOM) &&
@@ -1134,7 +1134,7 @@ void EnGrasshopper_DrawEffects(EnGrasshopper* this, PlayState* play) {
if (mtx != NULL) {
gSPMatrix(POLY_XLU_DISP++, mtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- func_8012C9BC(play->state.gfxCtx);
+ Gfx_SetupDL61_Xlu(play->state.gfxCtx);
gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(sLightningTextures[effect->lightningIndex]));
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 255, 255);
gDPSetEnvColor(POLY_XLU_DISP++, 200, 255, 255, 255);
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 8056253f6..11ed8a130 100644
--- a/src/overlays/actors/ovl_En_Grasshopper/z_en_grasshopper.h
+++ b/src/overlays/actors/ovl_En_Grasshopper/z_en_grasshopper.h
@@ -6,6 +6,8 @@
#define EN_GRASSHOPPER_GET_TYPE(thisx) ((thisx)->params)
+#define EN_GRASSHOPPER_PARAMS(type) (type)
+
struct EnGrasshopper;
typedef void (*EnGrasshopperActionFunc)(struct EnGrasshopper*, PlayState*);
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 2f4257347..30a6709a2 100644
--- a/src/overlays/actors/ovl_En_Gs/z_en_gs.c
+++ b/src/overlays/actors/ovl_En_Gs/z_en_gs.c
@@ -5,6 +5,7 @@
*/
#include "z_en_gs.h"
+#include "overlays/actors/ovl_En_Bom/z_en_bom.h"
#include "objects/object_gs/object_gs.h"
#include "objects/gameplay_keep/gameplay_keep.h"
@@ -523,8 +524,8 @@ s32 func_80998A48(EnGs* this, PlayState* play) {
this->unk_1D4 = 0;
this->unk_19A |= 1;
- this->unk_21C = 5;
- this->unk_21E = 40;
+ this->quakeY = 5;
+ this->quakeDuration = 40;
this->unk_197++;
this->unk_197 &= 0xF;
this->unk_19D = 1;
@@ -558,8 +559,8 @@ s32 func_80998BBC(EnGs* this, PlayState* play) {
this->unk_1D4 = 0;
this->unk_19A |= 1;
- this->unk_21C = 5;
- this->unk_21E = 40;
+ this->quakeY = 5;
+ this->quakeDuration = 40;
this->unk_197--;
this->unk_197 &= 0xF;
this->unk_19D = 1;
@@ -585,8 +586,8 @@ s32 func_80998D44(EnGs* this, PlayState* play) {
this->unk_1E0 = -0.8f;
Actor_PlaySfx(&this->actor, NA_SE_EV_G_STONE_CRUSH);
this->unk_19A |= 1;
- this->unk_21C = 40;
- this->unk_21E = 11;
+ this->quakeY = 40;
+ this->quakeDuration = 11;
this->unk_19D++;
} else if (this->unk_19D == 1) {
step = Math_SmoothStepToF(&this->unk_1DC, this->unk_1E0, 1.0f, 0.4f, 0.001f);
@@ -611,8 +612,8 @@ s32 func_80998D44(EnGs* this, PlayState* play) {
this->unk_216 = 0;
this->unk_1E0 = 0.0f;
this->unk_1D4 = 0;
- this->unk_21C = 10;
- this->unk_21E = 10;
+ this->quakeY = 10;
+ this->quakeDuration = 10;
this->unk_1DC = 0.5f;
Actor_PlaySfx(&this->actor, NA_SE_EN_STALKID_ATTACK);
this->unk_19D += 1;
@@ -641,8 +642,8 @@ s32 func_80998F9C(EnGs* this, PlayState* play) {
this->unk_1EC = 0.0f;
this->unk_19D = 1;
- this->unk_21C = 2;
- this->unk_21E = 40;
+ this->quakeY = 2;
+ this->quakeDuration = 40;
this->unk_216 = 200;
}
@@ -714,8 +715,8 @@ s32 func_80998F9C(EnGs* this, PlayState* play) {
this->unk_1F0 = 0.0f;
this->unk_1EC = 0.5f;
Actor_PlaySfx(&this->actor, NA_SE_EN_STALKID_ATTACK);
- this->unk_21C = 20;
- this->unk_21E = 2;
+ this->quakeY = 20;
+ this->quakeDuration = 2;
this->unk_19D = 6;
}
}
@@ -800,8 +801,8 @@ s32 func_809995A4(EnGs* this, PlayState* play) {
if (this->unk_1D4 <= 0) {
this->unk_19A &= ~4;
- this->unk_21C = 3;
- this->unk_21E = 40;
+ this->quakeY = 3;
+ this->quakeDuration = 40;
this->unk_1D4 = 0;
this->unk_19D++;
}
@@ -834,8 +835,8 @@ s32 func_809995A4(EnGs* this, PlayState* play) {
this->unk_1DC = 0.0f;
this->unk_19D++;
- this->unk_21C = 5;
- this->unk_21E = 20;
+ this->quakeY = 5;
+ this->quakeDuration = 20;
this->unk_19A |= 1;
this->unk_216 = 200;
this->unk_1E0 = (this->unk_197 >> 2) * 0x444;
@@ -871,7 +872,7 @@ s32 func_809995A4(EnGs* this, PlayState* play) {
if (this->actor.playerHeightRel < -12000.0f) {
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_BOM, this->actor.world.pos.x, this->actor.world.pos.y,
- this->actor.world.pos.z, 0, this->actor.world.rot.y, 0, 0);
+ this->actor.world.pos.z, BOMB_EXPLOSIVE_TYPE_BOMB, this->actor.world.rot.y, 0, BOMB_TYPE_BODY);
Actor_Kill(&this->actor);
sp7C = 0;
}
@@ -1028,8 +1029,8 @@ void EnGs_Update(Actor* thisx, PlayState* play) {
if ((this->actor.xyzDistToPlayerSq > SQ(400.0f)) || (sp2E < 0) || (sp2E > SCREEN_WIDTH) || (sp2C < 0) ||
(sp2C > SCREEN_HEIGHT)) {
this->unk_216 = 0;
- } else if (this->unk_21C > 0) {
- func_800BC848(&this->actor, play, this->unk_21C, this->unk_21E);
+ } else if (this->quakeY > 0) {
+ Actor_RequestQuakeAndRumble(&this->actor, play, this->quakeY, this->quakeDuration);
}
} else {
this->unk_216 = 0;
@@ -1048,8 +1049,8 @@ void EnGs_Update(Actor* thisx, PlayState* play) {
}
}
- if (this->unk_21C > 0) {
- this->unk_21C = 0;
+ if (this->quakeY > 0) {
+ this->quakeY = 0;
}
func_80999B34(this);
@@ -1069,7 +1070,7 @@ void EnGs_Draw(Actor* thisx, PlayState* play) {
frames = play->gameplayFrames;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
Matrix_Push();
if (this->unk_19A & 1) {
@@ -1091,7 +1092,7 @@ void EnGs_Draw(Actor* thisx, PlayState* play) {
Matrix_Pop();
if (this->unk_19A & 2) {
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
Matrix_ReplaceRotation(&play->billboardMtxF);
Matrix_Scale(0.05f, -0.05f, 1.0f, MTXMODE_APPLY);
diff --git a/src/overlays/actors/ovl_En_Gs/z_en_gs.h b/src/overlays/actors/ovl_En_Gs/z_en_gs.h
index fb2d62816..abb4a5b86 100644
--- a/src/overlays/actors/ovl_En_Gs/z_en_gs.h
+++ b/src/overlays/actors/ovl_En_Gs/z_en_gs.h
@@ -53,8 +53,8 @@ typedef struct EnGs {
/* 0x216 */ s16 unk_216;
/* 0x218 */ s16 unk_218;
/* 0x21A */ s16 unk_21A;
- /* 0x21C */ s16 unk_21C;
- /* 0x21E */ s16 unk_21E;
+ /* 0x21C */ s16 quakeY;
+ /* 0x21E */ s16 quakeDuration;
} EnGs; // size = 0x220
#endif // Z_EN_GS_H
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 f5925f524..d27dd5a59 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
@@ -370,7 +370,7 @@ void EnGuardNuts_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sEyeTextures[this->eyeState]));
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 a6f5f98b3..78a2aa4d1 100644
--- a/src/overlays/actors/ovl_En_Guruguru/z_en_guruguru.c
+++ b/src/overlays/actors/ovl_En_Guruguru/z_en_guruguru.c
@@ -385,11 +385,13 @@ void EnGuruguru_Draw(Actor* thisx, PlayState* play) {
EnGuruguru* this = THIS;
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, SEGMENTED_TO_VIRTUAL(sEyeTextures[this->texIndex]));
gSPSegment(POLY_OPA_DISP++, 0x09, SEGMENTED_TO_VIRTUAL(sMouthTextures[this->texIndex]));
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnGuruguru_OverrideLimbDraw, NULL, &this->actor);
+
CLOSE_DISPS(play->state.gfxCtx);
}
diff --git a/src/overlays/actors/ovl_En_Hakurock/z_en_hakurock.c b/src/overlays/actors/ovl_En_Hakurock/z_en_hakurock.c
index 44e42d01a..bcc5882a2 100644
--- a/src/overlays/actors/ovl_En_Hakurock/z_en_hakurock.c
+++ b/src/overlays/actors/ovl_En_Hakurock/z_en_hakurock.c
@@ -279,8 +279,8 @@ void func_80B22500(EnHakurock* this, PlayState* play) {
} else if ((&player->actor == this->collider.base.oc) &&
(player->stateFlags3 & (PLAYER_STATE3_1000 | PLAYER_STATE3_80000)) &&
(player->linearVelocity > 8.0f)) {
- player->unk_B08[0] = player->linearVelocity = -5.0f;
- player->unk_B08[1] += (player->linearVelocity * 0.05f);
+ player->unk_B08 = player->linearVelocity = -5.0f;
+ player->unk_B0C += (player->linearVelocity * 0.05f);
player->actor.velocity.y = 5.0f;
player->currentYaw = player->actor.world.rot.y;
player->actor.home.rot.y = player->actor.world.rot.y;
@@ -342,19 +342,23 @@ void EnHakurock_Update(Actor* thisx, PlayState* play) {
void func_80B228F4(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0x80, 255, 185, 24, 255);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, gameplay_keep_DL_06AB30);
+
CLOSE_DISPS(play->state.gfxCtx);
}
void EnHakurock_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
Matrix_Translate(-100.0f, 0.0f, 0.0f, MTXMODE_APPLY);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, gGohtStalactiteMaterialDL);
gSPDisplayList(POLY_OPA_DISP++, gGohtStalactiteModelDL);
+
CLOSE_DISPS(play->state.gfxCtx);
}
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 c54703ef9..ce60a0187 100644
--- a/src/overlays/actors/ovl_En_Hanabi/z_en_hanabi.c
+++ b/src/overlays/actors/ovl_En_Hanabi/z_en_hanabi.c
@@ -141,9 +141,9 @@ void func_80B22FA8(EnHanabiStruct* arg0, PlayState* play2) {
OPEN_DISPS(gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
- POLY_XLU_DISP = Gfx_CallSetupDL(POLY_XLU_DISP, 20);
+ POLY_XLU_DISP = Gfx_SetupDL(POLY_XLU_DISP, SETUPDL_20);
gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(gSun1Tex));
gSPDisplayList(POLY_XLU_DISP++, gSunSparkleMaterialDL);
diff --git a/src/overlays/actors/ovl_En_Hata/z_en_hata.c b/src/overlays/actors/ovl_En_Hata/z_en_hata.c
index 4a01b663e..e5b806b90 100644
--- a/src/overlays/actors/ovl_En_Hata/z_en_hata.c
+++ b/src/overlays/actors/ovl_En_Hata/z_en_hata.c
@@ -94,7 +94,7 @@ s32 EnHata_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f*
void EnHata_Draw(Actor* thisx, PlayState* play) {
EnHata* this = THIS;
- func_8012C5B0(play->state.gfxCtx);
+ Gfx_SetupDL37_Opa(play->state.gfxCtx);
SkelAnime_DrawOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, EnHata_OverrideLimbDraw, NULL,
&this->dyna.actor);
}
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 5fa9f5ea2..a335e39d2 100644
--- a/src/overlays/actors/ovl_En_Heishi/z_en_heishi.c
+++ b/src/overlays/actors/ovl_En_Heishi/z_en_heishi.c
@@ -186,7 +186,7 @@ s32 EnHeishi_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f
void EnHeishi_Draw(Actor* thisx, PlayState* play) {
EnHeishi* this = THIS;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnHeishi_OverrideLimbDraw, NULL, &this->actor);
}
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 34e1d1e15..0992aa9d9 100644
--- a/src/overlays/actors/ovl_En_Hg/z_en_hg.c
+++ b/src/overlays/actors/ovl_En_Hg/z_en_hg.c
@@ -448,11 +448,13 @@ void EnHg_Draw(Actor* thisx, PlayState* play) {
EnHg* this = THIS;
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnHg_OverrideLimbDraw, EnHg_PostLimbDraw, &this->actor);
Matrix_Put(&this->mf);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, gPamelasFatherGibdoEyebrowsDL);
+
CLOSE_DISPS(play->state.gfxCtx);
}
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 bbef58b1a..37d5a61f9 100644
--- a/src/overlays/actors/ovl_En_Hgo/z_en_hgo.c
+++ b/src/overlays/actors/ovl_En_Hgo/z_en_hgo.c
@@ -416,12 +416,14 @@ void EnHgo_Draw(Actor* thisx, PlayState* play) {
EnHgo* this = THIS;
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sEyeTextures[this->eyeIndex]));
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnHgo_OverrideLimbDraw, &EnHgo_PostLimbDraw, &this->actor);
Matrix_Put(&this->mf);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, gPamelasFatherHumanEyebrowsDL);
+
CLOSE_DISPS(play->state.gfxCtx);
}
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 29a7c6a8e..630ae405f 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
@@ -435,6 +435,6 @@ void EnHiddenNuts_Update(Actor* thisx, PlayState* play) {
void EnHiddenNuts_Draw(Actor* thisx, PlayState* play) {
EnHiddenNuts* this = THIS;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, NULL, NULL, &this->actor);
}
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 09a110dbf..7c01fa788 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
@@ -905,7 +905,7 @@ void EnHintSkb_Draw(Actor* thisx, PlayState* play) {
EnHintSkb* this = THIS;
this->limbCount = 0;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, EnHintSkb_OverrideLimbDraw,
EnHintSkb_PostLimbDraw, &this->actor);
if (this->drawDmgEffTimer > 0) {
diff --git a/src/overlays/actors/ovl_En_Holl/z_en_holl.c b/src/overlays/actors/ovl_En_Holl/z_en_holl.c
index 096b92fdd..9b196c2fc 100644
--- a/src/overlays/actors/ovl_En_Holl/z_en_holl.c
+++ b/src/overlays/actors/ovl_En_Holl/z_en_holl.c
@@ -319,30 +319,32 @@ void EnHoll_Update(Actor* thisx, PlayState* play) {
void EnHoll_Draw(Actor* thisx, PlayState* play) {
EnHoll* this = THIS;
- Gfx* dl;
- u32 dlIndex;
+ Gfx* dList;
+ u32 setupDListIndex;
if (this->alpha != 0) {
OPEN_DISPS(play->state.gfxCtx);
+
if (this->alpha == 255) {
- dl = POLY_OPA_DISP;
- dlIndex = 37;
+ dList = POLY_OPA_DISP;
+ setupDListIndex = SETUPDL_37;
} else {
- dl = POLY_XLU_DISP;
- dlIndex = 0;
+ dList = POLY_XLU_DISP;
+ setupDListIndex = SETUPDL_0;
}
- dl = Gfx_CallSetupDL(dl, dlIndex);
+ dList = Gfx_SetupDL(dList, setupDListIndex);
if (this->playerSide == EN_HOLL_BEHIND) {
Matrix_RotateYF(M_PI, MTXMODE_APPLY);
}
- gSPMatrix(dl++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gDPSetPrimColor(dl++, 0, 0, 0, 0, 0, this->alpha);
- gSPDisplayList(dl++, gEnHollCentralPlaneDL);
+ gSPMatrix(dList++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gDPSetPrimColor(dList++, 0, 0, 0, 0, 0, this->alpha);
+ gSPDisplayList(dList++, gEnHollCentralPlaneDL);
if (this->alpha == 255) {
- POLY_OPA_DISP = dl;
+ POLY_OPA_DISP = dList;
} else {
- POLY_XLU_DISP = dl;
+ POLY_XLU_DISP = dList;
}
+
CLOSE_DISPS(play->state.gfxCtx);
}
}
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 44c53d744..e4d37016a 100644
--- a/src/overlays/actors/ovl_En_Horse/z_en_horse.c
+++ b/src/overlays/actors/ovl_En_Horse/z_en_horse.c
@@ -108,18 +108,6 @@ typedef struct {
RaceWaypoint* waypoints;
} RaceInfo;
-typedef enum {
- /* 0 */ ENHORSE_ANIM_IDLE,
- /* 1 */ ENHORSE_ANIM_WHINNY,
- /* 2 */ ENHORSE_ANIM_STOPPING,
- /* 3 */ ENHORSE_ANIM_REARING,
- /* 4 */ ENHORSE_ANIM_WALK,
- /* 5 */ ENHORSE_ANIM_TROT,
- /* 6 */ ENHORSE_ANIM_GALLOP,
- /* 7 */ ENHORSE_ANIM_LOW_JUMP,
- /* 8 */ ENHORSE_ANIM_HIGH_JUMP
-} EnHorseAnimation;
-
static AnimationHeader* sEponaAnimations[] = {
&object_horse_link_child_Anim_006D44, &object_horse_link_child_Anim_007468, &object_horse_link_child_Anim_005F64,
&object_horse_link_child_Anim_004DE8, &object_horse_link_child_Anim_007D50, &object_horse_link_child_Anim_0043AC,
@@ -792,7 +780,8 @@ void EnHorse_Init(Actor* thisx, PlayState* play2) {
this->stateFlags = 0;
}
- if (((play->sceneId == SCENE_KOEPONARACE) && (GET_WEEKEVENTREG_RACE_FLAGS == WEEKEVENTREG_RACE_FLAG_START)) ||
+ if (((play->sceneId == SCENE_KOEPONARACE) &&
+ (GET_WEEKEVENTREG_HORSE_RACE_STATE == WEEKEVENTREG_HORSE_RACE_STATE_START)) ||
((gSaveContext.save.entrance == ENTRANCE(ROMANI_RANCH, 0)) && (Cutscene_GetSceneLayer(play) != 0))) {
this->stateFlags |= ENHORSE_FLAG_25;
}
@@ -2471,7 +2460,7 @@ void func_808819D8(EnHorse* this, PlayState* play) {
func_8088168C(this);
}
- if (GET_WEEKEVENTREG_RACE_FLAGS == WEEKEVENTREG_RACE_FLAG_3) {
+ if (GET_WEEKEVENTREG_HORSE_RACE_STATE == WEEKEVENTREG_HORSE_RACE_STATE_3) {
this->rider->unk488 = 7;
} else {
EnHorse_SetIngoAnimation(this->animIndex, this->skin.skelAnime.curFrame, this->unk_394 & 1,
@@ -4682,7 +4671,7 @@ void EnHorse_Draw(Actor* thisx, PlayState* play) {
EnHorse* this = THIS;
if (!(this->stateFlags & ENHORSE_INACTIVE) && (this->actor.update != func_8087D540)) {
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
this->stateFlags |= ENHORSE_DRAW;
if (!(this->unk_1EC & 1)) {
if (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 b2c58bcad..9f8cd2063 100644
--- a/src/overlays/actors/ovl_En_Horse/z_en_horse.h
+++ b/src/overlays/actors/ovl_En_Horse/z_en_horse.h
@@ -75,7 +75,7 @@ typedef enum EnHorseAction {
/* 25 */ ENHORSE_ACTION_25
} EnHorseAction;
-typedef enum {
+typedef enum EnHorsePlayerDir {
/* 0 */ PLAYER_DIR_FRONT_R,
/* 1 */ PLAYER_DIR_FRONT_L,
/* 2 */ PLAYER_DIR_BACK_R,
@@ -84,7 +84,19 @@ typedef enum {
/* 5 */ PLAYER_DIR_SIDE_L
} EnHorsePlayerDir;
-typedef enum {
+typedef enum EnHorseAnimation {
+ /* 0 */ ENHORSE_ANIM_IDLE,
+ /* 1 */ ENHORSE_ANIM_WHINNY,
+ /* 2 */ ENHORSE_ANIM_STOPPING,
+ /* 3 */ ENHORSE_ANIM_REARING,
+ /* 4 */ ENHORSE_ANIM_WALK,
+ /* 5 */ ENHORSE_ANIM_TROT,
+ /* 6 */ ENHORSE_ANIM_GALLOP,
+ /* 7 */ ENHORSE_ANIM_LOW_JUMP,
+ /* 8 */ ENHORSE_ANIM_HIGH_JUMP
+} EnHorseAnimation;
+
+typedef enum HorseType {
/* 0 */ HORSE_TYPE_EPONA,
/* 1 */ HORSE_TYPE_HNI,
/* 2 */ HORSE_TYPE_2,
diff --git a/src/overlays/actors/ovl_En_Horse_Game_Check/z_en_horse_game_check.c b/src/overlays/actors/ovl_En_Horse_Game_Check/z_en_horse_game_check.c
index 5e7619cd2..d37fb8f23 100644
--- a/src/overlays/actors/ovl_En_Horse_Game_Check/z_en_horse_game_check.c
+++ b/src/overlays/actors/ovl_En_Horse_Game_Check/z_en_horse_game_check.c
@@ -59,7 +59,7 @@ s32 func_808F8AA0(EnHorseGameCheck* this, PlayState* play) {
DynaPolyActor_Init(&this->dyna, 0);
- if (GET_WEEKEVENTREG_RACE_FLAGS != WEEKEVENTREG_RACE_FLAG_START) {
+ if (GET_WEEKEVENTREG_HORSE_RACE_STATE != WEEKEVENTREG_HORSE_RACE_STATE_START) {
Actor_Kill(&this->dyna.actor);
return false;
}
@@ -116,7 +116,7 @@ s32 func_808F8CCC(EnHorseGameCheck* this, PlayState* play2) {
this->unk_168 = 0;
this->unk_174 = 0;
- if (GET_WEEKEVENTREG_RACE_FLAGS != WEEKEVENTREG_RACE_FLAG_START) {
+ if (GET_WEEKEVENTREG_HORSE_RACE_STATE != WEEKEVENTREG_HORSE_RACE_STATE_START) {
Actor_Kill(&this->dyna.actor);
return false;
}
@@ -156,14 +156,14 @@ s32 func_808F8EB0(EnHorseGameCheck* this, PlayState* play) {
return false;
}
- if (GET_WEEKEVENTREG_RACE_FLAGS == WEEKEVENTREG_RACE_FLAG_3) {
+ if (GET_WEEKEVENTREG_HORSE_RACE_STATE == WEEKEVENTREG_HORSE_RACE_STATE_3) {
play->transitionType = TRANS_TYPE_64;
gSaveContext.nextTransitionType = TRANS_TYPE_FADE_BLACK;
- } else if (GET_WEEKEVENTREG_RACE_FLAGS == WEEKEVENTREG_RACE_FLAG_2) {
+ } else if (GET_WEEKEVENTREG_HORSE_RACE_STATE == WEEKEVENTREG_HORSE_RACE_STATE_2) {
play->transitionType = TRANS_TYPE_80;
gSaveContext.nextTransitionType = TRANS_TYPE_FADE_WHITE;
- } else if (GET_WEEKEVENTREG_RACE_FLAGS == WEEKEVENTREG_RACE_FLAG_4) {
- SET_WEEKEVENTREG_RACE_FLAGS(WEEKEVENTREG_RACE_FLAG_3);
+ } else if (GET_WEEKEVENTREG_HORSE_RACE_STATE == WEEKEVENTREG_HORSE_RACE_STATE_4) {
+ SET_WEEKEVENTREG_HORSE_RACE_STATE(WEEKEVENTREG_HORSE_RACE_STATE_3);
play->transitionType = TRANS_TYPE_FADE_BLACK;
gSaveContext.nextTransitionType = TRANS_TYPE_FADE_BLACK;
}
@@ -252,7 +252,7 @@ s32 func_808F8FAC(EnHorseGameCheck* this, PlayState* play) {
play_sound(NA_SE_SY_START_SHOT);
this->unk_164 |= 0x40000;
gSaveContext.timerStates[TIMER_ID_MINIGAME_2] = TIMER_STATE_6;
- SET_WEEKEVENTREG_RACE_FLAGS(WEEKEVENTREG_RACE_FLAG_4);
+ SET_WEEKEVENTREG_HORSE_RACE_STATE(WEEKEVENTREG_HORSE_RACE_STATE_4);
this->unk_174 = 60;
}
@@ -285,7 +285,7 @@ s32 func_808F8FAC(EnHorseGameCheck* this, PlayState* play) {
play_sound(NA_SE_SY_START_SHOT);
this->unk_164 |= 0x40000;
gSaveContext.timerStates[TIMER_ID_MINIGAME_2] = TIMER_STATE_6;
- SET_WEEKEVENTREG_RACE_FLAGS(WEEKEVENTREG_RACE_FLAG_3);
+ SET_WEEKEVENTREG_HORSE_RACE_STATE(WEEKEVENTREG_HORSE_RACE_STATE_3);
this->unk_174 = 60;
}
@@ -318,7 +318,7 @@ s32 func_808F8FAC(EnHorseGameCheck* this, PlayState* play) {
play_sound(NA_SE_SY_START_SHOT);
this->unk_164 |= 0x02000000;
gSaveContext.timerStates[TIMER_ID_MINIGAME_2] = TIMER_STATE_6;
- SET_WEEKEVENTREG_RACE_FLAGS(WEEKEVENTREG_RACE_FLAG_3);
+ SET_WEEKEVENTREG_HORSE_RACE_STATE(WEEKEVENTREG_HORSE_RACE_STATE_3);
this->unk_174 = 60;
}
@@ -347,7 +347,7 @@ s32 func_808F8FAC(EnHorseGameCheck* this, PlayState* play) {
play_sound(NA_SE_SY_START_SHOT);
this->unk_164 |= 0x800;
gSaveContext.timerStates[TIMER_ID_MINIGAME_2] = TIMER_STATE_6;
- SET_WEEKEVENTREG_RACE_FLAGS(WEEKEVENTREG_RACE_FLAG_2);
+ SET_WEEKEVENTREG_HORSE_RACE_STATE(WEEKEVENTREG_HORSE_RACE_STATE_2);
this->unk_174 = 60;
}
return true;
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 8c77bb2a0..10d4a6826 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
@@ -593,7 +593,7 @@ s32 EnHorseLinkChild_OverrideSkinDraw(Actor* thisx, PlayState* play, s32 limbInd
void EnHorseLinkChild_Draw(Actor* thisx, PlayState* play) {
EnHorseLinkChild* this = THIS;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
func_80138258(&this->actor, play, &this->skin, EnHorseLinkChild_PostSkinDraw, EnHorseLinkChild_OverrideSkinDraw,
true);
}
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 4d535292f..5c06e292a 100644
--- a/src/overlays/actors/ovl_En_Hs/z_en_hs.c
+++ b/src/overlays/actors/ovl_En_Hs/z_en_hs.c
@@ -356,7 +356,7 @@ void EnHs_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
void EnHs_Draw(Actor* thisx, PlayState* play) {
EnHs* this = THIS;
- func_8012C5B0(play->state.gfxCtx);
+ Gfx_SetupDL37_Opa(play->state.gfxCtx);
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnHs_OverrideLimbDraw, EnHs_PostLimbDraw, &this->actor);
}
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 e053a8528..86d6309b6 100644
--- a/src/overlays/actors/ovl_En_Ig/z_en_ig.c
+++ b/src/overlays/actors/ovl_En_Ig/z_en_ig.c
@@ -556,7 +556,7 @@ s32 func_80BF1DF4(EnIg* this, PlayState* play, ScheduleOutput* scheduleOutput) {
this->timePath = SubS_GetAdditionalPath(play, sp55, D_80BF3318[scheduleOutput->result]);
}
- if ((door != NULL) && (door->dyna.actor.update != NULL)) {
+ if ((door != NULL) && (door->knobDoor.dyna.actor.update != NULL)) {
if (this->timePath != NULL) {
sp4C = Lib_SegmentedToVirtual(this->timePath->points);
Math_Vec3s_ToVec3f(&sp40, &sp4C[0]);
@@ -566,7 +566,7 @@ s32 func_80BF1DF4(EnIg* this, PlayState* play, ScheduleOutput* scheduleOutput) {
this->actor.world.rot.y = Math_Vec3f_Yaw(&sp40, &sp34);
Math_Vec3f_Copy(&this->actor.world.pos, &sp40);
- if (ABS_ALT(BINANG_SUB(this->actor.world.rot.y, door->dyna.actor.shape.rot.y)) <= 0x4000) {
+ if (ABS_ALT(BINANG_SUB(this->actor.world.rot.y, door->knobDoor.dyna.actor.shape.rot.y)) <= 0x4000) {
this->unk_2A4 = -75;
} else {
this->unk_2A4 = 75;
@@ -735,7 +735,7 @@ s32 func_80BF2470(EnIg* this, PlayState* play) {
s32 pad;
if (!SubS_InCsMode(play) && (this->timePathTimeSpeed != 0)) {
- if ((door != NULL) && (door->dyna.actor.update != NULL)) {
+ if ((door != NULL) && (door->knobDoor.dyna.actor.update != NULL)) {
if (((f32)this->unk_3E2 / this->unk_3E0) <= 0.9f) {
door->unk_1A7 = this->unk_2A4;
} else {
@@ -1036,7 +1036,7 @@ void EnIg_Draw(Actor* thisx, PlayState* play) {
EnIg* this = THIS;
if (this->scheduleResult != 0) {
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
OPEN_DISPS(play->state.gfxCtx);
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 fc7fafdcf..8cff778fd 100644
--- a/src/overlays/actors/ovl_En_Ik/z_en_ik.c
+++ b/src/overlays/actors/ovl_En_Ik/z_en_ik.c
@@ -1077,10 +1077,10 @@ void EnIk_Draw(Actor* thisx, PlayState* play) {
func_800B8050(&this->actor, play, 0);
func_800B8118(&this->actor, play, 0);
gfx = POLY_XLU_DISP;
- gSPDisplayList(&gfx[0], &sSetupDL[6 * 25]);
+ gSPDisplayList(&gfx[0], gSetupDLs[SETUPDL_25]);
POLY_XLU_DISP = &gfx[1];
gfx = POLY_OPA_DISP;
- gSPDisplayList(&gfx[0], &sSetupDL[6 * 25]);
+ gSPDisplayList(&gfx[0], gSetupDLs[SETUPDL_25]);
gfxArmorType = sIronKnuckleArmorType[this->actor.params];
gSPSegment(&gfx[1], 0x08, gfxArmorType[0]);
gSPSegment(&gfx[2], 0x09, gfxArmorType[1]);
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 8bedd48cf..0e103de63 100644
--- a/src/overlays/actors/ovl_En_In/z_en_in.c
+++ b/src/overlays/actors/ovl_En_In/z_en_in.c
@@ -336,7 +336,7 @@ void func_808F38F8(EnIn* this, PlayState* play) {
}
void func_808F395C(EnIn* this, PlayState* play) {
- if (this->unk4B0 == WEEKEVENTREG_RACE_FLAG_END) {
+ if (this->unk4B0 == WEEKEVENTREG_HORSE_RACE_STATE_END) {
this->actionFunc = func_808F5A94;
}
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
@@ -352,30 +352,30 @@ void func_808F39DC(EnIn* this, PlayState* play) {
u16 textId = 0;
if (gSaveContext.save.day != 3) {
- switch (GET_WEEKEVENTREG_RACE_FLAGS) {
- case WEEKEVENTREG_RACE_FLAG_2:
+ switch (GET_WEEKEVENTREG_HORSE_RACE_STATE) {
+ case WEEKEVENTREG_HORSE_RACE_STATE_2:
textId = 0x347A;
break;
- case WEEKEVENTREG_RACE_FLAG_3:
+ case WEEKEVENTREG_HORSE_RACE_STATE_3:
textId = 0x3476;
break;
}
- SET_WEEKEVENTREG_RACE_FLAGS(WEEKEVENTREG_RACE_FLAG_END);
+ SET_WEEKEVENTREG_HORSE_RACE_STATE(WEEKEVENTREG_HORSE_RACE_STATE_END);
} else {
- switch (GET_WEEKEVENTREG_RACE_FLAGS) {
- case WEEKEVENTREG_RACE_FLAG_2:
+ switch (GET_WEEKEVENTREG_HORSE_RACE_STATE) {
+ case WEEKEVENTREG_HORSE_RACE_STATE_2:
textId = 0x349D;
break;
- case WEEKEVENTREG_RACE_FLAG_3:
+ case WEEKEVENTREG_HORSE_RACE_STATE_3:
textId = 0x3499;
break;
}
- SET_WEEKEVENTREG_RACE_FLAGS(WEEKEVENTREG_RACE_FLAG_END);
+ SET_WEEKEVENTREG_HORSE_RACE_STATE(WEEKEVENTREG_HORSE_RACE_STATE_END);
}
this->actor.flags |= ACTOR_FLAG_10000;
this->actor.textId = textId;
this->actionFunc = func_808F395C;
- if (this->unk4B0 == WEEKEVENTREG_RACE_FLAG_2) {
+ if (this->unk4B0 == WEEKEVENTREG_HORSE_RACE_STATE_2) {
Actor_PlaySfx(&this->actor, NA_SE_VO_IN_LOST);
} else {
Actor_PlaySfx(&this->actor, NA_SE_VO_IN_JOY0);
@@ -635,7 +635,7 @@ s32 func_808F4270(PlayState* play, EnIn* this, s32 arg2, MessageContext* msgCtx,
s32 func_808F43E0(EnIn* this) {
this->unk48C = 0;
this->actor.textId = 0;
- SET_WEEKEVENTREG_RACE_FLAGS(WEEKEVENTREG_RACE_FLAG_END);
+ SET_WEEKEVENTREG_HORSE_RACE_STATE(WEEKEVENTREG_HORSE_RACE_STATE_END);
return 0;
}
@@ -817,7 +817,7 @@ s32 func_808F4414(PlayState* play, EnIn* this, s32 arg2) {
func_80151BB4(play, 0x11);
break;
case 0x3475:
- SET_WEEKEVENTREG_RACE_FLAGS(WEEKEVENTREG_RACE_FLAG_START);
+ SET_WEEKEVENTREG_HORSE_RACE_STATE(WEEKEVENTREG_HORSE_RACE_STATE_START);
func_800FD750(NA_BGM_HORSE);
play->nextEntrance = ENTRANCE(GORMAN_TRACK, 5);
play->transitionType = TRANS_TYPE_FADE_WHITE_FAST;
@@ -1064,7 +1064,7 @@ s32 func_808F4414(PlayState* play, EnIn* this, s32 arg2) {
ret = false;
break;
case 0x3475:
- SET_WEEKEVENTREG_RACE_FLAGS(WEEKEVENTREG_RACE_FLAG_START);
+ SET_WEEKEVENTREG_HORSE_RACE_STATE(WEEKEVENTREG_HORSE_RACE_STATE_START);
func_800FD750(NA_BGM_HORSE);
play->nextEntrance = ENTRANCE(GORMAN_TRACK, 5);
play->transitionType = TRANS_TYPE_FADE_WHITE_FAST;
@@ -1322,7 +1322,7 @@ void func_808F5B58(EnIn* this, PlayState* play) {
}
void func_808F5C98(EnIn* this, PlayState* play) {
- if (this->unk4B0 == WEEKEVENTREG_RACE_FLAG_END) {
+ 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)) ||
@@ -1334,7 +1334,7 @@ void func_808F5C98(EnIn* this, PlayState* play) {
}
}
if (this->unk4A8 == 2) {
- if (this->unk4B0 == WEEKEVENTREG_RACE_FLAG_2) {
+ if (this->unk4B0 == WEEKEVENTREG_HORSE_RACE_STATE_2) {
Actor_PlaySfx(&this->actor, NA_SE_VO_IN_LOST);
} else {
Actor_PlaySfx(&this->actor, NA_SE_VO_IN_JOY0);
@@ -1366,7 +1366,7 @@ void EnIn_Init(Actor* thisx, PlayState* play) {
this->unk48C = 0;
this->unk4AC = 0;
type = ENIN_GET_TYPE(thisx);
- this->unk4B0 = GET_WEEKEVENTREG_RACE_FLAGS;
+ this->unk4B0 = GET_WEEKEVENTREG_HORSE_RACE_STATE;
if (type == ENIN_HORSE_RIDER_BLUE_SHIRT || type == ENIN_BLUE_SHIRT) {
this->unk4AC |= 8;
}
@@ -1387,8 +1387,8 @@ void EnIn_Init(Actor* thisx, PlayState* play) {
this->path = SubS_GetPathByIndex(play, ENIN_GET_PATH(&this->actor), 0x3F);
this->unk23D = 0;
if (type == ENIN_YELLOW_SHIRT || type == ENIN_BLUE_SHIRT) {
- if ((GET_WEEKEVENTREG_RACE_FLAGS == WEEKEVENTREG_RACE_FLAG_2) ||
- (GET_WEEKEVENTREG_RACE_FLAGS == WEEKEVENTREG_RACE_FLAG_3)) {
+ if ((GET_WEEKEVENTREG_HORSE_RACE_STATE == WEEKEVENTREG_HORSE_RACE_STATE_2) ||
+ (GET_WEEKEVENTREG_HORSE_RACE_STATE == WEEKEVENTREG_HORSE_RACE_STATE_3)) {
CLEAR_WEEKEVENTREG(WEEKEVENTREG_56_08);
this->unk4A8 = 0;
this->unk4AC |= 2;
@@ -1396,12 +1396,12 @@ void EnIn_Init(Actor* thisx, PlayState* play) {
this->unk23C = 0;
D_801BDAA0 = 0;
- if (GET_WEEKEVENTREG_RACE_FLAGS == WEEKEVENTREG_RACE_FLAG_2) {
+ if (GET_WEEKEVENTREG_HORSE_RACE_STATE == WEEKEVENTREG_HORSE_RACE_STATE_2) {
EnIn_ChangeAnim(&this->skelAnime, ENIN_ANIM_6);
} else {
EnIn_ChangeAnim(&this->skelAnime, ENIN_ANIM_4);
}
- if (GET_WEEKEVENTREG_RACE_FLAGS == WEEKEVENTREG_RACE_FLAG_2) {
+ if (GET_WEEKEVENTREG_HORSE_RACE_STATE == WEEKEVENTREG_HORSE_RACE_STATE_2) {
this->skelAnime.curFrame = ((Rand_ZeroOne() * 0.6f) + 0.2f) * this->skelAnime.endFrame;
}
if (this->unk4AC & 8) {
@@ -1410,7 +1410,7 @@ void EnIn_Init(Actor* thisx, PlayState* play) {
this->actionFunc = func_808F5C98;
}
} else {
- if (GET_WEEKEVENTREG_RACE_FLAGS != WEEKEVENTREG_RACE_FLAG_START) {
+ if (GET_WEEKEVENTREG_HORSE_RACE_STATE != WEEKEVENTREG_HORSE_RACE_STATE_START) {
CLEAR_WEEKEVENTREG(WEEKEVENTREG_56_08);
this->unk23C = 0;
this->unk4AC |= 2;
@@ -1615,9 +1615,11 @@ void EnIn_Draw(Actor* thisx, PlayState* play) {
EnIn* this = THIS;
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gDPPipeSync(POLY_OPA_DISP++);
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnIn_OverrideLimbDraw, EnIn_PostLimbDraw, &this->actor);
+
CLOSE_DISPS(play->state.gfxCtx);
}
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 866f1d1b8..6a51e9486 100644
--- a/src/overlays/actors/ovl_En_Insect/z_en_insect.c
+++ b/src/overlays/actors/ovl_En_Insect/z_en_insect.c
@@ -506,7 +506,7 @@ void EnInsect_Update(Actor* thisx, PlayState* play) {
void EnInsect_Draw(Actor* thisx, PlayState* play) {
EnInsect* this = THIS;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, NULL, NULL, NULL);
D_8091BD60 = 0;
}
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 254c9ad67..202ed6637 100644
--- a/src/overlays/actors/ovl_En_Ishi/z_en_ishi.c
+++ b/src/overlays/actors/ovl_En_Ishi/z_en_ishi.c
@@ -597,11 +597,11 @@ void func_8095EBDC(EnIshi* this, PlayState* play) {
}
if (sp70 == 1) {
- s16 quakeIndex = Quake_Add(GET_ACTIVE_CAM(play), QUAKE_TYPE_3);
+ s16 quakeIndex = Quake_Request(GET_ACTIVE_CAM(play), QUAKE_TYPE_3);
Quake_SetSpeed(quakeIndex, 17232);
- Quake_SetQuakeValues(quakeIndex, 3, 0, 0, 0);
- Quake_SetCountdown(quakeIndex, 7);
+ Quake_SetPerturbations(quakeIndex, 3, 0, 0, 0);
+ Quake_SetDuration(quakeIndex, 7);
Rumble_Request(this->actor.xyzDistToPlayerSq, 255, 20, 150);
}
@@ -710,7 +710,7 @@ void func_8095F210(EnIshi* this, PlayState* play) {
if (this->actor.projectedPos.z < 1300.0f) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
sp28 = (1300.0f - this->actor.projectedPos.z) * 2.55f;
@@ -730,7 +730,7 @@ void func_8095F36C(EnIshi* this, PlayState* play) {
if ((this->actor.projectedPos.z <= 2150.0f) || ((this->unk_197 & 1) && (this->actor.projectedPos.z < 2250.0f))) {
this->actor.shape.shadowAlpha = 160;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, D_801AEFA0);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
@@ -741,7 +741,7 @@ void func_8095F36C(EnIshi* this, PlayState* play) {
this->actor.shape.shadowAlpha = sp20 * 0.627451f;
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPSegment(POLY_XLU_DISP++, 0x08, D_801AEF88);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
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 1c65efed8..fcbd26b2f 100644
--- a/src/overlays/actors/ovl_En_Ja/z_en_ja.c
+++ b/src/overlays/actors/ovl_En_Ja/z_en_ja.c
@@ -594,7 +594,7 @@ void EnJa_Draw(Actor* thisx, PlayState* play) {
if (this->unk_1D8.unk_00 != 0) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08,
Gfx_EnvColor(play->state.gfxCtx, D_80BC37AC[phi_t2].r, D_80BC37AC[phi_t2].g, D_80BC37AC[phi_t2].b,
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 05855bb20..314e94d1b 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
@@ -150,9 +150,11 @@ void EnJcMato_Draw(Actor* thisx, PlayState* play) {
EnJcMato* this = THIS;
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, gKoumeTargetDL);
Matrix_MultVec3f(&sOffset, &this->pos);
+
CLOSE_DISPS(play->state.gfxCtx);
}
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 5efca1bcd..25fe13064 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
@@ -284,7 +284,7 @@ void func_80C1410C(EnJgameTsn* this, PlayState* play) {
Player* player = GET_PLAYER(play);
player->stateFlags1 |= PLAYER_STATE1_20;
- Audio_PlaySubBgm(0x25);
+ Audio_PlaySubBgm(NA_BGM_TIMED_MINI_GAME);
play->interfaceCtx.minigameState = MINIGAME_STATE_COUNTDOWN_SETUP_3;
Interface_InitMinigame(play);
SET_WEEKEVENTREG(WEEKEVENTREG_90_20);
@@ -636,7 +636,7 @@ void EnJgameTsn_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C5B0(play->state.gfxCtx);
+ Gfx_SetupDL37_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(D_80C150A4[this->unk_21C]));
gSPSegment(POLY_OPA_DISP++, 0x09, Lib_SegmentedToVirtual(D_80C150A4[this->unk_21C]));
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 8f48622c8..abf5e9eb4 100644
--- a/src/overlays/actors/ovl_En_Js/z_en_js.c
+++ b/src/overlays/actors/ovl_En_Js/z_en_js.c
@@ -377,7 +377,7 @@ void EnJs_TakeMask(s32 itemActions, s32 childType) {
s32 temp = 0;
if ((childType >= 0) && (childType < 9)) {
- itemActions -= PLAYER_IA_MASK_TRUTH;
+ itemActions -= PLAYER_IA_MASK_MIN;
childType *= 3;
if (itemActions < 8) {
masksGivenOnMoon[childType] |= 1 << itemActions;
@@ -543,7 +543,7 @@ void func_80969748(EnJs* this, PlayState* play) {
}
if (itemAction > PLAYER_IA_NONE) {
Message_CloseTextbox(play);
- if ((itemAction >= PLAYER_IA_MASK_TRUTH) && (itemAction <= PLAYER_IA_MASK_GIANT)) {
+ if ((itemAction >= PLAYER_IA_MASK_MIN) && (itemAction < PLAYER_IA_MASK_TRANSFORMATION_MIN)) {
EnJs_TakeMask(itemAction, ENJS_GET_TYPE(&this->actor));
Inventory_UnequipItem(itemAction - 4);
if (!func_809692A8(ENJS_GET_TYPE(&this->actor))) {
@@ -551,7 +551,7 @@ void func_80969748(EnJs* this, PlayState* play) {
} else {
player->actor.textId = 0x2213;
}
- } else if ((itemAction >= PLAYER_IA_MASK_FIERCE_DEITY) && (itemAction <= PLAYER_IA_MASK_DEKU)) {
+ } else if ((itemAction >= PLAYER_IA_MASK_TRANSFORMATION_MIN) && (itemAction <= PLAYER_IA_MASK_MAX)) {
player->actor.textId = 0x2211;
} else {
player->actor.textId = 0x2210;
@@ -692,7 +692,7 @@ void func_80969C54(EnJs* this, PlayState* play) {
if (itemAction > PLAYER_IA_NONE) {
Message_CloseTextbox(play);
- if ((itemAction >= PLAYER_IA_MASK_TRUTH) && (itemAction <= PLAYER_IA_MASK_GIANT)) {
+ if ((itemAction >= PLAYER_IA_MASK_MIN) && (itemAction < PLAYER_IA_MASK_TRANSFORMATION_MIN)) {
EnJs_TakeMask(itemAction, ENJS_GET_TYPE(&this->actor));
Inventory_UnequipItem(itemAction - 4);
if (!func_809692A8(ENJS_GET_TYPE(&this->actor))) {
@@ -700,7 +700,7 @@ void func_80969C54(EnJs* this, PlayState* play) {
} else {
player->actor.textId = 0x2222;
}
- } else if ((itemAction >= PLAYER_IA_MASK_FIERCE_DEITY) && (itemAction <= PLAYER_IA_MASK_DEKU)) {
+ } else if ((itemAction >= PLAYER_IA_MASK_TRANSFORMATION_MIN) && (itemAction <= PLAYER_IA_MASK_MAX)) {
player->actor.textId = 0x2220;
} else {
player->actor.textId = 0x221D;
@@ -1058,7 +1058,7 @@ void func_8096A9F4(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Acto
void EnJs_Draw(Actor* thisx, PlayState* play) {
EnJs* this = THIS;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount, NULL,
func_8096A9F4, &this->actor);
}
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 7d8f46f91..07e4990bf 100644
--- a/src/overlays/actors/ovl_En_Kaizoku/z_en_kaizoku.c
+++ b/src/overlays/actors/ovl_En_Kaizoku/z_en_kaizoku.c
@@ -902,7 +902,8 @@ void func_80B872F4(EnKaizoku* this, PlayState* play) {
if ((this->lookTimer == 0) && !func_80B85858(this, play) && !func_80B85A00(this, play, false)) {
s16 yawDiff = this->picto.actor.yawTowardsPlayer - this->picto.actor.shape.rot.y;
- if ((this->picto.actor.xzDistToPlayer < 100.0f) && (player->meleeWeaponState != 0) && (yawDiff >= 0x1F40)) {
+ if ((this->picto.actor.xzDistToPlayer < 100.0f) && (player->meleeWeaponState != PLAYER_MELEE_WEAPON_STATE_0) &&
+ (yawDiff >= 0x1F40)) {
this->picto.actor.shape.rot.y = this->picto.actor.world.rot.y = this->picto.actor.yawTowardsPlayer;
func_80B88CD8(this);
} else if (Actor_IsFacingPlayer(&this->picto.actor, 0xBB8)) {
@@ -1285,7 +1286,8 @@ void func_80B88378(EnKaizoku* this, PlayState* play) {
this->skelAnime.playSpeed = 1.0f;
sp2A = ABS_ALT(player->actor.shape.rot.y - this->picto.actor.shape.rot.y);
- if (this->picto.actor.xzDistToPlayer < 150.0f && player->meleeWeaponState != 0 && sp2A >= 0x2000) {
+ if ((this->picto.actor.xzDistToPlayer < 150.0f) && (player->meleeWeaponState != PLAYER_MELEE_WEAPON_STATE_0) &&
+ (sp2A >= 0x2000)) {
this->picto.actor.shape.rot.y = this->picto.actor.world.rot.y = this->picto.actor.yawTowardsPlayer;
if (Rand_ZeroOne() > 0.7f) {
func_80B88CD8(this);
@@ -1938,8 +1940,8 @@ void func_80B89A08(EnKaizoku* this, PlayState* play) {
pos.z = this->bodyCollider.info.bumper.hitPos.z;
if (player->transformation != PLAYER_FORM_HUMAN) {
- player->unk_B84 = this->picto.actor.yawTowardsPlayer;
- player->unk_B80 = 15.0f;
+ player->pushedYaw = this->picto.actor.yawTowardsPlayer;
+ player->pushedSpeed = 15.0f;
}
this->bodyCollider.base.acFlags &= ~AC_HIT;
@@ -2132,8 +2134,8 @@ void EnKaizoku_Draw(Actor* thisx, PlayState* play) {
f32 drawDmgEffAlpha;
EnKaizoku* this = THIS;
- func_8012C2DC(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
OPEN_DISPS(play->state.gfxCtx);
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 19fd2c19f..7d54f3ed3 100644
--- a/src/overlays/actors/ovl_En_Kakasi/z_en_kakasi.c
+++ b/src/overlays/actors/ovl_En_Kakasi/z_en_kakasi.c
@@ -609,7 +609,7 @@ void EnKakasi_TeachingSong(EnKakasi* this, PlayState* play) {
this->subCamEyeNext.z = D_80971DCC[this->unk190].z;
Math_Vec3f_Copy(&tempVec, &this->subCamEyeNext);
- OLib_DbCameraVec3fSum(&this->picto.actor.home, &tempVec, &this->subCamEyeNext, 1);
+ OLib_Vec3fAdd(&this->picto.actor.home, &tempVec, &this->subCamEyeNext, OLIB_ADD_OFFSET);
Math_Vec3f_Copy(&this->subCamAtNext, &this->unk22C);
Math_Vec3f_Copy(&this->subCamEye, &this->subCamEyeNext);
Math_Vec3f_Copy(&this->subCamAt, &this->subCamAtNext);
@@ -722,7 +722,7 @@ void EnKakasi_PostSongLearnDialogue(EnKakasi* this, PlayState* play) {
this->subCamEyeNext.y = D_80971FA0[this->unk190].y;
this->subCamEyeNext.z = D_80971FA0[this->unk190].z;
Math_Vec3f_Copy(&vec3fCopy, &this->subCamEyeNext);
- OLib_DbCameraVec3fSum(&this->picto.actor.home, &vec3fCopy, &this->subCamEyeNext, 1);
+ OLib_Vec3fAdd(&this->picto.actor.home, &vec3fCopy, &this->subCamEyeNext, OLIB_ADD_OFFSET);
this->subCamAtNext.x = D_80971FE8[this->unk190].x + this->unk22C.x;
this->subCamAtNext.y = D_80971FE8[this->unk190].y + this->unk22C.y;
this->subCamAtNext.z = D_80971FE8[this->unk190].z + this->unk22C.z;
@@ -831,7 +831,7 @@ void EnKakasi_DancingNightAway(EnKakasi* this, PlayState* play) {
this->subCamEyeNext.y = D_80971E38[this->unk190].y;
this->subCamEyeNext.z = D_80971E38[this->unk190].z;
Math_Vec3f_Copy(&localVec3f, &this->subCamEyeNext);
- OLib_DbCameraVec3fSum(&this->picto.actor.home, &localVec3f, &this->subCamEyeNext, 1);
+ OLib_Vec3fAdd(&this->picto.actor.home, &localVec3f, &this->subCamEyeNext, OLIB_ADD_OFFSET);
if (1) {}
this->subCamAtNext.x = D_80971EEC[this->unk190].x + this->unk22C.x;
@@ -978,7 +978,7 @@ void EnKakasi_DiggingAway(EnKakasi* this, PlayState* play) {
this->subCamEyeNext.z = D_80972030.z;
Math_Vec3f_Copy(&tempunk238, &this->subCamEyeNext);
- OLib_DbCameraVec3fSum(&this->picto.actor.home, &tempunk238, &this->subCamEyeNext, 1);
+ OLib_Vec3fAdd(&this->picto.actor.home, &tempunk238, &this->subCamEyeNext, OLIB_ADD_OFFSET);
this->subCamAtNext.x = ((f32)D_8097203C.x) + this->unk22C.x; // cast req
this->subCamAtNext.y = ((f32)D_8097203C.y) + this->unk22C.y;
this->subCamAtNext.z = ((f32)D_8097203C.z) + this->unk22C.z;
@@ -1122,7 +1122,7 @@ void EnKakasi_Update(Actor* thisx, PlayState* play) {
if (this->unk1BC.x != 0.0f || this->unk1BC.z != 0.0f) {
Math_Vec3f_Copy(&this->picto.actor.focus.pos, &this->unk1BC);
this->picto.actor.focus.pos.y += 10.0f;
- if (this->subCamId == CAM_ID_MAIN) {
+ if (this->subCamId == SUB_CAM_ID_DONE) {
Math_Vec3s_Copy(&this->picto.actor.focus.rot, &this->picto.actor.world.rot);
} else {
Math_Vec3s_Copy(&this->picto.actor.focus.rot, &this->picto.actor.home.rot);
@@ -1153,7 +1153,7 @@ void EnKakasi_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* r
void EnKakasi_Draw(Actor* thisx, PlayState* play) {
EnKakasi* this = THIS;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawFlexOpa(play, this->skelanime.skeleton, this->skelanime.jointTable, this->skelanime.dListCount, NULL,
EnKakasi_PostLimbDraw, &this->picto.actor);
}
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 9777c7433..d9d5ef7d8 100644
--- a/src/overlays/actors/ovl_En_Kame/z_en_kame.c
+++ b/src/overlays/actors/ovl_En_Kame/z_en_kame.c
@@ -805,7 +805,7 @@ void EnKame_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, D_80AD8E34[this->unk_29C]);
@@ -840,7 +840,7 @@ s32 Enkame_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f*
void func_80AD8D64(Actor* thisx, PlayState* play) {
EnKame* this = THIS;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawFlexOpa(play, this->skelAnime2.skeleton, this->skelAnime2.jointTable, this->skelAnime2.dListCount,
Enkame_OverrideLimbDraw, NULL, &this->actor);
}
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 c4ef32e31..804854f53 100644
--- a/src/overlays/actors/ovl_En_Kanban/z_en_kanban.c
+++ b/src/overlays/actors/ovl_En_Kanban/z_en_kanban.c
@@ -923,8 +923,8 @@ void EnKanban_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPDisplayList(POLY_OPA_DISP++, object_kanban_DL_000C30);
diff --git a/src/overlays/actors/ovl_En_Karebaba/z_en_karebaba.c b/src/overlays/actors/ovl_En_Karebaba/z_en_karebaba.c
index 0c0078fd3..66aa6d5c7 100644
--- a/src/overlays/actors/ovl_En_Karebaba/z_en_karebaba.c
+++ b/src/overlays/actors/ovl_En_Karebaba/z_en_karebaba.c
@@ -634,7 +634,7 @@ void EnKarebaba_DrawShadow(EnKarebaba* this, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C448(play->state.gfxCtx);
+ Gfx_SetupDL44_Xlu(play->state.gfxCtx);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 0, 0, 0, 255);
@@ -658,7 +658,7 @@ void EnKarebaba_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
Math_Vec3f_Copy(this->bodyPartsPos, &this->actor.world.pos);
if (this->actionFunc == EnKarebaba_DeadItemDrop) {
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 b3b8ca295..cfd27fbb0 100644
--- a/src/overlays/actors/ovl_En_Kbt/z_en_kbt.c
+++ b/src/overlays/actors/ovl_En_Kbt/z_en_kbt.c
@@ -557,7 +557,7 @@ void EnKbt_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gfx = POLY_OPA_DISP;
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 c72aa9f5f..ea7faef57 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
@@ -359,8 +359,8 @@ s32 func_80B26BF8(EnKendoJs* this, PlayState* play) {
return 0;
}
- if ((player->meleeWeaponState != 0) || (player->stateFlags3 & PLAYER_STATE3_8000000) ||
- (player->stateFlags2 & PLAYER_STATE2_80000)) {
+ if ((player->meleeWeaponState != PLAYER_MELEE_WEAPON_STATE_0) ||
+ (player->stateFlags3 & PLAYER_STATE3_8000000) || (player->stateFlags2 & PLAYER_STATE2_80000)) {
return 1;
}
break;
@@ -370,7 +370,8 @@ s32 func_80B26BF8(EnKendoJs* this, PlayState* play) {
return 0;
}
- if ((player->meleeWeaponState != 0) || (player->stateFlags2 & PLAYER_STATE2_80000)) {
+ if ((player->meleeWeaponState != PLAYER_MELEE_WEAPON_STATE_0) ||
+ (player->stateFlags2 & PLAYER_STATE2_80000)) {
return 1;
}
break;
@@ -380,8 +381,8 @@ s32 func_80B26BF8(EnKendoJs* this, PlayState* play) {
return 0;
}
- if ((player->meleeWeaponState != 0) || (player->stateFlags3 & PLAYER_STATE3_8000000) ||
- (player->stateFlags2 & PLAYER_STATE2_80000)) {
+ if ((player->meleeWeaponState != PLAYER_MELEE_WEAPON_STATE_0) ||
+ (player->stateFlags3 & PLAYER_STATE3_8000000) || (player->stateFlags2 & PLAYER_STATE2_80000)) {
return 1;
}
this->unk_28E = 0;
@@ -681,8 +682,8 @@ void func_80B27774(EnKendoJs* this, PlayState* play) {
void func_80B2783C(EnKendoJs* this, PlayState* play) {
if (this->actor.csId != CS_ID_NONE) {
- Camera_ChangeDataIdx(play->cameraPtrs[CAM_ID_MAIN],
- CutsceneManager_GetCutsceneEntry(this->actor.csId)->csCamId);
+ Camera_ChangeActorCsCamIndex(play->cameraPtrs[CAM_ID_MAIN],
+ CutsceneManager_GetCutsceneEntry(this->actor.csId)->csCamId);
}
}
@@ -774,7 +775,7 @@ void EnKendoJs_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s*
void EnKendoJs_Draw(Actor* thisx, PlayState* play) {
EnKendoJs* this = THIS;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnKendoJs_OverrideLimbDraw, EnKendoJs_PostLimbDraw, &this->actor);
}
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 f30f55a33..dd26ba172 100644
--- a/src/overlays/actors/ovl_En_Kgy/z_en_kgy.c
+++ b/src/overlays/actors/ovl_En_Kgy/z_en_kgy.c
@@ -1134,7 +1134,7 @@ void func_80B43074(EnKgy* this, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
func_800B8050(&this->actor, play, 0);
Matrix_Push();
Matrix_Translate(-800.0f, 3100.0f, 8400.0f, MTXMODE_APPLY);
@@ -1166,7 +1166,7 @@ void func_80B43074(EnKgy* this, PlayState* play) {
void EnKgy_Draw(Actor* thisx, PlayState* play) {
EnKgy* this = THIS;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
if (this->unk_29C & 1) {
func_80B43074(this, play);
}
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 f3005ca05..77c7e1dc9 100644
--- a/src/overlays/actors/ovl_En_Kujiya/z_en_kujiya.c
+++ b/src/overlays/actors/ovl_En_Kujiya/z_en_kujiya.c
@@ -359,7 +359,7 @@ void EnKujiya_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, gLotteryShopCylinderDL);
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 2af87ea90..147ca2401 100644
--- a/src/overlays/actors/ovl_En_Kusa/z_en_kusa.c
+++ b/src/overlays/actors/ovl_En_Kusa/z_en_kusa.c
@@ -715,7 +715,7 @@ void EnKusa_DrawBush(Actor* thisx, PlayState* play2) {
OPEN_DISPS(play->state.gfxCtx);
alpha = (1300.0f - this->actor.projectedPos.z) * 2.55f;
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 255, alpha);
diff --git a/src/overlays/actors/ovl_En_Kusa2/z_en_kusa2.c b/src/overlays/actors/ovl_En_Kusa2/z_en_kusa2.c
index 8e2d194a6..f400d157f 100644
--- a/src/overlays/actors/ovl_En_Kusa2/z_en_kusa2.c
+++ b/src/overlays/actors/ovl_En_Kusa2/z_en_kusa2.c
@@ -1323,7 +1323,7 @@ void func_80A5E6F0(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
for (i = 0; i < ARRAY_COUNT(D_80A5F1C0.unk_0480); i++) {
EnKusa2UnkBssSubStruct2* s = &D_80A5F1C0.unk_0480[i];
@@ -1343,7 +1343,7 @@ void func_80A5E6F0(Actor* thisx, PlayState* play) {
void func_80A5E80C(PlayState* play, s32 arg1) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 255, arg1);
diff --git a/src/overlays/actors/ovl_En_Lift_Nuts/z_en_lift_nuts.c b/src/overlays/actors/ovl_En_Lift_Nuts/z_en_lift_nuts.c
index 0bd619a9c..02f77693d 100644
--- a/src/overlays/actors/ovl_En_Lift_Nuts/z_en_lift_nuts.c
+++ b/src/overlays/actors/ovl_En_Lift_Nuts/z_en_lift_nuts.c
@@ -1009,7 +1009,7 @@ void EnLiftNuts_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s*
void EnLiftNuts_Draw(Actor* thisx, PlayState* play) {
EnLiftNuts* this = THIS;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnLiftNuts_OverrideLimbDraw, EnLiftNuts_PostLimbDraw, thisx);
}
diff --git a/src/overlays/actors/ovl_En_Light/z_en_light.c b/src/overlays/actors/ovl_En_Light/z_en_light.c
index 830484996..0908649dc 100644
--- a/src/overlays/actors/ovl_En_Light/z_en_light.c
+++ b/src/overlays/actors/ovl_En_Light/z_en_light.c
@@ -168,7 +168,7 @@ void EnLight_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
if (this->actor.params >= 0) {
gSPSegment(
diff --git a/src/overlays/actors/ovl_En_Look_Nuts/z_en_look_nuts.c b/src/overlays/actors/ovl_En_Look_Nuts/z_en_look_nuts.c
index 7cd1c3369..cc333b2ae 100644
--- a/src/overlays/actors/ovl_En_Look_Nuts/z_en_look_nuts.c
+++ b/src/overlays/actors/ovl_En_Look_Nuts/z_en_look_nuts.c
@@ -389,7 +389,7 @@ void EnLookNuts_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sEyeTextures[this->eyeState]));
SkelAnime_DrawOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, NULL, NULL, &this->actor);
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 0586b2111..463c5b327 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
@@ -144,7 +144,7 @@ void EnMThunder_Init(Actor* thisx, PlayState* play) {
this->isCharging = false;
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_23_02)) {
- player->unk_B08[0] = 1.0f;
+ player->unk_B08 = 1.0f;
this->collider.info.toucher.damage = sDamages[this->type + ENMTHUNDER_TYPE_MAX];
this->subtype = ENMTHUNDER_SUBTYPE_SPIN_GREAT;
if (this->type == ENMTHUNDER_TYPE_GREAT_FAIRY_SWORD) {
@@ -155,7 +155,7 @@ void EnMThunder_Init(Actor* thisx, PlayState* play) {
this->scaleTarget = 3;
}
} else {
- player->unk_B08[0] = 0.5f;
+ player->unk_B08 = 0.5f;
this->collider.info.toucher.damage = sDamages[this->type];
this->subtype = ENMTHUNDER_SUBTYPE_SPIN_REGULAR;
if (this->type == ENMTHUNDER_TYPE_GREAT_FAIRY_SWORD) {
@@ -229,11 +229,11 @@ void EnMThunder_Charge(EnMThunder* this, PlayState* play) {
Player* player = GET_PLAYER(play);
Actor* child = this->actor.child;
- this->unk1B0 = player->unk_B08[0];
+ this->unk1B0 = player->unk_B08;
this->actor.world.pos = player->bodyPartsPos[0];
this->actor.shape.rot.y = player->actor.shape.rot.y + 0x8000;
- if (!this->isCharging && (player->unk_B08[0] >= 0.1f)) {
+ if (!this->isCharging && (player->unk_B08 >= 0.1f)) {
if ((gSaveContext.magicState != MAGIC_STATE_IDLE) ||
((ENMTHUNDER_GET_MAGIC_COST(&this->actor) != 0) &&
!Magic_Consume(play, ENMTHUNDER_GET_MAGIC_COST(&this->actor), MAGIC_CONSUME_WAIT_PREVIEW))) {
@@ -247,8 +247,8 @@ void EnMThunder_Charge(EnMThunder* this, PlayState* play) {
this->isCharging = true;
}
- if (player->unk_B08[0] >= 0.1f) {
- Rumble_Request(0.0f, (s32)(player->unk_B08[0] * 150.0f), 2, (s32)(player->unk_B08[0] * 150.0f));
+ if (player->unk_B08 >= 0.1f) {
+ Rumble_Request(0.0f, (s32)(player->unk_B08 * 150.0f), 2, (s32)(player->unk_B08 * 150.0f));
}
if (player->stateFlags2 & PLAYER_STATE2_20000) {
@@ -256,8 +256,8 @@ void EnMThunder_Charge(EnMThunder* this, PlayState* play) {
child->parent = NULL;
}
- if (player->unk_B08[0] <= 0.15f) {
- if ((player->unk_B08[0] >= 0.1f) && (player->meleeWeaponAnimation >= PLAYER_MWA_SPIN_ATTACK_1H)) {
+ if (player->unk_B08 <= 0.15f) {
+ if ((player->unk_B08 >= 0.1f) && (player->meleeWeaponAnimation >= PLAYER_MWA_SPIN_ATTACK_1H)) {
AudioSfx_PlaySfx(NA_SE_IT_ROLLING_CUT, &player->actor.projectedPos, 4, &gSfxDefaultFreqAndVolScale,
&gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb);
AudioSfx_PlaySfx(NA_SE_IT_SWORD_SWING_HARD, &player->actor.projectedPos, 4, &gSfxDefaultFreqAndVolScale,
@@ -273,7 +273,7 @@ void EnMThunder_Charge(EnMThunder* this, PlayState* play) {
gSaveContext.magicState = MAGIC_STATE_CONSUME_SETUP;
}
- if (player->unk_B08[0] < 0.85f) {
+ if (player->unk_B08 < 0.85f) {
this->collider.info.toucher.damage = sDamages[this->type];
this->subtype = ENMTHUNDER_SUBTYPE_SPIN_REGULAR;
if (this->type == ENMTHUNDER_TYPE_GREAT_FAIRY_SWORD) {
@@ -320,26 +320,26 @@ void EnMThunder_Charge(EnMThunder* this, PlayState* play) {
return;
}
- if (player->unk_B08[0] > 0.15f) {
+ if (player->unk_B08 > 0.15f) {
this->chargingAlpha = 255;
if (this->actor.child == NULL) {
Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, ACTOR_EFF_DUST, this->actor.world.pos.x,
this->actor.world.pos.y, this->actor.world.pos.z, 0, this->actor.shape.rot.y, 0,
EFF_DUST_TYPE_SPIN_ATTACK_CHARGE);
}
- this->adjustLightsArg1 += (((player->unk_B08[0] - 0.15f) * 1.5f) - this->adjustLightsArg1) * 0.5f;
- } else if (player->unk_B08[0] > .1f) {
- this->chargingAlpha = (s32)((player->unk_B08[0] - .1f) * 255.0f * 20.0f);
- this->lightColorFrac = (player->unk_B08[0] - .1f) * 10.0f;
+ this->adjustLightsArg1 += (((player->unk_B08 - 0.15f) * 1.5f) - this->adjustLightsArg1) * 0.5f;
+ } else if (player->unk_B08 > .1f) {
+ this->chargingAlpha = (s32)((player->unk_B08 - .1f) * 255.0f * 20.0f);
+ this->lightColorFrac = (player->unk_B08 - .1f) * 10.0f;
} else {
this->chargingAlpha = 0;
}
- if (player->unk_B08[0] > 0.85f) {
+ if (player->unk_B08 > 0.85f) {
func_8019F900(&player->actor.projectedPos, 2);
- } else if (player->unk_B08[0] > 0.15f) {
+ } else if (player->unk_B08 > 0.15f) {
func_8019F900(&player->actor.projectedPos, 1);
- } else if (player->unk_B08[0] > 0.1f) {
+ } else if (player->unk_B08 > 0.1f) {
func_8019F900(&player->actor.projectedPos, 0);
}
@@ -487,7 +487,7 @@ void EnMThunder_Draw(Actor* thisx, PlayState* play2) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
Matrix_Scale(0.02f, 0.02f, 0.02f, MTXMODE_APPLY);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
@@ -540,7 +540,7 @@ void EnMThunder_Draw(Actor* thisx, PlayState* play2) {
break;
}
- Matrix_Mult(&player->mf_CC4, MTXMODE_NEW);
+ Matrix_Mult(&player->leftHandMf, MTXMODE_NEW);
if (this->type == ENMTHUNDER_TYPE_GILDED_SWORD) {
Matrix_Translate(0.0f, 220.0f, 0.0f, MTXMODE_APPLY);
diff --git a/src/overlays/actors/ovl_En_Ma4/z_en_ma4.c b/src/overlays/actors/ovl_En_Ma4/z_en_ma4.c
index 1242de4ba..7fb2a13a3 100644
--- a/src/overlays/actors/ovl_En_Ma4/z_en_ma4.c
+++ b/src/overlays/actors/ovl_En_Ma4/z_en_ma4.c
@@ -1069,7 +1069,7 @@ void EnMa4_Draw(Actor* thisx, PlayState* play) {
gSPDisplayList(POLY_OPA_DISP++, gRomaniWoodenBoxDL);
}
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, SEGMENTED_TO_VIRTUAL(sEyeTextures[this->eyeTexIndex]));
gSPSegment(POLY_OPA_DISP++, 0x09, SEGMENTED_TO_VIRTUAL(sMouthTextures[this->mouthTexIndex]));
diff --git a/src/overlays/actors/ovl_En_Ma_Yto/z_en_ma_yto.c b/src/overlays/actors/ovl_En_Ma_Yto/z_en_ma_yto.c
index 6d0b027eb..89ee4aada 100644
--- a/src/overlays/actors/ovl_En_Ma_Yto/z_en_ma_yto.c
+++ b/src/overlays/actors/ovl_En_Ma_Yto/z_en_ma_yto.c
@@ -1462,7 +1462,7 @@ void EnMaYto_Draw(Actor* thisx, PlayState* play) {
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, gCremiaWoodenBoxDL);
}
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x09, Lib_SegmentedToVirtual(sMouthTextures[this->mouthTexIndex]));
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sEyesTextures[this->eyeTexIndex]));
diff --git a/src/overlays/actors/ovl_En_Ma_Yts/z_en_ma_yts.c b/src/overlays/actors/ovl_En_Ma_Yts/z_en_ma_yts.c
index edf0e41f2..8eacc7962 100644
--- a/src/overlays/actors/ovl_En_Ma_Yts/z_en_ma_yts.c
+++ b/src/overlays/actors/ovl_En_Ma_Yts/z_en_ma_yts.c
@@ -536,7 +536,8 @@ void EnMaYts_Draw(Actor* thisx, PlayState* play) {
EnMaYts* this = THIS;
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x09, SEGMENTED_TO_VIRTUAL(sMouthTextures[this->mouthTexIndex]));
gSPSegment(POLY_OPA_DISP++, 0x08, SEGMENTED_TO_VIRTUAL(sEyeTextures[this->eyeTexIndex]));
@@ -550,7 +551,8 @@ void EnMaYts_Draw(Actor* thisx, PlayState* play) {
// Alternative draw function
void EnMaYts_DrawSleeping(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, gRomaniSleepingDL);
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 15aa42bda..0cce91c73 100644
--- a/src/overlays/actors/ovl_En_Mag/z_en_mag.c
+++ b/src/overlays/actors/ovl_En_Mag/z_en_mag.c
@@ -554,7 +554,7 @@ void EnMag_DrawImageRGBA32(Gfx** gfxp, s16 centerX, s16 centerY, TexturePtr sour
s32 pad;
s32 i;
- func_8012CA0C(&gfx);
+ Gfx_SetupDL56_Ptr(&gfx);
curTexture = source;
rectLeft = centerX - (width / 2);
@@ -709,7 +709,7 @@ void EnMag_DrawInner(Actor* thisx, PlayState* play, Gfx** gfxp) {
// 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);
- func_8012C680(&gfx);
+ Gfx_SetupDL39_Ptr(&gfx);
// Mask appearing effects
gDPPipeSync(gfx++);
@@ -736,7 +736,7 @@ void EnMag_DrawInner(Actor* thisx, PlayState* play, Gfx** gfxp) {
}
}
- func_8012C680(&gfx);
+ Gfx_SetupDL39_Ptr(&gfx);
if (this->majorasMaskAlpha != 0) {
gDPSetCombineLERP(gfx++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, PRIMITIVE,
@@ -774,7 +774,7 @@ void EnMag_DrawInner(Actor* thisx, PlayState* play, Gfx** gfxp) {
}
if (this->subtitleAlpha != 0) {
- func_8012C680(&gfx);
+ Gfx_SetupDL39_Ptr(&gfx);
gDPSetAlphaCompare(gfx++, G_AC_NONE);
gDPSetCombineMode(gfx++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
@@ -792,7 +792,7 @@ void EnMag_DrawInner(Actor* thisx, PlayState* play, Gfx** gfxp) {
SUBTITLE_TEX_LEFT, SUBTITLE_TEX_TOP);
}
- func_8012C680(&gfx);
+ Gfx_SetupDL39_Ptr(&gfx);
gDPSetAlphaCompare(gfx++, G_AC_NONE);
gDPSetCombineMode(gfx++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
@@ -808,7 +808,7 @@ void EnMag_DrawInner(Actor* thisx, PlayState* play, Gfx** gfxp) {
EnMag_DrawTextureI8(&gfx, gTitleScreenMajorasMaskSubtitleTex, SUBTITLE_TEX_WIDTH, SUBTITLE_TEX_HEIGHT,
SUBTITLE_TEX_LEFT, SUBTITLE_TEX_TOP);
- func_8012C680(&gfx);
+ Gfx_SetupDL39_Ptr(&gfx);
gDPSetAlphaCompare(gfx++, G_AC_NONE);
gDPSetCombineMode(gfx++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
@@ -833,7 +833,7 @@ void EnMag_DrawInner(Actor* thisx, PlayState* play, Gfx** gfxp) {
THE_LEGEND_OF_TEX_LEFT, THE_LEGEND_OF_TEX_TOP);
}
- func_8012C680(&gfx);
+ Gfx_SetupDL39_Ptr(&gfx);
if (this->copyrightAlpha != 0) {
gDPSetAlphaCompare(gfx++, G_AC_NONE);
diff --git a/src/overlays/actors/ovl_En_Maruta/z_en_maruta.c b/src/overlays/actors/ovl_En_Maruta/z_en_maruta.c
index 95890455c..659ef4cb3 100644
--- a/src/overlays/actors/ovl_En_Maruta/z_en_maruta.c
+++ b/src/overlays/actors/ovl_En_Maruta/z_en_maruta.c
@@ -491,11 +491,11 @@ s32 func_80B37B78(EnMaruta* this, PlayState* play) {
s16 temp_v1 = BINANG_SUB(this->actor.yawTowardsPlayer, 0x8000);
temp_v1 = BINANG_SUB(temp_v1, player->actor.shape.rot.y);
- if ((ABS_ALT(temp_v1) < 0x1555) ||
- ((player->meleeWeaponState != 0) && ((player->meleeWeaponAnimation == PLAYER_MWA_RIGHT_SLASH_1H) ||
- (player->meleeWeaponAnimation == PLAYER_MWA_RIGHT_COMBO_1H) ||
- (player->meleeWeaponAnimation == PLAYER_MWA_SPIN_ATTACK_1H) ||
- (player->meleeWeaponAnimation == PLAYER_MWA_BIG_SPIN_1H)))) {
+ if ((ABS_ALT(temp_v1) < 0x1555) || ((player->meleeWeaponState != PLAYER_MELEE_WEAPON_STATE_0) &&
+ ((player->meleeWeaponAnimation == PLAYER_MWA_RIGHT_SLASH_1H) ||
+ (player->meleeWeaponAnimation == PLAYER_MWA_RIGHT_COMBO_1H) ||
+ (player->meleeWeaponAnimation == PLAYER_MWA_SPIN_ATTACK_1H) ||
+ (player->meleeWeaponAnimation == PLAYER_MWA_BIG_SPIN_1H)))) {
return true;
}
return false;
@@ -700,7 +700,7 @@ void EnMaruta_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
if (this->unk_210 == 0) {
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
diff --git a/src/overlays/actors/ovl_En_Minifrog/z_en_minifrog.c b/src/overlays/actors/ovl_En_Minifrog/z_en_minifrog.c
index 7ac16e1b0..e7941a4d5 100644
--- a/src/overlays/actors/ovl_En_Minifrog/z_en_minifrog.c
+++ b/src/overlays/actors/ovl_En_Minifrog/z_en_minifrog.c
@@ -628,12 +628,14 @@ void EnMinifrog_Draw(Actor* thisx, PlayState* play) {
Color_RGBA8* envColor;
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
envColor = &sEnMinifrogColor[this->frogIndex];
gSPSegment(POLY_OPA_DISP++, 0x08, D_808A4D74[0]);
gSPSegment(POLY_OPA_DISP++, 0x09, D_808A4D74[0]);
gDPSetEnvColor(POLY_OPA_DISP++, envColor->r, envColor->g, envColor->b, envColor->a);
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnMinifrog_OverrideLimbDraw, EnMinifrog_PostLimbDraw, &this->actor);
+
CLOSE_DISPS(play->state.gfxCtx);
}
diff --git a/src/overlays/actors/ovl_En_Minislime/z_en_minislime.c b/src/overlays/actors/ovl_En_Minislime/z_en_minislime.c
index 4aa052549..3b6cbaf86 100644
--- a/src/overlays/actors/ovl_En_Minislime/z_en_minislime.c
+++ b/src/overlays/actors/ovl_En_Minislime/z_en_minislime.c
@@ -174,20 +174,20 @@ void EnMinislime_CheckBackgroundCollision(EnMinislime* this) {
}
void EnMinislime_AddIceShardEffect(EnMinislime* this) {
+ s32 pad;
EnBigslime* bigslime = (EnBigslime*)this->actor.parent;
EnBigslimeIceShardEffect* iceShardEffect;
s32 i = 10 * this->id + BIGSLIME_NUM_VTX;
s32 i_end = i + 10;
- VecSph vecSph;
-
- vecSph.yaw = 0;
+ s16 pitch;
+ s16 yaw = 0;
for (; i < i_end; i++) {
iceShardEffect = &bigslime->iceShardEffect[i];
- vecSph.pitch = Rand_S16Offset(0x1000, 0x3000);
- iceShardEffect->velocity.x = Math_CosS(vecSph.pitch) * Math_SinS(vecSph.yaw);
- iceShardEffect->velocity.y = Math_SinS(vecSph.pitch);
- iceShardEffect->velocity.z = Math_CosS(vecSph.pitch) * Math_CosS(vecSph.yaw);
+ pitch = Rand_S16Offset(0x1000, 0x3000);
+ iceShardEffect->velocity.x = Math_CosS(pitch) * Math_SinS(yaw);
+ iceShardEffect->velocity.y = Math_SinS(pitch);
+ iceShardEffect->velocity.z = Math_CosS(pitch) * Math_CosS(yaw);
iceShardEffect->pos.x = this->actor.world.pos.x + (400.0f * this->actor.scale.x) * iceShardEffect->velocity.x;
iceShardEffect->pos.y =
this->actor.world.pos.y + (((iceShardEffect->velocity.y * 2.0f) - 1.0f) * 400.0f * this->actor.scale.y);
@@ -198,7 +198,7 @@ void EnMinislime_AddIceShardEffect(EnMinislime* this) {
iceShardEffect->isEnabled = true;
Math_Vec3f_ScaleAndStore(&iceShardEffect->velocity, Rand_ZeroFloat(3.0f) + 7.0f, &iceShardEffect->velocity);
iceShardEffect->scale = (Rand_ZeroFloat(6.0f) + 2.0f) * 0.001f;
- vecSph.yaw += 0x1999;
+ yaw += 0x1999;
}
this->frozenAlpha = 0;
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 20f32028e..92a3ff91e 100644
--- a/src/overlays/actors/ovl_En_Mk/z_en_mk.c
+++ b/src/overlays/actors/ovl_En_Mk/z_en_mk.c
@@ -480,7 +480,7 @@ void EnMk_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
void EnMk_Draw(Actor* thisx, PlayState* play) {
EnMk* this = THIS;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnMk_OverrideLimbDraw, EnMk_PostLimbDraw, &this->actor);
}
diff --git a/src/overlays/actors/ovl_En_Mkk/z_en_mkk.c b/src/overlays/actors/ovl_En_Mkk/z_en_mkk.c
index 4f1ddc660..9b4722fba 100644
--- a/src/overlays/actors/ovl_En_Mkk/z_en_mkk.c
+++ b/src/overlays/actors/ovl_En_Mkk/z_en_mkk.c
@@ -524,7 +524,7 @@ void EnMkk_Draw(Actor* thisx, PlayState* play) {
if (this->alpha == 255) {
primColors = &D_80A4F7C4[this->primColorSelect];
gfx = POLY_OPA_DISP;
- gSPDisplayList(&gfx[0], &sSetupDL[6 * 25]);
+ gSPDisplayList(&gfx[0], gSetupDLs[SETUPDL_25]);
gDPSetPrimColor(&gfx[1], 0, 0xFF, primColors->r, primColors->g, primColors->b, primColors->a);
gSPSegment(&gfx[2], 0x08, D_801AEFA0);
gSPMatrix(&gfx[3], Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
@@ -532,7 +532,7 @@ void EnMkk_Draw(Actor* thisx, PlayState* play) {
POLY_OPA_DISP = &gfx[5];
}
gfx = POLY_XLU_DISP;
- gSPDisplayList(&gfx[0], &sSetupDL[6 * 25]);
+ gSPDisplayList(&gfx[0], gSetupDLs[SETUPDL_25]);
gDPSetEnvColor(&gfx[1], 255, 255, 255, this->alpha);
gSPDisplayList(&gfx[2], dLists->unk0);
Matrix_ReplaceRotation(&play->billboardMtxF);
@@ -576,7 +576,7 @@ void func_80A4F4C8(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
gfx = POLY_XLU_DISP;
- gSPDisplayList(&gfx[0], &sSetupDL[6 * 25]);
+ gSPDisplayList(&gfx[0], gSetupDLs[SETUPDL_25]);
gDPSetEnvColor(&gfx[1], 255, 255, 255, this->alpha);
gSPDisplayList(&gfx[2], dLists->unk0);
Matrix_ReplaceRotation(&play->billboardMtxF);
diff --git a/src/overlays/actors/ovl_En_Mm/z_en_mm.c b/src/overlays/actors/ovl_En_Mm/z_en_mm.c
index 67a0a1e77..a0a308ef9 100644
--- a/src/overlays/actors/ovl_En_Mm/z_en_mm.c
+++ b/src/overlays/actors/ovl_En_Mm/z_en_mm.c
@@ -211,7 +211,8 @@ void EnMm_Draw(Actor* thisx, PlayState* play) {
EnMm* this = THIS;
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
if (this->unk_190 != 0) {
s16 rotY = this->actor.world.rot.y - this->actor.shape.rot.y;
@@ -221,5 +222,6 @@ void EnMm_Draw(Actor* thisx, PlayState* play) {
}
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, gameplay_keep_DL_055628);
+
CLOSE_DISPS(play->state.gfxCtx);
}
diff --git a/src/overlays/actors/ovl_En_Mm2/z_en_mm2.c b/src/overlays/actors/ovl_En_Mm2/z_en_mm2.c
index 48a379304..5c6adcd8a 100644
--- a/src/overlays/actors/ovl_En_Mm2/z_en_mm2.c
+++ b/src/overlays/actors/ovl_En_Mm2/z_en_mm2.c
@@ -82,7 +82,7 @@ void EnMm2_Update(Actor* thisx, PlayState* play) {
void EnMm2_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, sEnMm2DL);
diff --git a/src/overlays/actors/ovl_En_Mm3/z_en_mm3.c b/src/overlays/actors/ovl_En_Mm3/z_en_mm3.c
index 366bddef3..abf5503a4 100644
--- a/src/overlays/actors/ovl_En_Mm3/z_en_mm3.c
+++ b/src/overlays/actors/ovl_En_Mm3/z_en_mm3.c
@@ -561,7 +561,7 @@ void EnMm3_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(D_80A704FC[this->unk_1DC]));
gSPSegment(POLY_OPA_DISP++, 0x0C, sEnMm3DL);
diff --git a/src/overlays/actors/ovl_En_Ms/z_en_ms.c b/src/overlays/actors/ovl_En_Ms/z_en_ms.c
index 3cbf7e2ad..732fc9b3b 100644
--- a/src/overlays/actors/ovl_En_Ms/z_en_ms.c
+++ b/src/overlays/actors/ovl_En_Ms/z_en_ms.c
@@ -181,7 +181,7 @@ void EnMs_Update(Actor* thisx, PlayState* play) {
void EnMs_Draw(Actor* thisx, PlayState* play) {
EnMs* this = THIS;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount, NULL,
NULL, &this->actor);
}
diff --git a/src/overlays/actors/ovl_En_Mushi2/z_en_mushi2.c b/src/overlays/actors/ovl_En_Mushi2/z_en_mushi2.c
index 4bf4db0e0..ebea9196b 100644
--- a/src/overlays/actors/ovl_En_Mushi2/z_en_mushi2.c
+++ b/src/overlays/actors/ovl_En_Mushi2/z_en_mushi2.c
@@ -1236,6 +1236,6 @@ void EnMushi2_Draw(Actor* thisx, PlayState* play) {
EnMushi2* this = THIS;
func_80A687A0(this);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, NULL, NULL, NULL);
}
diff --git a/src/overlays/actors/ovl_En_Muto/z_en_muto.c b/src/overlays/actors/ovl_En_Muto/z_en_muto.c
index 7c9d1e9b2..441c27cdc 100644
--- a/src/overlays/actors/ovl_En_Muto/z_en_muto.c
+++ b/src/overlays/actors/ovl_En_Muto/z_en_muto.c
@@ -300,7 +300,7 @@ s32 EnMuto_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f*
void EnMuto_Draw(Actor* thisx, PlayState* play) {
EnMuto* this = THIS;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnMuto_OverrideLimbDraw, NULL, &this->actor);
}
diff --git a/src/overlays/actors/ovl_En_Nb/z_en_nb.c b/src/overlays/actors/ovl_En_Nb/z_en_nb.c
index c5a8b2498..4edadf412 100644
--- a/src/overlays/actors/ovl_En_Nb/z_en_nb.c
+++ b/src/overlays/actors/ovl_En_Nb/z_en_nb.c
@@ -789,7 +789,7 @@ void EnNb_Draw(Actor* thisx, PlayState* play) {
EnNb* this = THIS;
if (this->scheduleResult != EN_NB_SCH_NONE) {
- func_8012C5B0(play->state.gfxCtx);
+ Gfx_SetupDL37_Opa(play->state.gfxCtx);
SkelAnime_DrawTransformFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable,
this->skelAnime.dListCount, EnNb_OverrideLimbDraw, EnNb_PostLimbDraw,
EnNb_TransformLimbDraw, &this->actor);
diff --git a/src/overlays/actors/ovl_En_Neo_Reeba/z_en_neo_reeba.c b/src/overlays/actors/ovl_En_Neo_Reeba/z_en_neo_reeba.c
index 960767b11..66098a9d5 100644
--- a/src/overlays/actors/ovl_En_Neo_Reeba/z_en_neo_reeba.c
+++ b/src/overlays/actors/ovl_En_Neo_Reeba/z_en_neo_reeba.c
@@ -729,11 +729,14 @@ s32 EnNeoReeba_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec
void EnNeoReeba_Draw(Actor* thisx, PlayState* play) {
EnNeoReeba* this = THIS;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+
OPEN_DISPS(play->state.gfxCtx);
+
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0x01, 255, 255, 255, 255);
SkelAnime_DrawOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, EnNeoReeba_OverrideLimbDraw, NULL,
&this->actor);
+
CLOSE_DISPS(play->state.gfxCtx);
if (this->stunTimer > 0) {
diff --git a/src/overlays/actors/ovl_En_Nimotsu/z_en_nimotsu.c b/src/overlays/actors/ovl_En_Nimotsu/z_en_nimotsu.c
index 807bbd849..41f872488 100644
--- a/src/overlays/actors/ovl_En_Nimotsu/z_en_nimotsu.c
+++ b/src/overlays/actors/ovl_En_Nimotsu/z_en_nimotsu.c
@@ -104,10 +104,11 @@ void EnNimotsu_Draw(Actor* thisx, PlayState* play) {
Vec3f scale;
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, &gBombShopBagDL);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
position.x = this->actor.world.pos.x + 7.0f;
position.y = this->actor.world.pos.y;
@@ -118,5 +119,6 @@ void EnNimotsu_Draw(Actor* thisx, PlayState* play) {
scale.z = 0.2f;
func_800BC620(&position, &scale, 255, play);
+
CLOSE_DISPS(play->state.gfxCtx);
}
diff --git a/src/overlays/actors/ovl_En_Niw/z_en_niw.c b/src/overlays/actors/ovl_En_Niw/z_en_niw.c
index bded43eda..9f364c2c6 100644
--- a/src/overlays/actors/ovl_En_Niw/z_en_niw.c
+++ b/src/overlays/actors/ovl_En_Niw/z_en_niw.c
@@ -938,7 +938,7 @@ s32 EnNiw_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* p
void EnNiw_Draw(Actor* thisx, PlayState* play) {
EnNiw* this = THIS;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawFlexOpa(play, this->skelanime.skeleton, this->skelanime.jointTable, this->skelanime.dListCount,
EnNiw_OverrideLimbDraw, NULL, &this->actor);
EnNiw_DrawFeathers(this, play);
@@ -1002,7 +1002,8 @@ void EnNiw_DrawFeathers(EnNiw* this, PlayState* play) {
s16 i;
OPEN_DISPS(gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
for (i = 0; i < ARRAY_COUNT(this->feathers); i++, feather++) {
if (feather->isEnabled == true) {
diff --git a/src/overlays/actors/ovl_En_Nnh/z_en_nnh.c b/src/overlays/actors/ovl_En_Nnh/z_en_nnh.c
index 0187e1c88..3b2659d1e 100644
--- a/src/overlays/actors/ovl_En_Nnh/z_en_nnh.c
+++ b/src/overlays/actors/ovl_En_Nnh/z_en_nnh.c
@@ -107,7 +107,7 @@ void EnNnh_Draw(Actor* thisx, PlayState* play) {
GraphicsContext* gfxCtx = play->state.gfxCtx;
s32 pad;
- func_8012C28C(gfxCtx);
+ Gfx_SetupDL25_Opa(gfxCtx);
gSPMatrix(gfxCtx->polyOpa.p++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(gfxCtx->polyOpa.p++, gButlerSonMainBodyDL);
}
diff --git a/src/overlays/actors/ovl_En_Nutsball/z_en_nutsball.c b/src/overlays/actors/ovl_En_Nutsball/z_en_nutsball.c
index 9c6fe4a9d..bf3216fd5 100644
--- a/src/overlays/actors/ovl_En_Nutsball/z_en_nutsball.c
+++ b/src/overlays/actors/ovl_En_Nutsball/z_en_nutsball.c
@@ -173,10 +173,12 @@ void EnNutsball_Draw(Actor* thisx, PlayState* play) {
EnNutsball* this = THIS;
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
Matrix_Mult(&play->billboardMtxF, MTXMODE_APPLY);
Matrix_RotateZS(this->actor.home.rot.z, MTXMODE_APPLY);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, gameplay_keep_DL_058BA0);
+
CLOSE_DISPS(play->state.gfxCtx);
}
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 b11e8c408..afd6eea3e 100644
--- a/src/overlays/actors/ovl_En_Nwc/z_en_nwc.c
+++ b/src/overlays/actors/ovl_En_Nwc/z_en_nwc.c
@@ -487,7 +487,7 @@ void EnNwc_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
dispHead = POLY_OPA_DISP;
@@ -519,7 +519,7 @@ s32 EnNwc_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* p
void EnNwc_DrawAdultBody(Actor* thisx, PlayState* play) {
EnNwc* this = THIS;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawFlexOpa(play, this->niwSkeleton.skeleton, this->niwSkeleton.jointTable, this->niwSkeleton.dListCount,
EnNwc_OverrideLimbDraw, NULL, &this->actor);
}
diff --git a/src/overlays/actors/ovl_En_Osk/z_en_osk.c b/src/overlays/actors/ovl_En_Osk/z_en_osk.c
index 3f10f6771..7a40b38f5 100644
--- a/src/overlays/actors/ovl_En_Osk/z_en_osk.c
+++ b/src/overlays/actors/ovl_En_Osk/z_en_osk.c
@@ -512,7 +512,7 @@ void EnOsk_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Gfx_PrimColor(play->state.gfxCtx, 0x80, 255, 255, 255, 255));
@@ -542,7 +542,7 @@ void EnOsk_Draw(Actor* thisx, PlayState* play) {
MTXMODE_APPLY);
}
- gfx = func_8012C868(POLY_XLU_DISP);
+ gfx = Gfx_SetupDL20_NoCD(POLY_XLU_DISP);
gSPSetOtherMode(gfx++, G_SETOTHERMODE_H, 4, 4, 0x00000080);
if (1) {}
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 6cc29578a..0631922be 100644
--- a/src/overlays/actors/ovl_En_Osn/z_en_osn.c
+++ b/src/overlays/actors/ovl_En_Osn/z_en_osn.c
@@ -1037,7 +1037,7 @@ void EnOsn_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
if (this->alpha == 255) {
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
if ((this->animIndex == OSN_ANIM_CHOKE) || (this->animIndex == OSN_ANIM_DESPAIR) ||
(this->animIndex == OSN_ANIM_HAND_OUT_2) || (play->msgCtx.currentTextId == 0x1FCA)) {
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sEyeOpenTex));
@@ -1056,7 +1056,7 @@ void EnOsn_Draw(Actor* thisx, PlayState* play) {
SkelAnime_DrawFlex(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnOsn_OverrideLimbDraw, EnOsn_PostLimbDraw, &this->actor, POLY_OPA_DISP);
} else {
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(sEyeClosedHappyTex));
gSPSegment(POLY_XLU_DISP++, 0x09, Lib_SegmentedToVirtual(sSmileTex));
gDPSetEnvColor(POLY_XLU_DISP++, 255, 255, 255, this->alpha);
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 9cc6313a8..d76ed870f 100644
--- a/src/overlays/actors/ovl_En_Ossan/z_en_ossan.c
+++ b/src/overlays/actors/ovl_En_Ossan/z_en_ossan.c
@@ -1575,7 +1575,7 @@ void EnOssan_DrawCursor(PlayState* play, EnOssan* this, f32 x, f32 y, f32 z, u8
OPEN_DISPS(play->state.gfxCtx);
if (drawCursor != 0) {
- func_8012C654(play->state.gfxCtx);
+ Gfx_SetupDL39_Overlay(play->state.gfxCtx);
gDPSetPrimColor(OVERLAY_DISP++, 0, 0, this->cursorColor.r, this->cursorColor.g, this->cursorColor.b,
this->cursorColor.a);
gDPLoadTextureBlock_4b(OVERLAY_DISP++, gSelectionCursorTex, G_IM_FMT_IA, 16, 16, 0, G_TX_MIRROR | G_TX_WRAP,
@@ -1637,7 +1637,7 @@ void EnOssan_DrawStickDirectionPrompts(PlayState* play, EnOssan* this) {
OPEN_DISPS(play->state.gfxCtx);
if (drawStickRightPrompt || drawStickLeftPrompt) {
- func_8012C654(play->state.gfxCtx);
+ Gfx_SetupDL39_Overlay(play->state.gfxCtx);
gDPSetCombineMode(OVERLAY_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
gDPLoadTextureBlock(OVERLAY_DISP++, gArrowCursorTex, G_IM_FMT_IA, G_IM_SIZ_8b, 16, 24, 0,
G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, 4, G_TX_NOMASK, G_TX_NOLOD,
@@ -1720,7 +1720,7 @@ void EnOssan_CuriosityShopMan_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sEyeTextures[this->eyeTexIndex]));
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnOssan_CuriosityShopMan_OverrideLimbDraw, EnOssan_CuriosityShopMan_PostLimbDraw,
@@ -1738,7 +1738,7 @@ void EnOssan_PartTimer_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sEyeTextures[this->eyeTexIndex]));
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnOssan_PartTimer_OverrideLimbDraw, EnOssan_PartTimer_PostLimbDraw, &this->actor);
diff --git a/src/overlays/actors/ovl_En_Ot/z_en_ot.c b/src/overlays/actors/ovl_En_Ot/z_en_ot.c
index a4d820364..1e1a36d74 100644
--- a/src/overlays/actors/ovl_En_Ot/z_en_ot.c
+++ b/src/overlays/actors/ovl_En_Ot/z_en_ot.c
@@ -4,6 +4,7 @@
* Description: Seahorse
*/
+#include "prevent_bss_reordering.h"
#include "z_en_ot.h"
#include "objects/object_ot/object_ot.h"
#include "objects/gameplay_keep/gameplay_keep.h"
@@ -1031,8 +1032,8 @@ void EnOt_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- POLY_OPA_DISP = Gfx_CallSetupDL(POLY_OPA_DISP, 25);
- POLY_XLU_DISP = func_8012C2B4(POLY_XLU_DISP);
+ POLY_OPA_DISP = Gfx_SetupDL(POLY_OPA_DISP, SETUPDL_25);
+ POLY_XLU_DISP = Gfx_SetupDL71(POLY_XLU_DISP);
CLOSE_DISPS(play->state.gfxCtx);
@@ -1044,7 +1045,7 @@ void EnOt_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- gfx = func_8012C7FC(POLY_XLU_DISP);
+ gfx = Gfx_SetupDL65_NoCD(POLY_XLU_DISP);
gDPSetDither(&gfx[0], G_CD_NOISE);
gDPSetCombineLERP(&gfx[1], 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE,
@@ -1139,7 +1140,7 @@ void func_80B5E1D8(PlayState* play, EnOtUnkStruct* arg1, s32 arg2) {
OPEN_DISPS(play->state.gfxCtx);
POLY_OPA_DISP = Play_SetFog(play, POLY_OPA_DISP);
- POLY_OPA_DISP = func_8012C724(POLY_OPA_DISP);
+ POLY_OPA_DISP = Gfx_SetupDL66(POLY_OPA_DISP);
for (i = 0; i < arg2; i++, arg1++) {
if (arg1->unk_00) {
diff --git a/src/overlays/actors/ovl_En_Owl/z_en_owl.c b/src/overlays/actors/ovl_En_Owl/z_en_owl.c
index f71d227f6..4ff55d7a0 100644
--- a/src/overlays/actors/ovl_En_Owl/z_en_owl.c
+++ b/src/overlays/actors/ovl_En_Owl/z_en_owl.c
@@ -1151,7 +1151,7 @@ void EnOwl_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C5B0(play->state.gfxCtx);
+ Gfx_SetupDL37_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(eyeTextures[this->eyeTexIndex]));
@@ -1172,7 +1172,7 @@ void func_8095D074(Actor* thisx, PlayState* play) {
if (this->unk_3DC >= 0x20) {
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gDPSetRenderMode(POLY_OPA_DISP++, G_RM_FOG_SHADE_A, G_RM_AA_ZB_TEX_EDGE2);
gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 255);
@@ -1180,7 +1180,7 @@ void func_8095D074(Actor* thisx, PlayState* play) {
} else {
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gDPSetRenderMode(POLY_XLU_DISP++, G_RM_FOG_SHADE_A, G_RM_AA_XLU_SURF2);
gDPSetEnvColor(POLY_XLU_DISP++, 0, 0, 0, (u8)(this->unk_3DC * 8));
diff --git a/src/overlays/actors/ovl_En_Pamera/z_en_pamera.c b/src/overlays/actors/ovl_En_Pamera/z_en_pamera.c
index dab8f591e..b78c9a314 100644
--- a/src/overlays/actors/ovl_En_Pamera/z_en_pamera.c
+++ b/src/overlays/actors/ovl_En_Pamera/z_en_pamera.c
@@ -244,8 +244,8 @@ void func_80BD8758(EnPamera* this, PlayState* play) {
if (this->hideInisdeTimer++ > 1800) {
if (CutsceneManager_IsNext(this->csIdList[0]) && (this->csIdList[0] != -1)) {
CutsceneManager_StartWithPlayerCs(this->csIdList[0], &this->actor);
- Camera_SetToTrackActor(Play_GetCamera(play, CutsceneManager_GetCurrentSubCamId(this->csIdList[0])),
- &this->actor);
+ Camera_SetFocalActor(Play_GetCamera(play, CutsceneManager_GetCurrentSubCamId(this->csIdList[0])),
+ &this->actor);
this->actor.speed = 1.5f;
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 1);
this->actor.shape.rot.y = this->actor.home.rot.y;
@@ -431,8 +431,8 @@ void func_80BD90AC(EnPamera* this, PlayState* play) {
(Math_Vec3f_DistXZ(&this->actor.home.pos, &player->actor.world.pos) < 200.0f)))) {
if ((CutsceneManager_IsNext(this->csIdList[1])) && ((this->csIdList[1] != -1))) {
CutsceneManager_StartWithPlayerCs(this->csIdList[1], &this->actor);
- Camera_SetToTrackActor(Play_GetCamera(play, CutsceneManager_GetCurrentSubCamId(this->csIdList[1])),
- &this->actor);
+ Camera_SetFocalActor(Play_GetCamera(play, CutsceneManager_GetCurrentSubCamId(this->csIdList[1])),
+ &this->actor);
EnPamera_LookDownWell(this);
} else if (this->csIdList[1] != -1) {
CutsceneManager_Queue(this->csIdList[1]);
@@ -556,12 +556,14 @@ void EnPamera_Draw(Actor* thisx, PlayState* play) {
EnPamera* this = THIS;
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, SEGMENTED_TO_VIRTUAL(D_80BDA604[this->unk_312]));
gSPSegment(POLY_OPA_DISP++, 0x09, SEGMENTED_TO_VIRTUAL(D_80BDA610[this->unk_314]));
gSPSegment(POLY_OPA_DISP++, 0x0A, SEGMENTED_TO_VIRTUAL(D_80BDA5FC[this->unk_310]));
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnPamera_OverrideLimbDraw, EnPamera_PostLimbDraw, &this->actor);
+
CLOSE_DISPS(play->state.gfxCtx);
}
diff --git a/src/overlays/actors/ovl_En_Pametfrog/z_en_pametfrog.c b/src/overlays/actors/ovl_En_Pametfrog/z_en_pametfrog.c
index 62dff4188..0caeb9305 100644
--- a/src/overlays/actors/ovl_En_Pametfrog/z_en_pametfrog.c
+++ b/src/overlays/actors/ovl_En_Pametfrog/z_en_pametfrog.c
@@ -1224,10 +1224,10 @@ void EnPametfrog_SetupSnapperSpawn(EnPametfrog* this, PlayState* play) {
// Zooms in on Snapper spawn point
Play_SetCameraAtEye(play, this->subCamId, &subCamAt, &subCamEye);
- this->quakeIndex = Quake_Add(GET_ACTIVE_CAM(play), QUAKE_TYPE_6);
+ this->quakeIndex = Quake_Request(GET_ACTIVE_CAM(play), QUAKE_TYPE_6);
Quake_SetSpeed(this->quakeIndex, 18000);
- Quake_SetQuakeValues(this->quakeIndex, 2, 0, 0, 0);
- Quake_SetCountdown(this->quakeIndex, 15);
+ Quake_SetPerturbations(this->quakeIndex, 2, 0, 0, 0);
+ Quake_SetDuration(this->quakeIndex, 15);
Rumble_Request(this->actor.xyzDistToPlayerSq, 120, 20, 10);
@@ -1249,12 +1249,12 @@ void EnPametfrog_SnapperSpawn(EnPametfrog* this, PlayState* play) {
void EnPametfrog_SetupTransitionGekkoSnapper(EnPametfrog* this, PlayState* play) {
this->actor.params = GEKKO_GET_SNAPPER;
- Quake_Remove(this->quakeIndex);
+ Quake_RemoveRequest(this->quakeIndex);
- this->quakeIndex = Quake_Add(GET_ACTIVE_CAM(play), QUAKE_TYPE_3);
+ this->quakeIndex = Quake_Request(GET_ACTIVE_CAM(play), QUAKE_TYPE_3);
Quake_SetSpeed(this->quakeIndex, 20000);
- Quake_SetQuakeValues(this->quakeIndex, 17, 0, 0, 0);
- Quake_SetCountdown(this->quakeIndex, 12);
+ Quake_SetPerturbations(this->quakeIndex, 17, 0, 0, 0);
+ Quake_SetDuration(this->quakeIndex, 12);
Rumble_Request(this->actor.xyzDistToPlayerSq, 255, 20, 150);
@@ -1424,7 +1424,7 @@ void EnPametfrog_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s
void EnPametfrog_Draw(Actor* thisx, PlayState* play) {
EnPametfrog* this = THIS;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
Matrix_RotateYS(this->spinYaw, MTXMODE_APPLY);
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount, NULL,
EnPametfrog_PostLimbDraw, &this->actor);
diff --git a/src/overlays/actors/ovl_En_Paper/z_en_paper.c b/src/overlays/actors/ovl_En_Paper/z_en_paper.c
index 7659b524b..b2b3b5669 100644
--- a/src/overlays/actors/ovl_En_Paper/z_en_paper.c
+++ b/src/overlays/actors/ovl_En_Paper/z_en_paper.c
@@ -213,7 +213,7 @@ void EnPaper_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C5B0(play->state.gfxCtx);
+ Gfx_SetupDL37_Opa(play->state.gfxCtx);
gDPSetRenderMode(POLY_OPA_DISP++, G_RM_FOG_SHADE_A, G_RM_AA_ZB_OPA_SURF2);
gDPSetCombineLERP(POLY_OPA_DISP++, 0, 0, 0, SHADE, 0, 0, 0, SHADE, PRIMITIVE, 0, COMBINED, 0, 0, 0, 0, COMBINED);
diff --git a/src/overlays/actors/ovl_En_Part/z_en_part.c b/src/overlays/actors/ovl_En_Part/z_en_part.c
index 2a12b9af8..ac073358f 100644
--- a/src/overlays/actors/ovl_En_Part/z_en_part.c
+++ b/src/overlays/actors/ovl_En_Part/z_en_part.c
@@ -125,7 +125,7 @@ void EnPart_Draw(Actor* thisx, PlayState* play) {
if (this->actor.params > ENPART_TYPE_0) {
Matrix_RotateZF(this->zRot, MTXMODE_APPLY);
}
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
func_800B8050(&this->actor, play, 0);
if (this->actor.params == ENPART_TYPE_15) {
gSPSegment(POLY_OPA_DISP++, 0x0C, gEmptyDL);
diff --git a/src/overlays/actors/ovl_En_Peehat/z_en_peehat.c b/src/overlays/actors/ovl_En_Peehat/z_en_peehat.c
index 2f4678b8d..045da7fa1 100644
--- a/src/overlays/actors/ovl_En_Peehat/z_en_peehat.c
+++ b/src/overlays/actors/ovl_En_Peehat/z_en_peehat.c
@@ -660,8 +660,9 @@ void func_80898654(EnPeehat* this) {
void func_808986A4(EnPeehat* this, PlayState* play) {
if (this->unk_2B0 == 5) {
- EnBom* bomb = (EnBom*)Actor_Spawn(&play->actorCtx, play, ACTOR_EN_BOM, this->actor.world.pos.x,
- this->actor.world.pos.y, this->actor.world.pos.z, 0, 0, 0x602, 0);
+ EnBom* bomb =
+ (EnBom*)Actor_Spawn(&play->actorCtx, play, ACTOR_EN_BOM, this->actor.world.pos.x, this->actor.world.pos.y,
+ this->actor.world.pos.z, BOMB_EXPLOSIVE_TYPE_BOMB, 0, 0x602, BOMB_TYPE_BODY);
if (bomb != NULL) {
bomb->timer = 0;
@@ -925,7 +926,7 @@ void EnPeehat_Draw(Actor* thisx, PlayState* play) {
Vec3f sp40;
s32 i;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, EnPeehat_OverrideLimbDraw,
(this->actor.params == 0) ? EnPeehat_PostLimbDraw : NULL, &this->actor);
diff --git a/src/overlays/actors/ovl_En_Pm/z_en_pm.c b/src/overlays/actors/ovl_En_Pm/z_en_pm.c
index 088d5c8a4..99e301250 100644
--- a/src/overlays/actors/ovl_En_Pm/z_en_pm.c
+++ b/src/overlays/actors/ovl_En_Pm/z_en_pm.c
@@ -1242,7 +1242,7 @@ s32 func_80AF9008(EnPm* this, PlayState* play, ScheduleOutput* scheduleOutput) {
this->timePath = SubS_GetAdditionalPath(play, sp55, D_80AFB430[scheduleOutput->result]);
}
- if ((door != NULL) && (door->dyna.actor.update != NULL)) {
+ if ((door != NULL) && (door->knobDoor.dyna.actor.update != NULL)) {
if (this->timePath != 0) {
sp4C = Lib_SegmentedToVirtual(this->timePath->points);
Math_Vec3s_ToVec3f(&sp40, &sp4C[0]);
@@ -1251,7 +1251,7 @@ s32 func_80AF9008(EnPm* this, PlayState* play, ScheduleOutput* scheduleOutput) {
Math_Vec3f_Copy(&this->unk_278, &sp34);
this->actor.world.rot.y = Math_Vec3f_Yaw(&sp40, &sp34);
Math_Vec3f_Copy(&this->actor.world.pos, &sp40);
- temp = this->actor.world.rot.y - door->dyna.actor.shape.rot.y;
+ temp = this->actor.world.rot.y - door->knobDoor.dyna.actor.shape.rot.y;
if (ABS_ALT(temp) <= 0x4000) {
this->unk_260 = -0x4B;
} else {
@@ -1704,7 +1704,7 @@ s32 func_80AF9D04(EnPm* this, PlayState* play) {
f32 temp;
if (!SubS_InCsMode(play) && (this->timePathTimeSpeed != 0)) {
- if ((door != NULL) && (door->dyna.actor.update != NULL)) {
+ if ((door != NULL) && (door->knobDoor.dyna.actor.update != NULL)) {
if (((f32)this->unk_36E / this->unk_36C) <= 0.9f) {
door->unk_1A7 = this->unk_260;
} else {
@@ -2181,7 +2181,7 @@ void EnPm_Draw(Actor* thisx, PlayState* play) {
s32 pad;
if (this->unk_258 != 0) {
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
OPEN_DISPS(play->state.gfxCtx);
diff --git a/src/overlays/actors/ovl_En_Po_Fusen/z_en_po_fusen.c b/src/overlays/actors/ovl_En_Po_Fusen/z_en_po_fusen.c
index beffe3bb8..652c19dc7 100644
--- a/src/overlays/actors/ovl_En_Po_Fusen/z_en_po_fusen.c
+++ b/src/overlays/actors/ovl_En_Po_Fusen/z_en_po_fusen.c
@@ -316,7 +316,7 @@ void EnPoFusen_TransformLimbDraw(PlayState* play, s32 limbIndex, Actor* thisx) {
void EnPoFusen_Draw(Actor* thisx, PlayState* play) {
EnPoFusen* this = THIS;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawTransformFlexOpa(play, this->anime.skeleton, this->anime.jointTable, this->anime.dListCount,
EnPoFusen_OverrideLimbDraw, EnPoFusen_PostLimbDraw, EnPoFusen_TransformLimbDraw,
&this->actor);
diff --git a/src/overlays/actors/ovl_En_Po_Sisters/z_en_po_sisters.c b/src/overlays/actors/ovl_En_Po_Sisters/z_en_po_sisters.c
index 35a972dfc..56d0f5326 100644
--- a/src/overlays/actors/ovl_En_Po_Sisters/z_en_po_sisters.c
+++ b/src/overlays/actors/ovl_En_Po_Sisters/z_en_po_sisters.c
@@ -7,7 +7,7 @@
#include "z_en_po_sisters.h"
#include "objects/gameplay_keep/gameplay_keep.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_10 | ACTOR_FLAG_1000 | ACTOR_FLAG_4000)
+#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_10 | ACTOR_FLAG_IGNORE_QUAKE | ACTOR_FLAG_4000)
#define THIS ((EnPoSisters*)thisx)
@@ -243,7 +243,8 @@ void EnPoSisters_MatchPlayerXZ(EnPoSisters* this, PlayState* play) {
f32 dist;
if (this->megCloneId == POE_SISTERS_MEG_REAL || this->actionFunc != EnPoSisters_DamageFlinch) {
- if ((player->meleeWeaponState == 0 || player->meleeWeaponAnimation >= PLAYER_MWA_SPIN_ATTACK_1H) &&
+ if ((player->meleeWeaponState == PLAYER_MELEE_WEAPON_STATE_0 ||
+ player->meleeWeaponAnimation >= PLAYER_MWA_SPIN_ATTACK_1H) &&
((player->actor.world.pos.y - player->actor.floorHeight) < 1.0f)) {
Math_StepToF(&this->megDistToPlayer, 110.0f, 3.0f);
} else {
@@ -1204,8 +1205,8 @@ void EnPoSisters_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
EnPoSisters_UpdateColors(this);
- func_8012C28C(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
if ((this->color.a == 255) || (this->color.a == 0)) {
gDPSetEnvColor(POLY_OPA_DISP++, this->color.r, this->color.g, this->color.b, this->color.a);
diff --git a/src/overlays/actors/ovl_En_Poh/z_en_poh.c b/src/overlays/actors/ovl_En_Poh/z_en_poh.c
index 95bd2d474..4669b1916 100644
--- a/src/overlays/actors/ovl_En_Poh/z_en_poh.c
+++ b/src/overlays/actors/ovl_En_Poh/z_en_poh.c
@@ -4,10 +4,11 @@
* Description: Poe
*/
+#include "prevent_bss_reordering.h"
#include "z_en_poh.h"
#include "objects/object_po/object_po.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_200 | ACTOR_FLAG_1000)
+#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_200 | ACTOR_FLAG_IGNORE_QUAKE)
#define THIS ((EnPoh*)thisx)
@@ -925,7 +926,7 @@ void EnPoh_Draw(Actor* thisx, PlayState* play) {
if ((this->unk_197 == 255) || (this->unk_197 == 0)) {
gfx = POLY_OPA_DISP;
- gSPDisplayList(&gfx[0], &sSetupDL[6 * 25]);
+ gSPDisplayList(&gfx[0], gSetupDLs[SETUPDL_25]);
gDPSetEnvColor(&gfx[1], this->unk_194, this->unk_195, this->unk_196, this->unk_197);
gSPSegment(&gfx[2], 0x08, D_801AEFA0);
@@ -936,7 +937,7 @@ void EnPoh_Draw(Actor* thisx, PlayState* play) {
} else {
gfx = POLY_XLU_DISP;
- gSPDisplayList(&gfx[0], &sSetupDL[6 * 25]);
+ gSPDisplayList(&gfx[0], gSetupDLs[SETUPDL_25]);
gDPSetEnvColor(&gfx[1], 255, 255, 255, this->unk_197);
gSPSegment(&gfx[2], 0x08, D_801AEF88);
@@ -944,7 +945,7 @@ void EnPoh_Draw(Actor* thisx, PlayState* play) {
EnPoh_OverrideLimbDraw, EnPoh_PostLimbDraw, &this->actor, &gfx[3]);
gfx = POLY_OPA_DISP;
- gSPDisplayList(gfx++, &sSetupDL[6 * 25]);
+ gSPDisplayList(gfx++, gSetupDLs[SETUPDL_25]);
}
gDPPipeSync(&gfx[0]);
@@ -985,7 +986,7 @@ void func_80B2F37C(Actor* thisx, PlayState* play) {
if (this->actionFunc == func_80B2DD2C) {
gfx = POLY_OPA_DISP;
- gSPDisplayList(&gfx[0], &sSetupDL[6 * 25]);
+ gSPDisplayList(&gfx[0], gSetupDLs[SETUPDL_25]);
gDPSetEnvColor(&gfx[1], this->unk_198, this->unk_199, this->unk_19A, 255);
func_80B2C910(&sp7C, play);
@@ -997,7 +998,7 @@ void func_80B2F37C(Actor* thisx, PlayState* play) {
POLY_OPA_DISP = &gfx[4];
} else {
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPSegment(
POLY_XLU_DISP++, 0x08,
diff --git a/src/overlays/actors/ovl_En_Pp/z_en_pp.c b/src/overlays/actors/ovl_En_Pp/z_en_pp.c
index 5d1d6935e..ef15618c9 100644
--- a/src/overlays/actors/ovl_En_Pp/z_en_pp.c
+++ b/src/overlays/actors/ovl_En_Pp/z_en_pp.c
@@ -1573,8 +1573,8 @@ void EnPp_Draw(Actor* thisx, PlayState* play) {
f32 scale;
f32 alpha;
- func_8012C2DC(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnPp_OverrideLimbDraw, EnPp_PostLimbDraw, &this->actor);
@@ -1611,7 +1611,7 @@ void EnPp_Draw(Actor* thisx, PlayState* play) {
if ((this->action != EN_PP_ACTION_MASK_DETACH) && (this->action < EN_PP_ACTION_DEAD)) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C448(play->state.gfxCtx);
+ Gfx_SetupDL44_Xlu(play->state.gfxCtx);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 0, 0, 0, 255);
Math_Vec3f_Copy(&pos, &this->actor.world.pos);
diff --git a/src/overlays/actors/ovl_En_Pr/z_en_pr.c b/src/overlays/actors/ovl_En_Pr/z_en_pr.c
index ab47e693f..30fd0ee15 100644
--- a/src/overlays/actors/ovl_En_Pr/z_en_pr.c
+++ b/src/overlays/actors/ovl_En_Pr/z_en_pr.c
@@ -595,8 +595,8 @@ void EnPr_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
if (this->unk_2D2 == 0) {
gDPPipeSync(POLY_OPA_DISP++);
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 a1c2f3f4d..7fe6e3d26 100644
--- a/src/overlays/actors/ovl_En_Pr2/z_en_pr2.c
+++ b/src/overlays/actors/ovl_En_Pr2/z_en_pr2.c
@@ -151,7 +151,7 @@ void EnPr2_Init(Actor* thisx, PlayState* play) {
Actor* parent = this->actor.parent;
if (parent->update != NULL) {
- this->unk_1C8 = ((EnEncount1*)parent)->unk_15A;
+ this->unk_1C8 = ((EnEncount1*)parent)->pathIndex;
this->path = SubS_GetPathByIndex(play, this->unk_1C8, 0x3F);
this->unk_208 = parent->world.rot.z * 20.0f;
if (this->unk_208 < 20.0f) {
@@ -190,8 +190,8 @@ void EnPr2_Destroy(Actor* thisx, PlayState* play) {
if (this->actor.parent != NULL) {
EnEncount1* encount1 = (EnEncount1*)this->actor.parent;
- if ((encount1->actor.update != NULL) && (encount1->unk_14E > 0)) {
- encount1->unk_14E--;
+ if ((encount1->actor.update != NULL) && (encount1->spawnActiveCount > 0)) {
+ encount1->spawnActiveCount--;
}
}
}
@@ -741,7 +741,7 @@ void EnPr2_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
if (this->unk_1F4 == 255) {
gDPPipeSync(POLY_OPA_DISP++);
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 617a5cc73..bbcd28afd 100644
--- a/src/overlays/actors/ovl_En_Pr2/z_en_pr2.h
+++ b/src/overlays/actors/ovl_En_Pr2/z_en_pr2.h
@@ -10,6 +10,8 @@ typedef void (*EnPr2ActionFunc)(struct EnPr2*, PlayState*);
#define ENPR2_GET_F(thisx) ((thisx)->params & 0xF)
#define ENPR2_GET_FF0(thisx) (((thisx)->params >> 4) & 0xFF)
+#define ENPR2_PARAMS(paramF, paramFF0) (((paramF) & 0xF) | (((paramFF0) << 4) & 0xFF0))
+
typedef struct EnPr2 {
/* 0x000 */ Actor actor;
/* 0x144 */ SkelAnime skelAnime;
diff --git a/src/overlays/actors/ovl_En_Prz/z_en_prz.c b/src/overlays/actors/ovl_En_Prz/z_en_prz.c
index e34ffe1f6..d71de14f7 100644
--- a/src/overlays/actors/ovl_En_Prz/z_en_prz.c
+++ b/src/overlays/actors/ovl_En_Prz/z_en_prz.c
@@ -506,7 +506,7 @@ void EnPrz_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
if (this->unk_1EC == 255) {
gDPPipeSync(POLY_OPA_DISP++);
diff --git a/src/overlays/actors/ovl_En_Pst/z_en_pst.c b/src/overlays/actors/ovl_En_Pst/z_en_pst.c
index cef354c70..34ce6bafb 100644
--- a/src/overlays/actors/ovl_En_Pst/z_en_pst.c
+++ b/src/overlays/actors/ovl_En_Pst/z_en_pst.c
@@ -436,7 +436,7 @@ void EnPst_Draw(Actor* thisx, PlayState* play) {
EnPst* this = THIS;
if (this->scheduleResult != POSTBOX_SCH_NONE) {
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnPst_OverrideLimbDraw, NULL, &this->actor);
}
diff --git a/src/overlays/actors/ovl_En_Racedog/z_en_racedog.c b/src/overlays/actors/ovl_En_Racedog/z_en_racedog.c
index 3ffde38cd..80986adf4 100644
--- a/src/overlays/actors/ovl_En_Racedog/z_en_racedog.c
+++ b/src/overlays/actors/ovl_En_Racedog/z_en_racedog.c
@@ -9,14 +9,13 @@
*/
#include "z_en_racedog.h"
+#include "overlays/actors/ovl_En_Aob_01/z_en_aob_01.h"
#include "overlays/actors/ovl_En_Dg/z_en_dg.h"
#define FLAGS (ACTOR_FLAG_10 | ACTOR_FLAG_80000000)
#define THIS ((EnRacedog*)thisx)
-//! TODO: this file require macros for its uses of weekEventReg
-
void EnRacedog_Init(Actor* thisx, PlayState* play);
void EnRacedog_Destroy(Actor* thisx, PlayState* play);
void EnRacedog_Update(Actor* thisx, PlayState* play);
@@ -317,7 +316,7 @@ void EnRacedog_Init(Actor* thisx, PlayState* play) {
this->path = SubS_GetPathByIndex(play, ENRACEDOG_GET_PATH(&this->actor), 0x3F);
Actor_SetScale(&this->actor, 0.0075f);
this->actor.gravity = -3.0f;
- if (ENRACEDOG_GET_INDEX(&this->actor) < 14) {
+ if (ENRACEDOG_GET_INDEX(&this->actor) < RACEDOG_COUNT) {
this->index = ENRACEDOG_GET_INDEX(&this->actor);
} else {
Actor_Kill(&this->actor);
@@ -353,7 +352,7 @@ void EnRacedog_Init(Actor* thisx, PlayState* play) {
this->actor.flags |= ACTOR_FLAG_10;
this->actor.flags |= ACTOR_FLAG_20;
- sSelectedDogInfo = sDogInfo[(s16)((gSaveContext.eventInf[0] & 0xF8) >> 3)];
+ sSelectedDogInfo = sDogInfo[(s16)GET_EVENTINF_DOG_RACE_SELECTED_DOG_INDEX];
this->selectedDogIndex = sSelectedDogInfo.index;
EnRacedog_ChangeAnim(&this->skelAnime, sAnimationInfo, RACEDOG_ANIM_IDLE);
@@ -439,15 +438,8 @@ void EnRacedog_Race(EnRacedog* this, PlayState* play) {
* or an intentional choice to introduce a bit of extra variance to the race.
*/
void EnRacedog_UpdateTextId(EnRacedog* this) {
- // Assuming that the weekEventRegs haven't been tampered with, then this will produce a text ID in the
- // range of 0x3539 to 0x3546.
- if (this->index % 2) {
- sDogInfo[this->index].textId =
- (((gSaveContext.save.saveInfo.weekEventReg[42 + (this->index / 2)]) & 0xF0) >> 4) + 0x3539;
- } else {
- sDogInfo[this->index].textId =
- ((gSaveContext.save.saveInfo.weekEventReg[42 + (this->index / 2)]) & 0x0F) + 0x3539;
- }
+ // This will produce a text ID in the range of 0x3539 to 0x3546.
+ sDogInfo[this->index].textId = GET_WEEKEVENTREG_DOG_RACE_TEXT(this->index, 0x3539);
// As a sanity check, this makes sure the text ID is something in the expected range of 0x3539 to 0x3546.
if ((sDogInfo[this->index].textId > 0x3546) || (sDogInfo[this->index].textId < 0x3539)) {
@@ -593,7 +585,7 @@ void EnRacedog_CheckForFinish(EnRacedog* this) {
this->raceStatus = RACEDOG_RACE_STATUS_FINISHED;
if (this->index == this->selectedDogIndex) {
- gSaveContext.eventInf[0] = (gSaveContext.eventInf[0] & 7) | (sNumberOfDogsFinished * 8);
+ SET_EVENTINF_DOG_RACE_RACE_STANDING(sNumberOfDogsFinished);
}
}
}
@@ -733,7 +725,7 @@ void EnRacedog_DrawSelectionArrow(EnRacedog* this, PlayState* play) {
if (shouldDrawSelectionArrow) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
EnRacedog_UpdateSelectionArrow(this);
Matrix_SetTranslateRotateYXZ(this->actor.world.pos.x, this->actor.world.pos.y + 40.0f, this->actor.world.pos.z,
&rotation);
@@ -774,7 +766,7 @@ void EnRacedog_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gDPPipeSync(POLY_OPA_DISP++);
diff --git a/src/overlays/actors/ovl_En_Racedog/z_en_racedog.h b/src/overlays/actors/ovl_En_Racedog/z_en_racedog.h
index 9d49ea4c2..a8cf2a9f9 100644
--- a/src/overlays/actors/ovl_En_Racedog/z_en_racedog.h
+++ b/src/overlays/actors/ovl_En_Racedog/z_en_racedog.h
@@ -6,6 +6,7 @@
#define ENRACEDOG_GET_INDEX(thisx) (((thisx)->params & 0x3E0) >> 5)
#define ENRACEDOG_GET_PATH(thisx) (((thisx)->params & 0xFC00) >> 10)
+#define ENRACEDOG_PARAMS(index, path) ((index << 5) | (path))
/**
* The main point of this seems to be some very light anti-cheat detection. The dog
diff --git a/src/overlays/actors/ovl_En_Raf/z_en_raf.c b/src/overlays/actors/ovl_En_Raf/z_en_raf.c
index 6a3f1af5a..0c344e75f 100644
--- a/src/overlays/actors/ovl_En_Raf/z_en_raf.c
+++ b/src/overlays/actors/ovl_En_Raf/z_en_raf.c
@@ -873,8 +873,8 @@ void EnRaf_TransformLimbDraw(PlayState* play2, s32 limbIndex, Actor* thisx) {
void EnRaf_Draw(Actor* thisx, PlayState* play) {
EnRaf* this = THIS;
- func_8012C28C(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
SkelAnime_DrawTransformFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable,
this->skelAnime.dListCount, NULL, NULL, EnRaf_TransformLimbDraw, &this->dyna.actor);
@@ -948,7 +948,7 @@ void EnRaf_DrawEffects(EnRaf* this, PlayState* play) {
OPEN_DISPS(gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
for (i = 0; i < ARRAY_COUNT(this->effects); i++, effect++) {
if (effect->isEnabled) {
Matrix_Translate(effect->pos.x, effect->pos.y, effect->pos.z, MTXMODE_NEW);
diff --git a/src/overlays/actors/ovl_En_Rail_Skb/z_en_rail_skb.c b/src/overlays/actors/ovl_En_Rail_Skb/z_en_rail_skb.c
index 10d654cc7..a280e9bfa 100644
--- a/src/overlays/actors/ovl_En_Rail_Skb/z_en_rail_skb.c
+++ b/src/overlays/actors/ovl_En_Rail_Skb/z_en_rail_skb.c
@@ -1143,7 +1143,7 @@ void EnRailSkb_Draw(Actor* thisx, PlayState* play) {
EnRailSkb* this = THIS;
this->limbCount = 0;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, EnRailSkb_OverrideLimbDraw,
EnRailSkb_PostLimbDraw, &this->actor);
if (this->drawDmgEffTimer > 0) {
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 853dbfd61..893062fbd 100644
--- a/src/overlays/actors/ovl_En_Railgibud/z_en_railgibud.c
+++ b/src/overlays/actors/ovl_En_Railgibud/z_en_railgibud.c
@@ -1076,7 +1076,7 @@ void EnRailgibud_Draw(Actor* thisx, PlayState* play) {
this->limbIndex = 0;
if (this->actor.shape.shadowAlpha == 255) {
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, this->actor.shape.shadowAlpha);
gSPSegment(POLY_OPA_DISP++, 0x08, D_801AEFA0);
@@ -1085,7 +1085,7 @@ void EnRailgibud_Draw(Actor* thisx, PlayState* play) {
SkelAnime_DrawFlex(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnRailgibud_OverrideLimbDraw, EnRailgibud_PostLimbDraw, &this->actor, POLY_OPA_DISP);
} else {
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gDPSetEnvColor(POLY_XLU_DISP++, 0, 0, 0, this->actor.shape.shadowAlpha);
gSPSegment(POLY_XLU_DISP++, 0x08, D_801AEF88);
diff --git a/src/overlays/actors/ovl_En_Rat/z_en_rat.c b/src/overlays/actors/ovl_En_Rat/z_en_rat.c
index 81898dfa6..e145291f6 100644
--- a/src/overlays/actors/ovl_En_Rat/z_en_rat.c
+++ b/src/overlays/actors/ovl_En_Rat/z_en_rat.c
@@ -740,8 +740,9 @@ void EnRat_Bounced(EnRat* this, PlayState* play) {
}
void EnRat_Explode(EnRat* this, PlayState* play) {
- EnBom* bomb = (EnBom*)Actor_Spawn(&play->actorCtx, play, ACTOR_EN_BOM, this->actor.world.pos.x,
- this->actor.world.pos.y, this->actor.world.pos.z, 0, 0, 0, BOMB_TYPE_BODY);
+ EnBom* bomb =
+ (EnBom*)Actor_Spawn(&play->actorCtx, play, ACTOR_EN_BOM, this->actor.world.pos.x, this->actor.world.pos.y,
+ this->actor.world.pos.z, BOMB_EXPLOSIVE_TYPE_BOMB, 0, 0, BOMB_TYPE_BODY);
if (bomb != NULL) {
bomb->timer = 0;
@@ -960,8 +961,8 @@ void EnRat_PostLimbDraw(PlayState* play2, s32 limbIndex, Gfx** dList, Vec3s* rot
void EnRat_Draw(Actor* thisx, PlayState* play) {
EnRat* this = THIS;
- func_8012C28C(play->state.gfxCtx);
- func_8012C974(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ Gfx_SetupDL60_XluNoCD(play->state.gfxCtx);
func_800B8050(&this->actor, play, 0);
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnRat_OverrideLimbDraw, EnRat_PostLimbDraw, &this->actor);
diff --git a/src/overlays/actors/ovl_En_Rd/z_en_rd.c b/src/overlays/actors/ovl_En_Rd/z_en_rd.c
index b8e8e4139..01b9cdd6d 100644
--- a/src/overlays/actors/ovl_En_Rd/z_en_rd.c
+++ b/src/overlays/actors/ovl_En_Rd/z_en_rd.c
@@ -1338,7 +1338,7 @@ void EnRd_Draw(Actor* thisx, PlayState* play) {
this->limbIndex = 0;
if (this->alpha == 255) {
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, this->alpha);
gSPSegment(POLY_OPA_DISP++, 0x08, D_801AEFA0);
@@ -1349,7 +1349,7 @@ void EnRd_Draw(Actor* thisx, PlayState* play) {
func_800BC620(&pos, &sScale, 255, play);
} else {
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gDPSetEnvColor(POLY_XLU_DISP++, 0, 0, 0, this->alpha);
gSPSegment(POLY_XLU_DISP++, 0x08, D_801AEF88);
diff --git a/src/overlays/actors/ovl_En_Recepgirl/z_en_recepgirl.c b/src/overlays/actors/ovl_En_Recepgirl/z_en_recepgirl.c
index 64313c4be..3632efa2a 100644
--- a/src/overlays/actors/ovl_En_Recepgirl/z_en_recepgirl.c
+++ b/src/overlays/actors/ovl_En_Recepgirl/z_en_recepgirl.c
@@ -205,7 +205,7 @@ void EnRecepgirl_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, sEyeTextures[this->eyeTexIndex]);
SkelAnime_DrawTransformFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable,
diff --git a/src/overlays/actors/ovl_En_Rg/z_en_rg.c b/src/overlays/actors/ovl_En_Rg/z_en_rg.c
index d552c5605..a3a026f2b 100644
--- a/src/overlays/actors/ovl_En_Rg/z_en_rg.c
+++ b/src/overlays/actors/ovl_En_Rg/z_en_rg.c
@@ -164,12 +164,12 @@ void func_80BF3920(EnRgStruct* ptr, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
for (i = 0; i < 32; i++, ptr++) {
if ((ptr->unk_00 >= 4) && (ptr->unk_00 < 7)) {
if (!phi_fp) {
- POLY_XLU_DISP = Gfx_CallSetupDL(POLY_XLU_DISP, 0);
+ POLY_XLU_DISP = Gfx_SetupDL(POLY_XLU_DISP, SETUPDL_0);
gSPDisplayList(POLY_XLU_DISP++, gGoronDustMaterialDL);
phi_fp = true;
}
@@ -589,8 +589,8 @@ void func_80BF4AB8(EnRg* this, PlayState* play) {
this->unk_326 = 0x28;
if (player->stateFlags3 & PLAYER_STATE3_1000) {
player->linearVelocity *= 0.5f;
- player->unk_B08[0] = player->linearVelocity;
- player->unk_B08[1] += player->linearVelocity * 0.05f;
+ player->unk_B08 = player->linearVelocity;
+ player->unk_B0C += player->linearVelocity * 0.05f;
if (BINANG_SUB(this->actor.yawTowardsPlayer, player->currentYaw) > 0) {
player->currentYaw += 0x2000;
} else {
@@ -804,7 +804,7 @@ void EnRg_Update(Actor* thisx, PlayState* play) {
void func_80BF547C(EnRg* this, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
Matrix_Translate(this->actor.world.pos.x, this->actor.world.pos.y + this->actor.shape.yOffset,
this->actor.world.pos.z, MTXMODE_NEW);
Matrix_RotateYS(this->actor.shape.rot.y, MTXMODE_APPLY);
@@ -856,7 +856,7 @@ void EnRg_Draw(Actor* thisx, PlayState* play) {
if (!(this->unk_310 & 0x10)) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(D_80BF59F8[this->unk_31E]));
diff --git a/src/overlays/actors/ovl_En_Rr/z_en_rr.c b/src/overlays/actors/ovl_En_Rr/z_en_rr.c
index 85086d228..cb16e5f39 100644
--- a/src/overlays/actors/ovl_En_Rr/z_en_rr.c
+++ b/src/overlays/actors/ovl_En_Rr/z_en_rr.c
@@ -885,7 +885,7 @@ void EnRr_Draw(Actor* thisx, PlayState* play2) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x0C, mtx);
gSPSegment(POLY_OPA_DISP++, 0x08,
diff --git a/src/overlays/actors/ovl_En_Rsn/z_en_rsn.c b/src/overlays/actors/ovl_En_Rsn/z_en_rsn.c
index 4f6dd1dc1..0d9ada5e0 100644
--- a/src/overlays/actors/ovl_En_Rsn/z_en_rsn.c
+++ b/src/overlays/actors/ovl_En_Rsn/z_en_rsn.c
@@ -86,9 +86,11 @@ void EnRsn_Draw(Actor* thisx, PlayState* play) {
EnRsn* this = THIS;
OPEN_DISPS(play->state.gfxCtx);
- func_8012C5B0(play->state.gfxCtx);
+
+ Gfx_SetupDL37_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(gBombShopkeeperEyeTex));
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnRsn_OverrideLimbDraw, EnRsn_PostLimbDraw, &this->actor);
+
CLOSE_DISPS(play->state.gfxCtx);
}
diff --git a/src/overlays/actors/ovl_En_Ru/z_en_ru.c b/src/overlays/actors/ovl_En_Ru/z_en_ru.c
index 527d41b99..b67ca2141 100644
--- a/src/overlays/actors/ovl_En_Ru/z_en_ru.c
+++ b/src/overlays/actors/ovl_En_Ru/z_en_ru.c
@@ -320,7 +320,7 @@ void EnRu_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gDPPipeSync(POLY_OPA_DISP++);
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 e270f1515..d95337728 100644
--- a/src/overlays/actors/ovl_En_Ruppecrow/z_en_ruppecrow.c
+++ b/src/overlays/actors/ovl_En_Ruppecrow/z_en_ruppecrow.c
@@ -668,7 +668,7 @@ void EnRuppecrow_Update(Actor* thisx, PlayState* play) {
void EnRuppecrow_Draw(Actor* thisx, PlayState* play) {
EnRuppecrow* this = THIS;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount, NULL,
NULL, &this->actor);
}
diff --git a/src/overlays/actors/ovl_En_Rz/z_en_rz.c b/src/overlays/actors/ovl_En_Rz/z_en_rz.c
index c870027bb..e7eaaed99 100644
--- a/src/overlays/actors/ovl_En_Rz/z_en_rz.c
+++ b/src/overlays/actors/ovl_En_Rz/z_en_rz.c
@@ -446,7 +446,7 @@ void func_80BFC078(EnRz* this, PlayState* play) {
sp28.x = this->actor.projectedPos.x;
sp28.y = this->actor.projectedPos.y;
sp28.z = this->actor.projectedPos.z;
- func_801A1FB4(3, &sp28, NA_BGM_ROSA_SISTERS, 900.0f);
+ func_801A1FB4(SEQ_PLAYER_BGM_SUB, &sp28, NA_BGM_ROSA_SISTERS, 900.0f);
}
}
@@ -547,7 +547,7 @@ void func_80BFC3F8(EnRz* this, PlayState* play) {
bgmPos.x = this->actor.projectedPos.x;
bgmPos.y = this->actor.projectedPos.y;
bgmPos.z = this->actor.projectedPos.z;
- func_801A1FB4(3, &bgmPos, NA_BGM_ROSA_SISTERS, 900.0f);
+ func_801A1FB4(SEQ_PLAYER_BGM_SUB, &bgmPos, NA_BGM_ROSA_SISTERS, 900.0f);
}
}
}
@@ -686,7 +686,7 @@ void EnRz_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
if (EN_RZ_GET_SISTER(&this->actor) == EN_RZ_JUDO) {
AnimatedMat_DrawStepOpa(play, Lib_SegmentedToVirtual(&object_rz_Matanimheader_00D768), 0);
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 14904e5b7..27c3279e6 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
@@ -1435,9 +1435,10 @@ void EnSGoro_DrawUnrolled(EnSGoro* this, PlayState* play) {
s32 pad;
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
- gSPSegment(POLY_OPA_DISP++, 0x8, Lib_SegmentedToVirtual(sEyeTextures[this->eyeTexIndex]));
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+
+ gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sEyeTextures[this->eyeTexIndex]));
gDPPipeSync(POLY_OPA_DISP++);
SkelAnime_DrawTransformFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable,
@@ -1449,7 +1450,8 @@ void EnSGoro_DrawUnrolled(EnSGoro* this, PlayState* play) {
void EnSGoro_DrawRolledUp(EnSGoro* this, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
Matrix_Translate(this->actor.world.pos.x, this->actor.world.pos.y + this->actor.shape.yOffset,
this->actor.world.pos.z, MTXMODE_NEW);
diff --git a/src/overlays/actors/ovl_En_Sc_Ruppe/z_en_sc_ruppe.c b/src/overlays/actors/ovl_En_Sc_Ruppe/z_en_sc_ruppe.c
index be449e0a3..c135f63da 100644
--- a/src/overlays/actors/ovl_En_Sc_Ruppe/z_en_sc_ruppe.c
+++ b/src/overlays/actors/ovl_En_Sc_Ruppe/z_en_sc_ruppe.c
@@ -181,7 +181,7 @@ void EnScRuppe_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
func_800B8050(&this->actor, play, 0);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sRupeeInfo[this->ruppeIndex].tex));
diff --git a/src/overlays/actors/ovl_En_Scopecoin/z_en_scopecoin.c b/src/overlays/actors/ovl_En_Scopecoin/z_en_scopecoin.c
index d2a9d525e..4ef4fdd46 100644
--- a/src/overlays/actors/ovl_En_Scopecoin/z_en_scopecoin.c
+++ b/src/overlays/actors/ovl_En_Scopecoin/z_en_scopecoin.c
@@ -90,7 +90,7 @@ void EnScopecoin_Draw(Actor* thisx, PlayState* play) {
EnScopecoin* this = THIS;
GraphicsContext* gfxCtx = play->state.gfxCtx;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
func_800B8050(&this->actor, play, 0);
OPEN_DISPS(gfxCtx);
diff --git a/src/overlays/actors/ovl_En_Scopecrow/z_en_scopecrow.c b/src/overlays/actors/ovl_En_Scopecrow/z_en_scopecrow.c
index 321c790d1..525696ead 100644
--- a/src/overlays/actors/ovl_En_Scopecrow/z_en_scopecrow.c
+++ b/src/overlays/actors/ovl_En_Scopecrow/z_en_scopecrow.c
@@ -354,7 +354,7 @@ void EnScopecrow_Update(Actor* thisx, PlayState* play) {
void EnScopecrow_Draw(Actor* thisx, PlayState* play) {
EnScopecrow* this = THIS;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount, NULL,
NULL, &this->actor);
}
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 07e2646a0..46add654a 100644
--- a/src/overlays/actors/ovl_En_Scopenuts/z_en_scopenuts.c
+++ b/src/overlays/actors/ovl_En_Scopenuts/z_en_scopenuts.c
@@ -823,7 +823,7 @@ void EnScopenuts_TransformLimbDraw(PlayState* play, s32 limbIndex, Actor* thisx)
void EnScopenuts_Draw(Actor* thisx, PlayState* play) {
EnScopenuts* this = THIS;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawTransformFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable,
this->skelAnime.dListCount, EnScopenuts_OverrideLimbDraw, EnScopenuts_PostLimbDraw,
EnScopenuts_TransformLimbDraw, &this->actor);
diff --git a/src/overlays/actors/ovl_En_Sda/z_en_sda.c b/src/overlays/actors/ovl_En_Sda/z_en_sda.c
index 8835d92da..3390f4f0c 100644
--- a/src/overlays/actors/ovl_En_Sda/z_en_sda.c
+++ b/src/overlays/actors/ovl_En_Sda/z_en_sda.c
@@ -323,7 +323,7 @@ void func_80947668(u8* shadowTexture, Player* player, PlayState* play) {
OPEN_DISPS(gfxCtx);
- func_8012C448(play->state.gfxCtx);
+ Gfx_SetupDL44_Xlu(play->state.gfxCtx);
gDPSetPrimColor(POLY_XLU_DISP++, 0x00, 0x00, 0, 0, 0, (BREG(52) + 50));
gDPSetEnvColor(POLY_XLU_DISP++, 0, 0, 0, 0);
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 538f7d304..1e1f19d70 100644
--- a/src/overlays/actors/ovl_En_Sekihi/z_en_sekihi.c
+++ b/src/overlays/actors/ovl_En_Sekihi/z_en_sekihi.c
@@ -177,12 +177,12 @@ void EnSekihi_Draw(Actor* thisx, PlayState* play) {
if (this->xluDList != NULL) {
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPDisplayList(POLY_XLU_DISP++, this->xluDList);
}
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPDisplayList(POLY_OPA_DISP++, this->opaDList);
CLOSE_DISPS(play->state.gfxCtx);
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 871bb85a8..5dcdeaa8e 100644
--- a/src/overlays/actors/ovl_En_Sellnuts/z_en_sellnuts.c
+++ b/src/overlays/actors/ovl_En_Sellnuts/z_en_sellnuts.c
@@ -1138,7 +1138,7 @@ void EnSellnuts_TransformLimbDraw(PlayState* play, s32 limbIndex, Actor* thisx)
void EnSellnuts_Draw(Actor* thisx, PlayState* play) {
EnSellnuts* this = THIS;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawTransformFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable,
this->skelAnime.dListCount, EnSellnuts_OverrideLimbDraw, EnSellnuts_PostLimbDraw,
EnSellnuts_TransformLimbDraw, &this->actor);
diff --git a/src/overlays/actors/ovl_En_Shn/z_en_shn.c b/src/overlays/actors/ovl_En_Shn/z_en_shn.c
index bdd5b787f..643509515 100644
--- a/src/overlays/actors/ovl_En_Shn/z_en_shn.c
+++ b/src/overlays/actors/ovl_En_Shn/z_en_shn.c
@@ -436,7 +436,7 @@ void EnShn_TransformLimbDraw(PlayState* play, s32 limbIndex, Actor* thisx) {
void EnShn_Draw(Actor* thisx, PlayState* play) {
EnShn* this = THIS;
- func_8012C5B0(play->state.gfxCtx);
+ Gfx_SetupDL37_Opa(play->state.gfxCtx);
SkelAnime_DrawTransformFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable,
this->skelAnime.dListCount, EnShn_OverrideLimbDraw, EnShn_PostLimbDraw,
EnShn_TransformLimbDraw, &this->actor);
diff --git a/src/overlays/actors/ovl_En_Skb/z_en_skb.c b/src/overlays/actors/ovl_En_Skb/z_en_skb.c
index 735111a2b..cf829bda0 100644
--- a/src/overlays/actors/ovl_En_Skb/z_en_skb.c
+++ b/src/overlays/actors/ovl_En_Skb/z_en_skb.c
@@ -1131,7 +1131,7 @@ void EnSkb_Draw(Actor* thisx, PlayState* play) {
EnSkb* this = THIS;
this->limbCount = 0;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, EnSkb_OverrideLimbDraw,
EnSkb_PostLimbDraw, &this->actor);
if (this->drawDmgEffTimer > 0) {
diff --git a/src/overlays/actors/ovl_En_Slime/z_en_slime.c b/src/overlays/actors/ovl_En_Slime/z_en_slime.c
index 3aab4b3ce..8d7a0e071 100644
--- a/src/overlays/actors/ovl_En_Slime/z_en_slime.c
+++ b/src/overlays/actors/ovl_En_Slime/z_en_slime.c
@@ -1168,8 +1168,8 @@ void EnSlime_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
func_800B8118(&this->actor, play, 0);
if (this->iceBlockTimer != ICE_BLOCK_UNUSED) {
gSPSegment(POLY_XLU_DISP++, 10, D_801AEFA0);
@@ -1229,7 +1229,7 @@ void EnSlime_Draw(Actor* thisx, PlayState* play) {
if ((this->actor.params != EN_SLIME_TYPE_BLUE) && (this->actor.scale.x > 0.0f)) {
POLY_OPA_DISP = Play_SetFog(play, POLY_OPA_DISP);
- POLY_OPA_DISP = func_8012C724(POLY_OPA_DISP);
+ POLY_OPA_DISP = Gfx_SetupDL66(POLY_OPA_DISP);
Matrix_Translate(this->actor.world.pos.x, this->actor.world.pos.y + (2000.0f * this->actor.scale.y),
this->actor.world.pos.z, MTXMODE_NEW);
diff --git a/src/overlays/actors/ovl_En_Snowman/z_en_snowman.c b/src/overlays/actors/ovl_En_Snowman/z_en_snowman.c
index baf3ccdfa..5a65c1094 100644
--- a/src/overlays/actors/ovl_En_Snowman/z_en_snowman.c
+++ b/src/overlays/actors/ovl_En_Snowman/z_en_snowman.c
@@ -1182,7 +1182,7 @@ void EnSnowman_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s*
void EnSnowman_Draw(Actor* thisx, PlayState* play) {
EnSnowman* this = THIS;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount, NULL,
EnSnowman_PostLimbDraw, &this->actor);
Actor_DrawDamageEffects(play, &this->actor, this->bodyPartsPos, ARRAY_COUNT(this->bodyPartsPos),
@@ -1192,7 +1192,7 @@ void EnSnowman_Draw(Actor* thisx, PlayState* play) {
void EnSnowman_DrawSnowPile(Actor* thisx, PlayState* play) {
EnSnowman* this = THIS;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawFlexOpa(play, this->snowPileSkelAnime.skeleton, this->snowPileSkelAnime.jointTable,
this->snowPileSkelAnime.dListCount, NULL, NULL, &this->actor);
}
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 dc5de761c..ac97532a3 100644
--- a/src/overlays/actors/ovl_En_Sob1/z_en_sob1.c
+++ b/src/overlays/actors/ovl_En_Sob1/z_en_sob1.c
@@ -1501,7 +1501,7 @@ void EnSob1_DrawCursor(PlayState* play, EnSob1* this, f32 x, f32 y, f32 z, u8 dr
OPEN_DISPS(play->state.gfxCtx);
if (drawCursor != 0) {
- func_8012C654(play->state.gfxCtx);
+ Gfx_SetupDL39_Overlay(play->state.gfxCtx);
gDPSetPrimColor(OVERLAY_DISP++, 0, 0, this->cursorColor.r, this->cursorColor.g, this->cursorColor.b,
this->cursorColor.a);
gDPLoadTextureBlock_4b(OVERLAY_DISP++, gSelectionCursorTex, G_IM_FMT_IA, 16, 16, 0, G_TX_MIRROR | G_TX_WRAP,
@@ -1563,7 +1563,7 @@ void EnSob1_DrawStickDirectionPrompt(PlayState* play, EnSob1* this) {
OPEN_DISPS(play->state.gfxCtx);
if (drawStickRightPrompt || drawStickLeftPrompt) {
- func_8012C654(play->state.gfxCtx);
+ Gfx_SetupDL39_Overlay(play->state.gfxCtx);
gDPSetCombineMode(OVERLAY_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
gDPLoadTextureBlock(OVERLAY_DISP++, gArrowCursorTex, G_IM_FMT_IA, G_IM_SIZ_8b, 16, 24, 0,
G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, 4, G_TX_NOMASK, G_TX_NOLOD,
@@ -1647,7 +1647,7 @@ void EnSob1_ZoraShopkeeper_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 255);
gSPSegment(POLY_OPA_DISP++, 0x0C, EnSob1_EndDList(play->state.gfxCtx));
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sZoraShopkeeperEyeTextures[this->eyeTexIndex]));
@@ -1672,7 +1672,7 @@ void EnSob1_GoronShopkeeper_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sGoronShopkeeperEyeTextures[this->eyeTexIndex]));
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount, NULL,
NULL, &this->actor);
@@ -1695,7 +1695,7 @@ void EnSob1_BombShopkeeper_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(gBombShopkeeperEyeTex));
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnSob1_BombShopkeeper_OverrideLimbDraw, EnSob1_BombShopkeeper_PostLimbDraw, &this->actor);
@@ -1707,7 +1707,7 @@ void EnSob1_BombShopkeeper_Draw(Actor* thisx, PlayState* play) {
EnSob1_DrawCursor(play, this, this->cursorPos.x, this->cursorPos.y, this->cursorPos.z, this->drawCursor);
EnSob1_DrawStickDirectionPrompt(play, this);
frames = play->gameplayFrames;
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
Matrix_ReplaceRotation(&play->billboardMtxF);
Matrix_Scale(1.0f, 1.0f, 1.0f, MTXMODE_APPLY);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
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 71eade542..358a8eeec 100644
--- a/src/overlays/actors/ovl_En_Ssh/z_en_ssh.c
+++ b/src/overlays/actors/ovl_En_Ssh/z_en_ssh.c
@@ -708,11 +708,11 @@ void EnSsh_Talk(EnSsh* this, PlayState* play) {
void func_809756D0(EnSsh* this, PlayState* play) {
u16 nextTextId;
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_SWAMP_SPIDER_HOUSE_TALKED)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_TALKED_SWAMP_SPIDER_HOUSE_MAN)) {
nextTextId = 0x914; // In here, cursed spiders, defeat them to make me normal
} else {
nextTextId = 0x910; // Help me! I am not a monster, I was cursed this way
- SET_WEEKEVENTREG(WEEKEVENTREG_SWAMP_SPIDER_HOUSE_TALKED);
+ SET_WEEKEVENTREG(WEEKEVENTREG_TALKED_SWAMP_SPIDER_HOUSE_MAN);
}
Message_StartTextbox(play, nextTextId, &this->actor);
}
@@ -926,7 +926,7 @@ void EnSsh_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, SEGMENTED_TO_VIRTUAL(D_80976178[this->blinkState]));
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 994a455a6..e8b67451c 100644
--- a/src/overlays/actors/ovl_En_St/z_en_st.c
+++ b/src/overlays/actors/ovl_En_St/z_en_st.c
@@ -246,7 +246,7 @@ void func_808A54B0(EnSt* this, PlayState* play) {
gSPSegment(POLY_XLU_DISP++, 0x06, play->objectCtx.status[this->unk_2C0].segment);
- func_8012C2DC(play->state.gfxCtx);
+ 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);
Matrix_RotateYS(this->actor.shape.rot.y, MTXMODE_APPLY);
Matrix_Scale(0.06f, 0.12f, 0.06f, MTXMODE_APPLY);
@@ -924,11 +924,11 @@ void func_808A7478(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
if (func_808A6A3C(this)) {
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
POLY_XLU_DISP = SkelAnime_Draw(play, this->skelAnime.skeleton, this->skelAnime.jointTable,
EnSt_OverrideLimbDraw, NULL, &this->actor, POLY_XLU_DISP);
} else {
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
POLY_OPA_DISP = SkelAnime_Draw(play, this->skelAnime.skeleton, this->skelAnime.jointTable,
EnSt_OverrideLimbDraw, NULL, &this->actor, POLY_OPA_DISP);
}
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 f10d387d1..3908e863f 100644
--- a/src/overlays/actors/ovl_En_Sth/z_en_sth.c
+++ b/src/overlays/actors/ovl_En_Sth/z_en_sth.c
@@ -148,7 +148,7 @@ void EnSth_Init(Actor* thisx, PlayState* play) {
}
this->actor.textId = 0;
if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_RECEIVED_MASK_OF_TRUTH) ||
- !CHECK_WEEKEVENTREG(WEEKEVENTREG_SWAMP_SPIDER_HOUSE_TALKED)) {
+ !CHECK_WEEKEVENTREG(WEEKEVENTREG_TALKED_SWAMP_SPIDER_HOUSE_MAN)) {
this->sthFlags |= STH_FLAG_DRAW_MASK_OF_TRUTH;
}
break;
@@ -479,7 +479,7 @@ void EnSth_GetInitialSwampSpiderHouseText(EnSth* this, PlayState* play) {
nextTextId = 0x90F; // (does not exist)
EnSth_ChangeAnim(this, STH_ANIM_TALK);
} else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_RECEIVED_MASK_OF_TRUTH)) {
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_SWAMP_SPIDER_HOUSE_TALKED)) {
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_TALKED_SWAMP_SPIDER_HOUSE_MAN)) {
nextTextId = 0x91B; // As soon as I calm down, getting rid of it
} else {
nextTextId = 0x918; // I've had enough of this, going home
@@ -525,7 +525,7 @@ void EnSth_SwampSpiderHouseGiveMask(EnSth* this, PlayState* play) {
} else {
this->sthFlags &= ~STH_FLAG_DRAW_MASK_OF_TRUTH;
// This flag is used to keep track if the player has already spoken to the actor, triggering secondary dialogue.
- SET_WEEKEVENTREG(WEEKEVENTREG_SWAMP_SPIDER_HOUSE_TALKED);
+ SET_WEEKEVENTREG(WEEKEVENTREG_TALKED_SWAMP_SPIDER_HOUSE_MAN);
Actor_OfferGetItem(&this->actor, play, GI_MASK_TRUTH, 10000.0f, 50.0f);
}
}
@@ -566,7 +566,7 @@ void EnSth_HandleSwampSpiderHouseConversation(EnSth* this, PlayState* play) {
case 0x91A: // Someone gave me this mask and said it would make me rich, getting rid of it
SET_WEEKEVENTREG(WEEKEVENTREG_RECEIVED_MASK_OF_TRUTH);
- CLEAR_WEEKEVENTREG(WEEKEVENTREG_SWAMP_SPIDER_HOUSE_TALKED);
+ CLEAR_WEEKEVENTREG(WEEKEVENTREG_TALKED_SWAMP_SPIDER_HOUSE_MAN);
case 0x902: // (does not exist)
case 0x903: // (does not exist)
@@ -758,7 +758,7 @@ void EnSth_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08,
Gfx_EnvColor(play->state.gfxCtx, sShirtColors[1].r, sShirtColors[1].g, sShirtColors[1].b, 255));
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 ba6d72cb6..723f7634f 100644
--- a/src/overlays/actors/ovl_En_Sth2/z_en_sth2.c
+++ b/src/overlays/actors/ovl_En_Sth2/z_en_sth2.c
@@ -114,7 +114,7 @@ void EnSth2_Draw(Actor* thisx, PlayState* play2) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08,
Gfx_EnvColor(play->state.gfxCtx, sEnvColors[1].r, sEnvColors[1].g, sEnvColors[1].b, 255));
gSPSegment(POLY_OPA_DISP++, 0x09, Gfx_EnvColor(play->state.gfxCtx, 90, 110, 130, 255));
diff --git a/src/overlays/actors/ovl_En_Stone_heishi/z_en_stone_heishi.c b/src/overlays/actors/ovl_En_Stone_heishi/z_en_stone_heishi.c
index 1692e1461..b89976faf 100644
--- a/src/overlays/actors/ovl_En_Stone_heishi/z_en_stone_heishi.c
+++ b/src/overlays/actors/ovl_En_Stone_heishi/z_en_stone_heishi.c
@@ -483,7 +483,7 @@ void EnStoneheishi_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec
Gfx* gfx;
if ((limbIndex == SOLDIER_LIMB_LEFT_HAND) && (this->bottleDisplay != EN_STONE_BOTTLE_NONE)) {
- gfx = func_8012C2B4(*gfxp);
+ gfx = Gfx_SetupDL71(*gfxp);
sLeftHandPos.x = 320.0f;
sLeftHandPos.y = 210.0f;
@@ -520,13 +520,13 @@ void EnStoneheishi_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_41_40)) {
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
POLY_XLU_DISP =
SkelAnime_DrawFlex(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnStoneheishi_OverrideLimbDraw, EnStoneheishi_PostLimbDraw, &this->actor, POLY_XLU_DISP);
} else {
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
POLY_OPA_DISP =
SkelAnime_DrawFlex(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
diff --git a/src/overlays/actors/ovl_En_Stop_heishi/z_en_stop_heishi.c b/src/overlays/actors/ovl_En_Stop_heishi/z_en_stop_heishi.c
index 3716f18d0..d90752d9b 100644
--- a/src/overlays/actors/ovl_En_Stop_heishi/z_en_stop_heishi.c
+++ b/src/overlays/actors/ovl_En_Stop_heishi/z_en_stop_heishi.c
@@ -195,7 +195,7 @@ void EnStopHeishi_UpdateHeadThirdDay(EnStopheishi* this) {
this->headTurnTimer1 = 50;
}
}
- } else if ((this->headTurnTimer1 == 0) && (Quake_NumActiveQuakes() != 0) && (this->headTurnTimer2 >= 6)) {
+ } else if ((this->headTurnTimer1 == 0) && (Quake_GetNumActiveQuakes() != 0) && (this->headTurnTimer2 >= 6)) {
this->headTurnTimer2 = 0;
}
}
@@ -579,7 +579,7 @@ void EnStopheishi_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3
void EnStopheishi_Draw(Actor* thisx, PlayState* play) {
EnStopheishi* this = THIS;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnStopheishi_OverrideLimbDraw, EnStopheishi_PostLimbDraw, &this->actor);
}
diff --git a/src/overlays/actors/ovl_En_Stream/z_en_stream.c b/src/overlays/actors/ovl_En_Stream/z_en_stream.c
index 11e5ce7d6..3bc1f55fd 100644
--- a/src/overlays/actors/ovl_En_Stream/z_en_stream.c
+++ b/src/overlays/actors/ovl_En_Stream/z_en_stream.c
@@ -93,11 +93,11 @@ void EnStream_SuckPlayer(EnStream* this, PlayState* play) {
this->actor.scale.y) != EN_STREAM_PLAYER_OUTSIDE_RANGE) {
xzDist = sqrtf(SQ(posDifference.x) + SQ(posDifference.z));
yDistWithOffset = player->actor.world.pos.y - (this->actor.world.pos.y - 90.0f);
- player->unk_B84 = Math_Atan2S(-posDifference.x, -posDifference.z);
+ player->pushedYaw = Math_Atan2S(-posDifference.x, -posDifference.z);
if (xzDist > 3.0f) {
- Math_SmoothStepToF(&player->unk_B80, 3.0f, 0.5f, xzDist, 0.0f);
+ Math_SmoothStepToF(&player->pushedSpeed, 3.0f, 0.5f, xzDist, 0.0f);
} else {
- player->unk_B80 = 0.0f;
+ player->pushedSpeed = 0.0f;
Math_SmoothStepToF(&player->actor.world.pos.x, this->actor.world.pos.x, 0.5f, 3.0f, 0.0f);
Math_SmoothStepToF(&player->actor.world.pos.z, this->actor.world.pos.z, 0.5f, 3.0f, 0.0f);
}
@@ -136,7 +136,8 @@ void EnStream_Draw(Actor* thisx, PlayState* play) {
Gfx* gfx;
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gfx = POLY_XLU_DISP;
gSPMatrix(&gfx[0], Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
multipliedFrames = frames * 20;
@@ -145,5 +146,6 @@ void EnStream_Draw(Actor* thisx, PlayState* play) {
-multipliedFrames, 64, 64));
gSPDisplayList(&gfx[2], gWaterVortexDL);
POLY_XLU_DISP = &gfx[3];
+
CLOSE_DISPS(play->state.gfxCtx);
}
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 a7cd6617a..877a400d5 100644
--- a/src/overlays/actors/ovl_En_Suttari/z_en_suttari.c
+++ b/src/overlays/actors/ovl_En_Suttari/z_en_suttari.c
@@ -230,7 +230,7 @@ void EnSuttari_TriggerTransition(PlayState* play, u16 entrance) {
play->transitionTrigger = TRANS_TRIGGER_START;
}
-void EnSuttari_UpdateTime(void) {
+void EnSuttari_AdvanceTime(void) {
gSaveContext.save.time = ((void)0, gSaveContext.save.time) + (u16)R_TIME_SPEED;
gSaveContext.save.time = ((void)0, gSaveContext.save.time) + (u16)((void)0, gSaveContext.save.timeSpeedOffset);
}
@@ -1483,7 +1483,7 @@ void EnSuttari_Update(Actor* thisx, PlayState* play) {
func_80BAB4F0(this, play);
}
if (this->flags2 & 2) {
- EnSuttari_UpdateTime();
+ EnSuttari_AdvanceTime();
}
if (this->unk428 != 0) {
if (this->animIndex == 2 || this->animIndex == 6) {
@@ -1543,9 +1543,12 @@ void EnSuttari_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s*
Matrix_MtxFToYXZRot(curState, &bombBag->shape.rot, false);
}
} else {
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+
OPEN_DISPS(play->state.gfxCtx);
+
gSPDisplayList(POLY_OPA_DISP++, gBombShopBagDL);
+
CLOSE_DISPS(play->state.gfxCtx);
}
}
@@ -1568,7 +1571,7 @@ void EnSuttari_Draw(Actor* thisx, PlayState* play) {
if (this->flags1 & 0x80) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Gfx_EnvColor(play->state.gfxCtx, 255, 255, 255, 0));
gSPSegment(POLY_OPA_DISP++, 0x09, Gfx_EnvColor(play->state.gfxCtx, 55, 55, 255, 0));
gDPPipeSync(POLY_OPA_DISP++);
@@ -1576,7 +1579,7 @@ void EnSuttari_Draw(Actor* thisx, PlayState* play) {
this->skelAnime.dListCount, EnSuttari_OverrideLimbDraw, EnSuttari_PostLimbDraw,
EnSuttari_TransformLimbDraw, &this->actor);
if (this->flags1 & 0x80) {
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
pos = this->actor.world.pos;
scale.x = 0.2f;
scale.y = 0.2f;
diff --git a/src/overlays/actors/ovl_En_Sw/z_en_sw.c b/src/overlays/actors/ovl_En_Sw/z_en_sw.c
index 1bb664416..3f32564bb 100644
--- a/src/overlays/actors/ovl_En_Sw/z_en_sw.c
+++ b/src/overlays/actors/ovl_En_Sw/z_en_sw.c
@@ -504,8 +504,8 @@ s32 func_808D99C8(EnSw* this, PlayState* play) {
return false;
}
- if ((this->actor.xyzDistToPlayerSq < ((sREG(16) * 10) + 60000)) && (play->actorCtx.unk_1F4.timer != 0) &&
- (play->actorCtx.unk_1F4.unk_00 == 0)) {
+ if ((this->actor.xyzDistToPlayerSq < ((sREG(16) * 10) + 60000)) && (play->actorCtx.playerImpact.timer != 0) &&
+ (play->actorCtx.playerImpact.type == PLAYER_IMPACT_GORON_GROUND_POUND)) {
this->actor.colChkInfo.damage = 4;
phi_v1 = true;
}
@@ -1296,7 +1296,7 @@ void EnSw_Draw(Actor* thisx, PlayState* play) {
if (ENSW_GET_3(&this->actor)) {
func_800B8050(&this->actor, play, MTXMODE_NEW);
}
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
Matrix_RotateXS(-0x3C72, MTXMODE_APPLY);
SkelAnime_DrawOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, EnSw_OverrideLimbDraw, NULL,
&this->actor);
diff --git a/src/overlays/actors/ovl_En_Syateki_Crow/z_en_syateki_crow.c b/src/overlays/actors/ovl_En_Syateki_Crow/z_en_syateki_crow.c
index abc773637..ae4716172 100644
--- a/src/overlays/actors/ovl_En_Syateki_Crow/z_en_syateki_crow.c
+++ b/src/overlays/actors/ovl_En_Syateki_Crow/z_en_syateki_crow.c
@@ -320,7 +320,7 @@ void EnSyatekiCrow_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec
void EnSyatekiCrow_Draw(Actor* thisx, PlayState* play) {
EnSyatekiCrow* this = THIS;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnSyatekiCrow_OverrideLimbDraw, EnSyatekiCrow_PostLimbDraw, &this->actor);
}
diff --git a/src/overlays/actors/ovl_En_Syateki_Dekunuts/z_en_syateki_dekunuts.c b/src/overlays/actors/ovl_En_Syateki_Dekunuts/z_en_syateki_dekunuts.c
index 20abd71e4..6fefd906a 100644
--- a/src/overlays/actors/ovl_En_Syateki_Dekunuts/z_en_syateki_dekunuts.c
+++ b/src/overlays/actors/ovl_En_Syateki_Dekunuts/z_en_syateki_dekunuts.c
@@ -476,7 +476,7 @@ void EnSyatekiDekunuts_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
Matrix_Translate(flowerPos.x, flowerPos.y, flowerPos.z, MTXMODE_NEW);
Matrix_Scale(0.02f, 0.02f, 0.02f, MTXMODE_APPLY);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
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 f75ee435f..526c7a666 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
@@ -1502,7 +1502,7 @@ void EnSyatekiMan_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C5B0(play->state.gfxCtx);
+ Gfx_SetupDL37_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sEyeTextures[this->eyeIndex]));
gSPSegment(POLY_OPA_DISP++, 0x09, Lib_SegmentedToVirtual(sEyeTextures[this->eyeIndex]));
diff --git a/src/overlays/actors/ovl_En_Syateki_Okuta/z_en_syateki_okuta.c b/src/overlays/actors/ovl_En_Syateki_Okuta/z_en_syateki_okuta.c
index 401bc34ff..324307d8a 100644
--- a/src/overlays/actors/ovl_En_Syateki_Okuta/z_en_syateki_okuta.c
+++ b/src/overlays/actors/ovl_En_Syateki_Okuta/z_en_syateki_okuta.c
@@ -489,7 +489,7 @@ void EnSyatekiOkuta_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
if (this->unk_2A6 == 1) {
gSPSegment(POLY_OPA_DISP++, 0x08, D_801AEFA0);
} else {
@@ -498,7 +498,7 @@ void EnSyatekiOkuta_Draw(Actor* thisx, PlayState* play) {
SkelAnime_DrawOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, EnSyatekiOkuta_OverrideLimbDraw, NULL,
&this->actor);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
if (this->actionFunc == func_80A365EC) {
Matrix_Translate(this->actor.world.pos.x, this->actor.world.pos.y + 30.0f, this->actor.world.pos.z + 20.0f,
MTXMODE_NEW);
diff --git a/src/overlays/actors/ovl_En_Syateki_Wf/z_en_syateki_wf.c b/src/overlays/actors/ovl_En_Syateki_Wf/z_en_syateki_wf.c
index 8a3a65ed2..f582063b7 100644
--- a/src/overlays/actors/ovl_En_Syateki_Wf/z_en_syateki_wf.c
+++ b/src/overlays/actors/ovl_En_Syateki_Wf/z_en_syateki_wf.c
@@ -505,7 +505,7 @@ void EnSyatekiWf_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sEyeTextures[this->eyeIndex]));
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnSyatekiWf_OverrideLimbDraw, EnSyatekiWf_PostLimbDraw, &this->actor);
diff --git a/src/overlays/actors/ovl_En_Tab/z_en_tab.c b/src/overlays/actors/ovl_En_Tab/z_en_tab.c
index dfa1e0bb7..1f97e5c57 100644
--- a/src/overlays/actors/ovl_En_Tab/z_en_tab.c
+++ b/src/overlays/actors/ovl_En_Tab/z_en_tab.c
@@ -617,7 +617,7 @@ void EnTab_Draw(Actor* thisx, PlayState* play) {
if (this->unk_1D8 != 0) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(D_80BE1B24[this->unk_31E]));
diff --git a/src/overlays/actors/ovl_En_Talk_Gibud/z_en_talk_gibud.c b/src/overlays/actors/ovl_En_Talk_Gibud/z_en_talk_gibud.c
index 11d984fe7..d64053b5a 100644
--- a/src/overlays/actors/ovl_En_Talk_Gibud/z_en_talk_gibud.c
+++ b/src/overlays/actors/ovl_En_Talk_Gibud/z_en_talk_gibud.c
@@ -1190,7 +1190,7 @@ void EnTalkGibud_Draw(Actor* thisx, PlayState* play) {
this->limbIndex = 0;
if (this->actor.shape.shadowAlpha == 255) {
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, this->actor.shape.shadowAlpha);
gSPSegment(POLY_OPA_DISP++, 0x08, D_801AEFA0);
@@ -1199,7 +1199,7 @@ void EnTalkGibud_Draw(Actor* thisx, PlayState* play) {
SkelAnime_DrawFlex(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnTalkGibud_OverrideLimbDraw, EnTalkGibud_PostLimbDraw, &this->actor, POLY_OPA_DISP);
} else {
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gDPSetEnvColor(POLY_XLU_DISP++, 0, 0, 0, this->actor.shape.shadowAlpha);
gSPSegment(POLY_XLU_DISP++, 0x08, D_801AEF88);
diff --git a/src/overlays/actors/ovl_En_Tanron1/z_en_tanron1.c b/src/overlays/actors/ovl_En_Tanron1/z_en_tanron1.c
index fec6a2d3b..4c2d3eaaf 100644
--- a/src/overlays/actors/ovl_En_Tanron1/z_en_tanron1.c
+++ b/src/overlays/actors/ovl_En_Tanron1/z_en_tanron1.c
@@ -369,7 +369,7 @@ void func_80BB5AAC(EnTanron1* this, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
for (i = 0; i < this->actor.params; i++, ptr++) {
if (ptr->unk_24 == 1) {
diff --git a/src/overlays/actors/ovl_En_Tanron2/z_en_tanron2.c b/src/overlays/actors/ovl_En_Tanron2/z_en_tanron2.c
index 2d1c29970..dd4f389a3 100644
--- a/src/overlays/actors/ovl_En_Tanron2/z_en_tanron2.c
+++ b/src/overlays/actors/ovl_En_Tanron2/z_en_tanron2.c
@@ -592,7 +592,7 @@ void EnTanron2_Draw(Actor* thisx, PlayState* play2) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPDisplayList(POLY_XLU_DISP++, gWartBubbleMaterialDL);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 255, 150);
@@ -637,7 +637,7 @@ void EnTanron2_Draw(Actor* thisx, PlayState* play2) {
}
}
- func_8012C448(play->state.gfxCtx);
+ Gfx_SetupDL44_Xlu(play->state.gfxCtx);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 0, 0, 0, 150);
gSPDisplayList(POLY_XLU_DISP++, gWartShadowMaterialDL);
@@ -654,7 +654,7 @@ void EnTanron2_Draw(Actor* thisx, PlayState* play2) {
tanron2 = tanron2->next;
}
- func_8012C974(play->state.gfxCtx);
+ Gfx_SetupDL60_XluNoCD(play->state.gfxCtx);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 255, 255);
gDPSetEnvColor(POLY_XLU_DISP++, 255, 255, 255, 255);
diff --git a/src/overlays/actors/ovl_En_Tanron3/z_en_tanron3.c b/src/overlays/actors/ovl_En_Tanron3/z_en_tanron3.c
index c3d62e166..483edd145 100644
--- a/src/overlays/actors/ovl_En_Tanron3/z_en_tanron3.c
+++ b/src/overlays/actors/ovl_En_Tanron3/z_en_tanron3.c
@@ -452,7 +452,7 @@ void EnTanron3_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
if ((this->fogTimer % 2) != 0) {
POLY_OPA_DISP = Gfx_SetFog(POLY_OPA_DISP, 255, 0, 0, 255, 900, 1099);
}
diff --git a/src/overlays/actors/ovl_En_Tanron5/z_en_tanron5.c b/src/overlays/actors/ovl_En_Tanron5/z_en_tanron5.c
index 0e5b8a0f5..18e24c5e7 100644
--- a/src/overlays/actors/ovl_En_Tanron5/z_en_tanron5.c
+++ b/src/overlays/actors/ovl_En_Tanron5/z_en_tanron5.c
@@ -350,7 +350,7 @@ void EnTanron5_Update(Actor* thisx, PlayState* play2) {
this->actor.shape.rot.y += phi_v0;
Actor_PlaySfx(&this->actor, NA_SE_IT_BIG_BOMB_EXPLOSION);
- func_800BC848(&this->actor, play, 4, 4);
+ Actor_RequestQuakeAndRumble(&this->actor, play, 4, 4);
this->unk_1A0++;
} else {
Vec3f sp90;
@@ -483,7 +483,7 @@ void EnTanron5_Draw(Actor* thisx, PlayState* play) {
if ((-500.0f * D_80BE5DD0) < this->actor.projectedPos.z) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, this->unk_148);
@@ -506,14 +506,14 @@ void func_80BE5C10(Actor* thisx, PlayState* play) {
if (((-500.0f * D_80BE5DD0) < this->actor.projectedPos.z) && phi_v0) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
if (this->unk_1A0 == 0) {
texture = gDropArrows1Tex;
} else {
texture = gDropMagicLargeTex;
}
- POLY_OPA_DISP = func_8012C724(POLY_OPA_DISP);
+ POLY_OPA_DISP = Gfx_SetupDL66(POLY_OPA_DISP);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(texture));
diff --git a/src/overlays/actors/ovl_En_Test/z_en_test.c b/src/overlays/actors/ovl_En_Test/z_en_test.c
index d98790c6f..1372d8791 100644
--- a/src/overlays/actors/ovl_En_Test/z_en_test.c
+++ b/src/overlays/actors/ovl_En_Test/z_en_test.c
@@ -133,7 +133,7 @@ void func_80863048(PlayState* play, EnTestStruct* arg1) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0x80, 255, 255, 255, 255);
gDPSetEnvColor(POLY_OPA_DISP++, 255, 255, 255, 255);
@@ -267,7 +267,7 @@ void EnTest_Draw(Actor* thisx, PlayState* play) {
mtx = GRAPH_ALLOC(play->state.gfxCtx, this->skeletonInfo.unk_18->unk_1 * sizeof(Mtx));
if (mtx != NULL) {
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
func_8018450C(play, &this->skeletonInfo, mtx, EnTest_OverrideKeyframeDraw, NULL, thisx);
func_80863048(play, this->unk_20C);
}
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 fd1710264..8e5a39bf8 100644
--- a/src/overlays/actors/ovl_En_Test2/z_en_test2.c
+++ b/src/overlays/actors/ovl_En_Test2/z_en_test2.c
@@ -125,7 +125,7 @@ void EnTest2_Draw(Actor* thisx, PlayState* play) {
if (CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_REACT_TO_LENS)) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
if (dList != NULL) {
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 d5ea5f9df..444142715 100644
--- a/src/overlays/actors/ovl_En_Test3/z_en_test3.c
+++ b/src/overlays/actors/ovl_En_Test3/z_en_test3.c
@@ -478,8 +478,8 @@ void EnTest3_Init(Actor* thisx, PlayState* play2) {
if (play->sceneId == SCENE_SECOM) {
this->subCamId = Play_CreateSubCamera(play);
subCam = Play_GetCamera(play, this->subCamId);
- Camera_InitPlayerSettings(subCam, &this->player);
- Camera_SetFlags(subCam, CAM_STATE_0 | CAM_STATE_6);
+ Camera_InitFocalActorSettings(subCam, &this->player.actor);
+ Camera_SetStateFlag(subCam, CAM_STATE_0 | CAM_STATE_6);
Play_ChangeCameraStatus(play, this->subCamId, CAM_STATUS_WAIT);
}
@@ -589,13 +589,13 @@ s32 func_80A3F384(EnTest3* this, PlayState* play) {
EnDoor* door = (EnDoor*)func_80A3F2BC(play, this, ACTOR_EN_DOOR, ACTORCAT_DOOR, 55.0f, 20.0f);
Vec3f offset;
- if ((door != NULL) && (door->unk_1A1 == 0) &&
- ((player->doorType == 0) || (&door->dyna.actor != player->doorActor)) &&
- Actor_ActorAIsFacingActorB(&this->player.actor, &door->dyna.actor, 0x3000)) {
- Actor_OffsetOfPointInActorCoords(&door->dyna.actor, &offset, &this->player.actor.world.pos);
- this->player.doorType = 1;
+ if ((door != NULL) && !door->knobDoor.playOpenAnim &&
+ ((player->doorType == PLAYER_DOORTYPE_NONE) || (&door->knobDoor.dyna.actor != player->doorActor)) &&
+ Actor_ActorAIsFacingActorB(&this->player.actor, &door->knobDoor.dyna.actor, 0x3000)) {
+ Actor_OffsetOfPointInActorCoords(&door->knobDoor.dyna.actor, &offset, &this->player.actor.world.pos);
+ this->player.doorType = PLAYER_DOORTYPE_HANDLE;
this->player.doorDirection = (offset.z >= 0.0f) ? 1.0f : -1.0f;
- this->player.doorActor = &door->dyna.actor;
+ this->player.doorActor = &door->knobDoor.dyna.actor;
this->player.csId = CS_ID_NONE;
return true;
}
@@ -1103,7 +1103,7 @@ s32 EnTest3_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f*
pos->z *= this->player.ageProperties->unk_08;
}
if (!(this->player.skelAnime.moveFlags & ANIM_FLAG_4) ||
- (this->player.skelAnime.moveFlags & ANIM_FLAG_UPDATEY)) {
+ (this->player.skelAnime.moveFlags & ANIM_FLAG_UPDATE_Y)) {
pos->y *= this->player.ageProperties->unk_08;
}
pos->y -= this->player.unk_AB8;
@@ -1176,8 +1176,8 @@ void EnTest3_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList1, Gfx** dL
leftHandActor->world.rot.y = this->player.actor.shape.rot.y + this->player.leftHandWorld.rot.y;
leftHandActor->shape.rot.y = leftHandActor->world.rot.y;
} else {
- Matrix_Get(&this->player.mf_CC4);
- Matrix_MtxFToYXZRot(&this->player.mf_CC4, &this->player.leftHandWorld.rot, false);
+ Matrix_Get(&this->player.leftHandMf);
+ Matrix_MtxFToYXZRot(&this->player.leftHandMf, &this->player.leftHandWorld.rot, false);
func_80126B8C(play, &this->player);
}
@@ -1257,7 +1257,7 @@ void EnTest3_Draw(Actor* thisx, PlayState* play2) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C268(play);
+ func_8012C268(&play->state);
if (this->player.invincibilityTimer > 0) {
s32 temp2; // Must exist for stack order. Could hold the result of CLAMP instead.
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 42ff16ccf..b56112421 100644
--- a/src/overlays/actors/ovl_En_Test6/z_en_test6.c
+++ b/src/overlays/actors/ovl_En_Test6/z_en_test6.c
@@ -240,7 +240,7 @@ void func_80A90D34(EnTest6* this, PlayState* play, EnTest6Struct* ptr) {
Matrix_Translate(ptr->unk_08 * ptr->unk_04, ptr->unk_0C, ptr->unk_10 * ptr->unk_04, MTXMODE_NEW);
Matrix_Scale(ptr->unk_04 * 0.02f, ptr->unk_04 * 0.02f, ptr->unk_04 * 0.02f, MTXMODE_APPLY);
POLY_OPA_DISP = Play_SetFog(play, POLY_OPA_DISP);
- POLY_OPA_DISP = func_8012C724(POLY_OPA_DISP);
+ POLY_OPA_DISP = Gfx_SetupDL66(POLY_OPA_DISP);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(D_80A9402C[ptr->unk_00]));
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
@@ -255,7 +255,7 @@ void func_80A90D34(EnTest6* this, PlayState* play, EnTest6Struct* ptr) {
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gDPSetPrimColor(POLY_XLU_DISP++, 0x80, 0x80, 210, 210, 230, 128);
gDPSetEnvColor(POLY_XLU_DISP++, 255, 255, 255, 0);
@@ -282,7 +282,7 @@ void func_80A90FC0(EnTest6* this, PlayState* play, EnTest6Struct* ptr) {
OPEN_DISPS(play->state.gfxCtx);
if (gfxHead != NULL) {
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gDPSetTileSize(gfx++, 1, sp70->h.x1 & 0xFFFF, sp70->h.y1 & 0xFFFF, (sp70->h.x1 + 60) & 0xFFFF,
(sp70->h.y1 + 60) & 0xFFFF);
@@ -307,7 +307,7 @@ void func_80A90FC0(EnTest6* this, PlayState* play, EnTest6Struct* ptr) {
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gDPSetPrimColor(POLY_XLU_DISP++, 0x80, 0x80, 220, 220, 230, 192);
gDPSetEnvColor(POLY_XLU_DISP++, 128, 128, 128, 0);
@@ -425,7 +425,7 @@ void func_80A916F0(EnTest6* this, PlayState* play) {
CutsceneManager_Stop(play->playerCsIds[PLAYER_CS_ID_SONG_WARP]);
func_800B7298(play, NULL, PLAYER_CSMODE_END);
EnTest6_DisableMotionBlur();
- Distortion_ClearType(DISTORTION_TYPE_5);
+ Distortion_RemoveRequest(DISTORTION_TYPE_SONG_OF_TIME);
Actor_Kill(&this->actor);
}
@@ -491,8 +491,8 @@ void func_80A91760(EnTest6* this, PlayState* play) {
}
}
EnTest6_EnableMotionBlur(120);
- Distortion_SetType(DISTORTION_TYPE_5);
- Distortion_SetCountdown(80);
+ Distortion_Request(DISTORTION_TYPE_SONG_OF_TIME);
+ Distortion_SetDuration(80);
play->unk_18844 = true;
this->cueId = 95;
}
@@ -546,7 +546,7 @@ void func_80A91760(EnTest6* this, PlayState* play) {
if (this->unk_27A == 10) {
this->unk_14C = 0.1f;
EnTest6_DisableMotionBlur();
- Distortion_ClearType(DISTORTION_TYPE_5);
+ Distortion_RemoveRequest(DISTORTION_TYPE_SONG_OF_TIME);
play->unk_18844 = false;
if (this->unk_254 != NULL) {
ZeldaArena_Free(this->unk_254);
@@ -646,7 +646,7 @@ void func_80A92118(EnTest6* this, PlayState* play) {
CutsceneManager_Stop(play->playerCsIds[PLAYER_CS_ID_SONG_WARP]);
func_800B7298(play, NULL, PLAYER_CSMODE_END);
EnTest6_DisableMotionBlur();
- Distortion_ClearType(DISTORTION_TYPE_5);
+ Distortion_RemoveRequest(DISTORTION_TYPE_SONG_OF_TIME);
Actor_Kill(&this->actor);
}
@@ -713,8 +713,8 @@ void func_80A92188(EnTest6* this, PlayState* play) {
case 115:
EnTest6_EnableMotionBlur(20);
- Distortion_SetType(DISTORTION_TYPE_5);
- Distortion_SetCountdown(90);
+ Distortion_Request(DISTORTION_TYPE_SONG_OF_TIME);
+ Distortion_SetDuration(90);
this->cueId = 2;
break;
@@ -744,7 +744,7 @@ void func_80A92188(EnTest6* this, PlayState* play) {
case 14:
case 15:
EnTest6_EnableMotionBlur(50);
- Distortion_ClearType(DISTORTION_TYPE_5);
+ Distortion_RemoveRequest(DISTORTION_TYPE_SONG_OF_TIME);
this->cueId = 0;
break;
@@ -1295,7 +1295,7 @@ void func_80A939E8(EnTest6* this, PlayState* play2) {
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0x80, 128, 128, 128, this->unk_282 >> 1);
gDPSetEnvColor(POLY_XLU_DISP++, 230, 230, 180, this->unk_282);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
Matrix_Mult(&play->billboardMtxF, MTXMODE_APPLY);
Matrix_RotateZS(this->unk_278 + (i << 2), MTXMODE_APPLY);
diff --git a/src/overlays/actors/ovl_En_Test7/z_en_test7.c b/src/overlays/actors/ovl_En_Test7/z_en_test7.c
index 9c672ed51..fa378ec68 100644
--- a/src/overlays/actors/ovl_En_Test7/z_en_test7.c
+++ b/src/overlays/actors/ovl_En_Test7/z_en_test7.c
@@ -330,7 +330,7 @@ void func_80AF14FC(PlayState* play2, EnTest7Struct2* arg1) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C1C0(play->state.gfxCtx);
+ Gfx_SetupDL26_Opa(play->state.gfxCtx);
Matrix_Push();
diff --git a/src/overlays/actors/ovl_En_Tg/z_en_tg.c b/src/overlays/actors/ovl_En_Tg/z_en_tg.c
index ed048288e..0672bd4bf 100644
--- a/src/overlays/actors/ovl_En_Tg/z_en_tg.c
+++ b/src/overlays/actors/ovl_En_Tg/z_en_tg.c
@@ -190,7 +190,8 @@ void EnTg_Draw(Actor* thisx, PlayState* play) {
Matrix_Pop();
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gDPPipeSync(POLY_OPA_DISP++);
gSPSegment(POLY_OPA_DISP++, 0x08, Gfx_EnvColor(play->state.gfxCtx, 0, 50, 160, 0));
@@ -260,7 +261,7 @@ void EnTg_DrawHearts(PlayState* play, EnTgHeartEffect* effect, s32 numEffects) {
OPEN_DISPS(play->state.gfxCtx);
POLY_OPA_DISP = Play_SetFog(play, POLY_OPA_DISP);
- POLY_OPA_DISP = func_8012C724(POLY_OPA_DISP);
+ POLY_OPA_DISP = Gfx_SetupDL66(POLY_OPA_DISP);
for (i = 0; i < numEffects; i++, effect++) {
if (effect->isEnabled == true) {
diff --git a/src/overlays/actors/ovl_En_Thiefbird/z_en_thiefbird.c b/src/overlays/actors/ovl_En_Thiefbird/z_en_thiefbird.c
index d472077ec..2bef1cda2 100644
--- a/src/overlays/actors/ovl_En_Thiefbird/z_en_thiefbird.c
+++ b/src/overlays/actors/ovl_En_Thiefbird/z_en_thiefbird.c
@@ -7,7 +7,7 @@
#include "prevent_bss_reordering.h"
#include "z_en_thiefbird.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_200 | ACTOR_FLAG_1000 | ACTOR_FLAG_80000000)
+#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_200 | ACTOR_FLAG_IGNORE_QUAKE | ACTOR_FLAG_80000000)
#define THIS ((EnThiefbird*)thisx)
@@ -1128,7 +1128,7 @@ void func_80C13354(EnThiefbird* this, PlayState* play2) {
OPEN_DISPS(play->state.gfxCtx);
gfx = POLY_OPA_DISP;
- gSPDisplayList(&gfx[0], &sSetupDL[6 * 25]);
+ gSPDisplayList(&gfx[0], gSetupDLs[SETUPDL_25]);
gSPDisplayList(&gfx[1], gTakkuriFeatherMaterialDL);
gfx = &gfx[2];
@@ -1154,7 +1154,7 @@ void func_80C13354(EnThiefbird* this, PlayState* play2) {
void EnThiefbird_Draw(Actor* thisx, PlayState* play) {
EnThiefbird* this = THIS;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnThiefbird_OverrideLimbDraw, EnThiefbird_PostLimbDraw, &this->actor);
if (this->actor.colorFilterTimer > 0) {
diff --git a/src/overlays/actors/ovl_En_Tite/z_en_tite.c b/src/overlays/actors/ovl_En_Tite/z_en_tite.c
index 3d5c7a741..cfae13191 100644
--- a/src/overlays/actors/ovl_En_Tite/z_en_tite.c
+++ b/src/overlays/actors/ovl_En_Tite/z_en_tite.c
@@ -1161,9 +1161,10 @@ void EnTite_Draw(Actor* thisx, PlayState* play) {
Gfx* gfx;
OPEN_DISPS(play->state.gfxCtx);
+
gfx = POLY_OPA_DISP;
- gSPDisplayList(&gfx[0], &sSetupDL[6 * 25]);
+ gSPDisplayList(&gfx[0], gSetupDLs[SETUPDL_25]);
if (this->actor.params == ENTITE_MINUS_2) {
gSPSegment(&gfx[1], 0x08, D_80896B24[0][0]);
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 d434bacaa..fb5f72c76 100644
--- a/src/overlays/actors/ovl_En_Tk/z_en_tk.c
+++ b/src/overlays/actors/ovl_En_Tk/z_en_tk.c
@@ -471,7 +471,7 @@ s32 func_80AECE60(EnTk* this, PlayState* play) {
if ((door != NULL) && (this->unk_2CA & 0x400)) {
Vec3f sp5C;
- Actor_OffsetOfPointInActorCoords(&this->actor, &sp5C, &door->dyna.actor.world.pos);
+ Actor_OffsetOfPointInActorCoords(&this->actor, &sp5C, &door->knobDoor.dyna.actor.world.pos);
door->unk_1A7 = 2;
if (sp5C.z < -20.0f) {
this->unk_2CA &= ~0x400;
@@ -1382,7 +1382,7 @@ void EnTk_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- POLY_OPA_DISP = Gfx_CallSetupDL(POLY_OPA_DISP, 25);
+ POLY_OPA_DISP = Gfx_SetupDL(POLY_OPA_DISP, SETUPDL_25);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(D_80AEFA90[this->unk_2C2]));
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 3a563ab60..6eff18d29 100644
--- a/src/overlays/actors/ovl_En_Toto/z_en_toto.c
+++ b/src/overlays/actors/ovl_En_Toto/z_en_toto.c
@@ -214,7 +214,7 @@ void func_80BA383C(EnToto* this, PlayState* play) {
}
Animation_PlayOnce(&this->skelAnime, D_80BA5078[this->unk2B4]);
}
- func_800BBB74(this->unk260, 0x14, 0x50, 3);
+ func_800BBB74(&this->blinkInfo, 20, 80, 3);
}
void func_80BA3930(EnToto* this, PlayState* play) {
@@ -316,7 +316,7 @@ void func_80BA3D38(EnToto* this, PlayState* play) {
this->text = ENTOTO_WEEK_EVENT_FLAGS ? D_80BA50BC : D_80BA5088;
func_80BA4C0C(this, play);
play->actorCtx.flags |= ACTORCTX_FLAG_5;
- this->unk260[0] = 0;
+ this->blinkInfo.eyeTexIndex = 0;
}
void func_80BA3DBC(EnToto* this, PlayState* play) {
@@ -586,6 +586,7 @@ s32 func_80BA47E0(EnToto* this, PlayState* play) {
for (i = 0; i < ARRAY_COUNT(D_80BA50DC); i++) {
if (gSaveContext.save.playerForm != (i + 1) && (D_80BA5128[i] & this->unk2B3)) {
Math_Vec3s_ToVec3f(&spawnPos, &D_80BA50DC[i].unk6);
+
Actor_Spawn(&play->actorCtx, play, ACTOR_PLAYER, spawnPos.x, spawnPos.y, spawnPos.z, i + 2, 0, 0,
PLAYER_PARAMS(0xFF, PLAYER_INITMODE_F) | 0xFFFFF000);
}
@@ -727,8 +728,8 @@ void EnToto_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
- gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sp4C[this->unk260[0]]));
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sp4C[this->blinkInfo.eyeTexIndex]));
Scene_SetRenderModeXlu(play, 0, 1);
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount, NULL,
NULL, &this->actor);
diff --git a/src/overlays/actors/ovl_En_Toto/z_en_toto.h b/src/overlays/actors/ovl_En_Toto/z_en_toto.h
index cf9f3c718..dc2b0947e 100644
--- a/src/overlays/actors/ovl_En_Toto/z_en_toto.h
+++ b/src/overlays/actors/ovl_En_Toto/z_en_toto.h
@@ -26,7 +26,7 @@ typedef struct EnToto {
/* 0x144 */ SkelAnime skelAnime;
/* 0x188 */ Vec3s jointTable[18];
/* 0x1F4 */ Vec3s morphTable[18];
- /* 0x260 */ s16 unk260[2];
+ /* 0x260 */ BlinkInfo blinkInfo;
/* 0x264 */ ColliderCylinder collider;
/* 0x2B0 */ u8 actionFuncIndex;
/* 0x2B1 */ u8 unk2B1;
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 bf283163e..c1902a83a 100644
--- a/src/overlays/actors/ovl_En_Trt/z_en_trt.c
+++ b/src/overlays/actors/ovl_En_Trt/z_en_trt.c
@@ -1571,7 +1571,7 @@ void EnTrt_DrawCursor(PlayState* play, EnTrt* this, f32 x, f32 y, f32 z, u8 draw
OPEN_DISPS(play->state.gfxCtx);
if (drawCursor != 0) {
- func_8012C654(play->state.gfxCtx);
+ Gfx_SetupDL39_Overlay(play->state.gfxCtx);
gDPSetPrimColor(OVERLAY_DISP++, 0, 0, this->cursorColor.r, this->cursorColor.g, this->cursorColor.b,
this->cursorColor.a);
gDPLoadTextureBlock_4b(OVERLAY_DISP++, gSelectionCursorTex, G_IM_FMT_IA, 16, 16, 0, G_TX_MIRROR | G_TX_WRAP,
@@ -1632,7 +1632,7 @@ void EnTrt_DrawStickDirectionPrompt(PlayState* play, EnTrt* this) {
OPEN_DISPS(play->state.gfxCtx);
if (drawStickRightPrompt || drawStickLeftPrompt) {
- func_8012C654(play->state.gfxCtx);
+ Gfx_SetupDL39_Overlay(play->state.gfxCtx);
gDPSetCombineMode(OVERLAY_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
gDPLoadTextureBlock(OVERLAY_DISP++, gArrowCursorTex, G_IM_FMT_IA, G_IM_SIZ_8b, 16, 24, 0,
G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, 4, G_TX_NOMASK, G_TX_NOLOD,
@@ -1793,7 +1793,7 @@ void EnTrt_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sEyeTextures[this->eyeTexIndex]));
gSPSegment(POLY_OPA_DISP++, 0x09, Lib_SegmentedToVirtual(sEyeTextures[this->eyeTexIndex]));
SkelAnime_DrawTransformFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable,
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 67f52e064..951724668 100644
--- a/src/overlays/actors/ovl_En_Trt2/z_en_trt2.c
+++ b/src/overlays/actors/ovl_En_Trt2/z_en_trt2.c
@@ -941,7 +941,7 @@ void func_80AD56E8(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(D_80AD5978[this->unk_3B8]));
gSPSegment(POLY_OPA_DISP++, 0x09, Lib_SegmentedToVirtual(D_80AD5978[this->unk_3B8]));
diff --git a/src/overlays/actors/ovl_En_Tru/z_en_tru.c b/src/overlays/actors/ovl_En_Tru/z_en_tru.c
index 2ba130869..a3c267846 100644
--- a/src/overlays/actors/ovl_En_Tru/z_en_tru.c
+++ b/src/overlays/actors/ovl_En_Tru/z_en_tru.c
@@ -179,7 +179,7 @@ void func_80A85788(EnTruUnkStruct* arg0, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
for (i = 0; i < 30; i++, arg0++) {
f32 alpha;
@@ -239,7 +239,7 @@ void func_80A85BCC(EnTruUnkStruct* arg0, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
for (i = 0; i < 30; i++, arg0++) {
f32 alpha;
@@ -295,7 +295,7 @@ void func_80A85F84(EnTruUnkStruct* arg0, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
for (i = 0; i < 30; i++, arg0++) {
f32 alpha;
@@ -305,7 +305,7 @@ void func_80A85F84(EnTruUnkStruct* arg0, PlayState* play) {
}
if (!flag) {
- POLY_XLU_DISP = Gfx_CallSetupDL(POLY_XLU_DISP, 0);
+ POLY_XLU_DISP = Gfx_SetupDL(POLY_XLU_DISP, SETUPDL_0);
gSPDisplayList(POLY_XLU_DISP++, gKoumeDustMaterialDL);
flag = true;
}
@@ -494,7 +494,7 @@ s32 func_80A86B0C(EnTru* this, PlayState* play) {
s32 func_80A86BAC(EnTru* this, PlayState* play) {
if (this->unk_34E & 0x400) {
Matrix_Push();
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
OPEN_DISPS(play->state.gfxCtx);
@@ -524,7 +524,7 @@ s32 func_80A86BAC(EnTru* this, PlayState* play) {
if (this->unk_34E & 0x800) {
Matrix_Push();
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
OPEN_DISPS(play->state.gfxCtx);
@@ -1265,7 +1265,7 @@ void EnTru_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sEyeTextures[this->eyeTexIndex]));
gSPSegment(POLY_OPA_DISP++, 0x09, Lib_SegmentedToVirtual(sEyeTextures[this->eyeTexIndex]));
diff --git a/src/overlays/actors/ovl_En_Tru_Mt/z_en_tru_mt.c b/src/overlays/actors/ovl_En_Tru_Mt/z_en_tru_mt.c
index 09ec80172..2c8e4ed8a 100644
--- a/src/overlays/actors/ovl_En_Tru_Mt/z_en_tru_mt.c
+++ b/src/overlays/actors/ovl_En_Tru_Mt/z_en_tru_mt.c
@@ -527,7 +527,7 @@ void EnTruMt_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* ro
}
if (limbIndex == KOUME_LIMB_BROOM) {
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
OPEN_DISPS(play->state.gfxCtx);
@@ -583,7 +583,7 @@ void EnTruMt_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(eyeTextures[this->eyeTexIndex]));
gSPSegment(POLY_OPA_DISP++, 0x09, Lib_SegmentedToVirtual(eyeTextures[this->eyeTexIndex]));
diff --git a/src/overlays/actors/ovl_En_Tsn/z_en_tsn.c b/src/overlays/actors/ovl_En_Tsn/z_en_tsn.c
index 22ce0600c..894c07002 100644
--- a/src/overlays/actors/ovl_En_Tsn/z_en_tsn.c
+++ b/src/overlays/actors/ovl_En_Tsn/z_en_tsn.c
@@ -627,7 +627,7 @@ void EnTsn_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C5B0(play->state.gfxCtx);
+ Gfx_SetupDL37_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(D_80AE11C8[this->unk_22E]));
gSPSegment(POLY_OPA_DISP++, 0x09, Lib_SegmentedToVirtual(D_80AE11C8[this->unk_22E]));
diff --git a/src/overlays/actors/ovl_En_Twig/z_en_twig.c b/src/overlays/actors/ovl_En_Twig/z_en_twig.c
index a86359610..b756d0f92 100644
--- a/src/overlays/actors/ovl_En_Twig/z_en_twig.c
+++ b/src/overlays/actors/ovl_En_Twig/z_en_twig.c
@@ -4,6 +4,7 @@
* Description: Beaver Race Ring
*/
+#include "prevent_bss_reordering.h"
#include "z_en_twig.h"
#include "objects/object_twig/object_twig.h"
diff --git a/src/overlays/actors/ovl_En_Vm/z_en_vm.c b/src/overlays/actors/ovl_En_Vm/z_en_vm.c
index 505df7f11..2f68391b1 100644
--- a/src/overlays/actors/ovl_En_Vm/z_en_vm.c
+++ b/src/overlays/actors/ovl_En_Vm/z_en_vm.c
@@ -391,8 +391,9 @@ void func_808CCCF0(EnVm* this, PlayState* play) {
this->unk_214--;
if (this->unk_214 == 1) {
- EnBom* bomb = (EnBom*)Actor_Spawn(&play->actorCtx, play, ACTOR_EN_BOM, this->actor.world.pos.x,
- this->actor.world.pos.y, this->actor.world.pos.z, 0, 0, 0x6FF, 0);
+ EnBom* bomb =
+ (EnBom*)Actor_Spawn(&play->actorCtx, play, ACTOR_EN_BOM, this->actor.world.pos.x, this->actor.world.pos.y,
+ this->actor.world.pos.z, BOMB_EXPLOSIVE_TYPE_BOMB, 0, 0x6FF, BOMB_TYPE_BODY);
if (bomb != NULL) {
bomb->timer = 0;
@@ -513,7 +514,7 @@ void EnVm_Draw(Actor* thisx, PlayState* play) {
gfx = POLY_OPA_DISP;
- gSPDisplayList(&gfx[0], &sSetupDL[6 * 25]);
+ gSPDisplayList(&gfx[0], gSetupDLs[SETUPDL_25]);
POLY_OPA_DISP = &gfx[1];
@@ -523,7 +524,7 @@ void EnVm_Draw(Actor* thisx, PlayState* play) {
if (this->unk_210 == 2) {
gfx = POLY_XLU_DISP;
- gSPDisplayList(&gfx[0], &sSetupDL[6 * 60]);
+ gSPDisplayList(&gfx[0], gSetupDLs[SETUPDL_60]);
gDPSetColorDither(&gfx[1], G_CD_DISABLE);
Matrix_Translate(this->unk_234.x, this->unk_234.y + 10.0f, this->unk_234.z, MTXMODE_NEW);
diff --git a/src/overlays/actors/ovl_En_Wallmas/z_en_wallmas.c b/src/overlays/actors/ovl_En_Wallmas/z_en_wallmas.c
index 11860c20d..f4f89d79e 100644
--- a/src/overlays/actors/ovl_En_Wallmas/z_en_wallmas.c
+++ b/src/overlays/actors/ovl_En_Wallmas/z_en_wallmas.c
@@ -191,8 +191,8 @@ void EnWallmas_Destroy(Actor* thisx, PlayState* play) {
if (this->actor.parent != NULL) {
EnEncount1* encount1 = (EnEncount1*)this->actor.parent;
- if ((encount1->actor.update != NULL) && (encount1->unk_14E > 0)) {
- encount1->unk_14E--;
+ if ((encount1->actor.update != NULL) && (encount1->spawnActiveCount > 0)) {
+ encount1->spawnActiveCount--;
}
}
}
@@ -668,7 +668,7 @@ void EnWallmas_DrawShadow(EnWallmas* this, PlayState* play) {
gfx = POLY_OPA_DISP;
- gSPDisplayList(&gfx[0], &sSetupDL[6 * 44]);
+ gSPDisplayList(&gfx[0], gSetupDLs[SETUPDL_44]);
gDPSetPrimColor(&gfx[1], 0, 0, 0, 0, 0, 255);
func_800C0094(this->actor.floorPoly, this->actor.world.pos.x, this->actor.floorHeight, this->actor.world.pos.z,
&mf);
@@ -742,7 +742,7 @@ void EnWallmas_Draw(Actor* thisx, PlayState* play) {
EnWallmas* this = THIS;
if (this->actionFunc != EnWallmas_WaitToDrop) {
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnWallmas_OverrideLimbDraw, EnWallmas_PostLimbDraw, &this->actor);
Actor_DrawDamageEffects(play, &this->actor, this->limbPos, ARRAY_COUNT(this->limbPos), this->drawDmgEffScale,
diff --git a/src/overlays/actors/ovl_En_Wallmas/z_en_wallmas.h b/src/overlays/actors/ovl_En_Wallmas/z_en_wallmas.h
index ceb1d1823..93dd63245 100644
--- a/src/overlays/actors/ovl_En_Wallmas/z_en_wallmas.h
+++ b/src/overlays/actors/ovl_En_Wallmas/z_en_wallmas.h
@@ -8,6 +8,8 @@
#define WALLMASTER_GET_SWITCH_FLAG(thisx) (((thisx)->params >> 8) & 0xFF)
#define WALLMASTER_IS_FROZEN(thisx) ((thisx)->params & 0x80)
+#define WALLMASTER_PARAMS(type, switchFlag, isFrozen) ((type) | (((switchFlag) << 8) & 0xFF) | (((isFrozen) << 7) & 0x80))
+
/**
* This type determines under what conditions the Wallmaster will drop from the ceiling.
* - WALLMASTER_TYPE_TIMER_ONLY: These Wallmasters don't check for anything to determine
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 6d5522e8a..a61e7e8df 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
@@ -262,7 +262,7 @@ void EnWarptag_Update(Actor* thisx, PlayState* play) {
void EnWarpTag_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
AnimatedMat_Draw(play, Lib_SegmentedToVirtual(gWarpTagRainbowTexAnim));
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
diff --git a/src/overlays/actors/ovl_En_Water_Effect/z_en_water_effect.c b/src/overlays/actors/ovl_En_Water_Effect/z_en_water_effect.c
index 159b7444e..b14f82424 100644
--- a/src/overlays/actors/ovl_En_Water_Effect/z_en_water_effect.c
+++ b/src/overlays/actors/ovl_En_Water_Effect/z_en_water_effect.c
@@ -289,12 +289,12 @@ void EnWaterEffect_Draw(Actor* thisx, PlayState* play2) {
OPEN_DISPS(gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
for (i = 0; i < ARRAY_COUNT(this->unk_144) / 2; i++, ptr++) {
if ((ptr->unk_00 == 1) || (ptr->unk_00 == 2)) {
if (!phi_s4) {
- POLY_XLU_DISP = Gfx_CallSetupDL(POLY_XLU_DISP, 0);
+ POLY_XLU_DISP = Gfx_SetupDL(POLY_XLU_DISP, SETUPDL_0);
gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(gEffDust1Tex));
gSPDisplayList(POLY_XLU_DISP++, object_water_effect_DL_004260);
@@ -326,7 +326,7 @@ void EnWaterEffect_Draw(Actor* thisx, PlayState* play2) {
for (i = 0; i < ARRAY_COUNT(this->unk_144) / 2; i++, ptr++) {
if (ptr->unk_00 == 3) {
if (!phi_s4) {
- func_8012C448(gfxCtx);
+ Gfx_SetupDL44_Xlu(gfxCtx);
gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(gEffDust1Tex));
gDPSetEnvColor(POLY_XLU_DISP++, 250, 250, 255, 0);
@@ -524,8 +524,8 @@ void func_80A5A184(Actor* thisx, PlayState* play2) {
OPEN_DISPS(gfxCtx);
- func_8012C28C(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
for (i = 0; i < ARRAY_COUNT(this->unk_144); i++, ptr++) {
if (ptr->unk_00 == 4) {
@@ -623,7 +623,7 @@ void func_80A5A6B8(Actor* thisx, PlayState* play2) {
Matrix_Translate(this->actor.world.pos.x, this->actor.world.pos.y, this->actor.world.pos.z, MTXMODE_NEW);
Matrix_RotateYS(this->actor.shape.rot.y, MTXMODE_APPLY);
Matrix_Scale(this->actor.scale.x, this->actor.scale.y, this->actor.scale.z, MTXMODE_APPLY);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gDPSetEnvColor(POLY_XLU_DISP++, 165, 235, 255, 128);
@@ -634,7 +634,7 @@ void func_80A5A6B8(Actor* thisx, PlayState* play2) {
if ((this->actor.params == ENWATEREFFECT_TYPE_GYORG_RIPPLES) ||
(this->actor.params == ENWATEREFFECT_TYPE_GYORG_PRIMARY_SPRAY)) {
if (this->unk_E2C > 1.0f) {
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
AnimatedMat_Draw(play, Lib_SegmentedToVirtual(object_water_effect_Matanimheader_000DE0));
Matrix_Scale(this->unk_DC8[1].y, this->unk_DC8[1].z, this->unk_DC8[1].y, MTXMODE_APPLY);
@@ -646,7 +646,7 @@ void func_80A5A6B8(Actor* thisx, PlayState* play2) {
Matrix_Pop();
if (this->unk_E30 > 1.0f) {
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
AnimatedMat_Draw(play, Lib_SegmentedToVirtual(object_water_effect_Matanimheader_000E0C));
Matrix_Scale(this->unk_DC8[2].y, this->unk_DC8[2].z, this->unk_DC8[2].y, MTXMODE_APPLY);
@@ -661,7 +661,7 @@ void func_80A5A6B8(Actor* thisx, PlayState* play2) {
}
if ((this->unk_E34 > 1.0f) && (this->actor.params != ENWATEREFFECT_TYPE_GYORG_SHOCKWAVE)) {
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
AnimatedMat_Draw(play, Lib_SegmentedToVirtual(object_water_effect_Matanimheader_000E40));
Matrix_Scale(this->unk_DC8[3].y, this->unk_DC8[3].z, this->unk_DC8[3].y, MTXMODE_APPLY);
@@ -674,7 +674,7 @@ void func_80A5A6B8(Actor* thisx, PlayState* play2) {
if ((this->actor.params == ENWATEREFFECT_TYPE_GYORG_RIPPLES) ||
(this->actor.params == ENWATEREFFECT_TYPE_GYORG_SHOCKWAVE)) {
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
AnimatedMat_Draw(play, Lib_SegmentedToVirtual(object_water_effect_Matanimheader_000E58));
Matrix_Scale(this->unk_DC8[4].y, this->unk_DC8[4].z, this->unk_DC8[4].y, MTXMODE_APPLY);
@@ -684,12 +684,12 @@ void func_80A5A6B8(Actor* thisx, PlayState* play2) {
}
if (this->actor.params == ENWATEREFFECT_TYPE_GYORG_RIPPLES) {
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
for (i = 0; i < ARRAY_COUNT(this->unk_144) / 2; i++, ptr++) {
if (ptr->unk_00 == 3) {
if (!phi_s4) {
- func_8012C448(play->state.gfxCtx);
+ Gfx_SetupDL44_Xlu(play->state.gfxCtx);
gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(gEffDust1Tex));
gDPSetEnvColor(POLY_XLU_DISP++, 250, 250, 255, 0);
diff --git a/src/overlays/actors/ovl_En_Wf/z_en_wf.c b/src/overlays/actors/ovl_En_Wf/z_en_wf.c
index 44a50e99d..b05bc4869 100644
--- a/src/overlays/actors/ovl_En_Wf/z_en_wf.c
+++ b/src/overlays/actors/ovl_En_Wf/z_en_wf.c
@@ -616,7 +616,8 @@ void func_80991280(EnWf* this, PlayState* play) {
if (!func_8099408C(play, this) && !func_80990948(play, this, 0)) {
phi_v1 = ABS_ALT(BINANG_SUB(player->actor.shape.rot.y, this->actor.shape.rot.y));
- if ((this->actor.xzDistToPlayer < 80.0f) && (player->meleeWeaponState != 0) && (phi_v1 >= 0x1F40)) {
+ if ((this->actor.xzDistToPlayer < 80.0f) && (player->meleeWeaponState != PLAYER_MELEE_WEAPON_STATE_0) &&
+ (phi_v1 >= 0x1F40)) {
this->actor.shape.rot.y = this->actor.yawTowardsPlayer;
this->actor.world.rot.y = this->actor.yawTowardsPlayer;
func_80991948(this);
@@ -666,7 +667,8 @@ void func_8099149C(EnWf* this, PlayState* play) {
sp28 = ABS_ALT(BINANG_SUB(player->actor.shape.rot.y, this->actor.shape.rot.y));
- if ((this->actor.xzDistToPlayer < (150.0f + sp2C)) && (player->meleeWeaponState != 0) && (sp28 >= 0x1F40)) {
+ if ((this->actor.xzDistToPlayer < (150.0f + sp2C)) &&
+ (player->meleeWeaponState != PLAYER_MELEE_WEAPON_STATE_0) && (sp28 >= 0x1F40)) {
this->actor.shape.rot.y = this->actor.yawTowardsPlayer;
this->actor.world.rot.y = this->actor.yawTowardsPlayer;
if (Rand_ZeroOne() > 0.7f) {
@@ -1573,7 +1575,7 @@ void EnWf_Draw(Actor* thisx, PlayState* play) {
if (this->actionFunc != func_80990F50) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
if (this->actor.params == 0) {
gSPSegment(POLY_OPA_DISP++, 0x08, sNormalEyeTextures[this->eyeIndex]);
diff --git a/src/overlays/actors/ovl_En_Wiz/z_en_wiz.c b/src/overlays/actors/ovl_En_Wiz/z_en_wiz.c
index d6cc0e9e6..b64af5a88 100644
--- a/src/overlays/actors/ovl_En_Wiz/z_en_wiz.c
+++ b/src/overlays/actors/ovl_En_Wiz/z_en_wiz.c
@@ -8,8 +8,8 @@
#include "objects/gameplay_keep/gameplay_keep.h"
#include "overlays/actors/ovl_En_Wiz_Brock/z_en_wiz_brock.h"
-#define FLAGS \
- (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_10 | ACTOR_FLAG_20 | ACTOR_FLAG_1000 | ACTOR_FLAG_100000 | \
+#define FLAGS \
+ (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_10 | ACTOR_FLAG_20 | ACTOR_FLAG_IGNORE_QUAKE | ACTOR_FLAG_100000 | \
ACTOR_FLAG_CANT_LOCK_ON | ACTOR_FLAG_80000000)
#define THIS ((EnWiz*)thisx)
@@ -1451,8 +1451,8 @@ void EnWiz_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
if ((this->action == EN_WIZ_ACTION_BURST_INTO_FLAMES) || (this->alpha != 255)) {
Scene_SetRenderModeXlu(play, 1, 2);
@@ -1502,8 +1502,8 @@ void EnWiz_Draw(Actor* thisx, PlayState* play) {
}
for (i = 0; i < platformCount; i++) {
- func_8012C28C(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
if ((this->ghostPos[i].x != 0.0f) && (this->ghostPos[i].z != 0.0f)) {
Matrix_Translate(this->ghostPos[i].x, this->ghostPos[i].y + 10.0f, this->ghostPos[i].z, MTXMODE_NEW);
@@ -1529,8 +1529,8 @@ void EnWiz_Draw(Actor* thisx, PlayState* play) {
Matrix_Pop();
}
- func_8012C2DC(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
// Draw the light emanating from the Wizrobe's platform
if (this->fightState == EN_WIZ_FIGHT_STATE_FIRST_PHASE) {
diff --git a/src/overlays/actors/ovl_En_Wiz_Brock/z_en_wiz_brock.c b/src/overlays/actors/ovl_En_Wiz_Brock/z_en_wiz_brock.c
index 4a3689005..02955f0d0 100644
--- a/src/overlays/actors/ovl_En_Wiz_Brock/z_en_wiz_brock.c
+++ b/src/overlays/actors/ovl_En_Wiz_Brock/z_en_wiz_brock.c
@@ -96,8 +96,8 @@ void EnWizBrock_Draw(Actor* thisx, PlayState* play) {
s32 pad;
EnWizBrock* this = THIS;
- func_8012C28C(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
OPEN_DISPS(play->state.gfxCtx);
diff --git a/src/overlays/actors/ovl_En_Wiz_Fire/z_en_wiz_fire.c b/src/overlays/actors/ovl_En_Wiz_Fire/z_en_wiz_fire.c
index bad93b685..4a7f6cd20 100644
--- a/src/overlays/actors/ovl_En_Wiz_Fire/z_en_wiz_fire.c
+++ b/src/overlays/actors/ovl_En_Wiz_Fire/z_en_wiz_fire.c
@@ -658,8 +658,8 @@ void EnWizFire_DrawIcePool(EnWizFire* this, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
if ((this->type == EN_WIZ_FIRE_TYPE_MAGIC_PROJECTILE) && (this->action == EN_WIZ_FIRE_ACTION_POOL)) {
- func_8012C28C(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
Matrix_Translate(this->actor.world.pos.x, this->actor.floorHeight, this->actor.world.pos.z, MTXMODE_NEW);
Matrix_Scale(this->poolScale, this->poolScale, this->poolScale, MTXMODE_APPLY);
@@ -691,8 +691,8 @@ void EnWizFire_DrawFirePoolAndFlame(EnWizFire* this, PlayState* play2) {
OPEN_DISPS(play->state.gfxCtx);
if ((this->type == EN_WIZ_FIRE_TYPE_MAGIC_PROJECTILE) && (this->action == EN_WIZ_FIRE_ACTION_POOL)) {
- func_8012C28C(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
Matrix_Push();
Matrix_Translate(this->actor.world.pos.x, this->actor.floorHeight, this->actor.world.pos.z, MTXMODE_NEW);
@@ -754,8 +754,8 @@ void EnWizFire_Draw(Actor* thisx, PlayState* play2) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
Matrix_Push();
for (i = ARRAY_COUNT(this->magicProjectilePos) - 1; i >= this->lowestUsedIndex; i--) {
@@ -875,8 +875,8 @@ void EnWizFire_DrawEffects(EnWizFire* this, PlayState* play) {
OPEN_DISPS(gfxCtx);
- func_8012C28C(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
materialFlag = false;
for (i = 0; i < ARRAY_COUNT(this->effects); i++, effect++) {
diff --git a/src/overlays/actors/ovl_En_Wood02/z_en_wood02.c b/src/overlays/actors/ovl_En_Wood02/z_en_wood02.c
index 3c0357999..874e0a63e 100644
--- a/src/overlays/actors/ovl_En_Wood02/z_en_wood02.c
+++ b/src/overlays/actors/ovl_En_Wood02/z_en_wood02.c
@@ -486,10 +486,10 @@ void EnWood02_Draw(Actor* thisx, PlayState* play) {
red = green = blue = 255;
}
- func_8012C2DC(gfxCtx);
+ Gfx_SetupDL25_Xlu(gfxCtx);
if ((thisx->params == WOOD_LEAF_GREEN) || (thisx->params == WOOD_LEAF_YELLOW)) {
- func_8012C28C(gfxCtx);
+ Gfx_SetupDL25_Opa(gfxCtx);
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, red, green, blue, 127);
@@ -501,7 +501,7 @@ void EnWood02_Draw(Actor* thisx, PlayState* play) {
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_XLU_DISP++, D_808C4D70[this->drawType & 0xF]);
} else {
- func_8012C2DC(gfxCtx);
+ Gfx_SetupDL25_Xlu(gfxCtx);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_XLU_DISP++, D_808C4D54[this->drawType & 0xF]);
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 c5224f8e8..4bf82f55a 100644
--- a/src/overlays/actors/ovl_En_Yb/z_en_yb.c
+++ b/src/overlays/actors/ovl_En_Yb/z_en_yb.c
@@ -458,10 +458,10 @@ void EnYb_Draw(Actor* thisx, PlayState* play) {
if (this->alpha != 0) {
if (this->alpha < 255) {
if (this->alpha > 128) {
- func_8012C2B4(POLY_XLU_DISP++);
+ Gfx_SetupDL71(POLY_XLU_DISP++);
Scene_SetRenderModeXlu(play, 2, 2);
} else {
- func_8012C304(POLY_XLU_DISP++);
+ Gfx_SetupDL72(POLY_XLU_DISP++);
Scene_SetRenderModeXlu(play, 1, 2);
}
gDPSetEnvColor(POLY_XLU_DISP++, 0, 0, 0, this->alpha);
@@ -473,7 +473,7 @@ void EnYb_Draw(Actor* thisx, PlayState* play) {
this->skelAnime.dListCount, NULL, EnYb_PostLimbDrawXlu, &this->actor, POLY_XLU_DISP);
} else {
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
Scene_SetRenderModeXlu(play, 0, 1);
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable,
this->skelAnime.dListCount, NULL, EnYb_PostLimbDrawOpa, &this->actor);
diff --git a/src/overlays/actors/ovl_En_Zo/z_en_zo.c b/src/overlays/actors/ovl_En_Zo/z_en_zo.c
index 7a160e368..a732f0124 100644
--- a/src/overlays/actors/ovl_En_Zo/z_en_zo.c
+++ b/src/overlays/actors/ovl_En_Zo/z_en_zo.c
@@ -347,7 +347,8 @@ void EnZo_Draw(Actor* thisx, PlayState* play) {
TexturePtr eyeTextures[] = { gZoraEyeOpenTex, gZoraEyeHalfTex, gZoraEyeClosedTex };
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gDPPipeSync(POLY_OPA_DISP++);
gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 255);
@@ -370,5 +371,6 @@ void EnZo_Draw(Actor* thisx, PlayState* play) {
}
SubS_DrawShadowTex(&this->actor, &play->state, shadowTex);
+
CLOSE_DISPS(play->state.gfxCtx);
}
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 5f1b16e35..cdf6b1766 100644
--- a/src/overlays/actors/ovl_En_Zob/z_en_zob.c
+++ b/src/overlays/actors/ovl_En_Zob/z_en_zob.c
@@ -588,7 +588,7 @@ void func_80BA0728(EnZob* this, PlayState* play) {
sp28.x = this->actor.projectedPos.x;
sp28.y = this->actor.projectedPos.y;
sp28.z = this->actor.projectedPos.z;
- func_801A1FB4(3, &sp28, 0x6C, 1000.0f);
+ func_801A1FB4(SEQ_PLAYER_BGM_SUB, &sp28, NA_BGM_BASS_PLAY, 1000.0f);
}
void func_80BA08E8(EnZob* this, PlayState* play) {
@@ -759,7 +759,7 @@ void EnZob_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
if (this->unk_2F4 & 0x20) {
POLY_OPA_DISP = Gfx_SetFog(POLY_OPA_DISP, 0, 0, 0, 0, this->unk_312, 1000);
diff --git a/src/overlays/actors/ovl_En_Zod/z_en_zod.c b/src/overlays/actors/ovl_En_Zod/z_en_zod.c
index aaf3b85f0..57c85a664 100644
--- a/src/overlays/actors/ovl_En_Zod/z_en_zod.c
+++ b/src/overlays/actors/ovl_En_Zod/z_en_zod.c
@@ -387,7 +387,7 @@ void EnZod_PlayDrumsSequence(EnZod* this, PlayState* play) {
seqPos.y = this->actor.projectedPos.y;
seqPos.z = this->actor.projectedPos.z;
- func_801A1FB4(3, &seqPos, NA_BGM_DRUMS_PLAY, 700.0f);
+ func_801A1FB4(SEQ_PLAYER_BGM_SUB, &seqPos, NA_BGM_DRUMS_PLAY, 700.0f);
}
void func_80BAFA44(EnZod* this, PlayState* play) {
@@ -628,7 +628,7 @@ void EnZod_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
if (this->stateFlags & TIJO_STATE_2) {
POLY_OPA_DISP = Gfx_SetFog(POLY_OPA_DISP, 0, 0, 0, 0, this->fogNear, 1000);
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 ccbb1f752..979187532 100644
--- a/src/overlays/actors/ovl_En_Zog/z_en_zog.c
+++ b/src/overlays/actors/ovl_En_Zog/z_en_zog.c
@@ -1049,11 +1049,11 @@ void EnZog_Draw(Actor* thisx, PlayState* play) {
if (this->unk_30A & 8) {
if (this->unk_322 > 128) {
gfx = POLY_XLU_DISP++;
- func_8012C2B4(gfx);
+ Gfx_SetupDL71(gfx);
Scene_SetRenderModeXlu(play, 2, 2);
} else {
gfx = POLY_XLU_DISP++;
- func_8012C304(gfx);
+ Gfx_SetupDL72(gfx);
Scene_SetRenderModeXlu(play, 1, 2);
}
@@ -1068,7 +1068,7 @@ void EnZog_Draw(Actor* thisx, PlayState* play) {
SkelAnime_DrawFlex(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
NULL, func_80B95598, &this->actor, POLY_XLU_DISP);
} else {
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
Scene_SetRenderModeXlu(play, 0, 1);
gfx = POLY_OPA_DISP;
diff --git a/src/overlays/actors/ovl_En_Zoraegg/z_en_zoraegg.c b/src/overlays/actors/ovl_En_Zoraegg/z_en_zoraegg.c
index 21201346a..0bfc986dc 100644
--- a/src/overlays/actors/ovl_En_Zoraegg/z_en_zoraegg.c
+++ b/src/overlays/actors/ovl_En_Zoraegg/z_en_zoraegg.c
@@ -697,8 +697,9 @@ void func_80B32F04(Actor* thisx, PlayState* play) {
this->actor.scale.z * (((sp7C + 1.0f) * 0.1f) + 9.0f), MTXMODE_APPLY);
OPEN_DISPS(play->state.gfxCtx);
+
gfx = POLY_XLU_DISP;
- gfx = func_8012C868(gfx);
+ gfx = Gfx_SetupDL20_NoCD(gfx);
gSPSetOtherMode(gfx++, G_SETOTHERMODE_H, 4, 4, 0x00000080);
gDPSetCombineLERP(gfx++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0);
@@ -725,13 +726,13 @@ void func_80B331C8(Actor* thisx, PlayState* play) {
Matrix_Scale(this->unk_1E0, this->unk_1E0, this->unk_1E0, MTXMODE_APPLY);
if (this->unk_1ED >= 254) {
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gDPSetRenderMode(POLY_OPA_DISP++, G_RM_FOG_SHADE_A, G_RM_AA_ZB_OPA_SURF2);
gSPDisplayList(POLY_OPA_DISP++, object_zoraegg_DL_005250);
} else {
- func_8012C304(POLY_XLU_DISP++);
+ Gfx_SetupDL72(POLY_XLU_DISP++);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gDPSetRenderMode(POLY_XLU_DISP++, G_RM_FOG_SHADE_A, G_RM_AA_ZB_XLU_SURF2);
@@ -862,7 +863,7 @@ void func_80B33818(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(D_80B33950[this->unk_1F2]));
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 3c11d1bce..bd8ff3435 100644
--- a/src/overlays/actors/ovl_En_Zos/z_en_zos.c
+++ b/src/overlays/actors/ovl_En_Zos/z_en_zos.c
@@ -582,7 +582,7 @@ void func_80BBBDE0(EnZos* this, PlayState* play) {
sp28.x = this->actor.projectedPos.x;
sp28.y = this->actor.projectedPos.y;
sp28.z = this->actor.projectedPos.z;
- func_801A1FB4(3, &sp28, 110, 1000.0f);
+ func_801A1FB4(SEQ_PLAYER_BGM_SUB, &sp28, NA_BGM_PIANO_PLAY, 1000.0f);
}
void func_80BBBFBC(EnZos* this, PlayState* play) {
@@ -738,7 +738,7 @@ void EnZos_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
if (this->unk_2B6 & 0x40) {
POLY_OPA_DISP = Gfx_SetFog(POLY_OPA_DISP, 0, 0, 0, 0, this->unk_2BC, 1000);
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 f382cdf80..2e9fe8b3f 100644
--- a/src/overlays/actors/ovl_En_Zot/z_en_zot.c
+++ b/src/overlays/actors/ovl_En_Zot/z_en_zot.c
@@ -1398,7 +1398,7 @@ void EnZot_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 255);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sp4C[this->unk_2EC]));
diff --git a/src/overlays/actors/ovl_En_Zov/z_en_zov.c b/src/overlays/actors/ovl_En_Zov/z_en_zov.c
index c6dca4bd7..fdf50a820 100644
--- a/src/overlays/actors/ovl_En_Zov/z_en_zov.c
+++ b/src/overlays/actors/ovl_En_Zov/z_en_zov.c
@@ -563,7 +563,7 @@ void EnZov_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
phi_a1 = 0;
curFrame = this->skelAnime.curFrame;
phi_v1 = this->unk_2EC;
diff --git a/src/overlays/actors/ovl_En_Zow/z_en_zow.c b/src/overlays/actors/ovl_En_Zow/z_en_zow.c
index 446470dbe..3e9ef53f4 100644
--- a/src/overlays/actors/ovl_En_Zow/z_en_zow.c
+++ b/src/overlays/actors/ovl_En_Zow/z_en_zow.c
@@ -182,7 +182,7 @@ void func_80BDC830(EnZowStruct* ptr, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
u8 flag = false;
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
for (i = 0; i < 15; i++, ptr++) {
if (ptr->unk_00 == 1) {
@@ -213,7 +213,7 @@ void func_80BDC9DC(EnZowStruct* ptr, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
u8 flag = false;
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
for (i = 0; i < 15; i++, ptr++) {
if (ptr->unk_00 == 3) {
@@ -244,7 +244,7 @@ void func_80BDCB84(EnZowStruct* ptr, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
u8 flag = false;
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
for (i = 0; i < 15; i++, ptr++) {
if (ptr->unk_00 == 2) {
@@ -629,7 +629,7 @@ void EnZow_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
if (this->unk_2CE >= 255) {
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 255);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sp54[this->unk_2C4]));
diff --git a/src/overlays/actors/ovl_Item_B_Heart/z_item_b_heart.c b/src/overlays/actors/ovl_Item_B_Heart/z_item_b_heart.c
index c41f45579..661d24636 100644
--- a/src/overlays/actors/ovl_Item_B_Heart/z_item_b_heart.c
+++ b/src/overlays/actors/ovl_Item_B_Heart/z_item_b_heart.c
@@ -1,3 +1,9 @@
+/*
+ * File: z_item_b_heart.c
+ * Overlay: ovl_Item_B_Heart
+ * Description: Heart Container
+ */
+
#include "z_item_b_heart.h"
#include "objects/object_gi_hearts/object_gi_hearts.h"
@@ -10,7 +16,8 @@ void ItemBHeart_Destroy(Actor* thisx, PlayState* play);
void ItemBHeart_Update(Actor* thisx, PlayState* play);
void ItemBHeart_Draw(Actor* thisx, PlayState* play);
-/*
+void ItemBHeart_UpdateModel(ItemBHeart* this, PlayState* play);
+
const ActorInit Item_B_Heart_InitVars = {
ACTOR_ITEM_B_HEART,
ACTORCAT_BOSS,
@@ -20,16 +27,94 @@ const ActorInit Item_B_Heart_InitVars = {
(ActorFunc)ItemBHeart_Init,
(ActorFunc)ItemBHeart_Destroy,
(ActorFunc)ItemBHeart_Update,
- (ActorFunc)ItemBHeart_Draw
+ (ActorFunc)ItemBHeart_Draw,
};
-*/
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Item_B_Heart/ItemBHeart_Init.s")
+static InitChainEntry sInitChain[] = {
+ ICHAIN_VEC3F_DIV1000(scale, 0, ICHAIN_CONTINUE),
+ ICHAIN_F32(uncullZoneForward, 4000, ICHAIN_CONTINUE),
+ ICHAIN_F32(uncullZoneScale, 800, ICHAIN_CONTINUE),
+ ICHAIN_F32(uncullZoneDownward, 800, ICHAIN_STOP),
+};
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Item_B_Heart/ItemBHeart_Destroy.s")
+void ItemBHeart_Init(Actor* thisx, PlayState* play) {
+ ItemBHeart* this = THIS;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Item_B_Heart/ItemBHeart_Update.s")
+ if (Flags_GetCollectible(play, 0x1F)) {
+ Actor_Kill(&this->actor);
+ return;
+ }
+ Actor_ProcessInitChain(&this->actor, sInitChain);
+ ActorShape_Init(&this->actor.shape, 0.0f, NULL, 0.8f);
+ if (this->actor.params == BHEART_PARAM_SMALL) {
+ this->baseScale = BHEART_SCALE_SMALL;
+ } else {
+ this->baseScale = BHEART_SCALE_NORMAL;
+ }
+ this->actor.world.pos.y += 20.0f * this->baseScale;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Item_B_Heart/func_808BCF54.s")
+void ItemBHeart_Destroy(Actor* thisx, PlayState* play) {
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Item_B_Heart/ItemBHeart_Draw.s")
+/**
+ * Adjusts size and handles collection (if of proper baseScale)
+ */
+void ItemBHeart_Update(Actor* thisx, PlayState* play) {
+ ItemBHeart* this = THIS;
+
+ ItemBHeart_UpdateModel(this, play);
+
+ if (!(this->baseScale < BHEART_SCALE_MIN_COLLECTIBLE)) {
+ if (Actor_HasParent(&this->actor, play)) {
+ Flags_SetCollectible(play, 0x1F);
+ Actor_Kill(&this->actor);
+ return;
+ }
+ Actor_OfferGetItem(&this->actor, play, GI_HEART_CONTAINER, 30.0f, 80.0f);
+ }
+}
+
+/**
+ * Rotate continuously while approaching 40% of object's unit scale.
+ */
+void ItemBHeart_UpdateModel(ItemBHeart* this, PlayState* play) {
+ this->actor.shape.rot.y += 0x400;
+ Math_ApproachF(&this->variableScale, 0.4f, 0.1f, 0.01f);
+ Actor_SetScale(&this->actor, this->variableScale * this->baseScale);
+}
+
+/**
+ * Draw translucently when in front of a boss warp portal
+ */
+void ItemBHeart_Draw(Actor* thisx, PlayState* play) {
+ ItemBHeart* this = THIS;
+ Actor* actorIt;
+ u8 drawTranslucent = false;
+
+ OPEN_DISPS(play->state.gfxCtx);
+
+ actorIt = play->actorCtx.actorLists[ACTORCAT_ITEMACTION].first;
+
+ while (actorIt != NULL) {
+ if ((actorIt->id == ACTOR_DOOR_WARP1) && (actorIt->projectedPos.z > this->actor.projectedPos.z)) {
+ drawTranslucent = true;
+ break;
+ }
+ actorIt = actorIt->next;
+ }
+
+ if (drawTranslucent || (this->actor.world.rot.y != 0)) {
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_XLU_DISP++, &gGiHeartBorderDL);
+ gSPDisplayList(POLY_XLU_DISP++, &gGiHeartContainerDL);
+ } else {
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, &gGiHeartBorderDL);
+ gSPDisplayList(POLY_OPA_DISP++, &gGiHeartContainerDL);
+ }
+
+ CLOSE_DISPS(play->state.gfxCtx);
+}
diff --git a/src/overlays/actors/ovl_Item_B_Heart/z_item_b_heart.h b/src/overlays/actors/ovl_Item_B_Heart/z_item_b_heart.h
index 4e3126e25..7a071a8ec 100644
--- a/src/overlays/actors/ovl_Item_B_Heart/z_item_b_heart.h
+++ b/src/overlays/actors/ovl_Item_B_Heart/z_item_b_heart.h
@@ -3,12 +3,20 @@
#include "global.h"
-struct ItemBHeart;
+typedef enum {
+ /* 0 */ BHEART_PARAM_NORMAL, // Spawn Parameter for Normal Scale.
+ /* 35 */ BHEART_PARAM_SMALL = 35, // Spawn Parameter for Small Scale.
+} ItemBHeartParams;
+
+#define BHEART_SCALE_SMALL (0.1f) // Scale value for Small Mode
+#define BHEART_SCALE_NORMAL (1.0f) // Scale value for Normal Mode
+#define BHEART_SCALE_MIN_COLLECTIBLE (0.5f) // baseScale <50% will disable collection
typedef struct ItemBHeart {
/* 0x000 */ Actor actor;
- /* 0x144 */ UNK_TYPE1 unk_144[0x24];
- /* 0x168 */ f32 unk_168;
+ /* 0x144 */ UNK_TYPE1 unk_144[0x20];
+ /* 0x164 */ f32 variableScale;
+ /* 0x168 */ f32 baseScale;
} ItemBHeart; // size = 0x16C
#endif // Z_ITEM_B_HEART_H
diff --git a/src/overlays/actors/ovl_Mir_Ray/z_mir_ray.c b/src/overlays/actors/ovl_Mir_Ray/z_mir_ray.c
index 4880a326e..61b172ea7 100644
--- a/src/overlays/actors/ovl_Mir_Ray/z_mir_ray.c
+++ b/src/overlays/actors/ovl_Mir_Ray/z_mir_ray.c
@@ -609,7 +609,7 @@ void MirRay_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
Matrix_Scale(1.0f, 1.0f, this->reflectIntensity, MTXMODE_APPLY);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
diff --git a/src/overlays/actors/ovl_Mir_Ray3/z_mir_ray3.c b/src/overlays/actors/ovl_Mir_Ray3/z_mir_ray3.c
index 8f6fcbfe9..ae8c81f26 100644
--- a/src/overlays/actors/ovl_Mir_Ray3/z_mir_ray3.c
+++ b/src/overlays/actors/ovl_Mir_Ray3/z_mir_ray3.c
@@ -361,7 +361,7 @@ void MirRay3_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
Matrix_Scale(1.0f, 1.0f, this->unk_214, MTXMODE_APPLY);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
diff --git a/src/overlays/actors/ovl_Obj_Aqua/z_obj_aqua.c b/src/overlays/actors/ovl_Obj_Aqua/z_obj_aqua.c
index c32fb582d..ca4efd4bb 100644
--- a/src/overlays/actors/ovl_Obj_Aqua/z_obj_aqua.c
+++ b/src/overlays/actors/ovl_Obj_Aqua/z_obj_aqua.c
@@ -274,7 +274,8 @@ void ObjAqua_Draw(Actor* thisx, PlayState* play) {
s32 actionFuncTemp = this->actionFunc == func_80ACBDFC;
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
framesTemp = ((play->gameplayFrames & 0x7FFFFFFF) * -0xA) & 0x1FF;
if (actionFuncTemp) {
framesTemp >>= 1;
diff --git a/src/overlays/actors/ovl_Obj_Armos/z_obj_armos.c b/src/overlays/actors/ovl_Obj_Armos/z_obj_armos.c
index 93adab401..bc1d543cc 100644
--- a/src/overlays/actors/ovl_Obj_Armos/z_obj_armos.c
+++ b/src/overlays/actors/ovl_Obj_Armos/z_obj_armos.c
@@ -350,7 +350,7 @@ void func_809A5960(ObjArmos* this, PlayState* play) {
(Math_CosS(this->dyna.actor.shape.rot.y) * -9.0f) + this->dyna.actor.world.pos.z,
&this->dyna.actor.shape.rot);
Matrix_Scale(0.014f, 0.014f, 0.014f, MTXMODE_APPLY);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 0);
@@ -366,7 +366,7 @@ void func_809A5A3C(ObjArmos* this, PlayState* play) {
if (this->dyna.actor.floorPoly != NULL) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C448(play->state.gfxCtx);
+ Gfx_SetupDL44_Xlu(play->state.gfxCtx);
gDPSetCombineLERP(POLY_XLU_DISP++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, COMBINED, 0, 0, 0,
COMBINED);
diff --git a/src/overlays/actors/ovl_Obj_Bean/z_obj_bean.c b/src/overlays/actors/ovl_Obj_Bean/z_obj_bean.c
index 7cc5dfb17..003b94932 100644
--- a/src/overlays/actors/ovl_Obj_Bean/z_obj_bean.c
+++ b/src/overlays/actors/ovl_Obj_Bean/z_obj_bean.c
@@ -939,7 +939,7 @@ void func_80938E00(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
diff --git a/src/overlays/actors/ovl_Obj_Bell/z_obj_bell.c b/src/overlays/actors/ovl_Obj_Bell/z_obj_bell.c
index fb7f1466c..0a50c85c5 100644
--- a/src/overlays/actors/ovl_Obj_Bell/z_obj_bell.c
+++ b/src/overlays/actors/ovl_Obj_Bell/z_obj_bell.c
@@ -220,13 +220,16 @@ void func_80A359B4(Actor* thisx, PlayState* play) {
Matrix_RotateXS(thisx->world.rot.x, MTXMODE_APPLY);
Matrix_RotateYS(-thisx->world.rot.y, MTXMODE_APPLY);
Matrix_Translate(0.0f, -2600.0f, 0.0f, MTXMODE_APPLY);
+
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, object_f52_obj_DL_000698);
gSPDisplayList(POLY_OPA_DISP++, object_f52_obj_DL_0008D0);
gSPDisplayList(POLY_OPA_DISP++, object_f52_obj_DL_000960);
gSPDisplayList(POLY_OPA_DISP++, object_f52_obj_DL_0007A8);
+
CLOSE_DISPS(play->state.gfxCtx);
}
@@ -234,20 +237,26 @@ void func_80A35B18(Actor* thisx, PlayState* play) {
Matrix_Translate(thisx->world.pos.x, thisx->world.pos.y, thisx->world.pos.z, MTXMODE_NEW);
Matrix_Scale(thisx->scale.x, thisx->scale.y, thisx->scale.z, MTXMODE_APPLY);
Matrix_RotateYS(thisx->shape.rot.y, MTXMODE_APPLY);
+
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, object_f52_obj_DL_000570);
+
CLOSE_DISPS(play->state.gfxCtx);
}
void func_80A35BD4(Actor* thisx, PlayState* play) {
Matrix_Translate(thisx->world.pos.x, thisx->world.pos.y - 4.0f, thisx->world.pos.z, MTXMODE_NEW);
Matrix_Scale(thisx->scale.x, thisx->scale.y, thisx->scale.z, MTXMODE_APPLY);
+
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_XLU_DISP++, object_f52_obj_DL_000840);
+
CLOSE_DISPS(play->state.gfxCtx);
}
diff --git a/src/overlays/actors/ovl_Obj_Bombiwa/z_obj_bombiwa.c b/src/overlays/actors/ovl_Obj_Bombiwa/z_obj_bombiwa.c
index 84b2abc63..66ef9c691 100644
--- a/src/overlays/actors/ovl_Obj_Bombiwa/z_obj_bombiwa.c
+++ b/src/overlays/actors/ovl_Obj_Bombiwa/z_obj_bombiwa.c
@@ -465,7 +465,7 @@ void func_8093A418(Actor* thisx, PlayState* play) {
sp28 = (2300.0f - this->actor.projectedPos.z) * 2.55f;
this->actor.shape.shadowAlpha = sp28 * (32.0f / 51);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 255, (s32)sp28);
@@ -489,20 +489,20 @@ void func_8093A608(Actor* thisx, PlayState* play) {
if (this->actionFunc == func_80939EF4) {
if ((this->actor.projectedPos.z <= 2200.0f) ||
((this->unk_203 & 1) && (this->actor.projectedPos.z < 2300.0f))) {
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, D_801AEFA0);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0x9B, 255, 255, 255, 255);
gSPDisplayList(POLY_OPA_DISP++, object_bombiwa_DL_004560);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_XLU_DISP++, object_bombiwa_DL_004688);
} else if (this->actor.projectedPos.z < 2300.0f) {
sp38 = (2300.0f - this->actor.projectedPos.z) * 2.55f;
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPSegment(POLY_XLU_DISP++, 0x08, D_801AEF88);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
@@ -510,7 +510,7 @@ void func_8093A608(Actor* thisx, PlayState* play) {
gSPDisplayList(POLY_XLU_DISP++, object_bombiwa_DL_004560);
}
} else {
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
for (i = 0; i < ARRAY_COUNT(this->unk_190); i++) {
ptr = &this->unk_190[i];
diff --git a/src/overlays/actors/ovl_Obj_Chan/z_obj_chan.c b/src/overlays/actors/ovl_Obj_Chan/z_obj_chan.c
index 66c927f1d..660d9016d 100644
--- a/src/overlays/actors/ovl_Obj_Chan/z_obj_chan.c
+++ b/src/overlays/actors/ovl_Obj_Chan/z_obj_chan.c
@@ -117,16 +117,16 @@ u32 func_80BB9A1C(ObjChan* this, f32 arg1) {
f32 sp20;
sp20 = Math_SinS(this->unk1D4) * this->unk1D0;
- temp_f6 = (Math_CosS(this->unk1D4) * 0.03834952f * this->unk1D0) + arg1;
+ temp_f6 = (Math_CosS(this->unk1D4) * (400 * M_PI / 0x8000) * this->unk1D0) + arg1;
if (temp_f6 != 0.0f) {
- this->unk1D4 = RAD_TO_BINANG(func_80086B30(sp20 * 0.03834952f, temp_f6));
+ this->unk1D4 = RAD_TO_BINANG(func_80086B30(sp20 * (400 * M_PI / 0x8000), temp_f6));
} else if (sp20 >= 0.0f) {
this->unk1D4 = 0x4000;
} else {
this->unk1D4 = -0x4000;
}
if (Math_CosS(this->unk1D4) != 0.0f) {
- this->unk1D0 = (temp_f6 / (Math_CosS(this->unk1D4) * 0.03834952f));
+ this->unk1D0 = (temp_f6 / (Math_CosS(this->unk1D4) * (400 * M_PI / 0x8000)));
} else {
this->unk1D0 = sp20;
}
@@ -374,14 +374,15 @@ void ObjChan_Draw(Actor* thisx, PlayState* play) {
Gfx* xlu;
OPEN_DISPS(play->state.gfxCtx);
+
Matrix_RotateYS(this->rotation, MTXMODE_APPLY);
- opa = Gfx_CallSetupDL(POLY_OPA_DISP, 0x19);
+ opa = Gfx_SetupDL(POLY_OPA_DISP, SETUPDL_25);
gSPMatrix(&opa[0], Matrix_NewMtx(play->state.gfxCtx), G_MTX_LOAD);
gSPDisplayList(&opa[1], object_obj_chan_DL_000AF0);
POLY_OPA_DISP = &opa[2];
- xlu = func_8012C2B4(POLY_XLU_DISP);
+ xlu = Gfx_SetupDL71(POLY_XLU_DISP);
gSPMatrix(&xlu[0], Matrix_NewMtx(play->state.gfxCtx), G_MTX_LOAD);
gSPDisplayList(&xlu[1], object_obj_chan_DL_000A10);
POLY_XLU_DISP = &xlu[2];
@@ -401,10 +402,12 @@ void ObjChan_DrawPot(Actor* thisx, PlayState* play) {
Gfx* dl;
OPEN_DISPS(play->state.gfxCtx);
- dl = Gfx_CallSetupDL(POLY_OPA_DISP, 0x19);
+
+ dl = Gfx_SetupDL(POLY_OPA_DISP, SETUPDL_25);
gSPMatrix(&dl[0], Matrix_NewMtx(play->state.gfxCtx), G_MTX_LOAD);
gSPDisplayList(&dl[1], object_obj_chan_DL_002358);
POLY_OPA_DISP = &dl[2];
+
CLOSE_DISPS(play->state.gfxCtx);
if (this->stateFlags & OBJCHAN_STATE_ON_FIRE) {
@@ -425,7 +428,7 @@ void ObjChan_DrawFire(ObjChan* this, PlayState* play) {
sObjChanFlameSize[OBJCHAN_SUBTYPE(&this->actor)].y * this->flameSize, 1.0f, MTXMODE_APPLY);
Matrix_Translate(0.0f, sObjChanFlameYOffset[OBJCHAN_SUBTYPE(&this->actor)], 0.0f, MTXMODE_APPLY);
- dl = func_8012C2B4(POLY_XLU_DISP);
+ dl = Gfx_SetupDL71(POLY_XLU_DISP);
gSPMatrix(&dl[0], Matrix_NewMtx(play->state.gfxCtx), G_MTX_LOAD);
gSPSegment(&dl[1], 0x08, Gfx_TwoTexScroll(play->state.gfxCtx, 0, 0, 0, 32, 64, 1, 0, -sp4C * 20, 32, 128));
gDPSetPrimColor(&dl[2], 128, 128, 255, 255, 0, 255);
diff --git a/src/overlays/actors/ovl_Obj_Chikuwa/z_obj_chikuwa.c b/src/overlays/actors/ovl_Obj_Chikuwa/z_obj_chikuwa.c
index b4b27784e..4d2bee782 100644
--- a/src/overlays/actors/ovl_Obj_Chikuwa/z_obj_chikuwa.c
+++ b/src/overlays/actors/ovl_Obj_Chikuwa/z_obj_chikuwa.c
@@ -174,7 +174,7 @@ void ObjChikuwa_Update(Actor* thisx, PlayState* play) {
func_809B17D0(play, this, &temp->unk_00);
temp_fs0 = Math3D_Vec3fDistSq(&temp->unk_00, &GET_PLAYER(play)->actor.world.pos);
if (temp_fs0 < SQ(240.0f)) {
- quakeIndex = Quake_Add(GET_ACTIVE_CAM(play), QUAKE_TYPE_3);
+ quakeIndex = Quake_Request(GET_ACTIVE_CAM(play), QUAKE_TYPE_3);
if (temp_fs0 < SQ(120.0f)) {
quakeVerticalMag = 4;
} else {
@@ -182,8 +182,8 @@ void ObjChikuwa_Update(Actor* thisx, PlayState* play) {
}
Quake_SetSpeed(quakeIndex, 17232);
- Quake_SetQuakeValues(quakeIndex, quakeVerticalMag, 0, 0, 0);
- Quake_SetCountdown(quakeIndex, 7);
+ Quake_SetPerturbations(quakeIndex, quakeVerticalMag, 0, 0, 0);
+ Quake_SetDuration(quakeIndex, 7);
}
}
}
@@ -199,7 +199,7 @@ void ObjChikuwa_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
if (this->unk_2A0 < this->unk_29C) {
for (i = 0; i < this->unk_29C; i++) {
diff --git a/src/overlays/actors/ovl_Obj_Comb/z_obj_comb.c b/src/overlays/actors/ovl_Obj_Comb/z_obj_comb.c
index 412bade05..1f3f7f902 100644
--- a/src/overlays/actors/ovl_Obj_Comb/z_obj_comb.c
+++ b/src/overlays/actors/ovl_Obj_Comb/z_obj_comb.c
@@ -556,7 +556,7 @@ void ObjComb_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
Matrix_Translate(this->actor.world.pos.x, this->actor.world.pos.y + (118.0f * this->actor.scale.y),
this->actor.world.pos.z, MTXMODE_NEW);
Matrix_RotateYS(this->actor.shape.rot.y, MTXMODE_APPLY);
diff --git a/src/overlays/actors/ovl_Obj_Dhouse/z_obj_dhouse.c b/src/overlays/actors/ovl_Obj_Dhouse/z_obj_dhouse.c
index c942f622b..c4e61efa3 100644
--- a/src/overlays/actors/ovl_Obj_Dhouse/z_obj_dhouse.c
+++ b/src/overlays/actors/ovl_Obj_Dhouse/z_obj_dhouse.c
@@ -458,20 +458,20 @@ void func_80B139F4(ObjDhouse* this, PlayState* play) {
s16 quakeIndex;
if (this->unk_1370 == 117) {
- quakeIndex = Quake_Add(camera, QUAKE_TYPE_3);
+ quakeIndex = Quake_Request(camera, QUAKE_TYPE_3);
Quake_SetSpeed(quakeIndex, 20000);
- Quake_SetQuakeValues(quakeIndex, 8, 0, 0, 0);
- Quake_SetCountdown(quakeIndex, 17);
+ Quake_SetPerturbations(quakeIndex, 8, 0, 0, 0);
+ Quake_SetDuration(quakeIndex, 17);
} else if (this->unk_1370 == 105) {
- quakeIndex = Quake_Add(camera, QUAKE_TYPE_3);
+ quakeIndex = Quake_Request(camera, QUAKE_TYPE_3);
Quake_SetSpeed(quakeIndex, 20000);
- Quake_SetQuakeValues(quakeIndex, 7, 0, 0, 0);
- Quake_SetCountdown(quakeIndex, 20);
+ Quake_SetPerturbations(quakeIndex, 7, 0, 0, 0);
+ Quake_SetDuration(quakeIndex, 20);
} else if (this->unk_1370 == 90) {
- quakeIndex = Quake_Add(camera, QUAKE_TYPE_3);
+ quakeIndex = Quake_Request(camera, QUAKE_TYPE_3);
Quake_SetSpeed(quakeIndex, 20000);
- Quake_SetQuakeValues(quakeIndex, 5, 0, 0, 0);
- Quake_SetCountdown(quakeIndex, 62);
+ Quake_SetPerturbations(quakeIndex, 5, 0, 0, 0);
+ Quake_SetDuration(quakeIndex, 62);
}
this->unk_1370--;
@@ -505,7 +505,7 @@ void func_80B13C08(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, object_dhouse_DL_004928);
diff --git a/src/overlays/actors/ovl_Obj_Dinner/z_obj_dinner.c b/src/overlays/actors/ovl_Obj_Dinner/z_obj_dinner.c
index 5a9ef2d05..ee8c84877 100644
--- a/src/overlays/actors/ovl_Obj_Dinner/z_obj_dinner.c
+++ b/src/overlays/actors/ovl_Obj_Dinner/z_obj_dinner.c
@@ -45,7 +45,8 @@ void ObjDinner_Update(Actor* thisx, PlayState* play) {
void ObjDinner_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, object_obj_dinner_DL_0011E0);
diff --git a/src/overlays/actors/ovl_Obj_Dora/z_obj_dora.c b/src/overlays/actors/ovl_Obj_Dora/z_obj_dora.c
index 836a70ba9..8a11c507b 100644
--- a/src/overlays/actors/ovl_Obj_Dora/z_obj_dora.c
+++ b/src/overlays/actors/ovl_Obj_Dora/z_obj_dora.c
@@ -281,7 +281,7 @@ void ObjDora_UpdateCollision(ObjDora* this, PlayState* play) {
this->lastGongHitType = DORA_HIT_STRONG;
}
- func_800BC848(&this->actor, play, 5, 10);
+ Actor_RequestQuakeAndRumble(&this->actor, play, 5, 10);
ObjDora_SetupMoveGong(this);
if ((ObjDora_IsHalfHour(time) == true) && (this->rupeeDropTimer == 0)) {
@@ -321,7 +321,8 @@ void ObjDora_Draw(Actor* thisx, PlayState* play) {
f32 gongForceX;
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
if (this->actionFunc == ObjDora_MoveGong) {
gongForceX = this->gongForce.x;
diff --git a/src/overlays/actors/ovl_Obj_Entotu/z_obj_entotu.c b/src/overlays/actors/ovl_Obj_Entotu/z_obj_entotu.c
index 723dfcf3e..0bd55b296 100644
--- a/src/overlays/actors/ovl_Obj_Entotu/z_obj_entotu.c
+++ b/src/overlays/actors/ovl_Obj_Entotu/z_obj_entotu.c
@@ -104,7 +104,7 @@ void func_80A34A44(ObjEntotu* this, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, object_f53_obj_DL_000158);
@@ -136,7 +136,7 @@ void func_80A34B28(ObjEntotu* this, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_XLU_DISP++, 0x08,
Gfx_TwoTexScroll(play->state.gfxCtx, 0, 0, sp57, 0x20, 0x20, 1, 0, sp56, 0x20, 0x20));
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 ac9184923..22a448e54 100644
--- a/src/overlays/actors/ovl_Obj_Etcetera/z_obj_etcetera.c
+++ b/src/overlays/actors/ovl_Obj_Etcetera/z_obj_etcetera.c
@@ -341,7 +341,7 @@ void ObjEtcetera_DrawIdle(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPDisplayList(POLY_OPA_DISP++, this->dList);
CLOSE_DISPS(play->state.gfxCtx);
@@ -355,6 +355,6 @@ void ObjEtcetera_DrawIdle(Actor* thisx, PlayState* play) {
void ObjEtcetera_DrawAnimated(Actor* thisx, PlayState* play) {
ObjEtcetera* this = THIS;
- func_8012C5B0(play->state.gfxCtx);
+ Gfx_SetupDL37_Opa(play->state.gfxCtx);
SkelAnime_DrawOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, NULL, NULL, &this->dyna.actor);
}
diff --git a/src/overlays/actors/ovl_Obj_Fireshield/z_obj_fireshield.c b/src/overlays/actors/ovl_Obj_Fireshield/z_obj_fireshield.c
index f9f86501d..4804b8b87 100644
--- a/src/overlays/actors/ovl_Obj_Fireshield/z_obj_fireshield.c
+++ b/src/overlays/actors/ovl_Obj_Fireshield/z_obj_fireshield.c
@@ -384,7 +384,7 @@ void ObjFireshield_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gDPSetPrimColor(POLY_XLU_DISP++, 0x80, 0x80, 255, 220, 0, this->unk_1A6);
gDPSetEnvColor(POLY_XLU_DISP++, 255, 0, 0, 0);
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 cc818c883..844f52506 100644
--- a/src/overlays/actors/ovl_Obj_Flowerpot/z_obj_flowerpot.c
+++ b/src/overlays/actors/ovl_Obj_Flowerpot/z_obj_flowerpot.c
@@ -668,7 +668,7 @@ void ObjFlowerpot_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, object_flowerpot_DL_0012E0);
diff --git a/src/overlays/actors/ovl_Obj_Funen/z_obj_funen.c b/src/overlays/actors/ovl_Obj_Funen/z_obj_funen.c
index c3d4d1398..409cbd837 100644
--- a/src/overlays/actors/ovl_Obj_Funen/z_obj_funen.c
+++ b/src/overlays/actors/ovl_Obj_Funen/z_obj_funen.c
@@ -34,7 +34,7 @@ void ObjFunen_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
Matrix_RotateYS((s16)(Camera_GetCamDirYaw(GET_ACTIVE_CAM(play)) - 0x8000), MTXMODE_APPLY);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_MODELVIEW | G_MTX_LOAD | G_MTX_NOPUSH);
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 73aa848a2..85e628359 100644
--- a/src/overlays/actors/ovl_Obj_Ghaka/z_obj_ghaka.c
+++ b/src/overlays/actors/ovl_Obj_Ghaka/z_obj_ghaka.c
@@ -184,11 +184,13 @@ void ObjGhaka_Update(Actor* thisx, PlayState* play) {
void ObjGhaka_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, object_ghaka_DL_001A20);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_XLU_DISP++, object_ghaka_DL_001980);
+
CLOSE_DISPS(play->state.gfxCtx);
}
diff --git a/src/overlays/actors/ovl_Obj_Grass/z_obj_grass.c b/src/overlays/actors/ovl_Obj_Grass/z_obj_grass.c
index b1924c63b..6431a558b 100644
--- a/src/overlays/actors/ovl_Obj_Grass/z_obj_grass.c
+++ b/src/overlays/actors/ovl_Obj_Grass/z_obj_grass.c
@@ -439,7 +439,7 @@ void func_809AA54C(Actor* thisx, PlayState* play2) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, 255);
gSPDisplayList(POLY_OPA_DISP++, gObjGrass_D_809AA9F0);
@@ -484,7 +484,7 @@ void func_809AA798(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPDisplayList(POLY_XLU_DISP++, gObjGrass_D_809AAA68);
diff --git a/src/overlays/actors/ovl_Obj_Hakaisi/z_obj_hakaisi.c b/src/overlays/actors/ovl_Obj_Hakaisi/z_obj_hakaisi.c
index 8b851285a..40db98b1f 100644
--- a/src/overlays/actors/ovl_Obj_Hakaisi/z_obj_hakaisi.c
+++ b/src/overlays/actors/ovl_Obj_Hakaisi/z_obj_hakaisi.c
@@ -349,7 +349,7 @@ void ObjHakaisi_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
if (this->unk_194 == 0) {
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
@@ -429,7 +429,7 @@ void func_80B1544C(Actor* thisx, PlayState* play) {
void func_80B154A0(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
if (OBJHAKAISI_GET_FF(thisx) == 4) {
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
diff --git a/src/overlays/actors/ovl_Obj_Hamishi/z_obj_hamishi.c b/src/overlays/actors/ovl_Obj_Hamishi/z_obj_hamishi.c
index aef42693b..f9d1f0252 100644
--- a/src/overlays/actors/ovl_Obj_Hamishi/z_obj_hamishi.c
+++ b/src/overlays/actors/ovl_Obj_Hamishi/z_obj_hamishi.c
@@ -267,7 +267,7 @@ void ObjHamishi_Draw(Actor* thisx, PlayState* play) {
if ((thisx->projectedPos.z <= 2150.0f) || ((this->unk_1A2 & 1) && (thisx->projectedPos.z < 2250.0f))) {
thisx->shape.shadowAlpha = 160;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, D_801AEFA0);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
@@ -277,7 +277,7 @@ void ObjHamishi_Draw(Actor* thisx, PlayState* play) {
f32 sp20 = (2250.0f - thisx->projectedPos.z) * 2.55f;
thisx->shape.shadowAlpha = sp20 * 0.627451f;
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPSegment(POLY_XLU_DISP++, 0x08, D_801AEF88);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
diff --git a/src/overlays/actors/ovl_Obj_Hariko/z_obj_hariko.c b/src/overlays/actors/ovl_Obj_Hariko/z_obj_hariko.c
index 1c33af7fe..b390644c7 100644
--- a/src/overlays/actors/ovl_Obj_Hariko/z_obj_hariko.c
+++ b/src/overlays/actors/ovl_Obj_Hariko/z_obj_hariko.c
@@ -74,7 +74,7 @@ void ObjHariko_BobHead(ObjHariko* this, PlayState* play) {
}
void ObjHariko_CheckForQuakes(ObjHariko* this) {
- if (Quake_NumActiveQuakes() != 0) {
+ if (Quake_GetNumActiveQuakes() != 0) {
ObjHariko_SetupBobHead(this);
}
}
@@ -90,7 +90,8 @@ void ObjHariko_Draw(Actor* thisx, PlayState* play) {
ObjHariko* this = THIS;
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
Matrix_Push();
Matrix_RotateXS(this->headRotation.x, MTXMODE_APPLY);
@@ -101,5 +102,6 @@ void ObjHariko_Draw(Actor* thisx, PlayState* play) {
gSPDisplayList(POLY_OPA_DISP++, gHarikoFaceDL);
Matrix_Pop();
+
CLOSE_DISPS(play->state.gfxCtx);
}
diff --git a/src/overlays/actors/ovl_Obj_Hgdoor/z_obj_hgdoor.c b/src/overlays/actors/ovl_Obj_Hgdoor/z_obj_hgdoor.c
index 7b0351e78..d69c8d0fd 100644
--- a/src/overlays/actors/ovl_Obj_Hgdoor/z_obj_hgdoor.c
+++ b/src/overlays/actors/ovl_Obj_Hgdoor/z_obj_hgdoor.c
@@ -199,7 +199,8 @@ void ObjHgdoor_Update(Actor* thisx, PlayState* play) {
void ObjHgdoor_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
if (OBJHGDOOR_IS_RIGHT_DOOR(thisx)) {
diff --git a/src/overlays/actors/ovl_Obj_Hsblock/z_obj_hsblock.c b/src/overlays/actors/ovl_Obj_Hsblock/z_obj_hsblock.c
index 26d89f00d..40e8b9323 100644
--- a/src/overlays/actors/ovl_Obj_Hsblock/z_obj_hsblock.c
+++ b/src/overlays/actors/ovl_Obj_Hsblock/z_obj_hsblock.c
@@ -145,7 +145,7 @@ void ObjHsblock_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gDPSetEnvColor(POLY_OPA_DISP++, envColor->r, envColor->g, envColor->b, 255);
gSPDisplayList(POLY_OPA_DISP++, sDisplayLists[OBJHSBLOCK_GET_3(thisx)]);
diff --git a/src/overlays/actors/ovl_Obj_Hugebombiwa/z_obj_hugebombiwa.c b/src/overlays/actors/ovl_Obj_Hugebombiwa/z_obj_hugebombiwa.c
index e69729b92..b04dff8a0 100644
--- a/src/overlays/actors/ovl_Obj_Hugebombiwa/z_obj_hugebombiwa.c
+++ b/src/overlays/actors/ovl_Obj_Hugebombiwa/z_obj_hugebombiwa.c
@@ -293,13 +293,13 @@ void func_80A54600(PlayState* play, Vec3f* arg1, f32 arg2, f32 arg3) {
}
}
-void ObjHugebombiwa_AddQuake(ObjHugebombiwa* this, PlayState* play, s32 quakeVerticalMag) {
+void ObjHugebombiwa_RequestQuakeAndRumble(ObjHugebombiwa* this, PlayState* play, s32 quakeVerticalMag) {
s32 pad[2];
- s16 quakeIndex = Quake_Add(GET_ACTIVE_CAM(play), QUAKE_TYPE_3);
+ s16 quakeIndex = Quake_Request(GET_ACTIVE_CAM(play), QUAKE_TYPE_3);
Quake_SetSpeed(quakeIndex, 20000);
- Quake_SetQuakeValues(quakeIndex, quakeVerticalMag, 0, 0, 0);
- Quake_SetCountdown(quakeIndex, 7);
+ Quake_SetPerturbations(quakeIndex, quakeVerticalMag, 0, 0, 0);
+ Quake_SetDuration(quakeIndex, 7);
Rumble_Request(this->actor.xyzDistToPlayerSq, 255, 20, 150);
}
@@ -516,7 +516,7 @@ void func_80A55064(ObjHugebombiwa* this, PlayState* play) {
ptr->unk_24 = 1;
func_80A53E60(play, &ptr->unk_0C, ptr->unk_18, ptr->unk_00.y * 9.8f);
if ((play->gameplayFrames % 4) == 0) {
- ObjHugebombiwa_AddQuake(this, play, (s32)(Rand_ZeroOne() * 5.5f) + 1);
+ ObjHugebombiwa_RequestQuakeAndRumble(this, play, (s32)(Rand_ZeroOne() * 5.5f) + 1);
}
}
}
@@ -612,7 +612,7 @@ void func_80A55564(ObjHugebombiwa* this, PlayState* play) {
ptr->unk_24 = 1;
func_80A54600(play, &ptr->unk_0C, ptr->unk_18, ptr->unk_00.y * 10.1f);
if ((play->gameplayFrames % 4) == 0) {
- ObjHugebombiwa_AddQuake(this, play, (s32)(Rand_ZeroOne() * 5.5f) + 1);
+ ObjHugebombiwa_RequestQuakeAndRumble(this, play, (s32)(Rand_ZeroOne() * 5.5f) + 1);
}
}
}
@@ -639,21 +639,21 @@ void ObjHugebombiwa_Draw(Actor* thisx, PlayState* play) {
if ((this->actionFunc == func_80A54C04) || (this->actionFunc == func_80A54CEC)) {
if (this->actor.projectedPos.z <= 4300.0f) {
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, D_801AEFA0);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0xFF, 255, 255, 255, 255);
gSPDisplayList(POLY_OPA_DISP++, object_bombiwa_DL_002F60);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_XLU_DISP++, object_bombiwa_DL_003110);
} else if (this->actor.projectedPos.z < 4500.0f) {
sp38 = (4500.0f - this->actor.projectedPos.z) * 1.275f;
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPSegment(POLY_XLU_DISP++, 0x08, D_801AEF88);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
@@ -665,7 +665,7 @@ void ObjHugebombiwa_Draw(Actor* thisx, PlayState* play) {
EnHugebombiwaStruct* ptr;
Gfx* gfx = POLY_OPA_DISP;
- gSPDisplayList(gfx++, &sSetupDL[6 * 25]);
+ gSPDisplayList(gfx++, gSetupDLs[SETUPDL_25]);
for (i = 0; i < ARRAY_COUNT(this->unk_190); i++) {
ptr = &this->unk_190[i];
@@ -697,9 +697,10 @@ void func_80A55B34(Actor* thisx, PlayState* play) {
}
OPEN_DISPS(play->state.gfxCtx);
+
gfx = POLY_OPA_DISP;
- gSPDisplayList(gfx++, &sSetupDL[6 * 25]);
+ gSPDisplayList(gfx++, gSetupDLs[SETUPDL_25]);
for (i = 0; i < ARRAY_COUNT(this->unk_190); i++) {
ptr = &this->unk_190[i];
diff --git a/src/overlays/actors/ovl_Obj_Hunsui/z_obj_hunsui.c b/src/overlays/actors/ovl_Obj_Hunsui/z_obj_hunsui.c
index 41cdd8369..336076199 100644
--- a/src/overlays/actors/ovl_Obj_Hunsui/z_obj_hunsui.c
+++ b/src/overlays/actors/ovl_Obj_Hunsui/z_obj_hunsui.c
@@ -184,8 +184,8 @@ void func_80B9C5E8(ObjHunsui* this, PlayState* play) {
Math_ApproachF(&this->unk_1A0, 3.0f, 1.0f, 1.0f);
Math_ApproachF(&this->unk_19C, this->unk_1A0, 1.0f, 0.1f);
}
- player->unk_B84 = this->unk_1A4;
- player->unk_B80 = this->unk_19C;
+ player->pushedYaw = this->unk_1A4;
+ player->pushedSpeed = this->unk_19C;
}
} else {
if (this->unk_172 & 8) {
diff --git a/src/overlays/actors/ovl_Obj_Ice_Poly/z_obj_ice_poly.c b/src/overlays/actors/ovl_Obj_Ice_Poly/z_obj_ice_poly.c
index 0ef50dc98..10937f985 100644
--- a/src/overlays/actors/ovl_Obj_Ice_Poly/z_obj_ice_poly.c
+++ b/src/overlays/actors/ovl_Obj_Ice_Poly/z_obj_ice_poly.c
@@ -347,7 +347,7 @@ void ObjIcePoly_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
func_800B8118(&this->actor, play, 0);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
diff --git a/src/overlays/actors/ovl_Obj_Iceblock/z_obj_iceblock.c b/src/overlays/actors/ovl_Obj_Iceblock/z_obj_iceblock.c
index a1e0d64bc..a7d2714db 100644
--- a/src/overlays/actors/ovl_Obj_Iceblock/z_obj_iceblock.c
+++ b/src/overlays/actors/ovl_Obj_Iceblock/z_obj_iceblock.c
@@ -1527,7 +1527,7 @@ void func_80A26BF8(ObjIceblock* this, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
sp70.z = 0;
for (i = 0; i < ARRAY_COUNT(this->unk_1B4); i++) {
diff --git a/src/overlays/actors/ovl_Obj_Jgame_Light/z_obj_jgame_light.c b/src/overlays/actors/ovl_Obj_Jgame_Light/z_obj_jgame_light.c
index af05f0ba3..2aae58bad 100644
--- a/src/overlays/actors/ovl_Obj_Jgame_Light/z_obj_jgame_light.c
+++ b/src/overlays/actors/ovl_Obj_Jgame_Light/z_obj_jgame_light.c
@@ -172,11 +172,11 @@ void ObjJgameLight_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, &gObjectSyokudaiTypeSwitchCausesFlameDL);
if (this->alpha > 0) {
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
if (this->alpha > 255) {
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 210, 64, 32, 255);
} else {
@@ -192,7 +192,7 @@ void ObjJgameLight_Draw(Actor* thisx, PlayState* play) {
if (this->flameScaleProportion != 0.0f) {
f32 scale;
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
scale = (this->flameScaleProportion * 27.0f) / 10000.0f;
gSPSegment(POLY_XLU_DISP++, 0x08,
Gfx_TwoTexScroll(play->state.gfxCtx, 0, 0, 0, 0x20, 0x40, 1, 0, (this->flameScroll * -20) & 0x1FF,
diff --git a/src/overlays/actors/ovl_Obj_Kendo_Kanban/z_obj_kendo_kanban.c b/src/overlays/actors/ovl_Obj_Kendo_Kanban/z_obj_kendo_kanban.c
index 26191e397..df518ff43 100644
--- a/src/overlays/actors/ovl_Obj_Kendo_Kanban/z_obj_kendo_kanban.c
+++ b/src/overlays/actors/ovl_Obj_Kendo_Kanban/z_obj_kendo_kanban.c
@@ -499,7 +499,7 @@ void ObjKendoKanban_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
if (this->boardFragments == OBJKENDOKANBAN_PART_FULL) {
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
diff --git a/src/overlays/actors/ovl_Obj_Kinoko/z_obj_kinoko.c b/src/overlays/actors/ovl_Obj_Kinoko/z_obj_kinoko.c
index b52a66d84..5bf35d48d 100644
--- a/src/overlays/actors/ovl_Obj_Kinoko/z_obj_kinoko.c
+++ b/src/overlays/actors/ovl_Obj_Kinoko/z_obj_kinoko.c
@@ -73,7 +73,7 @@ void ObjKinoko_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gfx = POLY_XLU_DISP;
gDPSetPrimColor(&gfx[0], 0, 0, 169, 63, 186, (u8)thisx->speed);
diff --git a/src/overlays/actors/ovl_Obj_Kzsaku/z_obj_kzsaku.c b/src/overlays/actors/ovl_Obj_Kzsaku/z_obj_kzsaku.c
index 31e6905ec..ee8536caa 100644
--- a/src/overlays/actors/ovl_Obj_Kzsaku/z_obj_kzsaku.c
+++ b/src/overlays/actors/ovl_Obj_Kzsaku/z_obj_kzsaku.c
@@ -122,7 +122,7 @@ void ObjKzsaku_Update(Actor* thisx, PlayState* play) {
void ObjKzsaku_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, object_kzsaku_DL_000040);
diff --git a/src/overlays/actors/ovl_Obj_Lift/z_obj_lift.c b/src/overlays/actors/ovl_Obj_Lift/z_obj_lift.c
index a82c9ceea..88d04b780 100644
--- a/src/overlays/actors/ovl_Obj_Lift/z_obj_lift.c
+++ b/src/overlays/actors/ovl_Obj_Lift/z_obj_lift.c
@@ -134,10 +134,10 @@ void func_8093D7A0(ObjLift* this, PlayState* play) {
if (OBJLIFT_GET_7(&this->dyna.actor) == 7) {
func_8093D9C0(this);
} else {
- quakeIndex = Quake_Add(GET_ACTIVE_CAM(play), QUAKE_TYPE_1);
+ quakeIndex = Quake_Request(GET_ACTIVE_CAM(play), QUAKE_TYPE_1);
Quake_SetSpeed(quakeIndex, 10000);
- Quake_SetQuakeValues(quakeIndex, 2, 0, 0, 0);
- Quake_SetCountdown(quakeIndex, 20);
+ Quake_SetPerturbations(quakeIndex, 2, 0, 0, 0);
+ Quake_SetDuration(quakeIndex, 20);
func_8093D88C(this);
}
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 c54378a74..1062d18f8 100644
--- a/src/overlays/actors/ovl_Obj_Lightblock/z_obj_lightblock.c
+++ b/src/overlays/actors/ovl_Obj_Lightblock/z_obj_lightblock.c
@@ -193,18 +193,20 @@ void ObjLightblock_Draw(Actor* thisx, PlayState* play) {
ObjLightblock* this = THIS;
OPEN_DISPS(play->state.gfxCtx);
+
if (this->alpha < 255) {
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPSegment(POLY_XLU_DISP++, 0x08, D_801AEF88);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0x80, 255, 255, 255, this->alpha);
gSPDisplayList(POLY_XLU_DISP++, object_lightblock_DL_000178);
} else {
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, D_801AEFA0);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0x80, 255, 255, 255, 255);
gSPDisplayList(POLY_OPA_DISP++, object_lightblock_DL_000178);
}
+
CLOSE_DISPS(play->state.gfxCtx);
}
diff --git a/src/overlays/actors/ovl_Obj_Lightswitch/z_obj_lightswitch.c b/src/overlays/actors/ovl_Obj_Lightswitch/z_obj_lightswitch.c
index 34479a72a..408668ecb 100644
--- a/src/overlays/actors/ovl_Obj_Lightswitch/z_obj_lightswitch.c
+++ b/src/overlays/actors/ovl_Obj_Lightswitch/z_obj_lightswitch.c
@@ -370,7 +370,7 @@ void ObjLightSwitch_DrawOpa(ObjLightswitch* this, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gDPSetEnvColor(POLY_OPA_DISP++, (u8)(this->colorR >> 6), (u8)(this->colorG >> 6),
((void)0, (u8)(this->colorB >> 6)), (u8)(this->colorAlpha >> 6));
gSPSegment(POLY_OPA_DISP++, 0x09, D_801AEFA0);
@@ -406,7 +406,7 @@ void ObjLightSwitch_DrawXlu(ObjLightswitch* this, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gDPSetEnvColor(POLY_XLU_DISP++, (u8)(this->colorR >> 6), (u8)(this->colorG >> 6),
((void)0, (u8)(this->colorB >> 6)), (u8)(this->colorAlpha >> 6));
gSPSegment(POLY_XLU_DISP++, 0x09, D_801AEF88);
diff --git a/src/overlays/actors/ovl_Obj_Moon_Stone/z_obj_moon_stone.c b/src/overlays/actors/ovl_Obj_Moon_Stone/z_obj_moon_stone.c
index e1ee3cee5..dab7489ee 100644
--- a/src/overlays/actors/ovl_Obj_Moon_Stone/z_obj_moon_stone.c
+++ b/src/overlays/actors/ovl_Obj_Moon_Stone/z_obj_moon_stone.c
@@ -146,13 +146,15 @@ void ObjMoonStone_Draw(Actor* thisx, PlayState* play) {
GraphicsContext* gfxCtx = play->state.gfxCtx;
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
AnimatedMat_Draw(play, Lib_SegmentedToVirtual(gGiMoonsTearTexAnim));
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, gGiMoonsTearItemDL);
Matrix_ReplaceRotation(&play->billboardMtxF);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_XLU_DISP++, gGiMoonsTearGlowDL);
+
CLOSE_DISPS(play->state.gfxCtx);
}
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 7f7f9550a..d5dfed84d 100644
--- a/src/overlays/actors/ovl_Obj_Nozoki/z_obj_nozoki.c
+++ b/src/overlays/actors/ovl_Obj_Nozoki/z_obj_nozoki.c
@@ -4,6 +4,7 @@
* Description: Sakon's Hideout Objects (Sun's Mask, doors, etc)
*/
+#include "prevent_bss_reordering.h"
#include "z_obj_nozoki.h"
#include "objects/object_secom_obj/object_secom_obj.h"
diff --git a/src/overlays/actors/ovl_Obj_Oshihiki/z_obj_oshihiki.c b/src/overlays/actors/ovl_Obj_Oshihiki/z_obj_oshihiki.c
index c3e180f50..736d80d10 100644
--- a/src/overlays/actors/ovl_Obj_Oshihiki/z_obj_oshihiki.c
+++ b/src/overlays/actors/ovl_Obj_Oshihiki/z_obj_oshihiki.c
@@ -591,7 +591,7 @@ void ObjOshihiki_Draw(Actor* thisx, PlayState* play) {
}
this->stateFlags &= ~PUSHBLOCK_MOVE_UNDER;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
AnimatedMat_DrawStep(play, this->texture, this->textureStep);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
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 dbd0dfe31..649343554 100644
--- a/src/overlays/actors/ovl_Obj_Purify/z_obj_purify.c
+++ b/src/overlays/actors/ovl_Obj_Purify/z_obj_purify.c
@@ -255,12 +255,12 @@ void func_80A851C8(Actor* thisx, PlayState* play) {
AnimatedMat_Draw(play, Lib_SegmentedToVirtual(animMat));
}
if (opaDList != NULL) {
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, opaDList);
}
if (xluDList != NULL) {
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_XLU_DISP++, xluDList);
}
@@ -285,7 +285,8 @@ void func_80A85304(Actor* thisx, PlayState* play) {
}
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
for (i = 0; i < ARRAY_COUNT(sp6C); i++) {
index = sp6C[i];
AnimatedMat_Draw(play, Lib_SegmentedToVirtual(info->animMat[index]));
@@ -293,5 +294,6 @@ void func_80A85304(Actor* thisx, PlayState* play) {
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_XLU_DISP++, info->xluDLists[index]);
};
+
CLOSE_DISPS(play->state.gfxCtx);
}
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 0b5021ccb..e06dbc30b 100644
--- a/src/overlays/actors/ovl_Obj_Pzlblock/z_obj_pzlblock.c
+++ b/src/overlays/actors/ovl_Obj_Pzlblock/z_obj_pzlblock.c
@@ -364,7 +364,7 @@ void func_809A3F0C(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, sp28->r, sp28->g, sp28->b, 255);
diff --git a/src/overlays/actors/ovl_Obj_Raillift/z_obj_raillift.c b/src/overlays/actors/ovl_Obj_Raillift/z_obj_raillift.c
index 3c8a7ecc0..d224125dd 100644
--- a/src/overlays/actors/ovl_Obj_Raillift/z_obj_raillift.c
+++ b/src/overlays/actors/ovl_Obj_Raillift/z_obj_raillift.c
@@ -259,12 +259,14 @@ void ObjRaillift_Draw(Actor* thisx, PlayState* play) {
s32 pad;
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08,
Gfx_TwoTexScrollEnvColor(play->state.gfxCtx, 0, play->gameplayFrames, 0, 32, 32, 1, 0, 0, 32, 32, 0, 0,
0, 160));
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, object_raillift_DL_004BF0);
+
CLOSE_DISPS(play->state.gfxCtx);
}
diff --git a/src/overlays/actors/ovl_Obj_Shutter/z_obj_shutter.c b/src/overlays/actors/ovl_Obj_Shutter/z_obj_shutter.c
index 6f93935b2..bd567ca2d 100644
--- a/src/overlays/actors/ovl_Obj_Shutter/z_obj_shutter.c
+++ b/src/overlays/actors/ovl_Obj_Shutter/z_obj_shutter.c
@@ -85,7 +85,7 @@ void ObjShutter_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, gBankShutterDL);
diff --git a/src/overlays/actors/ovl_Obj_Skateblock/z_obj_skateblock.c b/src/overlays/actors/ovl_Obj_Skateblock/z_obj_skateblock.c
index fa04972ef..28ce8cda8 100644
--- a/src/overlays/actors/ovl_Obj_Skateblock/z_obj_skateblock.c
+++ b/src/overlays/actors/ovl_Obj_Skateblock/z_obj_skateblock.c
@@ -684,7 +684,7 @@ void ObjSkateblock_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
AnimatedMat_DrawStep(play, D_80A22A18, 0);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
diff --git a/src/overlays/actors/ovl_Obj_Smork/z_obj_smork.c b/src/overlays/actors/ovl_Obj_Smork/z_obj_smork.c
index dd02f6c1b..a34050cc2 100644
--- a/src/overlays/actors/ovl_Obj_Smork/z_obj_smork.c
+++ b/src/overlays/actors/ovl_Obj_Smork/z_obj_smork.c
@@ -115,7 +115,7 @@ void func_80A3D9C4(ObjSmork* this, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_XLU_DISP++, 0x08,
Gfx_TwoTexScroll(play->state.gfxCtx, 0, 0, sp57, 0x20, 0x20, 1, 0, sp56, 0x20, 0x20));
diff --git a/src/overlays/actors/ovl_Obj_Snowball/z_obj_snowball.c b/src/overlays/actors/ovl_Obj_Snowball/z_obj_snowball.c
index c94d67860..cd9eed10b 100644
--- a/src/overlays/actors/ovl_Obj_Snowball/z_obj_snowball.c
+++ b/src/overlays/actors/ovl_Obj_Snowball/z_obj_snowball.c
@@ -818,7 +818,7 @@ void func_80B04D34(Actor* thisx, PlayState* play) {
if ((ptr->unk_28 != NULL) && (ptr->unk_2C > 0)) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C448(play->state.gfxCtx);
+ Gfx_SetupDL44_Xlu(play->state.gfxCtx);
gDPSetCombineLERP(POLY_XLU_DISP++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, COMBINED, 0, 0,
0, COMBINED);
diff --git a/src/overlays/actors/ovl_Obj_Spidertent/z_obj_spidertent.c b/src/overlays/actors/ovl_Obj_Spidertent/z_obj_spidertent.c
index 907df33fc..fb34d736a 100644
--- a/src/overlays/actors/ovl_Obj_Spidertent/z_obj_spidertent.c
+++ b/src/overlays/actors/ovl_Obj_Spidertent/z_obj_spidertent.c
@@ -812,7 +812,7 @@ void ObjSpidertent_Draw(Actor* thisx, PlayState* play) {
gfx = POLY_XLU_DISP;
- gSPDisplayList(gfx++, &sSetupDL[6 * 25]);
+ gSPDisplayList(gfx++, gSetupDLs[SETUPDL_25]);
gSPMatrix(gfx++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gDPSetPrimColor(gfx++, 0, 0xFF, this->unk_3C2, this->unk_3C3, this->unk_3C4, temp_f18);
gSPDisplayList(gfx++, D_80B31350[params].unk_00);
diff --git a/src/overlays/actors/ovl_Obj_Spinyroll/z_obj_spinyroll.c b/src/overlays/actors/ovl_Obj_Spinyroll/z_obj_spinyroll.c
index 4541baa2a..4ff089a72 100644
--- a/src/overlays/actors/ovl_Obj_Spinyroll/z_obj_spinyroll.c
+++ b/src/overlays/actors/ovl_Obj_Spinyroll/z_obj_spinyroll.c
@@ -659,7 +659,7 @@ void ObjSpinyroll_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
temp_f26 = Math_CosS(this->dyna.actor.shape.rot.y) * 120.0f;
temp_f28 = Math_SinS(this->dyna.actor.shape.rot.y) * -120.0f;
diff --git a/src/overlays/actors/ovl_Obj_Switch/z_obj_switch.c b/src/overlays/actors/ovl_Obj_Switch/z_obj_switch.c
index 2c03f8689..70d6c2619 100644
--- a/src/overlays/actors/ovl_Obj_Switch/z_obj_switch.c
+++ b/src/overlays/actors/ovl_Obj_Switch/z_obj_switch.c
@@ -968,12 +968,14 @@ void ObjSwitch_DrawFloorSwitch(ObjSwitch* this, PlayState* play) {
Gfx* opa;
OPEN_DISPS(play->state.gfxCtx);
+
opa = POLY_OPA_DISP;
- gSPDisplayList(opa++, &sSetupDL[6 * 25]);
+ gSPDisplayList(opa++, gSetupDLs[SETUPDL_25]);
gSPMatrix(opa++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gDPSetPrimColor(opa++, 0, 0x80, this->color.r, this->color.g, this->color.b, 255);
gSPDisplayList(opa++, gFloorSwitch1DL);
POLY_OPA_DISP = opa;
+
CLOSE_DISPS(play->state.gfxCtx);
} else {
Gfx_DrawDListOpa(play, sFloorSwitchDL[OBJ_SWITCH_GET_SUBTYPE(&this->dyna.actor)]);
@@ -990,7 +992,7 @@ void ObjSwitch_DrawVisibleEyeSwitch(ObjSwitch* this, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPSegment(POLY_OPA_DISP++, 0x08, sEyeSwitchTextures[subType][this->eyeTexIndex]);
gSPDisplayList(POLY_OPA_DISP++, sEyeSwitchDL[subType]);
@@ -1004,7 +1006,7 @@ void ObjSwitch_DrawInvisibleEyeSwitch(ObjSwitch* this, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPSegment(POLY_XLU_DISP++, 0x08, sEyeSwitchTextures[subType][this->eyeTexIndex]);
gSPDisplayList(POLY_XLU_DISP++, sEyeSwitchDL[subType]);
@@ -1027,8 +1029,8 @@ void ObjSwitch_DrawCrystalSwitch(ObjSwitch* this, PlayState* play) {
func_800B8118(&this->dyna.actor, play, 0);
AnimatedMat_DrawStep(play, sCrystalSwitchAnimatedMat, this->crystalAnimTimer);
- func_8012C28C(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, gCrystalSwitchBaseDL);
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 902caa42b..1b1ca74a0 100644
--- a/src/overlays/actors/ovl_Obj_Syokudai/z_obj_syokudai.c
+++ b/src/overlays/actors/ovl_Obj_Syokudai/z_obj_syokudai.c
@@ -293,7 +293,8 @@ void ObjSyokudai_Draw(Actor* thisx, PlayState* play) {
f32 flameScale;
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, sDLists[OBJ_SYOKUDAI_GET_TYPE(thisx)]);
if (this->snuffTimer != OBJ_SYOKUDAI_SNUFF_OUT) {
@@ -307,7 +308,7 @@ void ObjSyokudai_Draw(Actor* thisx, PlayState* play) {
flameScale = (f32)this->snuffTimer / OBJ_SYOKUDAI_SNUFF_DEFAULT;
}
flameScale *= 0.0027f;
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPSegment(POLY_XLU_DISP++, 0x08,
Gfx_TwoTexScroll(play->state.gfxCtx, 0, 0, 0, 0x20, 0x40, 1, 0,
(this->flameTexScroll * -OBJ_SYOKUDAI_SNUFF_DEFAULT) & 0x1FF, 0x20, 0x80));
@@ -320,5 +321,6 @@ void ObjSyokudai_Draw(Actor* thisx, PlayState* play) {
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_XLU_DISP++, gEffFire1DL);
}
+
CLOSE_DISPS(play->state.gfxCtx);
}
diff --git a/src/overlays/actors/ovl_Obj_Tokei_Step/z_obj_tokei_step.c b/src/overlays/actors/ovl_Obj_Tokei_Step/z_obj_tokei_step.c
index 6cdada70b..b7f7ece6e 100644
--- a/src/overlays/actors/ovl_Obj_Tokei_Step/z_obj_tokei_step.c
+++ b/src/overlays/actors/ovl_Obj_Tokei_Step/z_obj_tokei_step.c
@@ -61,13 +61,13 @@ void ObjTokeiStep_SetSysMatrix(ObjTokeiStepPanel* panel) {
mtx->zw = panel->pos.z;
}
-void ObjTokeiStep_AddQuake(ObjTokeiStep* this, PlayState* play) {
+void ObjTokeiStep_RequestQuakeAndRumble(ObjTokeiStep* this, PlayState* play) {
s32 pad[2];
- s16 quakeIndex = Quake_Add(GET_ACTIVE_CAM(play), QUAKE_TYPE_3);
+ s16 quakeIndex = Quake_Request(GET_ACTIVE_CAM(play), QUAKE_TYPE_3);
Quake_SetSpeed(quakeIndex, 20000);
- Quake_SetQuakeValues(quakeIndex, 1, 0, 0, 0);
- Quake_SetCountdown(quakeIndex, 7);
+ Quake_SetPerturbations(quakeIndex, 1, 0, 0, 0);
+ Quake_SetDuration(quakeIndex, 7);
Rumble_Request(this->dyna.actor.xyzDistToPlayerSq, 120, 20, 10);
}
@@ -180,7 +180,7 @@ s32 ObjTokeiStep_OpenProcess(ObjTokeiStep* this, PlayState* play) {
}
if (panel->numBounces == 1) {
ObjTokeiStep_SpawnDust(this2, panel, play);
- ObjTokeiStep_AddQuake(this2, play);
+ ObjTokeiStep_RequestQuakeAndRumble(this2, play);
}
}
}
@@ -279,8 +279,9 @@ void ObjTokeiStep_DrawOpen(Actor* thisx, PlayState* play) {
Gfx* gfx;
OPEN_DISPS(play->state.gfxCtx);
+
gfx = POLY_OPA_DISP;
- gSPDisplayList(gfx++, &sSetupDL[6 * 0x19]);
+ gSPDisplayList(gfx++, gSetupDLs[SETUPDL_25]);
for (i = 0; i < ARRAY_COUNT(this->panels); i++) {
panel = &this->panels[i];
@@ -289,5 +290,6 @@ void ObjTokeiStep_DrawOpen(Actor* thisx, PlayState* play) {
gSPDisplayList(gfx++, gClocktowerPanelDL);
}
POLY_OPA_DISP = gfx;
+
CLOSE_DISPS(play->state.gfxCtx);
}
diff --git a/src/overlays/actors/ovl_Obj_Tokei_Turret/z_obj_tokei_turret.c b/src/overlays/actors/ovl_Obj_Tokei_Turret/z_obj_tokei_turret.c
index 3dc8b3297..21fe5f572 100644
--- a/src/overlays/actors/ovl_Obj_Tokei_Turret/z_obj_tokei_turret.c
+++ b/src/overlays/actors/ovl_Obj_Tokei_Turret/z_obj_tokei_turret.c
@@ -72,7 +72,7 @@ void ObjTokeiTurret_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
gfx = POLY_OPA_DISP;
- gSPDisplayList(gfx++, &sSetupDL[6 * 25]);
+ gSPDisplayList(gfx++, gSetupDLs[SETUPDL_25]);
gSPMatrix(gfx++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_MODELVIEW | G_MTX_LOAD);
gSPDisplayList(gfx++, gClockTownTurretPlatformTopDL);
POLY_OPA_DISP = gfx;
diff --git a/src/overlays/actors/ovl_Obj_Tokeidai/z_obj_tokeidai.c b/src/overlays/actors/ovl_Obj_Tokeidai/z_obj_tokeidai.c
index 3b933157b..690823bf8 100644
--- a/src/overlays/actors/ovl_Obj_Tokeidai/z_obj_tokeidai.c
+++ b/src/overlays/actors/ovl_Obj_Tokeidai/z_obj_tokeidai.c
@@ -791,13 +791,13 @@ void ObjTokeidai_Draw(Actor* thisx, PlayState* play) {
if (this->opaDList != NULL) {
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPDisplayList(POLY_OPA_DISP++, this->opaDList);
}
if (this->xluDList != NULL) {
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPDisplayList(POLY_XLU_DISP++, this->xluDList);
}
@@ -809,7 +809,7 @@ void ObjTokeidai_Clock_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
Matrix_Translate(0.0f, this->yTranslation, 0.0f, MTXMODE_APPLY);
Matrix_Translate(0.0f, 0.0f, -1791.0f, MTXMODE_APPLY);
Matrix_RotateXS(-this->xRotation, MTXMODE_APPLY);
@@ -862,12 +862,12 @@ void ObjTokeidai_Counterweight_Draw(Actor* thisx, PlayState* play) {
// Draws the counterweight
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPDisplayList(POLY_OPA_DISP++, this->opaDList);
// Draws the spotlight
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 255, 255, 235, 180, (s32)(this->spotlightIntensity * 2.55f));
gSPDisplayList(POLY_XLU_DISP++, this->xluDList);
@@ -887,7 +887,7 @@ void ObjTokeidai_ExteriorGear_Draw(Actor* thisx, PlayState* play) {
Matrix_Translate(0.0f, 0.0f, 1791.0f, MTXMODE_APPLY);
Matrix_RotateZS(this->minuteRingOrExteriorGearRotation, MTXMODE_APPLY);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPDisplayList(POLY_OPA_DISP++, gClockTowerExteriorGearDL);
CLOSE_DISPS(play->state.gfxCtx);
diff --git a/src/overlays/actors/ovl_Obj_Toudai/z_obj_toudai.c b/src/overlays/actors/ovl_Obj_Toudai/z_obj_toudai.c
index 07561b8cd..b2b5e0314 100644
--- a/src/overlays/actors/ovl_Obj_Toudai/z_obj_toudai.c
+++ b/src/overlays/actors/ovl_Obj_Toudai/z_obj_toudai.c
@@ -36,7 +36,7 @@ void func_80A33B00(ObjToudai* this, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, object_f53_obj_DL_0024E8);
@@ -67,7 +67,7 @@ void func_80A33BB4(ObjToudai* this, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_XLU_DISP++, 0x08,
Gfx_TwoTexScroll(play->state.gfxCtx, 0, 0, sp57, 0x20, 0x80, 1, 0, sp56, 0x20, 0x20));
diff --git a/src/overlays/actors/ovl_Obj_Tree/z_obj_tree.c b/src/overlays/actors/ovl_Obj_Tree/z_obj_tree.c
index 996bc3810..4c30a763e 100644
--- a/src/overlays/actors/ovl_Obj_Tree/z_obj_tree.c
+++ b/src/overlays/actors/ovl_Obj_Tree/z_obj_tree.c
@@ -185,7 +185,7 @@ void ObjTree_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, object_tree_DL_000680);
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 cf692f1bf..9deee12ac 100644
--- a/src/overlays/actors/ovl_Obj_Um/z_obj_um.c
+++ b/src/overlays/actors/ovl_Obj_Um/z_obj_um.c
@@ -1997,7 +1997,7 @@ void func_80B7BEA4(Vec3f* cartBedPos, s16 arg1, Vec3f* arg2, u8 alpha, PlayState
OPEN_DISPS(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, &gIdentityMtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- POLY_OPA_DISP = Gfx_CallSetupDL(POLY_OPA_DISP, 0x2C);
+ POLY_OPA_DISP = Gfx_SetupDL(POLY_OPA_DISP, SETUPDL_44);
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 0, 0, 0, alpha);
gSPMatrix(POLY_OPA_DISP++, sp100, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, gSquareShadowDL);
diff --git a/src/overlays/actors/ovl_Obj_Vspinyroll/z_obj_vspinyroll.c b/src/overlays/actors/ovl_Obj_Vspinyroll/z_obj_vspinyroll.c
index 257e9eb79..793838c8b 100644
--- a/src/overlays/actors/ovl_Obj_Vspinyroll/z_obj_vspinyroll.c
+++ b/src/overlays/actors/ovl_Obj_Vspinyroll/z_obj_vspinyroll.c
@@ -435,7 +435,7 @@ void func_80A3D2C0(Actor* thisx, PlayState* play) {
sp3C.y = this->dyna.actor.shape.rot.y;
sp3C.z = this->dyna.actor.shape.rot.z + 0x4000;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
Matrix_Translate(this->dyna.actor.world.pos.x, this->dyna.actor.world.pos.y + 60.0f, this->dyna.actor.world.pos.z,
MTXMODE_NEW);
Matrix_RotateYS(sp3C.y, MTXMODE_APPLY);
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 075ad18db..ca72d1854 100644
--- a/src/overlays/actors/ovl_Obj_Warpstone/z_obj_warpstone.c
+++ b/src/overlays/actors/ovl_Obj_Warpstone/z_obj_warpstone.c
@@ -168,7 +168,8 @@ void ObjWarpstone_Draw(Actor* thisx, PlayState* play2) {
Gfx_DrawDListOpa(play, sOwlStatueDLs[this->modelIndex]);
if (this->dyna.actor.home.rot.x != 0) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
Matrix_Translate(this->dyna.actor.world.pos.x, this->dyna.actor.world.pos.y + 34.0f,
this->dyna.actor.world.pos.z, MTXMODE_NEW);
Matrix_Mult(&play->billboardMtxF, MTXMODE_APPLY);
@@ -186,6 +187,7 @@ void ObjWarpstone_Draw(Actor* thisx, PlayState* play2) {
Matrix_RotateZF(BINANG_TO_RAD_ALT2(~((play->gameplayFrames * 1200) & 0xFFFF)), MTXMODE_APPLY);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_XLU_DISP++, gEffFlash1DL);
+
CLOSE_DISPS(play->state.gfxCtx);
}
}
diff --git a/src/overlays/actors/ovl_Object_Kankyo/z_object_kankyo.c b/src/overlays/actors/ovl_Object_Kankyo/z_object_kankyo.c
index db78f579b..b8a7b3b16 100644
--- a/src/overlays/actors/ovl_Object_Kankyo/z_object_kankyo.c
+++ b/src/overlays/actors/ovl_Object_Kankyo/z_object_kankyo.c
@@ -550,7 +550,7 @@ void func_808DD3C8(Actor* thisx, PlayState* play2) {
gDPSetEnvColor(POLY_XLU_DISP++, 255, 255, 255, 255);
gSPClearGeometryMode(POLY_XLU_DISP++, G_LIGHTING);
- POLY_XLU_DISP = Gfx_CallSetupDL(POLY_XLU_DISP, 0);
+ POLY_XLU_DISP = Gfx_SetupDL(POLY_XLU_DISP, SETUPDL_0);
gDPSetRenderMode(POLY_XLU_DISP++, G_RM_FOG_SHADE_A, G_RM_ZB_CLD_SURF2);
gSPSetGeometryMode(POLY_XLU_DISP++, G_FOG);
@@ -632,7 +632,7 @@ void func_808DD970(Actor* thisx, PlayState* play2) {
gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(gEffDust5Tex));
gSPClearGeometryMode(POLY_XLU_DISP++, G_LIGHTING);
- POLY_XLU_DISP = Gfx_CallSetupDL(POLY_XLU_DISP, 0);
+ POLY_XLU_DISP = Gfx_SetupDL(POLY_XLU_DISP, SETUPDL_0);
gDPSetRenderMode(POLY_XLU_DISP++, G_RM_FOG_SHADE_A, G_RM_ZB_CLD_SURF2);
gSPSetGeometryMode(POLY_XLU_DISP++, G_FOG);
@@ -666,7 +666,7 @@ void func_808DDE9C(Actor* thisx, PlayState* play2) {
if (end) {
gDPPipeSync(POLY_XLU_DISP++);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 150, 255, 255, 25);
- POLY_XLU_DISP = Gfx_CallSetupDL(POLY_XLU_DISP, 20);
+ POLY_XLU_DISP = Gfx_SetupDL(POLY_XLU_DISP, SETUPDL_20);
}
for (i = 0; i < end; i++) {
@@ -699,7 +699,7 @@ void func_808DDE9C(Actor* thisx, PlayState* play2) {
if (player->actor.floorHeight < play->view.eye.y) {
for (i = 0; i < end; i++) {
if (!phi_s5) {
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gDPSetEnvColor(POLY_XLU_DISP++, 255, 255, 255, 255);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 255, 100);
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 731fe6b77..99bcf4191 100644
--- a/src/overlays/actors/ovl_Oceff_Spot/z_oceff_spot.c
+++ b/src/overlays/actors/ovl_Oceff_Spot/z_oceff_spot.c
@@ -160,7 +160,7 @@ void OceffSpot_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_XLU_DISP++, &sSunSongEffectCylinderMaterialDL);
diff --git a/src/overlays/actors/ovl_Oceff_Storm/z_oceff_storm.c b/src/overlays/actors/ovl_Oceff_Storm/z_oceff_storm.c
index 96d76f807..d3486bb0c 100644
--- a/src/overlays/actors/ovl_Oceff_Storm/z_oceff_storm.c
+++ b/src/overlays/actors/ovl_Oceff_Storm/z_oceff_storm.c
@@ -178,7 +178,7 @@ void OceffStorm_Draw2(Actor* thisx, PlayState* play) {
gDPPipeSync(POLY_XLU_DISP++);
- POLY_XLU_DISP = func_8012C3A4(POLY_XLU_DISP);
+ POLY_XLU_DISP = Gfx_SetupDL64(POLY_XLU_DISP);
gDPSetAlphaDither(POLY_XLU_DISP++, G_AD_NOISE);
gDPSetColorDither(POLY_XLU_DISP++, G_CD_NOISE);
@@ -201,7 +201,7 @@ void OceffStorm_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gDPSetPrimColor(POLY_XLU_DISP++, 0x80, 0x80, 255, 255, 200, 255);
gDPSetEnvColor(POLY_XLU_DISP++, 150, 150, 0, 128);
diff --git a/src/overlays/actors/ovl_Oceff_Wipe/z_oceff_wipe.c b/src/overlays/actors/ovl_Oceff_Wipe/z_oceff_wipe.c
index 42bf6c703..c73e67a1d 100644
--- a/src/overlays/actors/ovl_Oceff_Wipe/z_oceff_wipe.c
+++ b/src/overlays/actors/ovl_Oceff_Wipe/z_oceff_wipe.c
@@ -99,7 +99,7 @@ void OceffWipe_Draw(Actor* thisx, PlayState* play) {
vtxPtr[i * 2 + 1].v.cn[3] = alphaTable[sAlphaIndices[i] & 0xF];
}
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
Matrix_Translate(eye.x + quakeOffset.x, eye.y + quakeOffset.y, eye.z + quakeOffset.z, MTXMODE_NEW);
Matrix_Scale(0.1f, 0.1f, 0.1f, MTXMODE_APPLY);
diff --git a/src/overlays/actors/ovl_Oceff_Wipe2/z_oceff_wipe2.c b/src/overlays/actors/ovl_Oceff_Wipe2/z_oceff_wipe2.c
index 3d8004c5c..7de628750 100644
--- a/src/overlays/actors/ovl_Oceff_Wipe2/z_oceff_wipe2.c
+++ b/src/overlays/actors/ovl_Oceff_Wipe2/z_oceff_wipe2.c
@@ -89,7 +89,7 @@ void OceffWipe2_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
Matrix_Translate(eye.x + quakeOffset.x, eye.y + quakeOffset.y, eye.z + quakeOffset.z, MTXMODE_NEW);
Matrix_Scale(0.1f, 0.1f, 0.1f, MTXMODE_APPLY);
diff --git a/src/overlays/actors/ovl_Oceff_Wipe3/z_oceff_wipe3.c b/src/overlays/actors/ovl_Oceff_Wipe3/z_oceff_wipe3.c
index 52031ce00..f7156878c 100644
--- a/src/overlays/actors/ovl_Oceff_Wipe3/z_oceff_wipe3.c
+++ b/src/overlays/actors/ovl_Oceff_Wipe3/z_oceff_wipe3.c
@@ -90,7 +90,7 @@ void OceffWipe3_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
Matrix_Translate(eye.x + quakeOffset.x, eye.y + quakeOffset.y, eye.z + quakeOffset.z, MTXMODE_NEW);
Matrix_Scale(0.1f, 0.1f, 0.1f, MTXMODE_APPLY);
Matrix_ReplaceRotation(&play->billboardMtxF);
diff --git a/src/overlays/actors/ovl_Oceff_Wipe4/z_oceff_wipe4.c b/src/overlays/actors/ovl_Oceff_Wipe4/z_oceff_wipe4.c
index 3554bc78a..d82c117e9 100644
--- a/src/overlays/actors/ovl_Oceff_Wipe4/z_oceff_wipe4.c
+++ b/src/overlays/actors/ovl_Oceff_Wipe4/z_oceff_wipe4.c
@@ -88,7 +88,7 @@ void OceffWipe4_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
Matrix_Translate(eye.x + quakeOffset.x, eye.y + quakeOffset.y, eye.z + quakeOffset.z, MTXMODE_NEW);
Matrix_Scale(0.1f, 0.1f, 0.1f, MTXMODE_APPLY);
diff --git a/src/overlays/actors/ovl_Oceff_Wipe5/z_oceff_wipe5.c b/src/overlays/actors/ovl_Oceff_Wipe5/z_oceff_wipe5.c
index 93caeb33d..3dcb06d5d 100644
--- a/src/overlays/actors/ovl_Oceff_Wipe5/z_oceff_wipe5.c
+++ b/src/overlays/actors/ovl_Oceff_Wipe5/z_oceff_wipe5.c
@@ -72,7 +72,7 @@ void OceffWipe5_Draw(Actor* thisx, PlayState* play) {
s32 i;
s32 pad2;
Vec3f activeCamEye = GET_ACTIVE_CAM(play)->eye;
- Camera* cam = GET_ACTIVE_CAM(play);
+ Camera* activeCam = GET_ACTIVE_CAM(play);
Vec3f quakeOffset;
u8 alpha;
s32 colorIndex = OCEFF_WIPE5_GET_SONG_TYPE(thisx) * 3;
@@ -88,7 +88,7 @@ void OceffWipe5_Draw(Actor* thisx, PlayState* play) {
colorIndex = 0;
}
- Camera_GetQuakeOffset(&quakeOffset, cam);
+ Camera_GetQuakeOffset(&quakeOffset, activeCam);
if (this->counter < 32) {
z = Math_SinS(this->counter << 9) * phi_fv1;
@@ -107,7 +107,7 @@ void OceffWipe5_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
Matrix_Translate(activeCamEye.x + quakeOffset.x, activeCamEye.y + quakeOffset.y, activeCamEye.z + quakeOffset.z,
MTXMODE_NEW);
diff --git a/src/overlays/actors/ovl_Oceff_Wipe6/z_oceff_wipe6.c b/src/overlays/actors/ovl_Oceff_Wipe6/z_oceff_wipe6.c
index 87dbe2752..244870f9d 100644
--- a/src/overlays/actors/ovl_Oceff_Wipe6/z_oceff_wipe6.c
+++ b/src/overlays/actors/ovl_Oceff_Wipe6/z_oceff_wipe6.c
@@ -86,7 +86,7 @@ void OceffWipe6_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
Matrix_Translate(activeCamEye.x + quakeOffset.x, activeCamEye.y + quakeOffset.y, activeCamEye.z + quakeOffset.z,
MTXMODE_NEW);
Matrix_Scale(0.1f, 0.1f, 0.1f, MTXMODE_APPLY);
diff --git a/src/overlays/actors/ovl_Oceff_Wipe7/z_oceff_wipe7.c b/src/overlays/actors/ovl_Oceff_Wipe7/z_oceff_wipe7.c
index f269a89a5..fb8011c60 100644
--- a/src/overlays/actors/ovl_Oceff_Wipe7/z_oceff_wipe7.c
+++ b/src/overlays/actors/ovl_Oceff_Wipe7/z_oceff_wipe7.c
@@ -88,7 +88,7 @@ void OceffWipe7_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
Matrix_Translate(activeCamEye.x + quakeOffset.x, activeCamEye.y + quakeOffset.y, activeCamEye.z + quakeOffset.z,
MTXMODE_NEW);
Matrix_Scale(0.1f, 0.1f, 0.1f, MTXMODE_APPLY);
diff --git a/src/overlays/actors/ovl_TG_Sw/z_tg_sw.c b/src/overlays/actors/ovl_TG_Sw/z_tg_sw.c
index 5523ded78..6279c367e 100644
--- a/src/overlays/actors/ovl_TG_Sw/z_tg_sw.c
+++ b/src/overlays/actors/ovl_TG_Sw/z_tg_sw.c
@@ -34,18 +34,17 @@ ActorInit TG_Sw_InitVars = {
void TGSw_ActionDecider(TGSw* this, PlayState* play) {
f32 scaledAbsoluteRotZ;
f32 scaledAbsoluteRotY;
- u8 unk1F4;
+ PlayerImpactType playerImpactType;
- // Maybe actorCtx Debug Flag?
- if (play->actorCtx.unk_1F4.timer != 0) {
+ if (play->actorCtx.playerImpact.timer != 0) {
scaledAbsoluteRotY = ABS_ALT(this->actor.world.rot.y) * 4.0f;
scaledAbsoluteRotZ = ABS_ALT(this->actor.world.rot.z) * 4.0f;
if ((scaledAbsoluteRotZ < this->actor.xzDistToPlayer) || (scaledAbsoluteRotY < this->actor.playerHeightRel)) {
return;
}
- unk1F4 = play->actorCtx.unk_1F4.unk_00;
- if (unk1F4 == 2 || unk1F4 == 0) {
+ playerImpactType = play->actorCtx.playerImpact.type;
+ if ((playerImpactType == PLAYER_IMPACT_BONK) || (playerImpactType == PLAYER_IMPACT_GORON_GROUND_POUND)) {
this->actionFunc = TGSw_ActionExecuteOneShot;
}
}
diff --git a/src/overlays/actors/ovl_player_actor/z_player.c b/src/overlays/actors/ovl_player_actor/z_player.c
index 1f92e8825..04f7a6286 100644
--- a/src/overlays/actors/ovl_player_actor/z_player.c
+++ b/src/overlays/actors/ovl_player_actor/z_player.c
@@ -9,1297 +9,20200 @@
#include "z64rumble.h"
#include "z64shrink_window.h"
-#define THIS ((Player*)thisx)
+#include "overlays/actors/ovl_Arms_Hook/z_arms_hook.h"
+#include "overlays/actors/ovl_Door_Spiral/z_door_spiral.h"
+#include "overlays/actors/ovl_Door_Shutter/z_door_shutter.h"
+#include "overlays/actors/ovl_En_Arrow/z_en_arrow.h"
+#include "overlays/actors/ovl_En_Bom/z_en_bom.h"
+#include "overlays/actors/ovl_En_Boom/z_en_boom.h"
+#include "overlays/actors/ovl_En_Box/z_en_box.h"
+#include "overlays/actors/ovl_En_Door/z_en_door.h"
+#include "overlays/actors/ovl_En_Horse/z_en_horse.h"
+#include "overlays/actors/ovl_En_Ishi/z_en_ishi.h"
+#include "overlays/actors/ovl_En_Test3/z_en_test3.h"
+#include "overlays/actors/ovl_En_Test7/z_en_test7.h"
+#include "overlays/actors/ovl_En_Torch2/z_en_torch2.h"
-extern UNK_TYPE D_06008860;
-extern UNK_TYPE D_0600BDD8;
-extern UNK_TYPE D_060178D0;
+#include "overlays/effects/ovl_Effect_Ss_G_Splash/z_eff_ss_g_splash.h"
+
+#include "objects/gameplay_keep/gameplay_keep.h"
+
+#include "objects/object_link_boy/object_link_boy.h"
+#include "objects/object_link_goron/object_link_goron.h"
+#include "objects/object_link_zora/object_link_zora.h"
+#include "objects/object_link_nuts/object_link_nuts.h"
+#include "objects/object_link_child/object_link_child.h"
+
+#define THIS ((Player*)thisx)
void Player_Init(Actor* thisx, PlayState* play);
void Player_Destroy(Actor* thisx, PlayState* play);
void Player_Update(Actor* thisx, PlayState* play);
void Player_Draw(Actor* thisx, PlayState* play);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082DA90.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082DABC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082DAD4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082DAFC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082DB18.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082DB3C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082DB60.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082DB90.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082DBC0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082DC28.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082DC38.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082DC64.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082DCA0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082DD2C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082DE14.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082DE50.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082DE88.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082DF2C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082DF48.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082DF8C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082E00C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082E078.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082E094.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082E0CC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082E0F4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082E12C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082E188.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082E1BC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082E1F0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082E224.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082E438.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082E4A4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082E514.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082E55C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082E5A8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082E5EC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082E634.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082E67C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082E6D0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082E6F8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082E784.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082E794.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082E820.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082E920.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082E9C8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082EA10.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082EA38.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082EA60.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082EA80.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082EAC8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082EAF0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082EB18.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082EB38.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082EC9C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082ECCC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082ECE0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082ED20.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082ED94.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082EEA4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082EEE0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082EF20.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082EF54.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082EF9C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082EFE4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082F02C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082F09C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082F0E4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082F164.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082F1AC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082F43C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082F470.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082F524.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082F594.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082F5A4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082F5C0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082F5FC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082F62C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082F7F4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082F8A0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082F8BC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082F938.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082FA5C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082FB68.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082FBE8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082FC24.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082FC60.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082FC78.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082FCC4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082FD0C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082FDC4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082FE0C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808302CC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808304BC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808305BC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808306F8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808308DC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808309CC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80830A58.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80830AE8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80830B38.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80830B88.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80830CE8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80830D40.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80830DF0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80830E30.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80830F9C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80830FD4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80831010.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80831094.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80831124.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80831194.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083133C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808313A8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808313F0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80831454.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80831494.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083172C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80831760.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808317C4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80831814.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808318C0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80831944.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80831990.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80831F34.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80832090.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083213C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083216C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808323C0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80832444.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083249C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808324EC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80832558.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80832578.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80832660.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80832754.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80832888.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80832CAC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80832F24.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80832F78.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80833058.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808331FC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808332A0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808333CC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808334D4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808335B0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808335F4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80833728.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083375C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80833864.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80833998.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808339B4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808339D4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80833A64.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80833AA0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80833B18.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808340AC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808340D4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80834104.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80834140.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808341F4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808344C0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80834534.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083456C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808345A8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808345C8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80834600.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80834CD0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80834D50.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80834DB8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80834DFC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80835324.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808353DC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80835428.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808354A4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808355D8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083562C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80835BC8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80835BF8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80835C64.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80835CD8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80835D2C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80835D58.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80835DF8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80835EAC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083604C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80836258.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808365DC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80836888.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083692C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80836988.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808369F4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80836A5C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80836A98.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80836AD8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80836B3C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80836C70.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80836D8C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80836DC0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80836EA0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80836F10.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808370D4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80837134.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808373A4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808373F8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80837730.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083784C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808378FC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083798C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808379C0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80837B60.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80837BD0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80837BF8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80837C20.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80837C78.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80837CEC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80837DEC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808381A0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808381F8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083827C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083868C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80838760.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808387A0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80838830.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808388B8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808389BC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80838A20.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80838A90.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808391D8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80839518.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808395F0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808396B8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80839770.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80839800.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80839860.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80839978.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80839A10.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80839A84.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80839B18.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80839CD8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80839E3C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80839E74.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80839ED0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80839F98.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083A04C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083A0CC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083A114.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083A274.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083A4A4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083A548.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083A580.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083A658.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083A6C0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083A794.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083A844.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083A878.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083A98C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083AD04.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083AD8C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083ADB8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083ADF0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083AE38.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083AECC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083AF30.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083AF8C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083B030.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083B090.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083B0E4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083B1A0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083B23C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083B29C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083B2E4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083B32C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083B3B4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083B73C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083B798.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083B850.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083B8D0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083B930.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083BB4C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083BF54.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083C62C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083C6E8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083C85C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083C8E8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083CB04.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083CB58.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083CBC4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083CCB4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083CF68.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083D168.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083D23C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083D6DC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083D738.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083D78C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083D860.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083DCC4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083DD1C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083DEE4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083DF38.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083DFC4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083E14C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083E234.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083E28C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083E2F4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083E354.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083E404.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083E514.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083E758.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083E7F8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083E8E0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083E958.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083E9C4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083EA44.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083EBD0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083EE60.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083F144.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083F190.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083F230.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083F27C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083F358.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083F57C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083F828.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083F8A8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083FBC4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083FCF0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083FD80.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083FE38.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083FE90.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083FEF4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083FF30.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083FFEC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80840094.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808400CC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808401F4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80840770.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80840980.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808409A8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80840A30.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80840CD4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80840DEC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80840E24.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80840E5C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80840EC0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80840F34.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80840F90.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808411D4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808412A0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808412BC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80841358.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80841408.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808414E0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80841528.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808415A0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808415E4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80841624.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80841744.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084182C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80841A50.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/Player_Init.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80842510.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808425B4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808426F0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808430E0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80843178.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80843EC0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808442D8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808445C4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808446F4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80844784.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80844D80.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80844EF8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/Player_Update.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808463C0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80846460.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/Player_Draw.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/Player_Destroy.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80847190.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084748C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808475B4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808477D0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80847880.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80847994.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808479F4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80847A50.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80847A94.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80847BF0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80847E2C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80847ED4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80847F1C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80847FF8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80848048.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80848094.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808481CC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80848250.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80848294.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808482E0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808484CC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808484F0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80848570.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80848640.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80848780.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808487B8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80848808.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084894C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80848A0C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80848AB0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80848B6C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80848BF4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80848E4C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80849054.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808490B4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808491B4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084923C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808492C4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084933C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80849570.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80849620.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808496AC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808497A0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80849A9C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80849DD0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80849FE0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084A26C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084A5C0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084A794.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084A884.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084A8E8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084AB4C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084AC84.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084AEEC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084AF9C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084B0EC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084B288.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084B3B8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084B4A8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084B5C0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084BAA4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084BBF0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084BC64.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084BE40.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084BF28.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084BFDC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084C124.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084C16C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084C6EC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084C94C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084CA24.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084CB58.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084CCEC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084CE84.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084D18C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084D4EC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084D770.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084D820.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084E034.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084E25C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084E334.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084E434.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084E4E4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084E58C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084E65C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084E724.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084E980.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084ED9C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084EE50.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084EF9C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084F1B8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084F3DC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084F4E8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084FC0C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084FD7C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084FE48.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084FE7C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808505D0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80850734.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80850854.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808508C8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80850B18.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80850BA8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80850BF8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80850D20.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80850D68.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808513EC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80851588.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808516B4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808519FC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80851B58.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80851BD4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80851C40.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80851D30.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80851EAC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80851EC8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80851F18.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808521E0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80852290.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085255C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808525C4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085269C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80852B28.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80852C04.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80852FD4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808530E0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80853194.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808534C0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80853754.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80853850.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80853A5C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80853CC0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80853D68.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80854010.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808540A0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80854118.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085421C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085437C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085439C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80854430.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80854614.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808546D0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80854800.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808548B8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80854C70.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80854CD0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80854EFC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808550D0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80855218.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808553F4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80855818.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80855A7C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80855AF4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80855B9C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80855C28.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80855E08.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80855F9C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80856000.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80856074.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80856110.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808561B0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808566C0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085687C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80856888.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80856918.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808573A4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80857640.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808576BC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808577E0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80857950.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80857A44.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80857AEC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80857BE8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80858C84.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80858CC8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80858D48.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80858DB4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80858DDC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80858DFC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80858E40.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80858E60.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80858E80.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80858EA0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80858EC0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80858EFC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80858F1C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80858F3C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80858F5C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80858F7C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80858F9C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80858FBC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80858FE8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80859028.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80859168.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808591BC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80859210.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80859248.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085929C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80859300.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80859414.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808594D0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808595B8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085968C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80859708.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085978C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80859890.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80859990.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808599DC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80859A10.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80859A44.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80859AD0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80859AF8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80859B28.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80859B54.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80859BA8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80859C60.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80859CA0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80859CE0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80859CFC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80859D44.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80859D70.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80859EBC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80859F4C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80859FCC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80859FF4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085A04C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085A120.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085A144.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085A19C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085A1D4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085A24C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085A2AC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085A330.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085A364.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085A40C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085A4A4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085A530.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085A5DC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085A66C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085A6C0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085A710.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085A768.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085A7C0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085A8C4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085A940.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085AA10.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085AA60.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085AA84.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085AACC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085AB58.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085ABA8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085AC9C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085AD5C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085ADA0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085B08C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085B134.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085B170.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085B1F0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085B28C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085B384.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085B3E0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085B460.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085B74C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085B820.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085B854.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085B930.s")
+s32 Player_GrabPlayer(PlayState* play, Player* player);
+s32 func_8085B28C(PlayState* play, Player* this, PlayerCsMode csMode);
+void func_8085B384(Player* this, PlayState* play);
+s32 Player_InflictDamage(PlayState* play, s32 damage);
+void Player_TalkWithPlayer(PlayState* play, Actor* actor);
+void func_8085B74C(PlayState* play);
+void func_8085B820(PlayState* play, s16 arg1);
+PlayerItemAction func_8085B854(PlayState* play, Player* player, ItemId itemId);
+s32 func_8085B930(PlayState* play, PlayerAnimationHeader* talkAnim, AnimationMode animMode);
+
+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 func_80831990(PlayState* play, Player* this, ItemId item);
+
+s32 func_80848BF4(Player* this, PlayState* play);
+
+void func_80836988(Player* this, PlayState* play);
+
+void func_808484F0(Player* this);
+
+void func_80838A20(PlayState* play, Player* this);
+void func_80839978(PlayState* play, Player* this);
+void func_80839A10(PlayState* play, Player* this);
+
+typedef enum AnimSfxType {
+ /* 1 */ ANIMSFX_TYPE_GENERAL = 1,
+ /* 2 */ ANIMSFX_TYPE_FLOOR,
+ /* 3 */ ANIMSFX_TYPE_FLOOR_BY_AGE,
+ /* 4 */ ANIMSFX_TYPE_VOICE,
+ /* 5 */ ANIMSFX_TYPE_FLOOR_LAND, // does not use sfxId
+ /* 6 */ ANIMSFX_TYPE_6, // FLOOR_WALK_Something // does not use sfxId
+ /* 7 */ ANIMSFX_TYPE_FLOOR_JUMP, // does not use sfxId
+ /* 8 */ ANIMSFX_TYPE_8, // FLOOR_WALK_Something2 // does not use sfxId
+ /* 9 */ ANIMSFX_TYPE_9, // Uses NA_SE_PL_WALK_LADDER // does not use sfxId, unused
+ /* 10 */ ANIMSFX_TYPE_SURFACE,
+} AnimSfxType;
+
+#define ANIMSFX_SHIFT_TYPE(type) ((type) << 11)
+
+#define ANIMSFX_CONTINUE (1)
+#define ANIMSFX_STOP (0)
+
+#define ANIMSFX_FLAGS(type, frame, cont) \
+ (((ANIMSFX_##cont) == ANIMSFX_STOP ? -1 : 1) * (ANIMSFX_SHIFT_TYPE(type) | ((frame)&0x7FF)))
+
+#define ANIMSFX(type, frame, sfxId, cont) \
+ { (sfxId), ANIMSFX_FLAGS(type, frame, cont) }
+
+#define ANIMSFX_GET_TYPE(data) ((data)&0x7800)
+#define ANIMSFX_GET_FRAME(data) ((data)&0x7FF)
+
+typedef struct AnimSfxEntry {
+ /* 0x0 */ u16 sfxId;
+ /* 0x2 */ s16 flags; // negative marks the end
+} AnimSfxEntry; // size = 0x4
+
+/* action funcs */
+void func_808496AC(Player* this, PlayState* play);
+void func_808497A0(Player* this, PlayState* play);
+void func_80849A9C(Player* this, PlayState* play);
+void func_80849DD0(Player* this, PlayState* play);
+void func_80849FE0(Player* this, PlayState* play);
+void func_8084A26C(Player* this, PlayState* play);
+void func_8084A5C0(Player* this, PlayState* play);
+void func_8084A794(Player* this, PlayState* play);
+void func_8084A884(Player* this, PlayState* play);
+void func_8084A8E8(Player* this, PlayState* play);
+void func_8084AB4C(Player* this, PlayState* play);
+void func_8084AC84(Player* this, PlayState* play);
+void func_8084AEEC(Player* this, PlayState* play);
+void func_8084AF9C(Player* this, PlayState* play);
+void func_8084B0EC(Player* this, PlayState* play);
+void func_8084B288(Player* this, PlayState* play);
+void func_8084B3B8(Player* this, PlayState* play);
+void func_8084B4A8(Player* this, PlayState* play);
+void func_8084B5C0(Player* this, PlayState* play);
+void func_8084BAA4(Player* this, PlayState* play);
+void func_8084BBF0(Player* this, PlayState* play);
+void func_8084BC64(Player* this, PlayState* play);
+void func_8084BE40(Player* this, PlayState* play);
+void func_8084BF28(Player* this, PlayState* play);
+void func_8084BFDC(Player* this, PlayState* play);
+void func_8084C16C(Player* this, PlayState* play);
+void func_8084C6EC(Player* this, PlayState* play);
+void func_8084C94C(Player* this, PlayState* play);
+void func_8084CA24(Player* this, PlayState* play);
+void func_8084CB58(Player* this, PlayState* play);
+void func_8084CCEC(Player* this, PlayState* play);
+void func_8084CE84(Player* this, PlayState* play);
+void func_8084D18C(Player* this, PlayState* play);
+void func_8084D4EC(Player* this, PlayState* play);
+void func_8084D770(Player* this, PlayState* play);
+void func_8084D820(Player* this, PlayState* play);
+void func_8084E034(Player* this, PlayState* play);
+void func_8084E25C(Player* this, PlayState* play);
+void func_8084E334(Player* this, PlayState* play);
+void func_8084E434(Player* this, PlayState* play);
+void func_8084E4E4(Player* this, PlayState* play);
+void func_8084E58C(Player* this, PlayState* play);
+void func_8084E65C(Player* this, PlayState* play);
+void func_8084E724(Player* this, PlayState* play);
+void func_8084E980(Player* this, PlayState* play);
+void func_8084ED9C(Player* this, PlayState* play);
+void func_8084EE50(Player* this, PlayState* play);
+void func_8084EF9C(Player* this, PlayState* play);
+void func_8084F1B8(Player* this, PlayState* play);
+void func_8084F3DC(Player* this, PlayState* play);
+void func_8084F4E8(Player* this, PlayState* play);
+void func_8084FC0C(Player* this, PlayState* play);
+void func_8084FE7C(Player* this, PlayState* play);
+void func_808505D0(Player* this, PlayState* play);
+void func_808508C8(Player* this, PlayState* play);
+void func_80850B18(Player* this, PlayState* play);
+void func_80850D68(Player* this, PlayState* play);
+void func_808513EC(Player* this, PlayState* play);
+void func_80851588(Player* this, PlayState* play);
+void func_808516B4(Player* this, PlayState* play);
+void func_808519FC(Player* this, PlayState* play);
+void func_80851B58(Player* this, PlayState* play);
+void func_80851BD4(Player* this, PlayState* play);
+void func_8085269C(Player* this, PlayState* play);
+void func_80852B28(Player* this, PlayState* play);
+void func_80852C04(Player* this, PlayState* play);
+void func_80852FD4(Player* this, PlayState* play);
+void func_80853194(Player* this, PlayState* play);
+void func_808534C0(Player* this, PlayState* play);
+void func_80853754(Player* this, PlayState* play);
+void func_80853850(Player* this, PlayState* play);
+void func_80853A5C(Player* this, PlayState* play);
+void func_80853CC0(Player* this, PlayState* play);
+void func_80853D68(Player* this, PlayState* play);
+void func_80854010(Player* this, PlayState* play);
+void func_808540A0(Player* this, PlayState* play);
+void func_80854118(Player* this, PlayState* play);
+void func_8085421C(Player* this, PlayState* play);
+void func_8085437C(Player* this, PlayState* play);
+void func_8085439C(Player* this, PlayState* play);
+void func_80854430(Player* this, PlayState* play);
+void func_80854614(Player* this, PlayState* play);
+void func_808546D0(Player* this, PlayState* play);
+void func_80854800(Player* this, PlayState* play);
+void func_808548B8(Player* this, PlayState* play);
+void func_80854C70(Player* this, PlayState* play);
+void func_808553F4(Player* this, PlayState* play);
+void func_80855818(Player* this, PlayState* play);
+void func_80855A7C(Player* this, PlayState* play);
+void func_80855AF4(Player* this, PlayState* play);
+void func_80855B9C(Player* this, PlayState* play);
+void func_80855C28(Player* this, PlayState* play);
+void func_80855E08(Player* this, PlayState* play);
+void func_808561B0(Player* this, PlayState* play);
+void func_80856918(Player* this, PlayState* play);
+void func_808573A4(Player* this, PlayState* play);
+void func_80857BE8(Player* this, PlayState* play);
+void func_8085B08C(Player* this, PlayState* play);
+
+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 func_80848780(Player* this, PlayState* play);
+s32 func_808487B8(Player* this, PlayState* play);
+s32 func_80848B6C(Player* this, PlayState* play);
+s32 func_808490B4(Player* this, PlayState* play);
+s32 func_808491B4(Player* this, PlayState* play);
+s32 func_80848808(Player* this, PlayState* play);
+s32 func_8084894C(Player* this, PlayState* play);
+s32 func_80848A0C(Player* this, PlayState* play);
+s32 func_80848AB0(Player* this, PlayState* play);
+s32 func_80848E4C(Player* this, PlayState* play);
+s32 func_80849054(Player* this, PlayState* play);
+s32 func_8084923C(Player* this, PlayState* play);
+s32 func_808492C4(Player* this, PlayState* play);
+s32 func_8084933C(Player* this, PlayState* play);
+s32 func_80849570(Player* this, PlayState* play);
+s32 func_80849620(Player* this, PlayState* play);
+
+/* Init Mode functions */
+void Player_InitMode_0(PlayState* play, Player* this);
+void Player_InitMode_1(PlayState* play, Player* this);
+void Player_InitMode_2(PlayState* play, Player* this);
+void Player_InitMode_3(PlayState* play, Player* this);
+void Player_InitMode_4(PlayState* play, Player* this);
+void Player_InitMode_5(PlayState* play, Player* this);
+void Player_InitMode_6(PlayState* play, Player* this);
+void Player_InitMode_7(PlayState* play, Player* this);
+void func_80841744(PlayState* play, Player* this);
+void func_80841744(PlayState* play, Player* this);
+void func_8083ADF0(PlayState* play, Player* this);
+void Player_InitMode_B(PlayState* play, Player* this);
+void Player_InitMode_Telescope(PlayState* play, Player* this);
+void Player_InitMode_D(PlayState* play, Player* this);
+void func_8083ADF0(PlayState* play, Player* this);
+void Player_InitMode_F(PlayState* play, Player* this);
+
+void func_80859F4C(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_80859FCC(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_80859FF4(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_8085A120(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_8085A144(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_8085A19C(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_8085A1D4(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_8085A24C(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_8085A2AC(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_8085A330(PlayState* play, Player* this, UNK_TYPE arg2);
+
+void func_80859EBC(PlayState* play, Player* this, s32 arg2);
+
+void func_80859414(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_80859AD0(PlayState* play, Player* this, void* arg2);
+void func_80859B28(PlayState* play, Player* this, void* arg2);
+void func_8085ADA0(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_8085AACC(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_808595B8(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_80859890(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_80859C60(PlayState* play, Player* this, void* arg2);
+void func_8085A710(PlayState* play, Player* this, void* anim);
+void func_808595B8(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_80859D70(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_8085A6C0(PlayState* play, Player* this, void* anim);
+void func_80859FF4(PlayState* play, Player* this, UNK_TYPE arg2);
+void Player_Cutscene_TranslateReverse(PlayState* play, Player* this, void* arg);
+void func_8085A144(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_8085A1D4(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_8085A364(PlayState* play, Player* this, void* arg2);
+void func_808599DC(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_8085A40C(PlayState* play, Player* this, void* arg2);
+void func_80859708(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_8085A2AC(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_8085A940(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_8085A4A4(PlayState* play, Player* this, void* arg2);
+void func_8085A5DC(PlayState* play, Player* this, void* arg2);
+void func_8085AA84(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_8085A7C0(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_8085AA10(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_808599DC(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_80859AF8(PlayState* play, Player* this, void* arg2);
+void func_80859A44(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_80859D44(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_80859EBC(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_80859F4C(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_80859F4C(PlayState* play, Player* this, UNK_TYPE arg2);
+
+void func_8085A768(PlayState* play, Player* this, void* arg2);
+void func_8085AA60(PlayState* play, Player* this, UNK_TYPE arg2);
+
+void func_808594D0(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_808594D0(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_8085978C(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_80859B54(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_80859CA0(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_808594D0(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_80859CFC(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_8085A66C(PlayState* play, Player* this, void* arg2);
+void func_80859FCC(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_8085A120(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_8085A19C(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_8085968C(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_8085A24C(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_8085A330(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_8085A8C4(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_8085A530(PlayState* play, Player* this, void* arg2);
+void func_8085A768(PlayState* play, Player* this, void* arg2);
+void func_8085AA60(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_80859990(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_80859A10(PlayState* play, Player* this, UNK_TYPE arg2);
+
+// ItemActions
+void func_8082F594(PlayState* play, Player* this);
+void func_8082F5A4(PlayState* play, Player* this);
+void func_8082F8A0(PlayState* play, Player* this);
+void func_8082F5C0(PlayState* play, Player* this);
+void func_8082F7F4(PlayState* play, Player* this);
+void Player_SpawnExplosive(PlayState* play, Player* this);
+
+void func_80858DB4(PlayState* play, Player* this, void* anim);
+void func_80858DDC(PlayState* play, Player* this, void* anim);
+void func_80858E40(PlayState* play, Player* this, void* anim);
+void func_80858E60(PlayState* play, Player* this, void* anim);
+void func_80858E80(PlayState* play, Player* this, void* anim);
+void func_80858EA0(PlayState* play, Player* this, void* anim);
+void func_80858EFC(PlayState* play, Player* this, void* anim);
+void func_80858F1C(PlayState* play, Player* this, void* anim);
+void func_80858F3C(PlayState* play, Player* this, void* anim);
+void func_80858F5C(PlayState* play, Player* this, void* anim);
+void func_80858FBC(PlayState* play, Player* this, void* anim);
+void func_80859028(PlayState* play, Player* this, void* anim);
+void func_808591BC(PlayState* play, Player* this, void* anim);
+void func_80858DFC(PlayState* play, Player* this, void* anim);
+void func_80858EC0(PlayState* play, Player* this, void* anim);
+void func_80858F7C(PlayState* play, Player* this, void* anim);
+void func_80858F9C(PlayState* play, Player* this, void* anim);
+void func_80859168(PlayState* play, Player* this, void* anim);
+void func_80859210(PlayState* play, Player* this, void* arg2);
+
+typedef struct struct_8085C2A4 {
+ /* 0x0 */ PlayerAnimationHeader* unk_0;
+ /* 0x4 */ PlayerAnimationHeader* unk_4;
+ /* 0x8 */ PlayerAnimationHeader* unk_8;
+} struct_8085C2A4; // size = 0xC
+
+typedef struct BlureColors {
+ /* 0x0 */ u8 p1StartColor[4];
+ /* 0x4 */ u8 p2StartColor[4];
+ /* 0x8 */ u8 p1EndColor[4];
+ /* 0xC */ u8 p2EndColor[4];
+} BlureColors; // size = 0x10
+
+typedef void (*PlayerCueInterpreter)(PlayState*, Player*, CsCmdActorCue*);
+
+typedef struct struct_8085DA94 {
+ /* 0x0 */ s8 type;
+ /* 0x4 */ union {
+ void* ptr; // Do not use, required in the absence of designated initialisors
+ PlayerAnimationHeader* anim;
+ PlayerCueInterpreter func;
+ AnimSfxEntry* entry;
+ };
+} struct_8085DA94; // size = 0x8
+
+typedef struct struct_8085E368 {
+ /* 0x0 */ Vec3s base;
+ /* 0x6 */ Vec3s range;
+} struct_8085E368; // size = 0xC
+
+typedef struct struct_8085D910 {
+ /* 0x0 */ u8 unk_0;
+ /* 0x1 */ u8 unk_1;
+ /* 0x2 */ u8 unk_2;
+ /* 0x3 */ u8 unk_3;
+} struct_8085D910; // size = 0x4
+
+typedef struct struct_8085D848_unk_00 {
+ /* 0x0 */ s16 fogNear;
+ /* 0x2 */ u8 fogColor[3];
+ /* 0x5 */ u8 ambientColor[3];
+} struct_8085D848_unk_00; // size = 0x8
+
+typedef struct struct_8085D848_unk_18 {
+ /* 0x00 */ Vec3f pos;
+ /* 0x0C */ u8 color[3];
+ /* 0x10 */ s16 radius;
+} struct_8085D848_unk_18; // size = 0x14
+
+typedef struct struct_8085D848 {
+ /* 0x00 */ struct_8085D848_unk_00 unk_00[3];
+ /* 0x18 */ struct_8085D848_unk_18 light[3];
+} struct_8085D848; // size = 0x54
+
+typedef struct struct_8085D80C {
+ /* 0x0 */ s16 actorId;
+ /* 0x2 */ s16 params;
+} struct_8085D80C; // size = 0x4
+
+typedef struct struct_8085D798 {
+ /* 0x0 */ s16 actorId;
+ /* 0x2 */ s8 actorParams;
+ /* 0x3 */ u8 itemId;
+ /* 0x4 */ u8 itemAction;
+ /* 0x5 */ u8 textId;
+} struct_8085D798; // size = 0x6
+
+typedef struct struct_8085D714 {
+ /* 0x0 */ u8 unk_0;
+ /* 0x4 */ PlayerAnimationHeader* unk_4;
+} struct_8085D714; // size = 0x8
+
+typedef struct struct_8085D224 {
+ /* 0x0 */ PlayerAnimationHeader* anim;
+ /* 0x4 */ f32 unk_4;
+ /* 0x8 */ f32 unk_8;
+} struct_8085D224; // size = 0xC
+
+typedef struct FallImpactInfo {
+ /* 0x0 */ s8 damage;
+ /* 0x1 */ u8 sourceIntensity;
+ /* 0x2 */ u8 decayTimer;
+ /* 0x3 */ u8 decayStep;
+ /* 0x4 */ u16 sfxId;
+} FallImpactInfo; // size = 0x6
+
+typedef struct AttackAnimInfo {
+ /* 0x00 */ PlayerAnimationHeader* unk_0;
+ /* 0x04 */ PlayerAnimationHeader* unk_4;
+ /* 0x08 */ PlayerAnimationHeader* unk_8;
+ /* 0x0C */ u8 unk_C;
+ /* 0x0D */ u8 unk_D;
+} AttackAnimInfo; // size = 0x10
+
+typedef struct MeleeWeaponDamageInfo {
+ /* 0x0 */ s32 dmgFlags;
+ // Presumably these two fields are intended for Fierce Deity, but will also work for Deku if it can equip a sword
+ /* 0x4 */ u8 dmgTransformedNormal;
+ /* 0x5 */ u8 dmgTransformedStrong;
+ /* 0x6 */ u8 dmgHumanNormal;
+ /* 0x7 */ u8 dmgHumanStrong;
+} MeleeWeaponDamageInfo; // size = 0x8
+
+typedef struct struct_8085CC88 {
+ /* 0x0 */ PlayerAnimationHeader* anim;
+ /* 0x4 */ u8 frame;
+} struct_8085CC88; // size = 0x8
+
+typedef struct {
+ /* 0x0 */ u8 itemId;
+ /* 0x2 */ s16 actorId;
+} ExplosiveInfo; // size = 0x4
+
+typedef struct {
+ /* 0x0 */ Color_RGB8 unk_0;
+ /* 0x3 */ Color_RGB8 unk_3;
+ /* 0x6 */ Color_RGB8 unk_6;
+ /* 0xA */ s16 unk_A;
+ /* 0xC */ s16 unk_C;
+} struct_8082F02C_arg1; // size = 0xE
+
+typedef struct GetItemEntry {
+ /* 0x0 */ u8 itemId;
+ /* 0x1 */ u8 field; // various bit-packed data
+ /* 0x2 */ s8 gid; // defines the draw id and chest opening animation
+ /* 0x3 */ u8 textId;
+ /* 0x4 */ u16 objectId;
+} GetItemEntry; // size = 0x6
+
+typedef struct struct_8085D200 {
+ /* 0x0 */ PlayerAnimationHeader* unk_0;
+ /* 0x4 */ PlayerAnimationHeader* unk_4;
+ /* 0x8 */ u8 unk_8;
+ /* 0x9 */ u8 unk_9;
+} struct_8085D200; // size = 0xC
+
+f32 D_80862AFC; // distance of the analog stick to its center
+s16 D_80862B00; // analog stick angle/yaw
+s16 D_80862B02; // analog stick yaw + camera yaw
+s32 D_80862B04; // boolean, set to the return value of func_8083216C
+FloorType sPlayerCurrentFloorType;
+u32 sPlayerCurrentWallFlags;
+ConveyorSpeed sPlayerConveyorSpeedIndex;
+s16 sPlayerIsOnFloorConveyor;
+s16 D_80862B16; // SurfaceType_GetConveyorDirection << 0xA
+f32 D_80862B18; // D_80862B18 = this->actor.world.pos.y - this->actor.floorHeight;
+FloorProperty sPlayerPrevFloorProperty;
+s32 D_80862B20; // ABS_ALT(this->actor.shape.rot.y - BINANG_ADD(this->actor.wallYaw, 0x8000))
+s32 D_80862B24; // ABS_ALT(BINANG_SUB(this->currentYaw, BINANG_ADD(this->actor.wallYaw, 0x8000)))
+s16 D_80862B28;
+s32 D_80862B2C; // D_80862B2C = player->currentMask;
+Vec3f D_80862B30;
+f32 D_80862B3C;
+FloorEffect D_80862B40; // SurfaceType_GetFloorEffect
+Input* sPlayerControlInput;
+s32 D_80862B48;
+s32 D_80862B4C;
+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);
+}
+
+void Player_StopHorizontalMovement(Player* this) {
+ this->linearVelocity = 0.0f;
+ this->actor.speed = 0.0f;
+}
+
+void func_8082DAD4(Player* this) {
+ Player_StopHorizontalMovement(this);
+ this->unk_AA5 = PLAYER_UNKAA5_0;
+}
+
+s32 func_8082DAFC(PlayState* play) {
+ Player* player = GET_PLAYER(play);
+
+ return CHECK_FLAG_ALL(player->actor.flags, ACTOR_FLAG_TALK_REQUESTED);
+}
+
+void Player_AnimationPlayOnce(PlayState* play, Player* this, PlayerAnimationHeader* anim) {
+ PlayerAnimation_PlayOnce(play, &this->skelAnime, anim);
+}
+
+void Player_AnimationPlayLoop(PlayState* play, Player* this, PlayerAnimationHeader* anim) {
+ PlayerAnimation_PlayLoop(play, &this->skelAnime, anim);
+}
+
+void func_8082DB60(PlayState* play, Player* this, PlayerAnimationHeader* anim) {
+ PlayerAnimation_PlayLoopSetSpeed(play, &this->skelAnime, anim, 2.0f / 3.0f);
+}
+
+void func_8082DB90(PlayState* play, Player* this, PlayerAnimationHeader* anim) {
+ PlayerAnimation_PlayOnceSetSpeed(play, &this->skelAnime, anim, 2.0f / 3.0f);
+}
+
+void Player_AnimationPlayOnceReverse(PlayState* play, Player* this, PlayerAnimationHeader* anim) {
+ PlayerAnimation_Change(play, &this->skelAnime, anim, -2.0f / 3.0f, Animation_GetLastFrame(anim), 0.0f,
+ ANIMMODE_ONCE, 0.0f);
+}
+
+void func_8082DC28(Player* this) {
+ this->skelAnime.jointTable[PLAYER_LIMB_WAIST - 1].y = 0;
+}
+
+void func_8082DC38(Player* this) {
+ this->stateFlags2 &= ~PLAYER_STATE2_20000;
+ this->meleeWeaponState = PLAYER_MELEE_WEAPON_STATE_0;
+ this->meleeWeaponInfo[2].active = false;
+ this->meleeWeaponInfo[1].active = false;
+ this->meleeWeaponInfo[0].active = false;
+}
+
+void func_8082DC64(PlayState* play, Player* this) {
+ if ((this->subCamId != CAM_ID_NONE) && (play->cameraPtrs[this->subCamId] != NULL)) {
+ this->subCamId = CAM_ID_NONE;
+ }
+
+ this->stateFlags2 &= ~(PLAYER_STATE2_400 | PLAYER_STATE2_800);
+}
+
+void func_8082DCA0(PlayState* play, Player* this) {
+ Actor* heldActor = this->heldActor;
+
+ if ((heldActor != NULL) && !Player_IsHoldingHookshot(this)) {
+ this->actor.child = NULL;
+ this->heldActor = NULL;
+ this->interactRangeActor = NULL;
+ heldActor->parent = NULL;
+ this->stateFlags1 &= ~PLAYER_STATE1_800;
+ }
+
+ if (Player_GetExplosiveHeld(this) > PLAYER_EXPLOSIVE_NONE) {
+ func_8082F8BC(play, this, PLAYER_IA_NONE);
+ this->heldItemId = ITEM_FE;
+ }
+}
+
+void func_8082DD2C(PlayState* play, Player* this) {
+ if ((this->stateFlags1 & PLAYER_STATE1_800) && (this->heldActor == NULL)) {
+ if (this->interactRangeActor != NULL) {
+ if (this->getItemId == GI_NONE) {
+ this->stateFlags1 &= ~PLAYER_STATE1_800;
+ this->interactRangeActor = NULL;
+ }
+ } else {
+ this->stateFlags1 &= ~PLAYER_STATE1_800;
+ }
+ }
+
+ func_8082DC38(this);
+ this->unk_AA5 = PLAYER_UNKAA5_0;
+ func_8082DC64(play, this);
+ func_800E0238(Play_GetCamera(play, CAM_ID_MAIN));
+ this->stateFlags1 &=
+ ~(PLAYER_STATE1_4 | PLAYER_STATE1_2000 | PLAYER_STATE1_4000 | PLAYER_STATE1_100000 | PLAYER_STATE1_200000);
+ this->stateFlags2 &= ~(PLAYER_STATE2_10 | PLAYER_STATE2_80);
+ this->unk_ADD = 0;
+ this->unk_ADC = 0;
+ this->actor.shape.rot.x = 0;
+ this->actor.shape.rot.z = 0;
+ this->unk_ABC = 0.0f;
+ this->unk_AC0 = 0.0f;
+}
+
+s32 func_8082DE14(PlayState* play, Player* this) {
+ if (this->heldItemAction > PLAYER_IA_LAST_USED) {
+ func_80831990(play, this, ITEM_NONE);
+ return true;
+ } else {
+ return false;
+ }
+}
+
+void func_8082DE50(PlayState* play, Player* this) {
+ func_8082DD2C(play, this);
+ func_8082DCA0(play, this);
+}
+
+s32 func_8082DE88(Player* this, s32 arg1, s32 arg2) {
+ s16 temp_v0 = this->unk_D64 - D_80862B00;
+
+ this->unk_AE8 += arg1 + (s16)(ABS_ALT(temp_v0) * fabsf(D_80862AFC) * (1.0f / 0x600F0));
+ if (CHECK_BTN_ANY(sPlayerControlInput->press.button, BTN_B | BTN_A)) {
+ this->unk_AE8 += 5;
+ }
+
+ return this->unk_AE8 >= arg2;
+}
+
+void func_8082DF2C(PlayState* play) {
+ if (play->actorCtx.freezeFlashTimer == 0) {
+ play->actorCtx.freezeFlashTimer = 1;
+ }
+}
+
+u8 D_8085B9F0[PLAYER_LIMB_MAX] = {
+ false, // PLAYER_LIMB_NONE
+ false, // PLAYER_LIMB_ROOT
+ false, // PLAYER_LIMB_WAIST
+ false, // PLAYER_LIMB_LOWER_ROOT
+ false, // PLAYER_LIMB_R_THIGH
+ false, // PLAYER_LIMB_R_SHIN
+ false, // PLAYER_LIMB_R_FOOT
+ false, // PLAYER_LIMB_L_THIGH
+ false, // PLAYER_LIMB_L_SHIN
+ false, // PLAYER_LIMB_L_FOOT
+ true, // PLAYER_LIMB_UPPER_ROOT
+ true, // PLAYER_LIMB_HEAD
+ true, // PLAYER_LIMB_HAT
+ true, // PLAYER_LIMB_COLLAR
+ true, // PLAYER_LIMB_L_SHOULDER
+ true, // PLAYER_LIMB_L_FOREARM
+ true, // PLAYER_LIMB_L_HAND
+ true, // PLAYER_LIMB_R_SHOULDER
+ true, // PLAYER_LIMB_R_FOREARM
+ true, // PLAYER_LIMB_R_HAND
+ true, // PLAYER_LIMB_SHEATH
+ true, // PLAYER_LIMB_TORSO
+};
+u8 D_8085BA08[PLAYER_LIMB_MAX] = {
+ false, // PLAYER_LIMB_NONE
+ false, // PLAYER_LIMB_ROOT
+ false, // PLAYER_LIMB_WAIST
+ false, // PLAYER_LIMB_LOWER_ROOT
+ false, // PLAYER_LIMB_R_THIGH
+ false, // PLAYER_LIMB_R_SHIN
+ false, // PLAYER_LIMB_R_FOOT
+ false, // PLAYER_LIMB_L_THIGH
+ false, // PLAYER_LIMB_L_SHIN
+ false, // PLAYER_LIMB_L_FOOT
+ false, // PLAYER_LIMB_UPPER_ROOT
+ false, // PLAYER_LIMB_HEAD
+ false, // PLAYER_LIMB_HAT
+ false, // PLAYER_LIMB_COLLAR
+ true, // PLAYER_LIMB_L_SHOULDER
+ true, // PLAYER_LIMB_L_FOREARM
+ true, // PLAYER_LIMB_L_HAND
+ false, // PLAYER_LIMB_R_SHOULDER
+ false, // PLAYER_LIMB_R_FOREARM
+ false, // PLAYER_LIMB_R_HAND
+ false, // PLAYER_LIMB_SHEATH
+ false, // PLAYER_LIMB_TORSO
+};
+u8 D_8085BA20[PLAYER_LIMB_MAX] = {
+ false, // PLAYER_LIMB_NONE
+ false, // PLAYER_LIMB_ROOT
+ false, // PLAYER_LIMB_WAIST
+ false, // PLAYER_LIMB_LOWER_ROOT
+ false, // PLAYER_LIMB_R_THIGH
+ false, // PLAYER_LIMB_R_SHIN
+ false, // PLAYER_LIMB_R_FOOT
+ false, // PLAYER_LIMB_L_THIGH
+ false, // PLAYER_LIMB_L_SHIN
+ false, // PLAYER_LIMB_L_FOOT
+ false, // PLAYER_LIMB_UPPER_ROOT
+ false, // PLAYER_LIMB_HEAD
+ false, // PLAYER_LIMB_HAT
+ false, // PLAYER_LIMB_COLLAR
+ false, // PLAYER_LIMB_L_SHOULDER
+ false, // PLAYER_LIMB_L_FOREARM
+ false, // PLAYER_LIMB_L_HAND
+ true, // PLAYER_LIMB_R_SHOULDER
+ true, // PLAYER_LIMB_R_FOREARM
+ true, // PLAYER_LIMB_R_HAND
+ false, // PLAYER_LIMB_SHEATH
+ false, // PLAYER_LIMB_TORSO
+};
+
+void Player_RequestRumble(PlayState* play, Player* this, s32 sourceIntensity, s32 decayTimer, s32 decayStep,
+ s32 distSq) {
+ if (this == GET_PLAYER(play)) {
+ Rumble_Request(distSq, sourceIntensity, decayTimer, decayStep);
+ }
+}
+
+// TODO: less dumb name
+#define SFX_VOICE_BANK_SIZE 0x20
+
+PlayerAgeProperties sPlayerAgeProperties[PLAYER_FORM_MAX] = {
+ {
+ // unk_00;
+ 84.0f,
+ // shadowScale;
+ 90.0f,
+ // unk_08;
+ 1.5f,
+ // unk_0C;
+ 166.5f,
+ // unk_10;
+ 105.0f,
+ // unk_14;
+ 119.100006f,
+ // unk_18;
+ 88.5f,
+ // unk_1C;
+ 61.5f,
+ // unk_20;
+ 28.5f,
+ // unk_24;
+ 54.0f,
+ // unk_28;
+ 75.0f,
+ // unk_2C;
+ 84.0f,
+ // unk_30;
+ 102.0f,
+ // unk_34; // height?
+ 70.0f,
+ // unk_38;
+ 27.0f,
+ // unk_3C;
+ 24.75f,
+ // unk_40;
+ 105.0f,
+ // unk_44
+ { 9, 0x123F, 0x167 },
+ {
+ { 8, 0x1256, 0x17C },
+ { 9, 0x17EA, 0x167 },
+ { 8, 0x1256, 0x17C },
+ { 9, 0x17EA, 0x167 },
+ },
+ {
+ { 9, 0x17EA, 0x167 },
+ { 9, 0x1E0D, 0x17C },
+ { 9, 0x17EA, 0x167 },
+ { 9, 0x1E0D, 0x17C },
+ },
+ {
+ { 8, 0x1256, 0x17C },
+ { 9, 0x17EA, 0x167 },
+ { -0x638, 0x1256, 0x17C },
+ { -0x637, 0x17EA, 0x167 },
+ },
+ // voiceSfxIdOffset;
+ SFX_VOICE_BANK_SIZE * 0,
+ // surfaceSfxIdOffset;
+ 0x80,
+ // unk_98;
+ 33.0f,
+ // unk_9C;
+ 44.15145f,
+ // openChestAnim
+ &gPlayerAnim_link_demo_Tbox_open,
+ // unk_A4
+ &gPlayerAnim_link_demo_back_to_past,
+ // unk_A8
+ &gPlayerAnim_link_demo_return_to_past,
+ // unk_AC
+ &gPlayerAnim_link_normal_climb_startA,
+ // unk_B0
+ &gPlayerAnim_link_normal_climb_startB,
+ // unk_B4
+ {
+ &gPlayerAnim_link_normal_climb_upL,
+ &gPlayerAnim_link_normal_climb_upR,
+ &gPlayerAnim_link_normal_Fclimb_upL,
+ &gPlayerAnim_link_normal_Fclimb_upR,
+ },
+ // unk_C4
+ {
+ &gPlayerAnim_link_normal_Fclimb_sideL,
+ &gPlayerAnim_link_normal_Fclimb_sideR,
+ },
+ // unk_CC
+ {
+ &gPlayerAnim_link_normal_climb_endAL,
+ &gPlayerAnim_link_normal_climb_endAR,
+ },
+ // unk_D4
+ {
+ &gPlayerAnim_link_normal_climb_endBR,
+ &gPlayerAnim_link_normal_climb_endBL,
+ },
+ },
+ {
+ // unk_00;
+ 70.0f,
+ // shadowScale;
+ 90.0f,
+ // unk_08;
+ 0.74f,
+ // unk_0C;
+ 111.0f,
+ // unk_10;
+ 70.0f,
+ // unk_14;
+ 79.4f,
+ // unk_18;
+ 59.0f,
+ // unk_1C;
+ 41.0f,
+ // unk_20;
+ 19.0f,
+ // unk_24;
+ 36.0f,
+ // unk_28;
+ 50.0f,
+ // unk_2C;
+ 56.0f,
+ // unk_30;
+ 68.0f,
+ // unk_34; // height?
+ 70.0f,
+ // unk_38;
+ 19.5f,
+ // unk_3C;
+ 18.2f,
+ // unk_40;
+ 80.0f,
+ // unk_44
+ { 0x17, 0xF3B, 0xDF },
+ {
+ { 0x18, 0xF3B, 0xDF },
+ { 0x17, 0x14CF, 0xDF },
+ { 0x18, 0xF3B, 0xDF },
+ { 0x17, 0x14CF, 0xDF },
+ },
+ {
+ { 0x17, 0x14CF, 0xDF },
+ { 0x18, 0x1AF2, 0xDF },
+ { 0x17, 0x14CF, 0xDF },
+ { 0x18, 0x1AF2, 0xDF },
+ },
+ {
+ { 8, 0x1256, 0x17C },
+ { 9, 0x17EA, 0x167 },
+ { -0x638, 0x1256, 0x17C },
+ { -0x637, 0x17EA, 0x167 },
+ },
+ // voiceSfxIdOffset;
+ SFX_VOICE_BANK_SIZE * 6,
+ // surfaceSfxIdOffset;
+ 0x150,
+ // unk_98;
+ -25.0f,
+ // unk_9C;
+ 42.0f,
+ // openChestAnim
+ &gPlayerAnim_pg_Tbox_open,
+ // unk_A4
+ &gPlayerAnim_link_demo_back_to_past,
+ // unk_A8
+ &gPlayerAnim_link_demo_return_to_past,
+ // unk_AC
+ &gPlayerAnim_pg_climb_startA,
+ // unk_B0
+ &gPlayerAnim_pg_climb_startB,
+ // unk_B4
+ {
+ &gPlayerAnim_pg_climb_upL,
+ &gPlayerAnim_pg_climb_upR,
+ &gPlayerAnim_pg_climb_upL,
+ &gPlayerAnim_pg_climb_upR,
+ },
+ // unk_C4
+ {
+ &gPlayerAnim_link_normal_Fclimb_sideL,
+ &gPlayerAnim_link_normal_Fclimb_sideR,
+ },
+ // unk_CC
+ {
+ &gPlayerAnim_pg_climb_endAL,
+ &gPlayerAnim_pg_climb_endAR,
+ },
+ // unk_D4
+ {
+ &gPlayerAnim_pg_climb_endBR,
+ &gPlayerAnim_pg_climb_endBL,
+ },
+ },
+ {
+ // unk_00;
+ 56.0f,
+ // shadowScale;
+ 90.0f,
+ // unk_08;
+ 1.0f,
+ // unk_0C;
+ 111.0f,
+ // unk_10;
+ 70.0f,
+ // unk_14;
+ 79.4f,
+ // unk_18;
+ 59.0f,
+ // unk_1C;
+ 41.0f,
+ // unk_20;
+ 19.0f,
+ // unk_24;
+ 36.0f,
+ // unk_28;
+ 50.0f,
+ // unk_2C;
+ 56.0f,
+ // unk_30;
+ 68.0f,
+ // unk_34; // height?
+ 70.0f,
+ // unk_38;
+ 18.0f,
+ // unk_3C;
+ 23.0f,
+ // unk_40;
+ 70.0f,
+ // unk_44
+ { 0x17, 0x1323, -0x6D },
+ {
+ { 0x17, 0x1323, -0x58 },
+ { 0x17, 0x18B7, -0x6D },
+ { 0x17, 0x1323, -0x58 },
+ { 0x17, 0x18B7, -0x6D },
+ },
+ {
+ { 0x17, 0x18B7, -0x6D },
+ { 0x18, 0x1EDA, -0x58 },
+ { 0x17, 0x18B7, -0x6D },
+ { 0x18, 0x1EDA, -0x58 },
+ },
+ {
+ { 8, 0x1256, 0x17C },
+ { 9, 0x17EA, 0x167 },
+ { -0x638, 0x1256, 0x17C },
+ { -0x637, 0x17EA, 0x167 },
+ },
+ // voiceSfxIdOffset;
+ SFX_VOICE_BANK_SIZE * 5,
+ // surfaceSfxIdOffset;
+ 0x120,
+ // unk_98;
+ 22.0f,
+ // unk_9C;
+ 36.0f,
+ // openChestAnim
+ &gPlayerAnim_pz_Tbox_open,
+ // unk_A4
+ &gPlayerAnim_link_demo_back_to_past,
+ // unk_A8
+ &gPlayerAnim_link_demo_return_to_past,
+ // unk_AC
+ &gPlayerAnim_pz_climb_startA,
+ // unk_B0
+ &gPlayerAnim_pz_climb_startB,
+ // unk_B4
+ {
+ &gPlayerAnim_pz_climb_upL,
+ &gPlayerAnim_pz_climb_upR,
+ &gPlayerAnim_link_normal_Fclimb_upL,
+ &gPlayerAnim_link_normal_Fclimb_upR,
+ },
+ // unk_C4
+ {
+ &gPlayerAnim_link_normal_Fclimb_sideL,
+ &gPlayerAnim_link_normal_Fclimb_sideR,
+ },
+ // unk_CC
+ {
+ &gPlayerAnim_pz_climb_endAL,
+ &gPlayerAnim_pz_climb_endAR,
+ },
+ // unk_D4
+ {
+ &gPlayerAnim_pz_climb_endBR,
+ &gPlayerAnim_pz_climb_endBL,
+ },
+ },
+ {
+ // unk_00;
+ 35.0f,
+ // shadowScale;
+ 50.0f,
+ // unk_08;
+ 0.3f,
+ // unk_0C;
+ 71.0f,
+ // unk_10;
+ 50.0f,
+ // unk_14;
+ 49.0f,
+ // unk_18;
+ 39.0f,
+ // unk_1C;
+ 27.0f,
+ // unk_20;
+ 19.0f,
+ // unk_24;
+ 8.0f,
+ // unk_28;
+ 13.6f,
+ // unk_2C;
+ 24.0f,
+ // unk_30;
+ 24.0f,
+ // unk_34; // height?
+ 70.0f,
+ // unk_38;
+ 14.0f,
+ // unk_3C;
+ 12.0f,
+ // unk_40;
+ 55.0f,
+ // unk_44
+ { -0x18, 0xDED, 0x36C },
+ {
+ { -0x18, 0xD92, 0x35E },
+ { -0x18, 0x1371, 0x3A9 },
+ { 8, 0x1256, 0x17C },
+ { 9, 0x17EA, 0x167 },
+ },
+ {
+ { -0x18, 0x1371, 0x3A9 },
+ { -0x18, 0x195F, 0x3A9 },
+ { 9, 0x17EA, 0x167 },
+ { 9, 0x1E0D, 0x17C },
+ },
+ {
+ { 8, 0x1256, 0x17C },
+ { 9, 0x17EA, 0x167 },
+ { -0x638, 0x1256, 0x17C },
+ { -0x637, 0x17EA, 0x167 },
+ },
+ // voiceSfxIdOffset;
+ SFX_VOICE_BANK_SIZE * 4,
+ // surfaceSfxIdOffset;
+ 0xF0,
+ // unk_98;
+ -21.0f,
+ // unk_9C;
+ 33.0f,
+ // openChestAnim
+ &gPlayerAnim_pn_Tbox_open,
+ // unk_A4
+ &gPlayerAnim_link_demo_back_to_past,
+ // unk_A8
+ &gPlayerAnim_link_demo_return_to_past,
+ // unk_AC
+ &gPlayerAnim_clink_normal_climb_startA,
+ // unk_B0
+ &gPlayerAnim_clink_normal_climb_startB,
+ // unk_B4
+ {
+ &gPlayerAnim_clink_normal_climb_upL,
+ &gPlayerAnim_clink_normal_climb_upR,
+ &gPlayerAnim_link_normal_Fclimb_upL,
+ &gPlayerAnim_link_normal_Fclimb_upR,
+ },
+ // unk_C4
+ {
+ &gPlayerAnim_link_normal_Fclimb_sideL,
+ &gPlayerAnim_link_normal_Fclimb_sideR,
+ },
+ // unk_CC
+ {
+ &gPlayerAnim_clink_normal_climb_endAL,
+ &gPlayerAnim_clink_normal_climb_endAR,
+ },
+ // unk_D4
+ {
+ &gPlayerAnim_clink_normal_climb_endBR,
+ &gPlayerAnim_clink_normal_climb_endBL,
+ },
+ },
+ {
+ // unk_00;
+ 40.0f,
+ // shadowScale;
+ 60.0f,
+ // unk_08;
+ 11.0f / 17.0f,
+ // unk_0C;
+ 71.0f,
+ // unk_10;
+ 50.0f,
+ // unk_14;
+ 49.0f,
+ // unk_18;
+ 39.0f,
+ // unk_1C;
+ 27.0f,
+ // unk_20;
+ 19.0f,
+ // unk_24;
+ 22.0f,
+ // unk_28;
+ 32.4f,
+ // unk_2C;
+ 32.0f,
+ // unk_30;
+ 48.0f,
+ // unk_34; // height?
+ 11.0f / 17.0f * 70.0f,
+ // unk_38;
+ 14.0f,
+ // unk_3C;
+ 12.0f,
+ // unk_40;
+ 55.0f,
+ // unk_44
+ { -0x18, 0xDED, 0x36C },
+ {
+ { -0x18, 0xD92, 0x35E },
+ { -0x18, 0x1371, 0x3A9 },
+ { 8, 0x1256, 0x17C },
+ { 9, 0x17EA, 0x167 },
+ },
+ {
+ { -0x18, 0x1371, 0x3A9 },
+ { -0x18, 0x195F, 0x3A9 },
+ { 9, 0x17EA, 0x167 },
+ { 9, 0x1E0D, 0x17C },
+ },
+ {
+ { 8, 0x1256, 0x17C },
+ { 9, 0x17EA, 0x167 },
+ { -0x638, 0x1256, 0x17C },
+ { -0x637, 0x17EA, 0x167 },
+ },
+ // voiceSfxIdOffset;
+ SFX_VOICE_BANK_SIZE * 1,
+ // surfaceSfxIdOffset;
+ 0,
+ // unk_98;
+ 22.0f,
+ // unk_9C;
+ 29.4343f,
+ // openChestAnim
+ &gPlayerAnim_clink_demo_Tbox_open,
+ // unk_A4
+ &gPlayerAnim_clink_demo_goto_future,
+ // unk_A8
+ &gPlayerAnim_clink_demo_return_to_future,
+ // unk_AC
+ &gPlayerAnim_clink_normal_climb_startA,
+ // unk_B0
+ &gPlayerAnim_clink_normal_climb_startB,
+ // unk_B4
+ {
+ &gPlayerAnim_clink_normal_climb_upL,
+ &gPlayerAnim_clink_normal_climb_upR,
+ &gPlayerAnim_link_normal_Fclimb_upL,
+ &gPlayerAnim_link_normal_Fclimb_upR,
+ },
+ // unk_C4
+ {
+ &gPlayerAnim_link_normal_Fclimb_sideL,
+ &gPlayerAnim_link_normal_Fclimb_sideR,
+ },
+ // unk_CC
+ {
+ &gPlayerAnim_clink_normal_climb_endAL,
+ &gPlayerAnim_clink_normal_climb_endAR,
+ },
+ // unk_D4
+ {
+ &gPlayerAnim_clink_normal_climb_endBR,
+ &gPlayerAnim_clink_normal_climb_endBL,
+ },
+ },
+};
+
+PlayerAnimationHeader* D_8085BE84[PLAYER_ANIMGROUP_MAX][PLAYER_ANIMTYPE_MAX] = {
+ // PLAYER_ANIMGROUP_0
+ {
+ &gPlayerAnim_link_normal_wait_free, // Default idle standing, looking forward
+ &gPlayerAnim_link_normal_wait, // Default idle standing, looking forward, sword and shield
+ &gPlayerAnim_link_normal_wait, // Default idle standing, looking forward, sword and shield
+ &gPlayerAnim_link_fighter_wait_long, // Default idle standing, looking forward, two hand weapon
+ &gPlayerAnim_link_normal_wait_free, // Default idle standing, looking forward
+ &gPlayerAnim_link_normal_wait_free, // Default idle standing, looking forward
+ },
+ // PLAYER_ANIMGROUP_1
+ {
+ &gPlayerAnim_link_normal_walk_free,
+ &gPlayerAnim_link_normal_walk,
+ &gPlayerAnim_link_normal_walk,
+ &gPlayerAnim_link_fighter_walk_long,
+ &gPlayerAnim_link_normal_walk_free,
+ &gPlayerAnim_link_normal_walk_free,
+ },
+ // PLAYER_ANIMGROUP_2
+ {
+ &gPlayerAnim_link_normal_run_free, // Running with empty hands
+ &gPlayerAnim_link_fighter_run, // Running with Sword and Shield in hands
+ &gPlayerAnim_link_normal_run,
+ &gPlayerAnim_link_fighter_run_long, // Running with Two handed weapon
+ &gPlayerAnim_link_normal_run_free, // Running with empty hands
+ &gPlayerAnim_link_normal_run_free, // Running with empty hands
+ },
+ // PLAYER_ANIMGROUP_3
+ {
+ &gPlayerAnim_link_normal_damage_run_free,
+ &gPlayerAnim_link_fighter_damage_run,
+ &gPlayerAnim_link_normal_damage_run_free,
+ &gPlayerAnim_link_fighter_damage_run_long,
+ &gPlayerAnim_link_normal_damage_run_free,
+ &gPlayerAnim_link_normal_damage_run_free,
+ },
+ // PLAYER_ANIMGROUP_4
+ {
+ &gPlayerAnim_link_normal_waitL_free,
+ &gPlayerAnim_link_anchor_waitL,
+ &gPlayerAnim_link_anchor_waitL,
+ &gPlayerAnim_link_fighter_waitL_long,
+ &gPlayerAnim_link_normal_waitL_free,
+ &gPlayerAnim_link_normal_waitL_free,
+ },
+ // PLAYER_ANIMGROUP_5
+ {
+ &gPlayerAnim_link_normal_waitR_free,
+ &gPlayerAnim_link_anchor_waitR,
+ &gPlayerAnim_link_anchor_waitR,
+ &gPlayerAnim_link_fighter_waitR_long,
+ &gPlayerAnim_link_normal_waitR_free,
+ &gPlayerAnim_link_normal_waitR_free,
+ },
+ // PLAYER_ANIMGROUP_6
+ {
+ &gPlayerAnim_link_fighter_wait2waitR_long,
+ &gPlayerAnim_link_normal_wait2waitR,
+ &gPlayerAnim_link_normal_wait2waitR,
+ &gPlayerAnim_link_fighter_wait2waitR_long,
+ &gPlayerAnim_link_fighter_wait2waitR_long,
+ &gPlayerAnim_link_fighter_wait2waitR_long,
+ },
+ // PLAYER_ANIMGROUP_7
+ {
+ &gPlayerAnim_link_normal_normal2fighter_free,
+ &gPlayerAnim_link_fighter_normal2fighter,
+ &gPlayerAnim_link_fighter_normal2fighter,
+ &gPlayerAnim_link_normal_normal2fighter_free,
+ &gPlayerAnim_link_normal_normal2fighter_free,
+ &gPlayerAnim_link_normal_normal2fighter_free,
+ },
+ // PLAYER_ANIMGROUP_8
+ {
+ &gPlayerAnim_link_demo_doorA_link_free,
+ &gPlayerAnim_link_demo_doorA_link,
+ &gPlayerAnim_link_demo_doorA_link,
+ &gPlayerAnim_link_demo_doorA_link_free,
+ &gPlayerAnim_link_demo_doorA_link_free,
+ &gPlayerAnim_link_demo_doorA_link_free,
+ },
+ // PLAYER_ANIMGROUP_9
+ {
+ &gPlayerAnim_clink_demo_doorA_link,
+ &gPlayerAnim_clink_demo_doorA_link,
+ &gPlayerAnim_clink_demo_doorA_link,
+ &gPlayerAnim_clink_demo_doorA_link,
+ &gPlayerAnim_clink_demo_doorA_link,
+ &gPlayerAnim_clink_demo_doorA_link,
+ },
+ // PLAYER_ANIMGROUP_10
+ {
+ &gPlayerAnim_link_demo_doorB_link_free,
+ &gPlayerAnim_link_demo_doorB_link,
+ &gPlayerAnim_link_demo_doorB_link,
+ &gPlayerAnim_link_demo_doorB_link_free,
+ &gPlayerAnim_link_demo_doorB_link_free,
+ &gPlayerAnim_link_demo_doorB_link_free,
+ },
+ // PLAYER_ANIMGROUP_11
+ {
+ &gPlayerAnim_clink_demo_doorB_link,
+ &gPlayerAnim_clink_demo_doorB_link,
+ &gPlayerAnim_clink_demo_doorB_link,
+ &gPlayerAnim_clink_demo_doorB_link,
+ &gPlayerAnim_clink_demo_doorB_link,
+ &gPlayerAnim_clink_demo_doorB_link,
+ },
+ // PLAYER_ANIMGROUP_12
+ {
+ &gPlayerAnim_link_normal_carryB_free, // Grabbing something from the floor
+ &gPlayerAnim_link_normal_carryB, //
+ &gPlayerAnim_link_normal_carryB, //
+ &gPlayerAnim_link_normal_carryB_free, // Grabbing something from the floor
+ &gPlayerAnim_link_normal_carryB_free, // Grabbing something from the floor
+ &gPlayerAnim_link_normal_carryB_free, // Grabbing something from the floor
+ },
+ // PLAYER_ANIMGROUP_13
+ {
+ &gPlayerAnim_link_normal_landing_free,
+ &gPlayerAnim_link_normal_landing,
+ &gPlayerAnim_link_normal_landing,
+ &gPlayerAnim_link_normal_landing_free,
+ &gPlayerAnim_link_normal_landing_free,
+ &gPlayerAnim_link_normal_landing_free,
+ },
+ // PLAYER_ANIMGROUP_14
+ {
+ &gPlayerAnim_link_normal_short_landing_free,
+ &gPlayerAnim_link_normal_short_landing,
+ &gPlayerAnim_link_normal_short_landing,
+ &gPlayerAnim_link_normal_short_landing_free,
+ &gPlayerAnim_link_normal_short_landing_free,
+ &gPlayerAnim_link_normal_short_landing_free,
+ },
+ // PLAYER_ANIMGROUP_15
+ {
+ &gPlayerAnim_link_normal_landing_roll_free, // Rolling with nothing in hands
+ &gPlayerAnim_link_normal_landing_roll, // Rolling with sword and shield
+ &gPlayerAnim_link_normal_landing_roll, // Rolling with sword and shield
+ &gPlayerAnim_link_fighter_landing_roll_long, // Rolling with two hand weapon
+ &gPlayerAnim_link_normal_landing_roll_free, // Rolling with nothing in hands
+ &gPlayerAnim_link_normal_landing_roll_free, // Rolling with nothing in hands
+ },
+ // PLAYER_ANIMGROUP_16
+ {
+ &gPlayerAnim_link_normal_hip_down_free, // Rolling bonk
+ &gPlayerAnim_link_normal_hip_down, // Rolling bonk swrod and shield
+ &gPlayerAnim_link_normal_hip_down, // Rolling bonk swrod and shield
+ &gPlayerAnim_link_normal_hip_down_long, // Rolling bonk two hand weapon
+ &gPlayerAnim_link_normal_hip_down_free, // Rolling bonk
+ &gPlayerAnim_link_normal_hip_down_free, // Rolling bonk
+ },
+ // PLAYER_ANIMGROUP_17
+ {
+ &gPlayerAnim_link_normal_walk_endL_free,
+ &gPlayerAnim_link_normal_walk_endL,
+ &gPlayerAnim_link_normal_walk_endL,
+ &gPlayerAnim_link_fighter_walk_endL_long,
+ &gPlayerAnim_link_normal_walk_endL_free,
+ &gPlayerAnim_link_normal_walk_endL_free,
+ },
+ // PLAYER_ANIMGROUP_18
+ {
+ &gPlayerAnim_link_normal_walk_endR_free,
+ &gPlayerAnim_link_normal_walk_endR,
+ &gPlayerAnim_link_normal_walk_endR,
+ &gPlayerAnim_link_fighter_walk_endR_long,
+ &gPlayerAnim_link_normal_walk_endR_free,
+ &gPlayerAnim_link_normal_walk_endR_free,
+ },
+ // PLAYER_ANIMGROUP_19
+ {
+ &gPlayerAnim_link_normal_defense_free,
+ &gPlayerAnim_link_normal_defense,
+ &gPlayerAnim_link_normal_defense,
+ &gPlayerAnim_link_normal_defense_free,
+ &gPlayerAnim_link_bow_defense,
+ &gPlayerAnim_link_normal_defense_free,
+ },
+ // PLAYER_ANIMGROUP_20
+ {
+ &gPlayerAnim_link_normal_defense_wait_free,
+ &gPlayerAnim_link_normal_defense_wait,
+ &gPlayerAnim_link_normal_defense_wait,
+ &gPlayerAnim_link_normal_defense_wait_free,
+ &gPlayerAnim_link_bow_defense_wait,
+ &gPlayerAnim_link_normal_defense_wait_free,
+ },
+ // PLAYER_ANIMGROUP_21
+ {
+ &gPlayerAnim_link_normal_defense_end_free,
+ &gPlayerAnim_link_normal_defense_end,
+ &gPlayerAnim_link_normal_defense_end,
+ &gPlayerAnim_link_normal_defense_end_free,
+ &gPlayerAnim_link_normal_defense_end_free,
+ &gPlayerAnim_link_normal_defense_end_free,
+ },
+ // PLAYER_ANIMGROUP_22
+ {
+ &gPlayerAnim_link_normal_side_walk_free,
+ &gPlayerAnim_link_normal_side_walk,
+ &gPlayerAnim_link_normal_side_walk,
+ &gPlayerAnim_link_fighter_side_walk_long,
+ &gPlayerAnim_link_normal_side_walk_free,
+ &gPlayerAnim_link_normal_side_walk_free,
+ },
+ // PLAYER_ANIMGROUP_23
+ {
+ &gPlayerAnim_link_normal_side_walkL_free, // Side walking
+ &gPlayerAnim_link_anchor_side_walkL, // Side walking with sword and shield in hands
+ &gPlayerAnim_link_anchor_side_walkL, // Side walking with sword and shield in hands
+ &gPlayerAnim_link_fighter_side_walkL_long,
+ &gPlayerAnim_link_normal_side_walkL_free, // Side walking
+ &gPlayerAnim_link_normal_side_walkL_free, // Side walking
+ },
+ // PLAYER_ANIMGROUP_24
+ {
+ &gPlayerAnim_link_normal_side_walkR_free,
+ &gPlayerAnim_link_anchor_side_walkR,
+ &gPlayerAnim_link_anchor_side_walkR,
+ &gPlayerAnim_link_fighter_side_walkR_long,
+ &gPlayerAnim_link_normal_side_walkR_free,
+ &gPlayerAnim_link_normal_side_walkR_free,
+ },
+ // PLAYER_ANIMGROUP_25
+ {
+ &gPlayerAnim_link_normal_45_turn_free,
+ &gPlayerAnim_link_normal_45_turn,
+ &gPlayerAnim_link_normal_45_turn,
+ &gPlayerAnim_link_normal_45_turn_free,
+ &gPlayerAnim_link_normal_45_turn_free,
+ &gPlayerAnim_link_normal_45_turn_free,
+ },
+ // PLAYER_ANIMGROUP_26
+ {
+ &gPlayerAnim_link_normal_waitL2wait,
+ &gPlayerAnim_link_normal_waitL2wait,
+ &gPlayerAnim_link_normal_waitL2wait,
+ &gPlayerAnim_link_fighter_waitL2wait_long,
+ &gPlayerAnim_link_fighter_waitL2wait_long,
+ &gPlayerAnim_link_fighter_waitL2wait_long,
+ },
+ // PLAYER_ANIMGROUP_27
+ {
+ &gPlayerAnim_link_normal_waitR2wait,
+ &gPlayerAnim_link_normal_waitR2wait,
+ &gPlayerAnim_link_normal_waitR2wait,
+ &gPlayerAnim_link_fighter_waitR2wait_long,
+ &gPlayerAnim_link_fighter_waitR2wait_long,
+ &gPlayerAnim_link_fighter_waitR2wait_long,
+ },
+ // PLAYER_ANIMGROUP_28
+ {
+ &gPlayerAnim_link_normal_throw_free,
+ &gPlayerAnim_link_normal_throw,
+ &gPlayerAnim_link_normal_throw,
+ &gPlayerAnim_link_normal_throw_free,
+ &gPlayerAnim_link_normal_throw_free,
+ &gPlayerAnim_link_normal_throw_free,
+ },
+ // PLAYER_ANIMGROUP_29
+ {
+ &gPlayerAnim_link_normal_put_free,
+ &gPlayerAnim_link_normal_put,
+ &gPlayerAnim_link_normal_put,
+ &gPlayerAnim_link_normal_put_free,
+ &gPlayerAnim_link_normal_put_free,
+ &gPlayerAnim_link_normal_put_free,
+ },
+ // PLAYER_ANIMGROUP_30
+ {
+ &gPlayerAnim_link_normal_back_walk,
+ &gPlayerAnim_link_normal_back_walk,
+ &gPlayerAnim_link_normal_back_walk,
+ &gPlayerAnim_link_normal_back_walk,
+ &gPlayerAnim_link_normal_back_walk,
+ &gPlayerAnim_link_normal_back_walk,
+ },
+ // PLAYER_ANIMGROUP_31
+ {
+ &gPlayerAnim_link_normal_check_free,
+ &gPlayerAnim_link_normal_check,
+ &gPlayerAnim_link_normal_check,
+ &gPlayerAnim_link_normal_check_free,
+ &gPlayerAnim_link_normal_check_free,
+ &gPlayerAnim_link_normal_check_free,
+ },
+ // PLAYER_ANIMGROUP_32
+ {
+ &gPlayerAnim_link_normal_check_wait_free,
+ &gPlayerAnim_link_normal_check_wait,
+ &gPlayerAnim_link_normal_check_wait,
+ &gPlayerAnim_link_normal_check_wait_free,
+ &gPlayerAnim_link_normal_check_wait_free,
+ &gPlayerAnim_link_normal_check_wait_free,
+ },
+ // PLAYER_ANIMGROUP_33
+ {
+ &gPlayerAnim_link_normal_check_end_free,
+ &gPlayerAnim_link_normal_check_end,
+ &gPlayerAnim_link_normal_check_end,
+ &gPlayerAnim_link_normal_check_end_free,
+ &gPlayerAnim_link_normal_check_end_free,
+ &gPlayerAnim_link_normal_check_end_free,
+ },
+ // PLAYER_ANIMGROUP_34
+ {
+ &gPlayerAnim_link_normal_pull_start_free,
+ &gPlayerAnim_link_normal_pull_start,
+ &gPlayerAnim_link_normal_pull_start,
+ &gPlayerAnim_link_normal_pull_start_free,
+ &gPlayerAnim_link_normal_pull_start_free,
+ &gPlayerAnim_link_normal_pull_start_free,
+ },
+ // PLAYER_ANIMGROUP_35
+ {
+ &gPlayerAnim_link_normal_pulling_free,
+ &gPlayerAnim_link_normal_pulling,
+ &gPlayerAnim_link_normal_pulling,
+ &gPlayerAnim_link_normal_pulling_free,
+ &gPlayerAnim_link_normal_pulling_free,
+ &gPlayerAnim_link_normal_pulling_free,
+ },
+ // PLAYER_ANIMGROUP_36
+ {
+ &gPlayerAnim_link_normal_pull_end_free,
+ &gPlayerAnim_link_normal_pull_end,
+ &gPlayerAnim_link_normal_pull_end,
+ &gPlayerAnim_link_normal_pull_end_free,
+ &gPlayerAnim_link_normal_pull_end_free,
+ &gPlayerAnim_link_normal_pull_end_free,
+ },
+ // PLAYER_ANIMGROUP_37
+ {
+ &gPlayerAnim_link_normal_fall_up_free,
+ &gPlayerAnim_link_normal_fall_up,
+ &gPlayerAnim_link_normal_fall_up,
+ &gPlayerAnim_link_normal_fall_up_free,
+ &gPlayerAnim_link_normal_fall_up_free,
+ &gPlayerAnim_link_normal_fall_up_free,
+ },
+ // PLAYER_ANIMGROUP_38
+ {
+ &gPlayerAnim_link_normal_jump_climb_hold_free,
+ &gPlayerAnim_link_normal_jump_climb_hold,
+ &gPlayerAnim_link_normal_jump_climb_hold,
+ &gPlayerAnim_link_normal_jump_climb_hold_free,
+ &gPlayerAnim_link_normal_jump_climb_hold_free,
+ &gPlayerAnim_link_normal_jump_climb_hold_free,
+ },
+ // PLAYER_ANIMGROUP_39
+ {
+ &gPlayerAnim_link_normal_jump_climb_wait_free,
+ &gPlayerAnim_link_normal_jump_climb_wait,
+ &gPlayerAnim_link_normal_jump_climb_wait,
+ &gPlayerAnim_link_normal_jump_climb_wait_free,
+ &gPlayerAnim_link_normal_jump_climb_wait_free,
+ &gPlayerAnim_link_normal_jump_climb_wait_free,
+ },
+ // PLAYER_ANIMGROUP_40
+ {
+ &gPlayerAnim_link_normal_jump_climb_up_free,
+ &gPlayerAnim_link_normal_jump_climb_up,
+ &gPlayerAnim_link_normal_jump_climb_up,
+ &gPlayerAnim_link_normal_jump_climb_up_free,
+ &gPlayerAnim_link_normal_jump_climb_up_free,
+ &gPlayerAnim_link_normal_jump_climb_up_free,
+ },
+ // PLAYER_ANIMGROUP_41
+ {
+ &gPlayerAnim_link_normal_down_slope_slip_end_free,
+ &gPlayerAnim_link_normal_down_slope_slip_end,
+ &gPlayerAnim_link_normal_down_slope_slip_end,
+ &gPlayerAnim_link_normal_down_slope_slip_end_long,
+ &gPlayerAnim_link_normal_down_slope_slip_end_free,
+ &gPlayerAnim_link_normal_down_slope_slip_end_free,
+ },
+ // PLAYER_ANIMGROUP_42
+ {
+ &gPlayerAnim_link_normal_up_slope_slip_end_free,
+ &gPlayerAnim_link_normal_up_slope_slip_end,
+ &gPlayerAnim_link_normal_up_slope_slip_end,
+ &gPlayerAnim_link_normal_up_slope_slip_end_long,
+ &gPlayerAnim_link_normal_up_slope_slip_end_free,
+ &gPlayerAnim_link_normal_up_slope_slip_end_free,
+ },
+ // PLAYER_ANIMGROUP_43
+ {
+ &gPlayerAnim_sude_nwait,
+ &gPlayerAnim_lkt_nwait,
+ &gPlayerAnim_lkt_nwait,
+ &gPlayerAnim_sude_nwait,
+ &gPlayerAnim_sude_nwait,
+ &gPlayerAnim_sude_nwait,
+ }
+};
+
+struct_8085C2A4 D_8085C2A4[] = {
+ /* 0 / Forward */
+ {
+ &gPlayerAnim_link_fighter_front_jump,
+ &gPlayerAnim_link_fighter_front_jump_end,
+ &gPlayerAnim_link_fighter_front_jump_endR,
+ },
+ /* 1 / Left */
+ {
+ &gPlayerAnim_link_fighter_Lside_jump,
+ &gPlayerAnim_link_fighter_Lside_jump_end,
+ &gPlayerAnim_link_fighter_Lside_jump_endL,
+ },
+ /* 2 / Back */
+ {
+ &gPlayerAnim_link_fighter_backturn_jump,
+ &gPlayerAnim_link_fighter_backturn_jump_end,
+ &gPlayerAnim_link_fighter_backturn_jump_endR,
+ },
+ /* 3 / Right */
+ {
+ &gPlayerAnim_link_fighter_Rside_jump,
+ &gPlayerAnim_link_fighter_Rside_jump_end,
+ &gPlayerAnim_link_fighter_Rside_jump_endR,
+ },
+ /* 4 / */
+ {
+ &gPlayerAnim_link_normal_newroll_jump_20f,
+ &gPlayerAnim_link_normal_newroll_jump_end_20f,
+ &gPlayerAnim_link_normal_newroll_jump_end_20f,
+ },
+ /* 5 / */
+ {
+ &gPlayerAnim_link_normal_newside_jump_20f,
+ &gPlayerAnim_link_normal_newside_jump_end_20f,
+ &gPlayerAnim_link_normal_newside_jump_end_20f,
+ },
+};
+
+// sCylinderInit
+ColliderCylinderInit D_8085C2EC = {
+ {
+ COLTYPE_HIT5,
+ AT_NONE,
+ AC_ON | AC_TYPE_ENEMY,
+ OC1_ON | OC1_TYPE_ALL,
+ OC2_TYPE_PLAYER,
+ COLSHAPE_CYLINDER,
+ },
+ {
+ ELEMTYPE_UNK1,
+ { 0x00000000, 0x00, 0x00 },
+ { 0xF7CFFFFF, 0x00, 0x00 },
+ TOUCH_NONE | TOUCH_SFX_NORMAL,
+ BUMP_ON,
+ OCELEM_ON,
+ },
+ { 12, 60, 0, { 0, 0, 0 } },
+};
+
+// sShieldCylinderInit
+ColliderCylinderInit D_8085C318 = {
+ {
+ COLTYPE_METAL,
+ AT_ON | AT_TYPE_PLAYER,
+ AC_ON | AC_HARD | AC_TYPE_ENEMY,
+ OC1_NONE,
+ OC2_TYPE_PLAYER,
+ COLSHAPE_CYLINDER,
+ },
+ {
+ ELEMTYPE_UNK2,
+ { 0x00100000, 0x00, 0x02 },
+ { 0xD7CFFFFF, 0x00, 0x00 },
+ TOUCH_NONE | TOUCH_SFX_NORMAL,
+ BUMP_ON,
+ OCELEM_ON,
+ },
+ { 25, 60, 0, { 0, 0, 0 } },
+};
+
+// sMeleeWeaponQuadInit
+ColliderQuadInit D_8085C344 = {
+ {
+ COLTYPE_NONE,
+ AT_ON | AT_TYPE_PLAYER,
+ AC_NONE,
+ OC1_NONE,
+ OC2_TYPE_PLAYER,
+ COLSHAPE_QUAD,
+ },
+ {
+ ELEMTYPE_UNK2,
+ { 0x00000000, 0x00, 0x01 },
+ { 0xF7CFFFFF, 0x00, 0x00 },
+ TOUCH_ON | TOUCH_SFX_NORMAL,
+ BUMP_NONE,
+ OCELEM_NONE,
+ },
+ { { { 0.0f, 0.0f, 0.0f }, { 0.0f, 0.0f, 0.0f }, { 0.0f, 0.0f, 0.0f }, { 0.0f, 0.0f, 0.0f } } },
+};
+
+// sShieldQuadInit
+ColliderQuadInit D_8085C394 = {
+ {
+ COLTYPE_METAL,
+ AT_ON | AT_TYPE_PLAYER,
+ AC_ON | AC_HARD | AC_TYPE_ENEMY,
+ OC1_NONE,
+ OC2_TYPE_PLAYER,
+ COLSHAPE_QUAD,
+ },
+ {
+ ELEMTYPE_UNK2,
+ { 0x00100000, 0x00, 0x00 },
+ { 0xD7CFFFFF, 0x00, 0x00 },
+ TOUCH_ON | TOUCH_SFX_NORMAL,
+ BUMP_ON,
+ OCELEM_NONE,
+ },
+ { { { 0.0f, 0.0f, 0.0f }, { 0.0f, 0.0f, 0.0f }, { 0.0f, 0.0f, 0.0f }, { 0.0f, 0.0f, 0.0f } } },
+};
+
+f32 D_8085C3E4 = 1.0f;
+f32 D_8085C3E8 = 1.0f;
+
+// ANIMSFX_TYPE_VOICE
+void Player_AnimSfx_PlayVoice(Player* this, u16 sfxId) {
+ u16 sfxOffset;
+
+ if (this->currentMask == PLAYER_MASK_GIANT) {
+ func_8019F830(&this->actor.projectedPos, sfxId);
+ } else if (this->actor.id == ACTOR_PLAYER) {
+ if (this->currentMask == PLAYER_MASK_SCENTS) {
+ sfxOffset = SFX_VOICE_BANK_SIZE * 7;
+ } else {
+ sfxOffset = this->ageProperties->voiceSfxIdOffset;
+ }
+
+ Player_PlaySfx(this, sfxOffset + sfxId);
+ }
+}
+
+u16 D_8085C3EC[] = {
+ NA_SE_VO_LI_SWEAT,
+ NA_SE_VO_LI_SNEEZE,
+ NA_SE_VO_LI_RELAX,
+ NA_SE_VO_LI_FALL_L,
+};
+
+void func_8082E00C(Player* this) {
+ s32 i;
+ u16* sfxIdPtr = D_8085C3EC;
+
+ for (i = 0; i < ARRAY_COUNT(D_8085C3EC); i++) {
+ AudioSfx_StopById((u16)(*sfxIdPtr + this->ageProperties->voiceSfxIdOffset));
+ sfxIdPtr++;
+ }
+}
+
+u16 Player_GetFloorSfx(Player* this, u16 sfxId) {
+ return sfxId + this->floorSfxOffset;
+}
+
+// ANIMSFX_TYPE_FLOOR
+void Player_AnimSfx_PlayFloor(Player* this, u16 sfxId) {
+ Player_PlaySfx(this, Player_GetFloorSfx(this, sfxId));
+}
+
+u16 Player_GetFloorSfxByAge(Player* this, u16 sfxId) {
+ return sfxId + this->floorSfxOffset + this->ageProperties->surfaceSfxIdOffset;
+}
+
+// ANIMSFX_TYPE_FLOOR_BY_AGE
+void Player_AnimSfx_PlayFloorByAge(Player* this, u16 sfxId) {
+ Player_PlaySfx(this, Player_GetFloorSfxByAge(this, sfxId));
+}
+
+// ANIMSFX_TYPE_6 and ANIMSFX_TYPE_8
+void Player_AnimSfx_PlayFloorWalk(Player* this, f32 freqVolumeLerp) {
+ s32 sfxId;
+
+ if (this->currentMask == PLAYER_MASK_GIANT) {
+ sfxId = NA_SE_PL_GIANT_WALK;
+ } else {
+ sfxId = Player_GetFloorSfxByAge(this, NA_SE_PL_WALK_GROUND);
+ }
+
+ // Audio_PlaySfx_AtPosForMetalEffectsWithSyncedFreqAndVolume
+ func_8019F638(&this->actor.projectedPos, sfxId, freqVolumeLerp);
+}
+
+// ANIMSFX_TYPE_FLOOR_JUMP
+void Player_AnimSfx_PlayFloorJump(Player* this) {
+ Player_PlaySfx(this, Player_GetFloorSfxByAge(this, NA_SE_PL_JUMP_GROUND));
+}
+
+// ANIMSFX_TYPE_FLOOR_LAND
+void Player_AnimSfx_PlayFloorLand(Player* this) {
+ Player_PlaySfx(this, Player_GetFloorSfxByAge(this, NA_SE_PL_LAND_GROUND));
+}
+
+void func_8082E1F0(Player* this, u16 sfxId) {
+ Player_PlaySfx(this, sfxId);
+ this->stateFlags2 |= PLAYER_STATE2_8;
+}
+
+void Player_PlayAnimSfx(Player* this, AnimSfxEntry* entry) {
+ s32 cond;
+
+ do {
+ s32 data = ABS_ALT(entry->flags);
+ s32 type = ANIMSFX_GET_TYPE(data);
+
+ if (PlayerAnimation_OnFrame(&this->skelAnime, fabsf(ANIMSFX_GET_FRAME(data)))) {
+ if (type == ANIMSFX_SHIFT_TYPE(ANIMSFX_TYPE_GENERAL)) {
+ Player_PlaySfx(this, entry->sfxId);
+ } else if (type == ANIMSFX_SHIFT_TYPE(ANIMSFX_TYPE_FLOOR)) {
+ Player_AnimSfx_PlayFloor(this, entry->sfxId);
+ } else if (type == ANIMSFX_SHIFT_TYPE(ANIMSFX_TYPE_FLOOR_BY_AGE)) {
+ Player_AnimSfx_PlayFloorByAge(this, entry->sfxId);
+ } else if (type == ANIMSFX_SHIFT_TYPE(ANIMSFX_TYPE_VOICE)) {
+ Player_AnimSfx_PlayVoice(this, entry->sfxId);
+ } else if (type == ANIMSFX_SHIFT_TYPE(ANIMSFX_TYPE_FLOOR_LAND)) {
+ Player_AnimSfx_PlayFloorLand(this);
+ } else if (type == ANIMSFX_SHIFT_TYPE(ANIMSFX_TYPE_6)) {
+ Player_AnimSfx_PlayFloorWalk(this, 6.0f);
+ } else if (type == ANIMSFX_SHIFT_TYPE(ANIMSFX_TYPE_FLOOR_JUMP)) {
+ Player_AnimSfx_PlayFloorJump(this);
+ } else if (type == ANIMSFX_SHIFT_TYPE(ANIMSFX_TYPE_8)) {
+ Player_AnimSfx_PlayFloorWalk(this, 0.0f);
+ } else if (type == ANIMSFX_SHIFT_TYPE(ANIMSFX_TYPE_9)) {
+ // Audio_PlaySfx_AtPosForMetalEffectsWithSyncedFreqAndVolume
+ func_8019F638(&this->actor.projectedPos, this->ageProperties->surfaceSfxIdOffset + NA_SE_PL_WALK_LADDER,
+ 0.0f);
+ } else if (type == ANIMSFX_SHIFT_TYPE(ANIMSFX_TYPE_SURFACE)) {
+ Player_PlaySfx(this, entry->sfxId + this->ageProperties->surfaceSfxIdOffset);
+ }
+ }
+
+ cond = entry->flags >= 0;
+ entry++;
+ } while (cond);
+}
+
+void func_8082E438(PlayState* play, Player* this, PlayerAnimationHeader* anim) {
+ PlayerAnimation_Change(play, &this->skelAnime, anim, 3.0f / 3.0f, 0.0f, Animation_GetLastFrame(anim), ANIMMODE_ONCE,
+ -6.0f);
+}
+
+void func_8082E4A4(PlayState* play, Player* this, PlayerAnimationHeader* anim) {
+ PlayerAnimation_Change(play, &this->skelAnime, anim, 2.0f / 3.0f, 0.0f, Animation_GetLastFrame(anim), ANIMMODE_ONCE,
+ -6.0f);
+}
+
+void func_8082E514(PlayState* play, Player* this, PlayerAnimationHeader* anim) {
+ PlayerAnimation_Change(play, &this->skelAnime, anim, 3.0f / 3.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -6.0f);
+}
+
+void func_8082E55C(PlayState* play, Player* this, PlayerAnimationHeader* anim) {
+ PlayerAnimation_Change(play, &this->skelAnime, anim, 2.0f / 3.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -6.0f);
+}
+
+void func_8082E5A8(PlayState* play, Player* this, PlayerAnimationHeader* anim) {
+ PlayerAnimation_Change(play, &this->skelAnime, anim, 3.0f / 3.0f, 0.0f, 0.0f, ANIMMODE_ONCE, 0.0f);
+}
+
+void func_8082E5EC(PlayState* play, Player* this, PlayerAnimationHeader* anim) {
+ PlayerAnimation_Change(play, &this->skelAnime, anim, 2.0f / 3.0f, 0.0f, 0.0f, ANIMMODE_ONCE, 0.0f);
+}
+
+void func_8082E634(PlayState* play, Player* this, PlayerAnimationHeader* anim) {
+ PlayerAnimation_Change(play, &this->skelAnime, anim, 3.0f / 3.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -16.0f);
+}
+
+// Player_AnimationPlayLoopIfCurrentFinished
+s32 func_8082E67C(PlayState* play, Player* this, PlayerAnimationHeader* anim) {
+ if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ Player_AnimationPlayLoop(play, this, anim);
+ return true;
+ } else {
+ return false;
+ }
+}
+
+void func_8082E6D0(Player* this) {
+ this->skelAnime.prevTransl = this->skelAnime.baseTransl;
+ this->skelAnime.prevRot = this->actor.shape.rot.y;
+}
+
+void func_8082E6F8(Player* this) {
+ func_8082E6D0(this);
+ this->skelAnime.prevTransl.x *= this->ageProperties->unk_08;
+ this->skelAnime.prevTransl.y *= this->ageProperties->unk_08;
+ this->skelAnime.prevTransl.z *= this->ageProperties->unk_08;
+}
+
+void func_8082E784(Player* this) {
+ this->skelAnime.jointTable[PLAYER_LIMB_WAIST - 1].y = 0;
+}
+
+void func_8082E794(Player* this) {
+ if (this->skelAnime.moveFlags) {
+ func_8082DC28(this);
+ this->skelAnime.jointTable[PLAYER_LIMB_ROOT - 1].x = this->skelAnime.baseTransl.x;
+ this->skelAnime.jointTable[PLAYER_LIMB_ROOT - 1].z = this->skelAnime.baseTransl.z;
+
+ if (this->skelAnime.moveFlags & ANIM_FLAG_8) {
+ if (this->skelAnime.moveFlags & ANIM_FLAG_UPDATE_Y) {
+ this->skelAnime.jointTable[PLAYER_LIMB_ROOT - 1].y = this->skelAnime.prevTransl.y;
+ }
+ } else {
+ this->skelAnime.jointTable[PLAYER_LIMB_ROOT - 1].y = this->skelAnime.baseTransl.y;
+ }
+ func_8082E6D0(this);
+ this->skelAnime.moveFlags = 0;
+ }
+}
+
+void func_8082E820(Player* this, s32 moveFlags) {
+ Vec3f pos;
+
+ this->skelAnime.moveFlags = moveFlags;
+ this->skelAnime.prevTransl = this->skelAnime.baseTransl;
+ SkelAnime_UpdateTranslation(&this->skelAnime, &pos, this->actor.shape.rot.y);
+
+ if (moveFlags & ANIM_FLAG_1) {
+ pos.x *= this->ageProperties->unk_08;
+ pos.z *= this->ageProperties->unk_08;
+ this->actor.world.pos.x += pos.x * this->actor.scale.x;
+ this->actor.world.pos.z += pos.z * this->actor.scale.z;
+ }
+
+ if (moveFlags & ANIM_FLAG_UPDATE_Y) {
+ if (!(moveFlags & ANIM_FLAG_4)) {
+ pos.y *= this->ageProperties->unk_08;
+ }
+ this->actor.world.pos.y += pos.y * this->actor.scale.y;
+ }
+
+ func_8082DC28(this);
+}
+
+void func_8082E920(PlayState* play, Player* this, s32 moveFlags) {
+ if (moveFlags & ANIM_FLAG_200) {
+ func_8082E6F8(this);
+ } else if ((moveFlags & ANIM_FLAG_100) || this->skelAnime.moveFlags) {
+ func_8082E6D0(this);
+ } else {
+ this->skelAnime.prevTransl = this->skelAnime.jointTable[PLAYER_LIMB_ROOT - 1];
+ this->skelAnime.prevRot = this->actor.shape.rot.y;
+ }
+
+ this->skelAnime.moveFlags = moveFlags;
+ Player_StopHorizontalMovement(this);
+ AnimationContext_DisableQueue(play);
+}
+
+void func_8082E9C8(PlayState* play, Player* this, PlayerAnimationHeader* anim, s32 moveFlags, f32 playSpeed) {
+ PlayerAnimation_PlayOnceSetSpeed(play, &this->skelAnime, anim, playSpeed);
+ func_8082E920(play, this, moveFlags);
+}
+
+void func_8082EA10(PlayState* play, Player* this, PlayerAnimationHeader* anim, s32 moveFlags) {
+ func_8082E9C8(play, this, anim, moveFlags, 3.0f / 3.0f);
+}
+
+void func_8082EA38(PlayState* play, Player* this, PlayerAnimationHeader* anim, s32 moveFlags) {
+ func_8082E9C8(play, this, anim, moveFlags, 2.0f / 3.0f);
+}
+
+void func_8082EA60(PlayState* play, Player* this, PlayerAnimationHeader* anim) {
+ func_8082EA38(play, this, anim, ANIM_FLAG_4 | ANIM_FLAG_8 | ANIM_FLAG_200);
+}
+
+void func_8082EA80(PlayState* play, Player* this, PlayerAnimationHeader* anim, s32 moveFlags, f32 playSpeed) {
+ PlayerAnimation_PlayLoopSetSpeed(play, &this->skelAnime, anim, playSpeed);
+ func_8082E920(play, this, moveFlags);
+}
+
+void func_8082EAC8(PlayState* play, Player* this, PlayerAnimationHeader* anim, s32 moveFlags) {
+ func_8082EA80(play, this, anim, moveFlags, 3.0f / 3.0f);
+}
+
+void func_8082EAF0(PlayState* play, Player* this, PlayerAnimationHeader* anim, s32 moveFlags) {
+ func_8082EA80(play, this, anim, moveFlags, 2.0f / 3.0f);
+}
+
+void func_8082EB18(PlayState* play, Player* this, PlayerAnimationHeader* anim) {
+ func_8082EAF0(play, this, anim, ANIM_FLAG_4 | ANIM_FLAG_8 | ANIM_FLAG_NOMOVE);
+}
+
+void func_8082EB38(PlayState* play, Player* this) {
+ s8 var_v0;
+ s8 var_v1;
+
+ this->unk_D60 = D_80862AFC;
+ this->unk_D64 = D_80862B00;
+ func_800FF3A0(&D_80862AFC, &D_80862B00, sPlayerControlInput);
+
+ if (D_80862AFC < 8.0f) {
+ D_80862AFC = 0.0f;
+ }
+
+ D_80862B02 = Camera_GetInputDirYaw(play->cameraPtrs[play->activeCamId]) + D_80862B00;
+ this->unk_ADE = (this->unk_ADE + 1) % ARRAY_COUNT(this->unk_ADF);
+ if (D_80862AFC < 55.0f) {
+ var_v0 = -1;
+ var_v1 = -1;
+ } else {
+ var_v1 = ((u16)(D_80862B00 + 0x2000)) >> 9;
+ var_v0 = ((u16)(BINANG_SUB(D_80862B02, this->actor.shape.rot.y) + 0x2000)) >> 14;
+ }
+ this->unk_ADF[this->unk_ADE] = var_v1;
+ this->unk_AE3[this->unk_ADE] = var_v0;
+}
+
+void func_8082EC9C(PlayState* play, Player* this, PlayerAnimationHeader* anim) {
+ PlayerAnimation_PlayOnceSetSpeed(play, &this->skelAnime, anim, D_8085C3E4);
+}
+
+s32 func_8082ECCC(Player* this) {
+ return this->stateFlags1 & PLAYER_STATE1_1000000;
+}
+
+#define CHEST_ANIM_SHORT 0
+#define CHEST_ANIM_LONG 1
+
+// TODO: consider what to do with the NONEs: cannot use a zero-argument macro like OoT since the text id is involved.
+#define GET_ITEM(itemId, objectId, drawId, textId, field, chestAnim) \
+ { itemId, field, (chestAnim != CHEST_ANIM_SHORT ? 1 : -1) * (drawId + 1), textId, objectId }
+
+#define GIFIELD_GET_DROP_TYPE(field) ((field)&0x1F)
+#define GIFIELD_20 (1 << 5)
+#define GIFIELD_40 (1 << 6)
+#define GIFIELD_NO_COLLECTIBLE (1 << 7)
+/**
+ * `flags` must be 0, GIFIELD_20, GIFIELD_40 or GIFIELD_NO_COLLECTIBLE (which can be or'ed together)
+ * `dropType` must be either a value from the `Item00Type` enum or 0 if the `GIFIELD_NO_COLLECTIBLE` flag was used
+ */
+#define GIFIELD(flags, dropType) ((flags) | (dropType))
+
+GetItemEntry sGetItemTable[GI_MAX - 1] = {
+ // GI_RUPEE_GREEN
+ GET_ITEM(ITEM_RUPEE_GREEN, OBJECT_GI_RUPY, GID_RUPEE_GREEN, 0xC4, GIFIELD(0, ITEM00_RUPEE_GREEN), CHEST_ANIM_SHORT),
+ // GI_RUPEE_BLUE
+ GET_ITEM(ITEM_RUPEE_BLUE, OBJECT_GI_RUPY, GID_RUPEE_BLUE, 0x2, GIFIELD(0, ITEM00_RUPEE_BLUE), CHEST_ANIM_SHORT),
+ // GI_RUPEE_10
+ GET_ITEM(ITEM_RUPEE_10, OBJECT_GI_RUPY, GID_RUPEE_RED, 0x3, GIFIELD(0, ITEM00_RUPEE_RED), CHEST_ANIM_SHORT),
+ // GI_RUPEE_RED
+ GET_ITEM(ITEM_RUPEE_RED, OBJECT_GI_RUPY, GID_RUPEE_RED, 0x4, GIFIELD(0, ITEM00_RUPEE_RED), CHEST_ANIM_SHORT),
+ // GI_RUPEE_PURPLE
+ GET_ITEM(ITEM_RUPEE_PURPLE, OBJECT_GI_RUPY, GID_RUPEE_PURPLE, 0x5, GIFIELD(0, ITEM00_RUPEE_PURPLE),
+ CHEST_ANIM_SHORT),
+ // GI_RUPEE_SILVER
+ GET_ITEM(ITEM_RUPEE_SILVER, OBJECT_GI_RUPY, GID_RUPEE_SILVER, 0x6, GIFIELD(0, ITEM00_RUPEE_PURPLE),
+ CHEST_ANIM_SHORT),
+ // GI_RUPEE_HUGE
+ GET_ITEM(ITEM_RUPEE_HUGE, OBJECT_GI_RUPY, GID_RUPEE_HUGE, 0x7, GIFIELD(0, ITEM00_RUPEE_HUGE), CHEST_ANIM_SHORT),
+ // GI_WALLET_ADULT
+ GET_ITEM(ITEM_WALLET_ADULT, OBJECT_GI_PURSE, GID_WALLET_ADULT, 0x8, GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_WALLET_GIANT
+ GET_ITEM(ITEM_WALLET_GIANT, OBJECT_GI_PURSE, GID_WALLET_GIANT, 0x9, GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_RECOVERY_HEART
+ GET_ITEM(ITEM_RECOVERY_HEART, OBJECT_GI_HEART, GID_RECOVERY_HEART, 0xA, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_0B
+ GET_ITEM(ITEM_RECOVERY_HEART, OBJECT_GI_HEART, GID_RECOVERY_HEART, 0xB,
+ GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_HEART_PIECE
+ GET_ITEM(ITEM_HEART_PIECE_2, OBJECT_GI_HEARTS, GID_HEART_PIECE, 0xC,
+ GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_HEART_CONTAINER
+ GET_ITEM(ITEM_HEART_CONTAINER, OBJECT_GI_HEARTS, GID_HEART_CONTAINER, 0xD,
+ GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_MAGIC_SMALL
+ GET_ITEM(ITEM_MAGIC_SMALL, OBJECT_GI_MAGICPOT, GID_MAGIC_SMALL, 0xE,
+ GIFIELD(GIFIELD_20 | GIFIELD_40, ITEM00_MAGIC_SMALL), CHEST_ANIM_SHORT),
+ // GI_MAGIC_LARGE
+ GET_ITEM(ITEM_MAGIC_LARGE, OBJECT_GI_MAGICPOT, GID_MAGIC_LARGE, 0xF,
+ GIFIELD(GIFIELD_20 | GIFIELD_40, ITEM00_MAGIC_LARGE), CHEST_ANIM_SHORT),
+ // GI_10
+ GET_ITEM(ITEM_RECOVERY_HEART, OBJECT_GI_HEART, GID_RECOVERY_HEART, 0x10, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_STRAY_FAIRY
+ GET_ITEM(ITEM_NONE, OBJECT_UNSET_0, GID_NONE, 0x11, 0, 0),
+ // GI_12
+ GET_ITEM(ITEM_RECOVERY_HEART, OBJECT_GI_HEART, GID_RECOVERY_HEART, 0x12, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_13
+ GET_ITEM(ITEM_RECOVERY_HEART, OBJECT_GI_HEART, GID_RECOVERY_HEART, 0x13, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_BOMBS_1
+ GET_ITEM(ITEM_BOMB, OBJECT_GI_BOMB_1, GID_BOMB, 0x14, GIFIELD(GIFIELD_40, ITEM00_BOMBS_0), CHEST_ANIM_SHORT),
+ // GI_BOMBS_5
+ GET_ITEM(ITEM_BOMBS_5, OBJECT_GI_BOMB_1, GID_BOMB, 0x15, GIFIELD(GIFIELD_40, ITEM00_BOMBS_0), CHEST_ANIM_SHORT),
+ // GI_BOMBS_10
+ GET_ITEM(ITEM_BOMBS_10, OBJECT_GI_BOMB_1, GID_BOMB, 0x16, GIFIELD(GIFIELD_40, ITEM00_BOMBS_0), CHEST_ANIM_SHORT),
+ // GI_BOMBS_20
+ GET_ITEM(ITEM_BOMBS_20, OBJECT_GI_BOMB_1, GID_BOMB, 0x17, GIFIELD(GIFIELD_40, ITEM00_BOMBS_0), CHEST_ANIM_SHORT),
+ // GI_BOMBS_30
+ GET_ITEM(ITEM_BOMBS_30, OBJECT_GI_BOMB_1, GID_BOMB, 0x18, GIFIELD(GIFIELD_40, ITEM00_BOMBS_0), CHEST_ANIM_SHORT),
+ // GI_STICKS_1
+ GET_ITEM(ITEM_STICK, OBJECT_GI_STICK, GID_STICK, 0x19, GIFIELD(0, ITEM00_STICK), CHEST_ANIM_SHORT),
+ // GI_BOMBCHUS_10
+ GET_ITEM(ITEM_BOMBCHUS_10, OBJECT_GI_BOMB_2, GID_BOMBCHU, 0x1A, GIFIELD(GIFIELD_40 | GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_SHORT),
+ // GI_BOMB_BAG_20
+ GET_ITEM(ITEM_BOMB_BAG_20, OBJECT_GI_BOMBPOUCH, GID_BOMB_BAG_20, 0x1B,
+ GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_BOMB_BAG_30
+ GET_ITEM(ITEM_BOMB_BAG_30, OBJECT_GI_BOMBPOUCH, GID_BOMB_BAG_30, 0x1C,
+ GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_BOMB_BAG_40
+ GET_ITEM(ITEM_BOMB_BAG_40, OBJECT_GI_BOMBPOUCH, GID_BOMB_BAG_40, 0x1D,
+ GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_ARROWS_10
+ GET_ITEM(ITEM_ARROWS_10, OBJECT_GI_ARROW, GID_ARROWS_SMALL, 0x1E, GIFIELD(GIFIELD_40, ITEM00_ARROWS_30),
+ CHEST_ANIM_SHORT),
+ // GI_ARROWS_30
+ GET_ITEM(ITEM_ARROWS_30, OBJECT_GI_ARROW, GID_ARROWS_MEDIUM, 0x1F, GIFIELD(GIFIELD_40, ITEM00_ARROWS_40),
+ CHEST_ANIM_SHORT),
+ // GI_ARROWS_40
+ GET_ITEM(ITEM_ARROWS_40, OBJECT_GI_ARROW, GID_ARROWS_LARGE, 0x20, GIFIELD(GIFIELD_40, ITEM00_ARROWS_50),
+ CHEST_ANIM_SHORT),
+ // GI_ARROWS_50
+ GET_ITEM(ITEM_ARROWS_40, OBJECT_GI_ARROW, GID_ARROWS_LARGE, 0x21, GIFIELD(GIFIELD_40, ITEM00_ARROWS_50),
+ CHEST_ANIM_SHORT),
+ // GI_QUIVER_30
+ GET_ITEM(ITEM_BOW, OBJECT_GI_BOW, GID_BOW, 0x22, GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_QUIVER_40
+ GET_ITEM(ITEM_QUIVER_40, OBJECT_GI_ARROWCASE, GID_QUIVER_40, 0x23, GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_QUIVER_50
+ GET_ITEM(ITEM_QUIVER_50, OBJECT_GI_ARROWCASE, GID_QUIVER_50, 0x24, GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_ARROW_FIRE
+ GET_ITEM(ITEM_ARROW_FIRE, OBJECT_GI_M_ARROW, GID_ARROW_FIRE, 0x25, GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_ARROW_ICE
+ GET_ITEM(ITEM_ARROW_ICE, OBJECT_GI_M_ARROW, GID_ARROW_ICE, 0x26, GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_ARROW_LIGHT
+ GET_ITEM(ITEM_ARROW_LIGHT, OBJECT_GI_M_ARROW, GID_ARROW_LIGHT, 0x27,
+ GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_NUTS_1
+ GET_ITEM(ITEM_NUT, OBJECT_GI_NUTS, GID_NUTS, 0x28, GIFIELD(0, ITEM00_NUTS_1), CHEST_ANIM_SHORT),
+ // GI_NUTS_5
+ GET_ITEM(ITEM_NUTS_5, OBJECT_GI_NUTS, GID_NUTS, 0x29, GIFIELD(0, ITEM00_NUTS_1), CHEST_ANIM_SHORT),
+ // GI_NUTS_10
+ GET_ITEM(ITEM_NUTS_10, OBJECT_GI_NUTS, GID_NUTS, 0x2A, GIFIELD(0, ITEM00_NUTS_1), CHEST_ANIM_SHORT),
+ // GI_2B
+ GET_ITEM(ITEM_NUT_UPGRADE_30, OBJECT_GI_NUTS, GID_NUTS, 0x2B, GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_SHORT),
+ // GI_2C
+ GET_ITEM(ITEM_NUT_UPGRADE_30, OBJECT_GI_NUTS, GID_NUTS, 0x2C, GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_SHORT),
+ // GI_2D
+ GET_ITEM(ITEM_NUT_UPGRADE_40, OBJECT_GI_NUTS, GID_NUTS, 0x2D, GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_SHORT),
+ // GI_BOMBCHUS_20
+ GET_ITEM(ITEM_BOMBCHUS_20, OBJECT_GI_BOMB_2, GID_BOMBCHU, 0x2E, GIFIELD(GIFIELD_40 | GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_SHORT),
+ // GI_2F
+ GET_ITEM(ITEM_STICK_UPGRADE_20, OBJECT_GI_STICK, GID_STICK, 0x2F, GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_SHORT),
+ // GI_30
+ GET_ITEM(ITEM_STICK_UPGRADE_20, OBJECT_GI_STICK, GID_STICK, 0x30, GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_SHORT),
+ // GI_31
+ GET_ITEM(ITEM_STICK_UPGRADE_30, OBJECT_GI_STICK, GID_STICK, 0x31, GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_SHORT),
+ // GI_SHIELD_HERO
+ GET_ITEM(ITEM_SHIELD_HERO, OBJECT_GI_SHIELD_2, GID_SHIELD_HERO, 0x32,
+ GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_SHORT),
+ // GI_SHIELD_MIRROR
+ GET_ITEM(ITEM_SHIELD_MIRROR, OBJECT_GI_SHIELD_3, GID_SHIELD_MIRROR, 0x33,
+ GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_POWDER_KEG
+ GET_ITEM(ITEM_POWDER_KEG, OBJECT_GI_BIGBOMB, GID_POWDER_KEG, 0x34, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_MAGIC_BEANS
+ GET_ITEM(ITEM_MAGIC_BEANS, OBJECT_GI_BEAN, GID_MAGIC_BEANS, 0x35, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_SHORT),
+ // GI_BOMBCHUS_1
+ GET_ITEM(ITEM_BOMBCHUS_1, OBJECT_GI_BOMB_2, GID_BOMBCHU, 0x36, GIFIELD(GIFIELD_40 | GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_SHORT),
+ // GI_SWORD_KOKIRI
+ GET_ITEM(ITEM_SWORD_KOKIRI, OBJECT_GI_SWORD_1, GID_SWORD_KOKIRI, 0x37,
+ GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_SWORD_RAZOR
+ GET_ITEM(ITEM_SWORD_RAZOR, OBJECT_GI_SWORD_2, GID_SWORD_RAZOR, 0x38,
+ GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_SWORD_GILDED
+ GET_ITEM(ITEM_SWORD_GILDED, OBJECT_GI_SWORD_3, GID_SWORD_GILDED, 0x39,
+ GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_BOMBCHUS_5
+ GET_ITEM(ITEM_BOMBCHUS_5, OBJECT_GI_BOMB_2, GID_BOMBCHU, 0x3A, GIFIELD(GIFIELD_40 | GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_SHORT),
+ // GI_SWORD_GREAT_FAIRY
+ GET_ITEM(ITEM_SWORD_GREAT_FAIRY, OBJECT_GI_SWORD_4, GID_SWORD_GREAT_FAIRY, 0x3B,
+ GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_KEY_SMALL
+ GET_ITEM(ITEM_KEY_SMALL, OBJECT_GI_KEY, GID_KEY_SMALL, 0x3C, GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_SHORT),
+ // GI_KEY_BOSS
+ GET_ITEM(ITEM_KEY_BOSS, OBJECT_GI_BOSSKEY, GID_KEY_BOSS, 0x3D, GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_MAP
+ GET_ITEM(ITEM_DUNGEON_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, 0x3E, GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_COMPASS
+ GET_ITEM(ITEM_COMPASS, OBJECT_GI_COMPASS, GID_COMPASS, 0x3F, GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_40
+ GET_ITEM(ITEM_NONE, OBJECT_UNSET_0, GID_NONE, 0x40, 0, 0),
+ // GI_HOOKSHOT
+ GET_ITEM(ITEM_HOOKSHOT, OBJECT_GI_HOOKSHOT, GID_HOOKSHOT, 0x41, GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_LENS
+ GET_ITEM(ITEM_LENS, OBJECT_GI_GLASSES, GID_LENS, 0x42, GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_PICTO_BOX
+ GET_ITEM(ITEM_PICTO_BOX, OBJECT_GI_CAMERA, GID_PICTO_BOX, 0x43, GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_44
+ GET_ITEM(ITEM_PICTO_BOX, OBJECT_UNSET_0, GID_NONE, 0x44, GIFIELD(0, ITEM00_RUPEE_GREEN), 0),
+ // GI_45
+ GET_ITEM(ITEM_RECOVERY_HEART, OBJECT_GI_HEART, GID_RECOVERY_HEART, 0x45, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_46
+ GET_ITEM(ITEM_NONE, OBJECT_UNSET_0, GID_NONE, 0x46, 0, 0),
+ // GI_47
+ GET_ITEM(ITEM_NONE, OBJECT_UNSET_0, GID_NONE, 0x47, 0, 0),
+ // GI_48
+ GET_ITEM(ITEM_NONE, OBJECT_UNSET_0, GID_NONE, 0x48, 0, 0),
+ // GI_49
+ GET_ITEM(ITEM_NONE, OBJECT_UNSET_0, GID_NONE, 0x49, 0, 0),
+ // GI_4A
+ GET_ITEM(ITEM_NONE, OBJECT_UNSET_0, GID_NONE, 0x4A, 0, 0),
+ // GI_4B
+ GET_ITEM(ITEM_NONE, OBJECT_UNSET_0, GID_NONE, 0x4B, 0, 0),
+ // GI_OCARINA
+ GET_ITEM(ITEM_OCARINA, OBJECT_GI_OCARINA, GID_OCARINA, 0x4C, GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_4D
+ GET_ITEM(ITEM_NONE, OBJECT_UNSET_0, GID_NONE, 0x4D, 0, 0),
+ // GI_4E
+ GET_ITEM(ITEM_NONE, OBJECT_UNSET_0, GID_NONE, 0x4E, 0, 0),
+ // GI_4F
+ GET_ITEM(ITEM_NONE, OBJECT_UNSET_0, GID_NONE, 0x4F, 0, 0),
+ // GI_BOMBERS_NOTEBOOK
+ GET_ITEM(ITEM_BOMBERS_NOTEBOOK, OBJECT_GI_SCHEDULE, GID_BOMBERS_NOTEBOOK, 0x50, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_51
+ GET_ITEM(ITEM_NONE, OBJECT_GI_MAP, GID_STONE_OF_AGONY, 0x51, GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_SKULL_TOKEN
+ GET_ITEM(ITEM_SKULL_TOKEN, OBJECT_GI_SUTARU, GID_SKULL_TOKEN, 0x52, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_SHORT),
+ // GI_53
+ GET_ITEM(ITEM_NONE, OBJECT_UNSET_0, GID_NONE, 0x53, 0, 0),
+ // GI_54
+ GET_ITEM(ITEM_NONE, OBJECT_UNSET_0, GID_NONE, 0x54, 0, 0),
+ // GI_REMAINS_ODOLWA
+ GET_ITEM(ITEM_REMAINS_ODOLWA, OBJECT_UNSET_0, GID_REMAINS_ODOLWA, 0x55, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_REMAINS_GOHT
+ GET_ITEM(ITEM_REMAINS_GOHT, OBJECT_UNSET_0, GID_REMAINS_GOHT, 0x56, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_REMAINS_GYORG
+ GET_ITEM(ITEM_REMAINS_GYORG, OBJECT_UNSET_0, GID_REMAINS_GYORG, 0x57, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_REMAINS_TWINMOLD
+ GET_ITEM(ITEM_REMAINS_TWINMOLD, OBJECT_UNSET_0, GID_REMAINS_TWINMOLD, 0x58, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_POTION_RED_BOTTLE
+ GET_ITEM(ITEM_LONGSHOT, OBJECT_GI_BOTTLE_RED, GID_57, GIFIELD(GIFIELD_40, ITEM00_BOMBS_0),
+ GIFIELD(GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_BOTTLE
+ GET_ITEM(ITEM_BOTTLE, OBJECT_GI_BOTTLE, GID_BOTTLE, 0x5A, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_POTION_RED
+ GET_ITEM(ITEM_POTION_RED, OBJECT_GI_LIQUID, GID_POTION_RED, 0x5B, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_POTION_GREEN
+ GET_ITEM(ITEM_POTION_GREEN, OBJECT_GI_LIQUID, GID_POTION_GREEN, 0x5C, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_POTION_BLUE
+ GET_ITEM(ITEM_POTION_BLUE, OBJECT_GI_LIQUID, GID_POTION_BLUE, 0x5D, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_FAIRY
+ GET_ITEM(ITEM_FAIRY, OBJECT_GI_BOTTLE_04, GID_FAIRY, 0x5E, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_DEKU_PRINCESS
+ GET_ITEM(ITEM_FAIRY, OBJECT_GI_BOTTLE, GID_BOTTLE, 0x5F, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_MILK_BOTTLE
+ GET_ITEM(ITEM_MILK_BOTTLE, OBJECT_GI_MILK, GID_MILK, 0x60, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_MILK_HALF
+ GET_ITEM(ITEM_MILK_HALF, OBJECT_GI_MILK, GID_MILK, 0x61, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_FISH
+ GET_ITEM(ITEM_FISH, OBJECT_GI_FISH, GID_FISH, 0x62, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_BUG
+ GET_ITEM(ITEM_BUG, OBJECT_GI_INSECT, GID_BUG, 0x63, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_BLUE_FIRE
+ GET_ITEM(ITEM_BLUE_FIRE, OBJECT_UNSET_0, GID_NONE, 0x64, GIFIELD(0, ITEM00_RUPEE_GREEN), 0),
+ // GI_POE
+ GET_ITEM(ITEM_BOTTLE, OBJECT_GI_BOTTLE, GID_BOTTLE, 0x65, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_BIG_POE
+ GET_ITEM(ITEM_BIG_POE, OBJECT_GI_GHOST, GID_BIG_POE, 0x66, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_SPRING_WATER
+ GET_ITEM(ITEM_SPRING_WATER, OBJECT_UNSET_0, GID_NONE, 0x67, GIFIELD(0, ITEM00_RUPEE_GREEN), 0),
+ // GI_HOT_SPRING_WATER
+ GET_ITEM(ITEM_HOT_SPRING_WATER, OBJECT_UNSET_0, GID_NONE, 0x68, GIFIELD(0, ITEM00_RUPEE_GREEN), 0),
+ // GI_ZORA_EGG
+ GET_ITEM(ITEM_ZORA_EGG, OBJECT_GI_BOTTLE_15, GID_ZORA_EGG, 0x69, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_GOLD_DUST
+ GET_ITEM(ITEM_GOLD_DUST, OBJECT_GI_BOTTLE_16, GID_SEAHORSE, 0x6A, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_MUSHROOM
+ GET_ITEM(ITEM_MUSHROOM, OBJECT_GI_MAGICMUSHROOM, GID_MUSHROOM, 0x6B, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_6C
+ GET_ITEM(ITEM_NONE, OBJECT_UNSET_0, GID_NONE, 0x6C, GIFIELD(0, ITEM00_RUPEE_GREEN), 0),
+ // GI_6D
+ GET_ITEM(ITEM_BOTTLE, OBJECT_GI_BOTTLE, GID_BOTTLE, 0x6D, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_SEAHORSE
+ GET_ITEM(ITEM_SEAHORSE, OBJECT_GI_BOTTLE_16, GID_SEAHORSE, 0x6E, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_CHATEAU_BOTTLE
+ GET_ITEM(ITEM_CHATEAU, OBJECT_GI_BOTTLE_21, GID_CHATEAU, 0x6F, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_HYLIAN_LOACH
+ GET_ITEM(ITEM_BOTTLE, OBJECT_GI_BOTTLE, GID_BOTTLE, 0x70, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_71
+ GET_ITEM(ITEM_NONE, OBJECT_UNSET_0, GID_NONE, 0x71, 0, 0),
+ // GI_72
+ GET_ITEM(ITEM_NONE, OBJECT_UNSET_0, GID_NONE, 0x72, 0, 0),
+ // GI_73
+ GET_ITEM(ITEM_NONE, OBJECT_UNSET_0, GID_NONE, 0x73, 0, 0),
+ // GI_74
+ GET_ITEM(ITEM_NONE, OBJECT_UNSET_0, GID_NONE, 0x74, 0, 0),
+ // GI_75
+ GET_ITEM(ITEM_NONE, OBJECT_UNSET_0, GID_NONE, 0x75, 0, 0),
+ // GI_ICE_TRAP
+ GET_ITEM(ITEM_NONE, OBJECT_UNSET_0, GID_NONE, 0x76, 0, 0),
+ // GI_77
+ GET_ITEM(ITEM_NONE, OBJECT_UNSET_0, GID_NONE, 0x77, 0, 0),
+ // GI_MASK_DEKU
+ GET_ITEM(ITEM_MASK_DEKU, OBJECT_GI_NUTSMASK, GID_MASK_DEKU, 0x78, GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_MASK_GORON
+ GET_ITEM(ITEM_MASK_GORON, OBJECT_GI_GOLONMASK, GID_MASK_GORON, 0x79,
+ GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_MASK_ZORA
+ GET_ITEM(ITEM_MASK_ZORA, OBJECT_GI_ZORAMASK, GID_MASK_ZORA, 0x7A, GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_MASK_FIERCE_DEITY
+ GET_ITEM(ITEM_MASK_FIERCE_DEITY, OBJECT_GI_MASK03, GID_MASK_FIERCE_DEITY, 0x7B,
+ GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_MASK_CAPTAIN
+ GET_ITEM(ITEM_MASK_CAPTAIN, OBJECT_GI_MASK18, GID_MASK_CAPTAIN, 0x7C,
+ GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_MASK_GIANT
+ GET_ITEM(ITEM_MASK_GIANT, OBJECT_GI_MASK23, GID_MASK_GIANT, 0x7D, GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_MASK_ALL_NIGHT
+ GET_ITEM(ITEM_MASK_ALL_NIGHT, OBJECT_GI_MASK06, GID_MASK_ALL_NIGHT, 0x7E,
+ GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_MASK_BUNNY
+ GET_ITEM(ITEM_MASK_BUNNY, OBJECT_GI_RABIT_MASK, GID_MASK_BUNNY, 0x7F,
+ GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_MASK_KEATON
+ GET_ITEM(ITEM_MASK_KEATON, OBJECT_GI_KI_TAN_MASK, GID_MASK_KEATON, 0x80,
+ GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_MASK_GARO
+ GET_ITEM(ITEM_MASK_GARO, OBJECT_GI_MASK09, GID_MASK_GARO, 0x81, GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_MASK_ROMANI
+ GET_ITEM(ITEM_MASK_ROMANI, OBJECT_GI_MASK10, GID_MASK_ROMANI, 0x82, GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_MASK_CIRCUS_LEADER
+ GET_ITEM(ITEM_MASK_CIRCUS_LEADER, OBJECT_GI_MASK11, GID_MASK_CIRCUS_LEADER, 0x83,
+ GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_MASK_POSTMAN
+ GET_ITEM(ITEM_MASK_POSTMAN, OBJECT_GI_MASK12, GID_MASK_POSTMAN, 0x84,
+ GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_MASK_COUPLE
+ GET_ITEM(ITEM_MASK_COUPLE, OBJECT_GI_MASK13, GID_MASK_COUPLE, 0x85, GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_MASK_GREAT_FAIRY
+ GET_ITEM(ITEM_MASK_GREAT_FAIRY, OBJECT_GI_MASK14, GID_MASK_GREAT_FAIRY, 0x86,
+ GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_MASK_GIBDO
+ GET_ITEM(ITEM_MASK_GIBDO, OBJECT_GI_MASK15, GID_MASK_GIBDO, 0x87, GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_MASK_DON_GERO
+ GET_ITEM(ITEM_MASK_DON_GERO, OBJECT_GI_MASK16, GID_MASK_DON_GERO, 0x88,
+ GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_MASK_KAMARO
+ GET_ITEM(ITEM_MASK_KAMARO, OBJECT_GI_MASK17, GID_MASK_KAMARO, 0x89, GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_MASK_TRUTH
+ GET_ITEM(ITEM_MASK_TRUTH, OBJECT_GI_TRUTH_MASK, GID_MASK_TRUTH, 0x8A,
+ GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_MASK_STONE
+ GET_ITEM(ITEM_MASK_STONE, OBJECT_GI_STONEMASK, GID_MASK_STONE, 0x8B,
+ GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_MASK_BREMEN
+ GET_ITEM(ITEM_MASK_BREMEN, OBJECT_GI_MASK20, GID_MASK_BREMEN, 0x8C, GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_MASK_BLAST
+ GET_ITEM(ITEM_MASK_BLAST, OBJECT_GI_MASK21, GID_MASK_BLAST, 0x8D, GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_MASK_SCENTS
+ GET_ITEM(ITEM_MASK_SCENTS, OBJECT_GI_MASK22, GID_MASK_SCENTS, 0x8E, GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_MASK_KAFEIS_MASK
+ GET_ITEM(ITEM_MASK_KAFEIS_MASK, OBJECT_GI_MASK05, GID_MASK_KAFEIS_MASK, 0x8F,
+ GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_90
+ GET_ITEM(ITEM_NONE, OBJECT_UNSET_0, GID_NONE, 0x90, 0, 0),
+ // GI_CHATEAU
+ GET_ITEM(ITEM_CHATEAU_2, OBJECT_GI_BOTTLE_21, GID_CHATEAU, 0x91, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_MILK
+ GET_ITEM(ITEM_MILK, OBJECT_GI_MILK, GID_MILK, 0x92, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_GOLD_DUST_2
+ GET_ITEM(ITEM_GOLD_DUST_2, OBJECT_GI_GOLD_DUST, GID_GOLD_DUST, 0x93, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_HYLIAN_LOACH_2
+ GET_ITEM(ITEM_HYLIAN_LOACH_2, OBJECT_GI_LOACH, GID_HYLIAN_LOACH, 0x94, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_SEAHORSE_CAUGHT
+ GET_ITEM(ITEM_SEAHORSE_CAUGHT, OBJECT_GI_SEAHORSE, GID_SEAHORSE_CAUGHT, 0x95, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_MOON_TEAR
+ GET_ITEM(ITEM_MOON_TEAR, OBJECT_GI_RESERVE00, GID_MOON_TEAR, 0x96, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_DEED_LAND
+ GET_ITEM(ITEM_DEED_LAND, OBJECT_GI_RESERVE01, GID_DEED_LAND, 0x97, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_DEED_SWAMP
+ GET_ITEM(ITEM_DEED_SWAMP, OBJECT_GI_RESERVE01, GID_DEED_SWAMP, 0x98, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_DEED_MOUNTAIN
+ GET_ITEM(ITEM_DEED_MOUNTAIN, OBJECT_GI_RESERVE01, GID_DEED_MOUNTAIN, 0x99, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_DEED_OCEAN
+ GET_ITEM(ITEM_DEED_OCEAN, OBJECT_GI_RESERVE01, GID_DEED_OCEAN, 0x9A, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_SWORD_GREAT_FAIRY_STOLEN
+ GET_ITEM(ITEM_SWORD_GREAT_FAIRY, OBJECT_GI_SWORD_4, GID_SWORD_GREAT_FAIRY, 0x9B,
+ GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_SWORD_KOKIRI_STOLEN
+ GET_ITEM(ITEM_SWORD_KOKIRI, OBJECT_GI_SWORD_1, GID_SWORD_KOKIRI, 0x9C,
+ GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_SWORD_RAZOR_STOLEN
+ GET_ITEM(ITEM_SWORD_RAZOR, OBJECT_GI_SWORD_2, GID_SWORD_RAZOR, 0x9D,
+ GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_SWORD_GILDED_STOLEN
+ GET_ITEM(ITEM_SWORD_GILDED, OBJECT_GI_SWORD_3, GID_SWORD_GILDED, 0x9E,
+ GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_SHIELD_HERO_STOLEN
+ GET_ITEM(ITEM_SHIELD_HERO, OBJECT_GI_SHIELD_2, GID_SHIELD_HERO, 0x9F,
+ GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_SHORT),
+ // GI_ROOM_KEY
+ GET_ITEM(ITEM_ROOM_KEY, OBJECT_GI_RESERVE_B_00, GID_ROOM_KEY, 0xA0, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_LETTER_TO_MAMA
+ GET_ITEM(ITEM_LETTER_MAMA, OBJECT_GI_RESERVE_B_01, GID_LETTER_MAMA, 0xA1, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_A2
+ GET_ITEM(ITEM_NONE, OBJECT_UNSET_0, GID_NONE, 0xA2, 0, 0),
+ // GI_A3
+ GET_ITEM(ITEM_NONE, OBJECT_UNSET_0, GID_NONE, 0xA3, 0, 0),
+ // GI_A4
+ GET_ITEM(ITEM_NONE, OBJECT_GI_KI_TAN_MASK, GID_MASK_KEATON, 0xA4, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_A5
+ GET_ITEM(ITEM_NONE, OBJECT_UNSET_0, GID_NONE, 0xA5, 0, 0),
+ // GI_A6
+ GET_ITEM(ITEM_NONE, OBJECT_UNSET_0, GID_NONE, 0xA6, 0, 0),
+ // GI_A7
+ GET_ITEM(ITEM_NONE, OBJECT_UNSET_0, GID_NONE, 0xA7, 0, 0),
+ // GI_A8
+ GET_ITEM(ITEM_NONE, OBJECT_UNSET_0, GID_NONE, 0xA8, 0, 0),
+ // GI_BOTTLE_STOLEN
+ GET_ITEM(ITEM_BOTTLE, OBJECT_GI_BOTTLE, GID_BOTTLE, 0xA9, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_LETTER_TO_KAFEI
+ GET_ITEM(ITEM_LETTER_TO_KAFEI, OBJECT_GI_RESERVE_C_00, GID_LETTER_TO_KAFEI, 0xAA,
+ GIFIELD(GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_PENDANT_OF_MEMORIES
+ GET_ITEM(ITEM_PENDANT_OF_MEMORIES, OBJECT_GI_RESERVE_C_01, GID_PENDANT_OF_MEMORIES, 0xAB,
+ GIFIELD(GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_AC
+ GET_ITEM(ITEM_NONE, OBJECT_UNSET_0, GID_NONE, 0xAC, 0, 0),
+ // GI_AD
+ GET_ITEM(ITEM_NONE, OBJECT_UNSET_0, GID_NONE, 0xAD, 0, 0),
+ // GI_AE
+ GET_ITEM(ITEM_NONE, OBJECT_UNSET_0, GID_NONE, 0xAE, 0, 0),
+ // GI_AF
+ GET_ITEM(ITEM_NONE, OBJECT_UNSET_0, GID_NONE, 0xAF, 0, 0),
+ // GI_B0
+ GET_ITEM(ITEM_NONE, OBJECT_UNSET_0, GID_NONE, 0xB0, 0, 0),
+ // GI_B1
+ GET_ITEM(ITEM_NONE, OBJECT_UNSET_0, GID_NONE, 0xB1, 0, 0),
+ // GI_B2
+ GET_ITEM(ITEM_NONE, OBJECT_UNSET_0, GID_NONE, 0xB2, 0, 0),
+ // GI_B3
+ GET_ITEM(ITEM_NONE, OBJECT_GI_MSSA, GID_MASK_SUN, 0xB3, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_TINGLE_MAP_CLOCK_TOWN
+ GET_ITEM(ITEM_TINGLE_MAP, OBJECT_GI_FIELDMAP, GID_TINGLE_MAP, 0xB4, GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_TINGLE_MAP_WOODFALL
+ GET_ITEM(ITEM_TINGLE_MAP, OBJECT_GI_FIELDMAP, GID_TINGLE_MAP, 0xB5, GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_TINGLE_MAP_SNOWHEAD
+ GET_ITEM(ITEM_TINGLE_MAP, OBJECT_GI_FIELDMAP, GID_TINGLE_MAP, 0xB6, GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_TINGLE_MAP_ROMANI_RANCH
+ GET_ITEM(ITEM_TINGLE_MAP, OBJECT_GI_FIELDMAP, GID_TINGLE_MAP, 0xB7, GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_TINGLE_MAP_GREAT_BAY
+ GET_ITEM(ITEM_TINGLE_MAP, OBJECT_GI_FIELDMAP, GID_TINGLE_MAP, 0xB8, GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_TINGLE_MAP_STONE_TOWER
+ GET_ITEM(ITEM_TINGLE_MAP, OBJECT_GI_FIELDMAP, GID_TINGLE_MAP, 0xB9, GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+};
+
+// Player_UpdateCurrentGetItemDrawId?
+void func_8082ECE0(Player* this) {
+ GetItemEntry* giEntry = &sGetItemTable[this->getItemId - 1];
+
+ this->getItemDrawIdPlusOne = ABS_ALT(giEntry->gid);
+}
+
+PlayerAnimationHeader* func_8082ED20(Player* this) {
+ if ((this->transformation == PLAYER_FORM_ZORA) || (this->actor.id != ACTOR_PLAYER)) {
+ return &gPlayerAnim_pz_wait;
+ }
+ if (this->transformation == PLAYER_FORM_GORON) {
+ return &gPlayerAnim_pg_wait;
+ }
+ if (this->currentMask == PLAYER_MASK_SCENTS) {
+ return &gPlayerAnim_cl_msbowait;
+ }
+ return D_8085BE84[PLAYER_ANIMGROUP_0][this->modelAnimType];
+}
+
+PlayerAnimationHeader* sPlayerIdleAnimations[][2] = {
+ { &gPlayerAnim_link_normal_wait_typeA_20f, &gPlayerAnim_link_normal_waitF_typeA_20f }, // ROOM_BEHAVIOR_TYPE2_0
+ { &gPlayerAnim_link_normal_wait_typeC_20f, &gPlayerAnim_link_normal_waitF_typeC_20f }, // ROOM_BEHAVIOR_TYPE2_1
+ { &gPlayerAnim_link_normal_wait_typeB_20f, &gPlayerAnim_link_normal_waitF_typeB_20f }, // ROOM_BEHAVIOR_TYPE2_2
+ { &gPlayerAnim_link_normal_wait_typeB_20f, &gPlayerAnim_link_normal_waitF_typeB_20f }, // ROOM_BEHAVIOR_TYPE2_HOT
+ { &gPlayerAnim_link_wait_typeD_20f, &gPlayerAnim_link_waitF_typeD_20f }, // ROOM_BEHAVIOR_TYPE2_4
+ { &gPlayerAnim_link_wait_typeD_20f, &gPlayerAnim_link_waitF_typeD_20f }, // ROOM_BEHAVIOR_TYPE2_5
+ { &gPlayerAnim_link_wait_typeD_20f, &gPlayerAnim_link_waitF_typeD_20f }, // ROOM_BEHAVIOR_TYPE2_6
+ { &gPlayerAnim_link_wait_heat1_20f, &gPlayerAnim_link_waitF_heat1_20f },
+ { &gPlayerAnim_link_wait_heat2_20f, &gPlayerAnim_link_waitF_heat2_20f },
+ { &gPlayerAnim_link_wait_itemD1_20f, &gPlayerAnim_link_wait_itemD1_20f },
+ { &gPlayerAnim_link_wait_itemA_20f, &gPlayerAnim_link_waitF_itemA_20f },
+ { &gPlayerAnim_link_wait_itemB_20f, &gPlayerAnim_link_waitF_itemB_20f },
+ { &gPlayerAnim_link_wait_itemC_20f, &gPlayerAnim_link_wait_itemC_20f },
+ { &gPlayerAnim_link_wait_itemD2_20f, &gPlayerAnim_link_wait_itemD2_20f },
+ { &gPlayerAnim_cl_msbowait, &gPlayerAnim_cl_msbowait },
+};
+
+AnimSfxEntry D_8085C8C4[] = {
+ ANIMSFX(ANIMSFX_TYPE_VOICE, 8, NA_SE_VO_LI_SNEEZE, STOP),
+};
+AnimSfxEntry D_8085C8C8[] = {
+ ANIMSFX(ANIMSFX_TYPE_VOICE, 18, NA_SE_VO_LI_SWEAT, STOP),
+};
+AnimSfxEntry D_8085C8CC[] = {
+ ANIMSFX(ANIMSFX_TYPE_VOICE, 13, NA_SE_VO_LI_BREATH_REST, STOP),
+};
+AnimSfxEntry D_8085C8D0[] = {
+ ANIMSFX(ANIMSFX_TYPE_VOICE, 10, NA_SE_VO_LI_BREATH_REST, STOP),
+};
+
+AnimSfxEntry D_8085C8D4[] = {
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 44, NA_SE_PL_CALM_HIT, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 48, NA_SE_PL_CALM_HIT, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 52, NA_SE_PL_CALM_HIT, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 56, NA_SE_PL_CALM_HIT, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 60, NA_SE_PL_CALM_HIT, STOP),
+};
+
+AnimSfxEntry D_8085C8E8[] = {
+ ANIMSFX(ANIMSFX_TYPE_8, 25, NA_SE_NONE, CONTINUE), ANIMSFX(ANIMSFX_TYPE_8, 30, NA_SE_NONE, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_8, 44, NA_SE_NONE, CONTINUE), ANIMSFX(ANIMSFX_TYPE_8, 48, NA_SE_NONE, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_8, 52, NA_SE_NONE, CONTINUE), ANIMSFX(ANIMSFX_TYPE_8, 56, NA_SE_NONE, STOP),
+};
+
+AnimSfxEntry D_8085C900[] = {
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 16, NA_SE_IT_SHIELD_SWING, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 20, NA_SE_IT_SHIELD_SWING, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 70, NA_SE_IT_SHIELD_SWING, STOP),
+};
+
+AnimSfxEntry D_8085C90C[] = {
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 10, NA_SE_IT_HAMMER_SWING, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_VOICE, 10, NA_SE_VO_LI_AUTO_JUMP, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 22, NA_SE_IT_SWORD_SWING, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_VOICE, 22, NA_SE_VO_LI_SWORD_N, STOP),
+};
+
+AnimSfxEntry D_8085C91C[] = {
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 39, NA_SE_IT_SWORD_SWING, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_VOICE, 39, NA_SE_VO_LI_SWORD_N, STOP),
+};
+AnimSfxEntry D_8085C924[] = {
+ ANIMSFX(ANIMSFX_TYPE_VOICE, 20, NA_SE_VO_LI_RELAX, STOP),
+};
+
+AnimSfxEntry D_8085C928[] = {
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 4, NA_SE_VO_LI_POO_WAIT, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 12, NA_SE_VO_LI_POO_WAIT, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 30, NA_SE_VO_LI_POO_WAIT, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 61, NA_SE_VO_LI_POO_WAIT, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 68, NA_SE_VO_LI_POO_WAIT, STOP),
+};
+
+AnimSfxEntry* D_8085C93C[] = {
+ D_8085C8C4, D_8085C8C8, D_8085C8CC, D_8085C8D0, D_8085C8D4, D_8085C8E8,
+ D_8085C900, D_8085C90C, D_8085C91C, D_8085C924, D_8085C928, NULL,
+};
+
+// Used to index into D_8085C93C
+u8 D_8085C96C[] = {
+ 0, 0, 1, 1, 2, 2, 2, 2, 10, 10, 10, 10, 10, 10, 3, 3, 4, 4, 8, 8, 5, 5, 6, 6, 7, 7, 9, 9, 11, 11,
+};
+
+s32 func_8082ED94(Player* this) {
+ PlayerAnimationHeader** entry;
+ s32 i;
+
+ if ((this->skelAnime.animation != &gPlayerAnim_link_normal_newroll_jump_end_20f) &&
+ (this->skelAnime.animation != &gPlayerAnim_link_normal_newside_jump_end_20f)) {
+ if ((this->skelAnime.animation != func_8082ED20(this)) ||
+ (this->skelAnime.animation == &gPlayerAnim_cl_msbowait)) {
+ for (i = 0, entry = &sPlayerIdleAnimations[0][0]; i < ARRAY_COUNT_2D(sPlayerIdleAnimations); i++) {
+ if (this->skelAnime.animation == *entry) {
+ return i + 1;
+ }
+ entry++;
+ }
+
+ return 0;
+ }
+ }
+
+ return -1;
+}
+
+void func_8082EEA4(Player* this, s32 arg1) {
+ u8 temp_v0 = D_8085C96C[arg1];
+
+ if (temp_v0 != 0) {
+ Player_PlayAnimSfx(this, D_8085C93C[temp_v0 - 1]);
+ }
+}
+
+PlayerAnimationHeader* func_8082EEE0(Player* this) {
+ if (this->unk_B64 != 0) {
+ return D_8085BE84[PLAYER_ANIMGROUP_3][this->modelAnimType];
+ } else {
+ return D_8085BE84[PLAYER_ANIMGROUP_2][this->modelAnimType];
+ }
+}
+
+s32 func_8082EF20(Player* this) {
+ return func_8082ECCC(this) && (this->unk_ACC != 0);
+}
+
+PlayerAnimationHeader* func_8082EF54(Player* this) {
+ if (func_8082EF20(this)) {
+ return &gPlayerAnim_link_boom_throw_waitR;
+ } else {
+ return D_8085BE84[PLAYER_ANIMGROUP_5][this->modelAnimType];
+ }
+}
+
+PlayerAnimationHeader* func_8082EF9C(Player* this) {
+ if (func_8082EF20(this)) {
+ return &gPlayerAnim_link_boom_throw_waitL;
+ } else {
+ return D_8085BE84[PLAYER_ANIMGROUP_4][this->modelAnimType];
+ }
+}
+
+PlayerAnimationHeader* func_8082EFE4(Player* this) {
+ if (func_800B7128(this)) {
+ return &gPlayerAnim_link_bow_side_walk;
+ } else {
+ return D_8085BE84[PLAYER_ANIMGROUP_22][this->modelAnimType];
+ }
+}
+
+void func_8082F02C(PlayState* play, struct_8082F02C_arg1* arg1, f32 arg2) {
+ func_800FD59C(play, &arg1->unk_0, arg2);
+ func_800FD5E0(play, &arg1->unk_3, arg2);
+ func_800FD654(play, &arg1->unk_6, arg2);
+ func_800FD698(play, arg1->unk_A, arg1->unk_C, arg2);
+}
+
+/**
+ * Revert cylinder to normal properties
+ */
+void Player_ResetCylinder(Player* this) {
+ this->cylinder.base.colType = COLTYPE_HIT5;
+ this->cylinder.base.atFlags = AT_NONE;
+ this->cylinder.base.acFlags = AC_ON | AC_TYPE_ENEMY;
+ this->cylinder.base.ocFlags1 = OC1_ON | OC1_TYPE_ALL;
+ this->cylinder.info.elemType = ELEMTYPE_UNK1;
+ this->cylinder.info.toucher.dmgFlags = 0;
+ this->cylinder.info.bumper.dmgFlags = 0xF7CFFFFF;
+ this->cylinder.info.toucherFlags = TOUCH_NONE | TOUCH_SFX_NORMAL;
+ this->cylinder.dim.radius = 12;
+}
+
+/**
+ * Give cylinder special properties for attacks, uses include
+ * - Normal roll
+ * - Deku spin
+ * - Deku launch
+ * - Goron pound
+ * - Goron spike roll
+ * - Zora barrier
+ *
+ * and possibly more.
+ *
+ * @param dmgFlags Damage flags (DMGFLAG defines)
+ * @param damage to do
+ * @param radius of cylinder
+ */
+void Player_SetCylinderForAttack(Player* this, u32 dmgFlags, s32 damage, s32 radius) {
+ this->cylinder.base.atFlags = AT_ON | AT_TYPE_PLAYER;
+ if (radius > 30) {
+ this->cylinder.base.ocFlags1 = OC1_NONE;
+ } else {
+ this->cylinder.base.ocFlags1 = OC1_ON | OC1_TYPE_ALL;
+ }
+
+ this->cylinder.info.elemType = ELEMTYPE_UNK2;
+ this->cylinder.info.toucherFlags = TOUCH_ON | TOUCH_NEAREST | TOUCH_SFX_NORMAL;
+ this->cylinder.dim.radius = radius;
+ this->cylinder.info.toucher.dmgFlags = dmgFlags;
+ this->cylinder.info.toucher.damage = damage;
+
+ if (dmgFlags & DMG_GORON_POUND) {
+ this->cylinder.base.acFlags = AC_NONE;
+ } else {
+ this->cylinder.base.colType = COLTYPE_NONE;
+ this->cylinder.info.bumper.dmgFlags = 0xF7CFFFFF;
+
+ if (dmgFlags & DMG_ZORA_BARRIER) {
+ this->cylinder.base.acFlags = AC_NONE;
+ } else {
+ this->cylinder.base.acFlags = AC_ON | AC_TYPE_ENEMY;
+ }
+ }
+}
+
+// Check for starting Zora barrier
+void func_8082F164(Player* this, u16 button) {
+ if ((this->transformation == PLAYER_FORM_ZORA) && CHECK_BTN_ALL(sPlayerControlInput->cur.button, button)) {
+ this->stateFlags1 |= PLAYER_STATE1_10;
+ }
+}
+
+struct_8082F02C_arg1 D_8085C98C = {
+ { 0, 0, 0 }, { 255, 255, 155 }, { 20, 20, 50 }, 940, 5000,
+};
+
+// Run Zora Barrier
+void func_8082F1AC(PlayState* play, Player* this) {
+ s32 sp4C = this->unk_B62;
+ f32 temp;
+ s16 sp46;
+ s16 sp44;
+ f32 sp40;
+ f32 sp3C;
+ s32 var_v0;
+
+ if ((gSaveContext.save.saveInfo.playerData.magic != 0) && (this->stateFlags1 & PLAYER_STATE1_10)) {
+ if (gSaveContext.magicState == MAGIC_STATE_IDLE) {
+ Magic_Consume(play, 0, MAGIC_CONSUME_GORON_ZORA);
+ }
+
+ temp = 16.0f;
+ if (gSaveContext.save.saveInfo.playerData.magic >= 16) {
+ var_v0 = 255;
+ } else {
+ var_v0 = (gSaveContext.save.saveInfo.playerData.magic / temp) * 255.0f;
+ }
+ Math_StepToS(&this->unk_B62, var_v0, 50);
+ } else if (Math_StepToS(&this->unk_B62, 0, 50) && (gSaveContext.magicState != MAGIC_STATE_IDLE)) {
+ Magic_Reset(play);
+ }
+
+ if ((this->unk_B62 != 0) || (sp4C != 0)) {
+ f32 sp34;
+ f32 new_var;
+
+ sp46 = play->gameplayFrames * 7000;
+ sp44 = play->gameplayFrames * 14000;
+ func_8082F02C(play, &D_8085C98C, this->unk_B62 / 255.0f);
+
+ sp34 = Math_SinS(sp44) * 40.0f;
+ sp40 = Math_CosS(sp44) * 40.0f;
+ sp3C = Math_SinS(sp46) * sp34;
+ new_var = Math_CosS(sp46) * sp34;
+
+ Lights_PointNoGlowSetInfo(&this->lightInfo, this->actor.world.pos.x + sp40, this->actor.world.pos.y + sp3C,
+ this->actor.world.pos.z + new_var, 100, 200, 255, 600);
+
+ Player_PlaySfx(this, NA_SE_PL_ZORA_SPARK_BARRIER - SFX_FLAG);
+ Actor_SetPlayerImpact(play, PLAYER_IMPACT_ZORA_BARRIER, 2, 100.0f, &this->actor.world.pos);
+ }
+}
+
+void func_8082F43C(PlayState* play, Player* this, PlayerFuncAC4 arg2) {
+ this->unk_AC4 = arg2;
+ this->unk_ACE = 0;
+ this->unk_AC8 = 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) {
+ PlayerAnimationHeader* curAnim = this->skelAnime.animation;
+ PlayerAnimationHeader*(*iter)[PLAYER_ANIMTYPE_MAX] = (void*)&D_8085BE84[0][this->modelAnimType];
+ s32 i;
+
+ this->stateFlags1 &= ~(PLAYER_STATE1_8 | PLAYER_STATE1_1000000);
+
+ for (i = 0; i < PLAYER_ANIMGROUP_MAX; i++) {
+ if (curAnim == **iter) {
+ break;
+ }
+ iter++;
+ }
+
+ func_8082F8BC(play, this, itemAction);
+
+ if (i < PLAYER_ANIMGROUP_MAX) {
+ this->skelAnime.animation = GET_PLAYER_ANIM(i, this->modelAnimType);
+ }
+}
+
+s8 sItemItemActions[] = {
+ PLAYER_IA_OCARINA, // ITEM_OCARINA,
+ PLAYER_IA_BOW, // ITEM_BOW,
+ PLAYER_IA_BOW_FIRE, // ITEM_ARROW_FIRE,
+ PLAYER_IA_BOW_ICE, // ITEM_ARROW_ICE,
+ PLAYER_IA_BOW_LIGHT, // ITEM_ARROW_LIGHT,
+ PLAYER_IA_PICTO_BOX, // ITEM_OCARINA_FAIRY,
+ PLAYER_IA_BOMB, // ITEM_BOMB,
+ PLAYER_IA_BOMBCHU, // ITEM_BOMBCHU,
+ PLAYER_IA_STICK, // ITEM_STICK,
+ PLAYER_IA_NUT, // ITEM_NUT,
+ PLAYER_IA_MAGIC_BEANS, // ITEM_MAGIC_BEANS,
+ PLAYER_IA_PICTO_BOX, // ITEM_SLINGSHOT,
+ PLAYER_IA_POWDER_KEG, // ITEM_POWDER_KEG,
+ PLAYER_IA_PICTO_BOX, // ITEM_PICTO_BOX,
+ PLAYER_IA_LENS, // ITEM_LENS,
+ PLAYER_IA_HOOKSHOT, // ITEM_HOOKSHOT,
+ PLAYER_IA_SWORD_TWO_HANDED, // ITEM_SWORD_GREAT_FAIRY,
+ PLAYER_IA_PICTO_BOX, // ITEM_LONGSHOT, // OoT Leftover
+ PLAYER_IA_BOTTLE_EMPTY, // ITEM_BOTTLE,
+ PLAYER_IA_BOTTLE_POTION_RED, // ITEM_POTION_RED,
+ PLAYER_IA_BOTTLE_POTION_GREEN, // ITEM_POTION_GREEN,
+ PLAYER_IA_BOTTLE_POTION_BLUE, // ITEM_POTION_BLUE,
+ PLAYER_IA_BOTTLE_FAIRY, // ITEM_FAIRY,
+ PLAYER_IA_BOTTLE_DEKU_PRINCESS, // ITEM_DEKU_PRINCESS,
+ PLAYER_IA_BOTTLE_MILK, // ITEM_MILK_BOTTLE,
+ PLAYER_IA_BOTTLE_MILK_HALF, // ITEM_MILK_HALF,
+ PLAYER_IA_BOTTLE_FISH, // ITEM_FISH,
+ PLAYER_IA_BOTTLE_BUG, // ITEM_BUG,
+ PLAYER_IA_BOTTLE_BUG, // ITEM_BLUE_FIRE, // !
+ PLAYER_IA_BOTTLE_POE, // ITEM_POE,
+ PLAYER_IA_BOTTLE_BIG_POE, // ITEM_BIG_POE,
+ PLAYER_IA_BOTTLE_SPRING_WATER, // ITEM_SPRING_WATER,
+ PLAYER_IA_BOTTLE_HOT_SPRING_WATER, // ITEM_HOT_SPRING_WATER,
+ PLAYER_IA_BOTTLE_ZORA_EGG, // ITEM_ZORA_EGG,
+ PLAYER_IA_BOTTLE_GOLD_DUST, // ITEM_GOLD_DUST,
+ PLAYER_IA_BOTTLE_MUSHROOM, // ITEM_MUSHROOM,
+ PLAYER_IA_BOTTLE_SEAHORSE, // ITEM_SEA_HORSE,
+ PLAYER_IA_BOTTLE_CHATEAU, // ITEM_CHATEAU,
+ PLAYER_IA_BOTTLE_HYLIAN_LOACH, // ITEM_HYLIAN_LOACH,
+ PLAYER_IA_BOTTLE_POE, // ITEM_OBABA_DRINK, // !
+ PLAYER_IA_MOON_TEAR, // ITEM_MOON_TEAR,
+ PLAYER_IA_DEED_LAND, // ITEM_DEED_LAND,
+ PLAYER_IA_DEED_SWAMP, // ITEM_DEED_SWAMP,
+ PLAYER_IA_DEED_MOUNTAIN, // ITEM_DEED_MOUNTAIN,
+ PLAYER_IA_DEED_OCEAN, // ITEM_DEED_OCEAN,
+ PLAYER_IA_ROOM_KEY, // ITEM_ROOM_KEY,
+ PLAYER_IA_LETTER_MAMA, // ITEM_LETTER_MAMA,
+ PLAYER_IA_LETTER_TO_KAFEI, // ITEM_LETTER_TO_KAFEI,
+ PLAYER_IA_PENDANT_OF_MEMORIES, // ITEM_PENDANT_MEMORIES,
+ PLAYER_IA_38, // ITEM_TINGLE_MAP, // !
+ PLAYER_IA_MASK_DEKU, // ITEM_MASK_DEKU,
+ PLAYER_IA_MASK_GORON, // ITEM_MASK_GORON,
+ PLAYER_IA_MASK_ZORA, // ITEM_MASK_ZORA,
+ PLAYER_IA_MASK_FIERCE_DEITY, // ITEM_MASK_FIERCE_DEITY,
+ PLAYER_IA_MASK_TRUTH, // ITEM_MASK_TRUTH,
+ PLAYER_IA_MASK_KAFEIS_MASK, // ITEM_MASK_KAFEIS_MASK,
+ PLAYER_IA_MASK_ALL_NIGHT, // ITEM_MASK_ALL_NIGHT,
+ PLAYER_IA_MASK_BUNNY, // ITEM_MASK_BUNNY,
+ PLAYER_IA_MASK_KEATON, // ITEM_MASK_KEATON,
+ PLAYER_IA_MASK_GARO, // ITEM_MASK_GARO,
+ PLAYER_IA_MASK_ROMANI, // ITEM_MASK_ROMANI,
+ PLAYER_IA_MASK_CIRCUS_LEADER, // ITEM_MASK_CIRCUS_LEADER,
+ PLAYER_IA_MASK_POSTMAN, // ITEM_MASK_POSTMAN,
+ PLAYER_IA_MASK_COUPLE, // ITEM_MASK_COUPLE,
+ PLAYER_IA_MASK_GREAT_FAIRY, // ITEM_MASK_GREAT_FAIRY,
+ PLAYER_IA_MASK_GIBDO, // ITEM_MASK_GIBDO,
+ PLAYER_IA_MASK_DON_GERO, // ITEM_MASK_DON_GERO,
+ PLAYER_IA_MASK_KAMARO, // ITEM_MASK_KAMARO,
+ PLAYER_IA_MASK_CAPTAIN, // ITEM_MASK_CAPTAIN,
+ PLAYER_IA_MASK_STONE, // ITEM_MASK_STONE,
+ PLAYER_IA_MASK_BREMEN, // ITEM_MASK_BREMEN,
+ PLAYER_IA_MASK_BLAST, // ITEM_MASK_BLAST,
+ PLAYER_IA_MASK_SCENTS, // ITEM_MASK_SCENTS,
+ PLAYER_IA_MASK_GIANT, // ITEM_MASK_GIANT,
+ PLAYER_IA_BOW_FIRE, // ITEM_BOW_ARROW_FIRE,
+ PLAYER_IA_BOW_ICE, // ITEM_BOW_ARROW_ICE,
+ PLAYER_IA_BOW_LIGHT, // ITEM_BOW_ARROW_LIGHT,
+ PLAYER_IA_SWORD_KOKIRI, // ITEM_SWORD_KOKIRI,
+ PLAYER_IA_SWORD_RAZOR, // ITEM_SWORD_RAZOR,
+ PLAYER_IA_SWORD_GILDED, // ITEM_SWORD_GILDED,
+ PLAYER_IA_SWORD_TWO_HANDED, // ITEM_SWORD_DEITY,
+};
+
+PlayerItemAction Player_ItemToItemAction(Player* this, ItemId item) {
+ if (item >= ITEM_FD) {
+ return PLAYER_IA_NONE;
+ } else if (item == ITEM_FC) {
+ return PLAYER_IA_LAST_USED;
+ } else if (item == ITEM_FISHING_ROD) {
+ return PLAYER_IA_FISHING_ROD;
+ } else if ((item == ITEM_SWORD_KOKIRI) && (this->transformation == PLAYER_FORM_ZORA)) {
+ return PLAYER_IA_ZORA_FINS;
+ } else {
+ return sItemItemActions[item];
+ }
+}
+
+void func_8082F594(PlayState* play, Player* this) {
+}
+
+void func_8082F5A4(PlayState* play, Player* this) {
+ this->unk_B28 = 0;
+ this->unk_B0C = 1.0f;
+}
+
+void func_8082F5C0(PlayState* play, Player* this) {
+ this->stateFlags1 |= PLAYER_STATE1_8;
+
+ if (this->heldItemAction == PLAYER_IA_NUT) {
+ this->unk_B28 = -2;
+ } else {
+ this->unk_B28 = -1;
+ }
+ this->unk_ACC = 0;
+}
+
+PlayerFuncAC4 D_8085C9F0[PLAYER_IA_MAX] = {
+ func_80848780, // PLAYER_IA_NONE
+ func_80848780, // PLAYER_IA_LAST_USED
+ func_80848780, // PLAYER_IA_FISHING_ROD
+ func_808487B8, // PLAYER_IA_SWORD_KOKIRI
+ func_808487B8, // PLAYER_IA_SWORD_RAZOR
+ func_808487B8, // PLAYER_IA_SWORD_GILDED
+ func_808487B8, // PLAYER_IA_SWORD_TWO_HANDED
+ func_80848780, // PLAYER_IA_STICK
+ func_80848780, // PLAYER_IA_ZORA_FINS
+ func_80848B6C, // PLAYER_IA_BOW
+ func_80848B6C, // PLAYER_IA_BOW_FIRE
+ func_80848B6C, // PLAYER_IA_BOW_ICE
+ func_80848B6C, // PLAYER_IA_BOW_LIGHT
+ func_80848B6C, // PLAYER_IA_HOOKSHOT
+ func_808490B4, // PLAYER_IA_BOMB
+ func_808490B4, // PLAYER_IA_POWDER_KEG
+ func_808490B4, // PLAYER_IA_BOMBCHU
+ func_808491B4, // PLAYER_IA_11
+ func_80848B6C, // PLAYER_IA_NUT
+ func_80848780, // PLAYER_IA_PICTO_BOX
+ func_80848780, // PLAYER_IA_OCARINA
+ func_80848780, // PLAYER_IA_BOTTLE_EMPTY
+ func_80848780, // PLAYER_IA_BOTTLE_FISH
+ func_80848780, // PLAYER_IA_BOTTLE_SPRING_WATER
+ func_80848780, // PLAYER_IA_BOTTLE_HOT_SPRING_WATER
+ func_80848780, // PLAYER_IA_BOTTLE_ZORA_EGG
+ func_80848780, // PLAYER_IA_BOTTLE_DEKU_PRINCESS
+ func_80848780, // PLAYER_IA_BOTTLE_GOLD_DUST
+ func_80848780, // PLAYER_IA_BOTTLE_1C
+ func_80848780, // PLAYER_IA_BOTTLE_SEA_HORSE
+ func_80848780, // PLAYER_IA_BOTTLE_MUSHROOM
+ func_80848780, // PLAYER_IA_BOTTLE_HYLIAN_LOACH
+ func_80848780, // PLAYER_IA_BOTTLE_BUG
+ func_80848780, // PLAYER_IA_BOTTLE_POE
+ func_80848780, // PLAYER_IA_BOTTLE_BIG_POE
+ func_80848780, // PLAYER_IA_BOTTLE_POTION_RED
+ func_80848780, // PLAYER_IA_BOTTLE_POTION_BLUE
+ func_80848780, // PLAYER_IA_BOTTLE_POTION_GREEN
+ func_80848780, // PLAYER_IA_BOTTLE_MILK
+ func_80848780, // PLAYER_IA_BOTTLE_MILK_HALF
+ func_80848780, // PLAYER_IA_BOTTLE_CHATEAU
+ func_80848780, // PLAYER_IA_BOTTLE_FAIRY
+ func_80848780, // PLAYER_IA_MOON_TEAR
+ func_80848780, // PLAYER_IA_DEED_LAND
+ func_80848780, // PLAYER_IA_ROOM_KEY
+ func_80848780, // PLAYER_IA_LETTER_TO_KAFEI
+ func_80848780, // PLAYER_IA_MAGIC_BEANS
+ func_80848780, // PLAYER_IA_DEED_SWAMP
+ func_80848780, // PLAYER_IA_DEED_MOUNTAIN
+ func_80848780, // PLAYER_IA_DEED_OCEAN
+ func_80848780, // PLAYER_IA_32
+ func_80848780, // PLAYER_IA_LETTER_MAMA
+ func_80848780, // PLAYER_IA_34
+ func_80848780, // PLAYER_IA_35
+ func_80848780, // PLAYER_IA_PENDANT_MEMORIES
+ func_80848780, // PLAYER_IA_37
+ func_80848780, // PLAYER_IA_38
+ func_80848780, // PLAYER_IA_39
+ func_80848780, // PLAYER_IA_MASK_TRUTH
+ func_80848780, // PLAYER_IA_MASK_KAFEIS_MASK
+ func_80848780, // PLAYER_IA_MASK_ALL_NIGHT
+ func_80848780, // PLAYER_IA_MASK_BUNNY
+ func_80848780, // PLAYER_IA_MASK_KEATON
+ func_80848780, // PLAYER_IA_MASK_GARO
+ func_80848780, // PLAYER_IA_MASK_ROMANI
+ func_80848780, // PLAYER_IA_MASK_CIRCUS_LEADER
+ func_80848780, // PLAYER_IA_MASK_POSTMAN
+ func_80848780, // PLAYER_IA_MASK_COUPLE
+ func_80848780, // PLAYER_IA_MASK_GREAT_FAIRY
+ func_80848780, // PLAYER_IA_MASK_GIBDO
+ func_80848780, // PLAYER_IA_MASK_DON_GERO
+ func_80848780, // PLAYER_IA_MASK_KAMARO
+ func_80848780, // PLAYER_IA_MASK_CAPTAIN
+ func_80848780, // PLAYER_IA_MASK_STONE
+ func_80848780, // PLAYER_IA_MASK_BREMEN
+ func_80848780, // PLAYER_IA_MASK_BLAST
+ func_80848780, // PLAYER_IA_MASK_SCENTS
+ func_80848780, // PLAYER_IA_MASK_GIANT
+ func_80848780, // PLAYER_IA_MASK_FIERCE_DEITY
+ func_80848780, // PLAYER_IA_MASK_GORON
+ func_80848780, // PLAYER_IA_MASK_ZORA
+ func_80848780, // PLAYER_IA_MASK_DEKU
+ func_80848780, // PLAYER_IA_LENS
+};
+
+// sPlayerItemActionInits?
+void (*D_8085CB3C[PLAYER_IA_MAX])(PlayState*, Player*) = {
+ func_8082F594, // PLAYER_IA_NONE
+ func_8082F594, // PLAYER_IA_LAST_USED
+ func_8082F594, // PLAYER_IA_FISHING_ROD
+ func_8082F594, // PLAYER_IA_SWORD_KOKIRI
+ func_8082F594, // PLAYER_IA_SWORD_RAZOR
+ func_8082F594, // PLAYER_IA_SWORD_GILDED
+ func_8082F594, // PLAYER_IA_SWORD_TWO_HANDED
+ func_8082F5A4, // PLAYER_IA_STICK
+ func_8082F8A0, // PLAYER_IA_ZORA_FINS
+ func_8082F5C0, // PLAYER_IA_BOW
+ func_8082F5C0, // PLAYER_IA_BOW_FIRE
+ func_8082F5C0, // PLAYER_IA_BOW_ICE
+ func_8082F5C0, // PLAYER_IA_BOW_LIGHT
+ func_8082F7F4, // PLAYER_IA_HOOKSHOT
+ Player_SpawnExplosive, // PLAYER_IA_BOMB
+ Player_SpawnExplosive, // PLAYER_IA_POWDER_KEG
+ Player_SpawnExplosive, // PLAYER_IA_BOMBCHU
+ func_8082F8A0, // PLAYER_IA_11
+ func_8082F5C0, // PLAYER_IA_NUT
+ func_8082F594, // PLAYER_IA_PICTO_BOX
+ func_8082F594, // PLAYER_IA_OCARINA
+ func_8082F594, // PLAYER_IA_BOTTLE_EMPTY
+ func_8082F594, // PLAYER_IA_BOTTLE_FISH
+ func_8082F594, // PLAYER_IA_BOTTLE_SPRING_WATER
+ func_8082F594, // PLAYER_IA_BOTTLE_HOT_SPRING_WATER
+ func_8082F594, // PLAYER_IA_BOTTLE_ZORA_EGG
+ func_8082F594, // PLAYER_IA_BOTTLE_DEKU_PRINCESS
+ func_8082F594, // PLAYER_IA_BOTTLE_GOLD_DUST
+ func_8082F594, // PLAYER_IA_BOTTLE_1C
+ func_8082F594, // PLAYER_IA_BOTTLE_SEA_HORSE
+ func_8082F594, // PLAYER_IA_BOTTLE_MUSHROOM
+ func_8082F594, // PLAYER_IA_BOTTLE_HYLIAN_LOACH
+ func_8082F594, // PLAYER_IA_BOTTLE_BUG
+ func_8082F594, // PLAYER_IA_BOTTLE_POE
+ func_8082F594, // PLAYER_IA_BOTTLE_BIG_POE
+ func_8082F594, // PLAYER_IA_BOTTLE_POTION_RED
+ func_8082F594, // PLAYER_IA_BOTTLE_POTION_BLUE
+ func_8082F594, // PLAYER_IA_BOTTLE_POTION_GREEN
+ func_8082F594, // PLAYER_IA_BOTTLE_MILK
+ func_8082F594, // PLAYER_IA_BOTTLE_MILK_HALF
+ func_8082F594, // PLAYER_IA_BOTTLE_CHATEAU
+ func_8082F594, // PLAYER_IA_BOTTLE_FAIRY
+ func_8082F594, // PLAYER_IA_MOON_TEAR
+ func_8082F594, // PLAYER_IA_DEED_LAND
+ func_8082F594, // PLAYER_IA_ROOM_KEY
+ func_8082F594, // PLAYER_IA_LETTER_TO_KAFEI
+ func_8082F594, // PLAYER_IA_MAGIC_BEANS
+ func_8082F594, // PLAYER_IA_DEED_SWAMP
+ func_8082F594, // PLAYER_IA_DEED_MOUNTAIN
+ func_8082F594, // PLAYER_IA_DEED_OCEAN
+ func_8082F594, // PLAYER_IA_32
+ func_8082F594, // PLAYER_IA_LETTER_MAMA
+ func_8082F594, // PLAYER_IA_34
+ func_8082F594, // PLAYER_IA_35
+ func_8082F594, // PLAYER_IA_PENDANT_MEMORIES
+ func_8082F594, // PLAYER_IA_37
+ func_8082F594, // PLAYER_IA_38
+ func_8082F594, // PLAYER_IA_39
+ func_8082F594, // PLAYER_IA_MASK_TRUTH
+ func_8082F594, // PLAYER_IA_MASK_KAFEIS_MASK
+ func_8082F594, // PLAYER_IA_MASK_ALL_NIGHT
+ func_8082F594, // PLAYER_IA_MASK_BUNNY
+ func_8082F594, // PLAYER_IA_MASK_KEATON
+ func_8082F594, // PLAYER_IA_MASK_GARO
+ func_8082F594, // PLAYER_IA_MASK_ROMANI
+ func_8082F594, // PLAYER_IA_MASK_CIRCUS_LEADER
+ func_8082F594, // PLAYER_IA_MASK_POSTMAN
+ func_8082F594, // PLAYER_IA_MASK_COUPLE
+ func_8082F594, // PLAYER_IA_MASK_GREAT_FAIRY
+ func_8082F594, // PLAYER_IA_MASK_GIBDO
+ func_8082F594, // PLAYER_IA_MASK_DON_GERO
+ func_8082F594, // PLAYER_IA_MASK_KAMARO
+ func_8082F594, // PLAYER_IA_MASK_CAPTAIN
+ func_8082F594, // PLAYER_IA_MASK_STONE
+ func_8082F594, // PLAYER_IA_MASK_BREMEN
+ func_8082F594, // PLAYER_IA_MASK_BLAST
+ func_8082F594, // PLAYER_IA_MASK_SCENTS
+ func_8082F594, // PLAYER_IA_MASK_GIANT
+ func_8082F594, // PLAYER_IA_MASK_FIERCE_DEITY
+ func_8082F594, // PLAYER_IA_MASK_GORON
+ func_8082F594, // PLAYER_IA_MASK_ZORA
+ func_8082F594, // PLAYER_IA_MASK_DEKU
+ func_8082F594, // PLAYER_IA_LENS
+};
+
+void func_8082F5FC(Player* this, Actor* actor) {
+ this->heldActor = actor;
+ this->interactRangeActor = actor;
+ this->getItemId = GI_NONE;
+ this->leftHandWorld.rot.y = actor->shape.rot.y - this->actor.shape.rot.y;
+ 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 },
+};
+
+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 },
+};
+
+ExplosiveInfo sPlayerExplosiveInfo[PLAYER_EXPLOSIVE_MAX] = {
+ { ITEM_BOMB, ACTOR_EN_BOM }, // PLAYER_EXPLOSIVE_BOMB
+ { ITEM_POWDER_KEG, ACTOR_EN_BOM }, // PLAYER_EXPLOSIVE_POWDER_KEG
+ { ITEM_BOMBCHU, ACTOR_EN_BOM_CHU }, // PLAYER_EXPLOSIVE_BOMBCHU
+};
+
+void Player_SpawnExplosive(PlayState* play, Player* this) {
+ PlayerExplosive explosiveType;
+ ExplosiveInfo* explosiveInfo;
+ Actor* explosiveActor;
+
+ if (this->stateFlags1 & PLAYER_STATE1_800) {
+ func_8082DE14(play, this);
+ return;
+ }
+
+ explosiveType = Player_GetExplosiveHeld(this);
+ explosiveInfo = &sPlayerExplosiveInfo[explosiveType];
+ if ((explosiveType == PLAYER_EXPLOSIVE_POWDER_KEG) && (gSaveContext.powderKegTimer == 0)) {
+ gSaveContext.powderKegTimer = 200;
+ }
+
+ explosiveActor = Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, explosiveInfo->actorId,
+ this->actor.world.pos.x, this->actor.world.pos.y, this->actor.world.pos.z,
+ (explosiveType == PLAYER_EXPLOSIVE_POWDER_KEG) ? BOMB_EXPLOSIVE_TYPE_POWDER_KEG
+ : BOMB_EXPLOSIVE_TYPE_BOMB,
+ this->actor.shape.rot.y, 0, BOMB_TYPE_BODY);
+ if (explosiveActor != NULL) {
+ if ((explosiveType == PLAYER_EXPLOSIVE_BOMB) && (play->unk_1887E != 0)) {
+ play->unk_1887E--;
+ if (play->unk_1887E == 0) {
+ play->unk_1887E = -1;
+ }
+ } else if ((explosiveType == PLAYER_EXPLOSIVE_BOMBCHU) && (play->unk_1887D != 0)) {
+ play->unk_1887D--;
+ if (play->unk_1887D == 0) {
+ play->unk_1887D = -1;
+ }
+ } else {
+ Inventory_ChangeAmmo(explosiveInfo->itemId, -1);
+ }
+ func_8082F5FC(this, explosiveActor);
+ } else if (explosiveType == PLAYER_EXPLOSIVE_POWDER_KEG) {
+ gSaveContext.powderKegTimer = 0;
+ }
+}
+
+// SpawnHookshot?
+void func_8082F7F4(PlayState* play, Player* this) {
+ ArmsHook* armsHook;
+
+ this->stateFlags1 |= PLAYER_STATE1_8;
+ this->unk_B28 = -3;
+ this->unk_B48 = 0.0f;
+
+ this->heldActor =
+ Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, ACTOR_ARMS_HOOK, this->actor.world.pos.x,
+ 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);
+ return;
+ }
+ armsHook = (ArmsHook*)this->heldActor;
+ armsHook->actor.objBankIndex = this->actor.objBankIndex;
+ armsHook->unk_208 = this->transformation;
+}
+
+void func_8082F8A0(PlayState* play, Player* this) {
+ this->stateFlags1 |= PLAYER_STATE1_1000000;
+}
+
+void func_8082F8BC(PlayState* play, Player* this, PlayerItemAction itemAction) {
+ this->itemAction = this->heldItemAction = itemAction;
+ this->modelGroup = this->nextModelGroup;
+
+ this->stateFlags1 &= ~(PLAYER_STATE1_1000000 | PLAYER_STATE1_8);
+
+ this->unk_B08 = 0.0f;
+ this->unk_B0C = 0.0f;
+ this->unk_B28 = 0;
+
+ D_8085CB3C[itemAction](play, this);
+ Player_SetModelGroup(this, this->modelGroup);
+}
+
+// AttackAnimInfo sMeleeAttackAnimInfo
+AttackAnimInfo sMeleeAttackAnimInfo[PLAYER_MWA_MAX] = {
+ // PLAYER_MWA_FORWARD_SLASH_1H
+ { &gPlayerAnim_link_fighter_normal_kiru, &gPlayerAnim_link_fighter_normal_kiru_end,
+ &gPlayerAnim_link_fighter_normal_kiru_endR, 1, 4 },
+ // PLAYER_MWA_FORWARD_SLASH_2H
+ { &gPlayerAnim_link_fighter_Lnormal_kiru, &gPlayerAnim_link_fighter_Lnormal_kiru_end,
+ &gPlayerAnim_link_anchor_Lnormal_kiru_endR, 1, 4 },
+ // PLAYER_MWA_FORWARD_COMBO_1H
+ { &gPlayerAnim_link_fighter_normal_kiru_finsh, &gPlayerAnim_link_fighter_normal_kiru_finsh_end,
+ &gPlayerAnim_link_anchor_normal_kiru_finsh_endR, 0, 5 },
+ // PLAYER_MWA_FORWARD_COMBO_2H
+ { &gPlayerAnim_link_fighter_Lnormal_kiru_finsh, &gPlayerAnim_link_fighter_Lnormal_kiru_finsh_end,
+ &gPlayerAnim_link_anchor_Lnormal_kiru_finsh_endR, 1, 7 },
+ // PLAYER_MWA_RIGHT_SLASH_1H
+ { &gPlayerAnim_link_fighter_Lside_kiru, &gPlayerAnim_link_fighter_Lside_kiru_end,
+ &gPlayerAnim_link_anchor_Lside_kiru_endR, 1, 4 },
+ // PLAYER_MWA_RIGHT_SLASH_2H
+ { &gPlayerAnim_link_fighter_LLside_kiru, &gPlayerAnim_link_fighter_LLside_kiru_end,
+ &gPlayerAnim_link_anchor_LLside_kiru_endL, 0, 5 },
+ // PLAYER_MWA_RIGHT_COMBO_1H
+ { &gPlayerAnim_link_fighter_Lside_kiru_finsh, &gPlayerAnim_link_fighter_Lside_kiru_finsh_end,
+ &gPlayerAnim_link_anchor_Lside_kiru_finsh_endR, 2, 8 },
+ // PLAYER_MWA_RIGHT_COMBO_2H
+ { &gPlayerAnim_link_fighter_LLside_kiru_finsh, &gPlayerAnim_link_fighter_LLside_kiru_finsh_end,
+ &gPlayerAnim_link_anchor_LLside_kiru_finsh_endR, 3, 8 },
+ // PLAYER_MWA_LEFT_SLASH_1H
+ { &gPlayerAnim_link_fighter_Rside_kiru, &gPlayerAnim_link_fighter_Rside_kiru_end,
+ &gPlayerAnim_link_anchor_Rside_kiru_endR, 0, 4 },
+ // PLAYER_MWA_LEFT_SLASH_2H
+ { &gPlayerAnim_link_fighter_LRside_kiru, &gPlayerAnim_link_fighter_LRside_kiru_end,
+ &gPlayerAnim_link_anchor_LRside_kiru_endR, 0, 5 },
+ // PLAYER_MWA_LEFT_COMBO_1H
+ { &gPlayerAnim_link_fighter_Rside_kiru_finsh, &gPlayerAnim_link_fighter_Rside_kiru_finsh_end,
+ &gPlayerAnim_link_anchor_Rside_kiru_finsh_endR, 0, 6 },
+ // PLAYER_MWA_LEFT_COMBO_2H
+ { &gPlayerAnim_link_fighter_LRside_kiru_finsh, &gPlayerAnim_link_fighter_LRside_kiru_finsh_end,
+ &gPlayerAnim_link_anchor_LRside_kiru_finsh_endL, 1, 5 },
+ // PLAYER_MWA_STAB_1H
+ { &gPlayerAnim_link_fighter_pierce_kiru, &gPlayerAnim_link_fighter_pierce_kiru_end,
+ &gPlayerAnim_link_anchor_pierce_kiru_endR, 0, 3 },
+ // PLAYER_MWA_STAB_2H
+ { &gPlayerAnim_link_fighter_Lpierce_kiru, &gPlayerAnim_link_fighter_Lpierce_kiru_end,
+ &gPlayerAnim_link_anchor_Lpierce_kiru_endL, 0, 3 },
+ // PLAYER_MWA_STAB_COMBO_1H
+ { &gPlayerAnim_link_fighter_pierce_kiru_finsh, &gPlayerAnim_link_fighter_pierce_kiru_finsh_end,
+ &gPlayerAnim_link_anchor_pierce_kiru_finsh_endR, 1, 9 },
+ // PLAYER_MWA_STAB_COMBO_2H
+ { &gPlayerAnim_link_fighter_Lpierce_kiru_finsh, &gPlayerAnim_link_fighter_Lpierce_kiru_finsh_end,
+ &gPlayerAnim_link_anchor_Lpierce_kiru_finsh_endR, 1, 8 },
+ // PLAYER_MWA_FLIPSLASH_START
+ { &gPlayerAnim_link_fighter_jump_rollkiru, &gPlayerAnim_link_fighter_jump_kiru_finsh,
+ &gPlayerAnim_link_fighter_jump_kiru_finsh, 7, 99 },
+ // PLAYER_MWA_JUMPSLASH_START
+ { &gPlayerAnim_link_fighter_Lpower_jump_kiru, &gPlayerAnim_link_fighter_Lpower_jump_kiru_hit,
+ &gPlayerAnim_link_fighter_Lpower_jump_kiru_hit, 7, 99 },
+ // PLAYER_MWA_ZORA_JUMPKICK_START
+ { &gPlayerAnim_pz_jumpAT, &gPlayerAnim_pz_jumpATend, &gPlayerAnim_pz_jumpATend, 8, 99 },
+ // PLAYER_MWA_FLIPSLASH_FINISH
+ { &gPlayerAnim_link_fighter_jump_kiru_finsh, &gPlayerAnim_link_fighter_jump_kiru_finsh_end,
+ &gPlayerAnim_link_fighter_jump_kiru_finsh_end, 1, 2 },
+ // PLAYER_MWA_JUMPSLASH_FINISH
+ { &gPlayerAnim_link_fighter_Lpower_jump_kiru_hit, &gPlayerAnim_link_fighter_Lpower_jump_kiru_end,
+ &gPlayerAnim_link_fighter_Lpower_jump_kiru_end, 1, 2 },
+ // PLAYER_MWA_ZORA_JUMPKICK_FINISH
+ { &gPlayerAnim_pz_jumpATend, &gPlayerAnim_pz_wait, &gPlayerAnim_link_normal_waitR_free, 1, 2 },
+ // PLAYER_MWA_BACKSLASH_RIGHT
+ { &gPlayerAnim_link_fighter_turn_kiruR, &gPlayerAnim_link_fighter_turn_kiruR_end,
+ &gPlayerAnim_link_fighter_turn_kiruR_end, 1, 5 },
+ // PLAYER_MWA_BACKSLASH_LEFT
+ { &gPlayerAnim_link_fighter_turn_kiruL, &gPlayerAnim_link_fighter_turn_kiruL_end,
+ &gPlayerAnim_link_fighter_turn_kiruL_end, 1, 4 },
+ // PLAYER_MWA_GORON_PUNCH_LEFT
+ { &gPlayerAnim_pg_punchA, &gPlayerAnim_pg_punchAend, &gPlayerAnim_pg_punchAendR, 6, 8 },
+ // PLAYER_MWA_GORON_PUNCH_RIGHT
+ { &gPlayerAnim_pg_punchB, &gPlayerAnim_pg_punchBend, &gPlayerAnim_pg_punchBendR, 12, 18 },
+ // PLAYER_MWA_GORON_PUNCH_BUTT
+ { &gPlayerAnim_pg_punchC, &gPlayerAnim_pg_punchCend, &gPlayerAnim_pg_punchCendR, 8, 14 },
+ // PLAYER_MWA_ZORA_PUNCH_LEFT
+ { &gPlayerAnim_pz_attackA, &gPlayerAnim_pz_attackAend, &gPlayerAnim_pz_attackAendR, 2, 5 },
+ // PLAYER_MWA_ZORA_PUNCH_COMBO
+ { &gPlayerAnim_pz_attackB, &gPlayerAnim_pz_attackBend, &gPlayerAnim_pz_attackBendR, 3, 8 },
+ // PLAYER_MWA_ZORA_PUNCH_KICK
+ { &gPlayerAnim_pz_attackC, &gPlayerAnim_pz_attackCend, &gPlayerAnim_pz_attackCendR, 3, 10 },
+ // PLAYER_MWA_SPIN_ATTACK_1H
+ { &gPlayerAnim_link_fighter_rolling_kiru, &gPlayerAnim_link_fighter_rolling_kiru_end,
+ &gPlayerAnim_link_anchor_rolling_kiru_endR, 0, 12 },
+ // PLAYER_MWA_SPIN_ATTACK_2H
+ { &gPlayerAnim_link_fighter_Lrolling_kiru, &gPlayerAnim_link_fighter_Lrolling_kiru_end,
+ &gPlayerAnim_link_anchor_Lrolling_kiru_endR, 0, 15 },
+ // PLAYER_MWA_BIG_SPIN_1H
+ { &gPlayerAnim_link_fighter_Wrolling_kiru, &gPlayerAnim_link_fighter_Wrolling_kiru_end,
+ &gPlayerAnim_link_anchor_rolling_kiru_endR, 0, 16 },
+ // PLAYER_MWA_BIG_SPIN_2H
+ { &gPlayerAnim_link_fighter_Wrolling_kiru, &gPlayerAnim_link_fighter_Wrolling_kiru_end,
+ &gPlayerAnim_link_anchor_Lrolling_kiru_endR, 0, 16 },
+};
+
+PlayerAnimationHeader* D_8085CF50[] = {
+ &gPlayerAnim_link_fighter_power_kiru_start,
+ &gPlayerAnim_link_fighter_Lpower_kiru_start,
+};
+PlayerAnimationHeader* D_8085CF58[] = {
+ &gPlayerAnim_link_fighter_power_kiru_startL,
+ &gPlayerAnim_link_fighter_Lpower_kiru_start,
+};
+PlayerAnimationHeader* D_8085CF60[] = {
+ &gPlayerAnim_link_fighter_power_kiru_wait,
+ &gPlayerAnim_link_fighter_Lpower_kiru_wait,
+};
+PlayerAnimationHeader* D_8085CF68[] = {
+ &gPlayerAnim_link_fighter_power_kiru_wait_end,
+ &gPlayerAnim_link_fighter_Lpower_kiru_wait_end,
+};
+PlayerAnimationHeader* D_8085CF70[] = {
+ &gPlayerAnim_link_fighter_power_kiru_walk,
+ &gPlayerAnim_link_fighter_Lpower_kiru_walk,
+};
+PlayerAnimationHeader* D_8085CF78[] = {
+ &gPlayerAnim_link_fighter_power_kiru_side_walk,
+ &gPlayerAnim_link_fighter_Lpower_kiru_side_walk,
+};
+
+u8 D_8085CF80[] = {
+ PLAYER_MWA_SPIN_ATTACK_1H,
+ PLAYER_MWA_SPIN_ATTACK_2H,
+};
+u8 D_8085CF84[] = {
+ PLAYER_MWA_BIG_SPIN_1H,
+ PLAYER_MWA_BIG_SPIN_2H,
+};
+
+// sBlureColors
+BlureColors D_8085CF88[] = {
+ { { 255, 255, 255, 255 }, { 255, 255, 255, 64 }, { 255, 255, 255, 0 }, { 255, 255, 255, 0 } },
+ { { 165, 185, 255, 185 }, { 205, 225, 255, 50 }, { 255, 255, 255, 0 }, { 255, 255, 255, 0 } },
+};
+
+void Player_OverrideBlureColors(PlayState* play, Player* this, s32 colorType, s32 elemDuration) {
+ EffectBlure* blure0 = Effect_GetByIndex(this->meleeWeaponEffectIndex[0]);
+ EffectBlure* blure1 = Effect_GetByIndex(this->meleeWeaponEffectIndex[1]);
+ s32 i;
+
+ for (i = 0; i < 4; i++) {
+ blure0->p1StartColor[i] = D_8085CF88[colorType].p1StartColor[i];
+ blure0->p2StartColor[i] = D_8085CF88[colorType].p2StartColor[i];
+ blure0->p1EndColor[i] = D_8085CF88[colorType].p1EndColor[i];
+ blure0->p2EndColor[i] = D_8085CF88[colorType].p2EndColor[i];
+ blure1->p1StartColor[i] = D_8085CF88[colorType].p1StartColor[i];
+ blure1->p2StartColor[i] = D_8085CF88[colorType].p2StartColor[i];
+ blure1->p1EndColor[i] = D_8085CF88[colorType].p1EndColor[i];
+ blure1->p2EndColor[i] = D_8085CF88[colorType].p2EndColor[i];
+ }
+
+ if (this->transformation == PLAYER_FORM_DEKU) {
+ elemDuration = 8;
+ }
+ blure0->elemDuration = elemDuration;
+ blure1->elemDuration = elemDuration;
+}
+
+void func_8082FA5C(PlayState* play, Player* this, PlayerMeleeWeaponState meleeWeaponState) {
+ u16 voiceSfxId;
+ u16 itemSfxId;
+
+ if (this->meleeWeaponState == PLAYER_MELEE_WEAPON_STATE_0) {
+ voiceSfxId = NA_SE_VO_LI_SWORD_N;
+ if (this->transformation == PLAYER_FORM_GORON) {
+ itemSfxId = NA_SE_IT_GORON_PUNCH_SWING;
+ } else {
+ itemSfxId = NA_SE_NONE;
+ if (this->meleeWeaponAnimation >= PLAYER_MWA_SPIN_ATTACK_1H) {
+ voiceSfxId = NA_SE_VO_LI_SWORD_L;
+ } else if (this->meleeWeaponAnimation == PLAYER_MWA_ZORA_PUNCH_KICK) {
+ itemSfxId = NA_SE_IT_GORON_PUNCH_SWING;
+ } else {
+ itemSfxId = NA_SE_IT_SWORD_SWING_HARD;
+ if (this->unk_ADD >= 3) {
+ voiceSfxId = NA_SE_VO_LI_SWORD_L;
+ } else {
+ itemSfxId = (this->heldItemAction == PLAYER_IA_SWORD_TWO_HANDED) ? NA_SE_IT_HAMMER_SWING
+ : NA_SE_IT_SWORD_SWING;
+ }
+ }
+ }
+
+ if (itemSfxId != NA_SE_NONE) {
+ func_8082E1F0(this, itemSfxId);
+ }
+
+ if (!((this->meleeWeaponAnimation >= PLAYER_MWA_FLIPSLASH_START) &&
+ (this->meleeWeaponAnimation <= PLAYER_MWA_ZORA_JUMPKICK_FINISH))) {
+ Player_AnimSfx_PlayVoice(this, voiceSfxId);
+ }
+
+ Player_OverrideBlureColors(play, this, 0, 4);
+ }
+
+ this->meleeWeaponState = meleeWeaponState;
+}
+
+s32 func_8082FB68(Player* this) {
+ if ((this->targetedActor != NULL) && CHECK_FLAG_ALL(this->targetedActor->flags, ACTOR_FLAG_1 | ACTOR_FLAG_4)) {
+ this->stateFlags3 |= PLAYER_STATE3_80000000;
+ return true;
+ }
+
+ if (this->stateFlags3 & PLAYER_STATE3_80000000) {
+ this->stateFlags3 &= ~PLAYER_STATE3_80000000;
+ if (this->linearVelocity == 0.0f) {
+ this->currentYaw = this->actor.shape.rot.y;
+ }
+ }
+
+ return false;
+}
+
+s32 func_8082FBE8(Player* this) {
+ return func_80123420(this) || func_80123434(this);
+}
+
+s32 func_8082FC24(Player* this) {
+ return func_8082FB68(this) || func_80123434(this);
+}
+
+void func_8082FC60(Player* this) {
+ this->unk_B44 = 0.0f;
+ this->unk_B40 = 0.0f;
+}
+
+s32 func_8082FC78(Player* this, ItemId item) {
+ if ((item < ITEM_FD) && (Player_ItemToItemAction(this, item) == this->itemAction)) {
+ return true;
+ } else {
+ return false;
+ }
+}
+
+s32 func_8082FCC4(Player* this, ItemId item, PlayerItemAction itemAction) {
+ if ((item < ITEM_FD) && (Player_ItemToItemAction(this, item) == itemAction)) {
+ return true;
+ } else {
+ return false;
+ }
+}
+
+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)) {
+ return btn;
+ }
+ }
+
+ return EQUIP_SLOT_NONE;
+}
+
+u16 D_8085CFA8[] = {
+ BTN_B,
+ BTN_CLEFT,
+ BTN_CDOWN,
+ BTN_CRIGHT,
+};
+
+// Return currently-pressed button, in order of priority B, CLEFT, CDOWN, CRIGHT.
+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])) {
+ break;
+ }
+ }
+
+ return i;
+}
+
+void func_8082FE0C(Player* this, PlayState* play) {
+ if (this->stateFlags1 & (PLAYER_STATE1_800 | PLAYER_STATE1_20000000)) {
+ return;
+ }
+ if (this->stateFlags2 & PLAYER_STATE2_2000000) {
+ return;
+ }
+ if (this->stateFlags3 & PLAYER_STATE3_20000000) {
+ return;
+ }
+ if (func_801240DC(this)) {
+ return;
+ }
+
+ if (this->transformation == PLAYER_FORM_HUMAN) {
+ if (this->currentMask != PLAYER_MASK_NONE) {
+ PlayerItemAction maskItemAction = GET_IA_FROM_MASK(this->currentMask);
+ EquipSlot btn = func_8082FD0C(this, maskItemAction);
+
+ if (btn <= EQUIP_SLOT_NONE) {
+ s32 maskIdMinusOne =
+ GET_MASK_FROM_IA(Player_ItemToItemAction(this, GET_CUR_FORM_BTN_ITEM(this->unk_154))) - 1;
+
+ if ((maskIdMinusOne < PLAYER_MASK_TRUTH - 1) || (maskIdMinusOne >= PLAYER_MASK_MAX - 1)) {
+ maskIdMinusOne = this->currentMask - 1;
+ }
+ func_80831990(play, this, Player_MaskIdToItemId(maskIdMinusOne));
+ return;
+ }
+
+ if ((this->currentMask == PLAYER_MASK_GIANT) && (gSaveContext.save.saveInfo.playerData.magic == 0)) {
+ func_80838A20(play, this);
+ }
+
+ this->unk_154 = btn;
+ }
+ }
+
+ 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);
+ } else {
+ s32 pad;
+ ItemId item;
+ EquipSlot i = func_8082FDC4();
+
+ i = ((i >= EQUIP_SLOT_A) && (this->transformation == PLAYER_FORM_FIERCE_DEITY) &&
+ (this->heldItemAction != PLAYER_IA_SWORD_TWO_HANDED))
+ ? EQUIP_SLOT_B
+ : i;
+
+ item = func_8012364C(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])) {
+ break;
+ }
+ }
+
+ item = func_8012364C(play, this, i);
+ if ((item < ITEM_FD) && (Player_ItemToItemAction(this, item) == this->heldItemAction)) {
+ D_80862B4C = 1;
+ }
+ } else if (item == ITEM_F0) {
+ if (this->blastMaskTimer == 0) {
+ EnBom* bomb = (EnBom*)Actor_Spawn(&play->actorCtx, play, ACTOR_EN_BOM, this->actor.focus.pos.x,
+ this->actor.focus.pos.y, this->actor.focus.pos.z,
+ BOMB_EXPLOSIVE_TYPE_BOMB, 0, 0, BOMB_TYPE_BODY);
+
+ if (bomb != NULL) {
+ bomb->timer = 0;
+ this->blastMaskTimer = 310;
+ }
+ }
+ } else if (item == ITEM_F1) {
+ func_80839978(play, this);
+ } else if (item == ITEM_F2) {
+ func_80839A10(play, this);
+ } else if ((Player_BButtonSwordFromIA(this, Player_ItemToItemAction(this, item)) != PLAYER_B_SWORD_NONE) &&
+ (gSaveContext.jinxTimer != 0)) {
+ if (Message_GetState(&play->msgCtx) == TEXT_STATE_NONE) {
+ Message_StartTextbox(play, 0xF7, NULL);
+ }
+ } else {
+ this->heldItemButton = i;
+ func_80831990(play, this, item);
+ }
+ }
+}
+
+void func_808302CC(Player* this, PlayState* play) {
+ PlayerAnimationHeader* anim;
+ s32 pad[3];
+ u8 nextModelAnimType;
+ s32 var_v1;
+ s8 itemAction = Player_ItemToItemAction(this, this->heldItemId);
+ s32 pad3;
+ f32 startFrame;
+ f32 endFrame;
+ f32 frameSpeed;
+
+ func_8082F43C(play, this, func_80848808);
+
+ nextModelAnimType = gPlayerModelTypes[this->nextModelGroup].modelAnimType;
+ var_v1 = D_8085CD00[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) &&
+ ((this->heldItemAction == PLAYER_IA_BOTTLE_EMPTY) || (this->heldItemAction == PLAYER_IA_11)))) {
+ var_v1 = (itemAction == PLAYER_IA_NONE) ? -13 : 13;
+ }
+
+ this->unk_14E = ABS_ALT(var_v1);
+ anim = D_8085CC88[this->unk_14E].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) {
+ frameSpeed = 1.2f;
+ startFrame = 0.0f;
+ } else {
+ frameSpeed = -1.2f;
+ startFrame = endFrame;
+ endFrame = 0.0f;
+ }
+
+ if (itemAction != 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;
+}
+
+void func_808304BC(Player* this, PlayState* play) {
+ if ((this->actor.id == ACTOR_PLAYER) && !(this->stateFlags3 & PLAYER_STATE3_40000000)) {
+ 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_0) && (play->bButtonAmmoPlusOne == 0) &&
+ (play->activeCamId == CAM_ID_MAIN)) {
+ if (!func_8082DA90(play) && (gSaveContext.timerStates[TIMER_ID_MINIGAME_2] != TIMER_STATE_STOP)) {
+ func_8082FE0C(this, play);
+ }
+ }
+ }
+ }
+ }
+
+ if (this->stateFlags3 & PLAYER_STATE3_40000000) {
+ func_808302CC(this, play);
+ }
+}
+
+// EN_ARROW ammo related?
+s32 func_808305BC(PlayState* play, Player* this, ItemId* item, ArrowType* typeParam) {
+ if (this->heldItemAction == PLAYER_IA_NUT) {
+ *item = ITEM_NUT;
+ *typeParam = (this->transformation == PLAYER_FORM_DEKU) ? ARROW_TYPE_DEKU_BUBBLE : ARROW_TYPE_SLINGSHOT;
+ } else {
+ *item = ITEM_BOW;
+ *typeParam = (this->stateFlags1 & PLAYER_STATE1_800000)
+ ? ARROW_TYPE_NORMAL_HORSE
+ : (this->heldItemAction - PLAYER_IA_BOW + ARROW_TYPE_NORMAL);
+ }
+
+ if (this->transformation == PLAYER_FORM_DEKU) {
+ return ((gSaveContext.save.saveInfo.playerData.magic >= 2) ||
+ (CHECK_WEEKEVENTREG(WEEKEVENTREG_08_01) && (play->sceneId == SCENE_BOWLING)))
+ ? 1
+ : 0;
+ }
+ if (this->stateFlags3 & PLAYER_STATE3_400) {
+ return 1;
+ }
+ if (gSaveContext.minigameStatus == MINIGAME_STATUS_ACTIVE) {
+ return play->interfaceCtx.minigameAmmo;
+ }
+ if (play->bButtonAmmoPlusOne != 0) {
+ return play->bButtonAmmoPlusOne;
+ }
+
+ return AMMO(*item);
+}
+
+u16 D_8085CFB0[] = {
+ NA_SE_PL_BOW_DRAW,
+ NA_SE_NONE,
+ NA_SE_IT_HOOKSHOT_READY,
+};
+
+u8 sMagicArrowCosts[] = {
+ 4, // ARROW_MAGIC_FIRE
+ 4, // ARROW_MAGIC_ICE
+ 8, // ARROW_MAGIC_LIGHT
+ 2, // ARROW_MAGIC_DEKU_BUBBLE
+};
+
+// Draw bow or hookshot / first person items?
+s32 func_808306F8(Player* this, PlayState* play) {
+ if ((this->heldItemAction >= PLAYER_IA_BOW_FIRE) && (this->heldItemAction <= PLAYER_IA_BOW_LIGHT) &&
+ (gSaveContext.magicState != MAGIC_STATE_IDLE)) {
+ play_sound(NA_SE_SY_ERROR);
+ } else {
+ func_8082F43C(play, this, func_80848BF4);
+
+ this->stateFlags3 |= PLAYER_STATE3_40;
+ this->unk_ACC = 14;
+
+ if (this->unk_B28 >= 0) {
+ s32 var_v1 = ABS_ALT(this->unk_B28);
+ ItemId item;
+ ArrowType arrowType;
+ ArrowMagic magicArrowType;
+
+ if (var_v1 != 2) {
+ Player_PlaySfx(this, D_8085CFB0[var_v1 - 1]);
+ }
+
+ if (!Player_IsHoldingHookshot(this) && (func_808305BC(play, this, &item, &arrowType) > 0)) {
+ if (this->unk_B28 >= 0) {
+ magicArrowType = ARROW_GET_MAGIC_FROM_TYPE(arrowType);
+
+ if ((ARROW_GET_MAGIC_FROM_TYPE(arrowType) >= ARROW_MAGIC_FIRE) &&
+ (ARROW_GET_MAGIC_FROM_TYPE(arrowType) <= ARROW_MAGIC_LIGHT)) {
+ if (((void)0, gSaveContext.save.saveInfo.playerData.magic) < sMagicArrowCosts[magicArrowType]) {
+ arrowType = ARROW_TYPE_NORMAL;
+ magicArrowType = ARROW_MAGIC_INVALID;
+ }
+ } else if ((arrowType == ARROW_TYPE_DEKU_BUBBLE) &&
+ (!CHECK_WEEKEVENTREG(WEEKEVENTREG_08_01) || (play->sceneId != SCENE_BOWLING))) {
+ magicArrowType = ARROW_MAGIC_DEKU_BUBBLE;
+ } else {
+ magicArrowType = ARROW_MAGIC_INVALID;
+ }
+
+ this->heldActor = Actor_SpawnAsChild(
+ &play->actorCtx, &this->actor, play, ACTOR_EN_ARROW, this->actor.world.pos.x,
+ this->actor.world.pos.y, this->actor.world.pos.z, 0, this->actor.shape.rot.y, 0, arrowType);
+
+ if ((this->heldActor != NULL) && (magicArrowType > ARROW_MAGIC_INVALID)) {
+ Magic_Consume(play, sMagicArrowCosts[magicArrowType], MAGIC_CONSUME_NOW);
+ }
+ }
+ }
+ }
+
+ return true;
+ }
+
+ return false;
+}
+
+// Take out / put away sounds?
+void func_808308DC(PlayState* play, Player* this) {
+ s32 isGoronOrDeku = (this->transformation == PLAYER_FORM_GORON) || (this->transformation == PLAYER_FORM_DEKU);
+
+ if ((this->heldItemAction != PLAYER_IA_NONE) && !isGoronOrDeku) {
+ if (Player_SwordFromIA(this, this->heldItemAction) > PLAYER_SWORD_NONE) {
+ func_8082E1F0(this, NA_SE_IT_SWORD_PUTAWAY);
+ } else {
+ func_8082E1F0(this, NA_SE_PL_CHANGE_ARMS);
+ }
+ }
+
+ func_80831990(play, this, this->heldItemId);
+
+ if (!isGoronOrDeku) {
+ if (Player_SwordFromIA(this, this->heldItemAction) > PLAYER_SWORD_NONE) {
+ func_8082E1F0(this, NA_SE_IT_SWORD_PICKOUT);
+ } else if (this->heldItemAction != PLAYER_IA_NONE) {
+ func_8082E1F0(this, NA_SE_PL_CHANGE_ARMS);
+ }
+ }
+}
+
+void func_808309CC(PlayState* play, Player* this) {
+ if (func_80848808 == this->unk_AC4) {
+ func_808308DC(play, this);
+ }
+
+ func_8082F43C(play, this, D_8085C9F0[this->heldItemAction]);
+ this->unk_ACC = 0;
+ this->unk_AA4 = 0;
+ func_8082DCA0(play, this);
+ this->stateFlags3 &= ~PLAYER_STATE3_40000000;
+}
+
+PlayerAnimationHeader* D_8085CFBC[2] = {
+ &gPlayerAnim_link_anchor_waitR2defense,
+ &gPlayerAnim_link_anchor_waitR2defense_long,
+};
+PlayerAnimationHeader* D_8085CFC4[2] = {
+ &gPlayerAnim_link_anchor_waitL2defense,
+ &gPlayerAnim_link_anchor_waitL2defense_long,
+};
+PlayerAnimationHeader* D_8085CFCC[2] = {
+ &gPlayerAnim_link_anchor_defense_hit,
+ &gPlayerAnim_link_anchor_defense_long_hitL,
+};
+PlayerAnimationHeader* D_8085CFD4[2] = {
+ &gPlayerAnim_link_anchor_defense_hit,
+ &gPlayerAnim_link_anchor_defense_long_hitR,
+};
+PlayerAnimationHeader* D_8085CFDC[2] = {
+ &gPlayerAnim_link_normal_defense_hit,
+ &gPlayerAnim_link_fighter_defense_long_hit,
+};
+
+PlayerAnimationHeader* func_80830A58(PlayState* play, Player* this) {
+ func_8082F43C(play, this, func_8084894C);
+ func_8082DCA0(play, this);
+
+ if (this->unk_B40 < 0.5f) {
+ return D_8085CFBC[Player_IsHoldingTwoHandedWeapon(this)];
+ } else {
+ return D_8085CFC4[Player_IsHoldingTwoHandedWeapon(this)];
+ }
+}
+
+void func_80830AE8(Player* this) {
+ s32 sfxId = (this->transformation == PLAYER_FORM_GORON)
+ ? NA_SE_PL_GORON_SQUAT
+ : ((this->transformation == PLAYER_FORM_DEKU) ? NA_SE_PL_CHANGE_ARMS : NA_SE_IT_SHIELD_SWING);
+
+ Player_PlaySfx(this, sfxId);
+}
+
+void func_80830B38(Player* this) {
+ s32 sfxId = (this->transformation == PLAYER_FORM_GORON)
+ ? NA_SE_PL_BALL_TO_GORON
+ : ((this->transformation == PLAYER_FORM_DEKU) ? NA_SE_PL_TAKE_OUT_SHIELD : NA_SE_IT_SHIELD_REMOVE);
+
+ Player_PlaySfx(this, sfxId);
+}
+
+s32 func_80830B88(PlayState* play, Player* this) {
+ if (CHECK_BTN_ALL(sPlayerControlInput->cur.button, BTN_R)) {
+ if (!(this->stateFlags1 & (PLAYER_STATE1_400000 | PLAYER_STATE1_800000 | PLAYER_STATE1_20000000))) {
+ if (!(this->stateFlags1 & PLAYER_STATE1_8000000) || ((this->currentBoots >= PLAYER_BOOTS_ZORA_UNDERWATER) &&
+ (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND))) {
+ if ((play->bButtonAmmoPlusOne == 0) && (this->heldItemAction == this->itemAction)) {
+ if ((this->transformation == PLAYER_FORM_FIERCE_DEITY) ||
+ (!Player_IsGoronOrDeku(this) &&
+ ((((this->transformation == PLAYER_FORM_ZORA)) &&
+ !(this->stateFlags1 & PLAYER_STATE1_2000000)) ||
+ ((this->transformation == PLAYER_FORM_HUMAN) &&
+ (this->currentShield != PLAYER_SHIELD_NONE))) &&
+ func_8082FBE8(this))) {
+ PlayerAnimationHeader* anim = func_80830A58(play, this);
+ f32 lastFrame = Animation_GetLastFrame(anim);
+
+ PlayerAnimation_Change(play, &this->unk_284, anim, 3.0f / 3.0f, lastFrame, lastFrame,
+ ANIMMODE_ONCE, 0.0f);
+ func_80830AE8(this);
+ return true;
+ }
+ }
+ }
+ }
+ }
+
+ return false;
+}
+
+void func_80830CE8(PlayState* play, Player* this) {
+ func_8082F43C(play, this, func_80848AB0);
+
+ if (this->itemAction <= PLAYER_IA_MINUS1) {
+ func_80123C58(this);
+ }
+
+ Animation_Reverse(&this->unk_284);
+ func_80830B38(this);
+}
+
+void func_80830D40(PlayState* play, Player* this) {
+ struct_8085CC88* entry = &D_8085CC88[this->unk_14E];
+ f32 frame = entry->frame;
+
+ if (this->unk_284.playSpeed < 0.0f) {
+ frame -= 1.0f;
+ }
+ if (PlayerAnimation_OnFrame(&this->unk_284, frame)) {
+ func_808308DC(play, this);
+ }
+ func_8082FB68(this);
+}
+
+s32 func_80830DF0(Player* this, PlayState* play) {
+ if (this->stateFlags3 & PLAYER_STATE3_40000000) {
+ func_808302CC(this, play);
+ } else {
+ return false;
+ }
+ return true;
+}
+
+s32 func_80830E30(Player* this, PlayState* play) {
+ if ((this->heldItemAction == PLAYER_IA_11) || (this->transformation == PLAYER_FORM_ZORA)) {
+ func_8082F43C(play, this, func_8084923C);
+
+ PlayerAnimation_PlayOnce(play, &this->unk_284,
+ (this->meleeWeaponAnimation == PLAYER_MWA_ZORA_PUNCH_LEFT)
+ ? &gPlayerAnim_pz_cutterwaitA
+ : ((this->meleeWeaponAnimation == PLAYER_MWA_ZORA_PUNCH_COMBO)
+ ? &gPlayerAnim_pz_cutterwaitB
+ : &gPlayerAnim_pz_cutterwaitC));
+ this->unk_ACC = 0xA;
+ } else {
+ if (!func_808306F8(this, play)) {
+ return false;
+ }
+
+ PlayerAnimation_PlayOnce(play, &this->unk_284,
+ (Player_IsHoldingHookshot(this))
+ ? &gPlayerAnim_link_hook_shot_ready
+ : ((this->transformation == PLAYER_FORM_DEKU) ? &gPlayerAnim_pn_tamahakidf
+ : &gPlayerAnim_link_bow_bow_ready));
+ }
+
+ if (this->stateFlags1 & PLAYER_STATE1_800000) {
+ Player_AnimationPlayLoop(play, this, &gPlayerAnim_link_uma_anim_walk);
+ } else if ((this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) && (this->transformation != PLAYER_FORM_ZORA)) {
+ Player_AnimationPlayLoop(play, this, func_8082ED20(this));
+ }
+
+ return true;
+}
+
+s32 func_80830F9C(PlayState* play) {
+ return (play->bButtonAmmoPlusOne > 0) && CHECK_BTN_ALL(sPlayerControlInput->press.button, BTN_B);
+}
+
+s32 func_80830FD4(PlayState* play) {
+ return (play->bButtonAmmoPlusOne != 0) &&
+ (play->bButtonAmmoPlusOne < 0 ||
+ CHECK_BTN_ANY(sPlayerControlInput->cur.button,
+ BTN_CRIGHT | BTN_CLEFT | BTN_CDOWN | BTN_CUP | BTN_B | BTN_A));
+}
+
+s32 func_80831010(Player* this, PlayState* play) {
+ if ((this->unk_AA5 == PLAYER_UNKAA5_0) || (this->unk_AA5 == PLAYER_UNKAA5_3)) {
+ if (func_8082FBE8(this) || (this->targetedActor != NULL) ||
+ (Camera_CheckValidMode(Play_GetCamera(play, CAM_ID_MAIN), CAM_MODE_BOWARROW) == 0)) {
+ return true;
+ }
+ this->unk_AA5 = PLAYER_UNKAA5_3;
+ }
+ return false;
+}
+
+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 (func_80830E30(this, play)) {
+ return func_80831010(this, play);
+ }
+ }
+ }
+ return false;
+}
+
+s32 func_80831124(PlayState* play, Player* this) {
+ if (this->actor.child != NULL) {
+ if (this->heldActor == NULL) {
+ this->heldActor = this->actor.child;
+ Player_RequestRumble(play, this, 255, 10, 250, SQ(0));
+ Player_PlaySfx(this, NA_SE_IT_HOOKSHOT_RECEIVE);
+ }
+ return true;
+ }
+ return false;
+}
+
+s32 func_80831194(PlayState* play, Player* this) {
+ if (this->heldActor != NULL) {
+ if (!Player_IsHoldingHookshot(this)) {
+ ItemId item;
+ ArrowType arrowType;
+
+ func_808305BC(play, this, &item, &arrowType);
+ if ((this->transformation != PLAYER_FORM_DEKU) && !(this->stateFlags3 & PLAYER_STATE3_400)) {
+ if (gSaveContext.minigameStatus == MINIGAME_STATUS_ACTIVE) {
+ if ((play->sceneId != SCENE_SYATEKI_MIZU) && (play->sceneId != SCENE_F01) &&
+ (play->sceneId != SCENE_SYATEKI_MORI)) {
+ play->interfaceCtx.minigameAmmo--;
+ }
+ } else if (play->bButtonAmmoPlusOne != 0) {
+ play->bButtonAmmoPlusOne--;
+ } else {
+ Inventory_ChangeAmmo(item, -1);
+ }
+ }
+
+ if (play->bButtonAmmoPlusOne == 1) {
+ play->bButtonAmmoPlusOne = -10;
+ }
+
+ Player_RequestRumble(play, this, 150, 10, 150, SQ(0));
+ } else {
+ Player_RequestRumble(play, this, 255, 20, 150, SQ(0));
+ this->unk_B48 = 0.0f;
+ }
+
+ this->unk_D57 = (this->transformation == PLAYER_FORM_DEKU) ? 20 : 4;
+
+ this->heldActor->parent = NULL;
+ this->actor.child = NULL;
+ this->heldActor = NULL;
+ return true;
+ }
+
+ return false;
+}
+
+void func_8083133C(Player* this) {
+ this->stateFlags1 |= PLAYER_STATE1_20000;
+
+ if (!(this->skelAnime.moveFlags & ANIM_FLAG_80) && (this->actor.bgCheckFlags & BGCHECKFLAG_PLAYER_WALL_INTERACT) &&
+ (D_80862B20 < 0x2000)) {
+ this->currentYaw = this->actor.shape.rot.y = this->actor.wallYaw + 0x8000;
+ }
+
+ this->targetYaw = this->actor.shape.rot.y;
+}
+
+s32 func_808313A8(PlayState* play, Player* this, Actor* actor) {
+ if (actor == NULL) {
+ func_8082DE50(play, this);
+ func_80836988(this, play);
+ return true;
+ }
+
+ return false;
+}
+
+void func_808313F0(Player* this, PlayState* play) {
+ if (!func_808313A8(play, this, this->heldActor)) {
+ func_8082F43C(play, this, func_808490B4);
+ PlayerAnimation_PlayLoop(play, &this->unk_284, &gPlayerAnim_link_normal_carryB_wait);
+ }
+}
+
+// Stops the current fanfare if a stateflag is set; these two are Kamaro Dancing and Bremen Marching.
+void func_80831454(Player* this) {
+ if ((this->stateFlags3 & PLAYER_STATE3_20000000) || (this->stateFlags2 & PLAYER_STATE2_2000000)) {
+ SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_FANFARE, 0);
+ }
+}
+
+s32 Player_SetAction(PlayState* play, Player* this, PlayerActionFunc actionFunc, s32 arg3) {
+ s32 i;
+ f32* ptr;
+
+ if (actionFunc == this->actionFunc) {
+ return false;
+ }
+
+ play->actorCtx.flags &= ~ACTORCTX_FLAG_PICTO_BOX_ON;
+
+ if (this->actor.flags & ACTOR_FLAG_20000000) {
+ AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_OFF);
+ this->actor.flags &= ~ACTOR_FLAG_20000000;
+ } else if ((func_80857BE8 == this->actionFunc) || (func_808561B0 == this->actionFunc)) {
+ this->actor.shape.shadowDraw = ActorShadow_DrawFeet;
+ this->actor.shape.shadowScale = this->ageProperties->shadowScale;
+ this->unk_ABC = 0.0f;
+ if (func_80857BE8 == this->actionFunc) {
+ if (this->stateFlags3 & PLAYER_STATE3_80000) {
+ Magic_Reset(play);
+ }
+ func_8082DD2C(play, this);
+ this->actor.shape.rot.x = 0;
+ this->actor.shape.rot.z = 0;
+ this->actor.bgCheckFlags &= ~BGCHECKFLAG_PLAYER_800;
+ } else {
+ Actor_SetScale(&this->actor, 0.01f);
+ }
+ } else if ((this->transformation == PLAYER_FORM_GORON) &&
+ (Player_GetMeleeWeaponHeld(this) != PLAYER_MELEEWEAPON_NONE)) {
+ func_80831990(play, this, ITEM_NONE);
+ }
+
+ func_800AEF44(Effect_GetByIndex(this->meleeWeaponEffectIndex[2]));
+ this->actionFunc = actionFunc;
+
+ if ((this->itemAction != this->heldItemAction) && (!(arg3 & 1) || !(this->stateFlags1 & PLAYER_STATE1_400000))) {
+ func_80123C58(this);
+ }
+
+ if (!(arg3 & 1) && !(this->stateFlags1 & PLAYER_STATE1_800)) {
+ func_808309CC(play, this);
+ PlayerAnimation_PlayLoop(play, &this->unk_284, func_8082ED20(this));
+ this->stateFlags1 &= ~PLAYER_STATE1_400000;
+ }
+
+ func_80831454(this);
+ func_8082E794(this);
+
+ this->stateFlags1 &= ~(PLAYER_STATE1_40 | PLAYER_STATE1_4000000 | PLAYER_STATE1_10000000 | PLAYER_STATE1_20000000 |
+ PLAYER_STATE1_80000000);
+ this->stateFlags2 &= ~(PLAYER_STATE2_80000 | PLAYER_STATE2_800000 | PLAYER_STATE2_2000000 | PLAYER_STATE2_8000000 |
+ PLAYER_STATE2_10000000);
+ this->stateFlags3 &=
+ ~(PLAYER_STATE3_2 | PLAYER_STATE3_8 | PLAYER_STATE3_80 | PLAYER_STATE3_200 | PLAYER_STATE3_2000 |
+ PLAYER_STATE3_8000 | PLAYER_STATE3_10000 | PLAYER_STATE3_20000 | PLAYER_STATE3_40000 | PLAYER_STATE3_80000 |
+ PLAYER_STATE3_200000 | PLAYER_STATE3_1000000 | PLAYER_STATE3_20000000);
+
+ this->unk_AE7 = 0;
+ this->unk_AE8 = 0;
+ this->unk_AA4 = 0;
+ this->unk_B86[0] = 0;
+ this->unk_B86[1] = 0;
+ this->unk_B8A = 0;
+ this->unk_B8C = 0;
+ this->unk_B8E = 0;
+
+ // TODO: Is there no other way to write this that works?
+ i = 0;
+ ptr = this->unk_B10;
+ do {
+ *ptr = 0.0f;
+ ptr++;
+ i++;
+ } while (i < ARRAY_COUNT(this->unk_B10));
+
+ this->actor.shape.rot.z = 0;
+
+ Player_ResetCylinder(this);
+ func_8082E00C(this);
+
+ return true;
+}
+
+void func_8083172C(PlayState* play, Player* this, PlayerActionFunc actionFunc, s32 arg3) {
+ s32 moveFlags = this->skelAnime.moveFlags;
+
+ this->skelAnime.moveFlags = 0;
+ Player_SetAction(play, this, actionFunc, arg3);
+ this->skelAnime.moveFlags = moveFlags;
+}
+
+void func_80831760(PlayState* play, Player* this, PlayerActionFunc actionFunc, s32 arg3) {
+ if (this->itemAction > PLAYER_IA_MINUS1) {
+ PlayerItemAction heldItemAction = this->itemAction;
+
+ this->itemAction = this->heldItemAction;
+ Player_SetAction(play, this, actionFunc, arg3);
+ this->itemAction = heldItemAction;
+
+ Player_SetModels(this, Player_ActionToModelGroup(this, this->itemAction));
+ }
+}
+
+void func_808317C4(Player* this) {
+ if (Player_IsHoldingHookshot(this)) {
+ if (this->heldActor != NULL) {
+ Actor_Kill(this->heldActor);
+ this->actor.child = NULL;
+ this->heldActor = NULL;
+ }
+ }
+}
+
+s32 func_80831814(Player* this, PlayState* play, PlayerUnkAA5 arg2) {
+ if (!(this->stateFlags1 & (PLAYER_STATE1_4 | PLAYER_STATE1_800 | PLAYER_STATE1_2000 | PLAYER_STATE1_4000))) {
+ if (Camera_CheckValidMode(Play_GetCamera(play, CAM_ID_MAIN), CAM_MODE_FIRSTPERSON) != 0) {
+ if ((this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) ||
+ (func_801242B4(this) && (this->actor.depthInWater < this->ageProperties->unk_2C))) {
+ this->unk_AA5 = arg2;
+ return true;
+ }
+ }
+ }
+ return false;
+}
+
+// Toggle Lens
+void func_808318C0(PlayState* play) {
+ if (Magic_Consume(play, 0, MAGIC_CONSUME_LENS)) {
+ if (play->actorCtx.lensActive) {
+ Actor_DeactivateLens(play);
+ } else {
+ play->actorCtx.lensActive = true;
+ }
+
+ play_sound(play->actorCtx.lensActive ? NA_SE_SY_GLASSMODE_ON : NA_SE_SY_GLASSMODE_OFF);
+ } else {
+ play_sound(NA_SE_SY_ERROR);
+ }
+}
+
+// Toggle Lens from a button press
+void func_80831944(PlayState* play, Player* this) {
+ if (func_8012364C(play, this, func_8082FDC4()) == ITEM_LENS) {
+ func_808318C0(play);
+ }
+}
+
+// Proposed name: Player_UseItem
+void func_80831990(PlayState* play, Player* this, ItemId item) {
+ PlayerItemAction itemAction = Player_ItemToItemAction(this, item);
+
+ if ((((this->heldItemAction == this->itemAction) &&
+ (!(this->stateFlags1 & PLAYER_STATE1_400000) ||
+ (Player_MeleeWeaponFromIA(itemAction) != PLAYER_MELEEWEAPON_NONE) || (itemAction == PLAYER_IA_NONE))) ||
+ ((this->itemAction <= PLAYER_IA_MINUS1) &&
+ ((Player_MeleeWeaponFromIA(itemAction) != PLAYER_MELEEWEAPON_NONE) || (itemAction == PLAYER_IA_NONE)))) &&
+ ((itemAction == PLAYER_IA_NONE) || !(this->stateFlags1 & PLAYER_STATE1_8000000) ||
+ (itemAction == PLAYER_IA_MASK_ZORA) ||
+ ((this->currentBoots >= PLAYER_BOOTS_ZORA_UNDERWATER) && (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)))) {
+ s32 var_v1 = ((itemAction >= PLAYER_IA_MASK_MIN) && (itemAction <= PLAYER_IA_MASK_MAX) &&
+ ((this->transformation != PLAYER_FORM_HUMAN) || (itemAction >= PLAYER_IA_MASK_GIANT)));
+ CollisionPoly* sp5C;
+ s32 sp58;
+ f32 sp54;
+ PlayerExplosive explosiveType;
+
+ if (var_v1 ||
+ (CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_TALK_REQUESTED) && (itemAction != PLAYER_IA_NONE)) ||
+ (itemAction == PLAYER_IA_OCARINA) ||
+ ((itemAction > PLAYER_IA_BOTTLE_MIN) && itemAction < PLAYER_IA_MASK_MIN) ||
+ ((itemAction == PLAYER_IA_PICTO_BOX) && (this->talkActor != NULL) &&
+ (this->exchangeItemId > PLAYER_IA_NONE))) {
+ if (var_v1) {
+ PlayerTransformation playerForm = (itemAction < PLAYER_IA_MASK_FIERCE_DEITY)
+ ? PLAYER_FORM_HUMAN
+ : itemAction - PLAYER_IA_MASK_FIERCE_DEITY;
+
+ if (((this->currentMask != PLAYER_MASK_GIANT) && (itemAction == PLAYER_IA_MASK_GIANT) &&
+ ((gSaveContext.magicState != MAGIC_STATE_IDLE) ||
+ (gSaveContext.save.saveInfo.playerData.magic == 0))) ||
+ (!(this->stateFlags1 & PLAYER_STATE1_8000000) &&
+ BgCheck_EntityCheckCeiling(&play->colCtx, &sp54, &this->actor.world.pos,
+ sPlayerAgeProperties[playerForm].unk_00, &sp5C, &sp58, &this->actor))) {
+ play_sound(NA_SE_SY_ERROR);
+ return;
+ }
+ }
+ if ((itemAction == PLAYER_IA_MAGIC_BEANS) && (AMMO(ITEM_MAGIC_BEANS) == 0)) {
+ play_sound(NA_SE_SY_ERROR);
+ } else {
+ this->itemAction = itemAction;
+ this->unk_AA5 = PLAYER_UNKAA5_5;
+ }
+ } else if (((itemAction == PLAYER_IA_STICK) && (AMMO(ITEM_STICK) == 0)) ||
+ (((play->unk_1887D != 0) || (play->unk_1887E != 0)) &&
+ (play->actorCtx.actorLists[ACTORCAT_EXPLOSIVES].length >= 5)) ||
+ ((play->unk_1887D == 0) && (play->unk_1887E == 0) &&
+ ((explosiveType = Player_ExplosiveFromIA(this, itemAction)) > PLAYER_EXPLOSIVE_NONE) &&
+ ((AMMO(sPlayerExplosiveInfo[explosiveType].itemId) == 0) ||
+ (play->actorCtx.actorLists[ACTORCAT_EXPLOSIVES].length >= 3)))) {
+ play_sound(NA_SE_SY_ERROR);
+ } else if (itemAction == PLAYER_IA_LENS) {
+ func_808318C0(play);
+ } else if (itemAction == PLAYER_IA_PICTO_BOX) {
+ if (!func_80831814(this, play, PLAYER_UNKAA5_2)) {
+ play_sound(NA_SE_SY_ERROR);
+ }
+ } else if ((itemAction == PLAYER_IA_NUT) &&
+ ((this->transformation != PLAYER_FORM_DEKU) || (this->heldItemButton != 0))) {
+ if (AMMO(ITEM_NUT) != 0) {
+ func_8083A658(play, this);
+ } else {
+ play_sound(NA_SE_SY_ERROR);
+ }
+ } else if ((this->transformation == PLAYER_FORM_HUMAN) && (itemAction >= PLAYER_IA_MASK_MIN) &&
+ (itemAction < PLAYER_IA_MASK_GIANT)) {
+ PlayerMask maskId = GET_MASK_FROM_IA(itemAction);
+
+ this->prevMask = this->currentMask;
+ if (maskId == this->currentMask) {
+ this->currentMask = PLAYER_MASK_NONE;
+ func_8082E1F0(this, NA_SE_PL_TAKE_OUT_SHIELD);
+ } else {
+ this->currentMask = maskId;
+ func_8082E1F0(this, NA_SE_PL_CHANGE_ARMS);
+ }
+ gSaveContext.save.equippedMask = this->currentMask;
+ } else if ((itemAction != this->heldItemAction) ||
+ ((this->heldActor == NULL) && (Player_ExplosiveFromIA(this, itemAction) > PLAYER_EXPLOSIVE_NONE))) {
+ u8 nextAnimType;
+
+ 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)) {
+ this->heldItemId = item;
+ this->stateFlags3 |= PLAYER_STATE3_40000000;
+ } else {
+ func_808317C4(this);
+ func_8082DCA0(play, this);
+ func_8082F470(play, this, itemAction);
+ if (!var_v1) {
+ D_80862B48 = 1;
+ D_80862B4C = 1;
+ }
+ }
+ } else {
+ D_80862B48 = 1;
+ D_80862B4C = 1;
+ }
+ }
+}
+
+void func_80831F34(PlayState* play, Player* this, PlayerAnimationHeader* anim) {
+ s32 sp24 = func_801242B4(this);
+
+ func_8082DE50(play, this);
+ Player_SetAction(play, this, sp24 ? func_80851BD4 : func_8084BFDC, 0);
+ Player_AnimationPlayOnce(play, this, anim);
+
+ if (anim == &gPlayerAnim_link_derth_rebirth) {
+ this->skelAnime.endFrame = 84.0f;
+ }
+
+ this->stateFlags1 |= PLAYER_STATE1_80;
+
+ func_8082DAD4(this);
+ Player_AnimSfx_PlayVoice(this, NA_SE_VO_LI_DOWN);
+
+ if (this == GET_PLAYER(play)) {
+ this->csId = play->playerCsIds[PLAYER_CS_ID_DEATH];
+ Audio_SetBgmVolumeOff();
+ gSaveContext.powderKegTimer = 0;
+ gSaveContext.unk_1014 = 0;
+ gSaveContext.jinxTimer = 0;
+
+ if (Inventory_ConsumeFairy(play)) {
+ play->gameOverCtx.state = GAMEOVER_REVIVE_START;
+ this->unk_AE7 = 1;
+ } else {
+ play->gameOverCtx.state = GAMEOVER_DEATH_START;
+ func_801A41F8(0);
+ Audio_PlayFanfare(NA_BGM_GAME_OVER);
+ gSaveContext.seqId = (u8)NA_BGM_DISABLED;
+ gSaveContext.ambienceId = AMBIENCE_ID_DISABLED;
+ }
+
+ ShrinkWindow_Letterbox_SetSizeTarget(32);
+ }
+}
+
+s32 func_80832090(Player* this) {
+ return (!(func_8084D770 == this->actionFunc) ||
+ (((this->stateFlags3 & PLAYER_STATE3_40000000)) &&
+ ((this->heldItemId == ITEM_FC) || (this->heldItemId == ITEM_NONE)))) &&
+ (!(func_80848808 == this->unk_AC4) ||
+ Player_ItemToItemAction(this, this->heldItemId) == this->heldItemAction);
+}
+
+// Whether action is Bremen marching or Kamaro dancing
+s32 func_8083213C(Player* this) {
+ return (func_8084AC84 == this->actionFunc) || (func_8084AEEC == this->actionFunc);
+}
+
+s32 func_8083216C(Player* this, PlayState* play) {
+ if (!(this->stateFlags1 & PLAYER_STATE1_800000) && (this->actor.parent != NULL) && Player_IsHoldingHookshot(this)) {
+ Player_SetAction(play, this, func_80855E08, 1);
+ this->stateFlags3 |= PLAYER_STATE3_80;
+ Player_AnimationPlayOnce(play, this, &gPlayerAnim_link_hook_fly_start);
+ func_8082E920(play, this, (ANIM_FLAG_1 | ANIM_FLAG_UPDATE_Y | ANIM_FLAG_8 | ANIM_FLAG_NOMOVE | ANIM_FLAG_80));
+ func_8082DAD4(this);
+ this->currentYaw = this->actor.shape.rot.y;
+ this->actor.bgCheckFlags &= ~BGCHECKFLAG_GROUND;
+ this->unk_AA6 |= 0x43;
+ Player_AnimSfx_PlayVoice(this, NA_SE_VO_LI_LASH);
+ return true;
+ }
+
+ if (func_80832090(this)) {
+ func_808304BC(this, play);
+ if (func_80852B28 == this->actionFunc) {
+ return true;
+ }
+ }
+
+ if (!this->unk_AC4(this, play)) {
+ return false;
+ }
+
+ if (this->unk_AC8 != 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);
+ }
+ if ((this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) && !(this->skelAnime.moveFlags & ANIM_FLAG_8)) {
+ Math_StepToF(&this->unk_AC8, 0.0f, 0.25f);
+ AnimationContext_SetInterp(play, this->skelAnime.limbCount, this->skelAnime.jointTable,
+ this->unk_284.jointTable, 1.0f - this->unk_AC8);
+ }
+ } 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);
+ } else {
+ AnimationContext_SetCopyAll(play, this->skelAnime.limbCount, this->skelAnime.jointTable,
+ this->unk_284.jointTable);
+ }
+
+ return true;
+}
+
+s32 func_808323C0(Player* this, s16 csId) {
+ if ((csId > CS_ID_NONE) && (CutsceneManager_GetCurrentCsId() != csId)) {
+ if (!CutsceneManager_IsNext(csId)) {
+ CutsceneManager_Queue(csId);
+
+ return false;
+ }
+ CutsceneManager_Start(csId, &this->actor);
+ }
+ this->csId = csId;
+
+ return true;
+}
+
+s32 func_80832444(Player* this) {
+ if (this->csId > CS_ID_NONE) {
+ if (!CutsceneManager_IsNext(this->csId)) {
+ CutsceneManager_Queue(this->csId);
+ return false;
+ }
+
+ CutsceneManager_Start(this->csId, &this->actor);
+ }
+ return true;
+}
+
+s32 func_8083249C(Player* this) {
+ if ((this->csId > CS_ID_NONE) && (CutsceneManager_GetCurrentCsId() != this->csId)) {
+ return func_80832444(this);
+ }
+ return true;
+}
+
+s32 func_808324EC(PlayState* play, Player* this, PlayerFuncD58 arg2, s32 csId) {
+ this->unk_D58 = arg2;
+ this->csId = csId;
+ Player_SetAction(play, this, func_8084D770, 0);
+ func_8083249C(this);
+ this->stateFlags2 |= PLAYER_STATE2_40;
+ return func_8082DE14(play, this);
+}
+
+s32 func_80832558(PlayState* play, Player* this, PlayerFuncD58 arg2) {
+ return func_808324EC(play, this, arg2, CS_ID_NONE);
+}
+
+// To do with turning, related to targeting
+void func_80832578(Player* this, PlayState* play) {
+ s16 previousYaw = this->actor.shape.rot.y;
+
+ if (!(this->stateFlags2 & (PLAYER_STATE2_20 | PLAYER_STATE2_40))) {
+ Actor* targetedActor = this->targetedActor;
+
+ if ((targetedActor != NULL) && ((play->actorCtx.targetContext.unk4B != 0) || (this != GET_PLAYER(play))) &&
+ (targetedActor->id != ACTOR_OBJ_NOZOKI)) {
+ Math_ScaledStepToS(&this->actor.shape.rot.y,
+ Math_Vec3f_Yaw(&this->actor.world.pos, &targetedActor->focus.pos), 0xFA0);
+ } else if ((this->stateFlags1 & PLAYER_STATE1_20000) &&
+ !(this->stateFlags2 & (PLAYER_STATE2_20 | PLAYER_STATE2_40))) {
+ Math_ScaledStepToS(&this->actor.shape.rot.y, this->targetYaw, 0xFA0);
+ }
+ } else if (!(this->stateFlags2 & PLAYER_STATE2_40)) {
+ Math_ScaledStepToS(&this->actor.shape.rot.y, this->currentYaw, 0x7D0);
+ }
+
+ this->unk_B4C = this->actor.shape.rot.y - previousYaw;
+}
+
+s16 func_80832660(s16* pValue, s16 target, s16 step, s16 arg3, s16 arg4, s16 arg5) {
+ s16 temp1;
+ s16 temp2;
+ s16 temp3;
+
+ temp1 = temp2 = arg4 - *pValue;
+ temp2 = CLAMP(temp2, -arg5, arg5);
+ *pValue += BINANG_SUB(temp1, temp2);
+
+ Math_ScaledStepToS(pValue, target, step);
+
+ temp3 = *pValue;
+ if (*pValue < -arg3) {
+ *pValue = -arg3;
+ } else if (arg3 < *pValue) {
+ *pValue = arg3;
+ }
+ return temp3 - *pValue;
+}
+
+s16 func_80832754(Player* this, s32 arg1) {
+ s16 sp36;
+ s16 var_s1 = this->actor.shape.rot.y;
+
+ if (arg1) {
+ this->upperLimbRot.x = this->actor.focus.rot.x;
+ var_s1 = this->actor.focus.rot.y;
+ this->unk_AA6 |= 0x41;
+ } else {
+ s16 temp =
+ func_80832660(&this->headLimbRot.x, this->actor.focus.rot.x, 0x258, 0x2710, this->actor.focus.rot.x, 0);
+
+ func_80832660(&this->upperLimbRot.x, temp, 0xC8, 0xFA0, this->headLimbRot.x, 0x2710);
+
+ sp36 = this->actor.focus.rot.y - var_s1;
+ func_80832660(&sp36, 0, 0xC8, 0x5DC0, this->upperLimbRot.y, 0x1F40);
+ var_s1 = this->actor.focus.rot.y - sp36;
+ func_80832660(&this->headLimbRot.y, (sp36 - this->upperLimbRot.y), 0xC8, 0x1F40, sp36, 0x1F40);
+ func_80832660(&this->upperLimbRot.y, sp36, 0xC8, 0x1F40, this->headLimbRot.y, 0x1F40);
+ this->unk_AA6 |= 0xD9;
+ }
+
+ return var_s1;
+}
+
+void func_80832888(Player* this, PlayState* play) {
+ s32 var_v1 = 0;
+ Actor* var_v1_2;
+ s32 heldZ = CHECK_BTN_ALL(sPlayerControlInput->cur.button, BTN_Z);
+ s32 temp_v0_3;
+ s32 var_a1;
+
+ if (!heldZ) {
+ this->stateFlags1 &= ~PLAYER_STATE1_40000000;
+ }
+
+ if ((play->csCtx.state != CS_STATE_IDLE) || (this->csMode != PLAYER_CSMODE_0) ||
+ (this->stateFlags1 & (PLAYER_STATE1_80 | PLAYER_STATE1_20000000)) || (this->stateFlags3 & PLAYER_STATE3_80)) {
+ this->unk_738 = 0;
+ } else if (heldZ || (this->stateFlags2 & PLAYER_STATE2_2000) || (this->unk_A78 != NULL)) {
+ if (this->unk_738 <= 5) {
+ this->unk_738 = 5;
+ } else {
+ this->unk_738--;
+ }
+ } else if (this->stateFlags1 & PLAYER_STATE1_20000) {
+ this->unk_738 = 0;
+ } else if (this->unk_738 != 0) {
+ this->unk_738--;
+ }
+
+ if (this->unk_738 > 5) {
+ var_v1 = 1;
+ }
+
+ temp_v0_3 = func_8082DAFC(play);
+ if (temp_v0_3 || (this->unk_738 != 0) || (this->stateFlags1 & (PLAYER_STATE1_1000 | PLAYER_STATE1_2000000))) {
+ if (!temp_v0_3) {
+ if (!(this->stateFlags1 & PLAYER_STATE1_2000000) &&
+ ((this->heldItemAction != PLAYER_IA_FISHING_ROD) || (this->unk_B28 == 0)) &&
+ CHECK_BTN_ALL(sPlayerControlInput->press.button, BTN_Z)) {
+ var_v1_2 = (this == GET_PLAYER(play)) ? play->actorCtx.targetContext.arrowPointedActor
+ : &GET_PLAYER(play)->actor;
+ var_a1 = (gSaveContext.options.zTargetSetting != 0) || (this != GET_PLAYER(play));
+ this->stateFlags1 |= PLAYER_STATE1_8000;
+ if ((this->currentMask != PLAYER_MASK_GIANT) && (var_v1_2 != NULL) &&
+ !(var_v1_2->flags & ACTOR_FLAG_CANT_LOCK_ON) &&
+ !(this->stateFlags3 & (PLAYER_STATE3_200 | PLAYER_STATE3_2000))) {
+ if ((var_v1_2 == this->targetedActor) && (this == GET_PLAYER(play))) {
+ var_v1_2 = play->actorCtx.targetContext.unk_94;
+ }
+
+ if ((var_v1_2 != NULL) &&
+ (((var_v1_2 != this->targetedActor)) || (var_v1_2->flags & ACTOR_FLAG_80000))) {
+ var_v1_2->flags &= ~ACTOR_FLAG_80000;
+ if (!var_a1) {
+ this->stateFlags2 |= PLAYER_STATE2_2000;
+ }
+ this->targetedActor = var_v1_2;
+ this->unk_738 = 0xF;
+ this->stateFlags2 &= ~(PLAYER_STATE2_2 | PLAYER_STATE2_200000);
+ } else if (!var_a1) {
+ func_80123DA4(this);
+ }
+ this->stateFlags1 &= ~PLAYER_STATE1_40000000;
+ } else if (!(this->stateFlags1 & (PLAYER_STATE1_20000 | PLAYER_STATE1_40000000)) &&
+ (func_808573A4 != this->actionFunc)) {
+ func_8083133C(this);
+ }
+ }
+
+ if (this->targetedActor != NULL) {
+ if ((this == GET_PLAYER(play)) && (this->targetedActor != this->unk_A78) &&
+ func_800B83F8(this->targetedActor, this, var_v1)) {
+ func_80123DA4(this);
+ this->stateFlags1 |= PLAYER_STATE1_40000000;
+ } else if (this->targetedActor != NULL) {
+ this->targetedActor->targetPriority = 0x28;
+ }
+ } else if (this->unk_A78 != NULL) {
+ this->targetedActor = this->unk_A78;
+ }
+ }
+
+ if ((this->targetedActor != NULL) && !(this->stateFlags3 & (PLAYER_STATE3_200 | PLAYER_STATE3_2000))) {
+ this->stateFlags1 &= ~(PLAYER_STATE1_10000 | PLAYER_STATE1_20000);
+ if ((this->stateFlags1 & PLAYER_STATE1_800) ||
+ !CHECK_FLAG_ALL(this->targetedActor->flags, ACTOR_FLAG_1 | ACTOR_FLAG_4)) {
+ this->stateFlags1 |= PLAYER_STATE1_10000;
+ }
+ } else if (this->stateFlags1 & PLAYER_STATE1_20000) {
+ this->stateFlags2 &= ~PLAYER_STATE2_2000;
+ } else {
+ func_80123DC0(this);
+ }
+ } else {
+ func_80123DC0(this);
+ }
+}
+
+s32 func_80832CAC(PlayState* play, Player* this, f32* arg2, s16* outYaw, f32 arg4) {
+ f32 temp_fv1_2;
+
+ if ((this->unk_AA5 != PLAYER_UNKAA5_0) || func_8082DA90(play) || (this->stateFlags1 & PLAYER_STATE1_1)) {
+ *arg2 = 0.0f;
+ *outYaw = this->actor.shape.rot.y;
+ } else {
+ *arg2 = D_80862AFC;
+ *outYaw = D_80862B00;
+ if (arg4 != 0.0f) {
+ *arg2 -= 20.0f;
+ if (*arg2 < 0.0f) {
+ *arg2 = 0.0f;
+ } else {
+ temp_fv1_2 = 1.0f - Math_CosS(*arg2 * 450.0f);
+ *arg2 = (SQ(temp_fv1_2) * 30.0f) + 7.0f;
+ }
+ } else {
+ *arg2 *= 0.8f;
+ }
+
+ if (this->transformation == PLAYER_FORM_FIERCE_DEITY) {
+ *arg2 *= 1.5f;
+ }
+
+ if (D_80862AFC != 0.0f) {
+ f32 temp_fv0 = Math_SinS(this->unk_B6C);
+ f32 var_fa0 = this->unk_B50;
+ f32 var_fa1;
+
+ if (this->unk_AB8 != 0.0f) {
+ var_fa1 = (this->targetedActor != NULL) ? 0.002f : 0.008f;
+
+ var_fa0 -= this->unk_AB8 * var_fa1;
+ var_fa0 = CLAMP_MIN(var_fa0, 2.0f);
+ }
+ *arg2 = (*arg2 * 0.14f) - (8.0f * temp_fv0 * temp_fv0);
+ *arg2 = CLAMP(*arg2, 0.0f, var_fa0);
+ if (temp_fv0) {} //! FAKE
+ return true;
+ }
+ }
+
+ return false;
+}
+
+s32 func_80832F24(Player* this) {
+ return Math_StepToF(&this->linearVelocity, 0.0f, REG(43) / 100.0f);
+}
+
+s32 func_80832F78(Player* this, f32* arg1, s16* outYaw, f32 arg3, PlayState* play) {
+ if (!func_80832CAC(play, this, arg1, outYaw, arg3)) {
+ *outYaw = this->actor.shape.rot.y;
+
+ if (this->targetedActor != NULL) {
+ if ((play->actorCtx.targetContext.unk4B != 0) && !(this->stateFlags2 & PLAYER_STATE2_40)) {
+ *outYaw = Math_Vec3f_Yaw(&this->actor.world.pos, &this->targetedActor->focus.pos);
+ }
+ } else if (func_80123434(this)) {
+ *outYaw = this->targetYaw;
+ }
+
+ return false;
+ }
+
+ *outYaw += Camera_GetInputDirYaw(play->cameraPtrs[play->activeCamId]);
+ return true;
+}
+
+/**
+ * The values of following arrays are used as indices for the `D_8085D054` 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,
+};
+
+s32 func_80833058(PlayState* play, Player* this, s8* arg2, s32 arg3) {
+ if (!(this->stateFlags1 & (PLAYER_STATE1_1 | PLAYER_STATE1_80 | PLAYER_STATE1_20000000)) && !func_8082DA90(play)) {
+ if (arg3) {
+ D_80862B04 = func_8083216C(this, play);
+ if (func_80852B28 == this->actionFunc) {
+ return true;
+ }
+ }
+
+ if (func_801240DC(this)) {
+ this->unk_AA6 |= 0x41;
+ return true;
+ }
+
+ if (!(this->stateFlags3 & PLAYER_STATE3_40000000) && (func_80848808 != this->unk_AC4)) {
+ while (*arg2 >= 0) {
+ if (D_8085D054[*arg2](this, play)) {
+ return true;
+ }
+ arg2++;
+ }
+
+ if (D_8085D054[-*arg2](this, play)) {
+ return true;
+ }
+ }
+
+ if (func_8083213C(this)) {
+ return true;
+ }
+ } else if (this->stateFlags1 & PLAYER_STATE1_800) {
+ func_8083216C(this, play);
+ }
+
+ return false;
+}
+
+s32 func_808331FC(PlayState* play, Player* this, SkelAnime* skelAnime, f32 frame) {
+ if ((skelAnime->endFrame - frame) <= skelAnime->curFrame) {
+ f32 sp24;
+ s16 sp22;
+
+ if (func_80833058(play, this, D_8085D01C, 1)) {
+ return 0;
+ }
+
+ if (D_80862B04 || func_80832F78(this, &sp24, &sp22, 0.018f, play)) {
+ return 1;
+ }
+ }
+ return -1;
+}
+
+void func_808332A0(PlayState* play, Player* this, s32 magicCost, s32 isSwordBeam) {
+ if (magicCost != 0) {
+ this->unk_B08 = 0.0f;
+ } else {
+ this->unk_B08 = 0.5f;
+ }
+
+ this->stateFlags1 |= PLAYER_STATE1_1000;
+ if ((this->actor.id == ACTOR_PLAYER) && (isSwordBeam || (this->transformation == PLAYER_FORM_HUMAN))) {
+ s16 pitch = 0;
+ Actor* thunder;
+
+ if (isSwordBeam) {
+ if (this->targetedActor != NULL) {
+ pitch = Math_Vec3f_Pitch(&this->bodyPartsPos[PLAYER_BODYPART_WAIST], &this->targetedActor->focus.pos);
+ }
+ if (gSaveContext.save.saveInfo.playerData.magic == 0) {
+ return;
+ }
+ }
+
+ thunder = Actor_Spawn(&play->actorCtx, play, ACTOR_EN_M_THUNDER, this->bodyPartsPos[PLAYER_BODYPART_WAIST].x,
+ this->bodyPartsPos[PLAYER_BODYPART_WAIST].y, this->bodyPartsPos[PLAYER_BODYPART_WAIST].z,
+ pitch, 0, 0, (this->heldItemAction - PLAYER_IA_SWORD_KOKIRI) | magicCost);
+
+ if ((thunder != NULL) && isSwordBeam) {
+ Magic_Consume(play, 1, MAGIC_CONSUME_DEITY_BEAM);
+ this->unk_D57 = 4;
+ }
+ }
+}
+
+// Check for inputs for quickspin
+s32 func_808333CC(Player* this) {
+ s8 sp3C[4];
+ s8* iter;
+ s8* iter2;
+ s8 temp1;
+ s8 temp2;
+ s32 i;
+
+ if (this->heldItemAction == PLAYER_IA_STICK) {
+ return false;
+ }
+
+ iter = &this->unk_ADF[0];
+ iter2 = &sp3C[0];
+ for (i = 0; i < 4; i++, iter++, iter2++) {
+ if ((*iter2 = *iter) < 0) {
+ return false;
+ }
+ *iter2 *= 2;
+ }
+
+ temp1 = sp3C[0] - sp3C[1];
+ if (ABS_ALT(temp1) < 10) {
+ return false;
+ }
+
+ iter2 = &sp3C[1];
+ for (i = 1; i < 3; i++, iter2++) {
+ temp2 = *iter2 - *(iter2 + 1);
+ if ((ABS_ALT(temp2) < 10) || (temp2 * temp1 < 0)) {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+void func_808334D4(PlayState* play, Player* this) {
+ PlayerAnimationHeader* anim;
+
+ if ((this->meleeWeaponAnimation >= PLAYER_MWA_RIGHT_SLASH_1H) &&
+ (this->meleeWeaponAnimation <= PLAYER_MWA_RIGHT_COMBO_2H)) {
+ anim = D_8085CF58[Player_IsHoldingTwoHandedWeapon(this)];
+ } else {
+ anim = D_8085CF50[Player_IsHoldingTwoHandedWeapon(this)];
+ }
+
+ func_8082DC38(this);
+ PlayerAnimation_Change(play, &this->skelAnime, anim, 1.0f, 8.0f, Animation_GetLastFrame(anim), ANIMMODE_ONCE,
+ -9.0f);
+ func_808332A0(play, this, 2 << 8, false);
+}
+
+void func_808335B0(PlayState* play, Player* this) {
+ Player_SetAction(play, this, func_8084CCEC, 1);
+ func_808334D4(play, this);
+}
+
+s8 D_8085D090[] = {
+ PLAYER_MWA_STAB_1H,
+ PLAYER_MWA_RIGHT_SLASH_1H,
+ PLAYER_MWA_RIGHT_SLASH_1H,
+ PLAYER_MWA_LEFT_SLASH_1H,
+};
+
+s8 D_8085D094[][3] = {
+ { PLAYER_MWA_ZORA_PUNCH_LEFT, PLAYER_MWA_ZORA_PUNCH_COMBO, PLAYER_MWA_ZORA_PUNCH_KICK },
+ { PLAYER_MWA_GORON_PUNCH_LEFT, PLAYER_MWA_GORON_PUNCH_RIGHT, PLAYER_MWA_GORON_PUNCH_BUTT },
+};
+
+PlayerMeleeWeaponAnimation func_808335F4(Player* this) {
+ s32 temp_a1;
+ PlayerMeleeWeaponAnimation meleeWeaponAnim;
+
+ temp_a1 = this->unk_AE3[this->unk_ADE];
+ if ((this->transformation == PLAYER_FORM_ZORA) || (this->transformation == PLAYER_FORM_GORON)) {
+ s32 requiredScopeTemp;
+
+ // yikes
+ meleeWeaponAnim = ((this->transformation == PLAYER_FORM_ZORA) ? D_8085D094[0] : D_8085D094[1])[this->unk_ADD];
+
+ if (this->unk_ADD != 0) {
+ this->meleeWeaponAnimation = meleeWeaponAnim;
+ if (this->unk_ADD >= 2) {
+ this->unk_ADD = -1;
+ }
+ }
+ } else {
+ if (func_808333CC(this)) {
+ meleeWeaponAnim = PLAYER_MWA_SPIN_ATTACK_1H;
+ } else {
+ if (temp_a1 < 0) {
+ meleeWeaponAnim = func_8082FBE8(this) ? PLAYER_MWA_FORWARD_SLASH_1H : PLAYER_MWA_RIGHT_SLASH_1H;
+ } else {
+ meleeWeaponAnim = D_8085D090[temp_a1];
+ if (meleeWeaponAnim == PLAYER_MWA_STAB_1H) {
+ this->stateFlags2 |= PLAYER_STATE2_40000000;
+ if (!func_8082FBE8(this)) {
+ meleeWeaponAnim = PLAYER_MWA_FORWARD_SLASH_1H;
+ }
+ }
+ }
+
+ if (this->heldItemAction == PLAYER_IA_STICK) {
+ meleeWeaponAnim = PLAYER_MWA_FORWARD_SLASH_1H;
+ }
+ }
+
+ if (Player_IsHoldingTwoHandedWeapon(this)) {
+ meleeWeaponAnim++;
+ }
+ }
+ return meleeWeaponAnim;
+}
+
+void func_80833728(Player* this, s32 index, u32 dmgFlags, s32 damage) {
+ this->meleeWeaponQuads[index].info.toucher.dmgFlags = dmgFlags;
+ this->meleeWeaponQuads[index].info.toucher.damage = damage;
+
+ if (dmgFlags == DMG_DEKU_STICK) {
+ this->meleeWeaponQuads[index].info.toucherFlags = (TOUCH_ON | TOUCH_NEAREST | TOUCH_SFX_WOOD);
+ } else {
+ this->meleeWeaponQuads[index].info.toucherFlags = (TOUCH_ON | TOUCH_NEAREST);
+ }
+}
+
+MeleeWeaponDamageInfo D_8085D09C[PLAYER_MELEEWEAPON_MAX] = {
+ { DMG_GORON_PUNCH, 2, 2, 0, 0 }, // PLAYER_MELEEWEAPON_NONE
+ { DMG_SWORD, 4, 8, 1, 2 }, // PLAYER_MELEEWEAPON_SWORD_KOKIRI
+ { DMG_SWORD, 4, 8, 2, 4 }, // PLAYER_MELEEWEAPON_SWORD_RAZOR
+ { DMG_SWORD, 4, 8, 3, 6 }, // PLAYER_MELEEWEAPON_SWORD_GILDED
+ { DMG_SWORD, 4, 8, 4, 8 }, // PLAYER_MELEEWEAPON_SWORD_TWO_HANDED
+ { DMG_DEKU_STICK, 0, 0, 2, 4 }, // PLAYER_MELEEWEAPON_STICK
+ { DMG_ZORA_PUNCH, 1, 2, 0, 0 }, // PLAYER_MELEEWEAPON_ZORA_FINS
+};
+
+// New function in NE0: split out of func_80833864 to be able to call it to patch Power Crouch Stab.
+void func_8083375C(Player* this, PlayerMeleeWeaponAnimation meleeWeaponAnim) {
+ MeleeWeaponDamageInfo* dmgInfo = &D_8085D09C[0];
+ s32 damage;
+
+ if (this->actor.id == ACTOR_EN_TEST3) {
+ // Was Kafei originally intended to be able to punch?
+ meleeWeaponAnim = PLAYER_MWA_GORON_PUNCH_LEFT;
+ this->meleeWeaponAnimation = -1;
+ } else {
+ //! @bug Quick Put Away Damage: Since 0 is also the "no weapon" value, producing a weapon quad without a weapon
+ //! in hand, such as during Quick Put Away, produced a quad with the Goron punch properties, which does 0 damage
+ //! as human.
+ dmgInfo = &D_8085D09C[(this->transformation == PLAYER_FORM_GORON) ? PLAYER_MELEEWEAPON_NONE
+ : Player_GetMeleeWeaponHeld(this)];
+ }
+
+ //! @bug Great Deku Sword: Presumably the dmgTransformed fields are intended for Fierce Deity, but also work for
+ //! Deku if it is able to equip a sword (such as with the "0th day" glitch), giving Great Fairy's Sword damage.
+ damage =
+ ((meleeWeaponAnim >= PLAYER_MWA_FLIPSLASH_START) && (meleeWeaponAnim <= PLAYER_MWA_ZORA_JUMPKICK_FINISH))
+ ? ((this->transformation == PLAYER_FORM_HUMAN) ? dmgInfo->dmgHumanStrong : dmgInfo->dmgTransformedStrong)
+ : ((this->transformation == PLAYER_FORM_HUMAN) ? dmgInfo->dmgHumanNormal : dmgInfo->dmgTransformedNormal);
+
+ func_80833728(this, 0, dmgInfo->dmgFlags, damage);
+ func_80833728(this, 1, dmgInfo->dmgFlags, damage);
+}
+
+void func_80833864(PlayState* play, Player* this, PlayerMeleeWeaponAnimation meleeWeaponAnim) {
+ func_8083375C(this, meleeWeaponAnim);
+ Player_SetAction(play, this, func_808548B8, 0);
+ this->unk_AE8 = 0;
+
+ if ((meleeWeaponAnim < PLAYER_MWA_FLIPSLASH_FINISH) || (meleeWeaponAnim > PLAYER_MWA_ZORA_JUMPKICK_FINISH)) {
+ func_8082DC38(this);
+ }
+
+ // Accumulate consecutive slashes to do the "third slash" types
+ if ((meleeWeaponAnim != this->meleeWeaponAnimation) || (this->unk_ADD >= 3)) {
+ this->unk_ADD = 0;
+ }
+
+ this->unk_ADD++;
+ if (this->unk_ADD >= 3) {
+ meleeWeaponAnim += 2;
+ }
+
+ this->meleeWeaponAnimation = meleeWeaponAnim;
+ func_8082DB90(play, this, sMeleeAttackAnimInfo[meleeWeaponAnim].unk_0);
+ this->unk_ADC = this->skelAnime.animLength + 4.0f;
+
+ if ((meleeWeaponAnim < PLAYER_MWA_FLIPSLASH_START) || (meleeWeaponAnim > PLAYER_MWA_ZORA_JUMPKICK_START)) {
+ func_8082E920(play, this, (ANIM_FLAG_1 | ANIM_FLAG_8 | ANIM_FLAG_NOMOVE));
+ }
+ this->currentYaw = this->actor.shape.rot.y;
+}
+
+void func_80833998(Player* this, s32 invincibilityTimer) {
+ if (this->invincibilityTimer >= 0) {
+ this->invincibilityTimer = invincibilityTimer;
+ this->unk_B5F = 0;
+ }
+}
+
+void func_808339B4(Player* this, s32 invincibilityTimer) {
+ if (this->invincibilityTimer > invincibilityTimer) {
+ this->invincibilityTimer = invincibilityTimer;
+ }
+ this->unk_B5F = 0;
+}
+
+// Player_InflictDamageImpl?
+s32 func_808339D4(PlayState* play, Player* this, s32 damage) {
+ if ((this->invincibilityTimer != 0) || (this->stateFlags3 & PLAYER_STATE3_400000) ||
+ (this->actor.id != ACTOR_PLAYER)) {
+ return 1;
+ }
+
+ if (this->actor.category != ACTORCAT_PLAYER) {
+ this->actor.colChkInfo.damage = -damage;
+ return Actor_ApplyDamage(&this->actor);
+ }
+
+ if (this->currentMask == PLAYER_MASK_GIANT) {
+ damage >>= 2;
+ }
+
+ return Health_ChangeBy(play, damage);
+}
+
+void func_80833A64(Player* this) {
+ this->skelAnime.prevTransl = this->skelAnime.jointTable[PLAYER_LIMB_ROOT - 1];
+ func_8082E820(this, 1 | ANIM_FLAG_UPDATE_Y);
+}
+
+void func_80833AA0(Player* this, PlayState* play) {
+ if (Player_SetAction(play, this, func_8084C16C, 0)) {
+ Player_AnimationPlayLoop(play, this, &gPlayerAnim_link_normal_landing_wait);
+ this->unk_AE8 = 1;
+ }
+ if (this->unk_AA5 != PLAYER_UNKAA5_4) {
+ this->unk_AA5 = PLAYER_UNKAA5_0;
+ }
+}
+
+// TODO: this can be one array, but should it be?
+PlayerAnimationHeader* D_8085D0D4[] = {
+ &gPlayerAnim_link_normal_front_shit,
+ &gPlayerAnim_link_normal_front_shitR,
+ &gPlayerAnim_link_normal_back_shit,
+ &gPlayerAnim_link_normal_back_shitR,
+ // };
+ // PlayerAnimationHeader* D_8085D0E4[] = {
+ &gPlayerAnim_link_normal_front_hit,
+ &gPlayerAnim_link_anchor_front_hitR,
+ &gPlayerAnim_link_normal_back_hit,
+ &gPlayerAnim_link_anchor_back_hitR,
+};
+
+void func_80833B18(PlayState* play, Player* this, s32 arg2, f32 speed, f32 velocityY, s16 arg5,
+ s32 invincibilityTimer) {
+ PlayerAnimationHeader* anim = NULL;
+
+ if (this->stateFlags1 & PLAYER_STATE1_2000) {
+ func_80833A64(this);
+ }
+
+ this->unk_B64 = 0;
+
+ Player_PlaySfx(this, NA_SE_PL_DAMAGE);
+
+ if (func_808339D4(play, this, -this->actor.colChkInfo.damage) == 0) {
+ this->stateFlags2 &= ~PLAYER_STATE2_80;
+ if ((this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) || (this->stateFlags1 & PLAYER_STATE1_8000000)) {
+ return;
+ }
+ }
+
+ if (this->actor.colChkInfo.damage != 0) {
+ func_80833998(this, invincibilityTimer);
+ }
+
+ if (this->stateFlags2 & PLAYER_STATE2_10) {
+ return;
+ }
+
+ if (arg2 == 3) {
+ Player_SetAction(play, this, func_808546D0, 0);
+ anim = &gPlayerAnim_link_normal_ice_down;
+ func_8082DAD4(this);
+ this->actor.velocity.y = 0.0f;
+
+ Player_RequestRumble(play, this, 255, 10, 40, SQ(0));
+
+ Player_PlaySfx(this, NA_SE_PL_FREEZE_S);
+ Player_AnimSfx_PlayVoice(this, NA_SE_VO_LI_FREEZE);
+ } else if (arg2 == 4) {
+ Player_SetAction(play, this, func_80854800, 0);
+ func_8082DB60(play, this, &gPlayerAnim_link_normal_electric_shock);
+ func_8082DAD4(this);
+
+ this->unk_AE8 = 20;
+ this->actor.velocity.y = 0.0f;
+
+ Player_RequestRumble(play, this, 255, 80, 150, SQ(0));
+ } else {
+ arg5 -= this->actor.shape.rot.y;
+
+ if (this->stateFlags1 & PLAYER_STATE1_8000000) {
+ Player_SetAction(play, this, func_80851B58, 0);
+ Player_RequestRumble(play, this, 180, 20, 50, SQ(0));
+
+ if (arg2 == 1) {
+ this->linearVelocity = speed * 1.5f;
+ this->actor.velocity.y = velocityY * 0.7f;
+ } else {
+ this->linearVelocity = 4.0f;
+ this->actor.velocity.y = 0.0f;
+ }
+
+ Player_AnimSfx_PlayVoice(this, NA_SE_VO_LI_DAMAGE_S);
+ anim = &gPlayerAnim_link_swimer_swim_hit;
+ } else if ((arg2 == 1) || (arg2 == 2) || !(this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) ||
+ (this->stateFlags1 &
+ (PLAYER_STATE1_4 | PLAYER_STATE1_2000 | PLAYER_STATE1_4000 | PLAYER_STATE1_200000))) {
+ Player_SetAction(play, this, func_8084BC64, 0);
+
+ this->stateFlags3 |= PLAYER_STATE3_2;
+
+ Player_RequestRumble(play, this, 255, 20, 150, SQ(0));
+ func_8082DAD4(this);
+
+ if (arg2 == 2) {
+ this->unk_AE8 = 4;
+
+ this->actor.speed = 3.0f;
+ this->linearVelocity = 3.0f;
+ this->actor.velocity.y = 6.0f;
+
+ func_8082E5A8(play, this, D_8085BE84[PLAYER_ANIMGROUP_3][this->modelAnimType]);
+ Player_AnimSfx_PlayVoice(this, NA_SE_VO_LI_DAMAGE_S);
+ } else {
+ this->actor.speed = speed;
+ this->linearVelocity = speed;
+ this->actor.velocity.y = velocityY;
+
+ if (ABS_ALT(arg5) > 0x4000) {
+ anim = &gPlayerAnim_link_normal_front_downA;
+ } else {
+ anim = &gPlayerAnim_link_normal_back_downA;
+ }
+ Player_AnimSfx_PlayVoice(this, NA_SE_VO_LI_FALL_L);
+ }
+ this->actor.bgCheckFlags &= ~BGCHECKFLAG_GROUND;
+ } else if ((this->linearVelocity > 4.0f) && !func_80123420(this)) {
+ this->unk_B64 = 20;
+
+ Player_RequestRumble(play, this, 120, 20, 10, SQ(0));
+ Player_AnimSfx_PlayVoice(this, NA_SE_VO_LI_DAMAGE_S);
+
+ return;
+ } else {
+ PlayerAnimationHeader** animPtr = D_8085D0D4;
+
+ Player_SetAction(play, this, func_8084BBF0, 0);
+ func_8082FC60(this);
+
+ if (this->actor.colChkInfo.damage < 5) {
+ Player_RequestRumble(play, this, 120, 20, 10, SQ(0));
+ } else {
+ Player_RequestRumble(play, this, 180, 20, 100, SQ(0));
+ this->linearVelocity = 23.0f;
+
+ animPtr += 4;
+ }
+
+ if (ABS_ALT(arg5) <= 0x4000) {
+ animPtr += 2;
+ }
+
+ if (func_80123420(this)) {
+ animPtr++;
+ }
+
+ anim = *animPtr;
+ Player_AnimSfx_PlayVoice(this, NA_SE_VO_LI_DAMAGE_S);
+ }
+
+ this->actor.shape.rot.y += arg5;
+ this->currentYaw = this->actor.shape.rot.y;
+ this->actor.world.rot.y = this->actor.shape.rot.y;
+
+ if (ABS_ALT(arg5) > 0x4000) {
+ this->actor.shape.rot.y += 0x8000;
+ }
+ }
+
+ func_8082DE50(play, this);
+
+ this->stateFlags1 |= PLAYER_STATE1_4000000;
+
+ if (anim != NULL) {
+ func_8082DB90(play, this, anim);
+ }
+}
+
+s32 func_808340AC(FloorType floorType) {
+ s32 temp_v0 = floorType - FLOOR_TYPE_2;
+
+ if ((temp_v0 >= FLOOR_TYPE_2 - FLOOR_TYPE_2) && (temp_v0 <= FLOOR_TYPE_3 - FLOOR_TYPE_2)) {
+ return temp_v0;
+ }
+ return -1;
+}
+
+s32 func_808340D4(FloorType floorType) {
+ return (floorType == FLOOR_TYPE_4) || (floorType == FLOOR_TYPE_7) || (floorType == FLOOR_TYPE_12);
+}
+
+void func_80834104(PlayState* play, Player* this) {
+ Player_SetAction(play, this, func_8085421C, 0);
+ this->stateFlags1 |= PLAYER_STATE1_20000000 | PLAYER_STATE1_80000000;
+}
+
+void func_80834140(PlayState* play, Player* this, PlayerAnimationHeader* anim) {
+ if (!(this->stateFlags1 & PLAYER_STATE1_80)) {
+ func_80834104(play, this);
+ if (func_8082DA90(play)) {
+ this->unk_AE8 = -30;
+ }
+ this->stateFlags1 |= PLAYER_STATE1_80;
+ PlayerAnimation_Change(play, &this->skelAnime, anim, 1.0f, 0.0f, 84.0f, ANIMMODE_ONCE, -6.0f);
+ this->unk_AE7 = 1;
+ this->linearVelocity = 0.0f;
+ }
+}
+
+s32 func_808341F4(PlayState* play, Player* this) {
+ f32 temp_fv0;
+ f32 flameScale;
+ f32 flameIntensity;
+ s32 i;
+ s32 timerStep;
+ s32 spawnedFlame = false;
+ s32 var_v0;
+ s32 var_v1;
+ u8* timerPtr = this->flameTimers;
+
+ if ((this->transformation == PLAYER_FORM_ZORA) || (this->transformation == PLAYER_FORM_DEKU)) {
+ timerStep = 0;
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
+ if (this->cylinder.base.ocFlags1 & OC1_HIT) {
+ Math_Vec3f_Copy(&this->actor.world.pos, &this->actor.prevPos);
+ this->linearVelocity = 0.0f;
+ }
+ func_80834140(play, this, &gPlayerAnim_link_derth_rebirth);
+ }
+ } else {
+ if (this->transformation == PLAYER_FORM_GORON) {
+ var_v1 = 20;
+ } else {
+ var_v1 = (s32)(this->linearVelocity * 0.4f) + 1;
+ }
+
+ if (this->stateFlags2 & PLAYER_STATE2_8) {
+ var_v0 = 100;
+ } else {
+ var_v0 = 0;
+ }
+
+ timerStep = var_v0 + var_v1;
+ }
+
+ for (i = 0; i < PLAYER_BODYPART_MAX; i++, timerPtr++) {
+ if (*timerPtr <= timerStep) {
+ *timerPtr = 0;
+ } else {
+ spawnedFlame = true;
+ *timerPtr -= timerStep;
+ if (*timerPtr > 20.0f) {
+ temp_fv0 = (*timerPtr - 20.0f) * 0.01f;
+ flameScale = CLAMP(temp_fv0, 0.19999999f, 0.2f);
+ } else {
+ flameScale = *timerPtr * 0.01f;
+ }
+
+ flameIntensity = (*timerPtr - 25.0f) * 0.02f;
+ flameIntensity = CLAMP(flameIntensity, 0.0f, 1.0f);
+ EffectSsFireTail_SpawnFlameOnPlayer(play, flameScale, i, flameIntensity);
+ }
+ }
+
+ if (spawnedFlame) {
+ Player_PlaySfx(this, NA_SE_EV_TORCH - SFX_FLAG);
+ if ((play->gameplayFrames % 4) == 0) {
+ Player_InflictDamage(play, -1);
+ }
+ } else {
+ this->isBurning = false;
+ }
+
+ return this->stateFlags1 & PLAYER_STATE1_80;
+}
+
+s32 func_808344C0(PlayState* play, Player* this) {
+ s32 i = 0;
+
+ while (i < ARRAY_COUNT(this->flameTimers)) {
+ this->flameTimers[i] = Rand_S16Offset(0, 200);
+ i++;
+ }
+
+ this->isBurning = true;
+ return func_808341F4(play, this);
+}
+
+s32 func_80834534(PlayState* play, Player* this) {
+ Player_AnimSfx_PlayVoice(this, NA_SE_VO_LI_FALL_L);
+ return func_808344C0(play, this);
+}
+
+s32 func_8083456C(PlayState* play, Player* this) {
+ if (this->actor.colChkInfo.acHitEffect == 1) {
+ return func_80834534(play, this);
+ }
+ return false;
+}
+
+void func_808345A8(Player* this) {
+ if ((this->invincibilityTimer > 0) && (this->invincibilityTimer < 20)) {
+ this->invincibilityTimer = 20;
+ }
+}
+
+void func_808345C8(void) {
+ if (INV_CONTENT(ITEM_MASK_DEKU) == ITEM_MASK_DEKU) {
+ gSaveContext.save.playerForm = PLAYER_FORM_HUMAN;
+ gSaveContext.save.equippedMask = PLAYER_MASK_NONE;
+ }
+}
+
+s32 func_80834600(Player* this, PlayState* play) {
+ s32 pad74;
+ s32 var_v0;
+
+ if (this->unk_D6A != 0) {
+ if (!Player_InBlockingCsMode(play, this)) {
+ Player_InflictDamage(play, -16);
+ this->unk_D6A = 0;
+ }
+ } else if ((var_v0 = ((Player_GetHeight(this) - 8.0f) < (this->unk_AB8 * this->actor.scale.y))) ||
+ (this->actor.bgCheckFlags & BGCHECKFLAG_CRUSHED) || (sPlayerCurrentFloorType == FLOOR_TYPE_9) ||
+ (this->stateFlags2 & PLAYER_STATE2_80000000)) {
+ Player_AnimSfx_PlayVoice(this, NA_SE_VO_LI_DAMAGE_S);
+
+ if (var_v0) {
+ func_80169FDC(&play->state);
+ func_808345C8();
+ Scene_SetExitFade(play);
+ } else {
+ func_80169EFC(&play->state);
+ func_808345C8();
+ }
+
+ Player_AnimSfx_PlayVoice(this, NA_SE_VO_LI_TAKEN_AWAY);
+ play->haltAllActors = true;
+ play_sound(NA_SE_OC_ABYSS);
+ } else if ((this->unk_B75 != 0) && ((this->unk_B75 >= 3) || (this->invincibilityTimer == 0))) {
+ u8 sp6C[] = { 0, 2, 1, 1 };
+
+ if (!func_8083456C(play, this)) {
+ if (this->unk_B75 == 4) {
+ this->shockTimer = 40;
+ }
+
+ this->actor.colChkInfo.damage += this->unk_B74;
+ func_80833B18(play, this, sp6C[this->unk_B75 - 1], this->unk_B78, this->unk_B7C, this->unk_B76, 20);
+ }
+ } else if ((this->shieldQuad.base.acFlags & AC_BOUNCED) || (this->shieldCylinder.base.acFlags & AC_BOUNCED) ||
+ ((this->invincibilityTimer < 0) && (this->cylinder.base.acFlags & AC_HIT) &&
+ (this->cylinder.info.acHitInfo != NULL) &&
+ (this->cylinder.info.acHitInfo->toucher.dmgFlags != DMG_UNBLOCKABLE))) {
+ PlayerAnimationHeader* var_a2;
+ s32 sp64;
+
+ Player_RequestRumble(play, this, 180, 20, 100, SQ(0));
+ if ((this->invincibilityTimer >= 0) && !Player_IsGoronOrDeku(this)) {
+ sp64 = (func_8084B5C0 == this->actionFunc);
+ if (!func_801242B4(this)) {
+ Player_SetAction(play, this, func_8084BAA4, 0);
+ }
+
+ this->unk_AE7 = sp64;
+ if ((s8)sp64 == 0) {
+ func_8082F43C(play, this, func_80848A0C);
+ 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);
+ } else {
+ Player_AnimationPlayOnce(play, this, D_8085CFDC[Player_IsHoldingTwoHandedWeapon(this)]);
+ }
+ }
+
+ if (!(this->stateFlags1 & (PLAYER_STATE1_4 | PLAYER_STATE1_2000 | PLAYER_STATE1_4000 | PLAYER_STATE1_200000))) {
+ this->linearVelocity = -18.0f;
+ this->currentYaw = this->actor.shape.rot.y;
+ }
+
+ return false;
+ } else if ((this->unk_D6B != 0) || (this->invincibilityTimer > 0) || (this->stateFlags1 & PLAYER_STATE1_4000000) ||
+ (this->csMode != PLAYER_CSMODE_0) || (this->meleeWeaponQuads[0].base.atFlags & AT_HIT) ||
+ (this->meleeWeaponQuads[1].base.atFlags & AT_HIT) || (this->cylinder.base.atFlags & AT_HIT) ||
+ (this->shieldCylinder.base.atFlags & AT_HIT)) {
+ return false;
+ } else if (this->cylinder.base.acFlags & AC_HIT) {
+ Actor* sp60 = this->cylinder.base.ac;
+ s32 var_a2_2;
+
+ if (sp60->flags & ACTOR_FLAG_1000000) {
+ Player_PlaySfx(this, NA_SE_PL_BODY_HIT);
+ }
+
+ if (this->actor.colChkInfo.acHitEffect == 2) {
+ var_a2_2 = 3;
+ } else if (this->actor.colChkInfo.acHitEffect == 3) {
+ var_a2_2 = 4;
+ } else if (this->actor.colChkInfo.acHitEffect == 7) {
+ var_a2_2 = 1;
+ this->shockTimer = 40;
+ } else if (this->actor.colChkInfo.acHitEffect == 9) {
+ var_a2_2 = 1;
+ if (func_80834534(play, this)) {
+ return true;
+ }
+
+ } else if (((this->actor.colChkInfo.acHitEffect == 4) && (this->currentMask != PLAYER_MASK_GIANT)) ||
+ (this->stateFlags3 & PLAYER_STATE3_1000)) {
+ var_a2_2 = 1;
+ } else {
+ var_a2_2 = 0;
+ if (func_8083456C(play, this)) {
+ return true;
+ }
+ }
+ func_80833B18(play, this, var_a2_2, 4.0f, 5.0f, Actor_WorldYawTowardActor(sp60, &this->actor), 20);
+ } else if (this->invincibilityTimer != 0) {
+ return false;
+ } else {
+ s32 sp58 = func_808340AC(sPlayerCurrentFloorType);
+ u32 sp54 = SurfaceType_IsWallDamage(&play->colCtx, this->actor.floorPoly, this->actor.floorBgId);
+ s32 var_a1 = 0;
+ s32 var_v1_2;
+ s32 pad48;
+
+ if ((sp58 < 0) ||
+ ((sp54 == 0) && (this->transformation == PLAYER_FORM_GORON) && !(this->actor.depthInWater > 0.0f))) {
+ var_a1 = (this->actor.wallPoly != NULL) &&
+ SurfaceType_IsWallDamage(&play->colCtx, this->actor.wallPoly, this->actor.wallBgId);
+ if (var_a1 == 0) {
+ //! FAKE?
+ goto label;
+ }
+ }
+ var_v1_2 = (var_a1 != 0) ? this->actor.wallBgId : this->actor.floorBgId;
+ if (((this->transformation == PLAYER_FORM_DEKU) || (this->transformation == PLAYER_FORM_ZORA)) &&
+ ((sp58 >= 0) && (sp54 == 0) && !(this->stateFlags1 & PLAYER_STATE1_8000000) &&
+ (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) && (this->actor.depthInWater < -30.0f))) {
+ func_80834534(play, this);
+ } else {
+ this->actor.colChkInfo.damage = 4;
+ func_80833B18(play, this, (var_v1_2 == BGCHECK_SCENE) ? 0 : 1, 4.0f, 5.0f,
+ (var_a1 != 0) ? this->actor.wallYaw : this->actor.shape.rot.y, 20);
+ return true;
+ }
+ }
+
+ //! FAKE?
+ if (0) {
+ label:
+ return false;
+ }
+
+ return true;
+}
+
+void func_80834CD0(Player* this, f32 arg1, u16 sfxId) {
+ this->actor.velocity.y = arg1 * D_8085C3E4;
+ this->actor.bgCheckFlags &= ~BGCHECKFLAG_GROUND;
+
+ if (sfxId != NA_SE_NONE) {
+ Player_AnimSfx_PlayFloorJump(this);
+ Player_AnimSfx_PlayVoice(this, sfxId);
+ }
+
+ this->stateFlags1 |= PLAYER_STATE1_40000;
+ this->fallStartHeight = this->actor.world.pos.y;
+}
+
+void func_80834D50(PlayState* play, Player* this, PlayerAnimationHeader* anim, f32 speed, u16 sfxId) {
+ Player_SetAction(play, this, func_8084C16C, 1);
+ if (anim != NULL) {
+ func_8082DB90(play, this, anim);
+ }
+ func_80834CD0(this, speed, sfxId);
+}
+
+void func_80834DB8(Player* this, PlayerAnimationHeader* anim, f32 speed, PlayState* play) {
+ func_80834D50(play, this, anim, speed, NA_SE_VO_LI_SWORD_N);
+}
+
+s32 func_80834DFC(Player* this, PlayState* play) {
+ if ((this->transformation != PLAYER_FORM_GORON) &&
+ ((this->transformation != PLAYER_FORM_DEKU) || func_801242B4(this) || (this->unk_B5C < 4)) &&
+ !(this->stateFlags1 & PLAYER_STATE1_800) && (this->unk_B5C >= 2) &&
+ (!(this->stateFlags1 & PLAYER_STATE1_8000000) || (this->wallHeight < this->ageProperties->unk_14))) {
+ s32 var_v1 = false;
+ PlayerAnimationHeader* anim;
+ f32 wallHeight;
+
+ if (func_801242B4(this)) {
+ f32 depth = (this->transformation == PLAYER_FORM_FIERCE_DEITY) ? 80.0f : 50.0f;
+
+ if (this->actor.depthInWater < depth) {
+ if ((this->unk_B5C < 2) || (this->ageProperties->unk_10 < this->wallHeight)) {
+ return false;
+ }
+ } else if ((this->currentBoots < PLAYER_BOOTS_ZORA_UNDERWATER) || (this->unk_B5C >= 3)) {
+ return false;
+ }
+ } else if (!(this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) ||
+ ((this->ageProperties->unk_14 <= this->wallHeight) && (this->stateFlags1 & PLAYER_STATE1_8000000))) {
+ return false;
+ }
+
+ if ((this->actor.wallBgId != BGCHECK_SCENE) && (sPlayerCurrentWallFlags & WALL_FLAG_6)) {
+ if (this->unk_B5D >= 6) {
+ this->stateFlags2 |= PLAYER_STATE2_4;
+ if (CHECK_BTN_ALL(sPlayerControlInput->press.button, BTN_A)) {
+ var_v1 = true;
+ }
+ }
+ } else if ((this->unk_B5D >= 6) || CHECK_BTN_ALL(sPlayerControlInput->press.button, BTN_A)) {
+ var_v1 = true;
+ }
+
+ if (var_v1) {
+ Player_SetAction(play, this, func_8084D4EC, 0);
+ wallHeight = this->wallHeight;
+
+ if (this->ageProperties->unk_14 <= wallHeight) {
+ anim = &gPlayerAnim_link_normal_250jump_start;
+ this->linearVelocity = 1.0f;
+ } else {
+ CollisionPoly* poly;
+ s32 bgId;
+ f32 wallPolyNormalX = COLPOLY_GET_NORMAL(this->actor.wallPoly->normal.x);
+ f32 wallPolyNormalZ = COLPOLY_GET_NORMAL(this->actor.wallPoly->normal.z);
+ f32 var_fv1 = this->wallDistance + 0.5f; // wallDistance
+ f32 yIntersect;
+ s32 pad;
+
+ this->stateFlags1 |= PLAYER_STATE1_4;
+
+ if (func_801242B4(this)) {
+ wallHeight -= 60.0f * this->ageProperties->unk_08;
+ anim = &gPlayerAnim_link_swimer_swim_15step_up;
+ this->stateFlags1 &= ~PLAYER_STATE1_8000000;
+ } else if (this->ageProperties->unk_18 <= wallHeight) {
+ wallHeight -= 59.0f * this->ageProperties->unk_08;
+ anim = &gPlayerAnim_link_normal_150step_up;
+ } else {
+ wallHeight -= 41.0f * this->ageProperties->unk_08;
+ anim = &gPlayerAnim_link_normal_100step_up;
+ }
+
+ this->unk_ABC -= wallHeight * 100.0f;
+
+ this->actor.world.pos.x -= var_fv1 * wallPolyNormalX;
+ this->actor.world.pos.y += this->wallHeight + 10.0f;
+ this->actor.world.pos.z -= var_fv1 * wallPolyNormalZ;
+
+ yIntersect =
+ BgCheck_EntityRaycastFloor5(&play->colCtx, &poly, &bgId, &this->actor, &this->actor.world.pos);
+ if ((this->actor.world.pos.y - yIntersect) <= 20.0f) {
+ this->actor.world.pos.y = yIntersect;
+ if (bgId != BGCHECK_SCENE) {
+ DynaPoly_SetPlayerOnTop(&play->colCtx, bgId);
+ }
+ }
+
+ func_8082DAD4(this);
+ this->actor.velocity.y = 0.0f;
+ }
+
+ this->actor.bgCheckFlags |= BGCHECKFLAG_GROUND;
+ PlayerAnimation_PlayOnceSetSpeed(play, &this->skelAnime, anim, 1.3f);
+ AnimationContext_DisableQueue(play);
+ this->actor.shape.rot.y = this->currentYaw = this->actor.wallYaw + 0x8000;
+ return true;
+ }
+ } else if ((this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) && (this->unk_B5C == 1) && (this->unk_B5D >= 3)) {
+ f32 temp = (this->wallHeight * 0.08f) + 5.5f;
+
+ func_80834DB8(this, &gPlayerAnim_link_normal_jump, temp, play);
+ this->linearVelocity = 2.5f;
+ return true;
+ }
+
+ return false;
+}
+
+void func_80835324(PlayState* play, Player* this, f32 arg2, s16 arg3) {
+ Player_SetAction(play, this, func_8084D820, 0);
+ func_8082DD2C(play, this);
+
+ this->csId = CS_ID_NONE;
+ this->unk_AE7 = 1;
+ this->unk_AE8 = 1;
+
+ this->unk_3A0.x = Math_SinS(arg3) * arg2 + this->actor.world.pos.x;
+ this->unk_3A0.z = Math_CosS(arg3) * arg2 + this->actor.world.pos.z;
+
+ Player_AnimationPlayOnce(play, this, func_8082ED20(this));
+}
+
+void func_808353DC(PlayState* play, Player* this) {
+ Player_SetAction(play, this, func_808508C8, 0);
+ func_8082E634(play, this, &gPlayerAnim_link_swimer_swim_wait);
+}
+
+s32 func_80835428(PlayState* play, Player* this) {
+ if (!func_8082DA90(play) && (this->stateFlags1 & PLAYER_STATE1_80000000)) {
+ func_80834104(play, this);
+ Player_AnimationPlayLoop(play, this, &gPlayerAnim_link_normal_landing_wait);
+ Player_AnimSfx_PlayVoice(this, NA_SE_VO_LI_FALL_S);
+ func_8019F128(NA_SE_OC_SECRET_WARP_IN);
+ return true;
+ }
+ return false;
+}
+
+/**
+ * The actual entrances each "return entrance" value can map to.
+ * This is used by scenes that are shared between locations.
+ *
+ * This 1D array is split into groups of entrances.
+ * The start of each group is indexed by `sReturnEntranceGroupIndices` values.
+ * The resulting groups are then indexed by the spawn value.
+ *
+ * The spawn value (`PlayState.curSpawn`) is set to a different value depending on the entrance used to enter the
+ * scene, which allows these dynamic "return entrances" to link back to the previous scene.
+ *
+ * Seems unused in MM
+ */
+u16 sReturnEntranceGroupData[] = {
+ // 0xFE00
+ /* 0 */ 0x1000,
+};
+
+/**
+ * The values are indices into `sReturnEntranceGroupData` marking the start of each group
+ */
+u8 sReturnEntranceGroupIndices[] = {
+ 0, // 0xFE00
+};
+
+// subfunction of OoT's func_80839034
+void func_808354A4(PlayState* play, s32 arg1, s32 arg2) {
+ play->nextEntrance = play->setupExitList[arg1];
+
+ if (play->nextEntrance == 0xFFFF) {
+ gSaveContext.respawnFlag = 4;
+ play->nextEntrance = gSaveContext.respawn[RESPAWN_MODE_UNK_3].entrance;
+ play->transitionType = TRANS_TYPE_FADE_WHITE;
+ gSaveContext.nextTransitionType = TRANS_TYPE_FADE_WHITE;
+ } else if (play->nextEntrance >= 0xFE00) {
+ play->nextEntrance =
+ sReturnEntranceGroupData[sReturnEntranceGroupIndices[play->nextEntrance - 0xFE00] + play->curSpawn];
+
+ Scene_SetExitFade(play);
+ } else {
+ if (arg2) {
+ gSaveContext.respawn[RESPAWN_MODE_DOWN].entrance = play->nextEntrance;
+ func_80169EFC(&play->state);
+ gSaveContext.respawnFlag = -2;
+ }
+
+ gSaveContext.unk_3DBB = 1;
+ Scene_SetExitFade(play);
+ }
+
+ play->transitionTrigger = TRANS_TRIGGER_START;
+}
+
+void func_808355D8(PlayState* play, Player* this, PlayerAnimationHeader* anim) {
+ func_80833AA0(this, play);
+ this->unk_AE8 = -2;
+ func_8082E5EC(play, this, anim);
+ func_8082E1F0(this, NA_SE_IT_DEKUNUTS_FLOWER_CLOSE);
+}
+
+// related to grottos (?)
+s32 func_8083562C(PlayState* play, Player* this, CollisionPoly* poly, s32 bgId) {
+ s32 var_a3;
+ FloorType floorType;
+ s32 sp34;
+ s32 sp30;
+
+ if ((this == GET_PLAYER(play)) && !(this->stateFlags1 & PLAYER_STATE1_80) && !func_8082DA90(play) &&
+ (this->csMode == PLAYER_CSMODE_0) && !(this->stateFlags1 & PLAYER_STATE1_1)) {
+ var_a3 = 0;
+ if (((poly != NULL) && (var_a3 = SurfaceType_GetSceneExitIndex(&play->colCtx, poly, bgId), (var_a3 != 0)) &&
+ (((play->sceneId != SCENE_GORONRACE) && (play->sceneId != SCENE_DEKU_KING)) || (var_a3 < 3)) &&
+ (((play->sceneId != SCENE_20SICHITAI) && (play->sceneId != SCENE_20SICHITAI2)) || (var_a3 < 0x15)) &&
+ ((play->sceneId != SCENE_11GORONNOSATO) || (var_a3 < 6))) ||
+ (func_808340D4(sPlayerCurrentFloorType) && (this->floorProperty == FLOOR_PROPERTY_12))) {
+ sp34 = this->unk_D68 - (s32)this->actor.world.pos.y;
+ if (!(this->stateFlags1 & (PLAYER_STATE1_800000 | PLAYER_STATE1_8000000 | PLAYER_STATE1_20000000)) &&
+ !(this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) && (sp34 < 400) && (D_80862B18 > 100.0f)) {
+ if ((this->floorProperty != FLOOR_PROPERTY_5) && (this->floorProperty != FLOOR_PROPERTY_12)) {
+ this->linearVelocity = 0.0f;
+ }
+
+ return false;
+ } else {
+ if (this->stateFlags3 & PLAYER_STATE3_1000000) {
+ func_808355D8(play, this, &gPlayerAnim_pn_kakkufinish);
+ }
+
+ if (var_a3 == 0) {
+ func_80169EFC(&play->state);
+ Scene_SetExitFade(play);
+ } else {
+ func_808354A4(play, var_a3 - 1,
+ SurfaceType_GetFloorEffect(&play->colCtx, poly, bgId) == FLOOR_EFFECT_2);
+ if ((this->stateFlags1 & PLAYER_STATE1_8000000) && (this->floorProperty == FLOOR_PROPERTY_5)) {
+ func_8019F128(NA_SE_OC_TUNAMI);
+ func_801A4058(5);
+ gSaveContext.seqId = (u8)NA_BGM_DISABLED;
+ gSaveContext.ambienceId = AMBIENCE_ID_DISABLED;
+ } else if (!(this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) &&
+ (this->floorProperty == FLOOR_PROPERTY_12)) {
+ func_8019F128(NA_SE_OC_SECRET_WARP_IN);
+ }
+
+ if (this->stateFlags1 & PLAYER_STATE1_800000) {
+ if (D_801BDAA0) {
+ D_801BDAA0 = false;
+ } else {
+ D_801BDA9C = true;
+ }
+ }
+ }
+
+ if (!(this->stateFlags1 & (PLAYER_STATE1_800000 | PLAYER_STATE1_8000000 | PLAYER_STATE1_20000000)) &&
+ ((floorType = SurfaceType_GetFloorType(&play->colCtx, poly, bgId)) != FLOOR_TYPE_10) &&
+ ((sp34 < 100) || (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND))) {
+ if (floorType == FLOOR_TYPE_11) {
+ func_8019F128(NA_SE_OC_SECRET_HOLE_OUT);
+ func_801A4058(5);
+ gSaveContext.seqId = (u8)NA_BGM_DISABLED;
+ gSaveContext.ambienceId = AMBIENCE_ID_DISABLED;
+ } else {
+ func_8085B74C(play);
+ }
+ } else if (!(this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
+ Player_StopHorizontalMovement(this);
+ }
+
+ Camera_ChangeSetting(Play_GetCamera(play, CAM_ID_MAIN), CAM_SET_SCENE0);
+ this->stateFlags1 |= PLAYER_STATE1_1 | PLAYER_STATE1_20000000;
+ return true;
+ }
+ } else {
+ if ((this->stateFlags1 & PLAYER_STATE1_8000000) && (this->actor.floorPoly == NULL)) {
+ BgCheck_EntityRaycastFloor7(&play->colCtx, &this->actor.floorPoly, &sp30, &this->actor,
+ &this->actor.world.pos);
+ if (this->actor.floorPoly == NULL) {
+ func_80169EFC(&play->state);
+ return false;
+ }
+ //! FAKE
+ if (1) {}
+ }
+
+ if (!(this->stateFlags1 & PLAYER_STATE1_80000000)) {
+ if (((this->actor.world.pos.y < -4000.0f) ||
+ (((this->floorProperty == FLOOR_PROPERTY_5) || (this->floorProperty == FLOOR_PROPERTY_12) ||
+ (this->floorProperty == FLOOR_PROPERTY_13)) &&
+ ((D_80862B18 < 100.0f) || (this->fallDistance > 400))))) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
+ if (this->floorProperty == FLOOR_PROPERTY_5) {
+ func_80169FDC(&play->state);
+ func_808345C8();
+ } else {
+ func_80169EFC(&play->state);
+ }
+ if (!SurfaceType_IsWallDamage(&play->colCtx, this->actor.floorPoly, this->actor.floorBgId)) {
+ gSaveContext.respawnFlag = -5;
+ }
+
+ play->transitionType = TRANS_TYPE_FADE_BLACK_FAST;
+ play_sound(NA_SE_OC_ABYSS);
+ } else {
+ if (this->stateFlags3 & PLAYER_STATE3_1000000) {
+ func_808355D8(play, this, &gPlayerAnim_pn_kakkufinish);
+ }
+
+ if (this->floorProperty == FLOOR_PROPERTY_13) {
+ Player_SetAction(play, this, func_808497A0, 0);
+ this->stateFlags1 |= PLAYER_STATE1_20000000;
+ } else {
+ func_80834104(play, this);
+ this->unk_AE8 = 9999;
+ if (this->floorProperty == FLOOR_PROPERTY_5) {
+ this->unk_AE7 = -1;
+ } else {
+ this->unk_AE7 = 1;
+ }
+ }
+ }
+ }
+ }
+
+ this->unk_D68 = this->actor.world.pos.y;
+ }
+ }
+
+ return false;
+}
+
+void Player_TranslateAndRotateY(Player* this, Vec3f* translation, Vec3f* src, Vec3f* dst) {
+ Lib_Vec3f_TranslateAndRotateY(translation, this->actor.shape.rot.y, src, dst);
+}
+
+// Player_GetPosInACertainDirectionFromARadiusAway
+void func_80835BF8(Vec3f* srcPos, s16 rotY, f32 radius, Vec3f* dstPos) {
+ dstPos->x = Math_SinS(rotY) * radius + srcPos->x;
+ dstPos->z = Math_CosS(rotY) * radius + srcPos->z;
+}
+
+Actor* Player_SpawnFairy(PlayState* play, Player* this, Vec3f* translation, Vec3f* arg3, s32 elfParams) {
+ Vec3f pos;
+
+ Player_TranslateAndRotateY(this, translation, arg3, &pos);
+
+ return Actor_Spawn(&play->actorCtx, play, ACTOR_EN_ELF, pos.x, pos.y, pos.z, 0, 0, 0, elfParams);
+}
+
+f32 func_80835CD8(PlayState* play, Player* this, Vec3f* arg2, Vec3f* pos, CollisionPoly** outPoly, s32* outBgId) {
+ Player_TranslateAndRotateY(this, &this->actor.world.pos, arg2, pos);
+ return BgCheck_EntityRaycastFloor5(&play->colCtx, outPoly, outBgId, &this->actor, pos);
+}
+
+f32 func_80835D2C(PlayState* play, Player* this, Vec3f* arg2, Vec3f* pos) {
+ CollisionPoly* poly;
+ s32 bgId;
+
+ return func_80835CD8(play, this, arg2, pos, &poly, &bgId);
+}
+
+s32 func_80835D58(PlayState* play, Player* this, Vec3f* arg2, CollisionPoly** outPoly, s32* bgId, Vec3f* posResult) {
+ Vec3f posA;
+ Vec3f posB;
+
+ posA.x = this->actor.world.pos.x;
+ posA.y = this->actor.world.pos.y + arg2->y;
+ posA.z = this->actor.world.pos.z;
+ Player_TranslateAndRotateY(this, &this->actor.world.pos, arg2, &posB);
+
+ return BgCheck_EntityLineTest2(&play->colCtx, &posA, &posB, posResult, outPoly, true, false, false, true, bgId,
+ &this->actor);
+}
+
+Vec3f D_8085D100 = { 0.0f, 50.0f, 0.0f };
+
+s32 func_80835DF8(PlayState* play, Player* this, CollisionPoly** outPoly, s32* outBgId) {
+ Vec3f pos;
+ f32 yIntersect = func_80835CD8(play, this, &D_8085D100, &pos, outPoly, outBgId);
+
+ if ((*outBgId == BGCHECK_SCENE) && (fabsf(this->actor.world.pos.y - yIntersect) < 10.0f)) {
+ func_800FAAB4(play, SurfaceType_GetLightSettingIndex(&play->colCtx, *outPoly, *outBgId));
+ return true;
+ }
+ return false;
+}
+
+/**
+ * PLAYER_DOORTYPE_STAIRCASE: DoorSpiral
+ */
+void Player_Door_Staircase(PlayState* play, Player* this, Actor* door) {
+ static Vec3f D_8085D10C = { 20.0f, 0.0f, 20.0f };
+ DoorSpiral* doorStaircase = (DoorSpiral*)door;
+
+ this->currentYaw = doorStaircase->actor.home.rot.y + 0x8000;
+ this->actor.shape.rot.y = this->currentYaw;
+ if (this->linearVelocity <= 0.0f) {
+ this->linearVelocity = 0.1f;
+ }
+ func_80835324(play, this, 50.0f, this->actor.shape.rot.y);
+
+ this->unk_397 = this->doorType;
+ this->unk_AE7 = 0;
+ this->stateFlags1 |= PLAYER_STATE1_20000000;
+ func_80835BF8(&doorStaircase->actor.world.pos, doorStaircase->actor.shape.rot.y, -140.0f, &this->unk_3A0);
+
+ D_8085D10C.x = (this->doorDirection != 0) ? -400.0f : 400.0f;
+ D_8085D10C.z = 200.0f;
+ Player_TranslateAndRotateY(this, &this->unk_3A0, &D_8085D10C, &this->unk_3AC);
+
+ doorStaircase->shouldClimb = true;
+
+ func_8082DAD4(this);
+
+ if (this->doorTimer != 0) {
+ this->unk_AE8 = 0;
+ func_8082E438(play, this, func_8082ED20(this));
+ this->skelAnime.endFrame = 0.0f;
+ } else {
+ this->linearVelocity = 0.1f;
+ }
+
+ Camera_ChangeSetting(Play_GetCamera(play, CAM_ID_MAIN), CAM_SET_SCENE0);
+ this->doorBgCamIndex =
+ play->doorCtx.transitionActorList[DOOR_GET_TRANSITION_ID(&doorStaircase->actor)].sides[0].bgCamIndex;
+ Actor_DeactivateLens(play);
+ this->floorSfxOffset = NA_SE_PL_WALK_CONCRETE - SFX_FLAG;
+}
+
+/**
+ * PLAYER_DOORTYPE_SLIDING: DoorShutter, BgOpenShutter
+ */
+void Player_Door_Sliding(PlayState* play, Player* this, Actor* door) {
+ SlidingDoorActor* doorSliding = (SlidingDoorActor*)door;
+ Vec3f sp38;
+
+ this->currentYaw = doorSliding->dyna.actor.home.rot.y;
+ if (this->doorDirection > 0) {
+ this->currentYaw -= 0x8000;
+ }
+ this->actor.shape.rot.y = this->currentYaw;
+ if (this->linearVelocity <= 0.0f) {
+ this->linearVelocity = 0.1f;
+ }
+
+ func_80835324(play, this, 50.0f, this->actor.shape.rot.y);
+ this->unk_AE7 = 0;
+ this->unk_397 = this->doorType;
+ this->stateFlags1 |= PLAYER_STATE1_20000000;
+ Actor_OffsetOfPointInActorCoords(&doorSliding->dyna.actor, &sp38, &this->actor.world.pos);
+
+ func_80835BF8(&this->actor.world.pos, doorSliding->dyna.actor.shape.rot.y,
+ (42.0f - fabsf(sp38.z)) * this->doorDirection, &this->actor.world.pos);
+ func_80835BF8(&this->actor.world.pos, doorSliding->dyna.actor.shape.rot.y, this->doorDirection * 20.0f,
+ &this->unk_3A0);
+ func_80835BF8(&this->actor.world.pos, doorSliding->dyna.actor.shape.rot.y, this->doorDirection * -120.0f,
+ &this->unk_3AC);
+
+ doorSliding->unk_15C = 1;
+ func_8082DAD4(this);
+
+ if (this->doorTimer != 0) {
+ this->unk_AE8 = 0;
+ func_8082E438(play, this, func_8082ED20(this));
+ this->skelAnime.endFrame = 0.0f;
+ } else {
+ this->linearVelocity = 0.1f;
+ }
+
+ if (doorSliding->dyna.actor.category == ACTORCAT_DOOR) {
+ this->doorBgCamIndex = play->doorCtx.transitionActorList[DOOR_GET_TRANSITION_ID(&doorSliding->dyna.actor)]
+ .sides[this->doorDirection > 0 ? 0 : 1]
+ .bgCamIndex;
+ Actor_DeactivateLens(play);
+ }
+}
+
+// sPlayerOpenDoorLeftAnimPerForm
+PlayerAnimationHeader* D_8085D118[] = {
+ &gPlayerAnim_pg_doorA_open, // PLAYER_FORM_GORON
+ &gPlayerAnim_pz_doorA_open, // PLAYER_FORM_ZORA
+ &gPlayerAnim_pn_doorA_open, // PLAYER_FORM_DEKU
+};
+// sPlayerOpenDoorRightAnimPerForm
+PlayerAnimationHeader* D_8085D124[] = {
+ &gPlayerAnim_pg_doorB_open, // PLAYER_FORM_GORON
+ &gPlayerAnim_pz_doorB_open, // PLAYER_FORM_ZORA
+ &gPlayerAnim_pn_doorB_open, // PLAYER_FORM_DEKU
+};
+
+/**
+ * PLAYER_DOORTYPE_TALKING: EnDoorEtc
+ * PLAYER_DOORTYPE_HANDLE: EnDoor
+ * PLAYER_DOORTYPE_FAKE:
+ * PLAYER_DOORTYPE_PROXIMITY: EnDoor
+ */
+void Player_Door_Knob(PlayState* play, Player* this, Actor* door) {
+ s32 temp = this->transformation - 1;
+ PlayerAnimationHeader* anim;
+ f32 temp_fv0; // sp5C
+ KnobDoorActor* doorHandle = (KnobDoorActor*)door;
+
+ doorHandle->animIndex = this->transformation;
+
+ if (this->doorDirection < 0) {
+ if (this->transformation == PLAYER_FORM_FIERCE_DEITY) {
+ anim = D_8085BE84[PLAYER_ANIMGROUP_8][this->modelAnimType];
+ } else if (this->transformation == PLAYER_FORM_HUMAN) {
+ anim = D_8085BE84[PLAYER_ANIMGROUP_9][this->modelAnimType];
+ } else {
+ anim = D_8085D118[temp];
+ }
+ } else {
+ doorHandle->animIndex += 5;
+
+ if (this->transformation == PLAYER_FORM_FIERCE_DEITY) {
+ anim = D_8085BE84[PLAYER_ANIMGROUP_10][this->modelAnimType];
+ } else if (this->transformation == PLAYER_FORM_HUMAN) {
+ anim = D_8085BE84[PLAYER_ANIMGROUP_11][this->modelAnimType];
+ } else {
+ anim = D_8085D124[temp];
+ }
+ }
+
+ Player_SetAction(play, this, func_8084E034, 0);
+ this->stateFlags2 |= PLAYER_STATE2_800000;
+ func_8082DE14(play, this);
+ if (this->doorDirection < 0) {
+ this->actor.shape.rot.y = doorHandle->dyna.actor.shape.rot.y;
+ } else {
+ this->actor.shape.rot.y = doorHandle->dyna.actor.shape.rot.y - 0x8000;
+ }
+
+ this->currentYaw = this->actor.shape.rot.y;
+ temp_fv0 = this->doorDirection * 22.0f;
+ func_80835BF8(&doorHandle->dyna.actor.world.pos, doorHandle->dyna.actor.shape.rot.y, temp_fv0,
+ &this->actor.world.pos);
+ func_8082EC9C(play, this, anim);
+
+ if (this->doorTimer != 0) {
+ this->skelAnime.endFrame = 0.0f;
+ }
+
+ func_8082DAD4(this);
+ func_8082E920(play, this,
+ ANIM_FLAG_1 | ANIM_FLAG_UPDATE_Y | ANIM_FLAG_4 | ANIM_FLAG_8 | ANIM_FLAG_80 | ANIM_FLAG_200);
+ doorHandle->playOpenAnim = true;
+ if (this->doorType != PLAYER_DOORTYPE_FAKE) {
+ CollisionPoly* poly;
+ s32 bgId;
+ Vec3f pos;
+ s32 enDoorType = ENDOOR_GET_TYPE(&doorHandle->dyna.actor);
+
+ this->stateFlags1 |= PLAYER_STATE1_20000000;
+
+ if (this->actor.category == ACTORCAT_PLAYER) {
+ Actor_DeactivateLens(play);
+ func_80835BF8(&doorHandle->dyna.actor.world.pos, doorHandle->dyna.actor.shape.rot.y, -temp_fv0, &pos);
+ pos.y = doorHandle->dyna.actor.world.pos.y + 10.0f;
+ BgCheck_EntityRaycastFloor5(&play->colCtx, &poly, &bgId, &this->actor, &pos);
+
+ if (func_8083562C(play, this, poly, BGCHECK_SCENE)) {
+ gSaveContext.entranceSpeed = 2.0f;
+ } else if (enDoorType != ENDOOR_TYPE_7) {
+ Camera* mainCam;
+
+ this->unk_AE7 = 38.0f * D_8085C3E8;
+ mainCam = Play_GetCamera(play, CAM_ID_MAIN);
+
+ Camera_ChangeDoorCam(mainCam, &doorHandle->dyna.actor,
+ play->doorCtx.transitionActorList[DOOR_GET_TRANSITION_ID(&doorHandle->dyna.actor)]
+ .sides[(this->doorDirection > 0) ? 0 : 1]
+ .bgCamIndex,
+ 0.0f, this->unk_AE7, 26.0f * D_8085C3E8, 10.0f * D_8085C3E8);
+ }
+ }
+ }
+}
+
+// door stuff
+s32 func_808365DC(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)) ||
+ ((this->doorType >= PLAYER_DOORTYPE_HANDLE) && CutsceneManager_IsNext(CS_ID_GLOBAL_DOOR))) &&
+ (!(this->stateFlags1 & PLAYER_STATE1_800) &&
+ (CHECK_BTN_ALL(sPlayerControlInput->press.button, BTN_A) || (func_8085437C == this->actionFunc) ||
+ (this->doorType == PLAYER_DOORTYPE_STAIRCASE) || (this->doorType == PLAYER_DOORTYPE_PROXIMITY))))) {
+ Actor* doorActor = this->doorActor;
+ Actor* var_v0_3;
+
+ if (this->doorType <= PLAYER_DOORTYPE_TALKING) {
+ Player_TalkWithPlayer(play, doorActor);
+ if (doorActor->textId == 0x1821) {
+ doorActor->flags |= ACTOR_FLAG_TALK_REQUESTED;
+ }
+ return true;
+ }
+
+ gSaveContext.respawn[RESPAWN_MODE_DOWN].data = 0;
+
+ if (this->doorType == PLAYER_DOORTYPE_STAIRCASE) {
+ Player_Door_Staircase(play, this, doorActor);
+ } else if (this->doorType == PLAYER_DOORTYPE_SLIDING) {
+ Player_Door_Sliding(play, this, doorActor);
+ } else {
+ Player_Door_Knob(play, this, doorActor);
+ }
+
+ if (this->actor.category == ACTORCAT_PLAYER) {
+ this->csId = CS_ID_GLOBAL_DOOR;
+ CutsceneManager_Start(this->csId, &this->actor);
+ }
+
+ if (this->actor.category == ACTORCAT_PLAYER) {
+ if ((this->doorType < PLAYER_DOORTYPE_FAKE) && (doorActor->category == ACTORCAT_DOOR) &&
+ ((this->doorType != PLAYER_DOORTYPE_HANDLE) || (ENDOOR_GET_TYPE(doorActor) != ENDOOR_TYPE_7))) {
+ s8 roomNum = play->doorCtx.transitionActorList[DOOR_GET_TRANSITION_ID(doorActor)]
+ .sides[(this->doorDirection > 0) ? 0 : 1]
+ .room;
+
+ if ((roomNum >= 0) && (roomNum != play->roomCtx.curRoom.num)) {
+ Room_StartRoomTransition(play, &play->roomCtx, roomNum);
+ }
+ }
+ }
+
+ doorActor->room = play->roomCtx.curRoom.num;
+ if (((var_v0_3 = doorActor->child) != NULL) || ((var_v0_3 = doorActor->parent) != NULL)) {
+ var_v0_3->room = play->roomCtx.curRoom.num;
+ }
+ return true;
+ }
+ }
+
+ return false;
+}
+
+void func_80836888(Player* this, PlayState* play) {
+ PlayerAnimationHeader* anim;
+
+ Player_SetAction(play, this, func_80849A9C, 1);
+
+ if (this->unk_B40 < 0.5f) {
+ anim = func_8082EF54(this);
+ this->unk_B40 = 0.0f;
+ } else {
+ anim = func_8082EF9C(this);
+ this->unk_B40 = 1.0f;
+ }
+
+ this->unk_B44 = this->unk_B40;
+ Player_AnimationPlayLoop(play, this, anim);
+ this->currentYaw = this->actor.shape.rot.y;
+}
+
+void func_8083692C(Player* this, PlayState* play) {
+ Player_SetAction(play, this, func_80849DD0, 1);
+ func_8082E438(play, this, func_8082ED20(this));
+ this->currentYaw = this->actor.shape.rot.y;
+}
+
+void func_80836988(Player* this, PlayState* play) {
+ if (func_80123420(this)) {
+ func_80836888(this, play);
+ } else if (func_80123434(this)) {
+ func_8083692C(this, play);
+ } else {
+ func_8085B384(this, play);
+ }
+}
+
+void func_808369F4(Player* this, PlayState* play) {
+ PlayerActionFunc actionFunc;
+
+ if (func_80123420(this)) {
+ actionFunc = func_80849A9C;
+ } else if (func_80123434(this)) {
+ actionFunc = func_80849DD0;
+ } else {
+ actionFunc = func_80849FE0;
+ }
+ Player_SetAction(play, this, actionFunc, 1);
+}
+
+void func_80836A5C(Player* this, PlayState* play) {
+ func_808369F4(this, play);
+ if (func_80123420(this)) {
+ this->unk_AE8 = 1;
+ }
+}
+
+void func_80836A98(Player* this, PlayerAnimationHeader* anim, PlayState* play) {
+ func_80836A5C(this, play);
+ func_8082EC9C(play, this, anim);
+}
+
+void func_80836AD8(PlayState* play, Player* this) {
+ Player_SetAction(play, this, func_80857BE8, 0);
+ this->unk_B28 = 0;
+ this->unk_B86[1] = 0;
+ this->unk_AF0[0].x = 0.0f;
+ this->unk_AF0[0].y = 0.0f;
+ this->unk_AF0[0].z = 0.0f;
+ this->unk_B08 = 0.0f;
+ this->unk_B0C = 0.0f;
+ Player_PlaySfx(this, NA_SE_PL_GORON_TO_BALL);
+}
+
+void func_80836B3C(PlayState* play, Player* this, f32 arg2) {
+ this->currentYaw = this->actor.shape.rot.y;
+ this->actor.world.rot.y = this->actor.shape.rot.y;
+
+ if (this->transformation == PLAYER_FORM_GORON) {
+ func_80836AD8(play, this);
+ PlayerAnimation_Change(play, &this->skelAnime, D_8085BE84[PLAYER_ANIMGROUP_15][this->modelAnimType],
+ 1.5f * D_8085C3E4, 0.0f, 6.0f, ANIMMODE_ONCE, 0.0f);
+ } else {
+ PlayerAnimationHeader* anim = D_8085BE84[PLAYER_ANIMGROUP_15][this->modelAnimType];
+
+ Player_SetAction(play, this, func_8084C6EC, 0);
+ PlayerAnimation_Change(play, &this->skelAnime, anim, 1.25f * D_8085C3E4, arg2, Animation_GetLastFrame(anim),
+ ANIMMODE_ONCE, 0.0f);
+ }
+}
+
+void func_80836C70(PlayState* play, Player* this, PlayerBodyPart bodyPartIndex) {
+ static Vec3f D_8085D130 = { 0, 0, 0 };
+ s32 i;
+
+ for (i = 0; i < 4; i++) {
+ Vec3f velocity;
+
+ velocity.x = randPlusMinusPoint5Scaled(4.0f);
+ velocity.y = Rand_ZeroFloat(2.0f);
+ velocity.z = randPlusMinusPoint5Scaled(4.0f);
+ D_8085D130.y = -0.2f;
+ EffectSsHahen_Spawn(play, &this->bodyPartsPos[bodyPartIndex], &velocity, &D_8085D130, 0, 10, OBJECT_LINK_NUTS,
+ 16, object_link_nuts_DL_008860);
+ }
+}
+
+void func_80836D8C(Player* this) {
+ this->actor.focus.rot.x = 0;
+ this->actor.focus.rot.z = 0;
+ this->headLimbRot.x = 0;
+ this->headLimbRot.y = 0;
+ this->headLimbRot.z = 0;
+ this->upperLimbRot.x = 0;
+ this->upperLimbRot.y = 0;
+ this->upperLimbRot.z = 0;
+ this->actor.shape.rot.y = this->actor.focus.rot.y;
+ this->currentYaw = this->actor.focus.rot.y;
+}
+
+s32 func_80836DC0(PlayState* play, Player* this) {
+ if ((MREG(48) != 0) || func_800C9DDC(&play->colCtx, this->actor.floorPoly, this->actor.floorBgId)) {
+ Player_SetAction(play, this, func_808561B0, 0);
+ this->stateFlags1 &= ~(PLAYER_STATE1_20000 | PLAYER_STATE1_40000000);
+ func_8082E438(play, this, &gPlayerAnim_pn_attack);
+ Player_StopHorizontalMovement(this);
+ func_80836D8C(this);
+ this->actor.shape.shadowDraw = ActorShadow_DrawCircle;
+ this->unk_B48 = -2000.0f;
+ this->actor.shape.shadowScale = 13.0f;
+ func_8082E1F0(this, NA_SE_PL_DEKUNUTS_IN_GRD);
+ return true;
+ }
+
+ return false;
+}
+
+void Player_RequestQuake(PlayState* play, u16 speed, s16 y, s16 duration) {
+ s16 quakeIndex = Quake_Request(Play_GetCamera(play, CAM_ID_MAIN), QUAKE_TYPE_3);
+
+ Quake_SetSpeed(quakeIndex, speed);
+ Quake_SetPerturbations(quakeIndex, y, 0, 0, 0);
+ Quake_SetDuration(quakeIndex, duration);
+}
+
+FallImpactInfo sFallImpactInfos[] = {
+ { -8, 180, 40, 100, NA_SE_VO_LI_LAND_DAMAGE_S },
+ { -16, 255, 140, 150, NA_SE_VO_LI_LAND_DAMAGE_S },
+};
+
+// Player_FallAgainstTheFloor, Player_LetTheBodiesHitTheFloor, Player_ImpactFloor, Player_ProcessFallDamage,
+// Player_DamageOnFloorImpact, Player_CalculateFallDamage
+s32 func_80836F10(PlayState* play, Player* this) {
+ s32 fallDistance;
+
+ if ((sPlayerCurrentFloorType == FLOOR_TYPE_6) || (sPlayerCurrentFloorType == FLOOR_TYPE_9) ||
+ (this->csMode != PLAYER_CSMODE_0)) {
+ fallDistance = 0;
+ } else {
+ fallDistance = this->fallDistance;
+ }
+
+ Math_StepToF(&this->linearVelocity, 0.0f, 1.0f);
+ this->stateFlags1 &= ~(PLAYER_STATE1_40000 | PLAYER_STATE1_80000);
+
+ // Height enough for fall damage
+ if (fallDistance >= 400) {
+ s32 index;
+ FallImpactInfo* entry;
+
+ if (this->fallDistance < 800) {
+ // small fall
+ index = 0;
+ } else {
+ // big fall
+ index = 1;
+ }
+
+ Player_PlaySfx(this, NA_SE_PL_BODY_HIT);
+
+ entry = &sFallImpactInfos[index];
+ Player_AnimSfx_PlayVoice(this, entry->sfxId);
+
+ if (Player_InflictDamage(play, entry->damage)) {
+ // Player's dead
+ return -1;
+ }
+
+ func_80833998(this, 40);
+ Player_RequestQuake(play, 32967, 2, 30);
+ Player_RequestRumble(play, this, entry->sourceIntensity, entry->decayTimer, entry->decayStep, SQ(0));
+
+ return index + 1;
+ }
+
+ // Tiny fall, won't damage player
+ if (fallDistance > 200) {
+ fallDistance = fallDistance * 2;
+ fallDistance = CLAMP_MAX(fallDistance, 255);
+
+ Player_RequestRumble(play, this, fallDistance, fallDistance * 0.1f, fallDistance, SQ(0));
+ if (sPlayerCurrentFloorType == FLOOR_TYPE_6) {
+ //! @bug unreachable code: When sPlayerCurrentFloorType is equal to FLOOR_TYPE_6 then fallDistance is
+ //! ignored (set to zero), so the previous check based on said variable will always fail, producing this
+ //! current check to always be false.
+ Player_AnimSfx_PlayVoice(this, NA_SE_VO_LI_CLIMB_END);
+ }
+ }
+
+ Player_AnimSfx_PlayFloorLand(this);
+ return 0;
+}
+
+s32 func_808370D4(PlayState* play, Player* this) {
+ if ((this->fallDistance < 800) && (this->unk_AE3[this->unk_ADE] == 0) && !(this->stateFlags1 & PLAYER_STATE1_800)) {
+ func_80836B3C(play, this, 0.0f);
+
+ return true;
+ }
+ return false;
+}
+
+void func_80837134(PlayState* play, Player* this) {
+ PlayerAnimationHeader* anim = D_8085BE84[PLAYER_ANIMGROUP_13][this->modelAnimType];
+ s32 temp_v0_2; // sp28
+
+ this->stateFlags1 &= ~(PLAYER_STATE1_40000 | PLAYER_STATE1_80000);
+
+ if (this->transformation == PLAYER_FORM_DEKU) {
+ s32 var_v1 = false;
+
+ if ((this->skelAnime.animation == &gPlayerAnim_pn_rakkafinish) ||
+ (this->skelAnime.animation == &gPlayerAnim_pn_kakkufinish)) {
+ func_80836C70(play, this, PLAYER_BODYPART_LEFT_HAND);
+ func_80836C70(play, this, PLAYER_BODYPART_RIGHT_HAND);
+ var_v1 = true;
+ }
+
+ if (CHECK_BTN_ALL(sPlayerControlInput->cur.button, BTN_A) && func_80836DC0(play, this)) {
+ return;
+ }
+
+ if (var_v1) {
+ func_80836A98(this, anim, play);
+ Player_AnimSfx_PlayFloorLand(this);
+ return;
+ }
+ } else if (this->stateFlags2 & PLAYER_STATE2_80000) {
+ if (func_80123420(this)) {
+ anim = D_8085C2A4[this->unk_AE7].unk_8;
+ } else {
+ anim = D_8085C2A4[this->unk_AE7].unk_4;
+ }
+ } else if (this->skelAnime.animation == &gPlayerAnim_link_normal_run_jump) {
+ anim = &gPlayerAnim_link_normal_run_jump_end;
+ } else if (func_80123420(this)) {
+ anim = &gPlayerAnim_link_anchor_landingR;
+ func_8082FC60(this);
+ } else if (this->fallDistance <= 80) {
+ anim = D_8085BE84[PLAYER_ANIMGROUP_14][this->modelAnimType];
+ } else if (func_808370D4(play, this)) {
+ return;
+ }
+
+ temp_v0_2 = func_80836F10(play, this);
+ if (temp_v0_2 > 0) { // Player suffered damage because of this fall
+ func_80836A98(this, D_8085BE84[PLAYER_ANIMGROUP_13][this->modelAnimType], play);
+ this->skelAnime.endFrame = 8.0f;
+
+ if (temp_v0_2 == 1) {
+ this->unk_AE8 = 0xA;
+ } else {
+ this->unk_AE8 = 0x14;
+ }
+ } else if (temp_v0_2 == 0) {
+ func_80836A98(this, anim, play);
+ }
+}
+
+void func_808373A4(PlayState* play, Player* this) {
+ func_8082E438(play, this, &gPlayerAnim_pn_attack);
+ this->unk_B10[0] = 20000.0f;
+ this->unk_B10[1] = 0x30000;
+ Player_PlaySfx(this, NA_SE_PL_DEKUNUTS_ATTACK);
+}
+
+s32 func_808373F8(PlayState* play, Player* this, u16 sfxId) {
+ PlayerAnimationHeader* anim;
+ f32 speed;
+ s16 yawDiff = this->currentYaw - this->actor.shape.rot.y;
+
+ if ((IREG(66) / 100.0f) < this->linearVelocity) {
+ speed = IREG(67) / 100.0f;
+ } else {
+ speed = (IREG(68) / 100.0f + (IREG(69) * this->linearVelocity) / 1000.0f);
+
+ if ((this->transformation == PLAYER_FORM_DEKU) && (speed < 8.0f)) {
+ speed = 8.0f;
+ } else if (speed < 5.0f) {
+ speed = 5.0f;
+ }
+ }
+
+ if ((ABS_ALT(yawDiff) >= 0x1000) || (this->linearVelocity <= 4.0f)) {
+ anim = &gPlayerAnim_link_normal_jump;
+ } else {
+ s32 var_v1;
+
+ if ((this->transformation != PLAYER_FORM_DEKU) &&
+ (((sPlayerPrevFloorProperty == FLOOR_PROPERTY_1)) || (sPlayerPrevFloorProperty == FLOOR_PROPERTY_2))) {
+ if (sPlayerPrevFloorProperty == FLOOR_PROPERTY_1) {
+ var_v1 = 4;
+ } else {
+ var_v1 = 5;
+ }
+
+ func_80834D50(play, this, D_8085C2A4[var_v1].unk_0, speed, ((var_v1 == 4) ? NA_SE_VO_LI_SWORD_N : sfxId));
+ this->unk_AE8 = -1;
+ this->stateFlags2 |= PLAYER_STATE2_80000;
+ this->unk_AE7 = var_v1;
+ return true;
+ }
+ anim = &gPlayerAnim_link_normal_run_jump;
+ }
+
+ // Deku hopping
+ if (this->transformation == PLAYER_FORM_DEKU) {
+ speed *= 0.3f + ((5 - this->remainingHopsCounter) * 0.18f);
+ if (speed < 4.0f) {
+ speed = 4.0f;
+ }
+
+ if ((this->actor.depthInWater > 0.0f) && (this->remainingHopsCounter != 0)) {
+ this->actor.world.pos.y += this->actor.depthInWater;
+ func_80834D50(play, this, anim, speed, NA_SE_NONE);
+ this->unk_AE8 = 1;
+ this->stateFlags3 |= PLAYER_STATE3_200000;
+ Player_PlaySfx(this, (NA_SE_PL_DEKUNUTS_JUMP5 + 1 - this->remainingHopsCounter));
+ Player_AnimSfx_PlayVoice(this, sfxId);
+ this->remainingHopsCounter--;
+ if (this->remainingHopsCounter == 0) {
+ this->stateFlags2 |= PLAYER_STATE2_80000;
+ func_808373A4(play, this);
+ }
+
+ return true;
+ }
+
+ if (this->actor.velocity.y > 0.0f) {
+ sfxId = NA_SE_NONE;
+ }
+ }
+
+ func_80834D50(play, this, anim, speed, sfxId);
+ this->unk_AE8 = 1;
+
+ return true;
+}
+
+s32 func_80837730(PlayState* play, Player* this, f32 arg2, s32 scale) {
+ f32 sp3C = fabsf(arg2);
+
+ if (sp3C > 2.0f) {
+ WaterBox* waterBox;
+ f32 sp34;
+ Vec3f pos;
+
+ Math_Vec3f_Copy(&pos, &this->bodyPartsPos[PLAYER_BODYPART_WAIST]);
+ pos.y += 20.0f;
+ if (WaterBox_GetSurface1(play, &play->colCtx, pos.x, pos.z, &pos.y, &waterBox)) {
+ sp34 = pos.y - this->bodyPartsPos[PLAYER_BODYPART_LEFT_FOOT].y;
+ if ((sp34 > -2.0f) && (sp34 < 100.0f)) {
+ EffectSsGSplash_Spawn(play, &pos, NULL, NULL,
+ (sp3C <= 10.0f) ? EFFSSGSPLASH_TYPE_0 : EFFSSGSPLASH_TYPE_1, scale);
+ return true;
+ }
+ }
+ }
+
+ return false;
+}
+
+s32 func_8083784C(Player* this) {
+ if (this->actor.velocity.y < 0.0f) {
+ if ((this->actor.depthInWater > 0.0f) &&
+ ((this->ageProperties->unk_2C - this->actor.depthInWater) < D_80862B18)) {
+ if ((this->remainingHopsCounter != 0) && (gSaveContext.save.saveInfo.playerData.health != 0) &&
+ !(this->stateFlags1 & PLAYER_STATE1_4000000)) {
+ if (((this->talkActor == NULL) || !(this->talkActor->flags & ACTOR_FLAG_10000))) {
+ return true;
+ }
+ }
+ }
+ }
+
+ return false;
+}
+
+void func_808378FC(PlayState* play, Player* this) {
+ if (!func_8082FC24(this)) {
+ this->stateFlags2 |= PLAYER_STATE2_20;
+ }
+
+ if (func_8083784C(this) && func_808373F8(play, this, NA_SE_VO_LI_AUTO_JUMP)) {
+ func_80837730(play, this, 20.0f, this->actor.velocity.y * 50.0f);
+ }
+}
+
+s32 func_8083798C(Player* this) {
+ return (this->interactRangeActor != NULL) && (this->heldActor == NULL) &&
+ (this->transformation != PLAYER_FORM_DEKU);
+}
+
+void func_808379C0(PlayState* play, Player* this) {
+ if (func_8083798C(this)) {
+ Actor* interactRangeActor = this->interactRangeActor;
+ PlayerAnimationHeader* anim;
+
+ if ((interactRangeActor->id == ACTOR_EN_ISHI) && (ENISHI_GET_1(interactRangeActor) != 0)) {
+ Player_SetAction(play, this, func_8084E334, 0);
+ anim = &gPlayerAnim_link_silver_carry;
+ } else if (((interactRangeActor->id == ACTOR_EN_BOMBF) || (interactRangeActor->id == ACTOR_EN_KUSA) ||
+ (interactRangeActor->id == ACTOR_EN_KUSA2) || (interactRangeActor->id == ACTOR_OBJ_GRASS_CARRY)) &&
+ (Player_GetStrength() <= PLAYER_STRENGTH_DEKU)) {
+ Player_SetAction(play, this, func_8084E4E4, 0);
+ anim = &gPlayerAnim_link_normal_nocarry_free;
+
+ this->actor.world.pos.x =
+ (Math_SinS(interactRangeActor->yawTowardsPlayer) * 20.0f) + interactRangeActor->world.pos.x;
+ this->actor.world.pos.z =
+ (Math_CosS(interactRangeActor->yawTowardsPlayer) * 20.0f) + interactRangeActor->world.pos.z;
+
+ this->currentYaw = this->actor.shape.rot.y = interactRangeActor->yawTowardsPlayer + 0x8000;
+ } else {
+ Player_SetAction(play, this, func_8084E25C, 0);
+ anim = D_8085BE84[PLAYER_ANIMGROUP_12][this->modelAnimType];
+ }
+
+ Player_AnimationPlayOnce(play, this, anim);
+ } else {
+ func_80836988(this, play);
+ this->stateFlags1 &= ~PLAYER_STATE1_800;
+ }
+}
+
+void func_80837B60(PlayState* play, Player* this) {
+ func_8083172C(play, this, func_8084E980, 0);
+
+ this->exchangeItemId = PLAYER_IA_NONE;
+ this->stateFlags1 |= (PLAYER_STATE1_40 | PLAYER_STATE1_20000000);
+ if (this->actor.textId != 0) {
+ Message_StartTextbox(play, this->actor.textId, this->talkActor);
+ }
+ this->targetedActor = this->talkActor;
+}
+
+void func_80837BD0(PlayState* play, Player* this) {
+ func_8083172C(play, this, func_8084FE7C, 0);
+}
+
+void func_80837BF8(PlayState* play, Player* this) {
+ Player_SetAction(play, this, func_8084ED9C, 0);
+}
+
+void func_80837C20(PlayState* play, Player* this) {
+ s32 sp1C = this->unk_AE8;
+ s32 sp18 = this->unk_AE7;
+
+ func_8083172C(play, this, func_8084F4E8, 0);
+ this->actor.velocity.y = 0.0f;
+
+ this->unk_AE8 = sp1C;
+ this->unk_AE7 = sp18;
+}
+
+void func_80837C78(PlayState* play, Player* this) {
+ func_8083172C(play, this, func_80852C04, 0);
+ this->stateFlags1 |= (PLAYER_STATE1_400 | PLAYER_STATE1_20000000);
+
+ if (this->getItemId == GI_HEART_CONTAINER) {
+ this->unk_AE8 = 20;
+ } else if (this->getItemId >= GI_NONE) {
+ this->unk_AE8 = 1;
+ } else {
+ this->getItemId = -this->getItemId;
+ }
+}
+
+void func_80837CEC(PlayState* play, Player* this, CollisionPoly* arg2, f32 arg3, PlayerAnimationHeader* anim) {
+ f32 nx = COLPOLY_GET_NORMAL(arg2->normal.x);
+ f32 nz = COLPOLY_GET_NORMAL(arg2->normal.z);
+
+ Player_SetAction(play, this, func_8084F1B8, 0);
+ func_8082DE50(play, this);
+ Player_AnimationPlayOnce(play, this, anim);
+
+ this->actor.world.pos.x -= (arg3 + 1.0f) * nx;
+ this->actor.world.pos.z -= (arg3 + 1.0f) * nz;
+ this->actor.shape.rot.y = Math_Atan2S_XY(nz, nx);
+ this->currentYaw = this->actor.shape.rot.y;
+
+ func_8082DAD4(this);
+ this->actor.velocity.y = 0.0f;
+ func_8082E6D0(this);
+}
+
+s32 func_80837DEC(Player* this, PlayState* play) {
+ if ((this->transformation != PLAYER_FORM_GORON) && (this->transformation != PLAYER_FORM_DEKU) &&
+ (this->actor.depthInWater < -80.0f)) {
+ if ((ABS_ALT(this->unk_B6C)) < 0xAAA && (ABS_ALT(this->unk_B6E) < 0xAAA)) {
+ CollisionPoly* entityPoly;
+ CollisionPoly* sp90;
+ s32 entityBgId;
+ s32 sp88;
+ Vec3f sp7C;
+ Vec3f sp70;
+ f32 temp_fv1_2;
+ f32 entityNormalX;
+ f32 entityNormalY;
+ f32 entityNormalZ;
+ f32 temp_fv0_2;
+ f32 var_fv1;
+
+ sp7C.x = this->actor.prevPos.x - this->actor.world.pos.x;
+ sp7C.z = this->actor.prevPos.z - this->actor.world.pos.z;
+
+ var_fv1 = sqrtf(SQXZ(sp7C));
+ if (var_fv1 != 0.0f) {
+ var_fv1 = 5.0f / var_fv1;
+ } else {
+ var_fv1 = 0.0f;
+ }
+
+ sp7C.x = this->actor.prevPos.x + (sp7C.x * var_fv1);
+ sp7C.y = this->actor.world.pos.y;
+ sp7C.z = this->actor.prevPos.z + (sp7C.z * var_fv1);
+
+ if (BgCheck_EntityLineTest2(&play->colCtx, &this->actor.world.pos, &sp7C, &sp70, &entityPoly, true, false,
+ false, true, &entityBgId, &this->actor)) {
+ if (ABS_ALT(entityPoly->normal.y) < 0x258) {
+ s32 var_v1_2; // sp54
+
+ entityNormalX = COLPOLY_GET_NORMAL(entityPoly->normal.x);
+ entityNormalY = COLPOLY_GET_NORMAL(entityPoly->normal.y);
+ entityNormalZ = COLPOLY_GET_NORMAL(entityPoly->normal.z);
+
+ temp_fv0_2 = Math3D_UDistPlaneToPos(entityNormalX, entityNormalY, entityNormalZ, entityPoly->dist,
+ &this->actor.world.pos);
+
+ sp70.x = this->actor.world.pos.x - ((temp_fv0_2 + 1.0f) * entityNormalX);
+ sp70.z = this->actor.world.pos.z - ((temp_fv0_2 + 1.0f) * entityNormalZ);
+ sp70.y = this->actor.world.pos.y + 268 * 0.1f;
+
+ temp_fv1_2 = this->actor.world.pos.y -
+ BgCheck_EntityRaycastFloor5(&play->colCtx, &sp90, &sp88, &this->actor, &sp70);
+ if ((temp_fv1_2 >= -11.0f) && (temp_fv1_2 <= 0.0f)) {
+ var_v1_2 = sPlayerPrevFloorProperty == FLOOR_PROPERTY_6;
+ if (!var_v1_2) {
+ if (SurfaceType_GetWallFlags(&play->colCtx, entityPoly, entityBgId) & WALL_FLAG_3) {
+ var_v1_2 = true;
+ }
+ }
+
+ func_80837CEC(play, this, entityPoly, temp_fv0_2,
+ var_v1_2 ? &gPlayerAnim_link_normal_Fclimb_startB
+ : &gPlayerAnim_link_normal_fall);
+ if (var_v1_2) {
+ func_80832558(play, this, func_80837C20);
+
+ this->actor.shape.rot.y = this->currentYaw += 0x8000;
+ this->stateFlags1 |= PLAYER_STATE1_200000;
+ func_8082E920(play, this,
+ ANIM_FLAG_1 | ANIM_FLAG_UPDATE_Y | ANIM_FLAG_4 | ANIM_FLAG_8 |
+ ANIM_FLAG_NOMOVE | ANIM_FLAG_80);
+ this->unk_AE8 = -1;
+ this->unk_AE7 = var_v1_2;
+ } else {
+ this->stateFlags1 |= PLAYER_STATE1_2000;
+ this->stateFlags1 &= ~PLAYER_STATE1_20000;
+ }
+
+ Player_PlaySfx(this, NA_SE_PL_SLIPDOWN);
+ Player_AnimSfx_PlayVoice(this, NA_SE_VO_LI_HANG);
+ return true;
+ }
+ }
+ }
+ }
+ }
+
+ return false;
+}
+
+void func_808381A0(Player* this, PlayerAnimationHeader* anim, PlayState* play) {
+ Player_SetAction(play, this, func_8084F3DC, 0);
+ PlayerAnimation_PlayOnceSetSpeed(play, &this->skelAnime, anim, 1.3f);
+}
+
+Vec3f D_8085D148 = { 0.0f, 50.0f, 0.0f };
+
+s32 func_808381F8(PlayState* play, Player* this) {
+ CollisionPoly* poly;
+ s32 bgId;
+ Vec3f pos;
+ f32 yIntersect;
+
+ Player_TranslateAndRotateY(this, &this->actor.prevPos, &D_8085D148, &pos);
+
+ yIntersect = BgCheck_EntityRaycastFloor5(&play->colCtx, &poly, &bgId, &this->actor, &pos);
+
+ return fabsf(yIntersect - this->actor.world.pos.y) < 10.0f;
+}
+
+Vec3f D_8085D154 = { 0.0f, 0.0f, 100.0f };
+
+void func_8083827C(Player* this, PlayState* play) {
+ s32 temp_t0; // sp64
+ CollisionPoly* sp60;
+ s32 sp5C;
+ WaterBox* sp58;
+ Vec3f sp4C;
+ f32 sp48;
+ f32 sp44;
+
+ this->fallDistance = this->fallStartHeight - (s32)this->actor.world.pos.y;
+ if (!(this->stateFlags1 & (PLAYER_STATE1_8000000 | PLAYER_STATE1_20000000)) &&
+ ((this->stateFlags1 & PLAYER_STATE1_80000000) ||
+ !(this->stateFlags3 & (PLAYER_STATE3_200 | PLAYER_STATE3_2000))) &&
+ !(this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
+ if (func_80835428(play, this)) {
+ return;
+ }
+
+ if (sPlayerPrevFloorProperty == FLOOR_PROPERTY_8) {
+ this->actor.world.pos.x = this->actor.prevPos.x;
+ this->actor.world.pos.z = this->actor.prevPos.z;
+ return;
+ }
+
+ if ((this->stateFlags3 & PLAYER_STATE3_2) || (this->skelAnime.moveFlags & ANIM_FLAG_80)) {
+ return;
+ }
+
+ if ((func_8084C16C == this->actionFunc) || (func_8084C94C == this->actionFunc) ||
+ (func_8084CA24 == this->actionFunc) || (func_80857BE8 == this->actionFunc) ||
+ (func_808546D0 == this->actionFunc) || (func_80854800 == this->actionFunc)) {
+ return;
+ }
+
+ if ((sPlayerPrevFloorProperty == FLOOR_PROPERTY_7) || (this->meleeWeaponState != PLAYER_MELEE_WEAPON_STATE_0) ||
+ ((this->skelAnime.moveFlags & ANIM_FLAG_8) && func_808381F8(play, this))) {
+ Math_Vec3f_Copy(&this->actor.world.pos, &this->actor.prevPos);
+ if (this->linearVelocity > 0.0f) {
+ Player_StopHorizontalMovement(this);
+ }
+ this->actor.bgCheckFlags |= BGCHECKFLAG_GROUND_TOUCH;
+ return;
+ }
+
+ temp_t0 = BINANG_SUB(this->currentYaw, this->actor.shape.rot.y);
+ Player_SetAction(play, this, func_8084C16C, 1);
+ func_8082DD2C(play, this);
+
+ this->floorSfxOffset = this->unk_D66;
+ if ((this->transformation != PLAYER_FORM_GORON) &&
+ ((this->transformation != PLAYER_FORM_DEKU) || (this->remainingHopsCounter != 0)) &&
+ (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND_LEAVE)) {
+ if (!(this->stateFlags1 & PLAYER_STATE1_8000000)) {
+ if ((sPlayerPrevFloorProperty != FLOOR_PROPERTY_6) && (sPlayerPrevFloorProperty != FLOOR_PROPERTY_9) &&
+ (D_80862B18 > 20.0f) && (this->meleeWeaponState == PLAYER_MELEE_WEAPON_STATE_0)) {
+ if ((ABS_ALT(temp_t0) < 0x2000) && (this->linearVelocity > 3.0f)) {
+ if (!(this->stateFlags1 & PLAYER_STATE1_800)) {
+ if (((this->transformation == PLAYER_FORM_ZORA) &&
+ CHECK_BTN_ALL(sPlayerControlInput->cur.button, BTN_A)) ||
+ ((sPlayerPrevFloorProperty == FLOOR_PROPERTY_11) &&
+ (this->transformation != PLAYER_FORM_GORON) &&
+ (this->transformation != PLAYER_FORM_DEKU))) {
+
+ sp48 = func_80835CD8(play, this, &D_8085D154, &sp4C, &sp60, &sp5C);
+ sp44 = this->actor.world.pos.y;
+
+ if (WaterBox_GetSurface1(play, &play->colCtx, sp4C.x, sp4C.z, &sp44, &sp58) &&
+ ((sp44 - sp48) > 50.0f)) {
+ func_80834DB8(this, &gPlayerAnim_link_normal_run_jump_water_fall, 6.0f, play);
+ Player_SetAction(play, this, func_8084C94C, 0);
+ return;
+ }
+ }
+ }
+ func_808373F8(play, this, NA_SE_VO_LI_AUTO_JUMP);
+ return;
+ }
+ }
+ }
+ }
+
+ // Checking if the ledge is tall enough for Player to hang from
+ if ((sPlayerPrevFloorProperty == FLOOR_PROPERTY_9) || (D_80862B18 <= this->ageProperties->unk_34) ||
+ !func_80837DEC(this, play)) {
+ Player_AnimationPlayLoop(play, this, &gPlayerAnim_link_normal_landing_wait);
+ }
+ } else {
+ this->fallStartHeight = this->actor.world.pos.y;
+ this->remainingHopsCounter = 5;
+ }
+}
+
+s32 func_8083868C(PlayState* play, Player* this) {
+ s32 camMode;
+ Camera* camera;
+
+ if (this->unk_AA5 == PLAYER_UNKAA5_3) {
+ if (func_800B7118(this)) {
+ if (this->transformation == PLAYER_FORM_HUMAN) {
+ camMode = CAM_MODE_SLINGSHOT;
+ } else if (this->transformation == PLAYER_FORM_DEKU) {
+ camMode = CAM_MODE_DEKUSHOOT;
+ } else {
+ camMode = CAM_MODE_BOWARROW;
+ }
+ } else {
+ camMode = CAM_MODE_ZORAFIN;
+ }
+ } else {
+ camMode = CAM_MODE_FIRSTPERSON;
+ }
+
+ camera = (this->actor.id == ACTOR_PLAYER) ? Play_GetCamera(play, CAM_ID_MAIN)
+ : Play_GetCamera(play, ((EnTest3*)this)->subCamId);
+
+ return Camera_ChangeMode(camera, camMode);
+}
+
+void Player_StopCutscene(Player* this) {
+ if (this->csId > CS_ID_NONE) {
+ CutsceneManager_Stop(this->csId);
+ this->csId = CS_ID_NONE;
+ }
+}
+
+s32 func_808387A0(PlayState* play, Player* this) {
+ if (this->unk_AA5 == PLAYER_UNKAA5_4) {
+ Player_StopCutscene(this);
+ this->actor.flags &= ~ACTOR_FLAG_TALK_REQUESTED;
+ Player_SetAction(play, this, func_8085B08C, 0);
+ if (this->doorBgCamIndex != 0) {
+ this->stateFlags1 |= PLAYER_STATE1_20000000;
+ }
+ func_8082DC38(this);
+
+ return true;
+ }
+ return false;
+}
+
+void func_80838830(Player* this, s16 objectId) {
+ s32 pad[2];
+
+ if (objectId != OBJECT_UNSET_0) {
+ this->giObjectLoading = true;
+ osCreateMesgQueue(&this->giObjectLoadQueue, &this->giObjectLoadMsg, 1);
+ DmaMgr_SendRequestImpl(&this->giObjectDmaRequest, this->giObjectSegment, gObjectTable[objectId].vromStart,
+ gObjectTable[objectId].vromEnd - gObjectTable[objectId].vromStart, 0,
+ &this->giObjectLoadQueue, NULL);
+ }
+}
+
+PlayerAnimationHeader* D_8085D160[PLAYER_FORM_MAX] = {
+ &gPlayerAnim_pz_maskoffstart, // PLAYER_FORM_FIERCE_DEITY
+ &gPlayerAnim_pg_maskoffstart, // PLAYER_FORM_GORON
+ &gPlayerAnim_pz_maskoffstart, // PLAYER_FORM_ZORA
+ &gPlayerAnim_pn_maskoffstart, // PLAYER_FORM_DEKU
+ &gPlayerAnim_cl_setmask, // PLAYER_FORM_HUMAN
+};
+
+void func_808388B8(PlayState* play, Player* this, PlayerTransformation playerForm) {
+ func_8082DE50(play, this);
+ func_80831760(play, this, func_808553F4, 0);
+ func_8082E4A4(play, this, D_8085D160[this->transformation]);
+ gSaveContext.save.playerForm = playerForm;
+ this->stateFlags1 |= PLAYER_STATE1_2;
+
+ D_80862B50 = play->envCtx.lightSettings;
+ this->actor.velocity.y = 0.0f;
+ Actor_DeactivateLens(play);
+}
+
+void func_808389BC(PlayState* play, Player* this) {
+ func_80831760(play, this, func_80855AF4, 0);
+ func_8082E4A4(play, this, &gPlayerAnim_cl_setmask);
+ this->stateFlags1 |= (PLAYER_STATE1_100 | PLAYER_STATE1_20000000);
+ func_8082DAD4(this);
+}
+
+void func_80838A20(PlayState* play, Player* this) {
+ func_80831760(play, this, func_80855B9C, 0);
+ func_8082DB90(play, this, &gPlayerAnim_cl_maskoff);
+ this->currentMask = PLAYER_MASK_NONE;
+ this->stateFlags1 |= (PLAYER_STATE1_100 | PLAYER_STATE1_20000000);
+ func_8082DAD4(this);
+ Magic_Reset(play);
+}
+
+u8 sPlayerMass[PLAYER_FORM_MAX] = {
+ 100, // PLAYER_FORM_FIERCE_DEITY
+ 200, // PLAYER_FORM_GORON
+ 80, // PLAYER_FORM_ZORA
+ 20, // PLAYER_FORM_DEKU
+ 50, // PLAYER_FORM_HUMAN
+};
+
+PlayerAnimationHeader* D_8085D17C[PLAYER_FORM_MAX] = {
+ &gPlayerAnim_link_normal_okarina_start, // PLAYER_FORM_FIERCE_DEITY
+ &gPlayerAnim_pg_gakkistart, // PLAYER_FORM_GORON
+ &gPlayerAnim_pz_gakkistart, // PLAYER_FORM_ZORA
+ &gPlayerAnim_pn_gakkistart, // PLAYER_FORM_DEKU
+ &gPlayerAnim_link_normal_okarina_start, // PLAYER_FORM_HUMAN
+};
+PlayerAnimationHeader* D_8085D190[PLAYER_FORM_MAX] = {
+ &gPlayerAnim_link_normal_okarina_swing, // PLAYER_FORM_FIERCE_DEITY
+ &gPlayerAnim_pg_gakkiplay, // PLAYER_FORM_GORON
+ &gPlayerAnim_pz_gakkiplay, // PLAYER_FORM_ZORA
+ &gPlayerAnim_pn_gakkiplay, // PLAYER_FORM_DEKU
+ &gPlayerAnim_link_normal_okarina_swing, // PLAYER_FORM_HUMAN
+};
+
+u8 D_8085D1A4[PLAYER_IA_MAX] = {
+ GI_NONE, // PLAYER_IA_NONE
+ GI_NONE, // PLAYER_IA_LAST_USED
+ GI_NONE, // PLAYER_IA_FISHING_ROD
+ GI_SWORD_KOKIRI, // PLAYER_IA_SWORD_KOKIRI
+ GI_SWORD_RAZOR, // PLAYER_IA_SWORD_RAZOR
+ GI_SWORD_GILDED, // PLAYER_IA_SWORD_GILDED
+ GI_SWORD_GREAT_FAIRY, // PLAYER_IA_SWORD_TWO_HANDED
+ GI_STICKS_1, // PLAYER_IA_STICK
+ GI_SWORD_KOKIRI, // PLAYER_IA_ZORA_FINS
+ GI_QUIVER_30, // PLAYER_IA_BOW
+ GI_ARROW_FIRE, // PLAYER_IA_BOW_FIRE
+ GI_ARROW_ICE, // PLAYER_IA_BOW_ICE
+ GI_ARROW_LIGHT, // PLAYER_IA_BOW_LIGHT
+ GI_HOOKSHOT, // PLAYER_IA_HOOKSHOT
+ GI_BOMBS_1, // PLAYER_IA_BOMB
+ GI_POWDER_KEG, // PLAYER_IA_POWDER_KEG
+ GI_BOMBCHUS_10, // PLAYER_IA_BOMBCHU
+ GI_40, // PLAYER_IA_11
+ GI_NUTS_1, // PLAYER_IA_NUT
+ GI_PICTO_BOX, // PLAYER_IA_PICTO_BOX
+ GI_OCARINA, // PLAYER_IA_OCARINA
+ GI_BOTTLE, // PLAYER_IA_BOTTLE_EMPTY
+ GI_FISH, // PLAYER_IA_BOTTLE_FISH
+ GI_75, // PLAYER_IA_BOTTLE_SPRING_WATER
+ GI_ICE_TRAP, // PLAYER_IA_BOTTLE_HOT_SPRING_WATER
+ GI_ZORA_EGG, // PLAYER_IA_BOTTLE_ZORA_EGG
+ GI_GOLD_DUST, // PLAYER_IA_BOTTLE_DEKU_PRINCESS
+ GI_6C, // PLAYER_IA_BOTTLE_GOLD_DUST
+ GI_SEAHORSE, // PLAYER_IA_BOTTLE_1C
+ GI_MUSHROOM, // PLAYER_IA_BOTTLE_SEAHORSE
+ GI_HYLIAN_LOACH, // PLAYER_IA_BOTTLE_MUSHROOM
+ GI_DEKU_PRINCESS, // PLAYER_IA_BOTTLE_HYLIAN_LOACH
+ GI_BUG, // PLAYER_IA_BOTTLE_BUG
+ GI_POE, // PLAYER_IA_BOTTLE_POE
+ GI_BIG_POE, // PLAYER_IA_BOTTLE_BIG_POE
+ GI_POTION_RED, // PLAYER_IA_BOTTLE_POTION_RED
+ GI_POTION_BLUE, // PLAYER_IA_BOTTLE_POTION_BLUE
+ GI_POTION_GREEN, // PLAYER_IA_BOTTLE_POTION_GREEN
+ GI_MILK_HALF, // PLAYER_IA_BOTTLE_MILK
+ GI_MILK_HALF, // PLAYER_IA_BOTTLE_MILK_HALF
+ GI_CHATEAU, // PLAYER_IA_BOTTLE_CHATEAU
+ GI_FAIRY, // PLAYER_IA_BOTTLE_FAIRY
+ GI_MOON_TEAR, // PLAYER_IA_MOON_TEAR
+ GI_DEED_LAND, // PLAYER_IA_DEED_LAND
+ GI_ROOM_KEY, // PLAYER_IA_ROOM_KEY
+ GI_LETTER_TO_KAFEI, // PLAYER_IA_LETTER_TO_KAFEI
+ GI_MAGIC_BEANS, // PLAYER_IA_MAGIC_BEANS
+ GI_DEED_SWAMP, // PLAYER_IA_DEED_SWAMP
+ GI_DEED_MOUNTAIN, // PLAYER_IA_DEED_MOUNTAIN
+ GI_DEED_OCEAN, // PLAYER_IA_DEED_OCEAN
+ GI_MOON_TEAR, // PLAYER_IA_32
+ GI_LETTER_TO_MAMA, // PLAYER_IA_LETTER_MAMA
+ GI_A7, // PLAYER_IA_34
+ GI_A8, // PLAYER_IA_35
+ GI_PENDANT_OF_MEMORIES, // PLAYER_IA_PENDANT_OF_MEMORIES
+ GI_PENDANT_OF_MEMORIES, // PLAYER_IA_37
+ GI_PENDANT_OF_MEMORIES, // PLAYER_IA_38
+ GI_PENDANT_OF_MEMORIES, // PLAYER_IA_39
+ GI_MASK_TRUTH, // PLAYER_IA_MASK_TRUTH
+ GI_MASK_KAFEIS_MASK, // PLAYER_IA_MASK_KAFEIS_MASK
+ GI_MASK_ALL_NIGHT, // PLAYER_IA_MASK_ALL_NIGHT
+ GI_MASK_BUNNY, // PLAYER_IA_MASK_BUNNY
+ GI_MASK_KEATON, // PLAYER_IA_MASK_KEATON
+ GI_MASK_GARO, // PLAYER_IA_MASK_GARO
+ GI_MASK_ROMANI, // PLAYER_IA_MASK_ROMANI
+ GI_MASK_CIRCUS_LEADER, // PLAYER_IA_MASK_CIRCUS_LEADER
+ GI_MASK_POSTMAN, // PLAYER_IA_MASK_POSTMAN
+ GI_MASK_COUPLE, // PLAYER_IA_MASK_COUPLE
+ GI_MASK_GREAT_FAIRY, // PLAYER_IA_MASK_GREAT_FAIRY
+ GI_MASK_GIBDO, // PLAYER_IA_MASK_GIBDO
+ GI_MASK_DON_GERO, // PLAYER_IA_MASK_DON_GERO
+ GI_MASK_KAMARO, // PLAYER_IA_MASK_KAMARO
+ GI_MASK_CAPTAIN, // PLAYER_IA_MASK_CAPTAIN
+ GI_MASK_STONE, // PLAYER_IA_MASK_STONE
+ GI_MASK_BREMEN, // PLAYER_IA_MASK_BREMEN
+ GI_MASK_BLAST, // PLAYER_IA_MASK_BLAST
+ GI_MASK_SCENTS, // PLAYER_IA_MASK_SCENTS
+ GI_MASK_GIANT, // PLAYER_IA_MASK_GIANT
+ GI_MASK_FIERCE_DEITY, // PLAYER_IA_MASK_FIERCE_DEITY
+ GI_MASK_GORON, // PLAYER_IA_MASK_GORON
+ GI_MASK_ZORA, // PLAYER_IA_MASK_ZORA
+ GI_MASK_DEKU, // PLAYER_IA_MASK_DEKU
+ GI_LENS, // PLAYER_IA_LENS
+};
+
+PlayerAnimationHeader* D_8085D1F8[] = {
+ &gPlayerAnim_link_normal_give_other,
+ &gPlayerAnim_link_normal_take_out, // Hold up cutscene item; "this item doesn't work here"
+};
+
+s32 func_80838A90(Player* this, PlayState* play) {
+ PlayerBottle bottleAction;
+
+ if (this->unk_AA5 != PLAYER_UNKAA5_0) {
+ if (!(this->actor.bgCheckFlags & (BGCHECKFLAG_GROUND | BGCHECKFLAG_GROUND_TOUCH)) &&
+ !(this->stateFlags1 & PLAYER_STATE1_8000000) && !(this->stateFlags1 & PLAYER_STATE1_800000) &&
+ !(this->stateFlags3 & PLAYER_STATE3_8) && !(this->skelAnime.moveFlags & ANIM_FLAG_8)) {
+ Player_StopCutscene(this);
+ func_80833AA0(this, play);
+ return true;
+ }
+ if (!func_808387A0(play, this)) {
+ if (this->unk_AA5 == PLAYER_UNKAA5_5) {
+ if ((this->itemAction >= PLAYER_IA_MASK_MIN) && (this->itemAction <= PLAYER_IA_MASK_MAX)) {
+ PlayerMask maskId = GET_MASK_FROM_IA(this->itemAction);
+
+ this->prevMask = this->currentMask;
+ if (((maskId == this->currentMask) != 0) || (this->itemAction < PLAYER_IA_MASK_GIANT) ||
+ ((this->itemAction == PLAYER_IA_MASK_GIANT) && (this->transformation != PLAYER_FORM_HUMAN))) {
+ if (maskId == this->currentMask) {
+ this->currentMask = PLAYER_MASK_NONE;
+ } else {
+ this->currentMask = maskId;
+ }
+
+ if (this->transformation == PLAYER_FORM_HUMAN) {
+ func_80838A20(play, this);
+ return true;
+ }
+
+ func_808388B8(play, this, PLAYER_FORM_HUMAN);
+ } else {
+ this->currentMask = maskId;
+ if (this->currentMask == PLAYER_MASK_GIANT) {
+ func_808389BC(play, this);
+ return true;
+ }
+ func_808388B8(play, this, this->itemAction - PLAYER_IA_MASK_FIERCE_DEITY);
+ }
+ gSaveContext.save.equippedMask = this->currentMask;
+ } else if (CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_TALK_REQUESTED) ||
+ (this->itemAction == PLAYER_IA_PICTO_BOX) ||
+ ((this->itemAction != this->unk_B2B) &&
+ ((this->itemAction == PLAYER_IA_BOTTLE_BIG_POE) ||
+ ((this->itemAction >= PLAYER_IA_BOTTLE_ZORA_EGG) &&
+ (this->itemAction <= PLAYER_IA_BOTTLE_HYLIAN_LOACH)) ||
+ (this->itemAction > PLAYER_IA_BOTTLE_FAIRY) ||
+ ((this->talkActor != NULL) && (this->exchangeItemId > PLAYER_IA_NONE) &&
+ (((this->exchangeItemId == PLAYER_IA_MAGIC_BEANS) &&
+ (this->itemAction == PLAYER_IA_MAGIC_BEANS)) ||
+ ((this->exchangeItemId != PLAYER_IA_MAGIC_BEANS) &&
+ (Player_BottleFromIA(this, this->itemAction) > PLAYER_BOTTLE_NONE))))))) {
+ Actor* talkActor;
+ s32 heldItemTemp = this->itemAction;
+
+ Player_StopCutscene(this);
+ this->itemAction = PLAYER_IA_NONE;
+ func_80831760(play, this, func_80853A5C, 0);
+ talkActor = this->talkActor;
+ this->itemAction = heldItemTemp;
+ this->csId = CS_ID_NONE;
+
+ if ((talkActor != NULL) && (((this->exchangeItemId == PLAYER_IA_MAGIC_BEANS) &&
+ (this->itemAction == PLAYER_IA_MAGIC_BEANS)) ||
+ ((this->exchangeItemId != PLAYER_IA_MAGIC_BEANS) &&
+ (this->exchangeItemId > PLAYER_IA_NONE)))) {
+ this->stateFlags1 |= (PLAYER_STATE1_20000000 | PLAYER_STATE1_40);
+ if (this->exchangeItemId == PLAYER_IA_MAGIC_BEANS) {
+ Inventory_ChangeAmmo(ITEM_MAGIC_BEANS, -1);
+ func_80831760(play, this, func_8084B4A8, 0);
+ this->currentYaw = talkActor->yawTowardsPlayer + 0x8000;
+ this->actor.shape.rot.y = this->currentYaw;
+ if (talkActor->xzDistToPlayer < 40.0f) {
+ func_8082DB90(play, this, &gPlayerAnim_link_normal_backspace);
+ func_8082E920(play, this, ANIM_FLAG_1 | ANIM_FLAG_8 | ANIM_FLAG_NOMOVE);
+ } else {
+ func_8082E438(play, this, D_8085BE84[31][this->modelAnimType]);
+ }
+ this->stateFlags1 |= PLAYER_STATE1_20000000;
+ this->unk_AE8 = 80;
+ this->unk_AE7 = -1;
+ this->targetedActor = this->talkActor;
+ } else {
+ this->csId = CS_ID_GLOBAL_TALK;
+ }
+
+ talkActor->flags |= ACTOR_FLAG_TALK_REQUESTED;
+ this->actor.textId = 0;
+ this->targetedActor = this->talkActor;
+ } else {
+ this->stateFlags1 |= (PLAYER_STATE1_20000000 | PLAYER_STATE1_10000000 | PLAYER_STATE1_40);
+ this->csId = play->playerCsIds[PLAYER_CS_ID_ITEM_SHOW];
+ this->unk_AE7 = 1;
+ this->actor.textId = 0xFE;
+ }
+ this->actor.flags |= ACTOR_FLAG_TALK_REQUESTED;
+ this->exchangeItemId = this->itemAction;
+ if (this->unk_AE7 >= 0) {
+ Player_AnimationPlayOnce(play, this, D_8085D1F8[this->unk_AE7]);
+ }
+ func_8082DAD4(this);
+ return true;
+ } else {
+ bottleAction = Player_BottleFromIA(this, this->itemAction);
+
+ if (bottleAction > PLAYER_BOTTLE_NONE) {
+ Player_StopCutscene(this);
+ if (bottleAction >= PLAYER_BOTTLE_FAIRY) {
+ func_80831760(play, this, func_80853754, 0);
+ func_8082DB90(play, this, &gPlayerAnim_link_bottle_bug_out);
+ } else if ((bottleAction > PLAYER_BOTTLE_EMPTY) && (bottleAction < PLAYER_BOTTLE_POE)) {
+ func_80831760(play, this, func_80853850, 0);
+ func_8082DB90(play, this, &gPlayerAnim_link_bottle_fish_out);
+ this->csId = play->playerCsIds[PLAYER_CS_ID_ITEM_BOTTLE];
+ } else {
+ func_80831760(play, this, func_80853194, 0);
+ func_8082E4A4(play, this,
+ (this->transformation == PLAYER_FORM_DEKU)
+ ? &gPlayerAnim_pn_drinkstart
+ : &gPlayerAnim_link_bottle_drink_demo_start);
+ }
+ } else {
+ Actor* actorUnkA90 = this->unk_A90;
+
+ if ((actorUnkA90 == NULL) || (actorUnkA90->id == ACTOR_EN_ZOT) ||
+ (actorUnkA90->csId == CS_ID_NONE)) {
+ if (!func_808323C0(this, play->playerCsIds[PLAYER_CS_ID_ITEM_OCARINA])) {
+ return false;
+ }
+ } else {
+ this->csId = CS_ID_NONE;
+ }
+ func_80831760(play, this, func_8085269C, 0);
+ if ((this->skelAnime.playSpeed < 0.0f) ||
+ ((this->skelAnime.animation != D_8085D17C[this->transformation]) &&
+ (this->skelAnime.animation != D_8085D190[this->transformation]))) {
+ func_8082DB90(play, this, D_8085D17C[this->transformation]);
+ }
+ this->stateFlags2 |= PLAYER_STATE2_8000000;
+ if (actorUnkA90 != NULL) {
+ this->actor.flags |= ACTOR_FLAG_20000000;
+ if (actorUnkA90->id == ACTOR_EN_ZOT) {
+ this->unk_A94 = -1.0f;
+ } else {
+ actorUnkA90->flags |= ACTOR_FLAG_20000000;
+ }
+ }
+ }
+ }
+ } else {
+ if (func_8083868C(play, this) != CAM_MODE_NORMAL) {
+ Player_StopCutscene(this);
+ if (!(this->stateFlags1 & PLAYER_STATE1_800000)) {
+ Player_SetAction(play, this, func_8084E724, 1);
+ this->unk_AE8 = 13;
+ func_80836D8C(this);
+ if (this->unk_AA5 == PLAYER_UNKAA5_2) {
+ play->actorCtx.flags |= ACTORCTX_FLAG_PICTO_BOX_ON;
+ }
+ }
+ this->stateFlags1 |= PLAYER_STATE1_100000;
+ play_sound(NA_SE_SY_CAMERA_ZOOM_UP);
+ Player_StopHorizontalMovement(this);
+ return true;
+ }
+ this->unk_AA5 = PLAYER_UNKAA5_0;
+ play_sound(NA_SE_SY_ERROR);
+ return false;
+ }
+ this->stateFlags1 |= (PLAYER_STATE1_20000000 | PLAYER_STATE1_10000000);
+ func_8082DAD4(this);
+ }
+ return true;
+ }
+ return false;
+}
+
+s32 func_808391D8(Player* this, PlayState* play) {
+ if (gSaveContext.save.saveInfo.playerData.health != 0) {
+ Actor* talkActor = this->talkActor;
+ Actor* targetedActor = this->targetedActor;
+ Actor* var_a1 = NULL;
+ s32 var_t1 = false;
+ s32 var_t2 = false;
+
+ if (this->tatlActor != NULL) {
+ var_t2 =
+ (targetedActor != NULL) && (CHECK_FLAG_ALL(targetedActor->flags, ACTOR_FLAG_1 | ACTOR_FLAG_40000) ||
+ (targetedActor->hintId != TATL_HINT_ID_NONE));
+
+ if (var_t2 || (this->tatlTextId != 0)) {
+ //! @bug The comparison `((ABS_ALT(this->tatlTextId) & 0xFF00) != 0x10000)` always evaluates to `true`
+ var_t1 = (this->tatlTextId < 0) && ((ABS_ALT(this->tatlTextId) & 0xFF00) != 0x10000);
+
+ if (var_t1 || !var_t2) {
+ var_a1 = this->tatlActor;
+ if (var_t1) {
+ targetedActor = NULL;
+ talkActor = NULL;
+ }
+ } else {
+ var_a1 = targetedActor;
+ }
+ }
+ }
+
+ if ((talkActor != NULL) || (var_a1 != NULL)) {
+ if ((targetedActor == NULL) || (targetedActor == talkActor) || (targetedActor == var_a1)) {
+ if (!(this->stateFlags1 & PLAYER_STATE1_800) ||
+ ((this->heldActor != NULL) &&
+ (var_t1 || (talkActor == this->heldActor) || (var_a1 == this->heldActor) ||
+ ((talkActor != NULL) && (talkActor->flags & ACTOR_FLAG_10000))))) {
+ if (((this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) ||
+ (this->stateFlags1 & PLAYER_STATE1_800000) || func_801242B4(this))) {
+ if (talkActor != NULL) {
+ if ((targetedActor == NULL) || (targetedActor == talkActor)) {
+ this->stateFlags2 |= PLAYER_STATE2_2;
+ }
+
+ if (!CutsceneManager_IsNext(CS_ID_GLOBAL_TALK)) {
+ return false;
+ }
+
+ if (CHECK_BTN_ALL(sPlayerControlInput->press.button, BTN_A) ||
+ (talkActor->flags & ACTOR_FLAG_10000)) {
+ var_a1 = NULL;
+ } else if (var_a1 == NULL) {
+ return false;
+ }
+ }
+
+ if (var_a1 != NULL) {
+ if (!var_t1) {
+ this->stateFlags2 |= PLAYER_STATE2_200000;
+ if (!CutsceneManager_IsNext(CS_ID_GLOBAL_TALK) ||
+ !CHECK_BTN_ALL(sPlayerControlInput->press.button, BTN_CUP)) {
+ return false;
+ }
+ }
+
+ talkActor = var_a1;
+ this->talkActor = NULL;
+
+ if (var_t1 || !var_t2) {
+ var_a1->textId = ABS_ALT(this->tatlTextId);
+ } else if (var_a1->hintId != 0xFF) {
+ var_a1->textId = var_a1->hintId + 0x1900;
+ }
+ }
+
+ this->currentMask = D_80862B2C;
+ gSaveContext.save.equippedMask = this->currentMask;
+ Player_TalkWithPlayer(play, talkActor);
+ return true;
+ }
+ }
+ }
+ }
+ }
+
+ return false;
+}
+
+s32 func_80839518(Player* this, PlayState* play) {
+ if (this->unk_AA5 != PLAYER_UNKAA5_0) {
+ func_80838A90(this, play);
+ return true;
+ } else if ((this->targetedActor != NULL) &&
+ (CHECK_FLAG_ALL(this->targetedActor->flags, ACTOR_FLAG_1 | ACTOR_FLAG_40000) ||
+ (this->targetedActor->hintId != TATL_HINT_ID_NONE))) {
+ this->stateFlags2 |= PLAYER_STATE2_200000;
+ } else if ((this->tatlTextId == 0) && !func_80123420(this) &&
+ CHECK_BTN_ALL(sPlayerControlInput->press.button, BTN_CUP) &&
+ !func_80831814(this, play, PLAYER_UNKAA5_1)) {
+ play_sound(NA_SE_SY_ERROR);
+ }
+ return false;
+}
+
+// Jumpslash/Jumpkick start
+void func_808395F0(PlayState* play, Player* this, PlayerMeleeWeaponAnimation meleeWeaponAnim, f32 linearVelocity,
+ f32 yVelocity) {
+ if (this->transformation == PLAYER_FORM_ZORA) {
+ linearVelocity *= 1.1f;
+ meleeWeaponAnim = PLAYER_MWA_ZORA_JUMPKICK_START;
+ yVelocity *= 0.9f;
+ }
+
+ func_80833864(play, this, meleeWeaponAnim);
+ Player_SetAction(play, this, func_8084CB58, 0);
+ this->stateFlags3 |= PLAYER_STATE3_2;
+ this->linearVelocity = linearVelocity;
+ this->currentYaw = this->actor.shape.rot.y;
+ this->actor.velocity.y = yVelocity;
+ this->actor.bgCheckFlags &= ~BGCHECKFLAG_GROUND;
+ Player_AnimSfx_PlayFloorJump(this);
+ Player_AnimSfx_PlayVoice(this, NA_SE_VO_LI_SWORD_L);
+}
+
+s32 func_808396B8(PlayState* play, Player* this) {
+ if (!(this->stateFlags1 & PLAYER_STATE1_400000) &&
+ (((this->actor.id != ACTOR_PLAYER) && CHECK_BTN_ALL(sPlayerControlInput->press.button, BTN_B)) ||
+ ((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)))) {
+ return true;
+ }
+
+ return false;
+}
+
+s32 func_80839770(Player* this, PlayState* play) {
+ if (func_808396B8(play, this)) {
+ if ((this->transformation != PLAYER_FORM_GORON) && (sPlayerCurrentFloorType != FLOOR_TYPE_7)) {
+ func_808395F0(play, this,
+ (this->transformation == PLAYER_FORM_ZORA) ? PLAYER_MWA_ZORA_JUMPKICK_START
+ : PLAYER_MWA_JUMPSLASH_START,
+ 3.0f, 4.5f);
+ return true;
+ }
+ }
+ return false;
+}
+
+s32 func_80839800(Player* this, PlayState* play) {
+ if ((this->unk_AE3[this->unk_ADE] == 0) && (sPlayerCurrentFloorType != FLOOR_TYPE_7)) {
+ func_80836B3C(play, this, 0.0f);
+ return true;
+ }
+ return false;
+}
+
+void func_80839860(Player* this, PlayState* play, s32 arg2) {
+ s32 pad;
+ f32 speed = (!(arg2 & 1) ? 5.8f : 3.5f);
+
+ if (this->currentBoots == PLAYER_BOOTS_GIANT) {
+ speed /= 2.0f;
+ }
+
+ //! FAKE
+ if (arg2 == 2) {}
+
+ func_80834D50(play, this, D_8085C2A4[arg2].unk_0, speed, NA_SE_VO_LI_SWORD_N);
+
+ this->unk_AE8 = 1;
+ this->unk_AE7 = arg2;
+
+ this->currentYaw = this->actor.shape.rot.y + (arg2 << 0xE);
+ this->linearVelocity = !(arg2 & 1) ? 6.0f : 8.5f;
+
+ this->stateFlags2 |= PLAYER_STATE2_80000;
+ Player_PlaySfx(this, ((arg2 << 0xE) == 0x8000) ? NA_SE_PL_ROLL : NA_SE_PL_SKIP);
+}
+
+void func_80839978(PlayState* play, Player* this) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
+ this->itemAction = PLAYER_IA_OCARINA;
+ func_80831760(play, this, func_8084AC84, 0);
+ func_8082DB60(play, this, &gPlayerAnim_clink_normal_okarina_walk);
+ func_8082E920(play, this, ANIM_FLAG_4 | ANIM_FLAG_200);
+ this->stateFlags3 |= PLAYER_STATE3_20000000;
+ this->unk_B48 = this->linearVelocity;
+ Audio_PlayFanfare(NA_BGM_BREMEN_MARCH);
+ }
+}
+
+void func_80839A10(PlayState* play, Player* this) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
+ this->itemAction = PLAYER_IA_NONE;
+ func_80831760(play, this, func_8084AEEC, 0);
+ func_8082DB60(play, this, &gPlayerAnim_alink_dance_loop);
+ this->stateFlags2 |= PLAYER_STATE2_2000000;
+ Audio_PlayFanfare(NA_BGM_KAMARO_DANCE);
+ }
+}
+
+s32 func_80839A84(PlayState* play, Player* this) {
+ if (this->transformation == PLAYER_FORM_DEKU) {
+ if (func_80836DC0(play, this)) {
+ return true;
+ }
+ } else {
+ return false;
+ }
+
+ Player_SetAction(play, this, func_808573A4, 0);
+ this->stateFlags1 &= ~(PLAYER_STATE1_20000 | PLAYER_STATE1_40000000);
+ this->unk_ADC = 4;
+ func_808373A4(play, this);
+ return true;
+}
+
+s32 func_80839B18(Player* this, PlayState* play) {
+ if (CHECK_BTN_ALL(sPlayerControlInput->press.button, BTN_A) &&
+ (play->roomCtx.curRoom.behaviorType1 != ROOM_BEHAVIOR_TYPE1_2) && (sPlayerCurrentFloorType != FLOOR_TYPE_7) &&
+ (D_80862B40 != FLOOR_EFFECT_1)) {
+ s32 temp_a2 = this->unk_AE3[this->unk_ADE];
+
+ if (temp_a2 <= 0) {
+ if (func_8082FBE8(this)) {
+ if (this->actor.category != ACTORCAT_PLAYER) {
+ if (temp_a2 < 0) {
+ func_80834DB8(this, &gPlayerAnim_link_normal_jump, REG(69) / 100.0f, play);
+ } else {
+ 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)) {
+ func_808395F0(play, this, PLAYER_MWA_JUMPSLASH_START, 5.0f, 5.0f);
+ } else if (!func_80839A84(play, this)) {
+ func_80836B3C(play, this, 0.0f);
+ }
+
+ return true;
+ }
+ } else {
+ func_80839860(this, play, temp_a2);
+ return true;
+ }
+ }
+
+ return false;
+}
+
+void func_80839CD8(Player* this, PlayState* play) {
+ PlayerAnimationHeader* anim;
+ f32 var_fv0 = this->unk_B38 - 3.0f;
+
+ if (var_fv0 < 0.0f) {
+ var_fv0 += 29.0f;
+ }
+
+ if (var_fv0 < 14.0f) {
+ anim = D_8085BE84[PLAYER_ANIMGROUP_17][this->modelAnimType];
+ var_fv0 = 11.0f - var_fv0;
+ if (var_fv0 < 0.0f) {
+ var_fv0 = -var_fv0 * 1.375f;
+ }
+ var_fv0 = var_fv0 / 11.0f;
+ } else {
+ anim = D_8085BE84[PLAYER_ANIMGROUP_18][this->modelAnimType];
+ var_fv0 = 26.0f - var_fv0;
+ if (var_fv0 < 0.0f) {
+ var_fv0 = -var_fv0 * 2;
+ }
+ var_fv0 = var_fv0 / 12.0f;
+ }
+
+ PlayerAnimation_Change(play, &this->skelAnime, anim, 1.0f, 0.0f, Animation_GetLastFrame(anim), ANIMMODE_ONCE,
+ 4.0f * var_fv0);
+ this->currentYaw = this->actor.shape.rot.y;
+}
+
+void func_80839E3C(Player* this, PlayState* play) {
+ func_808369F4(this, play);
+ func_80839CD8(this, play);
+}
+
+void func_80839E74(Player* this, PlayState* play) {
+ Player_SetAction(play, this, func_80849FE0, 1);
+ Player_AnimationPlayOnce(play, this, func_8082ED20(this));
+ this->currentYaw = this->actor.shape.rot.y;
+}
+
+void func_80839ED0(Player* this, PlayState* play) {
+ if (!(this->stateFlags3 & PLAYER_STATE3_80) && (func_80852B28 != this->actionFunc) && !func_8083213C(this)) {
+ func_80836D8C(this);
+ if (!(this->stateFlags1 & PLAYER_STATE1_40)) {
+ if (func_801242B4(this)) {
+ func_808353DC(play, this);
+ } else {
+ func_80836988(this, play);
+ }
+ }
+ if (this->unk_AA5 < PLAYER_UNKAA5_5) {
+ this->unk_AA5 = PLAYER_UNKAA5_0;
+ }
+ }
+ this->stateFlags1 &= ~(PLAYER_STATE1_4 | PLAYER_STATE1_2000 | PLAYER_STATE1_4000 | PLAYER_STATE1_100000);
+}
+
+s32 func_80839F98(PlayState* play, Player* this) {
+ if (!(this->stateFlags1 & PLAYER_STATE1_8000000)) {
+ if (this->linearVelocity != 0.0f) {
+ func_80836B3C(play, this, 0.0f);
+ return true;
+ }
+ func_80836AD8(play, this);
+ PlayerAnimation_Change(play, &this->skelAnime, &gPlayerAnim_pg_maru_change, 2.0f / 3.0f, 0.0f, 7.0f,
+ ANIMMODE_ONCE, 0.0f);
+ return true;
+ }
+ return false;
+}
+
+// Toggles swimming/walking underwater as Zora
+void func_8083A04C(Player* this) {
+ if (this->currentBoots == PLAYER_BOOTS_ZORA_UNDERWATER) {
+ if (CHECK_BTN_ALL(sPlayerControlInput->press.button, BTN_A)) {
+ this->currentBoots = PLAYER_BOOTS_ZORA_LAND;
+ }
+ if (func_808508C8 == this->actionFunc) {
+ this->unk_AE8 = 20;
+ }
+ } else {
+ if (CHECK_BTN_ALL(sPlayerControlInput->press.button, BTN_B)) {
+ this->currentBoots = PLAYER_BOOTS_ZORA_UNDERWATER;
+ }
+ }
+}
+
+s32 func_8083A0CC(Player* this, PlayState* play) {
+ if (!D_80862B04 && (this->transformation == PLAYER_FORM_ZORA)) {
+ func_8083A04C(this);
+ }
+ return false;
+}
+
+s32 func_8083A114(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);
+ } else if (CHECK_BTN_ALL(sPlayerControlInput->press.button, BTN_A) && !func_8082FB68(this)) {
+ if (this->transformation == PLAYER_FORM_GORON) {
+ if (func_80839F98(play, this)) {
+ return true;
+ }
+ } else if (func_80839A84(play, this) || func_80839800(this, play)) {
+ return true;
+ }
+
+ if ((this->putAwayCountdown == 0) && (this->heldItemAction >= PLAYER_IA_SWORD_KOKIRI) &&
+ (this->transformation != PLAYER_FORM_FIERCE_DEITY)) {
+ func_80831990(play, this, ITEM_NONE);
+ } else {
+ this->stateFlags2 ^= PLAYER_STATE2_100000;
+ }
+ }
+ }
+
+ return false;
+}
+
+s32 func_8083A274(Player* this, PlayState* play) {
+ if (CHECK_BTN_ALL(sPlayerControlInput->cur.button, BTN_R) && (this->unk_AA5 == PLAYER_UNKAA5_0) &&
+ (play->bButtonAmmoPlusOne == 0)) {
+ if (Player_IsGoronOrDeku(this) ||
+ ((((this->transformation == PLAYER_FORM_ZORA) && !(this->stateFlags1 & PLAYER_STATE1_2000000)) ||
+ ((this->transformation == PLAYER_FORM_HUMAN) && (this->currentShield != PLAYER_SHIELD_NONE))) &&
+ !func_80123434(this) && (this->targetedActor == NULL))) {
+ func_8082DC38(this);
+ func_8082DCA0(play, this);
+ if (Player_SetAction(play, this, func_8084B5C0, 0)) {
+ this->stateFlags1 |= PLAYER_STATE1_400000;
+ if (this->transformation != PLAYER_FORM_GORON) {
+ PlayerAnimationHeader* anim;
+ f32 endFrame;
+
+ if (!Player_IsGoronOrDeku(this)) {
+ Player_SetModelsForHoldingShield(this);
+ anim = D_8085BE84[PLAYER_ANIMGROUP_19][this->modelAnimType];
+ } else {
+ anim = (this->transformation == PLAYER_FORM_DEKU) ? &gPlayerAnim_pn_gurd
+ : &gPlayerAnim_clink_normal_defense_ALL;
+ }
+
+ if (anim != this->skelAnime.animation) {
+ if (func_80123420(this)) {
+ this->unk_B3C = 1.0f;
+ } else {
+ this->unk_B3C = 0.0f;
+ func_8082FC60(this);
+ }
+ this->upperLimbRot.x = 0;
+ this->upperLimbRot.y = 0;
+ this->upperLimbRot.z = 0;
+ }
+
+ endFrame = Animation_GetLastFrame(anim);
+ PlayerAnimation_Change(play, &this->skelAnime, anim, 2.0f / 3.0f,
+ (anim == &gPlayerAnim_pn_gurd) ? 0.0f : endFrame, endFrame, ANIMMODE_ONCE,
+ 0.0f);
+ }
+ func_80830AE8(this);
+ }
+
+ return true;
+ }
+ }
+
+ return false;
+}
+
+s32 func_8083A4A4(Player* this, f32* arg1, s16* arg2, f32 arg3) {
+ s16 yaw = this->currentYaw - *arg2;
+
+ if (ABS_ALT(yaw) > 0x6000) {
+ if (Math_StepToF(&this->linearVelocity, 0.0f, arg3)) {
+ *arg1 = 0.0f;
+ *arg2 = this->currentYaw;
+ } else {
+ return true;
+ }
+ }
+ return false;
+}
+
+void func_8083A548(Player* this) {
+ if ((this->unk_ADC > 0) && !CHECK_BTN_ALL(sPlayerControlInput->cur.button, BTN_B)) {
+ this->unk_ADC = -this->unk_ADC;
+ }
+}
+
+s32 func_8083A580(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)) {
+ if ((this->unk_ADC > 0) && (((this->transformation == PLAYER_FORM_ZORA)) ||
+ ((this->unk_ADC == 1) && (this->heldItemAction != PLAYER_IA_STICK)))) {
+ if (this->transformation == PLAYER_FORM_ZORA) {
+ func_80830E30(this, play);
+ } else {
+ func_808335B0(play, this);
+ }
+ return true;
+ }
+ }
+ } else {
+ func_8083A548(this);
+ }
+ return false;
+}
+
+s32 func_8083A658(PlayState* play, Player* this) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
+ Player_SetAction(play, this, func_80852B28, 0);
+ Player_AnimationPlayOnce(play, this, &gPlayerAnim_link_normal_light_bom);
+ this->unk_AA5 = PLAYER_UNKAA5_0;
+ return true;
+ }
+ return false;
+}
+
+struct_8085D200 D_8085D200[] = {
+ { &gPlayerAnim_link_bottle_bug_miss, &gPlayerAnim_link_bottle_bug_in, 2, 3 },
+ { &gPlayerAnim_link_bottle_fish_miss, &gPlayerAnim_link_bottle_fish_in, 5, 3 },
+};
+
+s32 func_8083A6C0(PlayState* play, Player* this) {
+ if (D_80862B48 != 0) {
+ if (Player_GetBottleHeld(this) > PLAYER_BOTTLE_NONE) {
+ Player_SetAction(play, this, func_808534C0, 0);
+ if (this->actor.depthInWater > 12.0f) {
+ this->unk_AE8 = 1;
+ }
+ func_8082DB90(play, this, D_8085D200[this->unk_AE8].unk_0);
+ Player_PlaySfx(this, NA_SE_IT_SWORD_SWING);
+ Player_AnimSfx_PlayVoice(this, NA_SE_VO_LI_AUTO_JUMP);
+ return true;
+ }
+ return false;
+ }
+ return false;
+}
+
+void func_8083A794(Player* this, PlayState* play) {
+ if ((func_8084AF9C != this->actionFunc) && (func_8084B0EC != this->actionFunc)) {
+ this->unk_B70 = 0;
+ this->unk_B34 = 0.0f;
+ this->unk_B38 = 0.0f;
+ func_8082E514(play, this, D_8085BE84[PLAYER_ANIMGROUP_2][this->modelAnimType]);
+ }
+
+ Player_SetAction(play, this, func_8082FBE8(this) ? func_8084B0EC : func_8084AF9C, 1);
+}
+
+void func_8083A844(Player* this, PlayState* play, s16 currentYaw) {
+ this->currentYaw = currentYaw;
+ this->actor.shape.rot.y = this->currentYaw;
+ func_8083A794(this, play);
+}
+
+s32 func_8083A878(PlayState* play, Player* this, f32 arg2) {
+ WaterBox* waterBox;
+ f32 ySurface = this->actor.world.pos.y;
+
+ if (WaterBox_GetSurface1(play, &play->colCtx, this->actor.world.pos.x, this->actor.world.pos.z, &ySurface,
+ &waterBox)) {
+ ySurface -= this->actor.world.pos.y;
+ if (this->ageProperties->unk_24 <= ySurface) {
+ Player_SetAction(play, this, func_80850B18, 0);
+ func_8082E634(play, this, &gPlayerAnim_link_swimer_swim);
+ this->stateFlags1 |= (PLAYER_STATE1_8000000 | PLAYER_STATE1_20000000);
+ this->unk_AE8 = 20;
+ this->linearVelocity = 2.0f;
+ func_80123140(play, this);
+ return false;
+ }
+ }
+ func_80835324(play, this, arg2, this->actor.shape.rot.y);
+ this->stateFlags1 |= PLAYER_STATE1_20000000;
+ return true;
+}
+
+/**
+ * Update for using telescopes. SCENE_AYASHIISHOP acts quite differently: it has a different camera mode and cannot use
+ * zooming.
+ *
+ * - Stick inputs move the view; shape.rot.y is used as a base position which cannot be looked too far away from. (This
+ * is not necessarily the same as the original angle of the spawn.)
+ * - A can be used to zoom (except in SCENE_AYASHIISHOP)
+ * - B exits, using the RESPAWN_MODE_DOWN entrance
+ */
+void func_8083A98C(Actor* thisx, PlayState* play2) {
+ PlayState* play = play2;
+ Player* this = THIS;
+ s32 camMode;
+
+ if (play->csCtx.state != CS_STATE_IDLE) {
+ return;
+ }
+
+ if (DECR(this->unk_AE8) != 0) {
+ camMode = (play->sceneId != SCENE_AYASHIISHOP) ? CAM_MODE_FIRSTPERSON : CAM_MODE_DEKUHIDE;
+
+ // Show controls overlay. SCENE_AYASHIISHOP does not have Zoom, so has a different one.
+ if (this->unk_AE8 == 1) {
+ Message_StartTextbox(play, (play->sceneId == SCENE_AYASHIISHOP) ? 0x2A00 : 0x5E6, NULL);
+ }
+ } else {
+ sPlayerControlInput = play->state.input;
+ if (play->view.fovy >= 25.0f) {
+ s16 prevFocusX = thisx->focus.rot.x;
+ s16 prevFocusY = thisx->focus.rot.y;
+ s16 inputY;
+ s16 inputX;
+ s16 newYaw; // from base position shape.rot.y
+
+ // Pitch:
+ inputY = sPlayerControlInput->rel.stick_y * 4;
+ // Add input, clamped to prevent turning too fast
+ thisx->focus.rot.x += CLAMP(inputY, -0x12C, 0x12C);
+ // Prevent looking too far up or down
+ thisx->focus.rot.x = CLAMP(thisx->focus.rot.x, -0x2EE0, 0x2EE0);
+
+ // Yaw: shape.rot.y is used as a fixed starting position
+ inputX = sPlayerControlInput->rel.stick_x * -4;
+ // Start from current position: no input -> no change
+ newYaw = thisx->focus.rot.y - thisx->shape.rot.y;
+ // Add input, clamped to prevent turning too fast
+ newYaw += CLAMP(inputX, -0x12C, 0x12C);
+ // Prevent looking too far left or right of base position
+ newYaw = CLAMP(newYaw, -0x3E80, 0x3E80);
+ thisx->focus.rot.y = thisx->shape.rot.y + newYaw;
+
+ if (play->sceneId == SCENE_00KEIKOKU) {
+ f32 focusDeltaX = (s16)(thisx->focus.rot.x - prevFocusX);
+ f32 focusDeltaY = (s16)(thisx->focus.rot.y - prevFocusY);
+
+ func_8019FAD8(&gSfxDefaultPos, NA_SE_PL_TELESCOPE_MOVEMENT - SFX_FLAG,
+ sqrtf(SQ(focusDeltaX) + SQ(focusDeltaY)) / 300.0f);
+ }
+ }
+
+ if (play->sceneId == SCENE_AYASHIISHOP) {
+ camMode = CAM_MODE_DEKUHIDE;
+ } else if (CHECK_BTN_ALL(sPlayerControlInput->cur.button, BTN_A)) { // Zoom
+ camMode = CAM_MODE_TARGET;
+ } else {
+ camMode = CAM_MODE_NORMAL;
+ }
+
+ // Exit
+ if (CHECK_BTN_ALL(sPlayerControlInput->press.button, BTN_B)) {
+ Message_CloseTextbox(play);
+
+ if (play->sceneId == SCENE_00KEIKOKU) {
+ gSaveContext.respawn[RESPAWN_MODE_DOWN].entrance = ENTRANCE(ASTRAL_OBSERVATORY, 2);
+ } else {
+ u16 entrance;
+
+ if (play->sceneId == SCENE_AYASHIISHOP) {
+ entrance = ENTRANCE(CURIOSITY_SHOP, 3);
+ } else {
+ entrance = ENTRANCE(PIRATES_FORTRESS_INTERIOR, 8);
+ }
+ gSaveContext.respawn[RESPAWN_MODE_DOWN].entrance = entrance;
+ }
+
+ func_80169EFC(&play->state);
+ gSaveContext.respawnFlag = -2;
+ play->transitionType = TRANS_TYPE_CIRCLE;
+ }
+ }
+
+ Camera_ChangeSetting(Play_GetCamera(play, CAM_ID_MAIN), CAM_SET_TELESCOPE);
+ Camera_ChangeMode(Play_GetCamera(play, CAM_ID_MAIN), camMode);
+}
+
+// Set up using a telescope
+void Player_InitMode_Telescope(PlayState* play, Player* this) {
+ this->actor.update = func_8083A98C;
+ this->actor.draw = NULL;
+ if (play->sceneId == SCENE_00KEIKOKU) {
+ this->actor.focus.rot.x = 0xBD8;
+ this->actor.focus.rot.y = -0x4D74;
+ this->unk_AE8 = 20;
+ } else if (play->sceneId == SCENE_AYASHIISHOP) {
+ this->actor.focus.rot.x = 0x9A6;
+ this->actor.focus.rot.y = 0x2102;
+ this->unk_AE8 = 2;
+ } else {
+ this->actor.focus.rot.x = 0x9A6;
+ this->actor.focus.rot.y = 0x2102;
+ this->unk_AE8 = 20;
+ }
+ play->actorCtx.flags |= ACTORCTX_FLAG_1;
+}
+
+void Player_InitMode_B(PlayState* play, Player* this) {
+ func_8085B384(this, play);
+}
+
+void Player_InitMode_D(PlayState* play, Player* this) {
+ if (func_8083A878(play, this, 180.0f)) {
+ this->unk_AE8 = -20;
+ }
+}
+
+// InitModes 0xA and 0xE
+void func_8083ADF0(PlayState* play, Player* this) {
+ this->linearVelocity = 2.0f;
+ gSaveContext.entranceSpeed = 2.0f;
+
+ if (func_8083A878(play, this, 120.0f)) {
+ this->unk_AE8 = -15;
+ }
+}
+
+void Player_InitMode_F(PlayState* play, Player* this) {
+ if (gSaveContext.entranceSpeed < 0.1f) {
+ gSaveContext.entranceSpeed = 0.1f;
+ }
+
+ this->linearVelocity = gSaveContext.entranceSpeed;
+ if (func_8083A878(play, this, 800.0f)) {
+ this->unk_AE8 = -80.0f / this->linearVelocity;
+ if (this->unk_AE8 < -20) {
+ this->unk_AE8 = -20;
+ }
+ }
+}
+
+void func_8083AECC(Player* this, s16 currentYaw, PlayState* play) {
+ Player_SetAction(play, this, func_8084A5C0, 1);
+ PlayerAnimation_CopyJointToMorph(play, &this->skelAnime);
+ this->unk_B38 = 0.0f;
+ this->unk_B34 = 0.0f;
+ this->currentYaw = currentYaw;
+}
+
+void func_8083AF30(Player* this, PlayState* play) {
+ Player_SetAction(play, this, func_8084A26C, 1);
+ func_8082E514(play, this, D_8085BE84[PLAYER_ANIMGROUP_1][this->modelAnimType]);
+}
+
+void func_8083AF8C(Player* this, s16 currentYaw, PlayState* play) {
+ Player_SetAction(play, this, func_8084B288, 1);
+ PlayerAnimation_Change(play, &this->skelAnime, &gPlayerAnim_link_anchor_back_walk, 1.0f, 0.0f,
+ Animation_GetLastFrame(&gPlayerAnim_link_anchor_back_walk), ANIMMODE_ONCE, -6.0f);
+ this->linearVelocity = 8.0f;
+ this->currentYaw = currentYaw;
+}
+
+void func_8083B030(Player* this, PlayState* play) {
+ Player_SetAction(play, this, func_8084A8E8, 1);
+ func_8082E514(play, this, D_8085BE84[PLAYER_ANIMGROUP_24][this->modelAnimType]);
+ this->unk_B38 = 0.0f;
+}
+
+void func_8083B090(Player* this, PlayState* play) {
+ Player_SetAction(play, this, func_8084B3B8, 1);
+ PlayerAnimation_PlayOnceSetSpeed(play, &this->skelAnime, &gPlayerAnim_link_anchor_back_brake, 6.0f / 3.0f);
+}
+
+void func_8083B0E4(PlayState* play, Player* this, s16 currentYaw) {
+ this->currentYaw = currentYaw;
+ Player_SetAction(play, this, func_8084AB4C, 1);
+ this->unk_B4E = 1200;
+ this->unk_B4E *= D_8085C3E4;
+ PlayerAnimation_Change(play, &this->skelAnime, D_8085BE84[PLAYER_ANIMGROUP_25][this->modelAnimType], 1.0f, 0.0f,
+ 0.0f, ANIMMODE_LOOP, -6.0f);
+}
+
+void func_8083B1A0(Player* this, PlayState* play) {
+ PlayerAnimationHeader* anim;
+
+ Player_SetAction(play, this, func_80849FE0, 1);
+ if (this->unk_B40 < 0.5f) {
+ anim = D_8085BE84[PLAYER_ANIMGROUP_27][this->modelAnimType];
+ } else {
+ anim = D_8085BE84[PLAYER_ANIMGROUP_26][this->modelAnimType];
+ }
+ Player_AnimationPlayOnce(play, this, anim);
+ this->currentYaw = this->actor.shape.rot.y;
+}
+
+void func_8083B23C(Player* this, PlayState* play) {
+ Player_SetAction(play, this, func_80849A9C, 1);
+ func_8082E438(play, this, D_8085BE84[PLAYER_ANIMGROUP_6][this->modelAnimType]);
+ this->unk_AE8 = 1;
+}
+
+void func_8083B29C(Player* this, PlayState* play) {
+ if (this->linearVelocity != 0.0f) {
+ func_8083A794(this, play);
+ } else {
+ func_8083B1A0(this, play);
+ }
+}
+
+void func_8083B2E4(Player* this, PlayState* play) {
+ if (this->linearVelocity != 0.0f) {
+ func_8083A794(this, play);
+ } else {
+ func_80836988(this, play);
+ }
+}
+
+void func_8083B32C(PlayState* play, Player* this, f32 arg2) {
+ this->stateFlags1 |= PLAYER_STATE1_40000;
+ this->stateFlags1 &= ~PLAYER_STATE1_8000000;
+ func_8082DC64(play, this);
+
+ if (func_80837730(play, this, arg2, 500)) {
+ Player_PlaySfx(this, NA_SE_EV_JUMP_OUT_WATER);
+ }
+ func_80123140(play, this);
+}
+
+s32 func_8083B3B4(PlayState* play, Player* this, Input* input) {
+ if ((!(this->stateFlags1 & PLAYER_STATE1_400) && !(this->stateFlags2 & PLAYER_STATE2_400) &&
+ (this->transformation != PLAYER_FORM_ZORA)) &&
+ ((input == NULL) ||
+ ((((this->interactRangeActor == NULL) || (this->interactRangeActor->id != ACTOR_EN_ZOG)) &&
+ CHECK_BTN_ALL(input->press.button, BTN_A)) &&
+ ((ABS_ALT(this->unk_AAA) < 0x2EE0) && (this->currentBoots < PLAYER_BOOTS_ZORA_UNDERWATER) &&
+ ((s32)SurfaceType_GetConveyorSpeed(&play->colCtx, this->actor.floorPoly, this->actor.floorBgId) <=
+ CONVEYOR_SPEED_SLOW))))) {
+ if (func_8085B08C != this->actionFunc) {
+ Player_SetAction(play, this, func_808516B4, 0);
+ }
+
+ Player_AnimationPlayOnce(play, this, &gPlayerAnim_link_swimer_swim_deep_start);
+ this->unk_AAA = 0;
+ this->stateFlags2 |= PLAYER_STATE2_400;
+ this->actor.velocity.y = 0.0f;
+ if (input != NULL) {
+ this->stateFlags2 |= PLAYER_STATE2_800;
+ Player_PlaySfx(this, NA_SE_PL_DIVE_BUBBLE);
+ }
+
+ return true;
+ }
+
+ if ((this->transformation != PLAYER_FORM_DEKU) &&
+ ((this->stateFlags1 & PLAYER_STATE1_400) ||
+ ((this->stateFlags2 & PLAYER_STATE2_400) &&
+ (((func_80850D68 != this->actionFunc) && !(this->stateFlags3 & PLAYER_STATE3_8000)) ||
+ (this->unk_AAA < -0x1555)))) &&
+ ((this->actor.depthInWater - this->actor.velocity.y) < this->ageProperties->unk_30)) {
+ s32 temp_v0_3;
+ s16 sp2A;
+ f32 sp24;
+
+ this->stateFlags2 &= ~PLAYER_STATE2_400;
+ func_8082DC64(play, this);
+ temp_v0_3 = func_80837730(play, this, this->actor.velocity.y, 0x1F4);
+ if (this->stateFlags3 & PLAYER_STATE3_8000) {
+ sp2A = this->unk_B86[1];
+ sp24 = this->unk_B48 * 1.5f;
+ Player_SetAction(play, this, func_8084CA24, 1);
+ this->stateFlags3 |= PLAYER_STATE3_8000;
+ this->stateFlags1 &= ~PLAYER_STATE1_8000000;
+ sp24 = CLAMP_MAX(sp24, 13.5f);
+ this->linearVelocity = Math_CosS(this->unk_AAA) * sp24;
+ this->actor.velocity.y = -Math_SinS(this->unk_AAA) * sp24;
+ this->unk_B86[1] = sp2A;
+ Player_PlaySfx(this, NA_SE_EV_JUMP_OUT_WATER);
+ return true;
+ }
+
+ if (temp_v0_3) {
+ Player_PlaySfx(this, NA_SE_PL_FACE_UP);
+ } else {
+ Player_PlaySfx(this, NA_SE_PL_FACE_UP);
+ }
+
+ if (input != NULL) {
+ Player_SetAction(play, this, func_808519FC, 1);
+ if (this->stateFlags1 & PLAYER_STATE1_400) {
+ this->stateFlags1 |= (PLAYER_STATE1_400 | PLAYER_STATE1_800 | PLAYER_STATE1_20000000);
+ }
+ this->unk_AE8 = 2;
+ }
+
+ func_8082E438(play, this,
+ (this->stateFlags1 & PLAYER_STATE1_800) ? &gPlayerAnim_link_swimer_swim_get
+ : &gPlayerAnim_link_swimer_swim_deep_end);
+ return true;
+ }
+
+ return false;
+}
+
+void func_8083B73C(PlayState* play, Player* this, s16 currentYaw) {
+ Player_SetAction(play, this, func_808513EC, 0);
+ func_8082E634(play, this, &gPlayerAnim_link_swimer_swim);
+ this->actor.shape.rot.y = currentYaw;
+ this->currentYaw = currentYaw;
+}
+
+void func_8083B798(PlayState* play, Player* this) {
+ if (this->transformation == PLAYER_FORM_ZORA) {
+ Player_SetAction(play, this, func_808513EC, 0);
+ PlayerAnimation_Change(play, &this->skelAnime, &gPlayerAnim_link_swimer_swim, 1.0f,
+ Animation_GetLastFrame(&gPlayerAnim_link_swimer_swim), 0.0f, ANIMMODE_LOOP, 0.0f);
+ this->unk_B48 = 2.0f;
+ } else {
+ Player_AnimationPlayLoop(play, this, &gPlayerAnim_link_swimer_swim);
+ this->unk_AE8 = 1;
+ }
+
+ this->unk_AAA = 0x3E80;
+}
+
+void func_8083B850(PlayState* play, Player* this) {
+ this->currentBoots = PLAYER_BOOTS_ZORA_LAND;
+ this->prevBoots = PLAYER_BOOTS_ZORA_LAND;
+ Player_SetAction(play, this, func_80850D68, 0);
+ this->unk_B48 = sqrtf(SQ(this->linearVelocity) + SQ(this->actor.velocity.y));
+ Player_OverrideBlureColors(play, this, 1, 8);
+ this->currentBoots = PLAYER_BOOTS_ZORA_LAND;
+ this->prevBoots = PLAYER_BOOTS_ZORA_LAND;
+}
+
+void func_8083B8D0(PlayState* play, Player* this) {
+ if (func_80837730(play, this, this->actor.velocity.y, 500)) {
+ Player_PlaySfx(this, NA_SE_EV_DIVE_INTO_WATER);
+ if (this->fallDistance > 800) {
+ Player_AnimSfx_PlayVoice(this, NA_SE_VO_LI_CLIMB_END);
+ }
+ }
+}
+
+void func_8083B930(PlayState* play, Player* this) {
+ PlayerAnimationHeader* var_a2;
+
+ if ((this->currentBoots < PLAYER_BOOTS_ZORA_UNDERWATER) || !(this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) ||
+ (func_80857BE8 == this->actionFunc)) {
+ func_8082DE50(play, this);
+
+ if (func_8084CA24 == this->actionFunc) {
+ func_8083B850(play, this);
+ this->stateFlags3 |= PLAYER_STATE3_8000;
+ } else if ((this->transformation == PLAYER_FORM_ZORA) && (func_8084C94C == this->actionFunc)) {
+ func_8083B850(play, this);
+ this->stateFlags3 |= PLAYER_STATE3_8000;
+ func_8082DB60(play, this, &gPlayerAnim_pz_fishswim);
+ } else if ((this->currentBoots < PLAYER_BOOTS_ZORA_UNDERWATER) && (this->stateFlags2 & PLAYER_STATE2_400)) {
+ this->stateFlags2 &= ~PLAYER_STATE2_400;
+ func_8083B3B4(play, this, NULL);
+ this->unk_AE7 = 1;
+ } else if (func_8084C94C == this->actionFunc) {
+ Player_SetAction(play, this, func_808516B4, 0);
+ func_8083B798(play, this);
+ } else {
+ Player_SetAction(play, this, func_808508C8, 1);
+ func_8082E438(play, this,
+ (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) ? &gPlayerAnim_link_swimer_wait2swim_wait
+ : &gPlayerAnim_link_swimer_land2swim_wait);
+ }
+ }
+ if (!(this->stateFlags1 & PLAYER_STATE1_8000000) || (this->actor.depthInWater < this->ageProperties->unk_2C)) {
+ func_8083B8D0(play, this);
+ }
+
+ this->stateFlags1 |= PLAYER_STATE1_8000000;
+ this->stateFlags2 |= PLAYER_STATE2_400;
+ this->stateFlags1 &= ~(PLAYER_STATE1_40000 | PLAYER_STATE1_80000);
+
+ this->unk_AEC = 0.0f;
+ func_80123140(play, this);
+}
+
+void func_8083BB4C(PlayState* play, Player* this) {
+ f32 sp1C = this->actor.depthInWater - this->ageProperties->unk_2C;
+
+ if (sp1C < 0.0f) {
+ this->underwaterTimer = 0;
+ if ((this->transformation == PLAYER_FORM_ZORA) && (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
+ this->currentBoots = PLAYER_BOOTS_ZORA_LAND;
+ }
+ func_801A3E38(0);
+ } else {
+ func_801A3E38(0x20);
+ if ((this->transformation == PLAYER_FORM_ZORA) || (sp1C < 10.0f)) {
+ this->underwaterTimer = 0;
+ } else if (this->underwaterTimer < 300) {
+ this->underwaterTimer++;
+ }
+ }
+
+ if ((this->actor.parent == NULL) && (func_8084D4EC != this->actionFunc) && (func_8084F3DC != this->actionFunc) &&
+ ((func_8084CA24 != this->actionFunc) || (this->actor.velocity.y < -2.0f))) {
+ if (this->ageProperties->unk_2C < this->actor.depthInWater) {
+ if (this->transformation == PLAYER_FORM_GORON) {
+ func_80834140(play, this, &gPlayerAnim_link_swimer_swim_down);
+ func_808345C8();
+ func_8083B8D0(play, this);
+ } else if (this->transformation == PLAYER_FORM_DEKU) {
+ if (this->remainingHopsCounter != 0) {
+ func_808373F8(play, this, NA_SE_VO_LI_AUTO_JUMP);
+ } else {
+ if ((play->sceneId == SCENE_20SICHITAI) && (this->unk_3CF == 0)) {
+ if (CHECK_EVENTINF(EVENTINF_50)) {
+ play->nextEntrance = ENTRANCE(TOURIST_INFORMATION, 2);
+ } else {
+ play->nextEntrance = ENTRANCE(TOURIST_INFORMATION, 1);
+ }
+ play->transitionTrigger = TRANS_TRIGGER_START;
+ play->transitionType = TRANS_TYPE_FADE_BLACK_FAST;
+ this->stateFlags1 |= PLAYER_STATE1_200;
+ play_sound(NA_SE_SY_DEKUNUTS_JUMP_FAILED);
+ } else if ((this->unk_3CF == 0) &&
+ ((play->sceneId == SCENE_30GYOSON) || (play->sceneId == SCENE_31MISAKI) ||
+ (play->sceneId == SCENE_TORIDE))) {
+ func_80169EFC(&play->state);
+ func_808345C8();
+ } else {
+ Player_SetAction(play, this, func_808497A0, 0);
+ this->stateFlags1 |= PLAYER_STATE1_20000000;
+ }
+ func_8083B8D0(play, this);
+ }
+ } else if (!(this->stateFlags1 & PLAYER_STATE1_8000000) ||
+ (((this->currentBoots < PLAYER_BOOTS_ZORA_UNDERWATER) ||
+ !(this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) &&
+ (func_8084E724 != this->actionFunc) && (func_80851B58 != this->actionFunc) &&
+ (func_80851BD4 != this->actionFunc) && (func_808508C8 != this->actionFunc) &&
+ (func_808513EC != this->actionFunc) && (func_80851588 != this->actionFunc) &&
+ (func_808516B4 != this->actionFunc) && (func_808519FC != this->actionFunc) &&
+ (func_80850B18 != this->actionFunc) && (func_80850D68 != this->actionFunc))) {
+ func_8083B930(play, this);
+ }
+ } else if ((this->stateFlags1 & PLAYER_STATE1_8000000) &&
+ (this->actor.depthInWater < this->ageProperties->unk_24) &&
+ (((func_80850D68 != this->actionFunc) && !(this->stateFlags3 & PLAYER_STATE3_8000)) ||
+ (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND))) {
+ if (this->skelAnime.moveFlags == 0) {
+ func_8083B0E4(play, this, this->actor.shape.rot.y);
+ }
+ func_8083B32C(play, this, this->actor.velocity.y);
+ }
+ }
+}
+
+void func_8083BF54(PlayState* play, Player* this) {
+ Vec3f sp84;
+ s32 temp_v0;
+ s32 var_a2;
+
+ this->actor.terminalVelocity = -20.0f;
+ this->actor.gravity = REG(68) / 100.0f;
+
+ var_a2 = false;
+ temp_v0 = func_808340D4(sPlayerCurrentFloorType);
+
+ if (temp_v0 ||
+ (((var_a2 = (sPlayerCurrentFloorType == FLOOR_TYPE_14) || (sPlayerCurrentFloorType == FLOOR_TYPE_15))) ||
+ (sPlayerCurrentFloorType == FLOOR_TYPE_13))) {
+ f32 temp_fv1_2;
+ f32 var_fa1;
+ f32 var_ft4;
+ f32 var_fv0;
+ u16 sfxId;
+
+ var_ft4 = fabsf(this->linearVelocity + D_80862B3C) * 20.0f;
+ if (temp_v0) {
+ if (sPlayerCurrentFloorType == FLOOR_TYPE_4) {
+ var_fa1 = 1300.0f;
+ } else if (sPlayerCurrentFloorType == FLOOR_TYPE_7) {
+ var_fa1 = 20000.0f;
+ var_ft4 = 0.0f;
+ } else {
+ var_fa1 = 10000.0f;
+ var_ft4 *= 1.6f;
+ }
+ sfxId = NA_SE_PL_SINK_ON_SAND - SFX_FLAG;
+ } else if (var_a2) {
+ if (sPlayerCurrentFloorType == FLOOR_TYPE_14) {
+ var_fa1 = 400.0f;
+ var_ft4 *= 10.0f;
+ } else {
+ var_fa1 = 1300.0f;
+ var_ft4 = 0.0f;
+ }
+ sfxId = NA_SE_PL_SINK_ON_SNOW - SFX_FLAG;
+ } else {
+ var_fa1 = (this->transformation == PLAYER_FORM_GORON) ? 10000.0f : 1000.0f;
+ var_ft4 = 0.0f;
+ sfxId = NA_SE_PL_SINK_ON_SAND - SFX_FLAG;
+ }
+
+ var_fa1 = CLAMP_MIN(var_fa1, this->unk_AB8);
+
+ var_fv0 = (sPlayerCurrentFloorType == FLOOR_TYPE_14) ? 200.0f : (var_fa1 - this->unk_AB8) * 0.02f;
+ var_fv0 = CLAMP(var_fv0, 0.0f, 300.0f);
+
+ temp_fv1_2 = this->unk_AB8;
+ this->unk_AB8 += var_fv0 - var_ft4;
+ this->unk_AB8 = CLAMP(this->unk_AB8, 0.0f, var_fa1);
+
+ if ((this->linearVelocity == 0.0f) && (fabsf(this->unk_AB8 - temp_fv1_2) > 2.0f)) {
+ func_800B8F98(&this->actor, sfxId);
+ }
+
+ this->actor.gravity -= this->unk_AB8 * 0.004f;
+ } else {
+ this->unk_AB8 = 0.0f;
+ }
+
+ if ((this->stateFlags3 & PLAYER_STATE3_10) && (this->actor.bgCheckFlags & BGCHECKFLAG_WATER)) {
+ if (this->actor.depthInWater < 50.0f) {
+ f32 temp_fv1_5;
+ Vec3f* bodyPartsPos;
+ f32 var_fa0_3;
+ f32 var_ft4_2;
+
+ var_ft4_2 = fabsf(this->bodyPartsPos[PLAYER_BODYPART_WAIST].x - this->unk_D6C.x) +
+ fabsf(this->bodyPartsPos[PLAYER_BODYPART_WAIST].y - this->unk_D6C.y) +
+ fabsf(this->bodyPartsPos[PLAYER_BODYPART_WAIST].z - this->unk_D6C.z);
+ var_ft4_2 = CLAMP_MAX(var_ft4_2, 4.0f);
+
+ this->unk_AEC += var_ft4_2;
+ if (this->unk_AEC > 15.0f) {
+ this->unk_AEC = 0.0f;
+ sp84.x = (Rand_ZeroOne() * 10.0f) + this->actor.world.pos.x;
+ sp84.y = this->actor.world.pos.y + this->actor.depthInWater;
+ sp84.z = (Rand_ZeroOne() * 10.0f) + this->actor.world.pos.z;
+
+ EffectSsGRipple_Spawn(play, &sp84, 100, 500, 0);
+
+ if ((this->linearVelocity > 4.0f) && !func_801242B4(this) &&
+ ((this->actor.world.pos.y + this->actor.depthInWater) <
+ this->bodyPartsPos[PLAYER_BODYPART_WAIST].y)) {
+ func_80837730(play, this, 20.0f,
+ (fabsf(this->linearVelocity) * 50.0f) + (this->actor.depthInWater * 5.0f));
+ } else if (this->stateFlags3 & PLAYER_STATE3_8000) {
+ s32 i;
+
+ var_fa0_3 = (this->actor.world.pos.y + this->actor.depthInWater) - 5.0f;
+ bodyPartsPos = this->bodyPartsPos;
+
+ for (i = 0; i < PLAYER_BODYPART_MAX; i++, bodyPartsPos++) {
+ temp_fv1_5 = bodyPartsPos->y - var_fa0_3;
+
+ if (temp_fv1_5 > 0.0f) {
+ func_80837730(play, this, 20.0f,
+ fabsf(this->linearVelocity) * 20.0f + (temp_fv1_5 * 10.0f));
+ }
+ }
+ }
+ }
+ }
+
+ if (this->ageProperties->unk_2C < this->actor.depthInWater) {
+ s32 numBubbles = 0;
+ s32 i;
+ f32 var_fv1;
+
+ var_fv1 = (this->stateFlags1 & PLAYER_STATE1_4000000)
+ ? -fabsf(this->linearVelocity)
+ : ((func_80850D68 == this->actionFunc)
+ ? (ABS_ALT(this->unk_B8A) * -0.004f) + (this->unk_B48 * -0.38f)
+ : this->actor.velocity.y);
+
+ if ((var_fv1 > -1.0f) || ((this->currentBoots == PLAYER_BOOTS_ZORA_UNDERWATER) &&
+ (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND))) {
+ if (Rand_ZeroOne() < 0.2f) {
+ numBubbles = 1;
+ }
+ } else {
+ numBubbles = var_fv1 * -0.3f;
+ if (numBubbles > 8) {
+ numBubbles = 8;
+ }
+ }
+
+ for (i = 0; i < numBubbles; i++) {
+ EffectSsBubble_Spawn(play, &this->actor.world.pos, 20.0f, 10.0f, 20.0f, 0.13f);
+ }
+ }
+ }
+}
+
+s32 func_8083C62C(Player* this, s32 arg1) {
+ Actor* targetedActor = this->targetedActor;
+ Vec3f headPos;
+ s16 pitchTarget;
+ s16 yawTarget;
+
+ headPos.x = this->actor.world.pos.x;
+ headPos.y = this->bodyPartsPos[PLAYER_BODYPART_HEAD].y + 3.0f;
+ headPos.z = this->actor.world.pos.z;
+
+ pitchTarget = Math_Vec3f_Pitch(&headPos, &targetedActor->focus.pos);
+ yawTarget = Math_Vec3f_Yaw(&headPos, &targetedActor->focus.pos);
+
+ Math_SmoothStepToS(&this->actor.focus.rot.y, yawTarget, 4, 0x2710, 0);
+ Math_SmoothStepToS(&this->actor.focus.rot.x, pitchTarget, 4, 0x2710, 0);
+
+ this->unk_AA6 |= 2;
+
+ return func_80832754(this, arg1);
+}
+
+Vec3f D_8085D218 = { 0.0f, 100.0f, 40.0f };
+
+void func_8083C6E8(Player* this, PlayState* play) {
+ if (this->targetedActor != NULL) {
+ if (func_800B7128(this) || func_8082EF20(this)) {
+ func_8083C62C(this, true);
+ } else {
+ func_8083C62C(this, false);
+ }
+ return;
+ }
+
+ if (sPlayerCurrentFloorType == FLOOR_TYPE_11) {
+ Math_SmoothStepToS(&this->actor.focus.rot.x, -20000, 10, 4000, 800);
+ } else {
+ s16 sp46 = 0;
+ f32 yIntersect;
+ Vec3f pos;
+ s16 temp_v0;
+
+ yIntersect = func_80835D2C(play, this, &D_8085D218, &pos);
+ if (yIntersect > BGCHECK_Y_MIN) {
+ temp_v0 = Math_Atan2S_XY(40.0f, this->actor.world.pos.y - yIntersect);
+ sp46 = CLAMP(temp_v0, -4000, 4000);
+ }
+ this->actor.focus.rot.y = this->actor.shape.rot.y;
+ Math_SmoothStepToS(&this->actor.focus.rot.x, sp46, 14, 4000, 30);
+ }
+
+ func_80832754(this, func_800B7128(this) || func_8082EF20(this));
+}
+
+void func_8083C85C(Player* this) {
+ Math_ScaledStepToS(&this->upperLimbRot.x, D_80862B3C * -500.0f, 900);
+ this->headLimbRot.x = (-(f32)this->upperLimbRot.x * 0.5f);
+ this->unk_AA6 |= 0x48;
+}
+
+void func_8083C8E8(Player* this, PlayState* play) {
+ if ((func_800B7128(this) == 0) && (func_8082EF20(this) == 0) &&
+ ((this->linearVelocity > 5.0f) || (D_80862B3C != 0.0f))) {
+ s16 temp1;
+ s16 temp2;
+
+ temp1 = this->linearVelocity * 200.0f;
+ temp2 = BINANG_SUB(this->currentYaw, this->actor.shape.rot.y) * this->linearVelocity * 0.1f;
+
+ temp1 = CLAMP(temp1, -0xFA0, 0xFA0);
+
+ temp1 += (s16)(s32)(D_80862B3C * -500.0f);
+
+ temp1 = CLAMP(temp1, -0x2EE0, 0x2EE0);
+
+ temp2 = CLAMP(-temp2, -0xFA0, 0xFA0);
+
+ Math_ScaledStepToS(&this->upperLimbRot.x, temp1, 0x384);
+ this->headLimbRot.x = -(f32)this->upperLimbRot.x * 0.5f;
+ Math_ScaledStepToS(&this->headLimbRot.z, temp2, 0x12C);
+ Math_ScaledStepToS(&this->upperLimbRot.z, temp2, 0xC8);
+ this->unk_AA6 |= 0x168;
+ } else {
+ func_8083C6E8(this, play);
+ }
+}
+
+void func_8083CB04(Player* this, f32 arg1, s16 arg2, f32 arg3, f32 arg4, s16 arg5) {
+ Math_AsymStepToF(&this->linearVelocity, arg1, arg3, arg4);
+ Math_ScaledStepToS(&this->currentYaw, arg2, arg5);
+}
+
+void func_8083CB58(Player* this, f32 arg1, s16 arg2) {
+ func_8083CB04(this, arg1, arg2, REG(19) / 100.0f, 1.5f, REG(27));
+}
+
+s32 func_8083CBC4(Player* this, f32 arg1, s16 arg2, f32 arg3, f32 arg4, f32 arg5, s16 arg6) {
+ s16 temp_v0 = this->currentYaw - arg2;
+
+ if ((this->unk_B50 * 1.5f) < fabsf(this->linearVelocity)) {
+ arg5 *= 4.0f;
+ arg3 *= 4.0f;
+ }
+
+ if (ABS_ALT(temp_v0) > 0x6000) {
+ if (Math_StepToF(&this->linearVelocity, 0.0f, arg3) == 0) {
+ return false;
+ }
+
+ this->currentYaw = arg2;
+ } else {
+ Math_AsymStepToF(&this->linearVelocity, arg1, arg4, arg5);
+ Math_ScaledStepToS(&this->currentYaw, arg2, arg6);
+ }
+
+ return true;
+}
+
+struct_8085D224 D_8085D224[][2] = {
+ {
+ { &gPlayerAnim_link_uma_left_up, 35.17f, 6.6099997f },
+ { &gPlayerAnim_link_uma_right_up, -34.16f, 7.91f },
+ },
+ {
+ { &gPlayerAnim_cl_uma_leftup, 22.718237f, 2.3294117f },
+ { &gPlayerAnim_cl_uma_rightup, -22.0f, 1.9800001f },
+ },
+};
+
+u16 D_8085D254[] = {
+ 0x1804, // PLAYER_FORM_GORON
+ 0x1805, // PLAYER_FORM_ZORA
+ 0x1806, // PLAYER_FORM_DEKU
+ 0x1806, // PLAYER_FORM_HUMAN
+};
+
+u16 D_8085D25C[] = {
+ 0x1804, // PLAYER_FORM_FIERCE_DEITY
+ 0x1804, // PLAYER_FORM_GORON
+ 0x1805, // PLAYER_FORM_ZORA
+ 0x1806, // PLAYER_FORM_DEKU
+};
+
+// Player_MountHorse
+s32 func_8083CCB4(Player* this, PlayState* play) {
+ EnHorse* rideActor = (EnHorse*)this->rideActor;
+
+ if (rideActor != NULL) {
+ if ((rideActor->type != HORSE_TYPE_2) && (this->transformation != PLAYER_FORM_FIERCE_DEITY)) {
+ if (CHECK_BTN_ALL(sPlayerControlInput->press.button, BTN_A)) {
+ if (CutsceneManager_IsNext(CS_ID_GLOBAL_TALK)) {
+ rideActor->actor.textId = D_8085D254[this->transformation - 1];
+ Player_TalkWithPlayer(play, &rideActor->actor);
+ return true;
+ }
+ }
+
+ CutsceneManager_Queue(CS_ID_GLOBAL_TALK);
+ } else if ((rideActor->type == HORSE_TYPE_2) && (this->transformation != PLAYER_FORM_HUMAN)) {
+ if (CHECK_BTN_ALL(sPlayerControlInput->press.button, BTN_A)) {
+ if (CutsceneManager_IsNext(CS_ID_GLOBAL_TALK)) {
+ rideActor->actor.textId = D_8085D25C[this->transformation];
+ Player_TalkWithPlayer(play, &rideActor->actor);
+ return true;
+ }
+ }
+
+ CutsceneManager_Queue(CS_ID_GLOBAL_TALK);
+ } else {
+ if (CHECK_BTN_ALL(sPlayerControlInput->press.button, BTN_A)) {
+ s32 pad[2];
+ f32 sp28 = Math_CosS(rideActor->actor.shape.rot.y);
+ f32 sp24 = Math_SinS(rideActor->actor.shape.rot.y);
+ struct_8085D224* entry;
+ f32 temp_fv0;
+ f32 temp_fv1;
+
+ func_80832558(play, this, func_80837BD0);
+
+ this->stateFlags1 |= PLAYER_STATE1_800000;
+ this->actor.bgCheckFlags &= ~BGCHECKFLAG_WATER;
+ this->isBurning = false;
+
+ if (this->transformation == PLAYER_FORM_FIERCE_DEITY) {
+ entry = D_8085D224[0];
+ } else {
+ entry = D_8085D224[1];
+ }
+ if (this->mountSide >= 0) {
+ entry++;
+ }
+
+ temp_fv0 = entry->unk_4;
+ temp_fv1 = entry->unk_8;
+ this->actor.world.pos.x =
+ rideActor->actor.world.pos.x + rideActor->riderPos.x + ((temp_fv0 * sp28) + (temp_fv1 * sp24));
+ this->actor.world.pos.z =
+ rideActor->actor.world.pos.z + rideActor->riderPos.z + ((temp_fv1 * sp28) - (temp_fv0 * sp24));
+ this->unk_B48 = rideActor->actor.world.pos.y - this->actor.world.pos.y;
+
+ this->currentYaw = this->actor.shape.rot.y = rideActor->actor.shape.rot.y;
+
+ Actor_MountHorse(play, this, &rideActor->actor);
+ Player_AnimationPlayOnce(play, this, entry->anim);
+ func_8082E920(play, this,
+ ANIM_FLAG_1 | ANIM_FLAG_UPDATE_Y | ANIM_FLAG_8 | ANIM_FLAG_NOMOVE | ANIM_FLAG_80);
+ this->actor.parent = this->rideActor;
+ func_8082DAD4(this);
+ Actor_DeactivateLens(play);
+
+ return true;
+ }
+ }
+ }
+
+ return false;
+}
+
+PlayerAnimationHeader* D_8085D264[] = {
+ &gPlayerAnim_link_normal_down_slope_slip,
+ &gPlayerAnim_link_normal_up_slope_slip,
+};
+
+s32 func_8083CF68(PlayState* play, Player* this) {
+ if (!Player_InBlockingCsMode(play, this) && !(this->cylinder.base.ocFlags1 & OC1_HIT)) {
+ if ((func_80853D68 != this->actionFunc) && (func_80857BE8 != this->actionFunc) &&
+ (D_80862B40 == FLOOR_EFFECT_1)) {
+ s16 playerVelYaw = Math_Atan2S_XY(this->actor.velocity.z, this->actor.velocity.x);
+ Vec3f slopeNormal;
+ s16 downwardSlopeYaw;
+ s16 velYawToDownwardSlope;
+ f32 slopeSlowdownSpeed;
+ f32 temp_fv1;
+ f32 var_fa1;
+ f32 slopeSlowdownSpeedStep;
+
+ Actor_GetSlopeDirection(this->actor.floorPoly, &slopeNormal, &downwardSlopeYaw);
+ velYawToDownwardSlope = downwardSlopeYaw - playerVelYaw;
+
+ if (ABS_ALT(velYawToDownwardSlope) > 0x3E80) { // 87.9 degrees
+ var_fa1 = (func_80857BE8 == this->actionFunc) ? Math_CosS(this->unk_B6C) : slopeNormal.y;
+ slopeSlowdownSpeed = (1.0f - var_fa1) * 40.0f;
+ temp_fv1 = fabsf(this->actor.speed) + slopeSlowdownSpeed;
+ slopeSlowdownSpeedStep = SQ(temp_fv1) * 0.011f;
+ slopeSlowdownSpeedStep = CLAMP_MIN(slopeSlowdownSpeedStep, 2.2f);
+
+ // slows down speed as player is climbing a slope
+ this->pushedYaw = downwardSlopeYaw;
+ Math_StepToF(&this->pushedSpeed, slopeSlowdownSpeed, slopeSlowdownSpeedStep);
+ } else {
+ Player_SetAction(play, this, func_80853D68, 0);
+ func_8082DE50(play, this);
+ func_8082E514(play, this, D_8085D264[this->unk_AE7]);
+ this->linearVelocity = sqrtf(SQXZ(this->actor.velocity));
+ this->currentYaw = downwardSlopeYaw;
+ if (D_80862B28 >= 0) {
+ this->unk_AE7 = 1;
+ Player_AnimSfx_PlayVoice(this, NA_SE_VO_LI_HANG);
+ }
+
+ return true;
+ }
+ }
+ }
+
+ return false;
+}
+
+void func_8083D168(PlayState* play, Player* this, GetItemEntry* giEntry) {
+ Item00Type dropType = GIFIELD_GET_DROP_TYPE(giEntry->field);
+
+ if (!(giEntry->field & GIFIELD_NO_COLLECTIBLE)) {
+ Item_DropCollectible(play, &this->actor.world.pos, dropType | 0x8000);
+
+ if ((dropType == ITEM00_BOMBS_A) || (dropType == ITEM00_ARROWS_30) || (dropType == ITEM00_ARROWS_40) ||
+ (dropType == ITEM00_ARROWS_50) || (dropType == ITEM00_RUPEE_GREEN) || (dropType == ITEM00_RUPEE_BLUE) ||
+ (dropType == ITEM00_RUPEE_RED) || (dropType == ITEM00_RUPEE_PURPLE) || (dropType == ITEM00_RUPEE_HUGE)) {
+ return;
+ }
+ }
+
+ Item_Give(play, giEntry->itemId);
+ play_sound((this->getItemId < GI_NONE) ? NA_SE_SY_GET_BOXITEM : NA_SE_SY_GET_ITEM);
+}
+
+s32 func_8083D23C(Player* this, PlayState* play) {
+ if (gSaveContext.save.saveInfo.playerData.health != 0) {
+ Actor* interactRangeActor = this->interactRangeActor;
+
+ if (interactRangeActor != NULL) {
+ if (this->getItemId > GI_NONE) {
+ if (this->getItemId < GI_MAX) {
+ GetItemEntry* giEntry = &sGetItemTable[this->getItemId - 1];
+
+ interactRangeActor->parent = &this->actor;
+ if ((Item_CheckObtainability(giEntry->itemId) == ITEM_NONE) ||
+ ((s16)giEntry->objectId == OBJECT_GI_BOMB_2)) {
+ func_8082DCA0(play, this);
+ func_80838830(this, giEntry->objectId);
+
+ if (!(this->stateFlags2 & PLAYER_STATE2_400) ||
+ (this->currentBoots == PLAYER_BOOTS_ZORA_UNDERWATER)) {
+ Player_StopCutscene(this);
+ func_808324EC(play, this, func_80837C78, play->playerCsIds[PLAYER_CS_ID_ITEM_GET]);
+ func_8082DB90(play, this,
+ (this->transformation == PLAYER_FORM_DEKU)
+ ? &gPlayerAnim_pn_getB
+ : &gPlayerAnim_link_demo_get_itemB);
+ }
+
+ this->stateFlags1 |= (PLAYER_STATE1_400 | PLAYER_STATE1_800 | PLAYER_STATE1_20000000);
+ func_8082DAD4(this);
+
+ return true;
+ }
+
+ func_8083D168(play, this, giEntry);
+ this->getItemId = GI_NONE;
+ }
+ } else if (this->csMode == PLAYER_CSMODE_0) {
+ if (!(this->stateFlags1 & PLAYER_STATE1_800)) {
+ if (this->getItemId != GI_NONE) {
+ if (CHECK_BTN_ALL(sPlayerControlInput->press.button, BTN_A)) {
+ GetItemEntry* giEntry = &sGetItemTable[-this->getItemId - 1];
+ EnBox* chest = (EnBox*)interactRangeActor;
+
+ if ((giEntry->itemId != ITEM_NONE) &&
+ (((Item_CheckObtainability(giEntry->itemId) == ITEM_NONE) &&
+ (giEntry->field & GIFIELD_40)) ||
+ (((Item_CheckObtainability(giEntry->itemId) != ITEM_NONE)) &&
+ (giEntry->field & GIFIELD_20)))) {
+ this->getItemId =
+ (giEntry->itemId == ITEM_MASK_CAPTAIN) ? -GI_RECOVERY_HEART : -GI_RUPEE_BLUE;
+ giEntry = &sGetItemTable[-this->getItemId - 1];
+ }
+
+ func_80832558(play, this, func_80837C78);
+ this->stateFlags1 |= (PLAYER_STATE1_400 | PLAYER_STATE1_800 | PLAYER_STATE1_20000000);
+ func_80838830(this, giEntry->objectId);
+
+ this->actor.world.pos.x =
+ interactRangeActor->world.pos.x -
+ (Math_SinS(interactRangeActor->shape.rot.y) * this->ageProperties->unk_9C);
+ this->actor.world.pos.z =
+ interactRangeActor->world.pos.z -
+ (Math_CosS(interactRangeActor->shape.rot.y) * this->ageProperties->unk_9C);
+ this->actor.world.pos.y = interactRangeActor->world.pos.y;
+ this->currentYaw = this->actor.shape.rot.y = interactRangeActor->shape.rot.y;
+
+ func_8082DAD4(this);
+ if ((giEntry->itemId != ITEM_NONE) && (giEntry->gid >= 0) &&
+ (Item_CheckObtainability(giEntry->itemId) == ITEM_NONE)) {
+ this->csId = chest->csId2;
+ func_8082DB90(play, this, this->ageProperties->openChestAnim);
+ func_8082E920(play, this,
+ ANIM_FLAG_1 | ANIM_FLAG_UPDATE_Y | ANIM_FLAG_4 | ANIM_FLAG_8 |
+ ANIM_FLAG_NOMOVE | ANIM_FLAG_80);
+ this->actor.bgCheckFlags &= ~BGCHECKFLAG_WATER;
+ chest->unk_1EC = 1;
+ } else {
+ Player_AnimationPlayOnce(play, this, &gPlayerAnim_link_normal_box_kick);
+ chest->unk_1EC = -1;
+ }
+
+ return true;
+ }
+ } else if (!(this->stateFlags1 & PLAYER_STATE1_8000000) &&
+ (this->transformation != PLAYER_FORM_DEKU)) {
+ if ((this->heldActor == NULL) || Player_IsHoldingHookshot(this)) {
+ EnBom* bomb = (EnBom*)interactRangeActor;
+
+ if (((this->transformation != PLAYER_FORM_GORON) &&
+ (((bomb->actor.id == ACTOR_EN_BOM) && bomb->isPowderKeg) ||
+ ((interactRangeActor->id == ACTOR_EN_ISHI) && (interactRangeActor->params & 1)) ||
+ (interactRangeActor->id == ACTOR_EN_MM)))) {
+ return false;
+ }
+
+ this->stateFlags2 |= PLAYER_STATE2_10000;
+ if (CHECK_BTN_ALL(sPlayerControlInput->press.button, BTN_A)) {
+ func_80832558(play, this, func_808379C0);
+ func_8082DAD4(this);
+ this->stateFlags1 |= PLAYER_STATE1_800;
+
+ return true;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return false;
+}
+
+// Player_SetAction_Throwing
+void func_8083D6DC(Player* this, PlayState* play) {
+ Player_SetAction(play, this, func_8084E65C, 1);
+ Player_AnimationPlayOnce(play, this, D_8085BE84[PLAYER_ANIMGROUP_28][this->modelAnimType]);
+}
+
+// Determines whether a held actor should be dropped or thrown: false implies droppable.
+s32 func_8083D738(Player* this, Actor* heldActor) {
+ if ((heldActor != NULL) && !(heldActor->flags & ACTOR_FLAG_800000) &&
+ ((this->linearVelocity < 1.1f) || (heldActor->id == ACTOR_EN_BOM_CHU))) {
+ return false;
+ }
+ return true;
+}
+
+s32 func_8083D78C(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)) {
+ if (!func_808313A8(play, this, this->heldActor)) {
+ if (!func_8083D738(this, this->heldActor)) {
+ Player_SetAction(play, this, func_8084E58C, 1);
+ Player_AnimationPlayOnce(play, this, D_8085BE84[PLAYER_ANIMGROUP_29][this->modelAnimType]);
+ return true;
+ }
+ func_8083D6DC(this, play);
+ }
+
+ return true;
+ }
+ }
+ return false;
+}
+
+s32 func_8083D860(Player* this, PlayState* play) {
+ if ((this->wallHeight >= 79.0f) &&
+ (!(this->stateFlags1 & PLAYER_STATE1_8000000) || (this->currentBoots == PLAYER_BOOTS_ZORA_UNDERWATER) ||
+ (this->actor.depthInWater < this->ageProperties->unk_2C))) {
+ s32 var_t0 = (sPlayerCurrentWallFlags & WALL_FLAG_3) ? 2 : 0;
+ s32 temp_t2 = sPlayerCurrentWallFlags & WALL_FLAG_1;
+
+ if ((var_t0 != 0) || temp_t2 ||
+ SurfaceType_CheckWallFlag2(&play->colCtx, this->actor.wallPoly, this->actor.wallBgId)) {
+ CollisionPoly* wallPoly = this->actor.wallPoly;
+ f32 sp78;
+ f32 sp74;
+ f32 zOut;
+ f32 yOut;
+ Vec3f sp48[3];
+ s32 i;
+ f32 sp40;
+ Vec3f* sp3C;
+ f32 xOut;
+
+ yOut = xOut = 0.0f;
+ if (var_t0 != 0) {
+ sp78 = this->actor.world.pos.x;
+ sp74 = this->actor.world.pos.z;
+ } else {
+ sp3C = sp48;
+ CollisionPoly_GetVerticesByBgId(wallPoly, this->actor.wallBgId, &play->colCtx, sp48);
+ sp78 = xOut = sp48[0].x;
+ sp74 = zOut = sp48[0].z;
+ yOut = sp48[0].y;
+
+ for (i = 1; i < ARRAY_COUNT(sp48); i++) {
+ sp3C++;
+
+ if (sp78 > sp3C->x) {
+ sp78 = sp3C->x;
+ } else if (xOut < sp3C->x) {
+ xOut = sp3C->x;
+ }
+
+ if (sp74 > sp3C->z) {
+ sp74 = sp3C->z;
+ } else if (zOut < sp3C->z) {
+ zOut = sp3C->z;
+ }
+
+ if (yOut > sp3C->y) {
+ yOut = sp3C->y;
+ }
+ }
+
+ sp78 = (sp78 + xOut) * 0.5f;
+ sp74 = (sp74 + zOut) * 0.5f;
+
+ xOut = ((this->actor.world.pos.x - sp78) * COLPOLY_GET_NORMAL(wallPoly->normal.z)) -
+ ((this->actor.world.pos.z - sp74) * COLPOLY_GET_NORMAL(wallPoly->normal.x));
+
+ sp40 = this->actor.world.pos.y - yOut;
+ yOut = ((s32)((sp40 / 15.0f) + 0.5f) * 15.0f) - sp40;
+ xOut = fabsf(xOut);
+ }
+
+ if (xOut < 8.0f) {
+ f32 wallPolyNormalX = COLPOLY_GET_NORMAL(wallPoly->normal.x);
+ f32 wallPolyNormalZ = COLPOLY_GET_NORMAL(wallPoly->normal.z);
+ f32 wallDistance = this->wallDistance;
+ PlayerAnimationHeader* anim;
+
+ func_80832558(play, this, func_80837C20);
+
+ this->stateFlags1 |= PLAYER_STATE1_200000;
+ this->stateFlags1 &= ~PLAYER_STATE1_8000000;
+
+ if ((var_t0 != 0) || temp_t2) {
+ if ((this->unk_AE7 = var_t0) != 0) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
+ anim = &gPlayerAnim_link_normal_Fclimb_startA;
+
+ } else {
+ anim = &gPlayerAnim_link_normal_Fclimb_hold2upL;
+ }
+ wallDistance = (this->ageProperties->unk_3C + 4.0f) - wallDistance;
+ } else {
+ anim = this->ageProperties->unk_AC;
+ wallDistance = 20.5f;
+ }
+
+ this->unk_AE8 = -2;
+ this->actor.world.pos.y += yOut;
+
+ this->actor.shape.rot.y = this->currentYaw = this->actor.wallYaw + 0x8000;
+ } else {
+ anim = this->ageProperties->unk_B0;
+ wallDistance = (this->ageProperties->unk_38 - this->ageProperties->unk_3C) + 17.0f;
+ this->unk_AE8 = -4;
+
+ this->actor.shape.rot.y = this->currentYaw = i = this->actor.wallYaw; //! FAKE
+ }
+
+ this->actor.world.pos.x = (wallDistance * wallPolyNormalX) + sp78;
+ this->actor.world.pos.z = (wallDistance * wallPolyNormalZ) + sp74;
+ func_8082DAD4(this);
+ Math_Vec3f_Copy(&this->actor.prevPos, &this->actor.world.pos);
+ Player_AnimationPlayOnce(play, this, anim);
+ func_8082E920(play, this,
+ ANIM_FLAG_1 | ANIM_FLAG_UPDATE_Y | ANIM_FLAG_4 | ANIM_FLAG_8 | ANIM_FLAG_NOMOVE |
+ ANIM_FLAG_80);
+ return true;
+ }
+ }
+ }
+
+ return false;
+}
+
+void func_8083DCC4(Player* this, PlayerAnimationHeader* anim, PlayState* play) {
+ func_8083172C(play, this, func_8084FC0C, 0);
+ PlayerAnimation_PlayOnceSetSpeed(play, &this->skelAnime, anim, 4.0f / 3.0f);
+}
+
+s32 func_8083DD1C(PlayState* play, Player* this, f32 arg2, f32 arg3, f32 arg4, f32 arg5) {
+ CollisionPoly* wallPoly;
+ s32 bgId;
+ Vec3f sp74;
+ Vec3f sp68;
+ Vec3f sp5C;
+ f32 cos = Math_CosS(this->actor.shape.rot.y);
+ f32 sin = Math_SinS(this->actor.shape.rot.y);
+
+ sp74.x = this->actor.world.pos.x + (arg5 * sin);
+ sp74.z = this->actor.world.pos.z + (arg5 * cos);
+ sp68.x = this->actor.world.pos.x + (arg4 * sin);
+ sp68.z = this->actor.world.pos.z + (arg4 * cos);
+ sp74.y = sp68.y = this->actor.world.pos.y + arg2;
+
+ if (BgCheck_EntityLineTest2(&play->colCtx, &sp74, &sp68, &sp5C, &this->actor.wallPoly, true, false, false, true,
+ &bgId, &this->actor)) {
+ f32 wallPolyNormalX;
+ f32 wallPolyNormalZ;
+
+ wallPoly = this->actor.wallPoly;
+ this->actor.bgCheckFlags |= BGCHECKFLAG_PLAYER_WALL_INTERACT;
+ this->actor.wallBgId = bgId;
+ sPlayerCurrentWallFlags = SurfaceType_GetWallFlags(&play->colCtx, wallPoly, bgId);
+
+ wallPolyNormalX = COLPOLY_GET_NORMAL(wallPoly->normal.x);
+ wallPolyNormalZ = COLPOLY_GET_NORMAL(wallPoly->normal.z);
+
+ Math_ScaledStepToS(&this->actor.shape.rot.y, Math_Atan2S_XY(-wallPolyNormalZ, -wallPolyNormalX), 0x320);
+
+ this->currentYaw = this->actor.shape.rot.y;
+ this->actor.world.pos.x = sp5C.x - (Math_SinS(this->actor.shape.rot.y) * arg3);
+ this->actor.world.pos.z = sp5C.z - (Math_CosS(this->actor.shape.rot.y) * arg3);
+
+ return true;
+ }
+
+ this->actor.bgCheckFlags &= ~BGCHECKFLAG_PLAYER_WALL_INTERACT;
+ return false;
+}
+
+void func_8083DEE4(PlayState* play, Player* this) {
+ f32 temp_fv0 = this->ageProperties->unk_38;
+
+ func_8083DD1C(play, this, 268 * 0.1f, temp_fv0 + 5.0f, temp_fv0 + 15.0f, 0.0f);
+}
+
+void func_8083DF38(Player* this, PlayerAnimationHeader* anim, PlayState* play) {
+ if (!func_80832558(play, this, func_80837BF8)) {
+ Player_SetAction(play, this, func_8084ED9C, 0);
+ }
+
+ Player_AnimationPlayOnce(play, this, anim);
+ func_8082DAD4(this);
+
+ this->actor.shape.rot.y = this->currentYaw = this->actor.wallYaw + 0x8000;
+}
+
+s32 func_8083DFC4(Player* this, PlayState* play) {
+ if (!(this->stateFlags1 & PLAYER_STATE1_800) && (this->actor.bgCheckFlags & BGCHECKFLAG_PLAYER_WALL_INTERACT) &&
+ (D_80862B20 < 0x3000)) {
+ if ((this->linearVelocity > 0.0f) && func_8083D860(this, play)) {
+ return true;
+ }
+
+ if (!func_801242B4(this) && ((this->linearVelocity == 0.0f) || !(this->stateFlags2 & PLAYER_STATE2_4)) &&
+ (sPlayerCurrentWallFlags & WALL_FLAG_6) && (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) &&
+ (this->wallHeight >= 39.0f)) {
+ this->stateFlags2 |= PLAYER_STATE2_1;
+
+ if (CHECK_BTN_ALL(sPlayerControlInput->cur.button, BTN_A)) {
+ DynaPolyActor* dyna;
+
+ if ((this->actor.wallBgId != BGCHECK_SCENE) &&
+ ((dyna = DynaPoly_GetActor(&play->colCtx, this->actor.wallBgId)) != NULL)) {
+ this->rightHandActor = &dyna->actor;
+ } else {
+ this->rightHandActor = NULL;
+ }
+
+ func_8083DF38(this, &gPlayerAnim_link_normal_push_wait, play);
+ return true;
+ }
+ }
+ }
+
+ return false;
+}
+
+s32 func_8083E14C(PlayState* play, Player* this) {
+ if ((this->actor.bgCheckFlags & BGCHECKFLAG_PLAYER_WALL_INTERACT) &&
+ ((this->stateFlags2 & PLAYER_STATE2_10) || CHECK_BTN_ALL(sPlayerControlInput->cur.button, BTN_A))) {
+ DynaPolyActor* var_v1 = NULL;
+
+ if (this->actor.wallBgId != BGCHECK_SCENE) {
+ var_v1 = DynaPoly_GetActor(&play->colCtx, this->actor.wallBgId);
+ }
+
+ if (&var_v1->actor == this->rightHandActor) {
+ if (this->stateFlags2 & PLAYER_STATE2_10) {
+ return true;
+ }
+ return false;
+ }
+ }
+
+ func_808369F4(this, play);
+ Player_AnimationPlayOnce(play, this, &gPlayerAnim_link_normal_push_wait_end);
+ this->stateFlags2 &= ~PLAYER_STATE2_10;
+ return true;
+}
+
+void func_8083E234(Player* this, PlayState* play) {
+ Player_SetAction(play, this, func_8084EE50, 0);
+ Player_AnimationPlayOnce(play, this, &gPlayerAnim_link_normal_push_start);
+ this->stateFlags2 |= PLAYER_STATE2_10;
+}
+
+void func_8083E28C(Player* this, PlayState* play) {
+ Player_SetAction(play, this, func_8084EF9C, 0);
+ Player_AnimationPlayOnce(play, this, D_8085BE84[PLAYER_ANIMGROUP_34][this->modelAnimType]);
+ this->stateFlags2 |= PLAYER_STATE2_10;
+}
+
+void func_8083E2F4(Player* this, PlayState* play) {
+ this->stateFlags1 &= ~(PLAYER_STATE1_200000 | PLAYER_STATE1_8000000);
+ func_80833AA0(this, play);
+
+ if (this->transformation == PLAYER_FORM_DEKU) {
+ this->linearVelocity = -1.7f;
+ } else {
+ this->linearVelocity = -0.4f;
+ }
+}
+
+s32 func_8083E354(Player* this, PlayState* play) {
+ if (!CHECK_BTN_ALL(sPlayerControlInput->press.button, BTN_A) &&
+ (this->actor.bgCheckFlags & BGCHECKFLAG_PLAYER_WALL_INTERACT)) {
+ if ((sPlayerCurrentWallFlags & WALL_FLAG_3) || (sPlayerCurrentWallFlags & WALL_FLAG_1) ||
+ SurfaceType_CheckWallFlag2(&play->colCtx, this->actor.wallPoly, this->actor.wallBgId)) {
+ return false;
+ }
+ }
+
+ func_8083E2F4(this, play);
+ Player_AnimSfx_PlayVoice(this, NA_SE_VO_LI_AUTO_JUMP);
+ return true;
+}
+
+s32 func_8083E404(Player* this, f32 arg1, s16 arg2) {
+ f32 sp1C = BINANG_SUB(arg2, this->actor.shape.rot.y);
+ f32 temp_fv1;
+
+ if (this->targetedActor != NULL) {
+ func_8083C62C(this, func_800B7128(this) || func_8082EF20(this));
+ }
+
+ temp_fv1 = fabsf(sp1C) / 0x8000;
+ if (((SQ(temp_fv1) * 50.0f) + 6.0f) < arg1) {
+ return 1;
+ }
+
+ if ((((1.0f - temp_fv1) * 10.0f) + 6.8f) < arg1) {
+ return -1;
+ }
+ return 0;
+}
+
+s32 func_8083E514(Player* this, f32* arg2, s16* arg3, PlayState* play) {
+ s16 temp_v1 = *arg3 - this->targetYaw;
+ u16 var_a2 = ABS_ALT(temp_v1);
+
+ if ((func_800B7128(this) || func_8082EF20(this)) && (this->targetedActor == NULL)) {
+ *arg2 *= Math_SinS(var_a2);
+
+ if (*arg2 != 0.0f) {
+ *arg3 = (((temp_v1 >= 0) ? 1 : -1) * 0x4000) + this->actor.shape.rot.y;
+ } else {
+ *arg3 = this->actor.shape.rot.y;
+ }
+
+ if (this->targetedActor != NULL) {
+ func_8083C62C(this, true);
+ } else {
+ Math_SmoothStepToS(&this->actor.focus.rot.x, (sPlayerControlInput->rel.stick_y * 240.0f), 0xE, 0xFA0, 0x1E);
+ func_80832754(this, true);
+ }
+ } else {
+ if (this->targetedActor != NULL) {
+ return func_8083E404(this, *arg2, *arg3);
+ }
+
+ func_8083C6E8(this, play);
+ if ((*arg2 != 0.0f) && (var_a2 < 0x1770)) {
+ return 1;
+ }
+
+ if ((Math_SinS(0x4000 - (var_a2 >> 1)) * 200.0f) < *arg2) {
+ return -1;
+ }
+ }
+ return 0;
+}
+
+s32 func_8083E758(Player* this, f32* arg1, s16* arg2) {
+ f32 temp_fv0;
+ u16 temp_v0;
+ s16 var_v1;
+
+ var_v1 = *arg2 - this->actor.shape.rot.y;
+ temp_v0 = ABS_ALT(var_v1);
+ temp_fv0 = Math_CosS(temp_v0);
+ *arg1 *= temp_fv0;
+
+ // Can't be (*arg1 != 0.0f)
+ if (*arg1 != 0) {
+ if (temp_fv0 > 0.0f) {
+ return 1;
+ }
+ return -1;
+ }
+ return 0;
+}
+
+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]);
+ u16 temp;
+
+ temp = (ABS_ALT(temp_a0) - 0x2000);
+ if ((temp < 0x4000) || (this->unk_B4C != 0)) {
+ return -1;
+ }
+ return 1;
+ }
+
+ return 0;
+}
+
+void func_8083E8E0(Player* this, f32 arg1, s16 arg2) {
+ s16 temp = arg2 - this->actor.shape.rot.y;
+
+ if (arg1 > 0.0f) {
+ if (temp < 0) {
+ this->unk_B44 = 0.0f;
+ } else {
+ this->unk_B44 = 1.0f;
+ }
+ }
+
+ Math_StepToF(&this->unk_B40, this->unk_B44, 0.3f);
+}
+
+void func_8083E958(PlayState* play, Player* this) {
+ PlayerAnimation_BlendToJoint(play, &this->skelAnime, func_8082EF54(this), this->unk_B38, func_8082EF9C(this),
+ this->unk_B38, this->unk_B40, this->blendTableBuffer);
+}
+
+s32 func_8083E9C4(f32 arg0, f32 arg1, f32 arg2, f32 arg3) {
+ f32 temp_fv0;
+
+ if ((arg3 == 0.0f) && (arg1 > 0.0f)) {
+ arg3 = arg2;
+ }
+ temp_fv0 = (arg0 + arg1) - arg3;
+ if (((temp_fv0 * arg1) >= 0.0f) && (((temp_fv0 - arg1) * arg1) < 0.0f)) {
+ return true;
+ }
+ return false;
+}
+
+void func_8083EA44(Player* this, f32 arg1) {
+ s32 sp24;
+ f32 updateScale = R_UPDATE_RATE / 2.0f;
+
+ arg1 *= updateScale;
+ if (arg1 < -7.25f) {
+ arg1 = -7.25f;
+ } else if (arg1 > 7.25f) {
+ arg1 = 7.25f;
+ }
+
+ sp24 = func_8083E9C4(this->unk_B38, arg1, 29.0f, 10.0f);
+
+ if (sp24 || func_8083E9C4(this->unk_B38, arg1, 29.0f, 24.0f)) {
+ Player_AnimSfx_PlayFloorWalk(this, this->linearVelocity);
+ if (this->linearVelocity > 4.0f) {
+ this->stateFlags2 |= PLAYER_STATE2_8;
+ }
+ this->actor.shape.unk_17 = sp24 ? 1 : 2;
+ }
+
+ this->unk_B38 += arg1;
+ if (this->unk_B38 < 0.0f) {
+ this->unk_B38 += 29.0f;
+ } else if (this->unk_B38 >= 29.0f) {
+ this->unk_B38 -= 29.0f;
+ }
+}
+
+void Player_ChooseIdleAnim(PlayState* play, Player* this) {
+ PlayerAnimationHeader* anim;
+ u32 healthIsCritical;
+ PlayerAnimationHeader** animPtr;
+ s32 animIndex;
+ s32 rand;
+ f32 morphFrames;
+ s16 lastFrame;
+
+ if (((this->actor.id != ACTOR_PLAYER) && !(healthIsCritical = (this->actor.colChkInfo.health < 0x64))) ||
+ ((this->actor.id == ACTOR_PLAYER) &&
+ (((this->targetedActor != NULL) ||
+ ((this->transformation != PLAYER_FORM_FIERCE_DEITY) && (this->transformation != PLAYER_FORM_HUMAN)) ||
+ (this->currentMask == PLAYER_MASK_SCENTS)) ||
+ (!(healthIsCritical = LifeMeter_IsCritical()) && (this->unk_AA4 = ((this->unk_AA4 + 1) & 1)))))) {
+ this->stateFlags2 &= ~PLAYER_STATE2_10000000;
+ anim = func_8082ED20(this);
+ } else {
+ this->stateFlags2 |= PLAYER_STATE2_10000000;
+
+ if (this->stateFlags1 & PLAYER_STATE1_800) {
+ anim = func_8082ED20(this);
+ } else {
+ animIndex = play->roomCtx.curRoom.behaviorType2;
+
+ if (healthIsCritical) {
+ if (this->unk_AA4 >= 0) {
+ animIndex = 7;
+ this->unk_AA4 = -1;
+ } else {
+ animIndex = 8;
+ }
+ } else {
+ rand = Rand_ZeroOne() * 5.0f;
+ if (rand < 4) {
+ if (((rand != 0) && (rand != 3)) ||
+ ((this->rightHandType == PLAYER_MODELTYPE_RH_SHIELD) &&
+ ((rand == 3) || (Player_GetMeleeWeaponHeld(this) != PLAYER_MELEEWEAPON_NONE)))) {
+ if ((rand == 0) && Player_IsHoldingTwoHandedWeapon(this)) {
+ rand = 4;
+ }
+ animIndex = rand + 9;
+ }
+ }
+ }
+
+ animPtr = &sPlayerIdleAnimations[animIndex][0];
+ if (this->modelAnimType != PLAYER_ANIMTYPE_1) {
+ animPtr = &sPlayerIdleAnimations[animIndex][1];
+ }
+ anim = *animPtr;
+ }
+ }
+
+ lastFrame = 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)) {
+ morphFrames = 0.0f;
+ } else {
+ morphFrames = -6.0f;
+ }
+
+ PlayerAnimation_Change(play, &this->skelAnime, anim, (2.0f / 3.0f) * D_8085C3E4, 0.0f, lastFrame, ANIMMODE_ONCE,
+ morphFrames);
+}
+
+void func_8083EE60(Player* this, PlayState* play) {
+ f32 temp_fv0;
+ f32 var_fs0;
+
+ if (this->unk_B34 < 1.0f) {
+ f32 temp_fs0 = R_UPDATE_RATE / 2.0f;
+
+ func_8083EA44(this, REG(35) / 1000.0f);
+ PlayerAnimation_LoadToJoint(play, &this->skelAnime, D_8085BE84[PLAYER_ANIMGROUP_30][this->modelAnimType],
+ this->unk_B38);
+ this->unk_B34 += (1.0f * 1.0f) * temp_fs0;
+ if (this->unk_B34 >= 1.0f) {
+ this->unk_B34 = 1.0f;
+ }
+ var_fs0 = this->unk_B34;
+ } else {
+ temp_fv0 = this->linearVelocity - (REG(48) / 100.0f);
+
+ if (temp_fv0 < 0.0f) {
+ var_fs0 = 1.0f;
+ func_8083EA44(this, ((REG(35)) / 1000.0f) + (((REG(36)) / 1000.0f) * this->linearVelocity));
+
+ PlayerAnimation_LoadToJoint(play, &this->skelAnime, D_8085BE84[PLAYER_ANIMGROUP_30][this->modelAnimType],
+ this->unk_B38);
+ } else {
+ var_fs0 = (REG(37) / 1000.0f) * temp_fv0;
+ if (var_fs0 < 1.0f) {
+ func_8083EA44(this, (REG(35) / 1000.0f) + ((REG(36) / 1000.0f) * this->linearVelocity));
+ } else {
+ var_fs0 = 1.0f;
+ func_8083EA44(this, (REG(39) / 100.0f) + ((REG(38) / 1000.0f) * temp_fv0));
+ }
+
+ PlayerAnimation_LoadToMorph(play, &this->skelAnime, D_8085BE84[PLAYER_ANIMGROUP_30][this->modelAnimType],
+ this->unk_B38);
+ PlayerAnimation_LoadToJoint(play, &this->skelAnime, &gPlayerAnim_link_normal_back_run,
+ this->unk_B38 * (16.0f / 29.0f));
+ }
+ }
+ if (var_fs0 < 1.0f) {
+ PlayerAnimation_InterpJointMorph(play, &this->skelAnime, 1.0f - var_fs0);
+ }
+}
+
+void func_8083F144(Player* this, PlayState* play) {
+ Player_SetAction(play, this, func_8084A794, 1);
+ func_8082E438(play, this, &gPlayerAnim_link_normal_back_brake);
+}
+
+s32 func_8083F190(Player* this, f32* arg1, s16* arg2, PlayState* play) {
+ if (this->linearVelocity > 6.0f) {
+ func_8083F144(this, play);
+ return true;
+ }
+
+ if (*arg1 != 0.0f) {
+ if (func_80832F24(this)) {
+ *arg1 = 0.0f;
+ *arg2 = this->currentYaw;
+ } else {
+ return true;
+ }
+ }
+ return false;
+}
+
+void func_8083F230(Player* this, PlayState* play) {
+ Player_SetAction(play, this, func_8084A884, 1);
+ Player_AnimationPlayOnce(play, this, &gPlayerAnim_link_normal_back_brake_end);
+}
+
+void func_8083F27C(PlayState* play, Player* this) {
+ f32 temp_fv0;
+ PlayerAnimationHeader* sp38;
+ PlayerAnimationHeader* sp34;
+
+ sp38 = D_8085BE84[PLAYER_ANIMGROUP_23][this->modelAnimType];
+ sp34 = D_8085BE84[PLAYER_ANIMGROUP_24][this->modelAnimType];
+
+ this->skelAnime.animation = sp38;
+
+ func_8083EA44(this, (REG(30) / 1000.0f) + ((REG(32) / 1000.0f) * this->linearVelocity));
+
+ temp_fv0 = this->unk_B38 * (16.0f / 29.0f);
+ PlayerAnimation_BlendToJoint(play, &this->skelAnime, sp34, temp_fv0, sp38, temp_fv0, this->unk_B40,
+ this->blendTableBuffer);
+}
+
+void func_8083F358(Player* this, s32 arg1, PlayState* play) {
+ PlayerAnimationHeader* var_v0;
+ f32 var_fv1;
+ s16 var_a1;
+
+ if (ABS_ALT(D_80862B28) < 0xE38) {
+ var_a1 = 0;
+ } else {
+ var_a1 = CLAMP(D_80862B28, -0x2AAA, 0x2AAA);
+ }
+
+ Math_ScaledStepToS(&this->unk_B70, var_a1, 0x190);
+ if ((this->modelAnimType == PLAYER_ANIMTYPE_3) || ((this->unk_B70 == 0) && (this->unk_AB8 <= 0.0f))) {
+ if (arg1 == 0) {
+ PlayerAnimation_LoadToJoint(play, &this->skelAnime, D_8085BE84[PLAYER_ANIMGROUP_1][this->modelAnimType],
+ this->unk_B38);
+ } else {
+ PlayerAnimation_LoadToMorph(play, &this->skelAnime, D_8085BE84[PLAYER_ANIMGROUP_1][this->modelAnimType],
+ this->unk_B38);
+ }
+ return;
+ }
+
+ if (this->unk_B70 != 0) {
+ var_fv1 = this->unk_B70 / (f32)0x2AAA;
+ } else {
+ var_fv1 = this->unk_AB8 * 0.0006f;
+ }
+
+ var_fv1 *= fabsf(this->linearVelocity) * 0.5f;
+ if (var_fv1 > 1.0f) {
+ var_fv1 = 1.0f;
+ }
+
+ if (var_fv1 < 0.0f) {
+ var_v0 = &gPlayerAnim_link_normal_climb_down;
+ var_fv1 = -var_fv1;
+ } else {
+ var_v0 = &gPlayerAnim_link_normal_climb_up;
+ }
+
+ if (arg1 == 0) {
+ PlayerAnimation_BlendToJoint(play, &this->skelAnime, D_8085BE84[PLAYER_ANIMGROUP_1][this->modelAnimType],
+ this->unk_B38, var_v0, this->unk_B38, var_fv1, this->blendTableBuffer);
+ } else {
+ PlayerAnimation_BlendToMorph(play, &this->skelAnime, D_8085BE84[PLAYER_ANIMGROUP_1][this->modelAnimType],
+ this->unk_B38, var_v0, this->unk_B38, var_fv1, this->blendTableBuffer);
+ }
+}
+
+void func_8083F57C(Player* this, PlayState* play) {
+ f32 temp_fv0;
+ f32 var_fs0;
+
+ if (this->unk_B34 < 1.0f) {
+ f32 temp_fs0;
+
+ temp_fs0 = R_UPDATE_RATE / 2.0f;
+ func_8083EA44(this, REG(35) / 1000.0f);
+ PlayerAnimation_LoadToJoint(play, &this->skelAnime, D_8085BE84[PLAYER_ANIMGROUP_1][this->modelAnimType],
+ this->unk_B38);
+
+ // required
+ this->unk_B34 += 1 * temp_fs0;
+ if (this->unk_B34 >= 1.0f) {
+ this->unk_B34 = 1.0f;
+ }
+ var_fs0 = this->unk_B34;
+ } else {
+ temp_fv0 = (this->linearVelocity - (REG(48) / 100.0f));
+ if (temp_fv0 < 0.0f) {
+ var_fs0 = 1.0f;
+ func_8083EA44(this, (REG(35) / 1000.0f) + ((REG(36) / 1000.0f) * this->linearVelocity));
+ func_8083F358(this, 0, play);
+ } else {
+ var_fs0 = (REG(37) / 1000.0f) * temp_fv0;
+ if (var_fs0 < 1.0f) {
+ func_8083EA44(this, (REG(35) / 1000.0f) + ((REG(36) / 1000.0f) * this->linearVelocity));
+ } else {
+ var_fs0 = 1.0f;
+ func_8083EA44(this, (REG(39) / 100.0f) + ((REG(38) / 1000.0f) * temp_fv0));
+ }
+ func_8083F358(this, 1, play);
+ PlayerAnimation_LoadToJoint(play, &this->skelAnime, func_8082EEE0(this), this->unk_B38 * (20.0f / 29.0f));
+ }
+ }
+
+ if (var_fs0 < 1.0f) {
+ PlayerAnimation_InterpJointMorph(play, &this->skelAnime, 1.0f - var_fs0);
+ }
+}
+
+void func_8083F828(Vec3f* arg0, Vec3f* arg1, f32 arg2, f32 arg3, f32 arg4) {
+ arg1->x = randPlusMinusPoint5Scaled(arg3) + arg0->x;
+ arg1->y = randPlusMinusPoint5Scaled(arg4) + (arg0->y + arg2);
+ arg1->z = randPlusMinusPoint5Scaled(arg3) + arg0->z;
+}
+
+Color_RGBA8 D_8085D26C = { 255, 255, 255, 255 };
+Vec3f D_8085D270 = { 0.0f, 0.04f, 0.0f };
+
+s32 func_8083F8A8(PlayState* play, Player* this, f32 radius, s32 countMax, f32 randAccelWeight, s32 scale,
+ s32 scaleStep, s32 useLighting) {
+ static Vec3f D_8085D27C = { 0.0f, 0.0f, 0.0f };
+ static Vec3f D_8085D288 = { 0.0f, 0.0f, 0.0f };
+
+ if ((countMax < 0) || (this->floorSfxOffset == NA_SE_PL_WALK_SNOW - SFX_FLAG)) {
+ s32 count = func_80173B48(&play->state) / 20000000;
+ Vec3f pos;
+ s32 i;
+
+ count = (count >= ABS_ALT(countMax)) ? ABS_ALT(countMax) : count;
+ for (i = 0; i < count; i++) {
+ func_8083F828(&this->actor.world.pos, &pos, 0.0f, 40.0f, 10.0f);
+ D_8085D27C.x = randPlusMinusPoint5Scaled(3.0f);
+ D_8085D27C.z = randPlusMinusPoint5Scaled(3.0f);
+ EffectSsDust_Spawn(play, 0, &pos, &D_8085D27C, &D_8085D270, &D_8085D26C, &D_8085D26C, scale, scaleStep, 42,
+ 0);
+ }
+
+ return true;
+ } else if ((this->floorSfxOffset == NA_SE_PL_WALK_GROUND - SFX_FLAG) ||
+ (this->floorSfxOffset == NA_SE_PL_WALK_SAND - SFX_FLAG)) {
+ s32 count = func_80173B48(&play->state) / 12000000;
+
+ if (count > 0) {
+ Actor_SpawnFloorDustRing(play, &this->actor, &this->actor.world.pos, radius,
+ (count < countMax) ? count : countMax, randAccelWeight, scale, scaleStep,
+ useLighting);
+
+ return true;
+ }
+ } else if (this->floorSfxOffset == NA_SE_PL_WALK_GRASS - SFX_FLAG) {
+ s32 count = func_80173B48(&play->state) / 12000000;
+ Vec3f velocity;
+ Vec3f pos;
+ s32 i;
+
+ count = (count >= countMax) ? countMax : count;
+ for (i = 0; i < count; i++) {
+ func_8083F828(&this->actor.world.pos, &pos, 0.0f, 20.0f, 20.0f);
+ velocity.x = randPlusMinusPoint5Scaled(3.0f);
+ velocity.y = Rand_ZeroFloat(2.0f);
+ velocity.z = randPlusMinusPoint5Scaled(3.0f);
+ D_8085D288.y = -0.1f;
+ EffectSsHahen_Spawn(play, &pos, &velocity, &D_8085D288, 0, 0x96, 1, 0x10, gKakeraLeafTip);
+ }
+ }
+
+ return false;
+}
+
+s32 func_8083FBC4(PlayState* play, Player* this) {
+ if ((this->floorSfxOffset == NA_SE_PL_WALK_GROUND - SFX_FLAG) ||
+ (this->floorSfxOffset == NA_SE_PL_WALK_SAND - SFX_FLAG)) {
+ Vec3f* feetPos = this->actor.shape.feetPos;
+ s32 i;
+
+ for (i = 0; i < ARRAY_COUNT(this->actor.shape.feetPos); i++) {
+ func_800B1210(play, feetPos, &gZeroVec3f, &gZeroVec3f, 50, 30);
+ feetPos++;
+ }
+
+ return true;
+ }
+
+ if (this->floorSfxOffset == NA_SE_PL_WALK_SNOW - SFX_FLAG) {
+ Vec3f* feetPos = this->actor.shape.feetPos;
+ s32 i;
+
+ for (i = 0; i < ARRAY_COUNT(this->actor.shape.feetPos); i++) {
+ EffectSsDust_Spawn(play, 0, feetPos, &gZeroVec3f, &D_8085D270, &D_8085D26C, &D_8085D26C, 100, 40, 17, 0);
+ feetPos++;
+ }
+
+ return true;
+ }
+
+ return false;
+}
+
+s32 func_8083FCF0(PlayState* play, Player* this, f32 arg2, f32 arg3, f32 arg4) {
+ if (arg4 < this->skelAnime.curFrame) {
+ func_8082DC38(this);
+ } else if (arg2 <= this->skelAnime.curFrame) {
+ this->stateFlags3 |= PLAYER_STATE3_2000000;
+ func_8082FA5C(play, this,
+ (arg3 <= this->skelAnime.curFrame) ? PLAYER_MELEE_WEAPON_STATE_1
+ : PLAYER_MELEE_WEAPON_STATE_MINUS_1);
+ return true;
+ }
+ return false;
+}
+
+// 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)) {
+ //! 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);
+ this->unk_AE7 = 1;
+ this->meleeWeaponAnimation = PLAYER_MWA_STAB_1H;
+ this->currentYaw = this->actor.shape.rot.y + this->upperLimbRot.y;
+ this->unk_ADD = 0;
+ return true;
+ }
+ return false;
+}
+
+s32 func_8083FE38(Player* this, PlayState* play) {
+ return func_80838A90(this, play) || func_808391D8(this, play) || func_8083D23C(this, play);
+}
+
+void Player_RequestQuakeAndRumble(PlayState* play, Player* this, u16 sfxId) {
+ Player_RequestQuake(play, 27767, 7, 20);
+ Player_RequestRumble(play, this, 255, 20, 150, SQ(0));
+ Player_PlaySfx(this, sfxId);
+}
+
+void func_8083FEF4(PlayState* play, Player* this) {
+ Inventory_ChangeAmmo(ITEM_STICK, -1);
+ func_80831990(play, this, ITEM_NONE);
+}
+
+s32 func_8083FF30(PlayState* play, Player* this) {
+ if ((this->heldItemAction == PLAYER_IA_STICK) && (this->unk_B0C > 0.5f)) {
+ if (AMMO(ITEM_STICK) != 0) {
+ EffectSsStick_Spawn(play, &this->bodyPartsPos[PLAYER_BODYPART_RIGHT_HAND],
+ BINANG_ADD(this->actor.shape.rot.y, 0x8000));
+ this->unk_B0C = 0.5f;
+ func_8083FEF4(play, this);
+ Player_PlaySfx(this, NA_SE_IT_WOODSTICK_BROKEN);
+ }
+ return true;
+ }
+
+ return false;
+}
+
+// handles razor sword health and breaking
+s32 func_8083FFEC(PlayState* play, Player* this) {
+ if (this->heldItemAction == PLAYER_IA_SWORD_RAZOR) {
+ if (gSaveContext.save.saveInfo.playerData.swordHealth > 0) {
+ 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_PlaySfx(this, NA_SE_IT_MAJIN_SWORD_BROKEN);
+ if (Message_GetState(&play->msgCtx) == TEXT_STATE_NONE) {
+ Message_StartTextbox(play, 0xF9, NULL);
+ }
+ }
+ }
+ return true;
+ }
+ return false;
+}
+
+// Could return the last function, but never used as such
+void func_80840094(PlayState* play, Player* this) {
+ func_8083FF30(play, this);
+ func_8083FFEC(play, this);
+}
+
+PlayerAnimationHeader* D_8085D294[] = {
+ &gPlayerAnim_link_fighter_rebound,
+ &gPlayerAnim_link_fighter_rebound_long,
+ &gPlayerAnim_link_fighter_reboundR,
+ &gPlayerAnim_link_fighter_rebound_longR,
+};
+
+void func_808400CC(PlayState* play, Player* this) {
+ if (func_8084B5C0 != this->actionFunc) {
+ func_8082DD2C(play, this);
+ if ((this->transformation != PLAYER_FORM_HUMAN) && (this->transformation != PLAYER_FORM_FIERCE_DEITY)) {
+ u8 moveFlags = this->skelAnime.moveFlags;
+ s32 pad;
+
+ this->skelAnime.moveFlags = 0;
+ Player_SetAction(play, this, func_80854C70, 0);
+ this->skelAnime.moveFlags = moveFlags;
+ } else {
+ s32 var_v1;
+ s32 pad;
+
+ Player_SetAction(play, this, func_80854C70, 0);
+ if (func_80123420(this)) {
+ var_v1 = 2;
+ } else {
+ var_v1 = 0;
+ }
+ func_8082DB90(play, this, D_8085D294[Player_IsHoldingTwoHandedWeapon(this) + var_v1]);
+ }
+ }
+
+ Player_RequestRumble(play, this, 180, 20, 100, SQ(0));
+ this->linearVelocity = -18.0f;
+ func_80840094(play, this);
+}
+
+s32 func_808401F4(PlayState* play, Player* this) {
+ if (this->meleeWeaponState >= PLAYER_MELEE_WEAPON_STATE_1) {
+ s32 temp_v0_3;
+
+ if (this->meleeWeaponAnimation < PLAYER_MWA_SPIN_ATTACK_1H) {
+ if (!(this->meleeWeaponQuads[0].base.atFlags & AT_BOUNCED) &&
+ !(this->meleeWeaponQuads[1].base.atFlags & AT_BOUNCED)) {
+ if (this->skelAnime.curFrame >= 2.0f) {
+ CollisionPoly* poly;
+ s32 bgId;
+ Vec3f spC8;
+ Vec3f pos;
+ Vec3f spB0;
+ Vec3f* var_a1;
+ Vec3f* temp_a0 = &this->meleeWeaponInfo[0].tip;
+ f32 var_fv1;
+
+ if (this->linearVelocity >= 0.0f) {
+ var_a1 = &this->meleeWeaponInfo[0].base;
+ if ((this->transformation == PLAYER_FORM_GORON) || (this->actor.id == ACTOR_EN_TEST3)) {
+ var_a1 = &this->unk_AF0[1];
+ }
+
+ var_fv1 = Math_Vec3f_DistXYZAndStoreDiff(temp_a0, var_a1, &spB0);
+ if (var_fv1 != 0.0f) {
+ var_fv1 = (var_fv1 + 10.0f) / var_fv1;
+ }
+
+ spC8.x = temp_a0->x + (spB0.x * var_fv1);
+ spC8.y = temp_a0->y + (spB0.y * var_fv1);
+ spC8.z = temp_a0->z + (spB0.z * var_fv1);
+ if (BgCheck_EntityLineTest2(&play->colCtx, &spC8, temp_a0, &pos, &poly, 1, 0, 0, 1, &bgId,
+ &this->actor)) {
+ if (!SurfaceType_IsIgnoredByEntities(&play->colCtx, poly, bgId) &&
+ (SurfaceType_GetFloorType(&play->colCtx, poly, bgId) != FLOOR_TYPE_6) &&
+ !func_800B90AC(play, &this->actor, poly, bgId, &pos)) {
+ if (this->transformation == PLAYER_FORM_GORON) {
+ MtxF sp64;
+ Vec3s actorRot;
+ DynaPolyActor* temp_v0;
+
+ func_8082DF2C(play);
+ Player_RequestQuakeAndRumble(play, this, NA_SE_IT_HAMMER_HIT);
+ if (this->transformation == PLAYER_FORM_GORON) {
+ Actor_SetPlayerImpact(play, PLAYER_IMPACT_BONK, 2, 100.0f,
+ &this->actor.world.pos);
+ func_800C0094(poly, pos.x, pos.y, pos.z, &sp64);
+ Matrix_MtxFToYXZRot(&sp64, &actorRot, true);
+ Actor_Spawn(&play->actorCtx, play, ACTOR_EN_TEST, pos.x, pos.y, pos.z,
+ actorRot.x, actorRot.y, actorRot.z, 500);
+ }
+
+ if (bgId != BGCHECK_SCENE) {
+ temp_v0 = DynaPoly_GetActor(&play->colCtx, bgId);
+
+ if (((this->meleeWeaponQuads[0].base.atFlags & AT_HIT) &&
+ (&temp_v0->actor == this->meleeWeaponQuads[0].base.at)) ||
+ ((this->meleeWeaponQuads[1].base.atFlags & AT_HIT) &&
+ (&temp_v0->actor == this->meleeWeaponQuads[1].base.at))) {
+ return false;
+ }
+ }
+
+ func_808400CC(play, this);
+ if (this->transformation != PLAYER_FORM_GORON) {
+ return true;
+ }
+ return false;
+ }
+
+ if (this->linearVelocity >= 0.0f) {
+ SurfaceMaterial surfaceMaterial =
+ SurfaceType_GetMaterial(&play->colCtx, poly, bgId);
+
+ if (surfaceMaterial == SURFACE_MATERIAL_WOOD) {
+ CollisionCheck_SpawnShieldParticlesWood(play, &pos, &this->actor.projectedPos);
+ } else {
+ pos.x += 8.0f * COLPOLY_GET_NORMAL(poly->normal.x);
+ pos.y += 8.0f * COLPOLY_GET_NORMAL(poly->normal.y);
+ pos.x += 8.0f * COLPOLY_GET_NORMAL(poly->normal.z);
+ CollisionCheck_SpawnShieldParticles(play, &pos);
+
+ if (surfaceMaterial == SURFACE_MATERIAL_DIRT_SOFT) {
+ Player_PlaySfx(this, NA_SE_IT_WALL_HIT_SOFT);
+ } else {
+ Player_PlaySfx(this, NA_SE_IT_WALL_HIT_HARD);
+ }
+ }
+
+ func_80840094(play, this);
+ Player_RequestRumble(play, this, 180, 20, 100, SQ(0));
+ this->linearVelocity = -14.0f;
+ }
+ }
+ }
+ }
+ }
+ } else {
+ func_808400CC(play, this);
+ func_8082DF2C(play);
+ return true;
+ }
+ }
+
+ temp_v0_3 = (this->meleeWeaponQuads[0].base.atFlags & AT_HIT) != 0;
+ if (temp_v0_3 || (this->meleeWeaponQuads[1].base.atFlags & AT_HIT)) {
+ if ((this->meleeWeaponAnimation < PLAYER_MWA_SPIN_ATTACK_1H) &&
+ (this->transformation != PLAYER_FORM_GORON)) {
+ Actor* temp_v1 = this->meleeWeaponQuads[temp_v0_3 ? 0 : 1].base.at;
+
+ if ((temp_v1 != NULL) && (temp_v1->id != ACTOR_EN_KANBAN)) {
+ func_8082DF2C(play);
+ }
+ }
+
+ if (!func_8083FF30(play, this)) {
+ func_8083FFEC(play, this);
+ if (this->actor.colChkInfo.atHitEffect == 1) {
+ this->actor.colChkInfo.damage = 8;
+ func_80833B18(play, this, 4, 0.0f, 0.0f, this->actor.shape.rot.y, 20);
+ return true;
+ }
+ }
+ }
+ }
+
+ return false;
+}
+
+Vec3f D_8085D2A4 = { 0.0f, 0.0f, 5.0f };
+
+void func_80840770(PlayState* play, Player* this) {
+ if (this->unk_AE8 != 0) {
+ if (this->unk_AE8 > 0) {
+ this->unk_AE8--;
+ if (this->unk_AE8 == 0) {
+ if (this->stateFlags1 & PLAYER_STATE1_8000000) {
+ PlayerAnimation_Change(play, &this->skelAnime, &gPlayerAnim_link_swimer_swim_wait, 1.0f, 0.0f,
+ Animation_GetLastFrame(&gPlayerAnim_link_swimer_swim_wait), ANIMMODE_ONCE,
+ -16.0f);
+ } else {
+ PlayerAnimation_Change(play, &this->skelAnime, &gPlayerAnim_link_derth_rebirth, 1.0f, 99.0f,
+ Animation_GetLastFrame(&gPlayerAnim_link_derth_rebirth), ANIMMODE_ONCE,
+ 0.0f);
+ }
+ gSaveContext.healthAccumulator = 0xA0;
+ this->unk_AE8 = -1;
+ }
+ } else if (gSaveContext.healthAccumulator == 0) {
+ Player_StopCutscene(this);
+
+ this->stateFlags1 &= ~PLAYER_STATE1_80;
+ if (this->stateFlags1 & PLAYER_STATE1_8000000) {
+ func_808353DC(play, this);
+ } else {
+ func_8085B384(this, play);
+ }
+
+ this->unk_D6B = 20;
+ func_808339B4(this, -20);
+ Audio_SetBgmVolumeOn();
+ }
+ } else if (this->unk_AE7 != 0) {
+ Player_StopCutscene(this);
+ this->csId = play->playerCsIds[PLAYER_CS_ID_REVIVE];
+ this->unk_AE8 = 60;
+ Player_SpawnFairy(play, this, &this->actor.world.pos, &D_8085D2A4, 5);
+ Player_PlaySfx(this, NA_SE_EV_FIATY_HEAL - SFX_FLAG);
+ } else if (play->gameOverCtx.state == GAMEOVER_DEATH_WAIT_GROUND) {
+ play->gameOverCtx.state = GAMEOVER_DEATH_FADE_OUT;
+ }
+}
+
+void func_80840980(Player* this, u16 sfxId) {
+ Player_AnimSfx_PlayVoice(this, sfxId);
+}
+
+void func_808409A8(PlayState* play, Player* this, f32 speed, f32 yVelocity) {
+ Actor* heldActor = this->heldActor;
+
+ if (!func_808313A8(play, this, heldActor)) {
+ heldActor->world.rot.y = this->actor.shape.rot.y;
+ heldActor->speed = speed;
+ heldActor->velocity.y = yVelocity;
+ func_808309CC(play, this);
+ Player_PlaySfx(this, NA_SE_PL_THROW);
+ Player_AnimSfx_PlayVoice(this, NA_SE_VO_LI_SWORD_N);
+ }
+}
+
+// Check if bonked and if so, rumble, play sound, etc.
+s32 func_80840A30(PlayState* play, Player* this, f32* arg2, f32 arg3) {
+ Actor* cylinderOc = NULL;
+
+ if (arg3 <= *arg2) {
+ // If interacting with a wall and close to facing it
+ if (((this->actor.bgCheckFlags & BGCHECKFLAG_PLAYER_WALL_INTERACT) && (D_80862B24 < 0x1C00)) ||
+ // or, impacting something's cylinder
+ (((this->cylinder.base.ocFlags1 & OC1_HIT) && (cylinderOc = this->cylinder.base.oc) != NULL) &&
+ // and that something is a Beaver Race ring,
+ ((cylinderOc->id == ACTOR_EN_TWIG) ||
+ // or something is a tree and `this` is close to facing it (note the this actor's facing direction would
+ // be antiparallel to the cylinder's actor's yaw if this was directly facing it)
+ (((cylinderOc->id == ACTOR_EN_WOOD02) || (cylinderOc->id == ACTOR_EN_SNOWWD) ||
+ (cylinderOc->id == ACTOR_OBJ_TREE)) &&
+ (ABS_ALT(BINANG_SUB(this->actor.world.rot.y, cylinderOc->yawTowardsPlayer)) > 0x6000))))) {
+
+ if (!func_8082DA90(play)) {
+ if (this->doorType == PLAYER_DOORTYPE_STAIRCASE) {
+ func_8085B384(this, play);
+ return true;
+ }
+
+ if (cylinderOc != NULL) {
+ cylinderOc->home.rot.y = 1;
+ } else if (this->actor.wallBgId != BGCHECK_SCENE) { // i.e. was an actor
+ DynaPolyActor* wallPolyActor = DynaPoly_GetActor(&play->colCtx, this->actor.wallBgId);
+
+ // Large crates, barrels and palm trees
+ if ((wallPolyActor != NULL) &&
+ ((wallPolyActor->actor.id == ACTOR_OBJ_KIBAKO2) ||
+ (wallPolyActor->actor.id == ACTOR_OBJ_TARU) || (wallPolyActor->actor.id == ACTOR_OBJ_YASI))) {
+ wallPolyActor->actor.home.rot.z = 1;
+ }
+ }
+
+ if (!(this->stateFlags3 & PLAYER_STATE3_1000)) {
+ if ((this->stateFlags3 & PLAYER_STATE3_8000) && (func_8084CA24 != this->actionFunc)) {
+ Player_SetAction(play, this, func_80851B58, 0);
+ func_8082DB90(play, this, &gPlayerAnim_link_swimer_swim_hit);
+ func_8082DD2C(play, this);
+ this->linearVelocity *= 0.2f;
+ } else {
+ Player_SetAction(play, this, func_8084C6EC, 0);
+ Player_AnimationPlayOnce(play, this, D_8085BE84[PLAYER_ANIMGROUP_16][this->modelAnimType]);
+ this->unk_AE8 = 1;
+ }
+ }
+
+ this->linearVelocity = -this->linearVelocity;
+ Player_RequestQuake(play, 33267, 3, 12);
+ Player_RequestRumble(play, this, 255, 20, 150, SQ(0));
+ Actor_SetPlayerImpact(play, PLAYER_IMPACT_BONK, 2, 100.0f, &this->actor.world.pos);
+ Player_PlaySfx(this, NA_SE_PL_BODY_HIT);
+ Player_AnimSfx_PlayVoice(this, NA_SE_VO_LI_CLIMB_END);
+ return true;
+ }
+ }
+ }
+ return false;
+}
+
+s32 func_80840CD4(Player* this, PlayState* play) {
+ if (func_808387A0(play, this)) {
+ this->stateFlags2 |= PLAYER_STATE2_20000;
+ } else if (!CHECK_BTN_ALL(sPlayerControlInput->cur.button, BTN_B)) {
+ PlayerMeleeWeaponAnimation meleeWeaponAnim;
+
+ if ((this->unk_B08 >= 0.85f) || func_808333CC(this)) {
+ meleeWeaponAnim = D_8085CF84[Player_IsHoldingTwoHandedWeapon(this)];
+ } else {
+ meleeWeaponAnim = D_8085CF80[Player_IsHoldingTwoHandedWeapon(this)];
+ }
+ func_80833864(play, this, meleeWeaponAnim);
+ func_808339B4(this, -8);
+ this->stateFlags2 |= PLAYER_STATE2_20000;
+ if (this->unk_AE3[this->unk_ADE] == 0) {
+ this->stateFlags2 |= PLAYER_STATE2_40000000;
+ }
+ } else {
+ return false;
+ }
+
+ return true;
+}
+
+void func_80840DEC(Player* this, PlayState* play) {
+ Player_SetAction(play, this, func_8084CE84, 1);
+}
+
+void func_80840E24(Player* this, PlayState* play) {
+ Player_SetAction(play, this, func_8084D18C, 1);
+}
+
+void func_80840E5C(Player* this, PlayState* play) {
+ func_808369F4(this, play);
+ func_8082DC38(this);
+ func_8082E438(play, this, D_8085CF68[Player_IsHoldingTwoHandedWeapon(this)]);
+ this->currentYaw = this->actor.shape.rot.y;
+}
+
+void func_80840EC0(Player* this, PlayState* play) {
+ Player_SetAction(play, this, func_8084CCEC, 1);
+ Player_AnimationPlayLoop(play, this, D_8085CF60[Player_IsHoldingTwoHandedWeapon(this)]);
+ this->unk_AE8 = 1;
+ this->unk_B38 = 0.0f;
+}
+
+// Spin attack size
+void func_80840F34(Player* this) {
+ Math_StepToF(&this->unk_B08, (CHECK_WEEKEVENTREG(WEEKEVENTREG_23_02)) ? 1.0f : 0.5f, 0.02f);
+}
+
+s32 func_80840F90(PlayState* play, Player* this, CsCmdActorCue* playerAction, f32 arg3, s16 arg4, s32 arg5) {
+ if ((arg5 != 0) && (this->linearVelocity == 0.0f)) {
+ return PlayerAnimation_Update(play, &this->skelAnime);
+ }
+
+ if (arg5 != 2) {
+ f32 halfUpdateRate = R_UPDATE_RATE / 2.0f;
+ f32 curDiffX = playerAction->endPos.x - this->actor.world.pos.x;
+ f32 curDiffZ = playerAction->endPos.z - this->actor.world.pos.z;
+ f32 scaledCurDist = sqrtf(SQ(curDiffX) + SQ(curDiffZ)) / halfUpdateRate;
+ s32 framesLeft = (playerAction->endFrame - play->csCtx.curFrame) + 1;
+
+ arg4 = Math_Atan2S_XY(curDiffZ, curDiffX);
+
+ if (arg5 == 1) {
+ f32 distX = playerAction->endPos.x - playerAction->startPos.x;
+ f32 distZ = playerAction->endPos.z - playerAction->startPos.z;
+ s32 temp = (((sqrtf(SQ(distX) + SQ(distZ)) / halfUpdateRate) /
+ (playerAction->endFrame - playerAction->startFrame)) /
+ 1.5f) *
+ 4.0f;
+ if (temp >= framesLeft) {
+ arg3 = 0.0f;
+ arg4 = this->actor.shape.rot.y;
+ } else {
+ arg3 = scaledCurDist / ((framesLeft - temp) + 1);
+ }
+ } else {
+ arg3 = scaledCurDist / framesLeft;
+ }
+ }
+
+ this->stateFlags2 |= PLAYER_STATE2_20;
+ func_8083F57C(this, play);
+ func_8083CB58(this, arg3, arg4);
+ if ((arg3 == 0.0f) && (this->linearVelocity == 0.0f)) {
+ func_80839CD8(this, play);
+ }
+
+ return false;
+}
+
+s32 func_808411D4(PlayState* play, Player* this, f32* arg2, s32 arg3) {
+ f32 xDiff = this->unk_3A0.x - this->actor.world.pos.x;
+ f32 yDiff = this->unk_3A0.z - this->actor.world.pos.z;
+ s32 sp2C;
+ s32 pad2;
+ s16 var_v1;
+
+ sp2C = sqrtf(SQ(xDiff) + SQ(yDiff));
+ var_v1 = Math_Vec3f_Yaw(&this->actor.world.pos, &this->unk_3A0);
+ if (sp2C < arg3) {
+ *arg2 = 0.0f;
+ var_v1 = this->actor.shape.rot.y;
+ }
+ if (func_80840F90(play, this, NULL, *arg2, var_v1, 2)) {
+ return 0;
+ }
+ return sp2C;
+}
+
+void Player_InitMode_0(PlayState* play, Player* this) {
+ this->actor.update = func_801229EC;
+ this->actor.draw = NULL;
+}
+
+void Player_InitMode_2(PlayState* play, Player* this) {
+ Player_SetAction(play, this, func_80854118, 0);
+ this->stateFlags1 |= PLAYER_STATE1_20000000;
+ PlayerAnimation_Change(play, &this->skelAnime, &gPlayerAnim_link_okarina_warp_goal, 2.0f / 3.0f, 0.0f, 24.0f,
+ ANIMMODE_ONCE, 0.0f);
+ this->actor.world.pos.y += 800.0f;
+}
+
+u8 D_8085D2B0[] = {
+ ITEM_SWORD_RAZOR,
+ ITEM_SWORD_KOKIRI,
+};
+
+// OoT leftover?
+void func_80841358(PlayState* play, Player* this, s32 arg2) {
+ ItemId item;
+ PlayerItemAction itemAction;
+
+ //! @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);
+ this->heldItemId = item;
+ this->nextModelGroup = Player_ActionToModelGroup(this, itemAction);
+ func_8082F8BC(play, this, itemAction);
+ func_808309CC(play, this);
+ if (arg2) {
+ Player_PlaySfx(this, NA_SE_IT_SWORD_PICKOUT);
+ }
+}
+
+Vec3f D_8085D2B4 = { -1.0f, 69.0f, 20.0f };
+
+void Player_InitMode_1(PlayState* play, Player* this) {
+ Player_SetAction(play, this, func_80852FD4, 0);
+ this->stateFlags1 |= PLAYER_STATE1_20000000;
+ Math_Vec3f_Copy(&this->actor.world.pos, &D_8085D2B4);
+ this->currentYaw = this->actor.shape.rot.y = -0x8000;
+ PlayerAnimation_Change(play, &this->skelAnime, this->ageProperties->unk_A8, 2.0f / 3.0f, 0.0f, 0.0f, ANIMMODE_ONCE,
+ 0.0f);
+ func_8082E920(play, this,
+ ANIM_FLAG_1 | ANIM_FLAG_UPDATE_Y | ANIM_FLAG_4 | ANIM_FLAG_8 | ANIM_FLAG_80 | ANIM_FLAG_200);
+ if (this->transformation == PLAYER_FORM_FIERCE_DEITY) {
+ func_80841358(play, this, false);
+ }
+ this->unk_AE8 = 20;
+}
+
+void Player_InitMode_3(PlayState* play, Player* this) {
+ Player_SetAction(play, this, func_8085437C, 0);
+ func_8082E920(play, this, ANIM_FLAG_1 | ANIM_FLAG_UPDATE_Y | ANIM_FLAG_8 | ANIM_FLAG_NOMOVE | ANIM_FLAG_80);
+}
+
+void Player_InitMode_4(PlayState* play, Player* this) {
+ func_80834DB8(this, &gPlayerAnim_link_normal_jump, 12.0f, play);
+ Player_SetAction(play, this, func_8085439C, 0);
+ this->stateFlags1 |= PLAYER_STATE1_20000000;
+ this->fallStartHeight = this->actor.world.pos.y;
+}
+
+void Player_InitMode_7(PlayState* play, Player* this) {
+ func_80833B18(play, this, 1, 2.0f, 2.0f, this->actor.shape.rot.y + 0x8000, 0);
+}
+
+void Player_InitMode_5(PlayState* play, Player* this) {
+ Player_SetAction(play, this, func_808540A0, 0);
+ this->actor.draw = NULL;
+ this->stateFlags1 |= PLAYER_STATE1_20000000;
+}
+
+void Player_InitMode_6(PlayState* play, Player* this) {
+ if (gSaveContext.save.isOwlSave) {
+ Player_SetAction(play, this, func_808496AC, 0);
+ func_8082E514(play, this, D_8085BE84[PLAYER_ANIMGROUP_43][this->modelAnimType]);
+ this->stateFlags1 |= PLAYER_STATE1_20000000;
+ this->unk_AE8 = 0x28;
+ gSaveContext.save.isOwlSave = false;
+ } else {
+ Player_SetAction(play, this, func_80849FE0, 0);
+ func_8082E514(play, this, D_8085BE84[PLAYER_ANIMGROUP_43][this->modelAnimType]);
+ this->stateFlags1 |= PLAYER_STATE1_20000000;
+ this->stateFlags2 |= PLAYER_STATE2_20000000;
+ Actor_Spawn(&play->actorCtx, play, ACTOR_EN_TEST7, this->actor.world.pos.x, this->actor.world.pos.y,
+ this->actor.world.pos.z, 0, 0, 0, ENTEST7_MINUS1);
+ }
+}
+
+// InitModes 0x8 and 0x9
+void func_80841744(PlayState* play, Player* this) {
+ Player_SetAction(play, this, func_80855C28, 0);
+ if (PLAYER_GET_INITMODE(&this->actor) == PLAYER_INITMODE_8) {
+ Player_AnimationPlayOnceReverse(play, this, D_8085D17C[this->transformation]);
+ this->itemAction = PLAYER_IA_OCARINA;
+ Player_SetModels(this, Player_ActionToModelGroup(this, this->itemAction));
+ } else {
+ func_8082DB60(play, this, D_8085BE84[PLAYER_ANIMGROUP_43][this->modelAnimType]);
+ }
+ this->stateFlags1 |= PLAYER_STATE1_20000000;
+ this->unk_ABC = -10000.0f;
+ this->unk_AE8 = 0x2710;
+ this->unk_B10[5] = 8.0f;
+}
+
+static InitChainEntry sInitChain[] = {
+ ICHAIN_F32(targetArrowOffset, 500, ICHAIN_STOP),
+};
+
+Vec3s D_8085D2C4 = { -57, 3377, 0 };
+
+void Player_InitCommon(Player* this, PlayState* play, FlexSkeletonHeader* skelHeader) {
+ Actor_ProcessInitChain(&this->actor, sInitChain);
+ this->currentYaw = this->actor.world.rot.y;
+
+ if ((PLAYER_GET_INITMODE(&this->actor) != PLAYER_INITMODE_TELESCOPE) &&
+ ((gSaveContext.respawnFlag != 2) ||
+ (gSaveContext.respawn[RESPAWN_MODE_RETURN].playerParams != PLAYER_PARAMS(0xFF, PLAYER_INITMODE_TELESCOPE)))) {
+ 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;
+
+ 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;
+
+ if (this->transformation == PLAYER_FORM_GORON) {
+ SkelAnime_InitFlex(play, &this->unk_2C8, &gLinkGoronShieldingSkel, &gLinkGoronShieldingAnim,
+ this->jointTable, this->morphTable, LINK_GORON_SHIELDING_LIMB_MAX);
+ }
+
+ ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawFeet, this->ageProperties->shadowScale);
+ }
+
+ this->subCamId = CAM_ID_NONE;
+ Collider_InitAndSetCylinder(play, &this->cylinder, &this->actor, &D_8085C2EC);
+ Collider_InitAndSetCylinder(play, &this->shieldCylinder, &this->actor, &D_8085C318);
+ Collider_InitAndSetQuad(play, &this->meleeWeaponQuads[0], &this->actor, &D_8085C344);
+ Collider_InitAndSetQuad(play, &this->meleeWeaponQuads[1], &this->actor, &D_8085C344);
+ Collider_InitAndSetQuad(play, &this->shieldQuad, &this->actor, &D_8085C394);
+}
+
+void func_80841A50(PlayState* play, Player* this) {
+ if ((play->roomCtx.curRoom.num >= 0) && (play->roomCtx.prevRoom.num < 0)) {
+ Math_Vec3f_Copy(&this->unk_3C0, &this->actor.world.pos);
+ this->unk_3CC = this->actor.shape.rot.y;
+ this->unk_3CE = play->roomCtx.curRoom.num;
+ this->unk_3CF = 1;
+ }
+}
+
+typedef void (*PlayerInitModeFunc)(PlayState*, Player*);
+
+// Initialisation functions for various gameplay modes depending on spawn params. There may be at most 0x10 due to it
+// using a single nybble.
+// sInitModeFuncs
+PlayerInitModeFunc D_8085D2CC[0x10] = {
+ /* 0x0 */ Player_InitMode_0,
+ /* 0x1 */ Player_InitMode_1,
+ /* 0x2 */ Player_InitMode_2,
+ /* 0x3 */ Player_InitMode_3,
+ /* 0x4 */ Player_InitMode_4,
+ /* 0x5 */ Player_InitMode_5,
+ /* 0x6 */ Player_InitMode_6,
+ /* 0x7 */ Player_InitMode_7,
+ /* 0x8 */ func_80841744,
+ /* 0x9 */ func_80841744,
+ /* 0xA */ func_8083ADF0,
+ /* 0xB */ Player_InitMode_B,
+ /* 0xC */ Player_InitMode_Telescope,
+ /* 0xD */ Player_InitMode_D,
+ /* 0xE */ func_8083ADF0,
+ /* 0xF */ Player_InitMode_F,
+};
+
+// sBlureInit
+EffectBlureInit2 D_8085D30C = {
+ 0, 8, 0, { 255, 255, 255, 255 }, { 255, 255, 255, 64 }, { 255, 255, 255, 0 }, { 255, 255, 255, 0 }, 4,
+ 0, 2, 0, { 0, 0, 0, 0 }, { 0, 0, 0, 0 },
+};
+
+// sTireMarkInit ?
+EffectTireMarkInit D_8085D330 = { 0, 63, { 0, 0, 15, 100 } };
+
+// sTireMarkGoronColor ?
+Color_RGBA8 D_8085D338 = { 0, 0, 15, 100 };
+// sTireMarkOtherColor ?
+Color_RGBA8 D_8085D33C = { 0, 0, 0, 150 };
+Vec3f D_8085D340 = { 0.0f, 50.0f, 0.0f };
+
+void Player_Init(Actor* thisx, PlayState* play) {
+ s32 pad;
+ Player* this = THIS;
+ s8 objBankIndex;
+ s32 respawnFlag;
+ s32 var_a1;
+ PlayerInitMode initMode;
+
+ play->playerInit = Player_InitCommon;
+ play->playerUpdate = Player_UpdateCommon;
+ play->unk_18770 = func_8085B170;
+ play->startPlayerFishing = Player_StartFishing;
+ play->grabPlayer = Player_GrabPlayer;
+ play->startPlayerCutscene = func_8085B28C;
+ play->func_18780 = func_8085B384;
+ play->damagePlayer = Player_InflictDamage;
+ play->talkWithPlayer = Player_TalkWithPlayer;
+ play->unk_1878C = func_8085B74C;
+ play->unk_18790 = func_8085B820;
+ play->unk_18794 = func_8085B854;
+ play->setPlayerTalkAnim = func_8085B930;
+
+ gActorOverlayTable[ACTOR_PLAYER].initInfo->objectId = GAMEPLAY_KEEP;
+
+ this->actor.room = -1;
+ this->csId = CS_ID_NONE;
+
+ if (this->actor.shape.rot.x != 0) {
+ this->transformation = this->actor.shape.rot.x - 1;
+
+ objBankIndex = Object_GetIndex(&play->objectCtx, gPlayerFormObjectIndices[this->transformation]);
+ this->actor.objBankIndex = objBankIndex;
+ if (objBankIndex < 0) {
+ Actor_Kill(&this->actor);
+ return;
+ }
+
+ Actor_SetObjectDependency(play, &this->actor);
+ } else {
+ this->transformation = gSaveContext.save.playerForm;
+ if (this->transformation == PLAYER_FORM_HUMAN) {
+ if (gSaveContext.save.equippedMask == PLAYER_MASK_GIANT) {
+ gSaveContext.save.equippedMask = PLAYER_MASK_NONE;
+ }
+ this->currentMask = gSaveContext.save.equippedMask;
+ } else {
+ this->currentMask = this->transformation + PLAYER_MASK_FIERCE_DEITY;
+ gSaveContext.save.equippedMask = PLAYER_MASK_NONE;
+ }
+
+ Inventory_UpdateDeitySwordEquip(play);
+
+ this->unk_B28 = 0;
+ this->unk_B90 = 0;
+ this->unk_B92 = 0;
+ this->unk_B94 = 0;
+ this->unk_B96 = 0;
+ this->stateFlags1 &= ~(PLAYER_STATE1_8 | PLAYER_STATE1_1000 | PLAYER_STATE1_1000000 | PLAYER_STATE1_2000000);
+ this->stateFlags2 &= ~(PLAYER_STATE2_20000 | PLAYER_STATE2_1000000 | PLAYER_STATE2_40000000);
+ this->stateFlags3 &=
+ ~(PLAYER_STATE3_8 | PLAYER_STATE3_40 | PLAYER_STATE3_80 | PLAYER_STATE3_100 | PLAYER_STATE3_200 |
+ PLAYER_STATE3_800 | PLAYER_STATE3_1000 | PLAYER_STATE3_2000 | PLAYER_STATE3_8000 | PLAYER_STATE3_10000 |
+ PLAYER_STATE3_40000 | PLAYER_STATE3_80000 | PLAYER_STATE3_100000 | PLAYER_STATE3_200000 |
+ PLAYER_STATE3_800000 | PLAYER_STATE3_1000000 | PLAYER_STATE3_2000000);
+ this->unk_B08 = 0.0f;
+ this->unk_B0C = 0.0f;
+ }
+
+ if (this->transformation == PLAYER_FORM_ZORA) {
+ if (this->stateFlags1 & PLAYER_STATE1_8000000) {
+ this->unk_B10[0] = 1.0f;
+ } else {
+ this->unk_B10[0] = 0.0f;
+ }
+ }
+
+ this->actor.flags &= ~(ACTOR_FLAG_CAN_PRESS_HEAVY_SWITCH | ACTOR_FLAG_CAN_PRESS_SWITCH);
+ if (this->transformation != PLAYER_FORM_DEKU) {
+ this->actor.flags |= ACTOR_FLAG_CAN_PRESS_SWITCH;
+ if (this->transformation == PLAYER_FORM_GORON) {
+ this->actor.flags |= ACTOR_FLAG_CAN_PRESS_HEAVY_SWITCH;
+ }
+ }
+
+ this->ageProperties = &sPlayerAgeProperties[this->transformation];
+
+ this->itemAction = PLAYER_IA_NONE;
+ this->heldItemAction = PLAYER_IA_NONE;
+ this->heldItemId = ITEM_NONE;
+
+ func_80831990(play, this, ITEM_NONE);
+ Player_SetEquipmentData(play, this);
+ this->prevBoots = this->currentBoots;
+ Player_InitCommon(this, play, gPlayerSkeletons[this->transformation]);
+
+ if (this->actor.shape.rot.z != 0) {
+ EffectTireMark* tireMark;
+
+ this->actor.shape.rot.z = 0;
+ Player_OverrideBlureColors(play, this, 0, 4);
+
+ tireMark = Effect_GetByIndex(this->meleeWeaponEffectIndex[2]);
+ if (this->transformation == PLAYER_FORM_GORON) {
+ tireMark->color = D_8085D338;
+ } else {
+ tireMark->color = D_8085D33C;
+ }
+
+ if ((this->csMode == PLAYER_CSMODE_9) || (this->csMode == PLAYER_CSMODE_93)) {
+ Player_SetAction(play, this, func_8085B08C, 0);
+ this->stateFlags1 |= PLAYER_STATE1_20000000;
+ } else {
+ Player_SetAction(play, this, func_80855818, 0);
+ this->actor.shape.rot.y = this->currentYaw;
+
+ if (this->prevMask != PLAYER_MASK_NONE) {
+ func_8082DB90(play, this, &gPlayerAnim_cl_maskoff);
+ } else if (this->transformation == PLAYER_FORM_HUMAN) {
+ PlayerAnimation_Change(play, &this->skelAnime, D_8085D160[this->transformation], -2.0f / 3.0f, 9.0f,
+ 0.0f, ANIMMODE_ONCE, 0.0f);
+ } else {
+ func_8082DB60(play, this, &gPlayerAnim_cl_setmaskend);
+ }
+
+ this->stateFlags1 |= (PLAYER_STATE1_10000000 | PLAYER_STATE1_20000000);
+ this->stateFlags3 |= PLAYER_STATE3_20000;
+ this->unk_B10[5] = 3.0f;
+ }
+ return;
+ }
+
+ this->prevMask = this->currentMask;
+
+ Effect_Add(play, &this->meleeWeaponEffectIndex[0], EFFECT_BLURE2, 0, 0, &D_8085D30C);
+ Effect_Add(play, &this->meleeWeaponEffectIndex[1], EFFECT_BLURE2, 0, 0, &D_8085D30C);
+
+ Player_OverrideBlureColors(play, this, 0, 4);
+ if (this->transformation == PLAYER_FORM_GORON) {
+ D_8085D330.color = D_8085D338;
+ } else {
+ D_8085D330.color = D_8085D33C;
+ }
+ Effect_Add(play, &this->meleeWeaponEffectIndex[2], EFFECT_TIRE_MARK, 0, 0, &D_8085D330);
+
+ if (this->actor.shape.rot.x != 0) {
+ this->actor.shape.rot.x = 0;
+ this->csMode = PLAYER_CSMODE_68;
+ Player_SetAction(play, this, func_8085B08C, 0);
+ this->stateFlags1 |= PLAYER_STATE1_20000000;
+ return;
+ }
+
+ play->bButtonAmmoPlusOne = 0;
+ play->unk_1887D = 0;
+ play->unk_1887E = 0;
+ this->giObjectSegment = ZeldaArena_Malloc(0x2000);
+ this->maskObjectSegment = ZeldaArena_Malloc(0x3800);
+
+ Lights_PointNoGlowSetInfo(&this->lightInfo, this->actor.world.pos.x, this->actor.world.pos.y,
+ this->actor.world.pos.z, 255, 128, 0, -1);
+ this->lightNode = LightContext_InsertLight(play, &play->lightCtx, &this->lightInfo);
+ Play_AssignPlayerCsIdsFromScene(&play->state, this->actor.csId);
+
+ respawnFlag = gSaveContext.respawnFlag;
+ if (respawnFlag != 0) {
+ if (respawnFlag == -3) {
+ this->actor.params = gSaveContext.respawn[RESPAWN_MODE_UNK_3].playerParams;
+ } else {
+ if ((respawnFlag == 1) || (respawnFlag == -1)) {
+ this->unk_D6A = -2;
+ }
+
+ if (respawnFlag != -7) {
+ s32 respawnIndex;
+
+ if ((respawnFlag == -8) || (respawnFlag == -5) || (respawnFlag == -4)) {
+ respawnFlag = 1;
+ }
+
+ if ((respawnFlag < 0) && (respawnFlag != -1) && (respawnFlag != -6)) {
+ respawnIndex = RESPAWN_MODE_DOWN;
+ } else {
+ respawnIndex = (respawnFlag < 0) ? RESPAWN_MODE_TOP : respawnFlag - 1;
+
+ Math_Vec3f_Copy(&this->actor.world.pos, &gSaveContext.respawn[respawnIndex].pos);
+ Math_Vec3f_Copy(&this->actor.home.pos, &this->actor.world.pos);
+ Math_Vec3f_Copy(&this->actor.prevPos, &this->actor.world.pos);
+ Math_Vec3f_Copy(&this->actor.focus.pos, &this->actor.world.pos);
+
+ this->fallStartHeight = this->actor.world.pos.y;
+
+ this->currentYaw = this->actor.shape.rot.y = gSaveContext.respawn[respawnIndex].yaw;
+ this->actor.params = gSaveContext.respawn[respawnIndex].playerParams;
+ }
+
+ play->actorCtx.sceneFlags.switches[2] = gSaveContext.respawn[respawnIndex].tempSwitchFlags;
+ play->actorCtx.sceneFlags.collectible[1] = gSaveContext.respawn[respawnIndex].unk_18;
+ play->actorCtx.sceneFlags.collectible[2] = gSaveContext.respawn[respawnIndex].tempCollectFlags;
+ }
+ }
+ }
+
+ var_a1 = ((respawnFlag == 4) || (gSaveContext.respawnFlag == -4)) ? 1 : 0;
+ if (func_801226E0(play, var_a1) == 0) {
+ gSaveContext.respawn[RESPAWN_MODE_DOWN].playerParams = PLAYER_PARAMS(thisx->params, PLAYER_INITMODE_D);
+ }
+
+ gSaveContext.respawn[RESPAWN_MODE_DOWN].data = 1;
+ if (respawnFlag == 0) {
+ gSaveContext.respawn[RESPAWN_MODE_TOP] = gSaveContext.respawn[RESPAWN_MODE_DOWN];
+ }
+ gSaveContext.respawn[RESPAWN_MODE_TOP].playerParams =
+ PLAYER_PARAMS(gSaveContext.respawn[RESPAWN_MODE_TOP].playerParams, PLAYER_INITMODE_D);
+
+ initMode = PLAYER_GET_INITMODE(&this->actor);
+ if (((initMode == PLAYER_INITMODE_5) || (initMode == PLAYER_INITMODE_6)) &&
+ (gSaveContext.save.cutsceneIndex >= 0xFFF0)) {
+ initMode = PLAYER_INITMODE_D;
+ }
+
+ D_8085D2CC[initMode](play, this);
+
+ if ((this->actor.draw != NULL) && gSaveContext.save.hasTatl &&
+ ((gSaveContext.gameMode == GAMEMODE_NORMAL) || (gSaveContext.gameMode == GAMEMODE_END_CREDITS)) &&
+ (play->sceneId != SCENE_SPOT00)) {
+ this->tatlActor = Player_SpawnFairy(play, this, &this->actor.world.pos, &D_8085D340, 0);
+
+ if (gSaveContext.dogParams != 0) {
+ gSaveContext.dogParams |= 0x8000;
+ }
+
+ 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);
+ func_808313F0(this, play);
+ } else if (gSaveContext.unk_1014 != 0) {
+ func_8082F5FC(this, Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, ACTOR_EN_MM,
+ this->actor.world.pos.x, this->actor.world.pos.y,
+ this->actor.world.pos.z, 0, this->actor.shape.rot.y, 0, 0x8000));
+ func_808313F0(this, play);
+ }
+ }
+
+ Minimap_SavePlayerRoomInitInfo(play);
+ func_80841A50(play, this);
+ this->unk_3CF = 0;
+ R_PLAY_FILL_SCREEN_ON = 0;
+}
+
+void func_80842510(s16* arg0) {
+ s16 temp_ft0;
+
+ temp_ft0 = (ABS_ALT(*arg0) * 100.0f) / 1000.0f;
+ temp_ft0 = CLAMP(temp_ft0, 0x190, 0xFA0);
+
+ Math_ScaledStepToS(arg0, 0, temp_ft0);
+}
+
+void func_808425B4(Player* this) {
+ if (!(this->unk_AA6 & 2)) {
+ s16 sp26 = this->actor.focus.rot.y - this->actor.shape.rot.y;
+
+ func_80842510(&sp26);
+ this->actor.focus.rot.y = this->actor.shape.rot.y + sp26;
+ }
+ if (!(this->unk_AA6 & 1)) {
+ func_80842510(&this->actor.focus.rot.x);
+ }
+ if (!(this->unk_AA6 & 8)) {
+ func_80842510(&this->headLimbRot.x);
+ }
+ if (!(this->unk_AA6 & 0x40)) {
+ func_80842510(&this->upperLimbRot.x);
+ }
+ if (!(this->unk_AA6 & 4)) {
+ func_80842510(&this->actor.focus.rot.z);
+ }
+ if (!(this->unk_AA6 & 0x10)) {
+ func_80842510(&this->headLimbRot.y);
+ }
+ if (!(this->unk_AA6 & 0x20)) {
+ func_80842510(&this->headLimbRot.z);
+ }
+ if (!(this->unk_AA6 & 0x80)) {
+ if (this->unk_AA8 != 0) {
+ func_80842510(&this->unk_AA8);
+ } else {
+ func_80842510(&this->upperLimbRot.y);
+ }
+ }
+ if (!(this->unk_AA6 & 0x100)) {
+ func_80842510(&this->upperLimbRot.z);
+ }
+
+ this->unk_AA6 = 0;
+}
+
+/**
+ * Sets the DoAction for the interface A/B buttons, depending on a significant number of things
+ */
+void Player_SetDoAction(PlayState* play, Player* this) {
+ DoAction doActionB;
+ s32 sp38;
+
+ if (this != GET_PLAYER(play)) {
+ return;
+ }
+
+ doActionB = -1;
+ sp38 = func_801242B4(this) || (func_8084CA24 == this->actionFunc);
+
+ // Set B do action
+ if (this->transformation == PLAYER_FORM_GORON) {
+ if (this->stateFlags3 & PLAYER_STATE3_80000) {
+ doActionB = DO_ACTION_NONE;
+ } else if (this->stateFlags3 & PLAYER_STATE3_1000) {
+ doActionB = DO_ACTION_POUND;
+ } else {
+ doActionB = DO_ACTION_PUNCH;
+ }
+ } else if (this->transformation == PLAYER_FORM_ZORA) {
+ if ((!(this->stateFlags1 & PLAYER_STATE1_8000000)) ||
+ (!sp38 && (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND))) {
+ doActionB = DO_ACTION_PUNCH;
+ } else {
+ doActionB = DO_ACTION_DIVE;
+ }
+ } else if (this->transformation == PLAYER_FORM_DEKU) {
+ doActionB = DO_ACTION_SHOOT;
+ } else { // PLAYER_FORM_HUMAN
+ if (this->currentMask == PLAYER_MASK_BLAST) {
+ doActionB = DO_ACTION_EXPLODE;
+ } else if (this->currentMask == PLAYER_MASK_BREMEN) {
+ doActionB = DO_ACTION_MARCH;
+ } else if (this->currentMask == PLAYER_MASK_KAMARO) {
+ doActionB = DO_ACTION_DANCE;
+ }
+ }
+
+ if (doActionB > -1) {
+ Interface_SetBButtonDoAction(play, doActionB);
+ } else if (play->interfaceCtx.bButtonDoActionActive) {
+ play->interfaceCtx.bButtonDoActionActive = false;
+ play->interfaceCtx.bButtonDoAction = 0;
+ }
+
+ // Set A do action
+ if ((Message_GetState(&play->msgCtx) == TEXT_STATE_NONE) ||
+ ((play->msgCtx.currentTextId >= 0x100) && (play->msgCtx.currentTextId <= 0x200)) ||
+ ((play->msgCtx.currentTextId >= 0x1BB2) && (play->msgCtx.currentTextId < 0x1BB7))) {
+ Actor* heldActor = this->heldActor;
+ Actor* interactRangeActor = this->interactRangeActor;
+ s32 pad;
+ s32 sp28 = this->unk_AE3[this->unk_ADE];
+ s32 sp24;
+ DoAction doActionA =
+ ((this->transformation == PLAYER_FORM_GORON) && !(this->stateFlags1 & PLAYER_STATE1_400000))
+ ? DO_ACTION_CURL
+ : DO_ACTION_NONE;
+
+ if (play->actorCtx.flags & ACTORCTX_FLAG_PICTO_BOX_ON) {
+ doActionA = DO_ACTION_SNAP;
+ } else if (Player_InBlockingCsMode(play, this) || (this->actor.flags & ACTOR_FLAG_20000000) ||
+ (this->stateFlags1 & PLAYER_STATE1_1000) || (this->stateFlags3 & PLAYER_STATE3_80000) ||
+ (func_80854430 == this->actionFunc)) {
+ doActionA = DO_ACTION_NONE;
+ } else if (this->stateFlags1 & PLAYER_STATE1_100000) {
+ doActionA = DO_ACTION_RETURN;
+ } else if ((this->heldItemAction == PLAYER_IA_FISHING_ROD) && (this->unk_B28 != 0)) {
+ doActionA = (this->unk_B28 == 2) ? DO_ACTION_REEL : DO_ACTION_NONE;
+ doActionA = (this->unk_B28 == 2) ? DO_ACTION_REEL : DO_ACTION_NONE; //! FAKE: duplicated statement
+ } else if (this->stateFlags3 & PLAYER_STATE3_2000) {
+ doActionA = DO_ACTION_DOWN;
+ } else if ((this->doorType != PLAYER_DOORTYPE_NONE) && (this->doorType != PLAYER_DOORTYPE_STAIRCASE) &&
+ !(this->stateFlags1 & PLAYER_STATE1_800)) {
+ doActionA = DO_ACTION_OPEN;
+ } else if (this->stateFlags3 & PLAYER_STATE3_200000) {
+ static u8 D_8085D34C[] = {
+ DO_ACTION_1, DO_ACTION_2, DO_ACTION_3, DO_ACTION_4, DO_ACTION_5, DO_ACTION_6, DO_ACTION_7, DO_ACTION_8,
+ };
+
+ doActionA = D_8085D34C[this->remainingHopsCounter];
+ } else if ((!(this->stateFlags1 & PLAYER_STATE1_800) || (heldActor == NULL)) && (interactRangeActor != NULL) &&
+ (this->getItemId < GI_NONE)) {
+ doActionA = DO_ACTION_OPEN;
+ } else if (!sp38 && (this->stateFlags2 & PLAYER_STATE2_1)) {
+ doActionA = DO_ACTION_GRAB;
+ } else if ((this->stateFlags2 & PLAYER_STATE2_4) ||
+ (!(this->stateFlags1 & PLAYER_STATE1_800000) && (this->rideActor != NULL))) {
+ doActionA = DO_ACTION_CLIMB;
+ } else if ((this->stateFlags1 & PLAYER_STATE1_800000) &&
+ (!EN_HORSE_CHECK_4((EnHorse*)this->rideActor) && (func_808505D0 != this->actionFunc))) {
+ if ((this->stateFlags2 & PLAYER_STATE2_2) && (this->talkActor != NULL)) {
+ if ((this->talkActor->category == ACTORCAT_NPC) || (this->talkActor->id == ACTOR_DM_CHAR08)) {
+ doActionA = DO_ACTION_SPEAK;
+ } else {
+ doActionA = DO_ACTION_CHECK;
+ }
+ } else if (!func_8082DA90(play) && !func_800B7128(this) && !(this->stateFlags1 & PLAYER_STATE1_100000)) {
+ doActionA = DO_ACTION_FASTER;
+ } else {
+ doActionA = DO_ACTION_NONE;
+ }
+ } else if ((this->stateFlags2 & PLAYER_STATE2_2) && (this->talkActor != NULL)) {
+ if ((this->talkActor->category == ACTORCAT_NPC) || (this->talkActor->category == ACTORCAT_ENEMY) ||
+ (this->talkActor->id == ACTOR_DM_CHAR08)) {
+ doActionA = DO_ACTION_SPEAK;
+ } else {
+ doActionA = DO_ACTION_CHECK;
+ }
+ } else if ((this->stateFlags1 & (PLAYER_STATE1_2000 | PLAYER_STATE1_200000)) ||
+ ((this->stateFlags1 & PLAYER_STATE1_800000) && (this->stateFlags2 & PLAYER_STATE2_400000))) {
+ doActionA = DO_ACTION_DOWN;
+ } else if ((this->stateFlags1 & PLAYER_STATE1_800) && (this->getItemId == GI_NONE) && (heldActor != NULL)) {
+ if ((this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) || (heldActor->id == ACTOR_EN_NIW)) {
+ if (!func_8083D738(this, heldActor)) {
+ doActionA = DO_ACTION_DROP;
+ } else {
+ doActionA = DO_ACTION_THROW;
+ }
+ } else {
+ doActionA = DO_ACTION_NONE;
+ }
+ } else if (this->stateFlags2 & PLAYER_STATE2_10000) {
+ doActionA = DO_ACTION_GRAB;
+ } else if (this->stateFlags2 & PLAYER_STATE2_800) {
+ static u8 D_8085D354[] = { DO_ACTION_1, DO_ACTION_2 };
+ s32 var_v0;
+
+ var_v0 = ((120.0f - this->actor.depthInWater) / 40.0f);
+ var_v0 = CLAMP(var_v0, 0, ARRAY_COUNT(D_8085D354) - 1);
+
+ doActionA = D_8085D354[var_v0];
+ } else if (this->stateFlags3 & PLAYER_STATE3_100) {
+ doActionA = DO_ACTION_JUMP;
+ } else if (this->stateFlags3 & PLAYER_STATE3_1000) {
+ doActionA = DO_ACTION_RETURN;
+ } else if (!func_8082FBE8(this) && (this->stateFlags1 & PLAYER_STATE1_8000000) && !sp38) {
+ doActionA = DO_ACTION_SURFACE;
+ } else if (((this->transformation != PLAYER_FORM_DEKU) &&
+ (sp38 || ((this->stateFlags1 & PLAYER_STATE1_8000000) &&
+ !(this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)))) ||
+ ((this->transformation == PLAYER_FORM_DEKU) && (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) &&
+ func_800C9DDC(&play->colCtx, this->actor.floorPoly, this->actor.floorBgId))) {
+ doActionA = (this->transformation == PLAYER_FORM_ZORA) ? DO_ACTION_SWIM
+ : ((this->stateFlags1 & PLAYER_STATE1_8000000) && (interactRangeActor != NULL) &&
+ (interactRangeActor->id == ACTOR_EN_ZOG))
+ ? DO_ACTION_GRAB
+ : DO_ACTION_DIVE;
+ } else {
+ sp24 = func_8082FBE8(this);
+ if ((sp24 && (this->transformation != PLAYER_FORM_DEKU)) || !(this->stateFlags1 & PLAYER_STATE1_400000) ||
+ !Player_IsGoronOrDeku(this)) {
+ if ((this->transformation != PLAYER_FORM_GORON) &&
+ !(this->stateFlags1 & (PLAYER_STATE1_4 | PLAYER_STATE1_4000)) && (sp28 <= 0) &&
+ ((func_80123420(this)) ||
+ ((sPlayerCurrentFloorType != FLOOR_TYPE_7) &&
+ ((func_80123434(this)) || ((play->roomCtx.curRoom.behaviorType1 != ROOM_BEHAVIOR_TYPE1_2) &&
+ !(this->stateFlags1 & PLAYER_STATE1_400000) && (sp28 == 0)))))) {
+ doActionA = DO_ACTION_ATTACK;
+ } else if ((play->roomCtx.curRoom.behaviorType1 != ROOM_BEHAVIOR_TYPE1_2) && sp24 && (sp28 > 0)) {
+ doActionA = DO_ACTION_JUMP;
+ } else if ((this->transformation == PLAYER_FORM_DEKU) && !(this->stateFlags1 & PLAYER_STATE1_8000000) &&
+ (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
+ doActionA = DO_ACTION_ATTACK;
+ } else if (((this->transformation == PLAYER_FORM_HUMAN) ||
+ (this->transformation == PLAYER_FORM_ZORA)) &&
+ ((this->heldItemAction >= PLAYER_IA_SWORD_KOKIRI) ||
+ ((this->stateFlags2 & PLAYER_STATE2_100000) &&
+ (play->actorCtx.targetContext.arrowPointedActor == NULL)))) {
+ doActionA = DO_ACTION_PUTAWAY;
+
+ if (play->msgCtx.currentTextId == 0) {} //! FAKE
+ }
+ }
+ }
+
+ if (doActionA != DO_ACTION_PUTAWAY) {
+ this->putAwayCountdown = 20;
+ } else if (this->putAwayCountdown != 0) {
+ doActionA = DO_ACTION_NONE;
+ this->putAwayCountdown--;
+ }
+
+ Interface_SetAButtonDoAction(play, doActionA);
+
+ // Set Tatl state
+ if (!Play_InCsMode(play) && (this->stateFlags2 & PLAYER_STATE2_200000) &&
+ !(this->stateFlags3 & PLAYER_STATE3_100)) {
+ if (this->targetedActor != NULL) {
+ Interface_SetTatlCall(play, TATL_STATE_2B);
+ } else {
+ Interface_SetTatlCall(play, TATL_STATE_2A);
+ }
+ CutsceneManager_Queue(CS_ID_GLOBAL_TALK);
+ } else {
+ Interface_SetTatlCall(play, TATL_STATE_2C);
+ }
+ }
+}
+
+s32 func_808430E0(Player* this) {
+ if ((this->transformation == PLAYER_FORM_DEKU) && (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) &&
+ func_8083784C(this)) {
+ this->actor.bgCheckFlags &= ~BGCHECKFLAG_GROUND;
+ }
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
+ return false;
+ }
+
+ if (!(this->stateFlags1 & PLAYER_STATE1_8000000)) {
+ sPlayerCurrentFloorType = FLOOR_TYPE_0;
+ }
+ this->unk_B6C = 0;
+ this->unk_B6E = 0;
+ D_80862B28 = 0;
+ return true;
+}
+
+void func_80843178(PlayState* play, Player* this) {
+ u8 spC7 = 0;
+ CollisionPoly* floorPoly;
+ f32 temp_fv0;
+ f32 temp_fv0_3;
+ f32 temp_fv1;
+ u32 updBgCheckInfoFlags;
+ s32 spAC = (func_8084D820 == this->actionFunc) && (this->unk_397 == 4);
+
+ sPlayerPrevFloorProperty = this->floorProperty;
+
+ temp_fv0 = this->ageProperties->unk_38;
+ temp_fv1 = this->ageProperties->unk_00;
+
+ if (this->stateFlags1 & (PLAYER_STATE1_20000000 | PLAYER_STATE1_80000000)) {
+ if ((!(this->stateFlags1 & PLAYER_STATE1_80) && !(this->stateFlags2 & PLAYER_STATE2_4000) &&
+ (this->stateFlags1 & PLAYER_STATE1_80000000)) ||
+ spAC) {
+ updBgCheckInfoFlags = UPDBGCHECKINFO_FLAG_8 | UPDBGCHECKINFO_FLAG_10 | UPDBGCHECKINFO_FLAG_20;
+ this->actor.bgCheckFlags &= ~BGCHECKFLAG_GROUND;
+ } else {
+ if ((this->stateFlags1 & 1) && (play->roomCtx.curRoom.behaviorType1 != ROOM_BEHAVIOR_TYPE1_1) &&
+ ((this->unk_D68 - (s32)this->actor.world.pos.y) >= 100)) {
+ updBgCheckInfoFlags =
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_8 | UPDBGCHECKINFO_FLAG_10 | UPDBGCHECKINFO_FLAG_20;
+ } else if (!(this->stateFlags1 & PLAYER_STATE1_1) &&
+ ((func_8084E034 == this->actionFunc) || (func_8084D820 == this->actionFunc))) {
+ updBgCheckInfoFlags =
+ UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_8 | UPDBGCHECKINFO_FLAG_10 | UPDBGCHECKINFO_FLAG_20;
+ this->actor.bgCheckFlags &= ~(BGCHECKFLAG_WALL | BGCHECKFLAG_PLAYER_WALL_INTERACT);
+ } else {
+ updBgCheckInfoFlags = UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_2 | UPDBGCHECKINFO_FLAG_4 |
+ UPDBGCHECKINFO_FLAG_8 | UPDBGCHECKINFO_FLAG_10 | UPDBGCHECKINFO_FLAG_20;
+ }
+ }
+ } else {
+ if (func_808561B0 == this->actionFunc) {
+ updBgCheckInfoFlags = UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_10 | UPDBGCHECKINFO_FLAG_800;
+ } else if ((this->stateFlags3 & (PLAYER_STATE3_1000 | PLAYER_STATE3_80000)) && (this->linearVelocity >= 8.0f)) {
+ updBgCheckInfoFlags = UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_2 | UPDBGCHECKINFO_FLAG_4 |
+ UPDBGCHECKINFO_FLAG_10 | UPDBGCHECKINFO_FLAG_20 | UPDBGCHECKINFO_FLAG_100 |
+ UPDBGCHECKINFO_FLAG_200;
+ } else {
+ updBgCheckInfoFlags = UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_2 | UPDBGCHECKINFO_FLAG_4 |
+ UPDBGCHECKINFO_FLAG_8 | UPDBGCHECKINFO_FLAG_10 | UPDBGCHECKINFO_FLAG_20;
+ }
+ }
+
+ if (this->stateFlags3 & PLAYER_STATE3_1) {
+ updBgCheckInfoFlags &= ~(UPDBGCHECKINFO_FLAG_2 | UPDBGCHECKINFO_FLAG_4);
+ }
+ if (updBgCheckInfoFlags & UPDBGCHECKINFO_FLAG_4) {
+ this->stateFlags3 |= PLAYER_STATE3_10;
+ }
+
+ if (func_801242B4(this)) {
+ updBgCheckInfoFlags &= ~(UPDBGCHECKINFO_FLAG_8 | UPDBGCHECKINFO_FLAG_10);
+ }
+
+ Actor_UpdateBgCheckInfo(play, &this->actor, 268 * 0.1f, temp_fv0, temp_fv1, updBgCheckInfoFlags);
+
+ this->unk_AC0 -= (this->actor.world.pos.y - this->actor.prevPos.y) / this->actor.scale.y;
+ this->unk_AC0 = CLAMP(this->unk_AC0, -1000.0f, 1000.0f);
+
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_CEILING) {
+ this->actor.velocity.y = 0.0f;
+ }
+
+ D_80862B18 = this->actor.world.pos.y - this->actor.floorHeight;
+ sPlayerConveyorSpeedIndex = CONVEYOR_SPEED_DISABLED;
+ floorPoly = this->actor.floorPoly;
+
+ if ((floorPoly != NULL) && (updBgCheckInfoFlags & UPDBGCHECKINFO_FLAG_4)) {
+ this->floorProperty = SurfaceType_GetFloorProperty(&play->colCtx, floorPoly, this->actor.floorBgId);
+ if (this == GET_PLAYER(play)) {
+ func_801A3CF4(SurfaceType_GetEcho(&play->colCtx, floorPoly, this->actor.floorBgId));
+ if (this->actor.floorBgId == BGCHECK_SCENE) {
+ func_800FAAB4(play, SurfaceType_GetLightSettingIndex(&play->colCtx, floorPoly, this->actor.floorBgId));
+ } else {
+ DynaPoly_SetPlayerAbove(&play->colCtx, this->actor.floorBgId);
+ }
+ }
+
+ sPlayerConveyorSpeedIndex = SurfaceType_GetConveyorSpeed(&play->colCtx, floorPoly, this->actor.floorBgId);
+ if (sPlayerConveyorSpeedIndex != CONVEYOR_SPEED_DISABLED) {
+ sPlayerIsOnFloorConveyor = SurfaceType_IsFloorConveyor(&play->colCtx, floorPoly, this->actor.floorBgId);
+ if ((!sPlayerIsOnFloorConveyor && (this->actor.depthInWater > 20.0f)) ||
+ (sPlayerIsOnFloorConveyor && (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND))) {
+ D_80862B16 = SurfaceType_GetConveyorDirection(&play->colCtx, floorPoly, this->actor.floorBgId) << 0xA;
+ } else {
+ sPlayerConveyorSpeedIndex = CONVEYOR_SPEED_DISABLED;
+ }
+ }
+ }
+
+ this->actor.bgCheckFlags &= ~BGCHECKFLAG_PLAYER_WALL_INTERACT;
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
+ static Vec3f D_8085D358 = { 0.0f, 0.0f, 0.0f };
+ CollisionPoly* spA8;
+ s32 spA4;
+ s16 temp_v1_3;
+ f32 sp9C;
+
+ D_8085D358.y = 178.0f * 0.1f;
+ D_8085D358.z = this->ageProperties->unk_38 + 10.0f;
+
+ if (func_80835D58(play, this, &D_8085D358, &spA8, &spA4, &D_80862B30)) {
+ this->actor.bgCheckFlags |= BGCHECKFLAG_PLAYER_WALL_INTERACT;
+ if (spA8 != this->actor.wallPoly) {
+ this->actor.wallPoly = spA8;
+ this->actor.wallBgId = spA4;
+ this->actor.wallYaw = Math_Atan2S_XY(spA8->normal.z, spA8->normal.x);
+ }
+ }
+
+ temp_v1_3 = this->actor.shape.rot.y - BINANG_ADD(this->actor.wallYaw, 0x8000);
+ sPlayerCurrentWallFlags = SurfaceType_GetWallFlags(&play->colCtx, this->actor.wallPoly, this->actor.wallBgId);
+ D_80862B20 = ABS_ALT(temp_v1_3);
+ temp_v1_3 = BINANG_SUB(this->currentYaw, BINANG_ADD(this->actor.wallYaw, 0x8000));
+ D_80862B24 = ABS_ALT(temp_v1_3);
+
+ temp_fv0_3 = D_80862B24 * 0.00008f;
+ if (!(this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) || (temp_fv0_3 >= 1.0f)) {
+ this->unk_B50 = R_RUN_SPEED_LIMIT / 100.0f;
+ } else {
+ temp_fv1 = (R_RUN_SPEED_LIMIT / 100.0f) * temp_fv0_3;
+
+ this->unk_B50 = temp_fv1;
+ if (temp_fv1 < 0.1f) {
+ this->unk_B50 = 0.1f;
+ }
+ }
+
+ if ((this->actor.bgCheckFlags & BGCHECKFLAG_PLAYER_WALL_INTERACT) && (D_80862B20 < 0x3000)) {
+ CollisionPoly* wallPoly = this->actor.wallPoly;
+
+ if (ABS_ALT(wallPoly->normal.y) < 0x258) {
+ f32 wallPolyNormalX = COLPOLY_GET_NORMAL(wallPoly->normal.x);
+ f32 wallPolyNormalY = COLPOLY_GET_NORMAL(wallPoly->normal.y);
+ f32 wallPolyNormalZ = COLPOLY_GET_NORMAL(wallPoly->normal.z);
+ f32 temp_fv1_3;
+ CollisionPoly* sp84;
+ CollisionPoly* sp80;
+ s32 sp7C;
+ Vec3f sp70;
+ f32 temp_fv0_5;
+ f32 sp68;
+ s32 temp_v1_6;
+
+ this->wallDistance = Math3D_UDistPlaneToPos(wallPolyNormalX, wallPolyNormalY, wallPolyNormalZ,
+ wallPoly->dist, &this->actor.world.pos);
+ temp_fv1_3 = this->wallDistance + 10.0f;
+ sp70.x = this->actor.world.pos.x - (temp_fv1_3 * wallPolyNormalX);
+ sp70.z = this->actor.world.pos.z - (temp_fv1_3 * wallPolyNormalZ);
+ sp70.y = this->actor.world.pos.y + this->ageProperties->unk_0C;
+ temp_fv0_5 = BgCheck_EntityRaycastFloor5(&play->colCtx, &sp84, &sp7C, &this->actor, &sp70);
+
+ this->wallHeight = temp_fv0_5 - this->actor.world.pos.y;
+ if ((this->wallHeight < 178.0f * 0.1f) ||
+ ((BgCheck_EntityCheckCeiling(&play->colCtx, &sp68, &this->actor.world.pos,
+ (temp_fv0_5 - this->actor.world.pos.y) + 20.0f, &sp80, &sp7C,
+ &this->actor) != 0))) {
+ this->wallHeight = 399.96002f;
+ } else {
+ D_8085D358.y = (temp_fv0_5 + 5.0f) - this->actor.world.pos.y;
+
+ if ((func_80835D58(play, this, &D_8085D358, &sp80, &sp7C, &D_80862B30)) &&
+ (temp_v1_6 = this->actor.wallYaw - Math_Atan2S_XY(sp80->normal.z, sp80->normal.x),
+ ABS_ALT(temp_v1_6) < 0x4000) &&
+ !(SurfaceType_CheckWallFlag1(&play->colCtx, sp80, sp7C))) {
+ this->wallHeight = 399.96002f;
+ } else if (SurfaceType_CheckWallFlag0(&play->colCtx, wallPoly, this->actor.wallBgId) == 0) {
+ if (this->ageProperties->unk_1C <= this->wallHeight) {
+ if (ABS_ALT(sp84->normal.y) > 0x5DC0) {
+ if ((this->ageProperties->unk_14 <= this->wallHeight) || func_801242B4(this)) {
+ spC7 = 4;
+ } else if (this->ageProperties->unk_18 <= this->wallHeight) {
+ spC7 = 3;
+ } else {
+ spC7 = 2;
+ }
+ }
+ } else {
+ spC7 = 1;
+ }
+ }
+ }
+ }
+ }
+ } else {
+ this->unk_B50 = R_RUN_SPEED_LIMIT / 100.0f;
+ this->wallHeight = 0.0f;
+ this->unk_B5D = 0;
+ }
+
+ if (spC7 == this->unk_B5C) {
+ if (this->linearVelocity != 0.0f) {
+ if (this->unk_B5D < 0x64) {
+ this->unk_B5D++;
+ }
+ }
+ } else {
+ this->unk_B5C = spC7;
+ this->unk_B5D = 0;
+ }
+
+ sPlayerCurrentFloorType = SurfaceType_GetFloorType(&play->colCtx, floorPoly, this->actor.floorBgId);
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
+ f32 floorPolyNormalX;
+ f32 floorPolyNormalY;
+ f32 floorPolyNormalZ;
+ f32 sp54;
+ s32 pad;
+ f32 sp4C;
+
+ D_80862B40 = SurfaceType_GetFloorEffect(&play->colCtx, this->actor.floorPoly, this->actor.floorBgId);
+ if (func_808430E0(this) == 0) {
+ floorPolyNormalY = COLPOLY_GET_NORMAL(floorPoly->normal.y);
+
+ if (this->actor.floorBgId != BGCHECK_SCENE) {
+ DynaPoly_SetPlayerOnTop(&play->colCtx, this->actor.floorBgId);
+ } else if (!(this->actor.bgCheckFlags & BGCHECKFLAG_GROUND_TOUCH) && (this->actor.depthInWater <= 24.0f) &&
+ (D_80862B40 != FLOOR_EFFECT_1) && (sPlayerConveyorSpeedIndex == CONVEYOR_SPEED_DISABLED) &&
+ (floorPolyNormalY > 0.5f)) {
+ if (CutsceneManager_GetCurrentCsId() != play->playerCsIds[PLAYER_CS_ID_SONG_WARP]) {
+ func_80841A50(play, this);
+ }
+ }
+
+ floorPolyNormalX = COLPOLY_GET_NORMAL(floorPoly->normal.x);
+ floorPolyNormalY = 1.0f / floorPolyNormalY;
+ floorPolyNormalZ = COLPOLY_GET_NORMAL(floorPoly->normal.z);
+
+ sp54 = Math_SinS(this->currentYaw);
+ sp4C = Math_CosS(this->currentYaw);
+ this->unk_B6C =
+ Math_Atan2S_XY(1.0f, (-(floorPolyNormalX * sp54) - (floorPolyNormalZ * sp4C)) * floorPolyNormalY);
+ this->unk_B6E =
+ Math_Atan2S_XY(1.0f, (-(floorPolyNormalX * sp4C) - (floorPolyNormalZ * sp54)) * floorPolyNormalY);
+ sp54 = Math_SinS(this->actor.shape.rot.y);
+ sp4C = Math_CosS(this->actor.shape.rot.y);
+ D_80862B28 =
+ Math_Atan2S_XY(1.0f, (-(floorPolyNormalX * sp54) - (floorPolyNormalZ * sp4C)) * floorPolyNormalY);
+ func_8083CF68(play, this);
+ }
+ } else {
+ func_808430E0(this);
+ D_80862B40 = FLOOR_EFFECT_0;
+ }
+
+ if (floorPoly != NULL) {
+ this->unk_D66 = this->floorSfxOffset;
+ if (spAC != 0) {
+ this->floorSfxOffset = NA_SE_PL_WALK_CONCRETE - SFX_FLAG;
+ return;
+ }
+
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WATER) {
+ if (this->actor.depthInWater < 50.0f) {
+ if (this->actor.depthInWater < 20.0f) {
+ this->floorSfxOffset = (sPlayerCurrentFloorType == FLOOR_TYPE_13) ? NA_SE_PL_WALK_DIRT - SFX_FLAG
+ : NA_SE_PL_WALK_WATER0 - SFX_FLAG;
+ } else {
+ this->floorSfxOffset = (sPlayerCurrentFloorType == FLOOR_TYPE_13) ? NA_CODE_DIRT_DEEP - SFX_FLAG
+ : NA_SE_PL_WALK_WATER1 - SFX_FLAG;
+ }
+
+ return;
+ }
+ }
+
+ if (this->stateFlags2 & PLAYER_STATE2_200) {
+ this->floorSfxOffset = NA_SE_PL_WALK_SAND - SFX_FLAG;
+ } else if (COLPOLY_GET_NORMAL(floorPoly->normal.y) > 0.5f) {
+ this->floorSfxOffset = SurfaceType_GetSfxOffset(&play->colCtx, floorPoly, this->actor.floorBgId);
+ }
+ }
+}
+
+void Player_UpdateCamAndSeqModes(PlayState* play, Player* this) {
+ u8 seqMode;
+ s32 pad[2];
+ Camera* camera;
+ s32 camMode;
+
+ if (this == GET_PLAYER(play)) {
+ seqMode = SEQ_MODE_DEFAULT;
+ if (this->stateFlags1 & PLAYER_STATE1_100000) {
+ seqMode = SEQ_MODE_STILL;
+ } else if (this->csMode != PLAYER_CSMODE_0) {
+ Camera_ChangeMode(Play_GetCamera(play, CAM_ID_MAIN), CAM_MODE_NORMAL);
+ } else {
+ camera = (this->actor.id == ACTOR_PLAYER) ? Play_GetCamera(play, CAM_ID_MAIN)
+ : Play_GetCamera(play, ((EnTest3*)this)->subCamId);
+ if ((this->actor.parent != NULL) && (this->stateFlags3 & PLAYER_STATE3_80)) {
+ camMode = CAM_MODE_HOOKSHOT;
+ Camera_SetViewParam(camera, CAM_VIEW_TARGET, this->actor.parent);
+ } else if (func_8084BC64 == this->actionFunc) {
+ camMode = CAM_MODE_STILL;
+ } else if (this->stateFlags3 & PLAYER_STATE3_8000) {
+ if (this->stateFlags1 & PLAYER_STATE1_8000000) {
+ camMode = CAM_MODE_GORONDASH;
+ } else {
+ camMode = CAM_MODE_FREEFALL;
+ }
+ } else if (this->stateFlags3 & PLAYER_STATE3_80000) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
+ camMode = CAM_MODE_GORONDASH;
+ } else {
+ camMode = CAM_MODE_GORONJUMP;
+ }
+ } else if (this->stateFlags2 & PLAYER_STATE2_100) {
+ camMode = CAM_MODE_PUSHPULL;
+ } else if (this->targetedActor != NULL) {
+ if (CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_TALK_REQUESTED)) {
+ camMode = CAM_MODE_TALK;
+ } else if (this->stateFlags1 & PLAYER_STATE1_10000) {
+ if (this->stateFlags1 & PLAYER_STATE1_2000000) {
+ camMode = CAM_MODE_FOLLOWBOOMERANG;
+ } else {
+ camMode = CAM_MODE_FOLLOWTARGET;
+ }
+ } else {
+ camMode = CAM_MODE_BATTLE;
+ }
+ Camera_SetViewParam(camera, CAM_VIEW_TARGET, this->targetedActor);
+ } else if (this->stateFlags1 & PLAYER_STATE1_1000) {
+ camMode = CAM_MODE_CHARGE;
+ } else if (this->stateFlags3 & PLAYER_STATE3_100) {
+ camMode = CAM_MODE_DEKUHIDE;
+ } else if (this->stateFlags1 & PLAYER_STATE1_2000000) {
+ camMode = CAM_MODE_FOLLOWBOOMERANG;
+ Camera_SetViewParam(camera, CAM_VIEW_TARGET, this->boomerangActor);
+ } else if (this->stateFlags1 & (PLAYER_STATE1_4 | PLAYER_STATE1_2000 | PLAYER_STATE1_4000)) {
+ if (func_80123434(this)) {
+ camMode = CAM_MODE_HANGZ;
+ } else {
+ camMode = CAM_MODE_HANG;
+ }
+ } else if ((this->stateFlags3 & PLAYER_STATE3_2000) && (this->actor.velocity.y < 0.0f)) {
+ if (this->stateFlags1 & (PLAYER_STATE1_20000 | PLAYER_STATE1_40000000)) {
+ camMode = CAM_MODE_DEKUFLYZ;
+ } else {
+ camMode = CAM_MODE_DEKUFLY;
+ }
+ } else if (this->stateFlags1 & (PLAYER_STATE1_20000 | PLAYER_STATE1_40000000)) {
+ if (func_800B7128(this) || func_8082EF20(this)) {
+ camMode = CAM_MODE_BOWARROWZ;
+ } else if (this->stateFlags1 & PLAYER_STATE1_200000) {
+ camMode = CAM_MODE_CLIMBZ;
+ } else {
+ camMode = CAM_MODE_TARGET;
+ }
+ } else if ((this->stateFlags1 & PLAYER_STATE1_400000) && (this->transformation != 0)) {
+ camMode = CAM_MODE_STILL;
+ } else if (this->stateFlags1 & PLAYER_STATE1_40000) {
+ camMode = CAM_MODE_JUMP;
+ } else if (this->stateFlags1 & PLAYER_STATE1_200000) {
+ camMode = CAM_MODE_CLIMB;
+ } else if (this->stateFlags1 & PLAYER_STATE1_80000) {
+ camMode = CAM_MODE_FREEFALL;
+ } else if (((func_808548B8 == this->actionFunc) &&
+ (this->meleeWeaponAnimation >= PLAYER_MWA_FORWARD_SLASH_1H) &&
+ (this->meleeWeaponAnimation <= PLAYER_MWA_ZORA_PUNCH_KICK)) ||
+ (this->stateFlags3 & PLAYER_STATE3_8) ||
+ ((func_8084FE7C == this->actionFunc) && (this->unk_AE8 == 0)) ||
+ (func_808505D0 == this->actionFunc)) {
+ camMode = CAM_MODE_STILL;
+ } else {
+ camMode = CAM_MODE_NORMAL;
+ if ((this->linearVelocity == 0.0f) &&
+ (!(this->stateFlags1 & PLAYER_STATE1_800000) || (this->rideActor->speed == 0.0f))) {
+ seqMode = SEQ_MODE_STILL;
+ }
+ }
+
+ Camera_ChangeMode(camera, camMode);
+ }
+
+ if (play->actorCtx.targetContext.bgmEnemy != NULL) {
+ seqMode = SEQ_MODE_ENEMY;
+ Audio_UpdateEnemyBgmVolume(sqrtf(play->actorCtx.targetContext.bgmEnemy->xyzDistToPlayerSq));
+ }
+
+ Audio_SetSequenceMode(seqMode);
+ }
+}
+
+Vec3f D_8085D364 = { 0.0f, 0.5f, 0.0f };
+Vec3f D_8085D370 = { 0.0f, 0.5f, 0.0f };
+Color_RGBA8 D_8085D37C = { 255, 255, 100, 255 };
+Color_RGBA8 D_8085D380 = { 255, 50, 0, 0 };
+
+void func_808442D8(PlayState* play, Player* this) {
+ f32 var_fa0;
+ f32 temp_fv1;
+
+ if (this->unk_B0C == 0.0f) {
+ func_80831990(play, this, ITEM_NONE);
+ return;
+ }
+
+ var_fa0 = 1.0f;
+ if (DECR(this->unk_B28) == 0) {
+ Inventory_ChangeAmmo(ITEM_STICK, -1);
+ this->unk_B28 = 1;
+ this->unk_B0C = 0.0f;
+ var_fa0 = 0.0f;
+ } else if (this->unk_B28 >= 0xC9) {
+ var_fa0 = (0xD2 - this->unk_B28) / 10.0f;
+ } else if (this->unk_B28 < 0x14) {
+ var_fa0 = this->unk_B28 / 20.0f;
+ this->unk_B0C = var_fa0;
+ }
+
+ if (var_fa0 > 0.0f) {
+ func_800B0EB0(play, &this->meleeWeaponInfo[0].tip, &D_8085D364, &D_8085D370, &D_8085D37C, &D_8085D380,
+ (var_fa0 * 200.0f), 0, 8);
+ if (((play->roomCtx.curRoom.enablePosLights != 0)) || (MREG(93) != 0)) {
+ temp_fv1 = (Rand_ZeroOne() * 30.0f) + 225.0f;
+ Lights_PointSetColorAndRadius(&this->lightInfo, temp_fv1, temp_fv1 * 0.7f, 0, var_fa0 * 300.0f);
+ }
+ }
+}
+
+void func_808445C4(PlayState* play, Player* this) {
+ this->shockTimer--;
+ this->unk_B66 += this->shockTimer;
+ if (this->unk_B66 > 20) {
+ Vec3f pos;
+ Vec3f* bodyPartsPos;
+ s32 scale;
+ s32 randIndex;
+
+ this->unk_B66 -= 20;
+ scale = this->shockTimer * 2;
+ if (scale > 40) {
+ scale = 40;
+ }
+
+ randIndex = Rand_ZeroFloat(PLAYER_BODYPART_MAX - 0.1f);
+ bodyPartsPos = randIndex + this->bodyPartsPos;
+
+ pos.x = (randPlusMinusPoint5Scaled(5.0f) + bodyPartsPos->x) - this->actor.world.pos.x;
+ pos.y = (randPlusMinusPoint5Scaled(5.0f) + bodyPartsPos->y) - this->actor.world.pos.y;
+ pos.z = (randPlusMinusPoint5Scaled(5.0f) + bodyPartsPos->z) - this->actor.world.pos.z;
+ EffectSsFhgFlash_SpawnShock(play, &this->actor, &pos, scale, 1);
+ func_800B8F98(&this->actor, NA_SE_PL_SPARK - SFX_FLAG);
+ }
+}
+
+/**
+ * Rumbles the controller when close to a secret.
+ */
+void Player_DetectSecrets(PlayState* play, Player* this) {
+ f32 step = (SQ(200.0f) * 5.0f) - (this->closestSecretDistSq * 5.0f);
+
+ if (step < 0.0f) {
+ step = 0.0f;
+ }
+
+ this->secretRumbleCharge += step;
+ if (this->secretRumbleCharge > SQ(2000.0f)) {
+ this->secretRumbleCharge = 0.0f;
+ Player_RequestRumble(play, this, 120, 20, 10, SQ(0));
+ }
+}
+
+s8 D_8085D384[92] = {
+ /* 0 */ PLAYER_CSMODE_0,
+ /* 1 */ PLAYER_CSMODE_2,
+ /* 2 */ PLAYER_CSMODE_2,
+ /* 3 */ PLAYER_CSMODE_4,
+ /* 4 */ PLAYER_CSMODE_3,
+ /* 5 */ PLAYER_CSMODE_56,
+ /* 6 */ PLAYER_CSMODE_8,
+ /* 7 */ PLAYER_CSMODE_0,
+ /* 8 */ PLAYER_CSMODE_0,
+ /* 9 */ PLAYER_CSMODE_135,
+ /* 10 */ PLAYER_CSMODE_21,
+ /* 11 */ PLAYER_CSMODE_61,
+ /* 12 */ PLAYER_CSMODE_62,
+ /* 13 */ PLAYER_CSMODE_60,
+ /* 14 */ PLAYER_CSMODE_63,
+ /* 15 */ PLAYER_CSMODE_64,
+ /* 16 */ PLAYER_CSMODE_65,
+ /* 17 */ PLAYER_CSMODE_66,
+ /* 18 */ PLAYER_CSMODE_70,
+ /* 19 */ PLAYER_CSMODE_19,
+ /* 20 */ PLAYER_CSMODE_71,
+ /* 21 */ PLAYER_CSMODE_72,
+ /* 22 */ PLAYER_CSMODE_67,
+ /* 23 */ PLAYER_CSMODE_73,
+ /* 24 */ PLAYER_CSMODE_74,
+ /* 25 */ PLAYER_CSMODE_75,
+ /* 26 */ PLAYER_CSMODE_68,
+ /* 27 */ PLAYER_CSMODE_69,
+ /* 28 */ PLAYER_CSMODE_76,
+ /* 29 */ PLAYER_CSMODE_116,
+ /* 30 */ PLAYER_CSMODE_0,
+ /* 31 */ PLAYER_CSMODE_40,
+ /* 32 */ PLAYER_CSMODE_0,
+ /* 33 */ -PLAYER_CSMODE_52, // the only negative one
+ /* 34 */ PLAYER_CSMODE_42,
+ /* 35 */ PLAYER_CSMODE_43,
+ /* 36 */ PLAYER_CSMODE_57,
+ /* 37 */ PLAYER_CSMODE_81,
+ /* 38 */ PLAYER_CSMODE_41,
+ /* 39 */ PLAYER_CSMODE_53,
+ /* 40 */ PLAYER_CSMODE_54,
+ /* 41 */ PLAYER_CSMODE_44,
+ /* 42 */ PLAYER_CSMODE_55,
+ /* 43 */ PLAYER_CSMODE_45,
+ /* 44 */ PLAYER_CSMODE_46,
+ /* 45 */ PLAYER_CSMODE_47,
+ /* 46 */ PLAYER_CSMODE_48,
+ /* 47 */ PLAYER_CSMODE_49,
+ /* 48 */ PLAYER_CSMODE_50,
+ /* 49 */ PLAYER_CSMODE_51,
+ /* 50 */ PLAYER_CSMODE_77,
+ /* 51 */ PLAYER_CSMODE_78,
+ /* 52 */ PLAYER_CSMODE_79,
+ /* 53 */ PLAYER_CSMODE_80,
+ /* 54 */ PLAYER_CSMODE_81,
+ /* 55 */ PLAYER_CSMODE_82,
+ /* 56 */ PLAYER_CSMODE_83,
+ /* 57 */ PLAYER_CSMODE_84,
+ /* 58 */ PLAYER_CSMODE_85,
+ /* 59 */ PLAYER_CSMODE_86,
+ /* 60 */ PLAYER_CSMODE_87,
+ /* 61 */ PLAYER_CSMODE_88,
+ /* 62 */ PLAYER_CSMODE_89,
+ /* 63 */ PLAYER_CSMODE_90,
+ /* 64 */ PLAYER_CSMODE_91,
+ /* 65 */ PLAYER_CSMODE_92,
+ /* 66 */ PLAYER_CSMODE_94,
+ /* 67 */ PLAYER_CSMODE_95,
+ /* 68 */ PLAYER_CSMODE_100,
+ /* 69 */ PLAYER_CSMODE_101,
+ /* 70 */ PLAYER_CSMODE_98,
+ /* 71 */ PLAYER_CSMODE_99,
+ /* 72 */ PLAYER_CSMODE_102,
+ /* 73 */ PLAYER_CSMODE_103,
+ /* 74 */ PLAYER_CSMODE_104,
+ /* 75 */ PLAYER_CSMODE_112,
+ /* 76 */ PLAYER_CSMODE_113,
+ /* 77 */ PLAYER_CSMODE_117,
+ /* 78 */ PLAYER_CSMODE_104,
+ /* 79 */ PLAYER_CSMODE_104,
+ /* 80 */ PLAYER_CSMODE_105,
+ /* 81 */ PLAYER_CSMODE_106,
+ /* 82 */ PLAYER_CSMODE_107,
+ /* 83 */ PLAYER_CSMODE_108,
+ /* 84 */ PLAYER_CSMODE_109,
+ /* 85 */ PLAYER_CSMODE_110,
+ /* 86 */ PLAYER_CSMODE_118,
+ /* 87 */ PLAYER_CSMODE_119,
+ /* 88 */ PLAYER_CSMODE_120,
+ /* 89 */ PLAYER_CSMODE_114,
+ /* 90 */ PLAYER_CSMODE_111,
+ /* 91 */ PLAYER_CSMODE_122,
+};
+
+f32 D_8085D3E0[PLAYER_FORM_MAX] = {
+ 0.8f, // PLAYER_FORM_FIERCE_DEITY
+ 0.6f, // PLAYER_FORM_GORON
+ 0.8f, // PLAYER_FORM_ZORA
+ 1.5f, // PLAYER_FORM_DEKU
+ 1.0f, // PLAYER_FORM_HUMAN
+};
+
+void func_80844784(PlayState* play, Player* this) {
+ f32 var_fv0;
+ s16 var_a3;
+ f32 temp_ft4;
+ s32 temp_ft2;
+ f32 temp_fv1_2;
+ f32 sp58;
+ f32 sp54;
+ f32 sp50;
+ f32 sp4C;
+ f32 sp48;
+ f32 sp44;
+ f32 temp_fa0;
+ f32 temp_fa1;
+ s16 temp_v0;
+ f32 temp_fv0_2;
+
+ if ((this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) && (sPlayerCurrentFloorType == FLOOR_TYPE_5) &&
+ (this->currentBoots < PLAYER_BOOTS_ZORA_UNDERWATER)) {
+ var_a3 = this->currentYaw;
+ var_fv0 = this->linearVelocity;
+ temp_v0 = this->actor.world.rot.y - var_a3;
+
+ if ((ABS_ALT(temp_v0) > 0x6000) && (this->actor.speed != 0.0f)) {
+ var_fv0 = 0.0f;
+ var_a3 += 0x8000;
+ }
+
+ if ((Math_StepToF(&this->actor.speed, var_fv0, 0.35f) != 0) && (var_fv0 == 0.0f)) {
+ this->actor.world.rot.y = this->currentYaw;
+ }
+
+ if (this->linearVelocity != 0.0f) {
+ temp_ft2 = (fabsf(this->linearVelocity) * 700.0f) - (fabsf(this->actor.speed) * 100.0f);
+ temp_ft2 = CLAMP(temp_ft2, 0, 0x546);
+
+ Math_ScaledStepToS(&this->actor.world.rot.y, var_a3, temp_ft2);
+ }
+ if ((this->linearVelocity == 0.0f) && (this->actor.speed != 0.0f)) {
+ func_8019F780(&this->actor.projectedPos, Player_GetFloorSfx(this, NA_SE_PL_SLIP_LEVEL - SFX_FLAG),
+ this->actor.speed);
+ }
+ } else {
+ this->actor.speed = this->linearVelocity;
+ this->actor.world.rot.y = this->currentYaw;
+ }
+
+ Actor_UpdateVelocityWithGravity(&this->actor);
+ D_80862B3C = 0.0f;
+ if ((gSaveContext.save.saveInfo.playerData.health != 0) &&
+ ((this->pushedSpeed != 0.0f) || (this->windSpeed != 0.0f) || (play->envCtx.windSpeed >= 50.0f)) &&
+ (!Player_InCsMode(play)) &&
+ !(this->stateFlags1 & (PLAYER_STATE1_4 | PLAYER_STATE1_2000 | PLAYER_STATE1_4000 | PLAYER_STATE1_200000)) &&
+ !(this->stateFlags3 & PLAYER_STATE3_100) && (func_8084D4EC != this->actionFunc) &&
+ (this->actor.id == ACTOR_PLAYER)) {
+ this->actor.velocity.x += this->pushedSpeed * Math_SinS(this->pushedYaw);
+ this->actor.velocity.z += this->pushedSpeed * Math_CosS(this->pushedYaw);
+ temp_fv1_2 = 10.0f - this->actor.velocity.y;
+ if (temp_fv1_2 > 0.0f) {
+ sp58 = D_8085D3E0[this->transformation];
+ sp54 = this->windSpeed * sp58;
+ sp50 = Math_SinS(this->windAngleX) * sp54;
+ sp4C = Math_CosS(this->windAngleX) * sp54;
+ sp48 = Math_SinS(this->windAngleY) * sp4C;
+ sp44 = Math_CosS(this->windAngleY) * sp4C;
+
+ if ((sp50 > 0.0f) && (this->transformation == PLAYER_FORM_DEKU) &&
+ !(this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
+ if (Player_SetAction(play, this, func_80856918, 1)) {
+ this->stateFlags3 |= PLAYER_STATE3_2000 | PLAYER_STATE3_1000000;
+ func_8082E1F0(this, NA_SE_IT_DEKUNUTS_FLOWER_OPEN);
+ func_8019FD90(4, 2);
+ }
+
+ this->unk_AE8 = 0x270F;
+ Math_Vec3f_Copy(this->unk_AF0, &this->actor.world.pos);
+ }
+
+ if (play->envCtx.windSpeed >= 50.0f) {
+ temp_fa0 = play->envCtx.windDir.x;
+ temp_fa1 = play->envCtx.windDir.y;
+ temp_ft4 = play->envCtx.windDir.z;
+
+ temp_fv0_2 = sqrtf(SQ(temp_fa0) + SQ(temp_fa1) + SQ(temp_ft4));
+ if (temp_fv0_2 != 0.0f) {
+ temp_fv0_2 = ((play->envCtx.windSpeed - 50.0f) * 0.1f * sp58) / temp_fv0_2;
+
+ sp48 -= temp_fa0 * temp_fv0_2;
+ sp50 -= temp_fa1 * temp_fv0_2;
+ sp44 -= temp_ft4 * temp_fv0_2;
+ }
+ }
+
+ if (temp_fv1_2 < sp50) {
+ temp_fv1_2 /= sp50;
+
+ sp48 *= temp_fv1_2;
+ sp50 *= temp_fv1_2;
+ sp44 *= temp_fv1_2;
+ }
+
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
+ D_80862B3C = (sp44 * Math_CosS(this->currentYaw)) + (Math_SinS(this->currentYaw) * sp48);
+ if (fabsf(D_80862B3C) > 4.0f) {
+ func_8083FBC4(play, this);
+ }
+
+ func_8019F780(&this->actor.projectedPos, Player_GetFloorSfx(this, NA_SE_PL_SLIP_LEVEL - SFX_FLAG),
+ fabsf(D_80862B3C));
+ }
+
+ this->actor.velocity.x += sp48;
+ this->actor.velocity.z += sp44;
+ this->actor.velocity.y += sp50;
+ }
+ }
+
+ Actor_UpdatePos(&this->actor);
+}
+
+Color_RGBA8 D_8085D3F4 = { 100, 255, 255, 0 };
+Color_RGBA8 D_8085D3F8 = { 0, 100, 100, 0 };
+
+void func_80844D80(PlayState* play, Player* this) {
+ Vec3f pos;
+ Vec3f spA0;
+ Vec3f velocity;
+ Vec3f accel;
+ Vec3f sp7C;
+ s32 i;
+
+ Math_Vec3f_Diff(&this->meleeWeaponInfo[0].tip, &this->meleeWeaponInfo[0].base, &sp7C);
+ Math_Vec3f_SumScaled(&this->meleeWeaponInfo[0].base, &sp7C, 0.3f, &spA0);
+
+ for (i = 0; i < 2; i++) {
+ Math_Vec3f_SumScaled(&this->meleeWeaponInfo[0].base, &sp7C, Rand_ZeroOne(), &pos);
+ Math_Vec3f_AddRand(&pos, 15.0f, &pos);
+ Math_Vec3f_DistXYZAndStoreNormDiff(&spA0, &pos, 1.7f, &velocity);
+ Math_Vec3f_ScaleAndStore(&velocity, 0.01f, &accel);
+ EffectSsKirakira_SpawnDispersed(play, &pos, &velocity, &accel, &D_8085D3F4, &D_8085D3F8,
+ Rand_S16Offset(-20, -120), 15);
+ }
+}
+
+f32 D_8085D3FC[] = { 0.005f, 0.05f };
+
+f32 sWaterConveyorSpeeds[CONVEYOR_SPEED_MAX - 1] = {
+ 2.0f, // CONVEYOR_SPEED_SLOW
+ 4.0f, // CONVEYOR_SPEED_MEDIUM
+ 11.0f, // CONVEYOR_SPEED_FAST
+};
+f32 sFloorConveyorSpeeds[CONVEYOR_SPEED_MAX - 1] = {
+ 0.5f, // CONVEYOR_SPEED_SLOW
+ 1.0f, // CONVEYOR_SPEED_MEDIUM
+ 3.0f, // CONVEYOR_SPEED_FAST
+};
+
+void Player_UpdateCommon(Player* this, PlayState* play, Input* input) {
+ f32 temp_fv0;
+ f32 temp_fv1;
+
+ sPlayerControlInput = input;
+ if (this->unk_D6A < 0) {
+ this->unk_D6A++;
+ if (this->unk_D6A == 0) {
+ this->unk_D6A = 1;
+ play_sound(NA_SE_OC_REVENGE);
+ }
+ }
+
+ Math_Vec3f_Copy(&this->actor.prevPos, &this->actor.home.pos);
+
+ temp_fv1 = fabsf(this->linearVelocity) * (fabsf(Math_SinS(this->unk_B6C) * 800.0f) + 100.0f);
+
+ Math_StepToF(&this->unk_AC0, 0.0f, CLAMP_MIN(temp_fv1, 300.0f));
+
+ if (this->unk_D57 != 0) {
+ this->unk_D57--;
+ }
+
+ if (this->unk_B5E != 0) {
+ this->unk_B5E--;
+ }
+
+ if (this->unk_D6B != 0) {
+ this->unk_D6B--;
+ }
+
+ if (this->invincibilityTimer < 0) {
+ this->invincibilityTimer++;
+ } else if (this->invincibilityTimer > 0) {
+ this->invincibilityTimer--;
+ }
+
+ if (this->unk_B64 != 0) {
+ this->unk_B64--;
+ }
+
+ if (this->blastMaskTimer != 0) {
+ this->blastMaskTimer--;
+ }
+
+ if (gSaveContext.jinxTimer != 0) {
+ gSaveContext.jinxTimer--;
+ }
+
+ func_80122C20(play, &this->unk_3D0);
+ if ((this->transformation == PLAYER_FORM_FIERCE_DEITY) && func_8082FBE8(this)) {
+ func_80844D80(play, this);
+ }
+ if (this->transformation == PLAYER_FORM_ZORA) {
+ s32 var_v0 = (this->stateFlags1 & PLAYER_STATE1_8000000) ? 1 : 0;
+
+ Math_StepToF(&this->unk_B10[0], var_v0, D_8085D3FC[var_v0]);
+ }
+ func_80832888(this, play);
+ if (play->roomCtx.curRoom.enablePosLights != 0) {
+ Lights_PointSetColorAndRadius(&this->lightInfo, 255, 255, 255, 60);
+ } else {
+ this->lightInfo.params.point.radius = -1;
+ }
+
+ if ((this->heldItemAction == PLAYER_IA_STICK) && (this->unk_B28 != 0)) {
+ func_808442D8(play, this);
+ } else if (this->heldItemAction == PLAYER_IA_FISHING_ROD) {
+ if (this->unk_B28 < 0) {
+ this->unk_B28++;
+ }
+ }
+
+ if (this->shockTimer != 0) {
+ func_808445C4(play, this);
+ }
+ if (this->isBurning) {
+ func_808341F4(play, this);
+ }
+
+ if (this->stateFlags2 & PLAYER_STATE2_8000) {
+ if (!(this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
+ Player_StopHorizontalMovement(this);
+ Actor_MoveWithGravity(&this->actor);
+ }
+ func_80843178(play, this);
+ } else {
+ f32 temp_fa0;
+ f32 var_fv1_2;
+ s32 var_v1;
+ s32 pad;
+
+ if (this->currentBoots != this->prevBoots) {
+ if (this->currentBoots == PLAYER_BOOTS_ZORA_UNDERWATER) {
+ if (this->stateFlags1 & PLAYER_STATE1_8000000) {
+ func_8082DC64(play, this);
+ if (this->ageProperties->unk_2C < this->actor.depthInWater) {
+ this->stateFlags2 |= PLAYER_STATE2_400;
+ }
+ }
+ } else if ((this->stateFlags1 & PLAYER_STATE1_8000000) &&
+ ((this->prevBoots == PLAYER_BOOTS_ZORA_UNDERWATER) ||
+ (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND))) {
+ func_8083B930(play, this);
+ this->stateFlags2 &= ~PLAYER_STATE2_400;
+ if (func_808508C8 == this->actionFunc) {
+ this->unk_AE8 = 20;
+ }
+ }
+ this->prevBoots = this->currentBoots;
+ }
+ if ((this->actor.parent == NULL) && (this->stateFlags1 & PLAYER_STATE1_800000)) {
+ this->actor.parent = this->rideActor;
+ func_80837BD0(play, this);
+ this->unk_AE8 = -1;
+ Player_AnimationPlayOnce(play, this, &gPlayerAnim_link_uma_wait_1);
+ func_8082E920(play, this, ANIM_FLAG_1 | ANIM_FLAG_UPDATE_Y | ANIM_FLAG_8 | ANIM_FLAG_NOMOVE | ANIM_FLAG_80);
+ }
+
+ if (this->unk_ADC == 0) {
+ this->unk_ADD = 0;
+ } else if (this->unk_ADC < 0) {
+ this->unk_ADC++;
+ } else {
+ this->unk_ADC--;
+ }
+
+ if (!(this->stateFlags3 & PLAYER_STATE3_2000)) {
+ Math_ScaledStepToS(&this->unk_AAA, 0, 0x190);
+ }
+
+ if ((this->transformation >= PLAYER_FORM_GORON) && (this->transformation <= PLAYER_FORM_DEKU)) {
+ func_800BBB74(&this->blinkInfo, 20, 80, 3);
+ } else {
+ func_800BBAC0(&this->blinkInfo, 20, 80, 6);
+ }
+
+ this->actor.shape.face = ((play->gameplayFrames & 0x20) ? 0 : 3) + this->blinkInfo.eyeTexIndex;
+
+ if (this->currentMask == PLAYER_MASK_BUNNY) {
+ Player_UpdateBunnyEars(this);
+ }
+
+ if (func_800B7118(this)) {
+ func_808484F0(this);
+ }
+
+ if ((play->unk_18844 == 0) && !(this->skelAnime.moveFlags & ANIM_FLAG_80)) {
+ if (!(this->stateFlags1 & PLAYER_STATE1_2) && (this->actor.parent == NULL)) {
+ func_80844784(play, this);
+ }
+ func_80843178(play, this);
+ } else {
+ sPlayerCurrentFloorType = FLOOR_TYPE_0;
+ this->floorProperty = FLOOR_PROPERTY_0;
+ if (this->stateFlags1 & PLAYER_STATE1_800000) {
+ this->actor.floorPoly = this->rideActor->floorPoly;
+ this->actor.floorBgId = this->rideActor->floorBgId;
+ }
+ sPlayerConveyorSpeedIndex = CONVEYOR_SPEED_DISABLED;
+ this->pushedSpeed = 0.0f;
+ }
+
+ func_8083562C(play, this, this->actor.floorPoly, this->actor.floorBgId);
+ if (sPlayerConveyorSpeedIndex != CONVEYOR_SPEED_DISABLED) {
+ f32 conveyorSpeed;
+ s32 pad2;
+
+ sPlayerConveyorSpeedIndex--;
+ if (!sPlayerIsOnFloorConveyor) {
+ conveyorSpeed = sWaterConveyorSpeeds[sPlayerConveyorSpeedIndex];
+ if (!(this->stateFlags1 & PLAYER_STATE1_8000000)) {
+ conveyorSpeed /= 4.0f;
+ }
+ } else {
+ conveyorSpeed = sFloorConveyorSpeeds[sPlayerConveyorSpeedIndex];
+ }
+
+ Math_StepToF(&this->pushedSpeed, conveyorSpeed, conveyorSpeed * 0.1f);
+ Math_ScaledStepToS(&this->pushedYaw, D_80862B16,
+ ((this->stateFlags1 & PLAYER_STATE1_8000000) ? 400.0f : 800.0f) * conveyorSpeed);
+ } else if (this->pushedSpeed != 0.0f) {
+ Math_StepToF(&this->pushedSpeed, 0.0f, (this->stateFlags1 & PLAYER_STATE1_8000000) ? 0.5f : 2.0f);
+ }
+ if (!(this->stateFlags1 & (PLAYER_STATE1_80 | PLAYER_STATE1_20000000)) &&
+ !(this->stateFlags3 & PLAYER_STATE3_80) && (func_80854430 != this->actionFunc)) {
+ func_8083BB4C(play, this);
+ if (!Play_InCsMode(play)) {
+ if ((this->actor.id == ACTOR_PLAYER) && !(this->stateFlags1 & PLAYER_STATE1_80000000) &&
+ (gSaveContext.save.saveInfo.playerData.health == 0) &&
+ func_808323C0(this, play->playerCsIds[PLAYER_CS_ID_DEATH])) {
+ if (this->stateFlags3 & PLAYER_STATE3_1000000) {
+ func_808355D8(play, this, &gPlayerAnim_pn_kakkufinish);
+ } else if (this->stateFlags1 &
+ (PLAYER_STATE1_4 | PLAYER_STATE1_2000 | PLAYER_STATE1_4000 | PLAYER_STATE1_200000)) {
+ func_8082DD2C(play, this);
+ func_80833AA0(this, play);
+ } else if ((this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) ||
+ (this->stateFlags1 & PLAYER_STATE1_8000000)) {
+ func_80831F34(play, this,
+ func_801242B4(this)
+ ? &gPlayerAnim_link_swimer_swim_down
+ : ((this->shockTimer != 0) ? &gPlayerAnim_link_normal_electric_shock_end
+ : &gPlayerAnim_link_derth_rebirth));
+ }
+ } else {
+ if ((this->actor.parent == NULL) &&
+ (func_8082DA90(play) || (this->unk_D6B != 0) || !func_80834600(this, play))) {
+ func_8083827C(this, play);
+ } else {
+ this->fallStartHeight = this->actor.world.pos.y;
+ }
+
+ Player_DetectSecrets(play, this);
+ }
+ }
+ } else if (!(this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) && (func_8084D820 == this->actionFunc) &&
+ (this->unk_397 == 4)) {
+ this->actor.world.pos.y = this->actor.prevPos.y;
+ }
+
+ if (play->csCtx.state != CS_STATE_IDLE) {
+ if ((this->csMode != PLAYER_CSMODE_5) && !(this->stateFlags1 & PLAYER_STATE1_800000)) {
+ if (!(this->stateFlags2 & PLAYER_STATE2_80) && (this->actor.id == ACTOR_PLAYER)) {
+ if ((play->csCtx.playerCue != NULL) && (D_8085D384[play->csCtx.playerCue->id] != 0)) {
+ func_800B7298(play, NULL, PLAYER_CSMODE_5);
+ Player_StopHorizontalMovement(this);
+ } else if (((u32)this->csMode == PLAYER_CSMODE_0) &&
+ !(this->stateFlags2 & (PLAYER_STATE2_400 | PLAYER_STATE2_8000000)) &&
+ (play->csCtx.state != CS_STATE_STOP)) {
+ func_800B7298(play, NULL, PLAYER_CSMODE_20);
+ Player_StopHorizontalMovement(this);
+ }
+ }
+ }
+ }
+
+ if ((u32)this->csMode != PLAYER_CSMODE_0) {
+ if ((this->csMode != PLAYER_CSMODE_END) ||
+ !(this->stateFlags1 & (PLAYER_STATE1_4 | PLAYER_STATE1_2000 | PLAYER_STATE1_4000 |
+ PLAYER_STATE1_200000 | PLAYER_STATE1_4000000))) {
+ if (func_8085B08C != this->actionFunc) {
+ this->unk_AA5 = PLAYER_UNKAA5_4;
+ if (this->csMode == PLAYER_CSMODE_5) {
+ func_808387A0(play, this);
+ func_8082DAD4(this);
+ }
+ }
+ } else if (func_8085B08C != this->actionFunc) {
+ func_8085AACC(play, this, 0);
+ }
+ } else {
+ this->prevCsMode = PLAYER_CSMODE_0;
+ }
+
+ func_8083BF54(play, this);
+ Lights_PointSetPosition(&this->lightInfo, this->actor.world.pos.x, this->actor.world.pos.y + 40.0f,
+ this->actor.world.pos.z);
+
+ if (((this->targetedActor == NULL) || (this->targetedActor == this->talkActor) ||
+ (this->targetedActor->hintId == TATL_HINT_ID_NONE)) &&
+ (this->tatlTextId == 0)) {
+ this->stateFlags2 &= ~(PLAYER_STATE2_2 | PLAYER_STATE2_200000);
+ }
+
+ this->stateFlags1 &= ~(PLAYER_STATE1_10 | PLAYER_STATE1_1000 | PLAYER_STATE1_400000);
+ this->stateFlags2 &= ~(PLAYER_STATE2_1 | PLAYER_STATE2_4 | PLAYER_STATE2_8 | PLAYER_STATE2_20 |
+ PLAYER_STATE2_40 | PLAYER_STATE2_100 | PLAYER_STATE2_200 | PLAYER_STATE2_1000 |
+ PLAYER_STATE2_4000 | PLAYER_STATE2_10000 | PLAYER_STATE2_400000 | PLAYER_STATE2_4000000);
+ this->stateFlags3 &= ~(PLAYER_STATE3_10 | PLAYER_STATE3_40 | PLAYER_STATE3_100 | PLAYER_STATE3_800 |
+ PLAYER_STATE3_1000 | PLAYER_STATE3_100000 | PLAYER_STATE3_2000000 |
+ PLAYER_STATE3_4000000 | PLAYER_STATE3_8000000 | PLAYER_STATE3_10000000);
+ func_808425B4(this);
+ func_8082EB38(play, this);
+
+ D_8085C3E4 = (this->stateFlags1 & PLAYER_STATE1_8000000) ? 0.5f : 1.0f;
+ D_8085C3E8 = 1.0f / D_8085C3E4;
+
+ D_80862B48 = D_80862B4C = 0;
+
+ var_v1 = Play_InCsMode(play);
+ D_80862B2C = this->currentMask;
+ if (!(this->stateFlags3 & PLAYER_STATE3_4)) {
+ this->actionFunc(this, play);
+ }
+
+ if (!var_v1) {
+ Player_SetDoAction(play, this);
+ }
+
+ Player_UpdateCamAndSeqModes(play, this);
+
+ if (this->skelAnime.moveFlags & ANIM_FLAG_8) {
+ AnimationContext_SetMoveActor(play, &this->actor, &this->skelAnime,
+ (this->skelAnime.moveFlags & ANIM_FLAG_4) ? 1.0f
+ : this->ageProperties->unk_08);
+ }
+
+ func_80832578(this, play);
+ if (this->actor.flags & ACTOR_FLAG_TALK_REQUESTED) {
+ this->talkActorDistance = 0.0f;
+ } else {
+ this->talkActor = NULL;
+ this->exchangeItemId = PLAYER_IA_NONE;
+ this->talkActorDistance = FLT_MAX;
+ }
+ if (!(this->actor.flags & ACTOR_FLAG_20000000) && (this->unk_AA5 != PLAYER_UNKAA5_5)) {
+ this->unk_A90 = NULL;
+ this->unk_A94 = FLT_MAX;
+ }
+ if (!(this->stateFlags1 & PLAYER_STATE1_800)) {
+ this->interactRangeActor = NULL;
+ this->getItemDirection = 0x6000;
+ }
+ if (this->actor.parent == NULL) {
+ this->rideActor = NULL;
+ }
+
+ this->tatlTextId = 0;
+ this->unk_B2B = -1;
+ this->closestSecretDistSq = FLT_MAX;
+ this->doorType = PLAYER_DOORTYPE_NONE;
+ this->unk_B75 = 0;
+ this->unk_A78 = NULL;
+
+ Math_StepToF(&this->windSpeed, 0.0f, 0.5f);
+ if ((this->unk_B62 != 0) ||
+ ((gSaveContext.magicState == MAGIC_STATE_IDLE) && (gSaveContext.save.saveInfo.playerData.magic != 0) &&
+ (this->stateFlags1 & PLAYER_STATE1_10))) {
+ func_8082F1AC(play, this);
+ }
+
+ temp_fv0 = this->actor.world.pos.y - this->actor.prevPos.y;
+ var_fv1_2 =
+ temp_fv0 +
+ ((this->bodyPartsPos[PLAYER_BODYPART_LEFT_FOOT].y + this->bodyPartsPos[PLAYER_BODYPART_RIGHT_FOOT].y) *
+ 0.5f);
+ temp_fv0 += this->bodyPartsPos[PLAYER_BODYPART_HEAD].y + 10.0f;
+
+ if (this->cylinder.info.toucher.dmgFlags == 0x80000) {
+ this->cylinder.dim.height = 80;
+ var_fv1_2 = ((temp_fv0 + var_fv1_2) * 0.5f) - 40.0f;
+ } else {
+ this->cylinder.dim.height = temp_fv0 - var_fv1_2;
+
+ if (this->cylinder.dim.height < 0) {
+ temp_fa0 = temp_fv0;
+ temp_fv0 = var_fv1_2;
+ var_fv1_2 = temp_fa0;
+ this->cylinder.dim.height = -this->cylinder.dim.height;
+ }
+ }
+
+ this->cylinder.dim.yShift = var_fv1_2 - this->actor.world.pos.y;
+
+ if (this->unk_B62 != 0) {
+ this->shieldCylinder.base.acFlags = AC_NONE;
+ this->shieldCylinder.info.toucher.dmgFlags = 0x80000;
+ this->shieldCylinder.info.toucherFlags = TOUCH_ON;
+ this->shieldCylinder.info.bumperFlags = BUMP_NONE;
+ this->shieldCylinder.dim.height = 80;
+ this->shieldCylinder.dim.radius = 50;
+ this->shieldCylinder.dim.yShift = ((temp_fv0 + var_fv1_2) * 0.5f - 40.0f) - this->actor.world.pos.y;
+
+ Collider_UpdateCylinder(&this->actor, &this->shieldCylinder);
+ CollisionCheck_SetAT(play, &play->colChkCtx, &this->shieldCylinder.base);
+ } else if (this->stateFlags1 & PLAYER_STATE1_400000) {
+ if ((this->transformation == PLAYER_FORM_GORON) || (this->transformation == PLAYER_FORM_DEKU)) {
+ this->shieldCylinder.base.acFlags = AC_ON | AC_HARD | AC_TYPE_ENEMY;
+ this->shieldCylinder.info.toucher.dmgFlags = 0x100000;
+ this->shieldCylinder.info.toucherFlags = TOUCH_NONE;
+ this->shieldCylinder.info.bumperFlags = BUMP_ON;
+
+ if (this->transformation == PLAYER_FORM_GORON) {
+ this->shieldCylinder.dim.height = 35;
+ } else {
+ this->shieldCylinder.dim.height = 30;
+ }
+
+ if (this->transformation == PLAYER_FORM_GORON) {
+ this->shieldCylinder.dim.radius = 30;
+ } else {
+ this->shieldCylinder.dim.radius = 20;
+ }
+
+ this->shieldCylinder.dim.yShift = 0;
+ Collider_UpdateCylinder(&this->actor, &this->shieldCylinder);
+ CollisionCheck_SetAC(play, &play->colChkCtx, &this->shieldCylinder.base);
+ this->cylinder.dim.yShift = 0;
+ this->cylinder.dim.height = this->shieldCylinder.dim.height;
+ } else {
+ this->cylinder.dim.height = this->cylinder.dim.height * 0.8f;
+ }
+ }
+
+ Collider_UpdateCylinder(&this->actor, &this->cylinder);
+ if (!(this->stateFlags2 & PLAYER_STATE2_4000)) {
+ if (!(this->stateFlags1 & (PLAYER_STATE1_4 | PLAYER_STATE1_80 | PLAYER_STATE1_2000 | PLAYER_STATE1_4000 |
+ PLAYER_STATE1_800000)) &&
+ !(this->stateFlags3 & PLAYER_STATE3_10000000)) {
+ if ((func_808561B0 != this->actionFunc) && (func_80853D68 != this->actionFunc) &&
+ (this->actor.draw != NULL)) {
+ if ((this->actor.id != ACTOR_PLAYER) && (this->csMode == PLAYER_CSMODE_110)) {
+ this->cylinder.dim.radius = 8;
+ }
+ CollisionCheck_SetOC(play, &play->colChkCtx, &this->cylinder.base);
+ }
+ }
+ if (!(this->stateFlags1 & (PLAYER_STATE1_80 | PLAYER_STATE1_4000000)) && (this->invincibilityTimer <= 0)) {
+ if ((func_808561B0 != this->actionFunc) &&
+ ((func_80857BE8 != this->actionFunc) || (this->unk_AE7 != 1))) {
+ if (this->cylinder.base.atFlags != AT_NONE) {
+ CollisionCheck_SetAT(play, &play->colChkCtx, &this->cylinder.base);
+ }
+ CollisionCheck_SetAC(play, &play->colChkCtx, &this->cylinder.base);
+ }
+ }
+ }
+
+ AnimationContext_SetNextQueue(play);
+ }
+
+ func_801229FC(this);
+ Math_Vec3f_Copy(&this->actor.home.pos, &this->actor.world.pos);
+
+ if ((this->stateFlags1 & (PLAYER_STATE1_80 | PLAYER_STATE1_10000000 | PLAYER_STATE1_20000000)) ||
+ (this != GET_PLAYER(play))) {
+ this->actor.colChkInfo.mass = MASS_IMMOVABLE;
+ } else {
+ this->actor.colChkInfo.mass = sPlayerMass[this->transformation];
+ }
+
+ this->stateFlags3 &= ~(PLAYER_STATE3_4 | PLAYER_STATE3_400);
+ Collider_ResetCylinderAC(play, &this->cylinder.base);
+ Collider_ResetCylinderAC(play, &this->shieldCylinder.base);
+ Collider_ResetCylinderAT(play, &this->shieldCylinder.base);
+ Collider_ResetQuadAT(play, &this->meleeWeaponQuads[0].base);
+ Collider_ResetQuadAT(play, &this->meleeWeaponQuads[1].base);
+ Collider_ResetQuadAC(play, &this->shieldQuad.base);
+
+ if (!(this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) || (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND_TOUCH) ||
+ (this->actor.floorBgId != BGCHECK_SCENE)) {
+ this->unk_AC0 = 0.0f;
+ }
+ this->actor.shape.yOffset = this->unk_ABC + this->unk_AC0;
+}
+
+Vec3f D_8085D41C = { 0.0f, 0.0f, -30.0f };
+
+void Player_Update(Actor* thisx, PlayState* play) {
+ static Vec3f sDogSpawnPos;
+ Player* this = (Player*)thisx;
+ s32 dogParams;
+ s32 pad;
+ Input input;
+ s32 pad2;
+
+ this->stateFlags3 &= ~PLAYER_STATE3_10;
+
+ // This block is a leftover dog-following mechanic from OoT
+ if (gSaveContext.dogParams < 0) {
+ if (Object_GetIndex(&play->objectCtx, OBJECT_DOG) < 0) {
+ gSaveContext.dogParams = 0;
+ } else {
+ Actor* dog;
+
+ gSaveContext.dogParams &= (u16)~0x8000;
+ Player_TranslateAndRotateY(this, &this->actor.world.pos, &D_8085D41C, &sDogSpawnPos);
+
+ dogParams = gSaveContext.dogParams;
+
+ dog = Actor_Spawn(&play->actorCtx, play, ACTOR_EN_DG, sDogSpawnPos.x, sDogSpawnPos.y, sDogSpawnPos.z, 0,
+ this->actor.shape.rot.y, 0, dogParams | 0x8000);
+ if (dog != NULL) {
+ dog->room = -1;
+ }
+ }
+ }
+
+ if ((this->interactRangeActor != NULL) && (this->interactRangeActor->update == NULL)) {
+ this->interactRangeActor = NULL;
+ }
+
+ if ((this->heldActor != NULL) && (this->heldActor->update == NULL)) {
+ func_8082DCA0(play, this);
+ }
+
+ if ((play->actorCtx.unk268 != 0) && (this == GET_PLAYER(play))) {
+ input = play->actorCtx.unk_26C;
+ } else if ((this->csMode == PLAYER_CSMODE_5) || (this->stateFlags1 & (PLAYER_STATE1_20 | PLAYER_STATE1_20000000)) ||
+ (this != GET_PLAYER(play)) || func_8082DA90(play) ||
+ (gSaveContext.save.saveInfo.playerData.health == 0)) {
+ bzero(&input, sizeof(Input));
+ this->fallStartHeight = this->actor.world.pos.y;
+ } else {
+ input = *CONTROLLER1(&play->state);
+ if (this->unk_B5E != 0) {
+ input.cur.button &= ~(BTN_CUP | BTN_B | BTN_A);
+ input.press.button &= ~(BTN_CUP | BTN_B | BTN_A);
+ }
+ }
+
+ Player_UpdateCommon(this, play, &input);
+ play->actorCtx.unk268 = 0;
+ bzero(&play->actorCtx.unk_26C, sizeof(Input));
+
+ MREG(52) = this->actor.world.pos.x;
+ MREG(53) = this->actor.world.pos.y;
+ MREG(54) = this->actor.world.pos.z;
+ MREG(55) = this->actor.world.rot.y;
+}
+
+void Player_DrawGameplay(PlayState* play, Player* this, s32 lod, Gfx* cullDList,
+ OverrideLimbDrawFlex overrideLimbDraw) {
+ OPEN_DISPS(play->state.gfxCtx);
+
+ gSPSegment(POLY_OPA_DISP++, 0x0C, cullDList);
+ gSPSegment(POLY_XLU_DISP++, 0x0C, cullDList);
+
+ Player_DrawImpl(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount, lod,
+ this->transformation, 0, this->actor.shape.face, overrideLimbDraw, Player_PostLimbDrawGameplay,
+ &this->actor);
+
+ CLOSE_DISPS(play->state.gfxCtx);
+}
+
+void func_80846460(Player* this) {
+ Vec3f* pos;
+ Vec3f* bodyPartsPos;
+ s32 i;
+
+ this->actor.focus.pos.x = this->actor.world.pos.x;
+ this->actor.focus.pos.z = this->actor.world.pos.z;
+ this->actor.focus.pos.y = this->actor.world.pos.y + 24.0f;
+
+ pos = &this->actor.world.pos;
+ bodyPartsPos = this->bodyPartsPos;
+ for (i = 0; i < ARRAY_COUNT(this->bodyPartsPos); i++) {
+ Math_Vec3f_Copy(bodyPartsPos, pos);
+ bodyPartsPos++;
+ }
+
+ this->bodyPartsPos[PLAYER_BODYPART_HEAD].y = this->actor.world.pos.y + 24.0f;
+ this->bodyPartsPos[PLAYER_BODYPART_WAIST].y = this->actor.world.pos.y + 60.0f;
+ Math_Vec3f_Copy(this->actor.shape.feetPos, pos);
+ Math_Vec3f_Copy(&this->actor.shape.feetPos[1], pos);
+}
+
+struct_80124618 D_8085D428[] = {
+ { 0, { 0, 0, 0 } }, { 1, { 80, 170, 80 } }, { 3, { 100, 80, 100 } },
+ { 7, { 100, 100, 100 } }, { 8, { 100, 100, 100 } },
+};
+struct_80124618 D_8085D450[] = {
+ { 0, { 0, 0, 0 } }, { 1, { 80, 170, 80 } }, { 3, { 100, 80, 100 } },
+ { 7, { 100, 100, 100 } }, { 8, { 100, 100, 100 } },
+};
+struct_80124618 D_8085D478[] = {
+ { 0, { 0, 0, 0 } },
+ { 8, { 0, 0, 0 } },
+};
+struct_80124618 D_8085D488[] = {
+ { 0, { 100, 100, 100 } }, { 1, { 100, 60, 100 } }, { 3, { 100, 140, 100 } },
+ { 7, { 100, 80, 100 } }, { 9, { 100, 100, 100 } },
+};
+struct_80124618 D_8085D4B0[] = {
+ { 0, { 100, 100, 100 } }, { 1, { 100, 70, 100 } }, { 3, { 100, 120, 100 } },
+ { 6, { 100, 80, 100 } }, { 8, { 100, 100, 100 } }, { 9, { 100, 100, 100 } },
+};
+struct_80124618 D_8085D4E0[] = {
+ { 0, { 0, 0, 0 } }, { 1, { 0, 0, 0 } }, { 3, { 100, 130, 100 } },
+ { 5, { 130, 130, 130 } }, { 7, { 80, 90, 80 } }, { 9, { 100, 100, 100 } },
+};
+struct_80124618 D_8085D510[] = {
+ { 0, { 0, 50, 0 } },
+ { 1, { 0, 50, 0 } },
+};
+struct_80124618 D_8085D520[] = {
+ { 0, { 100, 120, 100 } },
+ { 1, { 100, 120, 100 } },
+};
+struct_80124618 D_8085D530[] = {
+ { 0, { 160, 120, 160 } },
+ { 1, { 160, 120, 160 } },
+};
+struct_80124618 D_8085D540[] = {
+ { 0, { 0, 0, 0 } },
+ { 2, { 100, 100, 100 } },
+};
+
+struct_80124618* D_8085D550[3] = {
+ D_8085D488,
+ D_8085D4B0,
+ D_8085D4E0,
+};
+struct_80124618* D_8085D55C[3] = {
+ D_8085D428,
+ D_8085D450,
+ D_8085D478,
+};
+struct_80124618* D_8085D568[3] = {
+ D_8085D510,
+ D_8085D520,
+ D_8085D530,
+};
+
+Gfx* D_8085D574[] = {
+ object_link_nuts_DL_009C48,
+ object_link_nuts_DL_009AB8,
+ object_link_nuts_DL_009DB8,
+};
+
+Color_RGB8 D_8085D580 = { 255, 255, 255 };
+Color_RGB8 D_8085D584 = { 80, 80, 200 };
+
+void Player_Draw(Actor* thisx, PlayState* play) {
+ Player* this = THIS;
+ f32 one = 1.0f;
+ s32 spEC = false;
+
+ Math_Vec3f_Copy(&this->unk_D6C, &this->bodyPartsPos[PLAYER_BODYPART_WAIST]);
+ if (this->stateFlags3 & (PLAYER_STATE3_100 | PLAYER_STATE3_40000)) {
+ struct_80124618** spE8 = D_8085D550;
+ struct_80124618** spE4;
+ f32 spE0;
+ Gfx** spDC;
+ s32 i;
+
+ OPEN_DISPS(play->state.gfxCtx);
+
+ Matrix_Push();
+ func_8012C268(&play->state);
+ spEC = true;
+ if (this->stateFlags3 & PLAYER_STATE3_40000) {
+ Matrix_SetTranslateRotateYXZ(this->unk_AF0[0].x, this->unk_AF0[0].y, this->unk_AF0[0].z, &gZeroVec3s);
+ Matrix_Scale(this->actor.scale.x, this->actor.scale.y, this->actor.scale.z, MTXMODE_APPLY);
+ spE8 = D_8085D568;
+ spE0 = 0.0f;
+ } else {
+ Matrix_Translate(0.0f, -this->unk_ABC, 0.0f, MTXMODE_APPLY);
+ spE0 = this->unk_AE8 - 6;
+ if (spE0 < 0.0f) {
+ spE8 = D_8085D55C;
+ spE0 = this->unk_B86[0];
+ }
+ }
+
+ spE4 = spE8;
+ spDC = D_8085D574;
+
+ for (i = 0; i < 3; i++, spE4++, spDC++) {
+ Matrix_Push();
+ func_80124618(*spE4, spE0, &this->unk_AF0[1]);
+ Matrix_Scale(this->unk_AF0[1].x, this->unk_AF0[1].y, this->unk_AF0[1].z, MTXMODE_APPLY);
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, *spDC);
+
+ Matrix_Pop();
+ }
+ Matrix_Pop();
+
+ CLOSE_DISPS(play->state.gfxCtx);
+ }
+
+ if (!(this->stateFlags2 & PLAYER_STATE2_20000000) && (this->unk_ABC > -3900.0f)) {
+ OPEN_DISPS(play->state.gfxCtx);
+
+ if (!spEC) {
+ func_8012C268(&play->state);
+ }
+
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
+
+ func_800B8050(&this->actor, play, 0);
+ func_800B8118(&this->actor, play, 0);
+ func_80122868(play, this);
+
+ if (this->stateFlags3 & PLAYER_STATE3_1000) {
+ Color_RGB8 spBC;
+ f32 spB8 = this->unk_ABC + 1.0f;
+ f32 spB4 = 1.0f - (this->unk_ABC * 0.5f);
+
+ func_80846460(this);
+ Matrix_Translate(this->actor.world.pos.x, this->actor.world.pos.y + (1200.0f * this->actor.scale.y * spB8),
+ this->actor.world.pos.z, MTXMODE_NEW);
+
+ if (this->unk_B86[0] != 0) {
+ Matrix_RotateYS(this->unk_B28, MTXMODE_APPLY);
+ Matrix_RotateXS(this->unk_B86[0], MTXMODE_APPLY);
+ Matrix_RotateYS(-this->unk_B28, MTXMODE_APPLY);
+ }
+
+ Matrix_RotateYS(this->actor.shape.rot.y, MTXMODE_APPLY);
+ Matrix_RotateZS(this->actor.shape.rot.z, MTXMODE_APPLY);
+
+ Matrix_Scale(this->actor.scale.x * spB4 * 1.15f, this->actor.scale.y * spB8 * 1.15f,
+ CLAMP_MIN(spB8, spB4) * this->actor.scale.z * 1.15f, MTXMODE_APPLY);
+ Matrix_RotateXS(this->actor.shape.rot.x, MTXMODE_APPLY);
+ Scene_SetRenderModeXlu(play, 0, 1);
+ Lib_LerpRGB(&D_8085D580, &D_8085D584, this->unk_B10[0], &spBC);
+
+ gDPSetEnvColor(POLY_OPA_DISP++, spBC.r, spBC.g, spBC.b, 255);
+
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, gLinkGoronCurledDL);
+
+ if (this->unk_B86[1] != 0) {
+ if (this->unk_B86[1] < 3) {
+ func_80124618(D_8085D540, this->unk_B86[1], this->unk_AF0);
+ Matrix_Scale(this->unk_AF0[0].x, this->unk_AF0[0].y, this->unk_AF0[0].z, MTXMODE_APPLY);
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx),
+ G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ }
+
+ gSPDisplayList(POLY_OPA_DISP++, object_link_goron_DL_00C540);
+ }
+
+ func_80122BA4(play, &this->unk_3D0, 1, 255);
+ func_80122BA4(play, &this->unk_3D0, 2, 255);
+
+ if (this->unk_B86[1] < 3) {
+ if (this->unk_AE7 >= 5) {
+ f32 var_fa1;
+ u8 sp9B;
+
+ var_fa1 = (this->unk_AE7 - 4) * 0.02f;
+
+ if (this->unk_B86[1] != 0) {
+ sp9B = (-this->unk_B86[1] * 0x55) + 0xFF;
+ } else {
+ sp9B = (200.0f * var_fa1);
+ }
+
+ if (this->unk_B86[1] != 0) {
+ var_fa1 = 0.65f;
+ } else {
+ var_fa1 *= one;
+ }
+
+ Matrix_Scale(1.0f, var_fa1, var_fa1, MTXMODE_APPLY);
+
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx),
+ G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ AnimatedMat_DrawXlu(play, Lib_SegmentedToVirtual(&object_link_goron_Matanimheader_013138));
+ gDPSetEnvColor(POLY_XLU_DISP++, 155, 0, 0, sp9B);
+ gSPDisplayList(POLY_XLU_DISP++, object_link_goron_DL_0127B0);
+ AnimatedMat_DrawXlu(play, Lib_SegmentedToVirtual(&object_link_goron_Matanimheader_014684));
+ gSPDisplayList(POLY_XLU_DISP++, object_link_goron_DL_0134D0);
+ }
+ }
+ } else if ((this->transformation == PLAYER_FORM_GORON) && (this->stateFlags1 & PLAYER_STATE1_400000)) {
+ func_80846460(this);
+ SkelAnime_DrawFlexOpa(play, this->unk_2C8.skeleton, this->unk_2C8.jointTable, this->unk_2C8.dListCount,
+ NULL, NULL, NULL);
+ } else {
+ OverrideLimbDrawFlex sp84 = Player_OverrideLimbDrawGameplayDefault;
+ s32 lod = ((this->csMode != PLAYER_CSMODE_0) || (this->actor.projectedPos.z < 320.0f)) ? 0 : 1;
+ Vec3f sp74;
+
+ //! FAKE
+ if (this->transformation == PLAYER_FORM_FIERCE_DEITY) {}
+
+ if (this->stateFlags1 & PLAYER_STATE1_100000) {
+ SkinMatrix_Vec3fMtxFMultXYZ(&play->viewProjectionMtxF, &this->actor.focus.pos, &sp74);
+ if (sp74.z < -4.0f) {
+ sp84 = Player_OverrideLimbDrawGameplayFirstPerson;
+ }
+ }
+
+ if (this->stateFlags2 & PLAYER_STATE2_4000000) {
+ s16 temp_s0_2 = play->gameplayFrames * 600;
+ s16 sp70 = (play->gameplayFrames * 1000) & 0xFFFF;
+
+ Matrix_Push();
+
+ this->actor.scale.y = -this->actor.scale.y;
+ Matrix_SetTranslateRotateYXZ(this->actor.world.pos.x,
+ this->actor.world.pos.y + (2.0f * this->actor.depthInWater) +
+ (this->unk_ABC * this->actor.scale.y),
+ this->actor.world.pos.z, &this->actor.shape.rot);
+ Matrix_Scale(this->actor.scale.x, this->actor.scale.y, this->actor.scale.z, MTXMODE_APPLY);
+ Matrix_RotateXS(temp_s0_2, MTXMODE_APPLY);
+ Matrix_RotateYS(sp70, MTXMODE_APPLY);
+ Matrix_Scale(1.1f, 0.95f, 1.05f, MTXMODE_APPLY);
+ Matrix_RotateYS(-sp70, MTXMODE_APPLY);
+ Matrix_RotateXS(-temp_s0_2, MTXMODE_APPLY);
+ Player_DrawGameplay(play, this, lod, gCullFrontDList, sp84);
+ this->actor.scale.y = -this->actor.scale.y;
+
+ Matrix_Pop();
+ }
+
+ gSPClearGeometryMode(POLY_OPA_DISP++, G_CULL_BOTH);
+
+ gSPClearGeometryMode(POLY_XLU_DISP++, G_CULL_BOTH);
+
+ if ((this->transformation == PLAYER_FORM_ZORA) && (this->unk_B62 != 0) &&
+ !(this->stateFlags3 & PLAYER_STATE3_8000)) {
+ Matrix_Push();
+ Matrix_RotateXS(-0x4000, MTXMODE_APPLY);
+ Matrix_Translate(0.0f, 0.0f, -1800.0f, MTXMODE_APPLY);
+ Player_DrawZoraShield(play, this);
+ Matrix_Pop();
+ }
+
+ Player_DrawGameplay(play, this, lod, gCullBackDList, sp84);
+ }
+
+ func_801229A0(play, this);
+ if (this->stateFlags2 & PLAYER_STATE2_4000) {
+ f32 temp_fa0 = this->unk_B48;
+
+ gSPSegment(POLY_XLU_DISP++, 0x08,
+ Gfx_TwoTexScroll(play->state.gfxCtx, 0, 0, -(s32)play->gameplayFrames & 0x7F, 0x20, 0x20, 1, 0,
+ ((s32)play->gameplayFrames * -2) & 0x7F, 0x20, 0x20));
+
+ Matrix_Scale(temp_fa0, temp_fa0, temp_fa0, MTXMODE_APPLY);
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+
+ gDPSetEnvColor(POLY_XLU_DISP++, 0, 50, 100, 255);
+
+ gSPDisplayList(POLY_XLU_DISP++, gEffIceFragment3DL);
+ }
+
+ if (this->getItemDrawIdPlusOne > GID_NONE + 1) {
+ Player_DrawGetItem(play, this);
+ }
+
+ func_80122D44(play, &this->unk_3D0);
+
+ CLOSE_DISPS(play->state.gfxCtx);
+ }
+
+ play->actorCtx.flags &= ~ACTORCTX_FLAG_3;
+}
+
+void Player_Destroy(Actor* thisx, PlayState* play) {
+ Player* this = (Player*)thisx;
+
+ Effect_Destroy(play, this->meleeWeaponEffectIndex[0]);
+ Effect_Destroy(play, this->meleeWeaponEffectIndex[1]);
+ Effect_Destroy(play, this->meleeWeaponEffectIndex[2]);
+ LightContext_RemoveLight(play, &play->lightCtx, this->lightNode);
+ Collider_DestroyCylinder(play, &this->cylinder);
+ Collider_DestroyCylinder(play, &this->shieldCylinder);
+ Collider_DestroyQuad(play, &this->meleeWeaponQuads[0]);
+ Collider_DestroyQuad(play, &this->meleeWeaponQuads[1]);
+ Collider_DestroyQuad(play, &this->shieldQuad);
+ ZeldaArena_Free(this->giObjectSegment);
+ ZeldaArena_Free(this->maskObjectSegment);
+ Magic_Reset(play);
+ func_80831454(this);
+}
+
+s32 func_80847190(PlayState* play, Player* this, s32 arg2) {
+ s32 pad;
+ s16 var_s0;
+
+ if (!func_800B7128(this) && !func_8082EF20(this) && !arg2) {
+ var_s0 = sPlayerControlInput->rel.stick_y * 0xF0;
+ Math_SmoothStepToS(&this->actor.focus.rot.x, var_s0, 0xE, 0xFA0, 0x1E);
+
+ var_s0 = sPlayerControlInput->rel.stick_x * -0x10;
+ var_s0 = CLAMP(var_s0, -0xBB8, 0xBB8);
+ this->actor.focus.rot.y += var_s0;
+ } else {
+ s16 temp3;
+
+ temp3 = ((sPlayerControlInput->rel.stick_y >= 0) ? 1 : -1) *
+ (s32)((1.0f - Math_CosS(sPlayerControlInput->rel.stick_y * 0xC8)) * 1500.0f);
+ this->actor.focus.rot.x += temp3;
+
+ if (this->stateFlags1 & PLAYER_STATE1_800000) {
+ this->actor.focus.rot.x = CLAMP(this->actor.focus.rot.x, -0x1F40, 0xFA0);
+ } else {
+ this->actor.focus.rot.x = CLAMP(this->actor.focus.rot.x, -0x36B0, 0x36B0);
+ }
+
+ var_s0 = this->actor.focus.rot.y - this->actor.shape.rot.y;
+ temp3 = ((sPlayerControlInput->rel.stick_x >= 0) ? 1 : -1) *
+ (s32)((1.0f - Math_CosS(sPlayerControlInput->rel.stick_x * 0xC8)) * -1500.0f);
+ var_s0 += temp3;
+
+ this->actor.focus.rot.y = CLAMP(var_s0, -0x4AAA, 0x4AAA) + this->actor.shape.rot.y;
+ }
+
+ this->unk_AA6 |= 2;
+
+ return func_80832754(this, (play->bButtonAmmoPlusOne != 0) || func_800B7128(this) || func_8082EF20(this));
+}
+
+void func_8084748C(Player* this, f32* speed, f32 speedTarget, s16 yawTarget) {
+ f32 incrStep = this->skelAnime.curFrame - 10.0f;
+ f32 maxSpeed = (R_RUN_SPEED_LIMIT / 100.0f) * 0.8f;
+
+ if (*speed > maxSpeed) {
+ *speed = maxSpeed;
+ }
+
+ if ((0.0f < incrStep) && (incrStep < 16.0f)) {
+ incrStep = fabsf(incrStep) * 0.5f;
+ } else {
+ speedTarget = 0.0f;
+ incrStep = 0.0f;
+ }
+
+ Math_AsymStepToF(speed, speedTarget * 0.8f, incrStep, (fabsf(*speed) * 0.02f) + 0.05f);
+ Math_ScaledStepToS(&this->currentYaw, yawTarget, 1600); // 1 ESS turn, also one frame of first-person rotation
+}
+
+void func_808475B4(Player* this) {
+ f32 sp4;
+ f32 temp_fa1;
+ f32 temp_fv0;
+ f32 var_ft4 = -5.0f;
+ f32 var_ft5 = this->ageProperties->unk_28;
+ f32 var_ft5_4;
+
+ temp_fv0 = this->actor.depthInWater - var_ft5;
+ if (this->actor.velocity.y < 0.0f) {
+ var_ft5 += 1.0f;
+ }
+
+ if (this->actor.depthInWater < var_ft5) {
+ temp_fv0 = CLAMP(temp_fv0, -0.4f, -0.1f);
+ sp4 = temp_fv0 - ((this->actor.velocity.y <= 0.0f) ? 0.0f : this->actor.velocity.y * 0.5f);
+ } else {
+ if (!(this->stateFlags1 & PLAYER_STATE1_80) && (this->currentBoots >= PLAYER_BOOTS_ZORA_UNDERWATER) &&
+ (this->actor.velocity.y >= -5.0f)) {
+ sp4 = -0.3f;
+ } else if ((this->transformation == PLAYER_FORM_DEKU) && (this->actor.velocity.y < 0.0f)) {
+ var_ft4 = 0.0f;
+ sp4 = -this->actor.velocity.y;
+ } else {
+ var_ft4 = 2.0f;
+ var_ft5_4 = CLAMP(temp_fv0, 0.1f, 0.4f);
+ sp4 = ((this->actor.velocity.y >= 0.0f) ? 0.0f : this->actor.velocity.y * -0.3f) + var_ft5_4;
+ }
+
+ if (this->actor.depthInWater > 100.0f) {
+ this->stateFlags2 |= PLAYER_STATE2_400;
+ }
+ }
+
+ this->actor.velocity.y += sp4;
+ if (((this->actor.velocity.y - var_ft4) * sp4) > 0.0f) {
+ this->actor.velocity.y = var_ft4;
+ }
+ this->actor.gravity = 0.0f;
+}
+
+void func_808477D0(PlayState* play, Player* this, Input* input, f32 arg3) {
+ f32 var_fv0;
+
+ if ((input != NULL) && CHECK_BTN_ANY(input->press.button, BTN_B | BTN_A)) {
+ var_fv0 = 1.0f;
+ } else {
+ var_fv0 = 0.5f;
+ }
+
+ var_fv0 = var_fv0 * arg3;
+ var_fv0 = CLAMP(var_fv0, 1.0f, 2.5f);
+ this->skelAnime.playSpeed = var_fv0;
+
+ PlayerAnimation_Update(play, &this->skelAnime);
+}
+
+s32 func_80847880(PlayState* play, Player* this) {
+ if (play->bButtonAmmoPlusOne != 0) {
+ if (play->sceneId == SCENE_20SICHITAI) {
+ Player_SetAction(play, this, func_80854430, 0);
+ play->bButtonAmmoPlusOne = 0;
+ this->csMode = PLAYER_CSMODE_0;
+ return true;
+ }
+
+ func_8082DE50(play, this);
+ Player_SetAction(play, this, func_80854614, 0);
+ if (!func_800B7118(this) || Player_IsHoldingHookshot(this)) {
+ func_80831990(play, this, ITEM_BOW);
+ }
+ Player_AnimationPlayOnce(play, this, func_8082ED20(this));
+ this->csMode = PLAYER_CSMODE_0;
+ this->stateFlags1 |= PLAYER_STATE1_100000;
+ Player_StopHorizontalMovement(this);
+ func_80836D8C(this);
+
+ return true;
+ }
+ return false;
+}
+
+s32 func_80847994(PlayState* play, Player* this) {
+ if (this->stateFlags3 & PLAYER_STATE3_20) {
+ this->stateFlags3 &= ~PLAYER_STATE3_20;
+ this->itemAction = PLAYER_IA_OCARINA;
+ this->unk_AA5 = PLAYER_UNKAA5_5;
+ func_80838A90(this, play);
+ return true;
+ }
+ return false;
+}
+
+void func_808479F4(PlayState* play, Player* this, f32 arg2) {
+ if (this->actor.wallBgId != BGCHECK_SCENE) {
+ DynaPolyActor* actor = DynaPoly_GetActor(&play->colCtx, this->actor.wallBgId);
+
+ if (actor != NULL) {
+ func_800B72F8(actor, arg2, this->actor.world.rot.y);
+ }
+ }
+}
+
+void func_80847A50(Player* this) {
+ Player_PlaySfx(this, ((this->unk_AE7 != 0) ? NA_SE_PL_WALK_METAL1 : NA_SE_PL_WALK_LADDER) +
+ this->ageProperties->surfaceSfxIdOffset);
+}
+
+Vec3f D_8085D588[] = {
+ { 30.0f, 0.0f, 0.0f },
+ { -30.0f, 0.0f, 0.0f },
+};
+Vec3f D_8085D5A0[] = {
+ { 60.0f, 20.0f, 0.0f },
+ { -60.0f, 20.0f, 0.0f },
+};
+Vec3f D_8085D5B8[] = {
+ { 60.0f, -20.0f, 0.0f },
+ { -60.0f, -20.0f, 0.0f },
+};
+Vec3f D_8085D5D0 = { 0.0f, 0.0f, -30.0f };
+
+// related to mounting/unmounting the horse
+s32 func_80847A94(PlayState* play, Player* this, s32 arg2, f32* arg3) {
+ Actor* rideActor = this->rideActor;
+ f32 sp60 = rideActor->world.pos.y + 20.0f;
+ f32 sp5C = rideActor->world.pos.y - 20.0f;
+ Vec3f sp50;
+ Vec3f sp44;
+ CollisionPoly* sp40;
+ CollisionPoly* sp3C;
+ s32 sp38;
+ s32 sp34;
+
+ *arg3 = func_80835CD8(play, this, &D_8085D588[arg2], &sp50, &sp3C, &sp34);
+
+ if ((sp5C < *arg3) && (*arg3 < sp60)) {
+ if (!func_80835D58(play, this, &D_8085D5A0[arg2], &sp40, &sp38, &sp44)) {
+ if (!func_80835D58(play, this, &D_8085D5B8[arg2], &sp40, &sp38, &sp44)) {
+ this->actor.floorPoly = sp3C;
+ this->actor.floorBgId = sp38;
+ this->floorSfxOffset = SurfaceType_GetSfxOffset(&play->colCtx, sp3C, sp34);
+ return true;
+ }
+ }
+ }
+ return false;
+}
+
+s32 func_80847BF0(Player* this, PlayState* play) {
+ EnHorse* rideActor = (EnHorse*)this->rideActor;
+ s32 var_a2;
+ f32 sp34;
+
+ if (this->unk_AE8 < 0) {
+ this->unk_AE8 = 0x63;
+ } else {
+ var_a2 = (this->mountSide < 0) ? 0 : 1;
+
+ if (!func_80847A94(play, this, var_a2, &sp34)) {
+ var_a2 ^= 1;
+ if (!func_80847A94(play, this, var_a2, &sp34)) {
+ return false;
+ }
+
+ this->mountSide = -this->mountSide;
+ }
+
+ if (play->csCtx.state == CS_STATE_IDLE) {
+ if (!func_8082DA90(play)) {
+ if (EN_HORSE_CHECK_1(rideActor) || EN_HORSE_CHECK_4(rideActor)) {
+ this->stateFlags2 |= PLAYER_STATE2_400000;
+
+ if (EN_HORSE_CHECK_1(rideActor) ||
+ (EN_HORSE_CHECK_4(rideActor) && CHECK_BTN_ALL(sPlayerControlInput->press.button, BTN_A))) {
+ rideActor->actor.child = NULL;
+
+ func_8083172C(play, this, func_808505D0, 0);
+ this->unk_B48 = sp34 - rideActor->actor.world.pos.y;
+
+ Player_AnimationPlayOnce(play, this,
+ (this->mountSide < 0) ? &gPlayerAnim_link_uma_left_down
+ : &gPlayerAnim_link_uma_right_down);
+
+ return true;
+ }
+ }
+ }
+ }
+ }
+
+ return false;
+}
+
+// Used in 2 horse-related functions
+void func_80847E2C(Player* this, f32 arg1, f32 minFrame) {
+ f32 addend;
+ f32 dir;
+
+ if ((this->unk_B48 != 0.0f) && (minFrame <= this->skelAnime.curFrame)) {
+ if (arg1 < fabsf(this->unk_B48)) {
+ dir = (this->unk_B48 >= 0.0f) ? 1 : -1;
+ addend = dir * arg1;
+ } else {
+ addend = this->unk_B48;
+ }
+ this->actor.world.pos.y += addend;
+ this->unk_B48 -= addend;
+ }
+}
+
+s32 func_80847ED4(Player* this) {
+ return (this->interactRangeActor != NULL) && (this->interactRangeActor->id == ACTOR_EN_ZOG) &&
+ CHECK_BTN_ALL(sPlayerControlInput->cur.button, BTN_A);
+}
+
+void func_80847F1C(Player* this) {
+ s32 pad;
+ f32 yPos;
+ s16 yaw;
+ Actor* interactRangeActor = this->interactRangeActor;
+
+ if (func_80847ED4(this)) {
+ yPos = this->actor.world.pos.y;
+ yaw = this->currentYaw - interactRangeActor->shape.rot.y;
+ Lib_Vec3f_TranslateAndRotateY(&interactRangeActor->world.pos, interactRangeActor->shape.rot.y, &D_8085D5D0,
+ &this->actor.world.pos);
+ this->actor.world.pos.y = yPos;
+ this->actor.shape.rot.y = interactRangeActor->shape.rot.y;
+
+ interactRangeActor->speed = Math_CosS(ABS_ALT(yaw)) * this->linearVelocity * 0.5f;
+ if (interactRangeActor->speed < 0.0f) {
+ interactRangeActor->speed = 0.0f;
+ }
+ func_8083133C(this);
+ }
+}
+
+AnimSfxEntry D_8085D5DC[] = {
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 0, NA_SE_PL_SWIM, STOP),
+};
+
+void func_80847FF8(Player* this, f32* arg1, f32 arg2, s16 arg3) {
+ func_8084748C(this, arg1, arg2, arg3);
+ Player_PlayAnimSfx(this, D_8085D5DC);
+ func_80847F1C(this);
+}
+
+void func_80848048(PlayState* play, Player* this) {
+ Player_SetAction(play, this, func_80851588, 0);
+ func_8082E634(play, this, &gPlayerAnim_link_swimer_swim);
+}
+
+s32 func_80848094(PlayState* play, Player* this, f32* arg2, s16* arg3) {
+ PlayerAnimationHeader* anim;
+ s16 temp_v0 = this->currentYaw - *arg3;
+ s32 temp_v0_2;
+
+ if (ABS_ALT(temp_v0) > 0x6000) {
+ anim = &gPlayerAnim_link_swimer_swim_wait;
+ if (Math_StepToF(&this->linearVelocity, 0.0f, 1.0f)) {
+ this->currentYaw = *arg3;
+ } else {
+ *arg2 = 0.0f;
+ *arg3 = this->currentYaw;
+ }
+ } else {
+ temp_v0_2 = func_8083E514(this, arg2, arg3, play);
+ if (temp_v0_2 > 0) {
+ anim = &gPlayerAnim_link_swimer_swim;
+ } else if (temp_v0_2 < 0) {
+ anim = &gPlayerAnim_link_swimer_back_swim;
+ } else {
+ s16 diff = BINANG_SUB(this->actor.shape.rot.y, *arg3);
+
+ if (diff > 0) {
+ anim = &gPlayerAnim_link_swimer_Rside_swim;
+ } else {
+ anim = &gPlayerAnim_link_swimer_Lside_swim;
+ }
+ }
+ }
+
+ if (anim != this->skelAnime.animation) {
+ func_8082E634(play, this, anim);
+ return true;
+ }
+ return false;
+}
+
+void func_808481CC(PlayState* play, Player* this, f32 arg2) {
+ f32 sp2C;
+ s16 sp2A;
+
+ func_80832F78(this, &sp2C, &sp2A, 0.0f, play);
+ func_8084748C(this, &this->linearVelocity, sp2C / 2.0f, sp2A);
+ func_8084748C(this, &this->actor.velocity.y, arg2, this->currentYaw);
+}
+
+void func_80848250(PlayState* play, Player* this) {
+ this->getItemDrawIdPlusOne = GID_NONE + 1;
+ this->stateFlags1 &= ~(PLAYER_STATE1_400 | PLAYER_STATE1_800);
+ this->getItemId = GI_NONE;
+ func_800E0238(Play_GetCamera(play, CAM_ID_MAIN));
+}
+
+void func_80848294(PlayState* play, Player* this) {
+ func_80848250(play, this);
+ func_8082DC28(this);
+ func_80839E74(this, play);
+ this->currentYaw = this->actor.shape.rot.y;
+}
+
+// Player_GetItem?
+s32 func_808482E0(PlayState* play, Player* this) {
+ if (this->getItemId == GI_NONE) {
+ return true;
+ }
+
+ if (this->unk_AE7 == 0) {
+ GetItemEntry* giEntry = &sGetItemTable[this->getItemId - 1];
+
+ this->unk_AE7 = 1;
+ Message_StartTextbox(play, giEntry->textId, &this->actor);
+ Item_Give(play, giEntry->itemId);
+
+ if ((this->getItemId >= GI_MASK_DEKU) && (this->getItemId <= GI_MASK_KAFEIS_MASK)) {
+ Audio_PlayFanfare(NA_BGM_GET_NEW_MASK);
+ } else if (((this->getItemId >= GI_RUPEE_GREEN) && (this->getItemId <= GI_RUPEE_10)) ||
+ (this->getItemId == GI_RECOVERY_HEART)) {
+ play_sound(NA_SE_SY_GET_BOXITEM);
+ } else {
+ s32 seqId;
+
+ if ((this->getItemId == GI_HEART_CONTAINER) ||
+ ((this->getItemId == GI_HEART_PIECE) && EQ_MAX_QUEST_HEART_PIECE_COUNT)) {
+ seqId = NA_BGM_GET_HEART | 0x900;
+ } else {
+ s32 var_v1;
+
+ if ((this->getItemId == GI_HEART_PIECE) ||
+ ((this->getItemId >= GI_RUPEE_PURPLE) && (this->getItemId <= GI_RUPEE_HUGE))) {
+ var_v1 = NA_BGM_GET_SMALL_ITEM;
+ } else {
+ var_v1 = NA_BGM_GET_ITEM | 0x900;
+ }
+ seqId = var_v1;
+ }
+
+ Audio_PlayFanfare(seqId);
+ }
+ } else if (Message_GetState(&play->msgCtx) == TEXT_STATE_CLOSING) {
+ if (this->getItemId == GI_OCARINA) {
+ // zelda teaching song of time cs?
+ play->nextEntrance = ENTRANCE(CUTSCENE, 0);
+ gSaveContext.nextCutsceneIndex = 0xFFF2;
+ play->transitionTrigger = TRANS_TRIGGER_START;
+ play->transitionType = TRANS_TYPE_FADE_WHITE;
+ gSaveContext.nextTransitionType = TRANS_TYPE_FADE_WHITE;
+ this->stateFlags1 &= ~PLAYER_STATE1_20000000;
+ func_8085B28C(play, NULL, PLAYER_CSMODE_WAIT);
+ }
+ this->getItemId = GI_NONE;
+ }
+
+ return false;
+}
+
+AnimSfxEntry D_8085D5E0[] = {
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 60, NA_SE_IT_MASTER_SWORD_SWING, STOP),
+};
+
+void func_808484CC(Player* this) {
+ Player_PlayAnimSfx(this, D_8085D5E0);
+}
+
+void func_808484F0(Player* this) {
+ this->unk_B08 += this->unk_B0C;
+ this->unk_B0C -= this->unk_B08 * 5.0f;
+ this->unk_B0C *= 0.3f;
+
+ if (fabsf(this->unk_B0C) < 0.00001f) {
+ this->unk_B0C = 0.0f;
+ if (fabsf(this->unk_B08) < 0.00001f) {
+ this->unk_B08 = 0.0f;
+ }
+ }
+}
+
+s32 func_80848570(Player* this, PlayState* play) {
+ if (!func_8083A6C0(play, this)) {
+ if (func_808396B8(play, this)) {
+ PlayerMeleeWeaponAnimation meleeWeaponAnim = func_808335F4(this);
+
+ func_80833864(play, this, meleeWeaponAnim);
+ if ((meleeWeaponAnim >= PLAYER_MWA_SPIN_ATTACK_1H) ||
+ ((this->transformation == PLAYER_FORM_FIERCE_DEITY) && func_8082FBE8(this))) {
+ this->stateFlags2 |= PLAYER_STATE2_20000;
+ func_808332A0(play, this, 0, meleeWeaponAnim < PLAYER_MWA_SPIN_ATTACK_1H);
+ }
+ } else {
+ return false;
+ }
+ }
+ return true;
+}
+
+// elegy of emptiness
+void func_80848640(PlayState* play, Player* this) {
+ EnTorch2* torch2;
+ Actor* effChange;
+
+ torch2 = play->actorCtx.elegyShells[this->transformation];
+ if (torch2 != NULL) {
+ Math_Vec3f_Copy(&torch2->actor.home.pos, &this->actor.world.pos);
+ torch2->actor.home.rot.y = this->actor.shape.rot.y;
+ torch2->state = 0;
+ torch2->framesUntilNextState = 20;
+ } else {
+ torch2 = (EnTorch2*)Actor_Spawn(&play->actorCtx, play, ACTOR_EN_TORCH2, this->actor.world.pos.x,
+ this->actor.world.pos.y, this->actor.world.pos.z, 0, this->actor.shape.rot.y, 0,
+ this->transformation);
+ }
+
+ if (torch2 != NULL) {
+ play->actorCtx.elegyShells[this->transformation] = torch2;
+ Play_SetupRespawnPoint(&play->state, this->transformation + 3, PLAYER_PARAMS(0xFF, PLAYER_INITMODE_B));
+ }
+
+ effChange = Actor_Spawn(&play->actorCtx, play, ACTOR_EFF_CHANGE, this->actor.world.pos.x, this->actor.world.pos.y,
+ this->actor.world.pos.z, 0, this->actor.shape.rot.y, 0,
+ (GET_PLAYER_FORM << 3) | this->transformation);
+ if (effChange != NULL) {
+ //! @bug: This function should only pass Player*: it uses *(this + 0x153), which is meant to be
+ //! player->currentMask, but in this case is garbage in the skelAnime
+ Player_PlaySfx((Player*)effChange, NA_SE_PL_TRANSFORM);
+ }
+}
+
+s32 func_80848780(Player* this, PlayState* play) {
+ if (func_80830B88(play, this)) {
+ return true;
+ }
+ return false;
+}
+
+s32 func_808487B8(Player* this, PlayState* play) {
+ if (func_80830B88(play, this) || func_80830DF0(this, play)) {
+ return true;
+ }
+ return false;
+}
+
+s32 func_80848808(Player* this, PlayState* play) {
+ if (PlayerAnimation_Update(play, &this->unk_284) ||
+ ((Player_ItemToItemAction(this, this->heldItemId) == this->heldItemAction) &&
+ (D_80862B48 = D_80862B48 || ((this->modelAnimType != PLAYER_ANIMTYPE_3) &&
+ (this->heldItemAction != PLAYER_IA_STICK) && (play->bButtonAmmoPlusOne == 0))))) {
+ func_8082F43C(play, this, D_8085C9F0[this->heldItemAction]);
+ this->unk_ACC = 0;
+ this->unk_AA4 = 0;
+ D_80862B4C = D_80862B48;
+ return this->unk_AC4(this, play);
+ }
+
+ if (func_8082ED94(this) != 0) {
+ func_80830D40(play, this);
+ Player_AnimationPlayOnce(play, this, func_8082ED20(this));
+ this->unk_AA4 = 0;
+ } else {
+ func_80830D40(play, this);
+ }
+ return true;
+}
+
+s32 func_8084894C(Player* this, PlayState* play) {
+ PlayerAnimation_Update(play, &this->unk_284);
+ if (!CHECK_BTN_ALL(sPlayerControlInput->cur.button, BTN_R)) {
+ func_80830CE8(play, this);
+ } else {
+ this->stateFlags1 |= PLAYER_STATE1_400000;
+ Player_SetModelsForHoldingShield(this);
+ if ((this->transformation == PLAYER_FORM_ZORA) && CHECK_BTN_ALL(sPlayerControlInput->cur.button, BTN_B)) {
+ func_8082F164(this, BTN_R | BTN_B);
+ }
+ }
+ return true;
+}
+
+s32 func_80848A0C(Player* this, PlayState* play) {
+ if (PlayerAnimation_Update(play, &this->unk_284)) {
+ PlayerAnimationHeader* anim;
+ f32 lastFrame;
+
+ anim = func_80830A58(play, this);
+ lastFrame = Animation_GetLastFrame(anim);
+ PlayerAnimation_Change(play, &this->unk_284, anim, 1.0f, lastFrame, lastFrame, ANIMMODE_ONCE, 0.0f);
+ }
+
+ this->stateFlags1 |= PLAYER_STATE1_400000;
+ Player_SetModelsForHoldingShield(this);
+ return true;
+}
+
+s32 func_80848AB0(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)) {
+ func_8082F43C(play, this, D_8085C9F0[this->heldItemAction]);
+ PlayerAnimation_PlayLoop(play, &this->unk_284, D_8085BE84[PLAYER_ANIMGROUP_0][this->modelAnimType]);
+ this->unk_AA4 = 0;
+ this->unk_AC4(this, play);
+ return false;
+ }
+ return true;
+}
+
+s32 func_80848B6C(Player* this, PlayState* play) {
+ if (this->unk_B28 >= 0) {
+ this->unk_B28 = -this->unk_B28;
+ }
+
+ if (!Player_IsHoldingHookshot(this) || func_80831124(play, this)) {
+ if (!func_80830B88(play, this) && !func_80831094(this, play)) {
+ return false;
+ }
+ }
+ return true;
+}
+
+PlayerAnimationHeader* D_8085D5E4[] = {
+ &gPlayerAnim_link_hook_walk2ready,
+ &gPlayerAnim_link_bow_walk2ready,
+ &gPlayerAnim_pn_tamahakidf,
+};
+
+PlayerAnimationHeader* D_8085D5F0[] = {
+ &gPlayerAnim_link_hook_wait,
+ &gPlayerAnim_link_bow_bow_wait,
+ &gPlayerAnim_pn_tamahakidf,
+};
+
+u16 D_8085D5FC[] = {
+ NA_SE_IT_BOW_FLICK,
+ NA_SE_PL_DEKUNUTS_MISS_FIRE,
+ NA_SE_NONE,
+ NA_SE_NONE,
+};
+
+s32 func_80848BF4(Player* this, PlayState* play) {
+ s32 index;
+ s32 temp;
+
+ if (Player_IsHoldingHookshot(this)) {
+ index = 0;
+ } else {
+ temp = (this->transformation != PLAYER_FORM_DEKU) ? 1 : 2;
+ index = temp;
+ }
+
+ if (this->transformation != PLAYER_FORM_DEKU) {
+ Math_ScaledStepToS(&this->upperLimbRot.z, 0x4B0, 0x190);
+ this->unk_AA6 |= 0x100;
+ }
+
+ 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]);
+ this->unk_ACE = -1;
+ } else if (PlayerAnimation_Update(play, &this->unk_284)) {
+ PlayerAnimation_PlayLoop(play, &this->unk_284, D_8085D5F0[index]);
+ this->unk_ACE = 1;
+ } else if (this->unk_ACE == 1) {
+ this->unk_ACE = 2;
+ }
+
+ if (this->unk_ACC >= 0xB) {
+ this->unk_ACC--;
+ }
+
+ func_80831010(this, play);
+ if ((this->unk_ACE > 0) && ((this->unk_B28 < 0) || ((D_80862B4C == 0) && !func_80830FD4(play)))) {
+ func_8082F43C(play, this, func_80848E4C);
+ if (this->unk_B28 >= 0) {
+ if (index != 0) {
+ if (!func_80831194(play, this)) {
+ Player_PlaySfx(this, D_8085D5FC[this->unk_B28 - 1]);
+ }
+
+ if (this->transformation == PLAYER_FORM_DEKU) {
+ PlayerAnimation_PlayOnceSetSpeed(play, &this->unk_284, &gPlayerAnim_pn_tamahaki, 2.0f / 3.0f);
+ }
+ } else if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
+ func_80831194(play, this);
+ }
+ }
+ this->unk_ACC = 0xA;
+ Player_StopHorizontalMovement(this);
+ } else {
+ this->stateFlags3 |= PLAYER_STATE3_40;
+ }
+
+ return 1;
+}
+
+s32 func_80848E4C(Player* this, PlayState* play) {
+ s32 animFinished = PlayerAnimation_Update(play, &this->unk_284);
+
+ 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))) ||
+ func_80830F9C(play))) {
+
+ this->unk_B28 = ABS_ALT(this->unk_B28);
+ if (func_808306F8(this, play)) {
+ if (Player_IsHoldingHookshot(this)) {
+ this->unk_ACE = 1;
+ } else {
+ PlayerAnimation_PlayOnce(play, &this->unk_284,
+ (this->transformation == PLAYER_FORM_DEKU)
+ ? &gPlayerAnim_pn_tamahakidf
+ : &gPlayerAnim_link_bow_bow_shoot_next);
+ }
+ }
+ } else {
+ if (this->unk_ACC != 0) {
+ this->unk_ACC--;
+ }
+
+ if ((func_8082FBE8(this)) || (this->unk_AA5 != PLAYER_UNKAA5_0) || (this->stateFlags1 & PLAYER_STATE1_100000)) {
+ if (this->unk_ACC == 0) {
+ this->unk_ACC++;
+ }
+ return true;
+ }
+
+ if (Player_IsHoldingHookshot(this)) {
+ func_8082F43C(play, this, func_80848B6C);
+ } else {
+ func_8082F43C(play, this, func_80849054);
+ PlayerAnimation_PlayOnce(play, &this->unk_284,
+ (this->transformation == PLAYER_FORM_DEKU) ? &gPlayerAnim_pn_tamahakidf
+ : &gPlayerAnim_link_bow_bow_shoot_end);
+ }
+ this->unk_ACC = 0;
+ }
+
+ return true;
+}
+
+s32 func_80849054(Player* this, PlayState* play) {
+ if (!(this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) || PlayerAnimation_Update(play, &this->unk_284)) {
+ func_8082F43C(play, this, func_80848B6C);
+ }
+ return true;
+}
+
+s32 func_808490B4(Player* this, PlayState* play) {
+ Actor* heldActor = this->heldActor;
+
+ if (heldActor == NULL) {
+ func_808309CC(play, this);
+ }
+
+ if (func_80830B88(play, this)) {
+ return true;
+ }
+
+ 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 ((heldActor->id == ACTOR_EN_NIW) && (this->actor.velocity.y <= 0.0f)) {
+ this->actor.terminalVelocity = -2.0f;
+ this->actor.gravity = -0.5f;
+ this->fallStartHeight = this->actor.world.pos.y;
+ }
+ return true;
+ }
+ return func_80848780(this, play);
+}
+
+s32 func_808491B4(Player* this, PlayState* play) {
+ if (func_80830B88(play, this)) {
+ return true;
+ }
+
+ if (this->stateFlags1 & PLAYER_STATE1_2000000) {
+ func_8082F43C(play, this, func_80849570);
+ } else if (func_80831094(this, play)) {
+ return true;
+ }
+
+ return false;
+}
+
+s32 func_8084923C(Player* this, PlayState* play) {
+ if (PlayerAnimation_Update(play, &this->unk_284)) {
+ func_8082F43C(play, this, func_808492C4);
+ PlayerAnimation_PlayLoop(play, &this->unk_284, &gPlayerAnim_pz_cutterwaitanim);
+ }
+ if (this->unk_284.animation == &gPlayerAnim_pz_cutterwaitanim) {
+ func_80831010(this, play);
+ }
+ return true;
+}
+
+s32 func_808492C4(Player* this, PlayState* play) {
+ PlayerAnimation_Update(play, &this->unk_284);
+ func_80831010(this, play);
+ if (D_80862B4C == 0) {
+ func_8082F43C(play, this, func_8084933C);
+ PlayerAnimation_PlayOnce(play, &this->unk_284, &gPlayerAnim_pz_cutterattack);
+ }
+ return true;
+}
+
+s32 func_8084933C(Player* this, PlayState* play) {
+ if (PlayerAnimation_Update(play, &this->unk_284)) {
+ func_8082F43C(play, this, func_80849570);
+ this->unk_ACC = 0;
+ } else if (PlayerAnimation_OnFrame(&this->unk_284, 6.0f)) {
+ Vec3f pos;
+ s16 untargetedRotY;
+
+ func_80835BF8(&this->bodyPartsPos[PLAYER_BODYPART_LEFT_HAND], this->actor.shape.rot.y, 0.0f, &pos);
+ pos.y = this->actor.world.pos.y + 50.0f;
+
+ untargetedRotY = this->actor.shape.rot.y - 0x190;
+ this->boomerangActor = Actor_Spawn(
+ &play->actorCtx, play, ACTOR_EN_BOOM, pos.x, pos.y, pos.z, this->actor.focus.rot.x,
+ (this->targetedActor != NULL) ? this->actor.shape.rot.y + 0x36B0 : untargetedRotY, 0, ZORA_BOOMERANG_LEFT);
+
+ if (this->boomerangActor != NULL) {
+ EnBoom* leftBoomerang = (EnBoom*)this->boomerangActor;
+ EnBoom* rightBoomerang;
+
+ leftBoomerang->moveTo = this->targetedActor;
+ if (leftBoomerang->moveTo != NULL) {
+ leftBoomerang->unk_1CF = 0x10;
+ }
+ leftBoomerang->unk_1CC = leftBoomerang->unk_1CF + 0x24;
+
+ func_80835BF8(&this->bodyPartsPos[PLAYER_BODYPART_RIGHT_HAND], this->actor.shape.rot.y, 0.0f, &pos);
+
+ untargetedRotY = (this->actor.shape.rot.y + 0x190);
+ rightBoomerang =
+ (EnBoom*)Actor_Spawn(&play->actorCtx, play, ACTOR_EN_BOOM, pos.x, pos.y, pos.z, this->actor.focus.rot.x,
+ (this->targetedActor != NULL) ? this->actor.shape.rot.y - 0x36B0 : untargetedRotY,
+ 0, ZORA_BOOMERANG_RIGHT);
+
+ if (rightBoomerang != NULL) {
+ rightBoomerang->moveTo = this->targetedActor;
+ if (rightBoomerang->moveTo != NULL) {
+ rightBoomerang->unk_1CF = 0x10;
+ }
+
+ rightBoomerang->unk_1CC = rightBoomerang->unk_1CF + 0x24;
+ leftBoomerang->actor.child = &rightBoomerang->actor;
+ rightBoomerang->actor.parent = &leftBoomerang->actor;
+ }
+
+ this->stateFlags1 |= PLAYER_STATE1_2000000;
+ this->stateFlags3 &= ~PLAYER_STATE3_800000;
+ if (!func_80123420(this)) {
+ func_8083133C(this);
+ }
+
+ this->unk_D57 = 20;
+
+ Player_PlaySfx(this, NA_SE_IT_BOOMERANG_THROW);
+ Player_AnimSfx_PlayVoice(this, NA_SE_VO_LI_SWORD_N);
+ }
+ }
+
+ return true;
+}
+
+s32 func_80849570(Player* this, PlayState* play) {
+ if (func_80830B88(play, this)) {
+ return true;
+ }
+
+ if (this->stateFlags3 & PLAYER_STATE3_800000) {
+ func_8082F43C(play, this, func_80849620);
+ PlayerAnimation_PlayOnce(play, &this->unk_284, &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);
+ return true;
+ }
+
+ return false;
+}
+
+s32 func_80849620(Player* this, PlayState* play) {
+ if (!func_808491B4(this, play) && PlayerAnimation_Update(play, &this->unk_284)) {
+ if (this->stateFlags1 & PLAYER_STATE1_2000000) {
+ func_8082F43C(play, this, func_80849570);
+ this->unk_ACC = 0;
+ } else {
+ func_8082F43C(play, this, func_80848780);
+ }
+ }
+ return true;
+}
+
+void func_808496AC(Player* this, PlayState* play) {
+ PlayerAnimation_Update(play, &this->skelAnime);
+ func_808323C0(this, play->playerCsIds[PLAYER_CS_ID_ITEM_BOTTLE]);
+
+ if (DECR(this->unk_AE8) == 0) {
+ if (Message_GetState(&play->msgCtx) == TEXT_STATE_NONE) {
+ Player_StopCutscene(this);
+ Player_SetAction(play, this, func_80849FE0, 0);
+ this->stateFlags1 &= ~PLAYER_STATE1_20000000;
+ }
+ } else if (this->unk_AE8 == 30) {
+ if (Message_GetState(&play->msgCtx) != TEXT_STATE_NONE) {
+ this->unk_AE8++;
+ } else {
+ Message_StartTextbox(play, 0xC03, NULL);
+ }
+ }
+}
+
+void func_808497A0(Player* this, PlayState* play) {
+ this->stateFlags3 |= PLAYER_STATE3_10000000;
+ PlayerAnimation_Update(play, &this->skelAnime);
+ func_8083216C(this, play);
+
+ if (R_PLAY_FILL_SCREEN_ON == 0) {
+ R_PLAY_FILL_SCREEN_ON = 20;
+ R_PLAY_FILL_SCREEN_ALPHA = 0;
+ R_PLAY_FILL_SCREEN_R = R_PLAY_FILL_SCREEN_G = R_PLAY_FILL_SCREEN_B = R_PLAY_FILL_SCREEN_ALPHA;
+ play_sound(NA_SE_SY_DEKUNUTS_JUMP_FAILED);
+ } else if (R_PLAY_FILL_SCREEN_ON > 0) {
+ R_PLAY_FILL_SCREEN_ALPHA += R_PLAY_FILL_SCREEN_ON;
+ if (R_PLAY_FILL_SCREEN_ALPHA > 255) {
+ R_PLAY_FILL_SCREEN_ALPHA = 255;
+ if (this->unk_B86[0] == 0) {
+ this->unk_B86[0] = 1;
+ func_8082DE50(play, this);
+ } else {
+ R_PLAY_FILL_SCREEN_ON = -20;
+ this->stateFlags1 &= ~PLAYER_STATE1_8000000;
+ this->actor.bgCheckFlags &= ~BGCHECKFLAG_GROUND;
+ Player_SetEquipmentData(play, this);
+ this->prevBoots = this->currentBoots;
+
+ if (this->unk_3CF != 0) {
+ Math_Vec3f_Copy(&this->actor.world.pos, &this->unk_3C0);
+ this->actor.shape.rot.y = this->unk_3CC;
+ } else {
+ Math_Vec3f_Copy(&this->actor.world.pos, &gSaveContext.respawn[RESPAWN_MODE_DOWN].pos);
+ this->actor.shape.rot.y = gSaveContext.respawn[RESPAWN_MODE_DOWN].yaw;
+ }
+
+ Math_Vec3f_Copy(&this->actor.prevPos, &this->actor.world.pos);
+ this->linearVelocity = 0.0f;
+ this->currentYaw = this->actor.shape.rot.y;
+ this->actor.velocity.y = 0.0f;
+ Player_AnimationPlayOnce(play, this, func_8082ED20(this));
+
+ if ((play->roomCtx.curRoom.num == this->unk_3CE) && (play->roomCtx.prevRoom.num < 0)) {
+ this->unk_AE8 = 5;
+ } else {
+ play->roomCtx.curRoom.num = -1;
+ play->roomCtx.prevRoom.num = -1;
+ play->roomCtx.curRoom.segment = NULL;
+ play->roomCtx.prevRoom.segment = NULL;
+
+ func_8012EBF8(play, &play->roomCtx);
+ this->unk_AE8 = -1;
+ this->unk_AE7 = this->unk_3CE;
+ }
+ }
+ }
+ } else if (this->unk_AE8 < 0) {
+ if (Room_StartRoomTransition(play, &play->roomCtx, this->unk_AE7)) {
+ Map_InitRoomData(play, play->roomCtx.curRoom.num);
+ Minimap_SavePlayerRoomInitInfo(play);
+ this->unk_AE8 = 5;
+ }
+ } else if (this->unk_AE8 > 0) {
+ this->unk_AE8--;
+ } else {
+ R_PLAY_FILL_SCREEN_ALPHA += R_PLAY_FILL_SCREEN_ON;
+ if (R_PLAY_FILL_SCREEN_ALPHA < 0) {
+ R_PLAY_FILL_SCREEN_ALPHA = 0;
+ R_PLAY_FILL_SCREEN_ON = 0;
+ func_808339B4(this, -40);
+ func_8085B384(this, play);
+ this->actor.bgCheckFlags |= BGCHECKFLAG_GROUND;
+ }
+ }
+}
+
+void func_80849A9C(Player* this, PlayState* play) {
+ f32 sp44;
+ s16 sp42;
+ s32 temp_v0;
+
+ if (this->unk_AE8 != 0) {
+ if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ func_8082E794(this);
+ Player_AnimationPlayLoop(play, this, func_8082EF54(this));
+ this->unk_AE8 = 0;
+ this->stateFlags3 &= ~PLAYER_STATE3_8;
+ }
+ func_8082FC60(this);
+ } else {
+ func_8083E958(play, this);
+ }
+
+ func_80832F24(this);
+ if (func_80833058(play, this, D_8085CFE4, 1)) {
+ return;
+ }
+
+ if (!func_8082FB68(this) && (!func_80123434(this) || (func_8084894C != this->unk_AC4))) {
+ func_8083B29C(this, play);
+ return;
+ }
+
+ func_80832F78(this, &sp44, &sp42, 0.0f, play);
+
+ temp_v0 = func_8083E404(this, sp44, sp42);
+ if (temp_v0 > 0) {
+ func_8083A844(this, play, sp42);
+ } else if (temp_v0 < 0) {
+ func_8083AF8C(this, sp42, play);
+ } else if (sp44 > 4.0f) {
+ func_8083B030(this, play);
+ } else {
+ u32 temp_v0_2;
+
+ func_8083EA44(this, this->linearVelocity * 0.3f + 1.0f);
+ func_8083E8E0(this, sp44, sp42);
+
+ temp_v0_2 = this->unk_B38;
+ if ((temp_v0_2 < 6) || ((temp_v0_2 - 0xE) < 6)) {
+ Math_StepToF(&this->linearVelocity, 0.0f, 1.5f);
+ } else {
+ s16 temp_v0_3 = sp42 - this->currentYaw;
+ s32 var_v1 = ABS_ALT(temp_v0_3);
+
+ if (var_v1 > 0x4000) {
+ if (Math_StepToF(&this->linearVelocity, 0.0f, 1.5f)) {
+ this->currentYaw = sp42;
+ }
+ } else {
+ Math_AsymStepToF(&this->linearVelocity, sp44 * 0.3f, 2.0f, 1.5f);
+ Math_ScaledStepToS(&this->currentYaw, sp42, var_v1 * 0.1f);
+ }
+ }
+ }
+}
+
+void func_80849DD0(Player* this, PlayState* play) {
+ f32 sp3C;
+ s16 sp3A;
+ s32 temp_v0;
+
+ if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ func_8082E794(this);
+ Player_AnimationPlayOnce(play, this, func_8082ED20(this));
+ this->stateFlags3 &= ~PLAYER_STATE3_8;
+ }
+
+ func_80832F24(this);
+ if (func_80833058(play, this, D_8085CFEC, 1)) {
+ return;
+ }
+
+ if (func_8082FB68(this)) {
+ func_8083B23C(this, play);
+ return;
+ }
+ if (!func_80123434(this)) {
+ func_8083172C(play, this, func_80849FE0, 1);
+ this->currentYaw = this->actor.shape.rot.y;
+ return;
+ }
+ if (func_8084894C == this->unk_AC4) {
+ func_8083B23C(this, play);
+ return;
+ }
+
+ func_80832F78(this, &sp3C, &sp3A, 0.0f, play);
+
+ temp_v0 = func_8083E514(this, &sp3C, &sp3A, play);
+ if (temp_v0 > 0) {
+ func_8083A844(this, play, sp3A);
+ } else if (temp_v0 < 0) {
+ func_8083AECC(this, sp3A, play);
+ } else if (sp3C > 4.9f) {
+ func_8083B030(this, play);
+ func_8082FC60(this);
+ } else if (sp3C != 0.0f) {
+ func_8083AF30(this, play);
+ } else {
+ s16 temp_v0_2 = sp3A - this->actor.shape.rot.y;
+
+ if (ABS_ALT(temp_v0_2) > 0x320) {
+ func_8083B0E4(play, this, sp3A);
+ }
+ }
+}
+
+void func_80849FE0(Player* this, PlayState* play) {
+ s32 temp_v0 = func_8082ED94(this);
+ s32 animFinished = PlayerAnimation_Update(play, &this->skelAnime);
+ f32 sp3C;
+ s16 sp3A;
+ s16 temp_v1_2;
+
+ func_8083C85C(this);
+ if (temp_v0 > 0) {
+ func_8082EEA4(this, temp_v0 - 1);
+ }
+
+ if (animFinished ||
+ ((this->currentMask == PLAYER_MASK_SCENTS) && (this->skelAnime.animation != &gPlayerAnim_cl_msbowait)) ||
+ ((this->currentMask != PLAYER_MASK_SCENTS) && (this->skelAnime.animation == &gPlayerAnim_cl_msbowait))) {
+ if (this->unk_AE8 != 0) {
+ if (DECR(this->unk_AE8) == 0) {
+ this->skelAnime.endFrame = this->skelAnime.animLength - 1.0f;
+ }
+
+ this->skelAnime.jointTable[PLAYER_LIMB_ROOT - 1].y =
+ (this->skelAnime.jointTable[PLAYER_LIMB_ROOT - 1].y + ((this->unk_AE8 & 1) * 0x50)) - 0x28;
+ } else {
+ func_8082E794(this);
+ Player_ChooseIdleAnim(play, this);
+ }
+ this->stateFlags3 &= ~PLAYER_STATE3_8;
+ }
+
+ func_80832F24(this);
+ if ((this->unk_AE8 == 0) && !func_80847880(play, this) && !func_80833058(play, this, D_8085D01C, 1)) {
+ if (func_8082FB68(this)) {
+ func_8083B23C(this, play);
+ return;
+ }
+ if (func_80123434(this)) {
+ func_8083692C(this, play);
+ return;
+ }
+ func_80832F78(this, &sp3C, &sp3A, 0.018f, play);
+ if (sp3C != 0.0f) {
+ func_8083A844(this, play, sp3A);
+ return;
+ }
+ temp_v1_2 = sp3A - this->actor.shape.rot.y;
+
+ if (ABS_ALT(temp_v1_2) > 0x320) {
+ func_8083B0E4(play, this, sp3A);
+ } else {
+ Math_ScaledStepToS(&this->actor.shape.rot.y, sp3A, 0x4B0);
+ this->currentYaw = this->actor.shape.rot.y;
+ if (func_8082ED20(this) == this->skelAnime.animation) {
+ func_8083C6E8(this, play);
+ }
+ }
+ }
+}
+
+void func_8084A26C(Player* this, PlayState* play) {
+ f32 var_fv0;
+ s16 temp_v0_3;
+ f32 sp44;
+ s16 sp42;
+ s32 var_v0;
+ s32 temp_v0_2;
+ s32 var_v1;
+ f32 var_fv1;
+
+ this->skelAnime.mode = 0;
+ PlayerAnimation_SetUpdateFunction(&this->skelAnime);
+
+ this->skelAnime.animation = func_8082EFE4(this);
+ if (this->skelAnime.animation == &gPlayerAnim_link_bow_side_walk) {
+ var_fv0 = 24.0f;
+ var_fv1 = -(MREG(95) / 100.0f);
+ } else {
+ var_fv0 = 29.0f;
+ var_fv1 = MREG(95) / 100.0f;
+ }
+
+ this->skelAnime.animLength = var_fv0;
+ this->skelAnime.endFrame = var_fv0 - 1.0f;
+ if (BINANG_SUB(this->currentYaw, this->actor.shape.rot.y) >= 0) {
+ var_v0 = 1;
+ } else {
+ var_v0 = -1;
+ }
+
+ this->skelAnime.playSpeed = var_v0 * (this->linearVelocity * var_fv1);
+
+ PlayerAnimation_Update(play, &this->skelAnime);
+ if (PlayerAnimation_OnFrame(&this->skelAnime, 0.0f) || PlayerAnimation_OnFrame(&this->skelAnime, var_fv0 / 2.0f)) {
+ Player_AnimSfx_PlayFloorWalk(this, this->linearVelocity);
+ }
+
+ if (func_80833058(play, this, D_8085CFF8, 1)) {
+ return;
+ }
+
+ if (func_8082FB68(this)) {
+ func_8083B23C(this, play);
+ return;
+ }
+ if (!func_80123434(this)) {
+ func_8085B384(this, play);
+ return;
+ }
+ func_80832F78(this, &sp44, &sp42, 0.0f, play);
+
+ temp_v0_2 = func_8083E514(this, &sp44, &sp42, play);
+ if (temp_v0_2 > 0) {
+ func_8083A844(this, play, sp42);
+ return;
+ }
+ if (temp_v0_2 < 0) {
+ func_8083AECC(this, sp42, play);
+ return;
+ }
+ if (sp44 > 4.9f) {
+ func_8083B030(this, play);
+ func_8082FC60(this);
+ return;
+ }
+ if ((sp44 == 0.0f) && (this->linearVelocity == 0.0f)) {
+ func_8083692C(this, play);
+ return;
+ }
+
+ temp_v0_3 = sp42 - this->currentYaw;
+ var_v1 = ABS_ALT(temp_v0_3);
+ if (var_v1 > 0x4000) {
+ if (Math_StepToF(&this->linearVelocity, 0.0f, 1.5f)) {
+ this->currentYaw = sp42;
+ }
+ } else {
+ Math_AsymStepToF(&this->linearVelocity, sp44 * 0.4f, 1.5f, 1.5f);
+ Math_ScaledStepToS(&this->currentYaw, sp42, var_v1 * 0.1f);
+ }
+}
+
+void func_8084A5C0(Player* this, PlayState* play) {
+ f32 sp34;
+ s16 sp32;
+ s32 sp2C;
+
+ func_8083EE60(this, play);
+ if (func_80833058(play, this, D_8085D004, 1)) {
+ return;
+ }
+
+ if (func_8082FC24(this) == 0) {
+ func_8083A844(this, play, this->currentYaw);
+ return;
+ }
+
+ func_80832F78(this, &sp34, &sp32, 0.0f, play);
+
+ sp2C = func_8083E514(this, &sp34, &sp32, play);
+ if (sp2C >= 0) {
+ if (!func_8083F190(this, &sp34, &sp32, play)) {
+ if (sp2C != 0) {
+ func_8083A794(this, play);
+ } else if (sp34 > 4.9f) {
+ func_8083B030(this, play);
+ } else {
+ func_8083AF30(this, play);
+ }
+ }
+ } else {
+ s16 sp2A = sp32 - this->currentYaw;
+
+ Math_AsymStepToF(&this->linearVelocity, sp34 * 1.5f, 1.5f, 2.0f);
+ Math_ScaledStepToS(&this->currentYaw, sp32, sp2A * 0.1f);
+ if ((sp34 == 0.0f) && (this->linearVelocity == 0.0f)) {
+ func_8083692C(this, play);
+ }
+ }
+}
+
+void func_8084A794(Player* this, PlayState* play) {
+ s32 animFinished = PlayerAnimation_Update(play, &this->skelAnime);
+ f32 sp30;
+ s16 sp2E;
+
+ func_80832F24(this);
+
+ if (func_80833058(play, this, D_8085D004, 1)) {
+ return;
+ }
+
+ func_80832F78(this, &sp30, &sp2E, 0.0f, play);
+ if (this->linearVelocity != 0.0f) {
+ return;
+ }
+
+ this->currentYaw = this->actor.shape.rot.y;
+ if (func_8083E514(this, &sp30, &sp2E, play) > 0) {
+ func_8083A794(this, play);
+ } else if ((sp30 != 0.0f) || animFinished) {
+ func_8083F230(this, play);
+ }
+}
+
+void func_8084A884(Player* this, PlayState* play) {
+ s32 animFinished = PlayerAnimation_Update(play, &this->skelAnime);
+
+ if (func_80833058(play, this, D_8085D004, 1)) {
+ return;
+ }
+
+ if (animFinished) {
+ func_8083692C(this, play);
+ }
+}
+
+void func_8084A8E8(Player* this, PlayState* play) {
+ f32 sp3C;
+ s16 sp3A;
+ s32 var_v0;
+
+ func_8083F27C(play, this);
+ if (func_80833058(play, this, D_8085D00C, 1)) {
+ return;
+ }
+
+ if (!func_8082FC24(this)) {
+ func_8083A794(this, play);
+ return;
+ }
+
+ func_80832F78(this, &sp3C, &sp3A, 0.0f, play);
+ if (func_80123434(this)) {
+ var_v0 = func_8083E514(this, &sp3C, &sp3A, play);
+ } else {
+ var_v0 = func_8083E404(this, sp3C, sp3A);
+ }
+
+ if (var_v0 > 0) {
+ func_8083A794(this, play);
+ } else if (var_v0 < 0) {
+ if (func_80123434(this)) {
+ func_8083AECC(this, sp3A, play);
+ } else {
+ func_8083AF8C(this, sp3A, play);
+ }
+ } else if ((this->linearVelocity < 3.6f) && (sp3C < 4.0f)) {
+ if ((func_80123420(this) == 0) && (func_80123434(this))) {
+ func_8083AF30(this, play);
+ } else {
+ func_80836988(this, play);
+ }
+ } else {
+ s16 temp_v0;
+ s32 var_v1;
+ s32 pad;
+
+ func_8083E8E0(this, sp3C, sp3A);
+
+ temp_v0 = sp3A - this->currentYaw;
+ var_v1 = ABS_ALT(temp_v0);
+ if (var_v1 > 0x4000) {
+ if (Math_StepToF(&this->linearVelocity, 0.0f, 3.0f)) {
+ this->currentYaw = sp3A;
+ }
+ } else {
+ sp3C = sp3C * 0.9f;
+ Math_AsymStepToF(&this->linearVelocity, sp3C, 2.0f, 3.0f);
+ Math_ScaledStepToS(&this->currentYaw, sp3A, var_v1 * 0.1f);
+ }
+ }
+}
+
+void func_8084AB4C(Player* this, PlayState* play) {
+ f32 sp34;
+ s16 sp32;
+
+ PlayerAnimation_Update(play, &this->skelAnime);
+ if (Player_IsHoldingTwoHandedWeapon(this)) {
+ 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);
+ }
+
+ func_80832F78(this, &sp34, &sp32, 0.018f, play);
+ if ((this != GET_PLAYER(play)) && (this->targetedActor == NULL)) {
+ sp32 = this->actor.home.rot.y;
+ }
+
+ if (func_80833058(play, this, D_8085D018, 1)) {
+ return;
+ }
+
+ if (sp34 != 0.0f) {
+ this->actor.shape.rot.y = sp32;
+ func_8083A794(this, play);
+ } else if (Math_ScaledStepToS(&this->actor.shape.rot.y, sp32, this->unk_B4E)) {
+ func_80839E74(this, play);
+ }
+ this->currentYaw = this->actor.shape.rot.y;
+}
+
+void func_8084AC84(Player* this, PlayState* play) {
+ this->stateFlags2 |= PLAYER_STATE2_20;
+
+ if (this->linearVelocity < 1.0f) {
+ this->skelAnime.animation = &gPlayerAnim_clink_normal_okarina_walk;
+ } else {
+ this->skelAnime.animation = &gPlayerAnim_clink_normal_okarina_walkB;
+ }
+ PlayerAnimation_Update(play, &this->skelAnime);
+
+ if (!func_80847880(play, this) &&
+ (!func_80833058(play, this, D_8085D01C, 1) || (func_8084AC84 == this->actionFunc))) {
+ f32 sp3C;
+ f32 temp_fv0;
+ f32 temp_fv1;
+ s16 sp32;
+ s16 sp30;
+
+ if (!CHECK_BTN_ALL(sPlayerControlInput->cur.button, BTN_B)) {
+ func_80839E74(this, play);
+ return;
+ }
+
+ this->linearVelocity = this->unk_B48;
+ func_80832F78(this, &sp3C, &sp32, 0.018f, play);
+ sp30 = sp32;
+
+ if (!func_8083A4A4(this, &sp3C, &sp32, REG(43) / 100.0f)) {
+ func_8083CB04(this, sp3C, sp32, REG(19) / 100.0f, 1.5f, 0x3E8);
+ func_8083C8E8(this, play);
+ if ((this->linearVelocity == 0.0f) && (sp3C == 0.0f)) {
+ this->currentYaw = sp30;
+ this->actor.shape.rot.y = this->currentYaw;
+ }
+ }
+
+ this->unk_B48 = this->linearVelocity;
+ temp_fv0 = this->skelAnime.curFrame + 5.0f;
+ temp_fv1 = this->skelAnime.animLength / 2.0f;
+
+ // effectively an fmodf
+ temp_fv0 -= temp_fv1 * (s32)(temp_fv0 / temp_fv1);
+ this->linearVelocity *= Math_CosS(temp_fv0 * 1000.0f) * 0.4f;
+ }
+}
+
+void func_8084AEEC(Player* this, PlayState* play) {
+ this->stateFlags2 |= PLAYER_STATE2_20;
+ PlayerAnimation_Update(play, &this->skelAnime);
+ func_80832F24(this);
+ if (!func_80847880(play, this)) {
+ if (!func_80833058(play, this, D_8085D01C, 0) || (func_8084AEEC == this->actionFunc)) {
+ if (!CHECK_BTN_ALL(sPlayerControlInput->cur.button, BTN_B)) {
+ func_80839E74(this, play);
+ }
+ }
+ }
+}
+
+void func_8084AF9C(Player* this, PlayState* play) {
+ f32 sp2C; // player speed?
+ s16 sp2A;
+
+ this->stateFlags2 |= PLAYER_STATE2_20;
+ func_8083F57C(this, play);
+ if (func_80833058(play, this, D_8085D028, 1)) {
+ return;
+ }
+
+ if (func_8082FC24(this)) {
+ func_8083A794(this, play);
+ return;
+ }
+
+ func_80832F78(this, &sp2C, &sp2A, 0.018f, play);
+ if (this->currentMask == PLAYER_MASK_BUNNY) {
+ sp2C *= 1.5f;
+ }
+
+ if (!func_8083A4A4(this, &sp2C, &sp2A, REG(43) / 100.0f)) {
+ func_8083CB58(this, sp2C, sp2A);
+ func_8083C8E8(this, play);
+ if ((this->linearVelocity == 0.0f) && (sp2C == 0.0f)) {
+ func_80839E3C(this, play);
+ }
+ }
+}
+
+void func_8084B0EC(Player* this, PlayState* play) {
+ f32 sp2C;
+ s16 sp2A;
+
+ this->stateFlags2 |= PLAYER_STATE2_20;
+
+ func_8083F57C(this, play);
+ if (func_80833058(play, this, D_8085D034, 1)) {
+ return;
+ }
+
+ if (!func_8082FC24(this)) {
+ func_8083A794(this, play);
+ return;
+ }
+
+ func_80832F78(this, &sp2C, &sp2A, 0.0f, play);
+ if (!func_8083A4A4(this, &sp2C, &sp2A, REG(43) / 100.0f)) {
+ if (((func_80123434(this) != 0) && (sp2C != 0) && (func_8083E514(this, &sp2C, &sp2A, play) <= 0)) ||
+ (!func_80123434(this) && (func_8083E404(this, sp2C, sp2A) <= 0))) {
+ func_80836988(this, play);
+ } else {
+ func_8083CB58(this, sp2C, sp2A);
+ func_8083C8E8(this, play);
+ if ((this->linearVelocity == 0.0f) && (sp2C == 0.0f)) {
+ func_80836988(this, play);
+ }
+ }
+ }
+}
+
+void func_8084B288(Player* this, PlayState* play) {
+ s32 animFinished = PlayerAnimation_Update(play, &this->skelAnime);
+ f32 sp30;
+ s16 sp2E;
+
+ if (func_80833058(play, this, D_8085D00C, 1)) {
+ return;
+ }
+
+ if (!func_8082FC24(this)) {
+ func_8083A794(this, play);
+ return;
+ }
+
+ func_80832F78(this, &sp30, &sp2E, 0.0f, play);
+ if ((this->skelAnime.morphWeight == 0.0f) && (this->skelAnime.curFrame > 5.0f)) {
+ func_80832F24(this);
+ if ((this->skelAnime.curFrame > 10.0f) && (func_8083E404(this, sp30, sp2E) < 0)) {
+ func_8083AF8C(this, sp2E, play);
+ } else if (animFinished) {
+ func_8083B090(this, play);
+ }
+ }
+}
+
+void func_8084B3B8(Player* this, PlayState* play) {
+ s32 animFinished = PlayerAnimation_Update(play, &this->skelAnime);
+ f32 sp30;
+ s16 sp2E;
+
+ func_80832F24(this);
+ if (func_80833058(play, this, D_8085D044, 1)) {
+ return;
+ }
+
+ func_80832F78(this, &sp30, &sp2E, 0.0f, play);
+ if (this->linearVelocity == 0.0f) {
+ this->currentYaw = this->actor.shape.rot.y;
+ if (func_8083E404(this, sp30, sp2E) > 0) {
+ func_8083A794(this, play);
+ } else if ((sp30 != 0.0f) || animFinished) {
+ func_80836988(this, play);
+ }
+ }
+}
+
+void func_8084B4A8(Player* this, PlayState* play) {
+ if (this->skelAnime.animation == &gPlayerAnim_link_normal_backspace) {
+ if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ func_8082E794(this);
+ func_8082E438(play, this, D_8085BE84[PLAYER_ANIMGROUP_31][this->modelAnimType]);
+ }
+ } else {
+ func_8082E67C(play, this, D_8085BE84[PLAYER_ANIMGROUP_32][this->modelAnimType]);
+ }
+
+ if (DECR(this->unk_AE8) == 0) {
+ if (!func_80838A90(this, play)) {
+ func_80836A98(this, D_8085BE84[PLAYER_ANIMGROUP_33][this->modelAnimType], play);
+ }
+ this->actor.flags &= ~ACTOR_FLAG_TALK_REQUESTED;
+ func_800E0238(Play_GetCamera(play, CAM_ID_MAIN));
+ }
+}
+
+// Player_Action_Shielding
+void func_8084B5C0(Player* this, PlayState* play) {
+ func_80832F24(this);
+
+ if (this->transformation == PLAYER_FORM_GORON) {
+ SkelAnime_Update(&this->unk_2C8);
+
+ if (!func_8083FE38(this, play)) {
+ if (!func_8083A274(this, play)) {
+ this->stateFlags1 &= ~PLAYER_STATE1_400000;
+
+ if (this->itemAction <= PLAYER_IA_MINUS1) {
+ func_80123C58(this);
+ }
+
+ func_80836A98(this, D_8085BE84[PLAYER_ANIMGROUP_21][this->modelAnimType], play);
+ func_80830B38(this);
+ } else {
+ this->stateFlags1 |= PLAYER_STATE1_400000;
+ }
+ }
+
+ return;
+ }
+
+ if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ if (!Player_IsGoronOrDeku(this)) {
+ Player_AnimationPlayLoop(play, this, D_8085BE84[PLAYER_ANIMGROUP_20][this->modelAnimType]);
+ }
+
+ this->unk_AE8 = 1;
+ this->unk_AE7 = 0;
+ }
+
+ if (!Player_IsGoronOrDeku(this)) {
+ this->stateFlags1 |= PLAYER_STATE1_400000;
+ func_8083216C(this, play);
+ this->stateFlags1 &= ~PLAYER_STATE1_400000;
+ if (this->transformation == PLAYER_FORM_ZORA) {
+ func_8082F164(this, BTN_R | BTN_B);
+ }
+ }
+
+ if (this->unk_AE8 != 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 var_a1;
+ s16 temp_ft5;
+ s16 var_a2;
+ s16 var_a3;
+
+ var_a1 = (yStick * Math_CosS(temp_a0)) + (Math_SinS(temp_a0) * xStick);
+ temp_ft5 = (xStick * Math_CosS(temp_a0)) - (Math_SinS(temp_a0) * yStick);
+
+ var_a1 = CLAMP_MAX(var_a1, 0xDAC);
+ var_a2 = ABS_ALT(var_a1 - this->actor.focus.rot.x) * 0.25f;
+ var_a2 = CLAMP_MIN(var_a2, 0x64);
+
+ var_a3 = ABS_ALT(temp_ft5 - this->upperLimbRot.y) * 0.25f;
+ var_a3 = CLAMP_MIN(var_a3, 0x32);
+ Math_ScaledStepToS(&this->actor.focus.rot.x, var_a1, var_a2);
+
+ this->upperLimbRot.x = this->actor.focus.rot.x;
+ Math_ScaledStepToS(&this->upperLimbRot.y, temp_ft5, var_a3);
+
+ if (this->unk_AE7 != 0) {
+ if (!func_808401F4(play, this)) {
+ if (this->skelAnime.curFrame < 2.0f) {
+ func_8082FA5C(play, this, PLAYER_MELEE_WEAPON_STATE_1);
+ }
+ } else {
+ this->unk_AE8 = 1;
+ this->unk_AE7 = 0;
+ }
+ } else if (!func_8083FE38(this, play)) {
+ if (func_8083A274(this, play) != 0) {
+ func_8083FD80(this, play);
+ } else {
+ this->stateFlags1 &= ~PLAYER_STATE1_400000;
+ func_8082DC38(this);
+
+ if (Player_IsGoronOrDeku(this)) {
+ func_80836A5C(this, play);
+ PlayerAnimation_Change(play, &this->skelAnime, this->skelAnime.animation, 1.0f,
+ Animation_GetLastFrame(this->skelAnime.animation), 0.0f, 2, 0.0f);
+ } else {
+ if (this->itemAction <= PLAYER_IA_MINUS1) {
+ func_80123C58(this);
+ }
+
+ func_80836A98(this, D_8085BE84[PLAYER_ANIMGROUP_21][this->modelAnimType], play);
+ }
+
+ Player_PlaySfx(this, NA_SE_IT_SHIELD_REMOVE);
+ return;
+ }
+ } else {
+ return;
+ }
+ }
+
+ this->stateFlags1 |= PLAYER_STATE1_400000;
+ Player_SetModelsForHoldingShield(this);
+ this->unk_AA6 |= 0xC1;
+}
+
+void func_8084BAA4(Player* this, PlayState* play) {
+ func_80832F24(this);
+ if (this->unk_AE7 == 0) {
+ D_80862B04 = func_8083216C(this, play);
+ if ((func_8084894C == this->unk_AC4) || (func_808331FC(play, this, &this->unk_284, 4.0f) > 0)) {
+ Player_SetAction(play, this, func_80849A9C, 1);
+ }
+ } else {
+ s32 temp_v0;
+
+ this->stateFlags1 |= PLAYER_STATE1_400000;
+ 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;
+
+ Player_SetAction(play, this, func_8084B5C0, 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);
+ }
+ }
+}
+
+void func_8084BBF0(Player* this, PlayState* play) {
+ s32 temp_v0;
+
+ func_80832F24(this);
+ temp_v0 = func_808331FC(play, this, &this->skelAnime, 16.0f);
+ if (temp_v0 != 0) {
+ if (PlayerAnimation_Update(play, &this->skelAnime) || (temp_v0 > 0)) {
+ func_80836988(this, play);
+ }
+ }
+}
+
+void func_8084BC64(Player* this, PlayState* play) {
+ this->stateFlags2 |= PLAYER_STATE2_20 | PLAYER_STATE2_40;
+ func_808345A8(this);
+
+ if (!(this->stateFlags1 & PLAYER_STATE1_20000000) && (this->unk_AE8 == 0) && (this->unk_B75 != 0)) {
+ s16 temp_v0 = this->unk_B76;
+ s16 temp_v1 = this->actor.shape.rot.y - temp_v0;
+
+ this->actor.shape.rot.y = temp_v0;
+ this->currentYaw = temp_v0;
+ this->linearVelocity = this->unk_B78;
+
+ if (ABS_ALT(temp_v1) > 0x4000) {
+ this->actor.shape.rot.y = temp_v0 + 0x8000;
+ }
+
+ if (this->actor.velocity.y < 0.0f) {
+ this->actor.gravity = 0.0f;
+ this->actor.velocity.y = 0.0f;
+ }
+ }
+
+ if (PlayerAnimation_Update(play, &this->skelAnime) && (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
+ if (this->unk_AE8 != 0) {
+ this->unk_AE8--;
+ if (this->unk_AE8 == 0) {
+ func_8085B384(this, play);
+ }
+ } else if ((this->stateFlags1 & PLAYER_STATE1_20000000) ||
+ (!(this->cylinder.base.acFlags & AC_HIT) && (this->unk_B75 == 0))) {
+ if (this->stateFlags1 & PLAYER_STATE1_20000000) {
+ this->unk_AE8++;
+ } else {
+ Player_SetAction(play, this, func_8084BE40, 0);
+ this->stateFlags1 |= PLAYER_STATE1_4000000;
+ }
+
+ Player_AnimationPlayOnce(play, this,
+ (this->currentYaw != this->actor.shape.rot.y)
+ ? &gPlayerAnim_link_normal_front_downB
+ : &gPlayerAnim_link_normal_back_downB);
+ Player_AnimSfx_PlayVoice(this, NA_SE_VO_LI_FREEZE);
+ }
+ }
+
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND_TOUCH) {
+ Player_AnimSfx_PlayFloor(this, NA_SE_PL_BOUND);
+ }
+}
+
+void func_8084BE40(Player* this, PlayState* play) {
+ this->stateFlags2 |= (PLAYER_STATE2_20 | PLAYER_STATE2_40);
+ func_808345A8(this);
+ func_80832F24(this);
+ if (PlayerAnimation_Update(play, &this->skelAnime) && (this->linearVelocity == 0.0f)) {
+ if (this->stateFlags1 & PLAYER_STATE1_20000000) {
+ this->unk_AE8++;
+ } else {
+ Player_SetAction(play, this, func_8084BF28, 0);
+ this->stateFlags1 |= PLAYER_STATE1_4000000;
+ }
+
+ func_8082DB90(play, this,
+ (this->currentYaw != this->actor.shape.rot.y) ? &gPlayerAnim_link_normal_front_down_wake
+ : &gPlayerAnim_link_normal_back_down_wake);
+ this->currentYaw = this->actor.shape.rot.y;
+ }
+}
+
+AnimSfxEntry D_8085D604[] = {
+ ANIMSFX(ANIMSFX_TYPE_8, 20, NA_SE_NONE, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_8, 30, NA_SE_NONE, STOP),
+};
+
+void func_8084BF28(Player* this, PlayState* play) {
+ this->stateFlags2 |= PLAYER_STATE2_20;
+
+ func_808345A8(this);
+ if (this->stateFlags1 & PLAYER_STATE1_20000000) {
+ PlayerAnimation_Update(play, &this->skelAnime);
+ } else {
+ s32 temp_v0 = func_808331FC(play, this, &this->skelAnime, 16.0f);
+
+ if (temp_v0 != 0) {
+ if (PlayerAnimation_Update(play, &this->skelAnime) || (temp_v0 > 0)) {
+ func_80836988(this, play);
+ }
+ }
+ }
+
+ Player_PlayAnimSfx(this, D_8085D604);
+}
+
+AnimSfxEntry D_8085D60C[] = {
+ ANIMSFX(ANIMSFX_TYPE_FLOOR, 60, NA_SE_PL_BOUND, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_8, 140, NA_SE_NONE, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_8, 164, NA_SE_NONE, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_8, 170, NA_SE_NONE, STOP),
+};
+
+void func_8084BFDC(Player* this, PlayState* play) {
+ if ((this->transformation != PLAYER_FORM_GORON) && (this->actor.depthInWater <= 0.0f)) {
+ if ((play->roomCtx.curRoom.behaviorType2 == ROOM_BEHAVIOR_TYPE2_HOT) ||
+ (sPlayerCurrentFloorType == FLOOR_TYPE_9) ||
+ ((func_808340AC(sPlayerCurrentFloorType) >= 0) &&
+ !SurfaceType_IsWallDamage(&play->colCtx, this->actor.floorPoly, this->actor.floorBgId))) {
+ func_808344C0(play, this);
+ }
+ }
+
+ func_80832F24(this);
+ if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ if (this == GET_PLAYER(play)) {
+ func_80840770(play, this);
+ }
+ } else if (this->skelAnime.animation == &gPlayerAnim_link_derth_rebirth) {
+ Player_PlayAnimSfx(this, D_8085D60C);
+ } else if ((this->skelAnime.animation == &gPlayerAnim_link_normal_electric_shock_end) &&
+ PlayerAnimation_OnFrame(&this->skelAnime, 88.0f)) {
+ Player_AnimSfx_PlayFloor(this, NA_SE_PL_BOUND);
+ }
+}
+
+s32 func_8084C124(PlayState* play, Player* this) {
+ if (func_80837730(play, this, 3.0f, 500)) {
+ Player_PlaySfx(this, NA_SE_EV_DIVE_INTO_WATER);
+ return true;
+ }
+ return false;
+}
+
+void func_8084C16C(Player* this, PlayState* play) {
+ f32 sp44;
+ s16 sp42;
+ Actor* heldActor;
+
+ if (func_80123420(this) != 0) {
+ this->actor.gravity = -1.2f;
+ }
+
+ if (!(this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
+ func_80832F78(this, &sp44, &sp42, 0.0f, play);
+ if (this->stateFlags1 & PLAYER_STATE1_800) {
+ heldActor = this->heldActor;
+ if (!func_808313A8(play, this, heldActor) && (heldActor->id == ACTOR_EN_NIW) &&
+ CHECK_BTN_ANY(sPlayerControlInput->press.button, BTN_CRIGHT | BTN_CLEFT | BTN_CDOWN | BTN_B | BTN_A)) {
+ func_808409A8(play, this, this->linearVelocity + 2.0f, this->actor.velocity.y + 2.0f);
+ }
+ }
+
+ PlayerAnimation_Update(play, &this->skelAnime);
+ if ((this->skelAnime.animation == &gPlayerAnim_link_normal_newroll_jump_20f) &&
+ PlayerAnimation_OnFrame(&this->skelAnime, 4.0f)) {
+ Player_PlaySfx(this, NA_SE_PL_ROLL);
+ }
+
+ if (this->transformation == PLAYER_FORM_DEKU) {
+ s16 prevYaw = this->currentYaw;
+
+ func_808378FC(play, this);
+ func_8083CBC4(this, sp44 * 0.5f, sp42, 2.0f, 0.2f, 0.1f, 0x190);
+
+ if (this->skelAnime.animation == &gPlayerAnim_pn_attack) {
+ this->stateFlags2 |= (PLAYER_STATE2_20 | PLAYER_STATE2_40);
+
+ this->unk_B10[0] += -800.0f;
+ this->actor.shape.rot.y += BINANG_ADD((s16)this->unk_B10[0], BINANG_SUB(this->currentYaw, prevYaw));
+ Math_StepToF(&this->unk_B10[1], 0.0f, this->unk_B10[0]);
+ }
+ } else {
+ func_8083CBC4(this, sp44, sp42, 1.0f, 0.05f, 0.1f, 0xC8);
+ }
+
+ func_8083216C(this, play);
+ if ((((this->stateFlags2 & PLAYER_STATE2_80000) && ((this->unk_AE7 == 2) || (this->unk_AE7 >= 4))) ||
+ !func_80839770(this, play)) &&
+ (this->actor.velocity.y < 0.0f)) {
+ if (this->unk_AE8 >= 0) {
+ if ((this->actor.bgCheckFlags & BGCHECKFLAG_WALL) || (this->unk_AE8 == 0) || (this->fallDistance > 0)) {
+ if ((D_80862B18 > 800.0f) || (this->stateFlags3 & PLAYER_STATE3_10000)) {
+ func_80840980(this, NA_SE_VO_LI_FALL_S);
+ this->stateFlags3 &= ~PLAYER_STATE3_10000;
+ }
+ PlayerAnimation_Change(play, &this->skelAnime, &gPlayerAnim_link_normal_landing, 1.0f, 0.0f, 0.0f,
+ ANIMMODE_ONCE, 8.0f);
+ this->unk_AE8 = -1;
+ }
+ } else {
+ if ((this->unk_AE8 == -1) && (this->fallDistance > 120) && (D_80862B18 > 280.0f)) {
+ this->unk_AE8 = -2;
+ func_80840980(this, NA_SE_VO_LI_FALL_L);
+ }
+
+ if ((this->actor.bgCheckFlags & BGCHECKFLAG_PLAYER_WALL_INTERACT) &&
+ !(this->stateFlags1 & (PLAYER_STATE1_800 | PLAYER_STATE1_8000000)) &&
+ (this->linearVelocity > 0.0f)) {
+ if ((this->transformation != PLAYER_FORM_GORON) &&
+ ((this->transformation != PLAYER_FORM_DEKU) || (this->remainingHopsCounter != 0))) {
+ if ((this->wallHeight >= 150.0f) && (this->unk_AE3[this->unk_ADE] == 0)) {
+ if (func_8083D860(this, play)) {
+ func_8084C124(play, this);
+ }
+ } else if ((this->unk_B5C >= 2) &&
+ ((this->wallHeight < (150.0f * this->ageProperties->unk_08)) &&
+ (((this->actor.world.pos.y - this->actor.floorHeight) + this->wallHeight)) >
+ (70.0f * this->ageProperties->unk_08))) {
+ AnimationContext_DisableQueue(play);
+ if (this->stateFlags3 & PLAYER_STATE3_10000) {
+ Player_AnimSfx_PlayVoice(this, NA_SE_VO_LI_HOOKSHOT_HANG);
+ } else {
+ Player_AnimSfx_PlayVoice(this, NA_SE_VO_LI_HANG);
+ }
+
+ this->actor.world.pos.y += this->wallHeight;
+ func_80837CEC(play, this, this->actor.wallPoly, this->wallDistance,
+ GET_PLAYER_ANIM(PLAYER_ANIMGROUP_38, this->modelAnimType));
+ this->currentYaw += 0x8000;
+ this->actor.shape.rot.y = this->currentYaw;
+ this->stateFlags1 |= PLAYER_STATE1_2000;
+
+ func_8084C124(play, this);
+ }
+ }
+ }
+ }
+ }
+ } else {
+ func_80837134(play, this);
+ func_8083216C(this, play);
+ }
+
+ func_80838A90(this, play);
+}
+
+// sPlayerRollingAnimSfx
+AnimSfxEntry D_8085D61C[] = {
+ ANIMSFX(ANIMSFX_TYPE_VOICE, 1, NA_SE_VO_LI_SWORD_N, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_FLOOR_BY_AGE, 6, NA_SE_PL_WALK_GROUND, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 6, NA_SE_PL_ROLL, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_FLOOR_LAND, 18, NA_SE_NONE, STOP),
+};
+
+// Player_Action_Rolling // Handles bonking too?
+void func_8084C6EC(Player* this, PlayState* play) {
+ s32 animFinished;
+
+ this->stateFlags2 |= PLAYER_STATE2_20;
+ this->stateFlags3 |= PLAYER_STATE3_8000000;
+
+ animFinished = PlayerAnimation_Update(play, &this->skelAnime);
+ if (PlayerAnimation_OnFrame(&this->skelAnime, 8.0f)) {
+ func_808339B4(this, -10);
+ }
+
+ if (this->skelAnime.curFrame >= 8.0f) {
+ if (this->skelAnime.curFrame < 18.0f) {
+ Player_SetCylinderForAttack(this, DMG_NORMAL_ROLL, 1, 12);
+ } else {
+ Player_ResetCylinder(this);
+ }
+ }
+
+ if (func_8083FE38(this, play)) {
+ return;
+ }
+
+ if (this->unk_AE8 != 0) {
+ s32 temp_v0;
+
+ Math_StepToF(&this->linearVelocity, 0.0f, 2.0f);
+ temp_v0 = func_808331FC(play, this, &this->skelAnime, 5.0f);
+ if (temp_v0 != 0) {
+ if ((temp_v0 > 0) || animFinished) {
+ func_80836A5C(this, play);
+ }
+ }
+ } else if (!func_80840A30(play, this, &this->linearVelocity, 6.0f)) {
+ if ((this->skelAnime.curFrame < 15.0f) || !func_80848570(this, play)) {
+ f32 sp3C;
+ s16 yaw;
+
+ if (this->skelAnime.curFrame >= 20.0f) {
+ func_80836A5C(this, play);
+ return;
+ }
+
+ func_80832F78(this, &sp3C, &yaw, 0.018f, play);
+ sp3C *= 1.5f;
+ if ((sp3C < 3.0f) || (this->unk_AE3[this->unk_ADE] != 0)) {
+ sp3C = 3.0f;
+ }
+ func_8083CB58(this, sp3C, this->actor.shape.rot.y);
+
+ if (func_8083FBC4(play, this)) {
+ func_800B8F98(&this->actor, (this->floorSfxOffset == NA_SE_PL_WALK_SNOW - SFX_FLAG)
+ ? NA_SE_PL_ROLL_SNOW_DUST - SFX_FLAG
+ : NA_SE_PL_ROLL_DUST - SFX_FLAG);
+ }
+
+ Player_PlayAnimSfx(this, D_8085D61C);
+ }
+ }
+}
+
+void func_8084C94C(Player* this, PlayState* play) {
+ this->stateFlags2 |= PLAYER_STATE2_20;
+
+ if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ Player_AnimationPlayLoop(play, this, &gPlayerAnim_link_normal_run_jump_water_fall_wait);
+ }
+
+ Math_StepToF(&this->linearVelocity, 0.0f, 0.05f);
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
+ if (this->fallDistance >= 400) {
+ this->actor.colChkInfo.damage = 0x10;
+ func_80833B18(play, this, 1, 4.0f, 5.0f, this->actor.shape.rot.y, 20);
+ } else {
+ func_80836B3C(play, this, 4.0f);
+ }
+ }
+}
+
+void func_8084CA24(Player* this, PlayState* play) {
+ this->stateFlags2 |= PLAYER_STATE2_20;
+
+ if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ func_8082DB60(play, this, &gPlayerAnim_pz_fishswim);
+ }
+
+ Math_SmoothStepToS(&this->unk_B86[1], 0, 6, 0x7D0, 0x190);
+ if (!func_80840A30(play, this, &this->linearVelocity, 0.0f)) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
+ if (this->unk_AAA > 0x36B0) {
+ this->actor.colChkInfo.damage = 0x10;
+ func_80833B18(play, this, 1, 4.0f, 5.0f, this->actor.shape.rot.y, 20);
+ } else {
+ func_80836B3C(play, this, 4.0f);
+ }
+ } else {
+ this->actor.gravity = -1.0f;
+ this->unk_AAA = Math_Atan2S_XY(this->actor.speed, -this->actor.velocity.y);
+ func_8082F164(this, BTN_R);
+ }
+ }
+}
+
+void func_8084CB58(Player* this, PlayState* play) {
+ AttackAnimInfo* attackInfoEntry = &sMeleeAttackAnimInfo[this->meleeWeaponAnimation];
+ f32 sp38;
+ s16 sp36;
+
+ this->stateFlags2 |= PLAYER_STATE2_20;
+
+ if (this->transformation == PLAYER_FORM_ZORA) {
+ this->actor.gravity = -0.8f;
+ } else {
+ this->actor.gravity = -1.2f;
+ }
+
+ PlayerAnimation_Update(play, &this->skelAnime);
+
+ if (!func_808401F4(play, this)) {
+ func_8083FCF0(play, this, 6.0f, attackInfoEntry->unk_C, attackInfoEntry->unk_D);
+ if (!(this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
+ func_80832F78(this, &sp38, &sp36, 0.0f, play);
+ func_8083CBC4(this, sp38, this->currentYaw, 1.0f, 0.05f, 0.1f, 200);
+ } else if (func_80836F10(play, this) >= 0) { // Player didn't die because of this fall
+ this->meleeWeaponAnimation += 3;
+ func_80833864(play, this, this->meleeWeaponAnimation);
+ this->unk_ADD = 3;
+ this->meleeWeaponState = PLAYER_MELEE_WEAPON_STATE_0;
+ Player_AnimSfx_PlayFloorLand(this);
+ }
+ }
+}
+
+void func_8084CCEC(Player* this, PlayState* play) {
+ f32 sp34;
+ s16 sp32;
+ s32 temp_v0;
+
+ this->stateFlags1 |= PLAYER_STATE1_1000;
+ if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ func_8082E794(this);
+ func_8083133C(this);
+ this->stateFlags1 &= ~PLAYER_STATE1_20000;
+ Player_AnimationPlayLoop(play, this, D_8085CF60[Player_IsHoldingTwoHandedWeapon(this)]);
+ this->unk_AE8 = -1;
+ }
+
+ func_80832F24(this);
+ if (!func_8083FE38(this, play) && (this->unk_AE8 != 0)) {
+ func_80840F34(this);
+ if (this->unk_AE8 < 0) {
+ if (this->unk_B08 >= 0.1f) {
+ this->unk_ADD = 0;
+ this->unk_AE8 = 1;
+ } else if (!CHECK_BTN_ALL(sPlayerControlInput->cur.button, BTN_B)) {
+ func_80840E5C(this, play);
+ }
+ } else if (!func_80840CD4(this, play)) {
+ func_80832F78(this, &sp34, &sp32, 0.0f, play);
+ temp_v0 = func_8083E7F8(this, &sp34, &sp32, play);
+ if (temp_v0 > 0) {
+ func_80840DEC(this, play);
+ } else if (temp_v0 < 0) {
+ func_80840E24(this, play);
+ }
+ }
+ }
+}
+
+void func_8084CE84(Player* this, PlayState* play) {
+ s32 var_v1;
+ s32 temp_v0_2;
+ f32 temp_ft4;
+ f32 var_fa0;
+ f32 sp54;
+ s16 sp52;
+ s16 temp_v0;
+ f32 temp_fv1;
+ s32 pad;
+ s32 sp44;
+
+ temp_v0 = this->currentYaw - this->actor.shape.rot.y;
+ var_v1 = ABS_ALT(temp_v0);
+
+ temp_ft4 = fabsf(this->linearVelocity);
+ this->stateFlags1 |= PLAYER_STATE1_1000;
+
+ var_fa0 = temp_ft4 * 1.5f;
+ var_fa0 = CLAMP_MIN(var_fa0, 1.5f);
+
+ var_fa0 = ((var_v1 < 0x4000) ? -1.0f : 1.0f) * var_fa0;
+
+ func_8083EA44(this, var_fa0);
+
+ var_fa0 = CLAMP(temp_ft4 * 0.5f, 0.5f, 1.0f);
+
+ PlayerAnimation_BlendToJoint(play, &this->skelAnime, D_8085CF60[Player_IsHoldingTwoHandedWeapon(this)], 0.0f,
+ D_8085CF70[Player_IsHoldingTwoHandedWeapon(this)], this->unk_B38 * 0.7241379f, var_fa0,
+ this->blendTableBuffer);
+ if (!func_8083FE38(this, play) && !func_80840CD4(this, play)) {
+ func_80840F34(this);
+ func_80832F78(this, &sp54, &sp52, 0.0f, play);
+
+ temp_v0_2 = func_8083E7F8(this, &sp54, &sp52, play);
+ if (temp_v0_2 < 0) {
+ func_80840E24(this, play);
+ return;
+ }
+
+ if (temp_v0_2 == 0) {
+ sp54 = 0.0f;
+ sp52 = this->currentYaw;
+ }
+
+ sp44 = ABS_ALT(BINANG_SUB(sp52, this->currentYaw));
+ if (sp44 > 0x4000) {
+ if (Math_StepToF(&this->linearVelocity, 0.0f, 1.0f)) {
+ this->currentYaw = sp52;
+ }
+ } else {
+ Math_AsymStepToF(&this->linearVelocity, sp54 * 0.2f, 1.0f, 0.5f);
+ Math_ScaledStepToS(&this->currentYaw, sp52, sp44 * 0.1f);
+ if ((sp54 == 0.0f) && (this->linearVelocity == 0.0f)) {
+ func_80840EC0(this, play);
+ }
+ }
+ }
+}
+
+void func_8084D18C(Player* this, PlayState* play) {
+ f32 sp5C = fabsf(this->linearVelocity);
+ f32 var_fa0;
+
+ this->stateFlags1 |= PLAYER_STATE1_1000;
+
+ if (sp5C == 0.0f) {
+ sp5C = ABS_ALT(this->unk_B4C) * 0.0015f;
+ if (sp5C < 400.0f) {
+ sp5C = 0.0f;
+ }
+
+ func_8083EA44(this, ((this->unk_B4C >= 0) ? 1 : -1) * sp5C);
+ } else {
+ var_fa0 = sp5C * 1.5f;
+ var_fa0 = CLAMP_MIN(var_fa0, 1.5f);
+ func_8083EA44(this, var_fa0);
+ }
+
+ var_fa0 = CLAMP(sp5C * 0.5f, 0.5f, 1.0f);
+
+ PlayerAnimation_BlendToJoint(play, &this->skelAnime, D_8085CF60[Player_IsHoldingTwoHandedWeapon(this)], 0.0f,
+ D_8085CF78[Player_IsHoldingTwoHandedWeapon(this)], this->unk_B38 * 0.7241379f, var_fa0,
+ this->blendTableBuffer);
+ if (!func_8083FE38(this, play) && !func_80840CD4(this, play)) {
+ f32 sp54;
+ s16 sp52;
+ s32 temp_v0;
+ s16 temp_v0_2;
+ s32 var_v1;
+
+ func_80840F34(this);
+ func_80832F78(this, &sp54, &sp52, 0.0f, play);
+ temp_v0 = func_8083E7F8(this, &sp54, &sp52, play);
+ if (temp_v0 > 0) {
+ func_80840DEC(this, play);
+ return;
+ }
+
+ if (temp_v0 == 0) {
+ sp54 = 0.0f;
+ sp52 = this->currentYaw;
+ }
+
+ var_v1 = ABS_ALT(BINANG_SUB(sp52, this->currentYaw));
+ if (var_v1 > 0x4000) {
+ if (Math_StepToF(&this->linearVelocity, 0.0f, 1.0f)) {
+ this->currentYaw = sp52;
+ }
+ } else {
+ Math_AsymStepToF(&this->linearVelocity, sp54 * 0.2f, 1.0f, 0.5f);
+ Math_ScaledStepToS(&this->currentYaw, sp52, var_v1 * 0.1f);
+ if ((sp54 == 0.0f) && (this->linearVelocity == 0.0f) && (sp5C == 0.0f)) {
+ func_80840EC0(this, play);
+ }
+ }
+ }
+}
+
+void func_8084D4EC(Player* this, PlayState* play) {
+ s32 animFinished;
+ f32 frame;
+ s32 temp_v0;
+
+ this->stateFlags2 |= PLAYER_STATE2_20;
+ animFinished = PlayerAnimation_Update(play, &this->skelAnime);
+
+ if (this->skelAnime.animation == &gPlayerAnim_link_normal_250jump_start) {
+ this->linearVelocity = 1.0f;
+ if (PlayerAnimation_OnFrame(&this->skelAnime, 8.0f)) {
+ f32 speed = this->wallHeight;
+
+ speed = CLAMP_MAX(speed, this->ageProperties->unk_0C);
+ if (this->stateFlags1 & PLAYER_STATE1_8000000) {
+ speed *= 0.085f;
+ } else {
+ speed *= 0.072f;
+ }
+
+ if (this->transformation == PLAYER_FORM_HUMAN) {
+ speed += 1.0f;
+ }
+
+ func_80834D50(play, this, NULL, speed, NA_SE_VO_LI_AUTO_JUMP);
+ this->unk_AE8 = -1;
+ }
+ } else {
+ temp_v0 = func_808331FC(play, this, &this->skelAnime, 4.0f);
+ if (temp_v0 == 0) {
+ this->stateFlags1 &= ~(PLAYER_STATE1_4 | PLAYER_STATE1_4000 | PLAYER_STATE1_40000);
+ return;
+ }
+ if (animFinished || (temp_v0 > 0)) {
+ func_80839E74(this, play);
+ this->stateFlags1 &= ~(PLAYER_STATE1_4 | PLAYER_STATE1_4000 | PLAYER_STATE1_40000);
+ this->unk_ABC = 0.0f;
+ return;
+ }
+
+ frame = 0.0f;
+ if (this->skelAnime.animation == &gPlayerAnim_link_swimer_swim_15step_up) {
+ if (PlayerAnimation_OnFrame(&this->skelAnime, 30.0f)) {
+ func_8083B32C(play, this, 10.0f);
+ }
+ frame = 50.0f;
+ } else if (this->skelAnime.animation == &gPlayerAnim_link_normal_150step_up) {
+ frame = 30.0f;
+ } else if (this->skelAnime.animation == &gPlayerAnim_link_normal_100step_up) {
+ frame = 16.0f;
+ }
+
+ if (PlayerAnimation_OnFrame(&this->skelAnime, frame)) {
+ Player_AnimSfx_PlayFloorLand(this);
+ Player_AnimSfx_PlayVoice(this, NA_SE_VO_LI_CLIMB_END);
+ }
+
+ if ((this->skelAnime.animation == &gPlayerAnim_link_normal_100step_up) || (this->skelAnime.curFrame > 5.0f)) {
+ if (this->unk_AE8 == 0) {
+ Player_AnimSfx_PlayFloorJump(this);
+ this->unk_AE8 = 1;
+ }
+ Math_SmoothStepToF(&this->unk_ABC, 0.0f, 0.1f, 400.0f, 150.0f);
+ }
+ }
+}
+
+void func_8084D770(Player* this, PlayState* play) {
+ s32 temp_v0;
+
+ this->stateFlags2 |= (PLAYER_STATE2_20 | PLAYER_STATE2_40);
+ if (this->unk_D58 == func_80837BF8) {
+ this->stateFlags2 |= PLAYER_STATE2_1;
+ }
+
+ PlayerAnimation_Update(play, &this->skelAnime);
+ func_8083249C(this);
+
+ temp_v0 = func_8083216C(this, play);
+ if (((this->stateFlags1 & PLAYER_STATE1_800) && (this->heldActor != NULL) && (this->getItemId == GI_NONE)) ||
+ (temp_v0 == 0)) {
+ this->unk_D58(play, this);
+ }
+}
+
+void func_8084D820(Player* this, PlayState* play) {
+ if (func_80838A90(this, play) == 0) {
+ if ((this->stateFlags3 & PLAYER_STATE3_10) && !(this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
+ func_80833AA0(this, play);
+ this->stateFlags1 |= PLAYER_STATE1_20000000;
+ } else if (this->unk_AE8 == 0) {
+ PlayerAnimation_Update(play, &this->skelAnime);
+ if (DECR(this->doorTimer) == 0) {
+ this->linearVelocity = 0.1f;
+ this->unk_AE8 = 1;
+ }
+ } else if (this->unk_AE7 == 0) {
+ f32 sp6C = 5.0f * D_8085C3E4;
+ s32 var_t0 = func_808411D4(play, this, &sp6C, -1);
+
+ if (this->unk_397 == 4) {
+ if (R_PLAY_FILL_SCREEN_ON < 0) {
+ if (play->roomCtx.status != 1) {
+ R_PLAY_FILL_SCREEN_ALPHA += R_PLAY_FILL_SCREEN_ON;
+ if (R_PLAY_FILL_SCREEN_ALPHA < 0) {
+ R_PLAY_FILL_SCREEN_ALPHA = 0;
+ }
+
+ this->actor.world.pos.y += (this->doorDirection != 0) ? 3.0f : -3.0f;
+ this->actor.prevPos.y = this->actor.world.pos.y;
+ }
+ } else if (R_PLAY_FILL_SCREEN_ON == 0) {
+ CollisionPoly* sp64;
+ s32 sp60;
+
+ if (func_80835DF8(play, this, &sp64, &sp60)) {
+ this->actor.floorPoly = sp64;
+ this->actor.floorBgId = sp60;
+ }
+ }
+ }
+
+ if (var_t0 < 0x1E) {
+ this->unk_AE7 = 1;
+ this->stateFlags1 |= PLAYER_STATE1_20000000;
+ this->unk_3A0.x = this->unk_3AC.x;
+ this->unk_3A0.z = this->unk_3AC.z;
+ }
+ } else {
+ f32 sp5C = 5.0f;
+ s32 sp58 = 0x14;
+ s32 temp_v0_8;
+
+ if (this->stateFlags1 & PLAYER_STATE1_1) {
+ sp5C = gSaveContext.entranceSpeed;
+ if (sPlayerConveyorSpeedIndex != CONVEYOR_SPEED_DISABLED) {
+ this->unk_3A0.x = (Math_SinS(D_80862B16) * 400.0f) + this->actor.world.pos.x;
+ this->unk_3A0.z = (Math_CosS(D_80862B16) * 400.0f) + this->actor.world.pos.z;
+ }
+ } else {
+ if (this->unk_AE8 < 0) {
+ this->unk_AE8++;
+ sp5C = gSaveContext.entranceSpeed;
+ sp58 = -1;
+ } else if (this->unk_397 == 4) {
+ if (R_PLAY_FILL_SCREEN_ON == 0) {
+ R_PLAY_FILL_SCREEN_ON = 16;
+ R_PLAY_FILL_SCREEN_ALPHA = 0;
+
+ R_PLAY_FILL_SCREEN_R = R_PLAY_FILL_SCREEN_G = R_PLAY_FILL_SCREEN_B = R_PLAY_FILL_SCREEN_ALPHA;
+ } else if (R_PLAY_FILL_SCREEN_ON >= 0) {
+ R_PLAY_FILL_SCREEN_ALPHA += R_PLAY_FILL_SCREEN_ON;
+ if (R_PLAY_FILL_SCREEN_ALPHA > 255) {
+ TransitionActorEntry* temp_v1_4; // sp50
+ s32 roomNum;
+
+ temp_v1_4 = &play->doorCtx.transitionActorList[this->doorNext];
+ roomNum = temp_v1_4->sides[0].room;
+ R_PLAY_FILL_SCREEN_ALPHA = 255;
+
+ if ((roomNum != play->roomCtx.curRoom.num) && (play->roomCtx.curRoom.num >= 0)) {
+ play->roomCtx.prevRoom = play->roomCtx.curRoom;
+
+ play->roomCtx.curRoom.num = -1;
+ play->roomCtx.curRoom.segment = NULL;
+ func_8012EBF8(play, &play->roomCtx);
+ } else {
+ static Vec3f D_8085D62C = { 0.0f, 0.0f, 0.0f };
+ static Vec3f D_8085D638 = { 0.0f, 0.0f, 0.0f };
+ static Vec3f D_8085D644 = { 0.0f, 0.0f, 0.0f };
+
+ R_PLAY_FILL_SCREEN_ON = -16;
+ if (play->roomCtx.curRoom.num < 0) {
+ Room_StartRoomTransition(play, &play->roomCtx, temp_v1_4->sides[0].room);
+ play->roomCtx.prevRoom.num = -1;
+ play->roomCtx.prevRoom.segment = NULL;
+ }
+
+ this->actor.world.pos.x = temp_v1_4->pos.x;
+ this->actor.world.pos.y = temp_v1_4->pos.y;
+ this->actor.world.pos.z = temp_v1_4->pos.z;
+
+ this->actor.shape.rot.y = ((((temp_v1_4->rotY >> 7) & 0x1FF) / 180.0f) * 0x8000);
+
+ D_8085D62C.x = (this->doorDirection != 0) ? -120.0f : 120.0f;
+ D_8085D62C.y = (this->doorDirection != 0) ? -75.0f : 75.0f;
+ D_8085D62C.z = -240.0f;
+ if (this->doorDirection != 0) {
+ Camera_ChangeDoorCam(play->cameraPtrs[0], &this->actor, -2, 0.0f,
+ temp_v1_4->pos.x + 0x32, temp_v1_4->pos.y + 0x5F,
+ temp_v1_4->pos.z - 0x32);
+ } else {
+ Camera_ChangeDoorCam(play->cameraPtrs[0], &this->actor, -2, 0.0f,
+ temp_v1_4->pos.x - 0x32, temp_v1_4->pos.y + 5,
+ temp_v1_4->pos.z - 0x32);
+ }
+
+ Player_TranslateAndRotateY(this, &this->actor.world.pos, &D_8085D62C,
+ &this->actor.world.pos);
+
+ D_8085D638.x = (this->doorDirection != 0) ? 130.0f : -130.0f;
+ D_8085D638.z = 160.0f;
+ Player_TranslateAndRotateY(this, &this->actor.world.pos, &D_8085D638, &this->unk_3A0);
+ D_8085D644.z = 160.0f;
+ Player_TranslateAndRotateY(this, &this->unk_3A0, &D_8085D644, &this->unk_3AC);
+
+ this->actor.shape.rot.y += (this->doorDirection != 0) ? 0x4000 : -0x4000;
+ this->unk_AE7 = 0;
+
+ this->actor.world.rot.y = this->currentYaw = this->actor.shape.rot.y;
+ }
+ }
+
+ this->actor.world.pos.y += (this->doorDirection != 0) ? 3.0f : -3.0f;
+ this->actor.prevPos.y = this->actor.world.pos.y;
+ }
+ }
+ }
+
+ temp_v0_8 = func_808411D4(play, this, &sp5C, sp58);
+ if ((this->unk_AE8 == 0) || ((temp_v0_8 == 0) && (this->linearVelocity == 0.0f) &&
+ (Play_GetCamera(play, CAM_ID_MAIN)->stateFlags & CAM_STATE_4))) {
+ if (this->unk_397 == 4) {
+ Map_InitRoomData(play, play->roomCtx.curRoom.num);
+ Minimap_SavePlayerRoomInitInfo(play);
+ }
+
+ R_PLAY_FILL_SCREEN_ON = 0;
+ func_800E0238(Play_GetCamera(play, CAM_ID_MAIN));
+ Player_StopCutscene(this);
+ if (!(this->stateFlags3 & PLAYER_STATE3_20000)) {
+ func_801226E0(play, ((void)0, gSaveContext.respawn[RESPAWN_MODE_DOWN].data));
+ }
+
+ if (play->bButtonAmmoPlusOne != 0) {
+ play->func_18780(this, play);
+ Player_SetAction(play, this, func_80854430, 0);
+ if (play->sceneId == 0x45) {
+ play->bButtonAmmoPlusOne = 0;
+ }
+ } else if (!func_808391D8(this, play)) {
+ func_8083B2E4(this, play);
+ }
+ }
+ }
+ }
+
+ if (this->stateFlags1 & PLAYER_STATE1_800) {
+ func_8083216C(this, play);
+ }
+}
+
+// door stuff
+void func_8084E034(Player* this, PlayState* play) {
+ EnDoor* doorActor = (EnDoor*)this->doorActor;
+ s32 sp38 = (doorActor != NULL) && (doorActor->doorType == ENDOOR_TYPE_7);
+ s32 animFinished;
+ CollisionPoly* poly;
+ s32 bgId;
+
+ this->stateFlags2 |= PLAYER_STATE2_20;
+
+ if (DECR(this->unk_AE7) == 0) {
+ func_80835DF8(play, this, &poly, &bgId);
+ }
+
+ animFinished = PlayerAnimation_Update(play, &this->skelAnime);
+ func_8083216C(this, play);
+
+ if (animFinished) {
+ if (this->unk_AE8 == 0) {
+ if (DECR(this->doorTimer) == 0) {
+ this->unk_AE8 = 1;
+ this->skelAnime.endFrame = this->skelAnime.animLength - 1.0f;
+ }
+ } else {
+ Player_StopCutscene(this);
+ func_80839E74(this, play);
+
+ if ((this->actor.category == ACTORCAT_PLAYER) && !sp38) {
+ if (play->roomCtx.prevRoom.num >= 0) {
+ func_8012EBF8(play, &play->roomCtx);
+ }
+
+ func_800E0238(Play_GetCamera(play, CAM_ID_MAIN));
+ Play_SetupRespawnPoint(&play->state, RESPAWN_MODE_DOWN, PLAYER_PARAMS(0xFF, PLAYER_INITMODE_B));
+ }
+ }
+ } else if (!(this->stateFlags1 & PLAYER_STATE1_20000000) && PlayerAnimation_OnFrame(&this->skelAnime, 15.0f)) {
+ Player_StopCutscene(this);
+ play->func_18780(this, play);
+ } else if (sp38 && PlayerAnimation_OnFrame(&this->skelAnime, 15.0f)) {
+ s16 doorRot = (this->doorDirection < 0) ? doorActor->knobDoor.dyna.actor.world.rot.x
+ : doorActor->knobDoor.dyna.actor.world.rot.z;
+
+ if (doorRot != 0) {
+ func_808354A4(play, doorRot - 1, false);
+ }
+ }
+}
+
+// grab/hold an actor (?)
+void func_8084E25C(Player* this, PlayState* play) {
+ func_80832F24(this);
+
+ if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ func_80836988(this, play);
+ func_808313F0(this, play);
+ } else if (PlayerAnimation_OnFrame(&this->skelAnime, 4.0f)) {
+ Actor* interactRangeActor = this->interactRangeActor;
+
+ if (!func_808313A8(play, this, interactRangeActor)) {
+ this->actor.child = interactRangeActor;
+ this->heldActor = interactRangeActor;
+ interactRangeActor->parent = &this->actor;
+ interactRangeActor->bgCheckFlags &=
+ ~(BGCHECKFLAG_GROUND | BGCHECKFLAG_GROUND_TOUCH | BGCHECKFLAG_GROUND_LEAVE | BGCHECKFLAG_WALL |
+ BGCHECKFLAG_CEILING | BGCHECKFLAG_WATER | BGCHECKFLAG_WATER_TOUCH | BGCHECKFLAG_GROUND_STRICT);
+ this->leftHandWorld.rot.y = interactRangeActor->shape.rot.y - this->actor.shape.rot.y;
+ }
+ } else {
+ Math_ScaledStepToS(&this->leftHandWorld.rot.y, 0, 0xFA0);
+ }
+}
+
+// grab/hold an actor (?)
+void func_8084E334(Player* this, PlayState* play) {
+ func_80832F24(this);
+
+ if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ Player_AnimationPlayLoop(play, this, &gPlayerAnim_link_silver_wait);
+ this->unk_AE8 = 1;
+ } else if (this->unk_AE8 == 0) {
+ if (PlayerAnimation_OnFrame(&this->skelAnime, 27.0f)) {
+ Actor* interactRangeActor = this->interactRangeActor;
+
+ this->heldActor = interactRangeActor;
+ this->actor.child = interactRangeActor;
+ interactRangeActor->parent = &this->actor;
+ } else if (PlayerAnimation_OnFrame(&this->skelAnime, 25.0f)) {
+ Player_AnimSfx_PlayVoice(this, NA_SE_VO_LI_SWORD_L);
+ }
+ } else if (CHECK_BTN_ANY(sPlayerControlInput->press.button, BTN_CRIGHT | BTN_CLEFT | BTN_CDOWN | BTN_B | BTN_A)) {
+ Player_SetAction(play, this, func_8084E434, 1);
+ Player_AnimationPlayOnce(play, this, &gPlayerAnim_link_silver_throw);
+ }
+}
+
+// throw held actor (?)
+void func_8084E434(Player* this, PlayState* play) {
+ if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ func_80836988(this, play);
+ } else if (PlayerAnimation_OnFrame(&this->skelAnime, 6.0f)) {
+ Actor* heldActor = this->heldActor;
+
+ heldActor->world.rot.y = this->actor.shape.rot.y;
+ heldActor->speed = 10.0f;
+ heldActor->velocity.y = 20.0f;
+ func_808309CC(play, this);
+ Player_PlaySfx(this, NA_SE_PL_THROW);
+ Player_AnimSfx_PlayVoice(this, NA_SE_VO_LI_SWORD_N);
+ }
+}
+
+void func_8084E4E4(Player* this, PlayState* play) {
+ if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ Player_AnimationPlayLoop(play, this, &gPlayerAnim_link_normal_nocarry_free_wait);
+ this->unk_AE8 = 15;
+ } else if (this->unk_AE8 != 0) {
+ this->unk_AE8--;
+ if (this->unk_AE8 == 0) {
+ func_80836A98(this, &gPlayerAnim_link_normal_nocarry_free_end, play);
+ this->stateFlags1 &= ~PLAYER_STATE1_800;
+ Player_AnimSfx_PlayVoice(this, NA_SE_VO_LI_DAMAGE_S);
+ }
+ }
+}
+
+// Player_Action_PutDownObject?
+void func_8084E58C(Player* this, PlayState* play) {
+ func_80832F24(this);
+
+ if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ func_80836988(this, play);
+ } else if (PlayerAnimation_OnFrame(&this->skelAnime, 4.0f)) {
+ Actor* heldActor = this->heldActor;
+
+ if (!func_808313A8(play, this, heldActor)) {
+ heldActor->velocity.y = 0.0f;
+ heldActor->speed = 0.0f;
+ func_808309CC(play, this);
+ if (heldActor->id == ACTOR_EN_BOM_CHU) {
+ func_80831814(this, play, PLAYER_UNKAA5_0);
+ }
+ }
+ }
+}
+
+// Player_Action_Throwing
+void func_8084E65C(Player* this, PlayState* play) {
+ f32 sp34;
+ s16 yaw;
+
+ func_80832F24(this);
+
+ if (PlayerAnimation_Update(play, &this->skelAnime) ||
+ ((this->skelAnime.curFrame >= 8.0f) && func_80832F78(this, &sp34, &yaw, 0.018f, play))) {
+ func_80836988(this, play);
+ } else if (PlayerAnimation_OnFrame(&this->skelAnime, 3.0f)) {
+ func_808409A8(play, this, this->linearVelocity + 8.0f, 12.0f);
+ }
+}
+
+void func_8084E724(Player* this, PlayState* play) {
+ u8 temp_v1;
+ u32 new_var;
+
+ if (this->stateFlags1 & PLAYER_STATE1_8000000) {
+ func_808475B4(this);
+ func_8084748C(this, &this->linearVelocity, 0.0f, this->actor.shape.rot.y);
+ } else {
+ func_80832F24(this);
+ }
+
+ if (this->unk_AA5 == PLAYER_UNKAA5_3) {
+ if (func_800B7118(this) || func_8082ECCC(this)) {
+ func_8083216C(this, play);
+ }
+ }
+
+ temp_v1 = this->unk_AA5;
+ new_var = temp_v1;
+
+ if (((temp_v1 == PLAYER_UNKAA5_2) && !(play->actorCtx.flags & ACTORCTX_FLAG_PICTO_BOX_ON)) ||
+ ((temp_v1 != PLAYER_UNKAA5_2) &&
+ (((((((((this->csMode != PLAYER_CSMODE_0) || (new_var == 0)) || (temp_v1 >= PLAYER_UNKAA5_5)) ||
+ (func_8082FB68(this) != 0)) ||
+ (this->targetedActor != NULL)) ||
+ (func_8083868C(play, this) == 0)) ||
+ ((this->unk_AA5 == PLAYER_UNKAA5_3) &&
+ (((((Player_ItemToItemAction(this, Inventory_GetBtnBItem(play)) != this->heldItemAction) &&
+ CHECK_BTN_ANY(sPlayerControlInput->press.button, BTN_B)) ||
+ CHECK_BTN_ANY(sPlayerControlInput->press.button, BTN_R | BTN_A)) ||
+ (func_80123434(this) != 0)) ||
+ (!func_800B7128(this) && (func_8082EF20(this) == 0))))) ||
+ ((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)))) {
+ func_80839ED0(this, play);
+ play_sound(NA_SE_SY_CAMERA_ZOOM_UP);
+ } else if ((DECR(this->unk_AE8) == 0) || (this->unk_AA5 != PLAYER_UNKAA5_3)) {
+ if (func_801240DC(this)) {
+ this->unk_AA6 |= 0x43;
+ } else {
+ this->actor.shape.rot.y = func_80847190(play, this, 0);
+ }
+ }
+
+ this->currentYaw = this->actor.shape.rot.y;
+}
+
+void func_8084E980(Player* this, PlayState* play) {
+ this->stateFlags2 |= PLAYER_STATE2_20;
+
+ func_8083249C(this);
+ func_8083216C(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_1 | ACTOR_FLAG_4)) {
+ this->stateFlags2 &= ~PLAYER_STATE2_2000;
+ }
+
+ func_800E0238(Play_GetCamera(play, CAM_ID_MAIN));
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
+ if (this->stateFlags1 & PLAYER_STATE1_800000) {
+ s32 sp44 = this->unk_AE8;
+
+ func_80837BD0(play, this);
+ this->unk_AE8 = sp44;
+ } else if (!func_80847994(play, this) && !func_80847880(play, this) && !func_808387A0(play, this) &&
+ ((this->talkActor != this->interactRangeActor) || !func_8083D23C(this, play))) {
+ if (func_801242B4(this)) {
+ func_808353DC(play, this);
+ } else {
+ func_8085B384(this, play);
+ }
+ }
+
+ this->unk_B5E = 0xA;
+ return;
+ }
+
+ if (this->stateFlags1 & PLAYER_STATE1_800000) {
+ func_8084FE7C(this, play);
+ } else if (func_801242B4(this)) {
+ func_808508C8(this, play);
+ if (this->actor.depthInWater > 100.0f) {
+ this->actor.velocity.y = 0.0f;
+ this->actor.gravity = 0.0f;
+ }
+ } else if (!func_80123420(this) && PlayerAnimation_Update(play, &this->skelAnime)) {
+ if (this->skelAnime.moveFlags != 0) {
+ func_8082E794(this);
+ if ((this->talkActor->category == ACTORCAT_NPC) && (this->heldItemAction != PLAYER_IA_FISHING_ROD)) {
+ func_8082DB90(play, this, &gPlayerAnim_link_normal_talk_free);
+ } else {
+ Player_AnimationPlayLoop(play, this, func_8082ED20(this));
+ }
+ } else {
+ func_8082DB60(play, this, &gPlayerAnim_link_normal_talk_free_wait);
+ }
+ }
+
+ if (this->targetedActor != NULL) {
+ this->currentYaw = func_8083C62C(this, false);
+ this->actor.shape.rot.y = this->currentYaw;
+ if (this->unk_AE7 != 0) {
+ if (!(this->stateFlags1 & PLAYER_STATE1_800)) {
+ if (PlayerAnimation_Update(play, &this->unk_284)) {
+ this->unk_AE7--;
+ if (this->unk_AE7 != 0) {
+ PlayerAnimation_Change(play, &this->unk_284, &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);
+ } 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,
+ Animation_GetLastFrame(D_8085BE84[PLAYER_ANIMGROUP_25][this->modelAnimType]), ANIMMODE_ONCE, -6.0f);
+ this->unk_AE7 = 2;
+ }
+ }
+ }
+}
+
+void func_8084ED9C(Player* this, PlayState* play) {
+ f32 sp34;
+ s16 sp32;
+ s32 temp_v0;
+
+ this->stateFlags2 |= (PLAYER_STATE2_1 | PLAYER_STATE2_40 | PLAYER_STATE2_100);
+ func_8083DEE4(play, this);
+
+ if (PlayerAnimation_Update(play, &this->skelAnime) && !func_8083E14C(play, this)) {
+ func_80832F78(this, &sp34, &sp32, 0.0f, play);
+ temp_v0 = func_8083E758(this, &sp34, &sp32);
+ if (temp_v0 > 0) {
+ func_8083E234(this, play);
+ } else if (temp_v0 < 0) {
+ func_8083E28C(this, play);
+ }
+ }
+}
+
+AnimSfxEntry D_8085D650[] = {
+ ANIMSFX(ANIMSFX_TYPE_FLOOR, 3, NA_SE_PL_SLIP, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_FLOOR, 21, NA_SE_PL_SLIP, STOP),
+};
+
+void func_8084EE50(Player* this, PlayState* play) {
+ this->stateFlags2 |= (PLAYER_STATE2_1 | PLAYER_STATE2_40 | PLAYER_STATE2_100);
+
+ if (func_8082E67C(play, this, &gPlayerAnim_link_normal_pushing)) {
+ this->unk_AE8 = 1;
+ } else if ((this->unk_AE8 == 0) && PlayerAnimation_OnFrame(&this->skelAnime, 11.0f)) {
+ Player_AnimSfx_PlayVoice(this, NA_SE_VO_LI_PUSH);
+ }
+
+ Player_PlayAnimSfx(this, D_8085D650);
+ func_8083DEE4(play, this);
+
+ if (!func_8083E14C(play, this)) {
+ f32 sp34;
+ s16 sp32;
+ s32 temp_v0;
+
+ func_80832F78(this, &sp34, &sp32, 0.0f, play);
+ temp_v0 = func_8083E758(this, &sp34, &sp32);
+ if (temp_v0 < 0) {
+ func_8083E28C(this, play);
+ } else if (temp_v0 == 0) {
+ func_8083DF38(this, &gPlayerAnim_link_normal_push_end, play);
+ } else {
+ this->stateFlags2 |= PLAYER_STATE2_10;
+ }
+ }
+
+ if (this->stateFlags2 & PLAYER_STATE2_10) {
+ func_808479F4(play, this, 2.0f);
+ this->linearVelocity = 2.0f;
+ }
+}
+
+AnimSfxEntry D_8085D658[] = {
+ ANIMSFX(ANIMSFX_TYPE_FLOOR, 4, NA_SE_PL_SLIP, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_FLOOR, 24, NA_SE_PL_SLIP, STOP),
+};
+
+Vec3f D_8085D660 = { 0.0f, 268 * 0.1f, -60.0f };
+
+void func_8084EF9C(Player* this, PlayState* play) {
+ PlayerAnimationHeader* anim = D_8085BE84[PLAYER_ANIMGROUP_35][this->modelAnimType];
+
+ this->stateFlags2 |= (PLAYER_STATE2_1 | PLAYER_STATE2_40 | PLAYER_STATE2_100);
+
+ if (func_8082E67C(play, this, anim)) {
+ this->unk_AE8 = 1;
+ } else if (this->unk_AE8 == 0) {
+ if (PlayerAnimation_OnFrame(&this->skelAnime, 11.0f)) {
+ Player_AnimSfx_PlayVoice(this, NA_SE_VO_LI_PUSH);
+ }
+
+ //! FAKE
+ if (1) {}
+ } else {
+ Player_PlayAnimSfx(this, D_8085D658);
+ }
+
+ func_8083DEE4(play, this);
+ if (!func_8083E14C(play, this)) {
+ f32 sp78;
+ s16 sp76;
+ s32 temp_v0;
+
+ func_80832F78(this, &sp78, &sp76, 0.0f, play);
+
+ temp_v0 = func_8083E758(this, &sp78, &sp76);
+ if (temp_v0 > 0) {
+ func_8083E234(this, play);
+ } else if (temp_v0 == 0) {
+ func_8083DF38(this, D_8085BE84[PLAYER_ANIMGROUP_36][this->modelAnimType], play);
+ } else {
+ this->stateFlags2 |= PLAYER_STATE2_10;
+ }
+ }
+
+ if (this->stateFlags2 & PLAYER_STATE2_10) {
+ Vec3f sp64;
+ f32 yIntersect = func_80835D2C(play, this, &D_8085D660, &sp64) - this->actor.world.pos.y;
+ CollisionPoly* poly;
+ s32 bgId;
+ Vec3f sp4C;
+ Vec3f sp40;
+
+ if (fabsf(yIntersect) < 268 * 0.1f) {
+ sp64.y -= 7.0f;
+ sp4C.x = this->actor.world.pos.x;
+ sp4C.z = this->actor.world.pos.z;
+ sp4C.y = sp64.y;
+ if (!BgCheck_EntityLineTest2(&play->colCtx, &sp4C, &sp64, &sp40, &poly, 1, 0, 0, 1, &bgId, &this->actor)) {
+ func_808479F4(play, this, -2.0f);
+ return;
+ }
+ }
+ this->stateFlags2 &= ~PLAYER_STATE2_10;
+ }
+}
+
+void func_8084F1B8(Player* this, PlayState* play) {
+ f32 sp3C;
+ s16 sp3A;
+
+ this->stateFlags2 |= PLAYER_STATE2_40;
+
+ if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ Player_AnimationPlayLoop(play, this,
+ (this->unk_AE7 > 0) ? &gPlayerAnim_link_normal_fall_wait
+ : D_8085BE84[PLAYER_ANIMGROUP_39][this->modelAnimType]);
+ } else if (this->unk_AE7 == 0) {
+ f32 frame;
+
+ if (this->skelAnime.animation == &gPlayerAnim_link_normal_fall) {
+ frame = 11.0f;
+ } else {
+ frame = 1.0f;
+ }
+
+ if (PlayerAnimation_OnFrame(&this->skelAnime, frame)) {
+ Player_AnimSfx_PlayFloor(this, NA_SE_PL_WALK_GROUND);
+ if (this->skelAnime.animation == &gPlayerAnim_link_normal_fall) {
+ this->unk_AE7 = 1;
+ } else {
+ this->unk_AE7 = -1;
+ }
+ }
+ }
+
+ Math_ScaledStepToS(&this->actor.shape.rot.y, this->currentYaw, 0x800);
+ if (this->unk_AE7 != 0) {
+ func_80832F78(this, &sp3C, &sp3A, 0.0f, play);
+ if (this->unk_ADF[this->unk_ADE] >= 0) {
+ func_808381A0(this,
+ (this->unk_AE7 > 0) ? D_8085BE84[PLAYER_ANIMGROUP_37][this->modelAnimType]
+ : D_8085BE84[PLAYER_ANIMGROUP_40][this->modelAnimType],
+ play);
+ } else if (CHECK_BTN_ALL(sPlayerControlInput->cur.button, BTN_A) || (this->actor.shape.feetFloorFlags != 0)) {
+ func_80833A64(this);
+
+ if (this->unk_AE7 < 0) {
+ this->linearVelocity = -0.8f;
+ } else {
+ this->linearVelocity = 0.8f;
+ }
+
+ func_80833AA0(this, play);
+ this->stateFlags1 &= ~(PLAYER_STATE1_4 | PLAYER_STATE1_2000 | PLAYER_STATE1_4000);
+ this->actor.bgCheckFlags &= ~BGCHECKFLAG_GROUND;
+ }
+ }
+}
+
+void func_8084F3DC(Player* this, PlayState* play) {
+ this->stateFlags2 |= PLAYER_STATE2_40;
+
+ if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ this->currentYaw = this->skelAnime.jointTable[PLAYER_LIMB_WAIST - 1].y + this->actor.shape.rot.y;
+ func_8082E820(this, 1);
+ this->actor.shape.rot.y = this->currentYaw;
+ func_80839E74(this, play);
+ this->stateFlags1 &= ~(PLAYER_STATE1_4 | PLAYER_STATE1_2000 | PLAYER_STATE1_4000);
+ } else if (PlayerAnimation_OnFrame(&this->skelAnime, this->skelAnime.endFrame - 6.0f)) {
+ Player_AnimSfx_PlayFloorLand(this);
+ } else if (PlayerAnimation_OnFrame(&this->skelAnime, this->skelAnime.endFrame - 34.0f)) {
+ Player_PlaySfx(this, NA_SE_PL_CLIMB_CLIFF);
+ Player_AnimSfx_PlayVoice(this, NA_SE_VO_LI_CLIMB_END);
+ func_8084C124(play, this);
+ }
+}
+
+void func_8084F4E8(Player* this, PlayState* play) {
+ s32 yStick = sPlayerControlInput->rel.stick_y;
+ s32 xStick = sPlayerControlInput->rel.stick_x;
+ f32 var_fv0;
+ f32 var_fv1;
+ Vec3f sp7C;
+ s32 sp78;
+ Vec3f sp6C;
+ Vec3f sp60;
+ DynaPolyActor* dyna;
+ PlayerAnimationHeader* anim1;
+ PlayerAnimationHeader* anim2;
+
+ this->fallStartHeight = this->actor.world.pos.y;
+
+ this->stateFlags2 |= PLAYER_STATE2_40;
+
+ if ((this->unk_AE7 != 0) && (ABS_ALT(yStick) < ABS_ALT(xStick))) {
+ var_fv0 = ABS_ALT(xStick) * 0.0325f;
+ yStick = 0;
+ } else {
+ var_fv0 = ABS_ALT(yStick) * 0.05f;
+ xStick = 0;
+ }
+
+ if (var_fv0 < 1.0f) {
+ var_fv0 = 1.0f;
+ } else if (var_fv0 > 3.35f) {
+ var_fv0 = 3.35f;
+ }
+
+ if (this->skelAnime.playSpeed >= 0.0f) {
+ var_fv1 = 1.0f;
+ } else {
+ var_fv1 = -1.0f;
+ }
+
+ this->skelAnime.playSpeed = var_fv1 * var_fv0;
+
+ if (this->unk_AE8 >= 0) {
+ if ((this->actor.wallPoly != NULL) && (this->actor.wallBgId != BGCHECK_SCENE)) {
+ dyna = DynaPoly_GetActor(&play->colCtx, this->actor.wallBgId);
+
+ if (dyna != NULL) {
+ Math_Vec3f_Diff(&dyna->actor.world.pos, &dyna->actor.prevPos, &sp7C);
+ Math_Vec3f_Sum(&this->actor.world.pos, &sp7C, &this->actor.world.pos);
+ }
+ }
+
+ Actor_UpdateBgCheckInfo(play, &this->actor, 268 * 0.1f, 6.0f, this->ageProperties->unk_00 + 15.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_2 | UPDBGCHECKINFO_FLAG_4);
+ func_8083DD1C(play, this, 268 * 0.1f, this->ageProperties->unk_3C, 50.0f, -20.0f);
+ }
+
+ func_80831944(play, this);
+
+ if ((this->unk_AE8 < 0) || !func_8083E354(this, play)) {
+ if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ if (this->unk_AE8 < 0) {
+ this->unk_AE8 = ABS_ALT(this->unk_AE8) & 1;
+ } else if (yStick != 0) {
+ f32 yIntersect;
+
+ sp78 = this->unk_AE7 + this->unk_AE8;
+
+ if (yStick > 0) {
+ sp6C.x = 0.0f;
+ sp6C.y = this->ageProperties->unk_40;
+ sp6C.z = this->ageProperties->unk_3C + 10.0f;
+
+ yIntersect = func_80835D2C(play, this, &sp6C, &sp60);
+
+ if (this->actor.world.pos.y < yIntersect) {
+ if (this->unk_AE7 != 0) {
+ this->actor.world.pos.y = yIntersect;
+ this->stateFlags1 &= ~PLAYER_STATE1_200000;
+ func_80837CEC(play, this, this->actor.wallPoly, this->ageProperties->unk_3C,
+ &gPlayerAnim_link_normal_jump_climb_up_free);
+ this->currentYaw += 0x8000;
+ this->actor.shape.rot.y = this->currentYaw;
+ func_808381A0(this, &gPlayerAnim_link_normal_jump_climb_up_free, play);
+ this->stateFlags1 |= PLAYER_STATE1_4000;
+ } else {
+ func_8083DCC4(this, this->ageProperties->unk_D4[this->unk_AE8], play);
+ }
+ } else {
+ this->skelAnime.prevTransl = this->ageProperties->unk_4A[sp78];
+ Player_AnimationPlayOnce(play, this, this->ageProperties->unk_B4[sp78]);
+ }
+ } else if ((this->actor.world.pos.y - this->actor.floorHeight) < 15.0f) {
+ if (this->unk_AE7 != 0) {
+ func_8083E2F4(this, play);
+ } else {
+ if (this->unk_AE8 != 0) {
+ this->skelAnime.prevTransl = this->ageProperties->unk_44;
+ }
+
+ func_8083DCC4(this, this->ageProperties->unk_CC[this->unk_AE8], play);
+ this->unk_AE8 = 1;
+ }
+ } else {
+ sp78 ^= 1;
+ this->skelAnime.prevTransl = this->ageProperties->unk_62[sp78];
+ anim1 = this->ageProperties->unk_B4[sp78];
+ PlayerAnimation_Change(play, &this->skelAnime, anim1, -1.0f, Animation_GetLastFrame(anim1), 0.0f, 2,
+ 0.0f);
+ }
+
+ this->unk_AE8 ^= 1;
+ } else if ((this->unk_AE7 != 0) && (xStick != 0)) {
+ anim2 = this->ageProperties->unk_C4[this->unk_AE8];
+
+ if (xStick > 0) {
+ this->skelAnime.prevTransl = this->ageProperties->unk_7A[this->unk_AE8];
+ Player_AnimationPlayOnce(play, this, anim2);
+ } else {
+ this->skelAnime.prevTransl = this->ageProperties->unk_7A[this->unk_AE8 + 2];
+ PlayerAnimation_Change(play, &this->skelAnime, anim2, -1.0f, Animation_GetLastFrame(anim2), 0.0f, 2,
+ 0.0f);
+ }
+ } else {
+ this->stateFlags2 |= PLAYER_STATE2_1000;
+ }
+
+ return;
+ }
+ }
+
+ if (this->unk_AE8 < 0) {
+ if (((this->unk_AE8 == -2) &&
+ (PlayerAnimation_OnFrame(&this->skelAnime, 14.0f) || PlayerAnimation_OnFrame(&this->skelAnime, 29.0f))) ||
+ ((this->unk_AE8 == -4) &&
+ (PlayerAnimation_OnFrame(&this->skelAnime, 22.0f) || PlayerAnimation_OnFrame(&this->skelAnime, 35.0f) ||
+ PlayerAnimation_OnFrame(&this->skelAnime, 49.0f) || PlayerAnimation_OnFrame(&this->skelAnime, 55.0f)))) {
+ func_80847A50(this);
+ }
+ } else if (PlayerAnimation_OnFrame(&this->skelAnime, (this->skelAnime.playSpeed > 0.0f) ? 20.0f : 0.0f)) {
+ func_80847A50(this);
+ }
+}
+
+f32 D_8085D66C[] = { 11.0f, 21.0f };
+f32 D_8085D674[] = { 40.0f, 50.0f };
+
+AnimSfxEntry D_8085D67C[] = {
+ ANIMSFX(ANIMSFX_TYPE_SURFACE, 10, NA_SE_PL_WALK_LADDER, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_SURFACE, 20, NA_SE_PL_WALK_LADDER, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_SURFACE, 30, NA_SE_PL_WALK_LADDER, STOP),
+};
+
+void func_8084FC0C(Player* this, PlayState* play) {
+ s32 temp_v0;
+
+ this->stateFlags2 |= PLAYER_STATE2_40;
+
+ temp_v0 = func_808331FC(play, this, &this->skelAnime, 4.0f);
+ if (temp_v0 == 0) {
+ this->stateFlags1 &= ~PLAYER_STATE1_200000;
+ } else if ((temp_v0 > 0) || PlayerAnimation_Update(play, &this->skelAnime)) {
+ func_80839E74(this, play);
+ this->stateFlags1 &= ~PLAYER_STATE1_200000;
+ } else {
+ f32* var_v1 = D_8085D66C;
+
+ if (this->unk_AE8 != 0) {
+ Player_PlayAnimSfx(this, D_8085D67C);
+ var_v1 = D_8085D674;
+ }
+
+ if (PlayerAnimation_OnFrame(&this->skelAnime, var_v1[0]) ||
+ PlayerAnimation_OnFrame(&this->skelAnime, var_v1[1])) {
+ CollisionPoly* poly;
+ s32 bgId;
+ Vec3f pos;
+
+ pos.x = this->actor.world.pos.x;
+ pos.y = this->actor.world.pos.y + 20.0f;
+ pos.z = this->actor.world.pos.z;
+ if (BgCheck_EntityRaycastFloor5(&play->colCtx, &poly, &bgId, &this->actor, &pos) != 0.0f) {
+ this->floorSfxOffset = SurfaceType_GetSfxOffset(&play->colCtx, poly, bgId);
+ Player_AnimSfx_PlayFloorLand(this);
+ }
+ }
+ }
+}
+
+void func_8084FD7C(PlayState* play, Player* this, Actor* actor) {
+ s16 var_a3;
+
+ if (this->unk_B86[0] != 0) {
+ this->unk_B86[0]--;
+ return;
+ }
+
+ this->upperLimbRot.y = func_80847190(play, this, 1) - this->actor.shape.rot.y;
+
+ var_a3 = ABS_ALT(this->upperLimbRot.y) - 0x4000;
+ if (var_a3 > 0) {
+ var_a3 = CLAMP_MAX(var_a3, 0x15E);
+ actor->shape.rot.y += var_a3 * ((this->upperLimbRot.y >= 0) ? 1 : -1);
+ actor->world.rot.y = actor->shape.rot.y;
+ }
+
+ this->upperLimbRot.y += 0x2710;
+ this->unk_AA8 = -0x1388;
+}
+
+s32 func_8084FE48(Player* this) {
+ return this->targetedActor == NULL && !func_8082FC24(this);
+}
+
+PlayerAnimationHeader* D_8085D688[] = {
+ &gPlayerAnim_link_uma_anim_stop, &gPlayerAnim_link_uma_anim_stand, &gPlayerAnim_link_uma_anim_walk,
+ &gPlayerAnim_link_uma_anim_slowrun, &gPlayerAnim_link_uma_anim_fastrun, &gPlayerAnim_link_uma_anim_jump100,
+ &gPlayerAnim_link_uma_anim_jump200,
+};
+
+PlayerAnimationHeader* D_8085D6A4[] = {
+ NULL,
+ NULL,
+ &gPlayerAnim_link_uma_anim_walk_muti,
+ &gPlayerAnim_link_uma_anim_walk_muti,
+ &gPlayerAnim_link_uma_anim_walk_muti,
+ &gPlayerAnim_link_uma_anim_slowrun_muti,
+ &gPlayerAnim_link_uma_anim_fastrun_muti,
+ &gPlayerAnim_link_uma_anim_fastrun_muti,
+ &gPlayerAnim_link_uma_anim_fastrun_muti,
+ NULL,
+ NULL,
+};
+
+PlayerAnimationHeader* D_8085D6D0[] = {
+ &gPlayerAnim_link_uma_wait_3,
+ &gPlayerAnim_link_uma_wait_1,
+ &gPlayerAnim_link_uma_wait_2,
+};
+
+u8 D_8085D6DC[][2] = {
+ { 32, 58 },
+ { 25, 42 },
+};
+
+Vec3s D_8085D6E0 = { -0x45, 0x1BEA, -0x10A };
+
+AnimSfxEntry D_8085D6E8[] = {
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 48, NA_SE_PL_CALM_HIT, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 58, NA_SE_PL_CALM_HIT, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 68, NA_SE_PL_CALM_HIT, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 92, NA_SE_PL_CALM_PAT, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 110, NA_SE_PL_CALM_PAT, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 126, NA_SE_PL_CALM_PAT, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 132, NA_SE_PL_CALM_PAT, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 136, NA_SE_PL_CALM_PAT, STOP),
+};
+
+void func_8084FE7C(Player* this, PlayState* play) {
+ EnHorse* rideActor = (EnHorse*)this->rideActor;
+
+ this->stateFlags2 |= PLAYER_STATE2_40;
+
+ func_80847E2C(this, 1.0f, 10.0f);
+ if (this->unk_AE8 == 0) {
+ if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ this->skelAnime.animation = &gPlayerAnim_link_uma_wait_1;
+ this->unk_AE8 = 0x63;
+ } else {
+ s32 var_v0 = (this->mountSide < 0) ? 0 : 1;
+
+ if (PlayerAnimation_OnFrame(&this->skelAnime, D_8085D6DC[var_v0][0])) {
+ Actor_SetCameraHorseSetting(play, this);
+ Player_PlaySfx(this, NA_SE_PL_CLIMB_CLIFF);
+ } else if (PlayerAnimation_OnFrame(&this->skelAnime, D_8085D6DC[var_v0][1])) {
+ Player_PlaySfx(this, NA_SE_PL_SIT_ON_HORSE);
+ }
+ }
+ } else {
+ if (rideActor->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
+ func_80841A50(play, this);
+ }
+
+ Actor_SetCameraHorseSetting(play, this);
+
+ this->skelAnime.prevTransl = D_8085D6E0;
+
+ if ((this->unk_AE8 < 0) || ((rideActor->animIndex != (this->unk_AE8 & 0xFFFF)) &&
+ ((rideActor->animIndex >= ENHORSE_ANIM_STOPPING) || (this->unk_AE8 >= 2)))) {
+ s32 animIndex = rideActor->animIndex;
+
+ if (animIndex < ENHORSE_ANIM_STOPPING) {
+ f32 temp_fv0 = Rand_ZeroOne();
+ s32 index = 0;
+
+ animIndex = ENHORSE_ANIM_WHINNY;
+ if (temp_fv0 < 0.1f) {
+ index = 2;
+ } else if (temp_fv0 < 0.2f) {
+ index = 1;
+ }
+
+ Player_AnimationPlayOnce(play, this, D_8085D6D0[index]);
+ } else {
+ this->skelAnime.animation = D_8085D688[animIndex - 2];
+ if (this->unk_AE8 >= 0) {
+ Animation_SetMorph(play, &this->skelAnime, 8.0f);
+ }
+
+ if (animIndex < ENHORSE_ANIM_WALK) {
+ func_808309CC(play, this);
+ this->unk_AE7 = 0;
+ }
+ }
+
+ this->unk_AE8 = animIndex;
+ }
+
+ if (this->unk_AE8 == 1) {
+ if (D_80862B04 || func_8082DAFC(play)) {
+ Player_AnimationPlayOnce(play, this, &gPlayerAnim_link_uma_wait_3);
+ } else if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ this->unk_AE8 = 0x63;
+ } else if (this->skelAnime.animation == &gPlayerAnim_link_uma_wait_1) {
+ Player_PlayAnimSfx(this, D_8085D6E8);
+ }
+ } else {
+ this->skelAnime.curFrame = rideActor->curFrame;
+ PlayerAnimation_AnimateFrame(play, &this->skelAnime);
+ }
+
+ AnimationContext_SetCopyAll(play, this->skelAnime.limbCount, this->skelAnime.morphTable,
+ this->skelAnime.jointTable);
+
+ if ((play->csCtx.state != CS_STATE_IDLE) || (this->csMode != PLAYER_CSMODE_0)) {
+ this->unk_AA5 = PLAYER_UNKAA5_0;
+ this->unk_AE7 = 0;
+ } else if ((this->unk_AE8 < 2) || (this->unk_AE8 >= 4)) {
+ D_80862B04 = func_8083216C(this, play);
+ if (D_80862B04) {
+ this->unk_AE7 = 0;
+ }
+ }
+
+ this->actor.world.pos.x = rideActor->actor.world.pos.x + rideActor->riderPos.x;
+ this->actor.world.pos.y = rideActor->actor.world.pos.y + rideActor->riderPos.y - 27.0f;
+ this->actor.world.pos.z = rideActor->actor.world.pos.z + rideActor->riderPos.z;
+
+ this->currentYaw = this->actor.shape.rot.y = rideActor->actor.shape.rot.y;
+
+ if (!D_80862B04) {
+ if (this->unk_AE7 != 0) {
+ if (PlayerAnimation_Update(play, &this->unk_284)) {
+ rideActor->stateFlags &= ~ENHORSE_FLAG_8;
+ this->unk_AE7 = 0;
+ }
+
+ if (this->unk_284.animation == &gPlayerAnim_link_uma_stop_muti) {
+ if (PlayerAnimation_OnFrame(&this->unk_284, 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);
+ } else {
+ if (PlayerAnimation_OnFrame(&this->unk_284, 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);
+ }
+ } else if (!CHECK_FLAG_ALL(this->actor.flags, 0x100)) {
+ PlayerAnimationHeader* anim = NULL;
+
+ if (EN_HORSE_CHECK_3(rideActor)) {
+ anim = &gPlayerAnim_link_uma_stop_muti;
+ } else if (EN_HORSE_CHECK_2(rideActor)) {
+ if ((this->unk_AE8 >= 2) && (this->unk_AE8 != 0x63)) {
+ anim = D_8085D6A4[this->unk_AE8];
+ }
+ }
+
+ if (anim != NULL) {
+ PlayerAnimation_PlayOnce(play, &this->unk_284, anim);
+ this->unk_AE7 = 1;
+ }
+ }
+ }
+
+ if (this->stateFlags1 & PLAYER_STATE1_100000) {
+ if (CHECK_BTN_ANY(sPlayerControlInput->press.button, BTN_A) || !func_8084FE48(this)) {
+ this->unk_AA5 = PLAYER_UNKAA5_0;
+ this->stateFlags1 &= ~PLAYER_STATE1_100000;
+ } else {
+ func_8084FD7C(play, this, &rideActor->actor);
+ }
+ } else if ((this->csMode != PLAYER_CSMODE_0) ||
+ (!func_8082DAFC(play) && ((rideActor->actor.speed != 0.0f) || !func_808391D8(this, play)) &&
+ !func_80847BF0(this, play) && !func_80838A90(this, play))) {
+ if (this->targetedActor != NULL) {
+ if (func_800B7128(this)) {
+ this->upperLimbRot.y = func_8083C62C(this, true) - this->actor.shape.rot.y;
+ this->upperLimbRot.y = CLAMP(this->upperLimbRot.y, -0x4AAA, 0x4AAA);
+ this->actor.focus.rot.y = this->actor.shape.rot.y + this->upperLimbRot.y;
+ this->upperLimbRot.y += 0xFA0;
+ this->unk_AA6 |= 0x80;
+ } else {
+ func_8083C62C(this, false);
+ }
+
+ this->unk_AA8 = 0;
+ } else if (func_8084FE48(this)) {
+ if (func_800B7128(this)) {
+ func_80831010(this, play);
+ }
+
+ this->unk_B86[0] = 0xC;
+ } else if (func_800B7128(this)) {
+ func_8084FD7C(play, this, &rideActor->actor);
+ }
+ }
+ }
+
+ if (this->csMode == PLAYER_CSMODE_END) {
+ this->csMode = PLAYER_CSMODE_0;
+ }
+}
+
+AnimSfxEntry D_8085D708[] = {
+ ANIMSFX(ANIMSFX_TYPE_FLOOR_LAND, 0, NA_SE_NONE, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 10, NA_SE_PL_GET_OFF_HORSE, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 25, NA_SE_PL_SLIPDOWN, STOP),
+};
+
+void func_808505D0(Player* this, PlayState* play) {
+ this->stateFlags2 |= PLAYER_STATE2_40;
+ func_80847E2C(this, 1.0f, 10.0f);
+
+ if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ Actor* rideActor = this->rideActor;
+
+ Camera_ChangeSetting(Play_GetCamera(play, CAM_ID_MAIN), CAM_SET_NORMAL0);
+ func_80839E74(this, play);
+
+ this->stateFlags1 &= ~PLAYER_STATE1_800000;
+ this->actor.parent = NULL;
+ D_801BDA9C = false;
+
+ if (CHECK_QUEST_ITEM(QUEST_SONG_EPONA) || (DREG(1) != 0)) {
+ gSaveContext.save.saveInfo.horseData.sceneId = play->sceneId;
+ gSaveContext.save.saveInfo.horseData.pos.x = rideActor->world.pos.x;
+ gSaveContext.save.saveInfo.horseData.pos.y = rideActor->world.pos.y;
+ gSaveContext.save.saveInfo.horseData.pos.z = rideActor->world.pos.z;
+ gSaveContext.save.saveInfo.horseData.yaw = rideActor->shape.rot.y;
+ }
+ } else {
+ if (this->mountSide < 0) {
+ D_8085D708[0].flags = ANIMSFX_FLAGS(ANIMSFX_TYPE_FLOOR_LAND, 40, CONTINUE);
+ } else {
+ D_8085D708[0].flags = ANIMSFX_FLAGS(ANIMSFX_TYPE_FLOOR_LAND, 29, CONTINUE);
+ }
+
+ Player_PlayAnimSfx(this, D_8085D708);
+ }
+}
+
+s32 func_80850734(PlayState* play, Player* this) {
+ if ((this->transformation == PLAYER_FORM_ZORA) && (this->windSpeed == 0.0f) &&
+ (this->currentBoots < PLAYER_BOOTS_ZORA_UNDERWATER) && CHECK_BTN_ALL(sPlayerControlInput->cur.button, BTN_A)) {
+ func_8083B850(play, this);
+ this->stateFlags2 |= PLAYER_STATE2_400;
+ PlayerAnimation_Change(play, &this->skelAnime, &gPlayerAnim_pz_waterroll, 2.0f / 3.0f, 4.0f,
+ Animation_GetLastFrame(&gPlayerAnim_pz_waterroll), ANIMMODE_ONCE, -6.0f);
+ this->unk_AE8 = 5;
+ this->unk_B86[0] = 0;
+ this->unk_B48 = this->linearVelocity;
+ this->actor.velocity.y = 0.0f;
+ Player_PlaySfx(this, NA_SE_PL_ZORA_SWIM_DASH);
+ return true;
+ }
+ return false;
+}
+
+s32 func_80850854(PlayState* play, Player* this) {
+ if ((this->transformation == PLAYER_FORM_DEKU) && (this->remainingHopsCounter != 0) &&
+ (gSaveContext.save.saveInfo.playerData.health != 0) && (D_80862AFC != 0.0f)) {
+ func_808373F8(play, this, 0);
+ return true;
+ }
+ return false;
+}
+
+void func_808508C8(Player* this, PlayState* play) {
+ f32 sp34;
+ s16 sp32;
+
+ this->stateFlags2 |= PLAYER_STATE2_20;
+
+ func_8082E67C(play, this, &gPlayerAnim_link_swimer_swim_wait);
+ func_808475B4(this);
+
+ if (this->unk_AE8 != 0) {
+ this->unk_AE8--;
+ }
+
+ func_8082F164(this, BTN_R);
+
+ if (CHECK_BTN_ALL(sPlayerControlInput->press.button, BTN_A)) {
+ this->unk_AE8 = 0;
+ }
+
+ if (!func_8082DAFC(play) && !func_80833058(play, this, D_8085D048, 1) &&
+ !func_8083B3B4(play, this, sPlayerControlInput) && ((this->unk_AE8 != 0) || !func_80850734(play, this))) {
+ sp34 = 0.0f;
+ sp32 = this->actor.shape.rot.y;
+
+ if (this->unk_AA5 > PLAYER_UNKAA5_2) {
+ this->unk_AA5 = PLAYER_UNKAA5_0;
+ }
+
+ if (this->currentBoots >= PLAYER_BOOTS_ZORA_UNDERWATER) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
+ func_80836A98(this, D_8085BE84[PLAYER_ANIMGROUP_14][this->modelAnimType], play);
+ Player_AnimSfx_PlayFloorLand(this);
+ }
+ } else if ((func_80850854(play, this) == 0) &&
+ (func_80832F78(this, &sp34, &sp32, 0.0f, play), (sp34 != 0.0f))) {
+ if ((ABS_ALT(BINANG_SUB(this->actor.shape.rot.y, sp32)) > 0x6000) &&
+ !Math_StepToF(&this->linearVelocity, 0.0f, 1.0f)) {
+ return;
+ }
+
+ if (func_8082FC24(this) || func_80847ED4(this)) {
+ func_80848048(play, this);
+ } else {
+ func_8083B73C(play, this, sp32);
+ }
+ }
+
+ func_8084748C(this, &this->linearVelocity, sp34, sp32);
+ func_80847F1C(this);
+ }
+}
+
+void func_80850B18(Player* this, PlayState* play) {
+ if (!func_80838A90(this, play)) {
+ this->stateFlags2 |= PLAYER_STATE2_20;
+ func_808477D0(play, this, NULL, this->linearVelocity);
+ func_808475B4(this);
+
+ if (DECR(this->unk_AE8) == 0) {
+ func_808353DC(play, this);
+ }
+ }
+}
+
+void func_80850BA8(Player* this) {
+ this->linearVelocity = Math_CosS(this->unk_AAA) * this->unk_B48;
+ this->actor.velocity.y = -Math_SinS(this->unk_AAA) * this->unk_B48;
+}
+
+void func_80850BF8(Player* this, f32 arg1) {
+ f32 temp_fv0;
+ s16 temp_ft0;
+
+ Math_AsymStepToF(&this->unk_B48, arg1, 1.0f, (fabsf(this->unk_B48) * 0.01f) + 0.4f);
+ temp_fv0 = Math_CosS(sPlayerControlInput->rel.stick_x * 0x10E);
+
+ temp_ft0 = (((sPlayerControlInput->rel.stick_x >= 0) ? 1 : -1) * (1.0f - temp_fv0) * -1100.0f);
+ temp_ft0 = CLAMP(temp_ft0, -0x1F40, 0x1F40);
+
+ this->currentYaw += temp_ft0;
+}
+
+void func_80850D20(PlayState* play, Player* this) {
+ func_8083F8A8(play, this, 12.0f, -1, 1.0f, 160, 20, true);
+}
+
+void func_80850D68(Player* this, PlayState* play) {
+ f32 sp44;
+ s16 sp42;
+ s16 sp40;
+ s16 sp3E;
+ s16 sp3C;
+ s16 sp3A;
+
+ this->stateFlags2 |= PLAYER_STATE2_20;
+
+ func_808475B4(this);
+ func_8082F164(this, BTN_R);
+
+ if (func_80833058(play, this, D_8085D048, false)) {
+ return;
+ }
+
+ if (func_8083B3B4(play, this, sPlayerControlInput)) {
+ return;
+ }
+
+ if (func_80840A30(play, this, &this->linearVelocity, 0.0f)) {
+ return;
+ }
+
+ sp44 = 0.0f;
+
+ if (this->unk_AE8 != 0) {
+ if ((!func_8082DA90(play) && !CHECK_BTN_ALL(sPlayerControlInput->cur.button, BTN_A)) ||
+ (this->currentBoots != PLAYER_BOOTS_ZORA_LAND)) {
+ this->unk_B86[0] = 1;
+ }
+
+ if (PlayerAnimation_Update(play, &this->skelAnime) && (DECR(this->unk_AE8) == 0)) {
+ if (this->unk_B86[0] != 0) {
+ this->stateFlags3 &= ~PLAYER_STATE3_8000;
+ func_8082DB90(play, this, &gPlayerAnim_pz_swimtowait);
+ } else {
+ func_8082DB60(play, this, &gPlayerAnim_pz_fishswim);
+ }
+ } else {
+ func_80832F78(this, &sp44, &sp40, 0.0f, play);
+ Math_ScaledStepToS(&this->currentYaw, sp40, 0x640);
+
+ if (this->skelAnime.curFrame >= 13.0f) {
+ sp44 = 12.0f;
+
+ if (PlayerAnimation_OnFrame(&this->skelAnime, 13.0f)) {
+ this->unk_B48 = 16.0f;
+ }
+ this->stateFlags3 |= PLAYER_STATE3_8000;
+ } else {
+ sp44 = 0.0f;
+ }
+ }
+
+ Math_SmoothStepToS(&this->unk_B86[1], sPlayerControlInput->rel.stick_x * 0xC8, 0xA, 0x3E8, 0x64);
+ Math_SmoothStepToS(&this->unk_B8E, this->unk_B86[1], IREG(40) + 1, IREG(41), IREG(42));
+ } else if (this->unk_B86[0] == 0) {
+ PlayerAnimation_Update(play, &this->skelAnime);
+
+ if ((!func_8082DA90(play) && !CHECK_BTN_ALL(sPlayerControlInput->cur.button, BTN_A)) ||
+ (this->currentBoots != PLAYER_BOOTS_ZORA_LAND) || (this->windSpeed > 9.0f)) {
+ this->stateFlags3 &= ~PLAYER_STATE3_8000;
+ func_8082DB90(play, this, &gPlayerAnim_pz_swimtowait);
+ this->unk_B86[0] = 1;
+ } else {
+ sp44 = 9.0f;
+ func_800B8F98(&this->actor, NA_SE_PL_ZORA_SWIM_LV - SFX_FLAG);
+ }
+
+ // Y
+ sp3E = sPlayerControlInput->rel.stick_y * 0xC8;
+ if (this->unk_B8C != 0) {
+ this->unk_B8C--;
+ sp3E = CLAMP_MAX(sp3E, (s16)(this->unk_B6C - 0xFA0));
+ }
+
+ if ((this->unk_AAA >= -0x1555) && (this->actor.depthInWater < (this->ageProperties->unk_24 + 10.0f))) {
+ sp3E = CLAMP_MIN(sp3E, 0x7D0);
+ }
+ Math_SmoothStepToS(&this->unk_AAA, sp3E, 4, 0xFA0, 0x190);
+
+ // X
+ sp42 = sPlayerControlInput->rel.stick_x * 0x64;
+ if (Math_ScaledStepToS(&this->unk_B8A, sp42, 0x384) && (sp42 == 0)) {
+ Math_SmoothStepToS(&this->unk_B86[1], 0, 4, 0x5DC, 0x64);
+ Math_SmoothStepToS(&this->unk_B8E, this->unk_B86[1], IREG(44) + 1, IREG(45), IREG(46));
+ } else {
+ sp3C = this->unk_B86[1];
+ sp3A = (this->unk_B8A < 0) ? -0x3A98 : 0x3A98;
+ this->unk_B86[1] += this->unk_B8A;
+ Math_SmoothStepToS(&this->unk_B8E, this->unk_B86[1], IREG(47) + 1, IREG(48), IREG(49));
+
+ if ((ABS_ALT(this->unk_B8A) > 0xFA0) && ((((sp3C + this->unk_B8A) - sp3A) * (sp3C - sp3A)) <= 0)) {
+ Player_PlaySfx(this, NA_SE_PL_ZORA_SWIM_ROLL);
+ }
+ }
+
+ if (D_80862B18 < 20.0f) {
+ func_80850D20(play, this);
+ }
+ } else {
+ Math_SmoothStepToS(&this->unk_B86[1], 0, 4, 0xFA0, 0x190);
+ if ((this->skelAnime.curFrame <= 5.0f) || !func_80850734(play, this)) {
+ if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ func_808353DC(play, this);
+ }
+ }
+
+ Player_ResetCylinder(this);
+ }
+
+ if ((this->unk_B8C < 8) && (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
+ DynaPolyActor* dynaActor;
+
+ if ((this->actor.floorBgId == BGCHECK_SCENE) ||
+ ((dynaActor = DynaPoly_GetActor(&play->colCtx, this->actor.floorBgId)) == NULL) ||
+ (dynaActor->actor.id != ACTOR_EN_TWIG)) {
+ this->unk_AAA += (s16)((-this->unk_B6C - this->unk_AAA) * 2);
+ this->unk_B8C = 0xF;
+ }
+
+ func_80850D20(play, this);
+ Player_PlaySfx(this, NA_SE_PL_BODY_BOUND);
+ }
+
+ func_80850BF8(this, sp44);
+ func_80850BA8(this);
+}
+
+void func_808513EC(Player* this, PlayState* play) {
+ f32 sp34;
+ s16 sp32;
+ s16 sp30;
+ s16 var_v0;
+
+ 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)) {
+ func_808477D0(play, this, sPlayerControlInput, this->linearVelocity);
+ if (func_8082DA90(play)) {
+ sp34 = this->linearVelocity;
+ sp32 = this->actor.shape.rot.y;
+ } else {
+ func_80832F78(this, &sp34, &sp32, 0.0f, play);
+ }
+ sp30 = this->actor.shape.rot.y - sp32;
+ if (!func_80850734(play, this)) {
+ if (func_8082FC24(this) || func_80847ED4(this)) {
+ func_80848048(play, this);
+ } else {
+ if ((sp34 == 0.0f) || (ABS_ALT(sp30) > 0x6000) ||
+ (this->currentBoots >= PLAYER_BOOTS_ZORA_UNDERWATER)) {
+ func_808353DC(play, this);
+ }
+ }
+ func_80847FF8(this, &this->linearVelocity, sp34, sp32);
+ }
+ }
+}
+
+void func_80851588(Player* this, PlayState* play) {
+ f32 sp2C;
+ s16 sp2A;
+
+ func_808477D0(play, this, sPlayerControlInput, this->linearVelocity);
+ func_808475B4(this);
+ func_8082F164(this, BTN_R);
+
+ if (!func_80833058(play, this, D_8085D048, 1) && !func_8083B3B4(play, this, sPlayerControlInput)) {
+ func_80832F78(this, &sp2C, &sp2A, 0.0f, play);
+
+ if (sp2C == 0.0f) {
+ func_808353DC(play, this);
+ } else if (!func_8082FC24(this) && !func_80847ED4(this)) {
+ func_8083B73C(play, this, sp2A);
+ } else {
+ func_80848094(play, this, &sp2C, &sp2A);
+ }
+
+ func_80847FF8(this, &this->linearVelocity, sp2C, sp2A);
+ }
+}
+
+void func_808516B4(Player* this, PlayState* play) {
+ this->stateFlags2 |= PLAYER_STATE2_20;
+
+ this->actor.gravity = 0.0f;
+ func_8083216C(this, play);
+ func_8082F164(this, BTN_R);
+
+ if (func_80838A90(this, play)) {
+ return;
+ }
+
+ if (this->currentBoots >= PLAYER_BOOTS_ZORA_UNDERWATER) {
+ func_808353DC(play, this);
+ } else if (this->unk_AE7 == 0) {
+ f32 temp_fv0;
+
+ if (this->unk_AE8 == 0) {
+ if (PlayerAnimation_Update(play, &this->skelAnime) ||
+ ((this->skelAnime.curFrame >= 22.0f) && !CHECK_BTN_ALL(sPlayerControlInput->cur.button, BTN_A))) {
+ func_8083B798(play, this);
+ } else if (PlayerAnimation_OnFrame(&this->skelAnime, 20.0f)) {
+ this->actor.velocity.y = -2.0f;
+ }
+ func_80832F24(this);
+ } else {
+ 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) &&
+ !(this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) && (this->actor.depthInWater < 120.0f)) {
+ func_808481CC(play, this, -2.0f);
+ } else {
+ this->unk_AE7++;
+ func_8082E634(play, this, &gPlayerAnim_link_swimer_swim_wait);
+ }
+ }
+
+ temp_fv0 = (this->actor.depthInWater - this->ageProperties->unk_30) * 0.04f;
+ if (temp_fv0 < this->actor.velocity.y) {
+ this->actor.velocity.y = temp_fv0;
+ }
+ } else if (this->unk_AE7 == 1) {
+ PlayerAnimation_Update(play, &this->skelAnime);
+ func_808475B4(this);
+ if (this->unk_AAA < 0x2710) {
+ this->unk_AE7++;
+ this->unk_AE8 = this->actor.depthInWater;
+ func_8082E634(play, this, &gPlayerAnim_link_swimer_swim);
+ }
+ } else if (!func_8083B3B4(play, this, sPlayerControlInput)) {
+ f32 var_fv1 = (this->unk_AE8 * 0.018f) + 4.0f;
+
+ if (this->stateFlags1 & PLAYER_STATE1_800) {
+ sPlayerControlInput = NULL;
+ }
+
+ func_808477D0(play, this, sPlayerControlInput, fabsf(this->actor.velocity.y));
+ Math_ScaledStepToS(&this->unk_AAA, -0x2710, 0x320);
+
+ var_fv1 = CLAMP_MAX(var_fv1, 8.0f);
+ func_808481CC(play, this, var_fv1);
+ }
+}
+
+void func_808519FC(Player* this, PlayState* play) {
+ this->stateFlags2 |= PLAYER_STATE2_20;
+
+ func_8082F164(this, BTN_R);
+ if (((this->stateFlags1 & PLAYER_STATE1_400) || (this->skelAnime.curFrame <= 1.0f) || !func_80850734(play, this)) &&
+ PlayerAnimation_Update(play, &this->skelAnime)) {
+ if (!(this->stateFlags1 & PLAYER_STATE1_400) || func_808482E0(play, this)) {
+ func_80848250(play, this);
+ func_808353DC(play, this);
+ func_8082DC64(play, this);
+ }
+ } else {
+ if ((this->stateFlags1 & PLAYER_STATE1_400) && PlayerAnimation_OnFrame(&this->skelAnime, 10.0f)) {
+ func_8082ECE0(this);
+ func_8082DC64(play, this);
+ } else if (PlayerAnimation_OnFrame(&this->skelAnime, 5.0f)) {
+ Player_AnimSfx_PlayVoice(this, NA_SE_VO_LI_BREATH_DRINK);
+ }
+ }
+
+ func_808475B4(this);
+ func_8084748C(this, &this->linearVelocity, 0.0f, this->actor.shape.rot.y);
+}
+
+void func_80851B58(Player* this, PlayState* play) {
+ func_808475B4(this);
+ Math_StepToF(&this->linearVelocity, 0.0f, 0.4f);
+ if (PlayerAnimation_Update(play, &this->skelAnime) && (this->linearVelocity < 10.0f)) {
+ func_808353DC(play, this);
+ }
+}
+
+void func_80851BD4(Player* this, PlayState* play) {
+ func_808475B4(this);
+ if (PlayerAnimation_Update(play, &this->skelAnime) && (this == GET_PLAYER(play))) {
+ func_80840770(play, this);
+ }
+ func_8084748C(this, &this->linearVelocity, 0.0f, this->actor.shape.rot.y);
+}
+
+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))));
+}
+
+// Deku playing the pipes? The loops both overwrite unk_AF0[0].y,z and unk_AF0[1].x,y,z
+void func_80851D30(PlayState* play, Player* this) {
+ f32* var_s0 = &this->unk_AF0[0].y; // TODO: what is going on around here in the struct?
+ Vec3f sp50;
+
+ if (func_80851C40(play, this)) {
+ s32 i;
+
+ if (this->skelAnime.mode != ANIMMODE_LOOP) {
+ func_8082DB60(play, this, D_8085D190[this->transformation]);
+ }
+ func_80124618(D_801C03A0, this->skelAnime.curFrame, &sp50);
+
+ for (i = 0; i < 5; i++) {
+ *var_s0 = sp50.x;
+ var_s0++;
+ }
+ } else if (play->msgCtx.ocarinaMode == 1) {
+ if (play->msgCtx.unk12048 != 0xFF) {
+ var_s0[play->msgCtx.unk12048] = 1.2f;
+ func_8082DB90(play, this, D_8085D190[this->transformation]);
+ } else {
+ s32 i;
+
+ for (i = 0; i < 5; i++) {
+ Math_StepToF(var_s0++, 1.0f, 0.04000001f);
+ }
+ }
+ }
+}
+
+void func_80851EAC(Player* this) {
+ this->unk_B86[0] = -1;
+ this->unk_B86[1] = -1;
+ this->unk_B10[0] = 0.0f;
+}
+
+struct_8085D714 D_8085D714[] = {
+ { 1, &gPlayerAnim_pg_gakkiplayA }, { 1, &gPlayerAnim_pg_gakkiplayL }, { 1, &gPlayerAnim_pg_gakkiplayD },
+ { 0, &gPlayerAnim_pg_gakkiplayU }, { 0, &gPlayerAnim_pg_gakkiplayR },
+};
+
+void func_80851EC8(PlayState* play, Player* this) {
+ struct_8085D714* temp3 = &D_8085D714[play->msgCtx.unk12048];
+ f32* temp2 = &this->unk_B10[play->msgCtx.unk12048];
+ s16* temp_a3 = &this->unk_B86[temp3->unk_0];
+
+ temp_a3[0] = play->msgCtx.unk12048;
+ temp2[0] = 3.0f;
+}
+
+void func_80851F18(PlayState* play, Player* this) {
+ struct_8085D714* temp;
+ f32* temp_v0;
+ s32 i;
+
+ i = this->unk_B86[0];
+ if (i >= 0) {
+ temp = &D_8085D714[i];
+ i = 0;
+ temp_v0 = &this->unk_B10[this->unk_B86[i]];
+
+ AnimationContext_SetLoadFrame(play, temp->unk_4, *temp_v0, this->skelAnime.limbCount,
+ this->skelAnime.morphTable);
+ AnimationContext_SetCopyTrue(play, this->skelAnime.limbCount, this->skelAnime.jointTable,
+ this->skelAnime.morphTable, D_8085BA08);
+ }
+ i = this->unk_B86[1];
+ if (i >= 0) {
+ temp = &D_8085D714[i];
+ i = 1;
+ temp_v0 = &this->unk_B10[this->unk_B86[i]];
+
+ AnimationContext_SetLoadFrame(play, temp->unk_4, *temp_v0, this->skelAnime.limbCount,
+ ALIGN16((uintptr_t)this->blendTableBuffer));
+ AnimationContext_SetCopyTrue(play, this->skelAnime.limbCount, this->skelAnime.jointTable,
+ ALIGN16((uintptr_t)this->blendTableBuffer), D_8085BA20);
+ }
+
+ temp_v0 = this->unk_B10;
+ for (i = 0; i < 5; i++) {
+ *temp_v0 += 1.0f;
+ if (*temp_v0 >= 9.0f) {
+ *temp_v0 = 8.0f;
+ if (this->unk_B86[0] == i) {
+ this->unk_B86[0] = -1;
+ } else if (this->unk_B86[1] == i) {
+ this->unk_B86[1] = -1;
+ }
+ }
+ temp_v0++;
+ }
+}
+
+// Goron playing the drums?
+void func_808521E0(PlayState* play, Player* this) {
+ if (func_80851C40(play, this)) {
+ if (this->skelAnime.animation != &gPlayerAnim_pg_gakkiplay) {
+ func_8082DB60(play, this, &gPlayerAnim_pg_gakkiplay);
+ }
+
+ func_80124618(D_801C0490, this->skelAnime.curFrame, &this->unk_AF0[1]);
+ } else if (play->msgCtx.ocarinaMode == 1) {
+ if (play->msgCtx.unk12048 != 0xFF) {
+ func_80851EC8(play, this);
+ }
+
+ func_80851F18(play, this);
+ }
+}
+
+// Zora playing the guitar?
+void func_80852290(PlayState* play, Player* this) {
+ if (func_80851C40(play, this)) {
+ if (this->skelAnime.mode != ANIMMODE_LOOP) {
+ func_8082DB60(play, this, D_8085D190[this->transformation]);
+ }
+
+ this->unk_B8A = 8;
+ } else {
+ f32 sp3C;
+ s16 var_a1_3;
+ s16 sp38;
+
+ if ((play->msgCtx.ocarinaMode == 1) && (play->msgCtx.unk12048 != 0xFF)) {
+ if ((this->unk_A90 != NULL) && (this->unk_A94 < 0.0f)) {
+ this->unk_A90->flags |= ACTOR_FLAG_20000000;
+ this->unk_A94 = 0.0f;
+ }
+
+ func_8082DB90(play, this, D_8085D190[this->transformation]);
+ this->unk_B8A = 8;
+ }
+
+ sPlayerControlInput = play->state.input;
+ func_800FF3A0(&sp3C, &sp38, sPlayerControlInput);
+
+ if (BINANG_ADD(sp38, 0x4000) < 0) {
+ sp38 -= 0x8000;
+ sp3C = -sp3C;
+ }
+
+ if (sp38 < -0x1F40) {
+ sp38 = -0x1F40;
+ } else if (sp38 > 0x2EE0) {
+ sp38 = 0x2EE0;
+ }
+
+ var_a1_3 = (sp3C * -100.0f);
+ var_a1_3 = CLAMP_MAX(var_a1_3, 0xFA0);
+ Math_SmoothStepToS(&this->upperLimbRot.x, var_a1_3, 4, 0x7D0, 0);
+ Math_SmoothStepToS(&this->upperLimbRot.y, sp38, 4, 0x7D0, 0);
+ this->headLimbRot.x = -this->upperLimbRot.x;
+ this->unk_AA6 |= 0xC8;
+
+ var_a1_3 = ABS_ALT(this->upperLimbRot.x);
+ if (var_a1_3 < 0x7D0) {
+ this->actor.shape.face = 0;
+ } else if (var_a1_3 < 0xFA0) {
+ this->actor.shape.face = 13;
+ } else {
+ this->actor.shape.face = 8;
+ }
+ }
+
+ if (DECR(this->unk_B8A) != 0) {
+ this->unk_B86[0] += (s16)(this->upperLimbRot.x * 2.5f);
+ this->unk_B86[1] += (s16)(this->upperLimbRot.y * 3.0f);
+ } else {
+ this->unk_B86[0] = 0;
+ this->unk_B86[1] = 0;
+ }
+}
+
+void func_8085255C(PlayState* play, Player* this) {
+ if (this->transformation == PLAYER_FORM_DEKU) {
+ func_80851D30(play, this);
+ } else if (this->transformation == PLAYER_FORM_GORON) {
+ func_808521E0(play, this);
+ } else if (this->transformation == PLAYER_FORM_ZORA) {
+ func_80852290(play, this);
+ }
+}
+
+void func_808525C4(PlayState* play, Player* this) {
+ if (this->unk_AE8++ >= 3) {
+ if ((this->transformation == PLAYER_FORM_ZORA) || (this->transformation == PLAYER_FORM_DEKU)) {
+ func_8082E5A8(play, this, D_8085D190[this->transformation]);
+ } else if (this->transformation == PLAYER_FORM_GORON) {
+ func_80851EAC(this);
+ func_8082DB60(play, this, &gPlayerAnim_pg_gakkiwait);
+ } else {
+ func_8082DB60(play, this, D_8085D190[this->transformation]);
+ }
+
+ this->unk_B48 = 1.0f;
+ }
+}
+
+void func_8085269C(Player* this, PlayState* play) {
+ if ((this->unk_AA5 != PLAYER_UNKAA5_4) && ((PlayerAnimation_Update(play, &this->skelAnime) &&
+ (this->skelAnime.animation == D_8085D17C[this->transformation])) ||
+ ((this->skelAnime.mode == 0) && (this->unk_AE8 == 0)))) {
+ func_808525C4(play, this);
+ if (!(this->actor.flags & ACTOR_FLAG_20000000) || (this->unk_A90->id == ACTOR_EN_ZOT)) {
+ func_80152434(play, 1);
+ }
+ } else if (this->unk_AE8 != 0) {
+ if (play->msgCtx.ocarinaMode == 4) {
+ play->interfaceCtx.unk_222 = 0;
+ CutsceneManager_Stop(play->playerCsIds[PLAYER_CS_ID_ITEM_OCARINA]);
+ this->actor.flags &= ~ACTOR_FLAG_20000000;
+
+ if ((this->talkActor != NULL) && (this->talkActor == this->unk_A90) && (this->unk_A94 >= 0.0f)) {
+ Player_TalkWithPlayer(play, this->talkActor);
+ } else if (this->tatlTextId < 0) {
+ this->talkActor = this->tatlActor;
+ this->tatlActor->textId = -this->tatlTextId;
+ Player_TalkWithPlayer(play, this->talkActor);
+ } else if (!func_80838A90(this, play)) {
+ func_80836A5C(this, play);
+ Player_AnimationPlayOnceReverse(play, this, D_8085D17C[this->transformation]);
+ }
+ } else {
+ s32 var_v1 = (play->msgCtx.ocarinaMode >= 0x1C) && (play->msgCtx.ocarinaMode < 0x27);
+ 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 (!func_8082DA90(play)) {
+ if (gSaveContext.save.saveInfo.playerData.deaths == 1) {
+ play->nextEntrance = ENTRANCE(CUTSCENE, 1);
+ } else {
+ play->nextEntrance = ENTRANCE(CUTSCENE, 0);
+ }
+
+ gSaveContext.nextCutsceneIndex = 0xFFF7;
+ play->transitionTrigger = TRANS_TRIGGER_START;
+ }
+ } else {
+ Actor* actor;
+
+ play->interfaceCtx.unk_222 = 0;
+ CutsceneManager_Stop(play->playerCsIds[PLAYER_CS_ID_ITEM_OCARINA]);
+ this->actor.flags &= ~ACTOR_FLAG_20000000;
+
+ actor = Actor_Spawn(&play->actorCtx, play, var_v1 ? ACTOR_EN_TEST7 : ACTOR_EN_TEST6,
+ this->actor.world.pos.x, this->actor.world.pos.y, this->actor.world.pos.z, 0, 0,
+ 0, play->msgCtx.ocarinaMode);
+ if (actor != NULL) {
+ this->stateFlags1 &= ~PLAYER_STATE1_20000000;
+ this->csMode = PLAYER_CSMODE_0;
+ func_8085B28C(play, NULL, PLAYER_CSMODE_19);
+ this->stateFlags1 |= PLAYER_STATE1_10000000 | PLAYER_STATE1_20000000;
+ } else {
+ func_80836A5C(this, play);
+ Player_AnimationPlayOnceReverse(play, this, D_8085D17C[this->transformation]);
+ }
+ }
+ } else if ((play->msgCtx.ocarinaMode == 3) && (play->msgCtx.lastPlayedSong == OCARINA_SONG_ELEGY)) {
+ play->interfaceCtx.unk_222 = 0;
+ CutsceneManager_Stop(play->playerCsIds[PLAYER_CS_ID_ITEM_OCARINA]);
+
+ this->actor.flags &= ~ACTOR_FLAG_20000000;
+ func_80831760(play, this, func_80855A7C, 0);
+ this->stateFlags1 |= PLAYER_STATE1_10000000 | PLAYER_STATE1_20000000;
+ } else if (this->unk_AA5 == PLAYER_UNKAA5_4) {
+ f32 temp_fa0 = this->skelAnime.jointTable[PLAYER_LIMB_ROOT - 1].x;
+ f32 temp_fa1 = this->skelAnime.jointTable[PLAYER_LIMB_ROOT - 1].z;
+ f32 var_fv1;
+
+ var_fv1 = sqrtf(SQ(temp_fa0) + SQ(temp_fa1));
+ if (var_fv1 != 0.0f) {
+ var_fv1 = (var_fv1 - 100.0f) / var_fv1;
+ var_fv1 = CLAMP_MIN(var_fv1, 0.0f);
+ }
+
+ this->skelAnime.jointTable[PLAYER_LIMB_ROOT - 1].x = temp_fa0 * var_fv1;
+ this->skelAnime.jointTable[PLAYER_LIMB_ROOT - 1].z = temp_fa1 * var_fv1;
+ } else {
+ func_8085255C(play, this);
+ }
+ }
+ }
+}
+
+void func_80852B28(Player* this, PlayState* play) {
+ func_80832F24(this);
+
+ if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ func_80836A98(this, &gPlayerAnim_link_normal_light_bom_end, play);
+ } else if (PlayerAnimation_OnFrame(&this->skelAnime, 3.0f)) {
+ if (Actor_Spawn(&play->actorCtx, play, ACTOR_EN_ARROW, this->bodyPartsPos[PLAYER_BODYPART_RIGHT_HAND].x,
+ this->bodyPartsPos[PLAYER_BODYPART_RIGHT_HAND].y,
+ this->bodyPartsPos[PLAYER_BODYPART_RIGHT_HAND].z, 0xFA0, this->actor.shape.rot.y, 0,
+ ARROW_TYPE_DEKU_NUT) != NULL) {
+ Inventory_ChangeAmmo(ITEM_NUT, -1);
+ this->unk_D57 = 4;
+ }
+
+ Player_AnimSfx_PlayVoice(this, NA_SE_VO_LI_SWORD_N);
+ }
+}
+
+AnimSfxEntry D_8085D73C[] = {
+ ANIMSFX(ANIMSFX_TYPE_FLOOR_JUMP, 87, NA_SE_NONE, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_VOICE, 87, NA_SE_VO_LI_CLIMB_END, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_VOICE, 69, NA_SE_VO_LI_AUTO_JUMP, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_FLOOR_LAND, 123, NA_SE_NONE, STOP),
+};
+
+AnimSfxEntry D_8085D74C[] = {
+ ANIMSFX(ANIMSFX_TYPE_VOICE, 13, NA_SE_VO_LI_AUTO_JUMP, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_FLOOR_JUMP, 13, NA_SE_NONE, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_FLOOR_LAND, 73, NA_SE_NONE, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_FLOOR_LAND, 120, NA_SE_NONE, STOP),
+};
+
+void func_80852C04(Player* this, PlayState* play) {
+ func_8083249C(this);
+
+ if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ if (this->unk_AE8 != 0) {
+ if (this->unk_AE8 > 1) {
+ this->unk_AE8--;
+ }
+
+ if (func_808482E0(play, this) && (this->unk_AE8 == 1)) {
+ Player_SetModels(this, Player_ActionToModelGroup(this, this->itemAction));
+
+ if ((this->getItemDrawIdPlusOne == GID_REMAINS_ODOLWA + 1) ||
+ (this->getItemDrawIdPlusOne == GID_REMAINS_GOHT + 1) ||
+ (this->getItemDrawIdPlusOne == GID_REMAINS_GYORG + 1) ||
+ (this->getItemDrawIdPlusOne == GID_REMAINS_TWINMOLD + 1)) {
+ Player_StopCutscene(this);
+ func_80848250(play, this);
+ this->stateFlags1 &= ~PLAYER_STATE1_20000000;
+ func_8085B28C(play, NULL, PLAYER_CSMODE_93);
+ } else {
+ s32 var_a2 = ((this->talkActor != NULL) && (this->exchangeItemId <= PLAYER_IA_MINUS1)) ||
+ (this->stateFlags3 & PLAYER_STATE3_20);
+
+ if (var_a2 || (gSaveContext.healthAccumulator == 0)) {
+ Player_StopCutscene(this);
+ if (var_a2) {
+ func_80848250(play, this);
+ this->exchangeItemId = PLAYER_IA_NONE;
+ if (!func_80847994(play, this)) {
+ Player_TalkWithPlayer(play, this->talkActor);
+ }
+ } else {
+ func_80848294(play, this);
+ }
+ }
+ }
+ }
+ } else {
+ func_8082E794(this);
+
+ if ((this->getItemId == GI_STRAY_FAIRY) || (this->getItemId == GI_SKULL_TOKEN) ||
+ (this->getItemId == GI_ICE_TRAP)) {
+ Player_StopCutscene(this);
+ this->stateFlags1 &= ~(PLAYER_STATE1_400 | PLAYER_STATE1_800);
+ if (this->getItemId == GI_STRAY_FAIRY) {
+ func_80839E74(this, play);
+ } else {
+ this->actor.colChkInfo.damage = 0;
+ func_80833B18(play, this, 3, 0.0f, 0.0f, 0, 20);
+ }
+ } else {
+ if (this->skelAnime.animation == &gPlayerAnim_link_normal_box_kick) {
+ func_8082DB90(play, this,
+ (this->transformation == PLAYER_FORM_DEKU) ? &gPlayerAnim_pn_getB
+ : &gPlayerAnim_link_demo_get_itemB);
+ } else {
+ func_8082DB90(play, this,
+ (this->transformation == PLAYER_FORM_DEKU) ? &gPlayerAnim_pn_getA
+ : &gPlayerAnim_link_demo_get_itemA);
+ }
+
+ func_8082E920(play, this,
+ ANIM_FLAG_1 | ANIM_FLAG_UPDATE_Y | ANIM_FLAG_4 | ANIM_FLAG_8 | ANIM_FLAG_NOMOVE |
+ ANIM_FLAG_80);
+ Player_StopCutscene(this);
+ this->csId = play->playerCsIds[PLAYER_CS_ID_ITEM_GET];
+ this->unk_AE8 = 2;
+ }
+ }
+ } else if (this->unk_AE8 == 0) {
+ if (this->transformation == PLAYER_FORM_HUMAN) {
+ Player_PlayAnimSfx(this, D_8085D73C);
+ } else if (this->transformation == PLAYER_FORM_DEKU) {
+ Player_PlayAnimSfx(this, D_8085D74C);
+ }
+ } 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);
+ } else if ((this->skelAnime.animation == &gPlayerAnim_pn_getA) &&
+ PlayerAnimation_OnFrame(&this->skelAnime, 10.0f)) {
+ Player_AnimSfx_PlayFloorLand(this);
+ }
+
+ if (PlayerAnimation_OnFrame(&this->skelAnime, 21.0f)) {
+ func_8082ECE0(this);
+ }
+ }
+}
+
+AnimSfxEntry D_8085D75C[] = {
+ ANIMSFX(ANIMSFX_TYPE_VOICE, 5, NA_SE_VO_LI_AUTO_JUMP, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_FLOOR_LAND, 15, NA_SE_NONE, STOP),
+};
+
+void func_80852FD4(Player* this, PlayState* play) {
+ if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ if (this->unk_AE7 == 0) {
+ if (DECR(this->unk_AE8) == 0) {
+ this->unk_AE7 = 1;
+ this->skelAnime.endFrame = this->skelAnime.animLength - 1.0f;
+ }
+ } else {
+ func_80839E74(this, play);
+ }
+ } else if ((this->transformation == PLAYER_FORM_FIERCE_DEITY) &&
+ PlayerAnimation_OnFrame(&this->skelAnime, 158.0f)) {
+ Player_AnimSfx_PlayVoice(this, NA_SE_VO_LI_SWORD_N);
+ } else if (this->transformation != PLAYER_FORM_FIERCE_DEITY) {
+ Player_PlayAnimSfx(this, D_8085D75C);
+ } else {
+ func_808484CC(this);
+ }
+}
+
+Vec3f D_8085D764 = { 0.0f, 24.0f, 19.0f };
+Vec3f D_8085D770 = { 0.0f, 0.0f, 2.0f };
+Vec3f D_8085D77C = { 0.0f, 0.0f, -0.2f };
+
+Color_RGBA8 D_8085D788 = { 255, 255, 255, 255 };
+Color_RGBA8 D_8085D78C = { 255, 255, 255, 255 };
+
+void func_808530E0(PlayState* play, Player* this) {
+ Vec3f pos;
+ Vec3f velocity;
+ Vec3f accel;
+
+ Player_TranslateAndRotateY(this, &this->actor.world.pos, &D_8085D764, &pos);
+ Player_TranslateAndRotateY(this, &gZeroVec3f, &D_8085D770, &velocity);
+ Player_TranslateAndRotateY(this, &gZeroVec3f, &D_8085D77C, &accel);
+ func_800B0EB0(play, &pos, &velocity, &accel, &D_8085D788, &D_8085D78C, 40, 10, 10);
+}
+
+u8 D_8085D790[] = {
+ 1, // PLAYER_IA_BOTTLE_POTION_RED
+ 1 | 2, // PLAYER_IA_BOTTLE_POTION_BLUE
+ 2, // PLAYER_IA_BOTTLE_POTION_GREEN
+ 4, // PLAYER_IA_BOTTLE_MILK
+ 4, // PLAYER_IA_BOTTLE_MILK_HALF
+ 1 | 2, // PLAYER_IA_BOTTLE_CHATEAU
+};
+
+void func_80853194(Player* this, PlayState* play) {
+ func_808323C0(this, play->playerCsIds[PLAYER_CS_ID_ITEM_BOTTLE]);
+
+ if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ if (this->unk_AE8 == 0) {
+ if (this->itemAction == PLAYER_IA_BOTTLE_POE) {
+ s32 health = Rand_S16Offset(-1, 3);
+
+ if (health == 0) {
+ health = 3;
+ }
+ if ((health < 0) && (gSaveContext.save.saveInfo.playerData.health <= 0x10)) {
+ health = 3;
+ }
+
+ if (health < 0) {
+ Health_ChangeBy(play, -0x10);
+ } else {
+ gSaveContext.healthAccumulator = health * 0x10;
+ }
+ } else {
+ s32 temp_v1 = D_8085D790[this->itemAction - PLAYER_IA_BOTTLE_POTION_RED];
+
+ if (temp_v1 & 1) {
+ gSaveContext.healthAccumulator = 0x140;
+ }
+ if (temp_v1 & 2) {
+ Magic_Add(play, MAGIC_FILL_TO_CAPACITY);
+ }
+ if (temp_v1 & 4) {
+ gSaveContext.healthAccumulator = 0x50;
+ }
+
+ if (this->itemAction == PLAYER_IA_BOTTLE_CHATEAU) {
+ SET_WEEKEVENTREG(WEEKEVENTREG_DRANK_CHATEAU_ROMANI);
+ }
+
+ gSaveContext.jinxTimer = 0;
+ }
+
+ func_8082DB60(play, this,
+ (this->transformation == PLAYER_FORM_DEKU) ? &gPlayerAnim_pn_drink
+ : &gPlayerAnim_link_bottle_drink_demo_wait);
+ this->unk_AE8 = 1;
+
+ //! FAKE
+ dummy_label_235515:;
+ } else if (this->unk_AE8 < 0) {
+ this->unk_AE8++;
+ if (this->unk_AE8 == 0) {
+ this->unk_AE8 = 3;
+ this->skelAnime.endFrame = this->skelAnime.animLength - 1.0f;
+ } else if (this->unk_AE8 == -6) {
+ func_808530E0(play, this);
+ }
+ } else {
+ Player_StopCutscene(this);
+ func_80839E74(this, play);
+ }
+ } else if (this->unk_AE8 == 1) {
+ if ((gSaveContext.healthAccumulator == 0) && (gSaveContext.magicState != MAGIC_STATE_FILL)) {
+ if (this->transformation == PLAYER_FORM_DEKU) {
+ PlayerAnimation_Change(play, &this->skelAnime, &gPlayerAnim_pn_drinkend, 2.0f / 3.0f, 0.0f, 5.0f, 2,
+ -6.0f);
+ this->unk_AE8 = -7;
+ } else {
+ func_8082E4A4(play, this, &gPlayerAnim_link_bottle_drink_demo_end);
+ this->unk_AE8 = 2;
+ }
+
+ Player_UpdateBottleHeld(play, this,
+ (this->itemAction == PLAYER_IA_BOTTLE_MILK) ? ITEM_MILK_HALF : ITEM_BOTTLE,
+ PLAYER_IA_BOTTLE_EMPTY);
+ }
+
+ Player_AnimSfx_PlayVoice(this, NA_SE_VO_LI_DRINK - SFX_FLAG);
+ } else if ((this->unk_AE8 == 2) && PlayerAnimation_OnFrame(&this->skelAnime, 29.0f)) {
+ Player_AnimSfx_PlayVoice(this, NA_SE_VO_LI_BREATH_DRINK);
+ }
+}
+
+struct_8085D798 D_8085D798[] = {
+ { ACTOR_EN_ELF, 2, ITEM_FAIRY, PLAYER_IA_BOTTLE_FAIRY, 0x5E },
+ { ACTOR_EN_FISH, -1, ITEM_FISH, PLAYER_IA_BOTTLE_FISH, 0x62 },
+ { ACTOR_EN_INSECT, -1, ITEM_BUG, PLAYER_IA_BOTTLE_BUG, 0x63 },
+ { ACTOR_EN_MUSHI2, -1, ITEM_BUG, PLAYER_IA_BOTTLE_BUG, 0x63 },
+ { ACTOR_EN_TEST5, 0, ITEM_SPRING_WATER, PLAYER_IA_BOTTLE_SPRING_WATER, 0x67 },
+ { ACTOR_EN_TEST5, 1, ITEM_HOT_SPRING_WATER, PLAYER_IA_BOTTLE_HOT_SPRING_WATER, 0x68 },
+ { ACTOR_BG_GORON_OYU, -1, ITEM_HOT_SPRING_WATER, PLAYER_IA_BOTTLE_HOT_SPRING_WATER, 0x68 },
+ { ACTOR_EN_ZORAEGG, -1, ITEM_ZORA_EGG, PLAYER_IA_BOTTLE_ZORA_EGG, 0x69 },
+ { ACTOR_EN_DNP, -1, ITEM_DEKU_PRINCESS, PLAYER_IA_BOTTLE_DEKU_PRINCESS, 0x5F },
+ { ACTOR_EN_OT, -1, ITEM_SEAHORSE, PLAYER_IA_BOTTLE_SEAHORSE, 0x6E },
+ { ACTOR_OBJ_KINOKO, -1, ITEM_MUSHROOM, PLAYER_IA_BOTTLE_SEAHORSE, 0x6B },
+ { ACTOR_EN_POH, -1, ITEM_POE, PLAYER_IA_BOTTLE_POE, 0x65 },
+ { ACTOR_EN_BIGPO, -1, ITEM_BIG_POE, PLAYER_IA_BOTTLE_BIG_POE, 0x66 },
+ { ACTOR_EN_ELF, 6, ITEM_FAIRY, PLAYER_IA_BOTTLE_FAIRY, 0x5E },
+};
+
+void func_808534C0(Player* this, PlayState* play) {
+ struct_8085D200* sp24 = &D_8085D200[this->unk_AE8];
+
+ func_80832F24(this);
+
+ if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ if (this->unk_AE7 != 0) {
+ func_808323C0(this, play->playerCsIds[PLAYER_CS_ID_ITEM_SHOW]);
+
+ if (this->unk_AE8 == 0) {
+ Message_StartTextbox(play, D_8085D798[this->unk_AE7 - 1].textId, &this->actor);
+
+ Audio_PlayFanfare(NA_BGM_GET_ITEM | 0x900);
+ this->unk_AE8 = 1;
+ } else if (Message_GetState(&play->msgCtx) == TEXT_STATE_CLOSING) {
+ Actor* talkActor;
+
+ this->unk_AE7 = 0;
+ Player_StopCutscene(this);
+ func_800E0238(Play_GetCamera(play, CAM_ID_MAIN));
+
+ talkActor = this->talkActor;
+ if ((talkActor != NULL) && (this->exchangeItemId <= PLAYER_IA_MINUS1)) {
+ Player_TalkWithPlayer(play, talkActor);
+ }
+ }
+ } else {
+ func_80839E74(this, play);
+ }
+ } else {
+ if (this->unk_AE7 == 0) {
+ s32 temp_ft5 = this->skelAnime.curFrame - sp24->unk_8;
+
+ if ((temp_ft5 >= 0) && (sp24->unk_9 >= temp_ft5)) {
+ if ((this->unk_AE8 != 0) && (temp_ft5 == 0)) {
+ Player_PlaySfx(this, NA_SE_IT_SCOOP_UP_WATER);
+ }
+
+ if (func_8012364C(play, this, this->heldItemButton) == ITEM_BOTTLE) {
+ Actor* interactRangeActor = this->interactRangeActor;
+
+ if (interactRangeActor != NULL) {
+ struct_8085D798* entry = D_8085D798;
+ s32 i;
+
+ for (i = 0; i < ARRAY_COUNT(D_8085D798); i++) {
+ if (((interactRangeActor->id == entry->actorId) &&
+ ((entry->actorParams < 0) || (interactRangeActor->params == entry->actorParams)))) {
+ break;
+ }
+ entry++;
+ }
+
+ if (i < ARRAY_COUNT(D_8085D798)) {
+ this->unk_AE7 = i + 1;
+ this->unk_AE8 = 0;
+ this->stateFlags1 |= PLAYER_STATE1_10000000 | PLAYER_STATE1_20000000;
+ interactRangeActor->parent = &this->actor;
+ Player_UpdateBottleHeld(play, this, entry->itemId, entry->itemAction);
+ func_8082DB90(play, this, sp24->unk_4);
+ }
+ }
+ }
+ }
+ }
+
+ if (this->skelAnime.curFrame <= 7.0f) {
+ this->stateFlags3 |= PLAYER_STATE3_800;
+ }
+ }
+}
+
+Vec3f D_8085D7EC = { 0.0f, 0.0f, 5.0f };
+
+void func_80853754(Player* this, PlayState* play) {
+ func_808323C0(this, play->playerCsIds[PLAYER_CS_ID_ITEM_BOTTLE]);
+
+ if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ Player_StopCutscene(this);
+ func_80839E74(this, play);
+ } else if (PlayerAnimation_OnFrame(&this->skelAnime, 37.0f)) {
+ s32 sp2C = 8;
+
+ Player_PlaySfx(this, NA_SE_EV_BOTTLE_CAP_OPEN);
+ Player_AnimSfx_PlayVoice(this, NA_SE_VO_LI_AUTO_JUMP);
+ if (this->itemAction == PLAYER_IA_BOTTLE_FAIRY) {
+ Player_UpdateBottleHeld(play, this, ITEM_BOTTLE, PLAYER_IA_BOTTLE_EMPTY);
+ Player_PlaySfx(this, NA_SE_EV_FIATY_HEAL - SFX_FLAG);
+ sp2C = 1;
+ }
+
+ Player_SpawnFairy(play, this, &this->leftHandWorld.pos, &D_8085D7EC, sp2C);
+ }
+}
+
+void func_80853850(Player* this, PlayState* play) {
+ static Vec3f D_8085D7F8 = { 10.0f, 268 * 0.1f, 30.0f };
+ static s8 D_8085D804[PLAYER_FORM_MAX] = {
+ 0x2D, // PLAYER_FORM_FIERCE_DEITY
+ 0x4B, // PLAYER_FORM_GORON
+ 0x37, // PLAYER_FORM_ZORA
+ 0x23, // PLAYER_FORM_DEKU
+ 0x28, // PLAYER_FORM_HUMAN
+ };
+ static struct_8085D80C D_8085D80C[] = {
+ { ACTOR_EN_FISH, 0 }, // PLAYER_BOTTLE_FISH
+ { ACTOR_OBJ_AQUA, 0 }, // PLAYER_BOTTLE_SPRING_WATER
+ { ACTOR_OBJ_AQUA, 1 }, // PLAYER_BOTTLE_HOT_SPRING_WATER
+ { ACTOR_EN_ZORAEGG, 0x11 }, // PLAYER_BOTTLE_ZORA_EGG
+ { ACTOR_EN_DNP, 1 }, // PLAYER_BOTTLE_DEKU_PRINCESS
+ { ACTOR_EN_MUSHI2, 0 }, // PLAYER_BOTTLE_GOLD_DUST
+ { ACTOR_EN_MUSHI2, 0 }, // PLAYER_BOTTLE_1C
+ { ACTOR_EN_OT, 0x8000 }, // PLAYER_BOTTLE_SEAHORSE
+ { ACTOR_EN_MUSHI2, 0 }, // PLAYER_BOTTLE_MUSHROOM
+ { ACTOR_EN_MUSHI2, 0 }, // PLAYER_BOTTLE_HYLIAN_LOACH
+ { ACTOR_EN_MUSHI2, 0 }, // PLAYER_BOTTLE_BUG
+ };
+ static AnimSfxEntry D_8085D838[] = {
+ ANIMSFX(ANIMSFX_TYPE_VOICE, 38, NA_SE_VO_LI_AUTO_JUMP, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 40, NA_SE_EV_BOTTLE_CAP_OPEN, STOP),
+ };
+
+ CollisionPoly* sp6C;
+ s32 sp68;
+ Vec3f sp5C;
+ f32 temp_fa0;
+ f32 temp_fv0;
+ f32 temp_fv1;
+ struct_8085D80C* sp4C;
+
+ D_8085D7F8.z = D_8085D804[this->transformation];
+ if (func_80835D58(play, this, &D_8085D7F8, &sp6C, &sp68, &sp5C)) {
+ temp_fv1 = this->actor.world.pos.x - sp5C.x;
+ temp_fa0 = this->actor.world.pos.z - sp5C.z;
+ temp_fv0 = sqrtf(SQ(temp_fv1) + SQ(temp_fa0));
+
+ if (temp_fv0 != 0.0f) {
+ temp_fv0 = 3.0f / temp_fv0;
+
+ this->actor.world.pos.x = this->actor.world.pos.x + (temp_fv1 * temp_fv0);
+ this->actor.world.pos.z = this->actor.world.pos.z + (temp_fa0 * temp_fv0);
+ }
+ }
+
+ func_80832F24(this);
+ func_8083249C(this);
+
+ if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ Player_StopCutscene(this);
+ if (!func_80838A90(this, play)) {
+ func_80839E74(this, play);
+ }
+ } else if (PlayerAnimation_OnFrame(&this->skelAnime, 76.0f)) {
+ sp4C = &D_8085D80C[GET_BOTTLE_FROM_IA(this->itemAction) - 1];
+
+ Actor_Spawn(&play->actorCtx, play, sp4C->actorId,
+ (Math_SinS(this->actor.shape.rot.y) * 5.0f) + this->leftHandWorld.pos.x, this->leftHandWorld.pos.y,
+ (Math_CosS(this->actor.shape.rot.y) * 5.0f) + this->leftHandWorld.pos.z, 0x4000,
+ this->actor.shape.rot.y, 0, sp4C->params);
+ Player_UpdateBottleHeld(play, this, ITEM_BOTTLE, PLAYER_IA_BOTTLE_EMPTY);
+ } else {
+ Player_PlayAnimSfx(this, D_8085D838);
+ }
+}
+
+AnimSfxEntry D_8085D840[] = {
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 30, NA_SE_PL_PUT_OUT_ITEM, STOP),
+};
+
+void func_80853A5C(Player* this, PlayState* play) {
+ this->stateFlags2 |= PLAYER_STATE2_20;
+ this->stateFlags3 |= PLAYER_STATE3_4000000;
+
+ func_8083249C(this);
+
+ if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ if (this->exchangeItemId == PLAYER_IA_NONE) {
+ Actor* talkActor = this->talkActor;
+
+ Player_StopCutscene(this);
+ this->getItemDrawIdPlusOne = GID_NONE + 1;
+
+ if ((talkActor->textId != 0) && (talkActor->textId != 0xFFFF)) {
+ this->actor.flags |= ACTOR_FLAG_TALK_REQUESTED;
+ }
+ Player_TalkWithPlayer(play, talkActor);
+ } else {
+ GetItemEntry* giEntry = &sGetItemTable[D_8085D1A4[this->exchangeItemId] - 1];
+
+ if (Player_BottleFromIA(this, this->itemAction) <= PLAYER_BOTTLE_NONE) {
+ this->getItemDrawIdPlusOne = ABS_ALT(giEntry->gid);
+ }
+
+ if (this->unk_AE8 == 0) {
+ if ((this->actor.textId != 0) && (this->actor.textId != 0xFFFF)) {
+ Message_StartTextbox(play, this->actor.textId, &this->actor);
+ }
+
+ this->unk_AE8 = 1;
+ } else if (Message_GetState(&play->msgCtx) == TEXT_STATE_CLOSING) {
+ Player_StopCutscene(this);
+ this->getItemDrawIdPlusOne = GID_NONE + 1;
+ this->actor.flags &= ~ACTOR_FLAG_TALK_REQUESTED;
+ func_80839E74(this, play);
+ this->unk_B5E = 0xA;
+ }
+ }
+ } else if (this->unk_AE8 >= 0) {
+ if ((Player_BottleFromIA(this, this->itemAction) > PLAYER_BOTTLE_NONE) &&
+ PlayerAnimation_OnFrame(&this->skelAnime, 36.0f)) {
+ Player_SetModels(this, PLAYER_MODELGROUP_BOTTLE);
+ } else if (PlayerAnimation_OnFrame(&this->skelAnime, 2.0f)) {
+ GetItemEntry* giEntry = &sGetItemTable[D_8085D1A4[this->itemAction] - 1];
+
+ func_80838830(this, giEntry->objectId);
+ }
+ Player_PlayAnimSfx(this, D_8085D840);
+ }
+
+ if ((this->unk_AE7 == 0) && (this->targetedActor != NULL)) {
+ this->currentYaw = func_8083C62C(this, 0);
+ this->actor.shape.rot.y = this->currentYaw;
+ }
+}
+
+void func_80853CC0(Player* this, PlayState* play) {
+ this->stateFlags2 |= (PLAYER_STATE2_20 | PLAYER_STATE2_40);
+
+ if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ Player_AnimationPlayLoop(play, this, &gPlayerAnim_link_normal_re_dead_attack_wait);
+ }
+
+ if (play->sceneId != SCENE_SEA_BS) {
+ func_8082F164(this, BTN_R);
+ }
+
+ if (func_8082DE88(this, 0, 0x64)) {
+ func_80836988(this, play);
+ this->stateFlags2 &= ~PLAYER_STATE2_80;
+ }
+}
+
+void func_80853D68(Player* this, PlayState* play) {
+ CollisionPoly* floorPoly;
+ f32 var_fv0;
+ f32 temp_fv1;
+ f32 var_fa0;
+ s16 downwardSlopeYaw;
+ s16 var_v0;
+ Vec3f slopeNormal;
+
+ this->stateFlags2 |= (PLAYER_STATE2_20 | PLAYER_STATE2_40);
+ PlayerAnimation_Update(play, &this->skelAnime);
+ func_8083FBC4(play, this);
+ func_8019F780(&this->actor.projectedPos, Player_GetFloorSfx(this, NA_SE_PL_SLIP_LEVEL - SFX_FLAG),
+ this->actor.speed);
+
+ if (func_80838A90(this, play)) {
+ return;
+ }
+
+ if ((this->transformation == PLAYER_FORM_GORON) && func_8083A114(this, play)) {
+ return;
+ }
+
+ floorPoly = this->actor.floorPoly;
+ if (floorPoly == NULL) {
+ func_80833AA0(this, play);
+ return;
+ }
+
+ Actor_GetSlopeDirection(floorPoly, &slopeNormal, &downwardSlopeYaw);
+ var_v0 = downwardSlopeYaw;
+ if (this->unk_AE7 != 0) {
+ var_v0 = downwardSlopeYaw + 0x8000;
+ }
+ if (this->linearVelocity < 0.0f) {
+ downwardSlopeYaw += 0x8000;
+ }
+
+ var_fv0 = (1.0f - slopeNormal.y) * 40.0f;
+ var_fv0 = CLAMP(var_fv0, 0.0f, 10.0f);
+
+ temp_fv1 = var_fv0 * var_fv0 * 0.015f;
+ var_fa0 = slopeNormal.y * 0.01f;
+ if (SurfaceType_GetFloorEffect(&play->colCtx, floorPoly, this->actor.floorBgId) != FLOOR_EFFECT_1) {
+ var_fv0 = 0.0f;
+ var_fa0 = slopeNormal.y * 10.0f;
+ }
+ temp_fv1 = CLAMP_MIN(temp_fv1, 1.0f);
+
+ if (Math_AsymStepToF(&this->linearVelocity, var_fv0, temp_fv1, var_fa0) && (var_fv0 == 0.0f)) {
+ func_80836A98(this,
+ (this->unk_AE7 == 0) ? D_8085BE84[PLAYER_ANIMGROUP_41][this->modelAnimType]
+ : D_8085BE84[PLAYER_ANIMGROUP_42][this->modelAnimType],
+ play);
+ }
+
+ Math_SmoothStepToS(&this->currentYaw, downwardSlopeYaw, 0xA, 0xFA0, 0x320);
+ Math_ScaledStepToS(&this->actor.shape.rot.y, var_v0, 0x7D0);
+}
+
+void func_80859CE0(PlayState* play, Player* this, s32 arg2);
+
+void func_80854010(Player* this, PlayState* play) {
+ if ((DECR(this->unk_AE8) == 0) && func_808387A0(play, this)) {
+ func_80859CE0(play, this, 0);
+ Player_SetAction(play, this, func_8085B08C, 0);
+ func_8085B08C(this, play);
+ }
+}
+
+void func_808540A0(Player* this, PlayState* play) {
+ Player_SetAction(play, this, func_80854010, 0);
+ this->unk_AE8 = 0x28;
+ Actor_Spawn(&play->actorCtx, play, ACTOR_DEMO_KANKYO, 0.0f, 0.0f, 0.0f, 0, 0, 0, 0x10);
+}
+
+void Player_Cutscene_SetPosAndYawToStart(Player* this, CsCmdActorCue* playerAction);
+
+void func_80854118(Player* this, PlayState* play) {
+ if (D_80862B18 < 150.0f) {
+ if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ if (this->unk_AE8 == 0) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
+ this->skelAnime.endFrame = this->skelAnime.animLength - 1.0f;
+ Player_AnimSfx_PlayFloorLand(this);
+ this->unk_AE8 = 1;
+ }
+ } else {
+ func_8085B384(this, play);
+ }
+ }
+
+ Math_SmoothStepToF(&this->actor.velocity.y, 2.0f, 0.3f, 8.0f, 0.5f);
+ }
+
+ if (play->csCtx.state != CS_STATE_IDLE) {
+ if (play->csCtx.playerCue != NULL) {
+ s32 pad;
+ f32 sp28 = this->actor.world.pos.y;
+
+ Player_Cutscene_SetPosAndYawToStart(this, play->csCtx.playerCue);
+ this->actor.world.pos.y = sp28;
+ }
+ }
+}
+
+void func_8085421C(Player* this, PlayState* play) {
+ if (this->skelAnime.animation == NULL) {
+ this->stateFlags2 |= PLAYER_STATE2_4000;
+ } else {
+ PlayerAnimation_Update(play, &this->skelAnime);
+ if ((this->skelAnime.animation == &gPlayerAnim_link_derth_rebirth) &&
+ PlayerAnimation_OnFrame(&this->skelAnime, 60.0f)) {
+ Player_AnimSfx_PlayFloor(this, NA_SE_PL_BOUND);
+ Player_AnimSfx_PlayVoice(this, NA_SE_VO_LI_DAMAGE_S);
+ }
+ }
+
+ if ((this->unk_AE8++ >= 9) && !func_8082DA90(play)) {
+ if (this->unk_AE7 != 0) {
+ if (this->unk_AE7 < 0) {
+ func_80169FDC(&play->state);
+ } else {
+ func_80169EFC(&play->state);
+ }
+ if (!SurfaceType_IsWallDamage(&play->colCtx, this->actor.floorPoly, this->actor.floorBgId)) {
+ gSaveContext.respawnFlag = -5;
+ }
+
+ play->transitionType = TRANS_TYPE_FADE_BLACK_FAST;
+ play_sound(NA_SE_OC_ABYSS);
+ } else {
+ play->transitionType = TRANS_TYPE_FADE_BLACK;
+ gSaveContext.nextTransitionType = TRANS_TYPE_FADE_BLACK;
+ gSaveContext.seqId = (u8)NA_BGM_DISABLED;
+ gSaveContext.ambienceId = AMBIENCE_ID_DISABLED;
+ }
+
+ play->transitionTrigger = TRANS_TRIGGER_START;
+ }
+}
+
+void func_8085437C(Player* this, PlayState* play) {
+ func_808365DC(this, play);
+}
+
+void func_8085439C(Player* this, PlayState* play) {
+ this->actor.gravity = -1.0f;
+ PlayerAnimation_Update(play, &this->skelAnime);
+
+ if (this->actor.velocity.y < 0.0f) {
+ func_80833AA0(this, play);
+ } else if (this->actor.velocity.y < 6.0f) {
+ Math_StepToF(&this->linearVelocity, 3.0f, 0.5f);
+ }
+}
+
+void func_80854430(Player* this, PlayState* play) {
+ if (play->bButtonAmmoPlusOne < 0) {
+ play->bButtonAmmoPlusOne = 0;
+ func_80839ED0(this, play);
+ } else if (this->unk_AE7 == 0) {
+ if ((play->sceneId != SCENE_20SICHITAI) && CHECK_BTN_ALL(sPlayerControlInput->press.button, BTN_B)) {
+ play->bButtonAmmoPlusOne = 10;
+ func_80847880(play, this);
+ Player_SetAction(play, this, func_80854430, 1);
+ this->unk_AE7 = 1;
+ } else {
+ play->bButtonAmmoPlusOne = 0;
+ func_80847190(play, this, 0);
+
+ if (play->actorCtx.flags & ACTORCTX_FLAG_PICTO_BOX_ON) {
+ this->stateFlags1 |= PLAYER_STATE1_100000;
+ func_8083868C(play, this);
+ } else {
+ this->stateFlags1 &= ~PLAYER_STATE1_100000;
+ if ((play->sceneId == SCENE_20SICHITAI) &&
+ (func_8012364C(play, this, func_8082FDC4()) == ITEM_PICTO_BOX)) {
+ s32 requiredScopeTemp;
+
+ play->actorCtx.flags |= ACTORCTX_FLAG_PICTO_BOX_ON;
+ }
+ }
+ }
+ } else if (CHECK_BTN_ANY(sPlayerControlInput->press.button,
+ BTN_CRIGHT | BTN_CLEFT | BTN_CDOWN | BTN_CUP | BTN_R | BTN_A)) {
+ play->bButtonAmmoPlusOne = -1;
+ func_80854614(this, play);
+ Player_SetAction(play, this, func_80854430, 0);
+ this->unk_AE7 = 0;
+ } else {
+ play->bButtonAmmoPlusOne = 10;
+ func_80854614(this, play);
+ }
+}
+
+void func_80854614(Player* this, PlayState* play) {
+ this->unk_AA5 = PLAYER_UNKAA5_3;
+ func_8083868C(play, this);
+ PlayerAnimation_Update(play, &this->skelAnime);
+ func_8083216C(this, play);
+ this->upperLimbRot.y = func_80847190(play, this, 1) - this->actor.shape.rot.y;
+ this->unk_AA6 |= 0x80;
+
+ if (play->bButtonAmmoPlusOne < 0) {
+ play->bButtonAmmoPlusOne++;
+ if (play->bButtonAmmoPlusOne == 0) {
+ func_80839ED0(this, play);
+ }
+ }
+}
+
+void func_808546D0(Player* this, PlayState* play) {
+ if (this->unk_AE7 >= 0) {
+ if (this->unk_AE7 < 6) {
+ this->unk_AE7++;
+ } else {
+ this->unk_B48 = (this->unk_AE7 >> 1) * 22.0f;
+ if (func_8082DE88(this, 1, 0x64)) {
+ this->unk_AE7 = -1;
+ EffectSsIcePiece_SpawnBurst(play, &this->actor.world.pos, this->actor.scale.x);
+ Player_PlaySfx(this, NA_SE_PL_ICE_BROKEN);
+ }
+
+ if (this->transformation == PLAYER_FORM_ZORA) {
+ func_80834104(play, this);
+ this->skelAnime.animation = NULL;
+ this->unk_AE8 = -0x28;
+ this->unk_AE7 = 1;
+ this->linearVelocity = 0.0f;
+ } else if (play->gameplayFrames % 4 == 0) {
+ Player_InflictDamage(play, -1);
+ }
+ }
+
+ this->stateFlags2 |= PLAYER_STATE2_4000;
+ } else if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ func_80836988(this, play);
+ func_808339B4(this, 20);
+ }
+}
+
+void func_80854800(Player* this, PlayState* play) {
+ PlayerAnimation_Update(play, &this->skelAnime);
+ func_808345A8(this);
+
+ if (((this->unk_AE8 % 25) != 0) || (func_808339D4(play, this, -1) != 0)) {
+ if (DECR(this->unk_AE8) == 0) {
+ func_80836988(this, play);
+ }
+ }
+
+ this->shockTimer = 40;
+ func_800B8F98(&this->actor, this->ageProperties->voiceSfxIdOffset + (NA_SE_VO_LI_TAKEN_AWAY - SFX_FLAG));
+}
+
+void func_808548B8(Player* this, PlayState* play) {
+ AttackAnimInfo* attackInfoEntry = &sMeleeAttackAnimInfo[this->meleeWeaponAnimation];
+
+ if (this->skelAnime.curFrame < (this->skelAnime.endFrame - 6.0f)) {
+ this->stateFlags2 |= PLAYER_STATE2_20;
+ }
+
+ if (func_808401F4(play, this)) {
+ return;
+ }
+
+ if (this->linearVelocity >= 0.0f) {
+ func_8083FCF0(play, this, (this->transformation == PLAYER_FORM_GORON) ? 5.0f : 0.0f, attackInfoEntry->unk_C,
+ attackInfoEntry->unk_D);
+ }
+
+ if ((this->meleeWeaponAnimation == PLAYER_MWA_GORON_PUNCH_LEFT) ||
+ (this->meleeWeaponAnimation == PLAYER_MWA_GORON_PUNCH_RIGHT)) {
+ this->unk_3D0.unk_00 = 3;
+ }
+
+ //! @bug Lunge Storage: If this block is prevented from running at the end of an animation that produces a lunge,
+ //! the prepared lunge will be retained until next time execution passes through here, which usually means the next
+ //! sword slash.
+ if ((this->stateFlags2 & PLAYER_STATE2_40000000) && PlayerAnimation_OnFrame(&this->skelAnime, 0.0f)) {
+ this->linearVelocity = 15.0f;
+ this->stateFlags2 &= ~PLAYER_STATE2_40000000;
+ }
+
+ if (this->linearVelocity > 12.0f) {
+ func_8083FBC4(play, this);
+ }
+
+ Math_StepToF(&this->linearVelocity, 0.0f, 5.0f);
+ func_8083A548(this);
+
+ if (PlayerAnimation_Update(play, &this->skelAnime) ||
+ ((this->meleeWeaponAnimation >= PLAYER_MWA_FLIPSLASH_FINISH) &&
+ (this->meleeWeaponAnimation <= PLAYER_MWA_ZORA_JUMPKICK_FINISH) && (this->skelAnime.curFrame > 2.0f) &&
+ func_808333CC(this))) {
+ D_80862B48 = this->unk_AE8;
+
+ if (!func_80848570(this, play)) {
+ PlayerAnimationHeader* anim = func_80123420(this) ? attackInfoEntry->unk_8 : attackInfoEntry->unk_4;
+
+ func_8082DC38(this);
+
+ if (anim == NULL) {
+ this->skelAnime.moveFlags &= ~8;
+ func_8085B384(this, play);
+ } else {
+ u8 moveFlags = this->skelAnime.moveFlags;
+
+ if (this->transformation == PLAYER_FORM_ZORA) {
+ if (func_8083A580(this, play)) {
+ anim = this->unk_284.animation;
+ }
+ this->unk_ADC = 0;
+ } else if ((anim == &gPlayerAnim_link_fighter_Lpower_jump_kiru_end) &&
+ (this->modelAnimType != PLAYER_ANIMTYPE_3)) {
+ anim = &gPlayerAnim_link_fighter_power_jump_kiru_end;
+ }
+
+ this->skelAnime.moveFlags = 0;
+ Player_SetAction(play, this, func_80849FE0, 1);
+ func_8082EC9C(play, this, anim);
+ this->currentYaw = this->actor.shape.rot.y;
+ this->skelAnime.moveFlags = moveFlags;
+ }
+ this->stateFlags3 |= PLAYER_STATE3_8;
+ }
+ } else if (((this->transformation == PLAYER_FORM_ZORA) &&
+ (this->meleeWeaponAnimation != PLAYER_MWA_ZORA_PUNCH_KICK) &&
+ (this->meleeWeaponAnimation != PLAYER_MWA_ZORA_JUMPKICK_FINISH)) ||
+ ((this->transformation == PLAYER_FORM_GORON) &&
+ (this->meleeWeaponAnimation != PLAYER_MWA_GORON_PUNCH_BUTT))) {
+ this->unk_AE8 |= CHECK_BTN_ALL(sPlayerControlInput->press.button, BTN_B) ? 1 : 0;
+ }
+}
+
+void func_80854C70(Player* this, PlayState* play) {
+ PlayerAnimation_Update(play, &this->skelAnime);
+ func_80832F24(this);
+
+ if (this->skelAnime.curFrame >= 6.0f) {
+ func_80836988(this, play);
+ }
+}
+
+// Array colour interpolation
+// arg0 is the interpolation parameter
+// arg1,5,9 are out colours
+// arg2,6,0xA are first values
+// arg3,7,0xB are second values
+// arg4,8,0xC are subtracted after interpolation
+void func_80854CD0(f32 arg0, s16* arg1, u8* arg2, u8* arg3, u8* arg4, s16* arg5, u8* arg6, u8* arg7, u8* arg8,
+ s16* arg9, u8* argA, u8* argB, u8* argC) {
+ s32 i;
+
+ for (i = 0; i < 3; i++) {
+ *arg1 = ((s32)((*arg2 - *arg3) * arg0) + *arg3) - *arg4;
+ *arg5 = ((s32)((*arg6 - *arg7) * arg0) + *arg7) - *arg8;
+ *arg9 = ((s32)((*argA - *argB) * arg0) + *argB) - *argC;
+
+ arg1++;
+ arg2++;
+ arg3++;
+ arg4++;
+ arg5++;
+ arg6++;
+ arg7++;
+ arg8++;
+ arg9++;
+ argA++;
+ argB++;
+ argC++;
+ }
+}
+
+// Black, probably in-function static
+u8 D_8085D844[] = { 0, 0, 0 };
+
+// arg1 is the colour interpolation parameter
+void func_80854EFC(PlayState* play, f32 arg1, struct_8085D848_unk_00* arg2) {
+ struct_8085D848_unk_00 sp70;
+ struct_8085D848_unk_00* var_t0;
+ struct_8085D848_unk_00* var_v1;
+ u8* var_t3;
+ u8* var_t4;
+ u8* new_var;
+ s32 pad[4];
+
+ new_var = play->envCtx.unk_C4.diffuseColor1;
+ sp70.fogNear = play->envCtx.unk_C4.fogNear;
+ sp70.fogColor[0] = play->envCtx.unk_C4.fogColor[0];
+ sp70.fogColor[1] = play->envCtx.unk_C4.fogColor[1];
+ sp70.fogColor[2] = play->envCtx.unk_C4.fogColor[2];
+ sp70.ambientColor[0] = play->envCtx.unk_C4.ambientColor[0];
+ sp70.ambientColor[1] = play->envCtx.unk_C4.ambientColor[1];
+ sp70.ambientColor[2] = play->envCtx.unk_C4.ambientColor[2];
+
+ if (arg1 <= 1.0f) {
+ arg1 -= 0.0f;
+
+ var_v1 = &arg2[0];
+ var_t0 = &sp70;
+ var_t3 = D_8085D844;
+ var_t4 = new_var;
+ } else if (arg1 <= 2.0f) {
+ arg1 -= 1.0f;
+ var_v1 = &arg2[1];
+ var_t0 = &arg2[0];
+ var_t3 = D_8085D844;
+ var_t4 = D_8085D844;
+
+ } else if (arg1 <= 3.0f) {
+ arg1 -= 2.0f;
+ var_v1 = &arg2[2];
+ var_t0 = &arg2[1];
+ var_t3 = D_8085D844;
+ var_t4 = D_8085D844;
+
+ } else {
+ arg1 -= 3.0f;
+ var_v1 = &sp70;
+ var_t0 = &arg2[2];
+ var_t3 = new_var;
+ var_t4 = D_8085D844;
+ }
+
+ play->envCtx.lightSettings.fogNear =
+ ((s16)((var_v1->fogNear - var_t0->fogNear) * arg1) + var_t0->fogNear) - play->envCtx.unk_C4.fogNear;
+
+ func_80854CD0(arg1, play->envCtx.lightSettings.fogColor, var_v1->fogColor, var_t0->fogColor,
+ play->envCtx.unk_C4.fogColor, play->envCtx.lightSettings.ambientColor, var_v1->ambientColor,
+ var_t0->ambientColor, play->envCtx.unk_C4.ambientColor, play->envCtx.lightSettings.diffuseColor1,
+ var_t3, var_t4, new_var);
+}
+
+struct_8085D848 D_8085D848[] = {
+ {
+ {
+ { 650, { 0, 0, 0 }, { 10, 0, 30 } },
+ { 300, { 200, 200, 255 }, { 0, 0, 0 } },
+ { 600, { 0, 0, 0 }, { 0, 0, 200 } },
+ },
+ {
+ { { -40.0f, 20.0f, -10.0f }, { 120, 200, 255 }, 1000 },
+ { { 0.0f, -10.0f, 0.0f }, { 255, 255, 255 }, 5000 },
+ { { -10.0f, 4.0f, 3.0f }, { 200, 200, 255 }, 5000 },
+ },
+ },
+ {
+ {
+ { 650, { 0, 0, 0 }, { 10, 0, 30 } },
+ { 300, { 200, 200, 255 }, { 0, 0, 0 } },
+ { 600, { 0, 0, 0 }, { 0, 0, 200 } },
+ },
+ {
+ { { 0.0f, 0.0f, 5.0f }, { 155, 255, 255 }, 100 },
+ { { 0.0f, 0.0f, 5.0f }, { 155, 255, 255 }, 100 },
+ { { 0.0f, 0.0f, 5.0f }, { 155, 255, 255 }, 100 },
+ },
+ },
+};
+
+// arg2 is the colour interpolation parameter
+// arg3 both selects the light to use and scales the radius
+// arg4 selects the env fog/colour info
+void func_808550D0(PlayState* play, Player* this, f32 arg2, f32 arg3, s32 arg4) {
+ struct_8085D848* temp_a2 = &D_8085D848[arg4];
+ struct_8085D848_unk_18* lightInit = temp_a2->light;
+ Vec3f pos;
+
+ func_80854EFC(play, arg2, temp_a2->unk_00);
+
+ if (arg3 > 2.0f) {
+ arg3 -= 2.0f;
+ lightInit += 2;
+ } else if (arg3 > 1.0f) {
+ arg3 -= 1.0f;
+ lightInit++;
+ }
+
+ Player_TranslateAndRotateY(this, &this->actor.world.pos, &lightInit->pos, &pos);
+ Lights_PointNoGlowSetInfo(&this->lightInfo, pos.x, pos.y, pos.z, lightInit->color[0], lightInit->color[1],
+ lightInit->color[2], lightInit->radius * arg3);
+}
+
+AnimSfxEntry D_8085D8F0[] = {
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 2, NA_SE_PL_PUT_OUT_ITEM, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 4, NA_SE_IT_SET_TRANSFORM_MASK, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 11, NA_SE_PL_FREEZE_S, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 30, NA_SE_PL_TRANSFORM_VOICE, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 20, NA_SE_IT_TRANSFORM_MASK_BROKEN, STOP),
+};
+
+AnimSfxEntry D_8085D904[] = {
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 8, NA_SE_IT_SET_TRANSFORM_MASK, STOP),
+};
+
+void func_80855218(PlayState* play, Player* this, struct_8085D910** arg2) {
+ if (PlayerAnimation_Update(play, &this->skelAnime) && (this->skelAnime.animation == &gPlayerAnim_cl_setmask)) {
+ func_8082DB60(play, this, &gPlayerAnim_cl_setmaskend);
+ } else if ((this->skelAnime.animation == &gPlayerAnim_cl_setmask) ||
+ (this->skelAnime.animation == &gPlayerAnim_cl_setmaskend)) {
+ if (this->unk_AE7 >= 58) {
+ Math_StepToS(&this->unk_AE8, 255, 50);
+ }
+
+ if (this->unk_AE7 >= 64) {
+ Math_StepToF(&this->unk_B10[2], 0.0f, 0.015f);
+ } else if (this->unk_AE7 >= 0xE) {
+ Math_StepToF(&this->unk_B10[2], 0.3f, 0.3f);
+ }
+
+ if (this->unk_AE7 > 65) {
+ Math_StepToF(&this->unk_B10[3], 0.0f, 0.02f);
+ } else if (this->unk_AE7 >= 0x10) {
+ Math_StepToF(&this->unk_B10[3], -0.1f, 0.1f);
+ }
+
+ if ((R_PLAY_FILL_SCREEN_ON == 0) && (this->skelAnime.animation == &gPlayerAnim_cl_setmask)) {
+ Player_PlayAnimSfx(this, D_8085D8F0);
+ }
+ } else {
+ if (this->unk_AE7 >= 20) {
+ Math_StepToS(&this->unk_AE8, 255, 20);
+ }
+
+ if (R_PLAY_FILL_SCREEN_ON == 0) {
+ Player_PlayAnimSfx(this, D_8085D904);
+ if (this->unk_AE7 == 15) {
+ Player_PlaySfx(this, NA_SE_PL_FACE_CHANGE);
+ }
+ }
+ }
+}
+
+u16 D_8085D908[] = {
+ WEEKEVENTREG_30_80, // PLAYER_FORM_FIERCE_DEITY
+ WEEKEVENTREG_30_20, // PLAYER_FORM_GORON
+ WEEKEVENTREG_30_40, // PLAYER_FORM_ZORA
+ WEEKEVENTREG_30_10, // PLAYER_FORM_DEKU
+};
+struct_8085D910 D_8085D910[] = {
+ { 0x10, 0xA, 0x3B, 0x3F },
+ { 9, 0x32, 0xA, 0xD },
+};
+
+void func_808553F4(Player* this, PlayState* play) {
+ struct_8085D910* sp4C = D_8085D910;
+ s32 sp48 = false;
+
+ func_808323C0(this, play->playerCsIds[PLAYER_CS_ID_MASK_TRANSFORMATION]);
+ sPlayerControlInput = play->state.input;
+
+ Camera_ChangeMode(play->cameraPtrs[play->activeCamId],
+ (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;
+
+ func_80855218(play, this, &sp4C);
+
+ if (this->unk_AE7 == 0x14) {
+ Play_EnableMotionBlurPriority(100);
+ }
+
+ if (R_PLAY_FILL_SCREEN_ON != 0) {
+ R_PLAY_FILL_SCREEN_ALPHA += R_PLAY_FILL_SCREEN_ON;
+ if (R_PLAY_FILL_SCREEN_ALPHA > 255) {
+ R_PLAY_FILL_SCREEN_ALPHA = 255;
+ this->actor.update = func_8012301C;
+ this->actor.draw = NULL;
+ this->unk_AE7 = 0;
+ Play_DisableMotionBlurPriority();
+ SET_WEEKEVENTREG(D_8085D908[gSaveContext.save.playerForm]);
+ }
+ } else if ((this->unk_AE7++ > ((this->transformation == PLAYER_FORM_HUMAN) ? 0x53 : 0x37)) ||
+ ((this->unk_AE7 >= 5) &&
+ (sp48 = ((this->transformation != PLAYER_FORM_HUMAN) ||
+ CHECK_WEEKEVENTREG(D_8085D908[gSaveContext.save.playerForm])) &&
+ CHECK_BTN_ANY(sPlayerControlInput->press.button,
+ BTN_CRIGHT | BTN_CLEFT | BTN_CDOWN | BTN_CUP | BTN_B | BTN_A)))) {
+ R_PLAY_FILL_SCREEN_ON = 45;
+ R_PLAY_FILL_SCREEN_R = 220;
+ R_PLAY_FILL_SCREEN_G = 220;
+ R_PLAY_FILL_SCREEN_B = 220;
+ R_PLAY_FILL_SCREEN_ALPHA = 0;
+
+ if (sp48) {
+ if (CutsceneManager_GetCurrentCsId() == this->csId) {
+ func_800E0348(Play_GetCamera(play, CutsceneManager_GetCurrentSubCamId(this->csId)));
+ }
+
+ if (this->transformation == PLAYER_FORM_HUMAN) {
+ AudioSfx_StopById(NA_SE_PL_TRANSFORM_VOICE);
+ AudioSfx_StopById(NA_SE_IT_TRANSFORM_MASK_BROKEN);
+ } else {
+ AudioSfx_StopById(NA_SE_PL_FACE_CHANGE);
+ }
+ }
+
+ Player_PlaySfx(this, NA_SE_SY_TRANSFORM_MASK_FLASH);
+ }
+
+ if (this->unk_AE7 >= sp4C->unk_0) {
+ if (this->unk_AE7 < sp4C->unk_2) {
+ Math_StepToF(&this->unk_B10[4], 1.0f, sp4C->unk_1 / 100.0f);
+ } else if (this->unk_AE7 < sp4C->unk_3) {
+ if (this->unk_AE7 == sp4C->unk_2) {
+ func_801000CC(NA_SE_EV_LIGHTNING_HARD);
+ }
+
+ Math_StepToF(&this->unk_B10[4], 2.0f, 0.5f);
+ } else {
+ Math_StepToF(&this->unk_B10[4], 3.0f, 0.2f);
+ }
+ }
+
+ if (this->unk_AE7 >= 0x10) {
+ if (this->unk_AE7 < 0x40) {
+ Math_StepToF(&this->unk_B10[5], 1.0f, 0.2f);
+ } else if (this->unk_AE7 < 0x37) {
+ Math_StepToF(&this->unk_B10[5], 2.0f, 1.0f);
+ } else {
+ Math_StepToF(&this->unk_B10[5], 3.0f, 0.55f);
+ }
+ }
+
+ func_808550D0(play, this, this->unk_B10[4], this->unk_B10[5], (this->transformation == PLAYER_FORM_HUMAN) ? 0 : 1);
+}
+
+void func_80855818(Player* this, PlayState* play) {
+ Camera_ChangeMode(play->cameraPtrs[play->activeCamId],
+ (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;
+ if (R_PLAY_FILL_SCREEN_ALPHA < 0) {
+ R_PLAY_FILL_SCREEN_ON = 0;
+ R_PLAY_FILL_SCREEN_ALPHA = 0;
+ }
+ }
+
+ if (this->unk_AE7++ < 4) {
+ if ((this->prevMask == PLAYER_MASK_NONE) && (this->unk_AE7 == 4)) {
+ PlayerAnimation_Change(play, &this->skelAnime, func_8082ED20(this), 1.0f, 0.0f, 20.0f, ANIMMODE_ONCE,
+ 20.0f);
+ }
+ } else {
+ s32 pad;
+ f32 dist;
+ s16 angle;
+
+ func_800FF3A0(&dist, &angle, play->state.input);
+ if (PlayerAnimation_Update(play, &this->skelAnime) || ((this->unk_AE7 > 10) && (dist != 0.0f))) {
+ if (R_PLAY_FILL_SCREEN_ON == 0) {
+ this->stateFlags1 &= ~PLAYER_STATE1_2;
+ this->prevMask = this->currentMask;
+ this->csId = play->playerCsIds[PLAYER_CS_ID_MASK_TRANSFORMATION];
+ Player_StopCutscene(this);
+ play->envCtx.lightSettings = D_80862B50;
+ func_8085B384(this, play);
+ return;
+ }
+ }
+
+ Math_StepToF(&this->unk_B10[5], 4.0f, 0.2f);
+ }
+
+ func_808550D0(play, this, 0, this->unk_B10[5], (this->prevMask == PLAYER_MASK_NONE) ? 0 : 1);
+}
+
+void func_80855A7C(Player* this, PlayState* play) {
+ if (this->unk_AE8++ > 90) {
+ play->msgCtx.ocarinaMode = 4;
+ func_8085B384(this, play);
+ } else if (this->unk_AE8 == 10) {
+ func_80848640(play, this);
+ }
+}
+
+// Giant's Mask
+void func_80855AF4(Player* this, PlayState* play) {
+ this->stateFlags2 |= PLAYER_STATE2_40;
+
+ func_80855218(play, this, NULL);
+ this->unk_AE7++;
+
+ if (!(this->stateFlags1 & PLAYER_STATE1_100)) {
+ this->prevMask = this->currentMask;
+ gSaveContext.save.equippedMask = this->currentMask = PLAYER_MASK_GIANT;
+ Magic_Consume(play, 0, MAGIC_CONSUME_GIANTS_MASK);
+ this->currentBoots = PLAYER_BOOTS_GIANT;
+ this->prevBoots = PLAYER_BOOTS_GIANT;
+ func_80123140(play, this);
+ func_8085B384(this, play);
+ }
+}
+
+void func_80855B9C(Player* this, PlayState* play) {
+ this->stateFlags2 |= PLAYER_STATE2_40;
+
+ PlayerAnimation_Update(play, &this->skelAnime);
+
+ if (!(this->stateFlags1 & PLAYER_STATE1_100)) {
+ this->prevMask = this->currentMask;
+
+ gSaveContext.save.equippedMask = this->currentMask = PLAYER_MASK_NONE;
+
+ this->currentBoots = PLAYER_BOOTS_HYLIAN;
+ this->prevBoots = PLAYER_BOOTS_HYLIAN;
+ func_80123140(play, this);
+ func_8085B384(this, play);
+ }
+}
+
+void func_80855C28(Player* this, PlayState* play) {
+ s16 sp3E;
+ s32 pad;
+ PlayerAnimationHeader* sp34;
+ s32 var_a0;
+
+ func_808323C0(this, play->playerCsIds[PLAYER_CS_ID_WARP_PAD_MOON]);
+ sp3E = BINANG_SUB(this->actor.shape.rot.y, this->actor.world.rot.y);
+
+ var_a0 = 0;
+ if ((this->actor.floorHeight - this->actor.world.pos.y) < 60.0f) {
+ Math_StepToF(&this->unk_B10[5], 200.0f, 150.0f);
+ var_a0 = Math_StepToS(&this->unk_AE8, 0xFA0, 0x15E);
+ }
+
+ this->actor.shape.rot.y += this->unk_AE8;
+ this->skelAnime.jointTable[PLAYER_LIMB_ROOT - 1].x = 0;
+ this->skelAnime.jointTable[PLAYER_LIMB_ROOT - 1].z = 0;
+ this->unk_ABC += this->unk_B10[5];
+
+ if (this->unk_ABC >= 0.0f) {
+ this->unk_ABC = 0.0f;
+ if ((var_a0 != 0) && (sp3E < 0)) {
+ if (BINANG_SUB(this->actor.shape.rot.y, this->actor.world.rot.y) >= 0) {
+ this->actor.shape.rot.y = this->actor.world.rot.y;
+ Player_StopCutscene(this);
+ if (PLAYER_GET_INITMODE(&this->actor) == PLAYER_INITMODE_8) {
+ sp34 = D_8085D17C[this->transformation];
+ func_80836A5C(this, play);
+ PlayerAnimation_Change(play, &this->skelAnime, sp34, -2.0f / 3.0f, Animation_GetLastFrame(sp34),
+ 0.0f, ANIMMODE_ONCE, -6.0f);
+ } else {
+ func_80839E74(this, play);
+ }
+ }
+ }
+ } else if (this->unk_AE7 == 0) {
+ Player_PlaySfx(this, NA_SE_PL_WARP_PLATE_OUT);
+ this->unk_AE7 = 1;
+ }
+}
+
+void func_80855E08(Player* this, PlayState* play) {
+ this->stateFlags2 |= PLAYER_STATE2_20;
+
+ if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ Player_AnimationPlayLoop(play, this, &gPlayerAnim_link_hook_fly_wait);
+ }
+
+ Math_Vec3f_Sum(&this->actor.world.pos, &this->actor.velocity, &this->actor.world.pos);
+ if (func_80831124(play, this)) {
+ f32 var_fv0;
+
+ Math_Vec3f_Copy(&this->actor.prevPos, &this->actor.world.pos);
+ func_80843178(play, this);
+
+ var_fv0 = this->actor.world.pos.y - this->actor.floorHeight;
+ var_fv0 = CLAMP_MAX(var_fv0, 20.0f);
+
+ this->actor.world.pos.y = this->actor.world.pos.y - var_fv0;
+ this->actor.shape.rot.x = 0;
+ this->linearVelocity = 1.0f;
+ this->actor.velocity.y = 0.0f;
+ this->actor.world.rot.x = this->actor.shape.rot.x;
+ func_80833AA0(this, play);
+ this->stateFlags2 &= ~PLAYER_STATE2_400;
+ this->actor.bgCheckFlags |= BGCHECKFLAG_GROUND;
+ this->stateFlags3 |= PLAYER_STATE3_10000;
+ } else if ((this->skelAnime.animation != &gPlayerAnim_link_hook_fly_start) || (this->skelAnime.curFrame >= 4.0f)) {
+ this->actor.gravity = 0.0f;
+ Math_ScaledStepToS(&this->actor.shape.rot.x, this->actor.world.rot.x, 0x800);
+ Player_RequestRumble(play, this, 100, 2, 100, SQ(0));
+ }
+}
+
+void func_80855F9C(PlayState* play, Player* this) {
+ f32 sp24;
+ s16 sp22;
+
+ this->stateFlags2 |= PLAYER_STATE2_20;
+ func_80832F78(this, &sp24, &sp22, 0.018f, play);
+ Math_ScaledStepToS(&this->currentYaw, sp22, 0x258);
+}
+
+s32 func_80856000(PlayState* play, Player* this) {
+ CollisionPoly* poly;
+ s32 bgId;
+ Vec3f pos;
+ f32 sp28;
+
+ pos.x = this->actor.world.pos.x;
+ pos.y = this->actor.world.pos.y - 20.0f;
+ pos.z = this->actor.world.pos.z;
+ return BgCheck_EntityCheckCeiling(&play->colCtx, &sp28, &pos, 30.0f, &poly, &bgId, &this->actor);
+}
+
+void func_80856074(PlayState* play, Player* this) {
+ if (func_8083F8A8(play, this, 12.0f, 4, 0.0f, 10, 50, true)) {
+ EffectSsHahen_SpawnBurst(play, &this->actor.world.pos, 3.0f, 0, 4, 8, 2, -1, 10, NULL);
+ }
+}
+
+void func_80856110(PlayState* play, Player* this, f32 arg2, f32 arg3, f32 arg4, s16 scale, s16 scaleStep, s16 life) {
+ static Vec3f D_8085D918 = { 0.0f, 0.5f, 0.0f }; // velocity
+ static Vec3f D_8085D924 = { 0.0f, 0.5f, 0.0f }; // accel
+ static Color_RGBA8 D_8085D930 = { 255, 255, 55, 255 }; // primColor
+ static Color_RGBA8 D_8085D934 = { 100, 50, 0, 0 }; // envColor
+ Vec3f pos;
+
+ pos.x = this->actor.world.pos.x;
+ pos.y = this->actor.world.pos.y + arg2;
+ pos.z = this->actor.world.pos.z;
+
+ D_8085D918.y = arg3;
+ D_8085D924.y = arg4;
+
+ func_800B0EB0(play, &pos, &D_8085D918, &D_8085D924, &D_8085D930, &D_8085D934, scale, scaleStep, life);
+}
+
+// Deku Flower related
+void func_808561B0(Player* this, PlayState* play) {
+ DynaPolyActor* dyna;
+ s32 aux = 0xAE;
+ f32 temp_fv0_2;
+ s32 sp38;
+ s32 var_v1;
+
+ PlayerAnimation_Update(play, &this->skelAnime);
+
+ if (func_80838A90(this, play)) {
+ return;
+ }
+
+ if (this->unk_AE7 == 0) {
+ this->unk_ABC += this->unk_B48;
+ if (this->unk_ABC < -1000.0f) {
+ this->unk_ABC = -1000.0f;
+ this->unk_AE7 = 1;
+ this->unk_B48 = 0.0f;
+ }
+ func_80856074(play, this);
+ } else if (this->unk_AE7 == 1) {
+ this->unk_B48 += -22.0f;
+ if (this->unk_B48 < -170.0f) {
+ this->unk_B48 = -170.0f;
+ }
+ this->unk_ABC += this->unk_B48;
+ if (this->unk_ABC < -3900.0f) {
+ this->unk_ABC = -3900.0f;
+ this->unk_AE7 = 2;
+ this->actor.shape.rot.y = Camera_GetInputDirYaw(play->cameraPtrs[play->activeCamId]);
+ this->actor.scale.y = 0.01f;
+ this->currentYaw = this->actor.world.rot.y = this->actor.shape.rot.y;
+ } else {
+ temp_fv0_2 = Math_SinS((1000.0f + this->unk_ABC) * (-30.0f)) * 0.004f;
+ this->actor.scale.y = 0.01f + temp_fv0_2;
+ this->actor.scale.z = this->actor.scale.x = 0.01f - (this->unk_B48 * -0.000015f);
+
+ this->actor.shape.rot.y += (s16)(this->unk_B48 * 130.0f);
+ if (this->actor.floorBgId != BGCHECK_SCENE) {
+ dyna = DynaPoly_GetActor(&play->colCtx, this->actor.floorBgId);
+
+ if (dyna != NULL) {
+ Math_Vec3f_StepToXZ(&this->actor.world.pos, &dyna->actor.world.pos, 1.0f);
+ }
+ }
+ }
+
+ func_80856074(play, this);
+ } else if (this->unk_AE7 == 2) {
+ if (!CHECK_BTN_ALL(sPlayerControlInput->cur.button, BTN_A)) {
+ if (func_80856000(play, this)) {
+ this->unk_AE8 = 0;
+ } else {
+ this->unk_AE7 = 3;
+ if (this->unk_AE8 >= 10) {
+ this->unk_B48 = 2700.0f;
+ } else {
+ this->unk_B48 = 1450.0f;
+ }
+ func_8082E1F0(this, NA_SE_PL_DEKUNUTS_OUT_GRD);
+ }
+ } else if (this->unk_AE8 < 15) {
+ this->unk_AE8++;
+ if (this->unk_AE8 == 10) {
+ func_80856110(play, this, 20.0f, 3.8f, -0.1f, 140, 23, 15);
+ }
+ }
+ func_80855F9C(play, this);
+ } else {
+ this->unk_ABC += this->unk_B48;
+
+ temp_fv0_2 = this->unk_ABC;
+ if (temp_fv0_2 >= 0.0f) {
+ f32 speed;
+
+ sp38 = (this->unk_AE8 >= 10);
+ var_v1 = -1;
+ speed = this->unk_B48 * this->actor.scale.y;
+ if (this->actor.floorBgId != BGCHECK_SCENE) {
+ dyna = DynaPoly_GetActor(&play->colCtx, this->actor.floorBgId);
+ var_v1 = 0;
+ if ((dyna != NULL) && (dyna->actor.id == ACTOR_OBJ_ETCETERA) && (dyna->actor.params & 0x100)) {
+ var_v1 = 1;
+ speed *= aux / 100.0f;
+ }
+ }
+
+ Math_Vec3f_Copy(this->unk_AF0, &this->actor.world.pos);
+ this->unk_ABC = 0.0f;
+ this->actor.world.pos.y += temp_fv0_2 * this->actor.scale.y;
+ func_80834DB8(this, &gPlayerAnim_pn_kakku, speed, play);
+ Player_SetAction(play, this, func_80856918, 1);
+ this->boomerangActor = NULL;
+
+ this->stateFlags3 |= PLAYER_STATE3_200;
+ if (sp38 != 0) {
+ this->stateFlags3 |= PLAYER_STATE3_2000;
+ }
+ if (var_v1 < 0) {
+ this->stateFlags3 |= PLAYER_STATE3_40000;
+ }
+
+ this->unk_AE7 = var_v1;
+ this->unk_AE8 = 9999;
+ Player_SetCylinderForAttack(this, DMG_DEKU_LAUNCH, 2, 20);
+ } else if (this->unk_ABC < 0.0f) {
+ func_80856074(play, this);
+ }
+ }
+
+ if (this->unk_ABC < -1500.0f) {
+ this->stateFlags3 |= PLAYER_STATE3_100;
+ if (this->unk_B86[0] < 8) {
+ this->unk_B86[0]++;
+ if (this->unk_B86[0] == 8) {
+ func_8082E1F0(this, NA_SE_PL_DEKUNUTS_BUD);
+ }
+ }
+ }
+}
+
+void func_808566C0(PlayState* play, Player* this, PlayerBodyPart bodyPartIndex, f32 arg3, f32 arg4, f32 arg5,
+ s32 life) {
+ Color_RGBA8 primColor = { 255, 200, 200, 0 };
+ Color_RGBA8 envColor = { 255, 255, 0, 0 };
+ static Vec3f D_8085D940 = { 0.0f, 0.3f, 0.0f };
+ static Vec3f D_8085D94C = { 0.0f, -0.025f, 0.0f };
+ Vec3f pos;
+ s32 scale;
+ f32 sp34;
+ Vec3f* temp_v0;
+
+ if (Rand_ZeroOne() < 0.5f) {
+ sp34 = -1.0f;
+ } else {
+ sp34 = 1.0f;
+ }
+
+ D_8085D940.x = (Rand_ZeroFloat(arg4) + arg3) * sp34;
+ D_8085D94C.x = arg5 * sp34;
+ if (Rand_ZeroOne() < 0.5f) {
+ sp34 = -1.0f;
+ } else {
+ sp34 = 1.0f;
+ }
+
+ temp_v0 = &this->bodyPartsPos[bodyPartIndex];
+ D_8085D940.z = (Rand_ZeroFloat(arg4) + arg3) * sp34;
+ D_8085D94C.z = arg5 * sp34;
+ pos.x = temp_v0->x;
+ pos.y = Rand_ZeroFloat(15.0f) + temp_v0->y;
+ pos.z = temp_v0->z;
+ if (Rand_ZeroOne() < 0.5f) {
+ scale = 2000;
+ } else {
+ scale = -150;
+ }
+
+ EffectSsKirakira_SpawnDispersed(play, &pos, &D_8085D940, &D_8085D94C, &primColor, &envColor, scale, life);
+}
+
+void func_8085687C(Player* this) {
+}
+
+s32 func_80856888(f32* arg0, f32 arg1, f32 arg2) {
+ if (arg2 != 0.0f) {
+ if (arg1 < *arg0) {
+ arg2 = -arg2;
+ }
+
+ *arg0 += arg2;
+ if (((*arg0 - arg1) * arg2) >= 0.0f) {
+ *arg0 = arg1;
+ return true;
+ }
+ } else if (arg1 == *arg0) {
+ return true;
+ }
+
+ return false;
+}
+
+f32 D_8085D958[] = { 600.0f, 960.0f };
+Vec3f D_8085D960 = { -30.0f, 50.0f, 0.0f };
+Vec3f D_8085D96C = { 30.0f, 50.0f, 0.0f };
+
+// Flying as Deku?
+void func_80856918(Player* this, PlayState* play) {
+ if ((this->boomerangActor != NULL) && (this->boomerangActor->update == NULL)) {
+ this->boomerangActor = NULL;
+ }
+
+ if (func_80838A90(this, play)) {
+ return;
+ }
+
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
+ func_80837134(play, this);
+ return;
+ }
+
+ if ((this->actor.velocity.y > 0.0f) && (this->stateFlags3 & PLAYER_STATE3_200)) {
+ this->actor.terminalVelocity = -20.0f;
+ this->actor.gravity = -5.5f;
+ Player_SetCylinderForAttack(this, DMG_DEKU_LAUNCH, 2, 20);
+ func_80856110(play, this, 0.0f, 0.0f, -1.0f, 500, 0, 8);
+
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_CEILING) {
+ func_80833AA0(this, play);
+ }
+ } else if (!(this->stateFlags3 & PLAYER_STATE3_2000)) {
+ func_80833AA0(this, play);
+ } else if (this->stateFlags3 & PLAYER_STATE3_200) {
+ if (this->actor.velocity.y < 0.0f) {
+ if (this->unk_AE7 < 0) {
+ func_80833AA0(this, play);
+ } else {
+ PlayerAnimation_Update(play, &this->skelAnime);
+ if (this->skelAnime.curFrame > 6.0f) {
+ this->actor.velocity.y = 6.0f;
+ this->stateFlags3 &= ~PLAYER_STATE3_200;
+ this->stateFlags3 |= PLAYER_STATE3_1000000;
+ func_8082E1F0(this, NA_SE_IT_DEKUNUTS_FLOWER_OPEN);
+ func_8019FD90(4, 2);
+ }
+ }
+ }
+
+ this->actor.terminalVelocity = -10.0f;
+ this->actor.gravity = -0.5f;
+ Player_ResetCylinder(this);
+ } else if (CHECK_BTN_ALL(sPlayerControlInput->press.button, BTN_A)) {
+ func_808355D8(play, this, &gPlayerAnim_pn_kakkufinish);
+ } else {
+ s16 temp_a0;
+ f32 temp_fv1;
+ s16 sp76;
+ s16 var_v1;
+ s16 var_a1;
+ f32 sp6C;
+ f32 sp68;
+ s16 sp66;
+ s16 temp_ft0;
+ s32 temp;
+ s16 var_v1_4;
+
+ this->linearVelocity = sqrtf(SQXZ(this->actor.velocity));
+ if (this->linearVelocity != 0.0f) {
+ var_a1 = Math_Atan2S_XY(this->actor.velocity.z, this->actor.velocity.x);
+
+ temp_a0 = this->actor.shape.rot.y - var_a1;
+ if (ABS_ALT(temp_a0) > 0x4000) {
+ this->linearVelocity = -this->linearVelocity;
+ var_a1 = var_a1 + 0x8000;
+ }
+ this->currentYaw = var_a1;
+ }
+
+ if (this->windSpeed != 0.0f) {
+ Math_SmoothStepToS(&this->unk_B8C, this->windAngleX, 3, 0x1F40, 0x190);
+ }
+
+ func_8085687C(this);
+
+ if (this->unk_AE8 != 0) {
+ this->unk_AE8--;
+ }
+
+ temp_fv1 = D_8085D958[this->unk_AE7] - Math_Vec3f_DistXZ(&this->actor.world.pos, this->unk_AF0);
+ PlayerAnimation_Update(play, &this->skelAnime);
+
+ if ((this->unk_AE8 != 0) && (temp_fv1 > 300.0f)) {
+ sp76 = 0x1770;
+ if (this->skelAnime.animation != &gPlayerAnim_pn_kakku) {
+ func_8082E5EC(play, this, &gPlayerAnim_pn_kakkufinish);
+ } else if (PlayerAnimation_OnFrame(&this->skelAnime, 8.0f)) {
+ s32 i;
+
+ Player_TranslateAndRotateY(this, &this->actor.world.pos, &D_8085D960,
+ &this->bodyPartsPos[PLAYER_BODYPART_LEFT_HAND]);
+ Player_TranslateAndRotateY(this, &this->actor.world.pos, &D_8085D96C,
+ &this->bodyPartsPos[PLAYER_BODYPART_RIGHT_HAND]);
+
+ for (i = 0; i < 13; i++) {
+ func_808566C0(play, this, PLAYER_BODYPART_LEFT_HAND, 0.6f, 1.0f, 0.8f, 17);
+ func_808566C0(play, this, PLAYER_BODYPART_RIGHT_HAND, 0.6f, 1.0f, 0.8f, 17);
+ }
+ }
+ } else if ((this->unk_AE8 == 0) || (temp_fv1 < 0.0f)) {
+ sp76 = 0;
+ func_808355D8(play, this, &gPlayerAnim_pn_rakkafinish);
+ } else {
+ sp76 = 0x1770 - (s32)((300.0f - temp_fv1) * 10.0f);
+
+ if (this->skelAnime.animation != &gPlayerAnim_pn_batabata) {
+ func_8082E55C(play, this, &gPlayerAnim_pn_batabata);
+ } else if (PlayerAnimation_OnFrame(&this->skelAnime, 6.0f)) {
+ Player_PlaySfx(this, NA_SE_PL_DEKUNUTS_STRUGGLE);
+ }
+ }
+
+ Math_AsymStepToS(&this->unk_B86[1], sp76, 0x190, 0x190);
+
+ this->unk_B8A += this->unk_B86[1];
+ temp = ABS_ALT(this->unk_B86[1]);
+ if (temp > 0xFA0) {
+ this->unk_B66 += (u8)(ABS_ALT(this->unk_B86[1]) * 0.01f);
+ }
+
+ if (this->unk_B66 > 200) {
+ this->unk_B66 -= 200;
+ func_808566C0(play, this, PLAYER_BODYPART_LEFT_HAND, 0.0f, 1.0f, 0.0f, 32);
+ func_808566C0(play, this, PLAYER_BODYPART_RIGHT_HAND, 0.0f, 1.0f, 0.0f, 32);
+ }
+
+ func_8019FCB8(&this->actor.projectedPos, 0x1851, 2.0f * (this->unk_B86[1] * (1.0f / 6000.0f)));
+ if ((this->boomerangActor == NULL) && CHECK_BTN_ALL(sPlayerControlInput->press.button, BTN_B)) {
+ if (AMMO(ITEM_NUT) == 0) {
+ play_sound(NA_SE_SY_ERROR);
+ } else {
+ this->boomerangActor =
+ Actor_Spawn(&play->actorCtx, play, ACTOR_EN_ARROW, this->bodyPartsPos[PLAYER_BODYPART_WAIST].x,
+ this->bodyPartsPos[PLAYER_BODYPART_WAIST].y,
+ this->bodyPartsPos[PLAYER_BODYPART_WAIST].z, -1, 0, 0, ARROW_TYPE_DEKU_NUT);
+ if (this->boomerangActor != NULL) {
+ this->boomerangActor->velocity.x = this->actor.velocity.x * 1.5f;
+ this->boomerangActor->velocity.z = this->actor.velocity.z * 1.5f;
+ Inventory_ChangeAmmo(ITEM_NUT, -1);
+ Actor_PlaySfx(this->boomerangActor, NA_SE_PL_DEKUNUTS_DROP_BOMB);
+ }
+ }
+ }
+
+ if (this->actor.velocity.y < 0.0f) {
+ if (sp76 != 0) {
+ this->actor.terminalVelocity = -0.38f;
+ this->actor.gravity = -0.2f;
+ } else {
+ this->actor.terminalVelocity = (this->unk_B86[1] * 0.0033f) + -20.0f;
+ this->actor.gravity = (this->unk_B86[1] * 0.00004f) + (REG(68) / 100.0f);
+ }
+ }
+
+ this->fallStartHeight = this->actor.world.pos.y;
+ func_80832F78(this, &sp6C, &sp66, 0.0f, play);
+ if (sp6C == 0.0f) {
+ sp68 = 0.1f;
+ } else {
+ s16 temp_v0_6 = this->currentYaw - sp66;
+
+ if (ABS_ALT(temp_v0_6) > 0x4000) {
+ sp6C = -sp6C;
+ sp66 += 0x8000;
+ }
+ sp68 = 0.25f;
+ }
+
+ Math_SmoothStepToS(&this->unk_B8C, sp6C * 600.0f, 8, 0xFA0, 0x64);
+ Math_ScaledStepToS(&this->currentYaw, sp66, 0xFA);
+
+ temp_ft0 = BINANG_SUB(sp66, this->currentYaw) * -2.0f;
+ temp_ft0 = CLAMP(temp_ft0, -0x1F40, 0x1F40);
+ Math_SmoothStepToS(&this->unk_B8E, temp_ft0, 0x14, 0x320, 0x14);
+ sp6C = (sp6C * (this->unk_B86[1] * 0.0004f)) * fabsf(Math_SinS(this->unk_B8C));
+ func_80856888(&this->linearVelocity, sp6C, sp68);
+
+ sp6C = sqrtf(SQ(this->linearVelocity) + SQ(this->actor.velocity.y));
+ if (sp6C > 8.0f) {
+ sp6C = 8.0f / sp6C;
+ this->linearVelocity *= sp6C;
+ this->actor.velocity.y *= sp6C;
+ }
+ }
+
+ func_808378FC(play, this);
+}
+
+// Deku spinning related
+void func_808573A4(Player* this, PlayState* play) {
+ this->stateFlags2 |= PLAYER_STATE2_20 | PLAYER_STATE2_40;
+
+ PlayerAnimation_Update(play, &this->skelAnime);
+ Player_SetCylinderForAttack(this, DMG_DEKU_SPIN, 1, 30);
+
+ if (!func_80838A90(this, play)) {
+ s16 prevYaw = this->currentYaw;
+ f32 sp40;
+ s16 sp3E;
+
+ func_80832F78(this, &sp40, &sp3E, 0.018f, play);
+ sp40 *= 1.0f - (0.9f * ((11100.0f - this->unk_B10[0]) / 11100.0f));
+ if (!func_8083A4A4(this, &sp40, &sp3E, REG(43) / 100.0f)) {
+ func_8083CB58(this, sp40, sp3E);
+ }
+
+ this->unk_B10[0] += -800.0f;
+ this->actor.shape.rot.y += BINANG_ADD((s16)this->unk_B10[0], BINANG_SUB(this->currentYaw, prevYaw));
+
+ if (Math_StepToF(&this->unk_B10[1], 0.0f, this->unk_B10[0])) {
+ this->actor.shape.rot.y = this->currentYaw;
+ func_8083B2E4(this, play);
+ } else if (this->skelAnime.animation == &gPlayerAnim_pn_attack) {
+ this->stateFlags3 |= PLAYER_STATE3_100000;
+
+ if (this->unk_B10[1] < 0.0f) {
+ func_8082E438(play, this, func_8082ED20(this));
+ }
+ }
+
+ func_808566C0(play, this, PLAYER_BODYPART_WAIST, 1.0f, 0.5f, 0.0f, 32);
+
+ if (this->unk_B10[0] > 9500.0f) {
+ func_8083F8A8(play, this, 2.0f, 1, 2.5f, 10, 18, true);
+ }
+
+ func_800AE930(&play->colCtx, Effect_GetByIndex(this->meleeWeaponEffectIndex[2]), &this->actor.world.pos, 2.0f,
+ this->currentYaw, this->actor.floorPoly, this->actor.floorBgId);
+ func_800B8F98(&this->actor, Player_GetFloorSfx(this, NA_SE_PL_SLIP_LEVEL - SFX_FLAG));
+ }
+}
+
+void func_80857640(Player* this, f32 arg1, s32 arg2) {
+ func_80834CD0(this, arg1, NA_SE_VO_LI_SWORD_N);
+ Player_PlaySfx(this, NA_SE_PL_GORON_BALLJUMP);
+ Player_StopHorizontalMovement(this);
+ if (this->unk_AE8 < arg2) {
+ this->unk_AE8 = arg2;
+ }
+ this->unk_AE7 = 1;
+ this->unk_B48 = 1.0f;
+}
+
+void func_808576BC(PlayState* play, Player* this) {
+ s32 var_v0 = ((this->actor.velocity.z * Math_CosS(this->currentYaw)) +
+ (this->actor.velocity.x * Math_SinS(this->currentYaw))) *
+ 800.0f;
+
+ var_v0 -= this->unk_AE8;
+ var_v0 = ABS_ALT(var_v0);
+
+ if (var_v0 <= 0x7D0) {
+ return;
+ }
+
+ if (var_v0 > 0x1770) {
+ func_800B8F98(&this->actor, NA_SE_PL_GORON_SLIP - SFX_FLAG);
+ }
+
+ if (func_8083F8A8(play, this, 12.0f, -1 - (var_v0 >> 0xC), (var_v0 >> 0xA) + 1.0f, (var_v0 >> 7) + 160, 20, true)) {
+ Player_PlaySfx(this, (this->floorSfxOffset == NA_SE_PL_WALK_SNOW - SFX_FLAG)
+ ? NA_SE_PL_ROLL_SNOW_DUST - SFX_FLAG
+ : NA_SE_PL_ROLL_DUST - SFX_FLAG);
+ }
+}
+
+void func_808577E0(Player* this) {
+ f32 temp_fa1 = ABS_ALT(this->unk_AE8) * 0.00004f;
+
+ if (this->unk_ABC < temp_fa1) {
+ this->unk_B48 += 0.08f;
+ } else {
+ this->unk_B48 += -0.07f;
+ }
+
+ this->unk_B48 = CLAMP(this->unk_B48, -0.2f, 0.14f);
+ if (fabsf(this->unk_B48) < 0.12f) {
+ if (Math_StepUntilF(&this->unk_ABC, temp_fa1, this->unk_B48)) {
+ this->unk_B48 = 0.0f;
+ }
+ } else {
+ this->unk_ABC += this->unk_B48;
+ this->unk_ABC = CLAMP(this->unk_ABC, -0.7f, 0.3f);
+ }
+}
+
+s32 func_80857950(PlayState* play, Player* this) {
+ if (((this->unk_B86[1] == 0) && !CHECK_BTN_ALL(sPlayerControlInput->cur.button, BTN_A)) ||
+ ((this->unk_AE7 == 3) && (this->actor.velocity.y < 0.0f))) {
+ Player_SetAction(play, this, func_80849FE0, 1);
+ Math_Vec3f_Copy(&this->actor.world.pos, &this->actor.prevPos);
+ PlayerAnimation_Change(play, &this->skelAnime, &gPlayerAnim_pg_maru_change, -2.0f / 3.0f, 7.0f, 0.0f,
+ ANIMMODE_ONCE, 0.0f);
+ Player_PlaySfx(this, NA_SE_PL_BALL_TO_GORON);
+ return true;
+ }
+
+ return false;
+}
+
+s32 func_80857A44(PlayState* play, Player* this) {
+ if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ func_8082E794(this);
+
+ this->actor.shape.shadowDraw = ActorShadow_DrawCircle;
+ this->actor.bgCheckFlags |= BGCHECKFLAG_PLAYER_800;
+ this->unk_AE7 = 4;
+ this->actor.shape.shadowScale = 30.0f;
+ this->unk_AE8 = this->linearVelocity * 500.0f;
+ this->unk_B08 = this->linearVelocity;
+ this->unk_B0C = 0.0f;
+ this->actor.home.rot.y = this->currentYaw;
+
+ return true;
+ }
+
+ return false;
+}
+
+void func_80857AEC(PlayState* play, Player* this) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND_TOUCH) {
+ this->unk_B0C += this->unk_B08 * 0.05f;
+
+ if (this->unk_B86[1] == 0) {
+ if (this->unk_AE7 == 1) {
+ this->unk_AE7 = 2;
+ Player_RequestQuakeAndRumble(play, this, NA_SE_PL_GORON_PUNCH);
+ play->actorCtx.unk2 = 4;
+ EffectSsBlast_SpawnWhiteShockwave(play, &this->actor.world.pos, &gZeroVec3f, &gZeroVec3f);
+ this->unk_AE8 = 0;
+ this->unk_B08 = 0.0f;
+ Actor_Spawn(&play->actorCtx, play, ACTOR_EN_TEST, this->actor.world.pos.x, this->actor.world.pos.y,
+ this->actor.world.pos.z, 0, 0, 0, 0);
+ } else {
+ this->unk_AE7 = 4;
+ }
+ }
+
+ Player_AnimSfx_PlayFloorLand(this);
+ }
+}
+
+// Goron rolling related
+void func_80857BE8(Player* this, PlayState* play) {
+ if (func_80833058(play, this, D_8085D050, 0)) {
+ return;
+ }
+
+ if ((this->unk_AE7 == 0) && !func_80857A44(play, this)) {
+ return;
+ }
+
+ this->stateFlags3 |= PLAYER_STATE3_1000;
+ func_808577E0(this);
+
+ if (!func_80857950(play, this)) {
+ f32 spE4 = 0.0f;
+ s16 spE2 = this->currentYaw;
+ u16 spE0;
+ s32 spDC;
+ s32 spD8;
+
+ if (func_80840A30(play, this, &this->unk_B08, (this->doorType == PLAYER_DOORTYPE_STAIRCASE) ? 0.0f : 12.0f)) {
+ if (func_80857BE8 != this->actionFunc) {
+ return;
+ }
+
+ this->linearVelocity *= 0.1f;
+ func_80834CD0(this, 10.0f, 0);
+ if (this->unk_B86[1] != 0) {
+ this->unk_B86[1] = 0;
+ this->unk_AE7 = 3;
+ }
+ } else if ((this->actor.bgCheckFlags & BGCHECKFLAG_WALL) && (this->unk_B08 >= 12.0f)) {
+ s16 temp_v0 = this->currentYaw - BINANG_ADD(this->actor.wallYaw, 0x8000);
+ s16 temp_v2;
+ s32 var_a2 = ABS_ALT(temp_v0);
+
+ this->unk_B0C += this->unk_B08 * 0.05f;
+ temp_v2 = ((temp_v0 >= 0) ? 1 : -1) * ((var_a2 + 0x100) & ~0x1FF);
+ this->currentYaw += BINANG_SUB(0x8000, (s16)(temp_v2 * 2));
+ this->actor.home.rot.y = this->currentYaw;
+ this->actor.shape.rot.y = this->currentYaw;
+
+ this->unk_B8C = 4;
+ Player_PlaySfx(this, NA_SE_IT_GORON_ROLLING_REFLECTION);
+ }
+
+ this->stateFlags2 |= (PLAYER_STATE2_20 | PLAYER_STATE2_40);
+
+ if (this->unk_B8E != 0) {
+ this->unk_B8E--;
+ } else {
+ func_80832F78(this, &spE4, &spE2, 0.0f, play);
+ spE4 *= 2.6f;
+ }
+
+ if (this->unk_B8C != 0) {
+ this->unk_B8C--;
+ spE2 = this->currentYaw;
+ }
+
+ if (this->unk_B86[1] != 0) {
+ spE4 = 18.0f;
+ Math_StepToC(&this->unk_AE7, 4, 1);
+
+ if ((this->stateFlags3 & PLAYER_STATE3_80000) && (!CHECK_BTN_ALL(sPlayerControlInput->cur.button, BTN_A) ||
+ (gSaveContext.save.saveInfo.playerData.magic == 0) ||
+ ((this->unk_AE7 == 4) && (this->unk_B08 < 12.0f)))) {
+ if (Math_StepToS(&this->unk_B86[1], 0, 1) != 0) {
+ this->stateFlags3 &= ~PLAYER_STATE3_80000;
+ Magic_Reset(play);
+ Player_PlaySfx(this, NA_SE_PL_GORON_BALL_CHARGE_FAILED);
+ }
+ this->unk_AE7 = 4;
+ } else if (this->unk_B86[1] < 7) {
+ if (!(this->stateFlags3 & PLAYER_STATE3_80000)) {
+ this->unk_3D0.unk_00 = 2;
+ }
+ this->unk_B86[1]++;
+ }
+ }
+
+ spDC = spE4 * 900.0f;
+
+ Math_AsymStepToF(&this->unk_B10[0], (this->unk_B8A != 0) ? 1.0f : 0.0f, 0.8f, 0.05f);
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
+ func_80857AEC(play, this);
+ if (this->unk_AE7 == 2) {
+ if (this->unk_B8A == 0) {
+ this->unk_AE7 = 4;
+ } else {
+ this->unk_B8A--;
+ this->unk_ABC = 0.0f;
+ this->unk_B48 = 0.14f;
+ }
+ } else if ((this->unk_B86[1] == 0) && CHECK_BTN_ALL(sPlayerControlInput->press.button, BTN_B) &&
+ (Inventory_GetBtnBItem(play) < ITEM_FD)) {
+ func_80857640(this, 14.0f, 0x1F40);
+ } else {
+ f32 spCC;
+ s16 spCA;
+ s16 spC8;
+ s32 var_a0;
+ s32 spC0;
+ f32 spBC;
+ f32 spB8;
+ f32 spB4;
+ f32 spB0;
+ f32 spAC;
+ f32 spA8;
+ f32 spA4;
+ f32 spA0;
+ Vec3f slopeNormal;
+ s16 downwardSlopeYaw;
+ s16 sp90 = this->currentYaw;
+ s16 sp8E = this->currentYaw - this->actor.home.rot.y;
+ f32 sp88 = Math_CosS(sp8E);
+
+ if (this->unk_B86[1] == 0) {
+ this->unk_B0C = 0.0f;
+ if (this->unk_AE7 >= 0x36) {
+ Magic_Consume(play, 2, MAGIC_CONSUME_GORON_ZORA);
+ this->unk_B08 = 18.0f;
+ this->unk_B86[1] = 1;
+ this->stateFlags3 |= PLAYER_STATE3_80000;
+ func_8082E1F0(this, NA_SE_PL_GORON_BALL_CHARGE_DASH);
+ }
+ } else {
+ this->unk_B0C = CLAMP(this->unk_B0C, 0.0f, 0.9f);
+ }
+
+ spBC = (1.0f - this->unk_B0C) * this->unk_B08 * sp88;
+ if ((spBC < 0.0f) || ((spE4 == 0.0f) && (ABS_ALT(sp8E) > 0xFA0))) {
+ spBC = 0.0f;
+ }
+
+ Math_StepToF(&this->unk_B0C, 0.0f, fabsf(sp88) * 20.0f);
+ var_a0 = spBC * 500.0f;
+ var_a0 = CLAMP_MIN(var_a0, 0);
+
+ spC0 = (s32)(spE4 * 400.0f) - var_a0;
+ spC0 = CLAMP_MIN(spC0, 0);
+
+ spDC = CLAMP_MIN(spDC, var_a0);
+
+ spAC = spBC * Math_SinS(this->actor.home.rot.y);
+ spA8 = spBC * Math_CosS(this->actor.home.rot.y);
+ spB4 = this->unk_B08 * Math_SinS(this->currentYaw);
+ spB0 = this->unk_B08 * Math_CosS(this->currentYaw);
+
+ spA4 = spB4 - spAC;
+ spA0 = spB0 - spA8;
+ this->linearVelocity = spBC;
+ this->currentYaw = this->actor.home.rot.y;
+ spCC = spE4;
+ spCA = spE2;
+
+ if (func_8083A4A4(this, &spCC, &spCA, (this->unk_AE7 >= 5) ? 0.0f : 1.0f)) {
+ if (this->unk_B86[1] == 0) {
+ this->unk_AE7 = 4;
+ }
+
+ if (this->unk_AE7 == 4) {
+ spDC = -0xFA0;
+ }
+ } else {
+ static Vec3f D_8085D978 = { -30.0f, 60.0f, 0.0f };
+ static Vec3f D_8085D984 = { 30.0f, 60.0f, 0.0f };
+ f32 sp84 = (((this->floorSfxOffset == NA_SE_PL_WALK_SNOW - SFX_FLAG) ||
+ (this->floorSfxOffset == NA_SE_PL_WALK_ICE - SFX_FLAG) ||
+ (this->floorSfxOffset == NA_SE_PL_WALK_SAND - SFX_FLAG) ||
+ (sPlayerCurrentFloorType == FLOOR_TYPE_5)) &&
+ (spC0 >= 0x7D0))
+ ? 0.08f
+ : this->unk_AE8 * 0.0003f;
+ f32 sp80 = (Math_SinS(this->unk_B6C) * 8.0f) + 0.6f;
+ s16 var_a3;
+ s16 sp7C;
+ Vec3f sp70;
+ f32 sp6C;
+ f32 var_fa1;
+
+ if (this->unk_B86[1] == 0) {
+ if ((gSaveContext.magicState == MAGIC_STATE_IDLE) &&
+ (gSaveContext.save.saveInfo.playerData.magic >= 2) && (this->unk_AE8 >= 0x36B0)) {
+ this->unk_AE7++;
+ func_800B8F98(&this->actor, NA_SE_PL_GORON_BALL_CHARGE - SFX_FLAG);
+ } else {
+ this->unk_AE7 = 4;
+ }
+ }
+
+ if (spE4 != spCC) {
+ this->currentYaw = spE2;
+ }
+
+ sp84 = CLAMP_MIN(sp84, 0.0f);
+ sp80 = CLAMP_MIN(sp80, 0.0f);
+
+ Math_AsymStepToF(&this->linearVelocity, spE4, sp84, sp80);
+ spC8 = (s16)(fabsf(this->actor.speed) * 20.0f) + 300;
+ spC8 = CLAMP_MIN(spC8, 100);
+
+ sp7C = (s32)(BINANG_SUB(spE2, this->currentYaw) * -0.5f);
+ this->unk_B0C += (f32)(SQ(sp7C)) * 8e-9f;
+ Math_ScaledStepToS(&this->currentYaw, spE2, spC8);
+ sp6C = func_80835D2C(play, this, &D_8085D978, &sp70);
+
+ var_fa1 = func_80835D2C(play, this, &D_8085D984, &sp70) - sp6C;
+ if (fabsf(var_fa1) > 100.0f) {
+ var_fa1 = 0.0f;
+ }
+
+ var_a3 = Math_Atan2S_XY(60.0f, var_fa1);
+ if (ABS_ALT(var_a3) > 0x2AAA) {
+ var_a3 = 0;
+ }
+
+ Math_ScaledStepToS(&this->actor.shape.rot.z, var_a3 + sp7C, spC8);
+ }
+
+ spBC = this->linearVelocity;
+ this->actor.home.rot.y = this->currentYaw;
+ this->currentYaw = sp90;
+ Actor_GetSlopeDirection(this->actor.floorPoly, &slopeNormal, &downwardSlopeYaw);
+
+ spB8 = sqrtf(SQ(spA4) + SQ(spA0));
+ if (this->unk_B86[1] != 0) {
+ if ((ABS_ALT(sp8E) + ABS_ALT(this->unk_B6C)) > 15000) {
+ this->unk_B86[1] = 0;
+ this->unk_AE7 = 4;
+ this->unk_B8E = 0x14;
+ this->unk_AE8 = 0;
+ this->stateFlags3 &= ~PLAYER_STATE3_80000;
+ Magic_Reset(play);
+ }
+ } else {
+ f32 temp_ft4_2 = (0.6f * slopeNormal.x) + spA4;
+ f32 temp_ft5 = (0.6f * slopeNormal.z) + spA0;
+ f32 temp_fv0_3 = sqrtf(SQ(temp_ft4_2) + SQ(temp_ft5));
+
+ if ((temp_fv0_3 < spB8) || (temp_fv0_3 < 6.0f)) {
+ spA4 = temp_ft4_2;
+ spA0 = temp_ft5;
+ spB8 = temp_fv0_3;
+ }
+ }
+
+ if (spB8 != 0.0f) {
+ f32 pad;
+ f32 sp54 = spB8 - 0.3f;
+
+ sp54 = CLAMP_MIN(sp54, 0.0f);
+
+ spB8 = sp54 / spB8;
+
+ spA4 *= spB8;
+ spA0 *= spB8;
+
+ if (sp54 != 0.0f) {
+ this->unk_B28 = Math_Atan2S_XY(spA0, spA4);
+ }
+
+ if (this->unk_AE8 == 0) {
+ s32 temp_v0_10 = this->unk_B86[0];
+ s32 temp_ft3_2 = sp54 * 800.0f;
+
+ this->unk_B86[0] += (s16)temp_ft3_2;
+ if ((this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) && (temp_ft3_2 != 0) &&
+ (((temp_v0_10 + temp_ft3_2) * temp_v0_10) <= 0)) {
+ spE0 = Player_GetFloorSfx(this, NA_SE_PL_GORON_ROLL);
+ func_8019F780(&this->actor.projectedPos, spE0, sp54);
+ }
+ }
+ }
+
+ spAC = Math_SinS(this->actor.home.rot.y) * spBC;
+ spA8 = Math_CosS(this->actor.home.rot.y) * spBC;
+
+ spB4 = spAC + spA4;
+ spB0 = spA8 + spA0;
+
+ this->unk_B08 = sqrtf(SQ(spB4) + SQ(spB0));
+ this->unk_B08 = CLAMP_MAX(this->unk_B08, 18.0f);
+
+ this->currentYaw = Math_Atan2S_XY(spB0, spB4);
+ }
+
+ func_808576BC(play, this);
+
+ if (ABS_ALT(this->unk_AE8) > 0xFA0) {
+ this->stateFlags2 |= PLAYER_STATE2_8;
+ }
+
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
+ this->linearVelocity = this->unk_B08 * Math_CosS(this->unk_B6C);
+ this->actor.velocity.y = this->unk_B08 * Math_SinS(this->unk_B6C);
+ }
+
+ if ((this->unk_B86[1] != 0) ||
+ SurfaceType_HasMaterialProperty(&play->colCtx, this->actor.floorPoly, this->actor.floorBgId,
+ MATERIAL_PROPERTY_SOFT_IMPRINT)) {
+ func_800AE930(&play->colCtx, Effect_GetByIndex(this->meleeWeaponEffectIndex[2]), &this->actor.world.pos,
+ 15.0f, this->actor.shape.rot.y, this->actor.floorPoly, this->actor.floorBgId);
+ } else {
+ func_800AEF44(Effect_GetByIndex(this->meleeWeaponEffectIndex[2]));
+ }
+ } else {
+ Math_ScaledStepToS(&this->actor.shape.rot.z, 0, 0x190);
+
+ this->unk_B86[0] = 0;
+ if (this->unk_B86[1] != 0) {
+ this->actor.gravity = -1.0f;
+ Math_ScaledStepToS(&this->actor.home.rot.y, spE2, 0x190);
+
+ this->unk_B08 = sqrtf(SQ(this->linearVelocity) + SQ(this->actor.velocity.y)) *
+ ((this->linearVelocity >= 0.0f) ? 1.0f : -1.0f);
+ this->unk_B08 = CLAMP_MAX(this->unk_B08, 18.0f);
+ } else {
+ this->unk_B48 += this->actor.velocity.y * 0.005f;
+ if (this->unk_AE7 == 1) {
+ if (this->actor.velocity.y > 0.0f) {
+ if ((this->actor.velocity.y + this->actor.gravity) < 0.0f) {
+ this->actor.velocity.y = -this->actor.gravity;
+ }
+ } else {
+ this->unk_B8A = 0xA;
+ if (this->actor.velocity.y > -1.0f) {
+ this->actor.gravity = -0.2f;
+ } else {
+ this->unk_3D0.unk_00 = 1;
+ this->actor.gravity = -10.0f;
+ }
+ }
+ }
+ this->unk_B08 = this->linearVelocity;
+ }
+
+ func_800AEF44(Effect_GetByIndex(this->meleeWeaponEffectIndex[2]));
+ }
+
+ Math_ScaledStepToS(&this->actor.shape.rot.y, this->actor.home.rot.y, 0x7D0);
+
+ Math_AsymStepToS(&this->unk_AE8, spDC, (spDC >= 0) ? 0x7D0 : 0x3E8, 0x4B0);
+
+ if (this->unk_AE8 != 0) {
+ spD8 = this->actor.shape.rot.x;
+ this->actor.shape.rot.x += this->unk_AE8;
+
+ Math_ScaledStepToS(&this->unk_B86[0], 0, ABS_ALT(this->unk_AE8));
+ if ((this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) && (((this->unk_AE8 + spD8) * spD8) <= 0)) {
+ spE0 =
+ Player_GetFloorSfx(this, (this->unk_B86[1] != 0) ? NA_SE_PL_GORON_CHG_ROLL : NA_SE_PL_GORON_ROLL);
+ func_8019F780(&this->actor.projectedPos, spE0, this->unk_B08);
+ }
+ }
+
+ if (this->unk_AE7 == 2) {
+ Player_SetCylinderForAttack(this, DMG_GORON_POUND, 4, 60);
+ Actor_SetPlayerImpact(play, PLAYER_IMPACT_GORON_GROUND_POUND, 2, 100.0f, &this->actor.world.pos);
+ } else if (this->unk_B86[1] != 0) {
+ Player_SetCylinderForAttack(this, DMG_GORON_SPIKES, 1, 25);
+ } else {
+ Player_SetCylinderForAttack(this, DMG_NORMAL_ROLL, 1, 25);
+ }
+ }
+}
+
+void func_80858C84(PlayState* play, Player* this, PlayerAnimationHeader* anim) {
+ func_8082E784(this);
+ func_8082E438(play, this, anim);
+ Player_StopHorizontalMovement(this);
+}
+
+void func_80858CC8(PlayState* play, Player* this, PlayerAnimationHeader* anim) {
+ func_8082E784(this);
+ PlayerAnimation_Change(play, &this->skelAnime, anim, 2.0f / 3.0f, 0.0f, Animation_GetLastFrame(anim), ANIMMODE_ONCE,
+ -8.0f);
+ Player_StopHorizontalMovement(this);
+}
+
+void func_80858D48(PlayState* play, Player* this, PlayerAnimationHeader* anim) {
+ func_8082E784(this);
+ PlayerAnimation_Change(play, &this->skelAnime, anim, 2.0f / 3.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -8.0f);
+ Player_StopHorizontalMovement(this);
+}
+
+void func_80858DB4(PlayState* play, Player* this, void* anim) {
+ Player_StopHorizontalMovement(this);
+}
+
+void func_80858DDC(PlayState* play, Player* this, void* anim) {
+ func_80858C84(play, this, anim);
+}
+
+void func_80858DFC(PlayState* play, Player* this, void* anim) {
+ func_8082E784(this);
+ func_8082E5A8(play, this, anim);
+ Player_StopHorizontalMovement(this);
+}
+
+void func_80858E40(PlayState* play, Player* this, void* anim) {
+ func_80858CC8(play, this, anim);
+}
+
+void func_80858E60(PlayState* play, Player* this, void* anim) {
+ func_80858D48(play, this, anim);
+}
+
+void func_80858E80(PlayState* play, Player* this, void* anim) {
+ func_8082EA60(play, this, anim);
+}
+
+void func_80858EA0(PlayState* play, Player* this, void* anim) {
+ func_8082EA10(play, this, anim, ANIM_FLAG_4 | ANIM_FLAG_8 | ANIM_FLAG_NOMOVE | ANIM_FLAG_80);
+}
+
+void func_80858EC0(PlayState* play, Player* this, void* anim) {
+ Player_AnimationPlayOnceReverse(play, this, anim);
+ func_8082E920(play, this, ANIM_FLAG_4 | ANIM_FLAG_8 | ANIM_FLAG_NOMOVE | ANIM_FLAG_80);
+}
+
+void func_80858EFC(PlayState* play, Player* this, void* anim) {
+ func_8082EB18(play, this, anim);
+}
+
+void func_80858F1C(PlayState* play, Player* this, void* anim) {
+ func_8082EAC8(play, this, anim, ANIM_FLAG_4 | ANIM_FLAG_8 | ANIM_FLAG_NOMOVE | ANIM_FLAG_80);
+}
+
+void func_80858F3C(PlayState* play, Player* this, void* anim) {
+ Player_AnimationPlayOnce(play, this, anim);
+}
+
+void func_80858F5C(PlayState* play, Player* this, void* anim) {
+ Player_AnimationPlayLoop(play, this, anim);
+}
+
+void func_80858F7C(PlayState* play, Player* this, void* anim) {
+ func_8082DB90(play, this, anim);
+}
+
+void func_80858F9C(PlayState* play, Player* this, void* anim) {
+ func_8082DB60(play, this, anim);
+}
+
+void func_80858FBC(PlayState* play, Player* this, void* anim) {
+ PlayerAnimation_Update(play, &this->skelAnime);
+}
+
+void func_80858FE8(Player* this) {
+ if (this->skelAnime.animation == &gPlayerAnim_lost_horse_wait) {
+ Player_AnimSfx_PlayFloor(this, NA_SE_PL_SLIP_LEVEL - SFX_FLAG);
+ Player_PlaySfx(this, NA_SE_VO_LK_DRAGGED_DAMAGE - SFX_FLAG);
+ }
+}
+
+void (*D_8085D990[])(PlayState*, Player*, void*) = {
+ /* 0 */ NULL,
+ /* 1 */ func_80858DB4,
+ /* 2 */ func_80858DDC,
+ /* 3 */ func_80858E40,
+ /* 4 */ func_80858E60,
+ /* 5 */ func_80858E80,
+ /* 6 */ func_80858EA0,
+ /* 7 */ func_80858EFC,
+ /* 8 */ func_80858F1C,
+ /* 9 */ func_80858F3C,
+ /* 10 */ func_80858F5C,
+ /* 11 */ func_80858FBC,
+ /* 12 */ func_80859028,
+ /* 13 */ func_808591BC,
+ /* 14 */ func_80858DFC,
+ /* 15 */ func_80858F7C,
+ /* 16 */ func_80858F9C,
+ /* 17 */ func_80859168,
+ /* 18 */ func_80859210,
+ /* 19 */ func_80858EC0,
+};
+
+AnimSfxEntry D_8085D9E0[] = {
+ ANIMSFX(ANIMSFX_TYPE_FLOOR_LAND, 34, NA_SE_NONE, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 45, NA_SE_PL_CALM_HIT, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 51, NA_SE_PL_CALM_HIT, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 64, NA_SE_PL_CALM_HIT, STOP),
+};
+AnimSfxEntry D_8085D9F0[] = {
+ ANIMSFX(ANIMSFX_TYPE_VOICE, 7, NA_SE_VO_LI_DEMO_DAMAGE, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_FLOOR, 18, NA_SE_PL_BOUND, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_VOICE, 18, NA_SE_VO_LI_FREEZE, STOP),
+};
+AnimSfxEntry D_8085D9FC[] = {
+ ANIMSFX(ANIMSFX_TYPE_FLOOR_BY_AGE, 14, NA_SE_PL_LAND_GROUND, STOP),
+};
+AnimSfxEntry D_8085DA00[] = {
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 6, NA_SE_PL_GET_UP, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 18, NA_SE_VO_LK_WAKE_UP, STOP),
+};
+AnimSfxEntry D_8085DA08[] = {
+ ANIMSFX(ANIMSFX_TYPE_FLOOR_BY_AGE, 26, NA_SE_PL_LAND_GROUND, STOP),
+};
+AnimSfxEntry D_8085DA0C[] = {
+ ANIMSFX(ANIMSFX_TYPE_8, 16, NA_SE_NONE, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_FLOOR_JUMP, 36, NA_SE_NONE, STOP),
+};
+AnimSfxEntry D_8085DA14[] = {
+ ANIMSFX(ANIMSFX_TYPE_FLOOR_JUMP, 55, NA_SE_NONE, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 55, NA_SE_VO_LK_CATCH_DEMO, STOP),
+};
+AnimSfxEntry D_8085DA1C[] = {
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 4, NA_SE_VO_LK_USING_UP_ENERGY, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_FLOOR, 16, NA_SE_PL_BOUND, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_VOICE, 16, NA_SE_VO_LI_DAMAGE_S, STOP),
+};
+AnimSfxEntry D_8085DA28[] = {
+ ANIMSFX(ANIMSFX_TYPE_FLOOR_BY_AGE, 28, NA_SE_PL_LAND_GROUND, STOP),
+};
+AnimSfxEntry D_8085DA2C[] = {
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 1, NA_SE_VO_LK_USING_UP_ENERGY, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_FLOOR_JUMP, 42, NA_SE_NONE, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_VOICE, 44, NA_SE_VO_LI_FALL_L, STOP),
+};
+AnimSfxEntry D_8085DA38[] = {
+ ANIMSFX(ANIMSFX_TYPE_FLOOR, 1, NA_SE_PL_BOUND, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_VOICE, 1, NA_SE_VO_LI_DAMAGE_S, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_FLOOR_BY_AGE, 39, NA_SE_PL_LAND_GROUND, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_FLOOR_LAND, 49, NA_SE_NONE, STOP),
+};
+
+// gPlayerAnim_cl_nigeru
+AnimSfxEntry D_8085DA48[] = {
+ ANIMSFX(ANIMSFX_TYPE_6, 1, NA_SE_NONE, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_6, 5, NA_SE_NONE, STOP),
+};
+AnimSfxEntry D_8085DA50[] = {
+ ANIMSFX(ANIMSFX_TYPE_6, 10, NA_SE_NONE, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_6, 13, NA_SE_NONE, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_6, 16, NA_SE_NONE, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_6, 19, NA_SE_NONE, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_6, 22, NA_SE_NONE, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_FLOOR, 22, NA_SE_PL_SLIP, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_VOICE, 55, NA_SE_VO_LI_DAMAGE_S, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_FLOOR_LAND, 62, NA_SE_NONE, STOP),
+};
+
+AnimSfxEntry D_8085DA70[] = {
+ ANIMSFX(ANIMSFX_TYPE_6, 42, NA_SE_NONE, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_6, 48, NA_SE_NONE, STOP),
+};
+AnimSfxEntry D_8085DA78[] = {
+ ANIMSFX(ANIMSFX_TYPE_FLOOR, 2, NA_SE_PL_BOUND, STOP),
+};
+AnimSfxEntry D_8085DA7C[] = {
+ ANIMSFX(ANIMSFX_TYPE_VOICE, 5, NA_SE_VO_LI_FREEZE, STOP),
+};
+AnimSfxEntry D_8085DA80[] = {
+ ANIMSFX(ANIMSFX_TYPE_VOICE, 1, NA_SE_VO_LI_FALL_L, STOP),
+};
+AnimSfxEntry D_8085DA84[] = {
+ ANIMSFX(ANIMSFX_TYPE_VOICE, 13, NA_SE_VO_LI_HANG, STOP),
+};
+AnimSfxEntry D_8085DA88[] = {
+ ANIMSFX(ANIMSFX_TYPE_FLOOR_LAND, 26, NA_SE_NONE, STOP),
+};
+AnimSfxEntry D_8085DA8C[] = {
+ ANIMSFX(ANIMSFX_TYPE_VOICE, 4, NA_SE_VO_LI_SURPRISE, STOP),
+};
+AnimSfxEntry D_8085DA90[] = {
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 18, NA_SE_PL_SIT_ON_HORSE, STOP),
+};
+
+void func_80859028(PlayState* play, Player* this, void* anim) {
+ if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ func_80858D48(play, this, anim);
+ this->unk_AE8 = 1;
+ }
+
+ if (this->skelAnime.animation == &gPlayerAnim_okiagaru_tatu) {
+ Player_PlayAnimSfx(this, D_8085DA08);
+ } else if (this->skelAnime.animation == &gPlayerAnim_lost_horse) {
+ Player_PlayAnimSfx(this, D_8085DA14);
+ } else if (this->skelAnime.animation == &gPlayerAnim_sirimochi) {
+ Player_PlayAnimSfx(this, D_8085DA38);
+ } else if (this->skelAnime.animation == &gPlayerAnim_alink_somukeru) {
+ Player_PlayAnimSfx(this, D_8085DA7C);
+ } else if (this->skelAnime.animation == &gPlayerAnim_al_fuwafuwa) {
+ Player_PlayAnimSfx(this, D_8085DA84);
+ } else if (this->skelAnime.animation == &gPlayerAnim_cl_umanoru) {
+ Player_PlayAnimSfx(this, D_8085DA90);
+ } else {
+ func_80858FE8(this);
+ }
+}
+
+void func_80859168(PlayState* play, Player* this, void* anim) {
+ if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ func_8082E794(this);
+ func_8082DB60(play, this, anim);
+ }
+}
+
+void func_808591BC(PlayState* play, Player* this, void* anim) {
+ if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ func_8082EB18(play, this, anim);
+ this->unk_AE8 = 1;
+ }
+}
+
+void func_80859210(PlayState* play, Player* this, void* arg2) {
+ PlayerAnimation_Update(play, &this->skelAnime);
+ Player_PlayAnimSfx(this, arg2);
+}
+
+void func_80859248(Player* this) {
+ if ((this->unk_398 == NULL) || (this->unk_398->update == NULL)) {
+ this->unk_398 = NULL;
+ }
+ this->targetedActor = this->unk_398;
+ if (this->unk_398 != NULL) {
+ this->actor.shape.rot.y = func_8083C62C(this, 0);
+ }
+}
+
+void func_8085929C(PlayState* play, Player* this, UNK_TYPE arg2) {
+ this->stateFlags1 |= PLAYER_STATE1_8000000;
+ this->stateFlags2 |= PLAYER_STATE2_400;
+ this->stateFlags1 &= ~(PLAYER_STATE1_40000 | PLAYER_STATE1_80000);
+ Player_AnimationPlayLoop(play, this, &gPlayerAnim_link_swimer_swim);
+ this->linearVelocity = 0.0f;
+}
+
+void func_80859300(PlayState* play, Player* this, UNK_TYPE arg2) {
+ this->actor.gravity = 0.0f;
+
+ if (this->unk_AE7 == 0) {
+ if ((this->transformation == PLAYER_FORM_DEKU) || func_8083B3B4(play, this, NULL)) {
+ this->unk_AE7 = 1;
+ } else {
+ func_808477D0(play, this, NULL, fabsf(this->actor.velocity.y));
+ Math_ScaledStepToS(&this->unk_AAA, -0x2710, 0x320);
+ func_8084748C(this, &this->actor.velocity.y, 4.0f, this->currentYaw);
+ }
+ } else {
+ if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ if (this->unk_AE7 == 1) {
+ func_8082E634(play, this, &gPlayerAnim_link_swimer_swim_wait);
+ } else {
+ Player_AnimationPlayLoop(play, this, &gPlayerAnim_link_swimer_swim_wait);
+ }
+ }
+ func_808475B4(this);
+ func_8084748C(this, &this->linearVelocity, 0.0f, this->actor.shape.rot.y);
+ }
+}
+
+void func_80859414(PlayState* play, Player* this, UNK_TYPE arg2) {
+ func_80859248(this);
+
+ if (func_801242B4(this)) {
+ func_80859300(play, this, 0);
+ } else {
+ PlayerAnimation_Update(play, &this->skelAnime);
+ 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);
+ }
+ }
+}
+
+void func_808594D0(PlayState* play, Player* this, UNK_TYPE arg2) {
+ if (this->stateFlags1 & PLAYER_STATE1_8000000) {
+ func_8085929C(play, this, 0);
+ } else {
+ PlayerAnimationHeader* anim = D_8085BE84[PLAYER_ANIMGROUP_43][this->modelAnimType];
+
+ if ((this->unk_396 == 6) || (this->unk_396 == 0x2E)) {
+ Player_AnimationPlayOnce(play, this, anim);
+ } else {
+ func_8082E784(this);
+ PlayerAnimation_Change(play, &this->skelAnime, anim, 2.0f / 3.0f, 0.0f, Animation_GetLastFrame(anim),
+ ANIMMODE_LOOP, -4.0f);
+ }
+ Player_StopHorizontalMovement(this);
+ }
+}
+
+void func_808595B8(PlayState* play, Player* this, UNK_TYPE arg2) {
+ if (func_80847880(play, this)) {
+ return;
+ }
+
+ if ((this->csMode == PLAYER_CSMODE_20) && (play->csCtx.state == CS_STATE_IDLE)) {
+ func_800B7298(play, NULL, PLAYER_CSMODE_END);
+ } else if (this->stateFlags1 & PLAYER_STATE1_8000000) {
+ func_80859300(play, this, 0);
+ this->actor.velocity.y = 0.0f;
+ } else {
+ PlayerAnimation_Update(play, &this->skelAnime);
+ if (func_801240DC(this) || (this->stateFlags1 & PLAYER_STATE1_800)) {
+ func_8083216C(this, play);
+ }
+ }
+}
+
+void func_8085968C(PlayState* play, Player* this, UNK_TYPE arg2) {
+ if (this->actor.id == ACTOR_EN_TEST3) {
+ func_80838830(this, OBJECT_GI_MSSA);
+ this->stateFlags1 |= PLAYER_STATE1_400;
+ }
+
+ func_8082DB90(play, this,
+ (this->transformation == PLAYER_FORM_DEKU) ? &gPlayerAnim_pn_getA : &gPlayerAnim_link_demo_get_itemA);
+}
+
+void func_80859708(PlayState* play, Player* this, UNK_TYPE arg2) {
+ PlayerAnimation_Update(play, &this->skelAnime);
+ if ((this->actor.id == ACTOR_EN_TEST3) && Animation_OnFrame(&this->skelAnime, 20.0f)) {
+ this->getItemDrawIdPlusOne = GID_MASK_SUN + 1;
+ func_80151BB4(play, 0x1B);
+ Audio_PlayFanfare(NA_BGM_GET_NEW_MASK);
+ }
+}
+
+void func_8085978C(PlayState* play, Player* this, UNK_TYPE arg2) {
+ f32 linearVelocity;
+ s16 yaw;
+
+ this->stateFlags1 &= ~PLAYER_STATE1_2000000;
+
+ yaw = Math_Vec3f_Yaw(&this->actor.world.pos, &this->unk_3A0);
+ linearVelocity = this->linearVelocity;
+ this->actor.world.rot.y = yaw;
+ this->actor.shape.rot.y = yaw;
+ this->currentYaw = yaw;
+ if (linearVelocity <= 0.0f) {
+ this->linearVelocity = 0.1f;
+ } else if (linearVelocity > 2.5f) {
+ this->linearVelocity = 2.5f;
+ }
+
+ if ((this->transformation != PLAYER_FORM_HUMAN) && (play->roomCtx.curRoom.behaviorType1 == ROOM_BEHAVIOR_TYPE1_5)) {
+ R_PLAY_FILL_SCREEN_ON = 45;
+ R_PLAY_FILL_SCREEN_R = 255;
+ R_PLAY_FILL_SCREEN_G = 255;
+ R_PLAY_FILL_SCREEN_B = 255;
+ R_PLAY_FILL_SCREEN_ALPHA = 0;
+ play_sound(NA_SE_SY_WHITE_OUT_T);
+ }
+}
+
+void func_80859890(PlayState* play, Player* this, UNK_TYPE arg2) {
+ f32 sp24;
+
+ if (R_PLAY_FILL_SCREEN_ON > 0) {
+ R_PLAY_FILL_SCREEN_ALPHA += R_PLAY_FILL_SCREEN_ON;
+ if (R_PLAY_FILL_SCREEN_ALPHA > 255) {
+ R_PLAY_FILL_SCREEN_ON = -64;
+ R_PLAY_FILL_SCREEN_ALPHA = 255;
+ gSaveContext.save.playerForm = PLAYER_FORM_HUMAN;
+ this->actor.update = func_8012301C;
+ this->actor.draw = NULL;
+ this->unk_AE7 = 0;
+ }
+ } else if (R_PLAY_FILL_SCREEN_ON < 0) {
+ R_PLAY_FILL_SCREEN_ALPHA += R_PLAY_FILL_SCREEN_ON;
+ if (R_PLAY_FILL_SCREEN_ALPHA < 0) {
+ R_PLAY_FILL_SCREEN_ON = 0;
+ R_PLAY_FILL_SCREEN_ALPHA = 0;
+ }
+ } else {
+ sp24 = 2.5f;
+ func_808411D4(play, this, &sp24, 0xA);
+ this->unk_AE8++;
+ if (this->unk_AE8 >= 0x15) {
+ this->csMode = PLAYER_CSMODE_10;
+ }
+ }
+}
+
+void func_80859990(PlayState* play, Player* this, UNK_TYPE arg2) {
+ this->linearVelocity = 2.5f;
+ func_80835BF8(&this->actor.world.pos, this->actor.shape.rot.y, 180.0f, &this->unk_3A0);
+}
+
+void func_808599DC(PlayState* play, Player* this, UNK_TYPE arg2) {
+ f32 sp1C = 2.5f;
+
+ func_808411D4(play, this, &sp1C, 0xA);
+}
+
+void func_80859A10(PlayState* play, Player* this, UNK_TYPE arg2) {
+ func_8083B23C(this, play);
+}
+
+void func_80859A44(PlayState* play, Player* this, UNK_TYPE arg2) {
+ func_80859248(this);
+ if (this->unk_AE8 != 0) {
+ if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ Player_AnimationPlayLoop(play, this, func_8082EF54(this));
+ this->unk_AE8 = 0;
+ }
+ func_8082FC60(this);
+ } else {
+ func_8083E958(play, this);
+ }
+}
+
+void func_80859AD0(PlayState* play, Player* this, UNK_PTR arg2) {
+ func_80840F90(play, this, arg2, 0.0f, 0, 0);
+}
+
+void func_80859AF8(PlayState* play, Player* this, UNK_PTR arg2) {
+ this->actor.shape.face = 0xF;
+ func_80840F90(play, this, arg2, 0.0f, 0, 0);
+}
+
+void func_80859B28(PlayState* play, Player* this, UNK_PTR arg2) {
+ func_80840F90(play, this, arg2, 0.0f, 0, 1);
+}
+
+void func_80859B54(PlayState* play, Player* this, UNK_TYPE arg2) {
+ func_80858CC8(play, this, &gPlayerAnim_link_normal_okarina_start);
+ this->itemAction = PLAYER_IA_OCARINA;
+ Player_SetModels(this, Player_ActionToModelGroup(this, this->itemAction));
+}
+
+void Player_Cutscene_Translate(PlayState* play, Player* this, CsCmdActorCue* playerAction) {
+ f32 startX = playerAction->startPos.x;
+ f32 startY = playerAction->startPos.y;
+ f32 startZ = playerAction->startPos.z;
+ f32 diffX = playerAction->endPos.x - startX;
+ f32 diffY = playerAction->endPos.y - startY;
+ f32 diffZ = playerAction->endPos.z - startZ;
+ f32 progress = (((f32)(play->csCtx.curFrame - playerAction->startFrame)) /
+ ((f32)(playerAction->endFrame - playerAction->startFrame)));
+
+ this->actor.world.pos.x = (diffX * progress) + startX;
+ this->actor.world.pos.y = (diffY * progress) + startY;
+ this->actor.world.pos.z = (diffZ * progress) + startZ;
+}
+
+void func_80859C60(PlayState* play, Player* this, void* arg2) {
+ if (arg2 != NULL) {
+ Player_Cutscene_Translate(play, this, arg2);
+ }
+
+ PlayerAnimation_Update(play, &this->skelAnime);
+}
+
+void func_80859CA0(PlayState* play, Player* this, s32 arg2) {
+ func_8082E514(play, this, D_8085BE84[PLAYER_ANIMGROUP_43][this->modelAnimType]);
+ Player_StopHorizontalMovement(this);
+}
+
+void func_80859CE0(PlayState* play, Player* this, s32 arg2) {
+ this->actor.draw = Player_Draw;
+}
+
+void func_80859CFC(PlayState* play, Player* this, UNK_TYPE arg2) {
+ func_80841358(play, this, false);
+ func_8082DB90(play, this, &gPlayerAnim_link_demo_return_to_past);
+}
+
+void func_80859D44(PlayState* play, Player* this, UNK_TYPE arg2) {
+ PlayerAnimation_Update(play, &this->skelAnime);
+}
+
+struct_8085DA94 D_8085DA94[PLAYER_CSMODE_MAX] = {
+ /* PLAYER_CSMODE_0 */ { 0, { NULL } },
+ /* PLAYER_CSMODE_1 */ { -1, { func_808594D0 } },
+ /* PLAYER_CSMODE_2 */ { 0, { NULL } },
+ /* PLAYER_CSMODE_3 */ { 0, { NULL } },
+ /* PLAYER_CSMODE_4 */ { 3, { &gPlayerAnim_link_demo_bikkuri } },
+ /* PLAYER_CSMODE_5 */ { 0, { NULL } },
+ /* PLAYER_CSMODE_END */ { 0, { NULL } },
+ /* PLAYER_CSMODE_WAIT */ { -1, { func_808594D0 } },
+ /* PLAYER_CSMODE_8 */ { 2, { &gPlayerAnim_link_demo_furimuki } },
+ /* PLAYER_CSMODE_9 */ { -1, { func_8085978C } },
+ /* PLAYER_CSMODE_10 */ { 3, { &gPlayerAnim_link_demo_warp } },
+ /* PLAYER_CSMODE_11 */ { 5, { &gPlayerAnim_clink_demo_standup } },
+ /* PLAYER_CSMODE_12 */ { 7, { &gPlayerAnim_clink_demo_standup_wait } },
+ /* PLAYER_CSMODE_13 */ { 2, { &gPlayerAnim_link_demo_baru_op3 } },
+ /* PLAYER_CSMODE_14 */ { 0, { NULL } },
+ /* PLAYER_CSMODE_15 */ { 3, { &gPlayerAnim_link_demo_jibunmiru } },
+ /* PLAYER_CSMODE_16 */ { -1, { func_80859B54 } },
+ /* PLAYER_CSMODE_17 */ { 2, { &gPlayerAnim_link_normal_okarina_end } },
+ /* PLAYER_CSMODE_18 */ { 16, { &gPlayerAnim_link_normal_hang_up_down } },
+ /* PLAYER_CSMODE_19 */ { -1, { func_80859CA0 } },
+ /* PLAYER_CSMODE_20 */ { -1, { func_808594D0 } },
+ /* PLAYER_CSMODE_21 */ { 3, { &gPlayerAnim_clink_demo_mimawasi } },
+ /* PLAYER_CSMODE_22 */ { 6, { &gPlayerAnim_om_get_mae } },
+ /* PLAYER_CSMODE_23 */ { 3, { &gPlayerAnim_link_demo_look_hand } },
+ /* PLAYER_CSMODE_24 */ { 3, { &gPlayerAnim_link_normal_wait_typeB_20f } },
+ /* PLAYER_CSMODE_25 */ { -1, { func_80859CFC } },
+ /* PLAYER_CSMODE_26 */ { -1, { func_8085A66C } },
+ /* PLAYER_CSMODE_27 */ { 3, { &gPlayerAnim_link_demo_zeldamiru } },
+ /* PLAYER_CSMODE_28 */ { 3, { &gPlayerAnim_link_demo_kenmiru1 } },
+ /* PLAYER_CSMODE_29 */ { 3, { &gPlayerAnim_link_demo_kenmiru2 } },
+ /* PLAYER_CSMODE_30 */ { 3, { &gPlayerAnim_link_demo_kenmiru2_modori } },
+ /* PLAYER_CSMODE_31 */ { 6, { &gameplay_keep_Linkanim_00D310 } },
+ /* PLAYER_CSMODE_32 */ { -1, { func_80859FCC } },
+ /* PLAYER_CSMODE_33 */ { 3, { &gPlayerAnim_demo_rakka } },
+ /* PLAYER_CSMODE_34 */ { 4, { &gPlayerAnim_demo_pikupiku } },
+ /* PLAYER_CSMODE_35 */ { 3, { &gameplay_keep_Linkanim_00D2B8 } },
+ /* PLAYER_CSMODE_36 */ { -1, { func_8085A120 } },
+ /* PLAYER_CSMODE_37 */ { -1, { func_8085A19C } },
+ /* PLAYER_CSMODE_38 */ { 6, { &gameplay_keep_Linkanim_00D278 } },
+ /* PLAYER_CSMODE_39 */ { 6, { &gameplay_keep_Linkanim_00D288 } },
+ /* PLAYER_CSMODE_40 */ { 5, { &gPlayerAnim_rakuba } },
+ /* PLAYER_CSMODE_41 */ { 5, { &gPlayerAnim_bajyo_furikaeru } },
+ /* PLAYER_CSMODE_42 */ { 5, { &gPlayerAnim_okiagaru } },
+ /* PLAYER_CSMODE_43 */ { 5, { &gPlayerAnim_okiagaru_tatu } },
+ /* PLAYER_CSMODE_44 */ { 7, { &gPlayerAnim_bajyo_walk } },
+ /* PLAYER_CSMODE_45 */ { 5, { &gPlayerAnim_rakka } },
+ /* PLAYER_CSMODE_46 */ { 5, { &gPlayerAnim_sirimochi } },
+ /* PLAYER_CSMODE_47 */ { 5, { &gPlayerAnim_spotlight } },
+ /* PLAYER_CSMODE_48 */ { 3, { &gPlayerAnim_al_hensin } },
+ /* PLAYER_CSMODE_49 */ { 5, { &gPlayerAnim_dl_jibunmiru } },
+ /* PLAYER_CSMODE_50 */ { 5, { &gPlayerAnim_vs_yousei } },
+ /* PLAYER_CSMODE_51 */ { 5, { &gPlayerAnim_urusai } },
+ /* PLAYER_CSMODE_52 */ { 5, { &gPlayerAnim_okarinatori } },
+ /* PLAYER_CSMODE_53 */ { 5, { &gPlayerAnim_lost_horse } },
+ /* PLAYER_CSMODE_54 */ { 4, { &gPlayerAnim_lost_horse_wait } },
+ /* PLAYER_CSMODE_55 */ { 5, { &gPlayerAnim_lost_horse2 } },
+ /* PLAYER_CSMODE_56 */ { 14, { &gPlayerAnim_okarinatori } },
+ /* PLAYER_CSMODE_57 */ { 5, { &gPlayerAnim_cl_tobikakaru } },
+ /* PLAYER_CSMODE_58 */ { -1, { func_8085978C } },
+ /* PLAYER_CSMODE_59 */ { 5, { &gameplay_keep_Linkanim_00D0A0 } },
+ /* PLAYER_CSMODE_60 */ { 2, { &gPlayerAnim_cl_furafura } },
+ /* PLAYER_CSMODE_61 */ { 7, { &gPlayerAnim_cl_nigeru } },
+ /* PLAYER_CSMODE_62 */ { 5, { &gPlayerAnim_cl_ononoki } },
+ /* PLAYER_CSMODE_63 */ { 3, { &gPlayerAnim_al_gaku } },
+ /* PLAYER_CSMODE_64 */ { 3, { &gPlayerAnim_al_fuwafuwa } },
+ /* PLAYER_CSMODE_65 */ { 3, { &gPlayerAnim_al_fuwafuwa_modori } },
+ /* PLAYER_CSMODE_66 */ { 3, { &gPlayerAnim_al_elf_tobidasi } },
+ /* PLAYER_CSMODE_67 */ { -1, { func_8085968C } },
+ /* PLAYER_CSMODE_68 */ { -1, { func_8085A24C } },
+ /* PLAYER_CSMODE_69 */ { -1, { func_8085A330 } },
+ /* PLAYER_CSMODE_70 */ { 7, { &gPlayerAnim_cl_tewofuru } },
+ /* PLAYER_CSMODE_71 */ { 5, { &gPlayerAnim_cl_jibun_miru } },
+ /* PLAYER_CSMODE_72 */ { 5, { &gPlayerAnim_cl_hoo } },
+ /* PLAYER_CSMODE_73 */ { 3, { &gPlayerAnim_al_yareyare } },
+ /* PLAYER_CSMODE_74 */ { 3, { &gPlayerAnim_al_yes } },
+ /* PLAYER_CSMODE_75 */ { 3, { &gPlayerAnim_al_no } },
+ /* PLAYER_CSMODE_76 */ { 3, { &gPlayerAnim_al_unun } },
+ /* PLAYER_CSMODE_77 */ { 7, { &gPlayerAnim_dl_yusaburu } },
+ /* PLAYER_CSMODE_78 */ { 5, { &gPlayerAnim_dl_kokeru } },
+ /* PLAYER_CSMODE_79 */ { 3, { &gPlayerAnim_alink_powerup } },
+ /* PLAYER_CSMODE_80 */ { 4, { &gPlayerAnim_alink_rakkatyu } },
+ /* PLAYER_CSMODE_81 */ { 3, { &gPlayerAnim_alink_kyoro } },
+ /* PLAYER_CSMODE_82 */ { 4, { &gPlayerAnim_alink_yurayura } },
+ /* PLAYER_CSMODE_83 */ { 3, { &gPlayerAnim_alink_somukeru } },
+ /* PLAYER_CSMODE_84 */ { 5, { &gPlayerAnim_alink_fukitobu } },
+ /* PLAYER_CSMODE_85 */ { 3, { &gameplay_keep_Linkanim_00CFC8 } },
+ /* PLAYER_CSMODE_86 */ { 4, { &gPlayerAnim_alink_tereru } },
+ /* PLAYER_CSMODE_87 */ { 5, { &gameplay_keep_Linkanim_00D1D0 } },
+ /* PLAYER_CSMODE_88 */ { 3, { &gPlayerAnim_alink_kaitenmiss } },
+ /* PLAYER_CSMODE_89 */ { 4, { &gameplay_keep_Linkanim_00CFC0 } },
+ /* PLAYER_CSMODE_90 */ { 4, { &gameplay_keep_Linkanim_00CFB8 } },
+ /* PLAYER_CSMODE_91 */ { 4, { &gameplay_keep_Linkanim_00D050 } },
+ /* PLAYER_CSMODE_92 */ { 4, { &gameplay_keep_Linkanim_00D048 } },
+ /* PLAYER_CSMODE_93 */ { -1, { func_8085A8C4 } },
+ /* PLAYER_CSMODE_94 */ { 3, { &gPlayerAnim_alink_ozigi } },
+ /* PLAYER_CSMODE_95 */ { 3, { &gPlayerAnim_alink_ozigi_modori } },
+ /* PLAYER_CSMODE_96 */ { 9, { &gPlayerAnim_link_normal_back_downA } },
+ /* PLAYER_CSMODE_97 */ { -1, { func_8085A530 } },
+ /* PLAYER_CSMODE_98 */ { 15, { &gPlayerAnim_cl_maskoff } },
+ /* PLAYER_CSMODE_99 */ { 7, { &gPlayerAnim_cl_kubisime } },
+ /* PLAYER_CSMODE_100 */ { 3, { &gPlayerAnim_alink_ee } },
+ /* PLAYER_CSMODE_101 */ { 3, { &gameplay_keep_Linkanim_00CFF0 } },
+ /* PLAYER_CSMODE_102 */ { -1, { func_8085A768 } },
+ /* PLAYER_CSMODE_103 */ { -1, { func_8085AA60 } },
+ /* PLAYER_CSMODE_104 */ { 5, { &gPlayerAnim_cl_dakisime } },
+ /* PLAYER_CSMODE_105 */ { 5, { &gPlayerAnim_kf_omen } },
+ /* PLAYER_CSMODE_106 */ { 5, { &gPlayerAnim_kf_dakiau } },
+ /* PLAYER_CSMODE_107 */ { 5, { &gPlayerAnim_kf_hanare } },
+ /* PLAYER_CSMODE_108 */ { 5, { &gPlayerAnim_kf_miseau } },
+ /* PLAYER_CSMODE_109 */ { 5, { &gPlayerAnim_kf_awase } },
+ /* PLAYER_CSMODE_110 */ { 7, { &gPlayerAnim_kf_tetunagu_loop } },
+ /* PLAYER_CSMODE_111 */ { 3, { &gPlayerAnim_link_keirei } },
+ /* PLAYER_CSMODE_112 */ { 5, { &gPlayerAnim_cl_umanoru } },
+ /* PLAYER_CSMODE_113 */ { 5, { &gPlayerAnim_cl_wakare } },
+ /* PLAYER_CSMODE_114 */ { 4, { &gPlayerAnim_alink_dance_loop } },
+ /* PLAYER_CSMODE_115 */ { 2, { &gPlayerAnim_link_demo_goma_furimuki } },
+ /* PLAYER_CSMODE_116 */ { 7, { &gPlayerAnim_link_uma_anim_fastrun } },
+ /* PLAYER_CSMODE_117 */ { 5, { &gPlayerAnim_cl_umamiage } },
+ /* PLAYER_CSMODE_118 */ { 7, { &gPlayerAnim_demo_suwari1 } },
+ /* PLAYER_CSMODE_119 */ { 7, { &gPlayerAnim_demo_suwari2 } },
+ /* PLAYER_CSMODE_120 */ { 7, { &gPlayerAnim_demo_suwari3 } },
+ /* PLAYER_CSMODE_121 */ { -1, { func_80859990 } },
+ /* PLAYER_CSMODE_122 */ { 0, { NULL } },
+ /* PLAYER_CSMODE_123 */ { -1, { func_80859A10 } },
+ /* PLAYER_CSMODE_124 */ { 7, { &gPlayerAnim_clink_demo_get1 } },
+ /* PLAYER_CSMODE_125 */ { 5, { &gPlayerAnim_clink_demo_get2 } },
+ /* PLAYER_CSMODE_126 */ { 5, { &gPlayerAnim_clink_demo_get3 } },
+ /* PLAYER_CSMODE_127 */ { 3, { &gPlayerAnim_link_demo_gurad } },
+ /* PLAYER_CSMODE_128 */ { 4, { &gPlayerAnim_link_demo_sita_wait } },
+ /* PLAYER_CSMODE_129 */ { 3, { &gPlayerAnim_L_1kyoro } },
+ /* PLAYER_CSMODE_130 */ { 3, { &gPlayerAnim_L_2kyoro } },
+ /* PLAYER_CSMODE_131 */ { 3, { &gPlayerAnim_L_sagaru } },
+ /* PLAYER_CSMODE_132 */ { 3, { &gPlayerAnim_L_bouzen } },
+ /* PLAYER_CSMODE_133 */ { 3, { &gPlayerAnim_L_kamaeru } },
+ /* PLAYER_CSMODE_134 */ { 3, { &gPlayerAnim_L_hajikareru } },
+ /* PLAYER_CSMODE_135 */ { 3, { &gPlayerAnim_L_ken_miru } },
+ /* PLAYER_CSMODE_136 */ { 3, { &gPlayerAnim_L_mukinaoru } },
+ /* PLAYER_CSMODE_137 */ { 3, { &gPlayerAnim_link_demo_return_to_past } },
+ /* PLAYER_CSMODE_138 */ { 3, { &gPlayerAnim_link_last_hit_motion1 } },
+ /* PLAYER_CSMODE_139 */ { 3, { &gPlayerAnim_link_last_hit_motion2 } },
+};
+
+struct_8085DA94 D_8085DEF4[PLAYER_CSMODE_MAX] = {
+ /* PLAYER_CSMODE_0 */ { 0, { NULL } },
+ /* PLAYER_CSMODE_1 */ { -1, { func_80859414 } },
+ /* PLAYER_CSMODE_2 */ { -1, { func_80859AD0 } },
+ /* PLAYER_CSMODE_3 */ { -1, { func_80859B28 } },
+ /* PLAYER_CSMODE_4 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_5 */ { -1, { func_8085ADA0 } },
+ /* PLAYER_CSMODE_END */ { -1, { func_8085AACC } },
+ /* PLAYER_CSMODE_WAIT */ { -1, { func_808595B8 } },
+ /* PLAYER_CSMODE_8 */ { 18, { D_8085DA70 } },
+ /* PLAYER_CSMODE_9 */ { -1, { func_80859890 } },
+ /* PLAYER_CSMODE_10 */ { -1, { func_80859C60 } },
+ /* PLAYER_CSMODE_11 */ { 18, { D_8085D9E0 } },
+ /* PLAYER_CSMODE_12 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_13 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_14 */ { 0, { NULL } },
+ /* PLAYER_CSMODE_15 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_16 */ { 17, { &gPlayerAnim_link_normal_okarina_swing } },
+ /* PLAYER_CSMODE_17 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_18 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_19 */ { -1, { func_8085A710 } },
+ /* PLAYER_CSMODE_20 */ { -1, { func_808595B8 } },
+ /* PLAYER_CSMODE_21 */ { 12, { &gPlayerAnim_clink_demo_mimawasi_wait } },
+ /* PLAYER_CSMODE_22 */ { -1, { func_80859D70 } },
+ /* PLAYER_CSMODE_23 */ { 12, { &gPlayerAnim_link_demo_look_hand_wait } },
+ /* PLAYER_CSMODE_24 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_25 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_26 */ { -1, { func_8085A6C0 } },
+ /* PLAYER_CSMODE_27 */ { 12, { &gPlayerAnim_link_demo_zeldamiru_wait } },
+ /* PLAYER_CSMODE_28 */ { 12, { &gPlayerAnim_link_demo_kenmiru1_wait } },
+ /* PLAYER_CSMODE_29 */ { 12, { &gPlayerAnim_link_demo_kenmiru2_wait } },
+ /* PLAYER_CSMODE_30 */ { 12, { &gPlayerAnim_demo_link_nwait } },
+ /* PLAYER_CSMODE_31 */ { 12, { &gameplay_keep_Linkanim_00D318 } },
+ /* PLAYER_CSMODE_32 */ { -1, { func_80859FF4 } },
+ /* PLAYER_CSMODE_33 */ { -1, { Player_Cutscene_TranslateReverse } },
+ /* PLAYER_CSMODE_34 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_35 */ { 12, { &gameplay_keep_Linkanim_00D2C0 } },
+ /* PLAYER_CSMODE_36 */ { -1, { func_8085A144 } },
+ /* PLAYER_CSMODE_37 */ { -1, { func_8085A1D4 } },
+ /* PLAYER_CSMODE_38 */ { 12, { &gameplay_keep_Linkanim_00D280 } },
+ /* PLAYER_CSMODE_39 */ { 12, { &gameplay_keep_Linkanim_00D290 } },
+ /* PLAYER_CSMODE_40 */ { 18, { D_8085D9F0 } },
+ /* PLAYER_CSMODE_41 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_42 */ { 18, { D_8085DA00 } },
+ /* PLAYER_CSMODE_43 */ { 13, { &gPlayerAnim_okiagaru_wait } },
+ /* PLAYER_CSMODE_44 */ { -1, { func_8085A364 } },
+ /* PLAYER_CSMODE_45 */ { 18, { D_8085DA2C } },
+ /* PLAYER_CSMODE_46 */ { 12, { &gPlayerAnim_sirimochi_wait } },
+ /* PLAYER_CSMODE_47 */ { 12, { &gPlayerAnim_spotlight_wait } },
+ /* PLAYER_CSMODE_48 */ { 12, { &gPlayerAnim_al_hensin_loop } },
+ /* PLAYER_CSMODE_49 */ { 12, { &gPlayerAnim_dl_jibunmiru_wait } },
+ /* PLAYER_CSMODE_50 */ { 18, { D_8085DA50 } },
+ /* PLAYER_CSMODE_51 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_52 */ { 18, { D_8085D9FC } },
+ /* PLAYER_CSMODE_53 */ { 12, { &gPlayerAnim_lost_horse_wait } },
+ /* PLAYER_CSMODE_54 */ { -1, { func_8085A364 } },
+ /* PLAYER_CSMODE_55 */ { 18, { D_8085DA1C } },
+ /* PLAYER_CSMODE_56 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_57 */ { 18, { D_8085DA0C } },
+ /* PLAYER_CSMODE_58 */ { -1, { func_808599DC } },
+ /* PLAYER_CSMODE_59 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_60 */ { 18, { D_8085DA28 } },
+ /* PLAYER_CSMODE_61 */ { -1, { func_8085A364 } },
+ /* PLAYER_CSMODE_62 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_63 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_64 */ { 12, { &gPlayerAnim_al_fuwafuwa_loop } },
+ /* PLAYER_CSMODE_65 */ { -1, { func_8085A40C } },
+ /* PLAYER_CSMODE_66 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_67 */ { -1, { func_80859708 } },
+ /* PLAYER_CSMODE_68 */ { -1, { func_8085A2AC } },
+ /* PLAYER_CSMODE_69 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_70 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_71 */ { -1, { func_8085A40C } },
+ /* PLAYER_CSMODE_72 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_73 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_74 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_75 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_76 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_77 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_78 */ { 18, { D_8085DA78 } },
+ /* PLAYER_CSMODE_79 */ { 12, { &gPlayerAnim_alink_powerup_loop } },
+ /* PLAYER_CSMODE_80 */ { -1, { func_8085A364 } },
+ /* PLAYER_CSMODE_81 */ { 12, { &gPlayerAnim_alink_kyoro_loop } },
+ /* PLAYER_CSMODE_82 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_83 */ { 12, { &gPlayerAnim_alink_somukeru_loop } },
+ /* PLAYER_CSMODE_84 */ { 18, { D_8085DA80 } },
+ /* PLAYER_CSMODE_85 */ { 12, { &gameplay_keep_Linkanim_00CFD0 } },
+ /* PLAYER_CSMODE_86 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_87 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_88 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_89 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_90 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_91 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_92 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_93 */ { -1, { func_8085A940 } },
+ /* PLAYER_CSMODE_94 */ { 12, { &gPlayerAnim_alink_ozigi_loop } },
+ /* PLAYER_CSMODE_95 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_96 */ { -1, { func_8085A4A4 } },
+ /* PLAYER_CSMODE_97 */ { -1, { func_8085A5DC } },
+ /* PLAYER_CSMODE_98 */ { -1, { func_8085AA84 } },
+ /* PLAYER_CSMODE_99 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_100 */ { 12, { &gPlayerAnim_alink_ee_loop } },
+ /* PLAYER_CSMODE_101 */ { 12, { &gameplay_keep_Linkanim_00CFF8 } },
+ /* PLAYER_CSMODE_102 */ { -1, { func_8085A7C0 } },
+ /* PLAYER_CSMODE_103 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_104 */ { 13, { &gPlayerAnim_cl_dakisime_loop } },
+ /* PLAYER_CSMODE_105 */ { 13, { &gPlayerAnim_kf_omen_loop } },
+ /* PLAYER_CSMODE_106 */ { 13, { &gPlayerAnim_kf_dakiau_loop } },
+ /* PLAYER_CSMODE_107 */ { 13, { &gPlayerAnim_kf_hanare_loop } },
+ /* PLAYER_CSMODE_108 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_109 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_110 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_111 */ { 12, { &gPlayerAnim_link_kei_wait } },
+ /* PLAYER_CSMODE_112 */ { 13, { &gPlayerAnim_cl_umanoru_loop } },
+ /* PLAYER_CSMODE_113 */ { 13, { &gPlayerAnim_cl_wakare_loop } },
+ /* PLAYER_CSMODE_114 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_115 */ { -1, { func_8085AA10 } },
+ /* PLAYER_CSMODE_116 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_117 */ { -1, { func_8085A364 } },
+ /* PLAYER_CSMODE_118 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_119 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_120 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_121 */ { -1, { func_808599DC } },
+ /* PLAYER_CSMODE_122 */ { -1, { func_80859AF8 } },
+ /* PLAYER_CSMODE_123 */ { -1, { func_80859A44 } },
+ /* PLAYER_CSMODE_124 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_125 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_126 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_127 */ { 12, { &gPlayerAnim_link_demo_gurad_wait } },
+ /* PLAYER_CSMODE_128 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_129 */ { 12, { &gPlayerAnim_L_kw } },
+ /* PLAYER_CSMODE_130 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_131 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_132 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_133 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_134 */ { -1, { func_80859D44 } },
+ /* PLAYER_CSMODE_135 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_136 */ { 12, { &gPlayerAnim_L_kennasi_w } },
+ /* PLAYER_CSMODE_137 */ { -1, { func_80859EBC } },
+ /* PLAYER_CSMODE_138 */ { -1, { func_80859F4C } },
+ /* PLAYER_CSMODE_139 */ { -1, { func_80859F4C } },
+};
+
+PlayerAnimationHeader* D_8085E354[PLAYER_FORM_MAX] = {
+ &gPlayerAnim_L_okarina_get, // PLAYER_FORM_FIERCE_DEITY
+ &gPlayerAnim_L_okarina_get, // PLAYER_FORM_GORON
+ &gPlayerAnim_L_okarina_get, // PLAYER_FORM_ZORA
+ &gPlayerAnim_L_okarina_get, // PLAYER_FORM_DEKU
+ &gPlayerAnim_om_get, // PLAYER_FORM_HUMAN
+};
+
+struct_8085E368 D_8085E368[PLAYER_FORM_MAX] = {
+ { { -200, 700, 100 }, { 800, 600, 800 } }, // PLAYER_FORM_FIERCE_DEITY
+ { { -200, 700, 100 }, { 800, 600, 800 } }, // PLAYER_FORM_GORON
+ { { -200, 700, 100 }, { 800, 600, 800 } }, // PLAYER_FORM_ZORA
+ { { -200, 700, 100 }, { 800, 600, 800 } }, // PLAYER_FORM_DEKU
+ { { -200, 500, 0 }, { 600, 400, 600 } }, // PLAYER_FORM_HUMAN
+};
+
+Color_RGBA8 D_8085E3A4 = { 255, 255, 255, 0 };
+Color_RGBA8 D_8085E3A8 = { 0, 128, 128, 0 };
+
+void func_80859D70(PlayState* play, Player* this, UNK_TYPE arg2) {
+ struct_8085E368* posInfo;
+ Vec3f effectPos;
+ Vec3f randPos;
+
+ func_808591BC(play, this, D_8085E354[this->transformation]);
+
+ if (this->rightHandType != 0xFF) {
+ this->rightHandType = 0xFF;
+ } else {
+ posInfo = &D_8085E368[this->transformation];
+ randPos.x = randPlusMinusPoint5Scaled(posInfo->range.x) + posInfo->base.x;
+ randPos.y = randPlusMinusPoint5Scaled(posInfo->range.y) + posInfo->base.y;
+ randPos.z = randPlusMinusPoint5Scaled(posInfo->range.z) + posInfo->base.z;
+ SkinMatrix_Vec3fMtxFMultXYZ(&this->shieldMf, &randPos, &effectPos);
+ EffectSsKirakira_SpawnDispersed(play, &effectPos, &gZeroVec3f, &gZeroVec3f, &D_8085E3A4, &D_8085E3A8, 600, -10);
+ }
+}
+
+void func_80859EBC(PlayState* play, Player* this, s32 arg2) {
+ if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ func_8085AACC(play, this, arg2);
+ } else if (this->unk_AE8 == 0) {
+ Item_Give(play, ITEM_SWORD_RAZOR);
+ func_80841358(play, this, false);
+ } else {
+ func_808484CC(this);
+ }
+}
+
+void func_80859F4C(PlayState* play, Player* this, UNK_TYPE arg2) {
+ if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ func_8083FCF0(play, this, 0.0f, 99.0f, this->skelAnime.endFrame - 8.0f);
+ }
+ if (this->heldItemAction != PLAYER_IA_SWORD_GILDED) {
+ func_80841358(play, this, true);
+ }
+}
+
+void func_80859FCC(PlayState* play, Player* this, UNK_TYPE arg2) {
+ if (this->transformation != PLAYER_FORM_DEKU) {
+ gSaveContext.save.playerForm = PLAYER_FORM_DEKU;
+ }
+}
+
+void func_80859FF4(PlayState* play, Player* this, UNK_TYPE arg2) {
+ PlayerAnimation_Update(play, &this->skelAnime);
+ if (gSaveContext.save.playerForm != this->transformation) {
+ this->actor.update = func_8012301C;
+ this->actor.draw = NULL;
+ }
+}
+
+void Player_Cutscene_TranslateReverse(PlayState* play, Player* this, void* arg) {
+ CsCmdActorCue* playerAction = arg;
+ f32 xEnd = playerAction->endPos.x;
+ f32 yEnd = playerAction->endPos.y;
+ f32 zEnd = playerAction->endPos.z;
+ f32 xDiff;
+ f32 yDiff;
+ f32 zDiff;
+ f32 progress;
+
+ xDiff = playerAction->startPos.x - xEnd;
+ yDiff = playerAction->startPos.y - yEnd;
+ zDiff = playerAction->startPos.z - zEnd;
+
+ progress = ((f32)(playerAction->endFrame - play->csCtx.curFrame)) /
+ ((f32)(playerAction->endFrame - playerAction->startFrame));
+
+ this->actor.world.pos.x = (xDiff * progress) + xEnd;
+ this->actor.world.pos.y = (yDiff * progress) + yEnd;
+ this->actor.world.pos.z = (zDiff * progress) + zEnd;
+ PlayerAnimation_Update(play, &this->skelAnime);
+}
+
+void func_8085A120(PlayState* play, Player* this, UNK_TYPE arg2) {
+ if (this->transformation != PLAYER_FORM_FIERCE_DEITY) {
+ gSaveContext.save.playerForm = PLAYER_FORM_FIERCE_DEITY;
+ }
+}
+
+void func_8085A144(PlayState* play, Player* this, UNK_TYPE arg2) {
+ PlayerAnimation_Update(play, &this->skelAnime);
+ if (gSaveContext.save.playerForm != this->transformation) {
+ this->actor.update = func_8012301C;
+ this->actor.draw = NULL;
+ }
+}
+
+void func_8085A19C(PlayState* play, Player* this, UNK_TYPE arg2) {
+ Player_AnimationPlayOnce(play, this, &gPlayerAnim_demo_rakka);
+ this->unk_AAA = -0x8000;
+}
+
+void func_8085A1D4(PlayState* play, Player* this, UNK_TYPE arg2) {
+ PlayerAnimation_Update(play, &this->skelAnime);
+ this->actor.gravity = 0.0f;
+ Math_StepToF(&this->actor.velocity.y, -this->actor.terminalVelocity, -((f32)REG(68) / 100.0f));
+}
+
+void func_8085A24C(PlayState* play, Player* this, UNK_TYPE arg2) {
+ func_8082DB90(play, this, D_8085D17C[this->transformation]);
+ this->itemAction = PLAYER_IA_OCARINA;
+ Player_SetModels(this, Player_ActionToModelGroup(this, this->itemAction));
+}
+
+void func_8085A2AC(PlayState* play, Player* this, UNK_TYPE arg2) {
+ if ((PlayerAnimation_Update(play, &this->skelAnime)) &&
+ (this->skelAnime.animation == D_8085D17C[this->transformation])) {
+ func_808525C4(play, this);
+ return;
+ }
+ if (this->unk_AE8 != 0) {
+ func_8085255C(play, this);
+ }
+}
+
+void func_8085A330(PlayState* play, Player* this, UNK_TYPE arg2) {
+ Player_AnimationPlayOnceReverse(play, this, D_8085D17C[this->transformation]);
+}
+
+void func_8085A364(PlayState* play, Player* this, void* arg2) {
+ Player_Cutscene_Translate(play, this, arg2);
+ if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ func_8082EB18(play, this, &gPlayerAnim_cl_umamiage_loop);
+ }
+
+ if (this->skelAnime.animation == &gPlayerAnim_cl_nigeru) {
+ Player_PlayAnimSfx(this, D_8085DA48);
+ } else if (this->skelAnime.animation == &gPlayerAnim_alink_rakkatyu) {
+ func_800B8F98(&this->actor, NA_SE_PL_FLYING_AIR - SFX_FLAG);
+ } else {
+ func_80858FE8(this);
+ }
+}
+
+void func_8085A40C(PlayState* play, Player* this, void* arg2) {
+ if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ func_80859CA0(play, this, arg2);
+ } else if (this->skelAnime.animation == &gPlayerAnim_al_fuwafuwa_modori) {
+ Player_PlayAnimSfx(this, D_8085DA88);
+ } else if (this->skelAnime.animation == &gPlayerAnim_cl_jibun_miru) {
+ Player_PlayAnimSfx(this, D_8085DA8C);
+ }
+}
+
+void func_8085A4A4(PlayState* play, Player* this, void* arg2) {
+ if (PlayerAnimation_Update(play, &this->skelAnime) && (this->unk_AE8 == 0) &&
+ (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
+ Player_AnimationPlayOnce(play, this, &gPlayerAnim_link_normal_back_downB);
+ this->unk_AE8 = 1;
+ }
+ if (this->unk_AE8 != 0) {
+ func_80832F24(this);
+ }
+}
+
+void func_8085A530(PlayState* play, Player* this, void* arg2) {
+ PlayerAnimation_Change(play, &this->skelAnime, &gPlayerAnim_link_normal_give_other, 1.0f,
+ (play->sceneId == SCENE_ALLEY) ? IREG(56) : 0.0f,
+ Animation_GetLastFrame(&gPlayerAnim_link_normal_give_other), ANIMMODE_ONCE, -8.0f);
+}
+
+void func_8085A5DC(PlayState* play, Player* this, void* arg2) {
+ if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ if (this->unk_AE8++ >= 0x15) {
+ PlayerAnimation_Change(play, &this->skelAnime, &gPlayerAnim_pz_wait, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP,
+ -16.0f);
+ }
+ }
+}
+
+void func_8085A66C(PlayState* play, Player* this, void* arg2) {
+ if (func_801242B4(this)) {
+ func_8085929C(play, this, 0);
+ } else {
+ func_80858E40(play, this, &gPlayerAnim_link_demo_kousan);
+ }
+}
+
+void func_8085A6C0(PlayState* play, Player* this, void* anim) {
+ if (func_801242B4(this)) {
+ func_80859300(play, this, 0);
+ } else {
+ func_80858FBC(play, this, anim);
+ }
+}
+
+void func_8085A710(PlayState* play, Player* this, void* anim) {
+ func_80858FBC(play, this, anim);
+ if (func_8083D23C(this, play)) {
+ play->csCtx.state = CS_STATE_STOP;
+ CutsceneManager_Stop(CutsceneManager_GetCurrentCsId());
+ }
+}
+
+void func_8085A768(PlayState* play, Player* this, void* arg2) {
+ func_80838830(this, OBJECT_GI_RESERVE_C_01);
+ func_80858E40(play, this, &gPlayerAnim_link_normal_give_other);
+ this->stateFlags2 &= ~PLAYER_STATE2_1000000;
+}
+
+void func_8085A7C0(PlayState* play, Player* this, UNK_TYPE arg2) {
+ if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ if (this->unk_AE8 == 0) {
+ if ((Message_GetState(&play->msgCtx) == TEXT_STATE_CLOSING) ||
+ (Message_GetState(&play->msgCtx) == TEXT_STATE_NONE)) {
+ this->getItemDrawIdPlusOne = GID_NONE + 1;
+ this->unk_AE8 = -1;
+ } else {
+ this->getItemDrawIdPlusOne = GID_PENDANT_OF_MEMORIES + 1;
+ }
+ } else if (this->unk_AE8 < 0) {
+ if (Actor_HasParent(&this->actor, play)) {
+ this->actor.parent = NULL;
+ this->unk_AE8 = 1;
+ } else {
+ Actor_OfferGetItem(&this->actor, play, GI_PENDANT_OF_MEMORIES, 9999.9f, 9999.9f);
+ }
+ }
+ } else if (PlayerAnimation_OnFrame(&this->skelAnime, 4.0f)) {
+ SET_WEEKEVENTREG(WEEKEVENTREG_50_80);
+ }
+}
+
+void func_8085A8C4(PlayState* play, Player* this, UNK_TYPE arg2) {
+ if ((this->transformation != PLAYER_FORM_HUMAN) && (play->roomCtx.curRoom.behaviorType1 == ROOM_BEHAVIOR_TYPE1_5)) {
+ R_PLAY_FILL_SCREEN_ON = 45;
+ R_PLAY_FILL_SCREEN_R = 255;
+ R_PLAY_FILL_SCREEN_G = 255;
+ R_PLAY_FILL_SCREEN_B = 255;
+ R_PLAY_FILL_SCREEN_ALPHA = 0;
+ play_sound(NA_SE_SY_WHITE_OUT_T);
+ }
+}
+
+void func_8085A940(PlayState* play, Player* this, UNK_TYPE arg2) {
+ if (R_PLAY_FILL_SCREEN_ON > 0) {
+ R_PLAY_FILL_SCREEN_ALPHA += R_PLAY_FILL_SCREEN_ON;
+ if (R_PLAY_FILL_SCREEN_ALPHA > 255) {
+ R_PLAY_FILL_SCREEN_ON = -64;
+ R_PLAY_FILL_SCREEN_ALPHA = 255;
+ gSaveContext.save.playerForm = PLAYER_FORM_HUMAN;
+ this->actor.update = func_8012301C;
+ this->actor.draw = NULL;
+ this->unk_AE7 = 0;
+ }
+ } else if (R_PLAY_FILL_SCREEN_ON < 0) {
+ R_PLAY_FILL_SCREEN_ALPHA += R_PLAY_FILL_SCREEN_ON;
+ if (R_PLAY_FILL_SCREEN_ALPHA < 0) {
+ R_PLAY_FILL_SCREEN_ON = 0;
+ R_PLAY_FILL_SCREEN_ALPHA = 0;
+ }
+ } else {
+ PlayerAnimation_Update(play, &this->skelAnime);
+ }
+}
+
+void func_8085AA10(PlayState* play, Player* this, UNK_TYPE arg2) {
+ if (PlayerAnimation_Update(play, &this->skelAnime) && (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_DOOR)) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_DOOR);
+ }
+}
+
+void func_8085AA60(PlayState* play, Player* this, UNK_TYPE arg2) {
+ func_80848640(play, this);
+}
+
+void func_8085AA84(PlayState* play, Player* this, UNK_TYPE arg2) {
+ if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ this->stateFlags2 |= PLAYER_STATE2_1000000;
+ }
+}
+
+void func_8085AACC(PlayState* play, Player* this, UNK_TYPE arg2) {
+ if (func_801242B4(this)) {
+ func_808353DC(play, this);
+ func_8082DC64(play, this);
+ } else {
+ func_80839ED0(this, play);
+ if (!func_808391D8(this, play)) {
+ func_8083D23C(this, play);
+ }
+ }
+
+ this->csMode = PLAYER_CSMODE_0;
+ this->unk_AA5 = PLAYER_UNKAA5_0;
+}
+
+void Player_Cutscene_SetPosAndYawToStart(Player* this, CsCmdActorCue* playerAction) {
+ this->actor.world.pos.x = playerAction->startPos.x;
+ this->actor.world.pos.y = playerAction->startPos.y;
+ this->actor.world.pos.z = playerAction->startPos.z;
+
+ this->currentYaw = this->actor.shape.rot.y = playerAction->rot.y;
+}
+
+void Player_Cutscene_8085ABA8(Player* this, CsCmdActorCue* playerAction) {
+ f32 xDiff = playerAction->startPos.x - (s32)this->actor.world.pos.x;
+ f32 yDiff = playerAction->startPos.y - (s32)this->actor.world.pos.y;
+ f32 zDiff = playerAction->startPos.z - (s32)this->actor.world.pos.z;
+ f32 dist;
+ s16 temp_v0;
+
+ temp_v0 = (s16)playerAction->rot.y - this->actor.shape.rot.y;
+ dist = sqrtf(SQ(xDiff) + SQ(yDiff) + SQ(zDiff));
+ if (this->linearVelocity == 0.0f) {
+ if ((dist > 50.0f) || (ABS_ALT(temp_v0) > 0x4000)) {
+ Player_Cutscene_SetPosAndYawToStart(this, playerAction);
+ }
+ }
+
+ this->skelAnime.moveFlags = 0;
+ func_8082E784(this);
+}
+
+void func_8085AC9C(PlayState* play, Player* this, CsCmdActorCue* cue, struct_8085DA94* arg3) {
+ if (arg3->type > 0) {
+ D_8085D990[arg3->type](play, this, arg3->anim);
+ } else if (arg3->type < 0) {
+ arg3->func(play, this, cue);
+ }
+
+ if ((D_80862B6C & 4) && !(this->skelAnime.moveFlags & ANIM_FLAG_4)) {
+ this->skelAnime.morphTable[PLAYER_LIMB_ROOT - 1].y /= this->ageProperties->unk_08;
+ D_80862B6C = 0;
+ }
+}
+
+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);
+ }
+}
+
+void func_8085ADA0(PlayState* play, Player* this, s32 arg2) {
+ CsCmdActorCue* cue = (this->actor.id == ACTOR_EN_TEST3)
+ ? play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_506)]
+ : play->csCtx.playerCue;
+ s32 var_a0 = false;
+ s32 pad;
+ s32 csMode;
+
+ if ((play->csCtx.state == CS_STATE_IDLE) || (play->csCtx.state == CS_STATE_STOP) ||
+ (play->csCtx.state == CS_STATE_RUN_UNSTOPPABLE)) {
+ if ((D_8085D384[this->unk_396] == PLAYER_CSMODE_68) && (play->sceneId == SCENE_OKUJOU)) {
+ this->unk_AA5 = PLAYER_UNKAA5_5;
+
+ if (func_80838A90(this, play)) {
+ this->csMode = PLAYER_CSMODE_0;
+ }
+ return;
+ } else {
+ var_a0 = true;
+
+ if (D_8085D384[this->unk_396] != PLAYER_CSMODE_16) {
+ this->csMode = PLAYER_CSMODE_END;
+ func_800B7298(play, NULL, PLAYER_CSMODE_END);
+ this->unk_396 = 0;
+ Player_StopHorizontalMovement(this);
+ return;
+ }
+ }
+ }
+
+ if (!var_a0 && (cue == NULL)) {
+ this->actor.flags &= ~ACTOR_FLAG_40;
+ return;
+ }
+
+ if (!var_a0 && (this->unk_396 != cue->id)) {
+ csMode = D_8085D384[cue->id];
+
+ if ((csMode >= PLAYER_CSMODE_0) && (gDisablePlayerCsModeStartPos == 0)) {
+ if ((csMode == PLAYER_CSMODE_2) || (csMode == PLAYER_CSMODE_3)) {
+ Player_Cutscene_8085ABA8(this, cue);
+ } else {
+ Player_Cutscene_SetPosAndYawToStart(this, cue);
+ }
+ }
+
+ if (csMode == PLAYER_CSMODE_108) {
+ this->stateFlags3 |= PLAYER_STATE3_20000000;
+ } else if (csMode == PLAYER_CSMODE_110) {
+ this->stateFlags3 &= ~PLAYER_STATE3_20000000;
+ }
+
+ D_80862B6C = this->skelAnime.moveFlags;
+
+ func_8082E794(this);
+ func_8085AD5C(play, this, ABS_ALT(csMode));
+ func_8085AC9C(play, this, cue, &D_8085DA94[ABS_ALT(csMode)]);
+
+ this->unk_AE8 = 0;
+ this->unk_AE7 = 0;
+ this->unk_396 = cue->id;
+ }
+
+ csMode = D_8085D384[this->unk_396];
+ func_8085AC9C(play, this, cue, &D_8085DEF4[ABS_ALT(csMode)]);
+
+ if ((u16)cue->rot.x != 0) {
+ Math_SmoothStepToS(&this->actor.focus.rot.x, (u16)cue->rot.x, 4, 0x2710, 0);
+ func_80832754(this, false);
+ }
+}
+
+void func_8085B08C(Player* this, PlayState* play) {
+ if (this->csMode != this->prevCsMode) {
+ D_80862B6C = this->skelAnime.moveFlags;
+ func_8082E794(this);
+
+ this->prevCsMode = this->csMode;
+ func_8085AD5C(play, this, this->csMode);
+ func_8085AC9C(play, this, NULL, &D_8085DA94[this->csMode]);
+ }
+
+ func_8085AC9C(play, this, NULL, &D_8085DEF4[this->csMode]);
+}
+
+s32 Player_StartFishing(PlayState* play) {
+ Player* player = GET_PLAYER(play);
+
+ func_8082DE50(play, player);
+ func_80831990(play, player, ITEM_FISHING_ROD);
+ return 1;
+}
+
+// Player_GrabPlayerImpl? Player_GrabPlayerNoChecks?
+void func_8085B170(PlayState* play, Player* this) {
+ func_8082DE50(play, this);
+ Player_SetAction(play, this, func_80853CC0, 0);
+ Player_AnimationPlayOnce(play, this, &gPlayerAnim_link_normal_re_dead_attack);
+ this->stateFlags2 |= PLAYER_STATE2_80;
+ func_8082DAD4(this);
+ Player_AnimSfx_PlayVoice(this, NA_SE_VO_LI_HELD);
+}
+
+s32 Player_GrabPlayer(PlayState* play, Player* player) {
+ if (!Player_InBlockingCsMode(play, player) && (player->invincibilityTimer >= 0) && !func_801240DC(player)) {
+ if (!(player->stateFlags1 & (PLAYER_STATE1_80 | PLAYER_STATE1_2000 | PLAYER_STATE1_4000 | PLAYER_STATE1_100000 |
+ PLAYER_STATE1_200000 | PLAYER_STATE1_800000))) {
+ if (!(player->stateFlags2 & PLAYER_STATE2_80) && !(player->stateFlags3 & PLAYER_STATE3_80)) {
+ func_8085B170(play, player);
+ return true;
+ }
+ }
+ }
+
+ return false;
+}
+
+s32 func_8085B28C(PlayState* play, Player* this, PlayerCsMode csMode) {
+ Player* player = GET_PLAYER(play);
+
+ if (this != NULL) {
+ if (csMode == PLAYER_CSMODE_0) {
+ return func_8084E034 == this->actionFunc;
+ }
+
+ if ((this->actor.id == ACTOR_EN_TEST3) && (csMode < 0)) {
+ func_8083B0E4(play, this, this->actor.home.rot.y);
+ return false;
+ }
+
+ if (this->actor.id == ACTOR_EN_TEST3) {
+ player = this;
+ }
+ }
+
+ if ((player->actor.id == ACTOR_EN_TEST3) || !Player_InBlockingCsMode(play, player)) {
+ func_8082DE50(play, player);
+ Player_SetAction(play, player, func_8085B08C, 0);
+ player->csMode = csMode;
+ player->unk_398 = &this->actor;
+ func_8082DAD4(player);
+
+ return true;
+ }
+
+ return false;
+}
+
+void func_8085B384(Player* this, PlayState* play) {
+ Player_SetAction(play, this, func_80849FE0, 1);
+ func_8082E438(play, this, func_8082ED20(this));
+ this->currentYaw = this->actor.shape.rot.y;
+}
+
+/**
+ * Returns true if Player's health reaches zero
+ */
+s32 Player_InflictDamage(PlayState* play, s32 damage) {
+ Player* player = GET_PLAYER(play);
+
+ if ((player->stateFlags2 & PLAYER_STATE2_80) || !Player_InBlockingCsMode(play, player)) {
+ if (func_808339D4(play, player, damage) == 0) {
+ player->stateFlags2 &= ~PLAYER_STATE2_80;
+ return true;
+ }
+ }
+
+ return false;
+}
+
+// Start talking with the given actor
+void Player_TalkWithPlayer(PlayState* play, Actor* actor) {
+ s32 pad;
+ Player* player = GET_PLAYER(play);
+
+ func_808323C0(player, CS_ID_GLOBAL_TALK);
+ if ((player->talkActor != NULL) || (actor == player->tatlActor) ||
+ CHECK_FLAG_ALL(actor->flags, ACTOR_FLAG_1 | ACTOR_FLAG_40000)) {
+ actor->flags |= ACTOR_FLAG_TALK_REQUESTED;
+ }
+
+ player->talkActor = actor;
+ player->exchangeItemId = PLAYER_IA_NONE;
+ player->targetedActor = actor;
+
+ if (actor->textId == 0xFFFF) {
+ func_800B7298(play, actor, PLAYER_CSMODE_1);
+ actor->flags |= ACTOR_FLAG_TALK_REQUESTED;
+ func_8082DE14(play, player);
+ } else {
+ if (player->actor.flags & ACTOR_FLAG_TALK_REQUESTED) {
+ player->actor.textId = 0;
+ } else {
+ player->actor.flags |= ACTOR_FLAG_TALK_REQUESTED;
+ player->actor.textId = actor->textId;
+ }
+
+ if (player->stateFlags1 & PLAYER_STATE1_800000) {
+ s32 sp24 = player->unk_AE8;
+
+ func_8082DE14(play, player);
+ func_80837B60(play, player);
+ player->unk_AE8 = sp24;
+ } else {
+ if (func_801242B4(player)) {
+ func_80832558(play, player, func_80837B60);
+ func_8082E634(play, player, &gPlayerAnim_link_swimer_swim_wait);
+ } else if ((actor->category != ACTORCAT_NPC) || (player->heldItemAction == PLAYER_IA_FISHING_ROD)) {
+ func_80837B60(play, player);
+
+ if (!func_80123420(player)) {
+ if ((actor != player->tatlActor) && (actor->xzDistToPlayer < (actor->colChkInfo.cylRadius + 40))) {
+ func_8082DB90(play, player, &gPlayerAnim_link_normal_backspace);
+ } else {
+ Player_AnimationPlayLoop(play, player, func_8082ED20(player));
+ }
+ }
+ } else {
+ func_80832558(play, player, func_80837B60);
+ func_8082DB90(play, player,
+ (actor->xzDistToPlayer < (actor->colChkInfo.cylRadius + 40))
+ ? &gPlayerAnim_link_normal_backspace
+ : &gPlayerAnim_link_normal_talk_free);
+ }
+
+ if (player->skelAnime.animation == &gPlayerAnim_link_normal_backspace) {
+ func_8082E920(play, player, ANIM_FLAG_1 | ANIM_FLAG_8 | ANIM_FLAG_NOMOVE);
+ }
+ func_8082DAD4(player);
+ }
+
+ player->stateFlags1 |= PLAYER_STATE1_40 | PLAYER_STATE1_20000000;
+ }
+
+ if ((player->tatlActor == player->talkActor) && ((player->talkActor->textId & 0xFF00) != 0x200)) {
+ player->tatlActor->flags |= ACTOR_FLAG_TALK_REQUESTED;
+ }
+}
+
+void func_8085B74C(PlayState* play) {
+ Player* player = GET_PLAYER(play);
+ f32 temp_fv1;
+ f32 linearVelocity = player->linearVelocity;
+
+ if (linearVelocity < 0.0f) {
+ linearVelocity = -linearVelocity;
+ player->actor.world.rot.y += 0x8000;
+ }
+
+ temp_fv1 = R_RUN_SPEED_LIMIT / 100.0f;
+
+ if (temp_fv1 < linearVelocity) {
+ gSaveContext.entranceSpeed = temp_fv1;
+ } else {
+ gSaveContext.entranceSpeed = linearVelocity;
+ }
+
+ func_80835324(play, player, 400.0f,
+ (sPlayerConveyorSpeedIndex != CONVEYOR_SPEED_DISABLED) ? D_80862B16 : player->actor.world.rot.y);
+ player->stateFlags1 |= (PLAYER_STATE1_1 | PLAYER_STATE1_20000000);
+}
+
+void func_8085B820(PlayState* play, s16 arg1) {
+ Player* player = GET_PLAYER(play);
+
+ player->actor.focus.rot.y = arg1;
+ func_80836D8C(player);
+}
+
+PlayerItemAction func_8085B854(PlayState* play, Player* player, ItemId itemId) {
+ PlayerItemAction itemAction = Player_ItemToItemAction(player, itemId);
+
+ if ((itemAction >= PLAYER_IA_MASK_MIN) && (itemAction <= PLAYER_IA_MASK_MAX) &&
+ (itemAction == GET_IA_FROM_MASK(player->currentMask))) {
+ itemAction = PLAYER_IA_NONE;
+ }
+
+ if ((itemAction <= PLAYER_IA_NONE) || (itemAction >= PLAYER_IA_MAX)) {
+ return PLAYER_IA_MINUS1;
+ }
+
+ player->itemAction = PLAYER_IA_NONE;
+ player->actionFunc = NULL;
+ func_80831760(play, player, func_80853A5C, 0);
+ player->csId = CS_ID_GLOBAL_TALK;
+ player->itemAction = itemAction;
+ Player_AnimationPlayOnce(play, player, &gPlayerAnim_link_normal_give_other);
+ player->stateFlags1 |= (PLAYER_STATE1_40 | PLAYER_STATE1_20000000);
+ player->getItemDrawIdPlusOne = GID_NONE + 1;
+ player->exchangeItemId = itemAction;
+
+ return itemAction;
+}
+
+s32 func_8085B930(PlayState* play, PlayerAnimationHeader* talkAnim, AnimationMode animMode) {
+ Player* player = GET_PLAYER(play);
+
+ if (!(player->actor.flags & ACTOR_FLAG_TALK_REQUESTED)) {
+ return false;
+ }
+
+ PlayerAnimation_Change(play, &player->skelAnime, (talkAnim == NULL) ? func_8082ED20(player) : talkAnim, 2.0f / 3.0f,
+ 0.0f, Animation_GetLastFrame(talkAnim), animMode, -6.0f);
+ return true;
+}
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 ef88015b7..e63d414d9 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
@@ -65,7 +65,7 @@ void EffectEnIceBlock_Draw(PlayState* play, u32 index, EffectSs* this) {
gSPSegment(POLY_XLU_DISP++, 0x06,
play->objectCtx.status[this->rObjId].segment); // object: OBJECT_ICE_BLOCK
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
Matrix_Translate(this->pos.x, this->pos.y, this->pos.z, MTXMODE_NEW);
Matrix_Scale(scale, scale, scale, MTXMODE_APPLY);
Matrix_Mult(&play->billboardMtxF, MTXMODE_APPLY);
diff --git a/src/overlays/effects/ovl_Effect_Ss_Blast/z_eff_ss_blast.c b/src/overlays/effects/ovl_Effect_Ss_Blast/z_eff_ss_blast.c
index 2d80b4161..b1472e55d 100644
--- a/src/overlays/effects/ovl_Effect_Ss_Blast/z_eff_ss_blast.c
+++ b/src/overlays/effects/ovl_Effect_Ss_Blast/z_eff_ss_blast.c
@@ -68,7 +68,7 @@ void EffectSsBlast_Draw(PlayState* play, u32 index, EffectSs* this) {
radius = this->rScale * 0.0025f;
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gDPSetEnvColor(POLY_XLU_DISP++, this->rEnvColorR, this->rEnvColorG, this->rEnvColorB, this->rEnvColorA);
Play_GetFloorSurface(play, &mf, &this->pos);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, this->rPrimColorR, this->rPrimColorG, this->rPrimColorB, this->rPrimColorA);
diff --git a/src/overlays/effects/ovl_Effect_Ss_Bomb2/z_eff_ss_bomb2.c b/src/overlays/effects/ovl_Effect_Ss_Bomb2/z_eff_ss_bomb2.c
index b17a43fbe..c9565b968 100644
--- a/src/overlays/effects/ovl_Effect_Ss_Bomb2/z_eff_ss_bomb2.c
+++ b/src/overlays/effects/ovl_Effect_Ss_Bomb2/z_eff_ss_bomb2.c
@@ -92,7 +92,7 @@ void EffectSsBomb2_DrawFade(PlayState* play, u32 index, EffectSs* this) {
if (mtx != NULL) {
gSPMatrix(POLY_XLU_DISP++, mtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- func_8012C974(gfxCtx);
+ Gfx_SetupDL60_XluNoCD(gfxCtx);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, this->rPrimColorR, this->rPrimColorG, this->rPrimColorB,
this->rPrimColorA);
gDPSetEnvColor(POLY_XLU_DISP++, this->rEnvColorR, this->rEnvColorG, this->rEnvColorB, 0);
@@ -135,7 +135,7 @@ void EffectSsBomb2_DrawLayered(PlayState* play, u32 index, EffectSs* this) {
mtx2 = SkinMatrix_MtxFToNewMtx(gfxCtx, &mfResult);
if (mtx2 != NULL) {
- func_8012C974(gfxCtx);
+ Gfx_SetupDL60_XluNoCD(gfxCtx);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, this->rPrimColorR, this->rPrimColorG, this->rPrimColorB,
this->rPrimColorA);
gDPSetEnvColor(POLY_XLU_DISP++, this->rEnvColorR, this->rEnvColorG, this->rEnvColorB, 0);
diff --git a/src/overlays/effects/ovl_Effect_Ss_Bubble/z_eff_ss_bubble.c b/src/overlays/effects/ovl_Effect_Ss_Bubble/z_eff_ss_bubble.c
index 681aac01d..41c9f0692 100644
--- a/src/overlays/effects/ovl_Effect_Ss_Bubble/z_eff_ss_bubble.c
+++ b/src/overlays/effects/ovl_Effect_Ss_Bubble/z_eff_ss_bubble.c
@@ -59,7 +59,7 @@ void EffectSsBubble_Draw(PlayState* play, u32 index, EffectSs* this) {
Matrix_Scale(scale, scale, scale, MTXMODE_APPLY);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- func_8012C28C(gfxCtx);
+ Gfx_SetupDL25_Opa(gfxCtx);
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, 255);
gDPSetEnvColor(POLY_OPA_DISP++, 150, 150, 150, 0);
gSPSegment(POLY_OPA_DISP++, 0x08, this->gfx);
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 d8394b159..87e50fb5f 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
@@ -83,7 +83,7 @@ void EffectSsDFire_Draw(PlayState* play, u32 index, EffectSs* this) {
Matrix_Mult(&play->billboardMtxF, MTXMODE_APPLY);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- func_8012C974(gfxCtx);
+ Gfx_SetupDL60_XluNoCD(gfxCtx);
gDPSetEnvColor(POLY_XLU_DISP++, 255, 0, 0, 0);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 50, this->rAlpha);
diff --git a/src/overlays/effects/ovl_Effect_Ss_Dead_Db/z_eff_ss_dead_db.c b/src/overlays/effects/ovl_Effect_Ss_Dead_Db/z_eff_ss_dead_db.c
index 543363ade..556903ca1 100644
--- a/src/overlays/effects/ovl_Effect_Ss_Dead_Db/z_eff_ss_dead_db.c
+++ b/src/overlays/effects/ovl_Effect_Ss_Dead_Db/z_eff_ss_dead_db.c
@@ -82,7 +82,7 @@ void EffectSsDeadDb_Draw(PlayState* play, u32 index, EffectSs* this) {
if (mtx != NULL) {
gSPMatrix(POLY_XLU_DISP++, mtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- func_8012C974(gfxCtx);
+ Gfx_SetupDL60_XluNoCD(gfxCtx);
gDPSetEnvColor(POLY_XLU_DISP++, this->rEnvColorR, this->rEnvColorG, this->rEnvColorB, 0);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, this->rPrimColorR, this->rPrimColorG, this->rPrimColorB,
this->rPrimColorA);
diff --git a/src/overlays/effects/ovl_Effect_Ss_Dead_Dd/z_eff_ss_dead_dd.c b/src/overlays/effects/ovl_Effect_Ss_Dead_Dd/z_eff_ss_dead_dd.c
index 9f124d39e..c9fa170df 100644
--- a/src/overlays/effects/ovl_Effect_Ss_Dead_Dd/z_eff_ss_dead_dd.c
+++ b/src/overlays/effects/ovl_Effect_Ss_Dead_Dd/z_eff_ss_dead_dd.c
@@ -109,7 +109,7 @@ void EffectSsDeadDd_Draw(PlayState* play, u32 index, EffectSs* this) {
mtx = SkinMatrix_MtxFToNewMtx(gfxCtx, &mfResult);
if (mtx != NULL) {
- func_8012C974(gfxCtx);
+ Gfx_SetupDL60_XluNoCD(gfxCtx);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, this->rPrimColorR, this->rPrimColorG, this->rPrimColorB, this->rAlpha);
gDPSetEnvColor(POLY_XLU_DISP++, this->rEnvColorR, this->rEnvColorG, this->rEnvColorB, this->rAlpha);
gSPMatrix(POLY_XLU_DISP++, mtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
diff --git a/src/overlays/effects/ovl_Effect_Ss_Dead_Ds/z_eff_ss_dead_ds.c b/src/overlays/effects/ovl_Effect_Ss_Dead_Ds/z_eff_ss_dead_ds.c
index 6243b4302..b40513e21 100644
--- a/src/overlays/effects/ovl_Effect_Ss_Dead_Ds/z_eff_ss_dead_ds.c
+++ b/src/overlays/effects/ovl_Effect_Ss_Dead_Ds/z_eff_ss_dead_ds.c
@@ -59,7 +59,7 @@ void EffectSsDeadDs_Draw(PlayState* play, u32 index, EffectSs* this) {
OPEN_DISPS(play->state.gfxCtx);
scale = this->rScale * 0.01f;
- func_8012C974(play->state.gfxCtx);
+ Gfx_SetupDL60_XluNoCD(play->state.gfxCtx);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 0, 0, 0, this->rAlpha);
gDPSetEnvColor(POLY_XLU_DISP++, 0, 0, 0, 0);
pos = this->pos;
diff --git a/src/overlays/effects/ovl_Effect_Ss_Dt_Bubble/z_eff_ss_dt_bubble.c b/src/overlays/effects/ovl_Effect_Ss_Dt_Bubble/z_eff_ss_dt_bubble.c
index b6e3b747f..8a4c80980 100644
--- a/src/overlays/effects/ovl_Effect_Ss_Dt_Bubble/z_eff_ss_dt_bubble.c
+++ b/src/overlays/effects/ovl_Effect_Ss_Dt_Bubble/z_eff_ss_dt_bubble.c
@@ -97,7 +97,7 @@ void EffectSsDtBubble_Draw(PlayState* play, u32 index, EffectSs* this) {
Matrix_Translate(this->pos.x, this->pos.y, this->pos.z, MTXMODE_NEW);
Matrix_Scale(scale, scale, scale, MTXMODE_APPLY);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- func_8012C28C(gfxCtx);
+ Gfx_SetupDL25_Opa(gfxCtx);
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, this->rPrimColorR, this->rPrimColorG, this->rPrimColorB,
(this->rPrimColorA * this->life) / this->rLifespan);
gDPSetEnvColor(POLY_OPA_DISP++, this->rEnvColorR, this->rEnvColorG, this->rEnvColorB,
diff --git a/src/overlays/effects/ovl_Effect_Ss_Dust/z_eff_ss_dust.c b/src/overlays/effects/ovl_Effect_Ss_Dust/z_eff_ss_dust.c
index 10e8fbeed..22580fd81 100644
--- a/src/overlays/effects/ovl_Effect_Ss_Dust/z_eff_ss_dust.c
+++ b/src/overlays/effects/ovl_Effect_Ss_Dust/z_eff_ss_dust.c
@@ -107,7 +107,7 @@ void EffectSsDust_Draw(PlayState* play, u32 index, EffectSs* this) {
gSPMatrix(POLY_XLU_DISP++, mtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gDPPipeSync(POLY_XLU_DISP++);
gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(sDustTextures[this->rTexIndex]));
- POLY_XLU_DISP = Gfx_CallSetupDL(POLY_XLU_DISP, 0);
+ POLY_XLU_DISP = Gfx_SetupDL(POLY_XLU_DISP, SETUPDL_0);
gDPPipeSync(POLY_XLU_DISP++);
if (this->rDrawFlags & DUST_DRAWFLAG1) {
diff --git a/src/overlays/effects/ovl_Effect_Ss_En_Fire/z_eff_ss_en_fire.c b/src/overlays/effects/ovl_Effect_Ss_En_Fire/z_eff_ss_en_fire.c
index 9d78d4d71..0e79c5df7 100644
--- a/src/overlays/effects/ovl_Effect_Ss_En_Fire/z_eff_ss_en_fire.c
+++ b/src/overlays/effects/ovl_Effect_Ss_En_Fire/z_eff_ss_en_fire.c
@@ -88,7 +88,7 @@ void EffectSsEnFire_Draw(PlayState* play, u32 index, EffectSs* this) {
redGreen = 0;
}
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gDPSetEnvColor(POLY_XLU_DISP++, redGreen * 12.7f, 0, 0, 0);
gDPSetPrimColor(POLY_XLU_DISP++, 0x0, 0x80, redGreen * 12.7f, redGreen * 12.7f, 0, 255);
gSPSegment(
diff --git a/src/overlays/effects/ovl_Effect_Ss_En_Ice/z_eff_ss_en_ice.c b/src/overlays/effects/ovl_Effect_Ss_En_Ice/z_eff_ss_en_ice.c
index 21a0f1019..14d5d5c6e 100644
--- a/src/overlays/effects/ovl_Effect_Ss_En_Ice/z_eff_ss_en_ice.c
+++ b/src/overlays/effects/ovl_Effect_Ss_En_Ice/z_eff_ss_en_ice.c
@@ -112,7 +112,7 @@ void EffectSsEnIce_Draw(PlayState* play, u32 index, EffectSs* this) {
Matrix_RotateXS(this->rPitch, MTXMODE_APPLY);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
func_800BCC68(&this->pos, play);
gSPSegment(POLY_XLU_DISP++, 0x08,
Gfx_TwoTexScroll(play->state.gfxCtx, 0, 0, gameplayFrames & 0xFF, 0x20, 0x10, 1, 0,
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 03522f5af..91b699f5f 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
@@ -72,7 +72,7 @@ void EffectSsExtra_Draw(PlayState* play, u32 index, EffectSs* this) {
Matrix_Translate(this->pos.x, this->pos.y, this->pos.z, MTXMODE_NEW);
Matrix_Scale(scale, scale, scale, MTXMODE_APPLY);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
Matrix_ReplaceRotation(&play->billboardMtxF);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
diff --git a/src/overlays/effects/ovl_Effect_Ss_Fhg_Flash/z_eff_ss_fhg_flash.c b/src/overlays/effects/ovl_Effect_Ss_Fhg_Flash/z_eff_ss_fhg_flash.c
index cd7c6d5bd..f2038c768 100644
--- a/src/overlays/effects/ovl_Effect_Ss_Fhg_Flash/z_eff_ss_fhg_flash.c
+++ b/src/overlays/effects/ovl_Effect_Ss_Fhg_Flash/z_eff_ss_fhg_flash.c
@@ -62,11 +62,11 @@ void EffectSsFhgFlash_Draw(PlayState* play, u32 index, EffectSs* this) {
Matrix_Translate(this->pos.x, this->pos.y, this->pos.z, MTXMODE_NEW);
Matrix_Scale(scale, scale, scale, MTXMODE_APPLY);
if (this->rParams != FHGFLASH_SHOCK_NO_ACTOR) {
- func_8012C448(play->state.gfxCtx);
+ Gfx_SetupDL44_Xlu(play->state.gfxCtx);
Matrix_RotateXS(this->rXZRot, MTXMODE_APPLY);
gDPSetRenderMode(POLY_XLU_DISP++, G_RM_PASS, G_RM_AA_ZB_XLU_DECAL2);
} else {
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
Matrix_ReplaceRotation(&play->billboardMtxF);
gDPSetRenderMode(POLY_XLU_DISP++, G_RM_PASS, G_RM_AA_ZB_XLU_SURF2);
}
diff --git a/src/overlays/effects/ovl_Effect_Ss_Fire_Tail/z_eff_ss_fire_tail.c b/src/overlays/effects/ovl_Effect_Ss_Fire_Tail/z_eff_ss_fire_tail.c
index 1742b03fd..57ac1af69 100644
--- a/src/overlays/effects/ovl_Effect_Ss_Fire_Tail/z_eff_ss_fire_tail.c
+++ b/src/overlays/effects/ovl_Effect_Ss_Fire_Tail/z_eff_ss_fire_tail.c
@@ -121,7 +121,7 @@ void EffectSsFireTail_Draw(PlayState* play, u32 index, EffectSs* this) {
Matrix_Scale(1.0f, temp1, 1.0f / temp1, MTXMODE_APPLY);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0x80, this->rPrimColorR, this->rPrimColorG, this->rPrimColorB, 255);
gDPSetEnvColor(POLY_XLU_DISP++, this->rEnvColorR, this->rEnvColorG, this->rEnvColorB, 0);
gSPSegment(
diff --git a/src/overlays/effects/ovl_Effect_Ss_G_Ripple/z_eff_ss_g_ripple.c b/src/overlays/effects/ovl_Effect_Ss_G_Ripple/z_eff_ss_g_ripple.c
index 24aadc0ec..597379229 100644
--- a/src/overlays/effects/ovl_Effect_Ss_G_Ripple/z_eff_ss_g_ripple.c
+++ b/src/overlays/effects/ovl_Effect_Ss_G_Ripple/z_eff_ss_g_ripple.c
@@ -93,7 +93,7 @@ void EffectSsGRipple_DrawRipple(PlayState* play2, EffectSs* this, TexturePtr tex
if (mtx != NULL) {
gSPMatrix(POLY_XLU_DISP++, mtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- func_8012C974(gfxCtx);
+ Gfx_SetupDL60_XluNoCD(gfxCtx);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, this->rPrimColorR, this->rPrimColorG, this->rPrimColorB,
this->rPrimColorA);
gDPSetEnvColor(POLY_XLU_DISP++, this->rEnvColorR, this->rEnvColorG, this->rEnvColorB, this->rEnvColorA);
diff --git a/src/overlays/effects/ovl_Effect_Ss_G_Spk/z_eff_ss_g_spk.c b/src/overlays/effects/ovl_Effect_Ss_G_Spk/z_eff_ss_g_spk.c
index ccc2951c6..e80c02a11 100644
--- a/src/overlays/effects/ovl_Effect_Ss_G_Spk/z_eff_ss_g_spk.c
+++ b/src/overlays/effects/ovl_Effect_Ss_G_Spk/z_eff_ss_g_spk.c
@@ -97,7 +97,7 @@ void EffectSsGSpk_Draw(PlayState* play, u32 index, EffectSs* this) {
if (mtx != NULL) {
gSPMatrix(POLY_XLU_DISP++, mtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(sSparkTextures[this->rTexIndex]));
- func_8012C974(gfxCtx);
+ Gfx_SetupDL60_XluNoCD(gfxCtx);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, this->rPrimColorR, this->rPrimColorG, this->rPrimColorB, 255);
gDPSetEnvColor(POLY_XLU_DISP++, this->rEnvColorR, this->rEnvColorG, this->rEnvColorB, this->rEnvColorA);
gSPDisplayList(POLY_XLU_DISP++, this->gfx);
diff --git a/src/overlays/effects/ovl_Effect_Ss_G_Splash/z_eff_ss_g_splash.c b/src/overlays/effects/ovl_Effect_Ss_G_Splash/z_eff_ss_g_splash.c
index 8d7647bfe..46397dc19 100644
--- a/src/overlays/effects/ovl_Effect_Ss_G_Splash/z_eff_ss_g_splash.c
+++ b/src/overlays/effects/ovl_Effect_Ss_G_Splash/z_eff_ss_g_splash.c
@@ -58,7 +58,7 @@ u32 EffectSsGSplash_Init(PlayState* play, u32 index, EffectSs* this, void* initP
this->rType = initParams->type;
} else {
switch (initParams->type) {
- case 0:
+ case EFFSSGSPLASH_TYPE_0:
this->rgPrimColorR = 255;
this->rgPrimColorG = 255;
this->rgPrimColorB = 255;
@@ -67,9 +67,9 @@ u32 EffectSsGSplash_Init(PlayState* play, u32 index, EffectSs* this, void* initP
this->rgEnvColorG = 255;
this->rgEnvColorB = 255;
this->rgEnvColorA = 200;
- this->rType = 0;
+ this->rType = EFFSSGSPLASH_TYPE_0;
break;
- case 1:
+ case EFFSSGSPLASH_TYPE_1:
this->rgPrimColorR = 255;
this->rgPrimColorG = 255;
this->rgPrimColorB = 255;
@@ -78,9 +78,9 @@ u32 EffectSsGSplash_Init(PlayState* play, u32 index, EffectSs* this, void* initP
this->rgEnvColorG = 255;
this->rgEnvColorB = 255;
this->rgEnvColorA = 255;
- this->rType = 1;
+ this->rType = EFFSSGSPLASH_TYPE_1;
break;
- case 2:
+ case EFFSSGSPLASH_TYPE_2:
this->rgPrimColorR = 255;
this->rgPrimColorG = 255;
this->rgPrimColorB = 255;
@@ -89,7 +89,7 @@ u32 EffectSsGSplash_Init(PlayState* play, u32 index, EffectSs* this, void* initP
this->rgEnvColorG = 255;
this->rgEnvColorB = 255;
this->rgEnvColorA = 200;
- this->rType = 2;
+ this->rType = EFFSSGSPLASH_TYPE_2;
break;
}
}
@@ -100,7 +100,7 @@ void EffectSsGSplash_Draw(PlayState* play, u32 index, EffectSs* this) {
s16 texIndex;
switch (this->rType) {
- case 0:
+ case EFFSSGSPLASH_TYPE_0:
texIndex = this->rgTexIndex / 100;
if (texIndex > 7) {
texIndex = 7;
@@ -108,7 +108,7 @@ void EffectSsGSplash_Draw(PlayState* play, u32 index, EffectSs* this) {
EffectSs_DrawGEffect(play, this, waterSplashTextures[texIndex]);
break;
- case 1:
+ case EFFSSGSPLASH_TYPE_1:
texIndex = this->rgTexIndex / 100;
if (texIndex > 7) {
texIndex = 7;
@@ -116,7 +116,7 @@ void EffectSsGSplash_Draw(PlayState* play, u32 index, EffectSs* this) {
EffectSs_DrawGEffect(play, this, waterSplashTextures[texIndex]);
break;
- case 2:
+ case EFFSSGSPLASH_TYPE_2:
texIndex = this->rgTexIndex / 100;
if (texIndex > 7) {
texIndex = 7;
@@ -129,7 +129,7 @@ void EffectSsGSplash_Draw(PlayState* play, u32 index, EffectSs* this) {
void EffectSsGSplash_Update(PlayState* play, u32 index, EffectSs* this) {
Vec3f newSplashPos;
- if ((this->rType == 1) && (this->life == 5)) {
+ if ((this->rType == EFFSSGSPLASH_TYPE_1) && (this->life == 5)) {
newSplashPos = this->pos;
newSplashPos.y += ((this->rgScale * 20) * 0.002f);
EffectSsGSplash_Spawn(play, &newSplashPos, 0, 0, 2, this->rgScale / 2);
diff --git a/src/overlays/effects/ovl_Effect_Ss_G_Splash/z_eff_ss_g_splash.h b/src/overlays/effects/ovl_Effect_Ss_G_Splash/z_eff_ss_g_splash.h
index 9d3fbcd13..363db3e5a 100644
--- a/src/overlays/effects/ovl_Effect_Ss_G_Splash/z_eff_ss_g_splash.h
+++ b/src/overlays/effects/ovl_Effect_Ss_G_Splash/z_eff_ss_g_splash.h
@@ -3,6 +3,12 @@
#include "global.h"
+typedef enum EffSsGSplashType {
+ /* 0 */ EFFSSGSPLASH_TYPE_0,
+ /* 1 */ EFFSSGSPLASH_TYPE_1,
+ /* 2 */ EFFSSGSPLASH_TYPE_2
+} EffSsGSplashType;
+
typedef struct {
/* 0x00 */ Vec3f pos;
/* 0x0C */ u8 type;
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 e1a9371cd..15444ad47 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
@@ -72,7 +72,7 @@ void EffectSsHahen_DrawOpa(PlayState* play, EffectSs* this) {
gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.status[this->rObjBankIndex].segment);
}
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPDisplayList(POLY_OPA_DISP++, this->gfx);
CLOSE_DISPS(gfxCtx);
@@ -88,7 +88,7 @@ void EffectSsHahen_DrawXlu(PlayState* play, EffectSs* this) {
gSPSegment(POLY_XLU_DISP++, 0x06, play->objectCtx.status[this->rObjBankIndex].segment);
}
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPDisplayList(POLY_XLU_DISP++, this->gfx);
CLOSE_DISPS(gfxCtx);
diff --git a/src/overlays/effects/ovl_Effect_Ss_Hitmark/z_eff_ss_hitmark.c b/src/overlays/effects/ovl_Effect_Ss_Hitmark/z_eff_ss_hitmark.c
index 36eb650f7..b290c05e4 100644
--- a/src/overlays/effects/ovl_Effect_Ss_Hitmark/z_eff_ss_hitmark.c
+++ b/src/overlays/effects/ovl_Effect_Ss_Hitmark/z_eff_ss_hitmark.c
@@ -134,7 +134,7 @@ void EffectSsHitmark_Draw(PlayState* play, u32 index, EffectSs* this) {
gSPMatrix(POLY_XLU_DISP++, mtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
tex = sTextures[(this->rType * 8) + (this->rTexIndex)];
gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(tex));
- func_8012C9BC(gfxCtx);
+ Gfx_SetupDL61_Xlu(gfxCtx);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, this->rPrimColorR, this->rPrimColorG, this->rPrimColorB, 255);
gDPSetEnvColor(POLY_XLU_DISP++, this->rEnvColorR, this->rEnvColorG, this->rEnvColorB, 0);
gSPDisplayList(POLY_XLU_DISP++, this->gfx);
diff --git a/src/overlays/effects/ovl_Effect_Ss_Ice_Piece/z_eff_ss_ice_piece.c b/src/overlays/effects/ovl_Effect_Ss_Ice_Piece/z_eff_ss_ice_piece.c
index 9efadc99e..29a35cf34 100644
--- a/src/overlays/effects/ovl_Effect_Ss_Ice_Piece/z_eff_ss_ice_piece.c
+++ b/src/overlays/effects/ovl_Effect_Ss_Ice_Piece/z_eff_ss_ice_piece.c
@@ -65,7 +65,7 @@ void EffectSsIcePiece_Draw(PlayState* play, u32 index, EffectSs* this) {
Matrix_RotateYS(this->rYaw, MTXMODE_APPLY);
Matrix_RotateXS(this->rPitch, MTXMODE_APPLY);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gDPSetEnvColor(POLY_XLU_DISP++, 0, 50, 100, (u8)(s32)alpha);
func_800BCC68(&this->pos, play);
gSPSegment(
diff --git a/src/overlays/effects/ovl_Effect_Ss_Ice_Smoke/z_eff_ss_ice_smoke.c b/src/overlays/effects/ovl_Effect_Ss_Ice_Smoke/z_eff_ss_ice_smoke.c
index e1c2bc72d..ffd8c300a 100644
--- a/src/overlays/effects/ovl_Effect_Ss_Ice_Smoke/z_eff_ss_ice_smoke.c
+++ b/src/overlays/effects/ovl_Effect_Ss_Ice_Smoke/z_eff_ss_ice_smoke.c
@@ -52,7 +52,7 @@ void EffectSsIceSmoke_Draw(PlayState* play, u32 index, EffectSs* this) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 195, 235, 235, this->rAlpha);
gSPSegment(POLY_XLU_DISP++, 0x08,
Gfx_TwoTexScroll(play->state.gfxCtx, 0, this->rScrollX * this->life, this->rScrollY * this->life, 0x20,
diff --git a/src/overlays/effects/ovl_Effect_Ss_K_Fire/z_eff_ss_k_fire.c b/src/overlays/effects/ovl_Effect_Ss_K_Fire/z_eff_ss_k_fire.c
index 17d7edc1e..8c4fc5877 100644
--- a/src/overlays/effects/ovl_Effect_Ss_K_Fire/z_eff_ss_k_fire.c
+++ b/src/overlays/effects/ovl_Effect_Ss_K_Fire/z_eff_ss_k_fire.c
@@ -55,7 +55,7 @@ void EffectSsKFire_Draw(PlayState* play, u32 index, EffectSs* this) {
Matrix_Translate(this->pos.x, this->pos.y, this->pos.z, MTXMODE_NEW);
Matrix_Scale(xzScale, yScale, xzScale, MTXMODE_APPLY);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPSegment(POLY_XLU_DISP++, 0x08,
Gfx_TwoTexScroll(play->state.gfxCtx, 0, 0, 0, 0x20, 0x40, 1, 0, play->state.frames * this->rScroll, 0x20,
0x80));
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 e424c0b44..1104a28a3 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
@@ -107,7 +107,7 @@ void EffectSsKakera_Draw(PlayState* play, u32 index, EffectSs* this) {
if ((((this->rReg4 >> 7) & 1) << 7) == 0x80) {
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
if (colorIndex >= 0) {
gDPSetPrimColor(POLY_XLU_DISP++, 0, D_8097EAD8[colorIndex].lod, D_8097EAD8[colorIndex].color.r,
D_8097EAD8[colorIndex].color.g, D_8097EAD8[colorIndex].color.b, 255);
@@ -115,7 +115,7 @@ void EffectSsKakera_Draw(PlayState* play, u32 index, EffectSs* this) {
gSPDisplayList(POLY_XLU_DISP++, this->gfx);
} else {
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
if (colorIndex >= 0) {
gDPSetPrimColor(POLY_OPA_DISP++, 0, D_8097EAD8[colorIndex].lod, D_8097EAD8[colorIndex].color.r,
D_8097EAD8[colorIndex].color.g, D_8097EAD8[colorIndex].color.b, 255);
diff --git a/src/overlays/effects/ovl_Effect_Ss_Kirakira/z_eff_ss_kirakira.c b/src/overlays/effects/ovl_Effect_Ss_Kirakira/z_eff_ss_kirakira.c
index 540d9e505..4e395141b 100644
--- a/src/overlays/effects/ovl_Effect_Ss_Kirakira/z_eff_ss_kirakira.c
+++ b/src/overlays/effects/ovl_Effect_Ss_Kirakira/z_eff_ss_kirakira.c
@@ -108,7 +108,7 @@ void EffectSsKirakira_Draw(PlayState* play, u32 index, EffectSs* this) {
if (mtx != NULL) {
gSPMatrix(POLY_XLU_DISP++, mtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- func_8012C2DC(gfxCtx);
+ Gfx_SetupDL25_Xlu(gfxCtx);
gDPSetPrimColor(POLY_XLU_DISP++, 0x80, 0x80, this->rPrimColorR, this->rPrimColorG, this->rPrimColorB,
(((s8)((55.0f / this->rLifespan) * this->life) + 200)));
gDPSetEnvColor(POLY_XLU_DISP++, this->rEnvColorR, this->rEnvColorG, this->rEnvColorB, this->rEnvColorA);
diff --git a/src/overlays/effects/ovl_Effect_Ss_Lightning/z_eff_ss_lightning.c b/src/overlays/effects/ovl_Effect_Ss_Lightning/z_eff_ss_lightning.c
index 9037b20f4..61eb3aebd 100644
--- a/src/overlays/effects/ovl_Effect_Ss_Lightning/z_eff_ss_lightning.c
+++ b/src/overlays/effects/ovl_Effect_Ss_Lightning/z_eff_ss_lightning.c
@@ -119,7 +119,7 @@ void EffectSsLightning_Draw(PlayState* play, u32 index, EffectSs* this) {
if (mtx != NULL) {
gSPMatrix(POLY_XLU_DISP++, mtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- func_8012C9BC(gfxCtx);
+ Gfx_SetupDL61_Xlu(gfxCtx);
gSPSegment(POLY_XLU_DISP++, 0x08, sLightningTextures[texIndex]);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, this->rPrimColorR, this->rPrimColorG, this->rPrimColorB,
this->rPrimColorA);
diff --git a/src/overlays/effects/ovl_Effect_Ss_Sbn/z_eff_ss_sbn.c b/src/overlays/effects/ovl_Effect_Ss_Sbn/z_eff_ss_sbn.c
index 3402eb2b7..f79e59340 100644
--- a/src/overlays/effects/ovl_Effect_Ss_Sbn/z_eff_ss_sbn.c
+++ b/src/overlays/effects/ovl_Effect_Ss_Sbn/z_eff_ss_sbn.c
@@ -135,7 +135,7 @@ void EffectSsSbn_DrawSliding(PlayState* play, u32 index, EffectSs* this) {
OPEN_DISPS(gfxCtx);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- func_8012C2DC(gfxCtx);
+ Gfx_SetupDL25_Xlu(gfxCtx);
gDPSetRenderMode(POLY_XLU_DISP++, G_RM_FOG_SHADE_A, G_RM_ZB_XLU_DECAL2);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0x80, 255, 255, 255, this->rAlpha);
@@ -175,7 +175,7 @@ void EffectSsSbn_Draw(PlayState* play, u32 index, EffectSs* this) {
OPEN_DISPS(gfxCtx);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- func_8012C2DC(gfxCtx);
+ Gfx_SetupDL25_Xlu(gfxCtx);
gDPSetRenderMode(POLY_XLU_DISP++, G_RM_FOG_SHADE_A, G_RM_ZB_XLU_DECAL2);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0x80, 255, 255, 255, this->rAlpha);
diff --git a/src/overlays/effects/ovl_Effect_Ss_Sibuki/z_eff_ss_sibuki.c b/src/overlays/effects/ovl_Effect_Ss_Sibuki/z_eff_ss_sibuki.c
index a9a190948..312ed5f2f 100644
--- a/src/overlays/effects/ovl_Effect_Ss_Sibuki/z_eff_ss_sibuki.c
+++ b/src/overlays/effects/ovl_Effect_Ss_Sibuki/z_eff_ss_sibuki.c
@@ -70,7 +70,7 @@ void EffectSsSibuki_Draw(PlayState* play, u32 index, EffectSs* this) {
Matrix_Translate(this->pos.x, this->pos.y, this->pos.z, MTXMODE_NEW);
Matrix_Scale(scale, scale, scale, MTXMODE_APPLY);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- func_8012C28C(gfxCtx);
+ Gfx_SetupDL25_Opa(gfxCtx);
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, this->rPrimColorR, this->rPrimColorG, this->rPrimColorB, this->rPrimColorA);
gDPSetEnvColor(POLY_OPA_DISP++, this->rEnvColorR, this->rEnvColorG, this->rEnvColorB, this->rEnvColorA);
gSPSegment(POLY_OPA_DISP++, 0x08, this->gfx);
diff --git a/src/overlays/effects/ovl_Effect_Ss_Solder_Srch_Ball/z_eff_ss_solder_srch_ball.c b/src/overlays/effects/ovl_Effect_Ss_Solder_Srch_Ball/z_eff_ss_solder_srch_ball.c
index cd0ea0fad..773984c80 100644
--- a/src/overlays/effects/ovl_Effect_Ss_Solder_Srch_Ball/z_eff_ss_solder_srch_ball.c
+++ b/src/overlays/effects/ovl_Effect_Ss_Solder_Srch_Ball/z_eff_ss_solder_srch_ball.c
@@ -46,14 +46,14 @@ void EffectSsSolderSrchBall_Draw(PlayState* play, u32 index, EffectSs* this) {
GraphicsContext* gfxCtx = play->state.gfxCtx;
f32 scale = this->rgScale / 100.0f;
- func_8012C28C(gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
OPEN_DISPS(gfxCtx);
Matrix_Translate(this->pos.x, this->pos.y, this->pos.z, MTXMODE_NEW);
Matrix_Scale(scale, scale, scale, MTXMODE_APPLY);
- POLY_XLU_DISP = Gfx_CallSetupDL(POLY_XLU_DISP, 20);
+ POLY_XLU_DISP = Gfx_SetupDL(POLY_XLU_DISP, SETUPDL_20);
gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(gSun1Tex));
gSPDisplayList(POLY_XLU_DISP++, gSunSparkleMaterialDL);
gDPPipeSync(POLY_XLU_DISP++);
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 4f1aa5d91..c1615e2bf 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
@@ -50,7 +50,7 @@ void EffectSsStick_Draw(PlayState* play, u32 index, EffectSs* this) {
Matrix_Scale(0.01f, 0.0025f, 0.01f, MTXMODE_APPLY);
Matrix_RotateZYX(0, this->rYaw, 0, MTXMODE_APPLY);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- func_8012C28C(gfxCtx);
+ Gfx_SetupDL25_Opa(gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.status[this->rObjBankIndex].segment);
gSPSegment(POLY_OPA_DISP++, 0x0C, gCullBackDList);
gSPDisplayList(POLY_OPA_DISP++, gDekuStickDL);
diff --git a/src/overlays/effects/ovl_Effect_Ss_Stone1/z_eff_ss_stone1.c b/src/overlays/effects/ovl_Effect_Ss_Stone1/z_eff_ss_stone1.c
index 6e6b48156..f9735d396 100644
--- a/src/overlays/effects/ovl_Effect_Ss_Stone1/z_eff_ss_stone1.c
+++ b/src/overlays/effects/ovl_Effect_Ss_Stone1/z_eff_ss_stone1.c
@@ -65,7 +65,7 @@ void EffectSsStone1_Draw(PlayState* play, u32 index, EffectSs* this) {
Matrix_Translate(this->pos.x, this->pos.y, this->pos.z, MTXMODE_NEW);
Matrix_Scale(scale, scale, scale, MTXMODE_APPLY);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- func_8012C9BC(gfxCtx);
+ Gfx_SetupDL61_Xlu(gfxCtx);
gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(drawParams->texture));
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, drawParams->primColor.r, drawParams->primColor.g, drawParams->primColor.b,
255);
diff --git a/src/overlays/fbdemos/ovl_fbdemo_triforce/z_fbdemo_triforce.c b/src/overlays/fbdemos/ovl_fbdemo_triforce/z_fbdemo_triforce.c
index c4eb826c7..cf1000add 100644
--- a/src/overlays/fbdemos/ovl_fbdemo_triforce/z_fbdemo_triforce.c
+++ b/src/overlays/fbdemos/ovl_fbdemo_triforce/z_fbdemo_triforce.c
@@ -6,7 +6,7 @@
#include "global.h"
#include "z_fbdemo_triforce.h"
-#include "assets/objects/object_fbdemo_triforce/ovl_fbdemo_triforce.c"
+#include "assets/overlays/ovl_fbdemo_triforce/ovl_fbdemo_triforce.c"
void* TransitionTriforce_Init(void* thisx);
void TransitionTriforce_Destroy(void* thisx);
diff --git a/src/overlays/fbdemos/ovl_fbdemo_wipe1/z_fbdemo_wipe1.c b/src/overlays/fbdemos/ovl_fbdemo_wipe1/z_fbdemo_wipe1.c
index 1ce5f0d59..94285c45b 100644
--- a/src/overlays/fbdemos/ovl_fbdemo_wipe1/z_fbdemo_wipe1.c
+++ b/src/overlays/fbdemos/ovl_fbdemo_wipe1/z_fbdemo_wipe1.c
@@ -7,6 +7,8 @@
#include "global.h"
#include "z_fbdemo_wipe1.h"
+#define THIS ((TransitionWipe1*)thisx)
+
void* TransitionWipe1_Init(void* thisx);
void TransitionWipe1_Destroy(void* thisx);
void TransitionWipe1_Update(void* thisx, s32 updateRate);
@@ -17,35 +19,120 @@ void TransitionWipe1_SetColor(void* thisx, u32 color);
void TransitionWipe1_SetEnvColor(void* thisx, u32 color);
s32 TransitionWipe1_IsDone(void* thisx);
-#if 0
+#include "assets/overlays/ovl_fbdemo_wipe1/ovl_fbdemo_wipe1.c"
+
TransitionInit TransitionWipe1_InitVars = {
- TransitionWipe1_Init,
- TransitionWipe1_Destroy,
- TransitionWipe1_Update,
- TransitionWipe1_Draw,
- TransitionWipe1_Start,
- TransitionWipe1_SetType,
- TransitionWipe1_SetColor,
- TransitionWipe1_SetEnvColor,
- TransitionWipe1_IsDone,
+ TransitionWipe1_Init, TransitionWipe1_Destroy, TransitionWipe1_Update,
+ TransitionWipe1_Draw, TransitionWipe1_Start, TransitionWipe1_SetType,
+ TransitionWipe1_SetColor, TransitionWipe1_SetEnvColor, TransitionWipe1_IsDone,
};
-#endif
+typedef enum {
+ /* 0 */ TRANS_WIPE1_DIR_IN,
+ /* 1 */ TRANS_WIPE1_DIR_OUT
+} TransitionWipe1Direction;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_fbdemo_wipe1/TransitionWipe1_Start.s")
+void TransitionWipe1_Start(void* thisx) {
+ TransitionWipe1* this = THIS;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_fbdemo_wipe1/TransitionWipe1_Init.s")
+ this->isDone = false;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_fbdemo_wipe1/TransitionWipe1_Destroy.s")
+ if (this->direction != TRANS_WIPE1_DIR_IN) {
+ this->texY = (s32)(83.25f * (1 << 2));
+ } else {
+ this->texY = (s32)(153.0f * (1 << 2));
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_fbdemo_wipe1/TransitionWipe1_Update.s")
+ guPerspective(&this->projection, &this->normal, 60.0f, (4.0f / 3.0f), 10.0f, 12800.0f, 1.0f);
+ guLookAt(&this->lookAt, 0.0f, 0.0f, 400.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_fbdemo_wipe1/TransitionWipe1_Draw.s")
+void* TransitionWipe1_Init(void* thisx) {
+ TransitionWipe1* this = THIS;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_fbdemo_wipe1/TransitionWipe1_IsDone.s")
+ bzero(this, sizeof(TransitionWipe1));
+ return this;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_fbdemo_wipe1/TransitionWipe1_SetType.s")
+void TransitionWipe1_Destroy(void* thisx) {
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_fbdemo_wipe1/TransitionWipe1_SetColor.s")
+void TransitionWipe1_Update(void* thisx, s32 updateRate) {
+ TransitionWipe1* this = THIS;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_fbdemo_wipe1/TransitionWipe1_SetEnvColor.s")
+ if (this->direction != TRANS_WIPE1_DIR_IN) {
+ this->texY += (((void)0, gSaveContext.transWipeSpeed) * 3) / updateRate;
+ if (this->texY >= (s32)(153.0f * (1 << 2))) {
+ this->texY = (s32)(153.0f * (1 << 2));
+ this->isDone = true;
+ }
+ } else {
+ this->texY -= (((void)0, gSaveContext.transWipeSpeed) * 3) / updateRate;
+ if (this->texY <= (s32)(83.25f * (1 << 2))) {
+ this->texY = (s32)(83.25f * (1 << 2));
+ this->isDone = true;
+ }
+ }
+}
+
+void TransitionWipe1_Draw(void* thisx, Gfx** gfxP) {
+ Gfx* gfx = *gfxP;
+ Mtx* modelView;
+ TransitionWipe1* this = THIS;
+ Gfx* texScroll;
+ s32 pad[4];
+
+ modelView = this->modelView[this->frame];
+ this->frame ^= 1;
+
+ guScale(&modelView[0], 0.56f, 0.56f, 1.0f);
+ guRotate(&modelView[1], 0.0f, 0.0f, 0.0f, 1.0f);
+ guTranslate(&modelView[2], 0.0f, 0.0f, 0.0f);
+ gDPPipeSync(gfx++);
+ texScroll = Gfx_BranchTexScroll(&gfx, this->texX, this->texY, 0, 0);
+ gSPSegment(gfx++, 8, texScroll);
+ gDPSetPrimColor(gfx++, 0, 0x80, this->primColor.r, this->primColor.g, this->primColor.b, 255);
+ gSPMatrix(gfx++, &this->projection, G_MTX_LOAD | G_MTX_PROJECTION);
+ gSPPerspNormalize(gfx++, this->normal);
+ gSPMatrix(gfx++, &this->lookAt, G_MTX_MUL | G_MTX_PROJECTION);
+ gSPMatrix(gfx++, &modelView[0], G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPMatrix(gfx++, &modelView[1], G_MTX_NOPUSH | G_MTX_MUL | G_MTX_MODELVIEW);
+ gSPMatrix(gfx++, &modelView[2], G_MTX_NOPUSH | G_MTX_MUL | G_MTX_MODELVIEW);
+ gSPDisplayList(gfx++, sTransWipe1DL);
+ gDPPipeSync(gfx++);
+ *gfxP = gfx;
+}
+
+s32 TransitionWipe1_IsDone(void* thisx) {
+ TransitionWipe1* this = THIS;
+
+ return this->isDone;
+}
+
+void TransitionWipe1_SetType(void* thisx, s32 type) {
+ TransitionWipe1* this = THIS;
+
+ if (type == TRANS_INSTANCE_TYPE_FILL_OUT) {
+ this->direction = TRANS_WIPE1_DIR_OUT;
+ } else {
+ this->direction = TRANS_WIPE1_DIR_IN;
+ }
+
+ if (this->direction != TRANS_WIPE1_DIR_IN) {
+ this->texY = (s32)(83.25f * (1 << 2));
+ } else {
+ this->texY = (s32)(153.0f * (1 << 2));
+ }
+}
+
+void TransitionWipe1_SetColor(void* thisx, u32 color) {
+ TransitionWipe1* this = THIS;
+
+ this->primColor.rgba = color;
+}
+
+void TransitionWipe1_SetEnvColor(void* thisx, u32 color) {
+ TransitionWipe1* this = THIS;
+
+ this->envColor.rgba = color;
+}
diff --git a/src/overlays/fbdemos/ovl_fbdemo_wipe1/z_fbdemo_wipe1.h b/src/overlays/fbdemos/ovl_fbdemo_wipe1/z_fbdemo_wipe1.h
index 39f881b39..4906e531c 100644
--- a/src/overlays/fbdemos/ovl_fbdemo_wipe1/z_fbdemo_wipe1.h
+++ b/src/overlays/fbdemos/ovl_fbdemo_wipe1/z_fbdemo_wipe1.h
@@ -5,7 +5,17 @@
#include "color.h"
typedef struct {
- /* 0x000 */ char unk_0[0x218];
+ /* 0x000 */ Color_RGBA8_u32 primColor;
+ /* 0x004 */ Color_RGBA8_u32 envColor;
+ /* 0x008 */ u8 direction;
+ /* 0x009 */ u8 frame;
+ /* 0x00A */ u8 isDone;
+ /* 0x00C */ u16 texX;
+ /* 0x00E */ u16 texY;
+ /* 0x010 */ u16 normal;
+ /* 0x018 */ Mtx projection;
+ /* 0x058 */ Mtx lookAt;
+ /* 0x098 */ Mtx modelView[2][3];
} TransitionWipe1; // size = 0x218
#endif
diff --git a/src/overlays/gamestates/ovl_daytelop/z_daytelop.c b/src/overlays/gamestates/ovl_daytelop/z_daytelop.c
index 845baa3cb..108ccedcd 100644
--- a/src/overlays/gamestates/ovl_daytelop/z_daytelop.c
+++ b/src/overlays/gamestates/ovl_daytelop/z_daytelop.c
@@ -129,7 +129,8 @@ void DayTelop_Draw(DayTelopState* this) {
GraphicsContext* gfxCtx = this->state.gfxCtx;
OPEN_DISPS(gfxCtx);
- func_8012C628(this->state.gfxCtx);
+
+ Gfx_SetupDL39_Opa(this->state.gfxCtx);
if (gSaveContext.save.day >= 9) {
// Draw a white screen
@@ -139,7 +140,7 @@ void DayTelop_Draw(DayTelopState* this) {
gDPFillRectangle(POLY_OPA_DISP++, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
}
- func_8012C628(this->state.gfxCtx);
+ Gfx_SetupDL39_Opa(this->state.gfxCtx);
gDPSetRenderMode(POLY_OPA_DISP++, G_RM_OPA_SURF, G_RM_OPA_SURF2);
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, 255);
diff --git a/src/overlays/gamestates/ovl_select/z_select.c b/src/overlays/gamestates/ovl_select/z_select.c
index 08bf65262..88d9ccdc4 100644
--- a/src/overlays/gamestates/ovl_select/z_select.c
+++ b/src/overlays/gamestates/ovl_select/z_select.c
@@ -987,7 +987,7 @@ void MapSelect_DrawMenu(MapSelectState* this) {
OPEN_DISPS(gfxCtx);
- func_8012C4C0(gfxCtx);
+ Gfx_SetupDL28_Opa(gfxCtx);
printer = alloca(sizeof(GfxPrint));
GfxPrint_Init(printer);
@@ -1009,7 +1009,7 @@ void MapSelect_DrawLoadingScreen(MapSelectState* this) {
OPEN_DISPS(gfxCtx);
- func_8012C4C0(gfxCtx);
+ Gfx_SetupDL28_Opa(gfxCtx);
GfxPrint_Init(&printer);
GfxPrint_Open(&printer, POLY_OPA_DISP);
diff --git a/src/overlays/gamestates/ovl_title/z_title.c b/src/overlays/gamestates/ovl_title/z_title.c
index 01e29668e..8e270b836 100644
--- a/src/overlays/gamestates/ovl_title/z_title.c
+++ b/src/overlays/gamestates/ovl_title/z_title.c
@@ -81,7 +81,7 @@ void ConsoleLogo_Draw(GameState* thisx) {
gSPSetLights1(POLY_OPA_DISP++, sTitleLights);
ConsoleLogo_RenderView(this, 0.0f, 150.0f, 300.0f);
- func_8012C28C(this->state.gfxCtx);
+ Gfx_SetupDL25_Opa(this->state.gfxCtx);
Matrix_Translate(-53.0f, -5.0f, 0.0f, MTXMODE_NEW);
Matrix_Scale(1.0f, 1.0f, 1.0f, MTXMODE_APPLY);
Matrix_RotateZYX(0, sTitleRotation, 0, MTXMODE_APPLY);
@@ -89,7 +89,7 @@ void ConsoleLogo_Draw(GameState* thisx) {
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(this->state.gfxCtx), G_MTX_LOAD);
gSPDisplayList(POLY_OPA_DISP++, gNintendo64LogoNDL);
- func_8012C628(this->state.gfxCtx);
+ Gfx_SetupDL39_Opa(this->state.gfxCtx);
gDPPipeSync(POLY_OPA_DISP++);
gDPSetCycleType(POLY_OPA_DISP++, G_CYC_2CYCLE);
@@ -165,7 +165,7 @@ void ConsoleLogo_Init(GameState* thisx) {
this->state.destroy = ConsoleLogo_Destroy;
this->exit = false;
- if (!(Padmgr_GetControllerBitmask() & 1)) {
+ if (!(PadMgr_GetValidControllersMask() & 1)) {
gSaveContext.fileNum = 0xFEDC;
} else {
gSaveContext.fileNum = 0xFF;
diff --git a/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_collect.c b/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_collect.c
index be2c6a538..bb92b5576 100644
--- a/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_collect.c
+++ b/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_collect.c
@@ -136,7 +136,7 @@ void KaleidoScope_DrawQuestStatus(PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- KaleidoScope_SetCursorVtx(pauseCtx, pauseCtx->cursorSlot[PAUSE_QUEST] * 4, pauseCtx->questVtx);
+ KaleidoScope_SetCursorVtxPos(pauseCtx, pauseCtx->cursorSlot[PAUSE_QUEST] * 4, pauseCtx->questVtx);
gDPPipeSync(POLY_OPA_DISP++);
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, pauseCtx->alpha);
@@ -394,7 +394,7 @@ void KaleidoScope_DrawQuestStatus(PlayState* play) {
POLY_OPA_DISP, sOcarinaButtonTextures[sQuestSongPlayedOcarinaButtons[i]], 16, 16, 0);
}
}
- } else if (IS_PAUSE_MAIN_STATE_SAVE_PROMPT || (pauseCtx->mainState == PAUSE_MAIN_STATE_IDLE_CURSOR_ON_SONG)) {
+ } else if (IS_PAUSE_MAIN_STATE_SONG_PROMPT || (pauseCtx->mainState == PAUSE_MAIN_STATE_IDLE_CURSOR_ON_SONG)) {
// Draw the buttons for playing a song
sp1C8 = pauseCtx->ocarinaSongIndex;
sp1CA = gOcarinaSongButtons[sp1C8].numButtons;
diff --git a/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_debug.c b/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_debug.c
index 3d7e08221..1eb46728f 100644
--- a/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_debug.c
+++ b/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_debug.c
@@ -345,7 +345,7 @@ void KaleidoScope_DrawInventoryEditor(PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C628(play->state.gfxCtx);
+ Gfx_SetupDL39_Opa(play->state.gfxCtx);
gDPSetRenderMode(POLY_OPA_DISP++, G_RM_XLU_SURF, G_RM_XLU_SURF2);
gDPSetCombineMode(POLY_OPA_DISP++, G_CC_PRIMITIVE, G_CC_PRIMITIVE);
@@ -605,7 +605,7 @@ void KaleidoScope_DrawInventoryEditor(PlayState* play) {
KaleidoScope_DrawDigit(play, gSaveContext.save.saveInfo.playerData.doubleDefense, 44, 202);
// Magic
- //! @bug should be gSaveContext.save.saveInfo.playerData.doubleMagic
+ //! @bug should be gSaveContext.save.saveInfo.playerData.isDoubleMagicAcquired
KaleidoScope_DrawDigit(play, gSaveContext.save.saveInfo.playerData.doubleDefense, 75, 202);
// Lottery
diff --git a/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_item.c b/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_item.c
index 149b72444..c8d963bda 100644
--- a/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_item.c
+++ b/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_item.c
@@ -15,7 +15,7 @@ s16 sEquipMagicArrowSlotHoldTimer = 0;
// Number of frames to move icon from slot to target position when equipping.
s16 sEquipAnimTimer = 10;
-u8 gPlayerFormSlotRestrictions[PLAYER_FORM_MAX][NUM_ITEM_SLOTS] = {
+u8 gPlayerFormSlotRestrictions[PLAYER_FORM_MAX][ITEM_NUM_SLOTS] = {
// Fierce Deity
{
false, // SLOT_OCARINA
@@ -236,9 +236,9 @@ void KaleidoScope_DrawAmmoCount(PauseContext* pauseCtx, GraphicsContext* gfxCtx,
CLOSE_DISPS(gfxCtx);
}
-void KaleidoScope_SetCursorVtx(PauseContext* pauseCtx, u16 index, Vtx* vtx) {
- pauseCtx->cursorVtx[0].v.ob[0] = vtx[index].v.ob[0];
- pauseCtx->cursorVtx[0].v.ob[1] = vtx[index].v.ob[1];
+void KaleidoScope_SetCursorVtxPos(PauseContext* pauseCtx, u16 vtxIndex, Vtx* vtx) {
+ pauseCtx->cursorVtx[0].v.ob[0] = vtx[vtxIndex].v.ob[0];
+ pauseCtx->cursorVtx[0].v.ob[1] = vtx[vtxIndex].v.ob[1];
}
static s16 sMagicArrowEffectsR[] = { 255, 100, 255 };
@@ -252,15 +252,15 @@ void KaleidoScope_DrawItemSelect(PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C8AC(play->state.gfxCtx);
+ Gfx_SetupDL42_Opa(play->state.gfxCtx);
// Draw a white box around the items that are equipped on the C buttons
// Loop over c-buttons (i) and vtx offset (j)
gDPSetCombineMode(POLY_OPA_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, pauseCtx->alpha);
- for (i = 0, j = NUM_ITEM_SLOTS * 4; i < 3; i++, j += 4) {
+ for (i = 0, j = ITEM_NUM_SLOTS * 4; i < 3; i++, j += 4) {
if (GET_CUR_FORM_BTN_ITEM(i + 1) != ITEM_NONE) {
- if (GET_CUR_FORM_BTN_SLOT(i + 1) < NUM_ITEM_SLOTS) {
+ if (GET_CUR_FORM_BTN_SLOT(i + 1) < ITEM_NUM_SLOTS) {
gSPVertex(POLY_OPA_DISP++, &pauseCtx->itemVtx[j], 4, 0);
POLY_OPA_DISP = Gfx_DrawTexQuadIA8(POLY_OPA_DISP, gEquippedItemOutlineTex, 32, 32, 0);
}
@@ -272,7 +272,7 @@ void KaleidoScope_DrawItemSelect(PlayState* play) {
// Draw the item icons
// Loop over slots (i) and vtx offset (j)
gDPSetCombineMode(POLY_OPA_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
- for (j = 0, i = 0; i < NUM_ITEM_SLOTS; i++, j += 4) {
+ for (j = 0, i = 0; i < ITEM_NUM_SLOTS; i++, j += 4) {
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, pauseCtx->alpha);
if (((void)0, gSaveContext.save.saveInfo.inventory.items[i]) != ITEM_NONE) {
@@ -319,11 +319,11 @@ void KaleidoScope_DrawItemSelect(PlayState* play) {
if ((pauseCtx->state == PAUSE_STATE_MAIN) &&
((pauseCtx->mainState == PAUSE_MAIN_STATE_IDLE) || (pauseCtx->mainState == PAUSE_MAIN_STATE_EQUIP_ITEM)) &&
(pauseCtx->state != PAUSE_STATE_SAVEPROMPT) && !IS_PAUSE_STATE_GAMEOVER) {
- func_8012C628(play->state.gfxCtx);
+ Gfx_SetupDL39_Opa(play->state.gfxCtx);
gDPSetCombineMode(POLY_OPA_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
// Loop over slots (i) and ammoIndex (j)
- for (j = 0, i = 0; i < NUM_ITEM_SLOTS; i++) {
+ for (j = 0, i = 0; i < ITEM_NUM_SLOTS; i++) {
if (gAmmoItems[i] != ITEM_NONE) {
if (((void)0, gSaveContext.save.saveInfo.inventory.items[i]) != ITEM_NONE) {
KaleidoScope_DrawAmmoCount(pauseCtx, play->state.gfxCtx,
@@ -332,7 +332,7 @@ void KaleidoScope_DrawItemSelect(PlayState* play) {
j++;
}
}
- func_8012C8AC(play->state.gfxCtx);
+ Gfx_SetupDL42_Opa(play->state.gfxCtx);
}
}
@@ -398,7 +398,7 @@ void KaleidoScope_UpdateItemCursor(PlayState* play) {
pauseCtx->cursorPoint[PAUSE_ITEM] =
pauseCtx->cursorXIndex[PAUSE_ITEM] + (pauseCtx->cursorYIndex[PAUSE_ITEM] * 6);
- if (pauseCtx->cursorPoint[PAUSE_ITEM] >= NUM_ITEM_SLOTS) {
+ if (pauseCtx->cursorPoint[PAUSE_ITEM] >= ITEM_NUM_SLOTS) {
pauseCtx->cursorPoint[PAUSE_ITEM] = pauseCtx->cursorXIndex[PAUSE_ITEM];
}
@@ -429,7 +429,7 @@ void KaleidoScope_UpdateItemCursor(PlayState* play) {
pauseCtx->cursorPoint[PAUSE_ITEM] =
pauseCtx->cursorXIndex[PAUSE_ITEM] + (pauseCtx->cursorYIndex[PAUSE_ITEM] * 6);
- if (pauseCtx->cursorPoint[PAUSE_ITEM] >= NUM_ITEM_SLOTS) {
+ if (pauseCtx->cursorPoint[PAUSE_ITEM] >= ITEM_NUM_SLOTS) {
pauseCtx->cursorPoint[PAUSE_ITEM] = pauseCtx->cursorXIndex[PAUSE_ITEM];
}
@@ -737,7 +737,7 @@ void KaleidoScope_UpdateItemEquip(PlayState* play) {
}
if (sEquipState == EQUIP_STATE_MAGIC_ARROW_MOVE_TO_BOW_SLOT) {
- bowItemVtx = &pauseCtx->itemVtx[4];
+ bowItemVtx = &pauseCtx->itemVtx[SLOT_BOW * 4];
offsetX = ABS_ALT(pauseCtx->equipAnimX - bowItemVtx->v.ob[0] * 10) / sEquipAnimTimer;
offsetY = ABS_ALT(pauseCtx->equipAnimY - bowItemVtx->v.ob[1] * 10) / sEquipAnimTimer;
} else {
@@ -761,13 +761,13 @@ void KaleidoScope_UpdateItemEquip(PlayState* play) {
// Update coordinates of item icon while being equipped
if (sEquipState == EQUIP_STATE_MAGIC_ARROW_MOVE_TO_BOW_SLOT) {
// target is the bow slot
- if (pauseCtx->equipAnimX >= (pauseCtx->itemVtx[4].v.ob[0] * 10)) {
+ if (pauseCtx->equipAnimX >= (pauseCtx->itemVtx[SLOT_BOW * 4].v.ob[0] * 10)) {
pauseCtx->equipAnimX -= offsetX;
} else {
pauseCtx->equipAnimX += offsetX;
}
- if (pauseCtx->equipAnimY >= (pauseCtx->itemVtx[4].v.ob[1] * 10)) {
+ if (pauseCtx->equipAnimY >= (pauseCtx->itemVtx[SLOT_BOW * 4].v.ob[1] * 10)) {
pauseCtx->equipAnimY -= offsetY;
} else {
pauseCtx->equipAnimY += offsetY;
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 ab598723f..6539f1b9e 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
@@ -10,14 +10,8 @@
#include "interface/icon_item_dungeon_static/icon_item_dungeon_static.h"
#include "interface/icon_item_jpn_static/icon_item_jpn_static.h"
-extern s16 D_8082B7F0[];
-extern s16 D_8082B838[];
-
extern TexturePtr D_09007500; // gPlayerFaceIcon
-#define WORLD_MAP_IMAGE_TEX_WIDTH 216
-#define WORLD_MAP_IMAGE_TEX_HEIGHT 128
-
void KaleidoScope_DrawDungeonStrayFairyCount(PlayState* play) {
s16 counterDigits[2];
s16 rectLeft;
@@ -142,8 +136,8 @@ void KaleidoScope_DrawDungeonMap(PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- j = 72 + (pauseCtx->cursorSlot[PAUSE_MAP] * 4);
- KaleidoScope_SetCursorVtx(pauseCtx, j, pauseCtx->mapPageVtx);
+ j = (QUAD_MAP_PAGE_DUNGEON_MAP + pauseCtx->cursorSlot[PAUSE_MAP]) * 4;
+ KaleidoScope_SetCursorVtxPos(pauseCtx, j, pauseCtx->mapPageVtx);
pauseCtx->cursorItem[PAUSE_MAP] = PAUSE_ITEM_NONE;
if (pauseCtx->cursorSpecialPos == 0) {
@@ -153,11 +147,19 @@ void KaleidoScope_DrawDungeonMap(PlayState* play) {
pauseCtx->cursorSlot[PAUSE_MAP] = pauseCtx->cursorPoint[PAUSE_MAP];
}
+ // Set vertices for:
+ // QUAD_MAP_PAGE_DUNGEON_TITLE,
+ // QUAD_MAP_PAGE_DUNGEON_BOSS_KEY,
+ // QUAD_MAP_PAGE_DUNGEON_COMPASS,
+ // QUAD_MAP_PAGE_DUNGEON_MAP
gSPVertex(POLY_OPA_DISP++, &pauseCtx->mapPageVtx[60], 16, 0);
+
+ // Dungeon Title
gDPPipeSync(POLY_OPA_DISP++);
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, pauseCtx->alpha);
gDPSetCombineMode(POLY_OPA_DISP++, G_CC_MODULATEIA, G_CC_MODULATEIA);
+ // QUAD_MAP_PAGE_DUNGEON_TITLE
POLY_OPA_DISP =
Gfx_DrawTexQuadIA8(POLY_OPA_DISP, sDungeonTitleTextures[((void)0, gSaveContext.dungeonIndex)], 128, 16, 0);
@@ -189,7 +191,7 @@ void KaleidoScope_DrawDungeonMap(PlayState* play) {
sStrayFairyIconAlphaScaleTimer = 15;
}
- func_8012C8AC(play->state.gfxCtx);
+ Gfx_SetupDL42_Opa(play->state.gfxCtx);
gDPSetCombineLERP(POLY_OPA_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0,
PRIMITIVE, 0, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE,
@@ -211,6 +213,7 @@ void KaleidoScope_DrawDungeonMap(PlayState* play) {
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx),
G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ // QUAD_MAP_PAGE_DUNGEON_STRAY_FAIRY_GLOWING_CIRCLE
pauseCtx->mapPageVtx[76].v.ob[0] = pauseCtx->mapPageVtx[78].v.ob[0] = -16;
pauseCtx->mapPageVtx[77].v.ob[0] = pauseCtx->mapPageVtx[79].v.ob[0] =
@@ -221,12 +224,13 @@ void KaleidoScope_DrawDungeonMap(PlayState* play) {
pauseCtx->mapPageVtx[78].v.ob[1] = pauseCtx->mapPageVtx[79].v.ob[1] =
pauseCtx->mapPageVtx[76].v.ob[1] - 24;
- gSPVertex(POLY_OPA_DISP++, &pauseCtx->mapPageVtx[76], 4, 0);
+ gSPVertex(POLY_OPA_DISP++,
+ &pauseCtx->mapPageVtx[QUAD_MAP_PAGE_DUNGEON_STRAY_FAIRY_GLOWING_CIRCLE * 4], 4, 0);
POLY_OPA_DISP =
Gfx_DrawTexQuad4b(POLY_OPA_DISP, gStrayFairyGlowingCircleIconTex, G_IM_FMT_I, 32, 24, 0);
KaleidoScope_SetView(pauseCtx, pauseCtx->eye.x, pauseCtx->eye.y, pauseCtx->eye.z);
- func_8012C628(play->state.gfxCtx);
+ Gfx_SetupDL39_Opa(play->state.gfxCtx);
gDPPipeSync(POLY_OPA_DISP++);
@@ -250,7 +254,7 @@ void KaleidoScope_DrawDungeonMap(PlayState* play) {
sStrayFairyIconRectS[sStrayFairyIconIndex], 0, 1 << 10, 1 << 10);
KaleidoScope_DrawDungeonStrayFairyCount(play);
- func_8012C8AC(play->state.gfxCtx);
+ Gfx_SetupDL42_Opa(play->state.gfxCtx);
}
}
} else if (CHECK_DUNGEON_ITEM(i, gSaveContext.dungeonIndex)) {
@@ -258,6 +262,9 @@ void KaleidoScope_DrawDungeonMap(PlayState* play) {
G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK,
G_TX_NOLOD, G_TX_NOLOD);
+ // QUAD_MAP_PAGE_DUNGEON_BOSS_KEY
+ // QUAD_MAP_PAGE_DUNGEON_COMPASS
+ // QUAD_MAP_PAGE_DUNGEON_MAP
gSP1Quadrangle(POLY_OPA_DISP++, j, j + 2, j + 3, j + 1, 0);
}
}
@@ -270,7 +277,7 @@ void KaleidoScope_DrawDungeonMap(PlayState* play) {
if ((pauseCtx->state == PAUSE_STATE_MAIN) && (pauseCtx->state != PAUSE_STATE_SAVEPROMPT) &&
!IS_PAUSE_STATE_GAMEOVER) {
- func_8012C628(play->state.gfxCtx);
+ Gfx_SetupDL39_Opa(play->state.gfxCtx);
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, pauseCtx->alpha);
@@ -287,7 +294,7 @@ void KaleidoScope_DrawDungeonMap(PlayState* play) {
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, pauseCtx->alpha);
- func_8012C8AC(play->state.gfxCtx);
+ Gfx_SetupDL42_Opa(play->state.gfxCtx);
}
}
@@ -486,6 +493,7 @@ s16 sWorldMapDotPrimColors[][3] = {
{ 0, 0, 255 },
{ 255, 255, 0 },
};
+
s16 sWorldMapDotEnvColors[][3] = {
{ 255, 255, 0 },
{ 0, 0, 255 },
@@ -537,7 +545,7 @@ void KaleidoScope_DrawWorldMap(PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- KaleidoScope_SetCursorVtx(pauseCtx, pauseCtx->cursorSlot[PAUSE_MAP] * 4, pauseCtx->mapPageVtx);
+ KaleidoScope_SetCursorVtxPos(pauseCtx, pauseCtx->cursorSlot[PAUSE_MAP] * 4, pauseCtx->mapPageVtx);
// Draw the world map image
if ((pauseCtx->pageIndex == PAUSE_MAP) && (pauseCtx->state == PAUSE_STATE_MAIN) &&
@@ -550,7 +558,7 @@ void KaleidoScope_DrawWorldMap(PlayState* play) {
// Each loaded chunk must have `size <= TMEM_SIZE / 2`
// because the texture is color-indexed, so the TLUT uses the other half of TMEM.
- func_8012C628(play->state.gfxCtx);
+ Gfx_SetupDL39_Opa(play->state.gfxCtx);
gDPSetTextureFilter(POLY_OPA_DISP++, G_TF_POINT);
gDPLoadTLUT_pal256(POLY_OPA_DISP++, gWorldMapImageTLUT);
@@ -561,17 +569,17 @@ void KaleidoScope_DrawWorldMap(PlayState* play) {
// Process the 128 rows of pixels for gWorldMapImageTex, 8 rows at a time over 16 iterations
// Loop over yPos (t), textureIndex (j)
for (t = 62, j = 0; j < 16; j++, t += 8) {
- gDPLoadTextureBlock(POLY_OPA_DISP++, (u8*)gWorldMapImageTex + j * (WORLD_MAP_IMAGE_TEX_WIDTH * 8),
- G_IM_FMT_CI, G_IM_SIZ_8b, WORLD_MAP_IMAGE_TEX_WIDTH, 8, 0, G_TX_NOMIRROR | G_TX_WRAP,
+ gDPLoadTextureBlock(POLY_OPA_DISP++, (u8*)gWorldMapImageTex + j * (WORLD_MAP_IMAGE_WIDTH * 8), G_IM_FMT_CI,
+ G_IM_SIZ_8b, WORLD_MAP_IMAGE_WIDTH, 8, 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);
rectLeft = 51 << 2;
- rectRight = rectLeft + (WORLD_MAP_IMAGE_TEX_WIDTH << 2);
+ rectRight = rectLeft + (WORLD_MAP_IMAGE_WIDTH << 2);
gSPTextureRectangle(POLY_OPA_DISP++, rectLeft, t << 2, rectRight, (t << 2) + (8 << 2), G_TX_RENDERTILE, 0,
0, 1 << 10, 1 << 10);
}
- func_8012C8AC(play->state.gfxCtx);
+ Gfx_SetupDL42_Opa(play->state.gfxCtx);
} else {
// Draw the world map angled
@@ -593,41 +601,44 @@ void KaleidoScope_DrawWorldMap(PlayState* play) {
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, pauseCtx->alpha);
// Set the vertices for the first 8 quads attached to the world map texture.
- gSPVertex(POLY_OPA_DISP++, &pauseCtx->mapPageVtx[204], 8 * 4, 0);
+ gSPVertex(POLY_OPA_DISP++, &pauseCtx->mapPageVtx[QUAD_MAP_PAGE_WORLD_IMAGE_FIRST * 4], 8 * 4, 0);
// Process the first 72 rows of pixels for gWorldMapImageTex, 9 rows at a time over 8 iterations
// Loop over quadIndex of this loop (i), quadIndex of the entire texture (k), vtxIndex (j)
for (i = 0, k = 0, j = 0; i < 8; i++, k++, j += 4) {
- gDPLoadTextureBlock(POLY_OPA_DISP++, (u8*)gWorldMapImageTex + k * (WORLD_MAP_IMAGE_TEX_WIDTH * 9),
- G_IM_FMT_CI, G_IM_SIZ_8b, WORLD_MAP_IMAGE_TEX_WIDTH, 9, 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);
+ gDPLoadTextureBlock(
+ POLY_OPA_DISP++, (u8*)gWorldMapImageTex + k * (WORLD_MAP_IMAGE_WIDTH * WORLD_MAP_IMAGE_FRAG_HEIGHT),
+ G_IM_FMT_CI, G_IM_SIZ_8b, WORLD_MAP_IMAGE_WIDTH, WORLD_MAP_IMAGE_FRAG_HEIGHT, 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);
gSP1Quadrangle(POLY_OPA_DISP++, j, j + 2, j + 3, j + 1, 0);
}
// Set the vertices for the last 7 quads attached to the world map texture:
// 6 quads with a height of 9, 1 quad with a height of 2
- gSPVertex(POLY_OPA_DISP++, &pauseCtx->mapPageVtx[236], (6 + 1) * 4, 0);
+ gSPVertex(POLY_OPA_DISP++, &pauseCtx->mapPageVtx[(QUAD_MAP_PAGE_WORLD_IMAGE_FIRST + 8) * 4], (6 + 1) * 4, 0);
// Process the next 54 rows of pixels for gWorldMapImageTex, 9 rows at a time over 6 iterations
// Loop over quadIndex of this loop (i), quadIndex of the entire texture (k), vtxIndex (j)
for (i = 0, j = 0; i < 6; i++, k++, j += 4) {
- gDPLoadTextureBlock(POLY_OPA_DISP++, (u8*)gWorldMapImageTex + k * (WORLD_MAP_IMAGE_TEX_WIDTH * 9),
- G_IM_FMT_CI, G_IM_SIZ_8b, WORLD_MAP_IMAGE_TEX_WIDTH, 9, 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);
+ gDPLoadTextureBlock(
+ POLY_OPA_DISP++, (u8*)gWorldMapImageTex + k * (WORLD_MAP_IMAGE_WIDTH * WORLD_MAP_IMAGE_FRAG_HEIGHT),
+ G_IM_FMT_CI, G_IM_SIZ_8b, WORLD_MAP_IMAGE_WIDTH, WORLD_MAP_IMAGE_FRAG_HEIGHT, 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);
gSP1Quadrangle(POLY_OPA_DISP++, j, j + 2, j + 3, j + 1, 0);
}
// Process the last 2 rows of pixels for gWorldMapImageTex
- gDPLoadTextureBlock(POLY_OPA_DISP++, (u8*)gWorldMapImageTex + k * (WORLD_MAP_IMAGE_TEX_WIDTH * 9), G_IM_FMT_CI,
- G_IM_SIZ_8b, WORLD_MAP_IMAGE_TEX_WIDTH, 2, 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);
+ gDPLoadTextureBlock(
+ POLY_OPA_DISP++, (u8*)gWorldMapImageTex + k * (WORLD_MAP_IMAGE_WIDTH * WORLD_MAP_IMAGE_FRAG_HEIGHT),
+ G_IM_FMT_CI, G_IM_SIZ_8b, WORLD_MAP_IMAGE_WIDTH, WORLD_MAP_IMAGE_HEIGHT % WORLD_MAP_IMAGE_FRAG_HEIGHT, 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);
gSP1Quadrangle(POLY_OPA_DISP++, j, j + 2, j + 3, j + 1, 0);
}
- func_8012C8AC(play->state.gfxCtx);
+ Gfx_SetupDL42_Opa(play->state.gfxCtx);
gDPPipeSync(POLY_OPA_DISP++);
@@ -641,12 +652,13 @@ void KaleidoScope_DrawWorldMap(PlayState* play) {
// Draw clouds over the world map
// Iterate over cloud bits (n)
- for (n = 0; n < 15; n++) {
+ for (n = 0; n < WORLD_MAP_NUM_CLOUDS; n++) {
if (!(((void)0, gSaveContext.save.saveInfo.worldMapCloudVisibility) & gBitFlags[n])) {
- gSPVertex(POLY_OPA_DISP++, &pauseCtx->mapPageVtx[60 + n * 4], 4, 0);
+ gSPVertex(POLY_OPA_DISP++, &pauseCtx->mapPageVtx[(QUAD_MAP_PAGE_WORLD_CLOUDS_FIRST + n) * 4], 4, 0);
- POLY_OPA_DISP = Gfx_DrawTexQuadIA8(POLY_OPA_DISP, sCloudTextures[n], D_8082B7F0[n], D_8082B838[n], 0);
+ POLY_OPA_DISP = Gfx_DrawTexQuadIA8(POLY_OPA_DISP, sCloudTextures[n], gVtxPageMapWorldQuadsWidth[n],
+ gVtxPageMapWorldQuadsHeight[n], 0);
}
}
@@ -658,7 +670,7 @@ void KaleidoScope_DrawWorldMap(PlayState* play) {
gDPFillRectangle(POLY_OPA_DISP++, 50, 62, 270, 190);
}
- func_8012C8AC(play->state.gfxCtx);
+ Gfx_SetupDL42_Opa(play->state.gfxCtx);
if (!IS_PAUSE_STATE_OWLWARP) {
// Browsing the world map regions on the pause menu
@@ -676,6 +688,7 @@ void KaleidoScope_DrawWorldMap(PlayState* play) {
if (R_PAUSE_DBG_MAP_CLOUD_ON) {
gSaveContext.save.saveInfo.worldMapCloudVisibility |= (u16)~0x8000;
+ // QUAD_MAP_PAGE_WORLD_REGION_FIRST
pauseCtx->mapPageVtx[120].v.ob[0] = pauseCtx->mapPageVtx[122].v.ob[0] = R_PAUSE_DBG_MAP_CLOUD_X;
pauseCtx->mapPageVtx[121].v.ob[0] = pauseCtx->mapPageVtx[123].v.ob[0] =
@@ -690,7 +703,7 @@ void KaleidoScope_DrawWorldMap(PlayState* play) {
// Loop over RegionId (i), unused vtxIndex (j), unused (k)
for (i = 0, j = 0; i < REGION_MAX; i++, k++, j += 4) {
if (pauseCtx->worldMapPoints[i]) {
- gSPVertex(POLY_OPA_DISP++, &pauseCtx->mapPageVtx[120 + i * 4], 4, 0);
+ gSPVertex(POLY_OPA_DISP++, &pauseCtx->mapPageVtx[(QUAD_MAP_PAGE_WORLD_REGION_FIRST + i) * 4], 4, 0);
gSP1Quadrangle(POLY_OPA_DISP++, 0, 2, 3, 1, 0);
}
}
@@ -708,6 +721,7 @@ void KaleidoScope_DrawWorldMap(PlayState* play) {
if (R_PAUSE_DBG_MAP_CLOUD_ON) {
gSaveContext.save.saveInfo.worldMapCloudVisibility |= (u16)~0x8000;
+ // QUAD_MAP_PAGE_WORLD_WARP_FIRST
pauseCtx->mapPageVtx[164].v.ob[0] = pauseCtx->mapPageVtx[166].v.ob[0] = R_PAUSE_DBG_MAP_CLOUD_X;
pauseCtx->mapPageVtx[165].v.ob[0] = pauseCtx->mapPageVtx[167].v.ob[0] =
@@ -722,7 +736,7 @@ void KaleidoScope_DrawWorldMap(PlayState* play) {
// Loop over OwlWarpId (i), unused vtxIndex (j), unused (k)
for (i = 0, j = 0; i < OWL_WARP_ENTRANCE; i++, k++, j += 4) {
if (pauseCtx->worldMapPoints[i]) {
- gSPVertex(POLY_OPA_DISP++, &pauseCtx->mapPageVtx[164 + i * 4], 4, 0);
+ gSPVertex(POLY_OPA_DISP++, &pauseCtx->mapPageVtx[(QUAD_MAP_PAGE_WORLD_WARP_FIRST + i) * 4], 4, 0);
gSP1Quadrangle(POLY_OPA_DISP++, 0, 2, 3, 1, 0);
}
}
@@ -795,7 +809,7 @@ void KaleidoScope_DrawWorldMap(PlayState* play) {
// Draw Player's face at the current region
if (n != REGION_MAX) {
KaleidoScope_SetView(pauseCtx, pauseCtx->eye.x, pauseCtx->eye.y, pauseCtx->eye.z);
- func_8012C628(play->state.gfxCtx);
+ Gfx_SetupDL39_Opa(play->state.gfxCtx);
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, pauseCtx->alpha);
diff --git a/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_mask.c b/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_mask.c
index 61157ffce..67a8e0d36 100644
--- a/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_mask.c
+++ b/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_mask.c
@@ -15,7 +15,7 @@ s16 sMaskEquipMagicArrowSlotHoldTimer = 0;
// Number of frames to move icon from slot to target position when equipping.
s16 sMaskEquipAnimTimer = 10;
-u8 gMaskPlayerFormSlotRestrictions[PLAYER_FORM_MAX][NUM_MASK_SLOTS] = {
+u8 gMaskPlayerFormSlotRestrictions[PLAYER_FORM_MAX][MASK_NUM_SLOTS] = {
// Fierce Deity
{
false, // SLOT_MASK_POSTMAN
@@ -196,17 +196,17 @@ void KaleidoScope_DrawMaskSelect(PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- KaleidoScope_SetCursorVtx(pauseCtx, pauseCtx->cursorSlot[PAUSE_MASK] * 4, pauseCtx->maskVtx);
+ KaleidoScope_SetCursorVtxPos(pauseCtx, pauseCtx->cursorSlot[PAUSE_MASK] * 4, pauseCtx->maskVtx);
- func_8012C8AC(play->state.gfxCtx);
+ Gfx_SetupDL42_Opa(play->state.gfxCtx);
// Draw a white box around the items that are equipped on the C buttons
// Loop over c-buttons (i) and vtx offset (j)
gDPSetCombineMode(POLY_OPA_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, pauseCtx->alpha);
- for (i = 0, j = NUM_MASK_SLOTS * 4; i < 3; i++, j += 4) {
+ for (i = 0, j = MASK_NUM_SLOTS * 4; i < 3; i++, j += 4) {
if (GET_CUR_FORM_BTN_ITEM(i + 1) != ITEM_NONE) {
- if (GET_CUR_FORM_BTN_SLOT(i + 1) >= NUM_ITEM_SLOTS) {
+ if (GET_CUR_FORM_BTN_SLOT(i + 1) >= ITEM_NUM_SLOTS) {
gSPVertex(POLY_OPA_DISP++, &pauseCtx->maskVtx[j], 4, 0);
POLY_OPA_DISP = Gfx_DrawTexQuadIA8(POLY_OPA_DISP, gEquippedItemOutlineTex, 32, 32, 0);
}
@@ -218,10 +218,10 @@ void KaleidoScope_DrawMaskSelect(PlayState* play) {
// Draw the item icons
// Loop over slots (i) and vtx offset (j)
gDPSetCombineMode(POLY_OPA_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
- for (j = 0, i = 0; i < NUM_MASK_SLOTS; i++, j += 4) {
+ for (j = 0, i = 0; i < MASK_NUM_SLOTS; i++, j += 4) {
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, pauseCtx->alpha);
- if (((void)0, gSaveContext.save.saveInfo.inventory.items[i + NUM_ITEM_SLOTS]) != ITEM_NONE) {
+ if (((void)0, gSaveContext.save.saveInfo.inventory.items[i + ITEM_NUM_SLOTS]) != ITEM_NONE) {
if (!CHECK_GIVEN_MASK_ON_MOON(i)) {
if ((pauseCtx->mainState == PAUSE_MAIN_STATE_IDLE) && (pauseCtx->pageIndex == PAUSE_MASK) &&
(pauseCtx->cursorSpecialPos == 0) &&
@@ -259,7 +259,7 @@ void KaleidoScope_DrawMaskSelect(PlayState* play) {
gSPVertex(POLY_OPA_DISP++, &pauseCtx->maskVtx[j + 0], 4, 0);
KaleidoScope_DrawTexQuadRGBA32(
play->state.gfxCtx,
- gItemIcons[((void)0, gSaveContext.save.saveInfo.inventory.items[i + NUM_ITEM_SLOTS])], 32, 32, 0);
+ gItemIcons[((void)0, gSaveContext.save.saveInfo.inventory.items[i + ITEM_NUM_SLOTS])], 32, 32, 0);
}
}
}
@@ -324,7 +324,7 @@ void KaleidoScope_UpdateMaskCursor(PlayState* play) {
pauseCtx->cursorPoint[PAUSE_MASK] =
pauseCtx->cursorXIndex[PAUSE_MASK] + (pauseCtx->cursorYIndex[PAUSE_MASK] * 6);
- if (pauseCtx->cursorPoint[PAUSE_MASK] >= NUM_MASK_SLOTS) {
+ if (pauseCtx->cursorPoint[PAUSE_MASK] >= MASK_NUM_SLOTS) {
pauseCtx->cursorPoint[PAUSE_MASK] = pauseCtx->cursorXIndex[PAUSE_MASK];
}
@@ -354,7 +354,7 @@ void KaleidoScope_UpdateMaskCursor(PlayState* play) {
pauseCtx->cursorPoint[PAUSE_MASK] =
pauseCtx->cursorXIndex[PAUSE_MASK] + (pauseCtx->cursorYIndex[PAUSE_MASK] * 6);
- if (pauseCtx->cursorPoint[PAUSE_MASK] >= NUM_MASK_SLOTS) {
+ if (pauseCtx->cursorPoint[PAUSE_MASK] >= MASK_NUM_SLOTS) {
pauseCtx->cursorPoint[PAUSE_MASK] = pauseCtx->cursorXIndex[PAUSE_MASK];
}
@@ -372,7 +372,7 @@ void KaleidoScope_UpdateMaskCursor(PlayState* play) {
if (moveCursorResult == PAUSE_CURSOR_RESULT_SLOT) {
cursorItem =
- gSaveContext.save.saveInfo.inventory.items[pauseCtx->cursorPoint[PAUSE_MASK] + NUM_ITEM_SLOTS];
+ gSaveContext.save.saveInfo.inventory.items[pauseCtx->cursorPoint[PAUSE_MASK] + ITEM_NUM_SLOTS];
if (CHECK_GIVEN_MASK_ON_MOON(pauseCtx->cursorPoint[PAUSE_MASK])) {
cursorItem = ITEM_NONE;
}
@@ -388,7 +388,7 @@ void KaleidoScope_UpdateMaskCursor(PlayState* play) {
// Search for slot to move to
while (true) {
// Check if current cursor has an item in its slot
- if ((gSaveContext.save.saveInfo.inventory.items[cursorPoint + NUM_ITEM_SLOTS] != ITEM_NONE) &&
+ if ((gSaveContext.save.saveInfo.inventory.items[cursorPoint + ITEM_NUM_SLOTS] != ITEM_NONE) &&
!CHECK_GIVEN_MASK_ON_MOON(cursorPoint)) {
pauseCtx->cursorPoint[PAUSE_MASK] = cursorPoint;
pauseCtx->cursorXIndex[PAUSE_MASK] = cursorXIndex;
@@ -429,7 +429,7 @@ void KaleidoScope_UpdateMaskCursor(PlayState* play) {
// Search for slot to move to
while (true) {
// Check if current cursor has an item in its slot
- if ((gSaveContext.save.saveInfo.inventory.items[cursorPoint + NUM_ITEM_SLOTS] != ITEM_NONE) &&
+ if ((gSaveContext.save.saveInfo.inventory.items[cursorPoint + ITEM_NUM_SLOTS] != ITEM_NONE) &&
!CHECK_GIVEN_MASK_ON_MOON(cursorPoint)) {
pauseCtx->cursorPoint[PAUSE_MASK] = cursorPoint;
pauseCtx->cursorXIndex[PAUSE_MASK] = cursorXIndex;
@@ -502,13 +502,13 @@ void KaleidoScope_UpdateMaskCursor(PlayState* play) {
if (moveCursorResult == PAUSE_CURSOR_RESULT_SLOT) {
cursorItem =
- gSaveContext.save.saveInfo.inventory.items[pauseCtx->cursorPoint[PAUSE_MASK] + NUM_ITEM_SLOTS];
+ gSaveContext.save.saveInfo.inventory.items[pauseCtx->cursorPoint[PAUSE_MASK] + ITEM_NUM_SLOTS];
if (CHECK_GIVEN_MASK_ON_MOON(pauseCtx->cursorPoint[PAUSE_MASK])) {
cursorItem = ITEM_NONE;
}
} else if (moveCursorResult != PAUSE_CURSOR_RESULT_SPECIAL_POS) {
cursorItem =
- gSaveContext.save.saveInfo.inventory.items[pauseCtx->cursorPoint[PAUSE_MASK] + NUM_ITEM_SLOTS];
+ gSaveContext.save.saveInfo.inventory.items[pauseCtx->cursorPoint[PAUSE_MASK] + ITEM_NUM_SLOTS];
if (CHECK_GIVEN_MASK_ON_MOON(pauseCtx->cursorPoint[PAUSE_MASK])) {
cursorItem = ITEM_NONE;
}
@@ -571,8 +571,8 @@ void KaleidoScope_UpdateMaskCursor(PlayState* play) {
if ((Player_GetEnvironmentalHazard(play) >= PLAYER_ENV_HAZARD_UNDERWATER_FLOOR) &&
(Player_GetEnvironmentalHazard(play) <= PLAYER_ENV_HAZARD_UNDERWATER_FREE) &&
- ((cursorSlot == (SLOT_MASK_DEKU - NUM_ITEM_SLOTS)) ||
- (cursorSlot == (SLOT_MASK_GORON - NUM_ITEM_SLOTS)))) {
+ ((cursorSlot == (SLOT_MASK_DEKU - ITEM_NUM_SLOTS)) ||
+ (cursorSlot == (SLOT_MASK_GORON - ITEM_NUM_SLOTS)))) {
play_sound(NA_SE_SY_ERROR);
return;
}
@@ -587,7 +587,7 @@ void KaleidoScope_UpdateMaskCursor(PlayState* play) {
// Equip item to the C buttons
pauseCtx->equipTargetItem = cursorItem;
- pauseCtx->equipTargetSlot = cursorSlot + NUM_ITEM_SLOTS;
+ pauseCtx->equipTargetSlot = cursorSlot + ITEM_NUM_SLOTS;
pauseCtx->mainState = PAUSE_MAIN_STATE_EQUIP_MASK;
vtxIndex = cursorSlot * 4;
pauseCtx->equipAnimX = pauseCtx->maskVtx[vtxIndex].v.ob[0] * 10;
@@ -659,7 +659,10 @@ void KaleidoScope_UpdateMaskEquip(PlayState* play) {
}
if (sMaskEquipState == EQUIP_STATE_MAGIC_ARROW_MOVE_TO_BOW_SLOT) {
- bowItemVtx = &pauseCtx->itemVtx[12];
+ //! Note: Copied from OoT when `SLOT_BOW` was still valued at 3.
+ // Due to a shift, `SLOT_ARROW_ICE` now occupies slot 3 but this value was not updated
+ // Block is never reached as you can not equip magic arrows from the mask page
+ bowItemVtx = &pauseCtx->itemVtx[SLOT_ARROW_ICE * 4];
offsetX = ABS_ALT(pauseCtx->equipAnimX - bowItemVtx->v.ob[0] * 10) / sMaskEquipAnimTimer;
offsetY = ABS_ALT(pauseCtx->equipAnimY - bowItemVtx->v.ob[1] * 10) / sMaskEquipAnimTimer;
} else {
diff --git a/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_prompt.c b/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_prompt.c
index 13e233b58..9bf89cdd2 100644
--- a/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_prompt.c
+++ b/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_prompt.c
@@ -14,7 +14,7 @@ void KaleidoScope_UpdatePrompt(PlayState* play) {
static s16 sPromptAlphaTimer = 10;
PauseContext* pauseCtx = &play->pauseCtx;
Input* input = CONTROLLER1(&play->state);
- s8 relStickX = input->rel.stick_x;
+ s8 stickAdjX = input->rel.stick_x;
s16 alphaStep;
if (((pauseCtx->state == PAUSE_STATE_SAVEPROMPT) && (pauseCtx->savePromptState == PAUSE_SAVEPROMPT_STATE_1)) ||
@@ -22,11 +22,11 @@ void KaleidoScope_UpdatePrompt(PlayState* play) {
(pauseCtx->state == PAUSE_STATE_GAMEOVER_CONTINUE_PROMPT)) {
// Move the prompt
- if ((pauseCtx->promptChoice == PAUSE_PROMPT_YES) && (relStickX >= 30)) {
+ if ((pauseCtx->promptChoice == PAUSE_PROMPT_YES) && (stickAdjX >= 30)) {
// Move right to the no prompt
play_sound(NA_SE_SY_CURSOR);
pauseCtx->promptChoice = PAUSE_PROMPT_NO;
- } else if ((pauseCtx->promptChoice != PAUSE_PROMPT_YES) && (relStickX <= -30)) {
+ } else if ((pauseCtx->promptChoice != PAUSE_PROMPT_YES) && (stickAdjX <= -30)) {
// Move left to the yes prompt
play_sound(NA_SE_SY_CURSOR);
pauseCtx->promptChoice = PAUSE_PROMPT_YES;
diff --git a/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope.h b/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope.h
index 849c7020e..a9aeed70f 100644
--- a/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope.h
+++ b/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope.h
@@ -92,7 +92,7 @@ typedef enum {
#define IS_PAUSE_STATE_OWLWARP \
((pauseCtx->state >= PAUSE_STATE_OWLWARP_2) && (pauseCtx->state <= PAUSE_STATE_OWLWARP_6))
-#define IS_PAUSE_MAIN_STATE_SAVE_PROMPT \
+#define IS_PAUSE_MAIN_STATE_SONG_PROMPT \
((pauseCtx->mainState >= PAUSE_MAIN_STATE_SONG_PROMPT_INIT) && \
(pauseCtx->mainState <= PAUSE_MAIN_STATE_SONG_PROMPT_DONE))
@@ -125,6 +125,184 @@ typedef enum {
/* 5 */ PAUSE_BG_PRERENDER_MAX
} PauseBgPreRenderState;
+typedef enum {
+ /* 0 */ VTX_PAGE_MASK,
+ /* 1 */ VTX_PAGE_ITEM,
+ /* 2 */ VTX_PAGE_MAP_DUNGEON,
+ /* 3 */ VTX_PAGE_QUEST,
+ /* 4 */ VTX_PAGE_MAP_WORLD,
+ /* 5 */ VTX_PAGE_PROMPT,
+ /* 6 */ VTX_PAGE_MAX
+} VtxPage;
+
+#define VTX_PAGE_MASK_QUADS 0 // VTX_PAGE_MASK
+#define VTX_PAGE_ITEM_QUADS 0 // VTX_PAGE_ITEM
+#define VTX_PAGE_MAP_DUNGEON_QUADS 6 // VTX_PAGE_MAP_DUNGEON
+#define VTX_PAGE_QUEST_QUADS 0 // VTX_PAGE_QUEST
+#define VTX_PAGE_MAP_WORLD_QUADS 36 // VTX_PAGE_MAP_WORLD
+#define VTX_PAGE_SAVE_QUADS 5 // VTX_PAGE_PROMPT
+
+#define PAGE_BG_COLS 3
+#define PAGE_BG_ROWS 5
+#define PAGE_BG_QUADS (PAGE_BG_COLS * PAGE_BG_ROWS)
+#define PAGE_BG_QUAD_WIDTH 80
+#define PAGE_BG_QUAD_HEIGHT 32
+#define PAGE_BG_QUAD_TEX_WIDTH 80
+#define PAGE_BG_QUAD_TEX_HEIGHT 32
+
+// === ITEM === //
+
+#define ITEM_GRID_ROWS 4
+#define ITEM_GRID_COLS 6
+#define ITEM_GRID_CELL_WIDTH 32
+#define ITEM_GRID_CELL_HEIGHT 32
+#define ITEM_GRID_QUAD_MARGIN 2
+#define ITEM_GRID_QUAD_WIDTH (ITEM_GRID_CELL_WIDTH - (2 * ITEM_GRID_QUAD_MARGIN))
+#define ITEM_GRID_QUAD_HEIGHT (ITEM_GRID_CELL_HEIGHT - (2 * ITEM_GRID_QUAD_MARGIN))
+#define ITEM_GRID_QUAD_TEX_SIZE 32 // both width and height
+#define ITEM_GRID_QUAD_ENLARGE_OFFSET 2
+
+#define ITEM_GRID_SELECTED_QUAD_MARGIN (-2)
+#define ITEM_GRID_SELECTED_QUAD_WIDTH (ITEM_GRID_QUAD_WIDTH - (2 * ITEM_GRID_SELECTED_QUAD_MARGIN))
+#define ITEM_GRID_SELECTED_QUAD_HEIGHT (ITEM_GRID_QUAD_HEIGHT - (2 * ITEM_GRID_SELECTED_QUAD_MARGIN))
+#define ITEM_GRID_SELECTED_QUAD_TEX_SIZE 32 // both width and height
+
+#define ITEM_NUM_SLOTS (ITEM_GRID_ROWS * ITEM_GRID_COLS)
+
+typedef enum {
+ // 0..59 are the 15 background textures
+ /* 0 */ QUAD_ITEM_PAGE_BG_FIRST,
+ /* 14 */ QUAD_ITEM_PAGE_BG_LAST = PAGE_BG_QUADS - 1,
+ // VTX_PAGE_ITEM_QUADS is 0
+ /* 15 */ QUAD_ITEM_PAGE_MAX
+} ItemPageQuad;
+
+typedef enum {
+ // 0..23 are the ITEM_GRID_ROWS*ITEM_GRID_COLS item grid
+ // The values follow the `InventorySlot` enum
+ /* 0 */ QUAD_ITEM_GRID_FIRST,
+ /* 23 */ QUAD_ITEM_GRID_LAST = ITEM_GRID_ROWS * ITEM_GRID_COLS - 1,
+ // White-box Markers indicating the currently equipped items
+ /* 24 */ QUAD_ITEM_GRID_SELECTED_C_LEFT,
+ /* 25 */ QUAD_ITEM_GRID_SELECTED_C_DOWN,
+ /* 26 */ QUAD_ITEM_GRID_SELECTED_C_RIGHT,
+ /* 27 */ QUAD_ITEM_MAX
+} ItemQuad;
+
+// === MASK === //
+
+#define MASK_GRID_ROWS 4
+#define MASK_GRID_COLS 6
+#define MASK_GRID_CELL_WIDTH 32
+#define MASK_GRID_CELL_HEIGHT 32
+#define MASK_GRID_QUAD_MARGIN 2
+#define MASK_GRID_QUAD_WIDTH (MASK_GRID_CELL_WIDTH - (2 * MASK_GRID_QUAD_MARGIN))
+#define MASK_GRID_QUAD_HEIGHT (MASK_GRID_CELL_HEIGHT - (2 * MASK_GRID_QUAD_MARGIN))
+#define MASK_GRID_QUAD_TEX_SIZE 32 // both width and height
+#define MASK_GRID_QUAD_ENLARGE_OFFSET 2
+
+#define MASK_GRID_SELECTED_QUAD_MARGIN (-2)
+#define MASK_GRID_SELECTED_QUAD_WIDTH (MASK_GRID_QUAD_WIDTH - (2 * MASK_GRID_SELECTED_QUAD_MARGIN))
+#define MASK_GRID_SELECTED_QUAD_HEIGHT (MASK_GRID_QUAD_HEIGHT - (2 * MASK_GRID_SELECTED_QUAD_MARGIN))
+#define MASK_GRID_SELECTED_QUAD_TEX_SIZE 32 // both width and height
+
+#define MASK_NUM_SLOTS (MASK_GRID_ROWS * MASK_GRID_COLS)
+
+typedef enum {
+ // 0..59 are the 15 background textures
+ /* 0 */ QUAD_MASK_PAGE_BG_FIRST,
+ /* 14 */ QUAD_MASK_PAGE_BG_LAST = PAGE_BG_QUADS - 1,
+ // VTX_PAGE_MASK_QUADS is 0
+ /* 15 */ QUAD_MASK_PAGE_MAX
+} MaskPageQuad;
+
+typedef enum {
+ // 0..23 are the MASK_GRID_ROWS*MASK_GRID_COLS item grid
+ // The values follow the `InventorySlot` enum offset by ITEM_NUM_SLOTS
+ /* 0 */ QUAD_MASK_GRID_FIRST,
+ /* 23 */ QUAD_MASK_GRID_LAST = MASK_GRID_ROWS * MASK_GRID_COLS - 1,
+ // Markers indicating the currently equipped items
+ /* 24 */ QUAD_MASK_GRID_SELECTED_C_LEFT,
+ /* 25 */ QUAD_MASK_GRID_SELECTED_C_DOWN,
+ /* 26 */ QUAD_MASK_GRID_SELECTED_C_RIGHT,
+ /* 27 */ QUAD_MASK_MAX
+} MaskQuad;
+
+// === QUEST === //
+
+typedef enum {
+ // 0..59 are the 15 background textures
+ /* 0 */ QUAD_QUEST_PAGE_BG_FIRST,
+ /* 14 */ QUAD_QUEST_PAGE_BG_LAST = PAGE_BG_QUADS - 1,
+ // VTX_PAGE_QUEST_QUADS is 0
+ /* 15 */ QUAD_QUEST_PAGE_MAX
+} QuestPageQuad;
+
+typedef enum {
+ // 0 to 24 matches the `QuestItem` enum
+ // Notes showing the correct song
+ /* 25 */ QUAD_QUEST_SONG_NOTE_A1 = QUEST_HEART_PIECE + 1,
+ /* 26 */ QUAD_QUEST_SONG_NOTE_A2,
+ /* 27 */ QUAD_QUEST_SONG_NOTE_A3,
+ /* 28 */ QUAD_QUEST_SONG_NOTE_A4,
+ /* 29 */ QUAD_QUEST_SONG_NOTE_A5,
+ /* 30 */ QUAD_QUEST_SONG_NOTE_A6,
+ /* 31 */ QUAD_QUEST_SONG_NOTE_A7,
+ /* 32 */ QUAD_QUEST_SONG_NOTE_A8,
+ // Notes appearing when playing
+ /* 33 */ QUAD_QUEST_SONG_NOTE_B1,
+ /* 34 */ QUAD_QUEST_SONG_NOTE_B2,
+ /* 35 */ QUAD_QUEST_SONG_NOTE_B3,
+ /* 36 */ QUAD_QUEST_SONG_NOTE_B4,
+ /* 37 */ QUAD_QUEST_SONG_NOTE_B5,
+ /* 38 */ QUAD_QUEST_SONG_NOTE_B6,
+ /* 39 */ QUAD_QUEST_SONG_NOTE_B7,
+ /* 40 */ QUAD_QUEST_SONG_NOTE_B8,
+ /* 41 */ QUAD_QUEST_MAX
+} QuestQuad;
+
+// === DUNGEON MAP === //
+
+typedef enum {
+ // 0..59 are the 15 background textures
+ /* 0 */ QUAD_MAP_PAGE_DUNGEON_BG_FIRST,
+ /* 14 */ QUAD_MAP_PAGE_DUNGEON_BG_LAST = PAGE_BG_QUADS - 1,
+ /* 15 */ QUAD_MAP_PAGE_DUNGEON_TITLE,
+ /* 16 */ QUAD_MAP_PAGE_DUNGEON_BOSS_KEY,
+ /* 17 */ QUAD_MAP_PAGE_DUNGEON_COMPASS,
+ /* 18 */ QUAD_MAP_PAGE_DUNGEON_MAP,
+ /* 19 */ QUAD_MAP_PAGE_DUNGEON_STRAY_FAIRY_GLOWING_CIRCLE,
+ /* 20 */ QUAD_MAP_PAGE_DUNGEON_UNUSED,
+ /* 21 */ QUAD_MAP_PAGE_DUNGEON_MAX
+} DungeonMapPageQuad;
+
+// === WORLD MAP === //
+
+#define WORLD_MAP_IMAGE_WIDTH 216
+#define WORLD_MAP_IMAGE_HEIGHT 128
+#define WORLD_MAP_IMAGE_FRAG_HEIGHT ((TMEM_SIZE / 2) / (WORLD_MAP_IMAGE_WIDTH * G_IM_SIZ_8b_BYTES))
+#define WORLD_MAP_IMAGE_FRAG_NUM (((WORLD_MAP_IMAGE_HEIGHT - 1) / WORLD_MAP_IMAGE_FRAG_HEIGHT) + 1)
+#define WORLD_MAP_NUM_CLOUDS 15
+
+typedef enum {
+ // 0..59 are the 15 background textures
+ /* 0 */ QUAD_MAP_PAGE_WORLD_BG_FIRST,
+ /* 14 */ QUAD_MAP_PAGE_WORLD_BG_LAST = PAGE_BG_QUADS - 1,
+ // Clouds covering the world map
+ /* 15 */ QUAD_MAP_PAGE_WORLD_CLOUDS_FIRST,
+ /* 29 */ QUAD_MAP_PAGE_WORLD_CLOUDS_LAST = QUAD_MAP_PAGE_WORLD_CLOUDS_FIRST + WORLD_MAP_NUM_CLOUDS - 1,
+ // Markers for regions
+ /* 30 */ QUAD_MAP_PAGE_WORLD_REGION_FIRST,
+ /* 40 */ QUAD_MAP_PAGE_WORLD_REGION_LAST = QUAD_MAP_PAGE_WORLD_REGION_FIRST + REGION_MAX - 1,
+ // Markers for owl warps
+ /* 41 */ QUAD_MAP_PAGE_WORLD_WARP_FIRST,
+ /* 50 */ QUAD_MAP_PAGE_WORLD_WARP_LAST = QUAD_MAP_PAGE_WORLD_WARP_FIRST + OWL_WARP_ENTRANCE - 1,
+ // Fragments of the world map
+ /* 51 */ QUAD_MAP_PAGE_WORLD_IMAGE_FIRST,
+ /* 65 */ QUAD_MAP_PAGE_WORLD_IMAGE_LAST = QUAD_MAP_PAGE_WORLD_IMAGE_FIRST + WORLD_MAP_IMAGE_FRAG_NUM - 1,
+ /* 66 */ QUAD_MAP_PAGE_WORLD_MAX
+} WorldMapPageQuad;
+
#define PAUSE_NAME_COLOR_SET_WHITE 0
#define PAUSE_NAME_COLOR_SET_GREY 1
@@ -139,12 +317,27 @@ typedef enum {
/* 2 */ PAUSE_CURSOR_RESULT_SPECIAL_POS
} PauseMoveCursorResult;
-#define NUM_ITEM_SLOTS 24
-#define NUM_MASK_SLOTS 24
+typedef enum {
+ /* 0 */ PAUSE_QUAD_CURSOR_0,
+ /* 1 */ PAUSE_QUAD_CURSOR_1,
+ /* 2 */ PAUSE_QUAD_CURSOR_2,
+ /* 3 */ PAUSE_QUAD_CURSOR_3,
+ /* 4 */ PAUSE_QUAD_CURSOR_4,
+ /* 5 */ PAUSE_QUAD_CURSOR_MAX
+} PauseCursorQuad;
#define PAUSE_PROMPT_YES 0
#define PAUSE_PROMPT_NO 4
+typedef enum {
+ /* 0 */ QUAD_PROMPT_MESSAGE,
+ /* 1 */ QUAD_PROMPT_CURSOR_LEFT,
+ /* 2 */ QUAD_PROMPT_CURSOR_RIGHT,
+ /* 3 */ QUAD_PROMPT_CHOICE_YES,
+ /* 4 */ QUAD_PROMPT_CHOICE_NO,
+ /* 5 */ QUAD_PROMPT_MAX
+} PromptQuad;
+
// NES
void KaleidoScope_MoveCursorToSpecialPos(PlayState* play, s16 cursorSpecialPos);
void KaleidoScope_DrawTexQuadRGBA32(GraphicsContext* gfxCtx, TexturePtr texture, u16 width, u16 height, u16 point);
@@ -162,7 +355,7 @@ void KaleidoScope_DrawQuestStatus(PlayState* play);
void KaleidoScope_UpdateQuestCursor(PlayState* play);
// Item
-void KaleidoScope_SetCursorVtx(PauseContext* pauseCtx, u16 index, Vtx* vtx);
+void KaleidoScope_SetCursorVtxPos(PauseContext* pauseCtx, u16 vtxIndex, Vtx* vtx);
void KaleidoScope_DrawItemSelect(PlayState* play);
void KaleidoScope_UpdateItemCursor(PlayState* play);
void KaleidoScope_UpdateItemEquip(PlayState* play);
@@ -179,4 +372,7 @@ void KaleidoScope_UpdatePrompt(PlayState* play);
void KaleidoScope_DrawInventoryEditor(PlayState* play);
void KaleidoScope_UpdateInventoryEditor(PlayState* play);
+extern s16 gVtxPageMapWorldQuadsWidth[];
+extern s16 gVtxPageMapWorldQuadsHeight[];
+
#endif
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 61da1e6ce..9b99937e1 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
@@ -6,6 +6,8 @@
#include "z_kaleido_scope.h"
#include "overlays/gamestates/ovl_opening/z_opening.h"
+#include "interface/icon_item_gameover_static/icon_item_gameover_static.h"
+#include "interface/icon_item_jpn_static/icon_item_jpn_static.h"
#include "z64view.h"
extern UNK_TYPE D_02001360;
@@ -20,32 +22,165 @@ extern UNK_TYPE D_0C006C00;
extern u8 sUnpausedButtonStatus[5];
-void* D_8082B700[] = {
- 0x08064440, 0x0806E440, 0x08077A40, 0x08081040, 0x0808A640, 0x0D003A00, 0x0806EE40, 0x08078440,
- 0x08081A40, 0x0808B040, 0x08065840, 0x0806F840, 0x08078E40, 0x08082440, 0x0808BA40,
+// Page Textures (Background of Page):
+// Broken up into multiple textures.
+// Numbered by column/row.
+TexturePtr sMaskPageBgTextures[] = {
+ // Column 0
+ 0x08064440, // gPauseMasks00Tex
+ 0x0806E440, // gPauseMasks01Tex
+ 0x08077A40, // gPauseMasks02Tex
+ 0x08081040, // gPauseMasks03Tex
+ 0x0808A640, // gPauseMasks04Tex
+ // Column 1
+ gPauseMasks10ENGTex,
+ 0x0806EE40, // gPauseMasks11Tex
+ 0x08078440, // gPauseMasks12Tex
+ 0x08081A40, // gPauseMasks13Tex
+ 0x0808B040, // gPauseMasks14Tex
+ // Column 2
+ 0x08065840, // gPauseMasks20Tex
+ 0x0806F840, // gPauseMasks21Tex
+ 0x08078E40, // gPauseMasks22Tex
+ 0x08082440, // gPauseMasks23Tex
+ 0x0808BA40, // gPauseMasks24Tex
};
-void* D_8082B73C[] = {
- 0x0D004400, 0x08070240, 0x08079840, 0x08082E40, 0x0808C440, 0x0D004E00, 0x08070C40, 0x0807A240,
- 0x08083840, 0x0808CE40, 0x0D005800, 0x08071640, 0x0807AC40, 0x08084240, 0x0808D840,
+TexturePtr sItemPageBgTextures[] = {
+ // Column 0
+ gPauseSelectItem00ENGTex,
+ 0x08070240, // gPauseSelectItem01Tex
+ 0x08079840, // gPauseSelectItem02Tex
+ 0x08082E40, // gPauseSelectItem03Tex
+ 0x0808C440, // gPauseSelectItem04Tex
+ // Column 1
+ gPauseSelectItem10ENGTex,
+ 0x08070C40, // gPauseSelectItem11Tex
+ 0x0807A240, // gPauseSelectItem12Tex
+ 0x08083840, // gPauseSelectItem13Tex
+ 0x0808CE40, // gPauseSelectItem14Tex
+ // Column 2
+ gPauseSelectItem20ENGTex,
+ 0x08071640, // gPauseSelectItem21Tex
+ 0x0807AC40, // gPauseSelectItem22Tex
+ 0x08084240, // gPauseSelectItem23Tex
+ 0x0808D840, // gPauseSelectItem24Tex
};
-void* D_8082B778[] = {
- 0x08068040, 0x08072040, 0x0807B640, 0x08084C40, 0x0808E240, 0x0D006200, 0x08072A40, 0x0807C040,
- 0x08085640, 0x0808EC40, 0x08069440, 0x08073440, 0x0807CA40, 0x08086040, 0x0808F640,
+TexturePtr sMapPageBgTextures[] = {
+ // Column 0
+ 0x08068040, // gPauseMap00Tex
+ 0x08072040, // gPauseMap01Tex
+ 0x0807B640, // gPauseMap02Tex
+ 0x08084C40, // gPauseMap03Tex
+ 0x0808E240, // gPauseMap04Tex
+ // Column 1
+ gPauseMap10ENGTex,
+ 0x08072A40, // gPauseMap11Tex
+ 0x0807C040, // gPauseMap12Tex
+ 0x08085640, // gPauseMap13Tex
+ 0x0808EC40, // gPauseMap14Tex
+ // Column 2
+ 0x08069440, // gPauseMap20Tex
+ 0x08073440, // gPauseMap21Tex
+ 0x0807CA40, // gPauseMap22Tex
+ 0x08086040, // gPauseMap23Tex
+ 0x0808F640, // gPauseMap24Tex
};
-void* D_8082B7B4[] = {
- 0x0D006C00, 0x08073E40, 0x0807D440, 0x08086A40, 0x08090040, 0x0D007600, 0x08074840, 0x0807DE40,
- 0x08087440, 0x08090A40, 0x0D008000, 0x08075240, 0x0807E840, 0x08087E40, 0x08091440,
+TexturePtr sQuestPageBgTextures[] = {
+ // Column 0
+ gPauseQuestStatus00ENGTex,
+ 0x08073E40, // gPauseQuestStatus01Tex
+ 0x0807D440, // gPauseQuestStatus02Tex
+ 0x08086A40, // gPauseQuestStatus03Tex
+ 0x08090040, // gPauseQuestStatus04Tex
+ // Column 1
+ gPauseQuestStatus10ENGTex,
+ 0x08074840, // gPauseQuestStatus11Tex
+ 0x0807DE40, // gPauseQuestStatus12Tex
+ 0x08087440, // gPauseQuestStatus13Tex
+ 0x08090A40, // gPauseQuestStatus14Tex
+ // Column 2
+ gPauseQuestStatus20ENGTex,
+ 0x08075240, // gPauseQuestStatus21Tex
+ 0x0807E840, // gPauseQuestStatus22Tex
+ 0x08087E40, // gPauseQuestStatus23Tex
+ 0x08091440, // gPauseQuestStatus24Tex
};
-s16 D_8082B7F0[] = {
- 0x0050, 0x0040, 0x0040, 0x0040, 0x0010, 0x0040, 0x0070, 0x0070, 0x0030, 0x0040, 0x0040, 0x0040,
- 0x0040, 0x0030, 0x0040, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,
- 0x0008, 0x0008, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018,
+s16 gVtxPageMapWorldQuadsWidth[VTX_PAGE_MAP_WORLD_QUADS] = {
+ 80, // mapPageVtx[60] clouds Clock Town 1
+ 64, // mapPageVtx[64] clouds Clock Town 2
+ 64, // mapPageVtx[68] clouds Woodfall 1
+ 64, // mapPageVtx[72] clouds Woodfall 2
+ 16, // mapPageVtx[76] clouds Woodfall 3
+ 64, // mapPageVtx[80] clouds Snowhead 1
+ 112, // mapPageVtx[84] clouds Snowhead 2
+ 112, // mapPageVtx[88] clouds Snowhead 3
+ 48, // mapPageVtx[92] clouds Romani Ranch
+ 64, // mapPageVtx[96] clouds Great Bay 1
+ 64, // mapPageVtx[100] clouds Great Bay 2
+ 64, // mapPageVtx[104] clouds Great Bay 3
+ 64, // mapPageVtx[108] clouds Great Bay 4
+ 48, // mapPageVtx[112] clouds Stone Tower 1
+ 64, // mapPageVtx[116] clouds Stone Tower 2
+ 8, // mapPageVtx[120] region Great Bay
+ 8, // mapPageVtx[124] region Zora Hall
+ 8, // mapPageVtx[128] region Romani Ranch
+ 8, // mapPageVtx[132] region Deku Palace
+ 8, // mapPageVtx[136] region Woodfall
+ 8, // mapPageVtx[140] region Clock Town
+ 8, // mapPageVtx[144] region Snowhead
+ 8, // mapPageVtx[148] region Ikana Graveyard
+ 8, // mapPageVtx[152] region Ikana Canyon
+ 8, // mapPageVtx[156] region Goron Village
+ 8, // mapPageVtx[160] region Stone Tower
+ 24, // mapPageVtx[164] owl warp Great Bay Coast
+ 24, // mapPageVtx[168] owl warp Zora Cape
+ 24, // mapPageVtx[172] owl warp Snowhead
+ 24, // mapPageVtx[176] owl warp Mountain Village
+ 24, // mapPageVtx[180] owl warp Clock Town
+ 24, // mapPageVtx[184] owl warp Milk Road
+ 24, // mapPageVtx[188] owl warp Woodfall
+ 24, // mapPageVtx[192] owl warp Southern Swamp
+ 24, // mapPageVtx[196] owl warp Ikana Canyon
+ 24, // mapPageVtx[200] owl warp Stone Tower
};
-s16 D_8082B838[] = {
- 0x0028, 0x001F, 0x0035, 0x0035, 0x0035, 0x0034, 0x0023, 0x0023, 0x0020, 0x0040, 0x0040, 0x0040,
- 0x0040, 0x0052, 0x003D, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,
- 0x0008, 0x0008, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C,
+s16 gVtxPageMapWorldQuadsHeight[VTX_PAGE_MAP_WORLD_QUADS] = {
+ 40, // mapPageVtx[60] clouds Clock Town 1
+ 31, // mapPageVtx[64] clouds Clock Town 2
+ 53, // mapPageVtx[68] clouds Woodfall 1
+ 53, // mapPageVtx[72] clouds Woodfall 2
+ 53, // mapPageVtx[76] clouds Woodfall 3
+ 52, // mapPageVtx[80] clouds Snowhead 1
+ 35, // mapPageVtx[84] clouds Snowhead 2
+ 35, // mapPageVtx[88] clouds Snowhead 3
+ 32, // mapPageVtx[92] clouds Romani Ranch
+ 64, // mapPageVtx[96] clouds Great Bay 1
+ 64, // mapPageVtx[100] clouds Great Bay 2
+ 64, // mapPageVtx[104] clouds Great Bay 3
+ 64, // mapPageVtx[108] clouds Great Bay 4
+ 82, // mapPageVtx[112] clouds Stone Tower 1
+ 61, // mapPageVtx[116] clouds Stone Tower 2
+ 8, // mapPageVtx[120] region Great Bay
+ 8, // mapPageVtx[124] region Zora Hall
+ 8, // mapPageVtx[128] region Romani Ranch
+ 8, // mapPageVtx[132] region Deku Palace
+ 8, // mapPageVtx[136] region Woodfall
+ 8, // mapPageVtx[140] region Clock Town
+ 8, // mapPageVtx[144] region Snowhead
+ 8, // mapPageVtx[148] region Ikana Graveyard
+ 8, // mapPageVtx[152] region Ikana Canyon
+ 8, // mapPageVtx[156] region Goron Village
+ 8, // mapPageVtx[160] region Stone Tower
+ 12, // mapPageVtx[164] owl warp Great Bay Coast
+ 12, // mapPageVtx[168] owl warp Zora Cape
+ 12, // mapPageVtx[172] owl warp Snowhead
+ 12, // mapPageVtx[176] owl warp Mountain Village
+ 12, // mapPageVtx[180] owl warp Clock Town
+ 12, // mapPageVtx[184] owl warp Milk Road
+ 12, // mapPageVtx[188] owl warp Woodfall
+ 12, // mapPageVtx[192] owl warp Southern Swamp
+ 12, // mapPageVtx[196] owl warp Ikana Canyon
+ 12, // mapPageVtx[200] owl warp Stone Tower
};
s16 sGameOverPrimR = 0;
@@ -115,136 +250,768 @@ u8 D_8082B924[] = {
// TODO: Also applies to owl warps
s16 sGameOverRectPosY = 66;
-s16 D_8082B948[][3] = {
- { 0x00FF, 0x00FF, 0x00FF }, { 0x00FF, 0x00FF, 0x00FF }, { 0x00FF, 0x00FF, 0x0000 },
- { 0x00FF, 0x00FF, 0x0000 }, { 0x0064, 0x0096, 0x00FF }, { 0x0064, 0x00FF, 0x00FF },
+void func_80821900(void* segment, u32 texIndex) {
+ CmpDma_LoadFile(SEGMENT_ROM_START(map_name_static), texIndex, segment, 0x400);
+}
+
+void func_8082192C(void* segment, u32 texIndex) {
+ CmpDma_LoadFile(SEGMENT_ROM_START(map_name_static), texIndex, segment, 0xA00);
+}
+
+void func_80821958(void* segment, u32 texIndex) {
+ CmpDma_LoadFile(SEGMENT_ROM_START(item_name_static), texIndex, segment, 0x400);
+}
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/KaleidoScope_MoveCursorToSpecialPos.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/func_80821A04.s")
+
+void KaleidoScope_DrawTexQuadRGBA32(GraphicsContext* gfxCtx, TexturePtr texture, u16 width, u16 height, u16 point) {
+ OPEN_DISPS(gfxCtx);
+
+ gDPLoadTextureBlock(POLY_OPA_DISP++, texture, G_IM_FMT_RGBA, G_IM_SIZ_32b, width, height, 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);
+ gSP1Quadrangle(POLY_OPA_DISP++, point, point + 2, point + 3, point + 1, 0);
+
+ CLOSE_DISPS(gfxCtx);
+}
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/func_80821CC4.s")
+
+void KaleidoScope_HandlePageToggles(PlayState* play, Input* input);
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/KaleidoScope_HandlePageToggles.s")
+
+// Draw 15 (PAGE_BG_QUADS) quads with IA8 80x32 textures
+Gfx* KaleidoScope_DrawPageSections(Gfx* gfx, Vtx* vertices, TexturePtr* textures) {
+ s32 i;
+ s32 j;
+
+ gSPVertex(gfx++, vertices, 8 * 4, 0);
+
+ i = 0;
+ j = 0;
+ // Draw first 8/15 background textures
+ while (j < 32) {
+ gDPPipeSync(gfx++);
+ gDPLoadTextureBlock(gfx++, textures[i], G_IM_FMT_IA, G_IM_SIZ_8b, 80, 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);
+ gSP1Quadrangle(gfx++, j, j + 2, j + 3, j + 1, 0);
+
+ j += 4;
+ i++;
+ }
+
+ gSPVertex(gfx++, vertices + (8 * 4), 7 * 4, 0);
+
+ j = 0;
+ // Draw last 7/15 background textures
+ while (j < 28) {
+ gDPPipeSync(gfx++);
+ gDPLoadTextureBlock(gfx++, textures[i], G_IM_FMT_IA, G_IM_SIZ_8b, 80, 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);
+ gSP1Quadrangle(gfx++, j, j + 2, j + 3, j + 1, 0);
+
+ j += 4;
+ i++;
+ }
+
+ return gfx;
+}
+
+s16 sCursorPrimColorTarget[][3] = {
+ { 255, 255, 255 }, { 255, 255, 255 }, { 255, 255, 0 }, { 255, 255, 0 }, { 100, 150, 255 }, { 100, 255, 255 },
};
-s16 D_8082B96C[][3] = {
- { 0x0000, 0x0000, 0x0000 }, { 0x00AA, 0x00AA, 0x00AA }, { 0x0000, 0x0000, 0x0000 },
- { 0x00FF, 0x00A0, 0x0000 }, { 0x0000, 0x0000, 0x0064 }, { 0x0000, 0x0096, 0x00FF },
+s16 sCursorEnvColorTarget[][3] = {
+ { 0, 0, 0 }, { 170, 170, 170 }, { 0, 0, 0 }, { 255, 160, 0 }, { 0, 0, 100 }, { 0, 150, 255 },
};
-s16 D_8082B990 = 10;
-s16 D_8082B994 = 0;
+void KaleidoScope_DrawPages(PlayState* play, GraphicsContext* gfxCtx) {
+ static s16 sCursorColorTimer = 10;
+ static s16 sCursorColorTargetIndex = 0;
+ PauseContext* pauseCtx = &play->pauseCtx;
+ s16 stepR;
+ s16 stepG;
+ s16 stepB;
-s32 D_8082B998[] = {
- 0x0D003300,
- 0x0D002700,
- 0x0D002B00,
- 0x0D002F00,
+ OPEN_DISPS(gfxCtx);
+
+ if (!IS_PAUSE_STATE_GAMEOVER) {
+ if (pauseCtx->state != PAUSE_STATE_SAVEPROMPT) {
+
+ stepR =
+ ABS_ALT(sCursorPrimR - sCursorPrimColorTarget[pauseCtx->cursorColorSet + sCursorColorTargetIndex][0]) /
+ sCursorColorTimer;
+ stepG =
+ ABS_ALT(sCursorPrimG - sCursorPrimColorTarget[pauseCtx->cursorColorSet + sCursorColorTargetIndex][1]) /
+ sCursorColorTimer;
+ stepB =
+ ABS_ALT(sCursorPrimB - sCursorPrimColorTarget[pauseCtx->cursorColorSet + sCursorColorTargetIndex][2]) /
+ sCursorColorTimer;
+
+ if (sCursorPrimR >= sCursorPrimColorTarget[pauseCtx->cursorColorSet + sCursorColorTargetIndex][0]) {
+ sCursorPrimR -= stepR;
+ } else {
+ sCursorPrimR += stepR;
+ }
+
+ if (sCursorPrimG >= sCursorPrimColorTarget[pauseCtx->cursorColorSet + sCursorColorTargetIndex][1]) {
+ sCursorPrimG -= stepG;
+ } else {
+ sCursorPrimG += stepG;
+ }
+
+ if (sCursorPrimB >= sCursorPrimColorTarget[pauseCtx->cursorColorSet + sCursorColorTargetIndex][2]) {
+ sCursorPrimB -= stepB;
+ } else {
+ sCursorPrimB += stepB;
+ }
+
+ stepR =
+ ABS_ALT(sCursorEnvR - sCursorEnvColorTarget[pauseCtx->cursorColorSet + sCursorColorTargetIndex][0]) /
+ sCursorColorTimer;
+ stepG =
+ ABS_ALT(sCursorEnvG - sCursorEnvColorTarget[pauseCtx->cursorColorSet + sCursorColorTargetIndex][1]) /
+ sCursorColorTimer;
+ stepB =
+ ABS_ALT(sCursorEnvB - sCursorEnvColorTarget[pauseCtx->cursorColorSet + sCursorColorTargetIndex][2]) /
+ sCursorColorTimer;
+
+ if (sCursorEnvR >= sCursorEnvColorTarget[pauseCtx->cursorColorSet + sCursorColorTargetIndex][0]) {
+ sCursorEnvR -= stepR;
+ } else {
+ sCursorEnvR += stepR;
+ }
+
+ if (sCursorEnvG >= sCursorEnvColorTarget[pauseCtx->cursorColorSet + sCursorColorTargetIndex][1]) {
+ sCursorEnvG -= stepG;
+ } else {
+ sCursorEnvG += stepG;
+ }
+
+ if (sCursorEnvB >= sCursorEnvColorTarget[pauseCtx->cursorColorSet + sCursorColorTargetIndex][2]) {
+ sCursorEnvB -= stepB;
+ } else {
+ sCursorEnvB += stepB;
+ }
+
+ sCursorColorTimer--;
+ if (sCursorColorTimer == 0) {
+ sCursorPrimR = sCursorPrimColorTarget[pauseCtx->cursorColorSet + sCursorColorTargetIndex][0];
+ sCursorPrimG = sCursorPrimColorTarget[pauseCtx->cursorColorSet + sCursorColorTargetIndex][1];
+ sCursorPrimB = sCursorPrimColorTarget[pauseCtx->cursorColorSet + sCursorColorTargetIndex][2];
+ sCursorEnvR = sCursorEnvColorTarget[pauseCtx->cursorColorSet + sCursorColorTargetIndex][0];
+ sCursorEnvG = sCursorEnvColorTarget[pauseCtx->cursorColorSet + sCursorColorTargetIndex][1];
+ sCursorEnvB = sCursorEnvColorTarget[pauseCtx->cursorColorSet + sCursorColorTargetIndex][2];
+ sCursorColorTargetIndex ^= 1;
+ sCursorColorTimer = 10;
+ }
+ }
+
+ if ((pauseCtx->pageIndex != PAUSE_ITEM) && (pauseCtx->pageIndex != PAUSE_QUEST)) {
+ gDPPipeSync(POLY_OPA_DISP++);
+
+ gDPSetCombineLERP(POLY_OPA_DISP++, TEXEL0, 0, PRIMITIVE, 0, TEXEL0, 0, SHADE, 0, TEXEL0, 0, PRIMITIVE, 0,
+ TEXEL0, 0, SHADE, 0);
+
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 180, 180, 120, 255);
+
+ Matrix_RotateYF(0.0f, MTXMODE_NEW);
+ Matrix_Translate(0.0f, sPauseMenuVerticalOffset / 100.0f, -93.0f, MTXMODE_APPLY);
+ Matrix_Scale(0.78f, 0.78f, 0.78f, MTXMODE_APPLY);
+ Matrix_RotateXFApply(-pauseCtx->itemPageRoll / 100.0f);
+
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+
+ POLY_OPA_DISP = KaleidoScope_DrawPageSections(POLY_OPA_DISP, pauseCtx->itemPageVtx, sItemPageBgTextures);
+
+ KaleidoScope_DrawItemSelect(play);
+ }
+
+ if ((pauseCtx->pageIndex != PAUSE_MAP) && (pauseCtx->pageIndex != PAUSE_MASK)) {
+ gDPPipeSync(POLY_OPA_DISP++);
+
+ gDPSetCombineLERP(POLY_OPA_DISP++, TEXEL0, 0, PRIMITIVE, 0, TEXEL0, 0, SHADE, 0, TEXEL0, 0, PRIMITIVE, 0,
+ TEXEL0, 0, SHADE, 0);
+
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 180, 180, 120, 255);
+
+ Matrix_RotateYF(-1.57f, MTXMODE_NEW);
+ Matrix_Translate(0.0f, sPauseMenuVerticalOffset / 100.0f, -93.0f, MTXMODE_APPLY);
+ Matrix_Scale(0.78f, 0.78f, 0.78f, MTXMODE_APPLY);
+ Matrix_RotateXFApply(-pauseCtx->mapPageRoll / 100.0f);
+
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+
+ POLY_OPA_DISP = KaleidoScope_DrawPageSections(POLY_OPA_DISP, pauseCtx->mapPageVtx, sMapPageBgTextures);
+
+ if (sInDungeonScene) {
+ KaleidoScope_DrawDungeonMap(play);
+ Gfx_SetupDL42_Opa(gfxCtx);
+ gDPSetCombineMode(POLY_OPA_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
+ func_801091F0(play);
+ } else {
+ KaleidoScope_DrawWorldMap(play);
+ }
+ }
+
+ if ((pauseCtx->pageIndex != PAUSE_QUEST) && (pauseCtx->pageIndex != PAUSE_ITEM)) {
+ gDPPipeSync(POLY_OPA_DISP++);
+
+ gDPSetTextureFilter(POLY_OPA_DISP++, G_TF_BILERP);
+
+ gDPSetCombineLERP(POLY_OPA_DISP++, TEXEL0, 0, PRIMITIVE, 0, TEXEL0, 0, SHADE, 0, TEXEL0, 0, PRIMITIVE, 0,
+ TEXEL0, 0, SHADE, 0);
+
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 180, 180, 120, 255);
+
+ Matrix_RotateYF(-3.14f, MTXMODE_NEW);
+ Matrix_Translate(0.0f, sPauseMenuVerticalOffset / 100.0f, -93.0f, MTXMODE_APPLY);
+ Matrix_Scale(0.78f, 0.78f, 0.78f, MTXMODE_APPLY);
+ Matrix_RotateXFApply(-pauseCtx->questPageRoll / 100.0f);
+
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+
+ POLY_OPA_DISP = KaleidoScope_DrawPageSections(POLY_OPA_DISP, pauseCtx->questPageVtx, sQuestPageBgTextures);
+
+ KaleidoScope_DrawQuestStatus(play);
+ }
+
+ if ((pauseCtx->pageIndex != PAUSE_MASK) && (pauseCtx->pageIndex != PAUSE_MAP)) {
+ gDPPipeSync(POLY_OPA_DISP++);
+
+ gDPSetTextureFilter(POLY_OPA_DISP++, G_TF_BILERP);
+
+ gDPSetCombineLERP(POLY_OPA_DISP++, TEXEL0, 0, PRIMITIVE, 0, TEXEL0, 0, SHADE, 0, TEXEL0, 0, PRIMITIVE, 0,
+ TEXEL0, 0, SHADE, 0);
+
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 180, 180, 120, 255);
+
+ Matrix_RotateYF(1.57f, MTXMODE_NEW);
+ Matrix_Translate(0.0f, sPauseMenuVerticalOffset / 100.0f, -93.0f, MTXMODE_APPLY);
+ Matrix_Scale(0.78f, 0.78f, 0.78f, MTXMODE_APPLY);
+ Matrix_RotateXFApply(-pauseCtx->maskPageRoll / 100.0f);
+
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+
+ POLY_OPA_DISP = KaleidoScope_DrawPageSections(POLY_OPA_DISP, pauseCtx->maskPageVtx, sMaskPageBgTextures);
+
+ KaleidoScope_DrawMaskSelect(play);
+ }
+
+ switch (pauseCtx->pageIndex) {
+ case PAUSE_ITEM:
+ if (pauseCtx->mainState <= PAUSE_MAIN_STATE_EQUIP_MASK) {
+ gDPPipeSync(POLY_OPA_DISP++);
+
+ gDPSetCombineLERP(POLY_OPA_DISP++, TEXEL0, 0, PRIMITIVE, 0, TEXEL0, 0, SHADE, 0, TEXEL0, 0,
+ PRIMITIVE, 0, TEXEL0, 0, SHADE, 0);
+
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 180, 180, 120, 255);
+
+ Matrix_RotateYF(0.0f, MTXMODE_NEW);
+ Matrix_Translate(0.0f, sPauseMenuVerticalOffset / 100.0f, -93.0f, MTXMODE_APPLY);
+ Matrix_Scale(0.78f, 0.78f, 0.78f, MTXMODE_APPLY);
+ Matrix_RotateXFApply(-pauseCtx->itemPageRoll / 100.0f);
+
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+
+ POLY_OPA_DISP =
+ KaleidoScope_DrawPageSections(POLY_OPA_DISP, pauseCtx->itemPageVtx, sItemPageBgTextures);
+
+ KaleidoScope_DrawItemSelect(play);
+ }
+ break;
+
+ case PAUSE_MAP:
+ gDPPipeSync(POLY_OPA_DISP++);
+
+ gDPSetCombineLERP(POLY_OPA_DISP++, TEXEL0, 0, PRIMITIVE, 0, TEXEL0, 0, SHADE, 0, TEXEL0, 0, PRIMITIVE,
+ 0, TEXEL0, 0, SHADE, 0);
+
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 180, 180, 120, 255);
+
+ Matrix_RotateYF(-1.57f, MTXMODE_NEW);
+ Matrix_Translate(0.0f, sPauseMenuVerticalOffset / 100.0f, -93.0f, MTXMODE_APPLY);
+ Matrix_Scale(0.78f, 0.78f, 0.78f, MTXMODE_APPLY);
+ Matrix_RotateXFApply(-pauseCtx->mapPageRoll / 100.0f);
+
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+
+ POLY_OPA_DISP = KaleidoScope_DrawPageSections(POLY_OPA_DISP, pauseCtx->mapPageVtx, sMapPageBgTextures);
+
+ if (sInDungeonScene) {
+ KaleidoScope_DrawDungeonMap(play);
+ Gfx_SetupDL42_Opa(gfxCtx);
+
+ gDPSetCombineMode(POLY_OPA_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
+
+ func_801091F0(play);
+ } else {
+ Matrix_RotateYF(R_PAUSE_WORLD_MAP_YAW / 1000.0f, MTXMODE_NEW);
+
+ if ((pauseCtx->state == PAUSE_STATE_OPENING_3) || (pauseCtx->state == PAUSE_STATE_OWLWARP_3) ||
+ (pauseCtx->state >= PAUSE_STATE_OWLWARP_6) ||
+ ((pauseCtx->state == PAUSE_STATE_SAVEPROMPT) &&
+ ((pauseCtx->savePromptState == PAUSE_SAVEPROMPT_STATE_3) ||
+ (pauseCtx->savePromptState == PAUSE_SAVEPROMPT_STATE_7)))) {
+ Matrix_Translate(0.0f, (R_PAUSE_WORLD_MAP_Y_OFFSET - 8000) / 100.0f,
+ R_PAUSE_WORLD_MAP_DEPTH / 100.0f, MTXMODE_APPLY);
+ } else {
+ Matrix_Translate(0.0f, R_PAUSE_WORLD_MAP_Y_OFFSET / 100.0f, R_PAUSE_WORLD_MAP_DEPTH / 100.0f,
+ MTXMODE_APPLY);
+ }
+
+ Matrix_Scale(1.0f, 1.0f, 1.0f, MTXMODE_APPLY);
+ Matrix_RotateXFApply(-pauseCtx->mapPageRoll / 100.0f);
+
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+
+ KaleidoScope_DrawWorldMap(play);
+ }
+ break;
+
+ case PAUSE_QUEST:
+ gDPPipeSync(POLY_OPA_DISP++);
+
+ gDPSetCombineLERP(POLY_OPA_DISP++, TEXEL0, 0, PRIMITIVE, 0, TEXEL0, 0, SHADE, 0, TEXEL0, 0, PRIMITIVE,
+ 0, TEXEL0, 0, SHADE, 0);
+
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 180, 180, 120, 255);
+
+ gDPSetTextureFilter(POLY_OPA_DISP++, G_TF_BILERP);
+
+ Matrix_RotateYF(-3.14f, MTXMODE_NEW);
+ Matrix_Translate(0.0f, sPauseMenuVerticalOffset / 100.0f, -93.0f, MTXMODE_APPLY);
+ Matrix_Scale(0.78f, 0.78f, 0.78f, MTXMODE_APPLY);
+ Matrix_RotateXFApply(-pauseCtx->questPageRoll / 100.0f);
+
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+
+ POLY_OPA_DISP =
+ KaleidoScope_DrawPageSections(POLY_OPA_DISP, pauseCtx->questPageVtx, sQuestPageBgTextures);
+
+ KaleidoScope_DrawQuestStatus(play);
+ break;
+
+ case PAUSE_MASK:
+ gDPPipeSync(POLY_OPA_DISP++);
+
+ gDPSetCombineLERP(POLY_OPA_DISP++, TEXEL0, 0, PRIMITIVE, 0, TEXEL0, 0, SHADE, 0, TEXEL0, 0, PRIMITIVE,
+ 0, TEXEL0, 0, SHADE, 0);
+
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 180, 180, 120, 255);
+
+ Matrix_RotateYF(1.57f, MTXMODE_NEW);
+ Matrix_Translate(0.0f, sPauseMenuVerticalOffset / 100.0f, -93.0f, MTXMODE_APPLY);
+ Matrix_Scale(0.78f, 0.78f, 0.78f, MTXMODE_APPLY);
+ Matrix_RotateXFApply(-pauseCtx->maskPageRoll / 100.0f);
+
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+
+ POLY_OPA_DISP =
+ KaleidoScope_DrawPageSections(POLY_OPA_DISP, pauseCtx->maskPageVtx, sMaskPageBgTextures);
+
+ KaleidoScope_DrawMaskSelect(play);
+ break;
+ }
+ }
+
+ CLOSE_DISPS(gfxCtx);
+}
+
+TexturePtr D_8082B998[] = {
+ gPauseToMasksENGTex,
+ gPauseToSelectItemENGTex,
+ gPauseToMapENGTex,
+ gPauseToQuestStatusENGTex,
+};
+TexturePtr D_8082B9A8[] = {
+ gPauseToMapENGTex,
+ gPauseToQuestStatusENGTex,
+ gPauseToMasksENGTex,
+ gPauseToSelectItemENGTex,
};
-s32 D_8082B9A8[] = {
- 0x0D002B00,
- 0x0D002F00,
- 0x0D003300,
- 0x0D002700,
-};
-
-s16 D_8082B9B8[] = {
- 0x00B4, 0x00D2, 0x00FF, 0x00DC, 0x0064, 0x0064, 0x0096, 0x00DC,
+s16 D_8082B9B8[][4] = {
+ { 180, 210, 255, 220 },
+ { 100, 100, 150, 220 },
};
s16 D_8082B9C8 = 20;
+s16 D_8082B9CC = 0;
-s32 D_8082B9CC = 0;
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/func_80823350.s")
-s16 D_8082B9D0[] = {
- 0x00B4, 0x00D2, 0x00FF, 0x00DC, 0x0064, 0x0064, 0x0096, 0x00DC,
+void KaleidoScope_UpdateNamePanel(PlayState* play);
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/KaleidoScope_UpdateNamePanel.s")
+
+void KaleidoScope_DrawOwlWarpMapPage(PlayState* play) {
+ PauseContext* pauseCtx = &play->pauseCtx;
+
+ OPEN_DISPS(play->state.gfxCtx);
+
+ gDPPipeSync(POLY_OPA_DISP++);
+
+ gDPSetCombineLERP(POLY_OPA_DISP++, TEXEL0, 0, PRIMITIVE, 0, TEXEL0, 0, SHADE, 0, TEXEL0, 0, PRIMITIVE, 0, TEXEL0, 0,
+ SHADE, 0);
+
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 180, 180, 120, 255);
+
+ Matrix_RotateYF(-1.57f, MTXMODE_NEW);
+ Matrix_Translate(0.0f, sPauseMenuVerticalOffset / 100.0f, -93.0f, MTXMODE_APPLY);
+ Matrix_Scale(0.78f, 0.78f, 0.78f, MTXMODE_APPLY);
+ Matrix_RotateXFApply(-pauseCtx->mapPageRoll / 100.0f);
+
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+
+ POLY_OPA_DISP = KaleidoScope_DrawPageSections(POLY_OPA_DISP, pauseCtx->mapPageVtx, sMapPageBgTextures);
+
+ Matrix_RotateYF(R_PAUSE_WORLD_MAP_YAW / 1000.0f, MTXMODE_NEW);
+
+ if ((pauseCtx->state == PAUSE_STATE_OPENING_3) || (pauseCtx->state == PAUSE_STATE_OWLWARP_3) ||
+ (pauseCtx->state >= PAUSE_STATE_OWLWARP_6) ||
+ ((pauseCtx->state == PAUSE_STATE_SAVEPROMPT) && ((pauseCtx->savePromptState == PAUSE_SAVEPROMPT_STATE_3) ||
+ (pauseCtx->savePromptState == PAUSE_SAVEPROMPT_STATE_7)))) {
+ Matrix_Translate(0.0f, (R_PAUSE_WORLD_MAP_Y_OFFSET - 8000) / 100.0f, R_PAUSE_WORLD_MAP_DEPTH / 100.0f,
+ MTXMODE_APPLY);
+ } else {
+ Matrix_Translate(0.0f, R_PAUSE_WORLD_MAP_Y_OFFSET / 100.0f, R_PAUSE_WORLD_MAP_DEPTH / 100.0f, MTXMODE_APPLY);
+ }
+
+ Matrix_Scale(1.0f, 1.0f, 1.0f, MTXMODE_APPLY);
+ Matrix_RotateXFApply(-pauseCtx->mapPageRoll / 100.0f);
+
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+
+ KaleidoScope_DrawWorldMap(play);
+
+ CLOSE_DISPS(play->state.gfxCtx);
+}
+
+s16 D_8082B9D0[][4] = {
+ { 180, 210, 255, 220 },
+ { 100, 100, 150, 220 },
};
s16 D_8082B9E0 = 20;
+s16 D_8082B9E4 = 0;
-s32 D_8082B9E4 = 0;
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/func_80824B90.s")
-s32 D_8082B9E8 = 0;
+void KaleidoScope_UpdateOwlWarpNamePanel(PlayState* play);
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/KaleidoScope_UpdateOwlWarpNamePanel.s")
-s32 D_8082B9EC = 0;
+void KaleidoScope_UpdateSwitchPage(PlayState* play, Input* input);
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/KaleidoScope_UpdateSwitchPage.s")
-s16 D_8082B9F0[] = {
- 0xFFEB, 0xFF98, 0xFFB4, 0xFFD0, 0xFF98, 0xFFD8,
+void KaleidoScope_SetView(PauseContext* pauseCtx, f32 eyeX, f32 eyeY, f32 eyeZ) {
+ Vec3f eye;
+ Vec3f at;
+ Vec3f up;
+
+ eye.x = eyeX;
+ eye.y = eyeY;
+ eye.z = eyeZ;
+ at.x = at.y = at.z = 0.0f;
+ up.x = up.z = 0.0f;
+ up.y = 1.0f;
+
+ View_LookAt(&pauseCtx->view, &eye, &at, &up);
+ View_Apply(&pauseCtx->view,
+ VIEW_ALL | VIEW_FORCE_VIEWING | VIEW_FORCE_VIEWPORT | VIEW_FORCE_PROJECTION_PERSPECTIVE);
+}
+
+// CLAMP_MIN(*, 1) because C arrays can't have 0 length
+s16 sVtxPageMaskQuadsX[CLAMP_MIN(VTX_PAGE_MASK_QUADS, 1)] = { 0 };
+s16 sVtxPageItemQuadsX[CLAMP_MIN(VTX_PAGE_ITEM_QUADS, 1)] = { 0 };
+s16 sVtxPageMapDungeonQuadsX[VTX_PAGE_MAP_DUNGEON_QUADS] = {
+ -21, // mapPageVtx[60] QUAD_MAP_DUNGEON_TITLE
+ -104, // mapPageVtx[64] QUAD_MAP_DUNGEON_BOSS_KEY
+ -76, // mapPageVtx[68] QUAD_MAP_DUNGEON_COMPASS
+ -48, // mapPageVtx[72] QUAD_MAP_DUNGEON_MAP
+ -104, // mapPageVtx[76] QUAD_MAP_DUNGEON_STRAY_FAIRY_GLOWING_CIRCLE
+ -40 // mapPageVtx[80] QUAD_MAP_DUNGEON_UNUSED
+};
+s16 sVtxPageQuestQuadsX[CLAMP_MIN(VTX_PAGE_QUEST_QUADS, 1)] = { 0 };
+s16 sVtxPageMapWorldQuadsX[VTX_PAGE_MAP_WORLD_QUADS] = {
+ -41, // mapPageVtx[60] world map clouds Clock Town 1
+ 9, // mapPageVtx[64] world map clouds Clock Town 2
+ 43, // mapPageVtx[68] world map clouds Woodfall 1
+ -21, // mapPageVtx[72] world map clouds Woodfall 2
+ -37, // mapPageVtx[76] world map clouds Woodfall 3
+ 43, // mapPageVtx[80] world map clouds Snowhead 1
+ -69, // mapPageVtx[84] world map clouds Snowhead 2
+ -69, // mapPageVtx[88] world map clouds Snowhead 3
+ -32, // mapPageVtx[92] world map clouds Romani Ranch
+ -109, // mapPageVtx[96] world map clouds Great Bay 1
+ -45, // mapPageVtx[100] world map clouds Great Bay 2
+ -109, // mapPageVtx[104] world map clouds Great Bay 3
+ -45, // mapPageVtx[108] world map clouds Great Bay 4
+ 59, // mapPageVtx[112] world map clouds Stone Tower 1
+ -5, // mapPageVtx[116] world map clouds Stone Tower 2
+ -70, // mapPageVtx[120] world map region Great Bay
+ -52, // mapPageVtx[124] world map region Zora Hall
+ -11, // mapPageVtx[128] world map region Romani Ranch
+ -2, // mapPageVtx[132] world map region Deku Palace
+ 8, // mapPageVtx[136] world map region Woodfall
+ 2, // mapPageVtx[140] world map region Clock Town
+ 1, // mapPageVtx[144] world map region Snowhead
+ 43, // mapPageVtx[148] world map region Ikana Graveyard
+ 52, // mapPageVtx[152] world map region Ikana Canyon
+ 54, // mapPageVtx[156] world map region Goron Village
+ 62, // mapPageVtx[160] world map region Stone Tower
+ -80, // mapPageVtx[164] world map owl warp Great Bay Coast
+ -64, // mapPageVtx[168] world map owl warp Zora Cape
+ -9, // mapPageVtx[172] world map owl warp Snowhead
+ -3, // mapPageVtx[176] world map owl warp Mountain Village
+ -7, // mapPageVtx[180] world map owl warp Clock Town
+ -16, // mapPageVtx[184] world map owl warp Milk Road
+ -1, // mapPageVtx[188] world map owl warp Woodfall
+ 23, // mapPageVtx[192] world map owl warp Southern Swamp
+ 44, // mapPageVtx[196] world map owl warp Ikana Canyon
+ 54, // mapPageVtx[200] world map owl warp Stone Tower
+};
+s16 sVtxPageSaveQuadsX[VTX_PAGE_SAVE_QUADS] = {
+ -76, // promptPageVtx[60] QUAD_PROMPT_MESSAGE
+ -58, // promptPageVtx[64] QUAD_PROMPT_CURSOR_LEFT
+ 10, // promptPageVtx[68] QUAD_PROMPT_CURSOR_RIGHT
+ -58, // promptPageVtx[72] QUAD_PROMPT_CHOICE_YES
+ 10, // promptPageVtx[76] QUAD_PROMPT_CHOICE_NO
};
-s32 D_8082B9FC = 0;
-
-s16 D_8082BA00[] = {
- 0xFFD7, 0x0009, 0x002B, 0xFFEB, 0xFFDB, 0x002B, 0xFFBB, 0xFFBB, 0xFFE0, 0xFF93, 0xFFD3, 0xFF93,
- 0xFFD3, 0x003B, 0xFFFB, 0xFFBA, 0xFFCC, 0xFFF5, 0xFFFE, 0x0008, 0x0002, 0x0001, 0x002B, 0x0034,
- 0x0036, 0x003E, 0xFFB0, 0xFFC0, 0xFFF7, 0xFFFD, 0xFFF9, 0xFFF0, 0xFFFF, 0x0017, 0x002C, 0x0036,
+// CLAMP_MIN(*, 1) because C arrays can't have 0 length
+s16 sVtxPageMaskQuadsWidth[CLAMP_MIN(VTX_PAGE_MASK_QUADS, 1)] = { 0 };
+s16 sVtxPageItemQuadsWidth[CLAMP_MIN(VTX_PAGE_ITEM_QUADS, 1)] = { 0 };
+s16 sVtxPageMapDungeonQuadsWidth[VTX_PAGE_MAP_DUNGEON_QUADS] = {
+ 128, // mapPageVtx[60] QUAD_MAP_DUNGEON_TITLE
+ 24, // mapPageVtx[64] QUAD_MAP_DUNGEON_BOSS_KEY
+ 24, // mapPageVtx[68] QUAD_MAP_DUNGEON_COMPASS
+ 24, // mapPageVtx[72] QUAD_MAP_DUNGEON_MAP
+ 32, // mapPageVtx[76] QUAD_MAP_DUNGEON_STRAY_FAIRY_GLOWING_CIRCLE
+ 24, // mapPageVtx[80] QUAD_MAP_DUNGEON_UNUSED
+};
+s16 sVtxPageQuestQuadsWidth[CLAMP_MIN(VTX_PAGE_QUEST_QUADS, 1)] = { 0 };
+s16 sVtxPageSaveQuadsWidth[VTX_PAGE_SAVE_QUADS] = {
+ 152, // promptPageVtx[60] QUAD_PROMPT_MESSAGE
+ 48, // promptPageVtx[64] QUAD_PROMPT_CURSOR_LEFT
+ 48, // promptPageVtx[68] QUAD_PROMPT_CURSOR_RIGHT
+ 48, // promptPageVtx[72] QUAD_PROMPT_CHOICE_YES
+ 48, // promptPageVtx[76] QUAD_PROMPT_CHOICE_NO
};
-s16 D_8082BA48[] = {
- 0xFFB4, 0xFFC6, 0x000A, 0xFFC6, 0x000A, 0x0000,
+// CLAMP_MIN(*, 1) because C arrays can't have 0 length
+s16 sVtxPageMaskQuadsY[CLAMP_MIN(VTX_PAGE_MASK_QUADS, 1)] = { 0 };
+s16 sVtxPageItemQuadsY[CLAMP_MIN(VTX_PAGE_ITEM_QUADS, 1)] = { 0 };
+
+s16 sVtxPageMapDungeonQuadsY[VTX_PAGE_MAP_DUNGEON_QUADS] = {
+ 54, // mapPageVtx[60] QUAD_MAP_DUNGEON_TITLE
+ -42, // mapPageVtx[64] QUAD_MAP_DUNGEON_BOSS_KEY
+ -42, // mapPageVtx[68] QUAD_MAP_DUNGEON_COMPASS
+ -42, // mapPageVtx[72] QUAD_MAP_DUNGEON_MAP
+ -24, // mapPageVtx[76] QUAD_MAP_DUNGEON_STRAY_FAIRY_GLOWING_CIRCLE
+ 50, // mapPageVtx[80] QUAD_MAP_DUNGEON_UNUSED
+};
+s16 sVtxPageQuestQuadsY[CLAMP_MIN(VTX_PAGE_QUEST_QUADS, 1)] = { 0 };
+s16 sVtxPageMapWorldQuadsY[VTX_PAGE_MAP_WORLD_QUADS] = {
+ 11, // mapPageVtx[60] world map clouds Clock Town 1
+ 22, // mapPageVtx[64] world map clouds Clock Town 2
+ -16, // mapPageVtx[68] world map clouds Woodfall 1
+ -16, // mapPageVtx[72] world map clouds Woodfall 2
+ -16, // mapPageVtx[76] world map clouds Woodfall 3
+ 59, // mapPageVtx[80] world map clouds Snowhead 1
+ 24, // mapPageVtx[84] world map clouds Snowhead 2
+ 59, // mapPageVtx[88] world map clouds Snowhead 3
+ -11, // mapPageVtx[92] world map clouds Romani Ranch
+ -5, // mapPageVtx[96] world map clouds Great Bay 1
+ -5, // mapPageVtx[100] world map clouds Great Bay 2
+ 59, // mapPageVtx[104] world map clouds Great Bay 3
+ 59, // mapPageVtx[108] world map clouds Great Bay 4
+ 39, // mapPageVtx[112] world map clouds Stone Tower 1
+ 31, // mapPageVtx[116] world map clouds Stone Tower 2
+ -10, // mapPageVtx[120] world map region Great Bay
+ -36, // mapPageVtx[124] world map region Zora Hall
+ -19, // mapPageVtx[128] world map region Romani Ranch
+ -53, // mapPageVtx[132] world map region Deku Palace
+ -27, // mapPageVtx[136] world map region Woodfall
+ -2, // mapPageVtx[140] world map region Clock Town
+ 41, // mapPageVtx[144] world map region Snowhead
+ 11, // mapPageVtx[148] world map region Ikana Graveyard
+ -3, // mapPageVtx[152] world map region Ikana Canyon
+ 45, // mapPageVtx[156] world map region Goron Village
+ 18, // mapPageVtx[160] world map region Stone Tower
+ -8, // mapPageVtx[164] world map owl warp Great Bay Coast
+ -38, // mapPageVtx[168] world map owl warp Zora Cape
+ 39, // mapPageVtx[172] world map owl warp Snowhead
+ 26, // mapPageVtx[176] world map owl warp Mountain Village
+ 1, // mapPageVtx[180] world map owl warp Clock Town
+ -7, // mapPageVtx[184] world map owl warp Milk Road
+ -28, // mapPageVtx[188] world map owl warp Woodfall
+ -27, // mapPageVtx[192] world map owl warp Southern Swamp
+ -1, // mapPageVtx[196] world map owl warp Ikana Canyon
+ 24, // mapPageVtx[200] world map owl warp Stone Tower
+};
+s16 sVtxPageSaveQuadsY[VTX_PAGE_SAVE_QUADS] = {
+ 36, // promptPageVtx[60] QUAD_PROMPT_MESSAGE
+ 10, // promptPageVtx[64] QUAD_PROMPT_CURSOR_LEFT
+ 10, // promptPageVtx[68] QUAD_PROMPT_CURSOR_RIGHT
+ -6, // promptPageVtx[72] QUAD_PROMPT_CHOICE_YES
+ -6, // promptPageVtx[76] QUAD_PROMPT_CHOICE_NO
};
-s32 D_8082BA54 = 0;
-
-s32 D_8082BA58 = 0;
-
-s16 D_8082BA5C[] = {
- 0x0080, 0x0018, 0x0018, 0x0018, 0x0020, 0x0018,
+// CLAMP_MIN(*, 1) because C arrays can't have 0 length
+s16 sVtxPageMaskQuadsHeight[CLAMP_MIN(VTX_PAGE_MASK_QUADS, 1)] = { 0 };
+s16 sVtxPageItemQuadsHeight[CLAMP_MIN(VTX_PAGE_ITEM_QUADS, 1)] = { 0 };
+s16 sVtxPageMapDungeonQuadsHeight[] = {
+ 16, // mapPageVtx[60] QUAD_MAP_DUNGEON_TITLE
+ 24, // mapPageVtx[64] QUAD_MAP_DUNGEON_BOSS_KEY
+ 24, // mapPageVtx[68] QUAD_MAP_DUNGEON_COMPASS
+ 24, // mapPageVtx[72] QUAD_MAP_DUNGEON_MAP
+ 24, // mapPageVtx[76] QUAD_MAP_DUNGEON_STRAY_FAIRY_GLOWING_CIRCLE
+ 24, // mapPageVtx[80] QUAD_MAP_DUNGEON_UNUSED
+};
+s16 sVtxPageQuestQuadsHeight[CLAMP_MIN(VTX_PAGE_QUEST_QUADS, 1)] = { 0 };
+s16 sVtxPageSaveQuadsHeight[VTX_PAGE_SAVE_QUADS] = {
+ 16, // promptPageVtx[60] QUAD_PROMPT_MESSAGE
+ 48, // promptPageVtx[64] QUAD_PROMPT_CURSOR_LEFT
+ 48, // promptPageVtx[68] QUAD_PROMPT_CURSOR_RIGHT
+ 16, // promptPageVtx[72] QUAD_PROMPT_CHOICE_YES
+ 16, // promptPageVtx[76] QUAD_PROMPT_CHOICE_NO
};
-s32 D_8082BA68 = 0;
-
-s16 D_8082BA6C[] = {
- 0x0098, 0x0030, 0x0030, 0x0030, 0x0030, 0x0000,
+s16* sVtxPageQuadsX[VTX_PAGE_MAX] = {
+ sVtxPageMaskQuadsX, // VTX_PAGE_MASK
+ sVtxPageItemQuadsX, // VTX_PAGE_ITEM
+ sVtxPageMapDungeonQuadsX, // VTX_PAGE_MAP_DUNGEON
+ sVtxPageQuestQuadsX, // VTX_PAGE_QUEST
+ sVtxPageMapWorldQuadsX, // VTX_PAGE_MAP_WORLD
+ sVtxPageSaveQuadsX, // VTX_PAGE_PROMPT
};
-s32 D_8082BA78 = 0;
-
-s32 D_8082BA7C = 0;
-
-s16 D_8082BA80[] = {
- 0x0036, 0xFFD6, 0xFFD6, 0xFFD6, 0xFFE8, 0x0032,
+s16* sVtxPageQuadsWidth[VTX_PAGE_MAX] = {
+ sVtxPageMaskQuadsWidth, // VTX_PAGE_MASK
+ sVtxPageItemQuadsWidth, // VTX_PAGE_ITEM
+ sVtxPageMapDungeonQuadsWidth, // VTX_PAGE_MAP_DUNGEON
+ sVtxPageQuestQuadsWidth, // VTX_PAGE_QUEST
+ gVtxPageMapWorldQuadsWidth, // VTX_PAGE_MAP_WORLD
+ sVtxPageSaveQuadsWidth, // VTX_PAGE_PROMPT
};
-s32 D_8082BA8C = 0;
-
-s16 D_8082BA90[] = {
- 0x000B, 0x0016, 0xFFF0, 0xFFF0, 0xFFF0, 0x003B, 0x0018, 0x003B, 0xFFF5, 0xFFFB, 0xFFFB, 0x003B,
- 0x003B, 0x0027, 0x001F, 0xFFF6, 0xFFDC, 0xFFED, 0xFFCB, 0xFFE5, 0xFFFE, 0x0029, 0x000B, 0xFFFD,
- 0x002D, 0x0012, 0xFFF8, 0xFFDA, 0x0027, 0x001A, 0x0001, 0xFFF9, 0xFFE4, 0xFFE5, 0xFFFF, 0x0018,
+s16* sVtxPageQuadsY[VTX_PAGE_MAX] = {
+ sVtxPageMaskQuadsY, // VTX_PAGE_MASK
+ sVtxPageItemQuadsY, // VTX_PAGE_ITEM
+ sVtxPageMapDungeonQuadsY, // VTX_PAGE_MAP_DUNGEON
+ sVtxPageQuestQuadsY, // VTX_PAGE_QUEST
+ sVtxPageMapWorldQuadsY, // VTX_PAGE_MAP_WORLD
+ sVtxPageSaveQuadsY, // VTX_PAGE_PROMPT
};
-s16 D_8082BAD8[] = {
- 0x0024, 0x000A, 0x000A, 0xFFFA, 0xFFFA, 0x0000,
+s16* sVtxPageQuadsHeight[VTX_PAGE_MAX] = {
+ sVtxPageMaskQuadsHeight, // VTX_PAGE_MASK
+ sVtxPageItemQuadsHeight, // VTX_PAGE_ITEM
+ sVtxPageMapDungeonQuadsHeight, // VTX_PAGE_MAP_DUNGEON
+ sVtxPageQuestQuadsHeight, // VTX_PAGE_QUEST
+ gVtxPageMapWorldQuadsHeight, // VTX_PAGE_MAP_WORLD
+ sVtxPageSaveQuadsHeight, // VTX_PAGE_PROMPT
};
-s32 D_8082BAE4 = 0;
-
-s32 D_8082BAE8 = 0;
-
-s16 D_8082BAEC[] = {
- 0x0010, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018,
+s16 sVtxPageGameOverSaveQuadsY[VTX_PAGE_SAVE_QUADS] = {
+ 14, // promptPageVtx[60] QUAD_PROMPT_MESSAGE
+ -2, // promptPageVtx[64] QUAD_PROMPT_CURSOR_LEFT
+ -2, // promptPageVtx[68] QUAD_PROMPT_CURSOR_RIGHT
+ -18, // promptPageVtx[72] QUAD_PROMPT_CHOICE_YES
+ -18, // promptPageVtx[76] QUAD_PROMPT_CHOICE_NO
};
-s32 D_8082BAF8 = 0;
+s16 KaleidoScope_SetPageVertices(PlayState* play, Vtx* vtx, s16 vtxPage, s16 numQuads) {
+ PauseContext* pauseCtx = &play->pauseCtx;
+ GameOverContext* gameOverCtx = &play->gameOverCtx;
+ s16* quadsX;
+ s16* quadsWidth;
+ s16* quadsY;
+ s16* quadsHeight;
+ s16 pageBgQuadX;
+ s16 pageBgQuadY;
+ s16 i;
+ s16 j;
+ s16 k;
-s16 D_8082BAFC[] = {
- 0x0010, 0x0030, 0x0030, 0x0010, 0x0010, 0x0000,
-};
+ // Vertices for KaleidoScope_DrawPageSections
-void* D_8082BB08[] = {
- &D_8082B9E8, &D_8082B9EC, &D_8082B9F0, &D_8082B9FC, &D_8082BA00, &D_8082BA48,
-};
+ pageBgQuadX = 0 - (PAGE_BG_COLS * PAGE_BG_QUAD_WIDTH) / 2 - PAGE_BG_QUAD_WIDTH;
-void* D_8082BB20[] = {
- &D_8082BA54, &D_8082BA58, &D_8082BA5C, &D_8082BA68, &D_8082B7F0, &D_8082BA6C,
-};
+ // For each column
+ for (k = 0, i = 0; i < 3; i++) {
+ pageBgQuadX += PAGE_BG_QUAD_WIDTH;
-void* D_8082BB38[] = {
- &D_8082BA78, &D_8082BA7C, &D_8082BA80, &D_8082BA8C, &D_8082BA90, &D_8082BAD8,
-};
+ // For each row
+ for (pageBgQuadY = (PAGE_BG_ROWS * PAGE_BG_QUAD_HEIGHT) / 2, j = 0; j < 5; j++, k += 4, pageBgQuadY -= 32) {
+ vtx[k + 0].v.ob[0] = vtx[k + 2].v.ob[0] = pageBgQuadX;
+ vtx[k + 1].v.ob[0] = vtx[k + 3].v.ob[0] = vtx[k + 0].v.ob[0] + PAGE_BG_QUAD_WIDTH;
-void* D_8082BB50[] = {
- &D_8082BAE4, &D_8082BAE8, &D_8082BAEC, &D_8082BAF8, &D_8082B838, &D_8082BAFC,
-};
+ vtx[k + 0].v.ob[1] = vtx[k + 1].v.ob[1] = pageBgQuadY + pauseCtx->offsetY;
+ vtx[k + 2].v.ob[1] = vtx[k + 3].v.ob[1] = vtx[k + 0].v.ob[1] - PAGE_BG_QUAD_HEIGHT;
-s16 D_8082BB68[] = {
- 0x000E, 0xFFFE, 0xFFFE, 0xFFEE, 0xFFEE, 0x0000,
-};
+ vtx[k + 0].v.ob[2] = vtx[k + 1].v.ob[2] = vtx[k + 2].v.ob[2] = vtx[k + 3].v.ob[2] = 0;
+
+ vtx[k + 0].v.flag = vtx[k + 1].v.flag = vtx[k + 2].v.flag = vtx[k + 3].v.flag = 0;
+
+ vtx[k + 0].v.tc[0] = vtx[k + 0].v.tc[1] = 0;
+ vtx[k + 1].v.tc[1] = vtx[k + 2].v.tc[0] = 0;
+ vtx[k + 1].v.tc[0] = vtx[k + 3].v.tc[0] = PAGE_BG_QUAD_TEX_WIDTH * (1 << 5);
+ vtx[k + 2].v.tc[1] = vtx[k + 3].v.tc[1] = PAGE_BG_QUAD_TEX_HEIGHT * (1 << 5);
+
+ vtx[k + 0].v.cn[0] = vtx[k + 2].v.cn[0] = vtx[k + 0].v.cn[1] = vtx[k + 2].v.cn[1] = vtx[k + 0].v.cn[2] =
+ vtx[k + 2].v.cn[2] = 0;
+
+ vtx[k + 1].v.cn[0] = vtx[k + 3].v.cn[0] = vtx[k + 1].v.cn[1] = vtx[k + 3].v.cn[1] = vtx[k + 1].v.cn[2] =
+ vtx[k + 3].v.cn[2] = 0;
+
+ vtx[k + 0].v.cn[3] = vtx[k + 2].v.cn[3] = vtx[k + 1].v.cn[3] = vtx[k + 3].v.cn[3] = pauseCtx->alpha;
+ }
+ }
+
+ if (numQuads != 0) {
+ quadsX = sVtxPageQuadsX[vtxPage];
+ quadsWidth = sVtxPageQuadsWidth[vtxPage];
+ quadsY = sVtxPageQuadsY[vtxPage];
+ quadsHeight = sVtxPageQuadsHeight[vtxPage];
+
+ for (i = 0; i < numQuads; i++, k += 4) {
+ vtx[k + 2].v.ob[0] = vtx[k + 0].v.ob[0] = quadsX[i];
+
+ vtx[k + 1].v.ob[0] = vtx[k + 3].v.ob[0] = vtx[k + 0].v.ob[0] + quadsWidth[i];
+
+ if (!IS_PAUSE_STATE_GAMEOVER) {
+ vtx[k + 0].v.ob[1] = vtx[k + 1].v.ob[1] = quadsY[i] + pauseCtx->offsetY;
+ } else if (gameOverCtx->state == GAMEOVER_INACTIVE) {
+ vtx[k + 0].v.ob[1] = vtx[k + 1].v.ob[1] = quadsY[i] + pauseCtx->offsetY;
+ } else {
+ vtx[k + 0].v.ob[1] = vtx[k + 1].v.ob[1] = sVtxPageGameOverSaveQuadsY[i] + pauseCtx->offsetY;
+ }
+
+ vtx[k + 2].v.ob[1] = vtx[k + 3].v.ob[1] = vtx[k + 0].v.ob[1] - quadsHeight[i];
+
+ vtx[k + 0].v.ob[2] = vtx[k + 1].v.ob[2] = vtx[k + 2].v.ob[2] = vtx[k + 3].v.ob[2] = 0;
+
+ vtx[k + 0].v.flag = vtx[k + 1].v.flag = vtx[k + 2].v.flag = vtx[k + 3].v.flag = 0;
+
+ vtx[k + 0].v.tc[0] = vtx[k + 0].v.tc[1] = vtx[k + 1].v.tc[1] = vtx[k + 2].v.tc[0] = 0;
+ vtx[k + 1].v.tc[0] = vtx[k + 3].v.tc[0] = quadsWidth[i] << 5;
+ vtx[k + 2].v.tc[1] = vtx[k + 3].v.tc[1] = quadsHeight[i] << 5;
+
+ vtx[k + 0].v.cn[0] = vtx[k + 2].v.cn[0] = vtx[k + 0].v.cn[1] = vtx[k + 2].v.cn[1] = vtx[k + 0].v.cn[2] =
+ vtx[k + 2].v.cn[2] = 255;
+
+ vtx[k + 1].v.cn[0] = vtx[k + 3].v.cn[0] = vtx[k + 1].v.cn[1] = vtx[k + 3].v.cn[1] = vtx[k + 1].v.cn[2] =
+ vtx[k + 3].v.cn[2] = 255;
+
+ vtx[k + 0].v.cn[3] = vtx[k + 2].v.cn[3] = vtx[k + 1].v.cn[3] = vtx[k + 3].v.cn[3] = pauseCtx->alpha;
+ }
+ }
+ return k;
+}
s16 sQuestVtxRectLeft[] = {
45, // QUEST_REMAINS_ODOLWA
@@ -413,6 +1180,373 @@ s16 sQuestVtxHeights[] = {
16, // ocarina input button index 6
16, // ocarina input button index 7
};
+
+void KaleidoScope_SetVertices(PlayState* play, GraphicsContext* gfxCtx) {
+ PauseContext* pauseCtx = &play->pauseCtx;
+ s16 i;
+ s16 j;
+ s16 k;
+ s16 vtx_x;
+ s16 vtx_y;
+
+ pauseCtx->offsetY = 0;
+
+ if ((pauseCtx->state == PAUSE_STATE_OPENING_3) || (pauseCtx->state == PAUSE_STATE_OWLWARP_3) ||
+ (pauseCtx->state >= PAUSE_STATE_OWLWARP_6) ||
+ ((pauseCtx->state == PAUSE_STATE_SAVEPROMPT) && ((pauseCtx->savePromptState == PAUSE_SAVEPROMPT_STATE_3) ||
+ (pauseCtx->savePromptState == PAUSE_SAVEPROMPT_STATE_7)))) {
+ pauseCtx->offsetY = 80;
+ }
+
+ if (pauseCtx->pageIndex != PAUSE_QUEST) {
+ pauseCtx->itemPageVtx = GRAPH_ALLOC(gfxCtx, ((PAGE_BG_QUADS + VTX_PAGE_ITEM_QUADS) * 4) * sizeof(Vtx));
+ KaleidoScope_SetPageVertices(play, pauseCtx->itemPageVtx, VTX_PAGE_ITEM, VTX_PAGE_ITEM_QUADS);
+
+ pauseCtx->itemVtx = GRAPH_ALLOC(gfxCtx, (QUAD_ITEM_MAX * 4) * sizeof(Vtx));
+
+ // QUAD_ITEM_GRID_FIRST..QUAD_ITEM_GRID_LAST
+
+ // Loop over grid rows
+ for (k = 0, i = 0, vtx_y = (ITEM_GRID_ROWS * ITEM_GRID_CELL_HEIGHT) / 2 - 6; k < ITEM_GRID_ROWS;
+ k++, vtx_y -= ITEM_GRID_CELL_HEIGHT) {
+ // Loop over grid columns
+ for (vtx_x = 0 - (ITEM_GRID_COLS * ITEM_GRID_CELL_WIDTH) / 2, j = 0; j < ITEM_GRID_COLS;
+ j++, i += 4, vtx_x += ITEM_GRID_CELL_WIDTH) {
+ pauseCtx->itemVtx[i + 0].v.ob[0] = pauseCtx->itemVtx[i + 2].v.ob[0] = vtx_x + ITEM_GRID_QUAD_MARGIN;
+ pauseCtx->itemVtx[i + 1].v.ob[0] = pauseCtx->itemVtx[i + 3].v.ob[0] =
+ pauseCtx->itemVtx[i + 0].v.ob[0] + ITEM_GRID_QUAD_WIDTH;
+
+ pauseCtx->itemVtx[i + 0].v.ob[1] = pauseCtx->itemVtx[i + 1].v.ob[1] =
+ vtx_y + pauseCtx->offsetY - ITEM_GRID_QUAD_MARGIN;
+ pauseCtx->itemVtx[i + 2].v.ob[1] = pauseCtx->itemVtx[i + 3].v.ob[1] =
+ pauseCtx->itemVtx[i + 0].v.ob[1] - ITEM_GRID_QUAD_WIDTH;
+
+ pauseCtx->itemVtx[i + 0].v.ob[2] = pauseCtx->itemVtx[i + 1].v.ob[2] = pauseCtx->itemVtx[i + 2].v.ob[2] =
+ pauseCtx->itemVtx[i + 3].v.ob[2] = 0;
+
+ pauseCtx->itemVtx[i + 0].v.flag = pauseCtx->itemVtx[i + 1].v.flag = pauseCtx->itemVtx[i + 2].v.flag =
+ pauseCtx->itemVtx[i + 3].v.flag = 0;
+
+ pauseCtx->itemVtx[i + 0].v.tc[0] = pauseCtx->itemVtx[i + 0].v.tc[1] = pauseCtx->itemVtx[i + 1].v.tc[1] =
+ pauseCtx->itemVtx[i + 2].v.tc[0] = 0;
+
+ pauseCtx->itemVtx[i + 1].v.tc[0] = pauseCtx->itemVtx[i + 2].v.tc[1] = pauseCtx->itemVtx[i + 3].v.tc[0] =
+ pauseCtx->itemVtx[i + 3].v.tc[1] = ITEM_GRID_QUAD_TEX_SIZE * (1 << 5);
+
+ pauseCtx->itemVtx[i + 0].v.cn[0] = pauseCtx->itemVtx[i + 1].v.cn[0] = pauseCtx->itemVtx[i + 2].v.cn[0] =
+ pauseCtx->itemVtx[i + 3].v.cn[0] = pauseCtx->itemVtx[i + 0].v.cn[1] =
+ pauseCtx->itemVtx[i + 1].v.cn[1] = pauseCtx->itemVtx[i + 2].v.cn[1] =
+ pauseCtx->itemVtx[i + 3].v.cn[1] = pauseCtx->itemVtx[i + 0].v.cn[2] =
+ pauseCtx->itemVtx[i + 1].v.cn[2] = pauseCtx->itemVtx[i + 2].v.cn[2] =
+ pauseCtx->itemVtx[i + 3].v.cn[2] = 255;
+
+ pauseCtx->itemVtx[i + 0].v.cn[3] = pauseCtx->itemVtx[i + 1].v.cn[3] = pauseCtx->itemVtx[i + 2].v.cn[3] =
+ pauseCtx->itemVtx[i + 3].v.cn[3] = 255;
+ }
+ }
+
+ // QUAD_ITEM_GRID_SELECTED_C_LEFT, QUAD_ITEM_GRID_SELECTED_C_DOWN, QUAD_ITEM_GRID_SELECTED_C_RIGHT
+
+ for (j = EQUIP_SLOT_C_LEFT; j <= EQUIP_SLOT_C_RIGHT; j++, i += 4) {
+ if (GET_CUR_FORM_BTN_SLOT(j) != ITEM_NONE) {
+ k = GET_CUR_FORM_BTN_SLOT(j) * 4;
+
+ pauseCtx->itemVtx[i + 0].v.ob[0] = pauseCtx->itemVtx[i + 2].v.ob[0] =
+ pauseCtx->itemVtx[k].v.ob[0] + ITEM_GRID_SELECTED_QUAD_MARGIN;
+
+ pauseCtx->itemVtx[i + 1].v.ob[0] = pauseCtx->itemVtx[i + 3].v.ob[0] =
+ pauseCtx->itemVtx[i + 0].v.ob[0] + ITEM_GRID_SELECTED_QUAD_WIDTH;
+
+ pauseCtx->itemVtx[i + 0].v.ob[1] = pauseCtx->itemVtx[i + 1].v.ob[1] =
+ pauseCtx->itemVtx[k].v.ob[1] - ITEM_GRID_SELECTED_QUAD_MARGIN;
+
+ pauseCtx->itemVtx[i + 2].v.ob[1] = pauseCtx->itemVtx[i + 3].v.ob[1] =
+ pauseCtx->itemVtx[i + 0].v.ob[1] - ITEM_GRID_SELECTED_QUAD_WIDTH;
+
+ pauseCtx->itemVtx[i + 0].v.ob[2] = pauseCtx->itemVtx[i + 1].v.ob[2] = pauseCtx->itemVtx[i + 2].v.ob[2] =
+ pauseCtx->itemVtx[i + 3].v.ob[2] = 0;
+
+ pauseCtx->itemVtx[i + 0].v.flag = pauseCtx->itemVtx[i + 1].v.flag = pauseCtx->itemVtx[i + 2].v.flag =
+ pauseCtx->itemVtx[i + 3].v.flag = 0;
+
+ pauseCtx->itemVtx[i + 0].v.tc[0] = pauseCtx->itemVtx[i + 0].v.tc[1] = pauseCtx->itemVtx[i + 1].v.tc[1] =
+ pauseCtx->itemVtx[i + 2].v.tc[0] = 0;
+
+ pauseCtx->itemVtx[i + 1].v.tc[0] = pauseCtx->itemVtx[i + 2].v.tc[1] = pauseCtx->itemVtx[i + 3].v.tc[0] =
+ pauseCtx->itemVtx[i + 3].v.tc[1] = ITEM_GRID_SELECTED_QUAD_TEX_SIZE * (1 << 5);
+
+ pauseCtx->itemVtx[i + 0].v.cn[0] = pauseCtx->itemVtx[i + 1].v.cn[0] = pauseCtx->itemVtx[i + 2].v.cn[0] =
+ pauseCtx->itemVtx[i + 3].v.cn[0] = pauseCtx->itemVtx[i + 0].v.cn[1] =
+ pauseCtx->itemVtx[i + 1].v.cn[1] = pauseCtx->itemVtx[i + 2].v.cn[1] =
+ pauseCtx->itemVtx[i + 3].v.cn[1] = pauseCtx->itemVtx[i + 0].v.cn[2] =
+ pauseCtx->itemVtx[i + 1].v.cn[2] = pauseCtx->itemVtx[i + 2].v.cn[2] =
+ pauseCtx->itemVtx[i + 3].v.cn[2] = 255;
+
+ pauseCtx->itemVtx[i + 0].v.cn[3] = pauseCtx->itemVtx[i + 1].v.cn[3] = pauseCtx->itemVtx[i + 2].v.cn[3] =
+ pauseCtx->itemVtx[i + 3].v.cn[3] = pauseCtx->alpha;
+ } else {
+ // No item equipped on the C button, put the quad out of view
+
+ pauseCtx->itemVtx[i + 2].v.ob[0] = -300;
+ pauseCtx->itemVtx[i + 0].v.ob[0] = pauseCtx->itemVtx[i + 2].v.ob[0];
+
+ pauseCtx->itemVtx[i + 1].v.ob[0] = pauseCtx->itemVtx[i + 3].v.ob[0] =
+ pauseCtx->itemVtx[i + 0].v.ob[0] + ITEM_GRID_SELECTED_QUAD_WIDTH;
+
+ pauseCtx->itemVtx[i + 0].v.ob[1] = pauseCtx->itemVtx[i + 1].v.ob[1] = 300;
+ pauseCtx->itemVtx[i + 2].v.ob[1] = pauseCtx->itemVtx[i + 3].v.ob[1] =
+ pauseCtx->itemVtx[i + 0].v.ob[1] - ITEM_GRID_SELECTED_QUAD_HEIGHT;
+ }
+ }
+ }
+
+ if (pauseCtx->pageIndex != PAUSE_MASK) {
+ if (!sInDungeonScene) {
+ pauseCtx->mapPageVtx = GRAPH_ALLOC(
+ gfxCtx, ((PAGE_BG_QUADS + VTX_PAGE_MAP_WORLD_QUADS + WORLD_MAP_IMAGE_FRAG_NUM) * 4) * sizeof(Vtx));
+ j = KaleidoScope_SetPageVertices(play, pauseCtx->mapPageVtx, VTX_PAGE_MAP_WORLD, VTX_PAGE_MAP_WORLD_QUADS);
+
+ for (i = 0, vtx_y = 59; i < WORLD_MAP_IMAGE_FRAG_NUM; i++, j += 4, vtx_y -= WORLD_MAP_IMAGE_FRAG_HEIGHT) {
+ pauseCtx->mapPageVtx[j + 2].v.ob[0] = 0 - (WORLD_MAP_IMAGE_WIDTH / 2) - 1;
+ pauseCtx->mapPageVtx[j + 0].v.ob[0] = pauseCtx->mapPageVtx[j + 2].v.ob[0];
+
+ pauseCtx->mapPageVtx[j + 1].v.ob[0] = pauseCtx->mapPageVtx[j + 3].v.ob[0] =
+ pauseCtx->mapPageVtx[j + 0].v.ob[0] + WORLD_MAP_IMAGE_WIDTH;
+
+ pauseCtx->mapPageVtx[j + 0].v.ob[1] = pauseCtx->mapPageVtx[j + 1].v.ob[1] = vtx_y + pauseCtx->offsetY;
+
+ pauseCtx->mapPageVtx[j + 2].v.ob[1] = pauseCtx->mapPageVtx[j + 3].v.ob[1] =
+ pauseCtx->mapPageVtx[j + 0].v.ob[1] - WORLD_MAP_IMAGE_FRAG_HEIGHT;
+
+ pauseCtx->mapPageVtx[j + 0].v.ob[2] = pauseCtx->mapPageVtx[j + 1].v.ob[2] =
+ pauseCtx->mapPageVtx[j + 2].v.ob[2] = pauseCtx->mapPageVtx[j + 3].v.ob[2] = 0;
+
+ pauseCtx->mapPageVtx[j + 0].v.flag = pauseCtx->mapPageVtx[j + 1].v.flag =
+ pauseCtx->mapPageVtx[j + 2].v.flag = pauseCtx->mapPageVtx[j + 3].v.flag = 0;
+
+ pauseCtx->mapPageVtx[j + 0].v.tc[0] = pauseCtx->mapPageVtx[j + 0].v.tc[1] =
+ pauseCtx->mapPageVtx[j + 1].v.tc[1] = pauseCtx->mapPageVtx[j + 2].v.tc[0] = 0;
+
+ pauseCtx->mapPageVtx[j + 1].v.tc[0] = pauseCtx->mapPageVtx[j + 3].v.tc[0] =
+ WORLD_MAP_IMAGE_WIDTH * (1 << 5);
+ pauseCtx->mapPageVtx[j + 2].v.tc[1] = pauseCtx->mapPageVtx[j + 3].v.tc[1] =
+ WORLD_MAP_IMAGE_FRAG_HEIGHT * (1 << 5);
+
+ pauseCtx->mapPageVtx[j + 0].v.cn[0] = pauseCtx->mapPageVtx[j + 2].v.cn[0] =
+ pauseCtx->mapPageVtx[j + 0].v.cn[1] = pauseCtx->mapPageVtx[j + 2].v.cn[1] =
+ pauseCtx->mapPageVtx[j + 0].v.cn[2] = pauseCtx->mapPageVtx[j + 2].v.cn[2] =
+ pauseCtx->mapPageVtx[j + 1].v.cn[0] = pauseCtx->mapPageVtx[j + 3].v.cn[0] =
+ pauseCtx->mapPageVtx[j + 1].v.cn[1] = pauseCtx->mapPageVtx[j + 3].v.cn[1] =
+ pauseCtx->mapPageVtx[j + 1].v.cn[2] = pauseCtx->mapPageVtx[j + 3].v.cn[2] =
+ pauseCtx->mapPageVtx[j + 0].v.cn[3] = pauseCtx->mapPageVtx[j + 2].v.cn[3] =
+ pauseCtx->mapPageVtx[j + 1].v.cn[3] = pauseCtx->mapPageVtx[j + 3].v.cn[3] =
+ pauseCtx->alpha;
+ }
+
+ pauseCtx->mapPageVtx[j - 2].v.ob[1] = pauseCtx->mapPageVtx[j - 1].v.ob[1] =
+ pauseCtx->mapPageVtx[j - 4].v.ob[1] - (WORLD_MAP_IMAGE_HEIGHT % WORLD_MAP_IMAGE_FRAG_HEIGHT);
+
+ pauseCtx->mapPageVtx[j - 2].v.tc[1] = pauseCtx->mapPageVtx[j - 1].v.tc[1] =
+ (WORLD_MAP_IMAGE_HEIGHT % WORLD_MAP_IMAGE_FRAG_HEIGHT) * (1 << 5);
+
+ } else {
+ pauseCtx->mapPageVtx =
+ GRAPH_ALLOC(gfxCtx, ((PAGE_BG_QUADS + VTX_PAGE_MAP_DUNGEON_QUADS) * 4) * sizeof(Vtx));
+ KaleidoScope_SetPageVertices(play, pauseCtx->mapPageVtx, VTX_PAGE_MAP_DUNGEON, VTX_PAGE_MAP_DUNGEON_QUADS);
+ }
+ }
+
+ if (pauseCtx->pageIndex != PAUSE_ITEM) {
+ pauseCtx->questPageVtx = GRAPH_ALLOC(gfxCtx, ((PAGE_BG_QUADS + VTX_PAGE_QUEST_QUADS) * 4) * sizeof(Vtx));
+ KaleidoScope_SetPageVertices(play, pauseCtx->questPageVtx, VTX_PAGE_QUEST, VTX_PAGE_QUEST_QUADS);
+
+ pauseCtx->questVtx = GRAPH_ALLOC(gfxCtx, (39 * 4) * sizeof(Vtx));
+
+ for (k = 0, j = 0; j < 39; j++, k += 4) {
+ if (j <= QUEST_SWORD) {
+ pauseCtx->questVtx[k + 0].v.ob[0] = pauseCtx->questVtx[k + 2].v.ob[0] = sQuestVtxRectLeft[j];
+
+ pauseCtx->questVtx[k + 1].v.ob[0] = pauseCtx->questVtx[k + 3].v.ob[0] =
+ pauseCtx->questVtx[k + 0].v.ob[0] + sQuestVtxWidths[j];
+
+ pauseCtx->questVtx[k + 0].v.ob[1] = pauseCtx->questVtx[k + 1].v.ob[1] =
+ sQuestVtxRectTop[j] + pauseCtx->offsetY;
+
+ pauseCtx->questVtx[k + 2].v.ob[1] = pauseCtx->questVtx[k + 3].v.ob[1] =
+ pauseCtx->questVtx[k + 0].v.ob[1] - sQuestVtxHeights[j];
+ } else {
+ pauseCtx->questVtx[k + 0].v.ob[0] = pauseCtx->questVtx[k + 2].v.ob[0] = sQuestVtxRectLeft[j] + 2;
+
+ pauseCtx->questVtx[k + 1].v.ob[0] = pauseCtx->questVtx[k + 3].v.ob[0] =
+ pauseCtx->questVtx[k + 0].v.ob[0] + sQuestVtxWidths[j] - 4;
+
+ pauseCtx->questVtx[k + 0].v.ob[1] = pauseCtx->questVtx[k + 1].v.ob[1] =
+ sQuestVtxRectTop[j] + pauseCtx->offsetY - 2;
+
+ pauseCtx->questVtx[k + 2].v.ob[1] = pauseCtx->questVtx[k + 3].v.ob[1] =
+ pauseCtx->questVtx[k + 0].v.ob[1] - sQuestVtxHeights[j] + 4;
+ }
+
+ pauseCtx->questVtx[k + 0].v.ob[2] = pauseCtx->questVtx[k + 1].v.ob[2] = pauseCtx->questVtx[k + 2].v.ob[2] =
+ pauseCtx->questVtx[k + 3].v.ob[2] = 0;
+
+ pauseCtx->questVtx[k + 0].v.flag = pauseCtx->questVtx[k + 1].v.flag = pauseCtx->questVtx[k + 2].v.flag =
+ pauseCtx->questVtx[k + 3].v.flag = 0;
+
+ pauseCtx->questVtx[k + 0].v.tc[0] = pauseCtx->questVtx[k + 0].v.tc[1] = pauseCtx->questVtx[k + 1].v.tc[1] =
+ pauseCtx->questVtx[k + 2].v.tc[0] = 0;
+
+ pauseCtx->questVtx[k + 1].v.tc[0] = pauseCtx->questVtx[k + 3].v.tc[0] = sQuestVtxWidths[j] << 5;
+ pauseCtx->questVtx[k + 2].v.tc[1] = pauseCtx->questVtx[k + 3].v.tc[1] = sQuestVtxHeights[j] << 5;
+
+ pauseCtx->questVtx[k + 0].v.cn[0] = pauseCtx->questVtx[k + 1].v.cn[0] = pauseCtx->questVtx[k + 2].v.cn[0] =
+ pauseCtx->questVtx[k + 3].v.cn[0] = pauseCtx->questVtx[k + 0].v.cn[1] =
+ pauseCtx->questVtx[k + 1].v.cn[1] = pauseCtx->questVtx[k + 2].v.cn[1] =
+ pauseCtx->questVtx[k + 3].v.cn[1] = pauseCtx->questVtx[k + 0].v.cn[2] =
+ pauseCtx->questVtx[k + 1].v.cn[2] = pauseCtx->questVtx[k + 2].v.cn[2] =
+ pauseCtx->questVtx[k + 3].v.cn[2] = 255;
+
+ pauseCtx->questVtx[k + 0].v.cn[3] = pauseCtx->questVtx[k + 1].v.cn[3] = pauseCtx->questVtx[k + 2].v.cn[3] =
+ pauseCtx->questVtx[k + 3].v.cn[3] = pauseCtx->alpha;
+ }
+ }
+
+ if (pauseCtx->pageIndex != PAUSE_MAP) {
+ pauseCtx->maskPageVtx = GRAPH_ALLOC(gfxCtx, ((PAGE_BG_QUADS + VTX_PAGE_MASK_QUADS) * 4) * sizeof(Vtx));
+ KaleidoScope_SetPageVertices(play, pauseCtx->maskPageVtx, VTX_PAGE_MASK, VTX_PAGE_MASK_QUADS);
+
+ pauseCtx->maskVtx = GRAPH_ALLOC(gfxCtx, (QUAD_MASK_MAX * 4) * sizeof(Vtx));
+
+ // Loop over grid rows
+ for (k = 0, i = 0, vtx_y = (MASK_GRID_ROWS * MASK_GRID_CELL_HEIGHT) / 2 - 6; k < MASK_GRID_ROWS;
+ k++, vtx_y -= MASK_GRID_CELL_HEIGHT) {
+ // Loop over grid columns
+ for (vtx_x = 0 - (MASK_GRID_COLS * MASK_GRID_CELL_WIDTH) / 2, j = 0; j < MASK_GRID_COLS;
+ j++, i += 4, vtx_x += MASK_GRID_CELL_WIDTH) {
+ pauseCtx->maskVtx[i + 0].v.ob[0] = pauseCtx->maskVtx[i + 2].v.ob[0] = vtx_x + MASK_GRID_QUAD_MARGIN;
+ pauseCtx->maskVtx[i + 1].v.ob[0] = pauseCtx->maskVtx[i + 3].v.ob[0] =
+ pauseCtx->maskVtx[i + 0].v.ob[0] + MASK_GRID_QUAD_WIDTH;
+
+ pauseCtx->maskVtx[i + 0].v.ob[1] = pauseCtx->maskVtx[i + 1].v.ob[1] =
+ vtx_y + pauseCtx->offsetY - MASK_GRID_QUAD_MARGIN;
+ pauseCtx->maskVtx[i + 2].v.ob[1] = pauseCtx->maskVtx[i + 3].v.ob[1] =
+ pauseCtx->maskVtx[i + 0].v.ob[1] - MASK_GRID_QUAD_HEIGHT;
+
+ pauseCtx->maskVtx[i + 0].v.ob[2] = pauseCtx->maskVtx[i + 1].v.ob[2] = pauseCtx->maskVtx[i + 2].v.ob[2] =
+ pauseCtx->maskVtx[i + 3].v.ob[2] = 0;
+
+ pauseCtx->maskVtx[i + 0].v.flag = pauseCtx->maskVtx[i + 1].v.flag = pauseCtx->maskVtx[i + 2].v.flag =
+ pauseCtx->maskVtx[i + 3].v.flag = 0;
+
+ pauseCtx->maskVtx[i + 0].v.tc[0] = pauseCtx->maskVtx[i + 0].v.tc[1] = pauseCtx->maskVtx[i + 1].v.tc[1] =
+ pauseCtx->maskVtx[i + 2].v.tc[0] = 0;
+
+ pauseCtx->maskVtx[i + 1].v.tc[0] = pauseCtx->maskVtx[i + 2].v.tc[1] = pauseCtx->maskVtx[i + 3].v.tc[0] =
+ pauseCtx->maskVtx[i + 3].v.tc[1] = MASK_GRID_QUAD_TEX_SIZE * (1 << 5);
+
+ pauseCtx->maskVtx[i + 0].v.cn[0] = pauseCtx->maskVtx[i + 1].v.cn[0] = pauseCtx->maskVtx[i + 2].v.cn[0] =
+ pauseCtx->maskVtx[i + 3].v.cn[0] = pauseCtx->maskVtx[i + 0].v.cn[1] =
+ pauseCtx->maskVtx[i + 1].v.cn[1] = pauseCtx->maskVtx[i + 2].v.cn[1] =
+ pauseCtx->maskVtx[i + 3].v.cn[1] = pauseCtx->maskVtx[i + 0].v.cn[2] =
+ pauseCtx->maskVtx[i + 1].v.cn[2] = pauseCtx->maskVtx[i + 2].v.cn[2] =
+ pauseCtx->maskVtx[i + 3].v.cn[2] = 255;
+
+ pauseCtx->maskVtx[i + 0].v.cn[3] = pauseCtx->maskVtx[i + 1].v.cn[3] = pauseCtx->maskVtx[i + 2].v.cn[3] =
+ pauseCtx->maskVtx[i + 3].v.cn[3] = 255;
+ }
+ }
+
+ // QUAD_MASK_GRID_SELECTED_C_LEFT, QUAD_MASK_GRID_SELECTED_C_DOWN, QUAD_MASK_GRID_SELECTED_C_RIGHT
+
+ for (j = EQUIP_SLOT_C_LEFT; j <= EQUIP_SLOT_C_RIGHT; j++, i += 4) {
+ if (GET_CUR_FORM_BTN_SLOT(j) != ITEM_NONE) {
+ k = (GET_CUR_FORM_BTN_SLOT(j) - ITEM_NUM_SLOTS) * 4;
+
+ pauseCtx->maskVtx[i + 0].v.ob[0] = pauseCtx->maskVtx[i + 2].v.ob[0] =
+ pauseCtx->maskVtx[k].v.ob[0] + MASK_GRID_SELECTED_QUAD_MARGIN;
+
+ pauseCtx->maskVtx[i + 1].v.ob[0] = pauseCtx->maskVtx[i + 3].v.ob[0] =
+ pauseCtx->maskVtx[i + 0].v.ob[0] + MASK_GRID_SELECTED_QUAD_WIDTH;
+
+ pauseCtx->maskVtx[i + 0].v.ob[1] = pauseCtx->maskVtx[i + 1].v.ob[1] =
+ pauseCtx->maskVtx[k].v.ob[1] - MASK_GRID_SELECTED_QUAD_MARGIN;
+
+ pauseCtx->maskVtx[i + 2].v.ob[1] = pauseCtx->maskVtx[i + 3].v.ob[1] =
+ pauseCtx->maskVtx[i + 0].v.ob[1] - MASK_GRID_SELECTED_QUAD_HEIGHT;
+
+ pauseCtx->maskVtx[i + 0].v.ob[2] = pauseCtx->maskVtx[i + 1].v.ob[2] = pauseCtx->maskVtx[i + 2].v.ob[2] =
+ pauseCtx->maskVtx[i + 3].v.ob[2] = 0;
+
+ pauseCtx->maskVtx[i + 0].v.flag = pauseCtx->maskVtx[i + 1].v.flag = pauseCtx->maskVtx[i + 2].v.flag =
+ pauseCtx->maskVtx[i + 3].v.flag = 0;
+
+ pauseCtx->maskVtx[i + 0].v.tc[0] = pauseCtx->maskVtx[i + 0].v.tc[1] = pauseCtx->maskVtx[i + 1].v.tc[1] =
+ pauseCtx->maskVtx[i + 2].v.tc[0] = 0;
+
+ pauseCtx->maskVtx[i + 1].v.tc[0] = pauseCtx->maskVtx[i + 2].v.tc[1] = pauseCtx->maskVtx[i + 3].v.tc[0] =
+ pauseCtx->maskVtx[i + 3].v.tc[1] = MASK_GRID_SELECTED_QUAD_TEX_SIZE * (1 << 5);
+
+ pauseCtx->maskVtx[i + 0].v.cn[0] = pauseCtx->maskVtx[i + 1].v.cn[0] = pauseCtx->maskVtx[i + 2].v.cn[0] =
+ pauseCtx->maskVtx[i + 3].v.cn[0] = pauseCtx->maskVtx[i + 0].v.cn[1] =
+ pauseCtx->maskVtx[i + 1].v.cn[1] = pauseCtx->maskVtx[i + 2].v.cn[1] =
+ pauseCtx->maskVtx[i + 3].v.cn[1] = pauseCtx->maskVtx[i + 0].v.cn[2] =
+ pauseCtx->maskVtx[i + 1].v.cn[2] = pauseCtx->maskVtx[i + 2].v.cn[2] =
+ pauseCtx->maskVtx[i + 3].v.cn[2] = 255;
+
+ pauseCtx->maskVtx[i + 0].v.cn[3] = pauseCtx->maskVtx[i + 1].v.cn[3] = pauseCtx->maskVtx[i + 2].v.cn[3] =
+ pauseCtx->maskVtx[i + 3].v.cn[3] = pauseCtx->alpha;
+ } else {
+ pauseCtx->maskVtx[i + 2].v.ob[0] = -300;
+ pauseCtx->maskVtx[i + 0].v.ob[0] = pauseCtx->maskVtx[i + 2].v.ob[0];
+
+ pauseCtx->maskVtx[i + 1].v.ob[0] = pauseCtx->maskVtx[i + 3].v.ob[0] =
+ pauseCtx->maskVtx[i + 0].v.ob[0] + MASK_GRID_SELECTED_QUAD_WIDTH;
+
+ pauseCtx->maskVtx[i + 0].v.ob[1] = pauseCtx->maskVtx[i + 1].v.ob[1] = 300;
+ pauseCtx->maskVtx[i + 2].v.ob[1] = pauseCtx->maskVtx[i + 3].v.ob[1] =
+ pauseCtx->maskVtx[i + 0].v.ob[1] - MASK_GRID_SELECTED_QUAD_HEIGHT;
+ }
+ }
+ }
+
+ pauseCtx->cursorVtx = GRAPH_ALLOC(play->state.gfxCtx, (PAUSE_QUAD_CURSOR_MAX * 4) * sizeof(Vtx));
+
+ for (i = 0; i < (PAUSE_QUAD_CURSOR_MAX * 4); i++) {
+ pauseCtx->cursorVtx[i].v.ob[0] = pauseCtx->cursorVtx[i].v.ob[1] = pauseCtx->cursorVtx[i].v.ob[2] = 0;
+
+ pauseCtx->cursorVtx[i].v.flag = 0;
+
+ pauseCtx->cursorVtx[i].v.tc[0] = pauseCtx->cursorVtx[i].v.tc[1] = 0;
+
+ pauseCtx->cursorVtx[i].v.cn[0] = pauseCtx->cursorVtx[i].v.cn[1] = pauseCtx->cursorVtx[i].v.cn[2] =
+ pauseCtx->cursorVtx[i].v.cn[3] = 255;
+ }
+
+ // PAUSE_QUAD_CURSOR_0
+ pauseCtx->cursorVtx[1].v.tc[0] = pauseCtx->cursorVtx[2].v.tc[1] = pauseCtx->cursorVtx[3].v.tc[0] =
+ pauseCtx->cursorVtx[3].v.tc[1]
+ // PAUSE_QUAD_CURSOR_1
+ = pauseCtx->cursorVtx[5].v.tc[0] = pauseCtx->cursorVtx[6].v.tc[1] = pauseCtx->cursorVtx[7].v.tc[0] =
+ pauseCtx->cursorVtx[7].v.tc[1]
+ // PAUSE_QUAD_CURSOR_2
+ = pauseCtx->cursorVtx[9].v.tc[0] = pauseCtx->cursorVtx[10].v.tc[1] = pauseCtx->cursorVtx[11].v.tc[0] =
+ pauseCtx->cursorVtx[11].v.tc[1]
+ // PAUSE_QUAD_CURSOR_3
+ = pauseCtx->cursorVtx[13].v.tc[0] = pauseCtx->cursorVtx[14].v.tc[1] = pauseCtx->cursorVtx[15].v.tc[0] =
+ pauseCtx->cursorVtx[15].v.tc[1] = 16 * (1 << 5);
+
+ // PAUSE_QUAD_CURSOR_4
+ pauseCtx->cursorVtx[17].v.tc[0] = pauseCtx->cursorVtx[18].v.tc[1] = pauseCtx->cursorVtx[19].v.tc[0] =
+ pauseCtx->cursorVtx[19].v.tc[1] = 32 * (1 << 5);
+
+ pauseCtx->infoPanelVtx = GRAPH_ALLOC(gfxCtx, 28 * sizeof(Vtx));
+
+ if ((pauseCtx->state == PAUSE_STATE_SAVEPROMPT) || IS_PAUSE_STATE_GAMEOVER) {
+ pauseCtx->promptPageVtx = GRAPH_ALLOC(gfxCtx, ((PAGE_BG_QUADS + VTX_PAGE_SAVE_QUADS) * 4) * sizeof(Vtx));
+ KaleidoScope_SetPageVertices(play, pauseCtx->promptPageVtx, VTX_PAGE_PROMPT, VTX_PAGE_SAVE_QUADS);
+ }
+}
+
f32 D_8082BCB4[] = {
-62.0f, -36.0f, -10.0f, 16.0f, 42.0f, 68.0f,
};
@@ -458,66 +1592,42 @@ f32 D_8082BE28[] = {
-11.0f, -11.0f, -11.0f, -11.0f, -11.0f, -11.0f, 27.0f, -53.0f, -53.0f, 14.0f, 26.0f,
};
-s16 D_8082BE84 = 0;
-
-void func_80821900(void* segment, u32 texIndex) {
- CmpDma_LoadFile(SEGMENT_ROM_START(map_name_static), texIndex, segment, 0x400);
-}
-
-void func_8082192C(void* segment, u32 texIndex) {
- CmpDma_LoadFile(SEGMENT_ROM_START(map_name_static), texIndex, segment, 0xA00);
-}
-
-void func_80821958(void* segment, u32 texIndex) {
- CmpDma_LoadFile(SEGMENT_ROM_START(item_name_static), texIndex, segment, 0x400);
-}
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/KaleidoScope_MoveCursorToSpecialPos.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/func_80821A04.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/KaleidoScope_DrawTexQuadRGBA32.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/func_80821CC4.s")
-
-void KaleidoScope_HandlePageToggles(PlayState* play, Input* input);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/KaleidoScope_HandlePageToggles.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/func_80821F30.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/func_808221DC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/func_80823350.s")
-
-void KaleidoScope_UpdateNamePanel(PlayState* play);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/KaleidoScope_UpdateNamePanel.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/func_808248D0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/func_80824B90.s")
-
-void KaleidoScope_UpdateOwlWarpNamePanel(PlayState* play);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/KaleidoScope_UpdateOwlWarpNamePanel.s")
-
-void KaleidoScope_UpdateSwitchPage(PlayState* play, Input* input);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/KaleidoScope_UpdateSwitchPage.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/KaleidoScope_SetView.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/func_80825A50.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/func_80825E28.s")
-
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/func_808274DC.s")
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/func_80827A8C.s")
+s16 D_8082BE84 = 0;
+
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/func_80827E08.s")
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/KaleidoScope_Draw.s")
-void KaleidoScope_GrayOutTextureRGBA32(u32* texture, u16 pixelCount);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/KaleidoScope_GrayOutTextureRGBA32.s")
+void KaleidoScope_GrayOutTextureRGBA32(u32* texture, u16 pixelCount) {
+ u32 rgb;
+ u32 gray;
+ u16 i;
+ s32 j;
+
+ //! FAKE
+ if (texture == NULL) {}
+
+ for (i = 0; i < pixelCount; i++) {
+ //! FAKE
+ j = i;
+ if ((texture[j] & 0xFFFFFF00) != 0) {
+ rgb = texture[j] >> 8;
+ gray = ((((rgb & 0xFF0000) >> 16) + ((rgb & 0xFF00) >> 7) + (rgb & 0xFF)) / 7) & 0xFF;
+
+ rgb = gray;
+ rgb <<= 8;
+ rgb |= gray;
+ rgb <<= 8;
+ rgb |= gray;
+
+ texture[j] = (rgb << 8) | (texture[j] & 0xFF);
+ }
+ }
+}
void KaleidoScope_UpdateOpening(PlayState* play) {
PauseContext* pauseCtx = &play->pauseCtx;
diff --git a/tools/disasm/disasm.py b/tools/disasm/disasm.py
index e7b0f4d81..37ba8b45e 100755
--- a/tools/disasm/disasm.py
+++ b/tools/disasm/disasm.py
@@ -186,9 +186,9 @@ def proper_name(symbol, in_data=False, is_symbol=True):
# bg_ikana_mirror symbol with large addend folded into %lo
elif symbol == 0x80B80248:
return variables_ast[0x80B801A8][0] + f" + 0x{0x80B80248 - 0x80B801A8:X}"
- # player symbol with very large addend folded into %lo, since we don't know the real symbol just use the first data symbol for now
+ # player symbol with very large addend folded into %lo
elif symbol == 0x8084D2FC:
- return variables_ast[0x8085B9F0][0] + f" - 0x{0x8085B9F0 - 0x8084D2FC:X}"
+ return variables_ast[0x8085D0FA][0] + f" - 0x{0x8085D0FA - 0x8084D2FC:X}"
# OS_K0_TO_PHYSICAL on rspS2DEX text and data symbols
elif symbol == 0x001ABAB0 or symbol == 0x001E3BB0:
return variables_ast[symbol + 0x80000000][0] + " - 0x80000000"
diff --git a/tools/disasm/files.txt b/tools/disasm/files.txt
index 88fab2cab..df205189f 100644
--- a/tools/disasm/files.txt
+++ b/tools/disasm/files.txt
@@ -57,7 +57,7 @@
0x80085570 : "gfxprint",
0x80086110 : "mtxuty-cvt",
0x80086280 : "assert",
- 0x800862E0 : "",
+ 0x800862E0 : "system_heap",
0x80086620 : "padsetup",
0x80086760 : "boot_80086760",
0x80086C70 : "fp",
@@ -256,7 +256,7 @@
0x80096C30 : "loadfragment2",
0x80096C40 : "stackcheck",
0x80096C50 : "gfxprint",
- 0x80097500 : "boot_800862E0",
+ 0x80097500 : "system_heap",
0x80097520 : "fp",
0x80097530 : "rand",
0x80097540 : "osViModeNtscHpf1",
diff --git a/tools/disasm/functions.txt b/tools/disasm/functions.txt
index ea4ce7606..1517dbcd1 100644
--- a/tools/disasm/functions.txt
+++ b/tools/disasm/functions.txt
@@ -157,14 +157,14 @@
0x80086258:("MtxConv_L2F",),
0x80086280:("__assert",),
0x800862B4:("func_800862B4",),
- 0x800862E0:("SystemArena_MallocMin1",),
- 0x80086310:("SystemArena_FreeNullCheck",),
- 0x8008633C:("SystemArena_RunBlockFunc",),
- 0x800863AC:("SystemArena_RunBlockFunc1",),
- 0x8008641C:("SystemArena_RunBlockFunc8",),
- 0x800864EC:("SystemArena_RunBlockFunc1Reverse",),
- 0x80086588:("SystemArena_RunInits",),
- 0x800865F8:("SystemArena_Init",),
+ 0x800862E0:("SystemHeap_Malloc",),
+ 0x80086310:("SystemHeap_Free",),
+ 0x8008633C:("SystemHeap_RunBlockFunc",),
+ 0x800863AC:("SystemHeap_RunBlockFunc1",),
+ 0x8008641C:("SystemHeap_RunBlockFunc8",),
+ 0x800864EC:("SystemHeap_RunBlockFunc1Reverse",),
+ 0x80086588:("SystemHeap_RunInits",),
+ 0x800865F8:("SystemHeap_Init",),
0x80086620:("PadSetup_Init",),
0x80086760:("func_80086760",),
0x80086794:("func_80086794",),
@@ -206,7 +206,7 @@
0x80086E78:("SystemArena_Calloc",),
0x80086ECC:("SystemArena_GetSizes",),
0x80086F04:("SystemArena_CheckArena",),
- 0x80086F28:("SystemArena_InitArena",),
+ 0x80086F28:("SystemArena_Init",),
0x80086F58:("SystemArena_Cleanup",),
0x80086F7C:("SystemArena_IsInitialized",),
0x80086FA0:("Rand_Next",),
@@ -696,10 +696,10 @@
0x800B5E68:("TitleCard_Update",),
0x800B5F24:("TitleCard_Draw",),
0x800B6434:("func_800B6434",),
- 0x800B6468:("func_800B6468",),
- 0x800B6474:("func_800B6474",),
- 0x800B648C:("func_800B648C",),
- 0x800B64FC:("func_800B64FC",),
+ 0x800B6468:("Actor_InitPlayerImpact",),
+ 0x800B6474:("Actor_UpdatePlayerImpact",),
+ 0x800B648C:("Actor_SetPlayerImpact",),
+ 0x800B64FC:("Actor_GetPlayerImpact",),
0x800B6584:("func_800B6584",),
0x800B6608:("func_800B6608",),
0x800B6680:("func_800B6680",),
@@ -859,9 +859,9 @@
0x800BC5B8:("Actor_IsTargeted",),
0x800BC5EC:("Actor_OtherIsTargeted",),
0x800BC620:("func_800BC620",),
- 0x800BC770:("Actor_AddQuake",),
- 0x800BC7D8:("Actor_AddQuakeWithSpeed",),
- 0x800BC848:("func_800BC848",),
+ 0x800BC770:("Actor_RequestQuake",),
+ 0x800BC7D8:("Actor_RequestQuakeWithSpeed",),
+ 0x800BC848:("Actor_RequestQuakeAndRumble",),
0x800BC8B8:("Actor_DrawDoorLock",),
0x800BCB50:("Actor_SpawnShieldParticlesMetal",),
0x800BCB70:("Actor_SetColorFilter",),
@@ -1115,16 +1115,16 @@
0x800CB210:("Camera_fabsf",),
0x800CB240:("Camera_Vec3fMagnitude",),
0x800CB270:("Camera_QuadraticAttenuation",),
- 0x800CB330:("Camera_LerpCeilF",),
- 0x800CB398:("Camera_LerpCeilS",),
- 0x800CB42C:("Camera_LerpFloorS",),
- 0x800CB4C0:("Camera_LerpCeilVec3f",),
+ 0x800CB330:("Camera_ScaledStepToCeilF",),
+ 0x800CB398:("Camera_ScaledStepToCeilS",),
+ 0x800CB42C:("Camera_ScaledStepToFloorS",),
+ 0x800CB4C0:("Camera_ScaledStepToCeilVec3f",),
0x800CB544:("Camera_SetUpdateRatesFastPitch",),
0x800CB584:("Camera_SetUpdateRatesFastYaw",),
0x800CB5DC:("Camera_SetUpdateRatesSlow",),
0x800CB60C:("Camera_Vec3sToVec3f",),
0x800CB674:("Camera_AngleDiffAndScale",),
- 0x800CB6C8:("Camera_UpdateAtActorOffset",),
+ 0x800CB6C8:("Camera_SetFocalActorAtOffset",),
0x800CB700:("Camera_GetFocalActorHeight",),
0x800CB780:("Camera_GetRunSpeedLimit",),
0x800CB7CC:("func_800CB7CC",),
@@ -1147,41 +1147,41 @@
0x800CBC30:("func_800CBC30",),
0x800CBC84:("func_800CBC84",),
0x800CBFA4:("func_800CBFA4",),
- 0x800CC000:("func_800CC000",),
- 0x800CC128:("func_800CC128",),
- 0x800CC1C4:("func_800CC1C4",),
+ 0x800CC000:("Camera_BgCheckInfo",),
+ 0x800CC128:("Camera_BgCheck",),
+ 0x800CC1C4:("Camera_CheckOOB",),
0x800CC260:("func_800CC260",),
- 0x800CC488:("func_800CC488",),
- 0x800CC56C:("func_800CC56C",),
- 0x800CC5C8:("func_800CC5C8",),
+ 0x800CC488:("Camera_GetFloorYNorm",),
+ 0x800CC56C:("Camera_GetFloorY",),
+ 0x800CC5C8:("Camera_GetFloorYLayer",),
0x800CC740:("Camera_GetBgCamOrActorCsCamSetting",),
0x800CC7A8:("Camera_GetBgCamOrActorCsCamFuncData",),
0x800CC804:("Camera_GetBgCamIndex",),
0x800CC874:("Camera_GetWaterBoxBgCamSetting",),
0x800CC938:("func_800CC938",),
- 0x800CC958:("func_800CC958",),
- 0x800CC9C0:("func_800CC9C0",),
+ 0x800CC958:("Camera_CalcXZAngle",),
+ 0x800CC9C0:("Camera_GetPitchAdjFromFloorHeightDiffs",),
0x800CCCEC:("func_800CCCEC",),
- 0x800CD04C:("func_800CD04C",),
- 0x800CD288:("func_800CD288",),
- 0x800CD2E0:("func_800CD2E0",),
- 0x800CD2F0:("func_800CD2F0",),
- 0x800CD3E4:("func_800CD3E4",),
+ 0x800CD04C:("Camera_CalcUpVec",),
+ 0x800CD288:("Camera_ClampLerpScale",),
+ 0x800CD2E0:("Camera_ResetActionFuncState",),
+ 0x800CD2F0:("Camera_UpdateInterface",),
+ 0x800CD3E4:("Camera_BgCheckCorner",),
0x800CD44C:("func_800CD44C",),
- 0x800CD634:("func_800CD634",),
+ 0x800CD634:("Camera_CalcSlopeYAdj",),
0x800CD6CC:("func_800CD6CC",),
- 0x800CD6F8:("func_800CD6F8",),
- 0x800CD834:("func_800CD834",),
- 0x800CDA14:("func_800CDA14",),
- 0x800CDB6C:("func_800CDB6C",),
- 0x800CDE6C:("func_800CDE6C",),
- 0x800CE2B8:("func_800CE2B8",),
- 0x800CE5E0:("func_800CE5E0",),
- 0x800CE79C:("func_800CE79C",),
- 0x800CE930:("func_800CE930",),
- 0x800CEAD8:("func_800CEAD8",),
- 0x800CEC38:("func_800CEC38",),
- 0x800CED90:("func_800CED90",),
+ 0x800CD6F8:("Camera_CalcAtDefault",),
+ 0x800CD834:("Camera_CalcAtForScreen",),
+ 0x800CDA14:("Camera_CalcAtForNormal1",),
+ 0x800CDB6C:("Camera_CalcAtForParallel",),
+ 0x800CDE6C:("Camera_CalcAtForFriendlyLockOn",),
+ 0x800CE2B8:("Camera_CalcAtForEnemyLockOn",),
+ 0x800CE5E0:("Camera_CalcAtForHorse",),
+ 0x800CE79C:("Camera_ClampDist1",),
+ 0x800CE930:("Camera_ClampDist2",),
+ 0x800CEAD8:("Camera_CalcDefaultPitch",),
+ 0x800CEC38:("Camera_CalcDefaultYaw",),
+ 0x800CED90:("Camera_CalcDefaultSwing",),
0x800CF3A4:("Camera_Noop",),
0x800CF3B4:("Camera_Normal1",),
0x800D0874:("Camera_Normal2",),
@@ -1253,48 +1253,48 @@
0x800DD11C:("Camera_Special7",),
0x800DD13C:("Camera_Special8",),
0x800DD5B8:("Camera_Special9",),
- 0x800DDD58:("Camera_Alloc",),
- 0x800DDDA8:("Camera_Free",),
+ 0x800DDD58:("Camera_Create",),
+ 0x800DDDA8:("Camera_Destroy",),
0x800DDDD0:("Camera_Init",),
0x800DDFE0:("func_800DDFE0",),
- 0x800DE0E0:("func_800DE0E0",),
- 0x800DE0EC:("Camera_InitPlayerSettings",),
+ 0x800DE0E0:("Camera_Stub800DE0E0",),
+ 0x800DE0EC:("Camera_InitFocalActorSettings",),
0x800DE308:("Camera_ChangeStatus",),
- 0x800DE324:("func_800DE324",),
- 0x800DE62C:("func_800DE62C",),
- 0x800DE840:("func_800DE840",),
- 0x800DE890:("func_800DE890",),
- 0x800DE954:("func_800DE954",),
+ 0x800DE324:("Camera_UpdateWater",),
+ 0x800DE62C:("Camera_EarthquakeDay3",),
+ 0x800DE840:("Camera_UpdateHotRoom",),
+ 0x800DE890:("Camera_SetSwordDistortion",),
+ 0x800DE954:("Camera_RequestGiantsMaskSetting",),
0x800DE9B0:("Camera_Update",),
0x800DF498:("func_800DF498",),
- 0x800DF4D0:("Camera_SetMode",),
+ 0x800DF4D0:("Camera_ChangeModeFlags",),
0x800DF840:("Camera_ChangeMode",),
- 0x800DF86C:("func_800DF86C",),
- 0x800DF8EC:("func_800DF8EC",),
+ 0x800DF86C:("Camera_CheckValidMode",),
+ 0x800DF8EC:("Camera_ChangeSettingFlags",),
0x800DFAC8:("Camera_ChangeSetting",),
- 0x800DFB14:("Camera_ChangeDataIdx",),
- 0x800DFC1C:("func_800DFC1C",),
- 0x800DFC40:("func_800DFC40",),
+ 0x800DFB14:("Camera_ChangeActorCsCamIndex",),
+ 0x800DFC1C:("Camera_GetInputDir",),
+ 0x800DFC40:("Camera_GetInputDirPitch",),
0x800DFC68:("Camera_GetInputDirYaw",),
0x800DFC90:("Camera_GetCamDir",),
0x800DFCB4:("Camera_GetCamDirPitch",),
0x800DFCDC:("Camera_GetCamDirYaw",),
0x800DFD04:("Camera_AddQuake",),
0x800DFD78:("Camera_SetViewParam",),
- 0x800DFEF0:("func_800DFEF0",),
- 0x800DFF18:("func_800DFF18",),
- 0x800DFF34:("func_800DFF34",),
- 0x800DFF44:("func_800DFF44",),
- 0x800DFF60:("Camera_SetFlags",),
- 0x800DFF84:("Camera_ClearFlags",),
+ 0x800DFEF0:("Camera_UnsetViewFlag",),
+ 0x800DFF18:("Camera_OverwriteStateFlags",),
+ 0x800DFF34:("Camera_ResetActionFuncStateUnused",),
+ 0x800DFF44:("Camera_SetCsParams",),
+ 0x800DFF60:("Camera_SetStateFlag",),
+ 0x800DFF84:("Camera_UnsetStateFlag",),
0x800DFFAC:("Camera_ChangeDoorCam",),
0x800E007C:("Camera_Copy",),
- 0x800E01AC:("func_800E01AC",),
+ 0x800E01AC:("Camera_IsDbgCamEnabled",),
0x800E01B8:("Camera_GetQuakeOffset",),
- 0x800E01DC:("func_800E01DC",),
- 0x800E0228:("func_800E0228",),
+ 0x800E01DC:("Camera_SetCameraData",),
+ 0x800E0228:("Camera_GetNegOne",),
0x800E0238:("func_800E0238",),
- 0x800E02AC:("Camera_SetToTrackActor",),
+ 0x800E02AC:("Camera_SetFocalActor",),
0x800E0308:("Camera_SetTargetActor",),
0x800E031C:("Camera_GetWaterYPos",),
0x800E0348:("func_800E0348",),
@@ -2072,17 +2072,17 @@
0x8010C36C:("OLib_ClampMaxDist",),
0x8010C3D4:("OLib_Vec3fDistNormalize",),
0x8010C484:("OLib_VecSphToVec3f",),
- 0x8010C530:("OLib_VecSphGeoToVec3f",),
+ 0x8010C530:("OLib_VecGeoToVec3f",),
0x8010C574:("OLib_Vec3fToVecSph",),
- 0x8010C6C8:("OLib_Vec3fToVecSphGeo",),
+ 0x8010C6C8:("OLib_Vec3fToVecGeo",),
0x8010C710:("OLib_Vec3fDiffToVecSph",),
- 0x8010C764:("OLib_Vec3fDiffToVecSphGeo",),
- 0x8010C7B8:("OLib_VecSphAddToVec3f",),
+ 0x8010C764:("OLib_Vec3fDiffToVecGeo",),
+ 0x8010C7B8:("OLib_AddVecGeoToVec3f",),
0x8010C838:("OLib_Vec3fDiffRad",),
0x8010C8C8:("OLib_Vec3fDiffDegF",),
0x8010C930:("OLib_Vec3fDiffBinAng",),
- 0x8010C9C8:("OLib_DbCameraVec3fDiff",),
- 0x8010CAA0:("OLib_DbCameraVec3fSum",),
+ 0x8010C9C8:("OLib_Vec3fDiff",),
+ 0x8010CAA0:("OLib_Vec3fAdd",),
0x8010CB80:("Gfx_DrawTexRectRGBA16",),
0x8010CD98:("Gfx_DrawTexRectIA8",),
0x8010CFBC:("Gfx_DrawTexRectIA8_DropShadow",),
@@ -2289,97 +2289,97 @@
0x8012A4D0:("Quake_CallbackType2",),
0x8012A540:("Quake_CallbackType4",),
0x8012A5D8:("Quake_GetFreeIndex",),
- 0x8012A638:("Quake_AddImpl",),
- 0x8012A6F0:("Quake_RemoveRequest",),
+ 0x8012A638:("Quake_RequestImpl",),
+ 0x8012A6F0:("Quake_Remove",),
0x8012A718:("Quake_GetRequest",),
0x8012A774:("Quake_SetValue",),
0x8012A8A8:("Quake_SetSpeed",),
- 0x8012A8F0:("Quake_SetCountdown",),
- 0x8012A940:("Quake_GetCountdown",),
- 0x8012A978:("Quake_SetQuakeValues",),
- 0x8012A9E0:("Quake_SetQuakeValues2",),
+ 0x8012A8F0:("Quake_SetDuration",),
+ 0x8012A940:("Quake_GetTimeLeft",),
+ 0x8012A978:("Quake_SetPerturbations",),
+ 0x8012A9E0:("Quake_SetOrientation",),
0x8012AA48:("Quake_Init",),
- 0x8012AA9C:("Quake_Add",),
- 0x8012AAC0:("Quake_Remove",),
- 0x8012AB08:("Quake_Calc",),
+ 0x8012AA9C:("Quake_Request",),
+ 0x8012AAC0:("Quake_RemoveRequest",),
+ 0x8012AB08:("Quake_Update",),
0x8012AE68:("Distortion_Init",),
- 0x8012AEAC:("Distortion_SetCountdown",),
- 0x8012AED4:("Distortion_GetCountdown",),
+ 0x8012AEAC:("Distortion_SetDuration",),
+ 0x8012AED4:("Distortion_GetTimeLeft",),
0x8012AEE4:("Distortion_GetType",),
- 0x8012AEF4:("Distortion_SetType",),
- 0x8012AF18:("Distortion_ClearType",),
+ 0x8012AEF4:("Distortion_Request",),
+ 0x8012AF18:("Distortion_RemoveRequest",),
0x8012AF38:("Distortion_GetUnderwaterCurrentSpeed",),
0x8012AF9C:("Distortion_Update",),
- 0x8012BBE8:("Quake_NumActiveQuakes",),
+ 0x8012BBE8:("Quake_GetNumActiveQuakes",),
0x8012BC50:("Gfx_SetFog",),
0x8012BD8C:("Gfx_SetFogWithSync",),
0x8012BF08:("Gfx_SetFog2",),
- 0x8012BF3C:("Gfx_CallSetupDLImpl",),
- 0x8012BF78:("Gfx_CallSetupDL",),
- 0x8012BF98:("Gfx_CallSetupDLAtPtr",),
- 0x8012BFC4:("func_8012BFC4",),
- 0x8012BFEC:("func_8012BFEC",),
- 0x8012C014:("func_8012C014",),
- 0x8012C058:("func_8012C058",),
- 0x8012C080:("func_8012C080",),
- 0x8012C0A8:("func_8012C0A8",),
- 0x8012C0D0:("func_8012C0D0",),
- 0x8012C0F8:("func_8012C0F8",),
- 0x8012C120:("func_8012C120",),
- 0x8012C148:("func_8012C148",),
- 0x8012C170:("func_8012C170",),
- 0x8012C198:("func_8012C198",),
- 0x8012C1C0:("func_8012C1C0",),
- 0x8012C1EC:("func_8012C1EC",),
- 0x8012C214:("func_8012C214",),
- 0x8012C240:("func_8012C240",),
+ 0x8012BF3C:("Gfx_SetupDLImpl",),
+ 0x8012BF78:("Gfx_SetupDL",),
+ 0x8012BF98:("Gfx_SetupDLAtPtr",),
+ 0x8012BFC4:("Gfx_SetupDL57",),
+ 0x8012BFEC:("Gfx_SetupDL57_b",),
+ 0x8012C014:("Gfx_SetupDL52_NoCD",),
+ 0x8012C058:("Gfx_SetupDL58_Opa",),
+ 0x8012C080:("Gfx_SetupDL57_Opa",),
+ 0x8012C0A8:("Gfx_SetupDL50_Opa",),
+ 0x8012C0D0:("Gfx_SetupDL51_Opa",),
+ 0x8012C0F8:("Gfx_SetupDL52_Xlu",),
+ 0x8012C120:("Gfx_SetupDL53_Opa",),
+ 0x8012C148:("Gfx_SetupDL54_Opa",),
+ 0x8012C170:("Gfx_SetupDL55_Xlu",),
+ 0x8012C198:("Gfx_SetupDL26",),
+ 0x8012C1C0:("Gfx_SetupDL26_Opa",),
+ 0x8012C1EC:("Gfx_SetupDL23",),
+ 0x8012C214:("Gfx_SetupDL23_Opa",),
+ 0x8012C240:("Gfx_SetupDL25_Xlu2",),
0x8012C268:("func_8012C268",),
- 0x8012C28C:("func_8012C28C",),
- 0x8012C2B4:("func_8012C2B4",),
- 0x8012C2DC:("func_8012C2DC",),
- 0x8012C304:("func_8012C304",),
- 0x8012C32C:("func_8012C32C",),
- 0x8012C354:("func_8012C354",),
- 0x8012C37C:("func_8012C37C",),
- 0x8012C3A4:("func_8012C3A4",),
- 0x8012C3CC:("func_8012C3CC",),
- 0x8012C3F4:("func_8012C3F4",),
- 0x8012C420:("func_8012C420",),
- 0x8012C448:("func_8012C448",),
- 0x8012C470:("func_8012C470",),
- 0x8012C498:("func_8012C498",),
- 0x8012C4C0:("func_8012C4C0",),
- 0x8012C4E8:("func_8012C4E8",),
- 0x8012C510:("func_8012C510",),
- 0x8012C538:("func_8012C538",),
- 0x8012C560:("func_8012C560",),
- 0x8012C588:("func_8012C588",),
- 0x8012C5B0:("func_8012C5B0",),
- 0x8012C5D8:("func_8012C5D8",),
- 0x8012C600:("func_8012C600",),
- 0x8012C628:("func_8012C628",),
- 0x8012C654:("func_8012C654",),
- 0x8012C680:("func_8012C680",),
- 0x8012C6AC:("func_8012C6AC",),
- 0x8012C6D4:("func_8012C6D4",),
- 0x8012C6FC:("func_8012C6FC",),
- 0x8012C724:("func_8012C724",),
- 0x8012C74C:("func_8012C74C",),
- 0x8012C774:("func_8012C774",),
- 0x8012C7B8:("func_8012C7B8",),
- 0x8012C7FC:("func_8012C7FC",),
- 0x8012C840:("func_8012C840",),
- 0x8012C868:("func_8012C868",),
- 0x8012C8AC:("func_8012C8AC",),
- 0x8012C8D4:("func_8012C8D4",),
- 0x8012C8FC:("func_8012C8FC",),
- 0x8012C924:("func_8012C924",),
- 0x8012C94C:("func_8012C94C",),
- 0x8012C974:("func_8012C974",),
- 0x8012C9BC:("func_8012C9BC",),
- 0x8012C9E4:("func_8012C9E4",),
- 0x8012CA0C:("func_8012CA0C",),
- 0x8012CA38:("func_8012CA38",),
+ 0x8012C28C:("Gfx_SetupDL25_Opa",),
+ 0x8012C2B4:("Gfx_SetupDL71",),
+ 0x8012C2DC:("Gfx_SetupDL25_Xlu",),
+ 0x8012C304:("Gfx_SetupDL72",),
+ 0x8012C32C:("Gfx_SetupDL31_Opa",),
+ 0x8012C354:("Gfx_SetupDL32_Opa",),
+ 0x8012C37C:("Gfx_SetupDL33_Opa",),
+ 0x8012C3A4:("Gfx_SetupDL64",),
+ 0x8012C3CC:("Gfx_SetupDL34",),
+ 0x8012C3F4:("Gfx_SetupDL34_Opa",),
+ 0x8012C420:("Gfx_SetupDL35_Opa",),
+ 0x8012C448:("Gfx_SetupDL44_Xlu",),
+ 0x8012C470:("Gfx_SetupDL36_Opa",),
+ 0x8012C498:("Gfx_SetupDL28",),
+ 0x8012C4C0:("Gfx_SetupDL28_Opa",),
+ 0x8012C4E8:("Gfx_SetupDL43_Opa",),
+ 0x8012C510:("Gfx_SetupDL45_Opa",),
+ 0x8012C538:("Gfx_SetupDL46_Overlay",),
+ 0x8012C560:("Gfx_SetupDL38_Xlu",),
+ 0x8012C588:("Gfx_SetupDL4_Xlu",),
+ 0x8012C5B0:("Gfx_SetupDL37_Opa",),
+ 0x8012C5D8:("Gfx_SetupDL2_Opa",),
+ 0x8012C600:("Gfx_SetupDL39",),
+ 0x8012C628:("Gfx_SetupDL39_Opa",),
+ 0x8012C654:("Gfx_SetupDL39_Overlay",),
+ 0x8012C680:("Gfx_SetupDL39_Ptr",),
+ 0x8012C6AC:("Gfx_SetupDL40_Opa",),
+ 0x8012C6D4:("Gfx_SetupDL41_Opa",),
+ 0x8012C6FC:("Gfx_SetupDL47_Xlu",),
+ 0x8012C724:("Gfx_SetupDL66",),
+ 0x8012C74C:("Gfx_SetupDL67",),
+ 0x8012C774:("Gfx_SetupDL68_NoCD",),
+ 0x8012C7B8:("Gfx_SetupDL69_NoCD",),
+ 0x8012C7FC:("Gfx_SetupDL65_NoCD",),
+ 0x8012C840:("Gfx_SetupDL70",),
+ 0x8012C868:("Gfx_SetupDL20_NoCD",),
+ 0x8012C8AC:("Gfx_SetupDL42_Opa",),
+ 0x8012C8D4:("Gfx_SetupDL42_Overlay",),
+ 0x8012C8FC:("Gfx_SetupDL48_Opa",),
+ 0x8012C924:("Gfx_SetupDL49_Xlu",),
+ 0x8012C94C:("Gfx_SetupDL27_Xlu",),
+ 0x8012C974:("Gfx_SetupDL60_XluNoCD",),
+ 0x8012C9BC:("Gfx_SetupDL61_Xlu",),
+ 0x8012C9E4:("Gfx_SetupDL56_Opa",),
+ 0x8012CA0C:("Gfx_SetupDL56_Ptr",),
+ 0x8012CA38:("Gfx_SetupDL59_Opa",),
0x8012CA60:("Gfx_BranchTexScroll",),
0x8012CB04:("func_8012CB04",),
0x8012CB28:("func_8012CB28",),
@@ -3164,33 +3164,33 @@
0x80174B20:("ListAlloc_Free",),
0x80174BA0:("ListAlloc_FreeAll",),
0x80174BF0:("Main",),
- 0x80174F10:("Padmgr_GetControllerBitmask",),
- 0x80174F24:("func_80174F24",),
- 0x80174F44:("func_80174F44",),
- 0x80174F7C:("func_80174F7C",),
- 0x80174F9C:("func_80174F9C",),
- 0x80174FD4:("Padmgr_GetEventCallback",),
- 0x80175008:("func_80175008",),
- 0x8017503C:("Padmgr_SetEventCallback",),
- 0x8017506C:("func_8017506C",),
- 0x8017509C:("Padmgr_Lock",),
- 0x801750CC:("Padmgr_Unlock",),
- 0x801750FC:("func_801750FC",),
- 0x80175364:("func_80175364",),
- 0x80175434:("func_80175434",),
- 0x8017544C:("func_8017544C",),
+ 0x80174F10:("PadMgr_GetValidControllersMask",),
+ 0x80174F24:("PadMgr_SetRumbleRetraceCallback",),
+ 0x80174F44:("PadMgr_UnsetRumbleRetraceCallback",),
+ 0x80174F7C:("PadMgr_SetInputRetraceCallback",),
+ 0x80174F9C:("PadMgr_UnsetInputRetraceCallback",),
+ 0x80174FD4:("PadMgr_AcquireSerialEventQueue",),
+ 0x80175008:("PadMgr_VoiceAcquireSerialEventQueue",),
+ 0x8017503C:("PadMgr_ReleaseSerialEventQueue",),
+ 0x8017506C:("PadMgr_VoiceReleaseSerialEventQueue",),
+ 0x8017509C:("PadMgr_LockPadData",),
+ 0x801750CC:("PadMgr_UnlockPadData",),
+ 0x801750FC:("PadMgr_UpdateRumble",),
+ 0x80175364:("PadMgr_RumbleStop",),
+ 0x80175434:("PadMgr_RumblePause",),
+ 0x8017544C:("PadMgr_RumbleSetSingle",),
0x80175474:("PadMgr_RumbleSet",),
0x801754C0:("PadMgr_ControllerHasRumblePak",),
- 0x801754E0:("Padmgr_CalcStickEdges",),
- 0x801757A4:("Padmgr_ParseState",),
- 0x801759BC:("func_801759BC",),
- 0x80175AE0:("func_80175AE0",),
- 0x80175C80:("Padmgr_Update",),
- 0x80175E3C:("Padmgr_Stop",),
- 0x80175E68:("func_80175E68",),
- 0x80175F98:("Padmgr_GetInput",),
- 0x80175FD4:("Padmgr_GetInput2",),
- 0x80176010:("Padmgr_ThreadEntry",),
+ 0x801754E0:("PadMgr_AdjustInput",),
+ 0x801757A4:("PadMgr_UpdateInputs",),
+ 0x801759BC:("PadMgr_InitVoice",),
+ 0x80175AE0:("PadMgr_UpdateConnections",),
+ 0x80175C80:("PadMgr_HandleRetrace",),
+ 0x80175E3C:("PadMgr_HandlePreNMI",),
+ 0x80175E68:("PadMgr_GetInputNoLock",),
+ 0x80175F98:("PadMgr_GetInput",),
+ 0x80175FD4:("PadMgr_GetInput2",),
+ 0x80176010:("PadMgr_ThreadEntry",),
0x80176194:("PadMgr_Init",),
0x80176280:("Sched_SwapFramebuffer",),
0x80176314:("Sched_RetraceUpdateFramebuffer",),
@@ -4205,7 +4205,7 @@
0x80819238:("KaleidoScope_DrawInventoryEditor",),
0x80819F04:("KaleidoScope_UpdateInventoryEditor",),
0x8081B240:("KaleidoScope_DrawAmmoCount",),
- 0x8081B6BC:("KaleidoScope_SetCursorVtx",),
+ 0x8081B6BC:("KaleidoScope_SetCursorVtxPos",),
0x8081B6EC:("KaleidoScope_DrawItemSelect",),
0x8081BCA8:("KaleidoScope_UpdateItemCursor",),
0x8081C684:("KaleidoScope_UpdateItemEquip",),
@@ -4226,17 +4226,17 @@
0x80821AD4:("KaleidoScope_DrawTexQuadRGBA32",),
0x80821CC4:("func_80821CC4",),
0x80821D84:("KaleidoScope_HandlePageToggles",),
- 0x80821F30:("func_80821F30",),
- 0x808221DC:("func_808221DC",),
+ 0x80821F30:("KaleidoScope_DrawPageSections",),
+ 0x808221DC:("KaleidoScope_DrawPages",),
0x80823350:("func_80823350",),
0x80824738:("KaleidoScope_UpdateNamePanel",),
- 0x808248D0:("func_808248D0",),
+ 0x808248D0:("KaleidoScope_DrawOwlWarpMapPage",),
0x80824B90:("func_80824B90",),
0x808256E4:("KaleidoScope_UpdateOwlWarpNamePanel",),
0x8082585C:("KaleidoScope_UpdateSwitchPage",),
0x808259D4:("KaleidoScope_SetView",),
- 0x80825A50:("func_80825A50",),
- 0x80825E28:("func_80825E28",),
+ 0x80825A50:("KaleidoScope_SetPageVertices",),
+ 0x80825E28:("KaleidoScope_SetVertices",),
0x808274DC:("func_808274DC",),
0x80827A8C:("func_80827A8C",),
0x80827E08:("func_80827E08",),
@@ -4245,14 +4245,14 @@
0x80828788:("KaleidoScope_UpdateOpening",),
0x8082895C:("KaleidoScope_Update",),
0x8082DA90:("func_8082DA90",),
- 0x8082DABC:("func_8082DABC",),
+ 0x8082DABC:("Player_StopHorizontalMovement",),
0x8082DAD4:("func_8082DAD4",),
0x8082DAFC:("func_8082DAFC",),
- 0x8082DB18:("func_8082DB18",),
- 0x8082DB3C:("func_8082DB3C",),
+ 0x8082DB18:("Player_AnimationPlayOnce",),
+ 0x8082DB3C:("Player_AnimationPlayLoop",),
0x8082DB60:("func_8082DB60",),
0x8082DB90:("func_8082DB90",),
- 0x8082DBC0:("func_8082DBC0",),
+ 0x8082DBC0:("Player_AnimationPlayOnceReverse",),
0x8082DC28:("func_8082DC28",),
0x8082DC38:("func_8082DC38",),
0x8082DC64:("func_8082DC64",),
@@ -4262,18 +4262,18 @@
0x8082DE50:("func_8082DE50",),
0x8082DE88:("func_8082DE88",),
0x8082DF2C:("func_8082DF2C",),
- 0x8082DF48:("func_8082DF48",),
- 0x8082DF8C:("func_8082DF8C",),
+ 0x8082DF48:("Player_RequestRumble",),
+ 0x8082DF8C:("Player_AnimSfx_PlayVoice",),
0x8082E00C:("func_8082E00C",),
- 0x8082E078:("func_8082E078",),
- 0x8082E094:("func_8082E094",),
- 0x8082E0CC:("func_8082E0CC",),
- 0x8082E0F4:("func_8082E0F4",),
- 0x8082E12C:("func_8082E12C",),
- 0x8082E188:("func_8082E188",),
- 0x8082E1BC:("func_8082E1BC",),
+ 0x8082E078:("Player_GetFloorSfx",),
+ 0x8082E094:("Player_AnimSfx_PlayFloor",),
+ 0x8082E0CC:("Player_GetFloorSfxByAge",),
+ 0x8082E0F4:("Player_AnimSfx_PlayFloorByAge",),
+ 0x8082E12C:("Player_AnimSfx_PlayFloorWalk",),
+ 0x8082E188:("Player_AnimSfx_PlayFloorJump",),
+ 0x8082E1BC:("Player_AnimSfx_PlayFloorLand",),
0x8082E1F0:("func_8082E1F0",),
- 0x8082E224:("func_8082E224",),
+ 0x8082E224:("Player_PlayAnimSfx",),
0x8082E438:("func_8082E438",),
0x8082E4A4:("func_8082E4A4",),
0x8082E514:("func_8082E514",),
@@ -4309,22 +4309,22 @@
0x8082EF9C:("func_8082EF9C",),
0x8082EFE4:("func_8082EFE4",),
0x8082F02C:("func_8082F02C",),
- 0x8082F09C:("func_8082F09C",),
- 0x8082F0E4:("func_8082F0E4",),
+ 0x8082F09C:("Player_ResetCylinder",),
+ 0x8082F0E4:("Player_SetCylinderForAttack",),
0x8082F164:("func_8082F164",),
0x8082F1AC:("func_8082F1AC",),
0x8082F43C:("func_8082F43C",),
0x8082F470:("func_8082F470",),
- 0x8082F524:("func_8082F524",),
+ 0x8082F524:("Player_ItemToItemAction",),
0x8082F594:("func_8082F594",),
0x8082F5A4:("func_8082F5A4",),
0x8082F5C0:("func_8082F5C0",),
0x8082F5FC:("func_8082F5FC",),
- 0x8082F62C:("func_8082F62C",),
+ 0x8082F62C:("Player_SpawnExplosive",),
0x8082F7F4:("func_8082F7F4",),
0x8082F8A0:("func_8082F8A0",),
0x8082F8BC:("func_8082F8BC",),
- 0x8082F938:("func_8082F938",),
+ 0x8082F938:("Player_OverrideBlureColors",),
0x8082FA5C:("func_8082FA5C",),
0x8082FB68:("func_8082FB68",),
0x8082FBE8:("func_8082FBE8",),
@@ -4359,7 +4359,7 @@
0x808313A8:("func_808313A8",),
0x808313F0:("func_808313F0",),
0x80831454:("func_80831454",),
- 0x80831494:("func_80831494",),
+ 0x80831494:("Player_SetAction",),
0x8083172C:("func_8083172C",),
0x80831760:("func_80831760",),
0x808317C4:("func_808317C4",),
@@ -4420,16 +4420,16 @@
0x808354A4:("func_808354A4",),
0x808355D8:("func_808355D8",),
0x8083562C:("func_8083562C",),
- 0x80835BC8:("func_80835BC8",),
+ 0x80835BC8:("Player_TranslateAndRotateY",),
0x80835BF8:("func_80835BF8",),
- 0x80835C64:("func_80835C64",),
+ 0x80835C64:("Player_SpawnFairy",),
0x80835CD8:("func_80835CD8",),
0x80835D2C:("func_80835D2C",),
0x80835D58:("func_80835D58",),
0x80835DF8:("func_80835DF8",),
- 0x80835EAC:("func_80835EAC",),
- 0x8083604C:("func_8083604C",),
- 0x80836258:("func_80836258",),
+ 0x80835EAC:("Player_Door_Staircase",),
+ 0x8083604C:("Player_Door_Sliding",),
+ 0x80836258:("Player_Door_Knob",),
0x808365DC:("func_808365DC",),
0x80836888:("func_80836888",),
0x8083692C:("func_8083692C",),
@@ -4442,7 +4442,7 @@
0x80836C70:("func_80836C70",),
0x80836D8C:("func_80836D8C",),
0x80836DC0:("func_80836DC0",),
- 0x80836EA0:("func_80836EA0",),
+ 0x80836EA0:("Player_RequestQuake",),
0x80836F10:("func_80836F10",),
0x808370D4:("func_808370D4",),
0x80837134:("func_80837134",),
@@ -4464,7 +4464,7 @@
0x808381F8:("func_808381F8",),
0x8083827C:("func_8083827C",),
0x8083868C:("func_8083868C",),
- 0x80838760:("func_80838760",),
+ 0x80838760:("Player_StopCutscene",),
0x808387A0:("func_808387A0",),
0x80838830:("func_80838830",),
0x808388B8:("func_808388B8",),
@@ -4500,11 +4500,11 @@
0x8083A844:("func_8083A844",),
0x8083A878:("func_8083A878",),
0x8083A98C:("func_8083A98C",),
- 0x8083AD04:("func_8083AD04",),
- 0x8083AD8C:("func_8083AD8C",),
- 0x8083ADB8:("func_8083ADB8",),
+ 0x8083AD04:("Player_InitMode_Telescope",),
+ 0x8083AD8C:("Player_InitMode_B",),
+ 0x8083ADB8:("Player_InitMode_D",),
0x8083ADF0:("func_8083ADF0",),
- 0x8083AE38:("func_8083AE38",),
+ 0x8083AE38:("Player_InitMode_F",),
0x8083AECC:("func_8083AECC",),
0x8083AF30:("func_8083AF30",),
0x8083AF8C:("func_8083AF8C",),
@@ -4557,7 +4557,7 @@
0x8083E958:("func_8083E958",),
0x8083E9C4:("func_8083E9C4",),
0x8083EA44:("func_8083EA44",),
- 0x8083EBD0:("func_8083EBD0",),
+ 0x8083EBD0:("Player_ChooseIdleAnim",),
0x8083EE60:("func_8083EE60",),
0x8083F144:("func_8083F144",),
0x8083F190:("func_8083F190",),
@@ -4571,7 +4571,7 @@
0x8083FCF0:("func_8083FCF0",),
0x8083FD80:("func_8083FD80",),
0x8083FE38:("func_8083FE38",),
- 0x8083FE90:("func_8083FE90",),
+ 0x8083FE90:("Player_RequestQuakeAndRumble",),
0x8083FEF4:("func_8083FEF4",),
0x8083FF30:("func_8083FF30",),
0x8083FFEC:("func_8083FFEC",),
@@ -4590,33 +4590,33 @@
0x80840F34:("func_80840F34",),
0x80840F90:("func_80840F90",),
0x808411D4:("func_808411D4",),
- 0x808412A0:("func_808412A0",),
- 0x808412BC:("func_808412BC",),
+ 0x808412A0:("Player_InitMode_0",),
+ 0x808412BC:("Player_InitMode_2",),
0x80841358:("func_80841358",),
- 0x80841408:("func_80841408",),
- 0x808414E0:("func_808414E0",),
- 0x80841528:("func_80841528",),
- 0x808415A0:("func_808415A0",),
- 0x808415E4:("func_808415E4",),
- 0x80841624:("func_80841624",),
+ 0x80841408:("Player_InitMode_1",),
+ 0x808414E0:("Player_InitMode_3",),
+ 0x80841528:("Player_InitMode_4",),
+ 0x808415A0:("Player_InitMode_7",),
+ 0x808415E4:("Player_InitMode_5",),
+ 0x80841624:("Player_InitMode_6",),
0x80841744:("func_80841744",),
- 0x8084182C:("func_8084182C",),
+ 0x8084182C:("Player_InitCommon",),
0x80841A50:("func_80841A50",),
0x80841AC4:("Player_Init",),
0x80842510:("func_80842510",),
0x808425B4:("func_808425B4",),
- 0x808426F0:("func_808426F0",),
+ 0x808426F0:("Player_SetDoAction",),
0x808430E0:("func_808430E0",),
0x80843178:("func_80843178",),
- 0x80843EC0:("func_80843EC0",),
+ 0x80843EC0:("Player_UpdateCamAndSeqModes",),
0x808442D8:("func_808442D8",),
0x808445C4:("func_808445C4",),
- 0x808446F4:("func_808446F4",),
+ 0x808446F4:("Player_DetectSecrets",),
0x80844784:("func_80844784",),
0x80844D80:("func_80844D80",),
- 0x80844EF8:("func_80844EF8",),
+ 0x80844EF8:("Player_UpdateCommon",),
0x808460B8:("Player_Update",),
- 0x808463C0:("func_808463C0",),
+ 0x808463C0:("Player_DrawGameplay",),
0x80846460:("func_80846460",),
0x80846528:("Player_Draw",),
0x808470D4:("Player_Destroy",),
@@ -4834,7 +4834,7 @@
0x80859AF8:("func_80859AF8",),
0x80859B28:("func_80859B28",),
0x80859B54:("func_80859B54",),
- 0x80859BA8:("func_80859BA8",),
+ 0x80859BA8:("Player_Cutscene_Translate",),
0x80859C60:("func_80859C60",),
0x80859CA0:("func_80859CA0",),
0x80859CE0:("func_80859CE0",),
@@ -4845,7 +4845,7 @@
0x80859F4C:("func_80859F4C",),
0x80859FCC:("func_80859FCC",),
0x80859FF4:("func_80859FF4",),
- 0x8085A04C:("func_8085A04C",),
+ 0x8085A04C:("Player_Cutscene_TranslateReverse",),
0x8085A120:("func_8085A120",),
0x8085A144:("func_8085A144",),
0x8085A19C:("func_8085A19C",),
@@ -4869,19 +4869,19 @@
0x8085AA60:("func_8085AA60",),
0x8085AA84:("func_8085AA84",),
0x8085AACC:("func_8085AACC",),
- 0x8085AB58:("func_8085AB58",),
- 0x8085ABA8:("func_8085ABA8",),
+ 0x8085AB58:("Player_Cutscene_SetPosAndYawToStart",),
+ 0x8085ABA8:("Player_Cutscene_8085ABA8",),
0x8085AC9C:("func_8085AC9C",),
0x8085AD5C:("func_8085AD5C",),
0x8085ADA0:("func_8085ADA0",),
0x8085B08C:("func_8085B08C",),
- 0x8085B134:("func_8085B134",),
+ 0x8085B134:("Player_StartFishing",),
0x8085B170:("func_8085B170",),
- 0x8085B1F0:("func_8085B1F0",),
+ 0x8085B1F0:("Player_GrabPlayer",),
0x8085B28C:("func_8085B28C",),
0x8085B384:("func_8085B384",),
- 0x8085B3E0:("func_8085B3E0",),
- 0x8085B460:("func_8085B460",),
+ 0x8085B3E0:("Player_InflictDamage",),
+ 0x8085B460:("Player_TalkWithPlayer",),
0x8085B74C:("func_8085B74C",),
0x8085B820:("func_8085B820",),
0x8085B854:("func_8085B854",),
@@ -6033,7 +6033,7 @@
0x808BCDF0:("ItemBHeart_Init",),
0x808BCEA8:("ItemBHeart_Destroy",),
0x808BCEB8:("ItemBHeart_Update",),
- 0x808BCF54:("func_808BCF54",),
+ 0x808BCF54:("ItemBHeart_UpdateModel",),
0x808BCFC4:("ItemBHeart_Draw",),
0x808BD1E0:("EnDekunuts_Init",),
0x808BD31C:("EnDekunuts_Destroy",),
@@ -6504,7 +6504,7 @@
0x808E06B0:("DoorAna_Update",),
0x808E0704:("DoorAna_Draw",),
0x808E0830:("EnEncount1_Init",),
- 0x808E0954:("func_808E0954",),
+ 0x808E0954:("EnEncount1_SpawnActor",),
0x808E0DA8:("EnEncount1_Update",),
0x808E0E40:("DemoTreLgt_Init",),
0x808E0EBC:("DemoTreLgt_Destroy",),
@@ -8591,24 +8591,24 @@
0x8099BE48:("EnCrow_OverrideLimbDraw",),
0x8099BF20:("EnCrow_PostLimbDraw",),
0x8099BFA4:("EnCrow_Draw",),
- 0x8099C290:("func_8099C290",),
- 0x8099C328:("func_8099C328",),
- 0x8099C41C:("func_8099C41C",),
+ 0x8099C290:("EnCow_RotatePoint",),
+ 0x8099C328:("EnCow_SetColliderPos",),
+ 0x8099C41C:("EnCow_SetTailPos",),
0x8099C498:("EnCow_Init",),
0x8099C834:("EnCow_Destroy",),
- 0x8099C880:("func_8099C880",),
- 0x8099CAA8:("func_8099CAA8",),
- 0x8099CB20:("func_8099CB20",),
- 0x8099CB68:("func_8099CB68",),
- 0x8099CBCC:("func_8099CBCC",),
- 0x8099CC68:("func_8099CC68",),
- 0x8099CCF8:("func_8099CCF8",),
- 0x8099CDA0:("func_8099CDA0",),
- 0x8099CFAC:("func_8099CFAC",),
+ 0x8099C880:("EnCow_UpdateAnimation",),
+ 0x8099CAA8:("EnCow_TalkEnd",),
+ 0x8099CB20:("EnCow_GiveMilkEnd",),
+ 0x8099CB68:("EnCow_GiveMilkWait",),
+ 0x8099CBCC:("EnCow_GiveMilk",),
+ 0x8099CC68:("EnCow_CheckForEmptyBottle",),
+ 0x8099CCF8:("EnCow_Talk",),
+ 0x8099CDA0:("EnCow_Idle",),
+ 0x8099CFAC:("EnCow_DoTail",),
0x8099D144:("EnCow_Update",),
- 0x8099D3C0:("func_8099D3C0",),
- 0x8099D4AC:("func_8099D4AC",),
- 0x8099D4FC:("func_8099D4FC",),
+ 0x8099D3C0:("EnCow_UpdateTail",),
+ 0x8099D4AC:("EnCow_OverrideLimbDraw",),
+ 0x8099D4FC:("EnCow_PostLimbDraw",),
0x8099D53C:("EnCow_Draw",),
0x8099D59C:("func_8099D59C",),
0x8099D780:("OceffWipe4_Init",),
@@ -8997,37 +8997,37 @@
0x809C0E30:("EnWarpTag_GrottoReturn",),
0x809C0F18:("EnWarptag_Update",),
0x809C0F3C:("EnWarpTag_Draw",),
- 0x809C10B0:("func_809C10B0",),
- 0x809C1124:("func_809C1124",),
- 0x809C1158:("func_809C1158",),
- 0x809C11EC:("func_809C11EC",),
- 0x809C1304:("func_809C1304",),
- 0x809C1424:("func_809C1424",),
- 0x809C14D0:("func_809C14D0",),
- 0x809C15BC:("func_809C15BC",),
- 0x809C165C:("func_809C165C",),
- 0x809C16DC:("func_809C16DC",),
- 0x809C1C9C:("func_809C1C9C",),
- 0x809C1D64:("func_809C1D64",),
- 0x809C1EC8:("func_809C1EC8",),
- 0x809C2060:("func_809C2060",),
- 0x809C21E0:("func_809C21E0",),
- 0x809C2504:("func_809C2504",),
- 0x809C2594:("func_809C2594",),
- 0x809C25E4:("func_809C25E4",),
- 0x809C2680:("func_809C2680",),
- 0x809C26E4:("func_809C26E4",),
- 0x809C2730:("func_809C2730",),
- 0x809C2788:("func_809C2788",),
- 0x809C2824:("func_809C2824",),
- 0x809C28B8:("func_809C28B8",),
- 0x809C2A64:("func_809C2A64",),
- 0x809C2BE4:("func_809C2BE4",),
- 0x809C2C9C:("func_809C2C9C",),
- 0x809C2D0C:("func_809C2D0C",),
- 0x809C2EC4:("func_809C2EC4",),
- 0x809C2F34:("func_809C2F34",),
- 0x809C2FA0:("func_809C2FA0",),
+ 0x809C10B0:("EnAob01_Blink",),
+ 0x809C1124:("EnAob01_AdvanceTime",),
+ 0x809C1158:("EnAob01_InitializeDogPaths",),
+ 0x809C11EC:("EnAob01_SpawnDogs",),
+ 0x809C1304:("EnAob01_SpawnRacedogs",),
+ 0x809C1424:("EnAob01_ProcessLaughAnim",),
+ 0x809C14D0:("EnAob01_ProcessSurpriseAnim",),
+ 0x809C15BC:("EnAob01_ProcessIdleAnim",),
+ 0x809C165C:("EnAob01_UpdateCollision",),
+ 0x809C16DC:("EnAob01_BeforeRace_HandleConversation",),
+ 0x809C1C9C:("EnAob01_BeforeRace_StartRace",),
+ 0x809C1D64:("EnAob01_BeforeRace_RespondToPlayAgainQuestion",),
+ 0x809C1EC8:("EnAob01_UpdateCommon",),
+ 0x809C2060:("EnAob01_BeforeRace_Idle",),
+ 0x809C21E0:("EnAob01_BeforeRace_Talk",),
+ 0x809C2504:("EnAob01_Race_DogHasReachedNextCutsceneTrigger",),
+ 0x809C2594:("EnAob01_Race_FollowSelectedDog",),
+ 0x809C25E4:("EnAob01_Race_IsRaceOver",),
+ 0x809C2680:("EnAob01_Race_CurrentCutsceneHasEnded",),
+ 0x809C26E4:("EnAob01_Race_SkipNonRaceCutscene",),
+ 0x809C2730:("EnAob01_Race_HandleRaceCutscene",),
+ 0x809C2788:("EnAob01_Race_HandleRaceEndCutscene",),
+ 0x809C2824:("EnAob01_Race_StartCutscene",),
+ 0x809C28B8:("EnAob01_AfterRace_GiveRaceResult",),
+ 0x809C2A64:("EnAob01_AfterRace_GiveReward",),
+ 0x809C2BE4:("EnAob01_AfterRace_AfterGivingReward",),
+ 0x809C2C9C:("EnAob01_AfterRace_AskToPlayAgain",),
+ 0x809C2D0C:("EnAob01_AfterRace_Talk",),
+ 0x809C2EC4:("EnAob01_PlayerIsHoldingDog",),
+ 0x809C2F34:("EnAob01_Race_HidePlayer",),
+ 0x809C2FA0:("EnAob01_InitializeDogTextOffsets",),
0x809C3190:("EnAob01_Init",),
0x809C3350:("EnAob01_Destroy",),
0x809C339C:("EnAob01_Update",),
@@ -9710,7 +9710,7 @@
0x80A134B0:("func_80A134B0",),
0x80A134F4:("func_80A134F4",),
0x80A13564:("func_80A13564",),
- 0x80A136B8:("func_80A136B8",),
+ 0x80A136B8:("EnGo_RequestQuake",),
0x80A13728:("func_80A13728",),
0x80A137C0:("func_80A137C0",),
0x80A139E4:("func_80A139E4",),
@@ -10620,7 +10620,7 @@
0x80A53E60:("func_80A53E60",),
0x80A541F4:("func_80A541F4",),
0x80A54600:("func_80A54600",),
- 0x80A54980:("ObjHugebombiwa_AddQuake",),
+ 0x80A54980:("ObjHugebombiwa_RequestQuakeAndRumble",),
0x80A54A0C:("func_80A54A0C",),
0x80A54AC0:("ObjHugebombiwa_Init",),
0x80A54BC4:("ObjHugebombiwa_Destroy",),
@@ -11433,7 +11433,7 @@
0x80A9BC0C:("func_80A9BC0C",),
0x80A9BD24:("func_80A9BD24",),
0x80A9C058:("func_80A9C058",),
- 0x80A9C18C:("func_80A9C18C",),
+ 0x80A9C18C:("BgHakuginPost_RequestQuakeAndRumble",),
0x80A9C228:("func_80A9C228",),
0x80A9C634:("func_80A9C634",),
0x80A9C854:("func_80A9C854",),
@@ -12211,7 +12211,7 @@
0x80AD566C:("EnTrt2_TransformLimbDraw",),
0x80AD56E8:("func_80AD56E8",),
0x80AD5BB0:("ObjTokeiStep_SetSysMatrix",),
- 0x80AD5BE8:("ObjTokeiStep_AddQuake",),
+ 0x80AD5BE8:("ObjTokeiStep_RequestQuakeAndRumble",),
0x80AD5C70:("ObjTokeiStep_SpawnDust",),
0x80AD5DFC:("ObjTokeiStep_InitSteps",),
0x80AD5EB8:("ObjTokeiStep_InitStepsOpen",),
@@ -15199,7 +15199,7 @@
0x80BAA6D0:("EnSuttari_UpdateCollider",),
0x80BAA848:("EnSuttari_GetActorById",),
0x80BAA88C:("EnSuttari_TriggerTransition",),
- 0x80BAA8D0:("EnSuttari_UpdateTime",),
+ 0x80BAA8D0:("EnSuttari_AdvanceTime",),
0x80BAA904:("func_80BAA904",),
0x80BAA9B4:("func_80BAA9B4",),
0x80BAAA94:("func_80BAAA94",),
@@ -16662,7 +16662,7 @@
0x80C0A740:("func_80C0A740",),
0x80C0A804:("func_80C0A804",),
0x80C0A838:("func_80C0A838",),
- 0x80C0A86C:("func_80C0A86C",),
+ 0x80C0A86C:("BgIkninSusceil_RequestQuakeAndRumble",),
0x80C0A95C:("func_80C0A95C",),
0x80C0AA70:("BgIkninSusceil_Init",),
0x80C0AAE0:("BgIkninSusceil_Destroy",),
@@ -16868,13 +16868,13 @@
0x80C18928:("BgLastBwall_DoNothing",),
0x80C18938:("BgLastBwall_Update",),
0x80C1895C:("BgLastBwall_Draw",),
- 0x80C18B90:("func_80C18B90",),
- 0x80C18BD8:("func_80C18BD8",),
- 0x80C18C50:("func_80C18C50",),
+ 0x80C18B90:("EnAnd_ChangeAnimation",),
+ 0x80C18BD8:("EnAnd_Blink",),
+ 0x80C18C50:("EnAnd_HandleCsAction",),
0x80C18DC8:("EnAnd_Init",),
0x80C18E84:("EnAnd_Destroy",),
0x80C18E94:("EnAnd_Update",),
- 0x80C18ED0:("func_80C18ED0",),
+ 0x80C18ED0:("EnAnd_TransformLimbDraw",),
0x80C19084:("EnAnd_Draw",),
0x80C192A0:("func_80C192A0",),
0x80C192B0:("func_80C192B0",),
diff --git a/tools/disasm/variables.txt b/tools/disasm/variables.txt
index c325b8d4c..344ee509d 100644
--- a/tools/disasm/variables.txt
+++ b/tools/disasm/variables.txt
@@ -328,7 +328,7 @@
0x8009CD50:("sRandFloat","f32","",0x4),
0x8009CD60:("sArenaLockMsg","OSMesg","[1]",0x4),
0x8009CD70:("tmp_task","OSTask","",0x40),
- 0x8009CDB0:("osPifBuffers","OSPifRam","[4]",0x100),
+ 0x8009CDB0:("__MotorDataBuf","OSPifRam","[4]",0x100),
0x8009CEB0:("siAccessBuf","OSMesg","[1]",0x4),
0x8009CEB8:("__osSiAccessQueue","OSMesgQueue","",0x18),
0x8009CED0:("__osContPifRam","OSPifRam","",0x40),
@@ -472,19 +472,6 @@
0x801B48B0:("sSetNormal0ModeBoomerangData","UNK_TYPE1","",0x1),
0x801B48D4:("sSetNormal0ModeSlingshotData","UNK_TYPE1","",0x1),
0x801B48F8:("sSetNormal0ModeClimbZData","UNK_TYPE1","",0x1),
- 0x801B4710:("sSetNormal0ModeNormalData","UNK_TYPE1","",0x1),
- 0x801B4738:("sSetNormal0ModeTargetData","UNK_TYPE1","",0x1),
- 0x801B4768:("sSetNormal0ModeFollowTargetData","UNK_TYPE1","",0x1),
- 0x801B4798:("sSetNormal0ModeBattleData","UNK_TYPE1","",0x1),
- 0x801B47CC:("sSetNormal0ModeFirstPersonData","UNK_TYPE1","",0x1),
- 0x801B47F0:("sSetNormal0ModeTalkData","UNK_TYPE1","",0x1),
- 0x801B4824:("sSetNormal0ModeClimbData","UNK_TYPE1","",0x1),
- 0x801B4848:("sSetNormal0ModeBowArrowData","UNK_TYPE1","",0x1),
- 0x801B486C:("sSetNormal0ModeBowArrowZData","UNK_TYPE1","",0x1),
- 0x801B4890:("sSetNormal0ModeHookshotData","UNK_TYPE1","",0x1),
- 0x801B48B0:("sSetNormal0ModeBoomerangData","UNK_TYPE1","",0x1),
- 0x801B48D4:("sSetNormal0ModeSlingshotData","UNK_TYPE1","",0x1),
- 0x801B48F8:("sSetNormal0ModeClimbZData","UNK_TYPE1","",0x1),
0x801B491C:("sSetNormal0ModeJumpData","UNK_TYPE1","",0x1),
0x801B4944:("sSetNormal0ModeHangData","UNK_TYPE1","",0x1),
0x801B4974:("sSetNormal0ModeHangZData","UNK_TYPE1","",0x1),
@@ -1326,13 +1313,13 @@
0x801C0EA0:("D_801C0EA0","UNK_TYPE1","",0x1),
0x801C0EAC:("sSheathLimbModelShieldOnBackPos","Vec3f","",0xC),
0x801C0EB8:("sSheathLimbModelShieldOnBackZyxRot","Vec3s","",0x6),
- 0x801C0EC0:("sIsQuakeInitialized","UNK_TYPE2","",0x2),
+ 0x801C0EC0:("sQuakeUnused","UNK_TYPE2","",0x2),
0x801C0EC4:("sQuakeRequestCount","s16","",0x2),
0x801C0EC8:("sQuakeCallbacks","quake_callback_func","[7]",0x1c),
0x801C0EE4:("D_801C0EE4","s16","",0x2),
0x801C0EE8:("D_801C0EE8","s16","",0x2),
0x801C0EEC:("D_801C0EEC","s16","",0x2),
- 0x801C0EF0:("sSetupDL","Gfx","[438]",0xdb0),
+ 0x801C0EF0:("gSetupDLs","Gfx","[438]",0xdb0),
0x801C1CA0:("sFillSetupDL","Gfx","[12]",0x60),
0x801C1D00:("gEmptyDL","Gfx","[1]",0x8),
0x801C1D10:("sZeroVec","Vec3f","",0xc),
@@ -2193,9 +2180,9 @@
0x801D1520:("gScreenWidth","s32","",0x4),
0x801D1524:("gScreenHeight","s32","",0x4),
0x801D1528:("startHeapSize","UNK_TYPE4","",0x4),
- 0x801D1530:("padmgrContext","PadMgr*","",0x4),
- 0x801D1534:("controllerInputsCaptured","UNK_TYPE4","",0x4),
- 0x801D1538:("D_801D1538","UNK_TYPE4","",0x4),
+ 0x801D1530:("sPadMgrInstance","PadMgr*","",0x4),
+ 0x801D1534:("sPadMgrRetraceCount","UNK_TYPE4","",0x4),
+ 0x801D1538:("sVoiceInitStatus","UNK_TYPE4","",0x4),
0x801D1540:("D_801D1540","UNK_PTR","",0x4),
0x801D1570:("D_801D1570","f32","[13]",0x34),
0x801D15B0:("gZeroVec3f","Vec3f","",0xC),
@@ -3850,7 +3837,7 @@
0x801ED8D8:("D_801ED8D8","UNK_TYPE1","",0x1),
0x801ED8DC:("D_801ED8DC","UNK_TYPE1","",0x1),
0x801ED8E0:("D_801ED8E0","Mtx","",0x40),
- 0x801ED920:("D_801ED920","UNK_TYPE1","",0x1),
+ 0x801ED920:("D_801ED920","Actor*","",0x1),
0x801ED930:("D_801ED930","FaultClient","",0x10),
0x801ED940:("sActorOverlayTableFaultAddrConvClient","FaultAddrConvClient","",0xC),
0x801ED950:("D_801ED950","char","[80]",0x50),
@@ -3867,9 +3854,9 @@
0x801EDBA8:("D_801EDBA8","Sphere16","",0x8),
0x801EDBB0:("D_801EDBB0","TriNorm","",0x34),
0x801EDBF0:("D_801EDBF0","s16","",0x2),
- 0x801EDBF4:("D_801EDBF4","f32","",0x4),
- 0x801EDBF8:("D_801EDBF8","f32","",0x4),
- 0x801EDC00:("D_801EDC00","CameraCollision","",0x28),
+ 0x801EDBF4:("sFloorYNear","f32","",0x4),
+ 0x801EDBF8:("sFloorYFar","f32","",0x4),
+ 0x801EDC00:("sFarColChk","CameraCollision","",0x28),
0x801EDC28:("sCamPlayState","PlayState*","",0x4),
0x801EDC30:("D_801EDC30","SwingAnimation","[4]",0x1A0),
0x801EDDD0:("D_801EDDD0","Vec3f","",0xc),
@@ -4006,7 +3993,7 @@
0x801F59E8:("sPlayerGetItemRefPos","Vec3f","",0xC),
0x801F59F4:("sPlayerLeftHandType","s32","",0x4),
0x801F59F8:("sPlayerRightHandType","s32","",0x4),
- 0x801F5A00:("sQuakeRequest","QuakeRequest","[4]",0x90),
+ 0x801F5A00:("sQuakeRequests","QuakeRequest","[4]",0x90),
0x801F5A90:("sDistortionRequest","DistortionRequest","",0xc),
0x801F5AA0:("sMatAnimStep","s32","",0x4),
0x801F5AA4:("sMatAnimFlags","u32","",0x4),
@@ -4305,7 +4292,7 @@
0x801FD598:("sCustomSequencePc","UNK_TYPE1","",0x1),
0x801FD5A0:("D_801FD5A0","UNK_TYPE1","",0x1),
0x801FD5A4:("D_801FD5A4","UNK_TYPE1","",0x1),
- 0x801FD5B8:("D_801FD5B8","UNK_TYPE1","",0x1),
+ 0x801FD5B8:("gVoiceHandle","UNK_TYPE1","",0x1),
0x801FD5C4:("D_801FD5C4","UNK_TYPE1","",0x1),
0x801FD5C8:("D_801FD5C8","UNK_TYPE1","",0x1),
0x801FD5E8:("D_801FD5E8","UNK_TYPE1","",0x1),
@@ -4727,12 +4714,12 @@
0x8082B6F0:("sPromptAlphaTargets","UNK_TYPE1","",0x1),
0x8082B6F4:("sPromptAlphaTargetIndex","UNK_TYPE2","",0x2),
0x8082B6F8:("sPromptAlphaTimer","UNK_TYPE2","",0x2),
- 0x8082B700:("D_8082B700","UNK_TYPE1","",0x1),
- 0x8082B73C:("D_8082B73C","UNK_TYPE1","",0x1),
- 0x8082B778:("D_8082B778","UNK_TYPE1","",0x1),
- 0x8082B7B4:("D_8082B7B4","UNK_TYPE1","",0x1),
- 0x8082B7F0:("D_8082B7F0","UNK_TYPE2","",0x2),
- 0x8082B838:("D_8082B838","UNK_TYPE2","",0x2),
+ 0x8082B700:("sMaskPageBgTextures","UNK_TYPE1","",0x1),
+ 0x8082B73C:("sItemPageBgTextures","UNK_TYPE1","",0x1),
+ 0x8082B778:("sMapPageBgTextures","UNK_TYPE1","",0x1),
+ 0x8082B7B4:("sQuestPageBgTextures","UNK_TYPE1","",0x1),
+ 0x8082B7F0:("gVtxPageMapWorldQuadsWidth","UNK_TYPE2","",0x2),
+ 0x8082B838:("gVtxPageMapWorldQuadsHeight","UNK_TYPE2","",0x2),
0x8082B880:("sGameOverPrimR","UNK_TYPE2","",0x2),
0x8082B884:("sGameOverPrimG","UNK_TYPE2","",0x2),
0x8082B888:("sGameOverPrimB","UNK_TYPE2","",0x2),
@@ -4759,10 +4746,10 @@
0x8082B920:("D_8082B920","UNK_TYPE2","",0x2),
0x8082B924:("D_8082B924","UNK_TYPE2","",0x2),
0x8082B944:("sGameOverRectPosY","UNK_TYPE2","",0x2),
- 0x8082B948:("D_8082B948","UNK_TYPE2","",0x2),
- 0x8082B96C:("D_8082B96C","UNK_TYPE2","",0x2),
- 0x8082B990:("D_8082B990","UNK_TYPE2","",0x2),
- 0x8082B994:("D_8082B994","UNK_TYPE2","",0x2),
+ 0x8082B948:("sCursorPrimColorTarget","UNK_TYPE2","",0x2),
+ 0x8082B96C:("sCursorEnvColorTarget","UNK_TYPE2","",0x2),
+ 0x8082B990:("sCursorColorTimer","UNK_TYPE2","",0x2),
+ 0x8082B994:("sCursorColorTargetIndex","UNK_TYPE2","",0x2),
0x8082B998:("D_8082B998","UNK_TYPE1","",0x1),
0x8082B9A8:("D_8082B9A8","UNK_TYPE1","",0x1),
0x8082B9B8:("D_8082B9B8","UNK_TYPE1","",0x1),
@@ -4771,33 +4758,33 @@
0x8082B9D0:("D_8082B9D0","UNK_TYPE1","",0x1),
0x8082B9E0:("D_8082B9E0","UNK_TYPE2","",0x2),
0x8082B9E4:("D_8082B9E4","UNK_TYPE2","",0x2),
- 0x8082B9E8:("D_8082B9E8","UNK_TYPE1","",0x1),
- 0x8082B9EC:("D_8082B9EC","UNK_TYPE1","",0x1),
- 0x8082B9F0:("D_8082B9F0","UNK_TYPE1","",0x1),
- 0x8082B9FC:("D_8082B9FC","UNK_TYPE1","",0x1),
- 0x8082BA00:("D_8082BA00","UNK_TYPE1","",0x1),
- 0x8082BA48:("D_8082BA48","UNK_TYPE1","",0x1),
- 0x8082BA54:("D_8082BA54","UNK_TYPE1","",0x1),
- 0x8082BA58:("D_8082BA58","UNK_TYPE1","",0x1),
- 0x8082BA5C:("D_8082BA5C","UNK_TYPE1","",0x1),
- 0x8082BA68:("D_8082BA68","UNK_TYPE1","",0x1),
- 0x8082BA6C:("D_8082BA6C","UNK_TYPE1","",0x1),
- 0x8082BA78:("D_8082BA78","UNK_TYPE1","",0x1),
- 0x8082BA7C:("D_8082BA7C","UNK_TYPE1","",0x1),
- 0x8082BA80:("D_8082BA80","UNK_TYPE1","",0x1),
- 0x8082BA8C:("D_8082BA8C","UNK_TYPE1","",0x1),
- 0x8082BA90:("D_8082BA90","UNK_TYPE1","",0x1),
- 0x8082BAD8:("D_8082BAD8","UNK_TYPE1","",0x1),
- 0x8082BAE4:("D_8082BAE4","UNK_TYPE1","",0x1),
- 0x8082BAE8:("D_8082BAE8","UNK_TYPE1","",0x1),
- 0x8082BAEC:("D_8082BAEC","UNK_TYPE1","",0x1),
- 0x8082BAF8:("D_8082BAF8","UNK_TYPE1","",0x1),
- 0x8082BAFC:("D_8082BAFC","UNK_TYPE1","",0x1),
- 0x8082BB08:("D_8082BB08","UNK_PTR","",0x4),
- 0x8082BB20:("D_8082BB20","UNK_PTR","",0x4),
- 0x8082BB38:("D_8082BB38","UNK_PTR","",0x4),
- 0x8082BB50:("D_8082BB50","UNK_PTR","",0x4),
- 0x8082BB68:("D_8082BB68","UNK_TYPE2","",0x2),
+ 0x8082B9E8:("sVtxPageMaskQuadsX","UNK_TYPE1","",0x1),
+ 0x8082B9EC:("sVtxPageItemQuadsX","UNK_TYPE1","",0x1),
+ 0x8082B9F0:("sVtxPageMapDungeonQuadsX","UNK_TYPE1","",0x1),
+ 0x8082B9FC:("sVtxPageQuestQuadsX","UNK_TYPE1","",0x1),
+ 0x8082BA00:("sVtxPageMapWorldQuadsX","UNK_TYPE1","",0x1),
+ 0x8082BA48:("sVtxPagePromptQuadsX","UNK_TYPE1","",0x1),
+ 0x8082BA54:("sVtxPageMaskQuadsWidth","UNK_TYPE1","",0x1),
+ 0x8082BA58:("sVtxPageItemQuadsWidth","UNK_TYPE1","",0x1),
+ 0x8082BA5C:("sVtxPageMapDungeonQuadsWidth","UNK_TYPE1","",0x1),
+ 0x8082BA68:("sVtxPageQuestQuadsWidth","UNK_TYPE1","",0x1),
+ 0x8082BA6C:("sVtxPagePromptQuadsWidth","UNK_TYPE1","",0x1),
+ 0x8082BA78:("sVtxPageMaskQuadsY","UNK_TYPE1","",0x1),
+ 0x8082BA7C:("sVtxPageItemQuadsY","UNK_TYPE1","",0x1),
+ 0x8082BA80:("sVtxPageMapDungeonQuadsY","UNK_TYPE1","",0x1),
+ 0x8082BA8C:("sVtxPageQuestQuadsY","UNK_TYPE1","",0x1),
+ 0x8082BA90:("sVtxPageMapWorldQuadsY","UNK_TYPE1","",0x1),
+ 0x8082BAD8:("sVtxPagePromptQuadsY","UNK_TYPE1","",0x1),
+ 0x8082BAE4:("sVtxPageMaskQuadsHeight","UNK_TYPE1","",0x1),
+ 0x8082BAE8:("sVtxPageItemQuadsHeight","UNK_TYPE1","",0x1),
+ 0x8082BAEC:("sVtxPageMapDungeonQuadsHeight","UNK_TYPE1","",0x1),
+ 0x8082BAF8:("sVtxPageQuestQuadsHeight","UNK_TYPE1","",0x1),
+ 0x8082BAFC:("sVtxPagePromptQuadsHeight","UNK_TYPE1","",0x1),
+ 0x8082BB08:("sVtxPageQuadsX","UNK_PTR","",0x4),
+ 0x8082BB20:("sVtxPageQuadsWidth","UNK_PTR","",0x4),
+ 0x8082BB38:("sVtxPageQuadsY","UNK_PTR","",0x4),
+ 0x8082BB50:("sVtxPageQuadsHeight","UNK_PTR","",0x4),
+ 0x8082BB68:("sVtxPageGameOverSaveQuadsY","UNK_TYPE2","",0x2),
0x8082BB74:("sQuestVtxRectLeft","UNK_TYPE2","",0x2),
0x8082BBC4:("sQuestVtxRectTop","UNK_TYPE2","",0x2),
0x8082BC14:("sQuestVtxWidths","UNK_TYPE2","",0x2),
@@ -4954,52 +4941,9 @@
0x8085B9F0:("D_8085B9F0","UNK_TYPE1","",0x1),
0x8085BA08:("D_8085BA08","UNK_TYPE1","",0x1),
0x8085BA20:("D_8085BA20","UNK_TYPE1","",0x1),
- 0x8085BA38:("D_8085BA38","UNK_TYPE1","",0x1),
- 0x8085BE84:("D_8085BE84","UNK_TYPE1","",0x1),
- 0x8085BE9C:("D_8085BE9C","UNK_TYPE1","",0x1),
- 0x8085BEB4:("D_8085BEB4","UNK_TYPE1","",0x1),
- 0x8085BECC:("D_8085BECC","UNK_TYPE1","",0x1),
- 0x8085BEE4:("D_8085BEE4","UNK_TYPE1","",0x1),
- 0x8085BEFC:("D_8085BEFC","UNK_TYPE1","",0x1),
- 0x8085BF14:("D_8085BF14","UNK_TYPE1","",0x1),
- 0x8085BF44:("D_8085BF44","UNK_TYPE1","",0x1),
- 0x8085BF5C:("D_8085BF5C","UNK_TYPE1","",0x1),
- 0x8085BF74:("D_8085BF74","UNK_TYPE1","",0x1),
- 0x8085BF8C:("D_8085BF8C","UNK_TYPE1","",0x1),
- 0x8085BFA4:("D_8085BFA4","UNK_TYPE1","",0x1),
- 0x8085BFBC:("D_8085BFBC","UNK_TYPE1","",0x1),
- 0x8085BFD4:("D_8085BFD4","UNK_TYPE1","",0x1),
- 0x8085BFEC:("D_8085BFEC","UNK_TYPE1","",0x1),
- 0x8085C004:("D_8085C004","UNK_TYPE1","",0x1),
- 0x8085C01C:("D_8085C01C","UNK_TYPE1","",0x1),
- 0x8085C034:("D_8085C034","UNK_TYPE1","",0x1),
- 0x8085C04C:("D_8085C04C","UNK_TYPE1","",0x1),
- 0x8085C064:("D_8085C064","UNK_TYPE1","",0x1),
- 0x8085C07C:("D_8085C07C","UNK_TYPE1","",0x1),
- 0x8085C094:("D_8085C094","UNK_TYPE1","",0x1),
- 0x8085C0C4:("D_8085C0C4","UNK_TYPE1","",0x1),
- 0x8085C0DC:("D_8085C0DC","UNK_TYPE1","",0x1),
- 0x8085C0F4:("D_8085C0F4","UNK_TYPE1","",0x1),
- 0x8085C10C:("D_8085C10C","UNK_TYPE1","",0x1),
- 0x8085C124:("D_8085C124","UNK_TYPE1","",0x1),
- 0x8085C13C:("D_8085C13C","UNK_TYPE1","",0x1),
- 0x8085C154:("D_8085C154","UNK_TYPE1","",0x1),
- 0x8085C16C:("D_8085C16C","UNK_TYPE1","",0x1),
- 0x8085C184:("D_8085C184","UNK_TYPE1","",0x1),
- 0x8085C19C:("D_8085C19C","UNK_TYPE1","",0x1),
- 0x8085C1B4:("D_8085C1B4","UNK_TYPE1","",0x1),
- 0x8085C1CC:("D_8085C1CC","UNK_TYPE1","",0x1),
- 0x8085C1E4:("D_8085C1E4","UNK_TYPE1","",0x1),
- 0x8085C1FC:("D_8085C1FC","UNK_TYPE1","",0x1),
- 0x8085C214:("D_8085C214","UNK_TYPE1","",0x1),
- 0x8085C22C:("D_8085C22C","UNK_TYPE1","",0x1),
- 0x8085C244:("D_8085C244","UNK_TYPE1","",0x1),
- 0x8085C25C:("D_8085C25C","UNK_TYPE1","",0x1),
- 0x8085C274:("D_8085C274","UNK_TYPE1","",0x1),
- 0x8085C28C:("D_8085C28C","UNK_TYPE1","",0x1),
- 0x8085C2A4:("D_8085C2A4","UNK_TYPE4","",0x4),
- 0x8085C2A8:("D_8085C2A8","UNK_TYPE4","",0x4),
- 0x8085C2AC:("D_8085C2AC","UNK_TYPE4","",0x4),
+ 0x8085BA38:("sPlayerAgeProperties","UNK_TYPE1","",0x1),
+ 0x8085BE84:("D_8085BE84","LinkAnimationHeader*","[264]",0x420),
+ 0x8085C2A4:("D_8085C2A4","struct_8085C2A4","[6]",0x48),
0x8085C2EC:("D_8085C2EC","UNK_TYPE1","",0x1),
0x8085C318:("D_8085C318","UNK_TYPE1","",0x1),
0x8085C344:("D_8085C344","UNK_TYPE1","",0x1),
@@ -5007,9 +4951,8 @@
0x8085C3E4:("D_8085C3E4","f32","",0x4),
0x8085C3E8:("D_8085C3E8","f32","",0x4),
0x8085C3EC:("D_8085C3EC","UNK_TYPE2","",0x2),
- 0x8085C3F4:("D_8085C3F4","UNK_TYPE1","",0x1),
- 0x8085C84C:("D_8085C84C","UNK_TYPE4","",0x4),
- 0x8085C850:("D_8085C850","UNK_TYPE4","",0x4),
+ 0x8085C3F4:("sGetItemTable","GetItemEntry","[0xB9]",0x456),
+ 0x8085C84C:("sPlayerIdleAnimations","UNK_TYPE4","",0x78),
0x8085C8C4:("D_8085C8C4","UNK_TYPE1","",0x1),
0x8085C8C8:("D_8085C8C8","UNK_TYPE1","",0x1),
0x8085C8CC:("D_8085C8CC","UNK_TYPE1","",0x1),
@@ -5020,19 +4963,17 @@
0x8085C90C:("D_8085C90C","UNK_TYPE1","",0x1),
0x8085C91C:("D_8085C91C","UNK_TYPE1","",0x1),
0x8085C924:("D_8085C924","UNK_TYPE1","",0x1),
- 0x8085C928:("D_8085C928","UNK_TYPE1","",0x1),
- 0x8085C938:("D_8085C938","UNK_TYPE1","",0x1),
+ 0x8085C928:("D_8085C928","UNK_TYPE1","",0x14),
+ 0x8085C93C:("D_8085C93C","UNK_TYPE1","",0x1),
0x8085C96C:("D_8085C96C","UNK_TYPE1","",0x1),
0x8085C98C:("D_8085C98C","UNK_TYPE1","",0x1),
- 0x8085C99C:("D_8085C99C","UNK_TYPE1","",0x1),
+ 0x8085C99C:("sItemActionParams","UNK_TYPE1","",0x1),
0x8085C9F0:("D_8085C9F0","UNK_PTR","",0x4),
0x8085CB3C:("D_8085CB3C","UNK_PTR","",0x4),
0x8085CC88:("D_8085CC88","UNK_TYPE1","",0x1),
- 0x8085CD00:("D_8085CD00","UNK_TYPE1","",0x1),
- 0x8085CD24:("D_8085CD24","UNK_TYPE1","",0x1),
- 0x8085CD30:("D_8085CD30","UNK_TYPE1","",0x1),
- 0x8085CE30:("D_8085CE30","UNK_TYPE1","",0x1),
- 0x8085CE60:("D_8085CE60","UNK_TYPE1","",0x1),
+ 0x8085CD00:("D_8085CD00","s8","[36]",0x24),
+ 0x8085CD24:("sPlayerExplosiveInfo","UNK_TYPE1","",0x1),
+ 0x8085CD30:("sMeleeAttackAnimInfo","UNK_TYPE1","",0x220),
0x8085CF50:("D_8085CF50","UNK_TYPE1","",0x1),
0x8085CF58:("D_8085CF58","UNK_TYPE1","",0x1),
0x8085CF60:("D_8085CF60","UNK_TYPE1","",0x1),
@@ -5041,10 +4982,10 @@
0x8085CF78:("D_8085CF78","UNK_TYPE1","",0x1),
0x8085CF80:("D_8085CF80","UNK_TYPE1","",0x1),
0x8085CF84:("D_8085CF84","UNK_TYPE1","",0x1),
- 0x8085CF88:("D_8085CF88","UNK_TYPE1","",0x1),
- 0x8085CFA8:("D_8085CFA8","UNK_TYPE2","",0x2),
- 0x8085CFAE:("D_8085CFAE","UNK_TYPE1","",0x1),
- 0x8085CFB8:("D_8085CFB8","UNK_TYPE1","",0x1),
+ 0x8085CF88:("D_8085CF88","BlureColors","[2]",0x20),
+ 0x8085CFA8:("D_8085CFA8","u16","[4]",0x8),
+ 0x8085CFB0:("D_8085CFB0","UNK_TYPE1","",0x1),
+ 0x8085CFB8:("sMagicArrowCosts","u8","[4]",0x4),
0x8085CFBC:("D_8085CFBC","UNK_TYPE1","",0x1),
0x8085CFC4:("D_8085CFC4","UNK_TYPE1","",0x1),
0x8085CFCC:("D_8085CFCC","UNK_TYPE1","",0x1),
@@ -5064,47 +5005,42 @@
0x8085D050:("D_8085D050","UNK_TYPE1","",0x1),
0x8085D054:("D_8085D054","UNK_PTR","",0x4),
0x8085D090:("D_8085D090","UNK_TYPE1","",0x1),
- 0x8085D094:("D_8085D094","UNK_TYPE1","",0x1),
- 0x8085D097:("D_8085D097","UNK_TYPE1","",0x1),
+ 0x8085D094:("D_8085D094","UNK_TYPE1","",0x6),
0x8085D09C:("D_8085D09C","UNK_TYPE4","",0x4),
0x8085D0D4:("D_8085D0D4","UNK_TYPE1","",0x1),
0x8085D0E4:("D_8085D0E4","UNK_TYPE1","",0x1),
0x8085D0F4:("D_8085D0F4","UNK_TYPE4","",0x4),
- 0x8085D0F8:("D_8085D0F8","UNK_TYPE1","",0x1),
+ 0x8085D0F8:("sReturnEntranceGroupData","s16","[1]",0x2),
+ 0x8085D0FA:("sReturnEntranceGroupIndices","u8","[1]",0x1),
0x8085D100:("D_8085D100","UNK_TYPE1","",0x1),
- 0x8085D10C:("D_8085D10C","f32","",0x4),
- 0x8085D114:("D_8085D114","f32","",0x4),
+ 0x8085D10C:("D_8085D10C","Vec3f","",0xC),
0x8085D118:("D_8085D118","UNK_TYPE1","",0x1),
0x8085D124:("D_8085D124","UNK_TYPE1","",0x1),
- 0x8085D130:("D_8085D130","UNK_TYPE1","",0x1),
- 0x8085D134:("D_8085D134","f32","",0x4),
- 0x8085D13C:("D_8085D13C","UNK_TYPE1","",0x1),
+ 0x8085D130:("D_8085D130","Vec3f","",0xC),
+ 0x8085D13C:("sFallImpactInfos","UNK_TYPE1","",0x1),
0x8085D148:("D_8085D148","UNK_TYPE1","",0x1),
0x8085D154:("D_8085D154","UNK_TYPE1","",0x1),
0x8085D160:("D_8085D160","UNK_TYPE1","",0x1),
- 0x8085D174:("D_8085D174","UNK_TYPE1","",0x1),
+ 0x8085D174:("sPlayerMass","u8","[5]",0x5),
0x8085D17C:("D_8085D17C","UNK_TYPE1","",0x1),
0x8085D190:("D_8085D190","UNK_TYPE1","",0x1),
0x8085D1A4:("D_8085D1A4","UNK_TYPE1","",0x1),
0x8085D1F8:("D_8085D1F8","UNK_TYPE1","",0x1),
0x8085D200:("D_8085D200","UNK_TYPE4","",0x4),
0x8085D218:("D_8085D218","UNK_TYPE1","",0x1),
- 0x8085D224:("D_8085D224","UNK_TYPE1","",0x1),
- 0x8085D23C:("D_8085D23C","UNK_TYPE1","",0x1),
- 0x8085D252:("D_8085D252","UNK_TYPE1","",0x1),
+ 0x8085D224:("D_8085D224","UNK_TYPE1","",0x30),
+ 0x8085D254:("D_8085D254","u16","[4]",0x8),
0x8085D25C:("D_8085D25C","UNK_TYPE1","",0x1),
0x8085D264:("D_8085D264","UNK_TYPE1","",0x1),
0x8085D26C:("D_8085D26C","UNK_TYPE1","",0x1),
0x8085D270:("D_8085D270","UNK_TYPE1","",0x1),
- 0x8085D27C:("D_8085D27C","f32","",0x4),
- 0x8085D284:("D_8085D284","f32","",0x4),
- 0x8085D288:("D_8085D288","UNK_TYPE1","",0x1),
- 0x8085D28C:("D_8085D28C","f32","",0x4),
+ 0x8085D27C:("D_8085D27C","Vec3f","",0xC),
+ 0x8085D288:("D_8085D288","Vec3f","",0xC),
0x8085D294:("D_8085D294","UNK_TYPE1","",0x1),
0x8085D2A4:("D_8085D2A4","UNK_TYPE1","",0x1),
0x8085D2B0:("D_8085D2B0","UNK_TYPE1","",0x1),
0x8085D2B4:("D_8085D2B4","UNK_TYPE1","",0x1),
- 0x8085D2C0:("D_8085D2C0","ActorInitVar","",0x4),
+ 0x8085D2C0:("sInitChain","ActorInitVar","",0x4),
0x8085D2C4:("D_8085D2C4","UNK_TYPE4","",0x4),
0x8085D2CC:("D_8085D2CC","UNK_PTR","",0x4),
0x8085D30C:("D_8085D30C","EffectBlureInit2","",0x24),
@@ -5114,9 +5050,7 @@
0x8085D340:("D_8085D340","UNK_TYPE1","",0x1),
0x8085D34C:("D_8085D34C","UNK_TYPE1","",0x1),
0x8085D354:("D_8085D354","UNK_TYPE1","",0x1),
- 0x8085D358:("D_8085D358","UNK_TYPE1","",0x1),
- 0x8085D35C:("D_8085D35C","f32","",0x4),
- 0x8085D360:("D_8085D360","f32","",0x4),
+ 0x8085D358:("D_8085D358","Vec3f","",0xC),
0x8085D364:("D_8085D364","UNK_TYPE1","",0x1),
0x8085D370:("D_8085D370","UNK_TYPE1","",0x1),
0x8085D37C:("D_8085D37C","UNK_TYPE1","",0x1),
@@ -5126,8 +5060,8 @@
0x8085D3F4:("D_8085D3F4","UNK_TYPE1","",0x1),
0x8085D3F8:("D_8085D3F8","UNK_TYPE1","",0x1),
0x8085D3FC:("D_8085D3FC","UNK_TYPE4","",0x4),
- 0x8085D404:("D_8085D404","UNK_TYPE1","",0x1),
- 0x8085D410:("D_8085D410","UNK_TYPE1","",0x1),
+ 0x8085D404:("sWaterConveyorSpeeds","UNK_TYPE1","",0x1),
+ 0x8085D410:("sFloorConveyorSpeeds","UNK_TYPE1","",0x1),
0x8085D41C:("D_8085D41C","UNK_TYPE1","",0x1),
0x8085D428:("D_8085D428","UNK_TYPE1","",0x1),
0x8085D450:("D_8085D450","UNK_TYPE1","",0x1),
@@ -5145,32 +5079,28 @@
0x8085D574:("D_8085D574","UNK_TYPE4","",0x4),
0x8085D580:("D_8085D580","UNK_TYPE1","",0x1),
0x8085D584:("D_8085D584","UNK_TYPE1","",0x1),
- 0x8085D588:("D_8085D588","UNK_TYPE1","",0x1),
- 0x8085D5A0:("D_8085D5A0","UNK_TYPE1","",0x1),
- 0x8085D5B8:("D_8085D5B8","UNK_TYPE1","",0x1),
+ 0x8085D588:("D_8085D588","Vec3f","[2]",0x18),
+ 0x8085D5A0:("D_8085D5A0","Vec3f","[2]",0x18),
+ 0x8085D5B8:("D_8085D5B8","Vec3f","[2]",0x18),
0x8085D5D0:("D_8085D5D0","UNK_TYPE1","",0x1),
0x8085D5DC:("D_8085D5DC","UNK_TYPE1","",0x1),
0x8085D5E0:("D_8085D5E0","UNK_TYPE1","",0x1),
0x8085D5E4:("D_8085D5E4","UNK_TYPE1","",0x1),
- 0x8085D5F0:("D_8085D5F0","UNK_TYPE1","",0x1),
- 0x8085D5FA:("D_8085D5FA","UNK_TYPE1","",0x1),
- 0x8085D604:("D_8085D604","UNK_TYPE1","",0x1),
- 0x8085D60C:("D_8085D60C","UNK_TYPE1","",0x1),
- 0x8085D61C:("D_8085D61C","UNK_TYPE1","",0x1),
- 0x8085D62C:("D_8085D62C","f32","",0x4),
- 0x8085D630:("D_8085D630","f32","",0x4),
- 0x8085D634:("D_8085D634","f32","",0x4),
- 0x8085D638:("D_8085D638","f32","",0x4),
- 0x8085D640:("D_8085D640","f32","",0x4),
- 0x8085D644:("D_8085D644","UNK_TYPE1","",0x1),
- 0x8085D64C:("D_8085D64C","f32","",0x4),
+ 0x8085D5F0:("D_8085D5F0","UNK_TYPE1","",0xC),
+ 0x8085D5FC:("D_8085D5FC","UNK_TYPE1","",0x1),
+ 0x8085D604:("D_8085D604","UNK_TYPE1","",0x8),
+ 0x8085D60C:("D_8085D60C","UNK_TYPE1","",0x10),
+ 0x8085D61C:("D_8085D61C","UNK_TYPE1","",0x10),
+ 0x8085D62C:("D_8085D62C","Vec3f","",0xC),
+ 0x8085D638:("D_8085D638","Vec3f","",0xC),
+ 0x8085D644:("D_8085D644","Vec3f","",0xC),
0x8085D650:("D_8085D650","UNK_TYPE1","",0x1),
0x8085D658:("D_8085D658","UNK_TYPE1","",0x1),
0x8085D660:("D_8085D660","UNK_TYPE1","",0x1),
0x8085D66C:("D_8085D66C","UNK_TYPE4","",0x4),
0x8085D674:("D_8085D674","UNK_TYPE4","",0x4),
- 0x8085D67C:("D_8085D67C","UNK_TYPE1","",0x1),
- 0x8085D680:("D_8085D680","UNK_TYPE1","",0x1),
+ 0x8085D67C:("D_8085D67C","UNK_TYPE1","",0xC),
+ 0x8085D688:("D_8085D688","UNK_TYPE1","",0x1),
0x8085D6A4:("D_8085D6A4","UNK_TYPE1","",0x1),
0x8085D6D0:("D_8085D6D0","UNK_PTR","",0x4),
0x8085D6DC:("D_8085D6DC","UNK_TYPE1","",0x1),
@@ -5181,18 +5111,16 @@
0x8085D73C:("D_8085D73C","UNK_TYPE1","",0x1),
0x8085D74C:("D_8085D74C","UNK_TYPE1","",0x1),
0x8085D75C:("D_8085D75C","UNK_TYPE1","",0x1),
- 0x8085D764:("D_8085D764","UNK_TYPE1","",0x1),
- 0x8085D76D:("D_8085D76D","UNK_TYPE1","",0x1),
+ 0x8085D764:("D_8085D764","Vec3f","",0xC),
0x8085D770:("D_8085D770","UNK_TYPE1","",0x1),
0x8085D77C:("D_8085D77C","UNK_TYPE1","",0x1),
0x8085D788:("D_8085D788","UNK_TYPE1","",0x1),
- 0x8085D78C:("D_8085D78C","UNK_TYPE1","",0x1),
- 0x8085D797:("D_8085D797","UNK_TYPE1","",0x1),
+ 0x8085D78C:("D_8085D78C","Color_RGBA8","",0x4),
+ 0x8085D790:("D_8085D790","u8","[6]",0x6),
0x8085D798:("D_8085D798","UNK_TYPE2","",0x2),
- 0x8085D7EC:("D_8085D7EC","UNK_TYPE1","",0x1),
- 0x8085D7F8:("D_8085D7F8","UNK_TYPE1","",0x1),
- 0x8085D800:("D_8085D800","f32","",0x4),
- 0x8085D804:("D_8085D804","UNK_TYPE1","",0x1),
+ 0x8085D7EC:("D_8085D7EC","Vec3f","",0xC),
+ 0x8085D7F8:("D_8085D7F8","Vec3f","",0xC),
+ 0x8085D804:("D_8085D804","s8","[5]",0x5),
0x8085D80C:("D_8085D80C","UNK_TYPE1","",0x1),
0x8085D838:("D_8085D838","UNK_TYPE1","",0x1),
0x8085D840:("D_8085D840","UNK_TYPE1","",0x1),
@@ -5202,18 +5130,14 @@
0x8085D904:("D_8085D904","UNK_TYPE1","",0x1),
0x8085D908:("D_8085D908","UNK_TYPE1","",0x1),
0x8085D910:("D_8085D910","UNK_TYPE1","",0x1),
- 0x8085D918:("D_8085D918","UNK_TYPE1","",0x1),
- 0x8085D91C:("D_8085D91C","f32","",0x4),
- 0x8085D924:("D_8085D924","UNK_TYPE1","",0x1),
- 0x8085D928:("D_8085D928","f32","",0x4),
+ 0x8085D918:("D_8085D918","Vec3f","",0xC),
+ 0x8085D924:("D_8085D924","Vec3f","",0xC),
0x8085D930:("D_8085D930","UNK_TYPE1","",0x1),
0x8085D934:("D_8085D934","UNK_TYPE1","",0x1),
0x8085D938:("D_8085D938","UNK_TYPE4","",0x4),
0x8085D93C:("D_8085D93C","UNK_TYPE4","",0x4),
- 0x8085D940:("D_8085D940","f32","",0x4),
- 0x8085D948:("D_8085D948","f32","",0x4),
- 0x8085D94C:("D_8085D94C","f32","",0x4),
- 0x8085D954:("D_8085D954","f32","",0x4),
+ 0x8085D940:("D_8085D940","Vec3f","",0xC),
+ 0x8085D94C:("D_8085D94C","Vec3f","",0xC),
0x8085D958:("D_8085D958","UNK_TYPE1","",0x1),
0x8085D960:("D_8085D960","UNK_TYPE1","",0x1),
0x8085D96C:("D_8085D96C","UNK_TYPE1","",0x1),
@@ -5457,20 +5381,18 @@
0x8085E6EC:("D_8085E6EC","f32","",0x4),
0x8085E6F0:("D_8085E6F0","f32","",0x4),
0x8085E6F4:("D_8085E6F4","f32","",0x4),
- 0x80862AF0:("D_80862AF0","UNK_TYPE1","",0x1),
- 0x80862AF4:("D_80862AF4","f32","",0x4),
- 0x80862AF8:("D_80862AF8","f32","",0x4),
+ 0x80862AF0:("sDogSpawnPos","Vec3f","",0xC),
0x80862AFC:("D_80862AFC","f32","",0x4),
0x80862B00:("D_80862B00","UNK_TYPE1","",0x1),
0x80862B02:("D_80862B02","UNK_TYPE1","",0x1),
0x80862B04:("D_80862B04","UNK_TYPE1","",0x1),
- 0x80862B08:("D_80862B08","UNK_TYPE1","",0x1),
- 0x80862B0C:("D_80862B0C","UNK_TYPE1","",0x1),
- 0x80862B10:("D_80862B10","UNK_TYPE1","",0x1),
- 0x80862B14:("D_80862B14","UNK_TYPE1","",0x1),
+ 0x80862B08:("sPlayerCurrentFloorType","UNK_TYPE1","",0x1),
+ 0x80862B0C:("sPlayerCurrentWallFlags","UNK_TYPE1","",0x1),
+ 0x80862B10:("sPlayerConveyorSpeedIndex","UNK_TYPE1","",0x1),
+ 0x80862B14:("sPlayerIsOnFloorConveyor","UNK_TYPE1","",0x1),
0x80862B16:("D_80862B16","UNK_TYPE1","",0x1),
0x80862B18:("D_80862B18","f32","",0x4),
- 0x80862B1C:("D_80862B1C","UNK_TYPE1","",0x1),
+ 0x80862B1C:("sPlayerPrevFloorProperty","UNK_TYPE1","",0x1),
0x80862B20:("D_80862B20","UNK_TYPE1","",0x1),
0x80862B24:("D_80862B24","UNK_TYPE1","",0x1),
0x80862B28:("D_80862B28","UNK_TYPE1","",0x1),
@@ -5478,7 +5400,7 @@
0x80862B30:("D_80862B30","UNK_TYPE1","",0x1),
0x80862B3C:("D_80862B3C","f32","",0x4),
0x80862B40:("D_80862B40","UNK_TYPE1","",0x1),
- 0x80862B44:("D_80862B44","UNK_TYPE1","",0x1),
+ 0x80862B44:("sPlayerControlInput","UNK_TYPE1","",0x1),
0x80862B48:("D_80862B48","UNK_TYPE1","",0x1),
0x80862B4C:("D_80862B4C","UNK_TYPE1","",0x1),
0x80862B50:("D_80862B50","UNK_TYPE1","",0x1),
@@ -5679,8 +5601,8 @@
0x80872E8C:("D_80872E8C","UNK_TYPE1","",0x1),
0x80872E90:("D_80872E90","UNK_TYPE4","",0x4),
0x80872E94:("D_80872E94","UNK_TYPE4","",0x4),
- 0x80872E98:("D_80872E98","UNK_TYPE1","",0x1),
- 0x80872E9C:("D_80872E9C","UNK_TYPE1","",0x1),
+ 0x80872E98:("sQuakeY","UNK_TYPE1","",0x1),
+ 0x80872E9C:("sQuakeDurations","UNK_TYPE1","",0x1),
0x80872EA0:("D_80872EA0","UNK_TYPE4","",0x4),
0x80872EAC:("D_80872EAC","UNK_TYPE4","",0x4),
0x80872EB8:("D_80872EB8","UNK_TYPE4","",0x4),
@@ -6548,7 +6470,7 @@
0x808BCD44:("D_808BCD44","f32","",0x4),
0x808BCDE0:("sNumLitTorchesInGroup","UNK_TYPE1","",0x1),
0x808BD160:("Item_B_Heart_InitVars","UNK_TYPE1","",0x1),
- 0x808BD180:("D_808BD180","UNK_TYPE1","",0x1),
+ 0x808BD180:("sInitChain","UNK_TYPE1","",0x1),
0x808BD190:("D_808BD190","f32","",0x4),
0x808BEF10:("En_Dekunuts_InitVars","UNK_TYPE1","",0x1),
0x808BEF30:("D_808BEF30","UNK_TYPE1","",0x1),
@@ -7667,11 +7589,11 @@
0x80911E30:("sSinkingLurePos","Vec3f","[20]",0xF0),
0x80911F20:("D_80911F20","UNK_TYPE1","",0x1),
0x80911F24:("sProjectedW","f32","",0x4),
- 0x80911F28:("sCameraEye","Vec3f","",0xC),
- 0x80911F38:("sCameraAt","Vec3f","",0xC),
- 0x80911F44:("sCameraId","s32","",0x4),
+ 0x80911F28:("sSubCamEye","Vec3f","",0xC),
+ 0x80911F38:("sSubCamAt","Vec3f","",0xC),
+ 0x80911F44:("sSubCamId","s32","",0x4),
0x80911F48:("D_80911F48","f32","",0x4),
- 0x80911F4C:("D_80911F4C","f32","",0x4),
+ 0x80911F4C:("sSubCamVelFactor","f32","",0x4),
0x80911F50:("D_80911F50","UNK_TYPE1","",0x1),
0x80911F58:("sSinkingLureBasePos","Vec3f","",0xC),
0x80911F64:("D_80911F64","f32","",0x4),
@@ -9860,11 +9782,11 @@
0x809C3770:("En_Aob_01_InitVars","UNK_TYPE1","",0x1),
0x809C3790:("sAnimationInfo","UNK_TYPE4","",0x4),
0x809C3820:("D_809C3820","UNK_TYPE1","",0x1),
- 0x809C384C:("D_809C384C","UNK_TYPE4","",0x4),
+ 0x809C384C:("sDogInfo","UNK_TYPE4","",0x4),
0x809C392C:("D_809C392C","UNK_TYPE1","",0x1),
0x809C394C:("D_809C394C","UNK_TYPE4","",0x4),
0x809C395C:("D_809C395C","UNK_PTR","",0x4),
- 0x809C3968:("D_809C3968","UNK_TYPE1","",0x1),
+ 0x809C3968:("sFocusOffset","UNK_TYPE1","",0x1),
0x809C3980:("D_809C3980","f32","",0x4),
0x809C3984:("D_809C3984","f32","",0x4),
0x809C3988:("D_809C3988","f32","",0x4),
diff --git a/tools/gitable.py b/tools/gitable.py
new file mode 100755
index 000000000..dad39638f
--- /dev/null
+++ b/tools/gitable.py
@@ -0,0 +1,1171 @@
+#!/usr/bin/env python3
+import argparse
+from cgitb import text
+import dataclasses
+import os
+import struct
+import sys
+import typing
+
+GETITEMENTRY_FORMAT = ">BBbBH"
+GETITEMENTRY_LENGTH = struct.calcsize(GETITEMENTRY_FORMAT)
+
+# MM US: 0x2E964
+
+itemId_names = {
+ 0x00: "ITEM_OCARINA",
+ 0x01: "ITEM_BOW",
+ 0x02: "ITEM_ARROW_FIRE",
+ 0x03: "ITEM_ARROW_ICE",
+ 0x04: "ITEM_ARROW_LIGHT",
+ 0x05: "ITEM_OCARINA_FAIRY",
+ 0x06: "ITEM_BOMB",
+ 0x07: "ITEM_BOMBCHU",
+ 0x08: "ITEM_STICK",
+ 0x09: "ITEM_NUT",
+ 0x0A: "ITEM_MAGIC_BEANS",
+ 0x0B: "ITEM_SLINGSHOT",
+ 0x0C: "ITEM_POWDER_KEG",
+ 0x0D: "ITEM_PICTO_BOX",
+ 0x0E: "ITEM_LENS",
+ 0x0F: "ITEM_HOOKSHOT",
+ 0x10: "ITEM_SWORD_GREAT_FAIRY",
+ 0x11: "ITEM_LONGSHOT",
+ 0x12: "ITEM_BOTTLE",
+ 0x13: "ITEM_POTION_RED",
+ 0x14: "ITEM_POTION_GREEN",
+ 0x15: "ITEM_POTION_BLUE",
+ 0x16: "ITEM_FAIRY",
+ 0x17: "ITEM_DEKU_PRINCESS",
+ 0x18: "ITEM_MILK_BOTTLE",
+ 0x19: "ITEM_MILK_HALF",
+ 0x1A: "ITEM_FISH",
+ 0x1B: "ITEM_BUG",
+ 0x1C: "ITEM_BLUE_FIRE",
+ 0x1D: "ITEM_POE",
+ 0x1E: "ITEM_BIG_POE",
+ 0x1F: "ITEM_SPRING_WATER",
+ 0x20: "ITEM_HOT_SPRING_WATER",
+ 0x21: "ITEM_ZORA_EGG",
+ 0x22: "ITEM_GOLD_DUST",
+ 0x23: "ITEM_MUSHROOM",
+ 0x24: "ITEM_SEAHORSE",
+ 0x25: "ITEM_CHATEAU",
+ 0x26: "ITEM_HYLIAN_LOACH",
+ 0x27: "ITEM_OBABA_DRINK",
+ 0x28: "ITEM_MOON_TEAR",
+ 0x29: "ITEM_DEED_LAND",
+ 0x2A: "ITEM_DEED_SWAMP",
+ 0x2B: "ITEM_DEED_MOUNTAIN",
+ 0x2C: "ITEM_DEED_OCEAN",
+ 0x2D: "ITEM_ROOM_KEY",
+ 0x2E: "ITEM_LETTER_MAMA",
+ 0x2F: "ITEM_LETTER_TO_KAFEI",
+ 0x30: "ITEM_PENDANT_OF_MEMORIES",
+ 0x31: "ITEM_TINGLE_MAP",
+ 0x32: "ITEM_MASK_DEKU",
+ 0x33: "ITEM_MASK_GORON",
+ 0x34: "ITEM_MASK_ZORA",
+ 0x35: "ITEM_MASK_FIERCE_DEITY",
+ 0x36: "ITEM_MASK_TRUTH",
+ 0x37: "ITEM_MASK_KAFEIS_MASK",
+ 0x38: "ITEM_MASK_ALL_NIGHT",
+ 0x39: "ITEM_MASK_BUNNY",
+ 0x3A: "ITEM_MASK_KEATON",
+ 0x3B: "ITEM_MASK_GARO",
+ 0x3C: "ITEM_MASK_ROMANI",
+ 0x3D: "ITEM_MASK_CIRCUS_LEADER",
+ 0x3E: "ITEM_MASK_POSTMAN",
+ 0x3F: "ITEM_MASK_COUPLE",
+ 0x40: "ITEM_MASK_GREAT_FAIRY",
+ 0x41: "ITEM_MASK_GIBDO",
+ 0x42: "ITEM_MASK_DON_GERO",
+ 0x43: "ITEM_MASK_KAMARO",
+ 0x44: "ITEM_MASK_CAPTAIN",
+ 0x45: "ITEM_MASK_STONE",
+ 0x46: "ITEM_MASK_BREMEN",
+ 0x47: "ITEM_MASK_BLAST",
+ 0x48: "ITEM_MASK_SCENTS",
+ 0x49: "ITEM_MASK_GIANT",
+ 0x4A: "ITEM_BOW_ARROW_FIRE",
+ 0x4B: "ITEM_BOW_ARROW_ICE",
+ 0x4C: "ITEM_BOW_ARROW_LIGHT",
+ 0x4D: "ITEM_SWORD_KOKIRI",
+ 0x4E: "ITEM_SWORD_RAZOR",
+ 0x4F: "ITEM_SWORD_GILDED",
+ 0x50: "ITEM_SWORD_DEITY",
+ 0x51: "ITEM_SHIELD_HERO",
+ 0x52: "ITEM_SHIELD_MIRROR",
+ 0x53: "ITEM_QUIVER_30",
+ 0x54: "ITEM_QUIVER_40",
+ 0x55: "ITEM_QUIVER_50",
+ 0x56: "ITEM_BOMB_BAG_20",
+ 0x57: "ITEM_BOMB_BAG_30",
+ 0x58: "ITEM_BOMB_BAG_40",
+ 0x59: "ITEM_WALLET_DEFAULT",
+ 0x5A: "ITEM_WALLET_ADULT",
+ 0x5B: "ITEM_WALLET_GIANT",
+ 0x5C: "ITEM_FISHING_POLE",
+ 0x5D: "ITEM_REMAINS_ODOLWA",
+ 0x5E: "ITEM_REMAINS_GOHT",
+ 0x5F: "ITEM_REMAINS_GYORG",
+ 0x60: "ITEM_REMAINS_TWINMOLD",
+ 0x61: "ITEM_SONG_SONATA",
+ 0x62: "ITEM_SONG_LULLABY",
+ 0x63: "ITEM_SONG_NOVA",
+ 0x64: "ITEM_SONG_ELEGY",
+ 0x65: "ITEM_SONG_OATH",
+ 0x66: "ITEM_SONG_SARIA",
+ 0x67: "ITEM_SONG_TIME",
+ 0x68: "ITEM_SONG_HEALING",
+ 0x69: "ITEM_SONG_EPONA",
+ 0x6A: "ITEM_SONG_SOARING",
+ 0x6B: "ITEM_SONG_STORMS",
+ 0x6C: "ITEM_SONG_SUN",
+ 0x6D: "ITEM_BOMBERS_NOTEBOOK",
+ 0x6E: "ITEM_SKULL_TOKEN",
+ 0x6F: "ITEM_HEART_CONTAINER",
+ 0x70: "ITEM_HEART_PIECE",
+ 0x73: "ITEM_SONG_LULLABY_INTRO" ,
+ 0x74: "ITEM_KEY_BOSS",
+ 0x75: "ITEM_COMPASS",
+ 0x76: "ITEM_DUNGEON_MAP",
+ 0x77: "ITEM_STRAY_FAIRIES",
+ 0x78: "ITEM_KEY_SMALL",
+ 0x79: "ITEM_MAGIC_SMALL",
+ 0x7A: "ITEM_MAGIC_LARGE",
+ 0x7B: "ITEM_HEART_PIECE_2",
+ 0x7C: "ITEM_INVALID_1",
+ 0x7D: "ITEM_INVALID_2",
+ 0x7E: "ITEM_INVALID_3",
+ 0x7F: "ITEM_INVALID_4",
+ 0x80: "ITEM_INVALID_5",
+ 0x81: "ITEM_INVALID_6",
+ 0x82: "ITEM_INVALID_7",
+ 0x83: "ITEM_RECOVERY_HEART",
+ 0x84: "ITEM_RUPEE_GREEN",
+ 0x85: "ITEM_RUPEE_BLUE",
+ 0x86: "ITEM_RUPEE_10",
+ 0x87: "ITEM_RUPEE_RED",
+ 0x88: "ITEM_RUPEE_PURPLE",
+ 0x89: "ITEM_RUPEE_SILVER",
+ 0x8A: "ITEM_RUPEE_HUGE",
+ 0x8B: "ITEM_STICKS_5",
+ 0x8C: "ITEM_STICKS_10",
+ 0x8D: "ITEM_NUTS_5",
+ 0x8E: "ITEM_NUTS_10",
+ 0x8F: "ITEM_BOMBS_5",
+ 0x90: "ITEM_BOMBS_10",
+ 0x91: "ITEM_BOMBS_20",
+ 0x92: "ITEM_BOMBS_30",
+ 0x93: "ITEM_ARROWS_10",
+ 0x94: "ITEM_ARROWS_30",
+ 0x95: "ITEM_ARROWS_40",
+ 0x96: "ITEM_ARROWS_50",
+ 0x97: "ITEM_BOMBCHUS_20",
+ 0x98: "ITEM_BOMBCHUS_10",
+ 0x99: "ITEM_BOMBCHUS_1",
+ 0x9A: "ITEM_BOMBCHUS_5",
+ 0x9B: "ITEM_STICK_UPGRADE_20",
+ 0x9C: "ITEM_STICK_UPGRADE_30",
+ 0x9D: "ITEM_NUT_UPGRADE_30",
+ 0x9E: "ITEM_NUT_UPGRADE_40",
+ 0x9F: "ITEM_CHATEAU_2",
+ 0xA0: "ITEM_MILK",
+ 0xA1: "ITEM_GOLD_DUST_2",
+ 0xA2: "ITEM_HYLIAN_LOACH_2",
+ 0xA3: "ITEM_SEAHORSE_CAUGHT",
+ 0xF0: "ITEM_F0" ,
+ 0xF1: "ITEM_F1",
+ 0xF2: "ITEM_F2",
+ 0xFC: "ITEM_FC" ,
+ 0xFD: "ITEM_FD",
+ 0xFE: "ITEM_FE",
+ 0xFF: "ITEM_NONE",
+}
+
+getItemId_names = {
+ 0x00: "GI_NONE",
+ 0x01: "GI_RUPEE_GREEN",
+ 0x02: "GI_RUPEE_BLUE",
+ 0x03: "GI_RUPEE_10",
+ 0x04: "GI_RUPEE_RED",
+ 0x05: "GI_RUPEE_PURPLE",
+ 0x06: "GI_RUPEE_SILVER",
+ 0x07: "GI_RUPEE_HUGE",
+ 0x08: "GI_WALLET_ADULT",
+ 0x09: "GI_WALLET_GIANT",
+ 0x0A: "GI_RECOVERY_HEART",
+ 0x0C: "GI_HEART_PIECE",
+ 0x0D: "GI_HEART_CONTAINER",
+ 0x0E: "GI_MAGIC_SMALL",
+ 0x0F: "GI_MAGIC_LARGE",
+ 0x11: "GI_STRAY_FAIRY",
+ 0x14: "GI_BOMBS_1",
+ 0x15: "GI_BOMBS_5",
+ 0x16: "GI_BOMBS_10",
+ 0x17: "GI_BOMBS_20",
+ 0x18: "GI_BOMBS_30",
+ 0x19: "GI_STICKS_1",
+ 0x1A: "GI_BOMBCHUS_10",
+ 0x1B: "GI_BOMB_BAG_20",
+ 0x1C: "GI_BOMB_BAG_30",
+ 0x1D: "GI_BOMB_BAG_40",
+ 0x1E: "GI_ARROWS_10",
+ 0x1F: "GI_ARROWS_30",
+ 0x20: "GI_ARROWS_40",
+ 0x21: "GI_ARROWS_50",
+ 0x22: "GI_QUIVER_30",
+ 0x23: "GI_QUIVER_40",
+ 0x24: "GI_QUIVER_50",
+ 0x25: "GI_ARROW_FIRE",
+ 0x26: "GI_ARROW_ICE",
+ 0x27: "GI_ARROW_LIGHT",
+ 0x28: "GI_NUTS_1",
+ 0x29: "GI_NUTS_5",
+ 0x2A: "GI_NUTS_10",
+ 0x2E: "GI_BOMBCHUS_20",
+ 0x32: "GI_SHIELD_HERO",
+ 0x33: "GI_SHIELD_MIRROR",
+ 0x34: "GI_POWDER_KEG",
+ 0x35: "GI_MAGIC_BEANS",
+ 0x36: "GI_BOMBCHUS_1",
+ 0x37: "GI_SWORD_KOKIRI",
+ 0x38: "GI_SWORD_RAZOR",
+ 0x39: "GI_SWORD_GILDED",
+ 0x3A: "GI_BOMBCHUS_5",
+ 0x3B: "GI_SWORD_GREAT_FAIRY",
+ 0x3C: "GI_KEY_SMALL",
+ 0x3D: "GI_KEY_BOSS",
+ 0x3E: "GI_MAP",
+ 0x3F: "GI_COMPASS",
+ 0x40: "GI_40",
+ 0x41: "GI_HOOKSHOT",
+ 0x42: "GI_LENS",
+ 0x43: "GI_PICTO_BOX",
+ 0x4C: "GI_OCARINA",
+ 0x50: "GI_BOMBERS_NOTEBOOK",
+ 0x52: "GI_SKULL_TOKEN",
+ 0x55: "GI_REMAINS_ODOLWA",
+ 0x56: "GI_REMAINS_GOHT",
+ 0x57: "GI_REMAINS_GYORG",
+ 0x58: "GI_REMAINS_TWINMOLD",
+ 0x59: "GI_POTION_RED_BOTTLE",
+ 0x5A: "GI_BOTTLE",
+ 0x5B: "GI_POTION_RED",
+ 0x5C: "GI_POTION_GREEN",
+ 0x5D: "GI_POTION_BLUE",
+ 0x5E: "GI_FAIRY",
+ 0x5F: "GI_DEKU_PRINCESS",
+ 0x60: "GI_MILK_BOTTLE",
+ 0x61: "GI_MILK_HALF",
+ 0x62: "GI_FISH",
+ 0x63: "GI_BUG",
+ 0x64: "GI_BLUE_FIRE",
+ 0x65: "GI_POE",
+ 0x66: "GI_BIG_POE",
+ 0x67: "GI_SPRING_WATER",
+ 0x68: "GI_HOT_SPRING_WATER",
+ 0x69: "GI_ZORA_EGG",
+ 0x6A: "GI_GOLD_DUST",
+ 0x6B: "GI_MUSHROOM",
+ 0x6C: "GI_6C",
+ 0x6D: "GI_6D",
+ 0x6E: "GI_SEAHORSE",
+ 0x6F: "GI_CHATEAU_BOTTLE",
+ 0x70: "GI_70",
+ 0x75: "GI_75",
+ 0x76: "GI_ICE_TRAP",
+ 0x78: "GI_MASK_DEKU",
+ 0x79: "GI_MASK_GORON",
+ 0x7A: "GI_MASK_ZORA",
+ 0x7B: "GI_MASK_FIERCE_DEITY",
+ 0x7C: "GI_MASK_CAPTAIN",
+ 0x7D: "GI_MASK_GIANT",
+ 0x7E: "GI_MASK_ALL_NIGHT",
+ 0x7F: "GI_MASK_BUNNY",
+ 0x80: "GI_MASK_KEATON",
+ 0x81: "GI_MASK_GARO",
+ 0x82: "GI_MASK_ROMANI",
+ 0x83: "GI_MASK_CIRCUS_LEADER",
+ 0x84: "GI_MASK_POSTMAN",
+ 0x85: "GI_MASK_COUPLE",
+ 0x86: "GI_MASK_GREAT_FAIRY",
+ 0x87: "GI_MASK_GIBDO",
+ 0x88: "GI_MASK_DON_GERO",
+ 0x89: "GI_MASK_KAMARO",
+ 0x8A: "GI_MASK_TRUTH",
+ 0x8B: "GI_MASK_STONE",
+ 0x8C: "GI_MASK_BREMEN",
+ 0x8D: "GI_MASK_BLAST",
+ 0x8E: "GI_MASK_SCENTS",
+ 0x8F: "GI_MASK_KAFEIS_MASK",
+ 0x91: "GI_CHATEAU",
+ 0x92: "GI_MILK",
+ 0x93: "GI_GOLD_DUST_2",
+ 0x94: "GI_HYLIAN_LOACH",
+ 0x95: "GI_SEAHORSE_CAUGHT",
+ 0x96: "GI_MOON_TEAR",
+ 0x97: "GI_DEED_LAND",
+ 0x98: "GI_DEED_SWAMP",
+ 0x99: "GI_DEED_MOUNTAIN",
+ 0x9A: "GI_DEED_OCEAN",
+ 0x9B: "GI_SWORD_GREAT_FAIRY_STOLEN",
+ 0x9C: "GI_SWORD_KOKIRI_STOLEN",
+ 0x9D: "GI_SWORD_RAZOR_STOLEN",
+ 0x9E: "GI_SWORD_GILDED_STOLEN",
+ 0x9F: "GI_SHIELD_HERO_STOLEN",
+ 0xA0: "GI_ROOM_KEY",
+ 0xA1: "GI_LETTER_TO_MAMA",
+ 0xA2: "GI_A2",
+ 0xA3: "GI_A3",
+ 0xA4: "GI_A4",
+ 0xA5: "GI_A5",
+ 0xA6: "GI_A6",
+ 0xA7: "GI_A7",
+ 0xA8: "GI_A8",
+ 0xA9: "GI_BOTTLE_STOLEN",
+ 0xAA: "GI_LETTER_TO_KAFEI",
+ 0xAB: "GI_PENDANT_OF_MEMORIES",
+ 0xB4: "GI_TINGLE_MAP_CLOCK_TOWN",
+ 0xB5: "GI_TINGLE_MAP_WOODFALL",
+ 0xB6: "GI_TINGLE_MAP_SNOWHEAD",
+ 0xB7: "GI_TINGLE_MAP_ROMANI_RANCH",
+ 0xB8: "GI_TINGLE_MAP_GREAT_BAY",
+ 0xB9: "GI_TINGLE_MAP_STONE_TOWER",
+ 0xBA: "GI_MAX" # I pity the fool
+}
+
+getItemDrawId_names = {
+ 0x00: "GID_BOTTLE",
+ 0x01: "GID_KEY_SMALL",
+ 0x02: "GID_MASK_KAMARO",
+ 0x03: "GID_MASK_COUPLE",
+ 0x04: "GID_04",
+ 0x05: "GID_05",
+ 0x06: "GID_06",
+ 0x07: "GID_07",
+ 0x08: "GID_RECOVERY_HEART",
+ 0x09: "GID_KEY_BOSS",
+ 0x0A: "GID_COMPASS",
+ 0x0B: "GID_BOMBERS_NOTEBOOK",
+ 0x0C: "GID_MASK_STONE",
+ 0x0D: "GID_MASK_KAFEIS_MASK",
+ 0x0E: "GID_MASK_CIRCUS_LEADER",
+ 0x0F: "GID_MASK_BREMEN",
+ 0x10: "GID_MASK_ALL_NIGHT",
+ 0x11: "GID_NUTS",
+ 0x12: "GID_HEART_CONTAINER",
+ 0x13: "GID_HEART_PIECE",
+ 0x14: "GID_QUIVER_30",
+ 0x15: "GID_QUIVER_40",
+ 0x16: "GID_QUIVER_50",
+ 0x17: "GID_BOMB_BAG_20",
+ 0x18: "GID_BOMB_BAG_30",
+ 0x19: "GID_BOMB_BAG_40",
+ 0x1A: "GID_STICK",
+ 0x1B: "GID_DUNGEON_MAP",
+ 0x1C: "GID_MAGIC_SMALL",
+ 0x1D: "GID_MAGIC_LARGE",
+ 0x1E: "GID_BOMB",
+ 0x1F: "GID_STONE_OF_AGONY",
+ 0x20: "GID_WALLET_ADULT",
+ 0x21: "GID_WALLET_GIANT",
+ 0x22: "GID_MASK_DON_GERO",
+ 0x23: "GID_ARROWS_SMALL",
+ 0x24: "GID_ARROWS_MEDIUM",
+ 0x25: "GID_ARROWS_LARGE",
+ 0x26: "GID_BOMBCHU",
+ 0x27: "GID_SHIELD_HERO",
+ 0x28: "GID_HOOKSHOT",
+ 0x29: "GID_29",
+ 0x2A: "GID_OCARINA",
+ 0x2B: "GID_MILK",
+ 0x2C: "GID_MASK_KEATON",
+ 0x2D: "GID_TINGLE_MAP",
+ 0x2E: "GID_BOW",
+ 0x2F: "GID_LENS",
+ 0x30: "GID_POTION_GREEN",
+ 0x31: "GID_POTION_RED",
+ 0x32: "GID_POTION_BLUE",
+ 0x33: "GID_SHIELD_MIRROR",
+ 0x34: "GID_MAGIC_BEANS",
+ 0x35: "GID_FISH",
+ 0x36: "GID_LETTER_MAMA",
+ 0x37: "GID_37",
+ 0x38: "GID_SWORD_BGS",
+ 0x39: "GID_MASK_SUN",
+ 0x3A: "GID_MASK_BLAST",
+ 0x3B: "GID_FAIRY",
+ 0x3C: "GID_MASK_SCENTS",
+ 0x3D: "GID_MASK_CAPTAIN",
+ 0x3E: "GID_MASK_BUNNY",
+ 0x3F: "GID_MASK_TRUTH",
+ 0x40: "GID_DEED_SWAMP",
+ 0x41: "GID_DEED_MOUNTAIN",
+ 0x42: "GID_RUPEE_HUGE",
+ 0x43: "GID_DEED_OCEAN",
+ 0x44: "GID_MASK_GORON",
+ 0x45: "GID_MASK_ZORA",
+ 0x46: "GID_46",
+ 0x47: "GID_ARROW_FIRE",
+ 0x48: "GID_ARROW_ICE",
+ 0x49: "GID_ARROW_LIGHT",
+ 0x4A: "GID_SKULL_TOKEN",
+ 0x4B: "GID_BUG",
+ 0x4C: "GID_4C",
+ 0x4D: "GID_POE",
+ 0x4E: "GID_FAIRY_2",
+ 0x4F: "GID_RUPEE_GREEN",
+ 0x50: "GID_RUPEE_BLUE",
+ 0x51: "GID_RUPEE_RED",
+ 0x52: "GID_BIG_POE",
+ 0x53: "GID_RUPEE_PURPLE",
+ 0x54: "GID_RUPEE_SILVER",
+ 0x55: "GID_SWORD_KOKIRI",
+ 0x56: "GID_SKULL_TOKEN_2",
+ 0x57: "GID_57",
+ 0x58: "GID_ZORA_EGG",
+ 0x59: "GID_MOON_TEAR",
+ 0x5A: "GID_DEED_LAND",
+ 0x5B: "GID_MASK_DEKU",
+ 0x5C: "GID_REMAINS_ODOLWA",
+ 0x5D: "GID_POWDER_KEG",
+ 0x5E: "GID_GOLD_DUST",
+ 0x5F: "GID_SEAHORSE",
+ 0x60: "GID_60",
+ 0x61: "GID_HYLIAN_LOACH",
+ 0x62: "GID_SEAHORSE_CAUGHT",
+ 0x63: "GID_REMAINS_GOHT",
+ 0x64: "GID_REMAINS_GYORG",
+ 0x65: "GID_REMAINS_TWINMOLD",
+ 0x66: "GID_SWORD_RAZOR",
+ 0x67: "GID_SWORD_GILDED",
+ 0x68: "GID_SWORD_GREAT_FAIRY",
+ 0x69: "GID_MASK_GARO",
+ 0x6A: "GID_MASK_GREAT_FAIRY",
+ 0x6B: "GID_MASK_GIBDO",
+ 0x6C: "GID_ROOM_KEY",
+ 0x6D: "GID_LETTER_TO_KAFEI",
+ 0x6E: "GID_PENDANT_OF_MEMORIES",
+ 0x6F: "GID_MUSHROOM",
+ 0x70: "GID_MASK_ROMANI",
+ 0x71: "GID_MASK_POSTMAN",
+ 0x72: "GID_MASK_GIANT",
+ 0x73: "GID_CHATEAU",
+ 0x74: "GID_PICTO_BOX",
+ 0x75: "GID_MASK_FIERCE_DEITY",
+ 0x76: "GID_MAX",
+ -1: "GID_NONE",
+}
+
+objectId_names = {
+ 0x000: "OBJECT_UNSET_0",
+ 0x001: "GAMEPLAY_KEEP",
+ 0x002: "GAMEPLAY_FIELD_KEEP",
+ 0x003: "GAMEPLAY_DANGEON_KEEP",
+ 0x004: "OBJECT_NB",
+ 0x005: "OBJECT_OKUTA",
+ 0x006: "OBJECT_CROW",
+ 0x007: "OBJECT_AH",
+ 0x008: "OBJECT_DY_OBJ",
+ 0x009: "OBJECT_WALLMASTER",
+ 0x00A: "OBJECT_DODONGO",
+ 0x00B: "OBJECT_FIREFLY",
+ 0x00C: "OBJECT_BOX",
+ 0x00D: "OBJECT_AL",
+ 0x00E: "OBJECT_BUBBLE",
+ 0x00F: "OBJECT_NIW",
+ 0x010: "OBJECT_LINK_BOY",
+ 0x011: "OBJECT_LINK_CHILD",
+ 0x012: "OBJECT_TITE",
+ 0x013: "OBJECT_TAB",
+ 0x014: "OBJECT_PH",
+ 0x015: "OBJECT_AND",
+ 0x016: "OBJECT_MSMO",
+ 0x017: "OBJECT_DINOFOS",
+ 0x018: "OBJECT_DRS",
+ 0x019: "OBJECT_ZL1",
+ 0x01A: "OBJECT_AN4",
+ 0x01B: "OBJECT_UNSET_1B",
+ 0x01C: "OBJECT_TEST3",
+ 0x01D: "OBJECT_FAMOS",
+ 0x01E: "OBJECT_UNSET_1E",
+ 0x01F: "OBJECT_UNSET_1F",
+ 0x020: "OBJECT_ST",
+ 0x021: "OBJECT_UNSET_21",
+ 0x022: "OBJECT_THIEFBIRD",
+ 0x023: "OBJECT_UNSET_23",
+ 0x024: "OBJECT_UNSET_24",
+ 0x025: "OBJECT_UNSET_25",
+ 0x026: "OBJECT_UNSET_26",
+ 0x027: "OBJECT_UNSET_27",
+ 0x028: "OBJECT_UNSET_28",
+ 0x029: "OBJECT_UNSET_29",
+ 0x02A: "OBJECT_BOMBF",
+ 0x02B: "OBJECT_UNSET_2B",
+ 0x02C: "OBJECT_UNSET_2C",
+ 0x02D: "OBJECT_UNSET_2D",
+ 0x02E: "OBJECT_UNSET_2E",
+ 0x02F: "OBJECT_UNSET_2F",
+ 0x030: "OBJECT_AM",
+ 0x031: "OBJECT_DEKUBABA",
+ 0x032: "OBJECT_UNSET_32",
+ 0x033: "OBJECT_UNSET_33",
+ 0x034: "OBJECT_UNSET_34",
+ 0x035: "OBJECT_UNSET_35",
+ 0x036: "OBJECT_UNSET_36",
+ 0x037: "OBJECT_UNSET_37",
+ 0x038: "OBJECT_UNSET_38",
+ 0x039: "OBJECT_UNSET_39",
+ 0x03A: "OBJECT_UNSET_3A",
+ 0x03B: "OBJECT_UNSET_3B",
+ 0x03C: "OBJECT_UNSET_3C",
+ 0x03D: "OBJECT_UNSET_3D",
+ 0x03E: "OBJECT_WARP1",
+ 0x03F: "OBJECT_B_HEART",
+ 0x040: "OBJECT_DEKUNUTS",
+ 0x041: "OBJECT_UNSET_41",
+ 0x042: "OBJECT_UNSET_42",
+ 0x043: "OBJECT_UNSET_43",
+ 0x044: "OBJECT_UNSET_44",
+ 0x045: "OBJECT_UNSET_45",
+ 0x046: "OBJECT_UNSET_46",
+ 0x047: "OBJECT_UNSET_47",
+ 0x048: "OBJECT_UNSET_48",
+ 0x049: "OBJECT_UNSET_49",
+ 0x04A: "OBJECT_UNSET_4A",
+ 0x04B: "OBJECT_UNSET_4B",
+ 0x04C: "OBJECT_UNSET_4C",
+ 0x04D: "OBJECT_UNSET_4D",
+ 0x04E: "OBJECT_UNSET_4E",
+ 0x04F: "OBJECT_UNSET_4F",
+ 0x050: "OBJECT_UNSET_50",
+ 0x051: "OBJECT_BB",
+ 0x052: "OBJECT_DEATH",
+ 0x053: "OBJECT_UNSET_53",
+ 0x054: "OBJECT_UNSET_54",
+ 0x055: "OBJECT_UNSET_55",
+ 0x056: "OBJECT_UNSET_56",
+ 0x057: "OBJECT_UNSET_57",
+ 0x058: "OBJECT_UNSET_58",
+ 0x059: "OBJECT_UNSET_59",
+ 0x05A: "OBJECT_UNSET_5A",
+ 0x05B: "OBJECT_UNSET_5B",
+ 0x05C: "OBJECT_F40_OBJ",
+ 0x05D: "OBJECT_PO_COMPOSER",
+ 0x05E: "OBJECT_UNSET_5E",
+ 0x05F: "OBJECT_HATA",
+ 0x060: "OBJECT_UNSET_60",
+ 0x061: "OBJECT_WOOD02",
+ 0x062: "OBJECT_UNSET_62",
+ 0x063: "OBJECT_UNSET_63",
+ 0x064: "OBJECT_TRAP",
+ 0x065: "OBJECT_UNSET_65",
+ 0x066: "OBJECT_UNSET_66",
+ 0x067: "OBJECT_UNSET_67",
+ 0x068: "OBJECT_UNSET_68",
+ 0x069: "OBJECT_UNSET_69",
+ 0x06A: "OBJECT_VM",
+ 0x06B: "OBJECT_UNSET_6B",
+ 0x06C: "OBJECT_UNSET_6C",
+ 0x06D: "OBJECT_UNSET_6D",
+ 0x06E: "OBJECT_UNSET_6E",
+ 0x06F: "OBJECT_UNSET_6F",
+ 0x070: "OBJECT_EFC_STAR_FIELD",
+ 0x071: "OBJECT_UNSET_71",
+ 0x072: "OBJECT_UNSET_72",
+ 0x073: "OBJECT_UNSET_73",
+ 0x074: "OBJECT_UNSET_74",
+ 0x075: "OBJECT_RD",
+ 0x076: "OBJECT_YUKIMURA_OBJ",
+ 0x077: "OBJECT_HEAVY_OBJECT",
+ 0x078: "OBJECT_UNSET_78",
+ 0x079: "OBJECT_UNSET_79",
+ 0x07A: "OBJECT_UNSET_7A",
+ 0x07B: "OBJECT_UNSET_7B",
+ 0x07C: "OBJECT_UNSET_7C",
+ 0x07D: "OBJECT_HORSE_LINK_CHILD",
+ 0x07E: "OBJECT_UNSET_7E",
+ 0x07F: "OBJECT_UNSET_7F",
+ 0x080: "OBJECT_SYOKUDAI",
+ 0x081: "OBJECT_UNSET_81",
+ 0x082: "OBJECT_UNSET_82",
+ 0x083: "OBJECT_UNSET_83",
+ 0x084: "OBJECT_EFC_TW",
+ 0x085: "OBJECT_UNSET_85",
+ 0x086: "OBJECT_GI_KEY",
+ 0x087: "OBJECT_MIR_RAY",
+ 0x088: "OBJECT_CTOWER_ROT",
+ 0x089: "OBJECT_UNSET_89",
+ 0x08A: "OBJECT_BDOOR",
+ 0x08B: "OBJECT_UNSET_8B",
+ 0x08C: "OBJECT_UNSET_8C",
+ 0x08D: "OBJECT_UNSET_8D",
+ 0x08E: "OBJECT_SB",
+ 0x08F: "OBJECT_GI_MELODY",
+ 0x090: "OBJECT_GI_HEART",
+ 0x091: "OBJECT_GI_COMPASS",
+ 0x092: "OBJECT_GI_BOSSKEY",
+ 0x093: "OBJECT_UNSET_93",
+ 0x094: "OBJECT_GI_NUTS",
+ 0x095: "OBJECT_UNSET_95",
+ 0x096: "OBJECT_GI_HEARTS",
+ 0x097: "OBJECT_GI_ARROWCASE",
+ 0x098: "OBJECT_GI_BOMBPOUCH",
+ 0x099: "OBJECT_IN",
+ 0x09A: "OBJECT_UNSET_9A",
+ 0x09B: "OBJECT_UNSET_9B",
+ 0x09C: "OBJECT_UNSET_9C",
+ 0x09D: "OBJECT_OS_ANIME",
+ 0x09E: "OBJECT_GI_BOTTLE",
+ 0x09F: "OBJECT_GI_STICK",
+ 0x0A0: "OBJECT_GI_MAP",
+ 0x0A1: "OBJECT_OF1D_MAP",
+ 0x0A2: "OBJECT_RU2",
+ 0x0A3: "OBJECT_UNSET_A3",
+ 0x0A4: "OBJECT_GI_MAGICPOT",
+ 0x0A5: "OBJECT_GI_BOMB_1",
+ 0x0A6: "OBJECT_UNSET_A6",
+ 0x0A7: "OBJECT_MA2",
+ 0x0A8: "OBJECT_GI_PURSE",
+ 0x0A9: "OBJECT_UNSET_A9",
+ 0x0AA: "OBJECT_UNSET_AA",
+ 0x0AB: "OBJECT_RR",
+ 0x0AC: "OBJECT_UNSET_AC",
+ 0x0AD: "OBJECT_UNSET_AD",
+ 0x0AE: "OBJECT_UNSET_AE",
+ 0x0AF: "OBJECT_GI_ARROW",
+ 0x0B0: "OBJECT_GI_BOMB_2",
+ 0x0B1: "OBJECT_UNSET_B1",
+ 0x0B2: "OBJECT_UNSET_B2",
+ 0x0B3: "OBJECT_GI_SHIELD_2",
+ 0x0B4: "OBJECT_GI_HOOKSHOT",
+ 0x0B5: "OBJECT_GI_OCARINA",
+ 0x0B6: "OBJECT_GI_MILK",
+ 0x0B7: "OBJECT_MA1",
+ 0x0B8: "OBJECT_UNSET_B8",
+ 0x0B9: "OBJECT_UNSET_B9",
+ 0x0BA: "OBJECT_UNSET_BA",
+ 0x0BB: "OBJECT_NY",
+ 0x0BC: "OBJECT_FR",
+ 0x0BD: "OBJECT_UNSET_BD",
+ 0x0BE: "OBJECT_UNSET_BE",
+ 0x0BF: "OBJECT_GI_BOW",
+ 0x0C0: "OBJECT_GI_GLASSES",
+ 0x0C1: "OBJECT_GI_LIQUID",
+ 0x0C2: "OBJECT_ANI",
+ 0x0C3: "OBJECT_GI_SHIELD_3",
+ 0x0C4: "OBJECT_UNSET_C4",
+ 0x0C5: "OBJECT_UNSET_C5",
+ 0x0C6: "OBJECT_GI_BEAN",
+ 0x0C7: "OBJECT_GI_FISH",
+ 0x0C8: "OBJECT_UNSET_C8",
+ 0x0C9: "OBJECT_UNSET_C9",
+ 0x0CA: "OBJECT_UNSET_CA",
+ 0x0CB: "OBJECT_GI_LONGSWORD",
+ 0x0CC: "OBJECT_UNSET_CC",
+ 0x0CD: "OBJECT_UNSET_CD",
+ 0x0CE: "OBJECT_UNSET_CE",
+ 0x0CF: "OBJECT_UNSET_CF",
+ 0x0D0: "OBJECT_ZO",
+ 0x0D1: "OBJECT_UNSET_D1",
+ 0x0D2: "OBJECT_UMAJUMP",
+ 0x0D3: "OBJECT_UNSET_D3",
+ 0x0D4: "OBJECT_UNSET_D4",
+ 0x0D5: "OBJECT_MASTERGOLON",
+ 0x0D6: "OBJECT_MASTERZOORA",
+ 0x0D7: "OBJECT_AOB",
+ 0x0D8: "OBJECT_IK",
+ 0x0D9: "OBJECT_AHG",
+ 0x0DA: "OBJECT_CNE",
+ 0x0DB: "OBJECT_UNSET_DB",
+ 0x0DC: "OBJECT_UNSET_DC",
+ 0x0DD: "OBJECT_AN3",
+ 0x0DE: "OBJECT_BJI",
+ 0x0DF: "OBJECT_BBA",
+ 0x0E0: "OBJECT_AN2",
+ 0x0E1: "OBJECT_UNSET_E1",
+ 0x0E2: "OBJECT_AN1",
+ 0x0E3: "OBJECT_BOJ",
+ 0x0E4: "OBJECT_FZ",
+ 0x0E5: "OBJECT_BOB",
+ 0x0E6: "OBJECT_GE1",
+ 0x0E7: "OBJECT_YABUSAME_POINT",
+ 0x0E8: "OBJECT_UNSET_E8",
+ 0x0E9: "OBJECT_UNSET_E9",
+ 0x0EA: "OBJECT_UNSET_EA",
+ 0x0EB: "OBJECT_UNSET_EB",
+ 0x0EC: "OBJECT_D_HSBLOCK",
+ 0x0ED: "OBJECT_D_LIFT",
+ 0x0EE: "OBJECT_MAMENOKI",
+ 0x0EF: "OBJECT_GOROIWA",
+ 0x0F0: "OBJECT_TORYO",
+ 0x0F1: "OBJECT_DAIKU",
+ 0x0F2: "OBJECT_NWC",
+ 0x0F3: "OBJECT_GM",
+ 0x0F4: "OBJECT_MS",
+ 0x0F5: "OBJECT_HS",
+ 0x0F6: "OBJECT_UNSET_F6",
+ 0x0F7: "OBJECT_LIGHTSWITCH",
+ 0x0F8: "OBJECT_KUSA",
+ 0x0F9: "OBJECT_TSUBO",
+ 0x0FA: "OBJECT_UNSET_FA",
+ 0x0FB: "OBJECT_UNSET_FB",
+ 0x0FC: "OBJECT_KANBAN",
+ 0x0FD: "OBJECT_OWL",
+ 0x0FE: "OBJECT_MK",
+ 0x0FF: "OBJECT_FU",
+ 0x100: "OBJECT_GI_KI_TAN_MASK",
+ 0x101: "OBJECT_UNSET_101",
+ 0x102: "OBJECT_GI_MASK18",
+ 0x103: "OBJECT_GI_RABIT_MASK",
+ 0x104: "OBJECT_GI_TRUTH_MASK",
+ 0x105: "OBJECT_UNSET_105",
+ 0x106: "OBJECT_STREAM",
+ 0x107: "OBJECT_MM",
+ 0x108: "OBJECT_UNSET_108",
+ 0x109: "OBJECT_UNSET_109",
+ 0x10A: "OBJECT_UNSET_10A",
+ 0x10B: "OBJECT_UNSET_10B",
+ 0x10C: "OBJECT_UNSET_10C",
+ 0x10D: "OBJECT_UNSET_10D",
+ 0x10E: "OBJECT_UNSET_10E",
+ 0x10F: "OBJECT_JS",
+ 0x110: "OBJECT_CS",
+ 0x111: "OBJECT_UNSET_111",
+ 0x112: "OBJECT_UNSET_112",
+ 0x113: "OBJECT_GI_SOLDOUT",
+ 0x114: "OBJECT_UNSET_114",
+ 0x115: "OBJECT_MAG",
+ 0x116: "OBJECT_UNSET_116",
+ 0x117: "OBJECT_UNSET_117",
+ 0x118: "OBJECT_UNSET_118",
+ 0x119: "OBJECT_GI_GOLONMASK",
+ 0x11A: "OBJECT_GI_ZORAMASK",
+ 0x11B: "OBJECT_UNSET_11B",
+ 0x11C: "OBJECT_UNSET_11C",
+ 0x11D: "OBJECT_KA",
+ 0x11E: "OBJECT_UNSET_11E",
+ 0x11F: "OBJECT_ZG",
+ 0x120: "OBJECT_UNSET_120",
+ 0x121: "OBJECT_GI_M_ARROW",
+ 0x122: "OBJECT_DS2",
+ 0x123: "OBJECT_UNSET_123",
+ 0x124: "OBJECT_FISH",
+ 0x125: "OBJECT_GI_SUTARU",
+ 0x126: "OBJECT_UNSET_126",
+ 0x127: "OBJECT_SSH",
+ 0x128: "OBJECT_BIGSLIME",
+ 0x129: "OBJECT_BG",
+ 0x12A: "OBJECT_BOMBIWA",
+ 0x12B: "OBJECT_HINTNUTS",
+ 0x12C: "OBJECT_RS",
+ 0x12D: "OBJECT_UNSET_12D",
+ 0x12E: "OBJECT_GLA",
+ 0x12F: "OBJECT_UNSET_12F",
+ 0x130: "OBJECT_GELDB",
+ 0x131: "OBJECT_UNSET_131",
+ 0x132: "OBJECT_DOG",
+ 0x133: "OBJECT_KIBAKO2",
+ 0x134: "OBJECT_DNS",
+ 0x135: "OBJECT_DNK",
+ 0x136: "OBJECT_UNSET_136",
+ 0x137: "OBJECT_GI_INSECT",
+ 0x138: "OBJECT_UNSET_138",
+ 0x139: "OBJECT_GI_GHOST",
+ 0x13A: "OBJECT_GI_SOUL",
+ 0x13B: "OBJECT_UNSET_13B",
+ 0x13C: "OBJECT_UNSET_13C",
+ 0x13D: "OBJECT_UNSET_13D",
+ 0x13E: "OBJECT_UNSET_13E",
+ 0x13F: "OBJECT_GI_RUPY",
+ 0x140: "OBJECT_MU",
+ 0x141: "OBJECT_WF",
+ 0x142: "OBJECT_SKB",
+ 0x143: "OBJECT_GS",
+ 0x144: "OBJECT_PS",
+ 0x145: "OBJECT_OMOYA_OBJ",
+ 0x146: "OBJECT_COW",
+ 0x147: "OBJECT_UNSET_147",
+ 0x148: "OBJECT_GI_SWORD_1",
+ 0x149: "OBJECT_UNSET_149",
+ 0x14A: "OBJECT_UNSET_14A",
+ 0x14B: "OBJECT_ZL4",
+ 0x14C: "OBJECT_LINK_GORON",
+ 0x14D: "OBJECT_LINK_ZORA",
+ 0x14E: "OBJECT_GRASSHOPPER",
+ 0x14F: "OBJECT_BOYO",
+ 0x150: "OBJECT_UNSET_150",
+ 0x151: "OBJECT_UNSET_151",
+ 0x152: "OBJECT_UNSET_152",
+ 0x153: "OBJECT_FWALL",
+ 0x154: "OBJECT_LINK_NUTS",
+ 0x155: "OBJECT_JSO",
+ 0x156: "OBJECT_KNIGHT",
+ 0x157: "OBJECT_ICICLE",
+ 0x158: "OBJECT_SPDWEB",
+ 0x159: "OBJECT_UNSET_159",
+ 0x15A: "OBJECT_BOSS01",
+ 0x15B: "OBJECT_BOSS02",
+ 0x15C: "OBJECT_BOSS03",
+ 0x15D: "OBJECT_BOSS04",
+ 0x15E: "OBJECT_BOSS05",
+ 0x15F: "OBJECT_BOSS06",
+ 0x160: "OBJECT_BOSS07",
+ 0x161: "OBJECT_RAF",
+ 0x162: "OBJECT_FUNEN",
+ 0x163: "OBJECT_RAILLIFT",
+ 0x164: "OBJECT_NUMA_OBJ",
+ 0x165: "OBJECT_FLOWERPOT",
+ 0x166: "OBJECT_SPINYROLL",
+ 0x167: "OBJECT_ICE_BLOCK",
+ 0x168: "OBJECT_UNSET_168",
+ 0x169: "OBJECT_KEIKOKU_DEMO",
+ 0x16A: "OBJECT_SLIME",
+ 0x16B: "OBJECT_PR",
+ 0x16C: "OBJECT_F52_OBJ",
+ 0x16D: "OBJECT_F53_OBJ",
+ 0x16E: "OBJECT_UNSET_16E",
+ 0x16F: "OBJECT_KIBAKO",
+ 0x170: "OBJECT_SEK",
+ 0x171: "OBJECT_GMO",
+ 0x172: "OBJECT_BAT",
+ 0x173: "OBJECT_SEKIHIL",
+ 0x174: "OBJECT_SEKIHIG",
+ 0x175: "OBJECT_SEKIHIN",
+ 0x176: "OBJECT_SEKIHIZ",
+ 0x177: "OBJECT_UNSET_177",
+ 0x178: "OBJECT_WIZ",
+ 0x179: "OBJECT_LADDER",
+ 0x17A: "OBJECT_MKK",
+ 0x17B: "OBJECT_UNSET_17B",
+ 0x17C: "OBJECT_UNSET_17C",
+ 0x17D: "OBJECT_UNSET_17D",
+ 0x17E: "OBJECT_KEIKOKU_OBJ",
+ 0x17F: "OBJECT_SICHITAI_OBJ",
+ 0x180: "OBJECT_DEKUCITY_ANA_OBJ",
+ 0x181: "OBJECT_RAT",
+ 0x182: "OBJECT_WATER_EFFECT",
+ 0x183: "OBJECT_UNSET_183",
+ 0x184: "OBJECT_DBLUE_OBJECT",
+ 0x185: "OBJECT_BAL",
+ 0x186: "OBJECT_WARP_UZU",
+ 0x187: "OBJECT_DRIFTICE",
+ 0x188: "OBJECT_FALL",
+ 0x189: "OBJECT_HANAREYAMA_OBJ",
+ 0x18A: "OBJECT_CRACE_OBJECT",
+ 0x18B: "OBJECT_DNQ",
+ 0x18C: "OBJECT_OBJ_TOKEIDAI",
+ 0x18D: "OBJECT_EG",
+ 0x18E: "OBJECT_TRU",
+ 0x18F: "OBJECT_TRT",
+ 0x190: "OBJECT_HAKUGIN_OBJ",
+ 0x191: "OBJECT_HORSE_GAME_CHECK",
+ 0x192: "OBJECT_STK",
+ 0x193: "OBJECT_UNSET_193",
+ 0x194: "OBJECT_UNSET_194",
+ 0x195: "OBJECT_MNK",
+ 0x196: "OBJECT_GI_BOTTLE_RED",
+ 0x197: "OBJECT_TOKEI_TOBIRA",
+ 0x198: "OBJECT_AZ",
+ 0x199: "OBJECT_TWIG",
+ 0x19A: "OBJECT_DEKUCITY_OBJ",
+ 0x19B: "OBJECT_PO_FUSEN",
+ 0x19C: "OBJECT_RACETSUBO",
+ 0x19D: "OBJECT_HA",
+ 0x19E: "OBJECT_BIGOKUTA",
+ 0x19F: "OBJECT_OPEN_OBJ",
+ 0x1A0: "OBJECT_FU_KAITEN",
+ 0x1A1: "OBJECT_FU_MATO",
+ 0x1A2: "OBJECT_MTORIDE",
+ 0x1A3: "OBJECT_OSN",
+ 0x1A4: "OBJECT_TOKEI_STEP",
+ 0x1A5: "OBJECT_LOTUS",
+ 0x1A6: "OBJECT_TL",
+ 0x1A7: "OBJECT_DKJAIL_OBJ",
+ 0x1A8: "OBJECT_VISIBLOCK",
+ 0x1A9: "OBJECT_TSN",
+ 0x1AA: "OBJECT_DS2N",
+ 0x1AB: "OBJECT_FSN",
+ 0x1AC: "OBJECT_SHN",
+ 0x1AD: "OBJECT_BIGICICLE",
+ 0x1AE: "OBJECT_GI_BOTTLE_15",
+ 0x1AF: "OBJECT_TK",
+ 0x1B0: "OBJECT_MARKET_OBJ",
+ 0x1B1: "OBJECT_GI_RESERVE00",
+ 0x1B2: "OBJECT_GI_RESERVE01",
+ 0x1B3: "OBJECT_LIGHTBLOCK",
+ 0x1B4: "OBJECT_TAKARAYA_OBJECTS",
+ 0x1B5: "OBJECT_WDHAND",
+ 0x1B6: "OBJECT_SDN",
+ 0x1B7: "OBJECT_SNOWWD",
+ 0x1B8: "OBJECT_GIANT",
+ 0x1B9: "OBJECT_COMB",
+ 0x1BA: "OBJECT_HANA",
+ 0x1BB: "OBJECT_BOSS_HAKUGIN",
+ 0x1BC: "OBJECT_MEGANEANA_OBJ",
+ 0x1BD: "OBJECT_GI_NUTSMASK",
+ 0x1BE: "OBJECT_STK2",
+ 0x1BF: "OBJECT_SPOT11_OBJ",
+ 0x1C0: "OBJECT_DANPEI_OBJECT",
+ 0x1C1: "OBJECT_DHOUSE",
+ 0x1C2: "OBJECT_HAKAISI",
+ 0x1C3: "OBJECT_PO",
+ 0x1C4: "OBJECT_SNOWMAN",
+ 0x1C5: "OBJECT_PO_SISTERS",
+ 0x1C6: "OBJECT_PP",
+ 0x1C7: "OBJECT_GORONSWITCH",
+ 0x1C8: "OBJECT_DELF",
+ 0x1C9: "OBJECT_BOTIHASIRA",
+ 0x1CA: "OBJECT_GI_BIGBOMB",
+ 0x1CB: "OBJECT_PST",
+ 0x1CC: "OBJECT_BSMASK",
+ 0x1CD: "OBJECT_SPIDERTENT",
+ 0x1CE: "OBJECT_ZORAEGG",
+ 0x1CF: "OBJECT_KBT",
+ 0x1D0: "OBJECT_GG",
+ 0x1D1: "OBJECT_MARUTA",
+ 0x1D2: "OBJECT_GHAKA",
+ 0x1D3: "OBJECT_OYU",
+ 0x1D4: "OBJECT_DNP",
+ 0x1D5: "OBJECT_DAI",
+ 0x1D6: "OBJECT_KGY",
+ 0x1D7: "OBJECT_FB",
+ 0x1D8: "OBJECT_TAISOU",
+ 0x1D9: "OBJECT_MASK_BU_SAN",
+ 0x1DA: "OBJECT_MASK_KI_TAN",
+ 0x1DB: "OBJECT_MASK_RABIT",
+ 0x1DC: "OBJECT_MASK_SKJ",
+ 0x1DD: "OBJECT_MASK_BAKURETU",
+ 0x1DE: "OBJECT_MASK_TRUTH",
+ 0x1DF: "OBJECT_GK",
+ 0x1E0: "OBJECT_HAKA_OBJ",
+ 0x1E1: "OBJECT_MASK_GORON",
+ 0x1E2: "OBJECT_MASK_ZORA",
+ 0x1E3: "OBJECT_MASK_NUTS",
+ 0x1E4: "OBJECT_MASK_BOY",
+ 0x1E5: "OBJECT_DNT",
+ 0x1E6: "OBJECT_YUKIYAMA",
+ 0x1E7: "OBJECT_ICEFLOE",
+ 0x1E8: "OBJECT_GI_GOLD_DUST",
+ 0x1E9: "OBJECT_GI_BOTTLE_16",
+ 0x1EA: "OBJECT_GI_BOTTLE_22",
+ 0x1EB: "OBJECT_BEE",
+ 0x1EC: "OBJECT_OT",
+ 0x1ED: "OBJECT_UTUBO",
+ 0x1EE: "OBJECT_DORA",
+ 0x1EF: "OBJECT_GI_LOACH",
+ 0x1F0: "OBJECT_GI_SEAHORSE",
+ 0x1F1: "OBJECT_BIGPO",
+ 0x1F2: "OBJECT_HARIKO",
+ 0x1F3: "OBJECT_DNO",
+ 0x1F4: "OBJECT_SINKAI_KABE",
+ 0x1F5: "OBJECT_KIN2_OBJ",
+ 0x1F6: "OBJECT_ISHI",
+ 0x1F7: "OBJECT_HAKUGIN_DEMO",
+ 0x1F8: "OBJECT_JG",
+ 0x1F9: "OBJECT_GI_SWORD_2",
+ 0x1FA: "OBJECT_GI_SWORD_3",
+ 0x1FB: "OBJECT_GI_SWORD_4",
+ 0x1FC: "OBJECT_UM",
+ 0x1FD: "OBJECT_MASK_GIBUDO",
+ 0x1FE: "OBJECT_MASK_JSON",
+ 0x1FF: "OBJECT_MASK_KERFAY",
+ 0x200: "OBJECT_MASK_BIGELF",
+ 0x201: "OBJECT_RB",
+ 0x202: "OBJECT_MBAR_OBJ",
+ 0x203: "OBJECT_IKANA_OBJ",
+ 0x204: "OBJECT_KZ",
+ 0x205: "OBJECT_TOKEI_TURRET",
+ 0x206: "OBJECT_ZOG",
+ 0x207: "OBJECT_ROTLIFT",
+ 0x208: "OBJECT_POSTHOUSE_OBJ",
+ 0x209: "OBJECT_GI_MASK09",
+ 0x20A: "OBJECT_GI_MASK14",
+ 0x20B: "OBJECT_GI_MASK15",
+ 0x20C: "OBJECT_INIBS_OBJECT",
+ 0x20D: "OBJECT_TREE",
+ 0x20E: "OBJECT_KAIZOKU_OBJ",
+ 0x20F: "OBJECT_GI_RESERVE_B_00",
+ 0x210: "OBJECT_GI_RESERVE_C_00",
+ 0x211: "OBJECT_ZOB",
+ 0x212: "OBJECT_MILKBAR",
+ 0x213: "OBJECT_DMASK",
+ 0x214: "OBJECT_MASK_KYOJIN",
+ 0x215: "OBJECT_GI_RESERVE_C_01",
+ 0x216: "OBJECT_ZOD",
+ 0x217: "OBJECT_KUMO30",
+ 0x218: "OBJECT_OBJ_YASI",
+ 0x219: "OBJECT_MASK_ROMERNY",
+ 0x21A: "OBJECT_TANRON1",
+ 0x21B: "OBJECT_TANRON2",
+ 0x21C: "OBJECT_TANRON3",
+ 0x21D: "OBJECT_GI_MAGICMUSHROOM",
+ 0x21E: "OBJECT_OBJ_CHAN",
+ 0x21F: "OBJECT_GI_MASK10",
+ 0x220: "OBJECT_ZOS",
+ 0x221: "OBJECT_MASK_POSTHAT",
+ 0x222: "OBJECT_F40_SWITCH",
+ 0x223: "OBJECT_LODMOON",
+ 0x224: "OBJECT_TRO",
+ 0x225: "OBJECT_GI_MASK12",
+ 0x226: "OBJECT_GI_MASK23",
+ 0x227: "OBJECT_GI_BOTTLE_21",
+ 0x228: "OBJECT_GI_CAMERA",
+ 0x229: "OBJECT_KAMEJIMA",
+ 0x22A: "OBJECT_HARFGIBUD",
+ 0x22B: "OBJECT_ZOV",
+ 0x22C: "OBJECT_HGDOOR",
+ 0x22D: "OBJECT_UNSET_22D",
+ 0x22E: "OBJECT_UNSET_22E",
+ 0x22F: "OBJECT_UNSET_22F",
+ 0x230: "OBJECT_DOR01",
+ 0x231: "OBJECT_DOR02",
+ 0x232: "OBJECT_DOR03",
+ 0x233: "OBJECT_DOR04",
+ 0x234: "OBJECT_LAST_OBJ",
+ 0x235: "OBJECT_REDEAD_OBJ",
+ 0x236: "OBJECT_IKNINSIDE_OBJ",
+ 0x237: "OBJECT_IKNV_OBJ",
+ 0x238: "OBJECT_PAMERA",
+ 0x239: "OBJECT_HSSTUMP",
+ 0x23A: "OBJECT_ZM",
+ 0x23B: "OBJECT_BIG_FWALL",
+ 0x23C: "OBJECT_SECOM_OBJ",
+ 0x23D: "OBJECT_HUNSUI",
+ 0x23E: "OBJECT_UCH",
+ 0x23F: "OBJECT_TANRON4",
+ 0x240: "OBJECT_TANRON5",
+ 0x241: "OBJECT_DT",
+ 0x242: "OBJECT_GI_MASK03",
+ 0x243: "OBJECT_CHA",
+ 0x244: "OBJECT_OBJ_DINNER",
+ 0x245: "OBJECT_GI_RESERVE_B_01",
+ 0x246: "OBJECT_LASTDAY",
+ 0x247: "OBJECT_BAI",
+ 0x248: "OBJECT_IN2",
+ 0x249: "OBJECT_IKN_DEMO",
+ 0x24A: "OBJECT_YB",
+ 0x24B: "OBJECT_RZ",
+ 0x24C: "OBJECT_MASK_ZACHO",
+ 0x24D: "OBJECT_GI_FIELDMAP",
+ 0x24E: "OBJECT_MASK_STONE",
+ 0x24F: "OBJECT_BJT",
+ 0x250: "OBJECT_TARU",
+ 0x251: "OBJECT_MOONSTON",
+ 0x252: "OBJECT_MASK_BREE",
+ 0x253: "OBJECT_GI_SCHEDULE",
+ 0x254: "OBJECT_GI_STONEMASK",
+ 0x255: "OBJECT_ZORABAND",
+ 0x256: "OBJECT_KEPN_KOYA",
+ 0x257: "OBJECT_OBJ_USIYANE",
+ 0x258: "OBJECT_GI_MASK05",
+ 0x259: "OBJECT_GI_MASK11",
+ 0x25A: "OBJECT_GI_MASK20",
+ 0x25B: "OBJECT_NNH",
+ 0x25C: "OBJECT_MASK_GERO",
+ 0x25D: "OBJECT_MASK_YOFUKASI",
+ 0x25E: "OBJECT_MASK_MEOTO",
+ 0x25F: "OBJECT_MASK_DANCER",
+ 0x260: "OBJECT_KZSAKU",
+ 0x261: "OBJECT_OBJ_MILK_BIN",
+ 0x262: "OBJECT_RANDOM_OBJ",
+ 0x263: "OBJECT_KUJIYA",
+ 0x264: "OBJECT_KITAN",
+ 0x265: "OBJECT_GI_MASK06",
+ 0x266: "OBJECT_GI_MASK16",
+ 0x267: "OBJECT_ASTR_OBJ",
+ 0x268: "OBJECT_BSB",
+ 0x269: "OBJECT_FALL2",
+ 0x26A: "OBJECT_STH",
+ 0x26B: "OBJECT_GI_MSSA",
+ 0x26C: "OBJECT_SMTOWER",
+ 0x26D: "OBJECT_GI_MASK21",
+ 0x26E: "OBJECT_YADO_OBJ",
+ 0x26F: "OBJECT_SYOTEN",
+ 0x270: "OBJECT_MOONEND",
+ 0x271: "OBJECT_OB",
+ 0x272: "OBJECT_GI_BOTTLE_04",
+ 0x273: "OBJECT_OBJ_DANPEILIFT",
+ 0x274: "OBJECT_WDOR01",
+ 0x275: "OBJECT_WDOR02",
+ 0x276: "OBJECT_WDOR03",
+ 0x277: "OBJECT_STK3",
+ 0x278: "OBJECT_KINSTA1_OBJ",
+ 0x279: "OBJECT_KINSTA2_OBJ",
+ 0x27A: "OBJECT_BH",
+ 0x27B: "OBJECT_WDOR04",
+ 0x27C: "OBJECT_WDOR05",
+ 0x27D: "OBJECT_GI_MASK17",
+ 0x27E: "OBJECT_GI_MASK22",
+ 0x27F: "OBJECT_LBFSHOT",
+ 0x280: "OBJECT_FUSEN",
+ 0x281: "OBJECT_ENDING_OBJ",
+ 0x282: "OBJECT_GI_MASK13",
+ 0x283: "OBJECT_ID_MAX",
+}
+
+@dataclasses.dataclass
+class GetItemEntry:
+ getItemId: int
+ itemId: int
+ field: int
+ gi: int
+ textId: int
+ objectId: int
+
+ def __str__(self) -> str:
+ itemId_name = itemId_names.get(self.itemId, f"NOT FOUND: 0x{self.itemId:X}")
+ gid = abs(self.gi) - 1
+ getitemDrawId_name = getItemDrawId_names.get(gid, f"NOT FOUND: 0x{abs(self.gi) - 1:X}")
+
+ if self.gi == 0:
+ chest_anim = 0
+ else:
+ chest_anim = "CHEST_ANIM_SHORT" if self.gi < 0 else "CHEST_ANIM_LONG"
+
+ objectId_name = objectId_names.get(self.objectId, f"NOT FOUND: 0x{abs(self.objectId):X}")
+
+ ret = f"/* 0x{self.getItemId:02X} */ GET_ITEM({itemId_name}, {objectId_name}, {getitemDrawId_name}, 0x{self.textId:X}, 0x{self.field:X}, {chest_anim})"
+
+ return ret
+
+def main() -> None:
+ description = "Extract and print the GetItem table"
+ epilog = ""
+
+ parser = argparse.ArgumentParser(description=description, epilog=epilog, formatter_class=argparse.RawTextHelpFormatter)
+ parser.add_argument("file", help="binary file to read")
+ parser.add_argument("offset", help="offset at which to start reading")
+ parser.add_argument("count", help="number of entries to extract")
+ parser.add_argument("-g", help="look further back for glitched items from Get Item Manipulation", action="store_true")
+
+ args = parser.parse_args()
+
+ start = int(args.offset, 0)
+ count = int(args.count, 0)
+ glitched = args.g
+ pos_start = 0
+
+ with open(args.file, "rb") as f:
+ if glitched:
+ start -= GETITEMENTRY_LENGTH * count
+ pos_start -= count
+ count *= 2
+
+ f.seek(start, os.SEEK_SET)
+ data = f.read(GETITEMENTRY_LENGTH * count)
+ unpacked_data = struct.iter_unpack(GETITEMENTRY_FORMAT, data)
+ get_item_entries: typing.List[GetItemEntry] = []
+
+ for i,entry in enumerate(unpacked_data):
+ get_item_entries.append(GetItemEntry(pos_start + i+1, *entry))
+
+ for entry in get_item_entries:
+ print(f"{entry},")
+
+
+
+if __name__ == "__main__":
+ main()
diff --git a/tools/namefixer.py b/tools/namefixer.py
index 4c588dd81..f3362316e 100755
--- a/tools/namefixer.py
+++ b/tools/namefixer.py
@@ -18,7 +18,7 @@ simpleReplace = {
wordReplace = {
# Functions
"Actor_GetSwitchFlag": "Flags_GetSwitch",
- "Math_FAtan2F": "Math_Atan2S_XY",
+ # "Math_FAtan2F": "Math_Atan2S_XY", // All old Math_FAtan2F should be renamed, so func_80086B30 can be renamed to Math_FAtan2F
"Math_Acot2F": "Math_Atan2F_XY",
"atan_flip": "Math_Atan2F_XY",
"atans": "Math_Atan2S",
@@ -164,6 +164,10 @@ wordReplace = {
"Actor_DistanceToPoint": "Actor_WorldDistXYZToPoint",
"Actor_XZDistanceBetweenActors": "Actor_WorldDistXZToActor",
"Actor_XZDistanceToPoint": "Actor_WorldDistXZToPoint",
+ "func_800B6468": "Actor_InitPlayerImpact",
+ "func_800B6474": "Actor_UpdatePlayerImpact",
+ "func_800B648C": "Actor_SetPlayerImpact",
+ "func_800B64FC": "Actor_GetPlayerImpact",
"Audio_PlaySoundAtPosition": "SoundSource_PlaySfxAtFixedWorldPos",
"func_800F0590": "SoundSource_PlaySfxEachFrameAtFixedWorldPos",
"func_8016970C": "Play_SetCameraAtEye",
@@ -218,6 +222,7 @@ wordReplace = {
"SkelAnime_InitLink": "SkelAnime_InitPlayer",
"LinkAnimation_SetUpdateFunction": "PlayerAnimation_SetUpdateFunction",
"LinkAnimation_Update": "PlayerAnimation_Update",
+ "LinkAnimation_AnimateFrame": "PlayerAnimation_AnimateFrame",
"SkelAnime_SetTransition": "Animation_SetMorph",
"LinkAnimation_Change": "PlayerAnimation_Change",
"LinkAnimation_PlayOnce": "PlayerAnimation_PlayOnce",
@@ -317,8 +322,12 @@ wordReplace = {
"func_800B86C8": "Actor_ChangeFocus",
"func_800DF840": "Camera_ChangeMode",
"func_800B90F4": "Actor_DeactivateLens",
- "func_800BC770": "Actor_AddQuake",
+ "Actor_AddQuake": "Actor_RequestQuake",
+ "func_800BC770": "Actor_RequestQuake",
+ "Actor_AddQuakeWithSpeed": "Actor_RequestQuakeWithSpeed",
+ "func_800BC848": "Actor_RequestQuakeAndRumble",
"func_800DF840": "Camera_ChangeMode",
+ "Camera_SetToTrackActor": "Camera_SetFocalActor",
"zelda_malloc": "ZeldaArena_Malloc",
"zelda_mallocR": "ZeldaArena_MallocR",
"zelda_realloc": "ZeldaArena_Realloc",
@@ -510,13 +519,13 @@ wordReplace = {
"func_8017F9C0": "Math3D_XZInSphere",
"func_8017FA34": "Math3D_XYInSphere",
"func_8017FAA8": "Math3D_YZInSphere",
- "func_800DFB14": "Camera_ChangeDataIdx",
+ "func_800DFB14": "Camera_ChangeActorCsCamIndex",
"func_800DFC68": "Camera_GetInputDirYaw",
"func_800DFCB4": "Camera_GetCamDirPitch",
"func_800DFCDC": "Camera_GetCamDirYaw",
"func_800E0308": "Camera_SetTargetActor",
"func_800E031C": "Camera_GetWaterYPos",
- "func_800E02AC": "Camera_SetToTrackActor",
+ "func_800E02AC": "Camera_SetFocalActor",
"func_800DFAC8": "Camera_ChangeSetting",
"func_800DFC90": "Camera_GetCamDir",
"func_800DFD04": "Camera_AddQuake",
@@ -630,12 +639,22 @@ wordReplace = {
"func_80114E90": "Interface_HasEmptyBottle",
"func_80114F2C": "Interface_HasItemInBottle",
"func_80123C90": "Player_SetEquipmentData",
- "Quake2_ClearType": "Distortion_ClearType",
- "Quake2_SetType": "Distortion_SetType",
- "Quake2_SetCountdown": "Distortion_SetCountdown",
+ "Quake2_SetType": "Distortion_Request",
+ "Distortion_SetType": "Distortion_Request",
+ "Quake2_SetCountdown": "Distortion_SetDuration",
+ "Distortion_SetCountdown": "Distortion_SetDuration",
+ "Distortion_GetCountdown": "Distortion_GetTimeLeft",
+ "Quake2_ClearType": "Distortion_RemoveRequest",
+ "Distortion_ClearType": "Distortion_RemoveRequest",
"func_800BE680": "Actor_DrawDamageEffects",
"func_8012F22C": "Inventory_GetSkullTokenCount",
- "Quake_RemoveFromIdx": "Quake_Remove",
+ "Quake_Add": "Quake_Request",
+ "Quake_SetQuakeValues": "Quake_SetPerturbations",
+ "Quake_SetCountdown": "Quake_SetDuration",
+ "Quake_GetCountdown": "Quake_GetTimeLeft",
+ "Quake_NumActiveQuakes": "Quake_GetNumActiveQuakes",
+ "Quake_RemoveFromIdx": "Quake_RemoveRequest",
+ "OLib_DbCameraVec3fSum":"OLib_Vec3fAdd",
"func_8013AB00": "SubS_DrawTransformFlex",
"func_8013A860": "SubS_DrawTransformFlexLimb",
@@ -723,6 +742,92 @@ wordReplace = {
"func_80102544": "LightContext_SetFog",
+ "Padmgr_GetControllerBitmask": "PadMgr_GetValidControllersMask",
+ "func_80174F24": "PadMgr_SetRumbleRetraceCallback",
+ "func_80174F44": "PadMgr_UnsetRumbleRetraceCallback",
+ "func_80174F7C": "PadMgr_SetInputRetraceCallback",
+ "func_80174F9C": "PadMgr_UnsetInputRetraceCallback",
+ "Padmgr_GetEventCallback": "PadMgr_AcquireSerialEventQueue",
+ "func_80175008": "PadMgr_VoiceAcquireSerialEventQueue",
+ "Padmgr_SetEventCallback": "PadMgr_ReleaseSerialEventQueue",
+ "func_8017506C": "PadMgr_VoiceReleaseSerialEventQueue",
+ "Padmgr_Lock": "PadMgr_LockPadData",
+ "Padmgr_Unlock": "PadMgr_UnlockPadData",
+ "func_801750FC": "PadMgr_UpdateRumble",
+ "func_80175364": "PadMgr_RumbleStop",
+ "func_80175434": "PadMgr_RumblePause",
+ "func_8017544C": "PadMgr_RumbleSetSingle",
+ "Padmgr_ParseState": "PadMgr_UpdateInputs",
+ "func_801759BC": "PadMgr_InitVoice",
+ "func_80175AE0": "PadMgr_UpdateConnections",
+ "Padmgr_Update": "PadMgr_HandleRetrace",
+ "Padmgr_Stop": "PadMgr_HandlePreNMI",
+ "func_80175E68": "PadMgr_GetInputNoLock",
+
+ "Gfx_CallSetupDL": "Gfx_SetupDL",
+ "func_8012BFC4": "Gfx_SetupDL57",
+ "func_8012BFEC": "Gfx_SetupDL57_b",
+ "func_8012C014": "Gfx_SetupDL52_NoCD",
+ "func_8012C058": "Gfx_SetupDL58_Opa",
+ "func_8012C080": "Gfx_SetupDL57_Opa",
+ "func_8012C0A8": "Gfx_SetupDL50_Opa",
+ "func_8012C0D0": "Gfx_SetupDL51_Opa",
+ "func_8012C0F8": "Gfx_SetupDL52_Xlu",
+ "func_8012C120": "Gfx_SetupDL53_Opa",
+ "func_8012C148": "Gfx_SetupDL54_Opa",
+ "func_8012C170": "Gfx_SetupDL55_Xlu",
+ "func_8012C198": "Gfx_SetupDL26",
+ "func_8012C1C0": "Gfx_SetupDL26_Opa",
+ "func_8012C1EC": "Gfx_SetupDL23",
+ "func_8012C214": "Gfx_SetupDL23_Opa",
+ "func_8012C240": "Gfx_SetupDL25_Xlu2",
+ "func_8012C28C": "Gfx_SetupDL25_Opa",
+ "func_8012C2B4": "Gfx_SetupDL71",
+ "func_8012C2DC": "Gfx_SetupDL25_Xlu",
+ "func_8012C304": "Gfx_SetupDL72",
+ "func_8012C32C": "Gfx_SetupDL31_Opa",
+ "func_8012C354": "Gfx_SetupDL32_Opa",
+ "func_8012C37C": "Gfx_SetupDL33_Opa",
+ "func_8012C3A4": "Gfx_SetupDL64",
+ "func_8012C3CC": "Gfx_SetupDL34",
+ "func_8012C3F4": "Gfx_SetupDL34_Opa",
+ "func_8012C420": "Gfx_SetupDL35_Opa",
+ "func_8012C448": "Gfx_SetupDL44_Xlu",
+ "func_8012C470": "Gfx_SetupDL36_Opa",
+ "func_8012C498": "Gfx_SetupDL28",
+ "func_8012C4C0": "Gfx_SetupDL28_Opa",
+ "func_8012C4E8": "Gfx_SetupDL43_Opa",
+ "func_8012C510": "Gfx_SetupDL45_Opa",
+ "func_8012C538": "Gfx_SetupDL46_Overlay",
+ "func_8012C560": "Gfx_SetupDL38_Xlu",
+ "func_8012C588": "Gfx_SetupDL4_Xlu",
+ "func_8012C5B0": "Gfx_SetupDL37_Opa",
+ "func_8012C5D8": "Gfx_SetupDL2_Opa",
+ "func_8012C600": "Gfx_SetupDL39",
+ "func_8012C628": "Gfx_SetupDL39_Opa",
+ "func_8012C654": "Gfx_SetupDL39_Overlay",
+ "func_8012C680": "Gfx_SetupDL39_Ptr",
+ "func_8012C6AC": "Gfx_SetupDL40_Opa",
+ "func_8012C6D4": "Gfx_SetupDL41_Opa",
+ "func_8012C6FC": "Gfx_SetupDL47_Xlu",
+ "func_8012C724": "Gfx_SetupDL66",
+ "func_8012C74C": "Gfx_SetupDL67",
+ "func_8012C774": "Gfx_SetupDL68_NoCD",
+ "func_8012C7B8": "Gfx_SetupDL69_NoCD",
+ "func_8012C7FC": "Gfx_SetupDL65_NoCD",
+ "func_8012C840": "Gfx_SetupDL70",
+ "func_8012C868": "Gfx_SetupDL20_NoCD",
+ "func_8012C8AC": "Gfx_SetupDL42_Opa",
+ "func_8012C8D4": "Gfx_SetupDL42_Overlay",
+ "func_8012C8FC": "Gfx_SetupDL48_Opa",
+ "func_8012C924": "Gfx_SetupDL49_Xlu",
+ "func_8012C94C": "Gfx_SetupDL27_Xlu",
+ "func_8012C974": "Gfx_SetupDL60_XluNoCD",
+ "func_8012C9BC": "Gfx_SetupDL61_Xlu",
+ "func_8012C9E4": "Gfx_SetupDL56_Opa",
+ "func_8012CA0C": "Gfx_SetupDL56_Ptr",
+ "func_8012CA38": "Gfx_SetupDL59_Opa",
+
# Structs
"ActorAnimationEntry": "AnimationInfo",
"ActorAnimationEntryS": "AnimationInfoS",
@@ -789,9 +894,8 @@ wordReplace = {
"gSaveContext.permanentSceneFlags": "gSaveContext.save.saveInfo.permanentSceneFlags",
"gSaveContext.bomberCode": "gSaveContext.save.saveInfo.bomberCode",
"gSaveContext.skullTokenCount": "gSaveContext.save.saveInfo.skullTokenCount",
- "gSaveContext.cutscene": "gSaveContext.save.saveInfo.cutsceneIndex",
- "gSaveContext.save.cutscene": "gSaveContext.save.saveInfo.cutsceneIndex",
- "gSaveContext.save.saveInfo.cutscene": "gSaveContext.save.saveInfo.cutsceneIndex",
+ "gSaveContext.cutscene": "gSaveContext.save.cutsceneIndex",
+ "gSaveContext.save.cutscene": "gSaveContext.save.cutsceneIndex",
"gSaveContext.health": "gSaveContext.save.saveInfo.playerData.health",
"gSaveContext.equips": "gSaveContext.save.saveInfo.equips",
"gSaveContext.unk_1016": "gSaveContext.jinxTimer",
@@ -799,7 +903,7 @@ wordReplace = {
"gSaveContext.equips.buttonItems": "gSaveContext.save.equips.buttonItems",
"gSaveContext.unk_48C8": "gSaveContext.dungeonIndex",
"gSaveContext.save.saveInfo.playerData.magicAcquired": "gSaveContext.save.saveInfo.playerData.isMagicAcquired",
- "gSaveContext.save.playerDatadoubleMagic": "gSaveContext.save.saveInfo.playerData.isDoubleMagicAcquired",
+ "gSaveContext.save.playerData.doubleMagic": "gSaveContext.save.saveInfo.playerData.isDoubleMagicAcquired",
"gSaveContext.unk_3F28": "gSaveContext.magicState",
"gSaveContext.unk_3F30": "gSaveContext.magicFillTarget",
"gSaveContext.unk_3F2C": "gSaveContext.magicFlag",
@@ -863,6 +967,7 @@ wordReplace = {
"player->swordInfo": "player->meleeWeaponInfo",
"player->itemActionParam": "player->heldItemAction",
"player->heldItemActionParam": "player->itemAction",
+ "player->unk_A86": "player->currentActorCsIndex",
"player->unk_A9C": "player->secretRumbleCharge",
"player->unk_AA0": "player->closestSecretDistSq",
"player->unk_AAC": "player->headLimbRot",
@@ -871,6 +976,8 @@ wordReplace = {
"player->getItemDrawId": "player->getItemDrawIdPlusOne",
"player->unk_B68": "player->fallStartHeight",
"player->unk_B6A": "player->fallDistance",
+ "player->unk_B80": "player->pushedSpeed",
+ "player->unk_B84": "player->pushedYaw",
"player->targetActor": "player->talkActor",
"player->targetActorDistance": "player->talkActorDistance",
"player->unk_730": "player->targetedActor",
@@ -930,10 +1037,14 @@ wordReplace = {
"play->roomCtx.unk31": "play->roomCtx.status",
"actorCtx.unkC": "actorCtx.halfDaysBit",
- "actorCtx.unk1F4": "actorCtx.unk_1F4.unk_00",
- "actorCtx.unk1F5": "actorCtx.unk_1F4.timer",
- "actorCtx.unk1F8": "actorCtx.unk_1F4.unk_04",
- "actorCtx.unk1FC": "actorCtx.unk_1F4.unk_08",
+ "actorCtx.unk1F4": "actorCtx.playerImpact.type",
+ "actorCtx.unk1F5": "actorCtx.playerImpact.timer",
+ "actorCtx.unk1F8": "actorCtx.playerImpact.dist",
+ "actorCtx.unk1FC": "actorCtx.playerImpact.pos",
+ "actorCtx.unk_1F4.unk_00": "actorCtx.playerImpact.type",
+ "actorCtx.unk_1F4.timer": "actorCtx.playerImpact.timer",
+ "actorCtx.unk_1F4.unk_04": "actorCtx.playerImpact.dist",
+ "actorCtx.unk_1F4.unk_08": "actorCtx.playerImpact.pos",
"gSaveContext.unk_3DC8": "gSaveContext.timerOsTime",
"gSaveContext.unk_3DD0": "gSaveContext.timerStates",
@@ -947,6 +1058,7 @@ wordReplace = {
"play->sceneLoadFlag": "play->transitionTrigger",
"play->unk_18B4A": "play->transitionMode",
"play->unk_1887F": "play->transitionType",
+ "play->roomCtx.currRoom": "play->roomCtx.curRoom",
"gSaveContext.nextTransition": "gSaveContext.nextTransitionType",
"gSaveContext.unk_3F48": "gSaveContext.cutsceneTransitionControl",
"gSaveContext.fadeDuration": "gSaveContext.transFadeDuration",
@@ -956,6 +1068,7 @@ wordReplace = {
"D_801D15BC": "gZeroVec3s",
"D_801D1DE0": "gIdentityMtx",
"D_801D1E20": "gIdentityMtxF",
+ "sSetupDL": "gSetupDLs",
# Macros
"CUR_EQUIP_VALUE_VOID": "GET_CUR_EQUIP_VALUE",
diff --git a/tools/sizes/boot_functions.csv b/tools/sizes/boot_functions.csv
index bbcf6d5de..744376bcc 100644
--- a/tools/sizes/boot_functions.csv
+++ b/tools/sizes/boot_functions.csv
@@ -154,14 +154,14 @@ asm/non_matchings/boot/mtxuty-cvt/MtxConv_F2L.s,MtxConv_F2L,0x80086110,0x52
asm/non_matchings/boot/mtxuty-cvt/MtxConv_L2F.s,MtxConv_L2F,0x80086258,0xA
asm/non_matchings/boot/assert/__assert.s,__assert,0x80086280,0xD
asm/non_matchings/boot/assert/func_800862B4.s,func_800862B4,0x800862B4,0xB
-asm/non_matchings/boot/boot_800862E0/SystemArena_MallocMin1.s,SystemArena_MallocMin1,0x800862E0,0xC
-asm/non_matchings/boot/boot_800862E0/SystemArena_FreeNullCheck.s,SystemArena_FreeNullCheck,0x80086310,0xB
-asm/non_matchings/boot/boot_800862E0/SystemArena_RunBlockFunc.s,SystemArena_RunBlockFunc,0x8008633C,0x1C
-asm/non_matchings/boot/boot_800862E0/SystemArena_RunBlockFunc1.s,SystemArena_RunBlockFunc1,0x800863AC,0x1C
-asm/non_matchings/boot/boot_800862E0/SystemArena_RunBlockFunc8.s,SystemArena_RunBlockFunc8,0x8008641C,0x34
-asm/non_matchings/boot/boot_800862E0/SystemArena_RunBlockFunc1Reverse.s,SystemArena_RunBlockFunc1Reverse,0x800864EC,0x27
-asm/non_matchings/boot/boot_800862E0/SystemArena_RunInits.s,SystemArena_RunInits,0x80086588,0x1C
-asm/non_matchings/boot/boot_800862E0/SystemArena_Init.s,SystemArena_Init,0x800865F8,0xA
+asm/non_matchings/boot/boot_800862E0/SystemHeap_Malloc.s,SystemHeap_Malloc,0x800862E0,0xC
+asm/non_matchings/boot/boot_800862E0/SystemArena_Free.s,SystemArena_Free,0x80086310,0xB
+asm/non_matchings/boot/boot_800862E0/SystemHeap_RunBlockFunc.s,SystemHeap_RunBlockFunc,0x8008633C,0x1C
+asm/non_matchings/boot/boot_800862E0/SystemHeap_RunBlockFunc1.s,SystemHeap_RunBlockFunc1,0x800863AC,0x1C
+asm/non_matchings/boot/boot_800862E0/SystemHeap_RunBlockFunc8.s,SystemHeap_RunBlockFunc8,0x8008641C,0x34
+asm/non_matchings/boot/boot_800862E0/SystemHeap_RunBlockFunc1Reverse.s,SystemHeap_RunBlockFunc1Reverse,0x800864EC,0x27
+asm/non_matchings/boot/boot_800862E0/SystemHeap_RunInits.s,SystemHeap_RunInits,0x80086588,0x1C
+asm/non_matchings/boot/boot_800862E0/SystemHeap_Init.s,SystemHeap_Init,0x800865F8,0xA
asm/non_matchings/boot/padsetup/PadSetup_Init.s,PadSetup_Init,0x80086620,0x50
asm/non_matchings/boot/boot_80086760/func_80086760.s,func_80086760,0x80086760,0xD
asm/non_matchings/boot/boot_80086760/func_80086794.s,func_80086794,0x80086794,0x8
@@ -203,7 +203,7 @@ asm/non_matchings/boot/system_malloc/SystemArena_Free.s,SystemArena_Free,0x80086
asm/non_matchings/boot/system_malloc/SystemArena_Calloc.s,SystemArena_Calloc,0x80086E78,0x15
asm/non_matchings/boot/system_malloc/SystemArena_GetSizes.s,SystemArena_GetSizes,0x80086ECC,0xE
asm/non_matchings/boot/system_malloc/SystemArena_CheckArena.s,SystemArena_CheckArena,0x80086F04,0x9
-asm/non_matchings/boot/system_malloc/SystemArena_InitArena.s,SystemArena_InitArena,0x80086F28,0xC
+asm/non_matchings/boot/system_malloc/SystemArena_Init.s,SystemArena_Init,0x80086F28,0xC
asm/non_matchings/boot/system_malloc/SystemArena_Cleanup.s,SystemArena_Cleanup,0x80086F58,0x9
asm/non_matchings/boot/system_malloc/SystemArena_IsInitialized.s,SystemArena_IsInitialized,0x80086F7C,0x9
asm/non_matchings/boot/rand/Rand_Next.s,Rand_Next,0x80086FA0,0xC
diff --git a/tools/sizes/code_functions.csv b/tools/sizes/code_functions.csv
index faad9dd9e..261b5a833 100644
--- a/tools/sizes/code_functions.csv
+++ b/tools/sizes/code_functions.csv
@@ -210,10 +210,10 @@ asm/non_matchings/code/z_actor/TitleCard_InitPlaceName.s,TitleCard_InitPlaceName
asm/non_matchings/code/z_actor/TitleCard_Update.s,TitleCard_Update,0x800B5E68,0x2F
asm/non_matchings/code/z_actor/TitleCard_Draw.s,TitleCard_Draw,0x800B5F24,0x144
asm/non_matchings/code/z_actor/func_800B6434.s,func_800B6434,0x800B6434,0xD
-asm/non_matchings/code/z_actor/func_800B6468.s,func_800B6468,0x800B6468,0x3
-asm/non_matchings/code/z_actor/func_800B6474.s,func_800B6474,0x800B6474,0x6
-asm/non_matchings/code/z_actor/func_800B648C.s,func_800B648C,0x800B648C,0x1C
-asm/non_matchings/code/z_actor/func_800B64FC.s,func_800B64FC,0x800B64FC,0x22
+asm/non_matchings/code/z_actor/Actor_InitPlayerImpact.s,Actor_InitPlayerImpact,0x800B6468,0x3
+asm/non_matchings/code/z_actor/Actor_UpdatePlayerImpact.s,Actor_UpdatePlayerImpact,0x800B6474,0x6
+asm/non_matchings/code/z_actor/Actor_SetPlayerImpact.s,Actor_SetPlayerImpact,0x800B648C,0x1C
+asm/non_matchings/code/z_actor/Actor_GetPlayerImpact.s,Actor_GetPlayerImpact,0x800B64FC,0x22
asm/non_matchings/code/z_actor/func_800B6584.s,func_800B6584,0x800B6584,0x21
asm/non_matchings/code/z_actor/func_800B6608.s,func_800B6608,0x800B6608,0x1E
asm/non_matchings/code/z_actor/func_800B6680.s,func_800B6680,0x800B6680,0x23
@@ -373,9 +373,9 @@ asm/non_matchings/code/z_actor/Actor_TestFloorInDirection.s,Actor_TestFloorInDir
asm/non_matchings/code/z_actor/Actor_IsTargeted.s,Actor_IsTargeted,0x800BC5B8,0xD
asm/non_matchings/code/z_actor/Actor_OtherIsTargeted.s,Actor_OtherIsTargeted,0x800BC5EC,0xD
asm/non_matchings/code/z_actor/func_800BC620.s,func_800BC620,0x800BC620,0x54
-asm/non_matchings/code/z_actor/Actor_AddQuake.s,Actor_AddQuake,0x800BC770,0x1A
-asm/non_matchings/code/z_actor/Actor_AddQuakeWithSpeed.s,Actor_AddQuakeWithSpeed,0x800BC7D8,0x1C
-asm/non_matchings/code/z_actor/func_800BC848.s,func_800BC848,0x800BC848,0x1C
+asm/non_matchings/code/z_actor/Actor_RequestQuake.s,Actor_RequestQuake,0x800BC770,0x1A
+asm/non_matchings/code/z_actor/Actor_RequestQuakeWithSpeed.s,Actor_RequestQuakeWithSpeed,0x800BC7D8,0x1C
+asm/non_matchings/code/z_actor/Actor_RequestQuakeAndRumble.s,Actor_RequestQuakeAndRumble,0x800BC848,0x1C
asm/non_matchings/code/z_actor/Actor_DrawDoorLock.s,Actor_DrawDoorLock,0x800BC8B8,0xA6
asm/non_matchings/code/z_actor/Actor_SpawnShieldParticlesMetal.s,Actor_SpawnShieldParticlesMetal,0x800BCB50,0x8
asm/non_matchings/code/z_actor/Actor_SetColorFilter.s,Actor_SetColorFilter,0x800BCB70,0x21
@@ -629,16 +629,16 @@ asm/non_matchings/code/z_bg_item/DynaPoly_ValidateMove.s,DynaPoly_ValidateMove,0
asm/non_matchings/code/z_camera/Camera_fabsf.s,Camera_fabsf,0x800CB210,0xC
asm/non_matchings/code/z_camera/Camera_Vec3fMagnitude.s,Camera_Vec3fMagnitude,0x800CB240,0xC
asm/non_matchings/code/z_camera/Camera_QuadraticAttenuation.s,Camera_QuadraticAttenuation,0x800CB270,0x30
-asm/non_matchings/code/z_camera/Camera_LerpCeilF.s,Camera_LerpCeilF,0x800CB330,0x1A
-asm/non_matchings/code/z_camera/Camera_LerpCeilS.s,Camera_LerpCeilS,0x800CB398,0x25
-asm/non_matchings/code/z_camera/Camera_LerpFloorS.s,Camera_LerpFloorS,0x800CB42C,0x25
-asm/non_matchings/code/z_camera/Camera_LerpCeilVec3f.s,Camera_LerpCeilVec3f,0x800CB4C0,0x21
+asm/non_matchings/code/z_camera/Camera_ScaledStepToCeilF.s,Camera_ScaledStepToCeilF,0x800CB330,0x1A
+asm/non_matchings/code/z_camera/Camera_ScaledStepToCeilS.s,Camera_ScaledStepToCeilS,0x800CB398,0x25
+asm/non_matchings/code/z_camera/Camera_ScaledStepToFloorS.s,Camera_ScaledStepToFloorS,0x800CB42C,0x25
+asm/non_matchings/code/z_camera/Camera_ScaledStepToCeilVec3f.s,Camera_ScaledStepToCeilVec3f,0x800CB4C0,0x21
asm/non_matchings/code/z_camera/Camera_SetUpdateRatesFastPitch.s,Camera_SetUpdateRatesFastPitch,0x800CB544,0x10
asm/non_matchings/code/z_camera/Camera_SetUpdateRatesFastYaw.s,Camera_SetUpdateRatesFastYaw,0x800CB584,0x16
asm/non_matchings/code/z_camera/Camera_SetUpdateRatesSlow.s,Camera_SetUpdateRatesSlow,0x800CB5DC,0xC
asm/non_matchings/code/z_camera/Camera_Vec3sToVec3f.s,Camera_Vec3sToVec3f,0x800CB60C,0x1A
asm/non_matchings/code/z_camera/Camera_AngleDiffAndScale.s,Camera_AngleDiffAndScale,0x800CB674,0x15
-asm/non_matchings/code/z_camera/Camera_UpdateAtActorOffset.s,Camera_UpdateAtActorOffset,0x800CB6C8,0xE
+asm/non_matchings/code/z_camera/Camera_SetFocalActorAtOffset.s,Camera_SetFocalActorAtOffset,0x800CB6C8,0xE
asm/non_matchings/code/z_camera/Camera_GetFocalActorHeight.s,Camera_GetFocalActorHeight,0x800CB700,0x20
asm/non_matchings/code/z_camera/Camera_GetRunSpeedLimit.s,Camera_GetRunSpeedLimit,0x800CB780,0x13
asm/non_matchings/code/z_camera/func_800CB7CC.s,func_800CB7CC,0x800CB7CC,0xB
@@ -661,41 +661,41 @@ asm/non_matchings/code/z_camera/Camera_IsUsingZoraFins.s,Camera_IsUsingZoraFins,
asm/non_matchings/code/z_camera/func_800CBC30.s,func_800CBC30,0x800CBC30,0x15
asm/non_matchings/code/z_camera/func_800CBC84.s,func_800CBC84,0x800CBC84,0xC8
asm/non_matchings/code/z_camera/func_800CBFA4.s,func_800CBFA4,0x800CBFA4,0x17
-asm/non_matchings/code/z_camera/func_800CC000.s,func_800CC000,0x800CC000,0x4A
-asm/non_matchings/code/z_camera/func_800CC128.s,func_800CC128,0x800CC128,0x27
-asm/non_matchings/code/z_camera/func_800CC1C4.s,func_800CC1C4,0x800CC1C4,0x27
+asm/non_matchings/code/z_camera/Camera_BgCheckInfo.s,Camera_BgCheckInfo,0x800CC000,0x4A
+asm/non_matchings/code/z_camera/Camera_BgCheck.s,Camera_BgCheck,0x800CC128,0x27
+asm/non_matchings/code/z_camera/Camera_CheckOOB.s,Camera_CheckOOB,0x800CC1C4,0x27
asm/non_matchings/code/z_camera/func_800CC260.s,func_800CC260,0x800CC260,0x8A
-asm/non_matchings/code/z_camera/func_800CC488.s,func_800CC488,0x800CC488,0x39
-asm/non_matchings/code/z_camera/func_800CC56C.s,func_800CC56C,0x800CC56C,0x17
-asm/non_matchings/code/z_camera/func_800CC5C8.s,func_800CC5C8,0x800CC5C8,0x5E
+asm/non_matchings/code/z_camera/Camera_GetFloorYNorm.s,Camera_GetFloorYNorm,0x800CC488,0x39
+asm/non_matchings/code/z_camera/Camera_GetFloorY.s,Camera_GetFloorY,0x800CC56C,0x17
+asm/non_matchings/code/z_camera/Camera_GetFloorYLayer.s,Camera_GetFloorYLayer,0x800CC5C8,0x5E
asm/non_matchings/code/z_camera/Camera_GetBgCamOrActorCsCamSetting.s,Camera_GetBgCamOrActorCsCamSetting,0x800CC740,0x1A
asm/non_matchings/code/z_camera/Camera_GetBgCamOrActorCsCamFuncData.s,Camera_GetBgCamOrActorCsCamFuncData,0x800CC7A8,0x17
asm/non_matchings/code/z_camera/Camera_GetBgCamIndex.s,Camera_GetBgCamIndex,0x800CC804,0x1C
asm/non_matchings/code/z_camera/Camera_GetWaterBoxBgCamSetting.s,Camera_GetWaterBoxBgCamSetting,0x800CC874,0x31
asm/non_matchings/code/z_camera/func_800CC938.s,func_800CC938,0x800CC938,0x8
-asm/non_matchings/code/z_camera/func_800CC958.s,func_800CC958,0x800CC958,0x1A
-asm/non_matchings/code/z_camera/func_800CC9C0.s,func_800CC9C0,0x800CC9C0,0xCB
+asm/non_matchings/code/z_camera/Camera_CalcXZAngle.s,Camera_CalcXZAngle,0x800CC958,0x1A
+asm/non_matchings/code/z_camera/Camera_GetPitchAdjFromFloorHeightDiffs.s,Camera_GetPitchAdjFromFloorHeightDiffs,0x800CC9C0,0xCB
asm/non_matchings/code/z_camera/func_800CCCEC.s,func_800CCCEC,0x800CCCEC,0xD8
-asm/non_matchings/code/z_camera/func_800CD04C.s,func_800CD04C,0x800CD04C,0x8F
-asm/non_matchings/code/z_camera/func_800CD288.s,func_800CD288,0x800CD288,0x16
-asm/non_matchings/code/z_camera/func_800CD2E0.s,func_800CD2E0,0x800CD2E0,0x4
-asm/non_matchings/code/z_camera/func_800CD2F0.s,func_800CD2F0,0x800CD2F0,0x3D
-asm/non_matchings/code/z_camera/func_800CD3E4.s,func_800CD3E4,0x800CD3E4,0x1A
+asm/non_matchings/code/z_camera/Camera_CalcUpVec.s,Camera_CalcUpVec,0x800CD04C,0x8F
+asm/non_matchings/code/z_camera/Camera_ClampLerpScale.s,Camera_ClampLerpScale,0x800CD288,0x16
+asm/non_matchings/code/z_camera/Camera_ResetActionFuncState.s,Camera_ResetActionFuncState,0x800CD2E0,0x4
+asm/non_matchings/code/z_camera/Camera_UpdateInterface.s,Camera_UpdateInterface,0x800CD2F0,0x3D
+asm/non_matchings/code/z_camera/Camera_BgCheckCorner.s,Camera_BgCheckCorner,0x800CD3E4,0x1A
asm/non_matchings/code/z_camera/func_800CD44C.s,func_800CD44C,0x800CD44C,0x7A
-asm/non_matchings/code/z_camera/func_800CD634.s,func_800CD634,0x800CD634,0x26
+asm/non_matchings/code/z_camera/Camera_CalcSlopeYAdj.s,Camera_CalcSlopeYAdj,0x800CD634,0x26
asm/non_matchings/code/z_camera/func_800CD6CC.s,func_800CD6CC,0x800CD6CC,0xB
-asm/non_matchings/code/z_camera/func_800CD6F8.s,func_800CD6F8,0x800CD6F8,0x4F
-asm/non_matchings/code/z_camera/func_800CD834.s,func_800CD834,0x800CD834,0x78
-asm/non_matchings/code/z_camera/func_800CDA14.s,func_800CDA14,0x800CDA14,0x56
-asm/non_matchings/code/z_camera/func_800CDB6C.s,func_800CDB6C,0x800CDB6C,0xC0
-asm/non_matchings/code/z_camera/func_800CDE6C.s,func_800CDE6C,0x800CDE6C,0x113
-asm/non_matchings/code/z_camera/func_800CE2B8.s,func_800CE2B8,0x800CE2B8,0xCA
-asm/non_matchings/code/z_camera/func_800CE5E0.s,func_800CE5E0,0x800CE5E0,0x6F
-asm/non_matchings/code/z_camera/func_800CE79C.s,func_800CE79C,0x800CE79C,0x65
-asm/non_matchings/code/z_camera/func_800CE930.s,func_800CE930,0x800CE930,0x6A
-asm/non_matchings/code/z_camera/func_800CEAD8.s,func_800CEAD8,0x800CEAD8,0x58
-asm/non_matchings/code/z_camera/func_800CEC38.s,func_800CEC38,0x800CEC38,0x56
-asm/non_matchings/code/z_camera/func_800CED90.s,func_800CED90,0x800CED90,0x185
+asm/non_matchings/code/z_camera/Camera_CalcAtDefault.s,Camera_CalcAtDefault,0x800CD6F8,0x4F
+asm/non_matchings/code/z_camera/Camera_CalcAtForScreen.s,Camera_CalcAtForScreen,0x800CD834,0x78
+asm/non_matchings/code/z_camera/Camera_CalcAtForNormal1.s,Camera_CalcAtForNormal1,0x800CDA14,0x56
+asm/non_matchings/code/z_camera/Camera_CalcAtForParallel.s,Camera_CalcAtForParallel,0x800CDB6C,0xC0
+asm/non_matchings/code/z_camera/Camera_CalcAtForFriendlyLockOn.s,Camera_CalcAtForFriendlyLockOn,0x800CDE6C,0x113
+asm/non_matchings/code/z_camera/Camera_CalcAtForEnemyLockOn.s,Camera_CalcAtForEnemyLockOn,0x800CE2B8,0xCA
+asm/non_matchings/code/z_camera/Camera_CalcAtForHorse.s,Camera_CalcAtForHorse,0x800CE5E0,0x6F
+asm/non_matchings/code/z_camera/Camera_ClampDist1.s,Camera_ClampDist1,0x800CE79C,0x65
+asm/non_matchings/code/z_camera/Camera_ClampDist2.s,Camera_ClampDist2,0x800CE930,0x6A
+asm/non_matchings/code/z_camera/Camera_CalcDefaultPitch.s,Camera_CalcDefaultPitch,0x800CEAD8,0x58
+asm/non_matchings/code/z_camera/Camera_CalcDefaultYaw.s,Camera_CalcDefaultYaw,0x800CEC38,0x56
+asm/non_matchings/code/z_camera/Camera_CalcDefaultSwing.s,Camera_CalcDefaultSwing,0x800CED90,0x185
asm/non_matchings/code/z_camera/Camera_Noop.s,Camera_Noop,0x800CF3A4,0x4
asm/non_matchings/code/z_camera/Camera_Normal1.s,Camera_Normal1,0x800CF3B4,0x530
asm/non_matchings/code/z_camera/Camera_Normal2.s,Camera_Normal2,0x800D0874,0x8
@@ -767,48 +767,48 @@ asm/non_matchings/code/z_camera/Camera_Special6.s,Camera_Special6,0x800DD0FC,0x8
asm/non_matchings/code/z_camera/Camera_Special7.s,Camera_Special7,0x800DD11C,0x8
asm/non_matchings/code/z_camera/Camera_Special8.s,Camera_Special8,0x800DD13C,0x11F
asm/non_matchings/code/z_camera/Camera_Special9.s,Camera_Special9,0x800DD5B8,0x1E8
-asm/non_matchings/code/z_camera/Camera_Alloc.s,Camera_Alloc,0x800DDD58,0x14
-asm/non_matchings/code/z_camera/Camera_Free.s,Camera_Free,0x800DDDA8,0xA
+asm/non_matchings/code/z_camera/Camera_Create.s,Camera_Create,0x800DDD58,0x14
+asm/non_matchings/code/z_camera/Camera_Destroy.s,Camera_Destroy,0x800DDDA8,0xA
asm/non_matchings/code/z_camera/Camera_Init.s,Camera_Init,0x800DDDD0,0x84
asm/non_matchings/code/z_camera/func_800DDFE0.s,func_800DDFE0,0x800DDFE0,0x40
-asm/non_matchings/code/z_camera/func_800DE0E0.s,func_800DE0E0,0x800DE0E0,0x3
-asm/non_matchings/code/z_camera/Camera_InitPlayerSettings.s,Camera_InitPlayerSettings,0x800DE0EC,0x87
+asm/non_matchings/code/z_camera/Camera_Stub800DE0E0.s,Camera_Stub800DE0E0,0x800DE0E0,0x3
+asm/non_matchings/code/z_camera/Camera_InitFocalActorSettings.s,Camera_InitFocalActorSettings,0x800DE0EC,0x87
asm/non_matchings/code/z_camera/Camera_ChangeStatus.s,Camera_ChangeStatus,0x800DE308,0x7
-asm/non_matchings/code/z_camera/func_800DE324.s,func_800DE324,0x800DE324,0xC2
-asm/non_matchings/code/z_camera/func_800DE62C.s,func_800DE62C,0x800DE62C,0x85
-asm/non_matchings/code/z_camera/func_800DE840.s,func_800DE840,0x800DE840,0x14
-asm/non_matchings/code/z_camera/func_800DE890.s,func_800DE890,0x800DE890,0x31
-asm/non_matchings/code/z_camera/func_800DE954.s,func_800DE954,0x800DE954,0x17
+asm/non_matchings/code/z_camera/Camera_UpdateWater.s,Camera_UpdateWater,0x800DE324,0xC2
+asm/non_matchings/code/z_camera/Camera_EarthquakeDay3.s,Camera_EarthquakeDay3,0x800DE62C,0x85
+asm/non_matchings/code/z_camera/Camera_UpdateHotRoom.s,Camera_UpdateHotRoom,0x800DE840,0x14
+asm/non_matchings/code/z_camera/Camera_SetSwordDistortion.s,Camera_SetSwordDistortion,0x800DE890,0x31
+asm/non_matchings/code/z_camera/Camera_RequestGiantsMaskSetting.s,Camera_RequestGiantsMaskSetting,0x800DE954,0x17
asm/non_matchings/code/z_camera/Camera_Update.s,Camera_Update,0x800DE9B0,0x2BA
asm/non_matchings/code/z_camera/func_800DF498.s,func_800DF498,0x800DF498,0xE
-asm/non_matchings/code/z_camera/Camera_SetMode.s,Camera_SetMode,0x800DF4D0,0xDC
+asm/non_matchings/code/z_camera/Camera_ChangeModeFlags.s,Camera_ChangeModeFlags,0x800DF4D0,0xDC
asm/non_matchings/code/z_camera/Camera_ChangeMode.s,Camera_ChangeMode,0x800DF840,0xB
-asm/non_matchings/code/z_camera/func_800DF86C.s,func_800DF86C,0x800DF86C,0x20
-asm/non_matchings/code/z_camera/func_800DF8EC.s,func_800DF8EC,0x800DF8EC,0x77
+asm/non_matchings/code/z_camera/Camera_CheckValidMode.s,Camera_CheckValidMode,0x800DF86C,0x20
+asm/non_matchings/code/z_camera/Camera_ChangeSettingFlags.s,Camera_ChangeSettingFlags,0x800DF8EC,0x77
asm/non_matchings/code/z_camera/Camera_ChangeSetting.s,Camera_ChangeSetting,0x800DFAC8,0x13
-asm/non_matchings/code/z_camera/Camera_ChangeDataIdx.s,Camera_ChangeDataIdx,0x800DFB14,0x42
-asm/non_matchings/code/z_camera/func_800DFC1C.s,func_800DFC1C,0x800DFC1C,0x9
-asm/non_matchings/code/z_camera/func_800DFC40.s,func_800DFC40,0x800DFC40,0xA
+asm/non_matchings/code/z_camera/Camera_ChangeActorCsCamIndex.s,Camera_ChangeActorCsCamIndex,0x800DFB14,0x42
+asm/non_matchings/code/z_camera/Camera_GetInputDir.s,Camera_GetInputDir,0x800DFC1C,0x9
+asm/non_matchings/code/z_camera/Camera_GetInputDirPitch.s,Camera_GetInputDirPitch,0x800DFC40,0xA
asm/non_matchings/code/z_camera/Camera_GetInputDirYaw.s,Camera_GetInputDirYaw,0x800DFC68,0xA
asm/non_matchings/code/z_camera/Camera_GetCamDir.s,Camera_GetCamDir,0x800DFC90,0x9
asm/non_matchings/code/z_camera/Camera_GetCamDirPitch.s,Camera_GetCamDirPitch,0x800DFCB4,0xA
asm/non_matchings/code/z_camera/Camera_GetCamDirYaw.s,Camera_GetCamDirYaw,0x800DFCDC,0xA
asm/non_matchings/code/z_camera/Camera_AddQuake.s,Camera_AddQuake,0x800DFD04,0x1D
asm/non_matchings/code/z_camera/Camera_SetViewParam.s,Camera_SetViewParam,0x800DFD78,0x5E
-asm/non_matchings/code/z_camera/func_800DFEF0.s,func_800DFEF0,0x800DFEF0,0xA
-asm/non_matchings/code/z_camera/func_800DFF18.s,func_800DFF18,0x800DFF18,0x7
-asm/non_matchings/code/z_camera/func_800DFF34.s,func_800DFF34,0x800DFF34,0x4
-asm/non_matchings/code/z_camera/func_800DFF44.s,func_800DFF44,0x800DFF44,0x7
-asm/non_matchings/code/z_camera/Camera_SetFlags.s,Camera_SetFlags,0x800DFF60,0x9
-asm/non_matchings/code/z_camera/Camera_ClearFlags.s,Camera_ClearFlags,0x800DFF84,0xA
+asm/non_matchings/code/z_camera/Camera_UnsetViewFlag.s,Camera_UnsetViewFlag,0x800DFEF0,0xA
+asm/non_matchings/code/z_camera/Camera_OverwriteStateFlags.s,Camera_OverwriteStateFlags,0x800DFF18,0x7
+asm/non_matchings/code/z_camera/Camera_ResetActionFuncStateUnused.s,Camera_ResetActionFuncStateUnused,0x800DFF34,0x4
+asm/non_matchings/code/z_camera/Camera_SetCsParams.s,Camera_SetCsParams,0x800DFF44,0x7
+asm/non_matchings/code/z_camera/Camera_SetStateFlag.s,Camera_SetStateFlag,0x800DFF60,0x9
+asm/non_matchings/code/z_camera/Camera_UnsetStateFlag.s,Camera_UnsetStateFlag,0x800DFF84,0xA
asm/non_matchings/code/z_camera/Camera_ChangeDoorCam.s,Camera_ChangeDoorCam,0x800DFFAC,0x34
asm/non_matchings/code/z_camera/Camera_Copy.s,Camera_Copy,0x800E007C,0x4C
-asm/non_matchings/code/z_camera/func_800E01AC.s,func_800E01AC,0x800E01AC,0x3
+asm/non_matchings/code/z_camera/Camera_IsDbgCamEnabled.s,Camera_IsDbgCamEnabled,0x800E01AC,0x3
asm/non_matchings/code/z_camera/Camera_GetQuakeOffset.s,Camera_GetQuakeOffset,0x800E01B8,0x9
-asm/non_matchings/code/z_camera/func_800E01DC.s,func_800E01DC,0x800E01DC,0x13
-asm/non_matchings/code/z_camera/func_800E0228.s,func_800E0228,0x800E0228,0x4
+asm/non_matchings/code/z_camera/Camera_SetCameraData.s,Camera_SetCameraData,0x800E01DC,0x13
+asm/non_matchings/code/z_camera/Camera_GetNegOne.s,Camera_GetNegOne,0x800E0228,0x4
asm/non_matchings/code/z_camera/func_800E0238.s,func_800E0238,0x800E0238,0x1D
-asm/non_matchings/code/z_camera/Camera_SetToTrackActor.s,Camera_SetToTrackActor,0x800E02AC,0x17
+asm/non_matchings/code/z_camera/Camera_SetFocalActor.s,Camera_SetFocalActor,0x800E02AC,0x17
asm/non_matchings/code/z_camera/Camera_SetTargetActor.s,Camera_SetTargetActor,0x800E0308,0x5
asm/non_matchings/code/z_camera/Camera_GetWaterYPos.s,Camera_GetWaterYPos,0x800E031C,0xB
asm/non_matchings/code/z_camera/func_800E0348.s,func_800E0348,0x800E0348,0x16
@@ -1586,17 +1586,17 @@ asm/non_matchings/code/z_olib/OLib_ClampMinDist.s,OLib_ClampMinDist,0x8010C304,0
asm/non_matchings/code/z_olib/OLib_ClampMaxDist.s,OLib_ClampMaxDist,0x8010C36C,0x1A
asm/non_matchings/code/z_olib/OLib_Vec3fDistNormalize.s,OLib_Vec3fDistNormalize,0x8010C3D4,0x2C
asm/non_matchings/code/z_olib/OLib_VecSphToVec3f.s,OLib_VecSphToVec3f,0x8010C484,0x2B
-asm/non_matchings/code/z_olib/OLib_VecSphGeoToVec3f.s,OLib_VecSphGeoToVec3f,0x8010C530,0x11
+asm/non_matchings/code/z_olib/OLib_VecGeoToVec3f.s,OLib_VecGeoToVec3f,0x8010C530,0x11
asm/non_matchings/code/z_olib/OLib_Vec3fToVecSph.s,OLib_Vec3fToVecSph,0x8010C574,0x55
-asm/non_matchings/code/z_olib/OLib_Vec3fToVecSphGeo.s,OLib_Vec3fToVecSphGeo,0x8010C6C8,0x12
+asm/non_matchings/code/z_olib/OLib_Vec3fToVecGeo.s,OLib_Vec3fToVecGeo,0x8010C6C8,0x12
asm/non_matchings/code/z_olib/OLib_Vec3fDiffToVecSph.s,OLib_Vec3fDiffToVecSph,0x8010C710,0x15
-asm/non_matchings/code/z_olib/OLib_Vec3fDiffToVecSphGeo.s,OLib_Vec3fDiffToVecSphGeo,0x8010C764,0x15
-asm/non_matchings/code/z_olib/OLib_VecSphAddToVec3f.s,OLib_VecSphAddToVec3f,0x8010C7B8,0x20
+asm/non_matchings/code/z_olib/OLib_Vec3fDiffToVecGeo.s,OLib_Vec3fDiffToVecGeo,0x8010C764,0x15
+asm/non_matchings/code/z_olib/OLib_AddVecGeoToVec3f.s,OLib_AddVecGeoToVec3f,0x8010C7B8,0x20
asm/non_matchings/code/z_olib/OLib_Vec3fDiffRad.s,OLib_Vec3fDiffRad,0x8010C838,0x24
asm/non_matchings/code/z_olib/OLib_Vec3fDiffDegF.s,OLib_Vec3fDiffDegF,0x8010C8C8,0x1A
asm/non_matchings/code/z_olib/OLib_Vec3fDiffBinAng.s,OLib_Vec3fDiffBinAng,0x8010C930,0x26
-asm/non_matchings/code/z_olib/OLib_DbCameraVec3fDiff.s,OLib_DbCameraVec3fDiff,0x8010C9C8,0x36
-asm/non_matchings/code/z_olib/OLib_DbCameraVec3fSum.s,OLib_DbCameraVec3fSum,0x8010CAA0,0x34
+asm/non_matchings/code/z_olib/OLib_Vec3fDiff.s,OLib_Vec3fDiff,0x8010C9C8,0x36
+asm/non_matchings/code/z_olib/OLib_Vec3fAdd.s,OLib_Vec3fAdd,0x8010CAA0,0x34
asm/non_matchings/code/z_parameter/Gfx_DrawTexRectRGBA16.s,Gfx_DrawTexRectRGBA16,0x8010CB80,0x86
asm/non_matchings/code/z_parameter/Gfx_DrawTexRectIA8.s,Gfx_DrawTexRectIA8,0x8010CD98,0x89
asm/non_matchings/code/z_parameter/Gfx_DrawTexRectIA8_DropShadow.s,Gfx_DrawTexRectIA8_DropShadow,0x8010CFBC,0xC6
@@ -1803,97 +1803,97 @@ asm/non_matchings/code/z_quake/Quake_CallbackType3.s,Quake_CallbackType3,0x8012A
asm/non_matchings/code/z_quake/Quake_CallbackType2.s,Quake_CallbackType2,0x8012A4D0,0x1C
asm/non_matchings/code/z_quake/Quake_CallbackType4.s,Quake_CallbackType4,0x8012A540,0x26
asm/non_matchings/code/z_quake/Quake_GetFreeIndex.s,Quake_GetFreeIndex,0x8012A5D8,0x18
-asm/non_matchings/code/z_quake/Quake_AddImpl.s,Quake_AddImpl,0x8012A638,0x2E
-asm/non_matchings/code/z_quake/Quake_RemoveRequest.s,Quake_RemoveRequest,0x8012A6F0,0xA
+asm/non_matchings/code/z_quake/Quake_RequestImpl.s,Quake_RequestImpl,0x8012A638,0x2E
+asm/non_matchings/code/z_quake/Quake_Remove.s,Quake_Remove,0x8012A6F0,0xA
asm/non_matchings/code/z_quake/Quake_GetRequest.s,Quake_GetRequest,0x8012A718,0x17
asm/non_matchings/code/z_quake/Quake_SetValue.s,Quake_SetValue,0x8012A774,0x4D
asm/non_matchings/code/z_quake/Quake_SetSpeed.s,Quake_SetSpeed,0x8012A8A8,0x12
-asm/non_matchings/code/z_quake/Quake_SetCountdown.s,Quake_SetCountdown,0x8012A8F0,0x14
-asm/non_matchings/code/z_quake/Quake_GetCountdown.s,Quake_GetCountdown,0x8012A940,0xE
-asm/non_matchings/code/z_quake/Quake_SetQuakeValues.s,Quake_SetQuakeValues,0x8012A978,0x1A
-asm/non_matchings/code/z_quake/Quake_SetQuakeValues2.s,Quake_SetQuakeValues2,0x8012A9E0,0x1A
+asm/non_matchings/code/z_quake/Quake_SetDuration.s,Quake_SetDuration,0x8012A8F0,0x14
+asm/non_matchings/code/z_quake/Quake_GetTimeLeft.s,Quake_GetTimeLeft,0x8012A940,0xE
+asm/non_matchings/code/z_quake/Quake_SetPerturbations.s,Quake_SetPerturbations,0x8012A978,0x1A
+asm/non_matchings/code/z_quake/Quake_SetOrientation.s,Quake_SetOrientation,0x8012A9E0,0x1A
asm/non_matchings/code/z_quake/Quake_Init.s,Quake_Init,0x8012AA48,0x15
-asm/non_matchings/code/z_quake/Quake_Add.s,Quake_Add,0x8012AA9C,0x9
-asm/non_matchings/code/z_quake/Quake_Remove.s,Quake_Remove,0x8012AAC0,0x12
-asm/non_matchings/code/z_quake/Quake_Calc.s,Quake_Calc,0x8012AB08,0xD8
+asm/non_matchings/code/z_quake/Quake_Request.s,Quake_Request,0x8012AA9C,0x9
+asm/non_matchings/code/z_quake/Quake_RemoveRequest.s,Quake_RemoveRequest,0x8012AAC0,0x12
+asm/non_matchings/code/z_quake/Quake_Update.s,Quake_Update,0x8012AB08,0xD8
asm/non_matchings/code/z_quake/Distortion_Init.s,Distortion_Init,0x8012AE68,0x11
-asm/non_matchings/code/z_quake/Distortion_SetCountdown.s,Distortion_SetCountdown,0x8012AEAC,0xA
-asm/non_matchings/code/z_quake/Distortion_GetCountdown.s,Distortion_GetCountdown,0x8012AED4,0x4
+asm/non_matchings/code/z_quake/Distortion_SetDuration.s,Distortion_SetDuration,0x8012AEAC,0xA
+asm/non_matchings/code/z_quake/Distortion_GetTimeLeft.s,Distortion_GetTimeLeft,0x8012AED4,0x4
asm/non_matchings/code/z_quake/Distortion_GetType.s,Distortion_GetType,0x8012AEE4,0x4
-asm/non_matchings/code/z_quake/Distortion_SetType.s,Distortion_SetType,0x8012AEF4,0x9
-asm/non_matchings/code/z_quake/Distortion_ClearType.s,Distortion_ClearType,0x8012AF18,0x8
+asm/non_matchings/code/z_quake/Distortion_Request.s,Distortion_Request,0x8012AEF4,0x9
+asm/non_matchings/code/z_quake/Distortion_RemoveRequest.s,Distortion_RemoveRequest,0x8012AF18,0x8
asm/non_matchings/code/z_quake/Distortion_GetUnderwaterCurrentSpeed.s,Distortion_GetUnderwaterCurrentSpeed,0x8012AF38,0x19
asm/non_matchings/code/z_quake/Distortion_Update.s,Distortion_Update,0x8012AF9C,0x313
-asm/non_matchings/code/z_quake/Quake_NumActiveQuakes.s,Quake_NumActiveQuakes,0x8012BBE8,0x1A
+asm/non_matchings/code/z_quake/Quake_GetNumActiveQuakes.s,Quake_GetNumActiveQuakes,0x8012BBE8,0x1A
asm/non_matchings/code/z_rcp/Gfx_SetFog.s,Gfx_SetFog,0x8012BC50,0x4F
asm/non_matchings/code/z_rcp/Gfx_SetFogWithSync.s,Gfx_SetFogWithSync,0x8012BD8C,0x5F
asm/non_matchings/code/z_rcp/Gfx_SetFog2.s,Gfx_SetFog2,0x8012BF08,0xD
-asm/non_matchings/code/z_rcp/Gfx_CallSetupDLImpl.s,Gfx_CallSetupDLImpl,0x8012BF3C,0xF
-asm/non_matchings/code/z_rcp/Gfx_CallSetupDL.s,Gfx_CallSetupDL,0x8012BF78,0x8
-asm/non_matchings/code/z_rcp/Gfx_CallSetupDLAtPtr.s,Gfx_CallSetupDLAtPtr,0x8012BF98,0xB
-asm/non_matchings/code/z_rcp/func_8012BFC4.s,func_8012BFC4,0x8012BFC4,0xA
-asm/non_matchings/code/z_rcp/func_8012BFEC.s,func_8012BFEC,0x8012BFEC,0xA
-asm/non_matchings/code/z_rcp/func_8012C014.s,func_8012C014,0x8012C014,0x11
-asm/non_matchings/code/z_rcp/func_8012C058.s,func_8012C058,0x8012C058,0xA
-asm/non_matchings/code/z_rcp/func_8012C080.s,func_8012C080,0x8012C080,0xA
-asm/non_matchings/code/z_rcp/func_8012C0A8.s,func_8012C0A8,0x8012C0A8,0xA
-asm/non_matchings/code/z_rcp/func_8012C0D0.s,func_8012C0D0,0x8012C0D0,0xA
-asm/non_matchings/code/z_rcp/func_8012C0F8.s,func_8012C0F8,0x8012C0F8,0xA
-asm/non_matchings/code/z_rcp/func_8012C120.s,func_8012C120,0x8012C120,0xA
-asm/non_matchings/code/z_rcp/func_8012C148.s,func_8012C148,0x8012C148,0xA
-asm/non_matchings/code/z_rcp/func_8012C170.s,func_8012C170,0x8012C170,0xA
-asm/non_matchings/code/z_rcp/func_8012C198.s,func_8012C198,0x8012C198,0xA
-asm/non_matchings/code/z_rcp/func_8012C1C0.s,func_8012C1C0,0x8012C1C0,0xB
-asm/non_matchings/code/z_rcp/func_8012C1EC.s,func_8012C1EC,0x8012C1EC,0xA
-asm/non_matchings/code/z_rcp/func_8012C214.s,func_8012C214,0x8012C214,0xB
-asm/non_matchings/code/z_rcp/func_8012C240.s,func_8012C240,0x8012C240,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDLImpl.s,Gfx_SetupDLImpl,0x8012BF3C,0xF
+asm/non_matchings/code/z_rcp/Gfx_SetupDL.s,Gfx_SetupDL,0x8012BF78,0x8
+asm/non_matchings/code/z_rcp/Gfx_SetupDLAtPtr.s,Gfx_SetupDLAtPtr,0x8012BF98,0xB
+asm/non_matchings/code/z_rcp/Gfx_SetupDL57.s,Gfx_SetupDL57,0x8012BFC4,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL57_b.s,Gfx_SetupDL57_b,0x8012BFEC,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL52_NoCD.s,Gfx_SetupDL52_NoCD,0x8012C014,0x11
+asm/non_matchings/code/z_rcp/Gfx_SetupDL58_Opa.s,Gfx_SetupDL58_Opa,0x8012C058,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL57_Opa.s,Gfx_SetupDL57_Opa,0x8012C080,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL50_Opa.s,Gfx_SetupDL50_Opa,0x8012C0A8,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL51_Opa.s,Gfx_SetupDL51_Opa,0x8012C0D0,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL52_Xlu.s,Gfx_SetupDL52_Xlu,0x8012C0F8,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL53_Opa.s,Gfx_SetupDL53_Opa,0x8012C120,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL54_Opa.s,Gfx_SetupDL54_Opa,0x8012C148,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL55_Xlu.s,Gfx_SetupDL55_Xlu,0x8012C170,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL26.s,Gfx_SetupDL26,0x8012C198,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL26_Opa.s,Gfx_SetupDL26_Opa,0x8012C1C0,0xB
+asm/non_matchings/code/z_rcp/Gfx_SetupDL23.s,Gfx_SetupDL23,0x8012C1EC,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL23_Opa.s,Gfx_SetupDL23_Opa,0x8012C214,0xB
+asm/non_matchings/code/z_rcp/Gfx_SetupDL25_Xlu2.s,Gfx_SetupDL25_Xlu2,0x8012C240,0xA
asm/non_matchings/code/z_rcp/func_8012C268.s,func_8012C268,0x8012C268,0x9
-asm/non_matchings/code/z_rcp/func_8012C28C.s,func_8012C28C,0x8012C28C,0xA
-asm/non_matchings/code/z_rcp/func_8012C2B4.s,func_8012C2B4,0x8012C2B4,0xA
-asm/non_matchings/code/z_rcp/func_8012C2DC.s,func_8012C2DC,0x8012C2DC,0xA
-asm/non_matchings/code/z_rcp/func_8012C304.s,func_8012C304,0x8012C304,0xA
-asm/non_matchings/code/z_rcp/func_8012C32C.s,func_8012C32C,0x8012C32C,0xA
-asm/non_matchings/code/z_rcp/func_8012C354.s,func_8012C354,0x8012C354,0xA
-asm/non_matchings/code/z_rcp/func_8012C37C.s,func_8012C37C,0x8012C37C,0xA
-asm/non_matchings/code/z_rcp/func_8012C3A4.s,func_8012C3A4,0x8012C3A4,0xA
-asm/non_matchings/code/z_rcp/func_8012C3CC.s,func_8012C3CC,0x8012C3CC,0xA
-asm/non_matchings/code/z_rcp/func_8012C3F4.s,func_8012C3F4,0x8012C3F4,0xB
-asm/non_matchings/code/z_rcp/func_8012C420.s,func_8012C420,0x8012C420,0xA
-asm/non_matchings/code/z_rcp/func_8012C448.s,func_8012C448,0x8012C448,0xA
-asm/non_matchings/code/z_rcp/func_8012C470.s,func_8012C470,0x8012C470,0xA
-asm/non_matchings/code/z_rcp/func_8012C498.s,func_8012C498,0x8012C498,0xA
-asm/non_matchings/code/z_rcp/func_8012C4C0.s,func_8012C4C0,0x8012C4C0,0xA
-asm/non_matchings/code/z_rcp/func_8012C4E8.s,func_8012C4E8,0x8012C4E8,0xA
-asm/non_matchings/code/z_rcp/func_8012C510.s,func_8012C510,0x8012C510,0xA
-asm/non_matchings/code/z_rcp/func_8012C538.s,func_8012C538,0x8012C538,0xA
-asm/non_matchings/code/z_rcp/func_8012C560.s,func_8012C560,0x8012C560,0xA
-asm/non_matchings/code/z_rcp/func_8012C588.s,func_8012C588,0x8012C588,0xA
-asm/non_matchings/code/z_rcp/func_8012C5B0.s,func_8012C5B0,0x8012C5B0,0xA
-asm/non_matchings/code/z_rcp/func_8012C5D8.s,func_8012C5D8,0x8012C5D8,0xA
-asm/non_matchings/code/z_rcp/func_8012C600.s,func_8012C600,0x8012C600,0xA
-asm/non_matchings/code/z_rcp/func_8012C628.s,func_8012C628,0x8012C628,0xB
-asm/non_matchings/code/z_rcp/func_8012C654.s,func_8012C654,0x8012C654,0xB
-asm/non_matchings/code/z_rcp/func_8012C680.s,func_8012C680,0x8012C680,0xB
-asm/non_matchings/code/z_rcp/func_8012C6AC.s,func_8012C6AC,0x8012C6AC,0xA
-asm/non_matchings/code/z_rcp/func_8012C6D4.s,func_8012C6D4,0x8012C6D4,0xA
-asm/non_matchings/code/z_rcp/func_8012C6FC.s,func_8012C6FC,0x8012C6FC,0xA
-asm/non_matchings/code/z_rcp/func_8012C724.s,func_8012C724,0x8012C724,0xA
-asm/non_matchings/code/z_rcp/func_8012C74C.s,func_8012C74C,0x8012C74C,0xA
-asm/non_matchings/code/z_rcp/func_8012C774.s,func_8012C774,0x8012C774,0x11
-asm/non_matchings/code/z_rcp/func_8012C7B8.s,func_8012C7B8,0x8012C7B8,0x11
-asm/non_matchings/code/z_rcp/func_8012C7FC.s,func_8012C7FC,0x8012C7FC,0x11
-asm/non_matchings/code/z_rcp/func_8012C840.s,func_8012C840,0x8012C840,0xA
-asm/non_matchings/code/z_rcp/func_8012C868.s,func_8012C868,0x8012C868,0x11
-asm/non_matchings/code/z_rcp/func_8012C8AC.s,func_8012C8AC,0x8012C8AC,0xA
-asm/non_matchings/code/z_rcp/func_8012C8D4.s,func_8012C8D4,0x8012C8D4,0xA
-asm/non_matchings/code/z_rcp/func_8012C8FC.s,func_8012C8FC,0x8012C8FC,0xA
-asm/non_matchings/code/z_rcp/func_8012C924.s,func_8012C924,0x8012C924,0xA
-asm/non_matchings/code/z_rcp/func_8012C94C.s,func_8012C94C,0x8012C94C,0xA
-asm/non_matchings/code/z_rcp/func_8012C974.s,func_8012C974,0x8012C974,0x12
-asm/non_matchings/code/z_rcp/func_8012C9BC.s,func_8012C9BC,0x8012C9BC,0xA
-asm/non_matchings/code/z_rcp/func_8012C9E4.s,func_8012C9E4,0x8012C9E4,0xA
-asm/non_matchings/code/z_rcp/func_8012CA0C.s,func_8012CA0C,0x8012CA0C,0xB
-asm/non_matchings/code/z_rcp/func_8012CA38.s,func_8012CA38,0x8012CA38,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL25_Opa.s,Gfx_SetupDL25_Opa,0x8012C28C,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL71.s,Gfx_SetupDL71,0x8012C2B4,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL25_Xlu.s,Gfx_SetupDL25_Xlu,0x8012C2DC,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL72.s,Gfx_SetupDL72,0x8012C304,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL31_Opa.s,Gfx_SetupDL31_Opa,0x8012C32C,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL32_Opa.s,Gfx_SetupDL32_Opa,0x8012C354,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL33_Opa.s,Gfx_SetupDL33_Opa,0x8012C37C,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL64.s,Gfx_SetupDL64,0x8012C3A4,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL34.s,Gfx_SetupDL34,0x8012C3CC,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL34_Opa.s,Gfx_SetupDL34_Opa,0x8012C3F4,0xB
+asm/non_matchings/code/z_rcp/Gfx_SetupDL35_Opa.s,Gfx_SetupDL35_Opa,0x8012C420,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL44_Xlu.s,Gfx_SetupDL44_Xlu,0x8012C448,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL36_Opa.s,Gfx_SetupDL36_Opa,0x8012C470,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL28.s,Gfx_SetupDL28,0x8012C498,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL28_Opa.s,Gfx_SetupDL28_Opa,0x8012C4C0,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL43_Opa.s,Gfx_SetupDL43_Opa,0x8012C4E8,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL45_Opa.s,Gfx_SetupDL45_Opa,0x8012C510,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL46_Overlay.s,Gfx_SetupDL46_Overlay,0x8012C538,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL38_Xlu.s,Gfx_SetupDL38_Xlu,0x8012C560,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL4_Xlu.s,Gfx_SetupDL4_Xlu,0x8012C588,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL37_Opa.s,Gfx_SetupDL37_Opa,0x8012C5B0,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL2_Opa.s,Gfx_SetupDL2_Opa,0x8012C5D8,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL39.s,Gfx_SetupDL39,0x8012C600,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL39_Opa.s,Gfx_SetupDL39_Opa,0x8012C628,0xB
+asm/non_matchings/code/z_rcp/Gfx_SetupDL39_Overlay.s,Gfx_SetupDL39_Overlay,0x8012C654,0xB
+asm/non_matchings/code/z_rcp/Gfx_SetupDL39_Ptr.s,Gfx_SetupDL39_Ptr,0x8012C680,0xB
+asm/non_matchings/code/z_rcp/Gfx_SetupDL40_Opa.s,Gfx_SetupDL40_Opa,0x8012C6AC,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL41_Opa.s,Gfx_SetupDL41_Opa,0x8012C6D4,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL47_Xlu.s,Gfx_SetupDL47_Xlu,0x8012C6FC,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL66.s,Gfx_SetupDL66,0x8012C724,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL67.s,Gfx_SetupDL67,0x8012C74C,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL68_NoCD.s,Gfx_SetupDL68_NoCD,0x8012C774,0x11
+asm/non_matchings/code/z_rcp/Gfx_SetupDL69_NoCD.s,Gfx_SetupDL69_NoCD,0x8012C7B8,0x11
+asm/non_matchings/code/z_rcp/Gfx_SetupDL65_NoCD.s,Gfx_SetupDL65_NoCD,0x8012C7FC,0x11
+asm/non_matchings/code/z_rcp/Gfx_SetupDL70.s,Gfx_SetupDL70,0x8012C840,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL20_NoCD.s,Gfx_SetupDL20_NoCD,0x8012C868,0x11
+asm/non_matchings/code/z_rcp/Gfx_SetupDL42_Opa.s,Gfx_SetupDL42_Opa,0x8012C8AC,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL42_Overlay.s,Gfx_SetupDL42_Overlay,0x8012C8D4,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL48_Opa.s,Gfx_SetupDL48_Opa,0x8012C8FC,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL49_Xlu.s,Gfx_SetupDL49_Xlu,0x8012C924,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL27_Xlu.s,Gfx_SetupDL27_Xlu,0x8012C94C,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL60_XluNoCD.s,Gfx_SetupDL60_XluNoCD,0x8012C974,0x12
+asm/non_matchings/code/z_rcp/Gfx_SetupDL61_Xlu.s,Gfx_SetupDL61_Xlu,0x8012C9BC,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL56_Opa.s,Gfx_SetupDL56_Opa,0x8012C9E4,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL56_Ptr.s,Gfx_SetupDL56_Ptr,0x8012CA0C,0xB
+asm/non_matchings/code/z_rcp/Gfx_SetupDL59_Opa.s,Gfx_SetupDL59_Opa,0x8012CA38,0xA
asm/non_matchings/code/z_rcp/Gfx_BranchTexScroll.s,Gfx_BranchTexScroll,0x8012CA60,0x29
asm/non_matchings/code/z_rcp/func_8012CB04.s,func_8012CB04,0x8012CB04,0x9
asm/non_matchings/code/z_rcp/func_8012CB28.s,func_8012CB28,0x8012CB28,0x9
@@ -2678,33 +2678,33 @@ asm/non_matchings/code/listalloc/func_80174AB4.s,func_80174AB4,0x80174AB4,0x1B
asm/non_matchings/code/listalloc/func_80174B20.s,func_80174B20,0x80174B20,0x20
asm/non_matchings/code/listalloc/func_80174BA0.s,func_80174BA0,0x80174BA0,0x14
asm/non_matchings/code/main/main.s,main,0x80174BF0,0xC8
-asm/non_matchings/code/padmgr/Padmgr_GetControllerBitmask.s,Padmgr_GetControllerBitmask,0x80174F10,0x5
-asm/non_matchings/code/padmgr/func_80174F24.s,func_80174F24,0x80174F24,0x8
-asm/non_matchings/code/padmgr/func_80174F44.s,func_80174F44,0x80174F44,0xE
-asm/non_matchings/code/padmgr/func_80174F7C.s,func_80174F7C,0x80174F7C,0x8
-asm/non_matchings/code/padmgr/func_80174F9C.s,func_80174F9C,0x80174F9C,0xE
-asm/non_matchings/code/padmgr/Padmgr_GetEventCallback.s,Padmgr_GetEventCallback,0x80174FD4,0xD
-asm/non_matchings/code/padmgr/func_80175008.s,func_80175008,0x80175008,0xD
-asm/non_matchings/code/padmgr/Padmgr_SetEventCallback.s,Padmgr_SetEventCallback,0x8017503C,0xC
-asm/non_matchings/code/padmgr/func_8017506C.s,func_8017506C,0x8017506C,0xC
-asm/non_matchings/code/padmgr/Padmgr_Lock.s,Padmgr_Lock,0x8017509C,0xC
-asm/non_matchings/code/padmgr/Padmgr_Unlock.s,Padmgr_Unlock,0x801750CC,0xC
-asm/non_matchings/code/padmgr/func_801750FC.s,func_801750FC,0x801750FC,0x9A
-asm/non_matchings/code/padmgr/func_80175364.s,func_80175364,0x80175364,0x34
-asm/non_matchings/code/padmgr/func_80175434.s,func_80175434,0x80175434,0x6
-asm/non_matchings/code/padmgr/func_8017544C.s,func_8017544C,0x8017544C,0xA
+asm/non_matchings/code/padmgr/PadMgr_GetValidControllersMask.s,PadMgr_GetValidControllersMask,0x80174F10,0x5
+asm/non_matchings/code/padmgr/PadMgr_SetRumbleRetraceCallback.s,PadMgr_SetRumbleRetraceCallback,0x80174F24,0x8
+asm/non_matchings/code/padmgr/PadMgr_UnsetRumbleRetraceCallback.s,PadMgr_UnsetRumbleRetraceCallback,0x80174F44,0xE
+asm/non_matchings/code/padmgr/PadMgr_SetInputRetraceCallback.s,PadMgr_SetInputRetraceCallback,0x80174F7C,0x8
+asm/non_matchings/code/padmgr/PadMgr_UnsetInputRetraceCallback.s,PadMgr_UnsetInputRetraceCallback,0x80174F9C,0xE
+asm/non_matchings/code/padmgr/PadMgr_AcquireSerialEventQueue.s,PadMgr_AcquireSerialEventQueue,0x80174FD4,0xD
+asm/non_matchings/code/padmgr/PadMgr_VoiceAcquireSerialEventQueue.s,PadMgr_VoiceAcquireSerialEventQueue,0x80175008,0xD
+asm/non_matchings/code/padmgr/PadMgr_ReleaseSerialEventQueue.s,PadMgr_ReleaseSerialEventQueue,0x8017503C,0xC
+asm/non_matchings/code/padmgr/PadMgr_VoiceReleaseSerialEventQueue.s,PadMgr_VoiceReleaseSerialEventQueue,0x8017506C,0xC
+asm/non_matchings/code/padmgr/PadMgr_LockPadData.s,PadMgr_LockPadData,0x8017509C,0xC
+asm/non_matchings/code/padmgr/PadMgr_UnlockPadData.s,PadMgr_UnlockPadData,0x801750CC,0xC
+asm/non_matchings/code/padmgr/PadMgr_UpdateRumble.s,PadMgr_UpdateRumble,0x801750FC,0x9A
+asm/non_matchings/code/padmgr/PadMgr_RumbleStop.s,PadMgr_RumbleStop,0x80175364,0x34
+asm/non_matchings/code/padmgr/PadMgr_RumblePause.s,PadMgr_RumblePause,0x80175434,0x6
+asm/non_matchings/code/padmgr/PadMgr_RumbleSetSingle.s,PadMgr_RumbleSetSingle,0x8017544C,0xA
asm/non_matchings/code/padmgr/PadMgr_RumbleSet.s,PadMgr_RumbleSet,0x80175474,0x13
asm/non_matchings/code/padmgr/PadMgr_ControllerHasRumblePak.s,PadMgr_ControllerHasRumblePak,0x801754C0,0x8
-asm/non_matchings/code/padmgr/Padmgr_CalcStickEdges.s,Padmgr_CalcStickEdges,0x801754E0,0xB1
-asm/non_matchings/code/padmgr/Padmgr_ParseState.s,Padmgr_ParseState,0x801757A4,0x86
-asm/non_matchings/code/padmgr/func_801759BC.s,func_801759BC,0x801759BC,0x49
-asm/non_matchings/code/padmgr/func_80175AE0.s,func_80175AE0,0x80175AE0,0x68
-asm/non_matchings/code/padmgr/Padmgr_Update.s,Padmgr_Update,0x80175C80,0x6F
-asm/non_matchings/code/padmgr/Padmgr_Stop.s,Padmgr_Stop,0x80175E3C,0xB
-asm/non_matchings/code/padmgr/func_80175E68.s,func_80175E68,0x80175E68,0x4C
-asm/non_matchings/code/padmgr/Padmgr_GetInput.s,Padmgr_GetInput,0x80175F98,0xF
-asm/non_matchings/code/padmgr/Padmgr_GetInput2.s,Padmgr_GetInput2,0x80175FD4,0xF
-asm/non_matchings/code/padmgr/Padmgr_ThreadEntry.s,Padmgr_ThreadEntry,0x80176010,0x61
+asm/non_matchings/code/padmgr/PadMgr_AdjustInput.s,PadMgr_AdjustInput,0x801754E0,0xB1
+asm/non_matchings/code/padmgr/PadMgr_UpdateInputs.s,PadMgr_UpdateInputs,0x801757A4,0x86
+asm/non_matchings/code/padmgr/PadMgr_InitVoice.s,PadMgr_InitVoice,0x801759BC,0x49
+asm/non_matchings/code/padmgr/PadMgr_UpdateConnections.s,PadMgr_UpdateConnections,0x80175AE0,0x68
+asm/non_matchings/code/padmgr/PadMgr_HandleRetrace.s,PadMgr_HandleRetrace,0x80175C80,0x6F
+asm/non_matchings/code/padmgr/PadMgr_HandlePreNMI.s,PadMgr_HandlePreNMI,0x80175E3C,0xB
+asm/non_matchings/code/padmgr/PadMgr_GetInputNoLock.s,PadMgr_GetInputNoLock,0x80175E68,0x4C
+asm/non_matchings/code/padmgr/PadMgr_GetInput.s,PadMgr_GetInput,0x80175F98,0xF
+asm/non_matchings/code/padmgr/PadMgr_GetInput2.s,PadMgr_GetInput2,0x80175FD4,0xF
+asm/non_matchings/code/padmgr/PadMgr_ThreadEntry.s,PadMgr_ThreadEntry,0x80176010,0x61
asm/non_matchings/code/padmgr/PadMgr_Init.s,PadMgr_Init,0x80176194,0x3B
asm/non_matchings/code/sched/Sched_SwapFramebuffer.s,Sched_SwapFramebuffer,0x80176280,0x25
asm/non_matchings/code/sched/Sched_RetraceUpdateFramebuffer.s,Sched_RetraceUpdateFramebuffer,0x80176314,0x14
diff --git a/tools/weekeventregconvert.py b/tools/weekeventregconvert.py
index 34b3ddc46..b96696b46 100755
--- a/tools/weekeventregconvert.py
+++ b/tools/weekeventregconvert.py
@@ -73,7 +73,7 @@ weekEventReg = {
( 8 << 8) | 0x04: "WEEKEVENTREG_08_04",
( 8 << 8) | 0x08: "WEEKEVENTREG_08_08",
( 8 << 8) | 0x10: "WEEKEVENTREG_08_10",
- ( 8 << 8) | 0x20: "WEEKEVENTREG_08_20",
+ ( 8 << 8) | 0x20: "WEEKEVENTREG_RECEIVED_DOGGY_RACETRACK_HEART_PIECE",
( 8 << 8) | 0x40: "WEEKEVENTREG_08_40",
( 8 << 8) | 0x80: "WEEKEVENTREG_08_80",
( 9 << 8) | 0x01: "WEEKEVENTREG_09_01",
@@ -279,7 +279,7 @@ weekEventReg = {
(34 << 8) | 0x01: "WEEKEVENTREG_34_01",
(34 << 8) | 0x02: "WEEKEVENTREG_34_02",
(34 << 8) | 0x04: "WEEKEVENTREG_34_04",
- (34 << 8) | 0x08: "WEEKEVENTREG_SWAMP_SPIDER_HOUSE_TALKED",
+ (34 << 8) | 0x08: "WEEKEVENTREG_TALKED_SWAMP_SPIDER_HOUSE_MAN",
(34 << 8) | 0x10: "WEEKEVENTREG_34_10",
(34 << 8) | 0x20: "WEEKEVENTREG_34_20",
(34 << 8) | 0x40: "WEEKEVENTREG_RECEIVED_MASK_OF_TRUTH",
@@ -523,12 +523,12 @@ weekEventReg = {
(64 << 8) | 0x10: "WEEKEVENTREG_64_10",
(64 << 8) | 0x20: "WEEKEVENTREG_64_20",
(64 << 8) | 0x40: "WEEKEVENTREG_64_40",
- (64 << 8) | 0x80: "WEEKEVENTREG_64_80",
- (65 << 8) | 0x01: "WEEKEVENTREG_65_01",
- (65 << 8) | 0x02: "WEEKEVENTREG_65_02",
- (65 << 8) | 0x04: "WEEKEVENTREG_65_04",
- (65 << 8) | 0x08: "WEEKEVENTREG_65_08",
- (65 << 8) | 0x10: "WEEKEVENTREG_65_10",
+ (64 << 8) | 0x80: "WEEKEVENTREG_TALKED_DOGGY_RACETRACK_OWNER_DAY_1",
+ (65 << 8) | 0x01: "WEEKEVENTREG_TALKED_DOGGY_RACETRACK_OWNER_NIGHT_1",
+ (65 << 8) | 0x02: "WEEKEVENTREG_TALKED_DOGGY_RACETRACK_OWNER_DAY_2",
+ (65 << 8) | 0x04: "WEEKEVENTREG_TALKED_DOGGY_RACETRACK_OWNER_NIGHT_2",
+ (65 << 8) | 0x08: "WEEKEVENTREG_TALKED_DOGGY_RACETRACK_OWNER_DAY_3",
+ (65 << 8) | 0x10: "WEEKEVENTREG_TALKED_DOGGY_RACETRACK_OWNER_NIGHT_3",
(65 << 8) | 0x20: "WEEKEVENTREG_65_20",
(65 << 8) | 0x40: "WEEKEVENTREG_65_40",
(65 << 8) | 0x80: "WEEKEVENTREG_65_80",
diff --git a/undefined_syms.txt b/undefined_syms.txt
index f0578ff16..7ef51ef24 100644
--- a/undefined_syms.txt
+++ b/undefined_syms.txt
@@ -586,10 +586,6 @@ D_060005F8 = 0x060005F8;
D_06000A20 = 0x06000A20;
D_06000040 = 0x06000040;
-/* ovl_Bg_Tobira01 */
-D_060011C0 = 0x060011C0;
-D_06000088 = 0x06000088;
-
// ovl_Boss_01
D_06000C44 = 0x06000C44;
@@ -770,10 +766,6 @@ D_060111E8 = 0x060111E8;
D_06012478 = 0x06012478;
D_06012618 = 0x06012618;
-// ovl_En_And
-
-D_0600B380 = 0x0600B380;
-
// ovl_En_Bal
D_060005FC = 0x060005FC;
@@ -1111,18 +1103,6 @@ D_06002188 = 0x06002188;
D_06000B70 = 0x06000B70;
D_06000D60 = 0x06000D60;
-// ovl_player_actor
-
-D_06008860 = 0x06008860;
-D_0600BDD8 = 0x0600BDD8;
-D_0600C540 = 0x0600C540;
-D_060127B0 = 0x060127B0;
-D_06013138 = 0x06013138;
-D_060134D0 = 0x060134D0;
-D_06014684 = 0x06014684;
-D_060177B8 = 0x060177B8;
-D_060178D0 = 0x060178D0;
-
// segment 0x07